@dsn-starter-kit/components-react 3.5.0 → 4.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 (56) hide show
  1. package/dist/Card/Card.d.mts +86 -21
  2. package/dist/Card/Card.d.mts.map +1 -1
  3. package/dist/Card/Card2.mjs +100 -17
  4. package/dist/Card/Card2.mjs.map +1 -1
  5. package/dist/Card/index.d.mts +2 -2
  6. package/dist/DateInput/DateInput.d.mts +1 -1
  7. package/dist/DateInput/DateInput2.mjs +1 -1
  8. package/dist/DateInput/DateInput2.mjs.map +1 -1
  9. package/dist/DateInputGroup/DateInputGroup2.mjs +3 -3
  10. package/dist/DateInputGroup/DateInputGroup2.mjs.map +1 -1
  11. package/dist/EmailInput/EmailInput.d.mts +10 -5
  12. package/dist/EmailInput/EmailInput.d.mts.map +1 -1
  13. package/dist/EmailInput/EmailInput2.mjs +2 -2
  14. package/dist/EmailInput/EmailInput2.mjs.map +1 -1
  15. package/dist/NumberInput/NumberInput.d.mts +4 -4
  16. package/dist/NumberInput/NumberInput.d.mts.map +1 -1
  17. package/dist/NumberInput/NumberInput2.mjs +2 -2
  18. package/dist/NumberInput/NumberInput2.mjs.map +1 -1
  19. package/dist/PageHeader/PageHeader.d.mts.map +1 -1
  20. package/dist/PageHeader/PageHeader2.mjs +19 -2
  21. package/dist/PageHeader/PageHeader2.mjs.map +1 -1
  22. package/dist/PasswordInput/PasswordInput.d.mts +10 -5
  23. package/dist/PasswordInput/PasswordInput.d.mts.map +1 -1
  24. package/dist/PasswordInput/PasswordInput2.mjs +2 -2
  25. package/dist/PasswordInput/PasswordInput2.mjs.map +1 -1
  26. package/dist/SearchInput/SearchInput.d.mts +10 -5
  27. package/dist/SearchInput/SearchInput.d.mts.map +1 -1
  28. package/dist/SearchInput/SearchInput2.mjs +2 -2
  29. package/dist/SearchInput/SearchInput2.mjs.map +1 -1
  30. package/dist/Select/Select.d.mts +6 -6
  31. package/dist/Select/Select.d.mts.map +1 -1
  32. package/dist/Select/Select2.mjs +4 -4
  33. package/dist/Select/Select2.mjs.map +1 -1
  34. package/dist/TelephoneInput/TelephoneInput.d.mts +10 -5
  35. package/dist/TelephoneInput/TelephoneInput.d.mts.map +1 -1
  36. package/dist/TelephoneInput/TelephoneInput2.mjs +2 -2
  37. package/dist/TelephoneInput/TelephoneInput2.mjs.map +1 -1
  38. package/dist/TextArea/TextArea.d.mts +10 -5
  39. package/dist/TextArea/TextArea.d.mts.map +1 -1
  40. package/dist/TextArea/TextArea2.mjs +2 -2
  41. package/dist/TextArea/TextArea2.mjs.map +1 -1
  42. package/dist/TextInput/TextInput.d.mts +4 -4
  43. package/dist/TextInput/TextInput.d.mts.map +1 -1
  44. package/dist/TextInput/TextInput2.mjs +2 -2
  45. package/dist/TextInput/TextInput2.mjs.map +1 -1
  46. package/dist/TimeInput/TimeInput.d.mts +1 -1
  47. package/dist/TimeInput/TimeInput2.mjs +1 -1
  48. package/dist/TimeInput/TimeInput2.mjs.map +1 -1
  49. package/dist/index.cjs +146 -41
  50. package/dist/index.cjs.map +1 -1
  51. package/dist/index.css +4993 -4885
  52. package/dist/index.d.cts +140 -50
  53. package/dist/index.d.cts.map +1 -1
  54. package/dist/index.d.mts +2 -2
  55. package/dist/index.mjs +2 -2
  56. package/package.json +3 -3
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import { FormControlWidth } from "@dsn-starter-kit/core";
2
+ import { FormControlInlineSize } from "@dsn-starter-kit/core";
3
3
  //#region src/TextInput/TextInput.d.ts
4
4
  interface TextInputProps extends React.InputHTMLAttributes<HTMLInputElement> {
5
5
  /**
@@ -12,10 +12,10 @@ interface TextInputProps extends React.InputHTMLAttributes<HTMLInputElement> {
12
12
  */
13
13
  invalid?: boolean;
14
14
  /**
15
- * Width variant for the input
16
- * @default undefined (uses default max-width from form-control)
15
+ * Inline-size variant for the input
16
+ * @default undefined (uses default max-inline-size from form-control)
17
17
  */
18
- width?: FormControlWidth;
18
+ inlineSize?: FormControlInlineSize;
19
19
  }
20
20
  /**
21
21
  * Text Input component
@@ -1 +1 @@
1
- {"version":3,"file":"TextInput.d.mts","names":[],"sources":["../../src/TextInput/TextInput.tsx"],"mappings":";;;UAIiB,uBAAuB,MAAM,oBAAoB;;;;EAIhE;;;;;EAMA;;;;;EAMA,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;cA0BG,WAAS,MAAA,0BAAA,iBAAA,MAAA,cAAA"}
1
+ {"version":3,"file":"TextInput.d.mts","names":[],"sources":["../../src/TextInput/TextInput.tsx"],"mappings":";;;UAIiB,uBAAuB,MAAM,oBAAoB;;;;EAIhE;;;;;EAMA;;;;;EAMA,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;cA0BF,WAAS,MAAA,0BAAA,iBAAA,MAAA,cAAA"}
@@ -26,8 +26,8 @@ import { jsx } from "react/jsx-runtime";
26
26
  * <TextInput readOnly value="Cannot edit this" />
27
27
  * ```
28
28
  */
