@namroodinc/liquid-editorial 0.1.0 → 0.1.2

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 (72) hide show
  1. package/README.md +62 -1
  2. package/dist/chunks/EntryEditor-BF808OZR.js +181 -0
  3. package/dist/chunks/EntryEditor-BF808OZR.js.map +1 -0
  4. package/dist/chunks/EntryEditor-cjDk4vdH.cjs +2 -0
  5. package/dist/chunks/EntryEditor-cjDk4vdH.cjs.map +1 -0
  6. package/dist/chunks/RichTextEditor-DRt-kibg.js +248 -0
  7. package/dist/chunks/RichTextEditor-DRt-kibg.js.map +1 -0
  8. package/dist/chunks/RichTextEditor-tFkISOvq.cjs +2 -0
  9. package/dist/chunks/RichTextEditor-tFkISOvq.cjs.map +1 -0
  10. package/dist/components/EntryEditor/index.cjs +1 -0
  11. package/dist/components/EntryEditor/index.d.cts +21 -0
  12. package/dist/components/EntryEditor/index.d.cts.map +1 -0
  13. package/dist/components/EntryEditor/index.d.ts +21 -0
  14. package/dist/components/EntryEditor/index.d.ts.map +1 -0
  15. package/dist/components/EntryEditor/index.js +6 -0
  16. package/dist/components/EntryEditor/model.d.cts +33 -0
  17. package/dist/components/EntryEditor/model.d.cts.map +1 -0
  18. package/dist/components/EntryEditor/model.d.ts +33 -0
  19. package/dist/components/EntryEditor/model.d.ts.map +1 -0
  20. package/dist/components/EntryEditor/style.css +8 -0
  21. package/dist/components/EntryPicker/index.cjs +1 -1
  22. package/dist/components/EntryPicker/index.cjs.map +1 -1
  23. package/dist/components/EntryPicker/index.d.cts.map +1 -1
  24. package/dist/components/EntryPicker/index.d.ts.map +1 -1
  25. package/dist/components/EntryPicker/index.js +15 -12
  26. package/dist/components/EntryPicker/index.js.map +1 -1
  27. package/dist/components/Field/index.cjs +1 -1
  28. package/dist/components/Field/index.cjs.map +1 -1
  29. package/dist/components/Field/index.d.cts +4 -1
  30. package/dist/components/Field/index.d.cts.map +1 -1
  31. package/dist/components/Field/index.d.ts +4 -1
  32. package/dist/components/Field/index.d.ts.map +1 -1
  33. package/dist/components/Field/index.js +29 -23
  34. package/dist/components/Field/index.js.map +1 -1
  35. package/dist/components/Field/style.css +12 -0
  36. package/dist/components/Modal/style.css +1 -0
  37. package/dist/components/NumberField/index.cjs +1 -1
  38. package/dist/components/NumberField/index.cjs.map +1 -1
  39. package/dist/components/NumberField/index.d.cts +1 -1
  40. package/dist/components/NumberField/index.d.cts.map +1 -1
  41. package/dist/components/NumberField/index.d.ts +1 -1
  42. package/dist/components/NumberField/index.d.ts.map +1 -1
  43. package/dist/components/NumberField/index.js +1 -1
  44. package/dist/components/NumberField/index.js.map +1 -1
  45. package/dist/components/RichTextEditor/document.d.cts +10 -0
  46. package/dist/components/RichTextEditor/document.d.cts.map +1 -0
  47. package/dist/components/RichTextEditor/document.d.ts +10 -0
  48. package/dist/components/RichTextEditor/document.d.ts.map +1 -0
  49. package/dist/components/RichTextEditor/index.cjs +1 -2
  50. package/dist/components/RichTextEditor/index.d.cts +21 -6
  51. package/dist/components/RichTextEditor/index.d.cts.map +1 -1
  52. package/dist/components/RichTextEditor/index.d.ts +21 -6
  53. package/dist/components/RichTextEditor/index.d.ts.map +1 -1
  54. package/dist/components/RichTextEditor/index.js +1 -175
  55. package/dist/components/SortableList/index.cjs +1 -1
  56. package/dist/components/SortableList/index.cjs.map +1 -1
  57. package/dist/components/SortableList/index.d.cts +4 -3
  58. package/dist/components/SortableList/index.d.cts.map +1 -1
  59. package/dist/components/SortableList/index.d.ts +4 -3
  60. package/dist/components/SortableList/index.d.ts.map +1 -1
  61. package/dist/components/SortableList/index.js +55 -48
  62. package/dist/components/SortableList/index.js.map +1 -1
  63. package/dist/index.cjs +1 -1
  64. package/dist/index.d.cts +3 -1
  65. package/dist/index.d.cts.map +1 -1
  66. package/dist/index.d.ts +3 -1
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +36 -35
  69. package/dist/styles.css +1 -0
  70. package/package.json +37 -11
  71. package/dist/components/RichTextEditor/index.cjs.map +0 -1
  72. package/dist/components/RichTextEditor/index.js.map +0 -1
@@ -6,14 +6,17 @@ export interface FieldProps {
6
6
  /** Present means invalid: the message renders and the control is marked. */
7
7
  error?: string;
8
8
  isRequired?: boolean;
9
+ /** Use a legend for a field containing a group of controls. */
10
+ isGroup?: boolean;
9
11
  /** Receives the ids and invalid flag the control must carry. */
10
12
  children: (props: {
11
13
  id: string;
12
14
  "aria-describedby"?: string;
15
+ "aria-labelledby": string;
13
16
  "aria-invalid"?: true;
14
17
  required?: boolean;
15
18
  }) => ReactNode;
16
19
  }
17
20
  /** Label, hint, error and required marker around any control wearing the field skin. */
