@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.
- package/dist/Card/Card.d.mts +86 -21
- package/dist/Card/Card.d.mts.map +1 -1
- package/dist/Card/Card2.mjs +100 -17
- package/dist/Card/Card2.mjs.map +1 -1
- package/dist/Card/index.d.mts +2 -2
- package/dist/DateInput/DateInput.d.mts +1 -1
- package/dist/DateInput/DateInput2.mjs +1 -1
- package/dist/DateInput/DateInput2.mjs.map +1 -1
- package/dist/DateInputGroup/DateInputGroup2.mjs +3 -3
- package/dist/DateInputGroup/DateInputGroup2.mjs.map +1 -1
- package/dist/EmailInput/EmailInput.d.mts +10 -5
- package/dist/EmailInput/EmailInput.d.mts.map +1 -1
- package/dist/EmailInput/EmailInput2.mjs +2 -2
- package/dist/EmailInput/EmailInput2.mjs.map +1 -1
- package/dist/NumberInput/NumberInput.d.mts +4 -4
- package/dist/NumberInput/NumberInput.d.mts.map +1 -1
- package/dist/NumberInput/NumberInput2.mjs +2 -2
- package/dist/NumberInput/NumberInput2.mjs.map +1 -1
- package/dist/PageHeader/PageHeader.d.mts.map +1 -1
- package/dist/PageHeader/PageHeader2.mjs +19 -2
- package/dist/PageHeader/PageHeader2.mjs.map +1 -1
- package/dist/PasswordInput/PasswordInput.d.mts +10 -5
- package/dist/PasswordInput/PasswordInput.d.mts.map +1 -1
- package/dist/PasswordInput/PasswordInput2.mjs +2 -2
- package/dist/PasswordInput/PasswordInput2.mjs.map +1 -1
- package/dist/SearchInput/SearchInput.d.mts +10 -5
- package/dist/SearchInput/SearchInput.d.mts.map +1 -1
- package/dist/SearchInput/SearchInput2.mjs +2 -2
- package/dist/SearchInput/SearchInput2.mjs.map +1 -1
- package/dist/Select/Select.d.mts +6 -6
- package/dist/Select/Select.d.mts.map +1 -1
- package/dist/Select/Select2.mjs +4 -4
- package/dist/Select/Select2.mjs.map +1 -1
- package/dist/TelephoneInput/TelephoneInput.d.mts +10 -5
- package/dist/TelephoneInput/TelephoneInput.d.mts.map +1 -1
- package/dist/TelephoneInput/TelephoneInput2.mjs +2 -2
- package/dist/TelephoneInput/TelephoneInput2.mjs.map +1 -1
- package/dist/TextArea/TextArea.d.mts +10 -5
- package/dist/TextArea/TextArea.d.mts.map +1 -1
- package/dist/TextArea/TextArea2.mjs +2 -2
- package/dist/TextArea/TextArea2.mjs.map +1 -1
- package/dist/TextInput/TextInput.d.mts +4 -4
- package/dist/TextInput/TextInput.d.mts.map +1 -1
- package/dist/TextInput/TextInput2.mjs +2 -2
- package/dist/TextInput/TextInput2.mjs.map +1 -1
- package/dist/TimeInput/TimeInput.d.mts +1 -1
- package/dist/TimeInput/TimeInput2.mjs +1 -1
- package/dist/TimeInput/TimeInput2.mjs.map +1 -1
- package/dist/index.cjs +146 -41
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +4993 -4885
- package/dist/index.d.cts +140 -50
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/package.json +3 -3
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import {
|
|
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
|
-
*
|
|
16
|
-
* @default undefined (uses default max-
|
|
15
|
+
* Inline-size variant for the input
|
|
16
|
+
* @default undefined (uses default max-inline-size from form-control)
|
|
17
17
|
*/
|
|
18
|
-
|
|
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,
|
|
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,
|
|
30
|
-
const classes = classNames("dsn-text-input",
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
1634
|
-
const classes = (0, _dsn_starter_kit_core.classNames)("dsn-text-input",
|
|
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,
|
|
1698
|
-
const classes = (0, _dsn_starter_kit_core.classNames)("dsn-text-input",
|
|
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,
|
|
1735
|
-
const classes = (0, _dsn_starter_kit_core.classNames)("dsn-text-input",
|
|
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,
|
|
1766
|
-
const classes = (0, _dsn_starter_kit_core.classNames)("dsn-text-input",
|
|
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,
|
|
1799
|
-
const classes = (0, _dsn_starter_kit_core.classNames)("dsn-text-input",
|
|
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,
|
|
1832
|
-
const wrapperClasses = (0, _dsn_starter_kit_core.classNames)("dsn-search-input-wrapper",
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
* //
|
|
2106
|
-
* <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,
|
|
2113
|
-
const wrapperClasses = (0, _dsn_starter_kit_core.classNames)("dsn-select-wrapper",
|
|
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,
|
|
2158
|
-
const classes = (0, _dsn_starter_kit_core.classNames)("dsn-text-area",
|
|
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
|
|
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
|
|
4498
|
-
*
|
|
4499
|
-
*
|
|
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
|
-
* <
|
|
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
|
-
* <
|
|
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
|
-
*
|
|
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
|
|
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-
|
|
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
|
-
*
|
|
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,
|
|
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-
|
|
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-
|
|
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
|
-
*
|
|
4582
|
-
*
|
|
4583
|
-
* bestemming
|
|
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;
|