@devslab/dds-solid 0.23.0 → 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 (87) hide show
  1. package/README.ko.md +15 -3
  2. package/README.md +15 -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 +5 -0
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +168 -179
  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/segmented-control.d.ts +40 -0
  62. package/dist/segmented-control.d.ts.map +1 -0
  63. package/dist/segmented-control.js +133 -0
  64. package/dist/segmented-control.js.map +1 -0
  65. package/dist/segmented-control.server.js +138 -0
  66. package/dist/segmented-control.server.js.map +1 -0
  67. package/dist/select-picker.js +1 -1
  68. package/dist/select-picker.server.js +1 -1
  69. package/dist/server.js +8 -22
  70. package/dist/server.js.map +1 -1
  71. package/dist/time-only.d.ts +32 -0
  72. package/dist/time-only.d.ts.map +1 -0
  73. package/dist/time-picker-BlMWCQwk.js +113 -0
  74. package/dist/time-picker-BlMWCQwk.js.map +1 -0
  75. package/dist/time-picker.d.ts +34 -0
  76. package/dist/time-picker.d.ts.map +1 -0
  77. package/dist/time-picker.js +2 -0
  78. package/dist/time-picker.server.js +152 -0
  79. package/dist/time-picker.server.js.map +1 -0
  80. package/package.json +44 -4
  81. package/styles.css +31 -1
  82. package/dist/assets/calendar-view-1RO2mtf1.js.map +0 -1
  83. package/dist/assets/choice-DoXiK8nc.js.map +0 -1
  84. package/dist/calendar-view-CTBTPB4T.js +0 -444
  85. package/dist/calendar-view-CTBTPB4T.js.map +0 -1
  86. package/dist/choice-BPMiJlPJ.js +0 -395
  87. package/dist/choice-BPMiJlPJ.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { t as Choice } from "./assets/choice-DoXiK8nc.js";
1
+ import { t as Choice } from "./assets/choice-DPmk9AHn.js";
2
2
  import { createComponent, mergeProps } from "solid-js/web";
3
3
  //#region src/select-picker.tsx
4
4
  function SelectPicker(props) {
package/dist/server.js CHANGED
@@ -1,12 +1,18 @@
1
- import { c as Button, d as IconButton, f as Radio, h as createControllableSignal, l as Checkbox, m as Switch, p as Select, u as Field } from "./assets/calendar-view-1RO2mtf1.js";
1
+ import { a as IconButton, c as Switch, i as Field, l as createControllableSignal, n as Button, o as Radio, r as Checkbox, s as Select } from "./assets/calendar-view-BBQGmkJ7.js";
2
2
  import { t as classes } from "./assets/utils-Ou0UJRlO.js";
3
+ import { t as useDirection } from "./assets/direction-BpTqmXs-.js";
3
4
  import { DatePicker } from "./date-picker.server.js";
5
+ import { TimePicker } from "./time-picker.server.js";
6
+ import { DateRangePicker } from "./date-range-picker.server.js";
7
+ import { MonthPicker } from "./month-picker.server.js";
4
8
  import { Input, InputGroup } from "./input.server.js";
5
9
  import { Combobox } from "./combobox.server.js";
6
10
  import { SelectPicker } from "./select-picker.server.js";
7
11
  import { DropdownMenu } from "./dropdown-menu.server.js";
8
12
  import { Popover } from "./popover.server.js";
9
13
  import { Calendar } from "./calendar.server.js";
14
+ import { SegmentedControl, validateSegmentedItems } from "./segmented-control.server.js";
15
+ import { NumberInput, normalizeNumberText, numberInputMessages } from "./number-input.server.js";
10
16
  import { For, Show, createContext, createEffect, createMemo, createSignal, createUniqueId, getOwner, mergeProps, onCleanup, onMount, splitProps, useContext } from "solid-js";
11
17
  import { Dynamic, Portal, createComponent, escape, isServer, memo, mergeProps as mergeProps$1, ssr, ssrAttribute, ssrElement, ssrHydrationKey } from "solid-js/web";
12
18
  import { Dialog as Dialog$1, useDialog } from "@ark-ui/solid/dialog";
@@ -537,26 +543,6 @@ function createStatusPill(config) {
537
543
  };
538
544
  }
539
545
  //#endregion
540
- //#region src/direction.ts
541
- /** SSR callers may supply direction; clients also inherit their containing DOM. */
542
- function useDirection(element, explicit) {
543
- const [ambient, setAmbient] = createSignal("ltr");
544
- onMount(() => {
545
- const parent = element()?.parentElement;
546
- if (!parent) return;
547
- const update = () => setAmbient(getComputedStyle(parent).direction === "rtl" ? "rtl" : "ltr");
548
- update();
549
- const observer = new MutationObserver(update);
550
- observer.observe(parent.ownerDocument.documentElement, {
551
- attributes: true,
552
- subtree: true,
553
- attributeFilter: ["dir"]
554
- });
555
- onCleanup(() => observer.disconnect());
556
- });
557
- return () => explicit() ?? ambient();
558
- }
559
- //#endregion
560
546
  //#region src/tabs.tsx
561
547
  function Tabs(props) {
562
548
  const generated = createUniqueId();
@@ -810,6 +796,6 @@ function Tooltip(props) {
810
796
  });
811
797
  }
812
798
  //#endregion
813
- export { Button, Calendar, Checkbox, Combobox, ConsoleShell, DatePicker, Dialog, DropdownMenu, Field, Icon, IconButton, Input, InputGroup, Popover, Radio, RadioGroup, Select, SelectPicker, Switch, Tab, TabList, TabPanel, Tabs, ToastProvider, Tooltip, createControllableSignal, createPendingAction, createStatusPill, useToast };
799
+ export { Button, Calendar, Checkbox, Combobox, ConsoleShell, DatePicker, DateRangePicker, Dialog, DropdownMenu, Field, Icon, IconButton, Input, InputGroup, MonthPicker, NumberInput, Popover, Radio, RadioGroup, SegmentedControl, Select, SelectPicker, Switch, Tab, TabList, TabPanel, Tabs, TimePicker, ToastProvider, Tooltip, createControllableSignal, createPendingAction, createStatusPill, normalizeNumberText, numberInputMessages, useToast, validateSegmentedItems };
814
800
 
