@namroodinc/liquid-editorial 0.1.10 → 0.2.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 (88) hide show
  1. package/AGENTS.md +1 -1
  2. package/README.md +32 -16
  3. package/UPGRADING.md +68 -0
  4. package/dist/chunks/FormEditor-8bz3pOdP.cjs +2 -0
  5. package/dist/chunks/FormEditor-8bz3pOdP.cjs.map +1 -0
  6. package/dist/chunks/FormEditor-DuW8x78Y.js +330 -0
  7. package/dist/chunks/FormEditor-DuW8x78Y.js.map +1 -0
  8. package/dist/components/AppShell/index.cjs +1 -1
  9. package/dist/components/AppShell/index.cjs.map +1 -1
  10. package/dist/components/AppShell/index.d.cts.map +1 -1
  11. package/dist/components/AppShell/index.d.ts.map +1 -1
  12. package/dist/components/AppShell/index.js +1 -0
  13. package/dist/components/AppShell/index.js.map +1 -1
  14. package/dist/components/Badge/style.css +24 -21
  15. package/dist/components/Drawer/index.cjs +1 -1
  16. package/dist/components/Drawer/index.cjs.map +1 -1
  17. package/dist/components/Drawer/index.d.cts +3 -2
  18. package/dist/components/Drawer/index.d.cts.map +1 -1
  19. package/dist/components/Drawer/index.d.ts +3 -2
  20. package/dist/components/Drawer/index.d.ts.map +1 -1
  21. package/dist/components/Drawer/index.js +11 -10
  22. package/dist/components/Drawer/index.js.map +1 -1
  23. package/dist/components/Drawer/style.css +37 -79
  24. package/dist/components/EntryPicker/index.cjs +1 -1
  25. package/dist/components/EntryPicker/index.cjs.map +1 -1
  26. package/dist/components/EntryPicker/index.d.cts +3 -1
  27. package/dist/components/EntryPicker/index.d.cts.map +1 -1
  28. package/dist/components/EntryPicker/index.d.ts +3 -1
  29. package/dist/components/EntryPicker/index.d.ts.map +1 -1
  30. package/dist/components/EntryPicker/index.js +45 -43
  31. package/dist/components/EntryPicker/index.js.map +1 -1
  32. package/dist/components/FormEditor/control.d.cts +15 -0
  33. package/dist/components/FormEditor/control.d.cts.map +1 -0
  34. package/dist/components/FormEditor/control.d.ts +15 -0
  35. package/dist/components/FormEditor/control.d.ts.map +1 -0
  36. package/dist/components/FormEditor/index.cjs +1 -0
  37. package/dist/components/FormEditor/index.d.cts +28 -0
  38. package/dist/components/FormEditor/index.d.cts.map +1 -0
  39. package/dist/components/FormEditor/index.d.ts +28 -0
  40. package/dist/components/FormEditor/index.d.ts.map +1 -0
  41. package/dist/components/FormEditor/index.js +2 -0
  42. package/dist/components/FormEditor/model.d.cts +86 -0
  43. package/dist/components/FormEditor/model.d.cts.map +1 -0
  44. package/dist/components/FormEditor/model.d.ts +86 -0
  45. package/dist/components/FormEditor/model.d.ts.map +1 -0
  46. package/dist/components/FormEditor/style.css +25 -0
  47. package/dist/components/NumberField/index.cjs +1 -1
  48. package/dist/components/NumberField/index.cjs.map +1 -1
  49. package/dist/components/NumberField/index.d.cts +3 -0
  50. package/dist/components/NumberField/index.d.cts.map +1 -1
  51. package/dist/components/NumberField/index.d.ts +3 -0
  52. package/dist/components/NumberField/index.d.ts.map +1 -1
  53. package/dist/components/NumberField/index.js +20 -20
  54. package/dist/components/NumberField/index.js.map +1 -1
  55. package/dist/components/RichTextEditor/index.cjs +1 -1
  56. package/dist/components/RichTextEditor/index.js +0 -1
  57. package/dist/components/SelectionCard/index.cjs +1 -1
  58. package/dist/components/SelectionCard/index.cjs.map +1 -1
  59. package/dist/components/SelectionCard/index.d.cts +4 -1
  60. package/dist/components/SelectionCard/index.d.cts.map +1 -1
  61. package/dist/components/SelectionCard/index.d.ts +4 -1
  62. package/dist/components/SelectionCard/index.d.ts.map +1 -1
  63. package/dist/components/SelectionCard/index.js +3 -3
  64. package/dist/components/SelectionCard/index.js.map +1 -1
  65. package/dist/index.cjs +1 -1
  66. package/dist/index.d.cts +2 -2
  67. package/dist/index.d.cts.map +1 -1
  68. package/dist/index.d.ts +2 -2
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +20 -20
  71. package/dist/styles.css +1 -1
  72. package/dist/tokens.css +15 -5
  73. package/package.json +1 -1
  74. package/dist/chunks/EntryEditor-CcyYtH74.js +0 -191
  75. package/dist/chunks/EntryEditor-CcyYtH74.js.map +0 -1
  76. package/dist/chunks/EntryEditor-DIpc1iPF.cjs +0 -2
  77. package/dist/chunks/EntryEditor-DIpc1iPF.cjs.map +0 -1
  78. package/dist/components/EntryEditor/index.cjs +0 -1
  79. package/dist/components/EntryEditor/index.d.cts +0 -21
  80. package/dist/components/EntryEditor/index.d.cts.map +0 -1
  81. package/dist/components/EntryEditor/index.d.ts +0 -21
  82. package/dist/components/EntryEditor/index.d.ts.map +0 -1
  83. package/dist/components/EntryEditor/index.js +0 -6
  84. package/dist/components/EntryEditor/model.d.cts +0 -33
  85. package/dist/components/EntryEditor/model.d.cts.map +0 -1
  86. package/dist/components/EntryEditor/model.d.ts +0 -33
  87. package/dist/components/EntryEditor/model.d.ts.map +0 -1
  88. package/dist/components/EntryEditor/style.css +0 -8