18
- export declare function Field({ label, hint, error, isRequired, children }: FieldProps): import("react").JSX.Element;
21
+ export declare function Field({ label, hint, error, isRequired, isGroup, children }: FieldProps): import("react").JSX.Element;
19
22
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/components/Field/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,oBAAoB,CAAC;AAE5B,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gEAAgE;IAChE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAChB,EAAE,EAAE,MAAM,CAAC;QACX,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,cAAc,CAAC,EAAE,IAAI,CAAC;QACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,KAAK,SAAS,CAAC;CACjB;AAED,wFAAwF;AACxF,wBAAgB,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,UAAU,+BAkC7E"}
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/components/Field/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,oBAAoB,CAAC;AAE5B,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gEAAgE;IAChE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAChB,EAAE,EAAE,MAAM,CAAC;QACX,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,cAAc,CAAC,EAAE,IAAI,CAAC;QACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,KAAK,SAAS,CAAC;CACjB;AAED,wFAAwF;AACxF,wBAAgB,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,OAAe,EAAE,QAAQ,EAAE,EAAE,UAAU,+BAiC9F"}
@@ -6,14 +6,17 @@ export interface FieldProps {
6
6
  /** Present means invalid: the message renders and the control is marked. */
7
7
  error?: string;
8
8
  isRequired?: boolean;
9
+ /** Use a legend for a field containing a group of controls. */
10
+ isGroup?: boolean;
9
11
  /** Receives the ids and invalid flag the control must carry. */
10
12
  children: (props: {
11
13
  id: string;
12
14
  "aria-describedby"?: string;
15
+ "aria-labelledby": string;
13
16
  "aria-invalid"?: true;
14
17
  required?: boolean;
15
18
  }) => ReactNode;
16
19
  }
17
20
  /** Label, hint, error and required marker around any control wearing the field skin. */
18
- export declare function Field({ label, hint, error, isRequired, children }: FieldProps): import("react").JSX.Element;
21
+ export declare function Field({ label, hint, error, isRequired, isGroup, children }: FieldProps): import("react").JSX.Element;
19
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Field/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,oBAAoB,CAAC;AAE5B,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gEAAgE;IAChE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAChB,EAAE,EAAE,MAAM,CAAC;QACX,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,cAAc,CAAC,EAAE,IAAI,CAAC;QACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,KAAK,SAAS,CAAC;CACjB;AAED,wFAAwF;AACxF,wBAAgB,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,UAAU,+BAkC7E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Field/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,oBAAoB,CAAC;AAE5B,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gEAAgE;IAChE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAChB,EAAE,EAAE,MAAM,CAAC;QACX,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,cAAc,CAAC,EAAE,IAAI,CAAC;QACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,KAAK,SAAS,CAAC;CACjB;AAED,wFAAwF;AACxF,wBAAgB,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,OAAe,EAAE,QAAQ,EAAE,EAAE,UAAU,+BAiC9F"}
@@ -1,41 +1,47 @@
1
1
  /* empty css */
2
2
  import { useId as e } from "react";
3
- import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
+ import { Fragment as t, jsx as n, jsxs as r } from "react/jsx-runtime";
4
4
  //#region src/components/Field/index.tsx
