@dsn-starter-kit/components-react 1.0.1 → 2.0.0

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 (69) hide show
  1. package/README.md +1 -1
  2. package/dist/ActionGroup/ActionGroup.css +62 -22
  3. package/dist/ActionGroup/ActionGroup.d.ts +10 -2
  4. package/dist/ActionGroup/ActionGroup.d.ts.map +1 -1
  5. package/dist/ActionGroup/ActionGroup.js +20 -2
  6. package/dist/ActionGroup/ActionGroup.js.map +1 -1
  7. package/dist/Alert/Alert.css +25 -11
  8. package/dist/Alert/Alert.d.ts +14 -0
  9. package/dist/Alert/Alert.d.ts.map +1 -1
  10. package/dist/Alert/Alert.js +14 -2
  11. package/dist/Alert/Alert.js.map +1 -1
  12. package/dist/BreakoutSection/BreakoutSection.css +4 -0
  13. package/dist/Details/Details.css +14 -0
  14. package/dist/DotBadge/DotBadge.css +13 -0
  15. package/dist/File/File.css +16 -0
  16. package/dist/Grid/Grid.css +2 -2
  17. package/dist/HeadingGroup/HeadingGroup.css +5 -0
  18. package/dist/HeadingGroup/HeadingGroup.d.ts +23 -0
  19. package/dist/HeadingGroup/HeadingGroup.d.ts.map +1 -0
  20. package/dist/HeadingGroup/HeadingGroup.js +12 -0
  21. package/dist/HeadingGroup/HeadingGroup.js.map +1 -0
  22. package/dist/HeadingGroup/index.d.ts +3 -0
  23. package/dist/HeadingGroup/index.d.ts.map +1 -0
  24. package/dist/HeadingGroup/index.js +2 -0
  25. package/dist/HeadingGroup/index.js.map +1 -0
  26. package/dist/Hero/Hero.css +642 -0
  27. package/dist/Note/Note.css +22 -14
  28. package/dist/Note/Note.d.ts +18 -3
  29. package/dist/Note/Note.d.ts.map +1 -1
  30. package/dist/Note/Note.js +18 -5
  31. package/dist/Note/Note.js.map +1 -1
  32. package/dist/PageBody/PageBody.css +30 -0
  33. package/dist/PageFooter/PageFooter.css +0 -1
  34. package/dist/PageHeader/PageHeader.css +13 -0
  35. package/dist/PreHeading/PreHeading.css +10 -0
  36. package/dist/PreHeading/PreHeading.d.ts +8 -0
  37. package/dist/PreHeading/PreHeading.d.ts.map +1 -0
  38. package/dist/PreHeading/PreHeading.js +9 -0
  39. package/dist/PreHeading/PreHeading.js.map +1 -0
  40. package/dist/PreHeading/index.d.ts +3 -0
  41. package/dist/PreHeading/index.d.ts.map +1 -0
  42. package/dist/PreHeading/index.js +2 -0
  43. package/dist/PreHeading/index.js.map +1 -0
  44. package/dist/ProgressBar/ProgressBar.css +14 -0
  45. package/dist/ProgressBar/ProgressBar.d.ts +7 -2
  46. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  47. package/dist/ProgressBar/ProgressBar.js +2 -2
  48. package/dist/ProgressBar/ProgressBar.js.map +1 -1
  49. package/dist/Radio/Radio.css +36 -0
  50. package/dist/SearchInput/SearchInput.css +8 -0
  51. package/dist/Select/Select.css +8 -0
  52. package/dist/SkipLink/SkipLink.d.ts +1 -1
  53. package/dist/SkipLink/SkipLink.js +1 -1
  54. package/dist/Spinner/Spinner.css +17 -0
  55. package/dist/TableOfContents/TableOfContents.css +75 -0
  56. package/dist/TableOfContents/TableOfContents.d.ts +61 -0
  57. package/dist/TableOfContents/TableOfContents.d.ts.map +1 -0
  58. package/dist/TableOfContents/TableOfContents.js +32 -0
  59. package/dist/TableOfContents/TableOfContents.js.map +1 -0
  60. package/dist/TableOfContents/index.d.ts +3 -0
  61. package/dist/TableOfContents/index.d.ts.map +1 -0
  62. package/dist/TableOfContents/index.js +2 -0
  63. package/dist/TableOfContents/index.js.map +1 -0
  64. package/dist/index.css +1019 -50
  65. package/dist/index.d.ts +3 -0
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +3 -0
  68. package/dist/index.js.map +1 -1
  69. package/package.json +3 -3
@@ -8,34 +8,42 @@
8
8
  * Visually highlighted message for supplementary or important information.
9
9
  * Passive counterpart to Alert — no live region, read on navigation only.
10
10
  *
11
+ * The icon is decorative (aria-hidden); the non-neutral variants (info,
12
+ * positive, negative, warning) carry a visually hidden variant label that
13
+ * announces the variant to screen reader users: "Informatie: " / "Succes: " /
14
+ * "Foutmelding: " / "Let op: ". With a heading the label is the first child of
15
+ * the heading; without a heading it is a standalone span before the content.
16
+ * Neutral has no label: that variant deliberately carries no semantic signal.
17
+ *
11
18
  * Usage:
12
- * <!-- Neutral (default), with icon and heading -->
19
+ * <!-- Neutral (default), with icon and heading — no variant label -->
13
20
  * <div class="dsn-note">
14
21
  * <span class="dsn-note__icon" aria-hidden="true">
15
- * <svg class="dsn-icon" aria-hidden="true"><!-- info-circle --></svg>
22
+ * <svg class="dsn-icon dsn-icon--xl" aria-hidden="true"><!-- info-circle --></svg>
16
23
  * </span>
17
- * <strong class="dsn-heading dsn-heading--3 dsn-note__heading">Let op</strong>
24
+ * <h3 class="dsn-heading dsn-heading--heading-3 dsn-note__heading">Let op</h3>
18
25
  * <div class="dsn-note__content">
19
26
  * <p>Aanvullende informatie over dit onderwerp.</p>
20
27
  * </div>
21
28
  * </div>
22
29
  *
23
- * <!-- Info variant -->
30
+ * <!-- Info variant, with visually hidden variant label -->
24
31
  * <div class="dsn-note dsn-note--info">
25
32
  * <span class="dsn-note__icon" aria-hidden="true">
26
- * <svg class="dsn-icon" aria-hidden="true"><!-- info-circle --></svg>
33
+ * <svg class="dsn-icon dsn-icon--xl" aria-hidden="true"><!-- info-circle --></svg>
27
34
  * </span>
28
- * <strong class="dsn-heading dsn-heading--3 dsn-note__heading">Informatie</strong>
35
+ * <h3 class="dsn-heading dsn-heading--heading-3 dsn-note__heading"><span class="dsn-visually-hidden">Informatie: </span>Heading</h3>
29
36
  * <div class="dsn-note__content">
30
37
  * <p>Body content.</p>
31
38
  * </div>
32
39
  * </div>
33
40
  *
34
- * <!-- Without heading — icon spans both rows -->
35
- * <div class="dsn-note dsn-note--no-heading">
41
+ * <!-- Without heading — icon spans both rows, variant label as standalone span -->
42
+ * <div class="dsn-note dsn-note--warning dsn-note--no-heading">
36
43
  * <span class="dsn-note__icon" aria-hidden="true">
37
- * <svg class="dsn-icon" aria-hidden="true"><!-- info-circle --></svg>
44
+ * <svg class="dsn-icon dsn-icon--xl" aria-hidden="true"><!-- alert-triangle --></svg>
38
45
  * </span>
46
+ * <span class="dsn-visually-hidden">Let op: </span>
39
47
  * <div class="dsn-note__content">
40
48
  * <p>Aanvullende informatie.</p>
41
49
  * </div>
@@ -46,15 +54,15 @@
46
54
  * ...
47
55
  * </aside>
48
56
  *
49
- * <!-- as="nav" — table of contents -->
57
+ * <!-- as="nav" — standalone navigation section (not a page table of contents: use TableOfContents) -->
50
58
  * <nav class="dsn-note" aria-labelledby="note-heading-id">
51
59
  * <span class="dsn-note__icon" aria-hidden="true">
52
- * <svg class="dsn-icon" aria-hidden="true"><!-- info-circle --></svg>
60
+ * <svg class="dsn-icon dsn-icon--xl" aria-hidden="true"><!-- info-circle --></svg>
53
61
  * </span>
54
- * <strong class="dsn-heading dsn-heading--3 dsn-note__heading" id="note-heading-id">Op deze pagina</strong>
55
- * <nav class="dsn-note__content">
62
+ * <h3 class="dsn-heading dsn-heading--heading-3 dsn-note__heading" id="note-heading-id">Related pages</h3>
63
+ * <div class="dsn-note__content">
56
64
  * <ul>...</ul>
57
- * </nav>
65
+ * </div>
58
66
  * </nav>
59
67
  */
60
68
 