@@ -0,0 +1,15 @@
1
+ import { type EntryItem } from "../EntryPicker/index.js";
2
+ import type { FieldProps } from "../Field/index.js";
3
+ import { type FormField, type FormFieldValue } from "./model.js";
4
+ type Accessibility = Parameters<FieldProps["children"]>[0];
5
+ interface FormControlProps {
6
+ field: FormField;
7
+ stored: FormFieldValue | undefined;
8
+ items: EntryItem[];
9
+ isDisabled: boolean;
10
+ accessibility: Accessibility;
11
+ onChange: (value: FormFieldValue | undefined) => void;
12
+ }
13
+ export declare function FormControl({ field, stored, items, isDisabled, accessibility: { required, ...accessibility }, onChange }: FormControlProps): import("react").JSX.Element;
14
+ export {};
15
+ //# sourceMappingURL=control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../../src/components/FormEditor/control.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAO3C,OAAO,EAA8C,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAqB1G,KAAK,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAoC3D,UAAU,gBAAgB;IACxB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,cAAc,GAAG,SAAS,CAAC;IACnC,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,aAAa,CAAC;IAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,KAAK,IAAI,CAAC;CACvD;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,EAAE,QAAQ,EAAE,EAAE,gBAAgB,+BA6B1I"}
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require("../Field/index.cjs");const e=require("../../chunks/FormEditor-8bz3pOdP.cjs");exports.FormEditor=e.t,exports.validateFormValues=e.n;
@@ -0,0 +1,28 @@
1
+ import { type HTMLAttributes } from "react";
2
+ import type { EntryItem } from "../EntryPicker/index.cjs";
3
+ import type { GridColumns } from "../Grid/index.cjs";
4
+ import { type FormSchema, type FormErrors, type FormValues } from "./model.cjs";
5
+ export { validateFormValues } from "./model.cjs";
6
+ export type { AssetValue, FormField, FormSchema, FormErrors, FormFieldValue, FormValues, ReferenceValue } from "./model.cjs";
7
+ export interface FormChange {
8
+ fieldId: string;
9
+ }
10
+ export interface FormEditorProps extends Omit<HTMLAttributes<HTMLDivElement>, "defaultValue" | "onChange"> {
11
+ schema: FormSchema;
12
+ value?: FormValues;
13
+ defaultValue?: FormValues;
14
+ onValueChange?: (values: FormValues, change: FormChange) => void;
15
+ /** Available assets or entries, keyed by field ID. Loading belongs to the app. */
16
+ pickerItems?: Record<string, EntryItem[]>;
17
+ /** App-provided messages take precedence over built-in validation. */
18
+ errors?: FormErrors;
19
+ isDisabled?: boolean;
20
+ showAllErrors?: boolean;
21
+ /** Columns at the widest. The form drops one whenever a field would be narrower than `minColumnWidth`. */
22
+ columns?: GridColumns;
23
+ /** Narrowest a field may get before the form drops a column. */
24
+ minColumnWidth?: string;
25
+ }
26
+ /** Ordered form controls. Loading, submission, and persistence belong to the app. */
27
+ export declare function FormEditor({ schema, value, defaultValue, onValueChange, pickerItems, errors, isDisabled, showAllErrors, columns, minColumnWidth, className, style, ...rest }: FormEditorProps): import("react").JSX.Element;
28
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/components/FormEditor/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAyC,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AACnF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,OAAO,EAA2C,KAAK,UAAU,EAAE,KAAK,UAAU,EAAuB,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1I,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzH,MAAM,WAAW,UAAU;IAAG,OAAO,EAAE,MAAM,CAAA;CAAE;AAE/C,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,UAAU,CAAC;IACxG,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACjE,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1C,sEAAsE;IACtE,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,0GAA0G;IAC1G,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA0BD,qFAAqF;AACrF,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,YAAiB,EAAE,aAAa,EAAE,WAAgB,EAAE,MAAW,EACzG,UAAkB,EAAE,aAAqB,EAAE,OAAW,EAAE,cAAwB,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,eAAe,+BAkC/H"}
@@ -0,0 +1,28 @@
1
+ import { type HTMLAttributes } from "react";
2
+ import type { EntryItem } from "../EntryPicker/index.js";
3
+ import type { GridColumns } from "../Grid/index.js";
4
+ import { type FormSchema, type FormErrors, type FormValues } from "./model.js";
5
+ export { validateFormValues } from "./model.js";
6
+ export type { AssetValue, FormField, FormSchema, FormErrors, FormFieldValue, FormValues, ReferenceValue } from "./model.js";
7
+ export interface FormChange {
8
+ fieldId: string;
9
+ }
10
+ export interface FormEditorProps extends Omit<HTMLAttributes<HTMLDivElement>, "defaultValue" | "onChange"> {
11
+ schema: FormSchema;
12
+ value?: FormValues;
13
+ defaultValue?: FormValues;
14
+ onValueChange?: (values: FormValues, change: FormChange) => void;
15
+ /** Available assets or entries, keyed by field ID. Loading belongs to the app. */
16
+ pickerItems?: Record<string, EntryItem[]>;
17
+ /** App-provided messages take precedence over built-in validation. */
18
+ errors?: FormErrors;
19
+ isDisabled?: boolean;
20
+ showAllErrors?: boolean;
21
+ /** Columns at the widest. The form drops one whenever a field would be narrower than `minColumnWidth`. */
22
+ columns?: GridColumns;
23
+ /** Narrowest a field may get before the form drops a column. */
24
+ minColumnWidth?: string;
25
+ }
26
+ /** Ordered form controls. Loading, submission, and persistence belong to the app. */
27
+ export declare function FormEditor({ schema, value, defaultValue, onValueChange, pickerItems, errors, isDisabled, showAllErrors, columns, minColumnWidth, className, style, ...rest }: FormEditorProps): import("react").JSX.Element;
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/FormEditor/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAyC,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AACnF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,OAAO,EAA2C,KAAK,UAAU,EAAE,KAAK,UAAU,EAAuB,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1I,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzH,MAAM,WAAW,UAAU;IAAG,OAAO,EAAE,MAAM,CAAA;CAAE;AAE/C,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,UAAU,CAAC;IACxG,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACjE,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1C,sEAAsE;IACtE,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,0GAA0G;IAC1G,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA0BD,qFAAqF;AACrF,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,YAAiB,EAAE,aAAa,EAAE,WAAgB,EAAE,MAAW,EACzG,UAAkB,EAAE,aAAqB,EAAE,OAAW,EAAE,cAAwB,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,eAAe,+BAkC/H"}
@@ -0,0 +1,2 @@
1
+ import "../Field/index.js";
2
+ export { t as FormEditor, n as validateFormValues } from "../../chunks/FormEditor-DuW8x78Y.js";
@@ -0,0 +1,86 @@
1
+ import type { ReactNode } from "react";
2
+ import type { SelectOption } from "../Select/index.cjs";
3
+ import type { EntryPickerProps } from "../EntryPicker/index.cjs";
4
+ import type { RichTextDocument } from "../RichTextEditor/index.cjs";
5
+ interface FormFieldBase {
6
+ id: string;
7
+ label: string;
8
+ hint?: ReactNode;
9
+ placeholder?: string;
10
+ required?: boolean;
11
+ isDisabled?: boolean;
12
+ }
13
+ export type FormField = FormFieldBase & ({
14
+ type: "shortText";
15
+ inputType?: "text" | "email";
16
+ maxLength?: number;
17
+ readOnly?: boolean;
18
+ autoFocus?: boolean;
19
+ multiple?: never;
20
+ } | {
21
+ type: "longText";
22
+ rows?: number;
23
+ maxLength?: number;
24
+ readOnly?: boolean;
25
+ autoFocus?: boolean;
26
+ multiple?: never;
27
+ } | {
28
+ type: "boolean" | "dateTime";
29
+ autoFocus?: boolean;
30
+ multiple?: never;
31
+ } | {
32
+ type: "richText";
33
+ autoFocus?: never;
34
+ multiple?: never;
35
+ } | {
36
+ type: "number";
37
+ min?: number;
38
+ max?: number;
39
+ step?: number | "any";
40
+ hasSteppers?: boolean;
41
+ autoFocus?: boolean;
42
+ multiple?: never;
43
+ } | {
44
+ type: "select";
45
+ options: SelectOption[];
46
+ autoFocus?: boolean;
47
+ multiple?: never;
48
+ } | {
49
+ type: "asset" | "reference";
50
+ multiple?: boolean;
51
+ autoFocus?: never;
52
+ picker?: Pick<EntryPickerProps, "label" | "addLabel" | "emptyLabel" | "itemLabel" | "itemsLabel" | "max" | "isReorderable">;
53
+ });
54
+ export type FieldOf<T extends FormField["type"]> = Extract<FormField, {
55
+ type: T;
56
+ }>;
57
+ export interface FormSchema {
58
+ fields: readonly FormField[];
59
+ }
60
+ export interface AssetValue {
61
+ assetId: string;
62
+ }
63
+ export interface ReferenceValue {
64
+ entryId: string;
65
+ }
66
+ export type FormFieldValue = string | number | boolean | RichTextDocument | AssetValue | ReferenceValue | AssetValue[] | ReferenceValue[];
67
+ export type FormValues = Record<string, FormFieldValue | undefined>;
68
+ export type FormErrors = Partial<Record<string, string>>;
69
+ export declare function assertModel(model: FormSchema): void;
70
+ /** Picker copy, with asset or entry wording for any option the field leaves out or sets to undefined. */
71
+ export declare function pickerCopy(field: FieldOf<"asset" | "reference">): {
72
+ label: string;
73
+ addLabel: string;
74
+ itemLabel: string;
75
+ itemsLabel: string;
76
+ max?: number | undefined;
77
+ emptyLabel?: string | undefined;
78
+ isReorderable?: boolean | undefined;
79
+ };
80
+ /** Accept UTC ISO strings without rolling invalid dates into the next month. */
81
+ export declare function parseUtcDateTime(value: unknown): string | undefined;
82
+ export declare function fieldError(field: FormField, value: unknown): string | undefined;
83
+ /** Validate data loaded from JSON as well as values emitted by FormEditor. */
84
+ export declare function validateFormValues(model: FormSchema, values: Record<string, unknown>): FormErrors;
85
+ export {};
86
+ //# sourceMappingURL=model.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.cts","sourceRoot":"","sources":["../../../src/components/FormEditor/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,CACpC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GAClI;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GAClH;IAAE,IAAI,EAAE,SAAS,GAAG,UAAU,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GACnI;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,YAAY,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GAClF;IAAE,IAAI,EAAE,OAAO,GAAG,WAAW,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,KAAK,CAAC;IAAC,MAAM,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,KAAK,GAAG,eAAe,CAAC,CAAA;CAAE,CACtM,CAAC;AAEF,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,CAAC;AAEnF,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IAAG,OAAO,EAAE,MAAM,CAAA;CAAE;AAC/C,MAAM,WAAW,cAAc;IAAG,OAAO,EAAE,MAAM,CAAA;CAAE;AACnD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,gBAAgB,GAAG,UAAU,GAAG,cAAc,GAAG,UAAU,EAAE,GAAG,cAAc,EAAE,CAAC;AAC1I,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;AACpE,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAIzD,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,QAQ5C;AAOD,yGAAyG;AACzG,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,GAAG,WAAW,CAAC;;;;;;;;EAU/D;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAOnE;AAkED,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAG/E;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAMjG"}
@@ -0,0 +1,86 @@
1
+ import type { ReactNode } from "react";
2
+ import type { SelectOption } from "../Select/index.js";
3
+ import type { EntryPickerProps } from "../EntryPicker/index.js";
4
+ import type { RichTextDocument } from "../RichTextEditor/index.js";
5
+ interface FormFieldBase {
6
+ id: string;
7
+ label: string;
8
+ hint?: ReactNode;
9
+ placeholder?: string;
10
+ required?: boolean;
11
+ isDisabled?: boolean;
12
+ }
13
+ export type FormField = FormFieldBase & ({
14
+ type: "shortText";
15
+ inputType?: "text" | "email";
16
+ maxLength?: number;
17
+ readOnly?: boolean;
18
+ autoFocus?: boolean;
19
+ multiple?: never;
20
+ } | {
21
+ type: "longText";
22
+ rows?: number;
23
+ maxLength?: number;
24
+ readOnly?: boolean;
25
+ autoFocus?: boolean;
26
+ multiple?: never;
27
+ } | {
28
+ type: "boolean" | "dateTime";
29
+ autoFocus?: boolean;
30
+ multiple?: never;
31
+ } | {
32
+ type: "richText";
33
+ autoFocus?: never;
34
+ multiple?: never;
35
+ } | {
36
+ type: "number";
37
+ min?: number;
38
+ max?: number;
39
+ step?: number | "any";
40
+ hasSteppers?: boolean;
41
+ autoFocus?: boolean;
42
+ multiple?: never;
43
+ } | {
44
+ type: "select";
45
+ options: SelectOption[];
46
+ autoFocus?: boolean;
47
+ multiple?: never;
48
+ } | {
49
+ type: "asset" | "reference";
50
+ multiple?: boolean;
51
+ autoFocus?: never;
52
+ picker?: Pick<EntryPickerProps, "label" | "addLabel" | "emptyLabel" | "itemLabel" | "itemsLabel" | "max" | "isReorderable">;
53
+ });
54
+ export type FieldOf<T extends FormField["type"]> = Extract<FormField, {
55
+ type: T;
56
+ }>;
57
+ export interface FormSchema {
58
+ fields: readonly FormField[];
59
+ }
60
+ export interface AssetValue {
61
+ assetId: string;
62
+ }
63
+ export interface ReferenceValue {
64
+ entryId: string;
65
+ }
66
+ export type FormFieldValue = string | number | boolean | RichTextDocument | AssetValue | ReferenceValue | AssetValue[] | ReferenceValue[];
67
+ export type FormValues = Record<string, FormFieldValue | undefined>;
68
+ export type FormErrors = Partial<Record<string, string>>;
69
+ export declare function assertModel(model: FormSchema): void;
70
+ /** Picker copy, with asset or entry wording for any option the field leaves out or sets to undefined. */
71
+ export declare function pickerCopy(field: FieldOf<"asset" | "reference">): {
72
+ label: string;
73
+ addLabel: string;
74
+ itemLabel: string;
75
+ itemsLabel: string;
76
+ max?: number | undefined;
77
+ emptyLabel?: string | undefined;
78
+ isReorderable?: boolean | undefined;
79
+ };
80
+ /** Accept UTC ISO strings without rolling invalid dates into the next month. */
81
+ export declare function parseUtcDateTime(value: unknown): string | undefined;
82
+ export declare function fieldError(field: FormField, value: unknown): string | undefined;
83
+ /** Validate data loaded from JSON as well as values emitted by FormEditor. */
84
+ export declare function validateFormValues(model: FormSchema, values: Record<string, unknown>): FormErrors;
85
+ export {};
86
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/components/FormEditor/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ @layer components {
2
+ /* Columns are sized against the form's own width, so they step down in a
3
+ * drawer or modal without a container query. No size containment either, so
4
+ * the form keeps its content width in flex rows, popovers and auto tracks. */
5
+ .ds-form-editor {
6
+ --form-editor-gap: var(--space-6);
7
+ display: grid;
8
+ grid-template-columns: repeat(
9
+ auto-fill,
10
+ minmax(
11
+ max(
12
+ min(100%, var(--form-editor-min-column)),
13
+ (100% - (var(--form-editor-columns) - 1) * var(--form-editor-gap)) / var(--form-editor-columns)
14
+ ),
15
+ 1fr
16
+ )
17
+ );
18
+ gap: var(--form-editor-gap);
19
+ min-inline-size: 0;
20
+ }
21
+
22
+ .ds-form-editor--auto {
23
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, var(--form-editor-min-column)), 1fr));
24
+ }
25
+ }
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../Button/index.cjs");;/* empty css */const t=require("../FieldAffix/index.cjs");let n=require("react"),r=require("react/jsx-runtime");function i(...e){return e.filter(Boolean).join(` `)}var a=(0,n.forwardRef)(function({size:a=`md`,value:o,defaultValue:s=``,onValueChange:c,min:l,max:u,step:d=1,prefix:f,suffix:p,isDisabled:m=!1,isInvalid:h=!1,hasSteppers:g=!0,className:_,disabled:v,"aria-invalid":y,...b},x){let[S,C]=(0,n.useState)(s),w=o??S,T=(0,n.useRef)(null),E=(0,n.useCallback)(e=>{o===void 0&&C(e),c?.(e)},[c,o]),D=e=>{let t=(w===``?l??0:w)+e*(d===`any`?1:d);l!==void 0&&(t=Math.max(l,t)),u!==void 0&&(t=Math.min(u,t)),t=Number(t.toFixed(10)),E(t),T.current?.focus()},O=w!==``&&(l!==void 0&&w<l||u!==void 0&&w>u);return(0,r.jsxs)(`div`,{className:i(`ds-number`,_),"data-size":a,children:[g&&(0,r.jsx)(e.Button,{size:a,isIconOnly:!0,iconStart:`minus`,className:`ds-number__step`,"aria-label":`Decrease`,isDisabled:m||v||l!==void 0&&w!==``&&w<=l,onClick:()=>D(-1)}),(0,r.jsx)(t.FieldAffix,{className:`ds-number__body`,lead:f,trail:p,children:(0,r.jsx)(`input`,{ref:e=>{T.current=e,typeof x==`function`?x(e):x&&(x.current=e)},type:`number`,inputMode:`decimal`,value:w,min:l,max:u,step:d,disabled:m||v,"aria-invalid":h||O||y||void 0,"data-size":a,className:`ds-field-skin ds-number__input`,onChange:e=>{let t=e.target.value;E(t===``?``:Number(t))},...b})}),g&&(0,r.jsx)(e.Button,{size:a,isIconOnly:!0,iconStart:`plus`,className:`ds-number__step`,"aria-label":`Increase`,isDisabled:m||v||u!==void 0&&w!==``&&w>=u,onClick:()=>D(1)})]})});function o({value:e,defaultValue:t={min:``,max:``},onValueChange:i,size:o=`md`,min:s,max:c,step:l=1,prefix:u,suffix:d,isDisabled:f=!1,minLabel:p=`Minimum`,maxLabel:m=`Maximum`}){let[h,g]=(0,n.useState)(t),_=e??h,v=t=>{e===void 0&&g(t),i?.(t)},y=_.min!==``&&_.max!==``&&_.min>_.max;return(0,r.jsxs)(`div`,{className:`ds-number-range`,children:[(0,r.jsx)(a,{"aria-label":p,size:o,value:_.min,min:s,max:c,step:l,prefix:u,suffix:d,isDisabled:f,isInvalid:y,onValueChange:e=>v({..._,min:e})}),(0,r.jsx)(`span`,{className:`ds-number-range__dash`,"aria-hidden":`true`,children:`–`}),(0,r.jsx)(a,{"aria-label":m,size:o,value:_.max,min:s,max:c,step:l,prefix:u,suffix:d,isDisabled:f,isInvalid:y,onValueChange:e=>v({..._,max:e})})]})}exports.NumberField=a,exports.NumberRangeField=o;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../Button/index.cjs");;/* empty css */const t=require("../FieldAffix/index.cjs");let n=require("react"),r=require("react/jsx-runtime");function i(...e){return e.filter(Boolean).join(` `)}var a=(0,n.forwardRef)(function({size:a=`md`,value:o,defaultValue:s=``,onValueChange:c,min:l,max:u,step:d=1,prefix:f,suffix:p,isDisabled:m=!1,isInvalid:h=!1,hasSteppers:g=!0,decreaseLabel:_=`Decrease`,increaseLabel:v=`Increase`,className:y,disabled:b,"aria-invalid":x,...S},C){let[w,T]=(0,n.useState)(s),E=o??w,D=(0,n.useRef)(null),O=(0,n.useCallback)(e=>{o===void 0&&T(e),c?.(e)},[c,o]),k=e=>{let t=(E===``?l??0:E)+e*(d===`any`?1:d);l!==void 0&&(t=Math.max(l,t)),u!==void 0&&(t=Math.min(u,t)),t=Number(t.toFixed(10)),O(t),D.current?.focus()},A=E!==``&&(l!==void 0&&E<l||u!==void 0&&E>u);return(0,r.jsxs)(`div`,{className:i(`ds-number`,y),"data-size":a,children:[g&&(0,r.jsx)(e.Button,{size:a,isIconOnly:!0,iconStart:`minus`,className:`ds-number__step`,"aria-label":_,isDisabled:m||b||l!==void 0&&E!==``&&E<=l,onClick:()=>k(-1)}),(0,r.jsx)(t.FieldAffix,{className:`ds-number__body`,lead:f,trail:p,children:(0,r.jsx)(`input`,{ref:e=>{D.current=e,typeof C==`function`?C(e):C&&(C.current=e)},type:`number`,inputMode:`decimal`,value:E,min:l,max:u,step:d,disabled:m||b,"aria-invalid":h||A||x||void 0,"data-size":a,className:`ds-field-skin ds-number__input`,onChange:e=>{let t=e.target.value;O(t===``?``:Number(t))},...S})}),g&&(0,r.jsx)(e.Button,{size:a,isIconOnly:!0,iconStart:`plus`,className:`ds-number__step`,"aria-label":v,isDisabled:m||b||u!==void 0&&E!==``&&E>=u,onClick:()=>k(1)})]})});function o({value:e,defaultValue:t={min:``,max:``},onValueChange:i,size:o=`md`,min:s,max:c,step:l=1,prefix:u,suffix:d,isDisabled:f=!1,minLabel:p=`Minimum`,maxLabel:m=`Maximum`}){let[h,g]=(0,n.useState)(t),_=e??h,v=t=>{e===void 0&&g(t),i?.(t)},y=_.min!==``&&_.max!==``&&_.min>_.max;return(0,r.jsxs)(`div`,{className:`ds-number-range`,children:[(0,r.jsx)(a,{"aria-label":p,size:o,value:_.min,min:s,max:c,step:l,prefix:u,suffix:d,isDisabled:f,isInvalid:y,onValueChange:e=>v({..._,min:e})}),(0,r.jsx)(`span`,{className:`ds-number-range__dash`,"aria-hidden":`true`,children:`–`}),(0,r.jsx)(a,{"aria-label":m,size:o,value:_.max,min:s,max:c,step:l,prefix:u,suffix:d,isDisabled:f,isInvalid:y,onValueChange:e=>v({..._,max:e})})]})}exports.NumberField=a,exports.NumberRangeField=o;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["forwardRef","useState","useRef","useCallback","Button","FieldAffix","require_components_Button_index","require_components_FieldAffix_index","react","react_jsx_runtime","cx","parts","NumberField","ariaInvalid","rest","internal","setInternal","defaultValue","current","value","inputRef","commit","next","onValueChange","nudge","min","direction","step","max","outOfRange","className","size","hasSteppers","isDisabled","disabled","prefix","suffix","node","ref","isInvalid","raw","event","NumberRangeField","crossed","minLabel","maxLabel"],"sources":["../../../src/components/NumberField/index.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useRef,\n useState,\n type InputHTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { Button } from \"../Button\";\nimport { FieldAffix } from \"../FieldAffix\";\nimport type { FieldSize } from \"../Field\";\nimport \"../Field/style.css\";\nimport \"./style.css\";\n\nfunction cx(...parts: (string | undefined | false)[]) {\n return parts.filter(Boolean).join(\" \");\n}\n\nexport interface NumberFieldProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\" | \"type\" | \"value\" | \"defaultValue\" | \"onChange\" | \"prefix\"> {\n size?: FieldSize;\n value?: number | \"\";\n defaultValue?: number | \"\";\n onValueChange?: (value: number | \"\") => void;\n min?: number;\n max?: number;\n step?: number | \"any\";\n /** Rendered inside the field, before the number — \"£\", \"$\", a glyph. */\n prefix?: ReactNode;\n /** Rendered inside the field, after the number — \"kg\", \"%\", \"px\". */\n suffix?: ReactNode;\n isDisabled?: boolean;\n isInvalid?: boolean;\n /** Hide the − / + steppers and keep typing only. */\n hasSteppers?: boolean;\n}\n\n\n/**\n * A quantity, bounded by `min` and `max`. Steppers move by `step` and stop at\n * the bounds; typing is never blocked, an out-of-range value reads invalid.\n */\nexport const NumberField = forwardRef<HTMLInputElement, NumberFieldProps>(function NumberField(\n {\n size = \"md\",\n value,\n defaultValue = \"\",\n onValueChange,\n min,\n max,\n step = 1,\n prefix,\n suffix,\n\n isDisabled = false,\n isInvalid = false,\n hasSteppers = true,\n className,\n disabled,\n \"aria-invalid\": ariaInvalid,\n ...rest\n },\n ref,\n) {\n const [internal, setInternal] = useState<number | \"\">(defaultValue);\n const current = value ?? internal;\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const commit = useCallback(\n (next: number | \"\") => {\n if (value === undefined) setInternal(next);\n onValueChange?.(next);\n },\n [onValueChange, value],\n );\n\n const nudge = (direction: 1 | -1) => {\n const base = current === \"\" ? (min ?? 0) : current;\n let next = base + direction * (step === \"any\" ? 1 : step);\n if (min !== undefined) next = Math.max(min, next);\n if (max !== undefined) next = Math.min(max, next);\n next = Number(next.toFixed(10));\n commit(next);\n inputRef.current?.focus();\n };\n\n const outOfRange =\n current !== \"\" &&\n ((min !== undefined && current < min) || (max !== undefined && current > max));\n\n return (\n <div className={cx(\"ds-number\", className)} data-size={size}>\n {hasSteppers && (\n <Button\n size={size}\n isIconOnly\n iconStart=\"minus\"\n className=\"ds-number__step\"\n aria-label=\"Decrease\"\n isDisabled={isDisabled || disabled || (min !== undefined && current !== \"\" && current <= min)}\n onClick={() => nudge(-1)}\n />\n )}\n <FieldAffix className=\"ds-number__body\" lead={prefix} trail={suffix}>\n <input\n ref={(node) => {\n inputRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n type=\"number\"\n inputMode=\"decimal\"\n value={current}\n min={min}\n max={max}\n step={step}\n disabled={isDisabled || disabled}\n aria-invalid={isInvalid || outOfRange || ariaInvalid || undefined}\n data-size={size}\n className=\"ds-field-skin ds-number__input\"\n onChange={(event) => {\n const raw = event.target.value;\n commit(raw === \"\" ? \"\" : Number(raw));\n }}\n {...rest}\n />\n </FieldAffix>\n\n {hasSteppers && (\n <Button\n size={size}\n isIconOnly\n iconStart=\"plus\"\n className=\"ds-number__step\"\n aria-label=\"Increase\"\n isDisabled={isDisabled || disabled || (max !== undefined && current !== \"\" && current >= max)}\n onClick={() => nudge(1)}\n />\n )}\n </div>\n );\n});\n\nexport interface NumberRangeValue {\n min: number | \"\";\n max: number | \"\";\n}\n\nexport interface NumberRangeFieldProps {\n value?: NumberRangeValue;\n defaultValue?: NumberRangeValue;\n onValueChange?: (value: NumberRangeValue) => void;\n size?: FieldSize;\n /** Hard bounds both ends are clamped to. */\n min?: number;\n max?: number;\n step?: number;\n /** Rendered inside both fields, before the number. */\n prefix?: ReactNode;\n suffix?: ReactNode;\n isDisabled?: boolean;\n minLabel?: string;\n maxLabel?: string;\n}\n\n/**\n * A lower and an upper bound, typed. The pair reads invalid when the minimum\n * passes the maximum — neither field is rewritten behind the user.\n */\nexport function NumberRangeField({\n value,\n defaultValue = { min: \"\", max: \"\" },\n onValueChange,\n size = \"md\",\n min,\n max,\n step = 1,\n prefix,\n suffix,\n isDisabled = false,\n minLabel = \"Minimum\",\n maxLabel = \"Maximum\",\n}: NumberRangeFieldProps) {\n const [internal, setInternal] = useState<NumberRangeValue>(defaultValue);\n const current = value ?? internal;\n\n const commit = (next: NumberRangeValue) => {\n if (value === undefined) setInternal(next);\n onValueChange?.(next);\n };\n\n const crossed = current.min !== \"\" && current.max !== \"\" && current.min > current.max;\n\n return (\n <div className=\"ds-number-range\">\n <NumberField\n aria-label={minLabel}\n size={size}\n value={current.min}\n min={min}\n max={max}\n step={step}\n prefix={prefix}\n suffix={suffix}\n isDisabled={isDisabled}\n isInvalid={crossed}\n onValueChange={(next) => commit({ ...current, min: next })}\n />\n <span className=\"ds-number-range__dash\" aria-hidden=\"true\">\n –\n </span>\n <NumberField\n aria-label={maxLabel}\n size={size}\n value={current.max}\n min={min}\n max={max}\n step={step}\n prefix={prefix}\n suffix={suffix}\n isDisabled={isDisabled}\n isInvalid={crossed}\n onValueChange={(next) => commit({ ...current, max: next })}\n />\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["forwardRef","useState","useRef","useCallback","Button","FieldAffix","require_components_Button_index","require_components_FieldAffix_index","react","react_jsx_runtime","cx","parts","NumberField","ariaInvalid","rest","internal","setInternal","defaultValue","current","value","inputRef","commit","next","onValueChange","nudge","min","direction","step","max","outOfRange","className","size","hasSteppers","decreaseLabel","isDisabled","disabled","prefix","suffix","node","ref","isInvalid","raw","event","increaseLabel","NumberRangeField","crossed","minLabel","maxLabel"],"sources":["../../../src/components/NumberField/index.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useRef,\n useState,\n type InputHTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { Button } from \"../Button\";\nimport { FieldAffix } from \"../FieldAffix\";\nimport type { FieldSize } from \"../Field\";\nimport \"../Field/style.css\";\nimport \"./style.css\";\n\nfunction cx(...parts: (string | undefined | false)[]) {\n return parts.filter(Boolean).join(\" \");\n}\n\nexport interface NumberFieldProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\" | \"type\" | \"value\" | \"defaultValue\" | \"onChange\" | \"prefix\"> {\n size?: FieldSize;\n value?: number | \"\";\n defaultValue?: number | \"\";\n onValueChange?: (value: number | \"\") => void;\n min?: number;\n max?: number;\n step?: number | \"any\";\n /** Rendered inside the field, before the number — \"£\", \"$\", a glyph. */\n prefix?: ReactNode;\n /** Rendered inside the field, after the number — \"kg\", \"%\", \"px\". */\n suffix?: ReactNode;\n isDisabled?: boolean;\n isInvalid?: boolean;\n /** Hide the − / + steppers and keep typing only. */\n hasSteppers?: boolean;\n /** Stepper names. Include the field's label when a form has several number fields. */\n decreaseLabel?: string;\n increaseLabel?: string;\n}\n\n\n/**\n * A quantity, bounded by `min` and `max`. Steppers move by `step` and stop at\n * the bounds; typing is never blocked, an out-of-range value reads invalid.\n */\nexport const NumberField = forwardRef<HTMLInputElement, NumberFieldProps>(function NumberField(\n {\n size = \"md\",\n value,\n defaultValue = \"\",\n onValueChange,\n min,\n max,\n step = 1,\n prefix,\n suffix,\n\n isDisabled = false,\n isInvalid = false,\n hasSteppers = true,\n decreaseLabel = \"Decrease\",\n increaseLabel = \"Increase\",\n className,\n disabled,\n \"aria-invalid\": ariaInvalid,\n ...rest\n },\n ref,\n) {\n const [internal, setInternal] = useState<number | \"\">(defaultValue);\n const current = value ?? internal;\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const commit = useCallback(\n (next: number | \"\") => {\n if (value === undefined) setInternal(next);\n onValueChange?.(next);\n },\n [onValueChange, value],\n );\n\n const nudge = (direction: 1 | -1) => {\n const base = current === \"\" ? (min ?? 0) : current;\n let next = base + direction * (step === \"any\" ? 1 : step);\n if (min !== undefined) next = Math.max(min, next);\n if (max !== undefined) next = Math.min(max, next);\n next = Number(next.toFixed(10));\n commit(next);\n inputRef.current?.focus();\n };\n\n const outOfRange =\n current !== \"\" &&\n ((min !== undefined && current < min) || (max !== undefined && current > max));\n\n return (\n <div className={cx(\"ds-number\", className)} data-size={size}>\n {hasSteppers && (\n <Button\n size={size}\n isIconOnly\n iconStart=\"minus\"\n className=\"ds-number__step\"\n aria-label={decreaseLabel}\n isDisabled={isDisabled || disabled || (min !== undefined && current !== \"\" && current <= min)}\n onClick={() => nudge(-1)}\n />\n )}\n <FieldAffix className=\"ds-number__body\" lead={prefix} trail={suffix}>\n <input\n ref={(node) => {\n inputRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n type=\"number\"\n inputMode=\"decimal\"\n value={current}\n min={min}\n max={max}\n step={step}\n disabled={isDisabled || disabled}\n aria-invalid={isInvalid || outOfRange || ariaInvalid || undefined}\n data-size={size}\n className=\"ds-field-skin ds-number__input\"\n onChange={(event) => {\n const raw = event.target.value;\n commit(raw === \"\" ? \"\" : Number(raw));\n }}\n {...rest}\n />\n </FieldAffix>\n\n {hasSteppers && (\n <Button\n size={size}\n isIconOnly\n iconStart=\"plus\"\n className=\"ds-number__step\"\n aria-label={increaseLabel}\n isDisabled={isDisabled || disabled || (max !== undefined && current !== \"\" && current >= max)}\n onClick={() => nudge(1)}\n />\n )}\n </div>\n );\n});\n\nexport interface NumberRangeValue {\n min: number | \"\";\n max: number | \"\";\n}\n\nexport interface NumberRangeFieldProps {\n value?: NumberRangeValue;\n defaultValue?: NumberRangeValue;\n onValueChange?: (value: NumberRangeValue) => void;\n size?: FieldSize;\n /** Hard bounds both ends are clamped to. */\n min?: number;\n max?: number;\n step?: number;\n /** Rendered inside both fields, before the number. */\n prefix?: ReactNode;\n suffix?: ReactNode;\n isDisabled?: boolean;\n minLabel?: string;\n maxLabel?: string;\n}\n\n/**\n * A lower and an upper bound, typed. The pair reads invalid when the minimum\n * passes the maximum — neither field is rewritten behind the user.\n */\nexport function NumberRangeField({\n value,\n defaultValue = { min: \"\", max: \"\" },\n onValueChange,\n size = \"md\",\n min,\n max,\n step = 1,\n prefix,\n suffix,\n isDisabled = false,\n minLabel = \"Minimum\",\n maxLabel = \"Maximum\",\n}: NumberRangeFieldProps) {\n const [internal, setInternal] = useState<NumberRangeValue>(defaultValue);\n const current = value ?? internal;\n\n const commit = (next: NumberRangeValue) => {\n if (value === undefined) setInternal(next);\n onValueChange?.(next);\n };\n\n const crossed = current.min !== \"\" && current.max !== \"\" && current.min > current.max;\n\n return (\n <div className=\"ds-number-range\">\n <NumberField\n aria-label={minLabel}\n size={size}\n value={current.min}\n min={min}\n max={max}\n step={step}\n prefix={prefix}\n suffix={suffix}\n isDisabled={isDisabled}\n isInvalid={crossed}\n onValueChange={(next) => commit({ ...current, min: next })}\n />\n <span className=\"ds-number-range__dash\" aria-hidden=\"true\">\n –\n </span>\n <NumberField\n aria-label={maxLabel}\n size={size}\n value={current.max}\n min={min}\n max={max}\n step={step}\n prefix={prefix}\n suffix={suffix}\n isDisabled={isDisabled}\n isInvalid={crossed}\n onValueChange={(next) => commit({ ...current, max: next })}\n />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -16,6 +16,9 @@ export interface NumberFieldProps extends Omit<InputHTMLAttributes<HTMLInputElem
16
16
  isInvalid?: boolean;
17
17
  /** Hide the − / + steppers and keep typing only. */
18
18
  hasSteppers?: boolean;
19
+ /** Stepper names. Include the field's label when a form has several number fields. */
20
+ decreaseLabel?: string;
21
+ increaseLabel?: string;
19
22
  }