29
- const TextInput = React.forwardRef(({ className, invalid, width, type = "text", ...props }, ref) => {
30
- const classes = classNames("dsn-text-input", width && `dsn-text-input--width-${width}`, className);
29
+ const TextInput = React.forwardRef(({ className, invalid, inlineSize, type = "text", ...props }, ref) => {
30
+ const classes = classNames("dsn-text-input", inlineSize && `dsn-text-input--inline-size-${inlineSize}`, className);
31
31
  return /* @__PURE__ */ jsx("input", {
32
32
  ref,
33
33
  type,
@@ -1 +1 @@
1
- {"version":3,"file":"TextInput2.mjs","names":[],"sources":["../../src/TextInput/TextInput.tsx"],"sourcesContent":["import React from 'react';\nimport { classNames, FormControlWidth } from '@dsn-starter-kit/core';\nimport './TextInput.css';\n\nexport interface TextInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n /**\n * Additional CSS class names\n */\n className?: string;\n\n /**\n * Whether the input is in an invalid state\n * @default false\n */\n invalid?: boolean;\n\n /**\n * Width variant for the input\n * @default undefined (uses default max-width from form-control)\n */\n width?: FormControlWidth;\n}\n\n/**\n * Text Input component\n * Single-line text input with support for various states (hover, focus, disabled, invalid, read-only)\n *\n * @example\n * ```tsx\n * // Basic usage\n * <TextInput placeholder=\"Enter your name\" />\n *\n * // With label\n * <FormFieldLabel htmlFor=\"email\">Email</FormFieldLabel>\n * <TextInput id=\"email\" type=\"email\" />\n *\n * // Disabled\n * <TextInput disabled value=\"Read only value\" />\n *\n * // Invalid\n * <TextInput invalid aria-invalid=\"true\" aria-describedby=\"error\" />\n *\n * // Read-only\n * <TextInput readOnly value=\"Cannot edit this\" />\n * ```\n */\nexport const TextInput = React.forwardRef<HTMLInputElement, TextInputProps>(\n ({ className, invalid, width, type = 'text', ...props }, ref) => {\n const classes = classNames(\n 'dsn-text-input',\n width && `dsn-text-input--width-${width}`,\n className\n );\n\n return (\n <input\n ref={ref}\n type={type}\n className={classes}\n aria-invalid={invalid || undefined}\n {...props}\n />\n );\n }\n);\n\nTextInput.displayName = 'TextInput';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CA,MAAa,YAAY,MAAM,YAC5B,EAAE,WAAW,SAAS,OAAO,OAAO,QAAQ,GAAG,SAAS,QAAQ;CAC/D,MAAM,UAAU,WACd,kBACA,SAAS,yBAAyB,SAClC,SACF;CAEA,OACE,oBAAC,SAAD;EACO;EACC;EACN,WAAW;EACX,gBAAc,WAAW,KAAA;EACzB,GAAI;CACL,CAAA;AAEL,CACF;AAEA,UAAU,cAAc"}
1
+ {"version":3,"file":"TextInput2.mjs","names":[],"sources":["../../src/TextInput/TextInput.tsx"],"sourcesContent":["import React from 'react';\nimport { classNames, FormControlInlineSize } from '@dsn-starter-kit/core';\nimport './TextInput.css';\n\nexport interface TextInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n /**\n * Additional CSS class names\n */\n className?: string;\n\n /**\n * Whether the input is in an invalid state\n * @default false\n */\n invalid?: boolean;\n\n /**\n * Inline-size variant for the input\n * @default undefined (uses default max-inline-size from form-control)\n */\n inlineSize?: FormControlInlineSize;\n}\n\n/**\n * Text Input component\n * Single-line text input with support for various states (hover, focus, disabled, invalid, read-only)\n *\n * @example\n * ```tsx\n * // Basic usage\n * <TextInput placeholder=\"Enter your name\" />\n *\n * // With label\n * <FormFieldLabel htmlFor=\"email\">Email</FormFieldLabel>\n * <TextInput id=\"email\" type=\"email\" />\n *\n * // Disabled\n * <TextInput disabled value=\"Read only value\" />\n *\n * // Invalid\n * <TextInput invalid aria-invalid=\"true\" aria-describedby=\"error\" />\n *\n * // Read-only\n * <TextInput readOnly value=\"Cannot edit this\" />\n * ```\n */\nexport const TextInput = React.forwardRef<HTMLInputElement, TextInputProps>(\n ({ className, invalid, inlineSize, type = 'text', ...props }, ref) => {\n const classes = classNames(\n 'dsn-text-input',\n inlineSize && `dsn-text-input--inline-size-${inlineSize}`,\n className\n );\n\n return (\n <input\n ref={ref}\n type={type}\n className={classes}\n aria-invalid={invalid || undefined}\n {...props}\n />\n );\n }\n);\n\nTextInput.displayName = 'TextInput';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CA,MAAa,YAAY,MAAM,YAC5B,EAAE,WAAW,SAAS,YAAY,OAAO,QAAQ,GAAG,SAAS,QAAQ;CACpE,MAAM,UAAU,WACd,kBACA,cAAc,+BAA+B,cAC7C,SACF;CAEA,OACE,oBAAC,SAAD;EACO;EACC;EACN,WAAW;EACX,gBAAc,WAAW,KAAA;EACzB,GAAI;CACL,CAAA;AAEL,CACF;AAEA,UAAU,cAAc"}
@@ -14,7 +14,7 @@ interface TimeInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement
14
14
  /**
15
15
  * Time Input component
16
16
  * Time input with an interactive clock button at inline-end that opens the native time picker.
17
- * Fixed width (sm) — not configurable, as time inputs have a predictable content width.
17
+ * Fixed inline-size (sm): not configurable, as time inputs have a predictable content length.
18
18
  *
19
19
  * @example
20
20
  * ```tsx
@@ -8,7 +8,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
8
8
  /**
9
9
  * Time Input component
10
10
  * Time input with an interactive clock button at inline-end that opens the native time picker.
11
- * Fixed width (sm) — not configurable, as time inputs have a predictable content width.
11
+ * Fixed inline-size (sm): not configurable, as time inputs have a predictable content length.
12
12
  *
13
13
  * @example
14
14
  * ```tsx
@@ -1 +1 @@
1
- {"version":3,"file":"TimeInput2.mjs","names":[],"sources":["../../src/TimeInput/TimeInput.tsx"],"sourcesContent":["import React from 'react';\nimport { classNames } from '@dsn-starter-kit/core';\nimport { Button } from '../Button';\nimport { Icon } from '../Icon';\nimport './TimeInput.css';\n\nexport interface TimeInputProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'type'\n> {\n /**\n * Whether the input is in an invalid state\n * @default false\n */\n invalid?: boolean;\n\n /**\n * Additional CSS class names\n */\n className?: string;\n}\n\n/**\n * Time Input component\n * Time input with an interactive clock button at inline-end that opens the native time picker.\n * Fixed width (sm) — not configurable, as time inputs have a predictable content width.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <TimeInput />\n *\n * // With label\n * <FormFieldLabel htmlFor=\"time\">Tijd</FormFieldLabel>\n * <TimeInput id=\"time\" />\n *\n * // With default value\n * <TimeInput defaultValue=\"14:30\" />\n *\n * // Invalid state\n * <TimeInput invalid aria-invalid=\"true\" aria-describedby=\"error\" />\n * ```\n */\nexport const TimeInput = React.forwardRef<HTMLInputElement, TimeInputProps>(\n ({ className, invalid, disabled, readOnly, ...props }, ref) => {\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // Merge external ref with internal ref\n const handleRef = React.useCallback(\n (node: HTMLInputElement | null) => {\n (inputRef as React.MutableRefObject<HTMLInputElement | null>).current =\n node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current =\n node;\n }\n },\n [ref]\n );\n\n const handleButtonClick = () => {\n if (inputRef.current && 'showPicker' in inputRef.current) {\n inputRef.current.showPicker();\n }\n };\n\n const inputClasses = classNames(\n 'dsn-text-input',\n 'dsn-time-input',\n className\n );\n\n return (\n <div className=\"dsn-time-input-wrapper\">\n <input\n ref={handleRef}\n type=\"time\"\n className={inputClasses}\n aria-invalid={invalid || undefined}\n disabled={disabled}\n readOnly={readOnly}\n {...props}\n />\n {!disabled && !readOnly && (\n <Button\n variant=\"subtle\"\n size=\"small\"\n iconOnly\n iconStart={<Icon name=\"clock\" aria-hidden />}\n className=\"dsn-time-input__button\"\n onClick={handleButtonClick}\n >\n Tijdkiezer openen\n </Button>\n )}\n </div>\n );\n }\n);\n\nTimeInput.displayName = 'TimeInput';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,MAAa,YAAY,MAAM,YAC5B,EAAE,WAAW,SAAS,UAAU,UAAU,GAAG,SAAS,QAAQ;CAC7D,MAAM,WAAW,MAAM,OAAyB,IAAI;CAGpD,MAAM,YAAY,MAAM,aACrB,SAAkC;EACjC,SAA8D,UAC5D;EACF,IAAI,OAAO,QAAQ,YACjB,IAAI,IAAI;OACH,IAAI,KACT,IAAyD,UACvD;CAEN,GACA,CAAC,GAAG,CACN;CAEA,MAAM,0BAA0B;EAC9B,IAAI,SAAS,WAAW,gBAAgB,SAAS,SAC/C,SAAS,QAAQ,WAAW;CAEhC;CAEA,MAAM,eAAe,WACnB,kBACA,kBACA,SACF;CAEA,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,oBAAC,SAAD;GACE,KAAK;GACL,MAAK;GACL,WAAW;GACX,gBAAc,WAAW,KAAA;GACf;GACA;GACV,GAAI;EACL,CAAA,GACA,CAAC,YAAY,CAAC,YACb,oBAAC,QAAD;GACE,SAAQ;GACR,MAAK;GACL,UAAA;GACA,WAAW,oBAAC,MAAD;IAAM,MAAK;IAAQ,eAAA;GAAa,CAAA;GAC3C,WAAU;GACV,SAAS;GACV,UAAA;EAEO,CAAA,CAEP;;AAET,CACF;AAEA,UAAU,cAAc"}
1
+ {"version":3,"file":"TimeInput2.mjs","names":[],"sources":["../../src/TimeInput/TimeInput.tsx"],"sourcesContent":["import React from 'react';\nimport { classNames } from '@dsn-starter-kit/core';\nimport { Button } from '../Button';\nimport { Icon } from '../Icon';\nimport './TimeInput.css';\n\nexport interface TimeInputProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'type'\n> {\n /**\n * Whether the input is in an invalid state\n * @default false\n */\n invalid?: boolean;\n\n /**\n * Additional CSS class names\n */\n className?: string;\n}\n\n/**\n * Time Input component\n * Time input with an interactive clock button at inline-end that opens the native time picker.\n * Fixed inline-size (sm): not configurable, as time inputs have a predictable content length.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <TimeInput />\n *\n * // With label\n * <FormFieldLabel htmlFor=\"time\">Tijd</FormFieldLabel>\n * <TimeInput id=\"time\" />\n *\n * // With default value\n * <TimeInput defaultValue=\"14:30\" />\n *\n * // Invalid state\n * <TimeInput invalid aria-invalid=\"true\" aria-describedby=\"error\" />\n * ```\n */\nexport const TimeInput = React.forwardRef<HTMLInputElement, TimeInputProps>(\n ({ className, invalid, disabled, readOnly, ...props }, ref) => {\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // Merge external ref with internal ref\n const handleRef = React.useCallback(\n (node: HTMLInputElement | null) => {\n (inputRef as React.MutableRefObject<HTMLInputElement | null>).current =\n node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current =\n node;\n }\n },\n [ref]\n );\n\n const handleButtonClick = () => {\n if (inputRef.current && 'showPicker' in inputRef.current) {\n inputRef.current.showPicker();\n }\n };\n\n const inputClasses = classNames(\n 'dsn-text-input',\n 'dsn-time-input',\n className\n );\n\n return (\n <div className=\"dsn-time-input-wrapper\">\n <input\n ref={handleRef}\n type=\"time\"\n className={inputClasses}\n aria-invalid={invalid || undefined}\n disabled={disabled}\n readOnly={readOnly}\n {...props}\n />\n {!disabled && !readOnly && (\n <Button\n variant=\"subtle\"\n size=\"small\"\n iconOnly\n iconStart={<Icon name=\"clock\" aria-hidden />}\n className=\"dsn-time-input__button\"\n onClick={handleButtonClick}\n >\n Tijdkiezer openen\n </Button>\n )}\n </div>\n );\n }\n);\n\nTimeInput.displayName = 'TimeInput';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,MAAa,YAAY,MAAM,YAC5B,EAAE,WAAW,SAAS,UAAU,UAAU,GAAG,SAAS,QAAQ;CAC7D,MAAM,WAAW,MAAM,OAAyB,IAAI;CAGpD,MAAM,YAAY,MAAM,aACrB,SAAkC;EACjC,SAA8D,UAC5D;EACF,IAAI,OAAO,QAAQ,YACjB,IAAI,IAAI;OACH,IAAI,KACT,IAAyD,UACvD;CAEN,GACA,CAAC,GAAG,CACN;CAEA,MAAM,0BAA0B;EAC9B,IAAI,SAAS,WAAW,gBAAgB,SAAS,SAC/C,SAAS,QAAQ,WAAW;CAEhC;CAEA,MAAM,eAAe,WACnB,kBACA,kBACA,SACF;CAEA,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,oBAAC,SAAD;GACE,KAAK;GACL,MAAK;GACL,WAAW;GACX,gBAAc,WAAW,KAAA;GACf;GACA;GACV,GAAI;EACL,CAAA,GACA,CAAC,YAAY,CAAC,YACb,oBAAC,QAAD;GACE,SAAQ;GACR,MAAK;GACL,UAAA;GACA,WAAW,oBAAC,MAAD;IAAM,MAAK;IAAQ,eAAA;GAAa,CAAA;GAC3C,WAAU;GACV,SAAS;GACV,UAAA;EAEO,CAAA,CAEP;;AAET,CACF;AAEA,UAAU,cAAc"}
package/dist/index.cjs CHANGED
@@ -1630,8 +1630,8 @@ LinkButton.displayName = "LinkButton";
1630
1630
  * <TextInput readOnly value="Cannot edit this" />
1631
1631
  * ```
1632
1632
  */
1633
- const TextInput = react.default.forwardRef(({ className, invalid, width, type = "text", ...props }, ref) => {
1634
- const classes = (0, _dsn_starter_kit_core.classNames)("dsn-text-input", width && `dsn-text-input--width-${width}`, className);
1633
+ const TextInput = react.default.forwardRef(({ className, invalid, inlineSize, type = "text", ...props }, ref) => {
1634
+ const classes = (0, _dsn_starter_kit_core.classNames)("dsn-text-input", inlineSize && `dsn-text-input--inline-size-${inlineSize}`, className);
1635
1635
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
1636
1636
  ref,
1637
1637
  type,
@@ -1694,8 +1694,8 @@ FileInput.displayName = "FileInput";
1694
1694
  * <EmailInput invalid aria-invalid="true" aria-describedby="error" />
1695
1695
  * ```
1696
1696
  */
1697
- const EmailInput = react.default.forwardRef(({ className, invalid, width, autoComplete, ...props }, ref) => {
1698
- const classes = (0, _dsn_starter_kit_core.classNames)("dsn-text-input", width && `dsn-text-input--width-${width}`, className);
1697
+ const EmailInput = react.default.forwardRef(({ className, invalid, inlineSize, autoComplete, ...props }, ref) => {
1698
+ const classes = (0, _dsn_starter_kit_core.classNames)("dsn-text-input", inlineSize && `dsn-text-input--inline-size-${inlineSize}`, className);
1699
1699
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
1700
1700
  ref,
1701
1701
  type: "email",
@@ -1731,8 +1731,8 @@ EmailInput.displayName = "EmailInput";
1731
1731
  * <PasswordInput invalid aria-invalid="true" aria-describedby="error" />
1732
1732
  * ```
1733
1733
  */
1734
- const PasswordInput = react.default.forwardRef(({ passwordAutocomplete = "current-password", className, invalid, width, autoComplete, ...props }, ref) => {
1735
- const classes = (0, _dsn_starter_kit_core.classNames)("dsn-text-input", width && `dsn-text-input--width-${width}`, className);
1734
+ const PasswordInput = react.default.forwardRef(({ passwordAutocomplete = "current-password", className, invalid, inlineSize, autoComplete, ...props }, ref) => {
1735
+ const classes = (0, _dsn_starter_kit_core.classNames)("dsn-text-input", inlineSize && `dsn-text-input--inline-size-${inlineSize}`, className);
1736
1736
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
1737
1737
  ref,
1738
1738
  type: "password",
@@ -1762,8 +1762,8 @@ PasswordInput.displayName = "PasswordInput";
1762
1762
  * <NumberInput invalid aria-invalid="true" aria-describedby="error" />
1763
1763
  * ```
1764
1764
  */
1765
- const NumberInput = react.default.forwardRef(({ className, invalid, width, allowDecimals = false, ...props }, ref) => {
1766
- const classes = (0, _dsn_starter_kit_core.classNames)("dsn-text-input", width && `dsn-text-input--width-${width}`, className);
1765
+ const NumberInput = react.default.forwardRef(({ className, invalid, inlineSize, allowDecimals = false, ...props }, ref) => {
1766
+ const classes = (0, _dsn_starter_kit_core.classNames)("dsn-text-input", inlineSize && `dsn-text-input--inline-size-${inlineSize}`, className);
1767
1767
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
1768
1768
  ref,
1769
1769
  type: "text",
@@ -1795,8 +1795,8 @@ NumberInput.displayName = "NumberInput";
1795
1795
  * <TelephoneInput invalid aria-invalid="true" aria-describedby="error" />
1796
1796
  * ```
1797
1797
  */
1798
- const TelephoneInput = react.default.forwardRef(({ className, invalid, width, autoComplete, ...props }, ref) => {
1799
- const classes = (0, _dsn_starter_kit_core.classNames)("dsn-text-input", width && `dsn-text-input--width-${width}`, className);
1798
+ const TelephoneInput = react.default.forwardRef(({ className, invalid, inlineSize = "md", autoComplete, ...props }, ref) => {
1799
+ const classes = (0, _dsn_starter_kit_core.classNames)("dsn-text-input", inlineSize && `dsn-text-input--inline-size-${inlineSize}`, className);
1800
1800
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
1801
1801
  ref,
1802
1802
  type: "tel",
@@ -1828,8 +1828,8 @@ TelephoneInput.displayName = "TelephoneInput";
1828
1828
  * <SearchInput invalid aria-invalid="true" aria-describedby="error" />
1829
1829
  * ```
1830
1830
  */
1831
- const SearchInput = react.default.forwardRef(({ className, invalid, width, ...props }, ref) => {
1832
- const wrapperClasses = (0, _dsn_starter_kit_core.classNames)("dsn-search-input-wrapper", width && `dsn-search-input-wrapper--width-${width}`);
1831
+ const SearchInput = react.default.forwardRef(({ className, invalid, inlineSize, ...props }, ref) => {
1832
+ const wrapperClasses = (0, _dsn_starter_kit_core.classNames)("dsn-search-input-wrapper", inlineSize && `dsn-search-input-wrapper--inline-size-${inlineSize}`);
1833
1833
  const inputClasses = (0, _dsn_starter_kit_core.classNames)("dsn-text-input", "dsn-search-input", className);
1834
1834
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1835
1835
  className: wrapperClasses,
@@ -1852,7 +1852,7 @@ SearchInput.displayName = "SearchInput";
1852
1852
  /**
1853
1853
  * Time Input component
1854
1854
  * Time input with an interactive clock button at inline-end that opens the native time picker.
1855
- * Fixed width (sm) — not configurable, as time inputs have a predictable content width.
1855
+ * Fixed inline-size (sm): not configurable, as time inputs have a predictable content length.
1856
1856
  *
1857
1857
  * @example
1858
1858
  * ```tsx
@@ -1911,7 +1911,7 @@ TimeInput.displayName = "TimeInput";
1911
1911
  /**
1912
1912
  * Date Input component
1913
1913
  * Date input with an interactive calendar button at inline-end that opens the native date picker.
1914
- * Fixed width (sm) — not configurable, as date inputs have a predictable content width.
1914
+ * Fixed inline-size (md): not configurable, as date inputs have a predictable content length.
1915
1915
  *
1916
1916
  * @example
1917
1917
  * ```tsx
@@ -2024,7 +2024,7 @@ const DateInputGroup = react.default.forwardRef(({ className, value, onChange, i
2024
2024
  children: "Dag"
2025
2025
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NumberInput, {
2026
2026
  id: dayId,
2027
- width: "xs",
2027
+ inlineSize: "xs",
2028
2028
  value: value?.day ?? "",
2029
2029
  onChange: handleChange("day"),
2030
2030
  invalid,
@@ -2043,7 +2043,7 @@ const DateInputGroup = react.default.forwardRef(({ className, value, onChange, i
2043
2043
  children: "Maand"
2044
2044
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NumberInput, {
2045
2045
  id: monthId,
2046
- width: "xs",
2046
+ inlineSize: "xs",
2047
2047
  value: value?.month ?? "",
2048
2048
  onChange: handleChange("month"),
2049
2049
  invalid,
@@ -2062,7 +2062,7 @@ const DateInputGroup = react.default.forwardRef(({ className, value, onChange, i
2062
2062
  children: "Jaar"
2063
2063
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NumberInput, {
2064
2064
  id: yearId,
2065
- width: "sm",
2065
+ inlineSize: "sm",
2066
2066
  value: value?.year ?? "",
2067
2067
  onChange: handleChange("year"),
2068
2068
  invalid,
@@ -2102,15 +2102,15 @@ DateInputGroup.displayName = "DateInputGroup";
2102
2102
  * </Select>
2103
2103
  * </FormField>
2104
2104
  *
2105
- * // Width variant
2106
- * <Select width="lg">...</Select>
2105
+ * // Inline-size variant
2106
+ * <Select inlineSize="lg">...</Select>
2107
2107
  *
2108
2108
  * // Invalid state
2109
2109
  * <Select invalid aria-invalid="true" aria-describedby="error">...</Select>
2110
2110
  * ```
2111
2111
  */
2112
- const Select = react.default.forwardRef(({ className, invalid, width, disabled, children, ...props }, ref) => {
2113
- const wrapperClasses = (0, _dsn_starter_kit_core.classNames)("dsn-select-wrapper", width && `dsn-select-wrapper--width-${width}`);
2112
+ const Select = react.default.forwardRef(({ className, invalid, inlineSize, disabled, children, ...props }, ref) => {
2113
+ const wrapperClasses = (0, _dsn_starter_kit_core.classNames)("dsn-select-wrapper", inlineSize && `dsn-select-wrapper--inline-size-${inlineSize}`);
2114
2114
  const selectClasses = (0, _dsn_starter_kit_core.classNames)("dsn-text-input", "dsn-select", className);
2115
2115
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2116
2116
  className: wrapperClasses,
@@ -2154,8 +2154,8 @@ Select.displayName = "Select";
2154
2154
  * <TextArea readOnly value="View only" rows={3} />
2155
2155
  * ```
2156
2156
  */
2157
- const TextArea = react.default.forwardRef(({ className, invalid, width, rows = 4, ...props }, ref) => {
2158
- const classes = (0, _dsn_starter_kit_core.classNames)("dsn-text-area", width && `dsn-text-area--width-${width}`, className);
2157
+ const TextArea = react.default.forwardRef(({ className, invalid, inlineSize, rows = 4, ...props }, ref) => {
2158
+ const classes = (0, _dsn_starter_kit_core.classNames)("dsn-text-area", inlineSize && `dsn-text-area--inline-size-${inlineSize}`, className);
2159
2159
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
2160
2160
  ref,
2161
2161
  className: classes,
@@ -3697,6 +3697,10 @@ const DrawerFooter = react.default.forwardRef(({ className, children, ...props }
3697
3697
  DrawerFooter.displayName = "DrawerFooter";
3698
3698
  //#endregion
3699
3699
  //#region src/PageHeader/PageHeader.tsx
3700
+ /** Auto-hide: boven deze scrollpositie (px) blijft de header altijd zichtbaar */
3701
+ const AUTO_HIDE_OFFSET = 100;
3702
+ /** Auto-hide: zoveel px omhoog scrollen voordat de header terugkomt */
3703
+ const AUTO_HIDE_REVEAL_DISTANCE = 64;
3700
3704
  /**
3701
3705
  * PageHeader component
3702
3706
  * Primaire navigatieheader voor een pagina. Mobile-first implementatie.
@@ -3744,11 +3748,24 @@ const PageHeader = react.default.forwardRef(({ className, logoSlot, sticky = "no
3744
3748
  react.default.useEffect(() => {
3745
3749
  if (sticky !== "auto-hide") return;
3746
3750
  let lastScrollY = window.scrollY;
3751
+ let scrolledUp = 0;
3747
3752
  const handleScroll = () => {
3748
3753
  const currentScrollY = window.scrollY;
3749
- const isScrollingDown = currentScrollY > lastScrollY && currentScrollY > 100;
3750
- combinedRef.current?.setAttribute("data-hidden", String(isScrollingDown));
3754
+ const delta = currentScrollY - lastScrollY;
3751
3755
  lastScrollY = currentScrollY;
3756
+ let hidden;
3757
+ if (currentScrollY <= AUTO_HIDE_OFFSET) {
3758
+ hidden = false;
3759
+ scrolledUp = 0;
3760
+ } else if (delta > 0) {
3761
+ hidden = true;
3762
+ scrolledUp = 0;
3763
+ } else if (delta < 0) {
3764
+ scrolledUp -= delta;
3765
+ if (scrolledUp < AUTO_HIDE_REVEAL_DISTANCE) return;
3766
+ hidden = false;
3767
+ } else return;
3768
+ combinedRef.current?.setAttribute("data-hidden", String(hidden));
3752
3769
  };
3753
3770
  window.addEventListener("scroll", handleScroll, { passive: true });
3754
3771
  return () => window.removeEventListener("scroll", handleScroll);
@@ -4494,22 +4511,29 @@ Image.displayName = "Image";
4494
4511
  const CardContext = react.default.createContext({});
4495
4512
  /**
4496
4513
  * Card component
4497
- * Configureerbare container voor gestructureerde content met header, body en footer.
4498
- * Gebruikt een stretched-link techniek: de link in `CardHeading` dekt de volledige card.
4499
- * Screenreaders lezen alleen de heading-tekst als linknaam.
4514
+ * Configureerbare container met vier optionele secties: `CardPreHeader`,
4515
+ * `CardHeader`, `CardBody` en `CardFooter` (zie DR-2026-11).
4516
+ *
4517
+ * Zet `CardHeader` in de JSX altijd vóór `CardPreHeader`: zo kondigt een
4518
+ * screenreader de heading eerst aan. De CSS zet de pre-header visueel bovenaan.
4519
+ *
4520
+ * Met `href` wordt de heading een stretched link: de link dekt de volledige
4521
+ * card, en screenreaders lezen alleen de heading-tekst als linknaam.
4500
4522
  *
4501
4523
  * @example
4502
4524
  * ```tsx
4503
4525
  * <Card href="/artikel/slug">
4504
4526
  * <CardHeader>
4505
- * <Image src="/foto.jpg" alt="" width={800} height={450} ratio="16:9" />
4527
+ * <CardHeading level={2}>Artikeltitel</CardHeading>
4506
4528
  * </CardHeader>
4529
+ * <CardPreHeader>
4530
+ * <Image src="/foto.jpg" alt="" width={800} height={450} ratio="16:9" />
4531
+ * </CardPreHeader>
4507
4532
  * <CardBody>
4508
- * <CardHeading level={2}>Artikeltitel</CardHeading>
4509
4533
  * <Paragraph>Korte beschrijving.</Paragraph>
4510
4534
  * </CardBody>
4511
4535
  * <CardFooter>
4512
- * <Link href="/artikel/slug" aria-hidden tabIndex={-1}>Lees meer</Link>
4536
+ * <CardAffordance>Lees meer</CardAffordance>
4513
4537
  * </CardFooter>
4514
4538
  * </Card>
4515
4539
  * ```
@@ -4527,13 +4551,14 @@ const Card = react.default.forwardRef(({ className, href, children, ...props },
4527
4551
  });
4528
4552
  Card.displayName = "Card";
4529
4553
  /**
4530
- * CardHeader sub-component
4554
+ * CardPreHeader sub-component
4555
+ * Staat in de DOM ná `CardHeader` en komt visueel bovenaan via `order: -1`.
4531
4556
  * Zonder children → toont automatisch een afbeeldingsplaceholder.
4532
4557
  */
4533
- const CardHeader = react.default.forwardRef(({ className, children, ...props }, ref) => {
4558
+ const CardPreHeader = react.default.forwardRef(({ className, children, ...props }, ref) => {
4534
4559
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4535
4560
  ref,
4536
- className: (0, _dsn_starter_kit_core.classNames)("dsn-card__header", className),
4561
+ className: (0, _dsn_starter_kit_core.classNames)("dsn-card__pre-header", className),
4537
4562
  ...props,
4538
4563
  children: children ? children : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4539
4564
  className: "dsn-card__image-placeholder",
@@ -4541,10 +4566,24 @@ const CardHeader = react.default.forwardRef(({ className, children, ...props },
4541
4566
  })
4542
4567
  });
4543
4568
  });
4569
+ CardPreHeader.displayName = "CardPreHeader";
4570
+ /**
4571
+ * CardHeader sub-component
4572
+ * Bevat de heading of het label van de card. Zet hem in de JSX vóór
4573
+ * `CardPreHeader`.
4574
+ */
4575
+ const CardHeader = react.default.forwardRef(({ className, children, ...props }, ref) => {
4576
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4577
+ ref,
4578
+ className: (0, _dsn_starter_kit_core.classNames)("dsn-card__header", className),
4579
+ ...props,
4580
+ children
4581
+ });
4582
+ });
4544
4583
  CardHeader.displayName = "CardHeader";
4545
4584
  /**
4546
4585
  * CardBody sub-component
4547
- * Groeit via `flex: 1` zodat de footer altijd onderaan uitlijnt.
4586
+ * Inhoudssectie onder de header.
4548
4587
  */
4549
4588
  const CardBody = react.default.forwardRef(({ className, children, ...props }, ref) => {
4550
4589
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -4558,7 +4597,7 @@ CardBody.displayName = "CardBody";
4558
4597
  /**
4559
4598
  * CardHeading sub-component
4560
4599
  * Ontvangt `href` automatisch via React context van de parent `Card`.
4561
- * Wanneer `href` beschikbaar is, wraps de heading-tekst in een `<a class="dsn-card-heading__link">`.
4600
+ * Wanneer `href` beschikbaar is, staat de heading-tekst in een `<a class="dsn-card__link">`.
4562
4601
  * Het `::before` pseudo-element dekt de volledige card (stretched link).
4563
4602
  */
4564
4603
  const CardHeading = react.default.forwardRef(({ className, level = 2, children, ...props }, ref) => {
@@ -4566,21 +4605,67 @@ const CardHeading = react.default.forwardRef(({ className, level = 2, children,
4566
4605
  const Tag = `h${level}`;
4567
4606
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Tag, {
4568
4607
  ref,
4569
- className: (0, _dsn_starter_kit_core.classNames)("dsn-card-heading", className),
4608
+ className: (0, _dsn_starter_kit_core.classNames)("dsn-card__heading", className),
4570
4609
  ...props,
4571
4610
  children: href ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
4572
4611
  href,
4573
- className: "dsn-card-heading__link",
4612
+ className: "dsn-card__link",
4574
4613
  children
4575
4614
  }) : children
4576
4615
  });
4577
4616
  });
4578
4617
  CardHeading.displayName = "CardHeading";
4579
4618
  /**
4619
+ * CardLabel sub-component
4620
+ * Gebruik in plaats van `CardHeading` wanneer de card geen nieuw onderwerp
4621
+ * introduceert, zoals bij login-opties of instellingen. Ontvangt `href` via
4622
+ * context, net als `CardHeading`.
4623
+ */
4624
+ const CardLabel = react.default.forwardRef(({ className, children, ...props }, ref) => {
4625
+ const { href } = react.default.useContext(CardContext);
4626
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
4627
+ ref,
4628
+ className: (0, _dsn_starter_kit_core.classNames)("dsn-card__label", className),
4629
+ ...props,
4630
+ children: href ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
4631
+ href,
4632
+ className: "dsn-card__link",
4633
+ children
4634
+ }) : children
4635
+ });
4636
+ });
4637
+ CardLabel.displayName = "CardLabel";
4638
+ /**
4639
+ * CardDescription sub-component
4640
+ * Korte omschrijving met eigen typografie-tokens.
4641
+ */
4642
+ const CardDescription = react.default.forwardRef(({ className, children, ...props }, ref) => {
4643
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
4644
+ ref,
4645
+ className: (0, _dsn_starter_kit_core.classNames)("dsn-card__description", className),
4646
+ ...props,
4647
+ children
4648
+ });
4649
+ });
4650
+ CardDescription.displayName = "CardDescription";
4651
+ /**
4652
+ * CardMeta sub-component
4653
+ * Aanvullende gegevens bij de card, zoals een datum.
4654
+ */
4655
+ const CardMeta = react.default.forwardRef(({ className, children, ...props }, ref) => {
4656
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
4657
+ ref,
4658
+ className: (0, _dsn_starter_kit_core.classNames)("dsn-card__meta", className),
4659
+ ...props,
4660
+ children
4661
+ });
4662
+ });
4663
+ CardMeta.displayName = "CardMeta";
4664
+ /**
4580
4665
  * CardFooter sub-component
4581
- * Directe kinderen staan boven de stretched link via `z-index: 2` in CSS.
4582
- * Gebruik `aria-hidden` + `tabIndex={-1}` op de link wanneer deze dezelfde
4583
- * bestemming heeft als de card — vermijdt een dubbele tabstop.
4666
+ * Staat altijd onderaan de card. Links en buttons staan boven de stretched
4667
+ * link en blijven zelfstandig klikbaar. Voor een visuele "Lees meer" naar
4668
+ * dezelfde bestemming als de card: gebruik `CardAffordance`.
4584
4669
  */
4585
4670
  const CardFooter = react.default.forwardRef(({ className, children, ...props }, ref) => {
4586
4671
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -4592,6 +4677,21 @@ const CardFooter = react.default.forwardRef(({ className, children, ...props },
4592
4677
  });
4593
4678
  CardFooter.displayName = "CardFooter";
4594
4679
  /**
4680
+ * CardAffordance sub-component
4681
+ * Een `<span aria-hidden="true">` die eruitziet als een link. De stretched
4682
+ * link vangt de klik al af, dus er is geen tweede tabstop nodig.
4683
+ */
4684
+ const CardAffordance = react.default.forwardRef(({ className, children, ...props }, ref) => {
4685
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4686
+ ref,
4687
+ className: (0, _dsn_starter_kit_core.classNames)("dsn-card__affordance", className),
4688
+ "aria-hidden": "true",
4689
+ ...props,
4690
+ children
4691
+ });
4692
+ });
4693
+ CardAffordance.displayName = "CardAffordance";
4694
+ /**
4595
4695
  * CardGroup sub-component
4596
4696
  * Flexbox wrapper die gelijke hoogte garandeert en de footer in elke card onderaan uitlijnt.
4597
4697
  * Rendert `role="list"` wanneer `as="ul"` — nodig omdat CSS-resets de lijstsemantiek verwijderen.
@@ -5181,11 +5281,16 @@ exports.BreakoutSection = BreakoutSection;
5181
5281
  exports.Button = Button;
5182
5282
  exports.ButtonLink = ButtonLink;
5183
5283
  exports.Card = Card;
5284
+ exports.CardAffordance = CardAffordance;
5184
5285
  exports.CardBody = CardBody;
5286
+ exports.CardDescription = CardDescription;
5185
5287
  exports.CardFooter = CardFooter;
5186
5288
  exports.CardGroup = CardGroup;
5187
5289
  exports.CardHeader = CardHeader;
5188
5290
  exports.CardHeading = CardHeading;
5291
+ exports.CardLabel = CardLabel;
5292
+ exports.CardMeta = CardMeta;
5293
+ exports.CardPreHeader = CardPreHeader;
5189
5294
  exports.Checkbox = Checkbox;
5190
5295
  exports.CheckboxGroup = CheckboxGroup;
5191
5296
  exports.CheckboxOption = CheckboxOption;