├── .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 | 2 | 3 | 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 `
    1. `](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 |
    2. 11 | {children} 12 |
    3. 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 |
        11 | {children} 12 |
      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 | 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(