20
23
  /**
21
24
  * A quantity, bounded by `min` and `max`. Steppers move by `step` and stop at
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/components/NumberField/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,mBAAmB,EACxB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,oBAAoB,CAAC;AAC5B,OAAO,aAAa,CAAC;AAMrB,MAAM,WAAW,gBACf,SAAQ,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,cAAc,GAAG,UAAU,GAAG,QAAQ,CAAC;IACvH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE,KAAK,IAAI,CAAC;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACtB,wEAAwE;IACxE,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,qEAAqE;IACrE,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oDAAoD;IACpD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAGD;;;GAGG;AACH,eAAO,MAAM,WAAW,+GAmGtB,CAAC;AAEH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,4CAA4C;IAC5C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,YAAmC,EACnC,aAAa,EACb,IAAW,EACX,GAAG,EACH,GAAG,EACH,IAAQ,EACR,MAAM,EACN,MAAM,EACN,UAAkB,EAClB,QAAoB,EACpB,QAAoB,GACrB,EAAE,qBAAqB,+BA4CvB"}
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/components/NumberField/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,mBAAmB,EACxB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,oBAAoB,CAAC;AAC5B,OAAO,aAAa,CAAC;AAMrB,MAAM,WAAW,gBACf,SAAQ,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,cAAc,GAAG,UAAU,GAAG,QAAQ,CAAC;IACvH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE,KAAK,IAAI,CAAC;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACtB,wEAAwE;IACxE,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,qEAAqE;IACrE,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oDAAoD;IACpD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sFAAsF;IACtF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAGD;;;GAGG;AACH,eAAO,MAAM,WAAW,+GAqGtB,CAAC;AAEH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,4CAA4C;IAC5C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,YAAmC,EACnC,aAAa,EACb,IAAW,EACX,GAAG,EACH,GAAG,EACH,IAAQ,EACR,MAAM,EACN,MAAM,EACN,UAAkB,EAClB,QAAoB,EACpB,QAAoB,GACrB,EAAE,qBAAqB,+BA4CvB"}
@@ -16,6 +16,9 @@ export interface NumberFieldProps extends Omit<InputHTMLAttributes<HTMLInputElem
16
16
  isInvalid?: boolean;
17
17
  /** Hide the − / + steppers and keep typing only. */
