@developer-overheid-nl/don-register-components 1.2.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/CHANGELOG.md +130 -85
  2. package/LICENSE.md +291 -291
  3. package/README.md +20 -20
  4. package/package.json +5 -7
  5. package/src/alert/Alert.tsx +19 -19
  6. package/src/alert/styles.module.css +3 -3
  7. package/src/alignBox/AlignBox.tsx +114 -114
  8. package/src/alignBox/styles.module.css +110 -110
  9. package/src/amountLabel/AmountLabel.tsx +16 -16
  10. package/src/amountLabel/styles.module.css +11 -11
  11. package/src/analytics/PiwikPro.tsx +94 -94
  12. package/src/analytics/index.ts +1 -1
  13. package/src/article/Article.tsx +10 -10
  14. package/src/badgeList/BadgeList.tsx +34 -26
  15. package/src/badgeList/styles.module.css +37 -24
  16. package/src/block/Block.tsx +35 -35
  17. package/src/block/styles.module.css +29 -29
  18. package/src/button/Button.tsx +3 -3
  19. package/src/cardAsLink/CardAsLink.tsx +21 -21
  20. package/src/cardAsLink/styles.module.css +23 -23
  21. package/src/cardsList/CardsList.tsx +56 -54
  22. package/src/cardsList/styles.module.css +19 -19
  23. package/src/client.ts +7 -7
  24. package/src/container/Container.tsx +10 -10
  25. package/src/container/styles.module.css +28 -28
  26. package/src/copyButton/CopyButton.tsx +39 -39
  27. package/src/copyButton/styles.module.css +13 -13
  28. package/src/dataBadgeLink/DataBadgeLink.tsx +53 -53
  29. package/src/dataBadgeLink/styles.module.css +89 -69
  30. package/src/dataSummary/DataSummary.tsx +22 -22
  31. package/src/dataSummary/DataSummaryItem.tsx +21 -21
  32. package/src/dataSummary/styles.module.css +75 -75
  33. package/src/facetFilters/FacetFilters.tsx +419 -313
  34. package/src/facetFilters/styles.module.css +3 -3
  35. package/src/fieldset/FieldSet.tsx +3 -3
  36. package/src/filters/Filters.tsx +116 -115
  37. package/src/filters/styles.module.css +26 -26
  38. package/src/footer/Footer.tsx +76 -76
  39. package/src/footer/styles.module.css +103 -103
  40. package/src/formFieldCheckboxGroup/FormFieldCheckboxGroup.tsx +16 -16
  41. package/src/formFieldCheckboxGroup/styles.module.css +5 -5
  42. package/src/formFieldCheckboxOption/FormFieldCheckboxOption.tsx +26 -26
  43. package/src/formFieldCheckboxOption/styles.module.css +22 -22
  44. package/src/formFieldLabel/FormFieldLabel.tsx +23 -23
  45. package/src/formFieldRadioGroup/FormFieldRadioGroup.tsx +13 -13
  46. package/src/formFieldRadioGroup/styles.module.css +5 -5
  47. package/src/formFieldRadioOption/FormFieldRadioOption.tsx +75 -75
  48. package/src/formFieldRadioOption/styles.module.css +49 -49
  49. package/src/formFieldSwitch/FormFieldSwitch.tsx +79 -79
  50. package/src/formFieldSwitch/styles.module.css +32 -32
  51. package/src/formFieldTextInput/FormFieldTextInput.tsx +3 -3
  52. package/src/header/Header.tsx +137 -137
  53. package/src/header/styles.module.css +71 -71
  54. package/src/heading/Heading.tsx +15 -15
  55. package/src/headingGroup/HeadingGroup.tsx +48 -48
  56. package/src/headingGroup/styles.module.css +3 -3
  57. package/src/i18n.ts +25 -25
  58. package/src/iconBadge/IconBadge.tsx +35 -35
  59. package/src/iconBadge/getAppearance.ts +53 -53
  60. package/src/iconBadge/styles.module.css +19 -19
  61. package/src/iconsSprite/Icon.tsx +17 -17
  62. package/src/iconsSprite/IconsSprite.tsx +5 -5
  63. package/src/index.ts +107 -106
  64. package/src/infoButton/InfoButton.tsx +45 -45
  65. package/src/infoButton/styles.module.css +43 -43
  66. package/src/link/Link.tsx +10 -10
  67. package/src/markdown/Markdown.tsx +42 -42
  68. package/src/overlay/Overlay.tsx +18 -18
  69. package/src/overlay/styles.module.css +15 -15
  70. package/src/pagination/Pagination.tsx +267 -144
  71. package/src/pagination/styles.module.css +28 -13
  72. package/src/paragraph/Paragraph.tsx +24 -24
  73. package/src/paragraph/styles.module.css +6 -6
  74. package/src/pillBadge/PillBadge.examples.tsx +107 -107
  75. package/src/pillBadge/PillBadge.tsx +51 -51
  76. package/src/pillBadge/styles.module.css +214 -214
  77. package/src/readOnlyTextInput/ReadOnlyTextInput.tsx +24 -24
  78. package/src/readOnlyTextInput/styles.module.css +19 -19
  79. package/src/scoreBadge/ScoreBadge.tsx +133 -133
  80. package/src/search/Search.tsx +82 -66
  81. package/src/search/styles.module.css +39 -39
  82. package/src/siteLogo/SiteLogo.tsx +24 -24
  83. package/src/switch/Switch.tsx +86 -86
  84. package/src/switch/styles.module.css +7 -7
  85. package/src/toolTip/ToolTip.tsx +55 -55
  86. package/src/toolTip/styles.module.css +49 -48
  87. package/src/topNavigation/TopNavigation.tsx +67 -67
  88. package/src/topNavigation/styles.module.css +54 -54
  89. package/tsconfig.json +121 -121
