Package Exports
- @moduk/frontend
- @moduk/frontend/client
- @moduk/frontend/dist/assets/images/govuk-crest-2x.png
- @moduk/frontend/dist/assets/images/govuk-crest.png
- @moduk/frontend/dist/client/MODUK.mjs
- @moduk/frontend/dist/client/MODUK.umd.js
- @moduk/frontend/dist/client/index.d.ts
- @moduk/frontend/dist/client/index.d.ts.map
- @moduk/frontend/dist/css/index.css
- @moduk/frontend/dist/lib/index.d.ts
- @moduk/frontend/dist/lib/index.d.ts.map
- @moduk/frontend/dist/lib/index.js
- @moduk/frontend/dist/lib/index.js.map
- @moduk/frontend/dist/lib/lib/utils.d.ts
- @moduk/frontend/dist/lib/lib/utils.d.ts.map
- @moduk/frontend/dist/lib/lib/utils.js
- @moduk/frontend/dist/lib/lib/utils.js.map
- @moduk/frontend/dist/lib/nunjucks/moduk/components/accordion/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/accordion/__examples__/with-summary-lines.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/accordion/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/accordion/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/back-link/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/back-link/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/back-link/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/breadcrumbs/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/breadcrumbs/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/breadcrumbs/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/button/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/button/__examples__/disabled.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/button/__examples__/group-link.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/button/__examples__/grouping.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/button/__examples__/prevent-double-click.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/button/__examples__/secondary.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/button/__examples__/start.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/button/__examples__/warning.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/button/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/button/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/character-count/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/character-count/__examples__/not-as-page-heading.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/character-count/__examples__/with-error-message.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/character-count/__examples__/with-threshold.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/character-count/__examples__/word-count.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/character-count/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/character-count/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/checkboxes/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/checkboxes/__examples__/not-as-page-heading.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/checkboxes/__examples__/small.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/checkboxes/__examples__/with-conditional-reveal.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/checkboxes/__examples__/with-error-message.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/checkboxes/__examples__/with-item-hint.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/checkboxes/__examples__/with-none-option.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/checkboxes/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/checkboxes/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/cookie-banner/__examples__/accepted.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/cookie-banner/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/cookie-banner/__examples__/rejected.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/cookie-banner/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/cookie-banner/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/date-input/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/date-input/__examples__/not-as-page-heading.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/date-input/__examples__/with-date-part-error.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/date-input/__examples__/with-whole-date-error.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/date-input/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/date-input/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/details/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/details/__examples__/open.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/details/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/details/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/error-message/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/error-message/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/error-message/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/error-summary/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/error-summary/__examples__/with-error-linked-to-checkbox.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/error-summary/__examples__/with-error-linked-to-date-part.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/error-summary/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/error-summary/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/fieldset/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/fieldset/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/fieldset/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/file-upload/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/file-upload/__examples__/with-error.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/file-upload/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/file-upload/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/footer/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/footer/__examples__/with-links.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/footer/__examples__/with-secondary-navigation-and-links.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/footer/__examples__/with-secondary-navigation.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/footer/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/footer/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/header/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/header/__examples__/with-service-name-and-navigation.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/header/__examples__/with-service-name-and-no-service-url.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/header/__examples__/with-service-name.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/header/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/header/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/input/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/input/__examples__/not-as-page-heading.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/input/__examples__/with-error.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/input/__examples__/with-fixed-width.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/input/__examples__/with-fluid-width.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/input/__examples__/with-hint.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/input/__examples__/with-numeric.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/input/__examples__/with-prefix-and-suffix-error.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/input/__examples__/with-prefix-and-suffix.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/input/__examples__/with-prefix.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/input/__examples__/with-suffix.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/input/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/input/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/inset-text/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/inset-text/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/inset-text/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/notification-banner/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/notification-banner/__examples__/success.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/notification-banner/__examples__/with-html.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/notification-banner/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/notification-banner/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/pagination/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/pagination/__examples__/on-the-first-page.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/pagination/__examples__/on-the-last-page.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/pagination/__examples__/with-ellipses.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/pagination/__examples__/with-next-and-previous-only.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/pagination/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/pagination/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/panel/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/panel/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/panel/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/phase-banner/__examples__/beta.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/phase-banner/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/phase-banner/__examples__/with-tag-override.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/phase-banner/__examples__/with-text.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/phase-banner/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/phase-banner/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/radios/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/radios/__examples__/not-as-page-heading.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/radios/__examples__/small.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/radios/__examples__/with-conditional-reveal.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/radios/__examples__/with-divider-option.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/radios/__examples__/with-error-message.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/radios/__examples__/with-item-hint.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/radios/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/radios/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/select/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/select/__examples__/with-hint.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/select/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/select/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/skip-link/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/skip-link/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/skip-link/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/summary-list/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/summary-list/__examples__/with-no-actions.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/summary-list/__examples__/with-no-border.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/summary-list/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/summary-list/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/table/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/table/__examples__/with-comparative-numbers.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/table/__examples__/with-customised-column-widths.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/table/__examples__/with-large-caption.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/table/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/table/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/tabs/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/tabs/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/tabs/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/tag/__examples__/blue.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/tag/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/tag/__examples__/green.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/tag/__examples__/grey.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/tag/__examples__/orange.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/tag/__examples__/pink.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/tag/__examples__/purple.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/tag/__examples__/red.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/tag/__examples__/turquoise.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/tag/__examples__/yellow.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/tag/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/tag/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/textarea/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/textarea/__examples__/not-as-page-heading.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/textarea/__examples__/with-custom-height.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/textarea/__examples__/with-error.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/textarea/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/textarea/macro.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/warning-text/__examples__/default.njk
- @moduk/frontend/dist/lib/nunjucks/moduk/components/warning-text/__tests__/macro.test.ts
- @moduk/frontend/dist/lib/nunjucks/moduk/components/warning-text/macro.njk
Readme
MOD.UK Frontend
The MOD.UK Frontend contains the code you need to start building a user interface for Ministry of Defence platforms and services.
This library is currently under development and is not yet ready for use.
The library contains a library of Nunjucks components, a CSS stylesheet and a client-side JavaScript library.
Usage
Importing Nunjucks configuration helpers
import { createNunjucksEnvironment /* ... */ } from '@moduk/frontend'
Importing the client-side library
If you’re using Webpack 5 or a similar bundler, the client-side library can be
imported from @moduk/frontend/client
:
import { initAll } from '@moduk/frontend/client'
initAll()
In older environments, you may need to import the client-side library from
@moduk/frontend/dist/client/MODUK.umd.js
.
Importing the CSS
Using Sass
Dart Sass is required.
You should ensure node_modules
is resolvable by Sass. If using the sass
CLI
you can pass --load-path=node_modules
to achieve this.
@use '@moduk/frontend/src/css';
Without Sass
If you aren’t using Sass, a compiled version of the CSS can be found at
node_modules/@moduk/frontend/dist/css/index.css
.
Development
The library uses TypeScript, Sass, ESLint, dprint and commitlint. Git hooks are used for enforcing linting and formatting rules.
The unit test suite uses Vitest and Testing Library.
The end-to-end test suite uses Playwright. Tests are run across a variety of browsers and configurations against a local web server that serves examples of components. This includes accessibility checks using axe and visual regression tests.
Local development requires Node.js 16 or 18 and npm 8.
Setting up your development environment
Clone the repository:
git clone https://github.com/defencedigital/moduk-frontend cd moduk-frontend
Install dependencies:
npm install
Install Playwright browsers and system dependencies:
npm run playwright-install
Install Podman using the instructions for your platform.
Podman is required only for running visual regression tests.
Ensure jq is installed. On macOS it can be installed using Homebrew:
jq is required only for running visual regression tests.
brew install jq
Commands
Lint all files
npm run lint
Reformat all files
npm run format
Build the library ready for publishing
npm run build
Run all unit tests
npm run test
Run the examples web server
npm run serve
Run end-to-end tests
npm run test:e2e
Run specific files using a regex
npm run test:e2e <regex>
Run tests with tracing
npm run test:e2e:trace
Run visual regression tests in a container
Visual regression tests run in a container, using Podman, to ensure screenshots are taken in a consistent environment.
To run the visual regression tests:
npm run test:visual
This will also generate any missing screenshots.
Update visual regression snapshots
To update any screenshots that have changed:
npm run test:visual:refresh
Delete all visual regression snapshots
To delete all existing screenshots:
npm run test:visual:clean
This can be useful after renaming or deleting visual regression tests or component examples.