815
801
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","names":["For","Show","createSignal","createUniqueId","onCleanup","onMount","JSX","ConsoleNavItem","id","href","label","badge","active","ConsoleNavGroup","items","ConsoleShellLabels","skip","menuOpen","menuClose","nav","ConsoleHeader","eyebrow","title","actions","Element","ConsoleShellProps","surface","activePath","brand","name","mark","context","value","labels","header","foot","children","isActive","explicit","undefined","segments","split","filter","Boolean","length","startsWith","fillBadgeLabel","template","count","replace","String","ConsoleShell","props","open","setOpen","close","hydrated","setHydrated","onKey","event","KeyboardEvent","key","document","addEventListener","removeEventListener","_$ssr","_tmpl$5","_$ssrHydrationKey","_$ssrAttribute","_$escape","_$createComponent","when","_$memo","_tmpl$","each","row","_tmpl$6","group","groupId","_tmpl$7","item","_tmpl$9","_tmpl$8","_tmpl$2","_tmpl$3","_tmpl$4","Dialog","ArkDialog","useDialog","usePresenceContext","FocusTrap","ariaHidden","createEffect","createMemo","createSignal","createUniqueId","onCleanup","Show","JSX","Dynamic","isServer","Portal","classes","focusable","join","DialogProps","open","defaultOpen","onOpenChange","title","Element","description","children","actions","closeOnEscape","closeOnOutside","class","id","role","contentAs","portal","portalMount","HTMLElement","unstyled","overlayClass","titleClass","descriptionClass","actionsClass","contentProps","Omit","HTMLAttributes","initialFocus","finalFocus","restoreFocus","onEscapeKeyDown","event","KeyboardEvent","additionalFocusContainers","frame","parts","DialogFrameParts","props","generated","panel","setPanel","api","details","closeOnInteractOutside","initialFocusEl","finalFocusEl","modal","trapFocus","preventScroll","persistentElements","filter","element","Boolean","map","ids","content","opener","ownerDocument","activeElement","trap","removeIsolation","ready","setReady","containers","isConnected","defaultView","requestAnimationFrame","document","escapeDeactivates","allowOutsideClick","delayInitialFocus","fallbackFocus","getShadowRoot","undefined","setReturnFocus","activate","targets","updateContainerElements","defer","cancelAnimationFrame","deactivate","returnFocus","cls","base","extra","Content","presence","nativeContent","merge","_$createComponent","_$mergeProps","component","Positioner","asChild","aria-describedby","_$memo","Title","Description","_$ssr","_tmpl$","_$ssrHydrationKey","_$ssrAttribute","_$escape","RootProvider","value","lazyMount","unmountOnExit","when","fallback","mount","RadioGroup","ArkRadioGroup","For","JSX","classes","RadioOption","value","label","Element","disabled","RadioGroupProps","options","defaultValue","onValueChange","name","form","required","class","props","initialValue","_$createComponent","Root","details","children","Label","each","option","Item","ItemHiddenInput","style","ItemText","directionPolicy","icons","DdsIconName","splitProps","JSX","classes","IconProps","Omit","SvgSVGAttributes","SVGSVGElement","name","label","size","directional","Icon","props","local","rest","icon","mirrorInRtl","includes","_$ssrElement","_$mergeProps","class","cssClass","viewBox","width","height","fill","stroke","stroke-width","strokeWidth","role","undefined","aria-label","aria-hidden","_$ssr","_tmpl$2","_$ssrHydrationKey","_$escape","_tmpl$","body","Show","JSX","StatusTone","createStatusPill","config","tones","Record","D","label","domain","value","locale","openDomains","NoInfer","open","Set","StatusPill","props","Element","tone","known","Boolean","resolved","found","Error","text","_$createComponent","when","has","fallback","_$ssr","_tmpl$","_$ssrHydrationKey","_$escape","children","_tmpl$2","_$ssrAttribute","Tabs","ArkTabs","useTabsContext","LocaleProvider","createUniqueId","mergeProps","splitProps","JSX","ParentProps","classes","useDirection","Direction","TabsProps","value","defaultValue","onValueChange","orientation","children","Element","id","dir","activationMode","tabId","panelId","unstyled","asChild","props","HTMLAttributes","HTMLDivElement","generated","root","direction","child","merge","ref","element","undefined","_$createComponent","locale","Root","_$mergeProps","details","lazyMount","unmountOnExit","class","ids","trigger","content","TabList","local","rest","List","TabProps","Omit","ButtonHTMLAttributes","HTMLButtonElement","Tab","Trigger","TabPanelProps","TabPanel","tabs","inactive","style","replace","display","Content","hidden","inert","Toast","ArkToast","Toaster","createToaster","space","createContext","createUniqueId","onCleanup","useContext","JSX","classes","ToastTone","ToastInput","message","Element","tone","duration","ToastRecord","id","ToastApi","show","toast","dismiss","clear","ToastContext","ToastProviderProps","children","defaultDuration","dismissLabel","regionLabel","class","ToastProvider","props","prefix","region","HTMLDivElement","scopedDocument","Document","getRootNode","Proxy","ownerDocument","document","get","target","property","getElementById","value","Reflect","bind","toaster","placement","overlap","gap","offsets","removeDelay","hotkey","max","Number","MAX_SAFE_INTEGER","pauseOnPageIdle","sequence","api","input","create","description","type","Infinity","meta","dds","remove","_$createComponent","Provider","role","aria-label","record","Root","Description","CloseTrigger","_$memo","useToast","context","Error","Tooltip","ArkTooltip","useTooltip","createUniqueId","splitProps","JSX","classes","createControllableSignal","TooltipTriggerProps","Omit","ButtonHTMLAttributes","HTMLButtonElement","onFocus","onBlur","onPointerEnter","onPointerLeave","TooltipProps","content","Element","children","props","open","defaultOpen","onOpenChange","id","class","generated","setOpen","value","defaultValue","onChange","next","api","ids","details","openDelay","closeDelay","_$createComponent","RootProvider","lazyMount","unmountOnExit","_$ssr","_tmpl$","_$ssrHydrationKey","_$ssrAttribute","_$escape","Trigger","asChild","merge","attributes","Positioner","Content"],"sources":["../src/console-shell.tsx","../src/dialog.tsx","../src/radio-group.tsx","../src/icon.tsx","../src/pending-action.ts","../src/status-pill.tsx","../src/direction.ts","../src/tabs.tsx","../src/toast.tsx","../src/tooltip.tsx"],"sourcesContent":["import { For, Show, createSignal, createUniqueId, onCleanup, onMount, type JSX } from \"solid-js\";\n\n/** One item in a nav group's list. `active` is a caller override — pass it\n * only when the generic prefix rule below gets a route wrong. \"Index route\"\n * in that rule means an `href` exactly one path segment deep (e.g.\n * `/dashboard`); a console mounted under a path prefix (so its own root is\n * two or more segments deep) should pass `active` explicitly on that item\n * rather than rely on the generic rule. */\nexport interface ConsoleNavItem {\n id: string;\n href: string;\n label: string;\n badge?: number;\n active?: boolean;\n}\n\nexport interface ConsoleNavGroup {\n label: string;\n items: readonly ConsoleNavItem[];\n}\n\nexport interface ConsoleShellLabels {\n skip: string;\n menuOpen: string;\n menuClose: string;\n /** Accessible name for the rail's `<nav>` landmark (e.g. \"Dashboard\n * navigation\"). Required, not optional: a console page also has the\n * DataTable's pagination `<nav>` (named via its own `labels.nextPage`),\n * and an unnamed landmark next to a named one is a regression a\n * screen-reader user would notice immediately — the rail is the primary\n * nav, so it must never be the anonymous one. */\n nav: string;\n /** Badge accessible name template. `{count}` is substituted with the\n * item's pending count — DDS supplies no words of its own. */\n badge: string;\n}\n\nexport interface ConsoleHeader {\n eyebrow?: string;\n title: string;\n actions?: JSX.Element;\n}\n\nexport interface ConsoleShellProps {\n surface: string;\n activePath: string;\n brand: { href: string; name: string; mark: string };\n /** Lines pinned under the brand — a product's organization, environment,\n * or role context. */\n context?: readonly { label: string; value: string }[];\n nav: readonly ConsoleNavGroup[];\n labels: ConsoleShellLabels;\n header: ConsoleHeader;\n /** Slot for the rail's bottom — DDS must not depend on site-kit, so a\n * theme toggle, locale picker, or sign-out form all arrive as children\n * the product renders itself. */\n foot?: JSX.Element;\n children: JSX.Element;\n}\n\n/* An index route matches exactly; everything else matches by prefix. A caller\n that knows better passes `active` on the item. */\nfunction isActive(activePath: string, href: string, explicit?: boolean): boolean {\n if (explicit !== undefined) return explicit;\n const segments = href.split(\"/\").filter(Boolean);\n if (segments.length <= 1) return activePath === href;\n return activePath === href || activePath.startsWith(`${href}/`);\n}\n\n/** Fills the `{count}` placeholder in a consumer-supplied badge label\n * template. A function replacer, not `template.replace(\"{count}\", value)`\n * — a string replacement value is subject to special\n * `$&`/`$$`/`` $` ``/`$'` patterns. `count` is always a plain digit string\n * today, so this is defensive rather than a live bug, but it is the same\n * class of mistake as dds-table's analogous `sortBy` label fix — no\n * shared helper between the two packages (see that fix's note). */\nfunction fillBadgeLabel(template: string, count: number): string {\n return template.replace(\"{count}\", () => String(count));\n}\n\nexport function ConsoleShell(props: ConsoleShellProps): JSX.Element {\n const [open, setOpen] = createSignal(false);\n const close = () => setOpen(false);\n // Delegated listeners (the rail toggle's onClick among them) attach once\n // Solid finishes hydrating; this flips only then, so a harness can wait\n // for the same readiness signal a real click depends on instead of\n // guessing with a retry. onMount never runs during SSR, so this listener\n // is never attached — and this attribute never rendered — on the server.\n const [hydrated, setHydrated] = createSignal(false);\n onMount(() => {\n setHydrated(true);\n const onKey = (event: KeyboardEvent) => { if (event.key === \"Escape\") close(); };\n document.addEventListener(\"keydown\", onKey);\n onCleanup(() => document.removeEventListener(\"keydown\", onKey));\n });\n\n return (\n <div class=\"dds-console-shell\" data-surface={props.surface} data-hydrated={hydrated() ? \"true\" : undefined}>\n <a class=\"dds-console-skip dds-visually-hidden\" href=\"#dds-console-main\">{props.labels.skip}</a>\n <button\n class=\"dds-console-rail__toggle\"\n type=\"button\"\n data-action=\"toggle-rail\"\n aria-controls=\"dds-console-rail\"\n aria-expanded={open()}\n onClick={() => setOpen(!open())}\n >\n <span aria-hidden=\"true\" />\n <span class=\"dds-visually-hidden\">{open() ? props.labels.menuClose : props.labels.menuOpen}</span>\n </button>\n <div class=\"dds-console-rail__scrim\" data-open={open() ? \"true\" : \"false\"} onClick={close} />\n <aside id=\"dds-console-rail\" class=\"dds-console-rail\" data-open={open() ? \"true\" : \"false\"}>\n {/* No aria-label here: the decorative img (alt=\"\") contributes\n nothing to the accessible name, so it resolves to the visible\n \"{brand.name}\" text alone — the original concatenated a\n hardcoded English word (\"home\") onto this, which is exactly the\n kind of copy this package must not author itself. */}\n <a class=\"dds-console-rail__brand\" href={props.brand.href}>\n <img src={props.brand.mark} alt=\"\" width=\"20\" height=\"20\" />\n <strong>{props.brand.name}</strong>\n </a>\n <Show when={props.context && props.context.length > 0}>\n <dl class=\"dds-console-rail__context\">\n <For each={props.context}>{(row) => <div><dt>{row.label}</dt><dd>{row.value}</dd></div>}</For>\n </dl>\n </Show>\n <nav class=\"dds-console-rail__nav\" aria-label={props.labels.nav}>\n <For each={props.nav}>{(group) => {\n const groupId = `dds-console-group-${createUniqueId()}`;\n return (\n <section class=\"dds-console-rail__group\" aria-labelledby={groupId}>\n <h2 id={groupId} class=\"dds-console-rail__group-label\">{group.label}</h2>\n <ul>\n <For each={group.items}>{(item) => (\n <li>\n <a\n class=\"dds-console-rail__item\"\n data-nav={`${props.surface}.${item.id}`}\n href={item.href}\n aria-current={isActive(props.activePath, item.href, item.active) ? \"page\" : undefined}\n onClick={close}\n >\n <span>{item.label}</span>\n <Show when={item.badge !== undefined && item.badge > 0}>\n <span class=\"dds-console-rail__badge\" aria-label={fillBadgeLabel(props.labels.badge, item.badge!)}>{item.badge}</span>\n </Show>\n </a>\n </li>\n )}</For>\n </ul>\n </section>\n );\n }}</For>\n </nav>\n <Show when={props.foot}>\n <div class=\"dds-console-rail__foot\">{props.foot}</div>\n </Show>\n </aside>\n <main id=\"dds-console-main\" class=\"dds-console-main\" tabIndex={-1}>\n <header class=\"dds-console-page-header\">\n <div class=\"dds-console-page-header__text\">\n <Show when={props.header.eyebrow}>\n <p class=\"dds-console-page-eyebrow\">{props.header.eyebrow}</p>\n </Show>\n <h1>{props.header.title}</h1>\n </div>\n <Show when={props.header.actions}>\n <div class=\"dds-console-page-header__actions\">{props.header.actions}</div>\n </Show>\n </header>\n {props.children}\n </main>\n </div>\n );\n}\n","import { Dialog as ArkDialog, useDialog } from \"@ark-ui/solid/dialog\";\nimport { usePresenceContext } from \"@ark-ui/solid/presence\";\nimport { FocusTrap } from \"@zag-js/focus-trap\";\nimport { ariaHidden } from \"@zag-js/aria-hidden\";\nimport { createEffect, createMemo, createSignal, createUniqueId, onCleanup, Show, type JSX } from \"solid-js\";\nimport { Dynamic, isServer, Portal } from \"solid-js/web\";\nimport { classes } from \"./utils\";\n\nexport const focusable = [\n \"a[href]\", \"button:not([disabled])\", \"input:not([disabled])\",\n \"select:not([disabled])\", \"textarea:not([disabled])\", \"[tabindex]:not([tabindex='-1'])\",\n].join(\",\");\n\nexport interface DialogProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n title: JSX.Element;\n description?: JSX.Element;\n children: JSX.Element;\n actions?: JSX.Element;\n closeOnEscape?: boolean;\n closeOnOutside?: boolean;\n class?: string;\n id?: string;\n role?: \"dialog\" | \"alertdialog\";\n contentAs?: \"div\" | \"section\";\n portal?: boolean;\n portalMount?: HTMLElement;\n unstyled?: boolean;\n overlayClass?: string;\n titleClass?: string;\n descriptionClass?: string;\n actionsClass?: string;\n contentProps?: Omit<JSX.HTMLAttributes<HTMLElement>, \"children\" | \"class\" | \"id\" | \"role\" | \"ref\">;\n initialFocus?: () => HTMLElement | null | undefined;\n finalFocus?: () => HTMLElement | null | undefined;\n restoreFocus?: boolean;\n onEscapeKeyDown?: (event: KeyboardEvent) => void;\n /** Authorized external regions join both the Tab cycle and modal accessibility scope. */\n additionalFocusContainers?: () => readonly (HTMLElement | null | undefined)[];\n /** Customize the inner layout using DDS-owned, already labelled title/description nodes. */\n frame?: (parts: DialogFrameParts) => JSX.Element;\n}\n\nexport interface DialogFrameParts {\n title: JSX.Element;\n description: JSX.Element;\n children: JSX.Element;\n actions: JSX.Element;\n}\n\nexport function Dialog(props: DialogProps) {\n const generated = createUniqueId();\n const id = () => props.id ?? `dds-dialog-${generated}`;\n const [panel, setPanel] = createSignal<HTMLElement>();\n const api = useDialog(() => ({\n id: id(), open: props.open, defaultOpen: props.defaultOpen,\n onOpenChange: (details) => props.onOpenChange?.(details.open),\n closeOnEscape: props.closeOnEscape ?? true,\n closeOnInteractOutside: props.closeOnOutside ?? true,\n onEscapeKeyDown: props.onEscapeKeyDown,\n initialFocusEl: () => props.initialFocus?.() ?? null,\n finalFocusEl: () => props.finalFocus?.() ?? null,\n restoreFocus: props.restoreFocus ?? true,\n // Ark handles ordinary dialogs. A multi-container modal needs a shared\n // Zag trap and isolation target list instead of Ark's single content node.\n modal: !props.additionalFocusContainers,\n trapFocus: !props.additionalFocusContainers,\n preventScroll: true,\n role: props.role ?? \"dialog\",\n persistentElements: isServer ? [] : props.additionalFocusContainers?.().filter((element): element is HTMLElement => Boolean(element)).map(element => () => element),\n ids: { content: id(), title: `${id()}-title`, description: `${id()}-description` },\n }));\n const open = createMemo(() => api().open);\n createEffect(() => {\n const content = panel();\n if (!open() || !props.additionalFocusContainers || !content) return;\n const opener = content.ownerDocument.activeElement;\n let trap: FocusTrap | undefined;\n let removeIsolation: (() => void) | undefined;\n const [ready, setReady] = createSignal(false);\n const containers = () => [content, ...props.additionalFocusContainers!().filter((element): element is HTMLElement => Boolean(element?.isConnected && element.ownerDocument === content.ownerDocument))];\n const frame = content.ownerDocument.defaultView!.requestAnimationFrame(() => {\n trap = new FocusTrap(containers(), {\n document: content.ownerDocument,\n escapeDeactivates: false, allowOutsideClick: true, preventScroll: true,\n delayInitialFocus: false, fallbackFocus: content, getShadowRoot: true,\n initialFocus: () => props.initialFocus?.() ?? undefined,\n setReturnFocus: () => props.finalFocus?.() ?? (opener instanceof HTMLElement && opener.isConnected ? opener : false),\n });\n setReady(true);\n trap.activate();\n });\n createEffect(() => {\n if (!ready()) return;\n const targets = containers();\n trap!.updateContainerElements(targets);\n removeIsolation?.();\n removeIsolation = ariaHidden(targets, { defer: false });\n });\n onCleanup(() => {\n content.ownerDocument.defaultView!.cancelAnimationFrame(frame);\n removeIsolation?.();\n trap?.deactivate({ returnFocus: props.restoreFocus !== false });\n });\n });\n const cls = (base: string, extra?: string) => classes(props.unstyled ? undefined : base, extra);\n const Content = () => {\n const presence = usePresenceContext();\n const nativeContent = (merge: unknown) => <Dynamic component={props.contentAs ?? \"div\"}\n {...(merge as (props: JSX.HTMLAttributes<HTMLElement>) => JSX.HTMLAttributes<HTMLElement>)({})}\n ref={(element: HTMLElement) => {\n // Ark's asChild merger omits refs. Register both its presence node and\n // DDS's shared focus container on the actual native content element.\n presence().ref(element);\n setPanel(element);\n }}\n />;\n return <ArkDialog.Positioner class={cls(\"dds-dialog-overlay\", props.overlayClass)}>\n <ArkDialog.Content {...props.contentProps} ref={setPanel} class={cls(\"dds-dialog\", props.class)}\n {...(props.contentAs ? { asChild: nativeContent } : {})}\n role={props.role ?? \"dialog\"} aria-modal=\"true\" aria-describedby={props.description ? `${id()}-description` : undefined}>\n {(() => {\n const parts: DialogFrameParts = {\n get title() { return <ArkDialog.Title class={cls(\"dds-dialog__title\", props.titleClass)}>{props.title}</ArkDialog.Title>; },\n get description() { return props.description && <ArkDialog.Description class={cls(\"dds-dialog__body\", props.descriptionClass)}>{props.description}</ArkDialog.Description>; },\n get children() { return props.children; },\n get actions() { return props.actions && <div class={cls(\"dds-dialog__actions\", props.actionsClass)}>{props.actions}</div>; },\n };\n return props.frame ? props.frame(parts) : <>{parts.title}{parts.description}{parts.children}{parts.actions}</>;\n })()}\n </ArkDialog.Content>\n </ArkDialog.Positioner>;\n };\n return <ArkDialog.RootProvider value={api} lazyMount unmountOnExit>\n <Show when={props.portal} fallback={<Content />}><Portal {...(props.portalMount ? { mount: props.portalMount } : {})}><Content /></Portal></Show>\n </ArkDialog.RootProvider>;\n}\n","import { RadioGroup as ArkRadioGroup } from \"@ark-ui/solid/radio-group\";\nimport { For, type JSX } from \"solid-js\";\nimport { classes } from \"./utils\";\n\nexport interface RadioOption {\n value: string;\n label: JSX.Element;\n disabled?: boolean;\n}\nexport interface RadioGroupProps {\n options: readonly RadioOption[];\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n name?: string;\n form?: string;\n disabled?: boolean;\n required?: boolean;\n label: JSX.Element;\n class?: string;\n}\n\n/** Grouped radios delegate selection and roving keyboard focus to Ark. */\nexport function RadioGroup(props: RadioGroupProps) {\n const initialValue = props.value ?? props.defaultValue;\n return <ArkRadioGroup.Root\n value={props.value} defaultValue={props.defaultValue}\n name={props.name} form={props.form} disabled={props.disabled} required={props.required}\n onValueChange={(details) => { if (details.value !== null) props.onValueChange?.(details.value); }}\n class={classes(\"dds-radio-group\", props.class)}\n >\n <ArkRadioGroup.Label class=\"dds-field__label\">{props.label}</ArkRadioGroup.Label>\n <For each={props.options}>{(option) => <ArkRadioGroup.Item value={option.value} disabled={option.disabled} class=\"dds-check\">\n <ArkRadioGroup.ItemHiddenInput class=\"dds-check__input\" style={{}}\n ref={(input) => { input.defaultChecked = initialValue === option.value; }} />\n <ArkRadioGroup.ItemText>{option.label}</ArkRadioGroup.ItemText>\n </ArkRadioGroup.Item>}</For>\n </ArkRadioGroup.Root>;\n}\n","import { directionPolicy, icons, type DdsIconName } from \"@devslab/dds-icons\";\nimport { splitProps, type JSX } from \"solid-js\";\n\nimport { classes } from \"./utils\";\n\nexport interface IconProps extends Omit<JSX.SvgSVGAttributes<SVGSVGElement>, \"name\" | \"children\"> {\n name: DdsIconName;\n label?: string;\n size?: number | string;\n directional?: boolean;\n}\n\nexport function Icon(props: IconProps) {\n const [local, rest] = splitProps(props, [\"name\", \"label\", \"size\", \"directional\", \"class\"]);\n const icon = () => icons[local.name];\n const directional = () => local.directional ?? directionPolicy.mirrorInRtl.includes(local.name);\n return (\n <svg\n {...rest}\n class={classes(directional() && directionPolicy.cssClass, local.class)}\n viewBox={icon().viewBox}\n width={local.size ?? 24}\n height={local.size ?? 24}\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width={icon().strokeWidth}\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n role={local.label ? \"img\" : undefined}\n aria-label={local.label}\n aria-hidden={local.label ? undefined : \"true\"}\n >\n {local.label && <title>{local.label}</title>}\n <g innerHTML={icon().body} />\n </svg>\n );\n}\n","import { createSignal, getOwner, onCleanup, type Accessor } from \"solid-js\";\n\n/** Options for one `run` call. */\nexport interface PendingActionRunOptions {\n /**\n * Start even while another action runs: that one is aborted and this one takes its place, so the\n * latest request wins (a list reload after typing, paging or sorting). Without it a second start\n * while one runs is ignored, which is what a button wants.\n */\n replace?: boolean;\n}\n\n/**\n * Which of a screen's actions is running. A screen with several buttons gives each one its own\n * key, so only the button that started the work shows progress, while every other control can\n * still be locked through `busy`. One shared flag for all the buttons spins every one of them.\n */\nexport interface PendingAction<K extends string = string> {\n /** The key of the action now running, or null. */\n readonly current: Accessor<K | null>;\n /** True while any action runs: lock the other controls with it. */\n readonly busy: Accessor<boolean>;\n /** True while `key` is the running action: give that control its progress state. */\n is(key: K): boolean;\n /**\n * Runs `task` as `key` and clears the state when it settles, whether it resolves or throws (the\n * error reaches the caller). While another action runs it does nothing and resolves to undefined,\n * unless `replace` is set. The task receives a signal that aborts when this run stops counting:\n * `reset()`, a run that replaced it, or the owner going away. Check `signal.aborted` after each\n * await before touching the screen, or pass the signal to `fetch`.\n */\n run<T>(key: K, task: (signal: AbortSignal) => T | Promise<T>, options?: PendingActionRunOptions): Promise<T | undefined>;\n /** Stops tracking the running action and aborts its signal, for example when the screen's data was replaced. */\n reset(): void;\n}\n\n/** Tracks the running action of a screen; created in a component, it stops with that component. */\nexport function createPendingAction<K extends string = string>(): PendingAction<K> {\n const [current, setCurrent] = createSignal<K | null>(null);\n let active: AbortController | null = null;\n let disposed = false;\n const stop = () => {\n active?.abort();\n active = null;\n };\n if (getOwner()) onCleanup(() => { disposed = true; stop(); });\n return {\n current,\n busy: () => current() !== null,\n is: (key) => current() === key,\n async run(key, task, options) {\n if (disposed || (active && !options?.replace)) return undefined;\n stop();\n const controller = new AbortController();\n active = controller;\n setCurrent(() => key);\n try {\n return await task(controller.signal);\n } finally {\n if (active === controller) {\n active = null;\n setCurrent(null);\n }\n }\n },\n reset() {\n stop();\n setCurrent(null);\n },\n };\n}\n","import { Show, type JSX } from \"solid-js\";\n\nexport type StatusTone = \"success\" | \"warning\" | \"danger\" | \"info\" | \"brand\" | \"neutral\";\n\n/* The rule, not the vocabulary. A value a CLOSED domain does not know throws:\n that can only mean a schema gained a case the catalog forgot. A value an OPEN\n domain does not know renders as raw text: that is customer data, and it must\n not crash the screen.\n\n `tones` declares which domains exist; `openDomains` only selects among the\n domains `tones` already declared, so it must not itself widen or narrow that\n set. */\nexport function createStatusPill<D extends string>(config: {\n tones: Record<D, Record<string, StatusTone>>;\n label: (domain: D, value: string, locale: string) => string | undefined;\n openDomains?: readonly NoInfer<D>[];\n}) {\n const open = new Set<string>(config.openDomains ?? []);\n return function StatusPill(props: { domain: D; value: string; locale: string }): JSX.Element {\n const tone = () => config.tones[props.domain]?.[props.value];\n const label = () => config.label(props.domain, props.value, props.locale);\n const known = () => Boolean(tone() && label());\n const resolved = () => {\n const found = tone();\n if (!found) throw new Error(`StatusPill: no tone for ${props.domain}.${props.value}`);\n const text = label();\n if (!text) throw new Error(`StatusPill: no label for ${props.domain}.${props.value}`);\n return { tone: found, text };\n };\n return (\n <Show when={known() || !open.has(props.domain)} fallback={<code data-status={`${props.domain}.${props.value}`}>{props.value}</code>}>\n {(() => {\n const value = resolved();\n return (\n <span\n class={value.tone === \"neutral\" ? \"dds-badge\" : `dds-badge dds-badge--${value.tone}`}\n data-status={`${props.domain}.${props.value}`}\n data-tone={value.tone}\n >\n {value.text}\n </span>\n );\n })()}\n </Show>\n );\n };\n}\n","import { createSignal, onCleanup, onMount, type Accessor } from \"solid-js\";\n\nexport type Direction = \"ltr\" | \"rtl\";\n\n/** SSR callers may supply direction; clients also inherit their containing DOM. */\nexport function useDirection(element: () => HTMLElement | undefined, explicit: Accessor<Direction | undefined>) {\n const [ambient, setAmbient] = createSignal<Direction>(\"ltr\");\n onMount(() => {\n const parent = element()?.parentElement;\n if (!parent) return;\n const update = () => setAmbient(getComputedStyle(parent).direction === \"rtl\" ? \"rtl\" : \"ltr\");\n update();\n const observer = new MutationObserver(update);\n observer.observe(parent.ownerDocument.documentElement, { attributes: true, subtree: true, attributeFilter: [\"dir\"] });\n onCleanup(() => observer.disconnect());\n });\n return () => explicit() ?? ambient();\n}\n","import { Tabs as ArkTabs, useTabsContext } from \"@ark-ui/solid/tabs\";\nimport { LocaleProvider } from \"@ark-ui/solid/locale\";\nimport { createUniqueId, mergeProps, splitProps, type JSX, type ParentProps } from \"solid-js\";\nimport { classes } from \"./utils\";\nimport { useDirection, type Direction } from \"./direction\";\n\nexport interface TabsProps {\n value?: string;\n defaultValue: string;\n onValueChange?: (value: string) => void;\n orientation?: \"horizontal\" | \"vertical\";\n children: JSX.Element;\n id?: string;\n dir?: Direction;\n activationMode?: \"automatic\" | \"manual\";\n tabId?: (value: string) => string;\n panelId?: (value: string) => string;\n unstyled?: boolean;\n asChild?: (props: JSX.HTMLAttributes<HTMLDivElement>) => JSX.Element;\n}\n\nexport function Tabs(props: TabsProps) {\n const generated = createUniqueId();\n const id = () => props.id ?? `dds-tabs-${generated}`;\n let root: HTMLDivElement | undefined;\n const direction = useDirection(() => root, () => props.dir);\n const child = props.asChild ? (merge: unknown) => props.asChild!(mergeProps(\n (merge as (props: JSX.HTMLAttributes<HTMLDivElement>) => JSX.HTMLAttributes<HTMLDivElement>)({}),\n { ref: (element: HTMLDivElement) => { root = element; } },\n )) : undefined;\n return <LocaleProvider locale={direction() === \"rtl\" ? \"ar\" : \"en\"}><ArkTabs.Root ref={root}\n id={id()} value={props.value} defaultValue={props.defaultValue}\n orientation={props.orientation ?? \"horizontal\"} activationMode={props.activationMode ?? \"automatic\"}\n onValueChange={(details) => props.onValueChange?.(details.value)}\n lazyMount={false} unmountOnExit={false} class={props.unstyled ? undefined : \"dds-tabs-root\"}\n {...(child ? { asChild: child } : {})}\n ids={{ trigger: (value) => props.tabId?.(value) ?? `${id()}-tab-${value}`, content: (value) => props.panelId?.(value) ?? `${id()}-panel-${value}` }}\n >{props.children}</ArkTabs.Root></LocaleProvider>;\n}\n\nexport function TabList(props: ParentProps<JSX.HTMLAttributes<HTMLDivElement> & { unstyled?: boolean }>) {\n const [local, rest] = splitProps(props, [\"class\", \"children\", \"unstyled\"]);\n return <ArkTabs.List {...rest} class={classes(!local.unstyled && \"dds-tabs\", local.class)}>{local.children}</ArkTabs.List>;\n}\n\nexport interface TabProps extends Omit<JSX.ButtonHTMLAttributes<HTMLButtonElement>, \"value\" | \"class\"> {\n value: string;\n class?: string;\n unstyled?: boolean;\n asChild?: (props: JSX.ButtonHTMLAttributes<HTMLButtonElement>) => JSX.Element;\n}\n\nexport function Tab(props: ParentProps<TabProps>) {\n const [local, rest] = splitProps(props, [\"class\", \"children\", \"value\", \"unstyled\", \"asChild\"]);\n // Ark's factory supplies a merger; DDS exposes native button attributes.\n const child = local.asChild ? (merge: unknown) => local.asChild!(mergeProps(\n (merge as (props: JSX.ButtonHTMLAttributes<HTMLButtonElement>) => JSX.ButtonHTMLAttributes<HTMLButtonElement>)({}),\n { ref: props.ref },\n )) : undefined;\n return <ArkTabs.Trigger {...rest} value={local.value} class={classes(!local.unstyled && \"dds-tab\", local.class)} {...(child ? { asChild: child } : {})}>{local.children}</ArkTabs.Trigger>;\n}\n\nexport interface TabPanelProps extends JSX.HTMLAttributes<HTMLDivElement> { value: string }\n\nexport function TabPanel(props: ParentProps<TabPanelProps>) {\n const [local, rest] = splitProps(props, [\"value\", \"children\", \"style\"]);\n const tabs = useTabsContext();\n const inactive = () => tabs().value !== local.value;\n const style = () => !inactive() ? local.style : typeof local.style === \"string\"\n ? `${local.style.replace(/;+\\s*$/, \"\")};display:none;`\n : { ...local.style, display: \"none\" };\n return <ArkTabs.Content {...rest} value={local.value} style={style()} hidden={inactive()} inert={inactive()}>{local.children}</ArkTabs.Content>;\n}\n","import { Toast as ArkToast, Toaster, createToaster } from \"@ark-ui/solid/toast\";\nimport { space } from \"@devslab/dds-tokens\";\nimport { createContext, createUniqueId, onCleanup, useContext, type JSX } from \"solid-js\";\nimport { classes } from \"./utils\";\n\nexport type ToastTone = \"success\" | \"warning\" | \"danger\" | \"info\";\nexport interface ToastInput { message: JSX.Element; tone?: ToastTone; duration?: number }\nexport interface ToastRecord extends ToastInput { id: string }\nexport interface ToastApi {\n show: (toast: ToastInput) => string;\n dismiss: (id: string) => void;\n clear: () => void;\n}\nconst ToastContext = createContext<ToastApi>();\n\nexport interface ToastProviderProps {\n children: JSX.Element;\n defaultDuration?: number;\n dismissLabel?: string | ((toast: ToastRecord) => string);\n /** Optional localized label for the notification region. */\n regionLabel?: string;\n class?: string;\n}\n\nexport function ToastProvider(props: ToastProviderProps) {\n const prefix = createUniqueId();\n let region: HTMLDivElement | undefined;\n let scopedDocument: Document | undefined;\n // Zag derives group IDs from placement rather than provider identity. Keep\n // each provider's physical ID unique, and scope that one logical lookup.\n const getRootNode = () => scopedDocument ??= new Proxy(region?.ownerDocument ?? document, {\n get(target, property) {\n if (property === \"getElementById\") return (id: string) => id === \"toast-group:bottom-end\" ? region ?? null : target.getElementById(id);\n const value = Reflect.get(target, property, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n const toaster = createToaster({\n placement: \"bottom-end\", overlap: false, gap: space[8],\n // An empty array matches EVERY key in Zag. An impossible physical code\n // disables the global shortcut without stealing application focus.\n offsets: \"var(--dds-space-16)\", removeDelay: 0, hotkey: [\"DDS_NO_HOTKEY\"],\n max: Number.MAX_SAFE_INTEGER, pauseOnPageIdle: true,\n });\n let sequence = 0;\n const api: ToastApi = {\n show(input) {\n const id = `dds-toast-${prefix}-${++sequence}`;\n const duration = input.duration ?? props.defaultDuration ?? 5000;\n toaster.create({\n id, description: input.message, type: input.tone === \"danger\" ? \"error\" : input.tone ?? \"info\",\n duration: duration > 0 ? duration : Infinity,\n meta: { dds: { ...input, id } satisfies ToastRecord },\n });\n return id;\n },\n dismiss: (id) => toaster.remove(id),\n clear: () => toaster.remove(),\n };\n onCleanup(api.clear);\n return <ToastContext.Provider value={api}>\n {props.children}\n <Toaster toaster={toaster} ref={region} getRootNode={getRootNode} id={`dds-toast-region-${prefix}`}\n class={classes(\"dds-toast-region\", props.class)}\n role={props.regionLabel ? \"region\" : \"presentation\"} aria-label={props.regionLabel ?? \"\"}\n >{(toast) => {\n const record = () => toast().meta?.dds as ToastRecord;\n return <ArkToast.Root\n class={classes(\"dds-toast\", `dds-toast--${record().tone ?? \"info\"}`)}\n role={record().tone === \"danger\" ? \"alert\" : \"status\"}\n >\n <ArkToast.Description>{toast().description}</ArkToast.Description>\n {props.dismissLabel && <ArkToast.CloseTrigger\n class=\"dds-iconbtn dds-iconbtn--sm\"\n aria-label={typeof props.dismissLabel === \"function\" ? props.dismissLabel(record()) : props.dismissLabel}\n >×</ArkToast.CloseTrigger>}\n </ArkToast.Root>;\n }}</Toaster>\n </ToastContext.Provider>;\n}\n\nexport function useToast(): ToastApi {\n const context = useContext(ToastContext);\n if (!context) throw new Error(\"useToast must be called inside <ToastProvider>\");\n return context;\n}\n","import { Tooltip as ArkTooltip, useTooltip } from \"@ark-ui/solid/tooltip\";\nimport { createUniqueId, splitProps, type JSX } from \"solid-js\";\nimport { classes } from \"./utils\";\nimport { createControllableSignal } from \"./controllable\";\n\n/** Spread all trigger props onto the focusable trigger element. */\nexport interface TooltipTriggerProps extends Omit<JSX.ButtonHTMLAttributes<HTMLButtonElement>, \"aria-describedby\" | \"onFocus\" | \"onBlur\" | \"onPointerEnter\" | \"onPointerLeave\"> {\n \"aria-describedby\": string;\n onFocus: () => void;\n onBlur: () => void;\n onPointerEnter: () => void;\n onPointerLeave: () => void;\n}\n\nexport interface TooltipProps {\n content: JSX.Element;\n children: (props: TooltipTriggerProps) => JSX.Element;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n id?: string;\n class?: string;\n}\n\nexport function Tooltip(props: TooltipProps) {\n const generated = createUniqueId();\n const id = () => props.id ?? `dds-tooltip-${generated}`;\n const [open, setOpen] = createControllableSignal({\n value: () => props.open, defaultValue: props.defaultOpen ?? false,\n onChange: (next) => props.onOpenChange?.(next),\n });\n const api = useTooltip(() => ({\n id: id(), ids: { content: id() }, open: open(),\n onOpenChange: (details) => setOpen(details.open), openDelay: 0, closeDelay: 0,\n }));\n return <ArkTooltip.RootProvider value={api} lazyMount={false} unmountOnExit={false}>\n <span class={classes(\"dds-tooltip\", props.class)}>\n <ArkTooltip.Trigger asChild={(merge) => {\n const [, attributes] = splitProps(merge(), [\"onFocusIn\", \"onFocusOut\"]);\n return props.children({\n ...attributes, \"aria-describedby\": id(),\n // Preserve DDS's established composable, zero-argument callbacks.\n onFocus: () => api().setOpen(true), onBlur: () => api().setOpen(false),\n onPointerEnter: () => api().setOpen(true), onPointerLeave: () => api().setOpen(false),\n }); }} />\n <ArkTooltip.Positioner>\n <ArkTooltip.Content class=\"dds-tooltip__bubble\">{props.content}</ArkTooltip.Content>\n </ArkTooltip.Positioner>\n </span>\n </ArkTooltip.RootProvider>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"server.js","names":["For","Show","createSignal","createUniqueId","onCleanup","onMount","JSX","ConsoleNavItem","id","href","label","badge","active","ConsoleNavGroup","items","ConsoleShellLabels","skip","menuOpen","menuClose","nav","ConsoleHeader","eyebrow","title","actions","Element","ConsoleShellProps","surface","activePath","brand","name","mark","context","value","labels","header","foot","children","isActive","explicit","undefined","segments","split","filter","Boolean","length","startsWith","fillBadgeLabel","template","count","replace","String","ConsoleShell","props","open","setOpen","close","hydrated","setHydrated","onKey","event","KeyboardEvent","key","document","addEventListener","removeEventListener","_$ssr","_tmpl$5","_$ssrHydrationKey","_$ssrAttribute","_$escape","_$createComponent","when","_$memo","_tmpl$","each","row","_tmpl$6","group","groupId","_tmpl$7","item","_tmpl$9","_tmpl$8","_tmpl$2","_tmpl$3","_tmpl$4","Dialog","ArkDialog","useDialog","usePresenceContext","FocusTrap","ariaHidden","createEffect","createMemo","createSignal","createUniqueId","onCleanup","Show","JSX","Dynamic","isServer","Portal","classes","focusable","join","DialogProps","open","defaultOpen","onOpenChange","title","Element","description","children","actions","closeOnEscape","closeOnOutside","class","id","role","contentAs","portal","portalMount","HTMLElement","unstyled","overlayClass","titleClass","descriptionClass","actionsClass","contentProps","Omit","HTMLAttributes","initialFocus","finalFocus","restoreFocus","onEscapeKeyDown","event","KeyboardEvent","additionalFocusContainers","frame","parts","DialogFrameParts","props","generated","panel","setPanel","api","details","closeOnInteractOutside","initialFocusEl","finalFocusEl","modal","trapFocus","preventScroll","persistentElements","filter","element","Boolean","map","ids","content","opener","ownerDocument","activeElement","trap","removeIsolation","ready","setReady","containers","isConnected","defaultView","requestAnimationFrame","document","escapeDeactivates","allowOutsideClick","delayInitialFocus","fallbackFocus","getShadowRoot","undefined","setReturnFocus","activate","targets","updateContainerElements","defer","cancelAnimationFrame","deactivate","returnFocus","cls","base","extra","Content","presence","nativeContent","merge","_$createComponent","_$mergeProps","component","Positioner","asChild","aria-describedby","_$memo","Title","Description","_$ssr","_tmpl$","_$ssrHydrationKey","_$ssrAttribute","_$escape","RootProvider","value","lazyMount","unmountOnExit","when","fallback","mount","RadioGroup","ArkRadioGroup","For","JSX","classes","RadioOption","value","label","Element","disabled","RadioGroupProps","options","defaultValue","onValueChange","name","form","required","class","props","initialValue","_$createComponent","Root","details","children","Label","each","option","Item","ItemHiddenInput","style","ItemText","directionPolicy","icons","DdsIconName","splitProps","JSX","classes","IconProps","Omit","SvgSVGAttributes","SVGSVGElement","name","label","size","directional","Icon","props","local","rest","icon","mirrorInRtl","includes","_$ssrElement","_$mergeProps","class","cssClass","viewBox","width","height","fill","stroke","stroke-width","strokeWidth","role","undefined","aria-label","aria-hidden","_$ssr","_tmpl$2","_$ssrHydrationKey","_$escape","_tmpl$","body","Show","JSX","StatusTone","createStatusPill","config","tones","Record","D","label","domain","value","locale","openDomains","NoInfer","open","Set","StatusPill","props","Element","tone","known","Boolean","resolved","found","Error","text","_$createComponent","when","has","fallback","_$ssr","_tmpl$","_$ssrHydrationKey","_$escape","children","_tmpl$2","_$ssrAttribute","Tabs","ArkTabs","useTabsContext","LocaleProvider","createUniqueId","mergeProps","splitProps","JSX","ParentProps","classes","useDirection","Direction","TabsProps","value","defaultValue","onValueChange","orientation","children","Element","id","dir","activationMode","tabId","panelId","unstyled","asChild","props","HTMLAttributes","HTMLDivElement","generated","root","direction","child","merge","ref","element","undefined","_$createComponent","locale","Root","_$mergeProps","details","lazyMount","unmountOnExit","class","ids","trigger","content","TabList","local","rest","List","TabProps","Omit","ButtonHTMLAttributes","HTMLButtonElement","Tab","Trigger","TabPanelProps","TabPanel","tabs","inactive","style","replace","display","Content","hidden","inert","Toast","ArkToast","Toaster","createToaster","space","createContext","createUniqueId","onCleanup","useContext","JSX","classes","ToastTone","ToastInput","message","Element","tone","duration","ToastRecord","id","ToastApi","show","toast","dismiss","clear","ToastContext","ToastProviderProps","children","defaultDuration","dismissLabel","regionLabel","class","ToastProvider","props","prefix","region","HTMLDivElement","scopedDocument","Document","getRootNode","Proxy","ownerDocument","document","get","target","property","getElementById","value","Reflect","bind","toaster","placement","overlap","gap","offsets","removeDelay","hotkey","max","Number","MAX_SAFE_INTEGER","pauseOnPageIdle","sequence","api","input","create","description","type","Infinity","meta","dds","remove","_$createComponent","Provider","role","aria-label","record","Root","Description","CloseTrigger","_$memo","useToast","context","Error","Tooltip","ArkTooltip","useTooltip","createUniqueId","splitProps","JSX","classes","createControllableSignal","TooltipTriggerProps","Omit","ButtonHTMLAttributes","HTMLButtonElement","onFocus","onBlur","onPointerEnter","onPointerLeave","TooltipProps","content","Element","children","props","open","defaultOpen","onOpenChange","id","class","generated","setOpen","value","defaultValue","onChange","next","api","ids","details","openDelay","closeDelay","_$createComponent","RootProvider","lazyMount","unmountOnExit","_$ssr","_tmpl$","_$ssrHydrationKey","_$ssrAttribute","_$escape","Trigger","asChild","merge","attributes","Positioner","Content"],"sources":["../src/console-shell.tsx","../src/dialog.tsx","../src/radio-group.tsx","../src/icon.tsx","../src/pending-action.ts","../src/status-pill.tsx","../src/tabs.tsx","../src/toast.tsx","../src/tooltip.tsx"],"sourcesContent":["import { For, Show, createSignal, createUniqueId, onCleanup, onMount, type JSX } from \"solid-js\";\n\n/** One item in a nav group's list. `active` is a caller override — pass it\n * only when the generic prefix rule below gets a route wrong. \"Index route\"\n * in that rule means an `href` exactly one path segment deep (e.g.\n * `/dashboard`); a console mounted under a path prefix (so its own root is\n * two or more segments deep) should pass `active` explicitly on that item\n * rather than rely on the generic rule. */\nexport interface ConsoleNavItem {\n id: string;\n href: string;\n label: string;\n badge?: number;\n active?: boolean;\n}\n\nexport interface ConsoleNavGroup {\n label: string;\n items: readonly ConsoleNavItem[];\n}\n\nexport interface ConsoleShellLabels {\n skip: string;\n menuOpen: string;\n menuClose: string;\n /** Accessible name for the rail's `<nav>` landmark (e.g. \"Dashboard\n * navigation\"). Required, not optional: a console page also has the\n * DataTable's pagination `<nav>` (named via its own `labels.nextPage`),\n * and an unnamed landmark next to a named one is a regression a\n * screen-reader user would notice immediately — the rail is the primary\n * nav, so it must never be the anonymous one. */\n nav: string;\n /** Badge accessible name template. `{count}` is substituted with the\n * item's pending count — DDS supplies no words of its own. */\n badge: string;\n}\n\nexport interface ConsoleHeader {\n eyebrow?: string;\n title: string;\n actions?: JSX.Element;\n}\n\nexport interface ConsoleShellProps {\n surface: string;\n activePath: string;\n brand: { href: string; name: string; mark: string };\n /** Lines pinned under the brand — a product's organization, environment,\n * or role context. */\n context?: readonly { label: string; value: string }[];\n nav: readonly ConsoleNavGroup[];\n labels: ConsoleShellLabels;\n header: ConsoleHeader;\n /** Slot for the rail's bottom — DDS must not depend on site-kit, so a\n * theme toggle, locale picker, or sign-out form all arrive as children\n * the product renders itself. */\n foot?: JSX.Element;\n children: JSX.Element;\n}\n\n/* An index route matches exactly; everything else matches by prefix. A caller\n that knows better passes `active` on the item. */\nfunction isActive(activePath: string, href: string, explicit?: boolean): boolean {\n if (explicit !== undefined) return explicit;\n const segments = href.split(\"/\").filter(Boolean);\n if (segments.length <= 1) return activePath === href;\n return activePath === href || activePath.startsWith(`${href}/`);\n}\n\n/** Fills the `{count}` placeholder in a consumer-supplied badge label\n * template. A function replacer, not `template.replace(\"{count}\", value)`\n * — a string replacement value is subject to special\n * `$&`/`$$`/`` $` ``/`$'` patterns. `count` is always a plain digit string\n * today, so this is defensive rather than a live bug, but it is the same\n * class of mistake as dds-table's analogous `sortBy` label fix — no\n * shared helper between the two packages (see that fix's note). */\nfunction fillBadgeLabel(template: string, count: number): string {\n return template.replace(\"{count}\", () => String(count));\n}\n\nexport function ConsoleShell(props: ConsoleShellProps): JSX.Element {\n const [open, setOpen] = createSignal(false);\n const close = () => setOpen(false);\n // Delegated listeners (the rail toggle's onClick among them) attach once\n // Solid finishes hydrating; this flips only then, so a harness can wait\n // for the same readiness signal a real click depends on instead of\n // guessing with a retry. onMount never runs during SSR, so this listener\n // is never attached — and this attribute never rendered — on the server.\n const [hydrated, setHydrated] = createSignal(false);\n onMount(() => {\n setHydrated(true);\n const onKey = (event: KeyboardEvent) => { if (event.key === \"Escape\") close(); };\n document.addEventListener(\"keydown\", onKey);\n onCleanup(() => document.removeEventListener(\"keydown\", onKey));\n });\n\n return (\n <div class=\"dds-console-shell\" data-surface={props.surface} data-hydrated={hydrated() ? \"true\" : undefined}>\n <a class=\"dds-console-skip dds-visually-hidden\" href=\"#dds-console-main\">{props.labels.skip}</a>\n <button\n class=\"dds-console-rail__toggle\"\n type=\"button\"\n data-action=\"toggle-rail\"\n aria-controls=\"dds-console-rail\"\n aria-expanded={open()}\n onClick={() => setOpen(!open())}\n >\n <span aria-hidden=\"true\" />\n <span class=\"dds-visually-hidden\">{open() ? props.labels.menuClose : props.labels.menuOpen}</span>\n </button>\n <div class=\"dds-console-rail__scrim\" data-open={open() ? \"true\" : \"false\"} onClick={close} />\n <aside id=\"dds-console-rail\" class=\"dds-console-rail\" data-open={open() ? \"true\" : \"false\"}>\n {/* No aria-label here: the decorative img (alt=\"\") contributes\n nothing to the accessible name, so it resolves to the visible\n \"{brand.name}\" text alone — the original concatenated a\n hardcoded English word (\"home\") onto this, which is exactly the\n kind of copy this package must not author itself. */}\n <a class=\"dds-console-rail__brand\" href={props.brand.href}>\n <img src={props.brand.mark} alt=\"\" width=\"20\" height=\"20\" />\n <strong>{props.brand.name}</strong>\n </a>\n <Show when={props.context && props.context.length > 0}>\n <dl class=\"dds-console-rail__context\">\n <For each={props.context}>{(row) => <div><dt>{row.label}</dt><dd>{row.value}</dd></div>}</For>\n </dl>\n </Show>\n <nav class=\"dds-console-rail__nav\" aria-label={props.labels.nav}>\n <For each={props.nav}>{(group) => {\n const groupId = `dds-console-group-${createUniqueId()}`;\n return (\n <section class=\"dds-console-rail__group\" aria-labelledby={groupId}>\n <h2 id={groupId} class=\"dds-console-rail__group-label\">{group.label}</h2>\n <ul>\n <For each={group.items}>{(item) => (\n <li>\n <a\n class=\"dds-console-rail__item\"\n data-nav={`${props.surface}.${item.id}`}\n href={item.href}\n aria-current={isActive(props.activePath, item.href, item.active) ? \"page\" : undefined}\n onClick={close}\n >\n <span>{item.label}</span>\n <Show when={item.badge !== undefined && item.badge > 0}>\n <span class=\"dds-console-rail__badge\" aria-label={fillBadgeLabel(props.labels.badge, item.badge!)}>{item.badge}</span>\n </Show>\n </a>\n </li>\n )}</For>\n </ul>\n </section>\n );\n }}</For>\n </nav>\n <Show when={props.foot}>\n <div class=\"dds-console-rail__foot\">{props.foot}</div>\n </Show>\n </aside>\n <main id=\"dds-console-main\" class=\"dds-console-main\" tabIndex={-1}>\n <header class=\"dds-console-page-header\">\n <div class=\"dds-console-page-header__text\">\n <Show when={props.header.eyebrow}>\n <p class=\"dds-console-page-eyebrow\">{props.header.eyebrow}</p>\n </Show>\n <h1>{props.header.title}</h1>\n </div>\n <Show when={props.header.actions}>\n <div class=\"dds-console-page-header__actions\">{props.header.actions}</div>\n </Show>\n </header>\n {props.children}\n </main>\n </div>\n );\n}\n","import { Dialog as ArkDialog, useDialog } from \"@ark-ui/solid/dialog\";\nimport { usePresenceContext } from \"@ark-ui/solid/presence\";\nimport { FocusTrap } from \"@zag-js/focus-trap\";\nimport { ariaHidden } from \"@zag-js/aria-hidden\";\nimport { createEffect, createMemo, createSignal, createUniqueId, onCleanup, Show, type JSX } from \"solid-js\";\nimport { Dynamic, isServer, Portal } from \"solid-js/web\";\nimport { classes } from \"./utils\";\n\nexport const focusable = [\n \"a[href]\", \"button:not([disabled])\", \"input:not([disabled])\",\n \"select:not([disabled])\", \"textarea:not([disabled])\", \"[tabindex]:not([tabindex='-1'])\",\n].join(\",\");\n\nexport interface DialogProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n title: JSX.Element;\n description?: JSX.Element;\n children: JSX.Element;\n actions?: JSX.Element;\n closeOnEscape?: boolean;\n closeOnOutside?: boolean;\n class?: string;\n id?: string;\n role?: \"dialog\" | \"alertdialog\";\n contentAs?: \"div\" | \"section\";\n portal?: boolean;\n portalMount?: HTMLElement;\n unstyled?: boolean;\n overlayClass?: string;\n titleClass?: string;\n descriptionClass?: string;\n actionsClass?: string;\n contentProps?: Omit<JSX.HTMLAttributes<HTMLElement>, \"children\" | \"class\" | \"id\" | \"role\" | \"ref\">;\n initialFocus?: () => HTMLElement | null | undefined;\n finalFocus?: () => HTMLElement | null | undefined;\n restoreFocus?: boolean;\n onEscapeKeyDown?: (event: KeyboardEvent) => void;\n /** Authorized external regions join both the Tab cycle and modal accessibility scope. */\n additionalFocusContainers?: () => readonly (HTMLElement | null | undefined)[];\n /** Customize the inner layout using DDS-owned, already labelled title/description nodes. */\n frame?: (parts: DialogFrameParts) => JSX.Element;\n}\n\nexport interface DialogFrameParts {\n title: JSX.Element;\n description: JSX.Element;\n children: JSX.Element;\n actions: JSX.Element;\n}\n\nexport function Dialog(props: DialogProps) {\n const generated = createUniqueId();\n const id = () => props.id ?? `dds-dialog-${generated}`;\n const [panel, setPanel] = createSignal<HTMLElement>();\n const api = useDialog(() => ({\n id: id(), open: props.open, defaultOpen: props.defaultOpen,\n onOpenChange: (details) => props.onOpenChange?.(details.open),\n closeOnEscape: props.closeOnEscape ?? true,\n closeOnInteractOutside: props.closeOnOutside ?? true,\n onEscapeKeyDown: props.onEscapeKeyDown,\n initialFocusEl: () => props.initialFocus?.() ?? null,\n finalFocusEl: () => props.finalFocus?.() ?? null,\n restoreFocus: props.restoreFocus ?? true,\n // Ark handles ordinary dialogs. A multi-container modal needs a shared\n // Zag trap and isolation target list instead of Ark's single content node.\n modal: !props.additionalFocusContainers,\n trapFocus: !props.additionalFocusContainers,\n preventScroll: true,\n role: props.role ?? \"dialog\",\n persistentElements: isServer ? [] : props.additionalFocusContainers?.().filter((element): element is HTMLElement => Boolean(element)).map(element => () => element),\n ids: { content: id(), title: `${id()}-title`, description: `${id()}-description` },\n }));\n const open = createMemo(() => api().open);\n createEffect(() => {\n const content = panel();\n if (!open() || !props.additionalFocusContainers || !content) return;\n const opener = content.ownerDocument.activeElement;\n let trap: FocusTrap | undefined;\n let removeIsolation: (() => void) | undefined;\n const [ready, setReady] = createSignal(false);\n const containers = () => [content, ...props.additionalFocusContainers!().filter((element): element is HTMLElement => Boolean(element?.isConnected && element.ownerDocument === content.ownerDocument))];\n const frame = content.ownerDocument.defaultView!.requestAnimationFrame(() => {\n trap = new FocusTrap(containers(), {\n document: content.ownerDocument,\n escapeDeactivates: false, allowOutsideClick: true, preventScroll: true,\n delayInitialFocus: false, fallbackFocus: content, getShadowRoot: true,\n initialFocus: () => props.initialFocus?.() ?? undefined,\n setReturnFocus: () => props.finalFocus?.() ?? (opener instanceof HTMLElement && opener.isConnected ? opener : false),\n });\n setReady(true);\n trap.activate();\n });\n createEffect(() => {\n if (!ready()) return;\n const targets = containers();\n trap!.updateContainerElements(targets);\n removeIsolation?.();\n removeIsolation = ariaHidden(targets, { defer: false });\n });\n onCleanup(() => {\n content.ownerDocument.defaultView!.cancelAnimationFrame(frame);\n removeIsolation?.();\n trap?.deactivate({ returnFocus: props.restoreFocus !== false });\n });\n });\n const cls = (base: string, extra?: string) => classes(props.unstyled ? undefined : base, extra);\n const Content = () => {\n const presence = usePresenceContext();\n const nativeContent = (merge: unknown) => <Dynamic component={props.contentAs ?? \"div\"}\n {...(merge as (props: JSX.HTMLAttributes<HTMLElement>) => JSX.HTMLAttributes<HTMLElement>)({})}\n ref={(element: HTMLElement) => {\n // Ark's asChild merger omits refs. Register both its presence node and\n // DDS's shared focus container on the actual native content element.\n presence().ref(element);\n setPanel(element);\n }}\n />;\n return <ArkDialog.Positioner class={cls(\"dds-dialog-overlay\", props.overlayClass)}>\n <ArkDialog.Content {...props.contentProps} ref={setPanel} class={cls(\"dds-dialog\", props.class)}\n {...(props.contentAs ? { asChild: nativeContent } : {})}\n role={props.role ?? \"dialog\"} aria-modal=\"true\" aria-describedby={props.description ? `${id()}-description` : undefined}>\n {(() => {\n const parts: DialogFrameParts = {\n get title() { return <ArkDialog.Title class={cls(\"dds-dialog__title\", props.titleClass)}>{props.title}</ArkDialog.Title>; },\n get description() { return props.description && <ArkDialog.Description class={cls(\"dds-dialog__body\", props.descriptionClass)}>{props.description}</ArkDialog.Description>; },\n get children() { return props.children; },\n get actions() { return props.actions && <div class={cls(\"dds-dialog__actions\", props.actionsClass)}>{props.actions}</div>; },\n };\n return props.frame ? props.frame(parts) : <>{parts.title}{parts.description}{parts.children}{parts.actions}</>;\n })()}\n </ArkDialog.Content>\n </ArkDialog.Positioner>;\n };\n return <ArkDialog.RootProvider value={api} lazyMount unmountOnExit>\n <Show when={props.portal} fallback={<Content />}><Portal {...(props.portalMount ? { mount: props.portalMount } : {})}><Content /></Portal></Show>\n </ArkDialog.RootProvider>;\n}\n","import { RadioGroup as ArkRadioGroup } from \"@ark-ui/solid/radio-group\";\nimport { For, type JSX } from \"solid-js\";\nimport { classes } from \"./utils\";\n\nexport interface RadioOption {\n value: string;\n label: JSX.Element;\n disabled?: boolean;\n}\nexport interface RadioGroupProps {\n options: readonly RadioOption[];\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n name?: string;\n form?: string;\n disabled?: boolean;\n required?: boolean;\n label: JSX.Element;\n class?: string;\n}\n\n/** Grouped radios delegate selection and roving keyboard focus to Ark. */\nexport function RadioGroup(props: RadioGroupProps) {\n const initialValue = props.value ?? props.defaultValue;\n return <ArkRadioGroup.Root\n value={props.value} defaultValue={props.defaultValue}\n name={props.name} form={props.form} disabled={props.disabled} required={props.required}\n onValueChange={(details) => { if (details.value !== null) props.onValueChange?.(details.value); }}\n class={classes(\"dds-radio-group\", props.class)}\n >\n <ArkRadioGroup.Label class=\"dds-field__label\">{props.label}</ArkRadioGroup.Label>\n <For each={props.options}>{(option) => <ArkRadioGroup.Item value={option.value} disabled={option.disabled} class=\"dds-check\">\n <ArkRadioGroup.ItemHiddenInput class=\"dds-check__input\" style={{}}\n ref={(input) => { input.defaultChecked = initialValue === option.value; }} />\n <ArkRadioGroup.ItemText>{option.label}</ArkRadioGroup.ItemText>\n </ArkRadioGroup.Item>}</For>\n </ArkRadioGroup.Root>;\n}\n","import { directionPolicy, icons, type DdsIconName } from \"@devslab/dds-icons\";\nimport { splitProps, type JSX } from \"solid-js\";\n\nimport { classes } from \"./utils\";\n\nexport interface IconProps extends Omit<JSX.SvgSVGAttributes<SVGSVGElement>, \"name\" | \"children\"> {\n name: DdsIconName;\n label?: string;\n size?: number | string;\n directional?: boolean;\n}\n\nexport function Icon(props: IconProps) {\n const [local, rest] = splitProps(props, [\"name\", \"label\", \"size\", \"directional\", \"class\"]);\n const icon = () => icons[local.name];\n const directional = () => local.directional ?? directionPolicy.mirrorInRtl.includes(local.name);\n return (\n <svg\n {...rest}\n class={classes(directional() && directionPolicy.cssClass, local.class)}\n viewBox={icon().viewBox}\n width={local.size ?? 24}\n height={local.size ?? 24}\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width={icon().strokeWidth}\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n role={local.label ? \"img\" : undefined}\n aria-label={local.label}\n aria-hidden={local.label ? undefined : \"true\"}\n >\n {local.label && <title>{local.label}</title>}\n <g innerHTML={icon().body} />\n </svg>\n );\n}\n","import { createSignal, getOwner, onCleanup, type Accessor } from \"solid-js\";\n\n/** Options for one `run` call. */\nexport interface PendingActionRunOptions {\n /**\n * Start even while another action runs: that one is aborted and this one takes its place, so the\n * latest request wins (a list reload after typing, paging or sorting). Without it a second start\n * while one runs is ignored, which is what a button wants.\n */\n replace?: boolean;\n}\n\n/**\n * Which of a screen's actions is running. A screen with several buttons gives each one its own\n * key, so only the button that started the work shows progress, while every other control can\n * still be locked through `busy`. One shared flag for all the buttons spins every one of them.\n */\nexport interface PendingAction<K extends string = string> {\n /** The key of the action now running, or null. */\n readonly current: Accessor<K | null>;\n /** True while any action runs: lock the other controls with it. */\n readonly busy: Accessor<boolean>;\n /** True while `key` is the running action: give that control its progress state. */\n is(key: K): boolean;\n /**\n * Runs `task` as `key` and clears the state when it settles, whether it resolves or throws (the\n * error reaches the caller). While another action runs it does nothing and resolves to undefined,\n * unless `replace` is set. The task receives a signal that aborts when this run stops counting:\n * `reset()`, a run that replaced it, or the owner going away. Check `signal.aborted` after each\n * await before touching the screen, or pass the signal to `fetch`.\n */\n run<T>(key: K, task: (signal: AbortSignal) => T | Promise<T>, options?: PendingActionRunOptions): Promise<T | undefined>;\n /** Stops tracking the running action and aborts its signal, for example when the screen's data was replaced. */\n reset(): void;\n}\n\n/** Tracks the running action of a screen; created in a component, it stops with that component. */\nexport function createPendingAction<K extends string = string>(): PendingAction<K> {\n const [current, setCurrent] = createSignal<K | null>(null);\n let active: AbortController | null = null;\n let disposed = false;\n const stop = () => {\n active?.abort();\n active = null;\n };\n if (getOwner()) onCleanup(() => { disposed = true; stop(); });\n return {\n current,\n busy: () => current() !== null,\n is: (key) => current() === key,\n async run(key, task, options) {\n if (disposed || (active && !options?.replace)) return undefined;\n stop();\n const controller = new AbortController();\n active = controller;\n setCurrent(() => key);\n try {\n return await task(controller.signal);\n } finally {\n if (active === controller) {\n active = null;\n setCurrent(null);\n }\n }\n },\n reset() {\n stop();\n setCurrent(null);\n },\n };\n}\n","import { Show, type JSX } from \"solid-js\";\n\nexport type StatusTone = \"success\" | \"warning\" | \"danger\" | \"info\" | \"brand\" | \"neutral\";\n\n/* The rule, not the vocabulary. A value a CLOSED domain does not know throws:\n that can only mean a schema gained a case the catalog forgot. A value an OPEN\n domain does not know renders as raw text: that is customer data, and it must\n not crash the screen.\n\n `tones` declares which domains exist; `openDomains` only selects among the\n domains `tones` already declared, so it must not itself widen or narrow that\n set. */\nexport function createStatusPill<D extends string>(config: {\n tones: Record<D, Record<string, StatusTone>>;\n label: (domain: D, value: string, locale: string) => string | undefined;\n openDomains?: readonly NoInfer<D>[];\n}) {\n const open = new Set<string>(config.openDomains ?? []);\n return function StatusPill(props: { domain: D; value: string; locale: string }): JSX.Element {\n const tone = () => config.tones[props.domain]?.[props.value];\n const label = () => config.label(props.domain, props.value, props.locale);\n const known = () => Boolean(tone() && label());\n const resolved = () => {\n const found = tone();\n if (!found) throw new Error(`StatusPill: no tone for ${props.domain}.${props.value}`);\n const text = label();\n if (!text) throw new Error(`StatusPill: no label for ${props.domain}.${props.value}`);\n return { tone: found, text };\n };\n return (\n <Show when={known() || !open.has(props.domain)} fallback={<code data-status={`${props.domain}.${props.value}`}>{props.value}</code>}>\n {(() => {\n const value = resolved();\n return (\n <span\n class={value.tone === \"neutral\" ? \"dds-badge\" : `dds-badge dds-badge--${value.tone}`}\n data-status={`${props.domain}.${props.value}`}\n data-tone={value.tone}\n >\n {value.text}\n </span>\n );\n })()}\n </Show>\n );\n };\n}\n","import { Tabs as ArkTabs, useTabsContext } from \"@ark-ui/solid/tabs\";\nimport { LocaleProvider } from \"@ark-ui/solid/locale\";\nimport { createUniqueId, mergeProps, splitProps, type JSX, type ParentProps } from \"solid-js\";\nimport { classes } from \"./utils\";\nimport { useDirection, type Direction } from \"./direction\";\n\nexport interface TabsProps {\n value?: string;\n defaultValue: string;\n onValueChange?: (value: string) => void;\n orientation?: \"horizontal\" | \"vertical\";\n children: JSX.Element;\n id?: string;\n dir?: Direction;\n activationMode?: \"automatic\" | \"manual\";\n tabId?: (value: string) => string;\n panelId?: (value: string) => string;\n unstyled?: boolean;\n asChild?: (props: JSX.HTMLAttributes<HTMLDivElement>) => JSX.Element;\n}\n\nexport function Tabs(props: TabsProps) {\n const generated = createUniqueId();\n const id = () => props.id ?? `dds-tabs-${generated}`;\n let root: HTMLDivElement | undefined;\n const direction = useDirection(() => root, () => props.dir);\n const child = props.asChild ? (merge: unknown) => props.asChild!(mergeProps(\n (merge as (props: JSX.HTMLAttributes<HTMLDivElement>) => JSX.HTMLAttributes<HTMLDivElement>)({}),\n { ref: (element: HTMLDivElement) => { root = element; } },\n )) : undefined;\n return <LocaleProvider locale={direction() === \"rtl\" ? \"ar\" : \"en\"}><ArkTabs.Root ref={root}\n id={id()} value={props.value} defaultValue={props.defaultValue}\n orientation={props.orientation ?? \"horizontal\"} activationMode={props.activationMode ?? \"automatic\"}\n onValueChange={(details) => props.onValueChange?.(details.value)}\n lazyMount={false} unmountOnExit={false} class={props.unstyled ? undefined : \"dds-tabs-root\"}\n {...(child ? { asChild: child } : {})}\n ids={{ trigger: (value) => props.tabId?.(value) ?? `${id()}-tab-${value}`, content: (value) => props.panelId?.(value) ?? `${id()}-panel-${value}` }}\n >{props.children}</ArkTabs.Root></LocaleProvider>;\n}\n\nexport function TabList(props: ParentProps<JSX.HTMLAttributes<HTMLDivElement> & { unstyled?: boolean }>) {\n const [local, rest] = splitProps(props, [\"class\", \"children\", \"unstyled\"]);\n return <ArkTabs.List {...rest} class={classes(!local.unstyled && \"dds-tabs\", local.class)}>{local.children}</ArkTabs.List>;\n}\n\nexport interface TabProps extends Omit<JSX.ButtonHTMLAttributes<HTMLButtonElement>, \"value\" | \"class\"> {\n value: string;\n class?: string;\n unstyled?: boolean;\n asChild?: (props: JSX.ButtonHTMLAttributes<HTMLButtonElement>) => JSX.Element;\n}\n\nexport function Tab(props: ParentProps<TabProps>) {\n const [local, rest] = splitProps(props, [\"class\", \"children\", \"value\", \"unstyled\", \"asChild\"]);\n // Ark's factory supplies a merger; DDS exposes native button attributes.\n const child = local.asChild ? (merge: unknown) => local.asChild!(mergeProps(\n (merge as (props: JSX.ButtonHTMLAttributes<HTMLButtonElement>) => JSX.ButtonHTMLAttributes<HTMLButtonElement>)({}),\n { ref: props.ref },\n )) : undefined;\n return <ArkTabs.Trigger {...rest} value={local.value} class={classes(!local.unstyled && \"dds-tab\", local.class)} {...(child ? { asChild: child } : {})}>{local.children}</ArkTabs.Trigger>;\n}\n\nexport interface TabPanelProps extends JSX.HTMLAttributes<HTMLDivElement> { value: string }\n\nexport function TabPanel(props: ParentProps<TabPanelProps>) {\n const [local, rest] = splitProps(props, [\"value\", \"children\", \"style\"]);\n const tabs = useTabsContext();\n const inactive = () => tabs().value !== local.value;\n const style = () => !inactive() ? local.style : typeof local.style === \"string\"\n ? `${local.style.replace(/;+\\s*$/, \"\")};display:none;`\n : { ...local.style, display: \"none\" };\n return <ArkTabs.Content {...rest} value={local.value} style={style()} hidden={inactive()} inert={inactive()}>{local.children}</ArkTabs.Content>;\n}\n","import { Toast as ArkToast, Toaster, createToaster } from \"@ark-ui/solid/toast\";\nimport { space } from \"@devslab/dds-tokens\";\nimport { createContext, createUniqueId, onCleanup, useContext, type JSX } from \"solid-js\";\nimport { classes } from \"./utils\";\n\nexport type ToastTone = \"success\" | \"warning\" | \"danger\" | \"info\";\nexport interface ToastInput { message: JSX.Element; tone?: ToastTone; duration?: number }\nexport interface ToastRecord extends ToastInput { id: string }\nexport interface ToastApi {\n show: (toast: ToastInput) => string;\n dismiss: (id: string) => void;\n clear: () => void;\n}\nconst ToastContext = createContext<ToastApi>();\n\nexport interface ToastProviderProps {\n children: JSX.Element;\n defaultDuration?: number;\n dismissLabel?: string | ((toast: ToastRecord) => string);\n /** Optional localized label for the notification region. */\n regionLabel?: string;\n class?: string;\n}\n\nexport function ToastProvider(props: ToastProviderProps) {\n const prefix = createUniqueId();\n let region: HTMLDivElement | undefined;\n let scopedDocument: Document | undefined;\n // Zag derives group IDs from placement rather than provider identity. Keep\n // each provider's physical ID unique, and scope that one logical lookup.\n const getRootNode = () => scopedDocument ??= new Proxy(region?.ownerDocument ?? document, {\n get(target, property) {\n if (property === \"getElementById\") return (id: string) => id === \"toast-group:bottom-end\" ? region ?? null : target.getElementById(id);\n const value = Reflect.get(target, property, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n const toaster = createToaster({\n placement: \"bottom-end\", overlap: false, gap: space[8],\n // An empty array matches EVERY key in Zag. An impossible physical code\n // disables the global shortcut without stealing application focus.\n offsets: \"var(--dds-space-16)\", removeDelay: 0, hotkey: [\"DDS_NO_HOTKEY\"],\n max: Number.MAX_SAFE_INTEGER, pauseOnPageIdle: true,\n });\n let sequence = 0;\n const api: ToastApi = {\n show(input) {\n const id = `dds-toast-${prefix}-${++sequence}`;\n const duration = input.duration ?? props.defaultDuration ?? 5000;\n toaster.create({\n id, description: input.message, type: input.tone === \"danger\" ? \"error\" : input.tone ?? \"info\",\n duration: duration > 0 ? duration : Infinity,\n meta: { dds: { ...input, id } satisfies ToastRecord },\n });\n return id;\n },\n dismiss: (id) => toaster.remove(id),\n clear: () => toaster.remove(),\n };\n onCleanup(api.clear);\n return <ToastContext.Provider value={api}>\n {props.children}\n <Toaster toaster={toaster} ref={region} getRootNode={getRootNode} id={`dds-toast-region-${prefix}`}\n class={classes(\"dds-toast-region\", props.class)}\n role={props.regionLabel ? \"region\" : \"presentation\"} aria-label={props.regionLabel ?? \"\"}\n >{(toast) => {\n const record = () => toast().meta?.dds as ToastRecord;\n return <ArkToast.Root\n class={classes(\"dds-toast\", `dds-toast--${record().tone ?? \"info\"}`)}\n role={record().tone === \"danger\" ? \"alert\" : \"status\"}\n >\n <ArkToast.Description>{toast().description}</ArkToast.Description>\n {props.dismissLabel && <ArkToast.CloseTrigger\n class=\"dds-iconbtn dds-iconbtn--sm\"\n aria-label={typeof props.dismissLabel === \"function\" ? props.dismissLabel(record()) : props.dismissLabel}\n >×</ArkToast.CloseTrigger>}\n </ArkToast.Root>;\n }}</Toaster>\n </ToastContext.Provider>;\n}\n\nexport function useToast(): ToastApi {\n const context = useContext(ToastContext);\n if (!context) throw new Error(\"useToast must be called inside <ToastProvider>\");\n return context;\n}\n","import { Tooltip as ArkTooltip, useTooltip } from \"@ark-ui/solid/tooltip\";\nimport { createUniqueId, splitProps, type JSX } from \"solid-js\";\nimport { classes } from \"./utils\";\nimport { createControllableSignal } from \"./controllable\";\n\n/** Spread all trigger props onto the focusable trigger element. */\nexport interface TooltipTriggerProps extends Omit<JSX.ButtonHTMLAttributes<HTMLButtonElement>, \"aria-describedby\" | \"onFocus\" | \"onBlur\" | \"onPointerEnter\" | \"onPointerLeave\"> {\n \"aria-describedby\": string;\n onFocus: () => void;\n onBlur: () => void;\n onPointerEnter: () => void;\n onPointerLeave: () => void;\n}\n\nexport interface TooltipProps {\n content: JSX.Element;\n children: (props: TooltipTriggerProps) => JSX.Element;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n id?: string;\n class?: string;\n}\n\nexport function Tooltip(props: TooltipProps) {\n const generated = createUniqueId();\n const id = () => props.id ?? `dds-tooltip-${generated}`;\n const [open, setOpen] = createControllableSignal({\n value: () => props.open, defaultValue: props.defaultOpen ?? false,\n onChange: (next) => props.onOpenChange?.(next),\n });\n const api = useTooltip(() => ({\n id: id(), ids: { content: id() }, open: open(),\n onOpenChange: (details) => setOpen(details.open), openDelay: 0, closeDelay: 0,\n }));\n return <ArkTooltip.RootProvider value={api} lazyMount={false} unmountOnExit={false}>\n <span class={classes(\"dds-tooltip\", props.class)}>\n <ArkTooltip.Trigger asChild={(merge) => {\n const [, attributes] = splitProps(merge(), [\"onFocusIn\", \"onFocusOut\"]);\n return props.children({\n ...attributes, \"aria-describedby\": id(),\n // Preserve DDS's established composable, zero-argument callbacks.\n onFocus: () => api().setOpen(true), onBlur: () => api().setOpen(false),\n onPointerEnter: () => api().setOpen(true), onPointerLeave: () => api().setOpen(false),\n }); }} />\n <ArkTooltip.Positioner>\n <ArkTooltip.Content class=\"dds-tooltip__bubble\">{props.content}</ArkTooltip.Content>\n </ArkTooltip.Positioner>\n </span>\n </ArkTooltip.RootProvider>;\n}\n"],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /** Canonical "HH:MM" for an API value, or null when it is not a time. */
2
+ export declare function normalizeTime(value: string): string | null;
3
+ /**
4
+ * What a person typed, read as a complete time: "9:05", "09:05", "09:05:00",
5
+ * "0905", or "905" when the first two digits cannot be an hour. Full-width
6
+ * colons and dots count as colons. Partial text ("10", "10:4", and "103",
7
+ * which is still on its way to 10:30) is not a time.
8
+ */
9
+ export declare function parseTypedTime(text: string): string | null;
10
+ /** 00:00 up to the last step before 24:00. Steps below one minute become one; a non-number becomes 10. */
11
+ export declare function timeOptions(step: number): string[];
12
+ /**
13
+ * Whether a "HH:MM" option matches partial typing. Digits read as the start of
14
+ * the time ("10" → 10:00–10:59, "1030" → 10:30); an odd digit count or an
15
+ * impossible hour also tries a leading zero ("9" → 09:xx, "930" → 09:30).
16
+ * With a colon the hour may be one digit ("9:3" → 09:30–09:39).
17
+ */
18
+ export declare function matchesTimeQuery(option: string, query: string): boolean;
19
+ export interface TimeMessages {
20
+ /** Accessible name of the clock button that opens the list. */
21
+ open?: string;
22
+ /** Accessible name of the clear button. */
23
+ clear?: string;
24
+ /** Status when nothing in the list matches the typed text. */
25
+ empty?: string;
26
+ }
27
+ export declare function timeMessages(locale: string, messages?: TimeMessages): {
28
+ open: string;
29
+ clear: string;
30
+ empty: string;
31
+ };
32
+ //# sourceMappingURL=time-only.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-only.d.ts","sourceRoot":"","sources":["../src/time-only.ts"],"names":[],"mappings":"AAKA,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG1D;AAMD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS1D;AAED,0GAA0G;AAC1G,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,YAMvC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,WAkB7D;AAED,MAAM,WAAW,YAAY;IAC3B,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AACD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,YAAiB;;;;EAQvE"}
@@ -0,0 +1,113 @@
1
+ import { t as e } from "./choice-CTNeFOVo.js";
2
+ import { createMemo as t, createSignal as n, splitProps as r } from "solid-js";
3
+ import { createComponent as i, getNextElement as a, mergeProps as o, template as s } from "solid-js/web";
4
+ //#region src/time-only.ts
5
+ var c = /^([01]\d|2[0-3]):([0-5]\d)(?::[0-5]\d(?:\.\d+)?)?$/;
6
+ function l(e) {
7
+ let t = c.exec(e);
8
+ return t ? `${t[1]}:${t[2]}` : null;
9
+ }
10
+ var u = (e) => String(e).padStart(2, "0"), d = (e, t) => e <= 23 && t <= 59 ? `${u(e)}:${u(t)}` : null;
11
+ function f(e) {
12
+ let t = e.trim().replace(/[:.]/g, ":"), n = /^(\d{1,2}):(\d{2})(?::\d{2})?$/.exec(t);
13
+ return n ? d(Number(n[1]), Number(n[2])) : /^\d{4}$/.test(t) ? d(Number(t.slice(0, 2)), Number(t.slice(2))) : /^\d{3}$/.test(t) && Number(t.slice(0, 2)) > 23 ? d(Number(t[0]), Number(t.slice(1))) : null;
14
+ }
15
+ function p(e) {
16
+ let t = Number.isFinite(e) ? Math.max(1, Math.floor(e)) : 10, n = [];
17
+ for (let e = 0; e < 1440; e += t) n.push(`${u(Math.floor(e / 60))}:${u(e % 60)}`);
18
+ return n;
19
+ }
20
+ function m(e, t) {
21
+ let n = t.trim().replace(/[:.]/g, ":");
22
+ if (n === "") return !0;
23
+ let r = f(n);
24
+ if (r) return e === r;
25
+ if (n.includes(":")) {
26
+ let [t = "", r = "", ...i] = n.split(":");
27
+ return i.length || !/^\d{1,2}$/.test(t) || !/^\d{0,2}$/.test(r) ? !1 : e.startsWith(`${t.padStart(2, "0")}:${r}`);
28
+ }
29
+ if (!/^\d{1,4}$/.test(n)) return !1;
30
+ let i = e.replace(":", "");
31
+ return i.startsWith(n) ? !0 : (n.length % 2 == 1 || Number(n.slice(0, 2)) > 23) && i.startsWith(`0${n}`);
32
+ }
33
+ function h(e, t = {}) {
34
+ let n = /^ko(?:-|$)/i.test(e);
35
+ return {
36
+ open: n ? "시간 목록 열기" : "Open time list",
37
+ clear: n ? "시간 지우기" : "Clear time",
38
+ empty: n ? "맞는 시간이 없습니다" : "No matching time",
39
+ ...t
40
+ };
41
+ }
42
+ //#endregion
43
+ //#region src/time-picker.tsx
44
+ var g = /*#__PURE__*/ s("<svg width=20 height=20 viewBox=\"0 0 24 24\"fill=none stroke=currentColor stroke-width=1.6 stroke-linecap=round stroke-linejoin=round aria-hidden=true><path d=\"M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18z\"></path><path d=\"M12 7v5l3 2\">"), _ = 300;
45
+ function v() {
46
+ return a(g);
47
+ }
48
+ function y(a) {
49
+ let [s, c] = r(a, [
50
+ "value",
51
+ "defaultValue",
52
+ "onValueChange",
53
+ "step",
54
+ "placeholder",
55
+ "invalid",
56
+ "locale",
57
+ "messages"
58
+ ]), u = () => l(s.defaultValue ?? "") ?? "", [d, g] = n(u()), y = () => s.value ?? d(), b = () => y() === "" ? "" : l(y()), x = () => b() ?? y(), [S, C] = n(x()), w = t(() => {
59
+ let e = new Set(p(s.step ?? 10)), t = b(), n = f(S());
60
+ return t && e.add(t), n && e.add(n), [...e].sort().map((e) => ({
61
+ value: e,
62
+ label: e
63
+ }));
64
+ });
65
+ return i(e, o(c, {
66
+ searchable: !0,
67
+ rootClass: "dds-time-picker",
68
+ get items() {
69
+ return w();
70
+ },
71
+ get value() {
72
+ return x();
73
+ },
74
+ get selectedOption() {
75
+ return {
76
+ value: x(),
77
+ label: x()
78
+ };
79
+ },
80
+ onValueChange: (e) => {
81
+ s.value === void 0 && g(e), s.onValueChange?.(e);
82
+ },
83
+ onFormReset: () => {
84
+ s.value === void 0 && g(u());
85
+ },
86
+ get inputValue() {
87
+ return S();
88
+ },
89
+ onInputValueChange: C,
90
+ matchItem: (e, t) => m(e.value, t),
91
+ commitDraft: (e) => e.trim() === "" ? "" : f(e),
92
+ triggerContent: () => i(v, {}),
93
+ autoHighlight: !0,
94
+ centerSelected: !0,
95
+ inputMode: "numeric",
96
+ get virtualization() {
97
+ return w().length > _ && {};
98
+ },
99
+ get messages() {
100
+ return h(s.locale ?? "ko-KR", s.messages);
101
+ },
102
+ get placeholder() {
103
+ return s.placeholder ?? "HH:MM";
104
+ },
105
+ get invalid() {
106
+ return s.invalid === !0 || b() === null;
107
+ }
108
+ }));
109
+ }
110
+ //#endregion
111
+ export { y as t };
112
+
113
+ //# sourceMappingURL=time-picker-BlMWCQwk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-picker-BlMWCQwk.js","names":["createMemo","createSignal","splitProps","ChoiceOption","Choice","matchesTimeQuery","normalizeTime","parseTypedTime","timeMessages","timeOptions","TimeMessages","TimePickerProps","value","defaultValue","onValueChange","step","label","labelPlacement","id","name","form","placeholder","clearable","disabled","readOnly","required","invalid","locale","messages","VIRTUALIZE_AFTER","ClockIcon","_$getNextElement","_tmpl$","TimePicker","props","local","shared","initial","internal","setInternal","raw","canonical","current","draft","setDraft","items","values","Set","selected","typed","add","sort","map","_$createComponent","_$mergeProps","searchable","rootClass","selectedOption","next","undefined","onFormReset","inputValue","onInputValueChange","matchItem","item","query","commitDraft","text","trim","triggerContent","autoHighlight","centerSelected","inputMode","virtualization","length"],"sources":["../src/time-only.ts","../src/time-picker.tsx"],"sourcesContent":["// Time-of-day values are 24-hour \"HH:MM\" strings; \"\" is empty. Servers may send\n// \"HH:MM:SS\" — it is accepted and shown as HH:MM, but never rewritten until the\n// user picks a time.\nconst API_TIME = /^([01]\\d|2[0-3]):([0-5]\\d)(?::[0-5]\\d(?:\\.\\d+)?)?$/;\n\n/** Canonical \"HH:MM\" for an API value, or null when it is not a time. */\nexport function normalizeTime(value: string): string | null {\n const match = API_TIME.exec(value);\n return match ? `${match[1]}:${match[2]}` : null;\n}\n\nconst pad = (value: number) => String(value).padStart(2, \"0\");\nconst fromParts = (hour: number, minute: number) =>\n hour <= 23 && minute <= 59 ? `${pad(hour)}:${pad(minute)}` : null;\n\n/**\n * What a person typed, read as a complete time: \"9:05\", \"09:05\", \"09:05:00\",\n * \"0905\", or \"905\" when the first two digits cannot be an hour. Full-width\n * colons and dots count as colons. Partial text (\"10\", \"10:4\", and \"103\",\n * which is still on its way to 10:30) is not a time.\n */\nexport function parseTypedTime(text: string): string | null {\n const value = text.trim().replace(/[:.]/g, \":\");\n const separated = /^(\\d{1,2}):(\\d{2})(?::\\d{2})?$/.exec(value);\n if (separated) return fromParts(Number(separated[1]), Number(separated[2]));\n if (/^\\d{4}$/.test(value))\n return fromParts(Number(value.slice(0, 2)), Number(value.slice(2)));\n if (/^\\d{3}$/.test(value) && Number(value.slice(0, 2)) > 23)\n return fromParts(Number(value[0]), Number(value.slice(1)));\n return null;\n}\n\n/** 00:00 up to the last step before 24:00. Steps below one minute become one; a non-number becomes 10. */\nexport function timeOptions(step: number) {\n const minutes = Number.isFinite(step) ? Math.max(1, Math.floor(step)) : 10;\n const values: string[] = [];\n for (let at = 0; at < 24 * 60; at += minutes)\n values.push(`${pad(Math.floor(at / 60))}:${pad(at % 60)}`);\n return values;\n}\n\n/**\n * Whether a \"HH:MM\" option matches partial typing. Digits read as the start of\n * the time (\"10\" → 10:00–10:59, \"1030\" → 10:30); an odd digit count or an\n * impossible hour also tries a leading zero (\"9\" → 09:xx, \"930\" → 09:30).\n * With a colon the hour may be one digit (\"9:3\" → 09:30–09:39).\n */\nexport function matchesTimeQuery(option: string, query: string) {\n const text = query.trim().replace(/[:.]/g, \":\");\n if (text === \"\") return true;\n const typed = parseTypedTime(text);\n if (typed) return option === typed;\n if (text.includes(\":\")) {\n const [hour = \"\", minute = \"\", ...rest] = text.split(\":\");\n if (rest.length || !/^\\d{1,2}$/.test(hour) || !/^\\d{0,2}$/.test(minute))\n return false;\n return option.startsWith(`${hour.padStart(2, \"0\")}:${minute}`);\n }\n if (!/^\\d{1,4}$/.test(text)) return false;\n const digits = option.replace(\":\", \"\");\n if (digits.startsWith(text)) return true;\n return (\n (text.length % 2 === 1 || Number(text.slice(0, 2)) > 23) &&\n digits.startsWith(`0${text}`)\n );\n}\n\nexport interface TimeMessages {\n /** Accessible name of the clock button that opens the list. */\n open?: string;\n /** Accessible name of the clear button. */\n clear?: string;\n /** Status when nothing in the list matches the typed text. */\n empty?: string;\n}\nexport function timeMessages(locale: string, messages: TimeMessages = {}) {\n const ko = /^ko(?:-|$)/i.test(locale);\n return {\n open: ko ? \"시간 목록 열기\" : \"Open time list\",\n clear: ko ? \"시간 지우기\" : \"Clear time\",\n empty: ko ? \"맞는 시간이 없습니다\" : \"No matching time\",\n ...messages,\n };\n}\n","import { createMemo, createSignal, splitProps } from \"solid-js\";\nimport type { ChoiceOption } from \"./choice-types\";\nimport { Choice } from \"./internal/choice\";\nimport {\n matchesTimeQuery,\n normalizeTime,\n parseTypedTime,\n timeMessages,\n timeOptions,\n type TimeMessages,\n} from \"./time-only\";\nexport type { TimeMessages } from \"./time-only\";\n\nexport interface TimePickerProps {\n /** 24-hour \"HH:MM\" (\"\" is empty). \"HH:MM:SS\" is accepted and shown as HH:MM. */\n value?: string;\n defaultValue?: string;\n /** Receives \"HH:MM\" or \"\" — only when the person picks, types or clears a time. */\n onValueChange?: (value: string) => void;\n /** Minutes between listed times, from 00:00 (default 10). Typed times off the step are still accepted. */\n step?: number;\n label?: string;\n labelPlacement?: \"outside\" | \"inside\" | \"hidden\";\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n id?: string;\n name?: string;\n form?: string;\n placeholder?: string;\n clearable?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n invalid?: boolean;\n /** Chooses the built-in Korean or English text (default \"ko-KR\"). */\n locale?: string;\n messages?: TimeMessages;\n}\n\n/** Above this many rows the list is virtualized (1-minute steps list 1,440 times). */\nconst VIRTUALIZE_AFTER = 300;\n\n// The dds-icons \"clock\" glyph, inlined like DatePicker's calendar so this\n// subpath does not pull in the whole icon set.\nfunction ClockIcon() {\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.6\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18z\" />\n <path d=\"M12 7v5l3 2\" />\n </svg>\n );\n}\n\n/**\n * A time-of-day field: type a time or pick one from the list. Built on the\n * same Ark combobox as Combobox, so list, keyboard and form behavior match.\n */\nexport function TimePicker(props: TimePickerProps) {\n const [local, shared] = splitProps(props, [\n \"value\",\n \"defaultValue\",\n \"onValueChange\",\n \"step\",\n \"placeholder\",\n \"invalid\",\n \"locale\",\n \"messages\",\n ]);\n const initial = () => normalizeTime(local.defaultValue ?? \"\") ?? \"\";\n const [internal, setInternal] = createSignal(initial());\n const raw = () => local.value ?? internal();\n const canonical = () => (raw() === \"\" ? \"\" : normalizeTime(raw()));\n // A value that is not a time is shown as it came, marked invalid, and never rewritten.\n const current = () => canonical() ?? raw();\n const [draft, setDraft] = createSignal(current());\n const items = createMemo<ChoiceOption[]>(() => {\n const values = new Set(timeOptions(local.step ?? 10));\n const selected = canonical(),\n typed = parseTypedTime(draft());\n if (selected) values.add(selected);\n if (typed) values.add(typed);\n return [...values].sort().map((value) => ({ value, label: value }));\n });\n return (\n <Choice\n {...shared}\n searchable\n rootClass=\"dds-time-picker\"\n items={items()}\n value={current()}\n // Only read when the value is not a listed time (an invalid server value).\n selectedOption={{ value: current(), label: current() }}\n onValueChange={(next) => {\n if (local.value === undefined) setInternal(next);\n local.onValueChange?.(next);\n }}\n onFormReset={() => {\n if (local.value === undefined) setInternal(initial());\n }}\n inputValue={draft()}\n onInputValueChange={setDraft}\n matchItem={(item, query) => matchesTimeQuery(item.value, query)}\n commitDraft={(text) => (text.trim() === \"\" ? \"\" : parseTypedTime(text))}\n triggerContent={() => <ClockIcon />}\n autoHighlight\n centerSelected\n inputMode=\"numeric\"\n virtualization={items().length > VIRTUALIZE_AFTER ? {} : false}\n messages={timeMessages(local.locale ?? \"ko-KR\", local.messages)}\n placeholder={local.placeholder ?? \"HH:MM\"}\n invalid={local.invalid === true || canonical() === null}\n />\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type TimeMessages } from "./time-only";
2
+ export type { TimeMessages } from "./time-only";
3
+ export interface TimePickerProps {
4
+ /** 24-hour "HH:MM" ("" is empty). "HH:MM:SS" is accepted and shown as HH:MM. */
5
+ value?: string;
6
+ defaultValue?: string;
7
+ /** Receives "HH:MM" or "" — only when the person picks, types or clears a time. */
8
+ onValueChange?: (value: string) => void;
9
+ /** Minutes between listed times, from 00:00 (default 10). Typed times off the step are still accepted. */
10
+ step?: number;
11
+ label?: string;
12
+ labelPlacement?: "outside" | "inside" | "hidden";
13
+ "aria-label"?: string;
14
+ "aria-labelledby"?: string;
15
+ "aria-describedby"?: string;
16
+ id?: string;
17
+ name?: string;
18
+ form?: string;
19
+ placeholder?: string;
20
+ clearable?: boolean;
21
+ disabled?: boolean;
22
+ readOnly?: boolean;
23
+ required?: boolean;
24
+ invalid?: boolean;
25
+ /** Chooses the built-in Korean or English text (default "ko-KR"). */
26
+ locale?: string;
27
+ messages?: TimeMessages;
28
+ }
29
+ /**
30
+ * A time-of-day field: type a time or pick one from the list. Built on the
31
+ * same Ark combobox as Combobox, so list, keyboard and form behavior match.
32
+ */
33
+ export declare function TimePicker(props: TimePickerProps): import("solid-js").JSX.Element;
34
+ //# sourceMappingURL=time-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-picker.d.ts","sourceRoot":"","sources":["../src/time-picker.tsx"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mFAAmF;IACnF,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,0GAA0G;IAC1G,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACjD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AA0BD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,kCAwDhD"}
@@ -0,0 +1,2 @@
1
+ import { t as e } from "./time-picker-BlMWCQwk.js";
2
+ export { e as TimePicker };