├── .nvmrc
├── .gitattributes
├── .husky
└── pre-commit
├── .markdownlint.json
├── packages
├── components-css
│ ├── src
│ │ ├── ordered-list
│ │ │ ├── _mixin.scss
│ │ │ └── index.scss
│ │ ├── accordion
│ │ │ └── index.scss
│ │ ├── visually-hidden
│ │ │ ├── index.scss
│ │ │ └── _mixin.scss
│ │ ├── unordered-list
│ │ │ ├── _mixin.scss
│ │ │ └── index.scss
│ │ ├── number-badge
│ │ │ └── index.scss
│ │ ├── page-number-navigation
│ │ │ └── index.scss
│ │ ├── alert
│ │ │ └── index.scss
│ │ ├── code-input-group
│ │ │ ├── index.scss
│ │ │ └── _mixin.scss
│ │ ├── skip-link
│ │ │ └── index.scss
│ │ ├── blockquote
│ │ │ ├── index.scss
│ │ │ └── _mixin.scss
│ │ ├── code-input
│ │ │ └── index.scss
│ │ ├── paragraph
│ │ │ └── index.scss
│ │ ├── text-input
│ │ │ └── index.scss
│ │ ├── radio-group
│ │ │ ├── index.scss
│ │ │ └── _mixin.scss
│ │ ├── textarea
│ │ │ └── index.scss
│ │ ├── button
│ │ │ └── index.scss
│ │ ├── separator
│ │ │ └── index.scss
│ │ ├── article
│ │ │ └── index.scss
│ │ ├── dot-badge
│ │ │ ├── index.scss
│ │ │ └── _mixin.scss
│ │ ├── checkbox-group
│ │ │ └── index.scss
│ │ ├── pre-heading
│ │ │ └── index.scss
│ │ ├── action-group
│ │ │ └── index.scss
│ │ ├── breadcrumb-nav
│ │ │ └── index.scss
│ │ ├── link
│ │ │ ├── index.scss
│ │ │ └── _mixin.scss
│ │ ├── rounded-corner
│ │ │ └── _mixin.scss
│ │ ├── link-list-card
│ │ │ └── index.scss
│ │ ├── link-list
│ │ │ └── index.scss
│ │ ├── data-badge-button
│ │ │ └── index.scss
│ │ ├── form
│ │ │ └── index.scss
│ │ ├── logo
│ │ │ └── index.scss
│ │ └── form-field
│ │ │ └── index.scss
│ ├── .gitignore
│ └── vite.config.js
├── components-angular
│ ├── src
│ │ ├── image
│ │ │ ├── image.component.html
│ │ │ ├── image.component.ts
│ │ │ └── image.component.spec.ts
│ │ ├── button
│ │ │ └── button.component.html
│ │ ├── figure
│ │ │ └── figure.component.html
│ │ ├── form-label
│ │ │ ├── form-label.component.html
│ │ │ ├── form-label.component.ts
│ │ │ └── form-label.component.spec.ts
│ │ ├── icon
│ │ │ ├── icon.component.css
│ │ │ ├── icon.component.html
│ │ │ └── icon.component.ts
│ │ ├── text-input
│ │ │ ├── text-input.component.html
│ │ │ └── text-input.component.spec.ts
│ │ ├── figure-caption
│ │ │ ├── figure-caption.component.html
│ │ │ └── figure-caption.component.ts
│ │ ├── link-list-item
│ │ │ ├── link-list-item.component.html
│ │ │ └── link-list-item.component.ts
│ │ ├── unordered-list
│ │ │ ├── unordered-list.component.html
│ │ │ └── unordered-list.component.ts
│ │ ├── link
│ │ │ ├── link.component.css
│ │ │ ├── link.component.html
│ │ │ └── link.component.ts
│ │ ├── unordered-list-item
│ │ │ ├── unordered-list-item.component.html
│ │ │ └── unordered-list-item.component.ts
│ │ ├── heading
│ │ │ ├── heading.component.css
│ │ │ └── heading.component.ts
│ │ ├── paragraph
│ │ │ ├── paragraph.component.css
│ │ │ ├── paragraph.component.html
│ │ │ └── paragraph.component.ts
│ │ ├── link-list
│ │ │ ├── link-list.component.html
│ │ │ └── link-list.component.ts
│ │ ├── form-field-error-message
│ │ │ ├── form-field-error-message.component.html
│ │ │ └── form-field-error-message.component.ts
│ │ ├── back-to-top
│ │ │ └── back-to-top.component.html
│ │ ├── link-list-link
│ │ │ ├── link-list-link.component.html
│ │ │ └── link-list-link.component.ts
│ │ ├── column-layout
│ │ │ ├── column-layout.component.html
│ │ │ └── column-layout.component.ts
│ │ ├── footer
│ │ │ └── footer.component.css
│ │ ├── navbar-item
│ │ │ ├── navbar-item.component.html
│ │ │ ├── heading-item.directive.ts
│ │ │ ├── end-item.directive.spec.ts
│ │ │ ├── end-item.directive.ts
│ │ │ ├── heading-item.directive.spec.ts
│ │ │ └── navbar-item.component.ts
│ │ ├── data-summary
│ │ │ ├── data-summary.component.html
│ │ │ └── data-summary.component.ts
│ │ ├── navbar
│ │ │ ├── navbar.component.ts
│ │ │ └── navbar.component.html
│ │ ├── logo
│ │ │ ├── logo.component.html
│ │ │ └── logo.component.ts
│ │ ├── form-field-description
│ │ │ ├── form-field-description.component.html
│ │ │ └── form-field-description.component.ts
│ │ ├── action-group
│ │ │ ├── action-group.component.html
│ │ │ └── action-group.component.ts
│ │ ├── data-summary-item
│ │ │ ├── data-summary-item.component.html
│ │ │ └── data-summary-item.component.ts
│ │ └── form-field
│ │ │ ├── form-field.component.ts
│ │ │ └── form-field.component.spec.ts
│ ├── .eslintrc.json
│ ├── setup-jest.ts
│ ├── jest.config.js
│ ├── tsconfig.lib.prod.json
│ ├── ng-package.json
│ ├── tsconfig.lib.json
│ └── tsconfig.spec.json
├── storybook-tooling
│ ├── src
│ │ ├── formatHtml
│ │ │ └── index.ts
│ │ └── markdownUtils
│ │ │ ├── index.ts
│ │ │ └── mergeMarkdown.ts
│ ├── .eslintrc.json
│ ├── vitest.config.ts
│ ├── tsconfig.json
│ ├── README.md
│ └── CHANGELOG.md
├── storybook
│ ├── src
│ │ ├── components-react
│ │ │ ├── card.md
│ │ │ ├── radio-group.md
│ │ │ ├── orderedListItem.md
│ │ │ ├── unorderedListItem.md
│ │ │ ├── navbar.md
│ │ │ ├── side-nav.md
│ │ │ ├── toggletip.md
│ │ │ ├── side-nav-link.md
│ │ │ ├── breadcrumb-nav.md
│ │ │ ├── number-badge.md
│ │ │ ├── data-summary-item.md
│ │ │ ├── button.md
│ │ │ ├── readme.mdx
│ │ │ ├── changelog.mdx
│ │ │ ├── table-cell.md
│ │ │ ├── form-field-radio.md
│ │ │ ├── textarea.md
│ │ │ ├── table-header-cell.md
│ │ │ ├── navigation-list-item.md
│ │ │ ├── file-input.md
│ │ │ ├── link-list-link.md
│ │ │ ├── message-list-item.md
│ │ │ ├── orderedList.md
│ │ │ ├── drawer.md
│ │ │ ├── dot-badge.md
│ │ │ ├── accordion-usage.md
│ │ │ ├── form-field-textarea.md
│ │ │ ├── form-field-text-input.md
│ │ │ ├── page-number-navigation.md
│ │ │ ├── text-input.md
│ │ │ ├── navigation-list.md
│ │ │ ├── column-layout.md
│ │ │ ├── data-summary.md
│ │ │ ├── form-field.md
│ │ │ └── separator.md
│ │ ├── markdown.d.ts
│ │ ├── twig.d.ts
│ │ ├── documentation
│ │ │ ├── readme.mdx
│ │ │ ├── license.mdx
│ │ │ ├── introduction.mdx
│ │ │ ├── notice.mdx
│ │ │ ├── font.mdx
│ │ │ └── design-tokens
│ │ │ │ └── rhc.mdx
│ │ ├── components-css
│ │ │ ├── readme.mdx
│ │ │ ├── changelog.mdx
│ │ │ ├── card.stories.tsx
│ │ │ ├── article.stories.tsx
│ │ │ ├── dot-badge.stories.tsx
│ │ │ ├── figure.stories.tsx
│ │ │ ├── toggletip.stories.tsx
│ │ │ ├── side-nav.stories.tsx
│ │ │ ├── page-header.stories.tsx
│ │ │ ├── pre-heading.stories.tsx
│ │ │ ├── radio-group.stories.tsx
│ │ │ ├── table-cell.stories.tsx
│ │ │ ├── column-layout.stories.tsx
│ │ │ ├── checkbox-group.stories.tsx
│ │ │ ├── link-list-card.stories.tsx
│ │ │ ├── sub-navbar.stories.tsx
│ │ │ ├── image.stories.tsx
│ │ │ ├── logo.stories.tsx
│ │ │ ├── form-field-radio.stories.tsx
│ │ │ ├── paragraph.stories.tsx
│ │ │ ├── table-header-cell.stories.tsx
│ │ │ ├── orderedListItem.stories.tsx
│ │ │ ├── separator.stories.tsx
│ │ │ ├── blockquote.stories.tsx
│ │ │ ├── link-list.stories.tsx
│ │ │ ├── page-number-navigation.stories.tsx
│ │ │ ├── number-badge.stories.tsx
│ │ │ ├── message-list.stories.tsx
│ │ │ ├── data-summary-item.stories.tsx
│ │ │ ├── navigation-list.stories.tsx
│ │ │ ├── unorderedListItem.stories.tsx
│ │ │ ├── orderedList.stories.tsx
│ │ │ ├── icon.stories.tsx
│ │ │ ├── navbar.stories.tsx
│ │ │ ├── action-group.stories.tsx
│ │ │ ├── skip-link.stories.tsx
│ │ │ ├── card-as-link.stories.tsx
│ │ │ ├── expandable-checkbox-group.stories.tsx
│ │ │ ├── unorderedList.stories.tsx
│ │ │ ├── form-field.stories.tsx
│ │ │ ├── alert.stories.tsx
│ │ │ ├── message-list-item.stories.tsx
│ │ │ ├── file-input.stories.tsx
│ │ │ ├── data-summary.stories.tsx
│ │ │ ├── hero.stories.tsx
│ │ │ ├── fieldset.stories.tsx
│ │ │ ├── breadcrumb-nav.stories.tsx
│ │ │ ├── rounded-corner.stories.tsx
│ │ │ ├── drawer.stories.tsx
│ │ │ ├── code-input-group.stories.tsx
│ │ │ ├── heading.stories.tsx
│ │ │ ├── link-list-link.stories.tsx
│ │ │ ├── form-field-radio-group.stories.tsx
│ │ │ ├── radio.stories.tsx
│ │ │ ├── navigation-list-item.stories.tsx
│ │ │ ├── form-field-checkbox-group.stories.tsx
│ │ │ ├── footer.stories.tsx
│ │ │ └── accordion.stories.tsx
│ │ ├── web-components
│ │ │ ├── readme.mdx
│ │ │ └── changelog.mdx
│ │ ├── components-twig
│ │ │ ├── readme.mdx
│ │ │ ├── changelog.mdx
│ │ │ └── ordered-list-twig.stories.tsx
│ │ ├── templates
│ │ │ ├── form.stories.tsx
│ │ │ ├── shared
│ │ │ │ ├── main-page-content.tsx
│ │ │ │ └── disclaimer.tsx
│ │ │ ├── collage.stories.tsx
│ │ │ ├── details.stories.tsx
│ │ │ ├── rich-text.stories.tsx
│ │ │ ├── componenten.stories.tsx
│ │ │ ├── mijn-omgeving.stories.tsx
│ │ │ └── homepage.stories.tsx
│ │ ├── types
│ │ │ └── drupal-attribute.d.ts
│ │ └── icon-sets
│ │ │ ├── default-icon-set-page
│ │ │ └── index.tsx
│ │ │ ├── flag-icon-set.md
│ │ │ ├── default-icon-set.md
│ │ │ ├── flag-icon-set.stories.tsx
│ │ │ └── default-icon-set.stories.tsx
│ ├── .storybook
│ │ ├── preview-head.html
│ │ ├── test-runner-jest.config.js
│ │ └── test-runner.js
│ ├── .eslintrc.json
│ ├── CHANGELOG.md
│ ├── types
│ │ └── twig.d.ts
│ ├── .babelrc.json
│ ├── tsconfig.json
│ └── vite.config.mjs
├── web-components
│ ├── src
│ │ └── components
│ │ │ └── Icon.css
│ ├── types
│ │ └── css.d.ts
│ ├── vite.config.mjs
│ └── tsconfig.json
├── components-react
│ ├── .eslintrc.json
│ ├── src
│ │ ├── Article.tsx
│ │ ├── Checkbox.tsx
│ │ ├── Textarea.tsx
│ │ ├── PageHeader.tsx
│ │ ├── PageContent.tsx
│ │ ├── ColumnLayout.tsx
│ │ ├── HeadingGroup.tsx
│ │ ├── NumberBadge.tsx
│ │ ├── Radio.tsx
│ │ ├── UnorderedListItem.tsx
│ │ ├── FormFieldErrorMessage.tsx
│ │ ├── LinkList.tsx
│ │ ├── OrderedList.tsx
│ │ ├── PageNumberNavigation.tsx
│ │ ├── ActionGroup.tsx
│ │ ├── VisuallyHidden.tsx
│ │ ├── icon-sets
│ │ │ └── flag-icons
│ │ │ │ ├── assets
│ │ │ │ ├── pl-flag.svg
│ │ │ │ ├── lv-flag.svg
│ │ │ │ ├── fr-flag.svg
│ │ │ │ ├── hu-flag.svg
│ │ │ │ ├── nl-flag.svg
│ │ │ │ ├── bg-flag.svg
│ │ │ │ ├── it-flag.svg
│ │ │ │ ├── gr-flag.svg
│ │ │ │ ├── ro-flag.svg
│ │ │ │ ├── de-flag.svg
│ │ │ │ └── uk-flag.svg
│ │ │ │ ├── LVFlagIcon.tsx
│ │ │ │ ├── PLFlagIcon.tsx
│ │ │ │ ├── FRFlagIcon.tsx
│ │ │ │ ├── HUFlagIcon.tsx
│ │ │ │ ├── NLFlagIcon.tsx
│ │ │ │ ├── BGFlagIcon.tsx
│ │ │ │ ├── ITFlagIcon.tsx
│ │ │ │ ├── GRFlagIcon.tsx
│ │ │ │ ├── ROFlagIcon.tsx
│ │ │ │ ├── FlagIconIDs.ts
│ │ │ │ └── DEFlagIcon.tsx
│ │ ├── TextInput.tsx
│ │ ├── Blockquote.tsx
│ │ ├── Table.tsx
│ │ ├── Paragraph.tsx
│ │ ├── Accordion.tsx
│ │ ├── Drawer.tsx
│ │ ├── Figure.tsx
│ │ ├── SideNav.tsx
│ │ ├── Article.test.tsx
│ │ ├── FormSummary.tsx
│ │ ├── Toggletip.test.tsx
│ │ ├── SideNavItem.tsx
│ │ ├── SideNavList.tsx
│ │ ├── Radio.test.tsx
│ │ ├── Table.test.tsx
│ │ ├── Textarea.test.tsx
│ │ ├── SkipLink.tsx
│ │ ├── Paragraph.test.tsx
│ │ ├── SkipLink.test.tsx
│ │ ├── TextInput.test.tsx
│ │ ├── PageHeader.test.tsx
│ │ ├── FormSummary.test.tsx
│ │ ├── OrderedList.test.tsx
│ │ ├── PageContent.test.tsx
│ │ ├── ColumnLayout.test.tsx
│ │ ├── HeadingGroup.test.tsx
│ │ ├── TableCaption.test.tsx
│ │ ├── Logo.test.tsx
│ │ ├── MessageList.tsx
│ │ ├── UnorderedListItem.test.tsx
│ │ ├── DataSummary.tsx
│ │ ├── VisuallyHidden.test.tsx
│ │ ├── FormFieldErrorMessage.test.tsx
│ │ ├── NavigationList.tsx
│ │ ├── FormFieldSelect.test.tsx
│ │ ├── TableCaption.tsx
│ │ ├── Drawer.test.tsx
│ │ ├── CodeInput.tsx
│ │ ├── Image.tsx
│ │ └── Link.tsx
│ ├── tsconfig.dev.json
│ └── tsconfig.test.json
├── storybook-angular
│ ├── src
│ │ ├── components
│ │ │ ├── button.md
│ │ │ ├── link.md
│ │ │ ├── column-layout.md
│ │ │ ├── image.md
│ │ │ ├── text-input.md
│ │ │ ├── data-summary-item.md
│ │ │ ├── unordered-list.md
│ │ │ ├── footer.md
│ │ │ ├── navbar.md
│ │ │ ├── data-summary.md
│ │ │ ├── heading.md
│ │ │ ├── figure.md
│ │ │ ├── icon.md
│ │ │ ├── action-group.md
│ │ │ ├── form-field-text-input.md
│ │ │ ├── paragraph.md
│ │ │ ├── logo.md
│ │ │ ├── readme.mdx
│ │ │ ├── changelog.mdx
│ │ │ ├── link-list-link.md
│ │ │ └── link-list.md
│ │ └── templates
│ │ │ ├── boete-zoeken
│ │ │ └── boete-zoeken.component.css
│ │ │ ├── betalingsregeling
│ │ │ ├── betalingsregeling.component.css
│ │ │ └── betalingsregeling.component.html
│ │ │ ├── boete-zoeken.stories.ts
│ │ │ ├── detailinformatie.stories.ts
│ │ │ └── betalingsregeling.stories.ts
│ ├── public
│ │ └── favicon.ico
│ ├── .storybook
│ │ ├── overview.mdx
│ │ ├── typings.d.ts
│ │ ├── tsconfig.json
│ │ └── tsconfig.doc.json
│ ├── CHANGELOG.md
│ └── tsconfig.json
├── font
│ ├── src
│ │ ├── index.mjs
│ │ └── index.scss
│ └── CHANGELOG.md
└── components-twig
│ ├── src
│ ├── OrderedListItem.twig
│ ├── Paragraph.twig
│ ├── OrderedList.twig
│ ├── Heading.twig
│ └── Image.twig
│ └── tsconfig.json
├── proprietary
├── assets
│ ├── src
│ │ ├── favicon.svg
│ │ └── placeholder.jpg
│ ├── LICENSE.md
│ ├── CHANGELOG.md
│ └── package.json
├── LICENSE.md
└── design-tokens
│ └── src
│ └── common
│ └── utrecht
│ ├── action.tokens.json
│ └── focus.tokens.json
├── apps
└── rhc-templates
│ ├── .eslintrc.json
│ ├── public
│ └── placeholder.jpg
│ ├── src
│ └── app
│ │ ├── layout.css
│ │ ├── page.tsx
│ │ ├── collage
│ │ └── page.tsx
│ │ ├── details
│ │ └── page.tsx
│ │ ├── form
│ │ └── page.tsx
│ │ ├── rich-text
│ │ └── page.tsx
│ │ ├── voorbeelden
│ │ └── page.tsx
│ │ ├── not-found.tsx
│ │ ├── mijn-omgeving
│ │ └── page.tsx
│ │ └── componenten
│ │ └── page.tsx
│ ├── next.config.js
│ ├── CHANGELOG.md
│ ├── README.md
│ ├── .gitignore
│ └── tsconfig.json
├── vercel.json
├── .markdownlintignore
├── .ncurc.minor.cjs
├── .eslintrc.react.json
├── .htmlvalidate.json
├── .ncurc.major.cjs
├── .ncurc.patch.cjs
├── .eslintignore
├── .stylelintignore
├── .changeset
├── cruel-clocks-heal.md
├── good-meals-raise.md
├── pretty-breads-pick.md
├── config.json
└── odd-walls-stay.md
├── .editorconfig
├── .github
├── CODEOWNERS
└── dependabot.yml
├── .npmrc
├── .lintstagedrc.json
├── prettier.config.cjs
├── lerna.json
├── .prettierignore
├── npmpackagejsonlint.config.cjs
└── tsconfig.json
/.nvmrc:
--------------------------------------------------------------------------------
1 | 22
2 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | * text=auto eol=lf
2 |
--------------------------------------------------------------------------------
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | pnpm exec lint-staged
2 |
--------------------------------------------------------------------------------
/.markdownlint.json:
--------------------------------------------------------------------------------
1 | {
2 | "default": true,
3 | "MD013": false
4 | }
5 |
--------------------------------------------------------------------------------
/packages/components-css/src/ordered-list/_mixin.scss:
--------------------------------------------------------------------------------
1 | // Nothing here yet
2 |
--------------------------------------------------------------------------------
/proprietary/assets/src/favicon.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/packages/components-angular/src/image/image.component.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/packages/storybook-tooling/src/formatHtml/index.ts:
--------------------------------------------------------------------------------
1 | export * from './formatHtml';
2 |
--------------------------------------------------------------------------------
/packages/components-angular/src/button/button.component.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/packages/components-angular/src/figure/figure.component.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/card.md:
--------------------------------------------------------------------------------
1 | # Rijkshuisstijl Community Card component
2 |
--------------------------------------------------------------------------------
/packages/web-components/src/components/Icon.css:
--------------------------------------------------------------------------------
1 | :host {
2 | display: contents;
3 | }
4 |
--------------------------------------------------------------------------------
/packages/components-angular/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "jest": true
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/packages/components-angular/src/form-label/form-label.component.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/packages/components-angular/src/icon/icon.component.css:
--------------------------------------------------------------------------------
1 | :host {
2 | display: contents;
3 | }
4 |
--------------------------------------------------------------------------------
/packages/components-angular/src/text-input/text-input.component.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/packages/components-css/.gitignore:
--------------------------------------------------------------------------------
1 | # Ignore generated files from Stencil
2 | components.d.ts
3 |
--------------------------------------------------------------------------------
/packages/components-react/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "jest": true
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/apps/rhc-templates/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "next/core-web-vitals",
3 | "root": true
4 | }
5 |
--------------------------------------------------------------------------------
/packages/components-angular/src/figure-caption/figure-caption.component.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/packages/components-angular/src/link-list-item/link-list-item.component.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/packages/components-angular/src/unordered-list/unordered-list.component.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/radio-group.md:
--------------------------------------------------------------------------------
1 | # Rijkshuisstijl Community Radio group component
2 |
--------------------------------------------------------------------------------
/packages/storybook/.storybook/preview-head.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/packages/components-angular/src/link/link.component.css:
--------------------------------------------------------------------------------
1 | @import "@nl-design-system-candidate/link-css/link.css";
2 |
--------------------------------------------------------------------------------
/packages/components-angular/src/unordered-list-item/unordered-list-item.component.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/orderedListItem.md:
--------------------------------------------------------------------------------
1 | # Rijkshuisstijl Community ordered list item component
2 |
--------------------------------------------------------------------------------
/packages/components-angular/src/icon/icon.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/packages/storybook/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": ["../../.eslintrc.json", "plugin:storybook/recommended"]
3 | }
4 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/unorderedListItem.md:
--------------------------------------------------------------------------------
1 | # Rijkshuisstijl Community unordered list item component
2 |
--------------------------------------------------------------------------------
/packages/components-angular/src/heading/heading.component.css:
--------------------------------------------------------------------------------
1 | @import "@nl-design-system-candidate/heading-css/heading.css";
2 |
--------------------------------------------------------------------------------
/packages/components-react/src/Article.tsx:
--------------------------------------------------------------------------------
1 | export { Article, type ArticleProps } from '@utrecht/component-library-react';
2 |
--------------------------------------------------------------------------------
/packages/components-react/src/Checkbox.tsx:
--------------------------------------------------------------------------------
1 | export { Checkbox, type CheckboxProps } from '@utrecht/component-library-react';
2 |
--------------------------------------------------------------------------------
/packages/components-react/src/Textarea.tsx:
--------------------------------------------------------------------------------
1 | export { Textarea, type TextareaProps } from '@utrecht/component-library-react';
2 |
--------------------------------------------------------------------------------
/packages/components-react/src/PageHeader.tsx:
--------------------------------------------------------------------------------
1 | export { PageHeader, type PageHeaderProps } from '@utrecht/component-library-react';
2 |
--------------------------------------------------------------------------------
/packages/storybook-tooling/src/markdownUtils/index.ts:
--------------------------------------------------------------------------------
1 | export * from './mergeMarkdown';
2 | export * from './replaceMarkdown';
3 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/navbar.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community Nav Bar component
4 |
--------------------------------------------------------------------------------
/packages/storybook/src/markdown.d.ts:
--------------------------------------------------------------------------------
1 | declare module '*.md?raw' {
2 | const content: string;
3 | export default content;
4 | }
5 |
--------------------------------------------------------------------------------
/packages/storybook/src/twig.d.ts:
--------------------------------------------------------------------------------
1 | declare module '*.twig?raw' {
2 | const content: string;
3 | export default content;
4 | }
5 |
--------------------------------------------------------------------------------
/packages/components-angular/src/paragraph/paragraph.component.css:
--------------------------------------------------------------------------------
1 | @import "@nl-design-system-candidate/paragraph-css/paragraph.css";
2 |
--------------------------------------------------------------------------------
/packages/components-react/src/PageContent.tsx:
--------------------------------------------------------------------------------
1 | export { PageContent, type PageContentProps } from '@utrecht/component-library-react';
2 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/components/button.md:
--------------------------------------------------------------------------------
1 | # Button
2 |
3 | Een _Button_ biedt de mogelijkheid om een actie uit te voeren.
4 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/side-nav.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community SideNav component
4 |
--------------------------------------------------------------------------------
/packages/components-react/src/ColumnLayout.tsx:
--------------------------------------------------------------------------------
1 | export { ColumnLayout, type ColumnLayoutProps } from '@utrecht/component-library-react';
2 |
--------------------------------------------------------------------------------
/packages/components-react/src/HeadingGroup.tsx:
--------------------------------------------------------------------------------
1 | export { HeadingGroup, type HeadingGroupProps } from '@utrecht/component-library-react';
2 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/components/link.md:
--------------------------------------------------------------------------------
1 | # Link
2 |
3 | Met de _link_ maak je navigatie mogelijk naar een gerelateerde pagina.
4 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/toggletip.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community Toggle Tip component
4 |
--------------------------------------------------------------------------------
/packages/web-components/types/css.d.ts:
--------------------------------------------------------------------------------
1 | declare module '*.css?inline' {
2 | const content: string;
3 | export default content;
4 | }
5 |
--------------------------------------------------------------------------------
/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://openapi.vercel.sh/vercel.json",
3 | "github": {
4 | "autoJobCancellation": true
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/.markdownlintignore:
--------------------------------------------------------------------------------
1 | # Ignore 3rd party files
2 | node_modules
3 |
4 | # Ignore generated files
5 | dist
6 | CHANGELOG.md
7 | .changeset/*.md
8 |
--------------------------------------------------------------------------------
/packages/components-angular/src/paragraph/paragraph.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/packages/components-css/src/accordion/index.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/components/column-layout.md:
--------------------------------------------------------------------------------
1 | # Column Layout
2 |
3 | De _Column Layout_ verdeelt content over meerdere kolommen.
4 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/templates/boete-zoeken/boete-zoeken.component.css:
--------------------------------------------------------------------------------
1 | .rhc-container > * {
2 | --utrecht-space-around: 2;
3 | }
4 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/side-nav-link.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community SideNavLink component
4 |
--------------------------------------------------------------------------------
/packages/components-css/src/visually-hidden/index.scss:
--------------------------------------------------------------------------------
1 | @use "mixin";
2 |
3 | .rhc-visually-hidden {
4 | @include mixin.rhc-visually-hidden;
5 | }
6 |
--------------------------------------------------------------------------------
/packages/components-react/src/NumberBadge.tsx:
--------------------------------------------------------------------------------
1 | export { NumberBadge, type NumberBadgeProps } from '@nl-design-system-candidate/number-badge-react';
2 |
--------------------------------------------------------------------------------
/packages/components-react/src/Radio.tsx:
--------------------------------------------------------------------------------
1 | export { RadioButton as Radio, type RadioButtonProps as RadioProps } from '@utrecht/component-library-react';
2 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/components/image.md:
--------------------------------------------------------------------------------
1 | # Image
2 |
3 | Het _Image_ component kan gebruikt worden om images toe te voegen aan je website.
4 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/components/text-input.md:
--------------------------------------------------------------------------------
1 | # Text Input
2 |
3 | Wordt gebruikt als bouwblok om toegankelijke invoervelden te maken.
4 |
--------------------------------------------------------------------------------
/proprietary/assets/src/placeholder.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nl-design-system/rijkshuisstijl-community/HEAD/proprietary/assets/src/placeholder.jpg
--------------------------------------------------------------------------------
/packages/components-react/src/UnorderedListItem.tsx:
--------------------------------------------------------------------------------
1 | export { UnorderedListItem, type UnorderedListItemProps } from '@utrecht/component-library-react';
2 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/components/data-summary-item.md:
--------------------------------------------------------------------------------
1 | # Data Summary Item
2 |
3 | Het Data Summary Item geeft een gelabeld stukje data weer.
4 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/components/unordered-list.md:
--------------------------------------------------------------------------------
1 | # Unordered List
2 |
3 | Opsomming waar de volgorde van items in de lijst niet van belang is.
4 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/breadcrumb-nav.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community Breadcrumb navigation component
4 |
--------------------------------------------------------------------------------
/apps/rhc-templates/public/placeholder.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nl-design-system/rijkshuisstijl-community/HEAD/apps/rhc-templates/public/placeholder.jpg
--------------------------------------------------------------------------------
/packages/storybook-angular/src/components/footer.md:
--------------------------------------------------------------------------------
1 | # Footer
2 |
3 | Het _Footer_ component kan gebruikt worden om gemakkelijk een gestylde footer te maken.
4 |
--------------------------------------------------------------------------------
/packages/components-react/src/FormFieldErrorMessage.tsx:
--------------------------------------------------------------------------------
1 | export { FormFieldErrorMessage, type FormFieldErrorMessageProps } from '@utrecht/component-library-react';
2 |
--------------------------------------------------------------------------------
/packages/components-react/src/LinkList.tsx:
--------------------------------------------------------------------------------
1 | export { LinkList, LinkListLink, type LinkListProps, type LinkListLinkProps } from '@utrecht/component-library-react';
2 |
--------------------------------------------------------------------------------
/packages/storybook-angular/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nl-design-system/rijkshuisstijl-community/HEAD/packages/storybook-angular/public/favicon.ico
--------------------------------------------------------------------------------
/packages/components-angular/src/link-list/link-list.component.html:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/components-angular/src/link/link.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/components/navbar.md:
--------------------------------------------------------------------------------
1 | # Navigation Bar
2 |
3 | Met het _Navigation Bar_ component kan gemakkelijk een gestylde navigatiebalk gemaakt worden.
4 |
--------------------------------------------------------------------------------
/packages/components-angular/setup-jest.ts:
--------------------------------------------------------------------------------
1 | import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone';
2 | setupZoneTestEnv();
3 | import '@testing-library/jest-dom';
4 |
--------------------------------------------------------------------------------
/packages/components-css/src/unordered-list/_mixin.scss:
--------------------------------------------------------------------------------
1 | @mixin rhc-unordered-list--nested {
2 | margin-inline-start: var(--rhc-unordered-list-nested-margin-inline-start);
3 | }
4 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/components/data-summary.md:
--------------------------------------------------------------------------------
1 | # Data Summary
2 |
3 | De Data Summary is een wrapper om Data Summary Item's. Samen kunnen ze diverse data weergeven.
4 |
--------------------------------------------------------------------------------
/packages/storybook-tooling/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "node": true,
4 | "es6": true
5 | },
6 | "extends": ["../../.eslintrc.json"],
7 | "rules": {}
8 | }
9 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/components/heading.md:
--------------------------------------------------------------------------------
1 | # Heading
2 |
3 | Het _Heading_ component biedt gestylde headings aan die gebruikt kunnen worden voor kopjes van stukken tekst.
4 |
--------------------------------------------------------------------------------
/packages/storybook-tooling/vitest.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vitest/config';
2 |
3 | export default defineConfig({
4 | test: {
5 | globals: true,
6 | },
7 | });
8 |
--------------------------------------------------------------------------------
/.ncurc.minor.cjs:
--------------------------------------------------------------------------------
1 | const patchConfig = require('./.ncurc.patch.cjs');
2 |
3 | module.exports = {
4 | ...patchConfig,
5 | reject: [...patchConfig.reject],
6 | target: 'minor',
7 | };
8 |
--------------------------------------------------------------------------------
/packages/components-angular/src/form-field-error-message/form-field-error-message.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/components/figure.md:
--------------------------------------------------------------------------------
1 | # Figure
2 |
3 | Het _Figure_ component wordt gebruikt om afbeeldingen en FigureCaptions correct te structureren binnen een webpagina.
4 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/templates/betalingsregeling/betalingsregeling.component.css:
--------------------------------------------------------------------------------
1 | .rhc-container > * {
2 | display: block;
3 | margin-block-end: var(--rhc-space-200);
4 | }
5 |
--------------------------------------------------------------------------------
/packages/components-react/tsconfig.dev.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./tsconfig.json",
3 | "compilerOptions": {
4 | "noUnusedLocals": false,
5 | "noUnusedParameters": false
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/components/icon.md:
--------------------------------------------------------------------------------
1 | # Icon
2 |
3 | Dit component is een wrapper om een SVG element. Door dit component te gebruiken heeft deze constant dezelfde styling en grootte.
4 |
--------------------------------------------------------------------------------
/packages/components-angular/src/back-to-top/back-to-top.component.html:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/number-badge.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community Number Badge component
4 |
5 | Een counter badge is een badge die een getal toont.
6 |
--------------------------------------------------------------------------------
/.eslintrc.react.json:
--------------------------------------------------------------------------------
1 | {
2 | "rules": {
3 | "react/no-unknown-property": "off",
4 | "react/prop-types": "off",
5 | "react/jsx-key": "off",
6 | "react/react-in-jsx-scope": "off"
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/packages/components-react/src/OrderedList.tsx:
--------------------------------------------------------------------------------
1 | export {
2 | OrderedList,
3 | type OrderedListProps,
4 | OrderedListItem,
5 | type OrderedListItemProps,
6 | } from '@utrecht/component-library-react';
7 |
--------------------------------------------------------------------------------
/packages/components-react/src/PageNumberNavigation.tsx:
--------------------------------------------------------------------------------
1 | export {
2 | Pagination as PageNumberNavigation,
3 | type PaginationProps as PageNumberNavigationProps,
4 | } from '@amsterdam/design-system-react';
5 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/components/action-group.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Action Group
4 |
5 | De _Action Group_ is een container voor een aantal buttons, of voor een losstaande button.
6 |
--------------------------------------------------------------------------------
/packages/components-angular/jest.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | preset: 'jest-preset-angular',
3 | setupFilesAfterEnv: ['/setup-jest.ts'],
4 | globalSetup: 'jest-preset-angular/global-setup',
5 | };
6 |
--------------------------------------------------------------------------------
/packages/components-angular/src/link-list-link/link-list-link.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/packages/components-css/src/number-badge/index.scss:
--------------------------------------------------------------------------------
1 | @use "../../node_modules/@nl-design-system-candidate/number-badge-css/dist/number-badge.css";
2 |
3 | .nl-number-badge {
4 | box-sizing: content-box;
5 | }
6 |
--------------------------------------------------------------------------------
/packages/components-css/src/page-number-navigation/index.scss:
--------------------------------------------------------------------------------
1 | @use "@amsterdam/design-system-css/dist/pagination/pagination.css";
2 | @use "@amsterdam/design-system-css/dist/visually-hidden/visually-hidden.css";
3 |
--------------------------------------------------------------------------------
/packages/font/src/index.mjs:
--------------------------------------------------------------------------------
1 | import '@fontsource/fira-sans/400.css';
2 | import '@fontsource/fira-sans/400-italic.css';
3 | import '@fontsource/fira-sans/700.css';
4 | import '@fontsource/fira-sans/700-italic.css';
5 |
--------------------------------------------------------------------------------
/packages/storybook-angular/.storybook/overview.mdx:
--------------------------------------------------------------------------------
1 | import { Controls, Description, Primary, Stories } from '@storybook/addon-docs/blocks';
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/packages/components-twig/src/OrderedListItem.twig:
--------------------------------------------------------------------------------
1 |
2 | {{ content }}
3 |
--------------------------------------------------------------------------------
/packages/components-twig/src/Paragraph.twig:
--------------------------------------------------------------------------------
1 | {%- set classes = [
2 | 'nl-paragraph',
3 | purpose and purpose == 'lead' ? 'nl-paragraph--lead' : ''
4 | ] -%}
5 | {{ children }}
6 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/components/form-field-text-input.md:
--------------------------------------------------------------------------------
1 | # Form Field Text Input
2 |
3 | Een _Form Field Text Input_ biedt een accessible input aan (inclusief styling) die gebruikt kan worden in een form.
4 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/components/paragraph.md:
--------------------------------------------------------------------------------
1 | # Paragraph
2 |
3 | Het _Paragraph_ component gebruik je voor een alinea met lopende tekst, instructies van formulieren en voor overige losstaande tekstfragmenten.
4 |
--------------------------------------------------------------------------------
/.htmlvalidate.json:
--------------------------------------------------------------------------------
1 | {
2 | "root": true,
3 | "extends": ["html-validate:recommended"],
4 | "rules": {
5 | "doctype-style": "off",
6 | "no-inline-style": "off",
7 | "void-style": "off"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/packages/storybook/.storybook/test-runner-jest.config.js:
--------------------------------------------------------------------------------
1 | import { getJestConfig } from '@storybook/test-runner';
2 |
3 | const testRunnerConfig = getJestConfig();
4 |
5 | export default {
6 | ...testRunnerConfig,
7 | };
8 |
--------------------------------------------------------------------------------
/packages/components-css/src/ordered-list/index.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 | // If needed to extend the Utrecht component add styles here.
6 | @use "mixin";
7 |
--------------------------------------------------------------------------------
/packages/components-css/src/alert/index.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 | @use "mixin";
6 |
7 | .utrecht-alert {
8 | @include mixin.rhc-alert;
9 | }
10 |
--------------------------------------------------------------------------------
/packages/components-css/src/code-input-group/index.scss:
--------------------------------------------------------------------------------
1 | @use "mixin";
2 |
3 | .rhc-code-input {
4 | @include mixin.rhc-code-input;
5 | }
6 |
7 | .rhc-code-input-group {
8 | @include mixin.rhc-code-input-group;
9 | }
10 |
--------------------------------------------------------------------------------
/packages/components-css/src/skip-link/index.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 | @use "../../node_modules/@nl-design-system-candidate/skip-link-css/dist/skip-link.css";
6 |
--------------------------------------------------------------------------------
/packages/components-react/src/ActionGroup.tsx:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2025 Community for NL Design System
4 | */
5 | export { ActionGroup, type ActionGroupProps } from '@utrecht/component-library-react';
6 |
--------------------------------------------------------------------------------
/.ncurc.major.cjs:
--------------------------------------------------------------------------------
1 | const minorConfig = require('./.ncurc.minor.cjs');
2 |
3 | module.exports = {
4 | ...minorConfig,
5 | reject: [...minorConfig.reject, 'eslint', 'eslint-plugin-json', 'style-dictionary'],
6 | target: 'latest',
7 | };
8 |
--------------------------------------------------------------------------------
/.ncurc.patch.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | cooldown: 1, // 1 day
3 | dep: ['dev', 'prod'],
4 | install: 'always',
5 | reject: [],
6 | root: true,
7 | target: 'patch',
8 | upgrade: true,
9 | workspaces: true,
10 | };
11 |
--------------------------------------------------------------------------------
/packages/components-angular/src/column-layout/column-layout.component.html:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/packages/storybook/src/documentation/readme.mdx:
--------------------------------------------------------------------------------
1 | import { Markdown, Meta } from '@storybook/addon-docs/blocks';
2 | import markdown from '../../../../README.md?raw';
3 |
4 |
5 |
6 | {markdown}
7 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/data-summary-item.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community Data Summary Item component
4 |
5 | ## Usage
6 |
7 | Dit component is bedoeld om binnen een `DataSummary` te gebruiken.
8 |
--------------------------------------------------------------------------------
/packages/components-react/src/VisuallyHidden.tsx:
--------------------------------------------------------------------------------
1 | import { PropsWithChildren } from 'react';
2 |
3 | export const VisuallyHidden = ({ children }: PropsWithChildren) => {
4 | return {children} ;
5 | };
6 |
--------------------------------------------------------------------------------
/packages/storybook/src/documentation/license.mdx:
--------------------------------------------------------------------------------
1 | import { Markdown, Meta } from '@storybook/addon-docs/blocks';
2 | import markdown from '../../../../LICENSE.md?raw';
3 |
4 |
5 | {markdown}
6 |
--------------------------------------------------------------------------------
/apps/rhc-templates/src/app/layout.css:
--------------------------------------------------------------------------------
1 | html:lang(nl) {
2 | -webkit-hyphenate-limit-before: 8;
3 | -webkit-hyphenate-limit-after: 4;
4 | hyphenate-limit-chars: 12 8 4;
5 |
6 | -webkit-hyphenate-limit-lines: 2;
7 | hyphenate-limit-lines: 2;
8 | }
9 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | # Ignore 3rd party files
2 |
3 | node_modules/
4 | vendor/
5 |
6 | # Ignore generated files
7 |
8 | build/
9 | coverage/
10 | dist/
11 | tmp/
12 |
13 | # Ignore Next.js project with own ESLint config
14 |
15 | apps/rhc-templates/
16 |
--------------------------------------------------------------------------------
/packages/components-angular/src/footer/footer.component.css:
--------------------------------------------------------------------------------
1 | .nl-link {
2 | --nl-link-hover-text-decoration: underline;
3 |
4 | color: inherit;
5 | }
6 |
7 | .nl-link:hover {
8 | text-decoration: var(--nl-link-hover-text-decoration);
9 | }
10 |
--------------------------------------------------------------------------------
/packages/components-angular/tsconfig.lib.prod.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./tsconfig.lib.json",
3 | "compilerOptions": {
4 | "declarationMap": false
5 | },
6 | "angularCompilerOptions": {
7 | "compilationMode": "partial"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/components/logo.md:
--------------------------------------------------------------------------------
1 | # Logo
2 |
3 | Omdat buiten officiële Rijksoverheids-media het logo van de Rijksoverheid niet mag worden gebruik, wordt op deze pagina het icoon met id _nederland-map_ gebruikt, met een witte achtergrond.
4 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/components/readme.mdx:
--------------------------------------------------------------------------------
1 | import { Markdown, Meta } from '@storybook/addon-docs/blocks';
2 | import markdown from '../../../components-angular/README.md?raw';
3 |
4 |
5 |
6 | {markdown}
7 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/button.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Icon Only
4 |
5 | ```tsx
6 |
7 |
8 |
9 |
10 |
11 | ```
12 |
--------------------------------------------------------------------------------
/packages/storybook/src/documentation/introduction.mdx:
--------------------------------------------------------------------------------
1 | import { Markdown, Meta } from '@storybook/addon-docs/blocks';
2 | import markdown from './introduction.md?raw';
3 |
4 |
5 |
6 | {markdown}
7 |
--------------------------------------------------------------------------------
/packages/storybook/src/documentation/notice.mdx:
--------------------------------------------------------------------------------
1 | import { Markdown, Meta } from '@storybook/addon-docs/blocks';
2 | import markdown from '../../../../NOTICE.md?raw';
3 |
4 |
5 |
6 | {markdown}
7 |
--------------------------------------------------------------------------------
/.stylelintignore:
--------------------------------------------------------------------------------
1 | # Ignore 3rd party files
2 |
3 | node_modules/
4 | vendor/
5 |
6 | # Ignore generated files
7 |
8 | build/
9 | coverage/
10 | dist/
11 | tmp/
12 |
13 | # Ignore Next.js project with own ESLint config
14 |
15 | apps/rhc-templates/
16 |
--------------------------------------------------------------------------------
/apps/rhc-templates/next.config.js:
--------------------------------------------------------------------------------
1 | /* eslint-env node */
2 |
3 | /** @type {import('next').NextConfig} */
4 | const nextConfig = {
5 | distDir: 'dist',
6 | output: 'export',
7 | trailingSlash: true,
8 | };
9 |
10 | module.exports = nextConfig;
11 |
--------------------------------------------------------------------------------
/packages/components-angular/src/navbar-item/navbar-item.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/packages/components-css/src/blockquote/index.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 |
6 | @use "mixin";
7 |
8 | .utrecht-blockquote__quote {
9 | @include mixin.rhc-blockquote__quote;
10 | }
11 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/components/changelog.mdx:
--------------------------------------------------------------------------------
1 | import { Markdown, Meta } from '@storybook/addon-docs/blocks';
2 | import markdown from '../../../components-angular/CHANGELOG.md?raw';
3 |
4 |
5 |
6 | {markdown}
7 |
--------------------------------------------------------------------------------
/packages/storybook/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # @rijkshuisstijl-community/storybook
2 |
3 | ## 1.1.1
4 |
5 | ### Patch Changes
6 |
7 | - 12110ca: Upgrade React (fixes CVE-2025-55182, see https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components)
8 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/readme.mdx:
--------------------------------------------------------------------------------
1 | import markdown from '@rijkshuisstijl-community/components-css/README.md?raw';
2 | import { Markdown, Meta } from '@storybook/addon-docs/blocks';
3 |
4 |
5 |
6 | {markdown}
7 |
--------------------------------------------------------------------------------
/packages/storybook/src/web-components/readme.mdx:
--------------------------------------------------------------------------------
1 | import markdown from '@rijkshuisstijl-community/web-components/README.md?raw';
2 | import { Markdown, Meta } from '@storybook/addon-docs/blocks';
3 |
4 |
5 |
6 | {markdown}
7 |
--------------------------------------------------------------------------------
/.changeset/cruel-clocks-heal.md:
--------------------------------------------------------------------------------
1 | ---
2 | '@rijkshuisstijl-community/components-react': major
3 | '@rijkshuisstijl-community/web-components': major
4 | '@rijkshuisstijl-community/components-twig': major
5 | ---
6 |
7 | Added EUPL license to Accordion and Alert source code
8 |
--------------------------------------------------------------------------------
/apps/rhc-templates/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # @rijkshuisstijl-community/rhc-templates
2 |
3 | ## 2.0.4
4 |
5 | ### Patch Changes
6 |
7 | - 12110ca: Upgrade React (fixes CVE-2025-55182, see https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components)
8 |
--------------------------------------------------------------------------------
/packages/components-angular/ng-package.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "./node_modules/ng-packagr/ng-package.schema.json",
3 | "dest": "dist",
4 | "allowedNonPeerDependencies": ["angular-tabler-icons"],
5 | "lib": {
6 | "entryFile": "./src/public-api.ts"
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/packages/components-angular/src/icon/icon.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'rhc-icon',
5 | templateUrl: './icon.component.html',
6 | styleUrl: './icon.component.css',
7 | })
8 | export class IconComponent {}
9 |
--------------------------------------------------------------------------------
/packages/components-css/src/code-input/index.scss:
--------------------------------------------------------------------------------
1 | .rhc-code-input {
2 | block-size: var(--rhc-code-input-size);
3 | inline-size: var(--rhc-code-input-size);
4 | text-align: center;
5 |
6 | &--capitalized {
7 | text-transform: uppercase;
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/packages/components-css/src/unordered-list/index.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 | @use "mixin";
6 |
7 | .utrecht-unordered-list--nested {
8 | @include mixin.rhc-unordered-list--nested;
9 | }
10 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/assets/pl-flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/readme.mdx:
--------------------------------------------------------------------------------
1 | import markdown from '@rijkshuisstijl-community/components-react/README.md?raw';
2 | import { Markdown, Meta } from '@storybook/addon-docs/blocks';
3 |
4 |
5 |
6 | {markdown}
7 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-twig/readme.mdx:
--------------------------------------------------------------------------------
1 | import markdown from '@rijkshuisstijl-community/components-twig/README.md?raw';
2 | import { Markdown, Meta } from '@storybook/addon-docs/blocks';
3 |
4 |
5 |
6 | {markdown}
7 |
--------------------------------------------------------------------------------
/proprietary/LICENSE.md:
--------------------------------------------------------------------------------
1 | # License
2 |
3 | Copyright (c) 2021 Dutch Ministry of General Affairs. All rights reserved.
4 |
5 | The open source license does NOT apply to files in this directory.
6 |
7 | These are properietary assets to the Dutch Ministry of General Affairs.
8 |
--------------------------------------------------------------------------------
/packages/components-angular/src/link-list/link-list.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'rhc-link-list',
5 | imports: [],
6 | templateUrl: './link-list.component.html',
7 | })
8 | export class LinkListComponent {}
9 |
--------------------------------------------------------------------------------
/packages/components-react/src/TextInput.tsx:
--------------------------------------------------------------------------------
1 | import { Textbox } from '@utrecht/component-library-react';
2 | export { type TextboxProps as TextInputProps } from '@utrecht/component-library-react';
3 |
4 | export const TextInput = Textbox;
5 | TextInput.displayName = 'TextInput';
6 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/assets/lv-flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/changelog.mdx:
--------------------------------------------------------------------------------
1 | import markdown from '@rijkshuisstijl-community/components-css/CHANGELOG.md?raw';
2 | import { Markdown, Meta } from '@storybook/addon-docs/blocks';
3 |
4 |
5 |
6 | {markdown}
7 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-twig/changelog.mdx:
--------------------------------------------------------------------------------
1 | import markdown from '@rijkshuisstijl-community/components-twig/CHANGELOG.md?raw';
2 | import { Markdown, Meta } from '@storybook/addon-docs/blocks';
3 |
4 |
5 |
6 | {markdown}
7 |
--------------------------------------------------------------------------------
/packages/storybook/src/web-components/changelog.mdx:
--------------------------------------------------------------------------------
1 | import markdown from '@rijkshuisstijl-community/web-components/CHANGELOG.md?raw';
2 | import { Markdown, Meta } from '@storybook/addon-docs/blocks';
3 |
4 |
5 |
6 | {markdown}
7 |
--------------------------------------------------------------------------------
/packages/font/src/index.scss:
--------------------------------------------------------------------------------
1 | @use "@fontsource/fira-sans/400.css" as FiraSansRegular;
2 | @use "@fontsource/fira-sans/400-italic.css" as FiraSansItalic;
3 | @use "@fontsource/fira-sans/700.css" as FiraSansBold;
4 | @use "@fontsource/fira-sans/700-italic.css" as FiraSansBoldItalic;
5 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/changelog.mdx:
--------------------------------------------------------------------------------
1 | import markdown from '@rijkshuisstijl-community/components-react/CHANGELOG.md?raw';
2 | import { Markdown, Meta } from '@storybook/addon-docs/blocks';
3 |
4 |
5 |
6 | {markdown}
7 |
--------------------------------------------------------------------------------
/proprietary/assets/LICENSE.md:
--------------------------------------------------------------------------------
1 | # License
2 |
3 | Copyright (c) 2023 Dutch Ministry of General Affairs. All rights reserved.
4 |
5 | The open source license does NOT apply to files in this directory.
6 |
7 | These are properietary assets to the Dutch Ministry of General Affairs.
8 |
--------------------------------------------------------------------------------
/packages/components-react/src/Blockquote.tsx:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2025 Community for NL Design System
4 | */
5 |
6 | export { Blockquote } from '@utrecht/component-library-react';
7 | export type { BlockquoteProps } from '@utrecht/component-library-react';
8 |
--------------------------------------------------------------------------------
/packages/storybook-angular/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # @rijkshuisstijl-community/storybook-angular
2 |
3 | ## 1.2.2
4 |
5 | ### Patch Changes
6 |
7 | - 12110ca: Upgrade React (fixes CVE-2025-55182, see https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components)
8 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = UTF-8
5 | end_of_line = lf
6 | indent_size = 2
7 | indent_style = space
8 | insert_final_newline = true
9 | max_line_length = 120
10 | trim_trailing_whitespace = true
11 |
12 | [*.{md,mdx}]
13 | trim_trailing_whitespace = false
14 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/components/link-list-link.md:
--------------------------------------------------------------------------------
1 | # Link List Link
2 |
3 | Een _Link List Link_ kan gebruikt worden binnen een _Link List Item_ die op zijn beurt weer gebruikt kan worden binnen een _Link List_.
4 |
5 | Met dit component kan je invulling geven aan een _Link List_.
6 |
--------------------------------------------------------------------------------
/packages/components-css/src/paragraph/index.scss:
--------------------------------------------------------------------------------
1 | @use "../../node_modules/@nl-design-system-candidate/paragraph-css/dist/paragraph.css";
2 |
3 | .nl-paragraph {
4 | margin-block-end: var(--nl-paragraph-margin-block-end);
5 | margin-block-start: var(--nl-paragraph-margin-block-start);
6 | }
7 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/assets/fr-flag.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/assets/hu-flag.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.changeset/good-meals-raise.md:
--------------------------------------------------------------------------------
1 | ---
2 | '@rijkshuisstijl-community/components-react': major
3 | '@rijkshuisstijl-community/design-tokens': major
4 | '@rijkshuisstijl-community/components-css': major
5 | '@rijkshuisstijl-community/web-components': major
6 | ---
7 |
8 | Added licenses to Blockquote source code
9 |
--------------------------------------------------------------------------------
/packages/storybook/types/twig.d.ts:
--------------------------------------------------------------------------------
1 | declare module '*.twig' {
2 | // Twig templates are compiled to functions that accept props and return strings
3 | // We type them as 'any' for ease of use with Storybook's component expectations
4 | const TwigTemplate: any;
5 | export default TwigTemplate;
6 | }
7 |
--------------------------------------------------------------------------------
/packages/components-angular/src/data-summary/data-summary.component.html:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/packages/components-css/src/text-input/index.scss:
--------------------------------------------------------------------------------
1 | .utrecht-textbox:focus {
2 | border-width: var(--utrecht-textbox-focus-border-width, var(--rhc-border-width-m, 2px));
3 | }
4 | .utrecht-textbox--invalid:focus {
5 | border-width: var(--utrecht-textbox-focus-border-width, var(--rhc-border-width-m, 2px));
6 | }
7 |
--------------------------------------------------------------------------------
/packages/storybook-angular/.storybook/typings.d.ts:
--------------------------------------------------------------------------------
1 | declare module '*.md' {
2 | const content: string;
3 | export default content;
4 | }
5 |
6 | declare module '*.mdx' {
7 | import { ComponentType } from 'react';
8 | const MDXComponent: ComponentType;
9 | export default MDXComponent;
10 | }
11 |
--------------------------------------------------------------------------------
/packages/components-angular/src/navbar-item/heading-item.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, HostBinding } from '@angular/core';
2 |
3 | @Directive({
4 | selector: '[rhcHeadingItem]',
5 | })
6 | export class HeadingItemDirective {
7 | @HostBinding('class')
8 | className = 'rhc-nav-bar__heading';
9 | }
10 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/LVFlagIcon.tsx:
--------------------------------------------------------------------------------
1 | export const LVFlagIcon = () => (
2 |
3 |
4 |
5 |
6 | );
7 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/assets/nl-flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/table-cell.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community TableCell component
4 |
5 | ## Usage
6 |
7 | ```jsx
8 | import { TableCell } from '@rijkshuisstijl/community-components';
9 |
10 | Label ;
11 | ```
12 |
--------------------------------------------------------------------------------
/.github/CODEOWNERS:
--------------------------------------------------------------------------------
1 | # See: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
2 |
3 | # Changes to this file (.github/CODEOWNERS) require approval from @nl-design-system/kernteam-admin
4 | .github/CODEOWNERS @nl-design-system/kernteam-admin
5 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/PLFlagIcon.tsx:
--------------------------------------------------------------------------------
1 | export const PLFlagIcon = () => (
2 |
3 |
4 |
5 |
6 | );
7 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/form-field-radio.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community FormFieldRadio component
4 |
5 | ## Usage
6 |
7 | ```tsx
8 | import { FormFieldRadio } from '@rijkshuisstijl-community/components-react';
9 |
10 | ;
11 | ```
12 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | # This is an npm only setting. We do not use npm, but if it is run by accident, this setting prevents pre- and
2 | # post-install scripts from executing. This is aligns with pnpm's behaviour, where these scripts must be explicitly
3 | # approved with `pnpm approve-builds`.
4 | ignore-scripts=true
5 |
6 | provenance=true
7 |
--------------------------------------------------------------------------------
/packages/components-angular/src/form-field-error-message/form-field-error-message.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'rhc-form-field-error-message',
5 | templateUrl: './form-field-error-message.component.html',
6 | })
7 | export class FormFieldErrorMessageComponent {}
8 |
--------------------------------------------------------------------------------
/packages/components-angular/src/navbar-item/end-item.directive.spec.ts:
--------------------------------------------------------------------------------
1 | import { EndItemDirective } from './end-item.directive';
2 |
3 | describe('EndItemDirective', () => {
4 | it('should create an instance', () => {
5 | const directive = new EndItemDirective();
6 | expect(directive).toBeTruthy();
7 | });
8 | });
9 |
--------------------------------------------------------------------------------
/packages/components-angular/tsconfig.lib.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "compilerOptions": {
4 | "outDir": "../../out-tsc/lib",
5 | "declaration": true,
6 | "declarationMap": true,
7 | "inlineSources": true,
8 | "types": []
9 | },
10 | "exclude": ["**/*.spec.ts"]
11 | }
12 |
--------------------------------------------------------------------------------
/packages/components-react/src/Table.tsx:
--------------------------------------------------------------------------------
1 | export {
2 | Table,
3 | type TableProps,
4 | TableHeader,
5 | type TableHeaderProps,
6 | TableRow,
7 | type TableRowProps,
8 | TableBody,
9 | type TableBodyProps,
10 | TableFooter,
11 | type TableFooterProps,
12 | } from '@utrecht/component-library-react';
13 |
--------------------------------------------------------------------------------
/packages/storybook/.storybook/test-runner.js:
--------------------------------------------------------------------------------
1 | import { checkA11y, injectAxe } from 'axe-playwright';
2 |
3 | export async function preVisit(page) {
4 | await injectAxe(page);
5 | }
6 | export async function postVisit(page) {
7 | await checkA11y(page, '#storybook-root', {
8 | verbose: false,
9 | });
10 | }
11 |
--------------------------------------------------------------------------------
/.changeset/pretty-breads-pick.md:
--------------------------------------------------------------------------------
1 | ---
2 | '@rijkshuisstijl-community/components-angular': major
3 | '@rijkshuisstijl-community/components-react': major
4 | '@rijkshuisstijl-community/components-css': major
5 | '@rijkshuisstijl-community/web-components': major
6 | ---
7 |
8 | Added licensing information to Action group source files
9 |
--------------------------------------------------------------------------------
/packages/components-angular/src/navbar/navbar.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, Input } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'rhc-navbar',
5 | imports: [],
6 | templateUrl: './navbar.component.html',
7 | })
8 | export class NavbarComponent {
9 | @Input() showEndItems?: boolean = false;
10 | }
11 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/assets/bg-flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/assets/it-flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/packages/components-angular/src/logo/logo.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | {{ organisation }}
6 | @if (subtitle) {
7 | {{ subtitle }}
8 | }
9 |
10 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/FRFlagIcon.tsx:
--------------------------------------------------------------------------------
1 | export const FRFlagIcon = () => (
2 |
3 |
4 |
5 |
6 |
7 | );
8 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/assets/gr-flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.changeset/config.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://unpkg.com/@changesets/config@3.0.2/schema.json",
3 | "changelog": "@changesets/cli/changelog",
4 | "commit": false,
5 | "fixed": [],
6 | "linked": [],
7 | "access": "restricted",
8 | "baseBranch": "main",
9 | "updateInternalDependencies": "patch",
10 | "ignore": []
11 | }
12 |
--------------------------------------------------------------------------------
/packages/components-twig/src/OrderedList.twig:
--------------------------------------------------------------------------------
1 |
2 |
3 | {% for item in items %}
4 | {% include '@rhc/OrderedListItem.twig' with {
5 | content: item
6 | } %}
7 | {% endfor %}
8 |
9 |
--------------------------------------------------------------------------------
/packages/storybook/.babelrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "sourceType": "unambiguous",
3 | "presets": [
4 | [
5 | "@babel/preset-env",
6 | {
7 | "targets": {
8 | "chrome": 100
9 | }
10 | }
11 | ],
12 | "@babel/preset-typescript",
13 | "@babel/preset-react"
14 | ],
15 | "plugins": []
16 | }
17 |
--------------------------------------------------------------------------------
/packages/components-css/src/radio-group/index.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 |
6 | @use "mixin";
7 |
8 | .rhc-radio-group {
9 | @include mixin.rhc-radio-group;
10 | }
11 |
12 | .utrecht-form-label {
13 | line-height: var(--rhc-text-line-height-md, inherit);
14 | }
15 |
--------------------------------------------------------------------------------
/packages/components-css/src/textarea/index.scss:
--------------------------------------------------------------------------------
1 | .utrecht-textarea {
2 | &:focus {
3 | border-width: var(--rhc-textarea-focus-border-width, var(--rhc-border-width-m, 2px));
4 | }
5 | &--html-textarea:read-only {
6 | --utrecht-textarea-read-only-border: var(--utrecht-textarea-read-only-background-color, --rhc-color-grijs-100);
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/packages/components-angular/src/column-layout/column-layout.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, Input } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'rhc-column-layout',
5 | imports: [],
6 | templateUrl: './column-layout.component.html',
7 | })
8 | export class ColumnLayoutComponent {
9 | @Input() rule?: boolean = false;
10 | }
11 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/assets/ro-flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/packages/components-css/src/button/index.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 | @use "mixin";
6 |
7 | .rhc-button--icon-only {
8 | @include mixin.rhc-button--icon-only;
9 | }
10 |
11 | .rhc-button--icon-only .rhc-button__sr-only {
12 | @include mixin.invisible-but-accessible;
13 | }
14 |
--------------------------------------------------------------------------------
/.lintstagedrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "composer.json": "composer validate",
3 | "package.json": "npmPkgJsonLint --allowEmptyTargets",
4 | "*.md": ["markdownlint", "prettier --check"],
5 | "*.{js,cjs,mjs,json,jsx,mdx,ts,tsx}": ["eslint --no-error-on-unmatched-pattern", "prettier --check"],
6 | "*.{css,scss}": ["stylelint --allow-empty-input", "prettier --check"]
7 | }
8 |
--------------------------------------------------------------------------------
/packages/components-css/src/separator/index.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 |
6 | .utrecht-separator {
7 | --utrecht-space-around: 1;
8 |
9 | margin-inline-end: 0;
10 | margin-inline-start: 0;
11 | &--invisible {
12 | --utrecht-separator-color: transparent;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/HUFlagIcon.tsx:
--------------------------------------------------------------------------------
1 | export const HUFlagIcon = () => (
2 |
3 |
4 |
5 |
6 |
7 | );
8 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/NLFlagIcon.tsx:
--------------------------------------------------------------------------------
1 | export const NLFlagIcon = () => (
2 |
3 |
4 |
5 |
6 |
7 | );
8 |
--------------------------------------------------------------------------------
/packages/storybook-angular/.storybook/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig.json",
3 | "compilerOptions": {
4 | "types": ["node"],
5 | "allowSyntheticDefaultImports": true
6 | },
7 | "exclude": ["../src/test.ts", "../src/**/*.spec.ts"],
8 | "include": ["../src/**/*.stories.*", "./preview.ts"],
9 | "files": ["./typings.d.ts"]
10 | }
11 |
--------------------------------------------------------------------------------
/packages/components-react/src/Paragraph.tsx:
--------------------------------------------------------------------------------
1 | import type { ParagraphPurpose } from '@nl-design-system-candidate/paragraph-react';
2 | import { HTMLAttributes } from 'react';
3 | export { Paragraph } from '@nl-design-system-candidate/paragraph-react';
4 | export interface ParagraphProps extends HTMLAttributes {
5 | purpose?: ParagraphPurpose;
6 | }
7 |
--------------------------------------------------------------------------------
/proprietary/design-tokens/src/common/utrecht/action.tokens.json:
--------------------------------------------------------------------------------
1 | {
2 | "utrecht": {
3 | "action": {
4 | "activate": { "cursor": { "value": "pointer" } },
5 | "busy": { "cursor": { "value": "wait" } },
6 | "disabled": { "cursor": { "value": "not-allowed" } },
7 | "submit": { "cursor": { "value": "pointer" } }
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/apps/rhc-templates/src/app/page.tsx:
--------------------------------------------------------------------------------
1 | import PageContent from '@rijkshuisstijl-community/storybook/src/templates/homepage';
2 | import type { Metadata } from 'next';
3 |
4 | export const metadata: Metadata = {
5 | description: 'Homepage template voor de Rijkshuisstijl Community',
6 | };
7 |
8 | export default function Page() {
9 | return ;
10 | }
11 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/BGFlagIcon.tsx:
--------------------------------------------------------------------------------
1 | export const BGFlagIcon = () => (
2 |
3 |
4 |
5 |
6 |
7 | );
8 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/ITFlagIcon.tsx:
--------------------------------------------------------------------------------
1 | export const ITFlagIcon = () => (
2 |
3 |
4 |
5 |
6 |
7 | );
8 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/components/link-list.md:
--------------------------------------------------------------------------------
1 | # Link List
2 |
3 | Links met een pijl als voorloopteken worden gebruikt aan het einde van een tekst. Ze verwijzen naar gerelateerde informatie over het onderwerp dat in de voorafgaande tekst is besproken.
4 |
5 | Links zonder pijl als voorloopteken kunnen ook worden gebruikt, deze zijn vaak terug te vinden in footers.
6 |
--------------------------------------------------------------------------------
/packages/components-angular/src/image/image.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'img[rhc-image]',
5 | imports: [],
6 | templateUrl: './image.component.html',
7 | host: {
8 | '[class.utrecht-img]': 'true',
9 | '[class.utrecht-img--photo]': 'true',
10 | },
11 | })
12 | export class ImageComponent {}
13 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/GRFlagIcon.tsx:
--------------------------------------------------------------------------------
1 | export const GRFlagIcon = () => (
2 |
3 |
4 |
5 |
6 | );
7 |
--------------------------------------------------------------------------------
/.changeset/odd-walls-stay.md:
--------------------------------------------------------------------------------
1 | ---
2 | '@rijkshuisstijl-community/components-react': minor
3 | ---
4 |
5 | Added `iconEnd` property to `NavigationListItem` component. The icon end used to be `chevron-end` and not customizable. Now it is optionally customizable. The default value is `chevron-end`. With this, it is not a breaking change and does not affect existing usage of the component.
6 |
--------------------------------------------------------------------------------
/packages/components-angular/src/link-list-item/link-list-item.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'li[rhc-link-list-item]',
5 | imports: [],
6 | templateUrl: './link-list-item.component.html',
7 | host: {
8 | '[class.utrecht-link-list__item]': 'true',
9 | },
10 | })
11 | export class LinkListItemComponent {}
12 |
--------------------------------------------------------------------------------
/packages/components-css/src/article/index.scss:
--------------------------------------------------------------------------------
1 | // if needed add styles here for the Article components.
2 |
3 | .utrecht-article {
4 | font-family: var(--rhc-text-font-family-default, inherit);
5 | font-size: var(--rhc-text-font-size-max-md, inherit);
6 | font-weight: var(--rhc-text-font-weight-regular, inherit);
7 | line-height: var(--rhc-text-line-height-md, inherit);
8 | }
9 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/textarea.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community Form field with text input
4 |
5 | ## Privacy
6 |
7 | Gebruik `spellcheck="false"` voor velden die gevoelige informatie kunnen bevatten, zoals wachtwoorden en persoonsgegevens. Sommige browser extensions voor spellingcontrole sturen deze informatie naar externe servers.
8 |
--------------------------------------------------------------------------------
/packages/components-angular/src/figure-caption/figure-caption.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'figcaption[rhc-figure-caption]',
5 | imports: [],
6 | templateUrl: './figure-caption.component.html',
7 | host: {
8 | '[class.utrecht-figure__caption]': 'true',
9 | },
10 | })
11 | export class FigureCaptionComponent {}
12 |
--------------------------------------------------------------------------------
/packages/components-css/src/dot-badge/index.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 | @use "../button/mixin" as button-mixin;
6 | @use "mixin";
7 |
8 | .rhc-dot-badge {
9 | @include mixin.rhc-dot-badge;
10 | }
11 |
12 | .rhc-dot-badge .rhc-dot-badge__sr-only {
13 | @include button-mixin.invisible-but-accessible;
14 | }
15 |
--------------------------------------------------------------------------------
/apps/rhc-templates/README.md:
--------------------------------------------------------------------------------
1 | # Rijkshuisstijl community template page
2 |
3 | ## Getting Started
4 |
5 | First, run the development server:
6 |
7 | ```bash
8 | pnpm dev
9 | ```
10 |
11 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
12 |
13 | You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
14 |
--------------------------------------------------------------------------------
/packages/components-angular/src/navbar-item/end-item.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive } from '@angular/core';
2 |
3 | /**
4 | * Deze directive wordt gebruikt als "marker". Hiermee kunnen 's gemarkeerd worden als endItem.
5 | * Een endItem wordt aan het einde van de navbar geplaatst.
6 | */
7 | @Directive({
8 | selector: '[rhcEndItem]',
9 | })
10 | export class EndItemDirective {}
11 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/ROFlagIcon.tsx:
--------------------------------------------------------------------------------
1 | export const ROFlagIcon = () => (
2 |
3 |
4 |
5 |
6 |
7 | );
8 |
--------------------------------------------------------------------------------
/apps/rhc-templates/src/app/collage/page.tsx:
--------------------------------------------------------------------------------
1 | import PageContent from '@rijkshuisstijl-community/storybook/src/templates/collage';
2 | import type { Metadata } from 'next';
3 |
4 | export const metadata: Metadata = {
5 | title: 'Collage',
6 | description: 'Collage template voor de Rijkshuisstijl Community',
7 | };
8 |
9 | export default function Page() {
10 | return ;
11 | }
12 |
--------------------------------------------------------------------------------
/apps/rhc-templates/src/app/details/page.tsx:
--------------------------------------------------------------------------------
1 | import PageContent from '@rijkshuisstijl-community/storybook/src/templates/details';
2 | import type { Metadata } from 'next';
3 |
4 | export const metadata: Metadata = {
5 | title: 'Details',
6 | description: 'Details template voor de Rijkshuisstijl Community',
7 | };
8 |
9 | export default function Page() {
10 | return ;
11 | }
12 |
--------------------------------------------------------------------------------
/apps/rhc-templates/src/app/form/page.tsx:
--------------------------------------------------------------------------------
1 | import PageContent from '@rijkshuisstijl-community/storybook/src/templates/form';
2 | import type { Metadata } from 'next';
3 |
4 | export const metadata: Metadata = {
5 | title: 'Formulier',
6 | description: 'Formulier template voor de Rijkshuisstijl Community',
7 | };
8 |
9 | export default function Page() {
10 | return ;
11 | }
12 |
--------------------------------------------------------------------------------
/packages/components-angular/tsconfig.spec.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./tsconfig.json",
3 | "compilerOptions": {
4 | "module": "CommonJs",
5 | "types": ["jest", "@testing-library/jest-dom"],
6 | "esModuleInterop": true,
7 | "emitDecoratorMetadata": true
8 | },
9 | "include": ["./setup-jest.ts", "src/**/*.spec.ts", "src/**/*.d.ts"],
10 | "exclude": ["**/node_modules/*"]
11 | }
12 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/table-header-cell.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community TableHeaderCell component
4 |
5 | ## Usage
6 |
7 | ```jsx
8 | import { TableHeaderCell } from '@rijkshuisstijl/community-components';
9 |
10 |
11 | Header
12 | ;
13 | ```
14 |
--------------------------------------------------------------------------------
/apps/rhc-templates/src/app/rich-text/page.tsx:
--------------------------------------------------------------------------------
1 | import PageContent from '@rijkshuisstijl-community/storybook/src/templates/rich-text';
2 | import type { Metadata } from 'next';
3 |
4 | export const metadata: Metadata = {
5 | title: 'Rich Text',
6 | description: 'Rich Text template voor de Rijkshuisstijl Community',
7 | };
8 |
9 | export default function Page() {
10 | return ;
11 | }
12 |
--------------------------------------------------------------------------------
/packages/components-angular/src/unordered-list-item/unordered-list-item.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'li[rhc-unordered-list-item]',
5 | imports: [],
6 | templateUrl: './unordered-list-item.component.html',
7 | host: {
8 | '[class.utrecht-unordered-list__item]': 'true',
9 | },
10 | })
11 | export class UnorderedListItemComponent {}
12 |
--------------------------------------------------------------------------------
/packages/components-twig/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json.schemastore.org/tsconfig",
3 | "compilerOptions": {
4 | "outDir": "./dist/",
5 | "lib": ["ESNext", "dom"],
6 | "types": ["node"],
7 | "module": "Preserve",
8 | "moduleResolution": "bundler",
9 | "declaration": true
10 | },
11 | "extends": "@nl-design-system/tsconfig",
12 | "include": ["./src/"]
13 | }
14 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/card.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/card.stories';
2 | import * as ReactStories from '../components-react/card.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Card',
8 | id: 'css-card',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 |
--------------------------------------------------------------------------------
/apps/rhc-templates/src/app/voorbeelden/page.tsx:
--------------------------------------------------------------------------------
1 | import PageContent from '@rijkshuisstijl-community/storybook/src/templates/voorbeelden';
2 | import type { Metadata } from 'next';
3 |
4 | export const metadata: Metadata = {
5 | title: 'Voorbeelden',
6 | description: "Voorbeeldpagina's voor de Rijkshuisstijl Community",
7 | };
8 |
9 | export default function Page() {
10 | return ;
11 | }
12 |
--------------------------------------------------------------------------------
/packages/components-angular/src/navbar-item/heading-item.directive.spec.ts:
--------------------------------------------------------------------------------
1 | import { HeadingItemDirective } from './heading-item.directive';
2 |
3 | describe('HeadingItemDirective', () => {
4 | it('should create an instance', () => {
5 | const directive = new HeadingItemDirective();
6 | expect(directive).toBeTruthy();
7 | expect(directive.className).toBe('rhc-nav-bar__heading');
8 | });
9 | });
10 |
--------------------------------------------------------------------------------
/packages/components-react/src/Accordion.tsx:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2025 Community for NL Design System
4 | */
5 |
6 | export {
7 | Accordion,
8 | type AccordionProps,
9 | AccordionProvider,
10 | type AccordionProviderProps,
11 | AccordionSection,
12 | type AccordionSectionProps,
13 | type AccordionSectionProviderProps,
14 | } from '@utrecht/component-library-react';
15 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/navigation-list-item.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community Navigation List Item component
4 |
5 | ## Usage
6 |
7 | ```tsx
8 | import { NavigationListItem } from '@rijkshuisstijl-community/components-react';
9 |
10 | ;
11 | ```
12 |
--------------------------------------------------------------------------------
/proprietary/assets/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # @rijkshuisstijl-community/assets
2 |
3 | ## 1.0.2
4 |
5 | ### Patch Changes
6 |
7 | - 10ec55a: Release package with npm provenance.
8 |
9 | ## 1.0.1
10 |
11 | ### Patch Changes
12 |
13 | - 1dc03fb: Wekelijkse package updates voor Rijkshuisstijl-componenten en design tokens (week 10)
14 |
15 | ## 1.0.0
16 |
17 | ### Patch Changes
18 |
19 | - ed83ac9: First full release
20 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/FlagIconIDs.ts:
--------------------------------------------------------------------------------
1 | const flagIconIDs = [
2 | 'bg-flag',
3 | 'de-flag',
4 | 'es-flag',
5 | 'fr-flag',
6 | 'gr-flag',
7 | 'hu-flag',
8 | 'it-flag',
9 | 'lv-flag',
10 | 'nl-flag',
11 | 'pl-flag',
12 | 'pt-flag',
13 | 'ro-flag',
14 | 'sk-flag',
15 | 'uk-flag',
16 | ] as const;
17 |
18 | export type FlagIconIDs = (typeof flagIconIDs)[number];
19 |
--------------------------------------------------------------------------------
/packages/storybook/src/documentation/font.mdx:
--------------------------------------------------------------------------------
1 | import changelog from '@rijkshuisstijl-community/font/CHANGELOG.md?raw';
2 | import markdown from '@rijkshuisstijl-community/font/README.md?raw';
3 | import { Markdown, Meta, Title } from '@storybook/addon-docs/blocks';
4 |
5 |
6 |
7 | {markdown}
8 |
9 | Changelog
10 |
11 | {changelog}
12 |
--------------------------------------------------------------------------------
/apps/rhc-templates/src/app/not-found.tsx:
--------------------------------------------------------------------------------
1 | import PageContent from '@rijkshuisstijl-community/storybook/src/templates/not-found';
2 | import type { Metadata } from 'next';
3 |
4 | export const metadata: Metadata = {
5 | title: 'Pagina niet gevonden (404)',
6 | description: 'Pagina niet gevonden. Deze pagina bestaat (niet) meer.',
7 | };
8 |
9 | export default function Page() {
10 | return ;
11 | }
12 |
--------------------------------------------------------------------------------
/packages/components-angular/src/data-summary/data-summary.component.ts:
--------------------------------------------------------------------------------
1 | import { CommonModule } from '@angular/common';
2 | import { Component, Input } from '@angular/core';
3 |
4 | @Component({
5 | selector: 'rhc-data-summary',
6 | imports: [CommonModule],
7 | templateUrl: './data-summary.component.html',
8 | })
9 | export class DataSummaryComponent {
10 | @Input() appearance: 'Column' | 'Row' = 'Column';
11 | }
12 |
--------------------------------------------------------------------------------
/packages/components-angular/src/form-field-description/form-field-description.component.html:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/packages/components-angular/src/navbar-item/navbar-item.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, Input } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'li[rhc-navbar-item]',
5 | imports: [],
6 | templateUrl: './navbar-item.component.html',
7 | host: {
8 | '[class.rhc-nav-bar__item]': 'true',
9 | },
10 | })
11 | export class NavbarItemComponent {
12 | @Input({ required: true }) href!: string;
13 | }
14 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/article.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/article.stories';
2 | import * as ReactStories from '../components-react/article.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Article',
8 | id: 'css-article',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 |
--------------------------------------------------------------------------------
/packages/components-react/src/Drawer.tsx:
--------------------------------------------------------------------------------
1 | import { Drawer as UtrechtDrawer } from '@utrecht/component-library-react';
2 | import React from 'react';
3 |
4 | export { type DrawerProps } from '@utrecht/component-library-react';
5 |
6 | export const Drawer: React.FC> = (props) => {
7 | return ;
8 | };
9 |
10 | Drawer.displayName = 'Drawer';
11 |
--------------------------------------------------------------------------------
/packages/components-css/src/checkbox-group/index.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 |
6 | .rhc-checkbox-group {
7 | display: flex;
8 | flex-direction: column;
9 | padding-block-end: var(--rhc-checkbox-group-padding-block-end);
10 | padding-block-start: var(--rhc-checkbox-group-padding-block-start);
11 | row-gap: var(--rhc-checkbox-group-row-gap);
12 | }
13 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/assets/de-flag.svg:
--------------------------------------------------------------------------------
1 |
2 | Flag of Germany
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/packages/components-react/tsconfig.test.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./tsconfig.json",
3 | "compilerOptions": {
4 | "noEmit": true,
5 | "rootDir": "./"
6 | },
7 | "include": [
8 | "next-env.d.ts",
9 | "vite.config.ts",
10 | "src/**/*.ts",
11 | "src/**/*.tsx",
12 | "../../node_modules/.pnpm/@types+jest@29.5.1/node_modules/@types/jest/index.d.ts"
13 | ],
14 | "exclude": ["**/node_modules/*"]
15 | }
16 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/dot-badge.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/dot-badge.stories';
2 | import * as ReactStories from '../components-react/dot-badge.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Dot Badge',
8 | id: 'css-dot-badge',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/figure.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/figure.stories';
2 | import * as ReactStories from '../components-react/figure.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Figure',
8 | id: 'css-figure',
9 | };
10 |
11 | export const DefaultFigure = ReactStories.DefaultFigure;
12 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/toggletip.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/toggletip.stories';
2 | import * as ReactStories from '../components-react/toggletip.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Toggletip',
8 | id: 'css-toggletip',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 |
--------------------------------------------------------------------------------
/packages/components-css/src/pre-heading/index.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 |
6 | .rhc-heading-container {
7 | display: grid;
8 | grid-template-areas:
9 | "preheading"
10 | "heading";
11 | }
12 |
13 | .rhc-pre-heading {
14 | grid-area: preheading;
15 | }
16 |
17 | .rhc-heading-container > *:not(.rhc-pre-heading) {
18 | grid-area: heading;
19 | }
20 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/side-nav.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/side-nav.stories';
2 | import * as ReactStories from '../components-react/side-nav.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Side Navigation',
8 | id: 'css-side-nav',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/DEFlagIcon.tsx:
--------------------------------------------------------------------------------
1 | export const DEFlagIcon = () => (
2 |
3 |
4 |
5 |
6 |
7 | );
8 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/page-header.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/page-header.stories';
2 | import * as ReactStories from '../components-react/page-header.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Page Header',
8 | id: 'css-page-header',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/pre-heading.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/pre-heading.stories';
2 | import * as ReactStories from '../components-react/pre-heading.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Pre-heading',
8 | id: 'css-pre-heading',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/radio-group.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/radio-group.stories';
2 | import * as ReactStories from '../components-react/radio-group.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Radio Group',
8 | id: 'css-radio-group',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/table-cell.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/table-cell.stories';
2 | import * as ReactStories from '../components-react/table-cell.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Table/Table Cell',
8 | id: 'css-table-cell',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 |
--------------------------------------------------------------------------------
/prettier.config.cjs:
--------------------------------------------------------------------------------
1 | /**
2 | * @type {import('prettier').Config}
3 | */
4 | module.exports = {
5 | printWidth: 120,
6 | singleQuote: true,
7 | overrides: [
8 | {
9 | files: ['*.yml', '*.yaml'],
10 | options: {
11 | singleQuote: false,
12 | },
13 | },
14 | {
15 | files: ['*.css', '*.scss'],
16 | options: {
17 | singleQuote: false,
18 | },
19 | },
20 | ],
21 | };
22 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/file-input.md:
--------------------------------------------------------------------------------
1 | # Rijkshuisstijl Community File Input component
2 |
3 | Met de `fileInput` component kunnen gebruikers meerdere bestanden uploaden.
4 |
5 | De component accepteert `children` en kan dus op verschillende manier worden gestyled.
6 |
7 | Dit component heeft een callbackfunctie genaamd `onFilesChange`. Hiermee kan de parent component op de hoogte worden gesteld zodra er een nieuw bestand is toegevoegd.
8 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/link-list-link.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community link list link component
4 |
5 | Links met een pijl als voorloopteken worden gebruikt aan het einde van een tekst. Ze verwijzen naar gerelateerde informatie over het onderwerp wat er in de voorafgaande tekst is besproken.
6 |
7 | Links zonder pijl als voorloopteken kunnen ook worden gebruikt, deze zijn vaak terug te vinden in footers.
8 |
--------------------------------------------------------------------------------
/packages/components-css/src/radio-group/_mixin.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 |
6 | @mixin rhc-radio-group {
7 | display: flex;
8 | flex-direction: column;
9 | padding-block-end: var(--rhc-radio-group-padding-block-end, inherit);
10 | padding-block-start: var(--rhc-radio-group-padding-block-start, inherit);
11 | row-gap: var(--rhc-radio-group-row-gap, inherit);
12 | }
13 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/column-layout.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/column-layout.stories';
2 | import * as ReactStories from '../components-react/column-layout.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Column Layout',
8 | id: 'css-column-layout',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 |
--------------------------------------------------------------------------------
/packages/components-css/src/action-group/index.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2025 Community for NL Design System
4 | */
5 |
6 | .utrecht-button-group {
7 | column-gap: var(--rhc-space-100, 0.5rem);
8 | row-gap: var(--rhc-space-100, 0.5rem);
9 | @media (width <= 768px) {
10 | flex-direction: column;
11 | .utrecht-button,
12 | .utrecht-button-link {
13 | min-inline-size: 100%;
14 | }
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/checkbox-group.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/checkbox-group.stories';
2 | import * as ReactStories from '../components-react/checkbox-group.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Checkbox Group',
8 | id: 'css-checkbox-group',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/link-list-card.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/link-list-card.stories';
2 | import * as ReactStories from '../components-react/link-list-card.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Link List Card',
8 | id: 'css-link-list-card',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/message-list-item.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community Message List Item component
4 |
5 | ## Usage
6 |
7 | ```tsx
8 | import { MessageList, MessageListItem } from '@rijkshuisstijl-community/components-react';
9 |
10 |
11 |
12 | ;
13 | ```
14 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/sub-navbar.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/sub-navbar.stories';
2 | import * as ReactStories from '../components-react/sub-navbar.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Navigation Bar/Sub Navigation Bar',
8 | id: 'css-sub-navbar',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 |
--------------------------------------------------------------------------------
/packages/components-css/src/code-input-group/_mixin.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 |
6 | @mixin rhc-code-input-group {
7 | column-gap: var(--rhc-code-input-group-column-gap);
8 | display: flex;
9 | flex-direction: row;
10 | }
11 |
12 | @mixin rhc-code-input {
13 | block-size: var(--rhc-code-input-size);
14 | inline-size: var(--rhc-code-input-size);
15 | text-align: center;
16 | }
17 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/image.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/image.stories';
2 | import * as ReactStories from '../components-react/image.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Image',
8 | id: 'css-image',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const Decorative = ReactStories.Decorative;
13 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/logo.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/logo.stories';
2 | import * as ReactStories from '../components-react/logo.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Logo',
8 | id: 'css-logo',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const WithSubtitle = ReactStories.WithSubtitle;
13 |
--------------------------------------------------------------------------------
/packages/storybook/src/documentation/design-tokens/rhc.mdx:
--------------------------------------------------------------------------------
1 | import changelog from '@rijkshuisstijl-community/design-tokens/CHANGELOG.md?raw';
2 | import readme from '@rijkshuisstijl-community/design-tokens/README.md?raw';
3 | import { Markdown, Meta, Title } from '@storybook/addon-docs/blocks';
4 |
5 |
6 |
7 | {readme}
8 |
9 | Changelog
10 |
11 | {changelog}
12 |
--------------------------------------------------------------------------------
/packages/components-twig/src/Heading.twig:
--------------------------------------------------------------------------------
1 | {%- if level is empty -%}
2 | {%- set level = 1 -%}
3 | {%- endif -%}
4 | {%- set classes = ['nl-heading', 'rhc-heading'] -%}
5 | {%- if appearance is not empty -%}
6 | {%- set classes = classes|merge(['nl-heading--level-' ~ appearance]) -%}
7 | {%- else -%}
8 | {%- set classes = classes|merge(['nl-heading--level-' ~ level]) -%}
9 | {%- endif -%}
10 | {{ children }}
11 |
--------------------------------------------------------------------------------
/packages/storybook-tooling/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "compilerOptions": {
4 | "outDir": "./dist",
5 | "rootDir": "./src",
6 | "declaration": true,
7 | "declarationMap": true,
8 | "moduleResolution": "bundler",
9 | "module": "ESNext",
10 | "target": "ES2022",
11 | "types": ["node"]
12 | },
13 | "include": ["src/**/*"],
14 | "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts"]
15 | }
16 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/form-field-radio.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/form-field-radio.stories';
2 | import * as ReactStories from '../components-react/form-field-radio.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Form field/Form Field Radio',
8 | id: 'css-form-field-radio',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/paragraph.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/paragraph.stories';
2 | import * as ReactStories from '../components-react/paragraph.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Paragraph',
8 | id: 'css-paragraph',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const Lead = ReactStories.Lead;
13 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/table-header-cell.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/table-header-cell.stories';
2 | import * as ReactStories from '../components-react/table-header-cell.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Table/Table Header Cell',
8 | id: 'css-table-header-cell',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 |
--------------------------------------------------------------------------------
/packages/components-angular/src/action-group/action-group.component.html:
--------------------------------------------------------------------------------
1 |
5 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/packages/components-angular/src/action-group/action-group.component.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2025 Community for NL Design System
4 | */
5 |
6 | import { Component, Input } from '@angular/core';
7 |
8 | @Component({
9 | selector: 'rhc-action-group',
10 | imports: [],
11 | templateUrl: './action-group.component.html',
12 | })
13 | export class ActionGroupComponent {
14 | @Input() direction: 'column' | 'row' | 'column-stretch' = 'row';
15 | }
16 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/orderedListItem.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/orderedListItem.stories';
2 | import * as ReactStories from '../components-react/orderedListItem.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Ordered List/Ordered List Item',
8 | id: 'css-ordered-list-item',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 |
--------------------------------------------------------------------------------
/lerna.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "node_modules/@lerna-lite/cli/schemas/lerna-schema.json",
3 | "npmClient": "pnpm",
4 | "version": "independent",
5 | "useWorkspaces": true,
6 | "command": {
7 | "publish": {},
8 | "version": {
9 | "allowBranch": ["main"],
10 | "conventionalCommits": true,
11 | "exact": true,
12 | "message": "docs(release): design system packages\n\nskip-checks: true",
13 | "syncWorkspaceLock": true
14 | }
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/packages/components-angular/src/data-summary-item/data-summary-item.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {{ key }}
4 |
5 |
6 | {{ value }}
7 |
8 | @if (href && actionLabel) {
9 |
10 |
11 | {{ actionLabel }}
12 |
13 |
14 | }
15 |
16 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/separator.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/separator.stories';
2 | import * as ReactStories from '../components-react/separator.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Separator',
8 | id: 'css-separator',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const Invisible = ReactStories.Invisible;
13 |
--------------------------------------------------------------------------------
/packages/storybook/src/templates/form.stories.tsx:
--------------------------------------------------------------------------------
1 | import type { Meta, StoryObj } from '@storybook/react-vite';
2 | import Page from './form';
3 | import './globals.css';
4 |
5 | const meta: Meta = {
6 | title: 'Form',
7 | id: 'rhc-templates-form',
8 | component: Page,
9 | parameters: {
10 | layout: 'fullscreen',
11 | isPage: true,
12 | },
13 | };
14 | export default meta;
15 |
16 | type Story = StoryObj;
17 |
18 | export const Default: Story = {};
19 |
--------------------------------------------------------------------------------
/packages/storybook/src/templates/shared/main-page-content.tsx:
--------------------------------------------------------------------------------
1 | import { PageContent } from '@rijkshuisstijl-community/components-react';
2 | import { PropsWithChildren } from 'react';
3 |
4 | export default function SharedMainPageContent({ children }: PropsWithChildren<{}>) {
5 | return (
6 |
7 | {children}
8 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/orderedList.md:
--------------------------------------------------------------------------------
1 | # Rijkshuisstijl Community ordered list component
2 |
3 | Opsomming waar de volgorde van items in de lijst van belang is.
4 |
5 | ## Terminologie
6 |
7 | - **ordered list**: uitgeschreven versie van de HTML afkorting ``
8 | - **list item**: uitgeschreven van van [HTML ``](https://html.spec.whatwg.org/multipage/grouping-content.html#the-li-element). Ook [in ARIA is het `role="listitem"`](https://www.w3.org/TR/wai-aria-1.2/#listitem)
9 |
--------------------------------------------------------------------------------
/packages/components-angular/src/logo/logo.component.ts:
--------------------------------------------------------------------------------
1 | import { CommonModule } from '@angular/common';
2 | import { Component, Input } from '@angular/core';
3 |
4 | @Component({
5 | selector: 'figure[rhc-logo]',
6 | imports: [CommonModule],
7 | templateUrl: './logo.component.html',
8 | host: { '[class.rhc-logo]': 'true' },
9 | })
10 | export class LogoComponent {
11 | @Input({ required: true }) organisation!: string;
12 | @Input({ required: false }) subtitle?: string | null;
13 | }
14 |
--------------------------------------------------------------------------------
/packages/components-angular/src/unordered-list/unordered-list.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, Input } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'ul[rhc-unordered-list]',
5 | imports: [],
6 | templateUrl: './unordered-list.component.html',
7 | host: {
8 | '[class.utrecht-unordered-list]': 'true',
9 | '[class.utrecht-unordered-list--nested]': 'nested',
10 | },
11 | })
12 | export class UnorderedListComponent {
13 | @Input() nested?: boolean = false;
14 | }
15 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/blockquote.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/blockquote.stories';
2 | import * as ReactStories from '../components-react/blockquote.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Blockquote',
8 | id: 'css-blockquote',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const Attribution = ReactStories.Attribution;
13 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/link-list.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/link-list.stories';
2 | import * as ReactStories from '../components-react/link-list.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Link List',
8 | id: 'css-link-list',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const ColumnsLayout = ReactStories.ColumnsLayout;
13 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/page-number-navigation.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/page-number-navigation.stories';
2 | import * as ReactStories from '../components-react/page-number-navigation.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Page Number Navigation',
8 | id: 'css-page-number-navigation',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/drawer.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community Drawer component
4 |
5 | ## Usage
6 |
7 | Dit component is te gebruiken door de `Drawer` te importeren. Default is het `open=false` en is het aligned op `inline-start`.
8 |
9 | ```tsx
10 | import { Drawer } from '@rijkshuisstijl-community/components-react';
11 |
12 | ;
13 | ```
14 |
--------------------------------------------------------------------------------
/packages/storybook/src/templates/collage.stories.tsx:
--------------------------------------------------------------------------------
1 | import type { Meta, StoryObj } from '@storybook/react-vite';
2 | import Page from './collage';
3 | import './globals.css';
4 |
5 | const meta: Meta = {
6 | title: 'Collage',
7 | id: 'rhc-templates-collage',
8 | component: Page,
9 | parameters: {
10 | layout: 'fullscreen',
11 | isPage: true,
12 | },
13 | };
14 | export default meta;
15 |
16 | type Story = StoryObj;
17 |
18 | export const Default: Story = {};
19 |
--------------------------------------------------------------------------------
/packages/storybook/src/templates/details.stories.tsx:
--------------------------------------------------------------------------------
1 | import type { Meta, StoryObj } from '@storybook/react-vite';
2 | import Page from './details';
3 | import './globals.css';
4 |
5 | const meta: Meta = {
6 | title: 'Details',
7 | id: 'rhc-templates-details',
8 | component: Page,
9 | parameters: {
10 | layout: 'fullscreen',
11 | isPage: true,
12 | },
13 | };
14 | export default meta;
15 |
16 | type Story = StoryObj;
17 |
18 | export const Default: Story = {};
19 |
--------------------------------------------------------------------------------
/packages/components-react/src/Figure.tsx:
--------------------------------------------------------------------------------
1 | export { FigureCaption, type FigureCaptionProps } from '@utrecht/component-library-react';
2 | import { Figure as UtrechtFigure, FigureProps as UtrechtFigureProps } from '@utrecht/component-library-react';
3 | import { PropsWithChildren } from 'react';
4 | export type FigureProps = UtrechtFigureProps;
5 |
6 | export const Figure = ({ children, ...props }: PropsWithChildren) => {
7 | return {children} ;
8 | };
9 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/number-badge.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/number-badge.stories';
2 | import * as ReactStories from '../components-react/number-badge.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Number Badge',
8 | id: 'css-number-badge',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const WithValue = ReactStories.WithValue;
13 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/dot-badge.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community Dot Badge component
4 |
5 | ## Usage
6 |
7 | Dit component is te gebruiken door de `DotBadge` te importeren. De component heeft één (verplichte) property genaamd `label`. De tekst die hierin wordt gezet is alleen zichtbaar voor screen readers.
8 |
9 | ```tsx
10 | import { DotBadge } from '@rijkshuisstijl-community/components-react';
11 |
12 | ;
13 | ```
14 |
--------------------------------------------------------------------------------
/packages/storybook/src/templates/rich-text.stories.tsx:
--------------------------------------------------------------------------------
1 | import type { Meta, StoryObj } from '@storybook/react-vite';
2 | import Page from './rich-text';
3 | import './globals.css';
4 |
5 | const meta: Meta = {
6 | title: 'Rich Text',
7 | id: 'rhc-templates-rich-text',
8 | component: Page,
9 | parameters: {
10 | layout: 'fullscreen',
11 | isPage: true,
12 | },
13 | };
14 | export default meta;
15 |
16 | type Story = StoryObj;
17 |
18 | export const Default: Story = {};
19 |
--------------------------------------------------------------------------------
/packages/storybook/src/types/drupal-attribute.d.ts:
--------------------------------------------------------------------------------
1 | /* eslint-disable no-unused-vars */
2 | declare module 'drupal-attribute' {
3 | export default class DrupalAttribute {
4 | constructor(data?: Record);
5 | addClass(...classes: string[]): this;
6 | removeClass(...classes: string[]): this;
7 | setAttribute(name: string, value: any): this;
8 | removeAttribute(name: string): this;
9 | hasClass(className: string): boolean;
10 | toString(): string;
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/message-list.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/message-list.stories';
2 | import * as ReactStories from '../components-react/message-list.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Message List',
8 | id: 'css-message-list',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const SmallContainer = ReactStories.SmallContainer;
13 |
--------------------------------------------------------------------------------
/packages/storybook/src/templates/componenten.stories.tsx:
--------------------------------------------------------------------------------
1 | import type { Meta, StoryObj } from '@storybook/react-vite';
2 | import Page from './componenten';
3 | import './globals.css';
4 |
5 | const meta: Meta = {
6 | title: 'Componenten',
7 | id: 'rhc-templates-componenten',
8 | component: Page,
9 | parameters: {
10 | layout: 'fullscreen',
11 | isPage: true,
12 | },
13 | };
14 | export default meta;
15 |
16 | type Story = StoryObj;
17 |
18 | export const Default: Story = {};
19 |
--------------------------------------------------------------------------------
/packages/components-css/src/breadcrumb-nav/index.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 |
6 | .utrecht-breadcrumb-nav {
7 | &__link {
8 | &--current {
9 | --utrecht-link-text-decoration: none;
10 |
11 | color: var(--rhc-breadcrumb-nav-link-current-color);
12 | }
13 |
14 | &--active {
15 | --utrecht-link-text-decoration: var(--utrecht-breadcrumb-nav-link-active-text-decoration, underline);
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/packages/components-css/src/link/index.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 |
6 | @use "mixin";
7 | @use "../../node_modules/@nl-design-system-candidate/link-css/dist/link.css";
8 |
9 | .nl-link:any-link {
10 | @include mixin.rhc-link--any-link;
11 | }
12 |
13 | .nl-link .utrecht-icon,
14 | .rhc-link__icon {
15 | @include mixin.rhc-link__icon;
16 | }
17 |
18 | .nl-link:any-link.rhc-link--inline {
19 | @include mixin.rhc-link--inline;
20 | }
21 |
--------------------------------------------------------------------------------
/packages/components-css/src/rounded-corner/_mixin.scss:
--------------------------------------------------------------------------------
1 | @use "sass:map";
2 |
3 | $rhc-rounded-corner-positions: ("start-start", "start-end", "end-start", "end-end") !default;
4 | $rhc-rounded-corner-sizes: ("sm", "md", "lg") !default;
5 |
6 | @mixin rhc-rounded-corner {
7 | overflow: var(--rhc-rounded-corner-overflow);
8 | }
9 |
10 | @mixin rhc-reset-border-radius {
11 | border-end-end-radius: 0;
12 | border-end-start-radius: 0;
13 | border-start-end-radius: 0;
14 | border-start-start-radius: 0;
15 | }
16 |
--------------------------------------------------------------------------------
/packages/storybook-tooling/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community - Storybook tooling
4 |
5 | In deze package is verschillende tooling beschikbaar die gebruikt wordt binnen de Storybook omgeving van de Rijkshuisstijl Community.
6 |
7 | De package is bedoeld voor intern gebruik, maar beschikbaar gesteld aan de community.
8 |
9 | Deze package is onderdeel van het [Rijkshuisstijl Community](https://github.com/nl-design-system/rijkshuisstijl-community/blob/main/README.md) project.
10 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/data-summary-item.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/data-summary-item.stories';
2 | import * as ReactStories from '../components-react/data-summary-item.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Data Summary Item',
8 | id: 'css-data-summary-item',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const Row = ReactStories.Row;
13 |
--------------------------------------------------------------------------------
/apps/rhc-templates/src/app/mijn-omgeving/page.tsx:
--------------------------------------------------------------------------------
1 | import PageContent from '@rijkshuisstijl-community/storybook/src/templates/mijn-omgeving';
2 | import '@rijkshuisstijl-community/storybook/src/templates/globals.css';
3 | import type { Metadata } from 'next';
4 |
5 | export const metadata: Metadata = {
6 | title: 'Mijn Omgeving',
7 | description: 'Mijn Omgeving template voor de Rijkshuisstijl Community',
8 | };
9 |
10 | const Page = () => {
11 | return ;
12 | };
13 |
14 | export default Page;
15 |
--------------------------------------------------------------------------------
/packages/components-angular/src/link-list-link/link-list-link.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, Input } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'a[rhc-link-list-link]',
5 | imports: [],
6 | templateUrl: './link-list-link.component.html',
7 | host: {
8 | '[class.utrecht-link-list__link]': 'true',
9 | '[class.utrecht-link]': 'true',
10 | '[utrecht-link--html-a]': 'true',
11 | },
12 | })
13 | export class LinkListLinkComponent {
14 | @Input({ required: true }) href!: string;
15 | }
16 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/accordion-usage.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Usage
4 |
5 | ```tsx
6 | import { AccordionProvider } from '@rijkshuisstijl-community/components/react';
7 |
8 | ;
24 | ```
25 |
--------------------------------------------------------------------------------
/packages/components-react/src/SideNav.tsx:
--------------------------------------------------------------------------------
1 | import clsx from 'clsx';
2 | import { HTMLAttributes, Ref } from 'react';
3 |
4 | export interface SideNavProps extends HTMLAttributes {
5 | ref?: Ref;
6 | }
7 |
8 | export const SideNav = ({ ref, className, children, ...restProps }: SideNavProps) => {
9 | return (
10 |
13 | );
14 | };
15 |
16 | SideNav.displayName = 'SideNav';
17 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/navigation-list.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/navigation-list.stories';
2 | import * as ReactStories from '../components-react/navigation-list.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Navigation List',
8 | id: 'css-navigation-list',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const SmallContainer = ReactStories.SmallContainer;
13 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/unorderedListItem.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/unorderedListItem.stories';
2 | import * as ReactStories from '../components-react/unorderedListItem.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Unordered List/Unordered List Item',
8 | id: 'css-unordered-list-item',
9 | };
10 |
11 | export const DefaultUnorderedListItem = ReactStories.DefaultUnorderedListItem;
12 |
--------------------------------------------------------------------------------
/packages/components-css/src/link-list-card/index.scss:
--------------------------------------------------------------------------------
1 | .rhc-link-list-card {
2 | background-color: var(--rhc-link-list-card-background-color);
3 | display: flex;
4 | flex-direction: column;
5 | gap: var(--rhc-link-list-card-row-gap);
6 | padding-block-end: var(--rhc-link-list-card-padding-block-end);
7 | padding-block-start: var(--rhc-link-list-card-padding-block-start);
8 | padding-inline-end: var(--rhc-link-list-card-padding-inline-end);
9 | padding-inline-start: var(--rhc-link-list-card-padding-inline-start);
10 | }
11 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/orderedList.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/orderedList.stories';
2 | import * as ReactStories from '../components-react/orderedList.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Ordered List',
8 | id: 'css-ordered-list',
9 | };
10 |
11 | export const DefaultOrderedList = ReactStories.DefaultOrderedList;
12 | export const NestedOrderedList = ReactStories.NestedOrderedList;
13 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | # Ignore 3rd party files
2 | node_modules/
3 | vendor/
4 |
5 | # Ignore generated files
6 | .angular/
7 | build/
8 | coverage/
9 | dist/
10 | tmp/
11 | CHANGELOG.md
12 |
13 | # The indentation of dependency JSON files should only be updated by `yarn` and
14 | # `npm` commands, so dependency automation scripts (such as Dependabot and
15 | # Snyk) automatically use the correct indentation.
16 | package-lock.json
17 | yarn.lock
18 | pnpm-lock.yaml
19 |
20 | # Ignore files that are edited from Figma
21 | figma.tokens.json
22 |
--------------------------------------------------------------------------------
/packages/components-react/src/Article.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom/vitest';
2 | import { cleanup, render, screen } from '@testing-library/react';
3 | import { afterEach, describe, expect, it } from 'vitest';
4 | import { Article } from './Article';
5 |
6 | describe('Article testcases', () => {
7 | it('should render successfully', () => {
8 | render( );
9 | const article = screen.getByRole('article');
10 | expect(article).toBeInTheDocument();
11 | });
12 | });
13 |
14 | afterEach(() => cleanup());
15 |
--------------------------------------------------------------------------------
/packages/storybook-tooling/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # @rijkshuisstijl-community/storybook-tooling
2 |
3 | ## 1.1.1
4 |
5 | ### Patch Changes
6 |
7 | - 961ebbc: Fixed publishing to be public.
8 |
9 | ## 1.1.0
10 |
11 | ### Minor Changes
12 |
13 | - 3255616: Package renamed to '@rijkshuistijl-community/storybook-tooling'
14 | - 3255616: Publicly publish package
15 |
16 | ### Patch Changes
17 |
18 | - 3255616: Added tests for mergeMarkdown
19 |
20 | ## 1.0.1
21 |
22 | ### Patch Changes
23 |
24 | - 10ec55a: Release package with npm provenance.
25 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/icon.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/icon.stories';
2 | import * as ReactStories from '../components-react/icon.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Icon',
8 | id: 'css-icon',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const CustomIcon = ReactStories.CustomIcon;
13 | export const FromDifferentIconSet = ReactStories.FromDifferentIconSet;
14 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/navbar.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/navbar.stories';
2 | import * as ReactStories from '../components-react/navbar.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Navigation Bar',
8 | id: 'css-navbar',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const WithHeading = ReactStories.WithHeading;
13 | export const WithEndItems = ReactStories.WithEndItems;
14 |
--------------------------------------------------------------------------------
/apps/rhc-templates/src/app/componenten/page.tsx:
--------------------------------------------------------------------------------
1 | import PageContent from '@rijkshuisstijl-community/storybook/src/templates/componenten';
2 | import type { Metadata } from 'next';
3 |
4 | export const metadata: Metadata = {
5 | title: 'Componenten overzicht',
6 | description:
7 | 'Filter op zoekterm en framework om componenten uit de Rijkshuisstijl Community te vinden. Bekijk direct de component in Storybook door de link in het zoekresultaat te volgen.',
8 | };
9 |
10 | export default function Page() {
11 | return ;
12 | }
13 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/action-group.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/action-group.stories';
2 | import * as ReactStories from '../components-react/action-group.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Action Group',
8 | id: 'css-action-group',
9 | };
10 |
11 | export const Column = ReactStories.Column;
12 | export const ColumnStretch = ReactStories.ColumnStretch;
13 | export const Row = ReactStories.Row;
14 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/skip-link.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/skip-link.stories';
2 | import * as ReactStories from '../components-react/skip-link.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Skip link',
8 | id: 'css-skip-link',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const RightToLeft = ReactStories.RightToLeft;
13 | export const FocusVisible = ReactStories.FocusVisible;
14 |
--------------------------------------------------------------------------------
/packages/components-css/src/dot-badge/_mixin.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 |
6 | @mixin rhc-dot-badge {
7 | block-size: var(--rhc-dot-badge-size, var(--rhc-size-quarter-lint));
8 | border-radius: var(--rhc-dot-badge-border-radius, var(--rhc-border-radius-circle));
9 | color: var(--rhc-dot-badge-color, var(--rhc-color-rood-500));
10 | display: inline-flex;
11 | inline-size: var(--rhc-dot-badge-inline-size, var(--rhc-dot-badge-size, var(--rhc-size-quarter-lint)));
12 | }
13 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/card-as-link.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/card-as-link.stories';
2 | import * as ReactStories from '../components-react/card-as-link.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Card as Link',
8 | id: 'css-card-as-link',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const FullBleed = ReactStories.FullBleed;
13 | export const Horizontal = ReactStories.Horizontal;
14 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/expandable-checkbox-group.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/expandable-checkbox-group.stories';
2 | import * as ReactStories from '../components-react/expandable-checkbox-group.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Expandable Checkbox Group',
8 | id: 'css-expandable-checkbox-group',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const Open = ReactStories.Open;
13 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/unorderedList.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/unorderedList.stories';
2 | import * as ReactStories from '../components-react/unorderedList.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Unordered List',
8 | id: 'css-unordered-list',
9 | };
10 |
11 | export const DefaultUnorderedList = ReactStories.DefaultUnorderedList;
12 | export const NestedUnorderedList = ReactStories.NestedUnorderedList;
13 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/form-field.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/form-field.stories';
2 | import * as ReactStories from '../components-react/form-field.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Form Field/Form Field',
8 | id: 'css-form-field',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const WithRadioGroup = ReactStories.WithRadioGroup;
13 | export const Invalid = ReactStories.Invalid;
14 |
--------------------------------------------------------------------------------
/packages/components-angular/src/form-field-description/form-field-description.component.ts:
--------------------------------------------------------------------------------
1 | import { NgClass } from '@angular/common';
2 | import { Component, Input } from '@angular/core';
3 |
4 | @Component({
5 | selector: 'rhc-form-field-description',
6 | imports: [NgClass],
7 | templateUrl: './form-field-description.component.html',
8 | })
9 | export class FormFieldDescriptionComponent {
10 | @Input() invalid?: boolean = false;
11 | @Input() valid?: boolean = false;
12 | @Input() warning?: boolean = false;
13 | @Input() class?: string;
14 | }
15 |
--------------------------------------------------------------------------------
/packages/components-react/src/FormSummary.tsx:
--------------------------------------------------------------------------------
1 | export {
2 | DataList as FormSummary,
3 | type DataListProps as FormSummaryProps,
4 | DataListItem as FormSummaryItem,
5 | type DataListItemProps as FormSummaryItemProps,
6 | DataListKey as FormSummaryKey,
7 | type DataListKeyProps as FormSummaryKeyProps,
8 | DataListValue as FormSummaryValue,
9 | type DataListValueProps as FormSummaryValueProps,
10 | DataListActions as FormSummaryActions,
11 | type DataListActionsProps as FormSummaryActionsProps,
12 | } from '@utrecht/component-library-react';
13 |
--------------------------------------------------------------------------------
/packages/components-react/src/Toggletip.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom/vitest';
2 | import { cleanup, render } from '@testing-library/react';
3 | import { afterEach, describe, expect, it } from 'vitest';
4 | import { Toggletip } from '.';
5 |
6 | describe('Toggletip', () => {
7 | it('renders a visible element', () => {
8 | const { container } = render( );
9 |
10 | const toggletip = container.querySelector(':only-child');
11 | expect(toggletip).toBeInTheDocument();
12 | });
13 | });
14 |
15 | afterEach(() => cleanup());
16 |
--------------------------------------------------------------------------------
/packages/storybook-angular/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "compilerOptions": {
4 | "baseUrl": ".",
5 | "types": ["node"],
6 | "allowSyntheticDefaultImports": true,
7 | "esModuleInterop": true,
8 | "moduleResolution": "bundler",
9 | "resolveJsonModule": true,
10 | "target": "ES2022",
11 | "useDefineForClassFields": false
12 | },
13 | "exclude": ["**/node_modules/*", "src/test.ts", "src/**/*.spec.ts"],
14 | "include": [".storybook/typings.d.ts", "config/**/*", "config/**/*.ts", "src/**/*"]
15 | }
16 |
--------------------------------------------------------------------------------
/packages/storybook/src/templates/mijn-omgeving.stories.tsx:
--------------------------------------------------------------------------------
1 | import { Meta, StoryObj } from '@storybook/react-vite';
2 | import './globals.css';
3 | import MijnOmgeving from './mijn-omgeving';
4 |
5 | const meta = {
6 | title: 'Mijn Omgeving',
7 | id: 'rhc-templates-mijn-omgeving',
8 | component: MijnOmgeving,
9 | parameters: {
10 | layout: 'fullscreen',
11 | isPage: true,
12 | },
13 | } satisfies Meta;
14 |
15 | export default meta;
16 |
17 | type Story = StoryObj;
18 |
19 | export const Default: Story = {};
20 |
--------------------------------------------------------------------------------
/packages/components-react/src/SideNavItem.tsx:
--------------------------------------------------------------------------------
1 | import clsx from 'clsx';
2 | import { HTMLAttributes, Ref } from 'react';
3 |
4 | export interface SideNavItemProps extends HTMLAttributes {
5 | ref?: Ref;
6 | }
7 |
8 | export const SideNavItem = ({ ref, className, children, ...restProps }: SideNavItemProps) => {
9 | return (
10 |
11 | {children}
12 |
13 | );
14 | };
15 |
16 | SideNavItem.displayName = 'SideNavItem';
17 |
--------------------------------------------------------------------------------
/packages/components-react/src/SideNavList.tsx:
--------------------------------------------------------------------------------
1 | import clsx from 'clsx';
2 | import { HTMLAttributes, Ref } from 'react';
3 |
4 | export interface SideNavListProps extends HTMLAttributes {
5 | ref?: Ref;
6 | }
7 |
8 | export const SideNavList = ({ ref, className, children, ...restProps }: SideNavListProps) => {
9 | return (
10 |
13 | );
14 | };
15 |
16 | SideNavList.displayName = 'SideNavList';
17 |
--------------------------------------------------------------------------------
/packages/components-angular/src/link/link.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, Input } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'rhc-link',
5 | imports: [],
6 | templateUrl: './link.component.html',
7 | styleUrl: './link.component.css',
8 | })
9 | export class LinkComponent {
10 | @Input({ required: true }) href!: string;
11 | @Input() inline?: boolean;
12 | @Input() target?: '_self' | '_blank' | '_parent' | '_top' | '_unfencedTop' = '_self';
13 |
14 | computedClasses = () => `nl-link rhc-link ${this.inline ? 'rhc-link--inline' : ''}`;
15 | }
16 |
--------------------------------------------------------------------------------
/packages/storybook-angular/.storybook/tsconfig.doc.json:
--------------------------------------------------------------------------------
1 | // This tsconfig is used by Compodoc to generate the documentation for the project.
2 | // If Compodoc is not used, this file can be deleted.
3 | {
4 | "extends": "./tsconfig.json",
5 | // Exclude all files that are not needed for documentation generation.
6 | "exclude": ["../src/test.ts", "../src/**/*.spec.ts", "../src/**/*.stories.ts"],
7 | // Please make sure to include all files from which Compodoc should generate documentation.
8 | "include": ["../src/**/*"],
9 | "files": ["./typings.d.ts"]
10 | }
11 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/alert.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/alert.stories';
2 | import * as ReactStories from '../components-react/alert.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Alert',
8 | id: 'css-alert',
9 | };
10 |
11 | export const Informative = ReactStories.Informative;
12 | export const Negative = ReactStories.Negative;
13 | export const Positive = ReactStories.Positive;
14 | export const Warning = ReactStories.Warning;
15 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/message-list-item.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/message-list-item.stories';
2 | import * as ReactStories from '../components-react/message-list-item.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Message List/Message List Item',
8 | id: 'css-message-list-item',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const Hover = ReactStories.Hover;
13 | export const Focus = ReactStories.Focus;
14 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/file-input.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/file-input.stories';
2 | import * as ReactStories from '../components-react/file-input.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'File Input',
8 | id: 'css-file-input',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const MetCustomElementenLijst = ReactStories.MetCustomElementenLijst;
13 | export const DefaultFiles = ReactStories.DefaultFiles;
14 |
--------------------------------------------------------------------------------
/apps/rhc-templates/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 | .yarn/install-state.gz
8 |
9 | # testing
10 | /coverage
11 |
12 | # next.js
13 | /.next/
14 | /out/
15 |
16 | # production
17 | /build
18 |
19 | # misc
20 | .DS_Store
21 | *.pem
22 |
23 | # debug
24 | npm-debug.log*
25 | yarn-debug.log*
26 | yarn-error.log*
27 |
28 | # local env files
29 | .env*.local
30 |
31 | # vercel
32 | .vercel
33 |
34 | # typescript
35 | *.tsbuildinfo
36 | next-env.d.ts
37 |
--------------------------------------------------------------------------------
/packages/components-react/src/Radio.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom/vitest';
2 | import { cleanup, render } from '@testing-library/react';
3 | import { afterEach, describe, expect, it } from 'vitest';
4 | import { Radio } from '.';
5 |
6 | describe('Radio', () => {
7 | it('renders a visible element', () => {
8 | const { container } = render( );
9 |
10 | const radio = container.querySelector(':only-child');
11 |
12 | expect(radio).toBeInTheDocument();
13 | expect(radio).toBeVisible();
14 | });
15 | });
16 |
17 | afterEach(() => cleanup());
18 |
--------------------------------------------------------------------------------
/packages/components-react/src/Table.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom/vitest';
2 | import { cleanup, render } from '@testing-library/react';
3 | import { afterEach, describe, expect, it } from 'vitest';
4 | import { Table } from '.';
5 |
6 | describe('Table', () => {
7 | it('renders a visible element', () => {
8 | const { container } = render();
9 |
10 | const table = container.querySelector(':only-child');
11 |
12 | expect(table).toBeInTheDocument();
13 | expect(table).toBeVisible();
14 | });
15 | });
16 |
17 | afterEach(() => cleanup());
18 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/form-field-textarea.md:
--------------------------------------------------------------------------------
1 | # Rijkshuisstijl Community FormFieldTextarea component
2 |
3 | ## Form field met [Textarea](/docs/rijkshuisstijl-textarea--docs)
4 |
5 | ## Usage
6 |
7 | ```jsx
8 | import { FormFieldTextarea } from '@rijkshuisstijl/community-components';
9 |
10 | ;
23 | ```
24 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/form-field-text-input.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community Form field with text input
4 |
5 | ## Form field met [Textbox](/docs/rijkshuisstijl-textbox--docs)
6 |
7 | ## Usage
8 |
9 | ```jsx
10 | import { FormFieldTextInput } from '@rijkshuisstijl/community-components';
11 |
12 | ;
23 | ```
24 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/page-number-navigation.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community Page Number Navigation component
4 |
5 | Page Number Navigation is a navigation element used to navigate between multiple pages of overview lists. This is commonly used for search results or a list of news articles. In cases where overview lists are too long to display on a single page, pagination can provide a clearer and more functional way to divide the content across multiple pages. Pagination indicates the current page and allows users to navigate to other pages.
6 |
--------------------------------------------------------------------------------
/packages/components-angular/src/navbar/navbar.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 | @if (showEndItems) {
8 |
11 | }
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/packages/components-twig/src/Image.twig:
--------------------------------------------------------------------------------
1 | {%- if src is defined -%}{%- set attributes = attributes.setAttribute('src', src) -%}{%- endif -%}
2 | {%- if alt is defined -%}{%- set attributes = attributes.setAttribute('alt', alt) -%}{%- else -%}{%- set attributes = attributes.setAttribute('alt', '') -%}{%- endif -%}
3 | {%- if width is defined -%}{%- set attributes = attributes.setAttribute('width', width) -%}{%- endif -%}
4 | {%- if height is defined -%}{%- set attributes = attributes.setAttribute('height', height) -%}{%- endif -%}
5 |
6 |
--------------------------------------------------------------------------------
/packages/components-css/src/link-list/index.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 |
6 | .utrecht-link-list__link {
7 | align-items: flex-start;
8 |
9 | .utrecht-icon {
10 | flex-shrink: 0;
11 | }
12 | }
13 |
14 | .utrecht-link-list__item {
15 | display: inline-flex;
16 | font-family: var(--rhc-text-font-family-default, inherit);
17 | font-size: var(--rhc-text-font-size-max-md, inherit);
18 | }
19 |
20 | .utrecht-link-list__item .utrecht-link:any-link {
21 | line-height: var(--rhc-text-line-height-md, inherit);
22 | }
23 |
--------------------------------------------------------------------------------
/packages/components-css/src/visually-hidden/_mixin.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 |
6 | @mixin rhc-visually-hidden {
7 | block-size: 1px !important;
8 | border: 0 !important;
9 | clip: rect(0, 0, 0, 0) !important;
10 | inline-size: 1px !important;
11 | margin-block: -1px !important;
12 | margin-inline: -1px !important;
13 | opacity: 0%;
14 | overflow: hidden !important;
15 | padding-block: 0 !important;
16 | padding-inline: 0 !important;
17 | position: absolute;
18 | white-space: nowrap !important;
19 | }
20 |
--------------------------------------------------------------------------------
/packages/components-react/src/Textarea.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom/vitest';
2 | import { cleanup, render } from '@testing-library/react';
3 | import { afterEach, describe, expect, it } from 'vitest';
4 | import { Textarea } from '.';
5 |
6 | describe('Textarea', () => {
7 | it('renders a visible element', () => {
8 | const { container } = render();
9 |
10 | const textarea = container.querySelector(':only-child');
11 |
12 | expect(textarea).toBeInTheDocument();
13 | expect(textarea).toBeVisible();
14 | });
15 | });
16 |
17 | afterEach(() => cleanup());
18 |
--------------------------------------------------------------------------------
/packages/components-react/src/SkipLink.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | SkipLink as NLSkipLink,
3 | type SkipLinkProps as NLSkipLinkProps,
4 | } from '@nl-design-system-candidate/skip-link-react';
5 | import clsx from 'clsx';
6 | import { PropsWithChildren, Ref } from 'react';
7 |
8 | export interface SkipLinkProps extends NLSkipLinkProps {
9 | ref?: Ref;
10 | }
11 |
12 | export const SkipLink = ({ className, ...restProps }: PropsWithChildren) => (
13 |
14 | );
15 |
16 | SkipLink.displayName = 'SkipLink';
17 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/data-summary.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/data-summary.stories';
2 | import * as ReactStories from '../components-react/data-summary.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Data Summary',
8 | id: 'css-data-summary',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const Rows = ReactStories.Rows;
13 | export const NoActions = ReactStories.NoActions;
14 | export const NoActionsColumn = ReactStories.NoActionsColumn;
15 |
--------------------------------------------------------------------------------
/packages/storybook/src/templates/homepage.stories.tsx:
--------------------------------------------------------------------------------
1 | import { Meta, StoryObj } from '@storybook/react-vite';
2 | import './globals.css';
3 | import Homepage from './homepage';
4 |
5 | const meta = {
6 | title: 'Homepage',
7 | id: 'rhc-templates-homepage',
8 | component: Homepage,
9 | parameters: {
10 | layout: 'fullscreen',
11 | isPage: true,
12 | },
13 | } satisfies Meta;
14 |
15 | export default meta;
16 |
17 | type Story = StoryObj;
18 |
19 | export const Default: Story = {
20 | globals: {
21 | dir: 'ltr',
22 | lang: 'nl',
23 | },
24 | };
25 |
--------------------------------------------------------------------------------
/packages/storybook/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "jsx": "react-jsx",
4 | "allowSyntheticDefaultImports": true,
5 | "skipLibCheck": true,
6 | "baseUrl": "./",
7 | "paths": {
8 | "@rijkshuisstijl-community/components-react": ["../components-react/src/index.ts"],
9 | "@rijkshuisstijl-community/components-twig/*": ["../components-twig/*"]
10 | }
11 | },
12 | "extends": "../../tsconfig.json",
13 | "include": ["src/**/*.ts", "src/**/*.tsx", ".storybook/**/*.tsx", ".storybook/**/*.ts", "./types/twig.d.ts"],
14 | "exclude": ["**/node_modules/*"]
15 | }
16 |
--------------------------------------------------------------------------------
/packages/components-react/src/Paragraph.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom/vitest';
2 | import { cleanup, render } from '@testing-library/react';
3 | import { afterEach, describe, expect, it } from 'vitest';
4 | import { Paragraph } from '.';
5 |
6 | describe('Paragraph', () => {
7 | it('renders a visible element', () => {
8 | const { container } = render( );
9 |
10 | const paragraph = container.querySelector(':only-child');
11 |
12 | expect(paragraph).toBeInTheDocument();
13 | expect(paragraph).toBeVisible();
14 | });
15 | });
16 |
17 | afterEach(() => cleanup());
18 |
--------------------------------------------------------------------------------
/packages/components-react/src/SkipLink.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom/vitest';
2 | import { cleanup, render } from '@testing-library/react';
3 | import { afterEach, describe, expect, it } from 'vitest';
4 | import { SkipLink } from '.';
5 |
6 | describe('SkipLink', () => {
7 | it('renders a visible element', () => {
8 | const { container } = render( );
9 |
10 | const skipLink = container.querySelector(':only-child');
11 |
12 | expect(skipLink).toBeInTheDocument();
13 | expect(skipLink).toBeVisible();
14 | });
15 | });
16 |
17 | afterEach(() => cleanup());
18 |
--------------------------------------------------------------------------------
/packages/components-react/src/TextInput.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom/vitest';
2 | import { cleanup, render } from '@testing-library/react';
3 | import { afterEach, describe, expect, it } from 'vitest';
4 | import { TextInput } from '.';
5 |
6 | describe('TextInput', () => {
7 | it('renders a visible element', () => {
8 | const { container } = render( );
9 |
10 | const textInput = container.querySelector(':only-child');
11 |
12 | expect(textInput).toBeInTheDocument();
13 | expect(textInput).toBeVisible();
14 | });
15 | });
16 |
17 | afterEach(() => cleanup());
18 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/hero.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/hero.stories';
2 | import * as ReactStories from '../components-react/hero.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Hero',
8 | id: 'css-hero',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const CustomChildren = ReactStories.CustomChildren;
13 | export const TextAlignRight = ReactStories.TextAlignRight;
14 | export const AspectRatioFourToThree = ReactStories.AspectRatioFourToThree;
15 |
--------------------------------------------------------------------------------
/packages/storybook/src/icon-sets/default-icon-set-page/index.tsx:
--------------------------------------------------------------------------------
1 | import { Icon, defaultIconSet as iconSet } from '@rijkshuisstijl-community/components-react';
2 | import '../index.css';
3 |
4 | export default function IconSet() {
5 | const iconIDs = Object.keys(iconSet).sort((a, b) => a.localeCompare(b));
6 |
7 | return (
8 |
9 | {iconIDs.map((iconID) => (
10 |
11 |
12 | {iconID}
13 |
14 | ))}
15 |
16 | );
17 | }
18 |
--------------------------------------------------------------------------------
/proprietary/design-tokens/src/common/utrecht/focus.tokens.json:
--------------------------------------------------------------------------------
1 | {
2 | "utrecht": {
3 | "focus": {
4 | "background-color": {},
5 | "outline-color": { "value": "{rhc.color.zwart}" },
6 | "outline-offset": {
7 | "value": "3px",
8 | "comment": "This is only for buttons. Form fields (input, select and textarea) and links do not have an offset"
9 | },
10 | "outline-style": { "value": "dashed" },
11 | "outline-width": { "value": "2px" },
12 | "inverse": {
13 | "outline-color": { "value": "{rhc.color.wit}" }
14 | }
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/packages/components-react/src/PageHeader.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom/vitest';
2 | import { cleanup, render } from '@testing-library/react';
3 | import { afterEach, describe, expect, it } from 'vitest';
4 | import { PageHeader } from '.';
5 |
6 | describe('PageHeader', () => {
7 | it('renders a visible element', () => {
8 | const { container } = render( );
9 |
10 | const pageHeader = container.querySelector(':only-child');
11 |
12 | expect(pageHeader).toBeInTheDocument();
13 | expect(pageHeader).toBeVisible();
14 | });
15 | });
16 |
17 | afterEach(() => cleanup());
18 |
--------------------------------------------------------------------------------
/packages/storybook/src/icon-sets/flag-icon-set.md:
--------------------------------------------------------------------------------
1 | # Rijkshuisstijl Community Flag Icon Set
2 |
3 | Onderstaande iconen komen uit een losse icon set van de Rijkshuisstijl Commmunity. Voor gebruik moet deze set eerst geregistreerd worden. Zie ook de storybook pagina over de [Icon component](?path=/docs/rhc-icon--docs) en de [Standaard Icon set](?path=/docs/rhc-templates-default-icon-set--docs)
4 |
5 | ## Usage
6 |
7 | ```tsx
8 | import { Icon, flagIconSet as iconSet, registerIconSet } from '@rijkshuisstijl-community/components-react';
9 |
10 | registerIconSet(iconSet);
11 |
12 | ;
13 | ```
14 |
--------------------------------------------------------------------------------
/packages/components-react/src/FormSummary.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom/vitest';
2 | import { cleanup, render } from '@testing-library/react';
3 | import { afterEach, describe, expect, it } from 'vitest';
4 | import { FormSummary } from '.';
5 |
6 | describe('FormSummary', () => {
7 | it('renders a visible element', () => {
8 | const { container } = render( );
9 |
10 | const formSummary = container.querySelector(':only-child');
11 |
12 | expect(formSummary).toBeInTheDocument();
13 | expect(formSummary).toBeVisible();
14 | });
15 | });
16 |
17 | afterEach(() => cleanup());
18 |
--------------------------------------------------------------------------------
/packages/components-react/src/OrderedList.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom/vitest';
2 | import { cleanup, render } from '@testing-library/react';
3 | import { afterEach, describe, expect, it } from 'vitest';
4 | import { OrderedList } from '.';
5 |
6 | describe('OrderedList', () => {
7 | it('renders a visible element', () => {
8 | const { container } = render( );
9 |
10 | const orderedList = container.querySelector(':only-child');
11 |
12 | expect(orderedList).toBeInTheDocument();
13 | expect(orderedList).toBeVisible();
14 | });
15 | });
16 |
17 | afterEach(() => cleanup());
18 |
--------------------------------------------------------------------------------
/packages/components-react/src/PageContent.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom/vitest';
2 | import { cleanup, render } from '@testing-library/react';
3 | import { afterEach, describe, expect, it } from 'vitest';
4 | import { PageContent } from '.';
5 |
6 | describe('PageContent', () => {
7 | it('renders a visible element', () => {
8 | const { container } = render( );
9 |
10 | const pageContent = container.querySelector(':only-child');
11 |
12 | expect(pageContent).toBeInTheDocument();
13 | expect(pageContent).toBeVisible();
14 | });
15 | });
16 |
17 | afterEach(() => cleanup());
18 |
--------------------------------------------------------------------------------
/packages/components-css/src/data-badge-button/index.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 |
6 | @use "mixin";
7 |
8 | .rhc-data-badge-button {
9 | @include mixin.rhc-data-badge-button;
10 |
11 | &:hover {
12 | @include mixin.rhc-data-badge-button--hover;
13 | }
14 | }
15 |
16 | .rhc-data-badge-button .rhc-data-badge-button__sr-only {
17 | @include mixin.rhc-data-badge-button__sr-only;
18 | }
19 |
20 | .rhc-data-badge-button:focus-visible,
21 | .rhc-data-badge-button--focus-visible {
22 | @include mixin.rhc-data-badge-button--focus-visible;
23 | }
24 |
--------------------------------------------------------------------------------
/packages/components-react/src/ColumnLayout.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom/vitest';
2 | import { cleanup, render } from '@testing-library/react';
3 | import { afterEach, describe, expect, it } from 'vitest';
4 | import { ColumnLayout } from './ColumnLayout';
5 |
6 | describe('ColumnLayout', () => {
7 | it('renders a visible element', () => {
8 | const { container } = render( );
9 | const columnLayout = container.querySelector(':only-child');
10 | expect(columnLayout).toBeInTheDocument();
11 | expect(columnLayout).toBeVisible();
12 | });
13 | });
14 |
15 | afterEach(() => cleanup());
16 |
--------------------------------------------------------------------------------
/packages/components-react/src/HeadingGroup.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom/vitest';
2 | import { cleanup, render } from '@testing-library/react';
3 | import { afterEach, describe, expect, it } from 'vitest';
4 | import { HeadingGroup } from '.';
5 |
6 | describe('Heading Group', () => {
7 | it('renders a visible element', () => {
8 | const { container } = render( );
9 |
10 | const headingGroup = container.querySelector(':only-child');
11 |
12 | expect(headingGroup).toBeInTheDocument();
13 | expect(headingGroup).toBeVisible();
14 | });
15 | });
16 |
17 | afterEach(() => cleanup());
18 |
--------------------------------------------------------------------------------
/packages/components-react/src/TableCaption.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom/vitest';
2 | import { cleanup, render } from '@testing-library/react';
3 | import { afterEach, describe, expect, it } from 'vitest';
4 | import { TableCaption } from '.';
5 |
6 | describe('TableCaption', () => {
7 | it('renders a visible element', () => {
8 | const { container } = render( );
9 |
10 | const tableCaption = container.querySelector(':only-child');
11 |
12 | expect(tableCaption).toBeInTheDocument();
13 | expect(tableCaption).toBeVisible();
14 | });
15 | });
16 |
17 | afterEach(() => cleanup());
18 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/text-input.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community Text Input
4 |
5 | ## Terminologie
6 |
7 | - textbox: `role="textbox"` in WAI-ARIA, Text box lemma op Wikipedia. HTML noemt het "text control" en text edit control". MDN noemt het "text field" en "text input".
8 | - invalid: ...
9 | - disabled: ...
10 | - read-only: ...
11 |
12 | ## Privacy
13 |
14 | Gebruik `spellcheck="false"` voor velden die gevoelige informatie kunnen bevatten, zoals wachtwoorden en persoonsgegevens. Sommige browser extensions voor spellingcontrole sturen deze informatie naar externe servers.
15 |
--------------------------------------------------------------------------------
/packages/components-css/src/blockquote/_mixin.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 |
6 | @mixin rhc-blockquote__quote {
7 | margin-block-end: var(--utrecht-blockquote-margin-block-end, var(--rhc-blockquote-margin-block-end));
8 | margin-block-start: var(--utrecht-blockquote-margin-block-start, var(--rhc-blockquote-margin-block-start));
9 | margin-inline-end: var(--utrecht-blockquote-margin-inline-end, var(--rhc-blockquote-margin-inline-end));
10 | margin-inline-start: var(--utrecht-blockquote-margin-inline-start, var(--rhc-blockquote-margin-inline-start));
11 | }
12 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/templates/betalingsregeling/betalingsregeling.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Terug naar overzicht
4 | Betalingsregeling
5 | Wilt u uw boete in delen betalen? Vaak kan dat. Ga naar onze
7 | Website
10 | voor meer informatie.
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/components-angular/src/form-field/form-field.component.ts:
--------------------------------------------------------------------------------
1 | import { NgClass } from '@angular/common';
2 | import { Component, Input } from '@angular/core';
3 |
4 | @Component({
5 | selector: 'rhc-form-field',
6 | imports: [NgClass],
7 | templateUrl: './form-field.component.html',
8 | })
9 | export class FormFieldComponent {
10 | @Input() type?: 'checkbox' | 'radio' | 'text';
11 | @Input() class?: string;
12 | @Input() invalid?: boolean = false;
13 | @Input() showInput?: boolean = true;
14 | @Input() showLabel?: boolean = true;
15 | @Input() showDescription?: boolean = false;
16 |
17 | constructor() {}
18 | }
19 |
--------------------------------------------------------------------------------
/packages/components-react/src/Logo.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom/vitest';
2 | import { cleanup, render, screen } from '@testing-library/react';
3 | import { afterEach, describe, expect, it } from 'vitest';
4 | import { Logo } from './Logo';
5 |
6 | describe('Logo', () => {
7 | it('renders a logo role element', () => {
8 | render( );
9 |
10 | const logo = screen.getByText('Voorbeeld organisatie');
11 |
12 | expect(logo).toBeInTheDocument();
13 | expect(logo).toBeVisible();
14 | });
15 | });
16 |
17 | afterEach(() => cleanup());
18 |
--------------------------------------------------------------------------------
/packages/components-react/src/MessageList.tsx:
--------------------------------------------------------------------------------
1 | import clsx from 'clsx';
2 | import { HTMLAttributes, Ref } from 'react';
3 |
4 | export interface MessageListProps extends HTMLAttributes {
5 | ref?: Ref;
6 | }
7 |
8 | export const MessageList = ({ ref, className, children, ...restProps }: MessageListProps) => {
9 | return (
10 |
18 | );
19 | };
20 |
21 | MessageList.displayName = 'MessageList';
22 |
--------------------------------------------------------------------------------
/packages/components-css/src/form/index.scss:
--------------------------------------------------------------------------------
1 | .rhc-form-label--checkbox .utrecht-form-field__label--checkbox {
2 | --utrecht-form-label-font-weight: var(--rhc-text-font-weight-regular, 400);
3 |
4 | align-items: flex-start;
5 | display: flex;
6 | margin-block-end: var(--rhc-form-field-checkbox-option-margin-block-end, inherit);
7 | }
8 |
9 | .utrecht-form-field__status {
10 | grid-column-end: status;
11 | grid-column-start: status;
12 | grid-row-end: status;
13 | grid-row-start: status;
14 | }
15 |
16 | .utrecht-form-field--checkbox {
17 | grid-template-areas: "input label" "input description" "input error-message" "input status";
18 | }
19 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/fieldset.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/fieldset.stories';
2 | import * as ReactStories from '../components-react/fieldset.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Fieldset',
8 | id: 'css-fieldset',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const Disabled = ReactStories.Disabled;
13 | export const PartiallyDisabled = ReactStories.PartiallyDisabled;
14 | export const Invalid = ReactStories.Invalid;
15 | export const PartiallyInvalid = ReactStories.PartiallyInvalid;
16 |
--------------------------------------------------------------------------------
/packages/components-react/src/UnorderedListItem.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom/vitest';
2 | import { cleanup, render } from '@testing-library/react';
3 | import { afterEach, describe, expect, it } from 'vitest';
4 | import { UnorderedListItem } from '.';
5 |
6 | describe('UnorderedListItem', () => {
7 | it('renders a visible element', () => {
8 | const { container } = render( );
9 |
10 | const unorderedListItem = container.querySelector(':only-child');
11 |
12 | expect(unorderedListItem).toBeInTheDocument();
13 | expect(unorderedListItem).toBeVisible();
14 | });
15 | });
16 |
17 | afterEach(() => cleanup());
18 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/navigation-list.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community Navigation List component
4 |
5 | ## Usage
6 |
7 | ```tsx
8 | import { NavigationList, NavigationListItem, NavigationListLink } from '@rijkshuisstijl-community/components-react';
9 |
10 |
11 |
12 |
18 | ;
19 | ```
20 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 |
3 | updates:
4 | - package-ecosystem: "github-actions"
5 | directory: "/"
6 | schedule:
7 | interval: "monthly"
8 | - package-ecosystem: "npm"
9 | directory: "/"
10 | schedule:
11 | interval: "monthly"
12 | groups:
13 | patch-and-minor-dependencies:
14 | applies-to: "version-updates"
15 | update-types:
16 | - "patch"
17 | - "minor"
18 | ignore:
19 | - dependency-name: "@types/node"
20 | update-types:
21 | - "version-update:semver-major"
22 | versioning-strategy: "increase-if-necessary"
23 | open-pull-requests-limit: 20
24 |
--------------------------------------------------------------------------------
/packages/components-react/src/DataSummary.tsx:
--------------------------------------------------------------------------------
1 | import clsx from 'clsx';
2 | import { HTMLAttributes, PropsWithChildren, Ref } from 'react';
3 |
4 | export interface DataSummaryProps extends HTMLAttributes {
5 | appearance?: 'column' | 'row';
6 | ref?: Ref;
7 | }
8 |
9 | export function DataSummary({
10 | ref,
11 | className,
12 | children,
13 | appearance = 'column',
14 | ...restProps
15 | }: PropsWithChildren) {
16 | return (
17 |
18 | {children}
19 |
20 | );
21 | }
22 |
--------------------------------------------------------------------------------
/proprietary/assets/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@rijkshuisstijl-community/assets",
3 | "version": "1.0.2",
4 | "author": "Community for NL Design System",
5 | "description": "Assets",
6 | "license": "SEE LICENSE IN LICENSE.md",
7 | "keywords": [
8 | "nl-design-system"
9 | ],
10 | "private": false,
11 | "publishConfig": {
12 | "access": "restricted",
13 | "provenance": false,
14 | "registry": "https://registry.npmjs.org/"
15 | },
16 | "files": [],
17 | "repository": {
18 | "type": "git+ssh",
19 | "url": "git@github.com:nl-design-system/rijkshuisstijl-community.git",
20 | "directory": "proprietary/assets"
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/packages/web-components/vite.config.mjs:
--------------------------------------------------------------------------------
1 | import preact from '@preact/preset-vite';
2 | import { defineConfig } from 'vite';
3 | import dts from 'vite-plugin-dts';
4 |
5 | export default defineConfig({
6 | mode: 'production',
7 | build: {
8 | lib: {
9 | entry: 'src/index.ts',
10 | name: 'RhcWebComponents',
11 | formats: ['es'],
12 | fileName: 'index',
13 | },
14 | },
15 | resolve: {
16 | dedupe: ['preact', 'preact/compat', 'preact/jsx-runtime'],
17 | },
18 | plugins: [
19 | preact(),
20 | dts({
21 | entryRoot: 'src',
22 | insertTypesEntry: true,
23 | rollupTypes: true,
24 | }),
25 | ],
26 | });
27 |
--------------------------------------------------------------------------------
/packages/components-css/src/logo/index.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 | @use "mixin";
6 |
7 | .rhc-logo {
8 | @include mixin.rhc-logo;
9 | }
10 |
11 | .rhc-logo__image {
12 | @include mixin.rhc-logo__image;
13 | }
14 |
15 | .rhc-logo__image .utrecht-icon,
16 | .rhc-logo__image .rhc-icon {
17 | @include mixin.rhc-logo__icon;
18 | }
19 |
20 | .rhc-logo__caption {
21 | @include mixin.rhc-logo__caption;
22 | }
23 |
24 | .rhc-logo__title {
25 | @include mixin.rhc-logo__title;
26 | }
27 |
28 | .rhc-logo__subtitle {
29 | @include mixin.rhc-logo__subtitle;
30 | @include mixin.rhc-logo__title;
31 | }
32 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/breadcrumb-nav.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/breadcrumb-nav.stories';
2 | import * as ReactStories from '../components-react/breadcrumb-nav.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Breadcrumb Navigation',
8 | id: 'css-breadcrumb-nav',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const Current = ReactStories.Current;
13 | export const Separator = ReactStories.Separator;
14 | export const Active = ReactStories.Active;
15 | export const DisabledAndCurrent = ReactStories.DisabledAndCurrent;
16 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/rounded-corner.stories.tsx:
--------------------------------------------------------------------------------
1 | import * as ReactStories from '../components-react/rounded-corner.stories';
2 | import reactMeta from '../components-react/rounded-corner.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Rounded Corner',
8 | id: 'css-rounded-corner',
9 | };
10 |
11 | export const BlueCurvedBorder = ReactStories.BlueCurvedBorder;
12 | export const ImageInsideRoundedCorner = ReactStories.ImageInsideRoundedCorner;
13 | export const ImageBackground = ReactStories.ImageBackground;
14 | export const CustomTokens = ReactStories.CustomTokens;
15 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/column-layout.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community Column Layout component
4 |
5 | De Column Layout verdeeld content over meerdere kolommen
6 |
7 | ## Usage
8 |
9 | ```tsx
10 | import { ColumnLayout } from '@rijkshuisstijl-community/components-react';
11 |
12 |
13 | Column Layout example ,
14 |
15 | Lorem ipsum dolor, sit amet consectetur adipisicing elit. Rerum magnam magni expedita modi sit quasi, natus nobis
16 | sint hic, eum illum quis laboriosam pariatur quo alias eaque qui quae recusandae?
17 |
18 | ;
19 | ```
20 |
--------------------------------------------------------------------------------
/npmpackagejsonlint.config.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | rules: {
3 | 'no-caret-version-dependencies': 'error',
4 | 'no-caret-version-devDependencies': 'error',
5 | 'no-tilde-version-dependencies': 'error',
6 | 'no-tilde-version-devDependencies': 'error',
7 | 'require-repository-directory': 'error',
8 | 'valid-values-license': ['error', ['EUPL-1.2']],
9 | 'valid-values-name-scope': ['error', ['@rijkshuisstijl-community']],
10 | },
11 | overrides: [
12 | {
13 | patterns: ['proprietary/**/package.json'],
14 | rules: {
15 | 'valid-values-license': ['error', ['SEE LICENSE IN LICENSE.md']],
16 | },
17 | },
18 | ],
19 | };
20 |
--------------------------------------------------------------------------------
/packages/components-react/src/VisuallyHidden.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom/vitest';
2 | import { cleanup, render, screen } from '@testing-library/react';
3 | import { afterEach, describe, expect, it } from 'vitest';
4 | import { VisuallyHidden } from '.';
5 |
6 | describe('VisuallyHidden', () => {
7 | it('renders a visible element', () => {
8 | render(
9 |
10 | This text is hidden
11 | ,
12 | );
13 |
14 | const visuallyHiddenSpan = screen.getByText('This text is hidden');
15 |
16 | expect(visuallyHiddenSpan).toBeInTheDocument();
17 | });
18 | });
19 |
20 | afterEach(() => cleanup());
21 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/drawer.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/drawer.stories';
2 | import * as ReactStories from '../components-react/drawer.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Drawer',
8 | id: 'css-drawer',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const InlineStart = ReactStories.InlineStart;
13 | export const InlineEnd = ReactStories.InlineEnd;
14 | export const BlockStart = ReactStories.BlockStart;
15 | export const BlockEnd = ReactStories.BlockEnd;
16 | export const OverflowY = ReactStories.OverflowY;
17 |
--------------------------------------------------------------------------------
/packages/components-react/src/FormFieldErrorMessage.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom/vitest';
2 | import { cleanup, render } from '@testing-library/react';
3 | import { afterEach, describe, expect, it } from 'vitest';
4 | import { FormFieldErrorMessage } from '.';
5 |
6 | describe('FormFieldErrorMessage', () => {
7 | it('renders a visible element', () => {
8 | const { container } = render( );
9 |
10 | const formFieldErrorMessage = container.querySelector(':only-child');
11 |
12 | expect(formFieldErrorMessage).toBeInTheDocument();
13 | expect(formFieldErrorMessage).toBeVisible();
14 | });
15 | });
16 |
17 | afterEach(() => cleanup());
18 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/code-input-group.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/code-input-group.stories';
2 | import * as ReactStories from '../components-react/code-input-group.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Code Input Group',
8 | id: 'css-code-input-group',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const WithLabel = ReactStories.WithLabel;
13 | export const CapitalizedLetters = ReactStories.CapitalizedLetters;
14 | export const OnlyNumbers = ReactStories.OnlyNumbers;
15 | export const Invalid = ReactStories.Invalid;
16 |
--------------------------------------------------------------------------------
/packages/storybook/vite.config.mjs:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite';
2 | import twig from 'vite-plugin-twig-drupal';
3 | import { join } from 'node:path';
4 |
5 | export default defineConfig({
6 | plugins: [
7 | // Support for Twig templates in Storybook with live reload and namespaces
8 | twig({
9 | namespaces: {
10 | rhc: join(__dirname, '../components-twig/src'),
11 | },
12 | framework: 'react',
13 | }),
14 | ],
15 | resolve: {
16 | // we set the rhc:source so that the react package resolves directly to the source files for development in this monorepo
17 | conditions: ['rhc:source', 'import', 'require', 'default'],
18 | },
19 | });
20 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/heading.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/heading.stories';
2 | import * as ReactStories from '../components-react/heading.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Heading',
8 | id: 'css-heading',
9 | };
10 |
11 | export const Heading1 = ReactStories.Heading1;
12 | export const Heading2 = ReactStories.Heading2;
13 | export const Heading3 = ReactStories.Heading3;
14 | export const Heading4 = ReactStories.Heading4;
15 | export const Heading5 = ReactStories.Heading5;
16 | export const Heading5Appearance = ReactStories.Heading5Appearance;
17 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/link-list-link.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/link-list-link.stories';
2 | import * as ReactStories from '../components-react/link-list-link.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Link List/Link List Link',
8 | id: 'css-link-list-link',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const NoIcon = ReactStories.NoIcon;
13 | export const Hover = ReactStories.Hover;
14 | export const Active = ReactStories.Active;
15 | export const Focus = ReactStories.Focus;
16 | export const Visited = ReactStories.Visited;
17 |
--------------------------------------------------------------------------------
/packages/components-css/src/link/_mixin.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 |
6 | @mixin rhc-link--any-link {
7 | align-items: baseline;
8 | column-gap: var(--rhc-link-column-gap, inherit);
9 | display: inline-flex;
10 | }
11 |
12 | @mixin rhc-link__icon {
13 | --utrecht-icon-size: 1em;
14 |
15 | align-self: center;
16 | line-height: 1.25em;
17 | }
18 |
19 | /* For rhc-link, `inline-flex` was chosen as default, to enable control on positioning of an icon.
20 | To have a link in running text, please enable `inline` property and don't combine it with an icon. */
21 | @mixin rhc-link--inline {
22 | display: inline;
23 | }
24 |
--------------------------------------------------------------------------------
/packages/components-css/vite.config.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable no-undef */
2 | import path from 'node:path';
3 | import { defineConfig } from 'vite';
4 |
5 | export default defineConfig({
6 | build: {
7 | outDir: path.resolve(__dirname, 'dist'), // Output folder for compiled CSS
8 | rollupOptions: {
9 | input: path.resolve(__dirname, 'index.scss'), // Entry point for SCSS
10 | output: {
11 | // Disable JS output and ensure only CSS is generated
12 | format: 'es',
13 | assetFileNames: 'index.css', // Ensure the CSS file gets the correct name
14 | },
15 | },
16 | cssCodeSplit: false, // Avoid splitting the CSS file into multiple parts
17 | },
18 | });
19 |
--------------------------------------------------------------------------------
/packages/font/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # @rijkshuisstijl-community/font
2 |
3 | ## 1.1.2
4 |
5 | ### Patch Changes
6 |
7 | - 10ec55a: Release package with npm provenance.
8 |
9 | ## 1.1.1
10 |
11 | ### Patch Changes
12 |
13 | - 3d9999c: Update patch & minor dependencies
14 |
15 | ## 1.1.0
16 |
17 | ### Minor Changes
18 |
19 | - d914771: Added the option to import dist/index.css
20 |
21 | ## 1.0.1
22 |
23 | ### Patch Changes
24 |
25 | - 1dc03fb: Wekelijkse package updates voor Rijkshuisstijl-componenten en design tokens (week 10)
26 | - b9a4945: Moved implementation documentation from repository README to package README.
27 |
28 | ## 1.0.0
29 |
30 | ### Patch Changes
31 |
32 | - ed83ac9: First full release
33 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/data-summary.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community Data Summary component
4 |
5 | Lijst met eigenschappen en bijbehorende data over een onderwerp.
6 |
7 | ## Usage
8 |
9 | ```jsx
10 | import { DataSummary, DataSummaryItem } from '@rijkshuisstijl-community/components-react';
11 |
12 |
13 |
14 |
15 | Bekijk alle dieren
16 |
17 |
18 |
19 | ;
20 | ```
21 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/form-field-radio-group.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/form-field-radio-group.stories';
2 | import * as ReactStories from '../components-react/form-field-radio-group.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Form Field/Form Field Radio Group',
8 | id: 'css-form-field-radio-group',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const Invalid = ReactStories.Invalid;
13 | export const Description = ReactStories.Description;
14 | export const Status = ReactStories.Status;
15 | export const RightToLeft = ReactStories.RightToLeft;
16 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/radio.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/radio.stories';
2 | import * as ReactStories from '../components-react/radio.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Radio Button',
8 | id: 'css-radio',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const Active = ReactStories.Active;
13 | export const Hover = ReactStories.Hover;
14 | export const Focus = ReactStories.Focus;
15 | export const FocusVisible = ReactStories.FocusVisible;
16 | export const Disabled = ReactStories.Disabled;
17 | export const Invalid = ReactStories.Invalid;
18 |
--------------------------------------------------------------------------------
/packages/components-css/src/form-field/index.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * @license EUPL-1.2
3 | * Copyright (c) 2021 Community for NL Design System
4 | */
5 | .utrecht-form-field {
6 | font-size: var(--rhc-text-font-size-max-md, inherit);
7 | line-height: var(--rhc-text-line-height-md, inherit);
8 | }
9 |
10 | .utrecht-rich-text .utrecht-form-field {
11 | margin-block-end: var(--utrecht-form-field-margin-block-end);
12 | }
13 |
14 | .utrecht-form-field__status {
15 | margin-block-end: var(--rhc-space-100, 0.5rem);
16 | margin-block-start: var(--rhc-space-100, 0.5rem);
17 | }
18 |
19 | .utrecht-form-field__description {
20 | --utrecht-form-field-description-margin-block-start: calc(-1 * var(--rhc-space-100));
21 | }
22 |
--------------------------------------------------------------------------------
/packages/components-react/src/NavigationList.tsx:
--------------------------------------------------------------------------------
1 | import clsx from 'clsx';
2 | import { HTMLAttributes, Ref } from 'react';
3 |
4 | export interface NavigationListProps extends HTMLAttributes {
5 | ref?: Ref;
6 | }
7 |
8 | export const NavigationList = ({ ref, children, className, ...restProps }: NavigationListProps) => {
9 | return (
10 |
19 | );
20 | };
21 |
22 | NavigationList.displayName = 'NavigationList';
23 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/templates/boete-zoeken.stories.ts:
--------------------------------------------------------------------------------
1 | import { Meta, StoryObj } from '@storybook/angular';
2 | import { BoeteZoekenTemplate } from './boete-zoeken/boete-zoeken.component';
3 |
4 | const meta: Meta = {
5 | title: 'Boete zoeken',
6 | id: 'rhc-templates-boete-zoeken',
7 | render: () => ({
8 | moduleMetadata: {
9 | imports: [BoeteZoekenTemplate],
10 | },
11 | template: `
12 |
13 | `,
14 | }),
15 | parameters: {
16 | docs: {
17 | page: null,
18 | },
19 | isPage: true,
20 | layout: 'fullscreen',
21 | },
22 | };
23 |
24 | export default meta;
25 |
26 | export const Default: StoryObj = {};
27 |
--------------------------------------------------------------------------------
/packages/storybook/src/templates/shared/disclaimer.tsx:
--------------------------------------------------------------------------------
1 | import { Alert, Heading, Paragraph } from '@rijkshuisstijl-community/components-react';
2 |
3 | export default function SharedDisclaimer() {
4 | return (
5 |
6 |
7 | Let op: dit is een voorbeeldpagina!
8 |
9 |
10 | Deze pagina is alleen bedoeld om te laten zien hoe Rijkshuisstijl Community-componenten eruitzien en werken. De
11 | informatie is niet echt en komt niet van een officiële bron. Sommige onderdelen werken mogelijk (nog) niet zoals
12 | op een echte website.
13 |
14 |
15 | );
16 | }
17 |
--------------------------------------------------------------------------------
/packages/components-angular/src/image/image.component.spec.ts:
--------------------------------------------------------------------------------
1 | import { ComponentFixture, TestBed } from '@angular/core/testing';
2 | import { ImageComponent } from './image.component';
3 |
4 | describe('ImageComponent', () => {
5 | let component: ImageComponent;
6 | let fixture: ComponentFixture;
7 |
8 | beforeEach(async () => {
9 | await TestBed.configureTestingModule({
10 | imports: [ImageComponent],
11 | }).compileComponents();
12 |
13 | fixture = TestBed.createComponent(ImageComponent);
14 | component = fixture.componentInstance;
15 | fixture.detectChanges();
16 | });
17 |
18 | it('should create', () => {
19 | expect(component).toBeTruthy();
20 | });
21 | });
22 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/navigation-list-item.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/navigation-list-item.stories';
2 | import * as ReactStories from '../components-react/navigation-list-item.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Navigation List/Navigation List Item',
8 | id: 'css-navigation-list-item',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const WithCustomIcon = ReactStories.WithCustomIcon;
13 | export const WithCustomIconEnd = ReactStories.WithCustomIconEnd;
14 | export const Hover = ReactStories.Hover;
15 | export const Focus = ReactStories.Focus;
16 |
--------------------------------------------------------------------------------
/packages/storybook/src/icon-sets/default-icon-set.md:
--------------------------------------------------------------------------------
1 | # Rijkshuisstijl Community Standaard Icon Set
2 |
3 | Onderstaande iconen zijn beschikbaar in de Rijkshuisstijl Community en bruikbaar in het [Icon](?path=/docs/rhc-icon--docs) component. De iconen zijn afkomstig uit de open source [Tabler Icons](https://tabler.io/icons) icon set of handmatig geïmplementeerd door contributors van de Rijkshuisstijl Community. Om een icon die hieronder staat te gebruiken, kan de icon ID toegewezen worden aan de `icon` property van de [Icon](?path=/docs/rhc-icon--docs) component. Er kunnen eigen iconen worden toegevoegd aan de standaard iconen set, zie hiervoor de instructies op de [storybook pagina van de Icon component](?path=/docs/rhc-icon--docs).
4 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/form-field-checkbox-group.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/form-field-checkbox-group.stories';
2 | import * as ReactStories from '../components-react/form-field-checkbox-group.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Form Field/Form Field Checkbox Group',
8 | id: 'css-form-field-checkbox-group',
9 | };
10 |
11 | export const Default = ReactStories.Default;
12 | export const Invalid = ReactStories.Invalid;
13 | export const Description = ReactStories.Description;
14 | export const Status = ReactStories.Status;
15 | export const RightToLeft = ReactStories.RightToLeft;
16 |
--------------------------------------------------------------------------------
/apps/rhc-templates/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "compilerOptions": {
4 | "target": "es5",
5 | "lib": ["dom", "dom.iterable", "esnext"],
6 | "allowJs": true,
7 | "skipLibCheck": true,
8 | "strict": true,
9 | "noEmit": true,
10 | "esModuleInterop": true,
11 | "resolveJsonModule": true,
12 | "isolatedModules": true,
13 | "jsx": "preserve",
14 | "incremental": true,
15 | "plugins": [
16 | {
17 | "name": "next"
18 | }
19 | ],
20 | "paths": {
21 | "@/*": ["./src/*"]
22 | }
23 | },
24 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "dist/types/**/*.ts"],
25 | "exclude": ["node_modules"]
26 | }
27 |
--------------------------------------------------------------------------------
/packages/components-react/src/FormFieldSelect.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom/vitest';
2 | import { cleanup, render } from '@testing-library/react';
3 | import { afterEach, describe, expect, it } from 'vitest';
4 | import { FormFieldSelect } from '.';
5 |
6 | describe('FormFieldSelect', () => {
7 | const defaultProps = {
8 | label: 'Test Label',
9 | };
10 | it('renders a visible element', () => {
11 | const { container } = render( );
12 |
13 | const formFieldSelect = container.querySelector(':only-child');
14 |
15 | expect(formFieldSelect).toBeInTheDocument();
16 | expect(formFieldSelect).toBeVisible();
17 | });
18 | });
19 |
20 | afterEach(() => cleanup());
21 |
--------------------------------------------------------------------------------
/packages/storybook/src/icon-sets/flag-icon-set.stories.tsx:
--------------------------------------------------------------------------------
1 | import { mergeMarkdown } from '@rijkshuisstijl-community/storybook-tooling/markdownUtils';
2 | import { Meta, StoryObj } from '@storybook/react-vite';
3 | import IconSet from './flag-icon-set-page';
4 | import readme from './flag-icon-set.md?raw';
5 |
6 | const meta = {
7 | title: 'Icon Sets/Flag Icon Set',
8 | id: 'rhc-templates-flag-icon-set',
9 | component: IconSet,
10 | parameters: {
11 | docs: {
12 | description: {
13 | component: mergeMarkdown([readme]),
14 | },
15 | },
16 | },
17 | } satisfies Meta;
18 |
19 | export default meta;
20 |
21 | type Story = StoryObj;
22 |
23 | export const Default: Story = {};
24 |
--------------------------------------------------------------------------------
/packages/components-angular/src/paragraph/paragraph.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, Input } from '@angular/core';
2 |
3 | export const appearanceOptions = [undefined, 'lead'] as const;
4 | export type AppearanceType = (typeof appearanceOptions)[number];
5 |
6 | @Component({
7 | selector: 'rhc-paragraph',
8 | imports: [],
9 | templateUrl: './paragraph.component.html',
10 | styleUrl: './paragraph.component.css',
11 | })
12 | export class ParagraphComponent {
13 | @Input() appearance?: AppearanceType;
14 |
15 | computedClass = () => {
16 | switch (this.appearance) {
17 | case 'lead':
18 | return 'nl-paragraph nl-paragraph--lead';
19 | default:
20 | return 'nl-paragraph';
21 | }
22 | };
23 | }
24 |
--------------------------------------------------------------------------------
/packages/components-react/src/TableCaption.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | TableCaption as UtrechtTableCaption,
3 | TableCaptionProps as UtrechtTableCaptionProps,
4 | } from '@utrecht/component-library-react';
5 | import { PropsWithChildren, Ref } from 'react';
6 |
7 | interface TableCaptionProps extends UtrechtTableCaptionProps {
8 | ref?: Ref;
9 | }
10 |
11 | export const TableCaption = ({ ref, dir, children, ...restProps }: PropsWithChildren) => {
12 | return (
13 |
14 | {children}
15 |
16 | );
17 | };
18 |
19 | TableCaption.displayName = 'TableCaption';
20 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/footer.stories.tsx:
--------------------------------------------------------------------------------
1 | import reactMeta from '../components-react/footer.stories';
2 | import * as ReactStories from '../components-react/footer.stories';
3 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
4 |
5 | export default {
6 | ...mergeCssMeta(reactMeta),
7 | title: 'Footer',
8 | id: 'css-footer',
9 | };
10 |
11 | export const DefaultFooter = ReactStories.DefaultFooter;
12 | export const PrimaryOutlinedFooter = ReactStories.PrimaryOutlinedFooter;
13 | export const PrimaryOutlinedFooterSubFooter = ReactStories.PrimaryOutlinedFooterSubFooter;
14 | export const ColumnLayoutFooter = ReactStories.ColumnLayoutFooter;
15 | export const CustomHeadingFooter = ReactStories.CustomHeadingFooter;
16 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/form-field.md:
--------------------------------------------------------------------------------
1 | # Rijkshuisstijl Community FormField component
2 |
3 | De `FormField` component is een wrapper voor invoervelden in formulieren. Het zorgt voor een consistente structuur met labels, beschrijvingen, foutmeldingen en statusberichten. Deze component is gebaseerd op de Utrecht component library
4 |
5 | ## Voorbeeld met verkeerde implementatie
6 |
7 | - Het `input` element, evenals `description` en `errorMessage`, moeten als props worden meegegeven en niet als children.
8 |
9 | ```jsx
10 | // Fout: input wordt direct als child geplaatst
11 |
12 |
13 |
14 |
15 | // Correct: input wordt als prop meegegeven
16 | } />
17 | ```
18 |
--------------------------------------------------------------------------------
/packages/components-angular/src/form-label/form-label.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, Input } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'label[rhc-form-label]',
5 | imports: [],
6 | templateUrl: './form-label.component.html',
7 | host: {
8 | '[class.utrecht-form-label]': 'true',
9 | '[class.utrecht-form-label--disabled]': 'disabled',
10 | '[class.utrecht-form-label--checked]': 'checked',
11 | '[class.utrecht-form-label--radio]': 'type === "radio"',
12 | '[class.utrecht-form-label--checkbox]': 'type === "checkbox"',
13 | },
14 | })
15 | export class FormLabelComponent {
16 | @Input() disabled?: boolean = false;
17 | @Input() checked?: boolean = false;
18 | @Input() type?: 'checkbox' | 'radio';
19 | }
20 |
--------------------------------------------------------------------------------
/packages/components-react/src/Drawer.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom/vitest';
2 | import { cleanup, render, screen } from '@testing-library/react';
3 | import { afterEach, describe, expect, it } from 'vitest';
4 | import { Drawer } from './Drawer';
5 |
6 | describe('Drawer testcases', () => {
7 | it('should render successfully', () => {
8 | render( );
9 | const drawer = screen.getByRole('dialog');
10 | expect(drawer).toBeInTheDocument();
11 | });
12 |
13 | it('should not be visible', () => {
14 | render( );
15 | const drawer = screen.getByRole('dialog', { hidden: true });
16 | expect(drawer).not.toBeVisible();
17 | });
18 | });
19 |
20 | afterEach(() => cleanup());
21 |
--------------------------------------------------------------------------------
/packages/components-react/src/icon-sets/flag-icons/assets/uk-flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/templates/detailinformatie.stories.ts:
--------------------------------------------------------------------------------
1 | import { Meta, StoryObj } from '@storybook/angular';
2 | import { DetailinformatieTemplate } from './detailinformatie/detailinformatie.component';
3 |
4 | const meta: Meta = {
5 | title: 'Detailinformatie',
6 | id: 'rhc-templates-detailinformatie',
7 | render: () => ({
8 | moduleMetadata: {
9 | imports: [DetailinformatieTemplate],
10 | },
11 | template: `
12 |
13 | `,
14 | }),
15 | parameters: {
16 | docs: {
17 | page: null,
18 | },
19 | isPage: true,
20 | layout: 'fullscreen',
21 | },
22 | };
23 |
24 | export default meta;
25 |
26 | export const Default: StoryObj = {};
27 |
--------------------------------------------------------------------------------
/packages/storybook/src/icon-sets/default-icon-set.stories.tsx:
--------------------------------------------------------------------------------
1 | import { mergeMarkdown } from '@rijkshuisstijl-community/storybook-tooling/markdownUtils';
2 | import { Meta, StoryObj } from '@storybook/react-vite';
3 | import IconSet from './default-icon-set-page';
4 | import readme from './default-icon-set.md?raw';
5 |
6 | const meta = {
7 | title: 'Icon Sets/Default Icon Set',
8 | id: 'rhc-templates-default-icon-set',
9 | component: IconSet,
10 | parameters: {
11 | docs: {
12 | description: {
13 | component: mergeMarkdown([readme]),
14 | },
15 | },
16 | },
17 | } satisfies Meta;
18 |
19 | export default meta;
20 |
21 | type Story = StoryObj;
22 |
23 | export const Default: Story = {};
24 |
--------------------------------------------------------------------------------
/packages/components-react/src/CodeInput.tsx:
--------------------------------------------------------------------------------
1 | import { TextboxProps } from '@utrecht/component-library-react';
2 | import clsx from 'clsx';
3 | import { ForwardedRef } from 'react';
4 | import { TextInput } from './TextInput';
5 |
6 | export interface CodeInputProps extends TextboxProps {
7 | capitalize?: boolean;
8 | ref: ForwardedRef;
9 | }
10 |
11 | export const CodeInput = ({ capitalize = false, ref, className, ...restProps }: CodeInputProps) => {
12 | return (
13 |
19 | );
20 | };
21 |
22 | CodeInput.displayName = 'CodeInput';
23 |
--------------------------------------------------------------------------------
/packages/components-angular/src/form-field/form-field.component.spec.ts:
--------------------------------------------------------------------------------
1 | import { ComponentFixture, TestBed } from '@angular/core/testing';
2 | import { FormFieldComponent } from './form-field.component';
3 |
4 | describe('FormFieldComponent', () => {
5 | let component: FormFieldComponent;
6 | let fixture: ComponentFixture;
7 |
8 | beforeEach(async () => {
9 | await TestBed.configureTestingModule({
10 | imports: [FormFieldComponent],
11 | }).compileComponents();
12 |
13 | fixture = TestBed.createComponent(FormFieldComponent);
14 | component = fixture.componentInstance;
15 | fixture.detectChanges();
16 | });
17 |
18 | it('should create', () => {
19 | expect(component).toBeTruthy();
20 | });
21 | });
22 |
--------------------------------------------------------------------------------
/packages/components-angular/src/form-label/form-label.component.spec.ts:
--------------------------------------------------------------------------------
1 | import { ComponentFixture, TestBed } from '@angular/core/testing';
2 | import { FormLabelComponent } from './form-label.component';
3 |
4 | describe('FormLabelComponent', () => {
5 | let component: FormLabelComponent;
6 | let fixture: ComponentFixture;
7 |
8 | beforeEach(async () => {
9 | await TestBed.configureTestingModule({
10 | imports: [FormLabelComponent],
11 | }).compileComponents();
12 |
13 | fixture = TestBed.createComponent(FormLabelComponent);
14 | component = fixture.componentInstance;
15 | fixture.detectChanges();
16 | });
17 |
18 | it('should create', () => {
19 | expect(component).toBeTruthy();
20 | });
21 | });
22 |
--------------------------------------------------------------------------------
/packages/components-angular/src/text-input/text-input.component.spec.ts:
--------------------------------------------------------------------------------
1 | import { ComponentFixture, TestBed } from '@angular/core/testing';
2 | import { TextInputComponent } from './text-input.component';
3 |
4 | describe('TextInputComponent', () => {
5 | let component: TextInputComponent;
6 | let fixture: ComponentFixture;
7 |
8 | beforeEach(async () => {
9 | await TestBed.configureTestingModule({
10 | imports: [TextInputComponent],
11 | }).compileComponents();
12 |
13 | fixture = TestBed.createComponent(TextInputComponent);
14 | component = fixture.componentInstance;
15 | fixture.detectChanges();
16 | });
17 |
18 | it('should create', () => {
19 | expect(component).toBeTruthy();
20 | });
21 | });
22 |
--------------------------------------------------------------------------------
/packages/storybook-angular/src/templates/betalingsregeling.stories.ts:
--------------------------------------------------------------------------------
1 | import { Meta, StoryObj } from '@storybook/angular';
2 | import { BetalingsregelingTemplate } from './betalingsregeling/betalingsregeling.component';
3 |
4 | const meta: Meta = {
5 | title: 'Betalingsregeling',
6 | id: 'rhc-templates-betalingsregeling',
7 | render: () => ({
8 | moduleMetadata: {
9 | imports: [BetalingsregelingTemplate],
10 | },
11 | template: `
12 |
13 | `,
14 | }),
15 | parameters: {
16 | docs: {
17 | page: null,
18 | },
19 | isPage: true,
20 | layout: 'fullscreen',
21 | },
22 | };
23 |
24 | export default meta;
25 |
26 | export const Default: StoryObj = {};
27 |
--------------------------------------------------------------------------------
/packages/storybook-tooling/src/markdownUtils/mergeMarkdown.ts:
--------------------------------------------------------------------------------
1 | import { remark } from 'remark';
2 | import remarkNormalizeHeadings from 'remark-normalize-headings';
3 |
4 | /**
5 | * Merges an array of markdown strings into a single string and normalizes the headings.
6 | *
7 | * The function joins the markdown array into a single string, using double newlines (`\n\n`) as separators between the elements.
8 | *
9 | * Use cases:
10 | * - Combines multiple markdown sections or chunks into one document.
11 | * - Normalizes headings in the merged markdown to maintain consistency in header formatting.
12 | */
13 |
14 | export const mergeMarkdown = (markdown: string[]) =>
15 | String(remark().use(remarkNormalizeHeadings).processSync(markdown.join('\n\n')));
16 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-react/separator.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Rijkshuisstijl Community separator component
4 |
5 | Scheidingslijnen worden gebruikt om de scanbaarheid van een lange contentpagina te vergroten.
6 |
7 | ## Terminologie
8 |
9 | - **separator**, van de ARIA `role="separator"`. "hr" van ` ` uit HTML is te onduidelijk buiten de context van code, "horizontal rule" te specifieke beschrijving van de originele rendering in HTML. De "separator" zou er ook heel anders uit kunnen zien dan een "rule" (lijn), en bovendien kan er voor andere tekstrichtingen wel eens een verticale variant komen.
10 |
11 | "Divider" is ook een vaak gehoorde term hiervoor, misschien moet deze voor vindbaarheid ook genoemd worden in de documentatie.
12 |
--------------------------------------------------------------------------------
/packages/web-components/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../../tsconfig.json",
3 | "compilerOptions": {
4 | "allowSyntheticDefaultImports": true,
5 | "declaration": true,
6 | "outDir": "dist",
7 | "target": "esnext",
8 | "jsx": "react-jsx",
9 | "jsxImportSource": "preact",
10 | "skipLibCheck": true,
11 | "paths": {
12 | "react": ["./node_modules/preact/compat/"],
13 | "react/jsx-runtime": ["./node_modules/preact/jsx-runtime"],
14 | "react-dom": ["./node_modules/preact/compat/"],
15 | "react-dom/*": ["./node_modules/preact/compat/*"]
16 | }
17 | },
18 | "include": ["**/*.d.ts", "**/*.ts", "**/*.tsx"],
19 | "exclude": ["**/node_modules/*", "dist", "loader", "**/*.spec.ts", "**/*.spec.tsx"]
20 | }
21 |
--------------------------------------------------------------------------------
/packages/components-angular/src/heading/heading.component.ts:
--------------------------------------------------------------------------------
1 | import { CommonModule } from '@angular/common';
2 | import { Component, Input } from '@angular/core';
3 |
4 | export const headingLevels = [1, 2, 3, 4, 5] as const;
5 | export type HeadingLevel = (typeof headingLevels)[number];
6 |
7 | @Component({
8 | selector: 'rhc-heading',
9 | imports: [CommonModule],
10 | templateUrl: './heading.component.html',
11 | styleUrl: './heading.component.css',
12 | })
13 | export class HeadingComponent {
14 | @Input({ required: true }) level!: HeadingLevel;
15 | @Input() appearanceLevel?: HeadingLevel;
16 |
17 | stylingLevel = () => this.appearanceLevel ?? this.level;
18 | computedClasses = () => `nl-heading nl-heading--level-${this.stylingLevel()}`;
19 | }
20 |
--------------------------------------------------------------------------------
/packages/components-react/src/Image.tsx:
--------------------------------------------------------------------------------
1 | import { Image as UtrechtImage, type ImageProps as UtrechtImageProps } from '@utrecht/component-library-react';
2 | import { Ref } from 'react';
3 |
4 | export interface ImageProps extends UtrechtImageProps {
5 | ref?: Ref;
6 | alt?: string;
7 | presentation?: boolean;
8 | }
9 |
10 | export const Image = ({ ref, className, alt, presentation, ...restProps }: ImageProps) => {
11 | if (!presentation && !alt) {
12 | console.warn('Images must always have an alt-text, unless the image is presentational.');
13 | return null;
14 | }
15 |
16 | return ;
17 | };
18 |
19 | Image.displayName = 'Image';
20 |
--------------------------------------------------------------------------------
/packages/components-react/src/Link.tsx:
--------------------------------------------------------------------------------
1 | import { Link as CandidateLink, type LinkProps as CandidateLinkProps } from '@nl-design-system-candidate/link-react';
2 | import clsx from 'clsx';
3 | import { PropsWithChildren, Ref } from 'react';
4 |
5 | export interface LinkProps extends Omit {
6 | ref?: Ref;
7 | inline?: boolean;
8 | }
9 |
10 | export const Link = ({ ref, children, className, inline, ...restProps }: PropsWithChildren) => (
11 |
17 | {children}
18 |
19 | );
20 |
21 | Link.displayName = 'Link';
22 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-twig/ordered-list-twig.stories.tsx:
--------------------------------------------------------------------------------
1 | import TwigOrderedList from '@rijkshuisstijl-community/components-twig/src/OrderedList.twig';
2 | import type { Meta, StoryObj } from '@storybook/react-vite';
3 |
4 | const meta = {
5 | title: 'Ordered List',
6 | id: 'rhc-twig-ordered-list',
7 | component: TwigOrderedList,
8 | parameters: {
9 | componentOrigin:
10 | 'Dit is een dummy component voor het toevoegen van support van nested Twig templates. Dit moet vervangen worden door het officiele component.',
11 | },
12 | } satisfies Meta;
13 |
14 | export default meta;
15 |
16 | export const Default: StoryObj = {
17 | args: {
18 | items: ['Item 1', 'Item 2', 'Item 3'],
19 | },
20 | };
21 |
--------------------------------------------------------------------------------
/packages/components-angular/src/data-summary-item/data-summary-item.component.ts:
--------------------------------------------------------------------------------
1 | import { CommonModule } from '@angular/common';
2 | import { Component, Input } from '@angular/core';
3 | import { LinkComponent } from '../link/link.component';
4 |
5 | @Component({
6 | selector: 'div[rhc-data-summary-item]',
7 | imports: [CommonModule, LinkComponent],
8 | templateUrl: './data-summary-item.component.html',
9 | host: {
10 | '[class.rhc-data-summary__item]': 'true',
11 | },
12 | })
13 | export class DataSummaryItemComponent {
14 | @Input() key: string = '';
15 | @Input() value: string = '';
16 | @Input() href?: string;
17 | @Input() target?: '_self' | '_blank' | '_parent' | '_top' | '_unfencedTop' = '_self';
18 | @Input() actionLabel?: string;
19 | }
20 |
--------------------------------------------------------------------------------
/packages/storybook/src/components-css/accordion.stories.tsx:
--------------------------------------------------------------------------------
1 | import readme from '@utrecht/components/accordion/README.md?raw';
2 | import reactMeta from '../components-react/accordion.stories';
3 | import * as ReactStories from '../components-react/accordion.stories';
4 | import { mergeCssMeta } from '../helpers/mergeCssMeta';
5 |
6 | export default {
7 | ...mergeCssMeta(reactMeta, {
8 | parameters: {
9 | docs: {
10 | description: {
11 | component: readme,
12 | },
13 | },
14 | },
15 | }),
16 | title: 'Accordion',
17 | id: 'css-accordion',
18 | };
19 |
20 | export const Default = ReactStories.Default;
21 | export const AccordionWithSections = ReactStories.AccordionWithSections;
22 | export const RTL = ReactStories.RTL;
23 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compileOnSave": false,
3 | "compilerOptions": {
4 | "allowUnreachableCode": false,
5 | "declaration": false,
6 | "downlevelIteration": true,
7 | "experimentalDecorators": true,
8 | "forceConsistentCasingInFileNames": true,
9 | "importHelpers": true,
10 | "lib": ["es2020", "dom"],
11 | "module": "esnext",
12 | "moduleResolution": "bundler",
13 | "noFallthroughCasesInSwitch": true,
14 | "noImplicitOverride": true,
15 | "noImplicitReturns": true,
16 | "noPropertyAccessFromIndexSignature": true,
17 | "noUnusedLocals": true,
18 | "noUnusedParameters": true,
19 | "sourceMap": true,
20 | "strict": true,
21 | "target": "es2020"
22 | },
23 | "exclude": ["**/node_modules/*"]
24 | }
25 |
--------------------------------------------------------------------------------