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 🙏

© 2025 – Pkg Stats / Ryan Hefner

@madgex/design-system

v13.0.4

Published

A work-in progress Design System for building a UI for Madgex products.

Downloads

970

Readme

Madgex Design System

A work-in progress Design System for building a UI for Madgex products.

Usage

Available on NPM as @madgex/design-system.

npm install @madgex/design-system --save

NOTE: Right now you'll need to be authenticated on npm under the Madgex account.

Importing styles

You'll need to use the Madgex DS CSS file in your project (which you will find in @madgex/design-system/dist/css/index.css)

The design system is using CSS Custom Properties to apply the brand styling of each site so you will need to import the custom properties file found in S3 for each client property id as well.

if you want to use the default styling set in the design system, you can use the variables.css file found in dist/_tokens/css.

Working with hapi.js, vision and Nunjucks

Nunjucks

If you're wanting to use the Madgex DS components from a hapi.js+vision+Nunjucks setup you'll need to include the Madgex DS in the Nunjucks pathing:

  engines: {
    njk: {
      compile: (src, options) => {
        const template = Nunjucks.compile(src, options.environment);
        return (context) => {
          return template.render(context);
        };
      },
      prepare: (options, next) => {
        options.compileOptions.environment = Nunjucks.configure(
          [
            Path.join(options.path),
            'node_modules/@madgex/design-system/',
            'node_modules/@madgex/design-system/src/',
            'node_modules/@madgex/design-system/src/components/',
          ],
          { watch: false }
        );
        return next();
      },
    },
  },

Then you should be able to use components as such:

{% extends "template.njk" %}  {# a base template is available in the DS #}

{% from "button/_macro.njk" import Button %} {# load the DS button component #}

{% block content %}

  <p>My new project homepage</p>

  {# Use the Madgex DS button! #}
  {{
    Button({
      text: 'Click me please!'
    })
  }}

{% endblock %}

Note you'll need the CSS for the component styles.

Serving Design System assets - Hapi

We want to serve the whole dist folder of the design system package, rather than just singular files. This will enable relative ESM imports which index.js does, where it will try to include additional js files relative to itself.

Be sure to pevent URL attacks by confining to this dist directory. Inert directory handler does this by default.

const mdsDistFolderPath = path.join(
  path.dirname(fileURLToPath(import.meta.resolve('@madgex/design-system/package.json'))),
  'dist',
);
export default [
  {
    path: `/_/jobseekers-frontend/public/design-system/{path*}`,
    handler: {
      directory: {
        // using `directory` should mean we are using inert's 'confine' automatically, to prevent URL attacks e.g. `/_/jobseekers-frontend/public/design-system/..%2F..%2F..%2F..%2F/package.json`
        path: [mdsDistFolderPath],
      },
    },
    options: {
      id: 'public.assets.design-system',
      description: 'public assets route design system, allows relative ESM imports against whole MDS dist folder',
      validate: {
        params: {
          path: Joi.string().max(200).required(),
        },
      },
    },
  },
];

consuming the index.js file is all that is needed, relative ESM imports will automatically happen.

<link rel="stylesheet" href="{{- getRoute('public.assets.design-system', { path: 'css/index.css' }, { v: designSystemVersion }) -}}">
<script type="module" src="{{- getRoute('public.assets.design-system', {  path: 'js/index.js' }, { v: designSystemVersion }) -}}"></script>
{# index.js also import `./dropdown-nav-HASH.js` etc, which is why we serve the whole `dist` folder on `public.assets.design-system` route #}

Releases

With every commit to master the build server attempts to create a new version using semantic-release and deploys to npm as @madgex/design-system.

Local Development with jobseekers-frontend

You can see your changes to the jobseekers-frontend in a local dev enviroment by using npm link.

cd [your local path]/madgex-design-system
npm link
cd [your local path]/jobseekers-frontend
npm link npm link @madgex/design-system

Building Tokens

We use Style Dictionary to build our Design System tokens.

createStyleDictionary(overridesObject:StyleDictionaryConfig?) : { styleDictionary:StyleDictionary, cleanTempFiles:Function }

createStyleDictionary(StyleDictionaryConfig) is exposed via @madgex/design-system/style-dictionary. This creates a new StyleDictionary Instance, preconfigured with our base tokens, and all platforms we want to build. See here for the base config we use.

You can supply overrides to createStyleDictionary which should be the same shape as Style Dictionary Configuration.

Typically you will only override buildPath on platforms (so the platform builds with the same transforms everywhere), and supply source token override file paths.

pre-configured platforms

A platform determines a certain type of output based on the tokens. When you create a new StyleDictionary Instance via createStyleDictionary, it comes with our pre-configured platforms :

  • 'css-variables' : outputs variables.css to buildPath, CSS Variables
  • 'json-variables' : outputs variables.json to buildPath, JSON version of CSS Variables, useful for rendering in Node e.g. display-image-render-api or template-renderer
  • 'json-variables-flat' : outputs variables-flat.json to buildPath. similar to 'json-variables' but in a flat object structure

Example usage, overrides

In this example we override the buildPath of our pre-configured platforms. We also supply paths to override token files via source.

We then build only the platforms we want, and then call cleanTempFiles once we're done.

const path = require('node:path');
const { createStyleDictionary, cleanTempFiles } = require('@madgex/design-system/style-dictionary');

const { styleDictionary, cleanTempFiles } = await createStyleDictionary({
  platforms: {
    'css-variables': {
      buildPath: `${path.resolve(__dirname, '../yes-here')}/`,
    },
    'json-variables': {
      buildPath: `${path.resolve(__dirname, '../yes-here')}/`,
    },
  },
  source: [path.resolve(__dirname, '../brand.json')],
});

await styleDictionary.buildPlatform('css-variables');
await styleDictionary.buildPlatform('json-variables');

await cleanTempFiles();

Web Components

Web components are included via the main JS bundle, using ESM relative imports.

Seperate web component files are also available in @madgex/design-system/dist/components/{component-name}.js. e.g. @madgex/design-system/dist/components/mds-dropdown-nav.js.

Ensure you add JS files to your HTML as type="module", this will defer script loading so DOM is ready.