18
18
  hasSteppers?: boolean;
19
+ /** Stepper names. Include the field's label when a form has several number fields. */
20
+ decreaseLabel?: string;
21
+ increaseLabel?: string;
19
22
  }
20
23
  /**
21
24
  * A quantity, bounded by `min` and `max`. Steppers move by `step` and stop at
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/NumberField/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,mBAAmB,EACxB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,oBAAoB,CAAC;AAC5B,OAAO,aAAa,CAAC;AAMrB,MAAM,WAAW,gBACf,SAAQ,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,cAAc,GAAG,UAAU,GAAG,QAAQ,CAAC;IACvH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE,KAAK,IAAI,CAAC;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACtB,wEAAwE;IACxE,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,qEAAqE;IACrE,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oDAAoD;IACpD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAGD;;;GAGG;AACH,eAAO,MAAM,WAAW,+GAmGtB,CAAC;AAEH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,4CAA4C;IAC5C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,YAAmC,EACnC,aAAa,EACb,IAAW,EACX,GAAG,EACH,GAAG,EACH,IAAQ,EACR,MAAM,EACN,MAAM,EACN,UAAkB,EAClB,QAAoB,EACpB,QAAoB,GACrB,EAAE,qBAAqB,+BA4CvB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/NumberField/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,mBAAmB,EACxB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,oBAAoB,CAAC;AAC5B,OAAO,aAAa,CAAC;AAMrB,MAAM,WAAW,gBACf,SAAQ,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,cAAc,GAAG,UAAU,GAAG,QAAQ,CAAC;IACvH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE,KAAK,IAAI,CAAC;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACtB,wEAAwE;IACxE,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,qEAAqE;IACrE,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oDAAoD;IACpD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sFAAsF;IACtF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAGD;;;GAGG;AACH,eAAO,MAAM,WAAW,+GAqGtB,CAAC;AAEH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,4CAA4C;IAC5C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,YAAmC,EACnC,aAAa,EACb,IAAW,EACX,GAAG,EACH,GAAG,EACH,IAAQ,EACR,MAAM,EACN,MAAM,EACN,UAAkB,EAClB,QAAoB,EACpB,QAAoB,GACrB,EAAE,qBAAqB,+BA4CvB"}
@@ -7,15 +7,15 @@ import { jsx as o, jsxs as s } from "react/jsx-runtime";
7
7
  function c(...e) {
8
8
  return e.filter(Boolean).join(" ");
9
9
  }
10
- var l = n(function({ size: n = "md", value: l, defaultValue: u = "", onValueChange: d, min: f, max: p, step: m = 1, prefix: h, suffix: g, isDisabled: _ = !1, isInvalid: v = !1, hasSteppers: y = !0, className: b, disabled: x, "aria-invalid": S, ...C }, w) {
11
- let [T, E] = a(u), D = l ?? T, O = i(null), k = r((e) => {
12
- l === void 0 && E(e), d?.(e);
13
- }, [d, l]), A = (e) => {
14
- let t = (D === "" ? f ?? 0 : D) + e * (m === "any" ? 1 : m);
15
- f !== void 0 && (t = Math.max(f, t)), p !== void 0 && (t = Math.min(p, t)), t = Number(t.toFixed(10)), k(t), O.current?.focus();
16
- }, j = D !== "" && (f !== void 0 && D < f || p !== void 0 && D > p);
10
+ var l = n(function({ size: n = "md", value: l, defaultValue: u = "", onValueChange: d, min: f, max: p, step: m = 1, prefix: h, suffix: g, isDisabled: _ = !1, isInvalid: v = !1, hasSteppers: y = !0, decreaseLabel: b = "Decrease", increaseLabel: x = "Increase", className: S, disabled: C, "aria-invalid": w, ...T }, E) {
11
+ let [D, O] = a(u), k = l ?? D, A = i(null), j = r((e) => {
12
+ l === void 0 && O(e), d?.(e);
13
+ }, [d, l]), M = (e) => {
14
+ let t = (k === "" ? f ?? 0 : k) + e * (m === "any" ? 1 : m);
15
+ f !== void 0 && (t = Math.max(f, t)), p !== void 0 && (t = Math.min(p, t)), t = Number(t.toFixed(10)), j(t), A.current?.focus();
16
+ }, N = k !== "" && (f !== void 0 && k < f || p !== void 0 && k > p);
17
17
  return /* @__PURE__ */ s("div", {
18
- className: c("ds-number", b),
18
+ className: c("ds-number", S),
19
19
  "data-size": n,
20
20
  children: [
21
21
  y && /* @__PURE__ */ o(e, {
@@ -23,9 +23,9 @@ var l = n(function({ size: n = "md", value: l, defaultValue: u = "", onValueChan
23
23
  isIconOnly: !0,
24
24
  iconStart: "minus",
25
25
  className: "ds-number__step",
26
- "aria-label": "Decrease",
27
- isDisabled: _ || x || f !== void 0 && D !== "" && D <= f,
28
- onClick: () => A(-1)
26
+ "aria-label": b,
27
+ isDisabled: _ || C || f !== void 0 && k !== "" && k <= f,
28
+ onClick: () => M(-1)
29
29
  }),
30
30
  /* @__PURE__ */ o(t, {
31
31
  className: "ds-number__body",
@@ -33,23 +33,23 @@ var l = n(function({ size: n = "md", value: l, defaultValue: u = "", onValueChan
33
33
  trail: g,
34
34
  children: /* @__PURE__ */ o("input", {
35
35
  ref: (e) => {
36
- O.current = e, typeof w == "function" ? w(e) : w && (w.current = e);
36
+ A.current = e, typeof E == "function" ? E(e) : E && (E.current = e);
37
37
  },
38
38
  type: "number",
39
39
  inputMode: "decimal",
40
- value: D,
40
+ value: k,
41
41
  min: f,
42
42
  max: p,
43
43
  step: m,
44
- disabled: _ || x,
45
- "aria-invalid": v || j || S || void 0,
44
+ disabled: _ || C,
45
+ "aria-invalid": v || N || w || void 0,
46
46
  "data-size": n,
47
47
  className: "ds-field-skin ds-number__input",
48
48
  onChange: (e) => {
49
49
  let t = e.target.value;
50
- k(t === "" ? "" : Number(t));
50
+ j(t === "" ? "" : Number(t));
51
51
  },
52
- ...C
52
+ ...T
53
53
  })
54
54
  }),
55
55
  y && /* @__PURE__ */ o(e, {
@@ -57,9 +57,9 @@ var l = n(function({ size: n = "md", value: l, defaultValue: u = "", onValueChan
57
57
  isIconOnly: !0,
58
58
  iconStart: "plus",
59
59
  className: "ds-number__step",
60
- "aria-label": "Increase",
61
- isDisabled: _ || x || p !== void 0 && D !== "" && D >= p,
62
- onClick: () => A(1)
60
+ "aria-label": x,
61
+ isDisabled: _ || C || p !== void 0 && k !== "" && k >= p,
62
+ onClick: () => M(1)
63
63
  })
64
64
  ]
65
65
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["cx","parts","NumberField","forwardRef","ariaInvalid","rest","internal","setInternal","useState","defaultValue","current","value","inputRef","useRef","commit","useCallback","next","onValueChange","nudge","min","direction","step","max","outOfRange","className","size","hasSteppers","Button","isDisabled","disabled","FieldAffix","prefix","suffix","node","ref","isInvalid","raw","event","NumberRangeField","crossed","minLabel","maxLabel"],"sources":["../../../src/components/NumberField/index.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useRef,\n useState,\n type InputHTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { Button } from \"../Button\";\nimport { FieldAffix } from \"../FieldAffix\";\nimport type { FieldSize } from \"../Field\";\nimport \"../Field/style.css\";\nimport \"./style.css\";\n\nfunction cx(...parts: (string | undefined | false)[]) {\n return parts.filter(Boolean).join(\" \");\n}\n\nexport interface NumberFieldProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\" | \"type\" | \"value\" | \"defaultValue\" | \"onChange\" | \"prefix\"> {\n size?: FieldSize;\n value?: number | \"\";\n defaultValue?: number | \"\";\n onValueChange?: (value: number | \"\") => void;\n min?: number;\n max?: number;\n step?: number | \"any\";\n /** Rendered inside the field, before the number — \"£\", \"$\", a glyph. */\n prefix?: ReactNode;\n /** Rendered inside the field, after the number — \"kg\", \"%\", \"px\". */\n suffix?: ReactNode;\n isDisabled?: boolean;\n isInvalid?: boolean;\n /** Hide the − / + steppers and keep typing only. */\n hasSteppers?: boolean;\n}\n\n\n/**\n * A quantity, bounded by `min` and `max`. Steppers move by `step` and stop at\n * the bounds; typing is never blocked, an out-of-range value reads invalid.\n */\nexport const NumberField = forwardRef<HTMLInputElement, NumberFieldProps>(function NumberField(\n {\n size = \"md\",\n value,\n defaultValue = \"\",\n onValueChange,\n min,\n max,\n step = 1,\n prefix,\n suffix,\n\n isDisabled = false,\n isInvalid = false,\n hasSteppers = true,\n className,\n disabled,\n \"aria-invalid\": ariaInvalid,\n ...rest\n },\n ref,\n) {\n const [internal, setInternal] = useState<number | \"\">(defaultValue);\n const current = value ?? internal;\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const commit = useCallback(\n (next: number | \"\") => {\n if (value === undefined) setInternal(next);\n onValueChange?.(next);\n },\n [onValueChange, value],\n );\n\n const nudge = (direction: 1 | -1) => {\n const base = current === \"\" ? (min ?? 0) : current;\n let next = base + direction * (step === \"any\" ? 1 : step);\n if (min !== undefined) next = Math.max(min, next);\n if (max !== undefined) next = Math.min(max, next);\n next = Number(next.toFixed(10));\n commit(next);\n inputRef.current?.focus();\n };\n\n const outOfRange =\n current !== \"\" &&\n ((min !== undefined && current < min) || (max !== undefined && current > max));\n\n return (\n <div className={cx(\"ds-number\", className)} data-size={size}>\n {hasSteppers && (\n <Button\n size={size}\n isIconOnly\n iconStart=\"minus\"\n className=\"ds-number__step\"\n aria-label=\"Decrease\"\n isDisabled={isDisabled || disabled || (min !== undefined && current !== \"\" && current <= min)}\n onClick={() => nudge(-1)}\n />\n )}\n <FieldAffix className=\"ds-number__body\" lead={prefix} trail={suffix}>\n <input\n ref={(node) => {\n inputRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n type=\"number\"\n inputMode=\"decimal\"\n value={current}\n min={min}\n max={max}\n step={step}\n disabled={isDisabled || disabled}\n aria-invalid={isInvalid || outOfRange || ariaInvalid || undefined}\n data-size={size}\n className=\"ds-field-skin ds-number__input\"\n onChange={(event) => {\n const raw = event.target.value;\n commit(raw === \"\" ? \"\" : Number(raw));\n }}\n {...rest}\n />\n </FieldAffix>\n\n {hasSteppers && (\n <Button\n size={size}\n isIconOnly\n iconStart=\"plus\"\n className=\"ds-number__step\"\n aria-label=\"Increase\"\n isDisabled={isDisabled || disabled || (max !== undefined && current !== \"\" && current >= max)}\n onClick={() => nudge(1)}\n />\n )}\n </div>\n );\n});\n\nexport interface NumberRangeValue {\n min: number | \"\";\n max: number | \"\";\n}\n\nexport interface NumberRangeFieldProps {\n value?: NumberRangeValue;\n defaultValue?: NumberRangeValue;\n onValueChange?: (value: NumberRangeValue) => void;\n size?: FieldSize;\n /** Hard bounds both ends are clamped to. */\n min?: number;\n max?: number;\n step?: number;\n /** Rendered inside both fields, before the number. */\n prefix?: ReactNode;\n suffix?: ReactNode;\n isDisabled?: boolean;\n minLabel?: string;\n maxLabel?: string;\n}\n\n/**\n * A lower and an upper bound, typed. The pair reads invalid when the minimum\n * passes the maximum — neither field is rewritten behind the user.\n */\nexport function NumberRangeField({\n value,\n defaultValue = { min: \"\", max: \"\" },\n onValueChange,\n size = \"md\",\n min,\n max,\n step = 1,\n prefix,\n suffix,\n isDisabled = false,\n minLabel = \"Minimum\",\n maxLabel = \"Maximum\",\n}: NumberRangeFieldProps) {\n const [internal, setInternal] = useState<NumberRangeValue>(defaultValue);\n const current = value ?? internal;\n\n const commit = (next: NumberRangeValue) => {\n if (value === undefined) setInternal(next);\n onValueChange?.(next);\n };\n\n const crossed = current.min !== \"\" && current.max !== \"\" && current.min > current.max;\n\n return (\n <div className=\"ds-number-range\">\n <NumberField\n aria-label={minLabel}\n size={size}\n value={current.min}\n min={min}\n max={max}\n step={step}\n prefix={prefix}\n suffix={suffix}\n isDisabled={isDisabled}\n isInvalid={crossed}\n onValueChange={(next) => commit({ ...current, min: next })}\n />\n <span className=\"ds-number-range__dash\" aria-hidden=\"true\">\n –\n </span>\n <NumberField\n aria-label={maxLabel}\n size={size}\n value={current.max}\n min={min}\n max={max}\n step={step}\n prefix={prefix}\n suffix={suffix}\n isDisabled={isDisabled}\n isInvalid={crossed}\n onValueChange={(next) => commit({ ...current, max: next })}\n />\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["cx","parts","NumberField","forwardRef","ariaInvalid","rest","internal","setInternal","useState","defaultValue","current","value","inputRef","useRef","commit","useCallback","next","onValueChange","nudge","min","direction","step","max","outOfRange","className","size","hasSteppers","Button","decreaseLabel","isDisabled","disabled","FieldAffix","prefix","suffix","node","ref","isInvalid","raw","event","increaseLabel","NumberRangeField","crossed","minLabel","maxLabel"],"sources":["../../../src/components/NumberField/index.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useRef,\n useState,\n type InputHTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { Button } from \"../Button\";\nimport { FieldAffix } from \"../FieldAffix\";\nimport type { FieldSize } from \"../Field\";\nimport \"../Field/style.css\";\nimport \"./style.css\";\n\nfunction cx(...parts: (string | undefined | false)[]) {\n return parts.filter(Boolean).join(\" \");\n}\n\nexport interface NumberFieldProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\" | \"type\" | \"value\" | \"defaultValue\" | \"onChange\" | \"prefix\"> {\n size?: FieldSize;\n value?: number | \"\";\n defaultValue?: number | \"\";\n onValueChange?: (value: number | \"\") => void;\n min?: number;\n max?: number;\n step?: number | \"any\";\n /** Rendered inside the field, before the number — \"£\", \"$\", a glyph. */\n prefix?: ReactNode;\n /** Rendered inside the field, after the number — \"kg\", \"%\", \"px\". */\n suffix?: ReactNode;\n isDisabled?: boolean;\n isInvalid?: boolean;\n /** Hide the − / + steppers and keep typing only. */\n hasSteppers?: boolean;\n /** Stepper names. Include the field's label when a form has several number fields. */\n decreaseLabel?: string;\n increaseLabel?: string;\n}\n\n\n/**\n * A quantity, bounded by `min` and `max`. Steppers move by `step` and stop at\n * the bounds; typing is never blocked, an out-of-range value reads invalid.\n */\nexport const NumberField = forwardRef<HTMLInputElement, NumberFieldProps>(function NumberField(\n {\n size = \"md\",\n value,\n defaultValue = \"\",\n onValueChange,\n min,\n max,\n step = 1,\n prefix,\n suffix,\n\n isDisabled = false,\n isInvalid = false,\n hasSteppers = true,\n decreaseLabel = \"Decrease\",\n increaseLabel = \"Increase\",\n className,\n disabled,\n \"aria-invalid\": ariaInvalid,\n ...rest\n },\n ref,\n) {\n const [internal, setInternal] = useState<number | \"\">(defaultValue);\n const current = value ?? internal;\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const commit = useCallback(\n (next: number | \"\") => {\n if (value === undefined) setInternal(next);\n onValueChange?.(next);\n },\n [onValueChange, value],\n );\n\n const nudge = (direction: 1 | -1) => {\n const base = current === \"\" ? (min ?? 0) : current;\n let next = base + direction * (step === \"any\" ? 1 : step);\n if (min !== undefined) next = Math.max(min, next);\n if (max !== undefined) next = Math.min(max, next);\n next = Number(next.toFixed(10));\n commit(next);\n inputRef.current?.focus();\n };\n\n const outOfRange =\n current !== \"\" &&\n ((min !== undefined && current < min) || (max !== undefined && current > max));\n\n return (\n <div className={cx(\"ds-number\", className)} data-size={size}>\n {hasSteppers && (\n <Button\n size={size}\n isIconOnly\n iconStart=\"minus\"\n className=\"ds-number__step\"\n aria-label={decreaseLabel}\n isDisabled={isDisabled || disabled || (min !== undefined && current !== \"\" && current <= min)}\n onClick={() => nudge(-1)}\n />\n )}\n <FieldAffix className=\"ds-number__body\" lead={prefix} trail={suffix}>\n <input\n ref={(node) => {\n inputRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n type=\"number\"\n inputMode=\"decimal\"\n value={current}\n min={min}\n max={max}\n step={step}\n disabled={isDisabled || disabled}\n aria-invalid={isInvalid || outOfRange || ariaInvalid || undefined}\n data-size={size}\n className=\"ds-field-skin ds-number__input\"\n onChange={(event) => {\n const raw = event.target.value;\n commit(raw === \"\" ? \"\" : Number(raw));\n }}\n {...rest}\n />\n </FieldAffix>\n\n {hasSteppers && (\n <Button\n size={size}\n isIconOnly\n iconStart=\"plus\"\n className=\"ds-number__step\"\n aria-label={increaseLabel}\n isDisabled={isDisabled || disabled || (max !== undefined && current !== \"\" && current >= max)}\n onClick={() => nudge(1)}\n />\n )}\n </div>\n );\n});\n\nexport interface NumberRangeValue {\n min: number | \"\";\n max: number | \"\";\n}\n\nexport interface NumberRangeFieldProps {\n value?: NumberRangeValue;\n defaultValue?: NumberRangeValue;\n onValueChange?: (value: NumberRangeValue) => void;\n size?: FieldSize;\n /** Hard bounds both ends are clamped to. */\n min?: number;\n max?: number;\n step?: number;\n /** Rendered inside both fields, before the number. */\n prefix?: ReactNode;\n suffix?: ReactNode;\n isDisabled?: boolean;\n minLabel?: string;\n maxLabel?: string;\n}\n\n/**\n * A lower and an upper bound, typed. The pair reads invalid when the minimum\n * passes the maximum — neither field is rewritten behind the user.\n */\nexport function NumberRangeField({\n value,\n defaultValue = { min: \"\", max: \"\" },\n onValueChange,\n size = \"md\",\n min,\n max,\n step = 1,\n prefix,\n suffix,\n isDisabled = false,\n minLabel = \"Minimum\",\n maxLabel = \"Maximum\",\n}: NumberRangeFieldProps) {\n const [internal, setInternal] = useState<NumberRangeValue>(defaultValue);\n const current = value ?? internal;\n\n const commit = (next: NumberRangeValue) => {\n if (value === undefined) setInternal(next);\n onValueChange?.(next);\n };\n\n const crossed = current.min !== \"\" && current.max !== \"\" && current.min > current.max;\n\n return (\n <div className=\"ds-number-range\">\n <NumberField\n aria-label={minLabel}\n size={size}\n value={current.min}\n min={min}\n max={max}\n step={step}\n prefix={prefix}\n suffix={suffix}\n isDisabled={isDisabled}\n isInvalid={crossed}\n onValueChange={(next) => commit({ ...current, min: next })}\n />\n <span className=\"ds-number-range__dash\" aria-hidden=\"true\">\n –\n </span>\n <NumberField\n aria-label={maxLabel}\n size={size}\n value={current.max}\n min={min}\n max={max}\n step={step}\n prefix={prefix}\n suffix={suffix}\n isDisabled={isDisabled}\n isInvalid={crossed}\n onValueChange={(next) => commit({ ...current, max: next })}\n />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require("../Field/index.cjs"),require("../TextField/index.cjs");const e=require("../../chunks/RichTextEditor-BxtlbjXj.cjs");exports.RichTextEditor=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require("../Field/index.cjs");const e=require("../../chunks/RichTextEditor-BxtlbjXj.cjs");exports.RichTextEditor=e.t;
@@ -1,3 +1,2 @@
1
1
  import "../Field/index.js";
2
- import "../TextField/index.js";
3
2
  export { t as RichTextEditor } from "../../chunks/RichTextEditor-Dnx4i7bQ.js";
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../Grid/index.cjs");let t=require("react"),n=require("react/jsx-runtime");function r({kind:e,title:t,description:r,children:i,className:a,inputProps:o,inputRef:s}){return(0,n.jsxs)(`label`,{className:[`ds-selection-card`,a].filter(Boolean).join(` `),children:[(0,n.jsx)(`input`,{ref:s,type:e,"data-kind":e,className:`ds-selection-card__control`,...o}),(0,n.jsxs)(`span`,{className:`ds-selection-card__text`,children:[(0,n.jsx)(`span`,{className:`ds-selection-card__title`,children:t}),r&&(0,n.jsx)(`span`,{className:`ds-selection-card__description`,children:r}),i&&(0,n.jsx)(`span`,{className:`ds-selection-card__extra`,children:i})]})]})}var i=(0,t.forwardRef)(function({title:e,description:t,children:i,className:a,...o},s){return(0,n.jsx)(r,{kind:`checkbox`,title:e,description:t,className:a,inputProps:o,inputRef:s,children:i})}),a=(0,t.forwardRef)(function({title:e,description:t,children:i,className:a,...o},s){return(0,n.jsx)(r,{kind:`radio`,title:e,description:t,className:a,inputProps:o,inputRef:s,children:i})});function o({label:t,columns:r=2,children:i}){return(0,n.jsxs)(`fieldset`,{className:`ds-selection-card-group`,children:[(0,n.jsx)(`legend`,{className:`ds-selection-card-group__label`,children:t}),(0,n.jsx)(e.Grid,{columns:r,gap:`sm`,className:`ds-selection-card-group__grid`,children:i})]})}exports.CheckboxCard=i,exports.RadioCard=a,exports.SelectionCardGroup=o;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../Grid/index.cjs");let t=require("react"),n=require("react/jsx-runtime");function r({kind:e,title:t,description:r,children:i,className:a,inputProps:o,inputRef:s}){return(0,n.jsxs)(`label`,{className:[`ds-selection-card`,a].filter(Boolean).join(` `),children:[(0,n.jsx)(`input`,{ref:s,type:e,"data-kind":e,className:`ds-selection-card__control`,...o}),(0,n.jsxs)(`span`,{className:`ds-selection-card__text`,children:[(0,n.jsx)(`span`,{className:`ds-selection-card__title`,children:t}),r&&(0,n.jsx)(`span`,{className:`ds-selection-card__description`,children:r}),i&&(0,n.jsx)(`span`,{className:`ds-selection-card__extra`,children:i})]})]})}var i=(0,t.forwardRef)(function({title:e,description:t,children:i,className:a,...o},s){return(0,n.jsx)(r,{kind:`checkbox`,title:e,description:t,className:a,inputProps:o,inputRef:s,children:i})}),a=(0,t.forwardRef)(function({title:e,description:t,children:i,className:a,...o},s){return(0,n.jsx)(r,{kind:`radio`,title:e,description:t,className:a,inputProps:o,inputRef:s,children:i})});function o({label:t,columns:r=2,gap:i=`md`,children:a}){return(0,n.jsxs)(`fieldset`,{className:`ds-selection-card-group`,children:[(0,n.jsx)(`legend`,{className:`ds-selection-card-group__label`,children:t}),(0,n.jsx)(e.Grid,{columns:r,gap:i,className:`ds-selection-card-group__grid`,children:a})]})}exports.CheckboxCard=i,exports.RadioCard=a,exports.SelectionCardGroup=o;
2
2
  //# sourceMappingURL=index.cjs.map