5
- function r({ label: r, hint: i, error: a, isRequired: o, children: s }) {
6
- let c = e(), l = `${c}-hint`, u = `${c}-error`;
7
- return /* @__PURE__ */ n("div", {
5
+ function i({ label: i, hint: a, error: o, isRequired: s, isGroup: c = !1, children: l }) {
6
+ let u = e(), d = `${u}-hint`, f = `${u}-error`, p = o ? f : a ? d : void 0, m = `${u}-label`, h = c ? "fieldset" : "div", g = /* @__PURE__ */ r(t, { children: [i, s && /* @__PURE__ */ n("span", {
7
+ className: "ds-field__required",
8
+ "aria-hidden": "true",
9
+ children: "*"
10
+ })] });
11
+ return /* @__PURE__ */ r(h, {
8
12
  className: "ds-field",
9
13
  children: [
10
- /* @__PURE__ */ n("label", {
14
+ c ? /* @__PURE__ */ n("legend", {
15
+ id: m,
11
16
  className: "ds-field__label",
12
- htmlFor: c,
13
- children: [r, o && /* @__PURE__ */ t("span", {
14
- className: "ds-field__required",
15
- "aria-hidden": "true",
16
- children: "*"
17
- })]
17
+ children: g
18
+ }) : /* @__PURE__ */ n("label", {
19
+ id: m,
20
+ className: "ds-field__label",
21
+ htmlFor: u,
22
+ children: g
18
23
  }),
19
- s({
20
- id: c,
21
- "aria-describedby": a ? u : i ? l : void 0,
22
- "aria-invalid": a ? !0 : void 0,
23
- required: o
24
+ l({
25
+ id: u,
26
+ "aria-describedby": p,
27
+ "aria-labelledby": m,
28
+ "aria-invalid": o ? !0 : void 0,
29
+ required: s
24
30
  }),
25
- i && !a && /* @__PURE__ */ t("span", {
31
+ a && !o && /* @__PURE__ */ n("span", {
26
32
  className: "ds-field__hint",
27
- id: l,
28
- children: i
33
+ id: d,
34
+ children: a
29
35
  }),
30
- a && /* @__PURE__ */ t("span", {
36
+ o && /* @__PURE__ */ n("span", {
31
37
  className: "ds-field__error",
32
- id: u,
33
- children: a
38
+ id: f,
39
+ children: o
34
40
  })
35
41
  ]
36
42
  });
37
43
  }
38
44
  //#endregion
39
- export { r as Field };
45
+ export { i as Field };
40
46
 
41
47
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Field","id","useId","hintId","errorId","label","isRequired","children","error","hint"],"sources":["../../../src/components/Field/index.tsx"],"sourcesContent":["import { useId, type ReactNode } from \"react\";\nimport \"../Field/style.css\";\n\nexport type FieldSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface FieldProps {\n label: string;\n hint?: string;\n /** Present means invalid: the message renders and the control is marked. */\n error?: string;\n isRequired?: boolean;\n /** Receives the ids and invalid flag the control must carry. */\n children: (props: {\n id: string;\n \"aria-describedby\"?: string;\n \"aria-invalid\"?: true;\n required?: boolean;\n }) => ReactNode;\n}\n\n/** Label, hint, error and required marker around any control wearing the field skin. */\nexport function Field({ label, hint, error, isRequired, children }: FieldProps) {\n const id = useId();\n const hintId = `${id}-hint`;\n const errorId = `${id}-error`;\n const describedBy = error ? errorId : hint ? hintId : undefined;\n\n return (\n <div className=\"ds-field\">\n <label className=\"ds-field__label\" htmlFor={id}>\n {label}\n {isRequired && (\n <span className=\"ds-field__required\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n {children({\n id,\n \"aria-describedby\": describedBy,\n \"aria-invalid\": error ? true : undefined,\n required: isRequired,\n })}\n {hint && !error && (\n <span className=\"ds-field__hint\" id={hintId}>\n {hint}\n </span>\n )}\n {error && (\n <span className=\"ds-field__error\" id={errorId}>\n {error}\n </span>\n )}\n </div>\n );\n}\n"],"mappings":";;;;AAqBA,SAAgBA,EAAM,EAAE,UAAO,SAAM,UAAO,eAAY,eAAwB;CAC9E,IAAMC,IAAKC,EAAM,GACXC,IAAS,GAAGF,EAAG,QACfG,IAAU,GAAGH,EAAG;CAGtB,OACE,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,kBAAC,SAAD;IAAO,WAAU;IAAkB,SAASA;IAA5C,UAAA,CACGI,GACAC,KACC,kBAAC,QAAD;KAAM,WAAU;KAAqB,eAAY;KAAO,UAAA;IAElD,CAAA,CAEH;;GACNC,EAAS;IACR;IACA,oBAdcC,IAAQJ,IAAUK,IAAON,IAAS,KAAA;IAehD,gBAAgBK,IAAQ,KAAO,KAAA;IAC/B,UAAUF;GACZ,CAAC;GACAG,KAAQ,CAACD,KACR,kBAAC,QAAD;IAAM,WAAU;IAAiB,IAAIL;IAClC,UAAAM;GACG,CAAA;GAEPD,KACC,kBAAC,QAAD;IAAM,WAAU;IAAkB,IAAIJ;IACnC,UAAAI;GACG,CAAA;EAEL;;AAET"}
1
+ {"version":3,"file":"index.js","names":["_Fragment","Field","id","useId","hintId","errorId","describedBy","error","hint","labelId","Wrapper","isGroup","labelContent","Fragment","label","isRequired","children"],"sources":["../../../src/components/Field/index.tsx"],"sourcesContent":["import { useId, type ReactNode } from \"react\";\nimport \"../Field/style.css\";\n\nexport type FieldSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface FieldProps {\n label: string;\n hint?: string;\n /** Present means invalid: the message renders and the control is marked. */\n error?: string;\n isRequired?: boolean;\n /** Use a legend for a field containing a group of controls. */\n isGroup?: boolean;\n /** Receives the ids and invalid flag the control must carry. */\n children: (props: {\n id: string;\n \"aria-describedby\"?: string;\n \"aria-labelledby\": string;\n \"aria-invalid\"?: true;\n required?: boolean;\n }) => ReactNode;\n}\n\n/** Label, hint, error and required marker around any control wearing the field skin. */\nexport function Field({ label, hint, error, isRequired, isGroup = false, children }: FieldProps) {\n const id = useId();\n const hintId = `${id}-hint`;\n const errorId = `${id}-error`;\n const describedBy = error ? errorId : hint ? hintId : undefined;\n const labelId = `${id}-label`;\n const Wrapper = isGroup ? \"fieldset\" : \"div\";\n const labelContent = <>{label}{isRequired && <span className=\"ds-field__required\" aria-hidden=\"true\">*</span>}</>;\n\n return (\n <Wrapper className=\"ds-field\">\n {isGroup\n ? <legend id={labelId} className=\"ds-field__label\">{labelContent}</legend>\n : <label id={labelId} className=\"ds-field__label\" htmlFor={id}>{labelContent}</label>}\n {children({\n id,\n \"aria-describedby\": describedBy,\n \"aria-labelledby\": labelId,\n \"aria-invalid\": error ? true : undefined,\n required: isRequired,\n })}\n {hint && !error && (\n <span className=\"ds-field__hint\" id={hintId}>\n {hint}\n </span>\n )}\n {error && (\n <span className=\"ds-field__error\" id={errorId}>\n {error}\n </span>\n )}\n </Wrapper>\n );\n}\n"],"mappings":";;;;AAwBA,SAAgBC,EAAM,EAAE,UAAO,SAAM,UAAO,eAAY,aAAU,IAAO,eAAwB;CAC/F,IAAMC,IAAKC,EAAM,GACXC,IAAS,GAAGF,EAAG,QACfG,IAAU,GAAGH,EAAG,SAChBI,IAAcC,IAAQF,IAAUG,IAAOJ,IAAS,KAAA,GAChDK,IAAU,GAAGP,EAAG,SAChBQ,IAAUC,IAAU,aAAa,OACjCC,IAAe,kBAAAZ,GAAA,EAAA,UAAA,CAAGc,GAAOC,KAAc,kBAAC,QAAD;EAAM,WAAU;EAAqB,eAAY;EAAO,UAAA;CAAO,CAAA,CAAI,EAAA,CAAA;CAEhH,OACE,kBAACL,GAAD;EAAS,WAAU;EAAnB,UAAA;GACGC,IACG,kBAAC,UAAD;IAAQ,IAAIF;IAAS,WAAU;IAAmB,UAAAG;GAAqB,CAAA,IACvE,kBAAC,SAAD;IAAO,IAAIH;IAAS,WAAU;IAAkB,SAASP;IAAK,UAAAU;GAAoB,CAAA;GACrFI,EAAS;IACR;IACA,oBAAoBV;IACpB,mBAAmBG;IACnB,gBAAgBF,IAAQ,KAAO,KAAA;IAC/B,UAAUQ;GACZ,CAAC;GACAP,KAAQ,CAACD,KACR,kBAAC,QAAD;IAAM,WAAU;IAAiB,IAAIH;IAClC,UAAAI;GACG,CAAA;GAEPD,KACC,kBAAC,QAAD;IAAM,WAAU;IAAkB,IAAIF;IACnC,UAAAE;GACG,CAAA;EAED;;AAEb"}
@@ -82,6 +82,18 @@
82
82
  font-weight: var(--font-weight-semibold);
83
83
  }
84
84
 
85
+ fieldset.ds-field {
86
+ min-inline-size: 0;
87
+ margin: 0;
88
+ padding: 0;
89
+ border: 0;
90
+ }
91
+
92
+ fieldset.ds-field > legend {
93
+ padding: 0;
94
+ margin-block-end: var(--space-2);
95
+ }
96
+
85
97
  .ds-field__required {
86
98
  margin-inline-start: var(--space-1);
87
99
  color: var(--color-danger);
@@ -23,6 +23,7 @@
23
23
  border-radius: var(--overlay-radius);
24
24
  box-shadow: var(--shadow-lg);
25
25
  animation: ds-modal-in var(--duration-panel) var(--ease-panel);
26
+ overflow: hidden;
26
27
  }
27
28
 
28
29
  .ds-modal[data-size="dialog"] {
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/Icon-CWsA1W83.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;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)(`button`,{type:`button`,className:`ds-number__step`,"aria-label":`Decrease`,disabled:m||v||l!==void 0&&w!==``&&w<=l,onClick:()=>D(-1),children:(0,r.jsx)(e.t,{name:`minus`,size:16})}),(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)(`button`,{type:`button`,className:`ds-number__step`,"aria-label":`Increase`,disabled:m||v||u!==void 0&&w!==``&&w>=u,onClick:()=>D(1),children:(0,r.jsx)(e.t,{name:`plus`,size:16})})]})});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("../../chunks/Icon-CWsA1W83.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)(`button`,{type:`button`,className:`ds-number__step`,"aria-label":`Decrease`,disabled:m||v||l!==void 0&&w!==``&&w<=l,onClick:()=>D(-1),children:(0,r.jsx)(e.t,{name:`minus`,size:16})}),(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)(`button`,{type:`button`,className:`ds-number__step`,"aria-label":`Increase`,disabled:m||v||u!==void 0&&w!==``&&w>=u,onClick:()=>D(1),children:(0,r.jsx)(e.t,{name:`plus`,size:16})})]})});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","Icon","FieldAffix","require_Icon","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 { Icon } from \"../Icon\";\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;\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;\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 type=\"button\"\n className=\"ds-number__step\"\n aria-label=\"Decrease\"\n disabled={isDisabled || disabled || (min !== undefined && current !== \"\" && current <= min)}\n onClick={() => nudge(-1)}\n >\n <Icon name=\"minus\" size={16} />\n </button>\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 type=\"button\"\n className=\"ds-number__step\"\n aria-label=\"Increase\"\n disabled={isDisabled || disabled || (max !== undefined && current !== \"\" && current >= max)}\n onClick={() => nudge(1)}\n >\n <Icon name=\"plus\" size={16} />\n </button>\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":"A,iQAcA,SAASU,EAAG,GAAGC,EAAuC,CACpD,OAAOA,EAAM,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,CACvC,CA0BA,IAAaC,GAAA,EAAcZ,EAAAA,WAAAA,CAA+C,SACxE,CACE,OAAO,KACP,QACA,eAAe,GACf,gBACA,MACA,MACA,OAAO,EACP,SACA,SAEA,aAAa,GACb,YAAY,GACZ,cAAc,GACd,YACA,WACA,eAAgBa,EAChB,GAAGC,GAEL,EACA,CACA,GAAM,CAACC,EAAUC,IAAA,EAAef,EAAAA,SAAAA,CAAsBgB,CAAY,EAC5DC,EAAUC,GAASJ,EACnBK,GAAA,EAAWlB,EAAAA,OAAAA,CAAgC,IAAI,EAE/CmB,GAAA,EAASlB,EAAAA,YAAAA,CACZ,GAAsB,CACjBgB,IAAU,IAAA,IAAWH,EAAYM,CAAI,EACzCC,IAAgBD,CAAI,CACtB,EACA,CAACC,EAAeJ,CAAK,CACvB,EAEMK,EAAS,GAAsB,CAEnC,IAAIF,GADSJ,IAAY,GAAMO,GAAO,EAAKP,GACzBQ,EAAYC,EAC1BF,IAAQ,IAAA,KAAW,EAAO,KAAK,IAAIA,EAAKH,CAAI,GAC5CM,IAAQ,IAAA,KAAW,EAAO,KAAK,IAAIA,EAAKN,CAAI,GAChD,EAAO,OAAOA,EAAK,QAAQ,EAAE,CAAC,EAC9BD,EAAOC,CAAI,EACXF,EAAS,SAAS,MAAM,CAC1B,EAEMS,EACJX,IAAY,KACVO,IAAQ,IAAA,IAAaP,EAAUO,GAASG,IAAQ,IAAA,IAAaV,EAAUU,GAE3E,OACE,EAAAnB,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWC,EAAG,YAAaoB,CAAS,EAAG,YAAWC,EAAvD,SAAA,CACGC,IACC,EAAAvB,EAAA,IAAA,CAAC,SAAD,CACE,KAAK,SACL,UAAU,kBACV,aAAW,WACX,SAAUwB,GAAcC,GAAaT,IAAQ,IAAA,IAAaP,IAAY,IAAMA,GAAWO,EACvF,YAAeD,EAAM,EAAE,EAEvB,UAAA,EAAAf,EAAA,IAAA,CAACL,EAAAA,EAAD,CAAM,KAAK,QAAQ,KAAM,EAAK,CAAA,CACxB,CAAA,GAEV,EAAAK,EAAA,IAAA,CAACJ,EAAAA,WAAD,CAAY,UAAU,kBAAkB,KAAM8B,EAAQ,MAAOC,EAC3D,UAAA,EAAA3B,EAAA,IAAA,CAAC,QAAD,CACE,IAAM,GAAS,CACb,EAAS,QAAU4B,EACf,OAAOC,GAAQ,WAAYA,EAAID,CAAI,EAC9BC,IAAK,EAAI,QAAUD,EAC9B,EACA,KAAK,SACL,UAAU,UACV,MAAOnB,EACF,MACA,MACC,OACN,SAAUe,GAAcC,EACxB,eAAcK,GAAaV,GAAchB,GAAe,IAAA,GACxD,YAAWkB,EACX,UAAU,iCACV,SAAW,GAAU,CACnB,IAAMS,EAAMC,EAAM,OAAO,MACzBpB,EAAOmB,IAAQ,GAAK,GAAK,OAAOA,CAAG,CAAC,CACtC,EACA,GAAI1B,CACL,CAAA,CACS,CAAA,EAEXkB,IACC,EAAAvB,EAAA,IAAA,CAAC,SAAD,CACE,KAAK,SACL,UAAU,kBACV,aAAW,WACX,SAAUwB,GAAcC,GAAaN,IAAQ,IAAA,IAAaV,IAAY,IAAMA,GAAWU,EACvF,YAAeJ,EAAM,CAAC,EAEtB,UAAA,EAAAf,EAAA,IAAA,CAACL,EAAAA,EAAD,CAAM,KAAK,OAAO,KAAM,EAAK,CAAA,CACvB,CAAA,CAEP,C,EAET,CAAC,EA4BD,SAAgBsC,EAAiB,CAC/B,QACA,eAAe,CAAE,IAAK,GAAI,IAAK,EAAG,EAClC,gBACA,OAAO,KACP,MACA,MACA,OAAO,EACP,SACA,SACA,aAAa,GACb,WAAW,UACX,WAAW,WACa,CACxB,GAAM,CAAC3B,EAAUC,IAAA,EAAef,EAAAA,SAAAA,CAA2BgB,CAAY,EACjEC,EAAUC,GAASJ,EAEnBM,EAAU,GAA2B,CACrCF,IAAU,IAAA,IAAWH,EAAYM,CAAI,EACzCC,IAAgBD,CAAI,CACtB,EAEMqB,EAAUzB,EAAQ,MAAQ,IAAMA,EAAQ,MAAQ,IAAMA,EAAQ,IAAMA,EAAQ,IAElF,OACE,EAAAT,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,kBAAf,SAAA,EACE,EAAAA,EAAA,IAAA,CAACG,EAAD,CACE,aAAYgC,EACN,OACN,MAAO1B,EAAQ,IACV,MACA,MACC,OACE,SACA,SACI,aACZ,UAAWyB,EACX,cAAgB,GAAStB,EAAO,CAAE,GAAGH,EAAS,IAAKI,CAAK,CAAC,CAC1D,CAAA,GACD,EAAAb,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,wBAAwB,cAAY,OAAO,SAAA,GAErD,CAAA,GACN,EAAAA,EAAA,IAAA,CAACG,EAAD,CACE,aAAYiC,EACN,OACN,MAAO3B,EAAQ,IACV,MACA,MACC,OACE,SACA,SACI,aACZ,UAAWyB,EACX,cAAgB,GAAStB,EAAO,CAAE,GAAGH,EAAS,IAAKI,CAAK,CAAC,CAC1D,CAAA,CACE,C,EAET,C"}
1
+ {"version":3,"file":"index.cjs","names":["forwardRef","useState","useRef","useCallback","Icon","FieldAffix","require_Icon","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 { Icon } from \"../Icon\";\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 type=\"button\"\n className=\"ds-number__step\"\n aria-label=\"Decrease\"\n disabled={isDisabled || disabled || (min !== undefined && current !== \"\" && current <= min)}\n onClick={() => nudge(-1)}\n >\n <Icon name=\"minus\" size={16} />\n </button>\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 type=\"button\"\n className=\"ds-number__step\"\n aria-label=\"Increase\"\n disabled={isDisabled || disabled || (max !== undefined && current !== \"\" && current >= max)}\n onClick={() => nudge(1)}\n >\n <Icon name=\"plus\" size={16} />\n </button>\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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"}
@@ -7,7 +7,7 @@ export interface NumberFieldProps extends Omit<InputHTMLAttributes<HTMLInputElem
7
7
  onValueChange?: (value: number | "") => void;
8
8
  min?: number;
9
9
  max?: number;
10
- step?: number;
10
+ step?: number | "any";
11
11
  /** Rendered inside the field, before the number — "£", "$", a glyph. */
12
12
  prefix?: ReactNode;
13
13
  /** Rendered inside the field, after the number — "kg", "%", "px". */
@@ -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,CAAC;IACd,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;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"}
@@ -7,7 +7,7 @@ export interface NumberFieldProps extends Omit<InputHTMLAttributes<HTMLInputElem
7
7
  onValueChange?: (value: number | "") => void;
8
8
  min?: number;
9
9
  max?: number;
10
- step?: number;
10
+ step?: number | "any";
11
11
  /** Rendered inside the field, before the number — "£", "$", a glyph. */
12
12
  prefix?: ReactNode;
13
13
  /** Rendered inside the field, after the number — "kg", "%", "px". */
@@ -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,CAAC;IACd,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;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"}
@@ -11,7 +11,7 @@ var l = n(function({ size: n = "md", value: l, defaultValue: u = "", onValueChan
11
11
  let [T, E] = a(u), D = l ?? T, O = i(null), k = r((e) => {
12
12
  l === void 0 && E(e), d?.(e);
13
13
  }, [d, l]), A = (e) => {
14
- let t = (D === "" ? f ?? 0 : D) + e * m;
14
+ let t = (D === "" ? f ?? 0 : D) + e * (m === "any" ? 1 : m);
15
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
16
  }, j = D !== "" && (f !== void 0 && D < f || p !== void 0 && D > p);
17
17
  return /* @__PURE__ */ s("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Icon","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","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 { Icon } from \"../Icon\";\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;\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;\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 type=\"button\"\n className=\"ds-number__step\"\n aria-label=\"Decrease\"\n disabled={isDisabled || disabled || (min !== undefined && current !== \"\" && current <= min)}\n onClick={() => nudge(-1)}\n >\n <Icon name=\"minus\" size={16} />\n </button>\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 type=\"button\"\n className=\"ds-number__step\"\n aria-label=\"Increase\"\n disabled={isDisabled || disabled || (max !== undefined && current !== \"\" && current >= max)}\n onClick={() => nudge(1)}\n >\n <Icon name=\"plus\" size={16} />\n </button>\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":";;;;;;AAcA,SAASC,EAAG,GAAGC,GAAuC;CACpD,OAAOA,EAAM,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AACvC;AA0BA,IAAaC,IAAcC,EAA+C,SACxE,EACE,UAAO,MACP,UACA,kBAAe,IACf,kBACA,QACA,QACA,UAAO,GACP,WACA,WAEA,gBAAa,IACb,eAAY,IACZ,iBAAc,IACd,cACA,aACA,gBAAgBC,GAChB,GAAGC,KAEL,GACA;CACA,IAAM,CAACC,GAAUC,KAAeC,EAAsBC,CAAY,GAC5DC,IAAUC,KAASL,GACnBM,IAAWC,EAAgC,IAAI,GAE/CC,IAASC,GACZ,MAAsB;EAErB,AADIJ,MAAU,KAAA,KAAWJ,EAAYS,CAAI,GACzCC,IAAgBD,CAAI;CACtB,GACA,CAACC,GAAeN,CAAK,CACvB,GAEMO,KAAS,MAAsB;EAEnC,IAAIF,KADSN,MAAY,KAAMS,KAAO,IAAKT,KACzBU,IAAYC;EAK9B,AAJIF,MAAQ,KAAA,MAAW,IAAO,KAAK,IAAIA,GAAKH,CAAI,IAC5CM,MAAQ,KAAA,MAAW,IAAO,KAAK,IAAIA,GAAKN,CAAI,IAChD,IAAO,OAAOA,EAAK,QAAQ,EAAE,CAAC,GAC9BF,EAAOE,CAAI,GACXJ,EAAS,SAAS,MAAM;CAC1B,GAEMW,IACJb,MAAY,OACVS,MAAQ,KAAA,KAAaT,IAAUS,KAASG,MAAQ,KAAA,KAAaZ,IAAUY;CAE3E,OACE,kBAAC,OAAD;EAAK,WAAWtB,EAAG,aAAawB,CAAS;EAAG,aAAWC;EAAvD,UAAA;GACGC,KACC,kBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,cAAW;IACX,UAAUC,KAAcC,KAAaT,MAAQ,KAAA,KAAaT,MAAY,MAAMA,KAAWS;IACvF,eAAeD,EAAM,EAAE;IAEvB,UAAA,kBAACnB,GAAD;KAAM,MAAK;KAAQ,MAAM;IAAK,CAAA;GACxB,CAAA;GAEV,kBAAC8B,GAAD;IAAY,WAAU;IAAkB,MAAMC;IAAQ,OAAOC;IAC3D,UAAA,kBAAC,SAAD;KACE,MAAM,MAAS;MAEb,AADA,EAAS,UAAUC,GACf,OAAOC,KAAQ,aAAYA,EAAID,CAAI,IAC9BC,MAAK,EAAI,UAAUD;KAC9B;KACA,MAAK;KACL,WAAU;KACV,OAAOtB;KACF;KACA;KACC;KACN,UAAUiB,KAAcC;KACxB,gBAAcM,KAAaX,KAAcnB,KAAe,KAAA;KACxD,aAAWqB;KACX,WAAU;KACV,WAAW,MAAU;MACnB,IAAMU,IAAMC,EAAM,OAAO;MACzB,EAAOD,MAAQ,KAAK,KAAK,OAAOA,CAAG,CAAC;KACtC;KACA,GAAI9B;IACL,CAAA;GACS,CAAA;GAEXqB,KACC,kBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,cAAW;IACX,UAAUC,KAAcC,KAAaN,MAAQ,KAAA,KAAaZ,MAAY,MAAMA,KAAWY;IACvF,eAAeJ,EAAM,CAAC;IAEtB,UAAA,kBAACnB,GAAD;KAAM,MAAK;KAAO,MAAM;IAAK,CAAA;GACvB,CAAA;EAEP;;AAET,CAAC;AA4BD,SAAgBsC,EAAiB,EAC/B,UACA,kBAAe;CAAE,KAAK;CAAI,KAAK;AAAG,GAClC,kBACA,UAAO,MACP,QACA,QACA,UAAO,GACP,WACA,WACA,gBAAa,IACb,cAAW,WACX,cAAW,aACa;CACxB,IAAM,CAAC/B,GAAUC,KAAeC,EAA2BC,CAAY,GACjEC,IAAUC,KAASL,GAEnBQ,KAAU,MAA2B;EAEzC,AADIH,MAAU,KAAA,KAAWJ,EAAYS,CAAI,GACzCC,IAAgBD,CAAI;CACtB,GAEMsB,IAAU5B,EAAQ,QAAQ,MAAMA,EAAQ,QAAQ,MAAMA,EAAQ,MAAMA,EAAQ;CAElF,OACE,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,kBAACR,GAAD;IACE,cAAYqC;IACN;IACN,OAAO7B,EAAQ;IACV;IACA;IACC;IACE;IACA;IACI;IACZ,WAAW4B;IACX,gBAAgB,MAASxB,EAAO;KAAE,GAAGJ;KAAS,KAAKM;IAAK,CAAC;GAC1D,CAAA;GACD,kBAAC,QAAD;IAAM,WAAU;IAAwB,eAAY;IAAO,UAAA;GAErD,CAAA;GACN,kBAACd,GAAD;IACE,cAAYsC;IACN;IACN,OAAO9B,EAAQ;IACV;IACA;IACC;IACE;IACA;IACI;IACZ,WAAW4B;IACX,gBAAgB,MAASxB,EAAO;KAAE,GAAGJ;KAAS,KAAKM;IAAK,CAAC;GAC1D,CAAA;EACE;;AAET"}
1
+ {"version":3,"file":"index.js","names":["Icon","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","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 { Icon } from \"../Icon\";\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 type=\"button\"\n className=\"ds-number__step\"\n aria-label=\"Decrease\"\n disabled={isDisabled || disabled || (min !== undefined && current !== \"\" && current <= min)}\n onClick={() => nudge(-1)}\n >\n <Icon name=\"minus\" size={16} />\n </button>\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 type=\"button\"\n className=\"ds-number__step\"\n aria-label=\"Increase\"\n disabled={isDisabled || disabled || (max !== undefined && current !== \"\" && current >= max)}\n onClick={() => nudge(1)}\n >\n <Icon name=\"plus\" size={16} />\n </button>\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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"}
@@ -0,0 +1,10 @@
1
+ import { type JSONContent } from "@tiptap/react";
2
+ export type RichTextDocument = JSONContent & {
3
+ type: "doc";
4
+ };
5
+ export declare const emptyDocument: RichTextDocument;
6
+ export declare function richTextExtensions(): (import("@tiptap/core").Extension<import("@tiptap/starter-kit").StarterKitOptions, any> | import("@tiptap/core").Mark<import("@tiptap/extension-link").LinkOptions, any>)[];
7
+ /** ProseMirror represents an empty writing surface with one empty paragraph. */
8
+ export declare function normalizeDocument(document: RichTextDocument): RichTextDocument;
9
+ export declare function documentError(value: unknown): string | undefined;
10
+ //# sourceMappingURL=document.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document.d.cts","sourceRoot":"","sources":["../../../src/components/RichTextEditor/document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAI5D,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC;AAE7D,eAAO,MAAM,aAAa,EAAE,gBAAoE,CAAC;AAEjG,wBAAgB,kBAAkB,gLAEjC;AAID,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,gBAAgB,CAE9E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAyBhE"}
@@ -0,0 +1,10 @@
1
+ import { type JSONContent } from "@tiptap/react";
2
+ export type RichTextDocument = JSONContent & {
3
+ type: "doc";
4
+ };
5
+ export declare const emptyDocument: RichTextDocument;
6
+ export declare function richTextExtensions(): (import("@tiptap/core").Extension<import("@tiptap/starter-kit").StarterKitOptions, any> | import("@tiptap/core").Mark<import("@tiptap/extension-link").LinkOptions, any>)[];
7
+ /** ProseMirror represents an empty writing surface with one empty paragraph. */
8
+ export declare function normalizeDocument(document: RichTextDocument): RichTextDocument;
9
+ export declare function documentError(value: unknown): string | undefined;
10
+ //# sourceMappingURL=document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../../src/components/RichTextEditor/document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAI5D,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC;AAE7D,eAAO,MAAM,aAAa,EAAE,gBAAoE,CAAC;AAEjG,wBAAgB,kBAAkB,gLAEjC;AAID,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,gBAAgB,CAE9E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAyBhE"}
@@ -1,2 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));const c=require("../Button/index.cjs"),l=require("../ButtonGroup/index.cjs");;/* empty css */let u=require("react"),d=require("react/jsx-runtime"),f=require("@tiptap/react"),p=require("@tiptap/starter-kit");p=s(p,1);let m=require("@tiptap/extension-link");m=s(m,1);let h=require("@tiptap/extension-placeholder");h=s(h,1);var g=[[{id:`bold`,icon:`bold`,label:`Bold`,run:e=>e.chain().focus().toggleBold().run(),active:e=>e.isActive(`bold`)},{id:`italic`,icon:`italic`,label:`Italic`,run:e=>e.chain().focus().toggleItalic().run(),active:e=>e.isActive(`italic`)},{id:`strike`,icon:`strikethrough`,label:`Strikethrough`,run:e=>e.chain().focus().toggleStrike().run(),active:e=>e.isActive(`strike`)},{id:`code`,icon:`code`,label:`Inline code`,run:e=>e.chain().focus().toggleCode().run(),active:e=>e.isActive(`code`)}],[{id:`h2`,icon:`heading-2`,label:`Heading`,run:e=>e.chain().focus().toggleHeading({level:2}).run(),active:e=>e.isActive(`heading`,{level:2})},{id:`h3`,icon:`heading-3`,label:`Subheading`,run:e=>e.chain().focus().toggleHeading({level:3}).run(),active:e=>e.isActive(`heading`,{level:3})},{id:`quote`,icon:`quote`,label:`Quote`,run:e=>e.chain().focus().toggleBlockquote().run(),active:e=>e.isActive(`blockquote`)}],[{id:`ul`,icon:`list`,label:`Bulleted list`,run:e=>e.chain().focus().toggleBulletList().run(),active:e=>e.isActive(`bulletList`)},{id:`ol`,icon:`list-ordered`,label:`Numbered list`,run:e=>e.chain().focus().toggleOrderedList().run(),active:e=>e.isActive(`orderedList`)}],[{id:`undo`,icon:`undo`,label:`Undo`,run:e=>e.chain().focus().undo().run()},{id:`redo`,icon:`redo`,label:`Redo`,run:e=>e.chain().focus().redo().run()}]],_=(0,u.forwardRef)(function({defaultValue:e=``,onChange:t,placeholder:n=`Write something…`,size:r=`md`,isDisabled:i=!1,isInvalid:a=!1,label:o=`Rich text editor`,className:s,toolbarExtra:_},v){let[y,b]=(0,u.useState)(!1),x=(0,f.useEditor)({immediatelyRender:!1,editable:!i,content:e,extensions:[p.default.configure({link:!1}),m.default.configure({openOnClick:!1,autolink:!0}),h.default.configure({placeholder:n})],editorProps:{attributes:{role:`textbox`,"aria-label":o,"aria-multiline":`true`}},onFocus:()=>b(!0),onBlur:()=>b(!1),onUpdate:({editor:e})=>t?.(e.getHTML())}),S=(0,f.useEditorState)({editor:x,selector:({editor:e})=>e?{active:Object.fromEntries(g.flat().map(t=>[t.id,t.active?.(e)??!1])),linkActive:e.isActive(`link`)}:null}),C=(0,u.useCallback)(()=>{if(!x)return;if(x.isActive(`link`)){x.chain().focus().unsetLink().run();return}let e=window.prompt(`Link to`);e&&x.chain().focus().extendMarkRange(`link`).setLink({href:e}).run()},[x]);return(0,d.jsxs)(`div`,{ref:v,className:[`ds-rte`,s].filter(Boolean).join(` `),"data-focused":y||void 0,"data-disabled":i||void 0,"aria-invalid":a||void 0,children:[(0,d.jsxs)(`div`,{className:`ds-rte__toolbar`,role:`toolbar`,"aria-label":`${o} formatting`,children:[g.map((e,t)=>(0,d.jsx)(l.ButtonGroup,{"aria-label":`Formatting ${t+1}`,children:e.map(e=>(0,d.jsx)(c.Button,{size:`sm`,isIconOnly:!0,iconStart:e.icon,"aria-label":e.label,title:e.label,"aria-pressed":e.active?S?.active[e.id]:void 0,variant:S?.active[e.id]?`active`:`neutral`,isDisabled:i||!x,onClick:()=>x&&e.run(x)},e.id))},t)),(0,d.jsx)(l.ButtonGroup,{"aria-label":`Link`,children:(0,d.jsx)(c.Button,{size:`sm`,isIconOnly:!0,iconStart:S?.linkActive?`link-off`:`link`,"aria-label":S?.linkActive?`Remove link`:`Add link`,title:S?.linkActive?`Remove link`:`Add link`,variant:S?.linkActive?`active`:`neutral`,isDisabled:i||!x,onClick:C})}),_]}),(0,d.jsx)(`div`,{className:`ds-rte__content`,"data-size":r,children:(0,d.jsx)(f.EditorContent,{editor:x})})]})});exports.RichTextEditor=_;
2
- //# sourceMappingURL=index.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/RichTextEditor-tFkISOvq.cjs");exports.RichTextEditor=e.t;
@@ -1,10 +1,8 @@
1
- import { type ReactNode } from "react";
1
+ import { type AriaAttributes, type ReactNode } from "react";
2
+ import { type RichTextDocument } from "./document.cjs";
2
3
  export type RichTextEditorSize = "sm" | "md" | "lg";
3
- export interface RichTextEditorProps {
4
- /** Initial HTML. The editor is uncontrolled: read changes from `onChange`. */
5
- defaultValue?: string;
6
- /** Fired with the document's HTML on every change. */
7
- onChange?: (html: string) => void;
4
+ export type { RichTextDocument } from "./document.cjs";
5
+ interface RichTextEditorCommonProps {
8
6
  placeholder?: string;
9
7
  size?: RichTextEditorSize;
10
8
  isDisabled?: boolean;
@@ -14,7 +12,24 @@ export interface RichTextEditorProps {
14
12
  className?: string;
15
13
  /** Extra controls appended to the toolbar, e.g. a word count. */
16
14
  toolbarExtra?: ReactNode;
15
+ /** Applied to the editable surface. */
16
+ id?: string;
17
+ isRequired?: boolean;
18
+ "aria-labelledby"?: string;
19
+ "aria-describedby"?: string;
20
+ "aria-invalid"?: AriaAttributes["aria-invalid"];
17
21
  }
22
+ export type RichTextEditorProps = RichTextEditorCommonProps & ({
23
+ format?: "html";
24
+ value?: string;
25
+ defaultValue?: string;
26
+ onChange?: (html: string) => void;
27
+ } | {
28
+ format: "json";
29
+ value?: RichTextDocument;
30
+ defaultValue?: RichTextDocument;
31
+ onChange?: (document: RichTextDocument) => void;
32
+ });
18
33
  /**
19
34
  * The editorial writing surface. Rich text plus links — the same field skin,
20
35
  * radius and states as `TextField`, with the toolbar inside the frame.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/components/RichTextEditor/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAQ1E,OAAO,oBAAoB,CAAC;AAC5B,OAAO,aAAa,CAAC;AAErB,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEpD,MAAM,WAAW,mBAAmB;IAClC,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAgGD;;;GAGG;AACH,eAAO,MAAM,cAAc,gHAyG1B,CAAC"}
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/components/RichTextEditor/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAM1H,OAAO,EAAuE,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACxH,OAAO,oBAAoB,CAAC;AAC5B,OAAO,aAAa,CAAC;AAErB,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEpD,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,UAAU,yBAAyB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,uCAAuC;IACvC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;CACjD;AAED,MAAM,MAAM,mBAAmB,GAAG,yBAAyB,GAAG,CAC1D;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GAC7F;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAAC,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAA;CAAE,CACjI,CAAC;AAgGF;;;GAGG;AACH,eAAO,MAAM,cAAc,gHAkJ1B,CAAC"}
@@ -1,10 +1,8 @@
1
- import { type ReactNode } from "react";
1
+ import { type AriaAttributes, type ReactNode } from "react";
2
+ import { type RichTextDocument } from "./document.js";
2
3
  export type RichTextEditorSize = "sm" | "md" | "lg";
3
- export interface RichTextEditorProps {
4
- /** Initial HTML. The editor is uncontrolled: read changes from `onChange`. */
5
- defaultValue?: string;
6
- /** Fired with the document's HTML on every change. */
7
- onChange?: (html: string) => void;
4
+ export type { RichTextDocument } from "./document.js";
5
+ interface RichTextEditorCommonProps {
8
6
  placeholder?: string;
9
7
  size?: RichTextEditorSize;
10
8
  isDisabled?: boolean;
@@ -14,7 +12,24 @@ export interface RichTextEditorProps {
14
12
  className?: string;
15
13
  /** Extra controls appended to the toolbar, e.g. a word count. */
16
14
  toolbarExtra?: ReactNode;
15
+ /** Applied to the editable surface. */
16
+ id?: string;
17
+ isRequired?: boolean;
18
+ "aria-labelledby"?: string;
19
+ "aria-describedby"?: string;
20
+ "aria-invalid"?: AriaAttributes["aria-invalid"];
17
21
  }
22
+ export type RichTextEditorProps = RichTextEditorCommonProps & ({
23
+ format?: "html";
24
+ value?: string;
25
+ defaultValue?: string;
26
+ onChange?: (html: string) => void;
27
+ } | {
28
+ format: "json";
29
+ value?: RichTextDocument;
30
+ defaultValue?: RichTextDocument;
31
+ onChange?: (document: RichTextDocument) => void;
32
+ });
18
33
  /**
19
34
  * The editorial writing surface. Rich text plus links — the same field skin,
20
35
  * radius and states as `TextField`, with the toolbar inside the frame.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/RichTextEditor/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAQ1E,OAAO,oBAAoB,CAAC;AAC5B,OAAO,aAAa,CAAC;AAErB,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEpD,MAAM,WAAW,mBAAmB;IAClC,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAgGD;;;GAGG;AACH,eAAO,MAAM,cAAc,gHAyG1B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/RichTextEditor/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAM1H,OAAO,EAAuE,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACxH,OAAO,oBAAoB,CAAC;AAC5B,OAAO,aAAa,CAAC;AAErB,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEpD,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,UAAU,yBAAyB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,uCAAuC;IACvC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;CACjD;AAED,MAAM,MAAM,mBAAmB,GAAG,yBAAyB,GAAG,CAC1D;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GAC7F;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAAC,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAA;CAAE,CACjI,CAAC;AAgGF;;;GAGG;AACH,eAAO,MAAM,cAAc,gHAkJ1B,CAAC"}