npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@ecmwf.int/app-template

v2.0.0

Published

ECMWF application template

Downloads

474

Readme

ECMWF app template

Installation

npm

$ npm install "@ecmwf.int/app-template"

yarn

$ yarn add @ecmwf.int/app-template

Usage

To run it manually:

npm

 $ npx ecmwf-app-template -c ./path/to/config/file

yarn

 $ yarn ecmwf-app-template -c ./path/to/config/file

It might be a good idea to automate the process of generating the template. It could be done in various ways depending on particular requirements.

Example configuration of package.json to include generating template using npm 'pre' hooks.

{
  "scripts": {
    "generate-template": "yarn ecmwf-app-template -c template.config.json",
    
    "prestart": "yarn generate-template",
    "start": "command-to-start-app-server",
    
    "prebuild": "yarn generate-template",
    "build": "command-to-app"
  }
}

Configuration

Available configuration options:

| Option | Required | Default | Description | |-----------------|----------|---------|--------------| | output | Yes | — | Output directory path | | title | Yes | — | Document title | | appName | Yes | — | Application Name | | layout | Yes | — | Type of layout ('contained' or 'fluid') | | authHost | Yes | — | Authentication endpoint host | | authRedirect | No | false | Append the current page URL to the login link as a query param so the IAM provider (e.g. Keycloak) returns the user here after login | | authRedirectParam | No | next | Name of the redirect query param added when authRedirect is enabled; must be non-empty and contain only letters, digits, _, . or - | | userConfigPath | No | /frontend/config | Path appended to authHost when fetching the user/auth config endpoint; must start with / | | gtmId | No | — | Google Tag Manager ID | | headBlock | No | — | Block of content injected into the head of the page| | contentBlock | No | — | Block of content injected into the main content of the page| | helpBlock | No | — | Block of content injected into the help dropdown| | userMenuBlock | No | — | Block of content injected into the logged-in user dropdown| | settingsBlock | No | — | Block of content injected into the settings dropdown, below the color scheme switch | | colorScheme | No | false | Show the light/dark/auto switch and drive the page color scheme | | defaultColorScheme | No | auto | Initial scheme before the user picks one: auto, light or dark |

Color scheme (dark mode)

Set "colorScheme": true to render a light/dark/auto switch in the header. The template owns the decision and publishes the resolved scheme so the embedded app can react:

  • <html data-theme="light|dark"> — always a concrete value (auto is resolved from prefers-color-scheme at load and re-resolved live while it stays on auto). This is the primary hook for CSS.
  • color-scheme is set on <html> so native UI (scrollbars, form controls) matches.
  • A ecmwf-template:colorschemechange event fires on window with detail: { resolved, preference } for JavaScript consumers (charts, maps, canvas).

The user's choice persists in localStorage under ecmwf-template:color-scheme. An inline head script applies the scheme before first paint, so there is no flash on load.

The ECMWF header/footer keep their fixed branding; only the embedded app responds to the switch.

The settings dropdown appears when colorScheme is enabled and/or a settingsBlock is provided. Use settingsBlock to add your own settings entries (e.g. links) below the switch — the same file-inlining mechanism as helpBlock/userMenuBlock.

Material UI (v9+) integration

The app must key its theme off the same attribute the template sets, and must not run MUI's own color-scheme manager (InitColorSchemeScript / useColorScheme) — the template owns the attribute:

import { createTheme, ThemeProvider, CssBaseline } from '@mui/material';

const theme = createTheme({
  colorSchemes: { light: true, dark: true },
  cssVariables: { colorSchemeSelector: '[data-theme="%s"]' },
});

// <ThemeProvider theme={theme}><CssBaseline />…</ThemeProvider>

MUI then emits [data-theme="light"] / [data-theme="dark"] variable blocks that react to the template flipping the attribute, with no runtime coordination.

Environment variables

Configuration file supports environment variables by using %VARIABLE_NAME% syntax.

Configuration file example

{
  "title": "ECMWF | Title",
  "appName": "Application Name",
  "output": "./public",
  "layout": "fluid",
  "headBlock": "./template/head.html",
  "contentBlock": "./template/content.html",
  "helpBlock": "./template/help.html",
  "userMenu": "./template/userMenu.html",
  "authHost": "%ECMWF_APP_TEMPLATE_AUTH_HOST%"
}

Development

There are two aspects of the package.

Template development

Building a template:

$ yarn build-template

Starting a development server:

$ yarn start

CLI tool and a binary to generate the template

Building a cli tool:

$ yarn build-cli

Publishing

npm

Bump a version:

$ npm version major|minor|patch

Publish:

$ npm publish

yarn

$ yarn publish