@devslab/dds-solid 0.22.1 → 0.24.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 (89) hide show
  1. package/README.ko.md +49 -3
  2. package/README.md +47 -3
  3. package/dist/assets/{calendar-view-1RO2mtf1.js → calendar-view-BBQGmkJ7.js} +181 -145
  4. package/dist/assets/calendar-view-BBQGmkJ7.js.map +1 -0
  5. package/dist/assets/{choice-DoXiK8nc.js → choice-DPmk9AHn.js} +41 -29
  6. package/dist/assets/choice-DPmk9AHn.js.map +1 -0
  7. package/dist/assets/choice-types-h4YVL8xH.js +24 -0
  8. package/dist/assets/choice-types-h4YVL8xH.js.map +1 -0
  9. package/dist/assets/date-only-0Ldsjp43.js +174 -0
  10. package/dist/assets/date-only-0Ldsjp43.js.map +1 -0
  11. package/dist/assets/direction-BpTqmXs-.js +24 -0
  12. package/dist/assets/direction-BpTqmXs-.js.map +1 -0
  13. package/dist/calendar-view-CZLsC57_.js +481 -0
  14. package/dist/calendar-view-CZLsC57_.js.map +1 -0
  15. package/dist/calendar-view.d.ts +10 -0
  16. package/dist/calendar-view.d.ts.map +1 -1
  17. package/dist/calendar.js +7 -6
  18. package/dist/calendar.js.map +1 -1
  19. package/dist/calendar.server.js +2 -1
  20. package/dist/calendar.server.js.map +1 -1
  21. package/dist/choice-CTNeFOVo.js +403 -0
  22. package/dist/choice-CTNeFOVo.js.map +1 -0
  23. package/dist/choice-types-kSaEnZPr.js +23 -0
  24. package/dist/choice-types-kSaEnZPr.js.map +1 -0
  25. package/dist/combobox.js +1 -1
  26. package/dist/combobox.server.js +1 -1
  27. package/dist/date-only-Bu4UmsTP.js +151 -0
  28. package/dist/date-only-Bu4UmsTP.js.map +1 -0
  29. package/dist/date-only.d.ts +92 -0
  30. package/dist/date-only.d.ts.map +1 -1
  31. package/dist/date-picker.js +51 -50
  32. package/dist/date-picker.js.map +1 -1
  33. package/dist/date-picker.server.js +2 -1
  34. package/dist/date-picker.server.js.map +1 -1
  35. package/dist/date-range-picker.d.ts +41 -0
  36. package/dist/date-range-picker.d.ts.map +1 -0
  37. package/dist/date-range-picker.js +368 -0
  38. package/dist/date-range-picker.js.map +1 -0
  39. package/dist/date-range-picker.server.js +347 -0
  40. package/dist/date-range-picker.server.js.map +1 -0
  41. package/dist/direction-CS85IDNU.js +21 -0
  42. package/dist/direction-CS85IDNU.js.map +1 -0
  43. package/dist/index.d.ts +6 -0
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +193 -176
  46. package/dist/index.js.map +1 -1
  47. package/dist/internal/choice.d.ts +25 -3
  48. package/dist/internal/choice.d.ts.map +1 -1
  49. package/dist/month-picker.d.ts +33 -0
  50. package/dist/month-picker.d.ts.map +1 -0
  51. package/dist/month-picker.js +287 -0
  52. package/dist/month-picker.js.map +1 -0
  53. package/dist/month-picker.server.js +282 -0
  54. package/dist/month-picker.server.js.map +1 -0
  55. package/dist/number-input.d.ts +53 -0
  56. package/dist/number-input.d.ts.map +1 -0
  57. package/dist/number-input.js +267 -0
  58. package/dist/number-input.js.map +1 -0
  59. package/dist/number-input.server.js +237 -0
  60. package/dist/number-input.server.js.map +1 -0
  61. package/dist/pending-action.d.ts +36 -0
  62. package/dist/pending-action.d.ts.map +1 -0
  63. package/dist/segmented-control.d.ts +40 -0
  64. package/dist/segmented-control.d.ts.map +1 -0
  65. package/dist/segmented-control.js +133 -0
  66. package/dist/segmented-control.js.map +1 -0
  67. package/dist/segmented-control.server.js +138 -0
  68. package/dist/segmented-control.server.js.map +1 -0
  69. package/dist/select-picker.js +1 -1
  70. package/dist/select-picker.server.js +1 -1
  71. package/dist/server.js +49 -23
  72. package/dist/server.js.map +1 -1
  73. package/dist/time-only.d.ts +32 -0
  74. package/dist/time-only.d.ts.map +1 -0
  75. package/dist/time-picker-BlMWCQwk.js +113 -0
  76. package/dist/time-picker-BlMWCQwk.js.map +1 -0
  77. package/dist/time-picker.d.ts +34 -0
  78. package/dist/time-picker.d.ts.map +1 -0
  79. package/dist/time-picker.js +2 -0
  80. package/dist/time-picker.server.js +152 -0
  81. package/dist/time-picker.server.js.map +1 -0
  82. package/package.json +44 -4
  83. package/styles.css +31 -1
  84. package/dist/assets/calendar-view-1RO2mtf1.js.map +0 -1
  85. package/dist/assets/choice-DoXiK8nc.js.map +0 -1
  86. package/dist/calendar-view-CTBTPB4T.js +0 -444
  87. package/dist/calendar-view-CTBTPB4T.js.map +0 -1
  88. package/dist/choice-BPMiJlPJ.js +0 -395
  89. package/dist/choice-BPMiJlPJ.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"month-picker.server.js","names":["DatePicker","ArkDatePicker","parseDate","DateValue","Portal","createEffect","createMemo","createSignal","createUniqueId","on","onCleanup","onMount","Show","CalendarView","createControllableSignal","canonicalMonth","displayMonth","isCalendarMonth","isKorean","monthBounds","monthMessages","validateMonth","MonthPickerMessages","describedBy","MonthPickerValidity","MonthPickerProps","label","labelPlacement","id","value","defaultValue","onValueChange","next","locale","timeZone","min","max","messages","clearable","showThisMonth","required","disabled","readOnly","invalid","name","form","selectionOf","month","CalendarIcon","_$ssr","_tmpl$","_$ssrHydrationKey","MonthPicker","props","errorId","text","setValue","onChange","undefined","draftState","setDraftState","draft","state","canonical","setDraft","selection","setSelection","open","setOpen","input","HTMLInputElement","trigger","HTMLButtonElement","emitted","focusFrame","portalMount","setPortalMount","HTMLElement","closest","ownerDocument","body","blocked","bounds","validity","error","valid","reason","fieldName","defer","setCustomValidity","cancelAnimationFrame","doc","reset","event","Event","getElementById","target","setTimeout","defaultPrevented","shown","addEventListener","removeEventListener","focusSoon","frames","run","left","requestAnimationFrame","focus","preventScroll","commit","changeDraft","typed","_tmpl$7","_$escape","_$ssrAttribute","_$createComponent","when","children","_tmpl$3","_tmpl$2","Root","_$memo","onOpenChange","details","minView","maxView","defaultView","translations","clearTrigger","clear","toString","slice","positioning","placement","gutter","strategy","matches","hideWhenDetached","Control","data-filled","_tmpl$4","Trigger","aria-label","openCalendar","trim","mount","Positioner","Content","chooseMonth","view","showToday","showClear","onClear","_tmpl$5","_tmpl$6"],"sources":["../src/month-picker.tsx"],"sourcesContent":["import {\n DatePicker as ArkDatePicker,\n parseDate,\n type DateValue,\n} from \"@ark-ui/solid/date-picker\";\nimport { Portal } from \"solid-js/web\";\nimport {\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n on,\n onCleanup,\n onMount,\n Show,\n} from \"solid-js\";\nimport { CalendarView } from \"./calendar-view\";\nimport { createControllableSignal } from \"./controllable\";\nimport {\n canonicalMonth,\n displayMonth,\n isCalendarMonth,\n isKorean,\n monthBounds,\n monthMessages,\n validateMonth,\n type MonthPickerMessages,\n} from \"./date-only\";\nimport { describedBy } from \"./utils\";\nexport type { MonthPickerMessages, MonthPickerValidity } from \"./date-only\";\n\nexport interface MonthPickerProps {\n label?: string;\n labelPlacement?: \"outside\" | \"inside\" | \"hidden\";\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n id?: string;\n /** YYYY-MM or \"\" (no month). */\n value?: string;\n defaultValue?: string;\n /** Called on user changes only, with YYYY-MM or \"\". */\n onValueChange?: (next: string) => void;\n locale?: string;\n /** Decides the current month for \"This month\" and its marker. */\n timeZone?: string;\n /** Inclusive YYYY-MM bounds. */\n min?: string;\n max?: string;\n messages?: MonthPickerMessages;\n clearable?: boolean;\n showThisMonth?: boolean;\n required?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n invalid?: boolean;\n /** Form field name submitting YYYY-MM (or \"\"), never the display text. */\n name?: string;\n form?: string;\n}\n\nconst selectionOf = (month: string): DateValue[] =>\n isCalendarMonth(month) ? [parseDate(`${month}-01`)] : [];\n\nfunction CalendarIcon() {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n aria-hidden=\"true\"\n >\n <rect x=\"3.5\" y=\"5.5\" width=\"17\" height=\"15\" rx=\"2\" />\n <path d=\"M7.5 3v5M16.5 3v5M3.5 10.5h17\" />\n </svg>\n );\n}\n\nexport function MonthPicker(props: MonthPickerProps) {\n const locale = () => props.locale ?? \"ko-KR\",\n id = props.id ?? `dds-month-${createUniqueId()}`,\n errorId = `${id}-error`;\n const text = () => monthMessages(locale(), props.messages);\n const [value, setValue] = createControllableSignal<string>({\n value: () => props.value,\n defaultValue: props.defaultValue ?? \"\",\n onChange: undefined,\n });\n // The draft keeps its formatting locale so a locale change re-displays complete months only.\n const [draftState, setDraftState] = createSignal({\n text: displayMonth(value(), locale()),\n locale: locale(),\n });\n const draft = createMemo(() => {\n const state = draftState(),\n canonical = canonicalMonth(state.text);\n return state.locale !== locale() && isCalendarMonth(canonical)\n ? displayMonth(canonical, locale())\n : state.text;\n });\n const setDraft = (next: string) =>\n setDraftState({ text: next, locale: locale() });\n const [selection, setSelection] = createSignal(selectionOf(value()));\n const [open, setOpen] = createSignal(false);\n let input: HTMLInputElement | undefined,\n trigger: HTMLButtonElement | undefined,\n emitted = value(),\n focusFrame: number | undefined;\n const [portalMount, setPortalMount] = createSignal<HTMLElement>();\n onMount(() => {\n if (input)\n setPortalMount(\n input.closest<HTMLElement>('[role=\"dialog\"], [role=\"alertdialog\"]') ??\n input.ownerDocument.body,\n );\n });\n const blocked = () => props.disabled || props.readOnly;\n const bounds = createMemo(() => monthBounds(props.min, props.max));\n const validity = createMemo(() =>\n validateMonth(draft(), props.required ?? false, props.min, props.max),\n );\n const error = () =>\n validity().valid\n ? undefined\n : validity().reason === \"required\"\n ? text().required\n : text().invalid;\n const invalid = () => props.invalid || !validity().valid;\n const fieldName = () => props.label ?? props[\"aria-label\"] ?? \"\";\n\n createEffect(\n on(\n value,\n (next) => {\n if (next === emitted) return;\n emitted = next;\n setDraft(displayMonth(next, locale()));\n setSelection(selectionOf(next));\n },\n { defer: true },\n ),\n );\n createEffect(() => input?.setCustomValidity(error() ?? \"\"));\n createEffect(() => {\n if (blocked()) {\n setOpen(false);\n if (focusFrame !== undefined) cancelAnimationFrame(focusFrame);\n }\n });\n // Resolve the owning form when a reset happens: the field may mount before it joins its form.\n onMount(() => {\n const doc = input?.ownerDocument;\n if (!doc) return;\n const reset = (event: Event) => {\n const form = props.form ? doc.getElementById(props.form) : input?.form;\n if (!form || event.target !== form) return;\n // A task, not a microtask: a user-triggered reset runs its listeners before rewriting the controls.\n setTimeout(() => {\n if (event.defaultPrevented) return;\n const next = props.value ?? props.defaultValue ?? \"\";\n emitted = next;\n setValue(next);\n const shown = displayMonth(next, locale());\n setDraft(shown);\n setSelection(selectionOf(next));\n // Native reset rewrote the visible input; the draft may not have changed.\n if (input) input.value = shown;\n }, 0);\n };\n doc.addEventListener(\"reset\", reset, true);\n onCleanup(() => doc.removeEventListener(\"reset\", reset, true));\n });\n onCleanup(() => {\n if (focusFrame !== undefined) cancelAnimationFrame(focusFrame);\n });\n\n function focusSoon(target: () => HTMLElement | undefined, frames = 1) {\n if (focusFrame !== undefined) cancelAnimationFrame(focusFrame);\n const run = (left: number) => {\n focusFrame = requestAnimationFrame(() => {\n if (left > 1) return run(left - 1);\n if (!blocked()) target()?.focus({ preventScroll: true });\n });\n };\n run(frames);\n }\n function commit(next: string) {\n if (blocked()) return;\n setSelection(selectionOf(next));\n if (next === emitted) return;\n emitted = next;\n setValue(next);\n props.onValueChange?.(next);\n }\n /** Committing ignores `required` like DatePicker: an emptied field is still reported. */\n function changeDraft(typed: string) {\n if (blocked()) return;\n const state = validateMonth(typed, false, props.min, props.max);\n setDraft(state.valid ? displayMonth(state.value ?? \"\", locale()) : typed);\n if (state.valid) commit(state.value ?? \"\");\n }\n\n return (\n <div\n class={`dds-field dds-date-picker dds-month-picker dds-date-picker--${props.labelPlacement ?? \"outside\"}${error() ? \" dds-field--error\" : \"\"}`}\n data-filled={draft() !== \"\" ? \"true\" : undefined}\n data-invalid={invalid() ? \"\" : undefined}\n data-disabled={props.disabled ? \"\" : undefined}\n role=\"group\"\n >\n <Show when={props.label}>\n <label class=\"dds-field__label\" for={id}>\n {props.label}\n <Show when={props.required}>\n <span aria-hidden=\"true\"> *</span>\n </Show>\n </label>\n </Show>\n <ArkDatePicker.Root\n locale={locale()}\n timeZone={props.timeZone ?? \"Asia/Seoul\"}\n disabled={props.disabled}\n readOnly={props.readOnly}\n required={props.required}\n invalid={invalid()}\n open={open() && !blocked()}\n onOpenChange={(details) => {\n setOpen(details.open && !blocked());\n if (!details.open) setSelection(selectionOf(emitted));\n }}\n min={bounds().min ? parseDate(bounds().min!) : undefined}\n max={bounds().max ? parseDate(bounds().max!) : undefined}\n minView=\"month\"\n maxView=\"month\"\n defaultView=\"month\"\n translations={{ clearTrigger: text().clear }}\n value={selection()}\n onValueChange={(details) => {\n if (blocked()) return;\n const next = details.value[0]?.toString().slice(0, 7) ?? \"\";\n if (\n next !== \"\" &&\n !validateMonth(next, false, props.min, props.max).valid\n )\n return;\n setDraft(displayMonth(next, locale()));\n commit(next);\n focusSoon(() => input, 2);\n }}\n positioning={{\n placement: \"bottom-start\",\n gutter: 8,\n strategy: portalMount()?.matches(\n '[role=\"dialog\"], [role=\"alertdialog\"]',\n )\n ? \"fixed\"\n : \"absolute\",\n hideWhenDetached: !!portalMount()?.matches(\n '[role=\"dialog\"], [role=\"alertdialog\"]',\n ),\n }}\n >\n <ArkDatePicker.Control\n class=\"dds-date-picker-control\"\n data-filled={draft() !== \"\" ? \"true\" : undefined}\n >\n <input\n id={id}\n ref={input}\n form={props.form}\n aria-label={props.label ? undefined : props[\"aria-label\"]}\n aria-labelledby={props[\"aria-labelledby\"]}\n aria-invalid={invalid() ? \"true\" : undefined}\n aria-required={props.required ? \"true\" : undefined}\n aria-describedby={describedBy(\n props[\"aria-describedby\"],\n error() && errorId,\n )}\n type=\"text\"\n value={draft()}\n required={props.required}\n readOnly={props.readOnly}\n disabled={props.disabled}\n placeholder={isKorean(locale()) ? \"YYYY/MM\" : \"YYYY-MM\"}\n autocomplete=\"off\"\n autocorrect=\"off\"\n spellcheck={false}\n on:input={(event) => {\n event.stopPropagation();\n changeDraft(event.currentTarget.value);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.isComposing) {\n event.preventDefault();\n event.stopPropagation();\n }\n }}\n />\n <ArkDatePicker.Trigger\n ref={trigger}\n class=\"dds-btn dds-btn--secondary\"\n aria-label={`${fieldName()} ${text().openCalendar}`.trim()}\n >\n <CalendarIcon />\n </ArkDatePicker.Trigger>\n </ArkDatePicker.Control>\n <Show when={portalMount()}>\n {(mount) => (\n <Portal mount={mount()}>\n <ArkDatePicker.Positioner class=\"dds-date-picker-positioner\">\n <ArkDatePicker.Content\n ref={(node) => {\n const restoreTrigger = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") focusSoon(() => trigger, 2);\n };\n node.addEventListener(\"keydown\", restoreTrigger, true);\n onCleanup(() =>\n node.removeEventListener(\"keydown\", restoreTrigger, true),\n );\n }}\n class=\"dds-date-picker-content dds-month-picker-content\"\n aria-label={`${fieldName()} ${text().chooseMonth}`.trim()}\n >\n <CalendarView\n view=\"month\"\n timeZone={props.timeZone}\n min={bounds().min}\n max={bounds().max}\n locale={locale()}\n messages={text()}\n disabled={props.disabled}\n readOnly={props.readOnly}\n showToday={props.showThisMonth}\n showClear={props.clearable}\n onClear={() => {\n setDraft(\"\");\n commit(\"\");\n }}\n />\n </ArkDatePicker.Content>\n </ArkDatePicker.Positioner>\n </Portal>\n )}\n </Show>\n </ArkDatePicker.Root>\n <Show when={props.name}>\n <input\n type=\"hidden\"\n name={props.name}\n form={props.form}\n value={value()}\n disabled={props.disabled}\n />\n </Show>\n <Show when={error()}>\n <span id={errorId} class=\"dds-field__error\" role=\"alert\">\n {error()}\n </span>\n </Show>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { type Direction } from "./direction";
2
+ export interface NumberInputMessages {
3
+ /** Accessible name of the − button. */
4
+ decrease?: string;
5
+ /** Accessible name of the + button. */
6
+ increase?: string;
7
+ }
8
+ export declare function numberInputMessages(locale: string, messages?: NumberInputMessages): Required<NumberInputMessages>;
9
+ export interface NumberInputProps {
10
+ /** null means empty. Controlled when not undefined. */
11
+ value?: number | null;
12
+ defaultValue?: number | null;
13
+ /** Called with the new number, or null when emptied, only after a user change. */
14
+ onValueChange?: (next: number | null) => void;
15
+ min?: number;
16
+ max?: number;
17
+ /** Arrow keys and the stepper buttons move by step; PageUp/PageDown by ten steps. */
18
+ step?: number;
19
+ /** Formatting and parsing locale. Defaults to ko-KR. */
20
+ locale?: string;
21
+ /** Defaults to whole numbers with thousands separators. */
22
+ formatOptions?: Intl.NumberFormatOptions;
23
+ /** Show the − / + buttons. Defaults to true. */
24
+ stepper?: boolean;
25
+ /** Unit shown after the digits, for example 원, 개 or 분. */
26
+ suffix?: string;
27
+ label?: string;
28
+ labelPlacement?: "outside" | "hidden";
29
+ "aria-label"?: string;
30
+ "aria-labelledby"?: string;
31
+ "aria-describedby"?: string;
32
+ id?: string;
33
+ /** Submits the plain number (1234.5), never the formatted text. */
34
+ name?: string;
35
+ form?: string;
36
+ required?: boolean;
37
+ disabled?: boolean;
38
+ readOnly?: boolean;
39
+ /** Also invalid on its own while the number is outside min/max. */
40
+ invalid?: boolean;
41
+ placeholder?: string;
42
+ messages?: NumberInputMessages;
43
+ dir?: Direction;
44
+ class?: string;
45
+ }
46
+ /** Full-width digits from Japanese/Chinese IMEs become ASCII; other text is left for validation. */
47
+ export declare function normalizeNumberText(text: string): string;
48
+ /**
49
+ * A localized number field. Values are numbers (or null for empty); display
50
+ * text is formatted with Intl and never leaves the component.
51
+ */
52
+ export declare function NumberInput(props: NumberInputProps): import("solid-js").JSX.Element;
53
+ //# sourceMappingURL=number-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number-input.d.ts","sourceRoot":"","sources":["../src/number-input.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAG3D,MAAM,WAAW,mBAAmB;IAClC,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,mBAAwB,GACjC,QAAQ,CAAC,mBAAmB,CAAC,CAO/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,kFAAkF;IAClF,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC;IACzC,gDAAgD;IAChD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mEAAmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAoBD,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,UAM/C;AAoBD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,kCAoRlD"}
@@ -0,0 +1,267 @@
1
+ import { n as e, t } from "./utils-oKxhg9RG.js";
2
+ import { t as n } from "./direction-CS85IDNU.js";
3
+ import { c as r } from "./date-only-Bu4UmsTP.js";
4
+ import { Show as i, createEffect as a, createMemo as o, createSignal as s, createUniqueId as ee, mergeProps as te, on as c, onCleanup as ne } from "solid-js";
5
+ import { createComponent as l, effect as u, getNextElement as d, getNextMarker as f, insert as p, memo as m, mergeProps as h, runHydrationEvents as g, setAttribute as _, setProperty as v, spread as re, template as y, use as ie } from "solid-js/web";
6
+ import { NumberInput as b, useNumberInput as ae } from "@ark-ui/solid/number-input";
7
+ //#region src/number-input.tsx
8
+ var x = /*#__PURE__*/ y("<svg width=16 height=16 viewBox=\"0 0 24 24\"fill=none stroke=currentColor stroke-width=1.6 stroke-linecap=round stroke-linejoin=round aria-hidden=true>"), S = /*#__PURE__*/ y("<svg><path></svg>", !1, !0, !1), C = /*#__PURE__*/ y("<input>"), w = /*#__PURE__*/ y("<span class=dds-number-input__suffix>"), T = /*#__PURE__*/ y("<span class=dds-number-input__steppers><!$><!/><!$><!/>"), E = /*#__PURE__*/ y("<input type=hidden>");
9
+ function D(e, t = {}) {
10
+ let n = r(e);
11
+ return {
12
+ decrease: n ? "값 줄이기" : "Decrease",
13
+ increase: n ? "값 늘리기" : "Increase",
14
+ ...t
15
+ };
16
+ }
17
+ var O = ["M5 12h14"], k = ["M12 5v14", "M5 12h14"];
18
+ function A(e) {
19
+ return (() => {
20
+ var t = d(x);
21
+ return p(t, () => e.path.map((e) => (() => {
22
+ var t = d(S);
23
+ return _(t, "d", e), t;
24
+ })())), t;
25
+ })();
26
+ }
27
+ var j = {
28
+ ",": ",",
29
+ ".": ".",
30
+ "-": "-",
31
+ "−": "-"
32
+ };
33
+ function M(e) {
34
+ return e.replace(/[0-9,.-−]/g, (e) => e >= "0" && e <= "9" ? String.fromCharCode(e.charCodeAt(0) - 65296 + 48) : j[e]);
35
+ }
36
+ function oe(e) {
37
+ let t = [...e.formatToParts(-1234567.5), ...e.formatToParts(1234567.5)], n = (e) => t.find((t) => t.type === e)?.value, r = /* @__PURE__ */ new Set();
38
+ for (let e of t) if (![
39
+ "integer",
40
+ "group",
41
+ "decimal",
42
+ "fraction",
43
+ "minusSign"
44
+ ].includes(e.type)) for (let t of e.value) r.add(t);
45
+ return {
46
+ group: n("group") ?? "",
47
+ decimal: n("decimal") ?? ".",
48
+ minus: n("minusSign") ?? "-",
49
+ affixes: r
50
+ };
51
+ }
52
+ function N(r) {
53
+ let y = ee(), x = () => r.id ?? `dds-number-input-${y}`, S = () => `${x()}-suffix`, j = () => r.locale ?? "ko-KR", N = () => D(j(), r.messages), P = o(() => r.formatOptions ?? { maximumFractionDigits: 0 }), F = o(() => new Intl.NumberFormat(j(), P())), se = o(() => oe(F())), I = () => (F().resolvedOptions().maximumFractionDigits ?? 0) > 0, L = (e) => e === null || !Number.isFinite(e) ? "" : F().format(e), R = () => r.value !== void 0, [z, B] = s(r.defaultValue ?? null), V = () => R() ? r.value ?? null : z(), [H, U] = s(L(V())), [W, G] = s(V()), ce = () => {
54
+ let e = W();
55
+ return e !== null && (r.min !== void 0 && e < r.min || r.max !== void 0 && e > r.max);
56
+ }, le = () => !!r.invalid || ce(), K, q, J = !1, Y = !1, ue = n(() => K, () => r.dir), de = (e) => {
57
+ e !== V() && (R() || B(e), r.onValueChange?.(e));
58
+ }, X = ae(() => ({
59
+ id: `${x()}-root`,
60
+ ids: {
61
+ root: `${x()}-root`,
62
+ input: x()
63
+ },
64
+ dir: ue(),
65
+ locale: j(),
66
+ formatOptions: P(),
67
+ value: H(),
68
+ step: r.step ?? 1,
69
+ ...r.min === void 0 ? {} : { min: r.min },
70
+ ...r.max === void 0 ? {} : { max: r.max },
71
+ allowMouseWheel: !1,
72
+ clampValueOnBlur: !0,
73
+ spinOnPress: !0,
74
+ inputMode: I() ? "decimal" : "numeric",
75
+ disabled: r.disabled,
76
+ readOnly: r.readOnly,
77
+ required: r.required,
78
+ invalid: le(),
79
+ translations: {
80
+ decrementLabel: N().decrease,
81
+ incrementLabel: N().increase,
82
+ valueText: (e) => e && r.suffix ? `${e} ${r.suffix}` : e
83
+ },
84
+ onValueChange: (e) => {
85
+ if (Y) return;
86
+ let t = Number.isNaN(e.valueAsNumber) ? null : e.valueAsNumber;
87
+ U(e.value), G(t), de(t);
88
+ }
89
+ }));
90
+ a(c(V, (e) => {
91
+ e !== W() && (U(L(e)), G(e));
92
+ }, { defer: !0 })), a(() => {
93
+ r.form;
94
+ let e = q?.form;
95
+ if (!e) return;
96
+ let t = (e) => {
97
+ Y = !0, setTimeout(() => {
98
+ Y = !1, !e.defaultPrevented && (R() || B(r.defaultValue ?? null), U(L(V())), G(V()), q && (q.value = H()));
99
+ });
100
+ };
101
+ e.addEventListener("reset", t, { capture: !0 }), ne(() => e.removeEventListener("reset", t, { capture: !0 }));
102
+ });
103
+ let Z = te(() => {
104
+ let { onKeyDown: e, onBeforeInput: t, onInput: n, onFocusOut: r, value: i, ...a } = X().getInputProps();
105
+ return a;
106
+ }), Q = () => X().getInputProps(), $ = (e) => {
107
+ let { group: t, decimal: n, minus: i, affixes: a } = se(), o = 0;
108
+ for (let s of e) if (!(s >= "0" && s <= "9") && !(s === t || t.trim() === "" && s === " ")) {
109
+ if (s === n) {
110
+ if (o += 1, !I() || o > 1) return !1;
111
+ continue;
112
+ }
113
+ if (s === i || s === "-") {
114
+ if (r.min !== void 0 && r.min >= 0) return !1;
115
+ continue;
116
+ }
117
+ if (!a.has(s)) return !1;
118
+ }
119
+ return !0;
120
+ }, fe = (e) => {
121
+ let t = (W() ?? 0) + e;
122
+ r.min !== void 0 && (t = Math.max(r.min, t)), r.max !== void 0 && (t = Math.min(r.max, t)), X().setValue(t);
123
+ };
124
+ return l(b.RootProvider, {
125
+ ref(e) {
126
+ var t = K;
127
+ typeof t == "function" ? t(e) : K = e;
128
+ },
129
+ value: X,
130
+ get class() {
131
+ return t("dds-number-input", r.class);
132
+ },
133
+ get "data-label-placement"() {
134
+ return r.labelPlacement ?? "outside";
135
+ },
136
+ get "data-readonly"() {
137
+ return r.readOnly ? "" : void 0;
138
+ },
139
+ get "data-stepper"() {
140
+ return r.stepper === !1 ? void 0 : "";
141
+ },
142
+ get children() {
143
+ return [
144
+ l(i, {
145
+ get when() {
146
+ return r.label;
147
+ },
148
+ get children() {
149
+ return l(b.Label, {
150
+ class: "dds-number-input__label",
151
+ get children() {
152
+ return r.label;
153
+ }
154
+ });
155
+ }
156
+ }),
157
+ l(b.Control, {
158
+ class: "dds-number-input__control",
159
+ get children() {
160
+ return [
161
+ (() => {
162
+ var t = d(C), n = q;
163
+ return typeof n == "function" ? ie(n, t) : q = t, re(t, h(Z, {
164
+ class: "dds-number-input__field",
165
+ get value() {
166
+ return H();
167
+ },
168
+ get placeholder() {
169
+ return r.placeholder;
170
+ },
171
+ get "aria-label"() {
172
+ return m(() => !!r.label)() ? void 0 : r["aria-label"];
173
+ },
174
+ get "aria-labelledby"() {
175
+ return m(() => !!r.label)() ? void 0 : r["aria-labelledby"];
176
+ },
177
+ get "aria-describedby"() {
178
+ return e(r.suffix ? S() : void 0, r["aria-describedby"]);
179
+ },
180
+ onCompositionStart: () => {
181
+ J = !0;
182
+ },
183
+ onCompositionEnd: (e) => {
184
+ J = !1, e.currentTarget.dispatchEvent(new InputEvent("input", { bubbles: !0 }));
185
+ },
186
+ onBeforeInput: (e) => {
187
+ if (J || e.isComposing) return;
188
+ let t = e.currentTarget, n = M(e.data ?? ""), r = t.value.slice(0, t.selectionStart ?? t.value.length) + n + t.value.slice(t.selectionEnd ?? t.value.length);
189
+ $(M(r)) || e.preventDefault();
190
+ },
191
+ onInput: (e) => {
192
+ if (J) return;
193
+ let t = e.currentTarget, n = M(t.value);
194
+ if (!$(n)) {
195
+ t.value = H();
196
+ return;
197
+ }
198
+ if (n !== t.value) {
199
+ let e = t.selectionStart, r = t.selectionEnd;
200
+ t.value = n, t.setSelectionRange(e, r);
201
+ }
202
+ Q().onInput?.(e);
203
+ },
204
+ onKeyDown: (e) => {
205
+ if (r.readOnly || r.disabled || e.isComposing || e.keyCode === 229) return;
206
+ let t = r.step ?? 1;
207
+ if (e.key === "PageUp" || e.key === "PageDown") {
208
+ e.preventDefault(), fe((e.key === "PageUp" ? 10 : -10) * t);
209
+ return;
210
+ }
211
+ (e.key !== "Home" || r.min !== void 0) && (e.key !== "End" || r.max !== void 0) && Q().onKeyDown?.(e);
212
+ },
213
+ onFocusOut: (e) => {
214
+ Q().onFocusOut?.(e), R() && W() !== V() && (U(L(V())), G(V()));
215
+ }
216
+ }), !1, !1), g(), t;
217
+ })(),
218
+ l(i, {
219
+ get when() {
220
+ return r.suffix;
221
+ },
222
+ get children() {
223
+ var e = d(w);
224
+ return p(e, () => r.suffix), u(() => _(e, "id", S())), e;
225
+ }
226
+ }),
227
+ l(i, {
228
+ get when() {
229
+ return r.stepper !== !1;
230
+ },
231
+ get children() {
232
+ var e = d(T), t = e.firstChild, [n, r] = f(t.nextSibling), i = n.nextSibling, [a, o] = f(i.nextSibling);
233
+ return p(e, l(b.DecrementTrigger, {
234
+ class: "dds-number-input__step",
235
+ get children() {
236
+ return l(A, { path: O });
237
+ }
238
+ }), n, r), p(e, l(b.IncrementTrigger, {
239
+ class: "dds-number-input__step",
240
+ get children() {
241
+ return l(A, { path: k });
242
+ }
243
+ }), a, o), e;
244
+ }
245
+ })
246
+ ];
247
+ }
248
+ }),
249
+ (() => {
250
+ var e = d(E);
251
+ return u((t) => {
252
+ var n = r.name, i = r.form, a = r.disabled;
253
+ return n !== t.e && _(e, "name", t.e = n), i !== t.t && _(e, "form", t.t = i), a !== t.a && v(e, "disabled", t.a = a), t;
254
+ }, {
255
+ e: void 0,
256
+ t: void 0,
257
+ a: void 0
258
+ }), u(() => v(e, "value", W() === null ? "" : String(W()))), e;
259
+ })()
260
+ ];
261
+ }
262
+ });
263
+ }
264
+ //#endregion
265
+ export { N as NumberInput, M as normalizeNumberText, D as numberInputMessages };
266
+
267
+ //# sourceMappingURL=number-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number-input.js","names":["NumberInput","ArkNumberInput","useNumberInput","createEffect","createMemo","createSignal","createUniqueId","mergeProps","on","onCleanup","Show","isKorean","useDirection","Direction","classes","describedBy","NumberInputMessages","decrease","increase","numberInputMessages","locale","messages","Required","ko","NumberInputProps","value","defaultValue","onValueChange","next","min","max","step","formatOptions","Intl","NumberFormatOptions","stepper","suffix","label","labelPlacement","id","name","form","required","disabled","readOnly","invalid","placeholder","dir","class","MINUS","PLUS","StepIcon","props","path","_el$","_$getNextElement","_tmpl$","_$insert","map","d","_el$2","_tmpl$2","_$setAttribute","FULL_WIDTH","Record","normalizeNumberText","text","replace","char","String","fromCharCode","charCodeAt","separators","formatter","NumberFormat","parts","formatToParts","find","type","part","affixes","Set","includes","add","group","decimal","minus","generated","suffixId","maximumFractionDigits","syntax","fractions","resolvedOptions","format","Number","isFinite","controlled","undefined","internal","setInternal","current","draft","setDraft","draftNumber","setDraftNumber","outOfRange","root","HTMLDivElement","input","HTMLInputElement","composing","resetting","direction","commit","api","ids","allowMouseWheel","clampValueOnBlur","spinOnPress","inputMode","const","translations","decrementLabel","incrementLabel","valueText","details","isNaN","valueAsNumber","defer","reset","event","Event","setTimeout","defaultPrevented","addEventListener","capture","removeEventListener","inputAttributes","onKeyDown","_keyDown","onBeforeInput","_beforeInput","onInput","_input","onFocusOut","_focusOut","_value","attributes","getInputProps","zag","acceptable","decimals","trim","has","stepBy","delta","Math","setValue","_$createComponent","RootProvider","ref","r$","_ref$","data-label-placement","data-readonly","data-stepper","children","when","Label","Control","_el$3","_tmpl$3","_ref$2","_$use","_$spread","_$mergeProps","aria-label","_$memo","aria-labelledby","aria-describedby","onCompositionStart","currentTarget","dispatchEvent","InputEvent","bubbles","isComposing","target","data","slice","selectionStart","length","selectionEnd","preventDefault","normalized","start","end","setSelectionRange","keyCode","key","_$runHydrationEvents","_el$4","_tmpl$4","_$effect","_el$5","_tmpl$5","_el$6","firstChild","_el$7","_co$","_$getNextMarker","nextSibling","_el$8","_el$9","_co$2","DecrementTrigger","IncrementTrigger","_el$0","_tmpl$6","_p$","_v$","_v$2","_v$3","e","t","a","_$setProperty"],"sources":["../src/number-input.tsx"],"sourcesContent":["import {\n NumberInput as ArkNumberInput,\n useNumberInput,\n} from \"@ark-ui/solid/number-input\";\nimport {\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n mergeProps,\n on,\n onCleanup,\n Show,\n} from \"solid-js\";\nimport { isKorean } from \"./date-only\";\nimport { useDirection, type Direction } from \"./direction\";\nimport { classes, describedBy } from \"./utils\";\n\nexport interface NumberInputMessages {\n /** Accessible name of the − button. */\n decrease?: string;\n /** Accessible name of the + button. */\n increase?: string;\n}\n\nexport function numberInputMessages(\n locale: string,\n messages: NumberInputMessages = {},\n): Required<NumberInputMessages> {\n const ko = isKorean(locale);\n return {\n decrease: ko ? \"값 줄이기\" : \"Decrease\",\n increase: ko ? \"값 늘리기\" : \"Increase\",\n ...messages,\n };\n}\n\nexport interface NumberInputProps {\n /** null means empty. Controlled when not undefined. */\n value?: number | null;\n defaultValue?: number | null;\n /** Called with the new number, or null when emptied, only after a user change. */\n onValueChange?: (next: number | null) => void;\n min?: number;\n max?: number;\n /** Arrow keys and the stepper buttons move by step; PageUp/PageDown by ten steps. */\n step?: number;\n /** Formatting and parsing locale. Defaults to ko-KR. */\n locale?: string;\n /** Defaults to whole numbers with thousands separators. */\n formatOptions?: Intl.NumberFormatOptions;\n /** Show the − / + buttons. Defaults to true. */\n stepper?: boolean;\n /** Unit shown after the digits, for example 원, 개 or 분. */\n suffix?: string;\n label?: string;\n labelPlacement?: \"outside\" | \"hidden\";\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n id?: string;\n /** Submits the plain number (1234.5), never the formatted text. */\n name?: string;\n form?: string;\n required?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n /** Also invalid on its own while the number is outside min/max. */\n invalid?: boolean;\n placeholder?: string;\n messages?: NumberInputMessages;\n dir?: Direction;\n class?: string;\n}\n\n// Inlined from @devslab/dds-icons (minus/plus): importing the shared Icon here\n// would move the whole icon set into a chunk shared with the root entry.\nconst MINUS = [\"M5 12h14\"];\nconst PLUS = [\"M12 5v14\", \"M5 12h14\"];\nfunction StepIcon(props: { path: string[] }) {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n {props.path.map((d) => <path d={d} />)}\n </svg>\n );\n}\n\nconst FULL_WIDTH: Record<string, string> = {\n \",\": \",\",\n \".\": \".\",\n \"-\": \"-\",\n \"−\": \"-\",\n};\n/** Full-width digits from Japanese/Chinese IMEs become ASCII; other text is left for validation. */\nexport function normalizeNumberText(text: string) {\n return text.replace(/[0-9,.-−]/g, (char) =>\n char >= \"0\" && char <= \"9\"\n ? String.fromCharCode(char.charCodeAt(0) - 0xff10 + 48)\n : FULL_WIDTH[char]!,\n );\n}\n\nfunction separators(formatter: Intl.NumberFormat) {\n const parts = [\n ...formatter.formatToParts(-1234567.5),\n ...formatter.formatToParts(1234567.5),\n ];\n const find = (type: string) => parts.find((part) => part.type === type)?.value;\n const affixes = new Set<string>();\n for (const part of parts)\n if (![\"integer\", \"group\", \"decimal\", \"fraction\", \"minusSign\"].includes(part.type))\n for (const char of part.value) affixes.add(char);\n return {\n group: find(\"group\") ?? \"\",\n decimal: find(\"decimal\") ?? \".\",\n minus: find(\"minusSign\") ?? \"-\",\n affixes,\n };\n}\n\n/**\n * A localized number field. Values are numbers (or null for empty); display\n * text is formatted with Intl and never leaves the component.\n */\nexport function NumberInput(props: NumberInputProps) {\n const generated = createUniqueId();\n const id = () => props.id ?? `dds-number-input-${generated}`;\n const suffixId = () => `${id()}-suffix`;\n const locale = () => props.locale ?? \"ko-KR\";\n const messages = () => numberInputMessages(locale(), props.messages);\n const formatOptions = createMemo<Intl.NumberFormatOptions>(\n () => props.formatOptions ?? { maximumFractionDigits: 0 },\n );\n const formatter = createMemo(\n () => new Intl.NumberFormat(locale(), formatOptions()),\n );\n const syntax = createMemo(() => separators(formatter()));\n const fractions = () =>\n (formatter().resolvedOptions().maximumFractionDigits ?? 0) > 0;\n const format = (next: number | null) =>\n next === null || !Number.isFinite(next) ? \"\" : formatter().format(next);\n\n const controlled = () => props.value !== undefined;\n const [internal, setInternal] = createSignal<number | null>(\n props.defaultValue ?? null,\n );\n const current = () => (controlled() ? (props.value ?? null) : internal());\n // draft is the text in the field; draftNumber is what that text means.\n const [draft, setDraft] = createSignal(format(current()));\n const [draftNumber, setDraftNumber] = createSignal(current());\n const outOfRange = () => {\n const next = draftNumber();\n return (\n next !== null &&\n ((props.min !== undefined && next < props.min) ||\n (props.max !== undefined && next > props.max))\n );\n };\n const invalid = () => !!props.invalid || outOfRange();\n\n let root: HTMLDivElement | undefined;\n let input: HTMLInputElement | undefined;\n let composing = false;\n let resetting = false;\n const direction = useDirection(() => root, () => props.dir);\n\n const commit = (next: number | null) => {\n if (next === current()) return;\n if (!controlled()) setInternal(next);\n props.onValueChange?.(next);\n };\n\n const api = useNumberInput(() => ({\n id: `${id()}-root`,\n // Zag prefixes part IDs with \"number-input:\"; pin the two DDS documents.\n ids: { root: `${id()}-root`, input: id() },\n dir: direction(),\n locale: locale(),\n formatOptions: formatOptions(),\n value: draft(),\n step: props.step ?? 1,\n // Unset bounds stay absent: Zag's defaults are the safe-integer limits.\n ...(props.min !== undefined ? { min: props.min } : {}),\n ...(props.max !== undefined ? { max: props.max } : {}),\n allowMouseWheel: false,\n clampValueOnBlur: true,\n spinOnPress: true,\n inputMode: fractions() ? (\"decimal\" as const) : (\"numeric\" as const),\n disabled: props.disabled,\n readOnly: props.readOnly,\n required: props.required,\n invalid: invalid(),\n translations: {\n decrementLabel: messages().decrease,\n incrementLabel: messages().increase,\n valueText: (text: string) =>\n text && props.suffix ? `${text} ${props.suffix}` : text,\n },\n onValueChange: (details) => {\n if (resetting) return;\n const next = Number.isNaN(details.valueAsNumber)\n ? null\n : details.valueAsNumber;\n setDraft(details.value);\n setDraftNumber(next);\n commit(next);\n },\n }));\n\n // A parent-owned value that changes from outside replaces the field text.\n createEffect(\n on(\n current,\n (next) => {\n if (next === draftNumber()) return;\n setDraft(format(next));\n setDraftNumber(next);\n },\n { defer: true },\n ),\n );\n\n createEffect(() => {\n void props.form;\n const form = input?.form;\n if (!form) return;\n const reset = (event: Event) => {\n resetting = true;\n // A task, not a microtask: after a reset-button click, microtasks run\n // before the browser resets the controls and would be overwritten.\n setTimeout(() => {\n resetting = false;\n if (event.defaultPrevented) return;\n if (!controlled()) setInternal(props.defaultValue ?? null);\n setDraft(format(current()));\n setDraftNumber(current());\n if (input) input.value = draft();\n });\n };\n // Capture runs before Zag's own reset listener, which would emit a change.\n form.addEventListener(\"reset\", reset, { capture: true });\n onCleanup(() => form.removeEventListener(\"reset\", reset, { capture: true }));\n });\n\n // Keep everything from Zag except the handlers DDS composes below.\n const inputAttributes = mergeProps(() => {\n const {\n onKeyDown: _keyDown,\n onBeforeInput: _beforeInput,\n onInput: _input,\n onFocusOut: _focusOut,\n value: _value,\n ...attributes\n } = api().getInputProps() as Record<string, unknown>;\n return attributes;\n });\n const zag = () =>\n api().getInputProps() as Record<string, ((event: Event) => void) | undefined>;\n\n const acceptable = (text: string) => {\n const { group, decimal, minus, affixes } = syntax();\n let decimals = 0;\n for (const char of text) {\n if (char >= \"0\" && char <= \"9\") continue;\n if (char === group || (group.trim() === \"\" && char === \" \")) continue;\n if (char === decimal) {\n decimals += 1;\n if (!fractions() || decimals > 1) return false;\n continue;\n }\n if (char === minus || char === \"-\") {\n if (props.min !== undefined && props.min >= 0) return false;\n continue;\n }\n if (affixes.has(char)) continue;\n return false;\n }\n return true;\n };\n\n const stepBy = (delta: number) => {\n let next = (draftNumber() ?? 0) + delta;\n if (props.min !== undefined) next = Math.max(props.min, next);\n if (props.max !== undefined) next = Math.min(props.max, next);\n api().setValue(next);\n };\n\n return (\n <ArkNumberInput.RootProvider\n ref={root}\n value={api}\n class={classes(\"dds-number-input\", props.class)}\n data-label-placement={props.labelPlacement ?? \"outside\"}\n data-readonly={props.readOnly ? \"\" : undefined}\n data-stepper={props.stepper === false ? undefined : \"\"}\n >\n <Show when={props.label}>\n <ArkNumberInput.Label class=\"dds-number-input__label\">\n {props.label}\n </ArkNumberInput.Label>\n </Show>\n <ArkNumberInput.Control class=\"dds-number-input__control\">\n <input\n {...inputAttributes}\n ref={input}\n class=\"dds-number-input__field\"\n value={draft()}\n placeholder={props.placeholder}\n aria-label={props.label ? undefined : props[\"aria-label\"]}\n aria-labelledby={props.label ? undefined : props[\"aria-labelledby\"]}\n aria-describedby={describedBy(\n props.suffix ? suffixId() : undefined,\n props[\"aria-describedby\"],\n )}\n onCompositionStart={() => {\n composing = true;\n }}\n onCompositionEnd={(event) => {\n composing = false;\n // Hand the finished composition to the normal input path.\n event.currentTarget.dispatchEvent(\n new InputEvent(\"input\", { bubbles: true }),\n );\n }}\n onBeforeInput={(event) => {\n if (composing || event.isComposing) return;\n const target = event.currentTarget;\n const data = normalizeNumberText(event.data ?? \"\");\n const next =\n target.value.slice(0, target.selectionStart ?? target.value.length) +\n data +\n target.value.slice(target.selectionEnd ?? target.value.length);\n if (!acceptable(normalizeNumberText(next))) event.preventDefault();\n }}\n onInput={(event) => {\n if (composing) return;\n const target = event.currentTarget;\n const normalized = normalizeNumberText(target.value);\n if (!acceptable(normalized)) {\n // Letters, pasted units and the like are refused, not guessed at.\n target.value = draft();\n return;\n }\n if (normalized !== target.value) {\n const start = target.selectionStart;\n const end = target.selectionEnd;\n target.value = normalized;\n target.setSelectionRange(start, end);\n }\n zag().onInput?.(event);\n }}\n onKeyDown={(event) => {\n if (props.readOnly || props.disabled) return;\n if (event.isComposing || event.keyCode === 229) return;\n const step = props.step ?? 1;\n if (event.key === \"PageUp\" || event.key === \"PageDown\") {\n event.preventDefault();\n stepBy((event.key === \"PageUp\" ? 10 : -10) * step);\n return;\n }\n // Home/End jump to a bound only when that bound exists;\n // otherwise they keep moving the caret.\n if (event.key === \"Home\" && props.min === undefined) return;\n if (event.key === \"End\" && props.max === undefined) return;\n zag().onKeyDown?.(event);\n }}\n onFocusOut={(event) => {\n zag().onFocusOut?.(event);\n // A parent that declined the typed number gets its own value back.\n if (controlled() && draftNumber() !== current()) {\n setDraft(format(current()));\n setDraftNumber(current());\n }\n }}\n />\n <Show when={props.suffix}>\n <span id={suffixId()} class=\"dds-number-input__suffix\">\n {props.suffix}\n </span>\n </Show>\n <Show when={props.stepper !== false}>\n <span class=\"dds-number-input__steppers\">\n <ArkNumberInput.DecrementTrigger class=\"dds-number-input__step\">\n <StepIcon path={MINUS} />\n </ArkNumberInput.DecrementTrigger>\n <ArkNumberInput.IncrementTrigger class=\"dds-number-input__step\">\n <StepIcon path={PLUS} />\n </ArkNumberInput.IncrementTrigger>\n </span>\n </Show>\n </ArkNumberInput.Control>\n <input\n type=\"hidden\"\n name={props.name}\n form={props.form}\n value={draftNumber() === null ? \"\" : String(draftNumber())}\n disabled={props.disabled}\n />\n </ArkNumberInput.RootProvider>\n );\n}\n"],"mappings":"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"}