@@ -29,6 +29,16 @@ export interface NoteProps extends React.HTMLAttributes<HTMLElement> {
29
29
  * - `ReactNode` — aangepast icoon
30
30
  */
31
31
  iconStart?: React.ReactNode;
32
+ /**
33
+ * Visueel verborgen tekst die de variant benoemt voor screenreadergebruikers
34
+ * (inclusief scheidingsteken en spatie). Komt vóór de heading, of vóór de
35
+ * content als er geen heading is.
36
+ * - `undefined` (default) — standaardtekst per variant:
37
+ * `''` (neutral) / `'Informatie: '` / `'Succes: '` / `'Foutmelding: '` / `'Let op: '`
38
+ * - `''` — geen variant-label (bijv. als de heading de variant al benoemt)
39
+ * - `string` — eigen tekst, bijv. voor een andere taal
40
+ */
41
+ variantLabel?: string;
32
42
  /**
33
43
  * Body-content: tekst, lijst, links, etc.
34
44
  */
@@ -61,10 +71,10 @@ export interface NoteProps extends React.HTMLAttributes<HTMLElement> {
61
71
  * <Paragraph>Meer context.</Paragraph>
62
72
  * </Note>
63
73
  *
64
- * // as="nav" — inhoudsopgave
65
- * <Note as="nav" variant="neutral" heading="Op deze pagina" headingLevel={2}>
74
+ * // as="nav" — eigenstandige navigatiesectie (niet voor een pagina-inhoudsopgave: gebruik TableOfContents)
75
+ * <Note as="nav" variant="neutral" heading="Gerelateerde pagina's" headingLevel={2}>
66
76
  * <UnorderedList>
67
- * <li><Link href="#sectie-1">Sectie 1</Link></li>
77
+ * <li><Link href="/gerelateerd-1">Gerelateerde pagina 1</Link></li>
68
78
  * </UnorderedList>
69
79
  * </Note>
70
80
  *
@@ -72,6 +82,11 @@ export interface NoteProps extends React.HTMLAttributes<HTMLElement> {
72
82
  * <Note variant="info" heading="Opmerking" iconStart={null}>
73
83
  * <Paragraph>Zonder icoon.</Paragraph>
74
84
  * </Note>
85
+ *
86
+ * // Variant-label onderdrukken (heading benoemt de variant al)
87
+ * <Note variant="warning" heading="Waarschuwing" variantLabel="">
88
+ * <Paragraph>Dit heeft gevolgen voor uw aanvraag.</Paragraph>
89
+ * </Note>
75
90
  * ```
76
91
  */
77
92
  export declare const Note: React.ForwardRefExoticComponent<NoteProps & React.RefAttributes<HTMLElement>>;
@@ -1 +1 @@
1
- {"version":3,"file":"Note.d.ts","sourceRoot":"","sources":["../../src/Note/Note.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgB,MAAM,OAAO,CAAC;AAIrC,OAAO,YAAY,CAAC;AAEpB,MAAM,MAAM,WAAW,GACnB,SAAS,GACT,MAAM,GACN,UAAU,GACV,UAAU,GACV,SAAS,CAAC;AACd,MAAM,MAAM,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,CAAC;AAUzD,MAAM,WAAW,SAAU,SAAQ,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC;IAClE;;;OAGG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAErC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE5B;;OAEG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,eAAO,MAAM,IAAI,+EAqEhB,CAAC"}
1
+ {"version":3,"file":"Note.d.ts","sourceRoot":"","sources":["../../src/Note/Note.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgB,MAAM,OAAO,CAAC;AAIrC,OAAO,YAAY,CAAC;AAEpB,MAAM,MAAM,WAAW,GACnB,SAAS,GACT,MAAM,GACN,UAAU,GACV,UAAU,GACV,SAAS,CAAC;AACd,MAAM,MAAM,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,CAAC;AAkBzD,MAAM,WAAW,SAAU,SAAQ,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC;IAClE;;;OAGG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAErC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE5B;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,eAAO,MAAM,IAAI,+EA+EhB,CAAC"}
package/dist/Note/Note.js CHANGED
@@ -11,6 +11,13 @@ const PREFERRED_ICONS = {
11
11
  negative: 'exclamation-circle',
12
12
  warning: 'alert-triangle',
13
13
  };
14
+ const VARIANT_LABELS = {
15
+ neutral: '',
16
+ info: 'Informatie: ',
17
+ positive: 'Succes: ',
18
+ negative: 'Foutmelding: ',
19
+ warning: 'Let op: ',
20
+ };
14
21
  /**
15
22
  * Note component
16
23
  * Visueel uitgelicht bericht voor aanvullende of belangrijke informatie.
@@ -38,10 +45,10 @@ const PREFERRED_ICONS = {
38
45
  * <Paragraph>Meer context.</Paragraph>
39
46
  * </Note>
40
47
  *
41
- * // as="nav" — inhoudsopgave
42
- * <Note as="nav" variant="neutral" heading="Op deze pagina" headingLevel={2}>
48
+ * // as="nav" — eigenstandige navigatiesectie (niet voor een pagina-inhoudsopgave: gebruik TableOfContents)
49
+ * <Note as="nav" variant="neutral" heading="Gerelateerde pagina's" headingLevel={2}>
43
50
  * <UnorderedList>
44
- * <li><Link href="#sectie-1">Sectie 1</Link></li>
51
+ * <li><Link href="/gerelateerd-1">Gerelateerde pagina 1</Link></li>
45
52
  * </UnorderedList>
46
53
  * </Note>
47
54
  *
@@ -49,12 +56,18 @@ const PREFERRED_ICONS = {
49
56
  * <Note variant="info" heading="Opmerking" iconStart={null}>
50
57
  * <Paragraph>Zonder icoon.</Paragraph>
51
58
  * </Note>
59
+ *
60
+ * // Variant-label onderdrukken (heading benoemt de variant al)
61
+ * <Note variant="warning" heading="Waarschuwing" variantLabel="">
62
+ * <Paragraph>Dit heeft gevolgen voor uw aanvraag.</Paragraph>
63
+ * </Note>
52
64
  * ```
53
65
  */
54
- export const Note = React.forwardRef(({ as: As = 'div', className, variant = 'neutral', heading, headingLevel = 3, iconStart, children, ...props }, ref) => {
66
+ export const Note = React.forwardRef(({ as: As = 'div', className, variant = 'neutral', heading, headingLevel = 3, iconStart, variantLabel, children, ...props }, ref) => {
55
67
  const headingId = useId();
56
68
  const noIcon = iconStart === null;
57
69
  const noHeading = !heading;
70
+ const resolvedVariantLabel = variantLabel ?? VARIANT_LABELS[variant];
58
71
  const resolvedIcon = iconStart === undefined ? (_jsx(Icon, { name: PREFERRED_ICONS[variant], size: "xl", "aria-hidden": true })) : (iconStart);
59
72
  const classes = classNames('dsn-note', variant !== 'neutral' && `dsn-note--${variant}`, noHeading && 'dsn-note--no-heading', className);
60
73
  // For landmark elements with a heading, add aria-labelledby automatically
@@ -62,7 +75,7 @@ export const Note = React.forwardRef(({ as: As = 'div', className, variant = 'ne
62
75
  const labelledBy = isLandmark && heading && !props['aria-label'] && !props['aria-labelledby']
63
76
  ? headingId
64
77
  : undefined;
65
- return (_jsxs(As, { ref: ref, className: classes, "aria-labelledby": labelledBy, ...props, children: [!noIcon && (_jsx("span", { className: "dsn-note__icon", "aria-hidden": true, children: resolvedIcon })), heading && (_jsx(Heading, { level: headingLevel, appearance: "heading-3", className: "dsn-note__heading", id: isLandmark ? headingId : undefined, children: heading })), children && _jsx("div", { className: "dsn-note__content", children: children })] }));
78
+ return (_jsxs(As, { ref: ref, className: classes, "aria-labelledby": labelledBy, ...props, children: [!noIcon && (_jsx("span", { className: "dsn-note__icon", "aria-hidden": true, children: resolvedIcon })), heading && (_jsxs(Heading, { level: headingLevel, appearance: "heading-3", className: "dsn-note__heading", id: isLandmark ? headingId : undefined, children: [resolvedVariantLabel && (_jsx("span", { className: "dsn-visually-hidden", children: resolvedVariantLabel })), heading] })), noHeading && resolvedVariantLabel && (_jsx("span", { className: "dsn-visually-hidden", children: resolvedVariantLabel })), children && _jsx("div", { className: "dsn-note__content", children: children })] }));
66
79
  });
67
80
  Note.displayName = 'Note';
68
81
  //# sourceMappingURL=Note.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Note.js","sourceRoot":"","sources":["../../src/Note/Note.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,YAAY,CAAC;AAUpB,MAAM,eAAe,GAAgC;IACnD,OAAO,EAAE,aAAa;IACtB,IAAI,EAAE,aAAa;IACnB,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,oBAAoB;IAC9B,OAAO,EAAE,gBAAgB;CAC1B,CAAC;AAwCF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAClC,CACE,EACE,EAAE,EAAE,EAAE,GAAG,KAAK,EACd,SAAS,EACT,OAAO,GAAG,SAAS,EACnB,OAAO,EACP,YAAY,GAAG,CAAC,EAChB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EACD,GAAG,EACH,EAAE;IACF,MAAM,SAAS,GAAG,KAAK,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAClC,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC;IAE3B,MAAM,YAAY,GAChB,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,CACxB,KAAC,IAAI,IACH,IAAI,EAAE,eAAe,CAAC,OAAO,CAAuC,EACpE,IAAI,EAAC,IAAI,wBAET,CACH,CAAC,CAAC,CAAC,CACF,SAAS,CACV,CAAC;IAEJ,MAAM,OAAO,GAAG,UAAU,CACxB,UAAU,EACV,OAAO,KAAK,SAAS,IAAI,aAAa,OAAO,EAAE,EAC/C,SAAS,IAAI,sBAAsB,EACnC,SAAS,CACV,CAAC;IAEF,0EAA0E;IAC1E,MAAM,UAAU,GAAG,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,OAAO,IAAI,EAAE,KAAK,SAAS,CAAC;IACtE,MAAM,UAAU,GACd,UAAU,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC;QACxE,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO,CACL,MAAC,EAAE,IACD,GAAG,EAAE,GAAgC,EACrC,SAAS,EAAE,OAAO,qBACD,UAAU,KACvB,KAAK,aAER,CAAC,MAAM,IAAI,CACV,eAAM,SAAS,EAAC,gBAAgB,iCAC7B,YAAY,GACR,CACR,EACA,OAAO,IAAI,CACV,KAAC,OAAO,IACN,KAAK,EAAE,YAAY,EACnB,UAAU,EAAC,WAAW,EACtB,SAAS,EAAC,mBAAmB,EAC7B,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,YAErC,OAAO,GACA,CACX,EACA,QAAQ,IAAI,cAAK,SAAS,EAAC,mBAAmB,YAAE,QAAQ,GAAO,IAC7D,CACN,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC"}
1
+ {"version":3,"file":"Note.js","sourceRoot":"","sources":["../../src/Note/Note.tsx"],"names":[],"mappings":"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"}
@@ -67,3 +67,33 @@
67
67
  background-color: transparent;
68
68
  }
69
69
 
70
+ /* =============================================================================
71
+ Sidebar layout — Table of Contents kolom (rechts)
72
+ De ToC-inhoud wordt twee keer gerenderd: één keer inline (onder H1/lead,
73
+ zichtbaar tot 80em) en één keer als rechterkolom (zichtbaar vanaf 80em).
74
+ `display: none` sluit de verborgen kopie uit van de accessibility tree,
75
+ dus er is nooit dubbele content voor schermlezers.
76
+ ============================================================================= */
77
+
78
+ .dsn-sidebar-layout__toc-inline {
79
+ display: block;
80
+ }
81
+
82
+ .dsn-sidebar-layout__toc {
83
+ display: none;
84
+ }
85
+
86
+ @media (min-width: 80em) {
87
+ .dsn-sidebar-layout__toc-inline {
88
+ display: none;
89
+ }
90
+
91
+ .dsn-sidebar-layout__toc {
92
+ display: block;
93
+ flex-shrink: 0;
94
+ inline-size: var(--dsn-sidebar-layout-toc-inline-size, 16rem);
95
+ padding-inline-start: var(--dsn-space-inline-2xl);
96
+ padding-block: var(--dsn-space-block-3xl);
97
+ }
98
+ }
99
+
@@ -25,7 +25,6 @@
25
25
  ============================================================================= */
26
26
 
27
27
  .dsn-page-footer {
28
- --dsn-grid-margin: 0;
29
28
  background-color: var(--dsn-page-footer-background-color);
30
29
  border-block-start: var(--dsn-page-footer-border-block-start-width) solid
31
30
  var(--dsn-page-footer-border-block-start-color);
@@ -78,6 +78,19 @@
78
78
  }
79
79
  }
80
80
 
81
+ /* =============================================================================
82
+ Forced colors (High Contrast mode)
83
+ Default variant mist op large viewport een border-block-end (navbar neemt de
84
+ visuele scheiding over). In forced-colors mode is die achtergrondkleur niet
85
+ zichtbaar, dus de border herstellen voor sectieafbakening.
86
+ ============================================================================= */
87
+
88
+ @media (forced-colors: active) and (min-width: 64em) {
89
+ .dsn-page-header:not(.dsn-page-header--compact) {
90
+ border-block-end: var(--dsn-border-width-thick) solid transparent;
91
+ }
92
+ }
93
+
81
94
  /* =============================================================================
82
95
  Masthead (large viewport) — neutrale achtergrond, logo + servicemenu + zoek
83
96
  ============================================================================= */
@@ -0,0 +1,10 @@
1
+ .dsn-pre-heading {
2
+ display: block;
3
+ color: var(--dsn-pre-heading-color);
4
+ font-family: var(--dsn-pre-heading-font-family);
5
+ font-size: var(--dsn-pre-heading-font-size);
6
+ font-weight: var(--dsn-pre-heading-font-weight);
7
+ line-height: var(--dsn-pre-heading-line-height);
8
+ margin-block-end: var(--dsn-pre-heading-margin-block-end);
9
+ }
10
+
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import './PreHeading.css';
3
+ export interface PreHeadingProps extends React.HTMLAttributes<HTMLSpanElement> {
4
+ children?: React.ReactNode;
5
+ className?: string;
6
+ }
7
+ export declare const PreHeading: React.ForwardRefExoticComponent<PreHeadingProps & React.RefAttributes<HTMLSpanElement>>;
8
+ //# sourceMappingURL=PreHeading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreHeading.d.ts","sourceRoot":"","sources":["../../src/PreHeading/PreHeading.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,kBAAkB,CAAC;AAE1B,MAAM,WAAW,eAAgB,SAAQ,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC;IAC5E,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,UAAU,yFAYtB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { classNames } from '@dsn-starter-kit/core';
4
+ import './PreHeading.css';
5
+ export const PreHeading = React.forwardRef(({ children, className, ...props }, ref) => {
6
+ return (_jsx("span", { ref: ref, className: classNames('dsn-pre-heading', className), ...props, children: children }));
7
+ });
8
+ PreHeading.displayName = 'PreHeading';
9
+ //# sourceMappingURL=PreHeading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreHeading.js","sourceRoot":"","sources":["../../src/PreHeading/PreHeading.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,kBAAkB,CAAC;AAO1B,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CACxC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IACzC,OAAO,CACL,eACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,UAAU,CAAC,iBAAiB,EAAE,SAAS,CAAC,KAC/C,KAAK,YAER,QAAQ,GACJ,CACR,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { PreHeading } from './PreHeading';
2
+ export type { PreHeadingProps } from './PreHeading';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/PreHeading/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { PreHeading } from './PreHeading';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/PreHeading/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
@@ -82,6 +82,20 @@
82
82
  margin-block-start: var(--dsn-progress-bar-gap-footer);
83
83
  }
84
84
 
85
+ /* Forced colors (High Contrast mode)
86
+ appearance: none schakelt alle browser-styling uit waardoor track en fill
87
+ onzichtbaar worden. appearance: auto herstelt de native progress-stijl
88
+ zodat de browser zijn eigen system colors toepast. */
89
+ @media (forced-colors: active) {
90
+ .dsn-progress-bar__bar {
91
+ appearance: auto;
92
+ block-size: revert;
93
+ border: revert;
94
+ border-radius: revert;
95
+ background-color: revert;
96
+ }
97
+ }
98
+
85
99
  @media (prefers-reduced-motion: reduce) {
86
100
  .dsn-progress-bar__bar::-webkit-progress-value,
87
101
  .dsn-progress-bar__bar::-moz-progress-bar {
@@ -3,7 +3,7 @@ import './ProgressBar.css';
3
3
  export interface ProgressBarProps extends React.HTMLAttributes<HTMLDivElement> {
4
4
  /**
5
5
  * Visueel verborgen label dat de voortgangsbalk beschrijft voor screenreaders.
6
- * Altijd vereist — gekoppeld via <label for> aan het <progress>-element.
6
+ * Altijd vereist — gekoppeld via `<label for>` aan het `<progress>`-element.
7
7
  */
8
8
  label: string;
9
9
  /**
@@ -20,10 +20,15 @@ export interface ProgressBarProps extends React.HTMLAttributes<HTMLDivElement> {
20
20
  */
21
21
  description?: React.ReactNode;
22
22
  /**
23
- * ID voor het <progress>-element en de bijbehorende <label>.
23
+ * ID voor het `<progress>`-element en de bijbehorende `<label>`.
24
24
  * Automatisch gegenereerd via useId() indien weggelaten.
25
25
  */
26
26
  id?: string;
27
+ /**
28
+ * Verbergt het zichtbare percentage-getal. Gebruik dit voor decoratief gebruik
29
+ * in combinatie met aria-hidden="true" op de component.
30
+ */
31
+ hideValue?: boolean;
27
32
  }
28
33
  /**
29
34
  * ProgressBar component
@@ -1 +1 @@
1
- {"version":3,"file":"ProgressBar.d.ts","sourceRoot":"","sources":["../../src/ProgressBar/ProgressBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgB,MAAM,OAAO,CAAC;AAErC,OAAO,mBAAmB,CAAC;AAE3B,MAAM,WAAW,gBAAiB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC5E;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE9B;;;OAGG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,WAAW,yFAuCvB,CAAC"}
1
+ {"version":3,"file":"ProgressBar.d.ts","sourceRoot":"","sources":["../../src/ProgressBar/ProgressBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgB,MAAM,OAAO,CAAC;AAErC,OAAO,mBAAmB,CAAC;AAE3B,MAAM,WAAW,gBAAiB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC5E;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE9B;;;OAGG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,WAAW,yFAqDvB,CAAC"}
@@ -26,11 +26,11 @@ import './ProgressBar.css';
26
26
  * <ProgressBar label="Stap voortgang" value={3} max={7} />
27
27
  * ```
28
28
  */
29
- export const ProgressBar = React.forwardRef(({ className, label, value, max = 100, description, id, ...props }, ref) => {
29
+ export const ProgressBar = React.forwardRef(({ className, label, value, max = 100, description, hideValue, id, ...props }, ref) => {
30
30
  const generatedId = useId();
31
31
  const progressId = id ?? generatedId;
32
32
  const percentage = Math.round((value / max) * 100);
33
- return (_jsxs("div", { ref: ref, className: classNames('dsn-progress-bar', className), ...props, children: [_jsx("label", { className: "dsn-visually-hidden", htmlFor: progressId, children: label }), _jsx("div", { className: "dsn-progress-bar__header", children: _jsxs("p", { className: "dsn-paragraph dsn-progress-bar__percentage", "aria-hidden": "true", children: [percentage, "%"] }) }), _jsxs("progress", { id: progressId, className: "dsn-progress-bar__bar", value: value, max: max, children: [percentage, "%"] }), description && (_jsx("p", { className: "dsn-paragraph dsn-progress-bar__description", children: description }))] }));
33
+ return (_jsxs("div", { ref: ref, className: classNames('dsn-progress-bar', className), ...props, children: [_jsx("label", { className: "dsn-visually-hidden", htmlFor: progressId, children: label }), !hideValue && (_jsx("div", { className: "dsn-progress-bar__header", children: _jsxs("p", { className: "dsn-paragraph dsn-progress-bar__percentage", "aria-hidden": "true", children: [percentage, "%"] }) })), _jsxs("progress", { id: progressId, className: "dsn-progress-bar__bar", value: value, max: max, children: [percentage, "%"] }), description && (_jsx("p", { className: "dsn-paragraph dsn-progress-bar__description", children: description }))] }));
34
34
  });
35
35
  ProgressBar.displayName = 'ProgressBar';
36
36
  //# sourceMappingURL=ProgressBar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProgressBar.js","sourceRoot":"","sources":["../../src/ProgressBar/ProgressBar.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,mBAAmB,CAAC;AAgC3B;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CACzC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IACzE,MAAM,WAAW,GAAG,KAAK,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,EAAE,IAAI,WAAW,CAAC;IACrC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;IAEnD,OAAO,CACL,eACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,UAAU,CAAC,kBAAkB,EAAE,SAAS,CAAC,KAChD,KAAK,aAET,gBAAO,SAAS,EAAC,qBAAqB,EAAC,OAAO,EAAE,UAAU,YACvD,KAAK,GACA,EACR,cAAK,SAAS,EAAC,0BAA0B,YACvC,aACE,SAAS,EAAC,4CAA4C,iBAC1C,MAAM,aAEjB,UAAU,SACT,GACA,EACN,oBACE,EAAE,EAAE,UAAU,EACd,SAAS,EAAC,uBAAuB,EACjC,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,GAAG,aAEP,UAAU,SACF,EACV,WAAW,IAAI,CACd,YAAG,SAAS,EAAC,6CAA6C,YACvD,WAAW,GACV,CACL,IACG,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC"}
1
+ {"version":3,"file":"ProgressBar.js","sourceRoot":"","sources":["../../src/ProgressBar/ProgressBar.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,mBAAmB,CAAC;AAsC3B;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CACzC,CACE,EACE,SAAS,EACT,KAAK,EACL,KAAK,EACL,GAAG,GAAG,GAAG,EACT,WAAW,EACX,SAAS,EACT,EAAE,EACF,GAAG,KAAK,EACT,EACD,GAAG,EACH,EAAE;IACF,MAAM,WAAW,GAAG,KAAK,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,EAAE,IAAI,WAAW,CAAC;IACrC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;IAEnD,OAAO,CACL,eACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,UAAU,CAAC,kBAAkB,EAAE,SAAS,CAAC,KAChD,KAAK,aAET,gBAAO,SAAS,EAAC,qBAAqB,EAAC,OAAO,EAAE,UAAU,YACvD,KAAK,GACA,EACP,CAAC,SAAS,IAAI,CACb,cAAK,SAAS,EAAC,0BAA0B,YACvC,aACE,SAAS,EAAC,4CAA4C,iBAC1C,MAAM,aAEjB,UAAU,SACT,GACA,CACP,EACD,oBACE,EAAE,EAAE,UAAU,EACd,SAAS,EAAC,uBAAuB,EACjC,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,GAAG,aAEP,UAAU,SACF,EACV,WAAW,IAAI,CACd,YAAG,SAAS,EAAC,6CAA6C,YACvD,WAAW,GACV,CACL,IACG,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC"}
@@ -157,6 +157,42 @@
157
157
  transform: scale(1);
158
158
  }
159
159
 
160
+ /* Forced colors (High Contrast mode)
161
+ background-color wordt genegeerd — inner circle verdwijnt tegen de control achtergrond.
162
+ Highlight/HighlightText zijn de system colors voor geselecteerde form controls. */
163
+ @media (forced-colors: active) {
164
+ .dsn-radio__control {
165
+ forced-color-adjust: none;
166
+ border-color: ButtonText;
167
+ background-color: Field;
168
+ }
169
+
170
+ .dsn-radio__input:checked + .dsn-radio__control {
171
+ border-color: Highlight;
172
+ background-color: Highlight;
173
+ }
174
+
175
+ .dsn-radio__input:checked + .dsn-radio__control .dsn-radio__inner-circle {
176
+ background-color: HighlightText;
177
+ }
178
+
179
+ .dsn-radio__input:checked:disabled + .dsn-radio__control {
180
+ border-color: GrayText;
181
+ background-color: GrayText;
182
+ }
183
+
184
+ .dsn-radio__input:checked:disabled
185
+ + .dsn-radio__control
186
+ .dsn-radio__inner-circle {
187
+ background-color: Field;
188
+ }
189
+
190
+ .dsn-radio__input:disabled + .dsn-radio__control {
191
+ border-color: GrayText;
192
+ background-color: Field;
193
+ }
194
+ }
195
+
160
196
  /* Invalid state */
161
197
  .dsn-radio__input--invalid + .dsn-radio__control {
162
198
  border-width: var(--dsn-radio-invalid-border-width);
@@ -30,6 +30,14 @@
30
30
  padding-inline-start: var(--dsn-search-input-padding-inline-start-with-icon);
31
31
  }
32
32
 
33
+ /* Forced colors (High Contrast mode) */
34
+ @media (forced-colors: active) {
35
+ .dsn-search-input__icon {
36
+ forced-color-adjust: auto;
37
+ color: ButtonText;
38
+ }
39
+ }
40
+
33
41
  /* Hide browser-native clear button — will be implemented as a separate pattern */
34
42
  .dsn-search-input::-webkit-search-cancel-button {
35
43
  display: none;
@@ -60,6 +60,14 @@
60
60
  border-color: var(--dsn-text-input-invalid-border-color);
61
61
  }
62
62
 
63
+ /* Forced colors (High Contrast mode) */
64
+ @media (forced-colors: active) {
65
+ .dsn-select__icon {
66
+ forced-color-adjust: auto;
67
+ color: ButtonText;
68
+ }
69
+ }
70
+
63
71
  /* Remove native arrow in IE/Edge */
64
72
  .dsn-select::-ms-expand {
65
73
  display: none;
@@ -21,7 +21,7 @@ export interface SkipLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElem
21
21
  * SkipLink — toegankelijkheidskoppeling om herhalende navigatie te omzeilen.
22
22
  *
23
23
  * Plaatst de link als **eerste focusbaar element** in de DOM, vóór `<header>` en `<nav>`.
24
- * Voldoet aan WCAG 2.1 succescriterium 2.4.1 (Bypass Blocks, Level A).
24
+ * Voldoet aan WCAG 2.2 succescriterium 2.4.1 (Bypass Blocks, Level A).
25
25
  *
26
26
  * @example
27
27
  * ```tsx
@@ -6,7 +6,7 @@ import './SkipLink.css';
6
6
  * SkipLink — toegankelijkheidskoppeling om herhalende navigatie te omzeilen.
7
7
  *
8
8
  * Plaatst de link als **eerste focusbaar element** in de DOM, vóór `<header>` en `<nav>`.
9
- * Voldoet aan WCAG 2.1 succescriterium 2.4.1 (Bypass Blocks, Level A).
9
+ * Voldoet aan WCAG 2.2 succescriterium 2.4.1 (Bypass Blocks, Level A).
10
10
  *
11
11
  * @example
12
12
  * ```tsx
@@ -82,6 +82,23 @@
82
82
  }
83
83
  }
84
84
 
85
+ /* Forced colors (High Contrast mode)
86
+ SVG stroke wordt genegeerd — forced-color-adjust: auto laat de browser
87
+ de kleuren overnemen. Track verbergen: enkel de arc is informatief. */
88
+ @media (forced-colors: active) {
89
+ .dsn-spinner__circle {
90
+ forced-color-adjust: none;
91
+ }
92
+
93
+ .dsn-spinner__track {
94
+ stroke: transparent;
95
+ }
96
+
97
+ .dsn-spinner__arc {
98
+ stroke: CanvasText;
99
+ }
100
+ }
101
+
85
102
  /* prefers-reduced-motion: subtiel pulseren i.p.v. roteren */
86
103
  @media (prefers-reduced-motion: reduce) {
87
104
  .dsn-spinner__circle {
@@ -0,0 +1,75 @@
1
+ /**
2
+ * TableOfContents component styles for React
3
+ * Re-exports the base TableOfContents styles from components-html
4
+ */
5
+
6
+ /**
7
+ * Table Of Contents Component
8
+ * Inhoudsopgave met ankerlinks naar de secties op de huidige pagina.
9
+ * Alleen H2-secties horen hierin opgenomen te worden.
10
+ *
11
+ * Twee appearances:
12
+ * - Default ("framed"): accent-1 achtergrond + linkerborder, heading als heading-3.
13
+ * Bedoeld voor gebruik inline in de content-flow (bijv. onder de lead paragraph).
14
+ * - `dsn-table-of-contents--plain`: geen kader, heading als heading-5.
15
+ * Bedoeld voor gebruik in een losstaande kolom naast de hoofdinhoud.
16
+ *
17
+ * Usage:
18
+ * <!-- Framed (default) -->
19
+ * <nav class="dsn-table-of-contents" aria-labelledby="toc-heading">
20
+ * <h2 class="dsn-heading dsn-heading--heading-3 dsn-table-of-contents__heading" id="toc-heading">Op deze pagina</h2>
21
+ * <ul class="dsn-unordered-list">
22
+ * <li><a class="dsn-link" href="#sectie-1">Sectie 1</a></li>
23
+ * </ul>
24
+ * </nav>
25
+ *
26
+ * <!-- Plain -->
27
+ * <nav class="dsn-table-of-contents dsn-table-of-contents--plain" aria-labelledby="toc-heading-plain">
28
+ * <h2 class="dsn-heading dsn-heading--heading-5 dsn-table-of-contents__heading" id="toc-heading-plain">Op deze pagina</h2>
29
+ * <ul class="dsn-unordered-list">
30
+ * <li><a class="dsn-link" href="#sectie-1">Sectie 1</a></li>
31
+ * </ul>
32
+ * </nav>
33
+ */
34
+
35
+ .dsn-table-of-contents {
36
+ border-inline-start: var(--dsn-table-of-contents-border-inline-start-width)
37
+ solid var(--dsn-table-of-contents-border-inline-start-color);
38
+ background-color: var(--dsn-table-of-contents-background-color);
39
+ padding-block: var(--dsn-table-of-contents-padding-block);
40
+ padding-inline-start: var(--dsn-table-of-contents-padding-inline-start);
41
+ padding-inline-end: var(--dsn-table-of-contents-padding-inline-end);
42
+ }
43
+
44
+ .dsn-table-of-contents__heading {
45
+ margin-block-end: var(--dsn-table-of-contents-heading-gap);
46
+ }
47
+
48
+ /* =============================================================================
49
+ Plain appearance — geen kader, voor gebruik in een losstaande kolom
50
+ ============================================================================= */
51
+
52
+ .dsn-table-of-contents--plain {
53
+ border-inline-start: none;
54
+ background-color: transparent;
55
+ padding-block: var(--dsn-table-of-contents-plain-padding-block);
56
+ padding-inline-start: 0;
57
+ padding-inline-end: 0;
58
+ /* Ankerlinks: omgekeerd onderstrepingsgedrag t.o.v. de standaard Link —
59
+ rust zonder onderstreping, hover mét, zodat de kolom rustiger oogt. */
60
+ --dsn-link-text-decoration-line: var(
61
+ --dsn-table-of-contents-plain-link-text-decoration-line
62
+ );
63
+ --dsn-link-hover-text-decoration-line: var(
64
+ --dsn-table-of-contents-plain-link-hover-text-decoration-line
65
+ );
66
+ }
67
+
68
+ .dsn-table-of-contents--plain .dsn-unordered-list > li {
69
+ margin-block-end: var(--dsn-table-of-contents-plain-list-gap);
70
+ }
71
+
72
+ .dsn-table-of-contents--plain .dsn-unordered-list > li:last-child {
73
+ margin-block-end: 0;
74
+ }
75
+