@@ -1,3 +1,3 @@
1
- .facet {
2
- margin-block-end: 0.5rem;
3
- }
1
+ .facet {
2
+ margin-block-end: 0.5rem;
3
+ }
@@ -1,3 +1,3 @@
1
- import { Fieldset } from "@rijkshuisstijl-community/components-react";
2
-
3
- export default Fieldset;
1
+ import { Fieldset } from "@rijkshuisstijl-community/components-react";
2
+
3
+ export default Fieldset;
@@ -1,115 +1,116 @@
1
- // 'use client';
2
- /* biome-ignore-all lint: TODO: filters needs a refactor anyway */
3
-
4
- import {
5
- Heading,
6
- LinkList,
7
- LinkListLink,
8
- } from "@rijkshuisstijl-community/components-react";
9
- import clsx from "clsx";
10
- import type { HTMLProps, PropsWithChildren } from "react";
11
- import { I18nextProvider, useTranslation } from "react-i18next";
12
- import Alert from "../alert/Alert";
13
- import DataBadgeLink from "../dataBadgeLink/DataBadgeLink";
14
- import i18n from "../i18n";
15
- import Icon from "../iconsSprite/Icon";
16
- import styles from "./styles.module.css";
17
-
18
- export interface FiltersProps extends HTMLProps<HTMLDivElement> {
19
- routing?: Record<string, any>;
20
- data: any;
21
- headers: any;
22
- error: any;
23
- status?: number;
24
- statusText?: string;
25
- }
26
-
27
- const ListLinkIcon = ({ isActive }: { isActive: boolean }) => {
28
- return (
29
- <Icon
30
- className={clsx([styles.icon, isActive && styles.active])}
31
- name={isActive ? "active" : "delta-naar-rechts-inline"}
32
- />
33
- );
34
- };
35
-
36
- // TODO: make more generic for other filter types
37
-
38
- const Filters = (props: PropsWithChildren<FiltersProps>) => {
39
- const { t } = useTranslation();
40
- const { data, error, status, statusText, className, routing } = props;
41
- const organisations = data && !data.message ? data : [];
42
- const currentOrganisation =
43
- organisations &&
44
- organisations.find((org: any) => org?.uri === routing?.query?.organisation);
45
-
46
- return (
47
- <div className={clsx([styles.filters, className])}>
48
- {currentOrganisation && (
49
- <div
50
- className={clsx("utrecht-badge-list", styles.currentFilter)}
51
- role="list"
52
- >
53
- <Heading level={2} appearanceLevel={3}>
54
- {t("components.current-filter")}
55
- </Heading>
56
- <DataBadgeLink
57
- role="listitem"
58
- aria-pressed={null}
59
- helperText={t("components.remove-filter")}
60
- icon={<Icon name="kruis-inline" />}
61
- href={new URL(`../`, routing?.url).toString()}
62
- >
63
- {styles.badgeLink}
64
- {currentOrganisation?.label}
65
- </DataBadgeLink>
66
- </div>
67
- )}
68
- <Heading level={2} appearanceLevel={3}>
69
- {t("components.filter-by", { type: "organisatie" })}
70
- </Heading>
71
- <LinkList>
72
- {organisations &&
73
- organisations.map((organisation: any) => (
74
- <LinkListLink
75
- className={clsx([
76
- organisation.uri === routing?.query?.organisation &&
77
- styles.active,
78
- ])}
79
- key={organisation.uri}
80
- href={new URL(
81
- `../?organisation=${organisation.uri}`,
82
- routing?.url,
83
- ).toString()}
84
- icon={
85
- <ListLinkIcon
86
- isActive={organisation.uri === routing?.query?.organisation}
87
- />
88
- }
89
- >
90
- {organisation.label}
91
- </LinkListLink>
92
- ))}
93
- </LinkList>
94
-
95
- {error && (
96
- <Alert type="error">
97
- {(error as unknown as any).message ||
98
- (error as unknown as any).error_msg ||
99
- `${status}: ${statusText}` ||
100
- t("components.fuzz-error")}
101
- </Alert>
102
- )}
103
- </div>
104
- );
105
- };
106
-
107
- const TranslatedFilters = (props: PropsWithChildren<FiltersProps>) => {
108
- return (
109
- <I18nextProvider i18n={i18n}>
110
- <Filters {...props} />
111
- </I18nextProvider>
112
- );
113
- };
114
-
115
- export default TranslatedFilters;
1
+ // 'use client';
2
+ /* biome-ignore-all lint: TODO: filters needs a refactor anyway */
3
+
4
+ import {
5
+ Heading,
6
+ LinkList,
7
+ LinkListLink,
8
+ } from "@rijkshuisstijl-community/components-react";
9
+ import clsx from "clsx";
10
+ import type { HTMLProps, PropsWithChildren } from "react";
11
+ import { I18nextProvider, useTranslation } from "react-i18next";
12
+ import Alert from "../alert/Alert";
13
+ import DataBadgeLink from "../dataBadgeLink/DataBadgeLink";
14
+ import i18n from "../i18n";
15
+ import Icon from "../iconsSprite/Icon";
16
+ import styles from "./styles.module.css";
17
+
18
+ export interface FiltersProps extends HTMLProps<HTMLDivElement> {
19
+ routing?: Record<string, any>;
20
+ data: any;
21
+ headers: any;
22
+ error: any;
23
+ status?: number;
24
+ statusText?: string;
25
+ }
26
+
27
+ const ListLinkIcon = ({ isActive }: { isActive: boolean }) => {
28
+ return (
29
+ <Icon
30
+ className={clsx([styles.icon, isActive && styles.active])}
31
+ name={isActive ? "active" : "delta-naar-rechts-inline"}
32
+ />
33
+ );
34
+ };
35
+
36
+ /**
37
+ * @deprecated Use FacetFilters component. This component will be removed in a later version.
38
+ */
39
+ const Filters = (props: PropsWithChildren<FiltersProps>) => {
40
+ const { t } = useTranslation();
41
+ const { data, error, status, statusText, className, routing } = props;
42
+ const organisations = data && !data.message ? data : [];
43
+ const currentOrganisation =
44
+ organisations &&
45
+ organisations.find((org: any) => org?.uri === routing?.query?.organisation);
46
+
47
+ return (
48
+ <div className={clsx([styles.filters, className])}>
49
+ {currentOrganisation && (
50
+ <div
51
+ className={clsx("utrecht-badge-list", styles.currentFilter)}
52
+ role="list"
53
+ >
54
+ <Heading level={2} appearanceLevel={3}>
55
+ {t("components.current-filters")}
56
+ </Heading>
57
+ <DataBadgeLink
58
+ role="listitem"
59
+ aria-pressed={null}
60
+ helperText={t("components.remove-filter")}
61
+ icon={<Icon name="kruis-inline" />}
62
+ href={new URL(`../`, routing?.url).toString()}
63
+ >
64
+ {styles.badgeLink}
65
+ {currentOrganisation?.label}
66
+ </DataBadgeLink>
67
+ </div>
68
+ )}
69
+ <Heading level={2} appearanceLevel={3}>
70
+ {t("components.filter-by", { type: "organisatie" })}
71
+ </Heading>
72
+ <LinkList>
73
+ {organisations &&
74
+ organisations.map((organisation: any) => (
75
+ <LinkListLink
76
+ className={clsx([
77
+ organisation.uri === routing?.query?.organisation &&
78
+ styles.active,
79
+ ])}
80
+ key={organisation.uri}
81
+ href={new URL(
82
+ `../?organisation=${organisation.uri}`,
83
+ routing?.url,
84
+ ).toString()}
85
+ icon={
86
+ <ListLinkIcon
87
+ isActive={organisation.uri === routing?.query?.organisation}
88
+ />
89
+ }
90
+ >
91
+ {organisation.label}
92
+ </LinkListLink>
93
+ ))}
94
+ </LinkList>
95
+
96
+ {error && (
97
+ <Alert type="error">
98
+ {(error as unknown as any).message ||
99
+ (error as unknown as any).error_msg ||
100
+ `${status}: ${statusText}` ||
101
+ t("components.fuzz-error")}
102
+ </Alert>
103
+ )}
104
+ </div>
105
+ );
106
+ };
107
+
108
+ const TranslatedFilters = (props: PropsWithChildren<FiltersProps>) => {
109
+ return (
110
+ <I18nextProvider i18n={i18n}>
111
+ <Filters {...props} />
112
+ </I18nextProvider>
113
+ );
114
+ };
115
+
116
+ export default TranslatedFilters;
@@ -1,26 +1,26 @@
1
- .filters {
2
- display: flex;
3
- flex-direction: column;
4
- row-gap: var(--rhc-space-200);
5
- }
6
-
7
- .currentFilter {
8
- flex-direction: column;
9
- }
10
-
11
- .active {
12
- font-weight: bold;
13
- }
14
-
15
- .icon {
16
- flex-shrink: 0;
17
- transition: transform 0.2s ease-in-out;
18
- }
19
-
20
- :global(.utrecht-link-list__link:hover) .icon:not(.active) {
21
- transform: translateX(0.125rem);
22
- }
23
-
24
- .icon.active {
25
- transform: scale(1.5);
26
- }
1
+ .filters {
2
+ display: flex;
3
+ flex-direction: column;
4
+ row-gap: var(--rhc-space-200);
5
+ }
6
+
7
+ .currentFilter {
8
+ flex-direction: column;
9
+ }
10
+
11
+ .active {
12
+ font-weight: bold;
13
+ }
14
+
15
+ .icon {
16
+ flex-shrink: 0;
17
+ transition: transform 0.2s ease-in-out;
18
+ }
19
+
20
+ :global(.utrecht-link-list__link:hover) .icon:not(.active) {
21
+ transform: translateX(0.125rem);
22
+ }
23
+
24
+ .icon.active {
25
+ transform: scale(1.5);
26
+ }
@@ -1,76 +1,76 @@
1
- import {
2
- LinkList,
3
- LinkListLink,
4
- Footer as RHCFooter,
5
- } from "@rijkshuisstijl-community/components-react";
6
- import clsx from "clsx";
7
- import { type PropsWithChildren, useId } from "react";
8
- import Heading from "../heading/Heading";
9
- import Markdown from "../markdown/Markdown";
10
- import {
11
- type NavBarItem,
12
- processNavBarItems,
13
- } from "../topNavigation/TopNavigation";
14
- import styles from "./styles.module.css";
15
-
16
- export interface ColumnProps {
17
- title: string;
18
- items?: NavBarItem[];
19
- text?: string;
20
- }
21
-
22
- export interface FooterProps extends React.HTMLAttributes<HTMLElement> {
23
- className?: string;
24
- columns?: ColumnProps[];
25
- }
26
-
27
- // TODO: refactor icons together with TopNavigation
28
- const FooterColumns = (props: ColumnProps) => {
29
- const id = useId();
30
- const { title, items, text } = props;
31
- const processedItems = items && processNavBarItems(items);
32
-
33
- return (
34
- <nav className={styles.column} aria-describedby={id}>
35
- <Heading level={2} appearanceLevel={5} id={id}>
36
- {title}
37
- </Heading>
38
- {text && <Markdown>{text}</Markdown>}
39
- {processedItems && (
40
- <LinkList>
41
- {processedItems.map((item, index) => (
42
- <LinkListLink
43
- key={item.id || index}
44
- href={item.href}
45
- icon={item.icon}
46
- >
47
- {item.label}
48
- </LinkListLink>
49
- ))}
50
- </LinkList>
51
- )}
52
- </nav>
53
- );
54
- };
55
-
56
- const Footer = (props: PropsWithChildren<FooterProps>) => {
57
- const { className, columns, ...restProps } = props;
58
- const columnsClass = `numColumns${Math.min(Number(columns?.length), 4)}`;
59
-
60
- return (
61
- <RHCFooter
62
- className={clsx(className, styles.footer, styles[columnsClass])}
63
- background="primary-outlined"
64
- preFooter
65
- {...restProps}
66
- >
67
- {columns &&
68
- columns.length > 0 &&
69
- columns.map((column, index) => (
70
- <FooterColumns key={column.title || index} {...column} />
71
- ))}
72
- </RHCFooter>
73
- );
74
- };
75
-
76
- export default Footer;
1
+ import {
2
+ LinkList,
3
+ LinkListLink,
4
+ Footer as RHCFooter,
5
+ } from "@rijkshuisstijl-community/components-react";
6
+ import clsx from "clsx";
7
+ import { type PropsWithChildren, useId } from "react";
8
+ import Heading from "../heading/Heading";
9
+ import Markdown from "../markdown/Markdown";
10
+ import {
11
+ type NavBarItem,
12
+ processNavBarItems,
13
+ } from "../topNavigation/TopNavigation";
14
+ import styles from "./styles.module.css";
15
+
16
+ export interface ColumnProps {
17
+ title: string;
18
+ items?: NavBarItem[];
19
+ text?: string;
20
+ }
21
+
22
+ export interface FooterProps extends React.HTMLAttributes<HTMLElement> {
23
+ className?: string;
24
+ columns?: ColumnProps[];
25
+ }
26
+
27
+ // TODO: refactor icons together with TopNavigation
28
+ const FooterColumns = (props: ColumnProps) => {
29
+ const id = useId();
30
+ const { title, items, text } = props;
31
+ const processedItems = items && processNavBarItems(items);
32
+
33
+ return (
34
+ <nav className={styles.column} aria-describedby={id}>
35
+ <Heading level={2} appearanceLevel={5} id={id}>
36
+ {title}
37
+ </Heading>
38
+ {text && <Markdown>{text}</Markdown>}
39
+ {processedItems && (
40
+ <LinkList>
41
+ {processedItems.map((item, index) => (
42
+ <LinkListLink
43
+ key={item.id || index}
44
+ href={item.href}
45
+ icon={item.icon}
46
+ >
47
+ {item.label}
48
+ </LinkListLink>
49
+ ))}
50
+ </LinkList>
51
+ )}
52
+ </nav>
53
+ );
54
+ };
55
+
56
+ const Footer = (props: PropsWithChildren<FooterProps>) => {
57
+ const { className, columns, ...restProps } = props;
58
+ const columnsClass = `numColumns${Math.min(Number(columns?.length), 4)}`;
59
+
60
+ return (
61
+ <RHCFooter
62
+ className={clsx(className, styles.footer, styles[columnsClass])}
63
+ background="primary-outlined"
64
+ preFooter
65
+ {...restProps}
66
+ >
67
+ {columns &&
68
+ columns.length > 0 &&
69
+ columns.map((column, index) => (
70
+ <FooterColumns key={column.title || index} {...column} />
71
+ ))}
72
+ </RHCFooter>
73
+ );
74
+ };
75
+
76
+ export default Footer;
@@ -1,103 +1,103 @@
1
- .footer {
2
- --utrecht-page-footer-padding-block-end: 2rem;
3
- --utrecht-page-footer-padding-block-start: 1rem;
4
- --utrecht-page-footer-padding-inline-end: var(
5
- --rhc-nav-bar-link-padding-inline-end
6
- );
7
- --utrecht-page-footer-padding-inline-start: var(
8
- --rhc-nav-bar-link-padding-inline-start
9
- );
10
- --rhc-page-footer-outlined-color: #154273;
11
- --rhc-page-footer-outlined-border-color: var(--rhc-nav-bar-border-color);
12
- --rhc-page-footer-border-block-start-width: var(
13
- --rhc-nav-bar-border-block-end-width
14
- );
15
- }
16
-
17
- .footer {
18
- :global(.utrecht-column-layout) {
19
- display: flex;
20
- justify-content: space-between;
21
- inline-size: 100%;
22
-
23
- > * {
24
- flex-grow: 0;
25
- flex-shrink: 0;
26
- }
27
- }
28
-
29
- &.numColumns,
30
- &.numColumns1 {
31
- :global(.utrecht-column-layout) {
32
- row-gap: 0.5rem;
33
-
34
- > * {
35
- flex-basis: 100%;
36
- }
37
- }
38
- }
39
-
40
- &.numColumns2 {
41
- :global(.utrecht-column-layout) {
42
- > * {
43
- flex-basis: calc(50% - var(--utrecht-column-layout-gap, 2em));
44
- }
45
- }
46
- }
47
-
48
- &.numColumns3 {
49
- :global(.utrecht-column-layout) {
50
- > * {
51
- flex-basis: calc(33.333% - var(--utrecht-column-layout-gap, 2em));
52
- }
53
- }
54
- }
55
- &.numColumns4 {
56
- :global(.utrecht-column-layout) {
57
- flex-wrap: wrap;
58
-
59
- > * {
60
- flex-basis: calc(25% - var(--utrecht-column-layout-gap, 2em));
61
- }
62
- }
63
- }
64
-
65
- :global(.utrecht-link-list__link) {
66
- align-items: center;
67
- :global(.don-icon-externe-link-inline) {
68
- order: 1;
69
- }
70
- }
71
- }
72
-
73
- @media (--xs-and-below-viewport) {
74
- .footer.footer {
75
- :global(.utrecht-column-layout) {
76
- row-gap: 0.5rem;
77
-
78
- > * {
79
- flex-basis: calc(50% - var(--utrecht-column-layout-gap, 2em));
80
- }
81
- }
82
- }
83
- }
84
-
85
- @media (--xxs-and-below-viewport) {
86
- .footer.footer {
87
- :global(.utrecht-column-layout) {
88
- row-gap: 0.5rem;
89
-
90
- > * {
91
- flex-basis: 100%;
92
- }
93
- }
94
- }
95
- }
96
-
97
- :global(.rhc-page-prefooter.rhc-page-prefooter) {
98
- margin-block-start: 2rem;
99
-
100
- &:before {
101
- background-color: var(--rhc-nav-bar-border-color);
102
- }
103
- }
1
+ .footer {
2
+ --utrecht-page-footer-padding-block-end: 2rem;
3
+ --utrecht-page-footer-padding-block-start: 1rem;
4
+ --utrecht-page-footer-padding-inline-end: var(
5
+ --rhc-nav-bar-link-padding-inline-end
6
+ );
7
+ --utrecht-page-footer-padding-inline-start: var(
8
+ --rhc-nav-bar-link-padding-inline-start
9
+ );
10
+ --rhc-page-footer-outlined-color: #154273;
11
+ --rhc-page-footer-outlined-border-color: var(--rhc-nav-bar-border-color);
12
+ --rhc-page-footer-border-block-start-width: var(
13
+ --rhc-nav-bar-border-block-end-width
14
+ );
15
+ }
16
+
17
+ .footer {
18
+ :global(.utrecht-column-layout) {
19
+ display: flex;
20
+ justify-content: space-between;
21
+ inline-size: 100%;
22
+
23
+ > * {
24
+ flex-grow: 0;
25
+ flex-shrink: 0;
26
+ }
27
+ }
28
+
29
+ &.numColumns,
30
+ &.numColumns1 {
31
+ :global(.utrecht-column-layout) {
32
+ row-gap: 0.5rem;
33
+
34
+ > * {
35
+ flex-basis: 100%;
36
+ }
37
+ }
38
+ }
39
+
40
+ &.numColumns2 {
41
+ :global(.utrecht-column-layout) {
42
+ > * {
43
+ flex-basis: calc(50% - var(--utrecht-column-layout-gap, 2em));
44
+ }
45
+ }
46
+ }
47
+
48
+ &.numColumns3 {
49
+ :global(.utrecht-column-layout) {
50
+ > * {
51
+ flex-basis: calc(33.333% - var(--utrecht-column-layout-gap, 2em));
52
+ }
53
+ }
54
+ }
55
+ &.numColumns4 {
56
+ :global(.utrecht-column-layout) {
57
+ flex-wrap: wrap;
58
+
59
+ > * {
60
+ flex-basis: calc(25% - var(--utrecht-column-layout-gap, 2em));
61
+ }
62
+ }
63
+ }
64
+
65
+ :global(.utrecht-link-list__link) {
66
+ align-items: center;
67
+ :global(.don-icon-externe-link-inline) {
68
+ order: 1;
69
+ }
70
+ }
71
+ }
72
+
73
+ @media (--xs-and-below-viewport) {
74
+ .footer.footer {
75
+ :global(.utrecht-column-layout) {
76
+ row-gap: 0.5rem;
77
+
78
+ > * {
79
+ flex-basis: calc(50% - var(--utrecht-column-layout-gap, 2em));
80
+ }
81
+ }
82
+ }
83
+ }
84
+
85
+ @media (--xxs-and-below-viewport) {
86
+ .footer.footer {
87
+ :global(.utrecht-column-layout) {
88
+ row-gap: 0.5rem;
89
+
90
+ > * {
91
+ flex-basis: 100%;
92
+ }
93
+ }
94
+ }
95
+ }
96
+
97
+ :global(.rhc-page-prefooter.rhc-page-prefooter) {
98
+ margin-block-start: 2rem;
99
+
100
+ &:before {
101
+ background-color: var(--rhc-nav-bar-border-color);
102
+ }
103
+ }