@devslab/dds-solid 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ko.md CHANGED
@@ -26,6 +26,12 @@ DDS가 공개 API와 시각 토큰을 소유한다. 기존 import와 콜백 값
26
26
  포인터·포커스 상호작용 중과 브라우저 페이지가 비활성일 때는 알림 타이머가
27
27
  멈춘다. duration이 0 이하이면 명시적으로 닫을 때까지 유지한다.
28
28
 
29
+ ## Button loading
30
+
31
+ `loading`은 버튼의 크기와 접근 가능한 이름을 바꾸지 않는다. 라벨은 지우지 않고 숨기며
32
+ 스피너를 그 위에 겹쳐 그리므로, 옆 컨트롤이 밀리지 않고 줄바꿈된 라벨도 다시 접히지
33
+ 않는다(D-043). 진행 중에도 라벨은 그대로 둔다. 숨긴 글자가 여전히 폭을 정한다.
34
+
29
35
  ## createPendingAction
30
36
 
31
37
  버튼이 여러 개인 화면은 어느 버튼이 작업을 시작했는지 알아야 한다. 모든 버튼에
package/README.md CHANGED
@@ -25,6 +25,12 @@ same. See [the migration guide](../../docs/ark-migration.md) for integration det
25
25
  pointer/focus interaction and when the browser page is idle. A non-positive duration
26
26
  keeps the toast until dismissed.
27
27
 
28
+ ## Button loading
29
+
30
+ `loading` keeps the button's size and accessible name: the label is hidden, not removed, and the
31
+ spinner is drawn over it, so the controls beside it do not move and a wrapped label does not wrap
32
+ again (D-043). Keep the label the same while loading; the hidden text still sets the width.
33
+
28
34
  ## createPendingAction
29
35
 
30
36
  A screen with several buttons needs to know which one started the work. Pass one shared flag
@@ -1,6 +1,6 @@
1
1
  import { n as choiceWarningsEnabled, r as validateOptions, t as choiceMessages } from "./choice-types-h4YVL8xH.js";
2
2
  import { For, Show, createEffect, createMemo, createSignal, createUniqueId, onCleanup, onMount, untrack } from "solid-js";
3
- import { Portal, createComponent, escape, memo, mergeProps as mergeProps$1, ssr, ssrAttribute, ssrHydrationKey, ssrStyle, ssrStyleProperty } from "solid-js/web";
3
+ import { Portal, createComponent, escape, memo, mergeProps as mergeProps$1, ssr, ssrAttribute, ssrHydrationKey, ssrStyle } from "solid-js/web";
4
4
  import { Combobox, createListCollection } from "@ark-ui/solid/combobox";
5
5
  import { Select } from "@ark-ui/solid/select";
6
6
  import { createVirtualizer, defaultRangeExtractor } from "@tanstack/solid-virtual";
@@ -12,8 +12,7 @@ var _tmpl$ = [
12
12
  ];
13
13
  var _tmpl$2 = [
14
14
  "<input",
15
- " class=\"dds-choice-validation\" style=\"",
16
- "\" tabindex=\"-1\" aria-hidden=\"true\"",
15
+ " class=\"dds-choice-validation\" tabindex=\"-1\" aria-hidden=\"true\"",
17
16
  "",
18
17
  "",
19
18
  ">"
@@ -257,6 +256,9 @@ function Choice(props) {
257
256
  get id() {
258
257
  return props.id ?? id;
259
258
  },
259
+ get ids() {
260
+ return memo(() => !!props.id)() ? memo(() => !!props.searchable)() ? { input: props.id } : { trigger: props.id } : void 0;
261
+ },
260
262
  get ["class"]() {
261
263
  return memo(() => !!props.rootClass)() ? `dds-choice ${props.rootClass}` : "dds-choice";
262
264
  },
@@ -365,7 +367,7 @@ function Choice(props) {
365
367
  ];
366
368
  }
367
369
  }),
368
- ssr(_tmpl$2, ssrHydrationKey(), ssrStyleProperty("position:", "absolute") + ssrStyleProperty(";width:", "1px") + ssrStyleProperty(";height:", "1px") + ssrStyleProperty(";padding:", "0") + ssrStyleProperty(";border:", "0") + ssrStyleProperty(";clip-path:", "inset(50%)") + ssrStyleProperty(";overflow:", "hidden") + ssrStyleProperty(";white-space:", "nowrap"), ssrAttribute("name", escape(props.name, true), false) + ssrAttribute("form", escape(props.form, true), false) + ssrAttribute("value", escape(value(), true), false), ssrAttribute("required", props.required, true), ssrAttribute("disabled", props.disabled, true)),
370
+ ssr(_tmpl$2, ssrHydrationKey(), ssrAttribute("name", escape(props.name, true), false) + ssrAttribute("form", escape(props.form, true), false) + ssrAttribute("value", escape(value(), true), false), ssrAttribute("required", props.required, true), ssrAttribute("disabled", props.disabled, true)),
369
371
  ssr(_tmpl$4, ssrHydrationKey(), escape(status()), escape(createComponent(Show, {
370
372
  get when() {
371
373
  return memo(() => !!props.error)() && props.onRetry;
@@ -388,10 +390,6 @@ function Choice(props) {
388
390
  get children() {
389
391
  return createComponent(Parts.Content, {
390
392
  "class": "dds-choice-content",
391
- style: {
392
- "max-height": "min(320px, var(--available-height, 320px))",
393
- overflow: "auto"
394
- },
395
393
  get children() {
396
394
  return ssr(_tmpl$6, ssrHydrationKey(), ssrStyle(virtual() ? {
397
395
  height: `${virtualizer.getTotalSize()}px`,
@@ -452,4 +450,4 @@ function Choice(props) {
452
450
  //#endregion
453
451
  export { Choice as t };
454
452
 
455
- //# sourceMappingURL=choice-DPmk9AHn.js.map
453
+ //# sourceMappingURL=choice-UkVI5yuv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"choice-UkVI5yuv.js","names":["Combobox","C","createListCollection","Select","S","Portal","createEffect","createMemo","createSignal","createUniqueId","For","onCleanup","onMount","Show","untrack","JSX","createVirtualizer","defaultRangeExtractor","Range","choiceMessages","choiceWarningsEnabled","validateOptions","ChoiceOption","ComboboxProps","ChoiceInternals","searchable","matchItem","item","query","commitDraft","text","triggerContent","Element","rootClass","invalid","autoHighlight","centerSelected","inputMode","HTMLAttributes","HTMLInputElement","onFormReset","Choice","props","id","internal","setInternal","defaultValue","value","label","items","find","selectedOption","draft","setDraft","defaultInputValue","inputValue","open","setOpen","highlight","setHighlight","visible","HTMLButtonElement","validation","scroll","setScroll","HTMLDivElement","portalMount","setPortalMount","HTMLElement","closest","ownerDocument","body","composing","consumedOnBlur","pendingRestore","from","to","resolveLabel","blocked","disabled","readOnly","messages","setInput","next","undefined","onInputValueChange","restoreInput","current","setValue","onValueChange","some","console","warn","JSON","stringify","previousSelection","associatedForm","form","getElementById","HTMLFormElement","reset","event","Event","setTimeout","defaultPrevented","resetValue","resetLabel","addEventListener","removeEventListener","filterMode","filter","toLocaleLowerCase","includes","collection","itemToString","itemToValue","isItemDisabled","virtual","virtualization","height","configured","itemHeight","Number","isFinite","Math","max","activeIndex","findIndex","virtualizer","count","length","getScrollElement","estimateSize","overscan","enabled","initialRect","width","rangeExtractor","active","range","indexes","push","sort","a","b","opened","scrollToIndex","align","content","frame","requestAnimationFrame","selected","querySelector","list","getBoundingClientRect","row","scrollTop","top","clientHeight","cancelAnimationFrame","Parts","rows","result","getVirtualItems","map","index","start","_","status","loading","error","empty","rootProps","onOpenChange","details","onHighlightChange","highlightedValue","scrollToIndexFn","positioning","placement","const","sameWidth","gutter","strategy","matches","hideWhenDetached","inputProps","reason","stale","activeElement","selectionBehavior","inputBehavior","_$createComponent","Root","_$mergeProps","ids","_$memo","input","trigger","class","data-label-placement","labelPlacement","data-has-value","children","when","Label","onClick","focus","Control","Input","aria-label","aria-labelledby","aria-describedby","aria-required","required","placeholder","onCompositionStart","onCompositionEnd","onKeyDown","key","preventDefault","stopPropagation","onBlur","currentTarget","Trigger","_$ssr","_tmpl$5","_$ssrHydrationKey","_$escape","clearable","_tmpl$","_$ssrAttribute","clear","_tmpl$2","name","_tmpl$4","onRetry","_tmpl$3","retry","mount","Positioner","Content","_tmpl$6","_$ssrStyle","getTotalSize","position","each","Item","aria-posinset","aria-setsize","style","left","transform","ItemText","description","_tmpl$7"],"sources":["../../src/internal/choice.tsx"],"sourcesContent":["import { Combobox as C, createListCollection } from \"@ark-ui/solid/combobox\";\nimport { Select as S } from \"@ark-ui/solid/select\";\nimport { Portal } from \"solid-js/web\";\nimport {\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n onCleanup,\n onMount,\n Show,\n untrack,\n type JSX,\n} from \"solid-js\";\nimport {\n createVirtualizer,\n defaultRangeExtractor,\n type Range,\n} from \"@tanstack/solid-virtual\";\nimport {\n choiceMessages,\n choiceWarningsEnabled,\n validateOptions,\n type ChoiceOption,\n type ComboboxProps,\n} from \"../choice-types\";\n\n/**\n * Options for DDS components built on Choice (TimePicker). They are not part\n * of the public Combobox/SelectPicker props; every default keeps the existing\n * Combobox and SelectPicker behavior.\n */\nexport interface ChoiceInternals {\n searchable: boolean;\n /** Replaces the default case-insensitive label substring filter. */\n matchItem?: (item: ChoiceOption, query: string) => boolean;\n /** On blur, the value the typed text stands for, \"\" to clear, or null to restore the label. */\n commitDraft?: (text: string) => string | null;\n /** Content of the searchable trigger button (default \"⌄\"). */\n triggerContent?: () => JSX.Element;\n rootClass?: string;\n invalid?: boolean;\n /** Highlight the first match while typing so Enter picks it. */\n autoHighlight?: boolean;\n /** Scroll the selected option to the middle of the list when it opens. */\n centerSelected?: boolean;\n inputMode?: JSX.HTMLAttributes<HTMLInputElement>[\"inputMode\"];\n /** Called before a native form reset restores the value. */\n onFormReset?: () => void;\n}\n\nexport function Choice(props: ComboboxProps & ChoiceInternals) {\n const id = createUniqueId();\n const [internal, setInternal] = createSignal(props.defaultValue ?? \"\");\n const value = () => props.value ?? internal();\n const label = createMemo(\n () =>\n props.items.find((item) => item.value === value())?.label ??\n (props.selectedOption?.value === value()\n ? props.selectedOption.label\n : value()),\n );\n const [draft, setDraft] = createSignal(props.defaultInputValue ?? label());\n const inputValue = () => props.inputValue ?? draft();\n const [open, setOpen] = createSignal(false),\n [highlight, setHighlight] = createSignal<string | null>(null);\n let visible: HTMLInputElement | HTMLButtonElement | undefined,\n validation: HTMLInputElement | undefined;\n const [scroll, setScroll] = createSignal<HTMLDivElement | null>(null);\n const [portalMount, setPortalMount] = createSignal<HTMLElement>();\n onMount(() => {\n // Preserve the enclosing modal's isolation boundary for nested options.\n if (visible)\n setPortalMount(\n visible.closest<HTMLElement>('[role=\"dialog\"], [role=\"alertdialog\"]') ??\n visible.ownerDocument.body,\n );\n });\n let composing = false;\n let consumedOnBlur: string | null = null;\n let pendingRestore: { from: string; to: string } | null = null;\n const resolveLabel = (id: string) =>\n props.items.find((item) => item.value === id)?.label ??\n (props.selectedOption?.value === id ? props.selectedOption.label : id);\n const blocked = () => props.disabled || props.readOnly;\n const messages = () => ({ ...choiceMessages, ...props.messages });\n const setInput = (next: string) => {\n if (pendingRestore?.from === inputValue() && pendingRestore.to === next)\n return;\n pendingRestore = null;\n if (props.inputValue === undefined) setDraft(next);\n props.onInputValueChange?.(next);\n };\n const restoreInput = (next: string) => {\n const current = inputValue();\n if (next === current) return;\n if (pendingRestore?.from === current && pendingRestore.to === next) return;\n pendingRestore = { from: current, to: next };\n if (props.inputValue === undefined) setDraft(next);\n else props.onInputValueChange?.(next);\n };\n const setValue = (next: string) => {\n if (props.value === undefined) setInternal(next);\n props.onValueChange?.(next);\n };\n createEffect(() => {\n validateOptions(props.items);\n });\n createEffect(() => {\n if (\n choiceWarningsEnabled() &&\n value() &&\n !props.items.some((item) => item.value === value()) &&\n props.selectedOption?.value !== value()\n )\n console.warn(\n `DDS choice: no label supplied for selected ID ${JSON.stringify(value())}; pass selectedOption when the selection is outside items.`,\n );\n });\n let previousSelection = { value: value(), label: label() };\n createEffect(() => {\n const current = { value: value(), label: label() };\n if (\n previousSelection.value !== current.value ||\n previousSelection.label !== current.label\n ) {\n previousSelection = current;\n untrack(() => restoreInput(current.label));\n }\n });\n createEffect(() => {\n const associatedForm = props.form;\n const form = associatedForm\n ? (validation?.ownerDocument.getElementById(\n associatedForm,\n ) as HTMLFormElement | null)\n : validation?.form;\n if (!form) return;\n // A task, not a microtask: after a reset-button click, microtasks run\n // before the browser resets the controls and would be overwritten.\n const reset = (event: Event) =>\n setTimeout(() => {\n if (event.defaultPrevented) return;\n props.onFormReset?.();\n const resetValue = props.value ?? props.defaultValue ?? \"\";\n const resetLabel = resolveLabel(resetValue);\n previousSelection = { value: resetValue, label: resetLabel };\n if (props.value === undefined) setInternal(resetValue);\n restoreInput(props.defaultInputValue ?? resetLabel);\n setOpen(false);\n if (visible instanceof HTMLInputElement) visible.value = inputValue();\n if (validation) validation.value = value();\n });\n form.addEventListener(\"reset\", reset);\n onCleanup(() => form.removeEventListener(\"reset\", reset));\n });\n const items = createMemo(() =>\n props.searchable &&\n props.filterMode !== \"external\" &&\n inputValue() !== label()\n ? props.items.filter((item) =>\n props.matchItem\n ? props.matchItem(item, inputValue())\n : item.label\n .toLocaleLowerCase()\n .includes(inputValue().toLocaleLowerCase()),\n )\n : props.items,\n );\n const collection = createMemo(() =>\n createListCollection({\n items: items(),\n itemToString: (item) => item.label,\n itemToValue: (item) => item.value,\n isItemDisabled: (item) => !!item.disabled,\n }),\n );\n const virtual = () => !!props.virtualization;\n const height = () => {\n const configured = props.virtualization\n ? props.virtualization.itemHeight\n : undefined;\n return Number.isFinite(configured) ? Math.max(40, configured!) : 40;\n };\n const activeIndex = () =>\n items().findIndex((item) => item.value === highlight());\n const virtualizer = createVirtualizer<HTMLDivElement, HTMLDivElement>({\n get count() {\n return items().length;\n },\n getScrollElement: scroll,\n estimateSize: height,\n get overscan() {\n return props.virtualization ? (props.virtualization.overscan ?? 5) : 5;\n },\n get enabled() {\n return virtual() && open();\n },\n initialRect: { width: 0, height: 320 },\n get rangeExtractor() {\n const active = activeIndex();\n return (range: Range) => {\n const indexes = defaultRangeExtractor(range);\n if (active >= 0 && !indexes.includes(active)) indexes.push(active);\n return indexes.sort((a, b) => a - b);\n };\n },\n });\n createEffect(() => {\n items();\n const opened = open();\n setHighlight(null);\n if (virtual() && opened)\n virtualizer.scrollToIndex(\n Math.max(\n 0,\n items().findIndex((item) => item.value === value()),\n ),\n { align: props.centerSelected ? \"center\" : \"auto\" },\n );\n });\n createEffect(() => {\n const content = scroll();\n if (!props.centerSelected || !open() || virtual() || !content) return;\n // Ark only scrolls the highlighted option to the nearest edge.\n const frame = requestAnimationFrame(() => {\n const selected = content.querySelector<HTMLElement>(\n '[data-part=\"item\"][data-state=\"checked\"]',\n );\n if (!selected) return;\n const list = content.getBoundingClientRect(),\n row = selected.getBoundingClientRect();\n content.scrollTop +=\n row.top - list.top - (content.clientHeight - row.height) / 2;\n });\n onCleanup(() => cancelAnimationFrame(frame));\n });\n const Parts = props.searchable ? C : S;\n const rows = createMemo(() => {\n const result = virtual()\n ? virtualizer\n .getVirtualItems()\n .map((row) => ({ index: row.index, start: row.start }))\n : items().map((_, index) => ({ index, start: 0 }));\n const active = activeIndex();\n if (virtual() && active >= 0 && !result.some((row) => row.index === active))\n result.push({ index: active, start: active * height() });\n return result;\n });\n const status = () =>\n props.loading\n ? messages().loading\n : props.error\n ? typeof props.error === \"string\"\n ? props.error\n : messages().error\n : items().length === 0\n ? messages().empty\n : \"\";\n const rootProps = {\n get collection() {\n return collection();\n },\n get value() {\n return value() ? [value()] : [];\n },\n get open() {\n return open() && !blocked();\n },\n get disabled() {\n return props.disabled;\n },\n get readOnly() {\n return props.readOnly;\n },\n get invalid() {\n return props.invalid;\n },\n onOpenChange: (details: { open: boolean }) => {\n if (!blocked()) setOpen(details.open);\n },\n onValueChange: (details: { value: string[] }) => {\n if (blocked() || composing) return;\n const next = details.value[0] ?? \"\";\n if (next !== value()) setValue(next);\n },\n onHighlightChange: (details: { highlightedValue: string | null }) =>\n setHighlight(details.highlightedValue),\n get scrollToIndexFn() {\n return virtual()\n ? ({ index }: { index: number }) =>\n virtualizer.scrollToIndex(index, { align: \"auto\" })\n : undefined;\n },\n get positioning() {\n return {\n placement: \"bottom-start\" as const,\n sameWidth: true,\n gutter: 4,\n strategy: portalMount()?.matches(\n '[role=\"dialog\"], [role=\"alertdialog\"]',\n )\n ? (\"fixed\" as const)\n : (\"absolute\" as const),\n hideWhenDetached: !!portalMount()?.matches(\n '[role=\"dialog\"], [role=\"alertdialog\"]',\n ),\n };\n },\n };\n const inputProps = props.searchable\n ? {\n get inputValue() {\n return inputValue();\n },\n onInputValueChange: (details: {\n inputValue: string;\n reason?: string | undefined;\n }) => {\n // Ark reports a keystroke after the blur that already committed it.\n const stale =\n consumedOnBlur === details.inputValue &&\n details.reason === \"input-change\" &&\n visible?.ownerDocument.activeElement !== visible;\n consumedOnBlur = null;\n if (stale) return;\n if (!blocked() && details.inputValue !== inputValue())\n setInput(details.inputValue);\n },\n selectionBehavior: \"preserve\" as const,\n ...(props.autoHighlight\n ? { inputBehavior: \"autohighlight\" as const }\n : {}),\n }\n : {};\n return (\n <Parts.Root\n {...rootProps}\n {...inputProps}\n id={props.id ?? id}\n // A consumer id lands on the control a <label for> targets (text box, or\n // SelectPicker's button), not on Zag's prefixed part IDs.\n ids={\n props.id\n ? props.searchable\n ? { input: props.id }\n : { trigger: props.id }\n : undefined\n }\n class={props.rootClass ? `dds-choice ${props.rootClass}` : \"dds-choice\"}\n data-label-placement={props.labelPlacement ?? \"outside\"}\n data-has-value={value() || inputValue() ? \"\" : undefined}\n >\n <Show when={props.label}>\n <Parts.Label class=\"dds-choice-label\" onClick={() => visible?.focus()}>\n {props.label}\n </Parts.Label>\n </Show>\n <Parts.Control class=\"dds-choice-control\">\n <Show when={props.searchable}>\n <C.Input\n ref={(node) => {\n visible = node;\n }}\n class=\"dds-choice-input\"\n aria-label={props[\"aria-label\"]}\n aria-labelledby={props[\"aria-labelledby\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={props.required}\n placeholder={props.placeholder}\n inputMode={props.inputMode}\n onCompositionStart={() => {\n composing = true;\n }}\n onCompositionEnd={() => {\n composing = false;\n }}\n onKeyDown={(event) => {\n if (composing && event.key === \"Enter\") {\n event.preventDefault();\n event.stopPropagation();\n }\n }}\n onBlur={(event) => {\n if (props.commitDraft) {\n // The DOM holds the latest keystroke; Ark's input state may still be queued.\n consumedOnBlur = event.currentTarget.value;\n const next = blocked()\n ? null\n : props.commitDraft(consumedOnBlur);\n if (next !== null && next !== value()) setValue(next);\n restoreInput(label());\n return;\n }\n if (value()) restoreInput(label());\n }}\n />\n </Show>\n <Parts.Trigger\n ref={(node) => {\n if (!props.searchable) visible = node;\n }}\n class=\"dds-choice-trigger\"\n aria-label={props.searchable ? messages().open : props[\"aria-label\"]}\n aria-labelledby={props[\"aria-labelledby\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={props.required}\n >\n {props.searchable ? (\n props.triggerContent ? (\n props.triggerContent()\n ) : (\n \"⌄\"\n )\n ) : (\n <span class=\"dds-choice-value\">\n {label() || props.placeholder || messages().open}\n </span>\n )}\n </Parts.Trigger>\n <Show when={props.clearable && !blocked() && (value() || inputValue())}>\n <button\n class=\"dds-choice-clear\"\n type=\"button\"\n aria-label={messages().clear}\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => {\n setValue(\"\");\n setInput(\"\");\n setOpen(false);\n visible?.focus();\n }}\n >\n ×\n </button>\n </Show>\n </Parts.Control>\n {/* Hidden by choice.css. No style attribute: a style-src-attr CSP blocks it. */}\n <input\n ref={validation}\n class=\"dds-choice-validation\"\n tabIndex={-1}\n aria-hidden=\"true\"\n name={props.name}\n form={props.form}\n value={value()}\n required={props.required}\n disabled={props.disabled}\n onInput={(event) => {\n event.currentTarget.value = value();\n }}\n onInvalid={(event) => {\n event.preventDefault();\n visible?.focus();\n }}\n />\n <div class=\"dds-choice-status\" role=\"status\" aria-live=\"polite\">\n {status()}\n <Show when={props.error && props.onRetry}>\n <button\n class=\"dds-choice-retry\"\n type=\"button\"\n onClick={() => props.onRetry?.()}\n >\n {messages().retry}\n </button>\n </Show>\n </div>\n <Show when={portalMount()}>\n {(mount) => (\n <Portal mount={mount()}>\n <Parts.Positioner class=\"dds-choice-positioner\">\n {/* choice.css gives the list its 320px cap and scrolling. */}\n <Parts.Content\n ref={setScroll}\n class=\"dds-choice-content\"\n >\n <div\n style={\n virtual()\n ? {\n height: `${virtualizer.getTotalSize()}px`,\n position: \"relative\",\n }\n : undefined\n }\n >\n <For each={rows()}>\n {(row) => {\n const item = () => items()[row.index]!;\n return (\n <Parts.Item\n item={item()}\n class=\"dds-choice-item\"\n aria-posinset={row.index + 1}\n aria-setsize={items().length}\n style={\n virtual()\n ? {\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n width: \"100%\",\n height: `${height()}px`,\n transform: `translateY(${row.start}px)`,\n }\n : undefined\n }\n >\n <Parts.ItemText>{item().label}</Parts.ItemText>\n <Show when={item().description}>\n <span class=\"dds-choice-description\">\n {item().description}\n </span>\n </Show>\n </Parts.Item>\n );\n }}\n </For>\n </div>\n </Parts.Content>\n </Parts.Positioner>\n </Portal>\n )}\n </Show>\n </Parts.Root>\n );\n}\n"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { Combobox as C, createListCollection as ie } from "@ark-ui/solid/combobo
5
5
  import { Select as ae } from "@ark-ui/solid/select";
6
6
  import { createVirtualizer as oe, defaultRangeExtractor as se } from "@tanstack/solid-virtual";
7
7
  //#region src/internal/choice.tsx
8
- var ce = /*#__PURE__*/ S("<button class=dds-choice-clear type=button>×"), le = /*#__PURE__*/ S("<input class=dds-choice-validation tabindex=-1 aria-hidden=true style=position:absolute;width:1px;height:1px;padding:0;border:0;clip-path:inset(50%);overflow:hidden;white-space:nowrap>"), ue = /*#__PURE__*/ S("<button class=dds-choice-retry type=button>"), w = /*#__PURE__*/ S("<div class=dds-choice-status role=status aria-live=polite><!$><!/><!$><!/>"), de = /*#__PURE__*/ S("<span class=dds-choice-value>"), fe = /*#__PURE__*/ S("<div>"), pe = /*#__PURE__*/ S("<span class=dds-choice-description>");
8
+ var ce = /*#__PURE__*/ S("<button class=dds-choice-clear type=button>×"), le = /*#__PURE__*/ S("<input class=dds-choice-validation tabindex=-1 aria-hidden=true>"), ue = /*#__PURE__*/ S("<button class=dds-choice-retry type=button>"), w = /*#__PURE__*/ S("<div class=dds-choice-status role=status aria-live=polite><!$><!/><!$><!/>"), de = /*#__PURE__*/ S("<span class=dds-choice-value>"), fe = /*#__PURE__*/ S("<div>"), pe = /*#__PURE__*/ S("<span class=dds-choice-description>");
9
9
  function T(d) {
10
10
  let S = ee(), [T, E] = s(d.defaultValue ?? ""), D = () => d.value ?? T(), O = o(() => d.items.find((e) => e.value === D())?.label ?? (d.selectedOption?.value === D() ? d.selectedOption.label : D())), [me, k] = s(d.defaultInputValue ?? O()), A = () => d.inputValue ?? me(), [j, M] = s(!1), [he, N] = s(null), P, F, [I, L] = s(null), [R, ge] = s();
11
11
  te(() => {
@@ -168,6 +168,9 @@ function T(d) {
168
168
  get id() {
169
169
  return d.id ?? S;
170
170
  },
171
+ get ids() {
172
+ return g(() => !!d.id)() ? g(() => !!d.searchable)() ? { input: d.id } : { trigger: d.id } : void 0;
173
+ },
171
174
  get class() {
172
175
  return g(() => !!d.rootClass)() ? `dds-choice ${d.rootClass}` : "dds-choice";
173
176
  },
@@ -329,10 +332,6 @@ function T(d) {
329
332
  return u($.Content, {
330
333
  ref: L,
331
334
  class: "dds-choice-content",
332
- style: {
333
- "max-height": "min(320px, var(--available-height, 320px))",
334
- overflow: "auto"
335
- },
336
335
  get children() {
337
336
  var e = p(fe);
338
337
  return h(e, u(r, {
@@ -400,4 +399,4 @@ d([
400
399
  //#endregion
401
400
  export { T as t };
402
401
 
403
- //# sourceMappingURL=choice-CTNeFOVo.js.map
402
+ //# sourceMappingURL=choice-DwhbztEw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"choice-DwhbztEw.js","names":["Combobox","C","createListCollection","Select","S","Portal","createEffect","createMemo","createSignal","createUniqueId","For","onCleanup","onMount","Show","untrack","JSX","createVirtualizer","defaultRangeExtractor","Range","choiceMessages","choiceWarningsEnabled","validateOptions","ChoiceOption","ComboboxProps","ChoiceInternals","searchable","matchItem","item","query","commitDraft","text","triggerContent","Element","rootClass","invalid","autoHighlight","centerSelected","inputMode","HTMLAttributes","HTMLInputElement","onFormReset","Choice","props","id","internal","setInternal","defaultValue","value","label","items","find","selectedOption","draft","setDraft","defaultInputValue","inputValue","open","setOpen","highlight","setHighlight","visible","HTMLButtonElement","validation","scroll","setScroll","HTMLDivElement","portalMount","setPortalMount","HTMLElement","closest","ownerDocument","body","composing","consumedOnBlur","pendingRestore","from","to","resolveLabel","blocked","disabled","readOnly","messages","setInput","next","undefined","onInputValueChange","restoreInput","current","setValue","onValueChange","some","console","warn","JSON","stringify","previousSelection","associatedForm","form","getElementById","HTMLFormElement","reset","event","Event","setTimeout","defaultPrevented","resetValue","resetLabel","addEventListener","removeEventListener","filterMode","filter","toLocaleLowerCase","includes","collection","itemToString","itemToValue","isItemDisabled","virtual","virtualization","height","configured","itemHeight","Number","isFinite","Math","max","activeIndex","findIndex","virtualizer","count","length","getScrollElement","estimateSize","overscan","enabled","initialRect","width","rangeExtractor","active","range","indexes","push","sort","a","b","opened","scrollToIndex","align","content","frame","requestAnimationFrame","selected","querySelector","list","getBoundingClientRect","row","scrollTop","top","clientHeight","cancelAnimationFrame","Parts","rows","result","getVirtualItems","map","index","start","_","status","loading","error","empty","rootProps","onOpenChange","details","onHighlightChange","highlightedValue","scrollToIndexFn","positioning","placement","const","sameWidth","gutter","strategy","matches","hideWhenDetached","inputProps","reason","stale","activeElement","selectionBehavior","inputBehavior","_$createComponent","Root","_$mergeProps","ids","_$memo","input","trigger","class","data-label-placement","labelPlacement","data-has-value","children","when","Label","onClick","focus","Control","Input","ref","node","aria-label","aria-labelledby","aria-describedby","aria-required","required","placeholder","onCompositionStart","onCompositionEnd","onKeyDown","key","preventDefault","stopPropagation","onBlur","currentTarget","Trigger","_el$9","_$getNextElement","_tmpl$5","_$insert","clearable","_el$","_tmpl$","$$click","$$pointerdown","_$effect","_$setAttribute","clear","_$runHydrationEvents","_el$2","_tmpl$2","$$input","_ref$","_$use","_p$","_v$","name","_v$2","_v$3","_v$4","e","t","_$setProperty","o","_el$3","_tmpl$4","_el$5","firstChild","_el$6","_co$","_$getNextMarker","nextSibling","_el$7","_el$8","_co$2","onRetry","_el$4","_tmpl$3","retry","mount","Positioner","Content","_el$0","_tmpl$6","each","Item","aria-posinset","aria-setsize","style","position","left","transform","ItemText","description","_el$1","_tmpl$7","_$p","_$style","getTotalSize","_$delegateEvents"],"sources":["../src/internal/choice.tsx"],"sourcesContent":["import { Combobox as C, createListCollection } from \"@ark-ui/solid/combobox\";\nimport { Select as S } from \"@ark-ui/solid/select\";\nimport { Portal } from \"solid-js/web\";\nimport {\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n onCleanup,\n onMount,\n Show,\n untrack,\n type JSX,\n} from \"solid-js\";\nimport {\n createVirtualizer,\n defaultRangeExtractor,\n type Range,\n} from \"@tanstack/solid-virtual\";\nimport {\n choiceMessages,\n choiceWarningsEnabled,\n validateOptions,\n type ChoiceOption,\n type ComboboxProps,\n} from \"../choice-types\";\n\n/**\n * Options for DDS components built on Choice (TimePicker). They are not part\n * of the public Combobox/SelectPicker props; every default keeps the existing\n * Combobox and SelectPicker behavior.\n */\nexport interface ChoiceInternals {\n searchable: boolean;\n /** Replaces the default case-insensitive label substring filter. */\n matchItem?: (item: ChoiceOption, query: string) => boolean;\n /** On blur, the value the typed text stands for, \"\" to clear, or null to restore the label. */\n commitDraft?: (text: string) => string | null;\n /** Content of the searchable trigger button (default \"⌄\"). */\n triggerContent?: () => JSX.Element;\n rootClass?: string;\n invalid?: boolean;\n /** Highlight the first match while typing so Enter picks it. */\n autoHighlight?: boolean;\n /** Scroll the selected option to the middle of the list when it opens. */\n centerSelected?: boolean;\n inputMode?: JSX.HTMLAttributes<HTMLInputElement>[\"inputMode\"];\n /** Called before a native form reset restores the value. */\n onFormReset?: () => void;\n}\n\nexport function Choice(props: ComboboxProps & ChoiceInternals) {\n const id = createUniqueId();\n const [internal, setInternal] = createSignal(props.defaultValue ?? \"\");\n const value = () => props.value ?? internal();\n const label = createMemo(\n () =>\n props.items.find((item) => item.value === value())?.label ??\n (props.selectedOption?.value === value()\n ? props.selectedOption.label\n : value()),\n );\n const [draft, setDraft] = createSignal(props.defaultInputValue ?? label());\n const inputValue = () => props.inputValue ?? draft();\n const [open, setOpen] = createSignal(false),\n [highlight, setHighlight] = createSignal<string | null>(null);\n let visible: HTMLInputElement | HTMLButtonElement | undefined,\n validation: HTMLInputElement | undefined;\n const [scroll, setScroll] = createSignal<HTMLDivElement | null>(null);\n const [portalMount, setPortalMount] = createSignal<HTMLElement>();\n onMount(() => {\n // Preserve the enclosing modal's isolation boundary for nested options.\n if (visible)\n setPortalMount(\n visible.closest<HTMLElement>('[role=\"dialog\"], [role=\"alertdialog\"]') ??\n visible.ownerDocument.body,\n );\n });\n let composing = false;\n let consumedOnBlur: string | null = null;\n let pendingRestore: { from: string; to: string } | null = null;\n const resolveLabel = (id: string) =>\n props.items.find((item) => item.value === id)?.label ??\n (props.selectedOption?.value === id ? props.selectedOption.label : id);\n const blocked = () => props.disabled || props.readOnly;\n const messages = () => ({ ...choiceMessages, ...props.messages });\n const setInput = (next: string) => {\n if (pendingRestore?.from === inputValue() && pendingRestore.to === next)\n return;\n pendingRestore = null;\n if (props.inputValue === undefined) setDraft(next);\n props.onInputValueChange?.(next);\n };\n const restoreInput = (next: string) => {\n const current = inputValue();\n if (next === current) return;\n if (pendingRestore?.from === current && pendingRestore.to === next) return;\n pendingRestore = { from: current, to: next };\n if (props.inputValue === undefined) setDraft(next);\n else props.onInputValueChange?.(next);\n };\n const setValue = (next: string) => {\n if (props.value === undefined) setInternal(next);\n props.onValueChange?.(next);\n };\n createEffect(() => {\n validateOptions(props.items);\n });\n createEffect(() => {\n if (\n choiceWarningsEnabled() &&\n value() &&\n !props.items.some((item) => item.value === value()) &&\n props.selectedOption?.value !== value()\n )\n console.warn(\n `DDS choice: no label supplied for selected ID ${JSON.stringify(value())}; pass selectedOption when the selection is outside items.`,\n );\n });\n let previousSelection = { value: value(), label: label() };\n createEffect(() => {\n const current = { value: value(), label: label() };\n if (\n previousSelection.value !== current.value ||\n previousSelection.label !== current.label\n ) {\n previousSelection = current;\n untrack(() => restoreInput(current.label));\n }\n });\n createEffect(() => {\n const associatedForm = props.form;\n const form = associatedForm\n ? (validation?.ownerDocument.getElementById(\n associatedForm,\n ) as HTMLFormElement | null)\n : validation?.form;\n if (!form) return;\n // A task, not a microtask: after a reset-button click, microtasks run\n // before the browser resets the controls and would be overwritten.\n const reset = (event: Event) =>\n setTimeout(() => {\n if (event.defaultPrevented) return;\n props.onFormReset?.();\n const resetValue = props.value ?? props.defaultValue ?? \"\";\n const resetLabel = resolveLabel(resetValue);\n previousSelection = { value: resetValue, label: resetLabel };\n if (props.value === undefined) setInternal(resetValue);\n restoreInput(props.defaultInputValue ?? resetLabel);\n setOpen(false);\n if (visible instanceof HTMLInputElement) visible.value = inputValue();\n if (validation) validation.value = value();\n });\n form.addEventListener(\"reset\", reset);\n onCleanup(() => form.removeEventListener(\"reset\", reset));\n });\n const items = createMemo(() =>\n props.searchable &&\n props.filterMode !== \"external\" &&\n inputValue() !== label()\n ? props.items.filter((item) =>\n props.matchItem\n ? props.matchItem(item, inputValue())\n : item.label\n .toLocaleLowerCase()\n .includes(inputValue().toLocaleLowerCase()),\n )\n : props.items,\n );\n const collection = createMemo(() =>\n createListCollection({\n items: items(),\n itemToString: (item) => item.label,\n itemToValue: (item) => item.value,\n isItemDisabled: (item) => !!item.disabled,\n }),\n );\n const virtual = () => !!props.virtualization;\n const height = () => {\n const configured = props.virtualization\n ? props.virtualization.itemHeight\n : undefined;\n return Number.isFinite(configured) ? Math.max(40, configured!) : 40;\n };\n const activeIndex = () =>\n items().findIndex((item) => item.value === highlight());\n const virtualizer = createVirtualizer<HTMLDivElement, HTMLDivElement>({\n get count() {\n return items().length;\n },\n getScrollElement: scroll,\n estimateSize: height,\n get overscan() {\n return props.virtualization ? (props.virtualization.overscan ?? 5) : 5;\n },\n get enabled() {\n return virtual() && open();\n },\n initialRect: { width: 0, height: 320 },\n get rangeExtractor() {\n const active = activeIndex();\n return (range: Range) => {\n const indexes = defaultRangeExtractor(range);\n if (active >= 0 && !indexes.includes(active)) indexes.push(active);\n return indexes.sort((a, b) => a - b);\n };\n },\n });\n createEffect(() => {\n items();\n const opened = open();\n setHighlight(null);\n if (virtual() && opened)\n virtualizer.scrollToIndex(\n Math.max(\n 0,\n items().findIndex((item) => item.value === value()),\n ),\n { align: props.centerSelected ? \"center\" : \"auto\" },\n );\n });\n createEffect(() => {\n const content = scroll();\n if (!props.centerSelected || !open() || virtual() || !content) return;\n // Ark only scrolls the highlighted option to the nearest edge.\n const frame = requestAnimationFrame(() => {\n const selected = content.querySelector<HTMLElement>(\n '[data-part=\"item\"][data-state=\"checked\"]',\n );\n if (!selected) return;\n const list = content.getBoundingClientRect(),\n row = selected.getBoundingClientRect();\n content.scrollTop +=\n row.top - list.top - (content.clientHeight - row.height) / 2;\n });\n onCleanup(() => cancelAnimationFrame(frame));\n });\n const Parts = props.searchable ? C : S;\n const rows = createMemo(() => {\n const result = virtual()\n ? virtualizer\n .getVirtualItems()\n .map((row) => ({ index: row.index, start: row.start }))\n : items().map((_, index) => ({ index, start: 0 }));\n const active = activeIndex();\n if (virtual() && active >= 0 && !result.some((row) => row.index === active))\n result.push({ index: active, start: active * height() });\n return result;\n });\n const status = () =>\n props.loading\n ? messages().loading\n : props.error\n ? typeof props.error === \"string\"\n ? props.error\n : messages().error\n : items().length === 0\n ? messages().empty\n : \"\";\n const rootProps = {\n get collection() {\n return collection();\n },\n get value() {\n return value() ? [value()] : [];\n },\n get open() {\n return open() && !blocked();\n },\n get disabled() {\n return props.disabled;\n },\n get readOnly() {\n return props.readOnly;\n },\n get invalid() {\n return props.invalid;\n },\n onOpenChange: (details: { open: boolean }) => {\n if (!blocked()) setOpen(details.open);\n },\n onValueChange: (details: { value: string[] }) => {\n if (blocked() || composing) return;\n const next = details.value[0] ?? \"\";\n if (next !== value()) setValue(next);\n },\n onHighlightChange: (details: { highlightedValue: string | null }) =>\n setHighlight(details.highlightedValue),\n get scrollToIndexFn() {\n return virtual()\n ? ({ index }: { index: number }) =>\n virtualizer.scrollToIndex(index, { align: \"auto\" })\n : undefined;\n },\n get positioning() {\n return {\n placement: \"bottom-start\" as const,\n sameWidth: true,\n gutter: 4,\n strategy: portalMount()?.matches(\n '[role=\"dialog\"], [role=\"alertdialog\"]',\n )\n ? (\"fixed\" as const)\n : (\"absolute\" as const),\n hideWhenDetached: !!portalMount()?.matches(\n '[role=\"dialog\"], [role=\"alertdialog\"]',\n ),\n };\n },\n };\n const inputProps = props.searchable\n ? {\n get inputValue() {\n return inputValue();\n },\n onInputValueChange: (details: {\n inputValue: string;\n reason?: string | undefined;\n }) => {\n // Ark reports a keystroke after the blur that already committed it.\n const stale =\n consumedOnBlur === details.inputValue &&\n details.reason === \"input-change\" &&\n visible?.ownerDocument.activeElement !== visible;\n consumedOnBlur = null;\n if (stale) return;\n if (!blocked() && details.inputValue !== inputValue())\n setInput(details.inputValue);\n },\n selectionBehavior: \"preserve\" as const,\n ...(props.autoHighlight\n ? { inputBehavior: \"autohighlight\" as const }\n : {}),\n }\n : {};\n return (\n <Parts.Root\n {...rootProps}\n {...inputProps}\n id={props.id ?? id}\n // A consumer id lands on the control a <label for> targets (text box, or\n // SelectPicker's button), not on Zag's prefixed part IDs.\n ids={\n props.id\n ? props.searchable\n ? { input: props.id }\n : { trigger: props.id }\n : undefined\n }\n class={props.rootClass ? `dds-choice ${props.rootClass}` : \"dds-choice\"}\n data-label-placement={props.labelPlacement ?? \"outside\"}\n data-has-value={value() || inputValue() ? \"\" : undefined}\n >\n <Show when={props.label}>\n <Parts.Label class=\"dds-choice-label\" onClick={() => visible?.focus()}>\n {props.label}\n </Parts.Label>\n </Show>\n <Parts.Control class=\"dds-choice-control\">\n <Show when={props.searchable}>\n <C.Input\n ref={(node) => {\n visible = node;\n }}\n class=\"dds-choice-input\"\n aria-label={props[\"aria-label\"]}\n aria-labelledby={props[\"aria-labelledby\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={props.required}\n placeholder={props.placeholder}\n inputMode={props.inputMode}\n onCompositionStart={() => {\n composing = true;\n }}\n onCompositionEnd={() => {\n composing = false;\n }}\n onKeyDown={(event) => {\n if (composing && event.key === \"Enter\") {\n event.preventDefault();\n event.stopPropagation();\n }\n }}\n onBlur={(event) => {\n if (props.commitDraft) {\n // The DOM holds the latest keystroke; Ark's input state may still be queued.\n consumedOnBlur = event.currentTarget.value;\n const next = blocked()\n ? null\n : props.commitDraft(consumedOnBlur);\n if (next !== null && next !== value()) setValue(next);\n restoreInput(label());\n return;\n }\n if (value()) restoreInput(label());\n }}\n />\n </Show>\n <Parts.Trigger\n ref={(node) => {\n if (!props.searchable) visible = node;\n }}\n class=\"dds-choice-trigger\"\n aria-label={props.searchable ? messages().open : props[\"aria-label\"]}\n aria-labelledby={props[\"aria-labelledby\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={props.required}\n >\n {props.searchable ? (\n props.triggerContent ? (\n props.triggerContent()\n ) : (\n \"⌄\"\n )\n ) : (\n <span class=\"dds-choice-value\">\n {label() || props.placeholder || messages().open}\n </span>\n )}\n </Parts.Trigger>\n <Show when={props.clearable && !blocked() && (value() || inputValue())}>\n <button\n class=\"dds-choice-clear\"\n type=\"button\"\n aria-label={messages().clear}\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => {\n setValue(\"\");\n setInput(\"\");\n setOpen(false);\n visible?.focus();\n }}\n >\n ×\n </button>\n </Show>\n </Parts.Control>\n {/* Hidden by choice.css. No style attribute: a style-src-attr CSP blocks it. */}\n <input\n ref={validation}\n class=\"dds-choice-validation\"\n tabIndex={-1}\n aria-hidden=\"true\"\n name={props.name}\n form={props.form}\n value={value()}\n required={props.required}\n disabled={props.disabled}\n onInput={(event) => {\n event.currentTarget.value = value();\n }}\n onInvalid={(event) => {\n event.preventDefault();\n visible?.focus();\n }}\n />\n <div class=\"dds-choice-status\" role=\"status\" aria-live=\"polite\">\n {status()}\n <Show when={props.error && props.onRetry}>\n <button\n class=\"dds-choice-retry\"\n type=\"button\"\n onClick={() => props.onRetry?.()}\n >\n {messages().retry}\n </button>\n </Show>\n </div>\n <Show when={portalMount()}>\n {(mount) => (\n <Portal mount={mount()}>\n <Parts.Positioner class=\"dds-choice-positioner\">\n {/* choice.css gives the list its 320px cap and scrolling. */}\n <Parts.Content\n ref={setScroll}\n class=\"dds-choice-content\"\n >\n <div\n style={\n virtual()\n ? {\n height: `${virtualizer.getTotalSize()}px`,\n position: \"relative\",\n }\n : undefined\n }\n >\n <For each={rows()}>\n {(row) => {\n const item = () => items()[row.index]!;\n return (\n <Parts.Item\n item={item()}\n class=\"dds-choice-item\"\n aria-posinset={row.index + 1}\n aria-setsize={items().length}\n style={\n virtual()\n ? {\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n width: \"100%\",\n height: `${height()}px`,\n transform: `translateY(${row.start}px)`,\n }\n : undefined\n }\n >\n <Parts.ItemText>{item().label}</Parts.ItemText>\n <Show when={item().description}>\n <span class=\"dds-choice-description\">\n {item().description}\n </span>\n </Show>\n </Parts.Item>\n );\n }}\n </For>\n </div>\n </Parts.Content>\n </Parts.Positioner>\n </Portal>\n )}\n </Show>\n </Parts.Root>\n );\n}\n"],"mappings":"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"}
package/dist/combobox.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as e } from "./choice-CTNeFOVo.js";
1
+ import { t as e } from "./choice-DwhbztEw.js";
2
2
  import { createComponent as t, mergeProps as n } from "solid-js/web";
3
3
  //#region src/combobox.tsx
4
4
  function r(r) {
@@ -1,4 +1,4 @@
1
- import { t as Choice } from "./assets/choice-DPmk9AHn.js";
1
+ import { t as Choice } from "./assets/choice-UkVI5yuv.js";
2
2
  import { createComponent, mergeProps } from "solid-js/web";
3
3
  //#region src/combobox.tsx
4
4
  function Combobox(props) {
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import { a as e, c as t, i as n, l as r, n as i, o as a, r as o, s } from "./cal
2
2
  import { t as c } from "./utils-oKxhg9RG.js";
3
3
  import { t as l } from "./direction-CS85IDNU.js";
4
4
  import { DatePicker as u } from "./date-picker.js";
5
- import { t as d } from "./time-picker-BlMWCQwk.js";
5
+ import { t as d } from "./time-picker-BWz2wQUk.js";
6
6
  import { DateRangePicker as f } from "./date-range-picker.js";
7
7
  import { MonthPicker as p } from "./month-picker.js";
8
8
  import { Input as m, InputGroup as h } from "./input.js";
@@ -1 +1 @@
1
- {"version":3,"file":"choice.d.ts","sourceRoot":"","sources":["../../src/internal/choice.tsx"],"names":[],"mappings":"AAGA,OAAO,EAUL,KAAK,GAAG,EACT,MAAM,UAAU,CAAC;AAMlB,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAC;AAEzB;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,oEAAoE;IACpE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3D,+FAA+F;IAC/F,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC9C,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gEAAgE;IAChE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,WAAW,CAAC,CAAC;IAC9D,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,eAAe,eA+d5D"}
1
+ {"version":3,"file":"choice.d.ts","sourceRoot":"","sources":["../../src/internal/choice.tsx"],"names":[],"mappings":"AAGA,OAAO,EAUL,KAAK,GAAG,EACT,MAAM,UAAU,CAAC;AAMlB,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAC;AAEzB;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,oEAAoE;IACpE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3D,+FAA+F;IAC/F,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC9C,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gEAAgE;IAChE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,WAAW,CAAC,CAAC;IAC9D,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,eAAe,eA4d5D"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "./choice-CTNeFOVo.js";
1
+ import { t as e } from "./choice-DwhbztEw.js";
2
2
  import { createComponent as t, mergeProps as n } from "solid-js/web";
3
3
  //#region src/select-picker.tsx
4
4
  function r(r) {
@@ -1,4 +1,4 @@
1
- import { t as Choice } from "./assets/choice-DPmk9AHn.js";
1
+ import { t as Choice } from "./assets/choice-UkVI5yuv.js";
2
2
  import { createComponent, mergeProps } from "solid-js/web";
3
3
  //#region src/select-picker.tsx
4
4
  function SelectPicker(props) {
@@ -1,4 +1,4 @@
1
- import { t as e } from "./choice-CTNeFOVo.js";
1
+ import { t as e } from "./choice-DwhbztEw.js";
2
2
  import { createMemo as t, createSignal as n, splitProps as r } from "solid-js";
3
3
  import { createComponent as i, getNextElement as a, mergeProps as o, template as s } from "solid-js/web";
4
4
  //#region src/time-only.ts
@@ -110,4 +110,4 @@ function y(a) {
110
110
  //#endregion
111
111
  export { y as t };
112
112
 
113
- //# sourceMappingURL=time-picker-BlMWCQwk.js.map
113
+ //# sourceMappingURL=time-picker-BWz2wQUk.js.map
@@ -1 +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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"}
1
+ {"version":3,"file":"time-picker-BWz2wQUk.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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"}
@@ -1,2 +1,2 @@
1
- import { t as e } from "./time-picker-BlMWCQwk.js";
1
+ import { t as e } from "./time-picker-BWz2wQUk.js";
2
2
  export { e as TimePicker };
@@ -1,4 +1,4 @@
1
- import { t as Choice } from "./assets/choice-DPmk9AHn.js";
1
+ import { t as Choice } from "./assets/choice-UkVI5yuv.js";
2
2
  import { createMemo, createSignal, splitProps } from "solid-js";
3
3
  import { createComponent, mergeProps as mergeProps$1, ssr, ssrHydrationKey } from "solid-js/web";
4
4
  //#region src/time-only.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devslab/dds-solid",
3
- "version": "0.25.0",
3
+ "version": "0.26.0",
4
4
  "description": "Accessible SolidJS primitives for the DevsLab Design System",
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -134,9 +134,9 @@
134
134
  },
135
135
  "dependencies": {
136
136
  "@ark-ui/solid": "5.39.3",
137
- "@devslab/dds-css": "0.25.0",
138
- "@devslab/dds-icons": "0.25.0",
139
- "@devslab/dds-tokens": "0.25.0",
137
+ "@devslab/dds-css": "0.26.0",
138
+ "@devslab/dds-icons": "0.26.0",
139
+ "@devslab/dds-tokens": "0.26.0",
140
140
  "@tanstack/solid-virtual": "3.13.48",
141
141
  "@zag-js/aria-hidden": "1.45.0",
142
142
  "@zag-js/focus-trap": "1.45.0"
@@ -1 +0,0 @@
1
- {"version":3,"file":"choice-DPmk9AHn.js","names":["Combobox","C","createListCollection","Select","S","Portal","createEffect","createMemo","createSignal","createUniqueId","For","onCleanup","onMount","Show","untrack","JSX","createVirtualizer","defaultRangeExtractor","Range","choiceMessages","choiceWarningsEnabled","validateOptions","ChoiceOption","ComboboxProps","ChoiceInternals","searchable","matchItem","item","query","commitDraft","text","triggerContent","Element","rootClass","invalid","autoHighlight","centerSelected","inputMode","HTMLAttributes","HTMLInputElement","onFormReset","Choice","props","id","internal","setInternal","defaultValue","value","label","items","find","selectedOption","draft","setDraft","defaultInputValue","inputValue","open","setOpen","highlight","setHighlight","visible","HTMLButtonElement","validation","scroll","setScroll","HTMLDivElement","portalMount","setPortalMount","HTMLElement","closest","ownerDocument","body","composing","consumedOnBlur","pendingRestore","from","to","resolveLabel","blocked","disabled","readOnly","messages","setInput","next","undefined","onInputValueChange","restoreInput","current","setValue","onValueChange","some","console","warn","JSON","stringify","previousSelection","associatedForm","form","getElementById","HTMLFormElement","reset","event","Event","setTimeout","defaultPrevented","resetValue","resetLabel","addEventListener","removeEventListener","filterMode","filter","toLocaleLowerCase","includes","collection","itemToString","itemToValue","isItemDisabled","virtual","virtualization","height","configured","itemHeight","Number","isFinite","Math","max","activeIndex","findIndex","virtualizer","count","length","getScrollElement","estimateSize","overscan","enabled","initialRect","width","rangeExtractor","active","range","indexes","push","sort","a","b","opened","scrollToIndex","align","content","frame","requestAnimationFrame","selected","querySelector","list","getBoundingClientRect","row","scrollTop","top","clientHeight","cancelAnimationFrame","Parts","rows","result","getVirtualItems","map","index","start","_","status","loading","error","empty","rootProps","onOpenChange","details","onHighlightChange","highlightedValue","scrollToIndexFn","positioning","placement","const","sameWidth","gutter","strategy","matches","hideWhenDetached","inputProps","reason","stale","activeElement","selectionBehavior","inputBehavior","_$createComponent","Root","_$mergeProps","class","_$memo","data-label-placement","labelPlacement","data-has-value","children","when","Label","onClick","focus","Control","Input","aria-label","aria-labelledby","aria-describedby","aria-required","required","placeholder","onCompositionStart","onCompositionEnd","onKeyDown","key","preventDefault","stopPropagation","onBlur","currentTarget","Trigger","_$ssr","_tmpl$5","_$ssrHydrationKey","_$escape","clearable","_tmpl$","_$ssrAttribute","clear","_tmpl$2","_$ssrStyleProperty","name","_tmpl$4","onRetry","_tmpl$3","retry","mount","Positioner","Content","style","overflow","_tmpl$6","_$ssrStyle","getTotalSize","position","each","Item","aria-posinset","aria-setsize","left","transform","ItemText","description","_tmpl$7"],"sources":["../../src/internal/choice.tsx"],"sourcesContent":["import { Combobox as C, createListCollection } from \"@ark-ui/solid/combobox\";\nimport { Select as S } from \"@ark-ui/solid/select\";\nimport { Portal } from \"solid-js/web\";\nimport {\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n onCleanup,\n onMount,\n Show,\n untrack,\n type JSX,\n} from \"solid-js\";\nimport {\n createVirtualizer,\n defaultRangeExtractor,\n type Range,\n} from \"@tanstack/solid-virtual\";\nimport {\n choiceMessages,\n choiceWarningsEnabled,\n validateOptions,\n type ChoiceOption,\n type ComboboxProps,\n} from \"../choice-types\";\n\n/**\n * Options for DDS components built on Choice (TimePicker). They are not part\n * of the public Combobox/SelectPicker props; every default keeps the existing\n * Combobox and SelectPicker behavior.\n */\nexport interface ChoiceInternals {\n searchable: boolean;\n /** Replaces the default case-insensitive label substring filter. */\n matchItem?: (item: ChoiceOption, query: string) => boolean;\n /** On blur, the value the typed text stands for, \"\" to clear, or null to restore the label. */\n commitDraft?: (text: string) => string | null;\n /** Content of the searchable trigger button (default \"⌄\"). */\n triggerContent?: () => JSX.Element;\n rootClass?: string;\n invalid?: boolean;\n /** Highlight the first match while typing so Enter picks it. */\n autoHighlight?: boolean;\n /** Scroll the selected option to the middle of the list when it opens. */\n centerSelected?: boolean;\n inputMode?: JSX.HTMLAttributes<HTMLInputElement>[\"inputMode\"];\n /** Called before a native form reset restores the value. */\n onFormReset?: () => void;\n}\n\nexport function Choice(props: ComboboxProps & ChoiceInternals) {\n const id = createUniqueId();\n const [internal, setInternal] = createSignal(props.defaultValue ?? \"\");\n const value = () => props.value ?? internal();\n const label = createMemo(\n () =>\n props.items.find((item) => item.value === value())?.label ??\n (props.selectedOption?.value === value()\n ? props.selectedOption.label\n : value()),\n );\n const [draft, setDraft] = createSignal(props.defaultInputValue ?? label());\n const inputValue = () => props.inputValue ?? draft();\n const [open, setOpen] = createSignal(false),\n [highlight, setHighlight] = createSignal<string | null>(null);\n let visible: HTMLInputElement | HTMLButtonElement | undefined,\n validation: HTMLInputElement | undefined;\n const [scroll, setScroll] = createSignal<HTMLDivElement | null>(null);\n const [portalMount, setPortalMount] = createSignal<HTMLElement>();\n onMount(() => {\n // Preserve the enclosing modal's isolation boundary for nested options.\n if (visible)\n setPortalMount(\n visible.closest<HTMLElement>('[role=\"dialog\"], [role=\"alertdialog\"]') ??\n visible.ownerDocument.body,\n );\n });\n let composing = false;\n let consumedOnBlur: string | null = null;\n let pendingRestore: { from: string; to: string } | null = null;\n const resolveLabel = (id: string) =>\n props.items.find((item) => item.value === id)?.label ??\n (props.selectedOption?.value === id ? props.selectedOption.label : id);\n const blocked = () => props.disabled || props.readOnly;\n const messages = () => ({ ...choiceMessages, ...props.messages });\n const setInput = (next: string) => {\n if (pendingRestore?.from === inputValue() && pendingRestore.to === next)\n return;\n pendingRestore = null;\n if (props.inputValue === undefined) setDraft(next);\n props.onInputValueChange?.(next);\n };\n const restoreInput = (next: string) => {\n const current = inputValue();\n if (next === current) return;\n if (pendingRestore?.from === current && pendingRestore.to === next) return;\n pendingRestore = { from: current, to: next };\n if (props.inputValue === undefined) setDraft(next);\n else props.onInputValueChange?.(next);\n };\n const setValue = (next: string) => {\n if (props.value === undefined) setInternal(next);\n props.onValueChange?.(next);\n };\n createEffect(() => {\n validateOptions(props.items);\n });\n createEffect(() => {\n if (\n choiceWarningsEnabled() &&\n value() &&\n !props.items.some((item) => item.value === value()) &&\n props.selectedOption?.value !== value()\n )\n console.warn(\n `DDS choice: no label supplied for selected ID ${JSON.stringify(value())}; pass selectedOption when the selection is outside items.`,\n );\n });\n let previousSelection = { value: value(), label: label() };\n createEffect(() => {\n const current = { value: value(), label: label() };\n if (\n previousSelection.value !== current.value ||\n previousSelection.label !== current.label\n ) {\n previousSelection = current;\n untrack(() => restoreInput(current.label));\n }\n });\n createEffect(() => {\n const associatedForm = props.form;\n const form = associatedForm\n ? (validation?.ownerDocument.getElementById(\n associatedForm,\n ) as HTMLFormElement | null)\n : validation?.form;\n if (!form) return;\n // A task, not a microtask: after a reset-button click, microtasks run\n // before the browser resets the controls and would be overwritten.\n const reset = (event: Event) =>\n setTimeout(() => {\n if (event.defaultPrevented) return;\n props.onFormReset?.();\n const resetValue = props.value ?? props.defaultValue ?? \"\";\n const resetLabel = resolveLabel(resetValue);\n previousSelection = { value: resetValue, label: resetLabel };\n if (props.value === undefined) setInternal(resetValue);\n restoreInput(props.defaultInputValue ?? resetLabel);\n setOpen(false);\n if (visible instanceof HTMLInputElement) visible.value = inputValue();\n if (validation) validation.value = value();\n });\n form.addEventListener(\"reset\", reset);\n onCleanup(() => form.removeEventListener(\"reset\", reset));\n });\n const items = createMemo(() =>\n props.searchable &&\n props.filterMode !== \"external\" &&\n inputValue() !== label()\n ? props.items.filter((item) =>\n props.matchItem\n ? props.matchItem(item, inputValue())\n : item.label\n .toLocaleLowerCase()\n .includes(inputValue().toLocaleLowerCase()),\n )\n : props.items,\n );\n const collection = createMemo(() =>\n createListCollection({\n items: items(),\n itemToString: (item) => item.label,\n itemToValue: (item) => item.value,\n isItemDisabled: (item) => !!item.disabled,\n }),\n );\n const virtual = () => !!props.virtualization;\n const height = () => {\n const configured = props.virtualization\n ? props.virtualization.itemHeight\n : undefined;\n return Number.isFinite(configured) ? Math.max(40, configured!) : 40;\n };\n const activeIndex = () =>\n items().findIndex((item) => item.value === highlight());\n const virtualizer = createVirtualizer<HTMLDivElement, HTMLDivElement>({\n get count() {\n return items().length;\n },\n getScrollElement: scroll,\n estimateSize: height,\n get overscan() {\n return props.virtualization ? (props.virtualization.overscan ?? 5) : 5;\n },\n get enabled() {\n return virtual() && open();\n },\n initialRect: { width: 0, height: 320 },\n get rangeExtractor() {\n const active = activeIndex();\n return (range: Range) => {\n const indexes = defaultRangeExtractor(range);\n if (active >= 0 && !indexes.includes(active)) indexes.push(active);\n return indexes.sort((a, b) => a - b);\n };\n },\n });\n createEffect(() => {\n items();\n const opened = open();\n setHighlight(null);\n if (virtual() && opened)\n virtualizer.scrollToIndex(\n Math.max(\n 0,\n items().findIndex((item) => item.value === value()),\n ),\n { align: props.centerSelected ? \"center\" : \"auto\" },\n );\n });\n createEffect(() => {\n const content = scroll();\n if (!props.centerSelected || !open() || virtual() || !content) return;\n // Ark only scrolls the highlighted option to the nearest edge.\n const frame = requestAnimationFrame(() => {\n const selected = content.querySelector<HTMLElement>(\n '[data-part=\"item\"][data-state=\"checked\"]',\n );\n if (!selected) return;\n const list = content.getBoundingClientRect(),\n row = selected.getBoundingClientRect();\n content.scrollTop +=\n row.top - list.top - (content.clientHeight - row.height) / 2;\n });\n onCleanup(() => cancelAnimationFrame(frame));\n });\n const Parts = props.searchable ? C : S;\n const rows = createMemo(() => {\n const result = virtual()\n ? virtualizer\n .getVirtualItems()\n .map((row) => ({ index: row.index, start: row.start }))\n : items().map((_, index) => ({ index, start: 0 }));\n const active = activeIndex();\n if (virtual() && active >= 0 && !result.some((row) => row.index === active))\n result.push({ index: active, start: active * height() });\n return result;\n });\n const status = () =>\n props.loading\n ? messages().loading\n : props.error\n ? typeof props.error === \"string\"\n ? props.error\n : messages().error\n : items().length === 0\n ? messages().empty\n : \"\";\n const rootProps = {\n get collection() {\n return collection();\n },\n get value() {\n return value() ? [value()] : [];\n },\n get open() {\n return open() && !blocked();\n },\n get disabled() {\n return props.disabled;\n },\n get readOnly() {\n return props.readOnly;\n },\n get invalid() {\n return props.invalid;\n },\n onOpenChange: (details: { open: boolean }) => {\n if (!blocked()) setOpen(details.open);\n },\n onValueChange: (details: { value: string[] }) => {\n if (blocked() || composing) return;\n const next = details.value[0] ?? \"\";\n if (next !== value()) setValue(next);\n },\n onHighlightChange: (details: { highlightedValue: string | null }) =>\n setHighlight(details.highlightedValue),\n get scrollToIndexFn() {\n return virtual()\n ? ({ index }: { index: number }) =>\n virtualizer.scrollToIndex(index, { align: \"auto\" })\n : undefined;\n },\n get positioning() {\n return {\n placement: \"bottom-start\" as const,\n sameWidth: true,\n gutter: 4,\n strategy: portalMount()?.matches(\n '[role=\"dialog\"], [role=\"alertdialog\"]',\n )\n ? (\"fixed\" as const)\n : (\"absolute\" as const),\n hideWhenDetached: !!portalMount()?.matches(\n '[role=\"dialog\"], [role=\"alertdialog\"]',\n ),\n };\n },\n };\n const inputProps = props.searchable\n ? {\n get inputValue() {\n return inputValue();\n },\n onInputValueChange: (details: {\n inputValue: string;\n reason?: string | undefined;\n }) => {\n // Ark reports a keystroke after the blur that already committed it.\n const stale =\n consumedOnBlur === details.inputValue &&\n details.reason === \"input-change\" &&\n visible?.ownerDocument.activeElement !== visible;\n consumedOnBlur = null;\n if (stale) return;\n if (!blocked() && details.inputValue !== inputValue())\n setInput(details.inputValue);\n },\n selectionBehavior: \"preserve\" as const,\n ...(props.autoHighlight\n ? { inputBehavior: \"autohighlight\" as const }\n : {}),\n }\n : {};\n return (\n <Parts.Root\n {...rootProps}\n {...inputProps}\n id={props.id ?? id}\n class={props.rootClass ? `dds-choice ${props.rootClass}` : \"dds-choice\"}\n data-label-placement={props.labelPlacement ?? \"outside\"}\n data-has-value={value() || inputValue() ? \"\" : undefined}\n >\n <Show when={props.label}>\n <Parts.Label class=\"dds-choice-label\" onClick={() => visible?.focus()}>\n {props.label}\n </Parts.Label>\n </Show>\n <Parts.Control class=\"dds-choice-control\">\n <Show when={props.searchable}>\n <C.Input\n ref={(node) => {\n visible = node;\n }}\n class=\"dds-choice-input\"\n aria-label={props[\"aria-label\"]}\n aria-labelledby={props[\"aria-labelledby\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={props.required}\n placeholder={props.placeholder}\n inputMode={props.inputMode}\n onCompositionStart={() => {\n composing = true;\n }}\n onCompositionEnd={() => {\n composing = false;\n }}\n onKeyDown={(event) => {\n if (composing && event.key === \"Enter\") {\n event.preventDefault();\n event.stopPropagation();\n }\n }}\n onBlur={(event) => {\n if (props.commitDraft) {\n // The DOM holds the latest keystroke; Ark's input state may still be queued.\n consumedOnBlur = event.currentTarget.value;\n const next = blocked()\n ? null\n : props.commitDraft(consumedOnBlur);\n if (next !== null && next !== value()) setValue(next);\n restoreInput(label());\n return;\n }\n if (value()) restoreInput(label());\n }}\n />\n </Show>\n <Parts.Trigger\n ref={(node) => {\n if (!props.searchable) visible = node;\n }}\n class=\"dds-choice-trigger\"\n aria-label={props.searchable ? messages().open : props[\"aria-label\"]}\n aria-labelledby={props[\"aria-labelledby\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={props.required}\n >\n {props.searchable ? (\n props.triggerContent ? (\n props.triggerContent()\n ) : (\n \"⌄\"\n )\n ) : (\n <span class=\"dds-choice-value\">\n {label() || props.placeholder || messages().open}\n </span>\n )}\n </Parts.Trigger>\n <Show when={props.clearable && !blocked() && (value() || inputValue())}>\n <button\n class=\"dds-choice-clear\"\n type=\"button\"\n aria-label={messages().clear}\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => {\n setValue(\"\");\n setInput(\"\");\n setOpen(false);\n visible?.focus();\n }}\n >\n ×\n </button>\n </Show>\n </Parts.Control>\n <input\n ref={validation}\n class=\"dds-choice-validation\"\n style={{\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n padding: \"0\",\n border: \"0\",\n \"clip-path\": \"inset(50%)\",\n overflow: \"hidden\",\n \"white-space\": \"nowrap\",\n }}\n tabIndex={-1}\n aria-hidden=\"true\"\n name={props.name}\n form={props.form}\n value={value()}\n required={props.required}\n disabled={props.disabled}\n onInput={(event) => {\n event.currentTarget.value = value();\n }}\n onInvalid={(event) => {\n event.preventDefault();\n visible?.focus();\n }}\n />\n <div class=\"dds-choice-status\" role=\"status\" aria-live=\"polite\">\n {status()}\n <Show when={props.error && props.onRetry}>\n <button\n class=\"dds-choice-retry\"\n type=\"button\"\n onClick={() => props.onRetry?.()}\n >\n {messages().retry}\n </button>\n </Show>\n </div>\n <Show when={portalMount()}>\n {(mount) => (\n <Portal mount={mount()}>\n <Parts.Positioner class=\"dds-choice-positioner\">\n <Parts.Content\n ref={setScroll}\n class=\"dds-choice-content\"\n style={{\n \"max-height\": \"min(320px, var(--available-height, 320px))\",\n overflow: \"auto\",\n }}\n >\n <div\n style={\n virtual()\n ? {\n height: `${virtualizer.getTotalSize()}px`,\n position: \"relative\",\n }\n : undefined\n }\n >\n <For each={rows()}>\n {(row) => {\n const item = () => items()[row.index]!;\n return (\n <Parts.Item\n item={item()}\n class=\"dds-choice-item\"\n aria-posinset={row.index + 1}\n aria-setsize={items().length}\n style={\n virtual()\n ? {\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n width: \"100%\",\n height: `${height()}px`,\n transform: `translateY(${row.start}px)`,\n }\n : undefined\n }\n >\n <Parts.ItemText>{item().label}</Parts.ItemText>\n <Show when={item().description}>\n <span class=\"dds-choice-description\">\n {item().description}\n </span>\n </Show>\n </Parts.Item>\n );\n }}\n </For>\n </div>\n </Parts.Content>\n </Parts.Positioner>\n </Portal>\n )}\n </Show>\n </Parts.Root>\n );\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"choice-CTNeFOVo.js","names":["Combobox","C","createListCollection","Select","S","Portal","createEffect","createMemo","createSignal","createUniqueId","For","onCleanup","onMount","Show","untrack","JSX","createVirtualizer","defaultRangeExtractor","Range","choiceMessages","choiceWarningsEnabled","validateOptions","ChoiceOption","ComboboxProps","ChoiceInternals","searchable","matchItem","item","query","commitDraft","text","triggerContent","Element","rootClass","invalid","autoHighlight","centerSelected","inputMode","HTMLAttributes","HTMLInputElement","onFormReset","Choice","props","id","internal","setInternal","defaultValue","value","label","items","find","selectedOption","draft","setDraft","defaultInputValue","inputValue","open","setOpen","highlight","setHighlight","visible","HTMLButtonElement","validation","scroll","setScroll","HTMLDivElement","portalMount","setPortalMount","HTMLElement","closest","ownerDocument","body","composing","consumedOnBlur","pendingRestore","from","to","resolveLabel","blocked","disabled","readOnly","messages","setInput","next","undefined","onInputValueChange","restoreInput","current","setValue","onValueChange","some","console","warn","JSON","stringify","previousSelection","associatedForm","form","getElementById","HTMLFormElement","reset","event","Event","setTimeout","defaultPrevented","resetValue","resetLabel","addEventListener","removeEventListener","filterMode","filter","toLocaleLowerCase","includes","collection","itemToString","itemToValue","isItemDisabled","virtual","virtualization","height","configured","itemHeight","Number","isFinite","Math","max","activeIndex","findIndex","virtualizer","count","length","getScrollElement","estimateSize","overscan","enabled","initialRect","width","rangeExtractor","active","range","indexes","push","sort","a","b","opened","scrollToIndex","align","content","frame","requestAnimationFrame","selected","querySelector","list","getBoundingClientRect","row","scrollTop","top","clientHeight","cancelAnimationFrame","Parts","rows","result","getVirtualItems","map","index","start","_","status","loading","error","empty","rootProps","onOpenChange","details","onHighlightChange","highlightedValue","scrollToIndexFn","positioning","placement","const","sameWidth","gutter","strategy","matches","hideWhenDetached","inputProps","reason","stale","activeElement","selectionBehavior","inputBehavior","_$createComponent","Root","_$mergeProps","class","_$memo","data-label-placement","labelPlacement","data-has-value","children","when","Label","onClick","focus","Control","Input","ref","node","aria-label","aria-labelledby","aria-describedby","aria-required","required","placeholder","onCompositionStart","onCompositionEnd","onKeyDown","key","preventDefault","stopPropagation","onBlur","currentTarget","Trigger","_el$9","_$getNextElement","_tmpl$5","_$insert","clearable","_el$","_tmpl$","$$click","$$pointerdown","_$effect","_$setAttribute","clear","_$runHydrationEvents","_el$2","_tmpl$2","$$input","_ref$","_$use","_p$","_v$","name","_v$2","_v$3","_v$4","e","t","_$setProperty","o","_el$3","_tmpl$4","_el$5","firstChild","_el$6","_co$","_$getNextMarker","nextSibling","_el$7","_el$8","_co$2","onRetry","_el$4","_tmpl$3","retry","mount","Positioner","Content","style","overflow","_el$0","_tmpl$6","each","Item","aria-posinset","aria-setsize","position","left","transform","ItemText","description","_el$1","_tmpl$7","_$p","_$style","getTotalSize","_$delegateEvents"],"sources":["../src/internal/choice.tsx"],"sourcesContent":["import { Combobox as C, createListCollection } from \"@ark-ui/solid/combobox\";\nimport { Select as S } from \"@ark-ui/solid/select\";\nimport { Portal } from \"solid-js/web\";\nimport {\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n onCleanup,\n onMount,\n Show,\n untrack,\n type JSX,\n} from \"solid-js\";\nimport {\n createVirtualizer,\n defaultRangeExtractor,\n type Range,\n} from \"@tanstack/solid-virtual\";\nimport {\n choiceMessages,\n choiceWarningsEnabled,\n validateOptions,\n type ChoiceOption,\n type ComboboxProps,\n} from \"../choice-types\";\n\n/**\n * Options for DDS components built on Choice (TimePicker). They are not part\n * of the public Combobox/SelectPicker props; every default keeps the existing\n * Combobox and SelectPicker behavior.\n */\nexport interface ChoiceInternals {\n searchable: boolean;\n /** Replaces the default case-insensitive label substring filter. */\n matchItem?: (item: ChoiceOption, query: string) => boolean;\n /** On blur, the value the typed text stands for, \"\" to clear, or null to restore the label. */\n commitDraft?: (text: string) => string | null;\n /** Content of the searchable trigger button (default \"⌄\"). */\n triggerContent?: () => JSX.Element;\n rootClass?: string;\n invalid?: boolean;\n /** Highlight the first match while typing so Enter picks it. */\n autoHighlight?: boolean;\n /** Scroll the selected option to the middle of the list when it opens. */\n centerSelected?: boolean;\n inputMode?: JSX.HTMLAttributes<HTMLInputElement>[\"inputMode\"];\n /** Called before a native form reset restores the value. */\n onFormReset?: () => void;\n}\n\nexport function Choice(props: ComboboxProps & ChoiceInternals) {\n const id = createUniqueId();\n const [internal, setInternal] = createSignal(props.defaultValue ?? \"\");\n const value = () => props.value ?? internal();\n const label = createMemo(\n () =>\n props.items.find((item) => item.value === value())?.label ??\n (props.selectedOption?.value === value()\n ? props.selectedOption.label\n : value()),\n );\n const [draft, setDraft] = createSignal(props.defaultInputValue ?? label());\n const inputValue = () => props.inputValue ?? draft();\n const [open, setOpen] = createSignal(false),\n [highlight, setHighlight] = createSignal<string | null>(null);\n let visible: HTMLInputElement | HTMLButtonElement | undefined,\n validation: HTMLInputElement | undefined;\n const [scroll, setScroll] = createSignal<HTMLDivElement | null>(null);\n const [portalMount, setPortalMount] = createSignal<HTMLElement>();\n onMount(() => {\n // Preserve the enclosing modal's isolation boundary for nested options.\n if (visible)\n setPortalMount(\n visible.closest<HTMLElement>('[role=\"dialog\"], [role=\"alertdialog\"]') ??\n visible.ownerDocument.body,\n );\n });\n let composing = false;\n let consumedOnBlur: string | null = null;\n let pendingRestore: { from: string; to: string } | null = null;\n const resolveLabel = (id: string) =>\n props.items.find((item) => item.value === id)?.label ??\n (props.selectedOption?.value === id ? props.selectedOption.label : id);\n const blocked = () => props.disabled || props.readOnly;\n const messages = () => ({ ...choiceMessages, ...props.messages });\n const setInput = (next: string) => {\n if (pendingRestore?.from === inputValue() && pendingRestore.to === next)\n return;\n pendingRestore = null;\n if (props.inputValue === undefined) setDraft(next);\n props.onInputValueChange?.(next);\n };\n const restoreInput = (next: string) => {\n const current = inputValue();\n if (next === current) return;\n if (pendingRestore?.from === current && pendingRestore.to === next) return;\n pendingRestore = { from: current, to: next };\n if (props.inputValue === undefined) setDraft(next);\n else props.onInputValueChange?.(next);\n };\n const setValue = (next: string) => {\n if (props.value === undefined) setInternal(next);\n props.onValueChange?.(next);\n };\n createEffect(() => {\n validateOptions(props.items);\n });\n createEffect(() => {\n if (\n choiceWarningsEnabled() &&\n value() &&\n !props.items.some((item) => item.value === value()) &&\n props.selectedOption?.value !== value()\n )\n console.warn(\n `DDS choice: no label supplied for selected ID ${JSON.stringify(value())}; pass selectedOption when the selection is outside items.`,\n );\n });\n let previousSelection = { value: value(), label: label() };\n createEffect(() => {\n const current = { value: value(), label: label() };\n if (\n previousSelection.value !== current.value ||\n previousSelection.label !== current.label\n ) {\n previousSelection = current;\n untrack(() => restoreInput(current.label));\n }\n });\n createEffect(() => {\n const associatedForm = props.form;\n const form = associatedForm\n ? (validation?.ownerDocument.getElementById(\n associatedForm,\n ) as HTMLFormElement | null)\n : validation?.form;\n if (!form) return;\n // A task, not a microtask: after a reset-button click, microtasks run\n // before the browser resets the controls and would be overwritten.\n const reset = (event: Event) =>\n setTimeout(() => {\n if (event.defaultPrevented) return;\n props.onFormReset?.();\n const resetValue = props.value ?? props.defaultValue ?? \"\";\n const resetLabel = resolveLabel(resetValue);\n previousSelection = { value: resetValue, label: resetLabel };\n if (props.value === undefined) setInternal(resetValue);\n restoreInput(props.defaultInputValue ?? resetLabel);\n setOpen(false);\n if (visible instanceof HTMLInputElement) visible.value = inputValue();\n if (validation) validation.value = value();\n });\n form.addEventListener(\"reset\", reset);\n onCleanup(() => form.removeEventListener(\"reset\", reset));\n });\n const items = createMemo(() =>\n props.searchable &&\n props.filterMode !== \"external\" &&\n inputValue() !== label()\n ? props.items.filter((item) =>\n props.matchItem\n ? props.matchItem(item, inputValue())\n : item.label\n .toLocaleLowerCase()\n .includes(inputValue().toLocaleLowerCase()),\n )\n : props.items,\n );\n const collection = createMemo(() =>\n createListCollection({\n items: items(),\n itemToString: (item) => item.label,\n itemToValue: (item) => item.value,\n isItemDisabled: (item) => !!item.disabled,\n }),\n );\n const virtual = () => !!props.virtualization;\n const height = () => {\n const configured = props.virtualization\n ? props.virtualization.itemHeight\n : undefined;\n return Number.isFinite(configured) ? Math.max(40, configured!) : 40;\n };\n const activeIndex = () =>\n items().findIndex((item) => item.value === highlight());\n const virtualizer = createVirtualizer<HTMLDivElement, HTMLDivElement>({\n get count() {\n return items().length;\n },\n getScrollElement: scroll,\n estimateSize: height,\n get overscan() {\n return props.virtualization ? (props.virtualization.overscan ?? 5) : 5;\n },\n get enabled() {\n return virtual() && open();\n },\n initialRect: { width: 0, height: 320 },\n get rangeExtractor() {\n const active = activeIndex();\n return (range: Range) => {\n const indexes = defaultRangeExtractor(range);\n if (active >= 0 && !indexes.includes(active)) indexes.push(active);\n return indexes.sort((a, b) => a - b);\n };\n },\n });\n createEffect(() => {\n items();\n const opened = open();\n setHighlight(null);\n if (virtual() && opened)\n virtualizer.scrollToIndex(\n Math.max(\n 0,\n items().findIndex((item) => item.value === value()),\n ),\n { align: props.centerSelected ? \"center\" : \"auto\" },\n );\n });\n createEffect(() => {\n const content = scroll();\n if (!props.centerSelected || !open() || virtual() || !content) return;\n // Ark only scrolls the highlighted option to the nearest edge.\n const frame = requestAnimationFrame(() => {\n const selected = content.querySelector<HTMLElement>(\n '[data-part=\"item\"][data-state=\"checked\"]',\n );\n if (!selected) return;\n const list = content.getBoundingClientRect(),\n row = selected.getBoundingClientRect();\n content.scrollTop +=\n row.top - list.top - (content.clientHeight - row.height) / 2;\n });\n onCleanup(() => cancelAnimationFrame(frame));\n });\n const Parts = props.searchable ? C : S;\n const rows = createMemo(() => {\n const result = virtual()\n ? virtualizer\n .getVirtualItems()\n .map((row) => ({ index: row.index, start: row.start }))\n : items().map((_, index) => ({ index, start: 0 }));\n const active = activeIndex();\n if (virtual() && active >= 0 && !result.some((row) => row.index === active))\n result.push({ index: active, start: active * height() });\n return result;\n });\n const status = () =>\n props.loading\n ? messages().loading\n : props.error\n ? typeof props.error === \"string\"\n ? props.error\n : messages().error\n : items().length === 0\n ? messages().empty\n : \"\";\n const rootProps = {\n get collection() {\n return collection();\n },\n get value() {\n return value() ? [value()] : [];\n },\n get open() {\n return open() && !blocked();\n },\n get disabled() {\n return props.disabled;\n },\n get readOnly() {\n return props.readOnly;\n },\n get invalid() {\n return props.invalid;\n },\n onOpenChange: (details: { open: boolean }) => {\n if (!blocked()) setOpen(details.open);\n },\n onValueChange: (details: { value: string[] }) => {\n if (blocked() || composing) return;\n const next = details.value[0] ?? \"\";\n if (next !== value()) setValue(next);\n },\n onHighlightChange: (details: { highlightedValue: string | null }) =>\n setHighlight(details.highlightedValue),\n get scrollToIndexFn() {\n return virtual()\n ? ({ index }: { index: number }) =>\n virtualizer.scrollToIndex(index, { align: \"auto\" })\n : undefined;\n },\n get positioning() {\n return {\n placement: \"bottom-start\" as const,\n sameWidth: true,\n gutter: 4,\n strategy: portalMount()?.matches(\n '[role=\"dialog\"], [role=\"alertdialog\"]',\n )\n ? (\"fixed\" as const)\n : (\"absolute\" as const),\n hideWhenDetached: !!portalMount()?.matches(\n '[role=\"dialog\"], [role=\"alertdialog\"]',\n ),\n };\n },\n };\n const inputProps = props.searchable\n ? {\n get inputValue() {\n return inputValue();\n },\n onInputValueChange: (details: {\n inputValue: string;\n reason?: string | undefined;\n }) => {\n // Ark reports a keystroke after the blur that already committed it.\n const stale =\n consumedOnBlur === details.inputValue &&\n details.reason === \"input-change\" &&\n visible?.ownerDocument.activeElement !== visible;\n consumedOnBlur = null;\n if (stale) return;\n if (!blocked() && details.inputValue !== inputValue())\n setInput(details.inputValue);\n },\n selectionBehavior: \"preserve\" as const,\n ...(props.autoHighlight\n ? { inputBehavior: \"autohighlight\" as const }\n : {}),\n }\n : {};\n return (\n <Parts.Root\n {...rootProps}\n {...inputProps}\n id={props.id ?? id}\n class={props.rootClass ? `dds-choice ${props.rootClass}` : \"dds-choice\"}\n data-label-placement={props.labelPlacement ?? \"outside\"}\n data-has-value={value() || inputValue() ? \"\" : undefined}\n >\n <Show when={props.label}>\n <Parts.Label class=\"dds-choice-label\" onClick={() => visible?.focus()}>\n {props.label}\n </Parts.Label>\n </Show>\n <Parts.Control class=\"dds-choice-control\">\n <Show when={props.searchable}>\n <C.Input\n ref={(node) => {\n visible = node;\n }}\n class=\"dds-choice-input\"\n aria-label={props[\"aria-label\"]}\n aria-labelledby={props[\"aria-labelledby\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={props.required}\n placeholder={props.placeholder}\n inputMode={props.inputMode}\n onCompositionStart={() => {\n composing = true;\n }}\n onCompositionEnd={() => {\n composing = false;\n }}\n onKeyDown={(event) => {\n if (composing && event.key === \"Enter\") {\n event.preventDefault();\n event.stopPropagation();\n }\n }}\n onBlur={(event) => {\n if (props.commitDraft) {\n // The DOM holds the latest keystroke; Ark's input state may still be queued.\n consumedOnBlur = event.currentTarget.value;\n const next = blocked()\n ? null\n : props.commitDraft(consumedOnBlur);\n if (next !== null && next !== value()) setValue(next);\n restoreInput(label());\n return;\n }\n if (value()) restoreInput(label());\n }}\n />\n </Show>\n <Parts.Trigger\n ref={(node) => {\n if (!props.searchable) visible = node;\n }}\n class=\"dds-choice-trigger\"\n aria-label={props.searchable ? messages().open : props[\"aria-label\"]}\n aria-labelledby={props[\"aria-labelledby\"]}\n aria-describedby={props[\"aria-describedby\"]}\n aria-required={props.required}\n >\n {props.searchable ? (\n props.triggerContent ? (\n props.triggerContent()\n ) : (\n \"⌄\"\n )\n ) : (\n <span class=\"dds-choice-value\">\n {label() || props.placeholder || messages().open}\n </span>\n )}\n </Parts.Trigger>\n <Show when={props.clearable && !blocked() && (value() || inputValue())}>\n <button\n class=\"dds-choice-clear\"\n type=\"button\"\n aria-label={messages().clear}\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => {\n setValue(\"\");\n setInput(\"\");\n setOpen(false);\n visible?.focus();\n }}\n >\n ×\n </button>\n </Show>\n </Parts.Control>\n <input\n ref={validation}\n class=\"dds-choice-validation\"\n style={{\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n padding: \"0\",\n border: \"0\",\n \"clip-path\": \"inset(50%)\",\n overflow: \"hidden\",\n \"white-space\": \"nowrap\",\n }}\n tabIndex={-1}\n aria-hidden=\"true\"\n name={props.name}\n form={props.form}\n value={value()}\n required={props.required}\n disabled={props.disabled}\n onInput={(event) => {\n event.currentTarget.value = value();\n }}\n onInvalid={(event) => {\n event.preventDefault();\n visible?.focus();\n }}\n />\n <div class=\"dds-choice-status\" role=\"status\" aria-live=\"polite\">\n {status()}\n <Show when={props.error && props.onRetry}>\n <button\n class=\"dds-choice-retry\"\n type=\"button\"\n onClick={() => props.onRetry?.()}\n >\n {messages().retry}\n </button>\n </Show>\n </div>\n <Show when={portalMount()}>\n {(mount) => (\n <Portal mount={mount()}>\n <Parts.Positioner class=\"dds-choice-positioner\">\n <Parts.Content\n ref={setScroll}\n class=\"dds-choice-content\"\n style={{\n \"max-height\": \"min(320px, var(--available-height, 320px))\",\n overflow: \"auto\",\n }}\n >\n <div\n style={\n virtual()\n ? {\n height: `${virtualizer.getTotalSize()}px`,\n position: \"relative\",\n }\n : undefined\n }\n >\n <For each={rows()}>\n {(row) => {\n const item = () => items()[row.index]!;\n return (\n <Parts.Item\n item={item()}\n class=\"dds-choice-item\"\n aria-posinset={row.index + 1}\n aria-setsize={items().length}\n style={\n virtual()\n ? {\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n width: \"100%\",\n height: `${height()}px`,\n transform: `translateY(${row.start}px)`,\n }\n : undefined\n }\n >\n <Parts.ItemText>{item().label}</Parts.ItemText>\n <Show when={item().description}>\n <span class=\"dds-choice-description\">\n {item().description}\n </span>\n </Show>\n </Parts.Item>\n );\n }}\n </For>\n </div>\n </Parts.Content>\n </Parts.Positioner>\n </Portal>\n )}\n </Show>\n </Parts.Root>\n );\n}\n"],"mappings":";;;;;;;;AAoDA,SAAgByC,EAAOC,GAAwC;CAC7D,IAAMC,IAAKlC,GAAe,GACpB,CAACmC,GAAUC,KAAerC,EAAakC,EAAMI,gBAAgB,EAAE,GAC/DC,UAAcL,EAAMK,SAASH,EAAS,GACtCI,IAAQzC,QAEVmC,EAAMO,MAAMC,MAAMvB,MAASA,EAAKoB,UAAUA,EAAM,CAAC,CAAC,EAAEC,UACnDN,EAAMS,gBAAgBJ,UAAUA,EAAM,IACnCL,EAAMS,eAAeH,QACrBD,EAAM,EACd,GACM,CAACK,IAAOC,KAAY7C,EAAakC,EAAMY,qBAAqBN,EAAM,CAAC,GACnEO,UAAmBb,EAAMa,cAAcH,GAAM,GAC7C,CAACI,GAAMC,KAAWjD,EAAa,EAAK,GACxC,CAACkD,IAAWC,KAAgBnD,EAA4B,IAAI,GAC1DoD,GACFE,GACI,CAACC,GAAQC,KAAaxD,EAAoC,IAAI,GAC9D,CAAC0D,GAAaC,MAAkB3D,EAA0B;CAChEI,SAAc;EAEZ,AAAIgD,KACFO,GACEP,EAAQS,QAAqB,2CAAuC,KAClET,EAAQU,cAAcC,IAC1B;CACJ,CAAC;CACD,IAAIC,IAAY,IACZC,IAAgC,MAChCC,IAAsD,MACpDG,MAAgBlC,MACpBD,EAAMO,MAAMC,MAAMvB,MAASA,EAAKoB,UAAUJ,CAAE,CAAC,EAAEK,UAC9CN,EAAMS,gBAAgBJ,UAAUJ,IAAKD,EAAMS,eAAeH,QAAQL,IAC/DmC,UAAgBpC,EAAMqC,YAAYrC,EAAMsC,UACxCC,WAAkB;EAAE,GAAG9D;EAAgB,GAAGuB,EAAMuC;CAAS,IACzDC,KAAYC,MAAiB;EAC7BT,IAAgBC,SAASpB,EAAW,KAAKmB,EAAeE,OAAOO,OAEnET,IAAiB,MACbhC,EAAMa,eAAe6B,KAAAA,KAAW/B,EAAS8B,CAAI,GACjDzC,EAAM2C,qBAAqBF,CAAI;CACjC,GACMG,KAAgBH,MAAiB;EACrC,IAAMI,IAAUhC,EAAW;EACvB4B,MAASI,MACTb,GAAgBC,SAASY,KAAWb,EAAeE,OAAOO,OAC9DT,IAAiB;GAAEC,MAAMY;GAASX,IAAIO;EAAK,GACvCzC,EAAMa,eAAe6B,KAAAA,IAAW/B,EAAS8B,CAAI,IAC5CzC,EAAM2C,qBAAqBF,CAAI;CACtC,GACMK,KAAYL,MAAiB;EAEjCzC,AADIA,EAAMK,UAAUqC,KAAAA,KAAWvC,EAAYsC,CAAI,GAC/CzC,EAAM+C,gBAAgBN,CAAI;CAC5B;CAIA7E,AAHAA,QAAmB;EACjBe,EAAgBqB,EAAMO,KAAK;CAC7B,CAAC,GACD3C,QAAmB;EACjB,AACEc,EAAsB,KACtB2B,EAAM,KACN,CAACL,EAAMO,MAAMyC,MAAM/D,MAASA,EAAKoB,UAAUA,EAAM,CAAC,KAClDL,EAAMS,gBAAgBJ,UAAUA,EAAM,KAEtC4C,QAAQC,KACN,iDAAiDC,KAAKC,UAAU/C,EAAM,CAAC,EAAC,2DAC1E;CACJ,CAAC;CACD,IAAIgD,IAAoB;EAAEhD,OAAOA,EAAM;EAAGC,OAAOA,EAAM;CAAE;CAWzD1C,AAVAA,QAAmB;EACjB,IAAMiF,IAAU;GAAExC,OAAOA,EAAM;GAAGC,OAAOA,EAAM;EAAE;EACjD,CACE+C,EAAkBhD,UAAUwC,EAAQxC,SACpCgD,EAAkB/C,UAAUuC,EAAQvC,WAEpC+C,IAAoBR,GACpBzE,SAAcwE,EAAaC,EAAQvC,KAAK,CAAC;CAE7C,CAAC,GACD1C,QAAmB;EACjB,IAAM0F,IAAiBtD,EAAMuD,MACvBA,IAAOD,IACRlC,GAAYQ,cAAc4B,eACzBF,CACF,IACAlC,GAAYmC;EAChB,IAAI,CAACA,GAAM;EAGX,IAAMG,KAASC,MACbE,iBAAiB;GACf,IAAIF,EAAMG,kBAAkB;GAC5B9D,EAAMF,cAAc;GACpB,IAAMiE,IAAa/D,EAAMK,SAASL,EAAMI,gBAAgB,IAClD4D,IAAa7B,GAAa4B,CAAU;GAM1C,AALAV,IAAoB;IAAEhD,OAAO0D;IAAYzD,OAAO0D;GAAW,GACvDhE,EAAMK,UAAUqC,KAAAA,KAAWvC,EAAY4D,CAAU,GACrDnB,EAAa5C,EAAMY,qBAAqBoD,CAAU,GAClDjD,EAAQ,EAAK,GACTG,aAAmBrB,qBAAkBqB,EAAQb,QAAQQ,EAAW,IAChEO,MAAYA,EAAWf,QAAQA,EAAM;EAC3C,CAAC;EAEHpC,AADAsF,EAAKU,iBAAiB,SAASP,CAAK,GACpCzF,QAAgBsF,EAAKW,oBAAoB,SAASR,CAAK,CAAC;CAC1D,CAAC;CACD,IAAMnD,IAAQ1C,QACZmC,EAAMjB,cACNiB,EAAMmE,eAAe,cACrBtD,EAAW,MAAMP,EAAM,IACnBN,EAAMO,MAAM6D,QAAQnF,MAClBe,EAAMhB,YACFgB,EAAMhB,UAAUC,GAAM4B,EAAW,CAAC,IAClC5B,EAAKqB,MACF+D,kBAAkB,CAAC,CACnBC,SAASzD,EAAW,CAAC,CAACwD,kBAAkB,CAAC,CAClD,IACArE,EAAMO,KACZ,GACMgE,KAAa1G,QACjBL,GAAqB;EACnB+C,OAAOA,EAAM;EACbiE,eAAevF,MAASA,EAAKqB;EAC7BmE,cAAcxF,MAASA,EAAKoB;EAC5BqE,iBAAiBzF,MAAS,CAAC,CAACA,EAAKoD;CACnC,CAAC,CACH,GACMsC,UAAgB,CAAC,CAAC3E,EAAM4E,gBACxBC,UAAe;EACnB,IAAMC,IAAa9E,EAAM4E,iBACrB5E,EAAM4E,eAAeG,aACrBrC,KAAAA;EACJ,OAAOsC,OAAOC,SAASH,CAAU,IAAII,KAAKC,IAAI,IAAIL,CAAW,IAAI;CACnE,GACMM,UACJ7E,EAAM,CAAC,CAAC8E,WAAWpG,MAASA,EAAKoB,UAAUW,GAAU,CAAC,GAClDsE,IAAchH,GAAkD;EACpE,IAAIiH,QAAQ;GACV,OAAOhF,EAAM,CAAC,CAACiF;EACjB;EACAC,kBAAkBpE;EAClBqE,cAAcb;EACd,IAAIc,WAAW;GACb,OAAO3F,EAAM4E,iBAAkB5E,EAAM4E,eAAee,YAAY,IAAK;EACvE;EACA,IAAIC,UAAU;GACZ,OAAOjB,EAAQ,KAAK7D,EAAK;EAC3B;EACA+E,aAAa;GAAEC,OAAO;GAAGjB,QAAQ;EAAI;EACrC,IAAIkB,iBAAiB;GACnB,IAAMC,IAASZ,EAAY;GAC3B,QAAQa,MAAiB;IACvB,IAAMC,IAAU3H,GAAsB0H,CAAK;IAE3C,OADID,KAAU,KAAK,CAACE,EAAQ5B,SAAS0B,CAAM,KAAGE,EAAQC,KAAKH,CAAM,GAC1DE,EAAQE,MAAMC,GAAGC,MAAMD,IAAIC,CAAC;GACrC;EACF;CACF,CAAC;CAcD1I,AAbAA,QAAmB;EACjB2C,EAAM;EACN,IAAMgG,IAASzF,EAAK;EAEpB,AADAG,EAAa,IAAI,GACb0D,EAAQ,KAAK4B,KACfjB,EAAYkB,cACVtB,KAAKC,IACH,GACA5E,EAAM,CAAC,CAAC8E,WAAWpG,MAASA,EAAKoB,UAAUA,EAAM,CAAC,CACpD,GACA,EAAEoG,OAAOzG,EAAMN,iBAAiB,WAAW,OAAO,CACpD;CACJ,CAAC,GACD9B,QAAmB;EACjB,IAAM8I,IAAUrF,EAAO;EACvB,IAAI,CAACrB,EAAMN,kBAAkB,CAACoB,EAAK,KAAK6D,EAAQ,KAAK,CAAC+B,GAAS;EAE/D,IAAMC,IAAQC,4BAA4B;GACxC,IAAMC,IAAWH,EAAQI,cACvB,8CACF;GACA,IAAI,CAACD,GAAU;GACf,IAAME,IAAOL,EAAQM,sBAAsB,GACzCC,IAAMJ,EAASG,sBAAsB;GACvCN,EAAQQ,aACND,EAAIE,MAAMJ,EAAKI,OAAOT,EAAQU,eAAeH,EAAIpC,UAAU;EAC/D,CAAC;EACD5G,QAAgBoJ,qBAAqBV,CAAK,CAAC;CAC7C,CAAC;CACD,IAAMW,IAAQtH,EAAMjB,aAAaxB,IAAIG,IAC/B6J,KAAO1J,QAAiB;EAC5B,IAAM2J,IAAS7C,EAAQ,IACnBW,EACGmC,gBAAgB,CAAC,CACjBC,KAAKT,OAAS;GAAEU,OAAOV,EAAIU;GAAOC,OAAOX,EAAIW;EAAM,EAAE,IACxDrH,EAAM,CAAC,CAACmH,KAAKG,GAAGF,OAAW;GAAEA;GAAOC,OAAO;EAAE,EAAE,GAC7C5B,IAASZ,EAAY;EAG3B,OAFIT,EAAQ,KAAKqB,KAAU,KAAK,CAACwB,EAAOxE,MAAMiE,MAAQA,EAAIU,UAAU3B,CAAM,KACxEwB,EAAOrB,KAAK;GAAEwB,OAAO3B;GAAQ4B,OAAO5B,IAASnB,EAAO;EAAE,CAAC,GAClD2C;CACT,CAAC,GACKM,WACJ9H,EAAM+H,UACFxF,EAAS,CAAC,CAACwF,UACX/H,EAAMgI,QACJ,OAAOhI,EAAMgI,SAAU,WACrBhI,EAAMgI,QACNzF,EAAS,CAAC,CAACyF,QACbzH,EAAM,CAAC,CAACiF,WAAW,IACjBjD,EAAS,CAAC,CAAC0F,QACX,IACJC,KAAY;EAChB,IAAI3D,aAAa;GACf,OAAOA,GAAW;EACpB;EACA,IAAIlE,QAAQ;GACV,OAAOA,EAAM,IAAI,CAACA,EAAM,CAAC,IAAI,CAAA;EAC/B;EACA,IAAIS,OAAO;GACT,OAAOA,EAAK,KAAK,CAACsB,EAAQ;EAC5B;EACA,IAAIC,WAAW;GACb,OAAOrC,EAAMqC;EACf;EACA,IAAIC,WAAW;GACb,OAAOtC,EAAMsC;EACf;EACA,IAAI9C,UAAU;GACZ,OAAOQ,EAAMR;EACf;EACA2I,eAAeC,MAA+B;GAC5C,AAAKhG,EAAQ,KAAGrB,EAAQqH,EAAQtH,IAAI;EACtC;EACAiC,gBAAgBqF,MAAiC;GAC/C,IAAIhG,EAAQ,KAAKN,GAAW;GAC5B,IAAMW,IAAO2F,EAAQ/H,MAAM,MAAM;GACjC,AAAIoC,MAASpC,EAAM,KAAGyC,EAASL,CAAI;EACrC;EACA4F,oBAAoBD,MAClBnH,EAAamH,EAAQE,gBAAgB;EACvC,IAAIC,kBAAkB;GACpB,OAAO5D,EAAQ,KACV,EAAEgD,eACDrC,EAAYkB,cAAcmB,GAAO,EAAElB,OAAO,OAAO,CAAC,IACpD/D,KAAAA;EACN;EACA,IAAI8F,cAAc;GAChB,OAAO;IACLC,WAAW;IACXE,WAAW;IACXC,QAAQ;IACRC,UAAUrH,EAAY,CAAC,EAAEsH,QACvB,2CACF,IACK,UACA;IACLC,kBAAkB,CAAC,CAACvH,EAAY,CAAC,EAAEsH,QACjC,2CACF;GACF;EACF;CACF,GACME,KAAahJ,EAAMjB,aACrB;EACE,IAAI8B,aAAa;GACf,OAAOA,EAAW;EACpB;EACA8B,qBAAqByF,MAGf;GAEJ,IAAMc,IACJnH,MAAmBqG,EAAQvH,cAC3BuH,EAAQa,WAAW,kBACnB/H,GAASU,cAAcuH,kBAAkBjI;GAC3Ca,IAAiB,MACbmH,MACA,CAAC9G,EAAQ,KAAKgG,EAAQvH,eAAeA,EAAW,KAClD2B,EAAS4F,EAAQvH,UAAU;EAC/B;EACAuI,mBAAmB;EACnB,GAAIpJ,EAAMP,gBACN,EAAE4J,eAAe,gBAAyB,IAC1C,CAAC;CACP,IACA,CAAC;CACL,OAAAC,EACGhC,EAAMiC,MAAIC,EACLtB,IACAc,IAAU;EAAA,IACd/I,KAAE;GAAA,OAAED,EAAMC,MAAMA;EAAE;EAAA,IAAA,QAAA;GAAA,OACXyJ,QAAA,CAAA,CAAA1J,EAAMT,SAAS,CAAA,CAAA,IAAG,cAAcS,EAAMT,cAAc;EAAY;EAAA,IAAA,yBAAA;GAAA,OACjDS,EAAM4J,kBAAkB;EAAS;EAAA,IAAA,mBAAA;GAAA,OACvCvJ,EAAM,KAAKQ,EAAW,IAAI,KAAK6B,KAAAA;EAAS;EAAA,IAAAoH,WAAA;GAAA,OAAA;IAAAR,EAEvDnL,GAAI;KAAA,IAAC4L,OAAI;MAAA,OAAE/J,EAAMM;KAAK;KAAA,IAAAwJ,WAAA;MAAA,OAAAR,EACpBhC,EAAM0C,OAAK;OAAA,OAAA;OAA0BC,eAAe/I,GAASgJ,MAAM;OAAC,IAAAJ,WAAA;QAAA,OAClE9J,EAAMM;OAAK;MAAA,CAAA;KAAA;IAAA,CAAA;IAAAgJ,EAGfhC,EAAM6C,SAAO;KAAA,OAAA;KAAA,IAAAL,WAAA;MAAA,OAAA;OAAAR,EACXnL,GAAI;QAAA,IAAC4L,OAAI;SAAA,OAAE/J,EAAMjB;QAAU;QAAA,IAAA+K,WAAA;SAAA,OAAAR,EACzB/L,EAAE6M,OAAK;UAAAC,MACAC,MAAS;WACbpJ,IAAUoJ;UACZ;UAAC,OAAA;UAAA,IAAA,eAAA;WAAA,OAEWtK,EAAM;UAAa;UAAA,IAAA,oBAAA;WAAA,OACdA,EAAM;UAAkB;UAAA,IAAA,qBAAA;WAAA,OACvBA,EAAM;UAAmB;UAAA,IAAA,kBAAA;WAAA,OAC5BA,EAAM2K;UAAQ;UAAA,IAC7BC,cAAW;WAAA,OAAE5K,EAAM4K;UAAW;UAAA,IAC9BjL,YAAS;WAAA,OAAEK,EAAML;UAAS;UAC1BkL,0BAA0B;WACxB/I,IAAY;UACd;UACAgJ,wBAAwB;WACtBhJ,IAAY;UACd;UACAiJ,YAAYpH,MAAU;WACpB,AAAI7B,KAAa6B,EAAMqH,QAAQ,YAC7BrH,EAAMsH,eAAe,GACrBtH,EAAMuH,gBAAgB;UAE1B;UACAC,SAASxH,MAAU;WACjB,IAAI3D,EAAMb,aAAa;YAErB4C,IAAiB4B,EAAMyH,cAAc/K;YACrC,IAAMoC,IAAOL,EAAQ,IACjB,OACApC,EAAMb,YAAY4C,CAAc;YAEpCa,AADIH,MAAS,QAAQA,MAASpC,EAAM,KAAGyC,EAASL,CAAI,GACpDG,EAAatC,EAAM,CAAC;YACpB;WACF;WACA,AAAID,EAAM,KAAGuC,EAAatC,EAAM,CAAC;UACnC;SAAC,CAAA;QAAA;OAAA,CAAA;OAAAgJ,EAGJhC,EAAM+D,SAAO;QAAAhB,MACNC,MAAS;SACb,AAAKtK,EAAMjB,eAAYmC,IAAUoJ;QACnC;QAAC,OAAA;QAAA,IAAA,eAAA;SAAA,OAEWZ,QAAA,CAAA,CAAA1J,EAAMjB,UAAU,CAAA,CAAA,IAAGwD,EAAS,CAAC,CAACzB,OAAOd,EAAM;QAAa;QAAA,IAAA,oBAAA;SAAA,OACnDA,EAAM;QAAkB;QAAA,IAAA,qBAAA;SAAA,OACvBA,EAAM;QAAmB;QAAA,IAAA,kBAAA;SAAA,OAC5BA,EAAM2K;QAAQ;QAAA,IAAAb,WAAA;SAAA,OAE5BJ,QAAA,CAAA,CAAA1J,EAAMjB,UAAU,CAAA,CAAA,IACf2K,QAAA,CAAA,CAAA1J,EAAMX,cAAc,CAAA,CAAA,IAClBW,EAAMX,eAAe,IAErB,aACD;UAAA,IAAAiM,IAAAC,EAAAC,EAAA;UAGiD,OAHjDC,EAAAH,SAGEhL,EAAM,KAAKN,EAAM4K,eAAerI,EAAS,CAAC,CAACzB,IAAI,GAAAwK;SAAA,EAAA,CAAA;QAEnD;OAAA,CAAA;OAAAhC,EAEFnL,GAAI;QAAA,IAAC4L,OAAI;SAAA,OAAEL,QAAA,CAAA,EAAA1J,EAAM0L,aAAa,CAACtJ,EAAQ,EAAC,CAAA,CAAA,MAAK/B,EAAM,KAAKQ,EAAW;QAAE;QAAA,IAAAiJ,WAAA;SAAA,IAAA6B,IAAAJ,EAAAK,EAAA;SAItC,OAJsCD,EAAAE,gBAMnD;UAIb3K,AAHA4B,EAAS,EAAE,GACXN,EAAS,EAAE,GACXzB,EAAQ,EAAK,GACbG,GAASgJ,MAAM;SACjB,GAACyB,EAAAG,iBANenI,MAAUA,EAAMsH,eAAe,GAACc,QAAAC,EAAAL,GAAA,cADpCpJ,EAAS,CAAC,CAAC0J,KAAK,CAAA,GAAAC,EAAA,GAAAP;QAAA;OAAA,CAAA;MAAA;KAAA;IAAA,CAAA;WAAA;KAAA,IAAAQ,IAAAZ,EAAAa,EAAA;KAuC/BD,AAvC+BA,EAAAlI,iBAAA,YAoCpBN,MAAU;MAEpBzC,AADAyC,EAAMsH,eAAe,GACrB/J,GAASgJ,MAAM;KACjB,CAAC,GAAAiC,EAAAE,WANS1I,MAAU;MAClBA,EAAMyH,cAAc/K,QAAQA,EAAM;KACpC;KAAC,IAAAiM,IArBIlL;KAgBS,OAhBC,OAAAkL,KAAA,aAAAC,GAAAD,GAAAH,CAAA,IAAV/K,IAAU+K,GAAAJ,GAAAS,MAAA;MAAA,IAAAC,IAcTzM,EAAM0M,MAAIC,IACV3M,EAAMuD,MAAIqJ,IAEN5M,EAAM2K,UAAQkC,IACd7M,EAAMqC;MAAQ,OAAAoK,MAAAD,EAAAM,KAAAd,EAAAG,GAAA,QAAAK,EAAAM,IAAAL,CAAA,GAAAE,MAAAH,EAAAO,KAAAf,EAAAG,GAAA,QAAAK,EAAAO,IAAAJ,CAAA,GAAAC,MAAAJ,EAAAnG,KAAA2G,EAAAb,GAAA,YAAAK,EAAAnG,IAAAuG,CAAA,GAAAC,MAAAL,EAAAS,KAAAD,EAAAb,GAAA,YAAAK,EAAAS,IAAAJ,CAAA,GAAAL;KAAA,GAAA;MAAAM,GAAApK,KAAAA;MAAAqK,GAAArK,KAAAA;MAAA2D,GAAA3D,KAAAA;MAAAuK,GAAAvK,KAAAA;KAAA,CAAA,GAAAqJ,QAAAiB,EAAAb,GAAA,SAFjB9L,EAAM,CAAC,CAAA,GAAA6L,EAAA,GAAAC;IAAA,EAAA,CAAA;WAAA;KAAA,IAAAe,IAAA3B,EAAA4B,CAAA,GAAAC,IAAAF,EAAAG,YAAA,CAAAC,GAAAC,KAAAC,EAAAJ,EAAAK,WAAA,GAAAC,IAAAJ,EAAAG,aAAA,CAAAE,GAAAC,KAAAJ,EAAAE,EAAAD,WAAA;KAmBO,OAnBPhC,EAAAyB,GAYbpF,IAAMwF,GAAAC,CAAA,GAAA9B,EAAAyB,GAAA5D,EACNnL,GAAI;MAAA,IAAC4L,OAAI;OAAA,OAAEL,QAAA,CAAA,CAAA1J,EAAMgI,KAAK,CAAA,CAAA,KAAIhI,EAAM6N;MAAO;MAAA,IAAA/D,WAAA;OAAA,IAAAgE,IAAAvC,EAAAwC,EAAA;OAMnB,OANmBD,EAAAjC,gBAIrB7L,EAAM6N,UAAU,GAACpC,EAAAqC,SAE/BvL,EAAS,CAAC,CAACyL,KAAK,GAAA9B,EAAA,GAAA4B;MAAA;KAAA,CAAA,GAAAH,GAAAC,CAAA,GAAAV;IAAA,EAAA,CAAA;IAAA5D,EAItBnL,GAAI;KAAA,IAAC4L,OAAI;MAAA,OAAEvI,EAAY;KAAC;KAAAsI,WACrBmE,MAAK3E,EACJ3L,GAAM;MAAA,IAACsQ,QAAK;OAAA,OAAEA,EAAM;MAAC;MAAA,IAAAnE,WAAA;OAAA,OAAAR,EACnBhC,EAAM4G,YAAU;QAAA,OAAA;QAAA,IAAApE,WAAA;SAAA,OAAAR,EACdhC,EAAM6G,SAAO;UAAA9D,KACP/I;UAAS,OAAA;UAEd8M,OAAO;WACL,cAAc;WACdC,UAAU;UACZ;UAAC,IAAAvE,WAAA;WAAA,IAAAwE,IAAA/C,EAAAgD,EAAA;WASgB,OAThB9C,EAAA6C,GAAAhF,EAYEtL,GAAG;YAAA,IAACwQ,OAAI;aAAA,OAAEjH,GAAK;YAAC;YAAAuC,WACb7C,MAAQ;aACR,IAAMhI,UAAasB,EAAM,CAAC,CAAC0G,EAAIU;aAC/B,OAAA2B,EACGhC,EAAMmH,MAAI;cAAA,IACTxP,OAAI;eAAA,OAAEA,EAAK;cAAC;cAAA,OAAA;cAAA,IAAA,kBAAA;eAAA,OAEGgI,EAAIU,QAAQ;cAAC;cAAA,IAAA,iBAAA;eAAA,OACdpH,EAAM,CAAC,CAACiF;cAAM;cAAA,IAC5B4I,QAAK;eAAA,OACH1E,QAAA,CAAA,CAAA/E,EAAQ,CAAC,CAAA,CAAA,IACL;gBACEiK,UAAU;gBACVzH,KAAK;gBACL0H,MAAM;gBACN/I,OAAO;gBACPjB,QAAQ,GAAGA,EAAO,EAAC;gBACnBiK,WAAW,cAAc7H,EAAIW,MAAK;eACpC,IACAlF,KAAAA;cAAS;cAAA,IAAAoH,WAAA;eAAA,OAAA,CAAAR,EAGdhC,EAAMyH,UAAQ,EAAA,IAAAjF,WAAA;gBAAA,OAAE7K,EAAK,CAAC,CAACqB;eAAK,EAAA,CAAA,GAAAgJ,EAC5BnL,GAAI;gBAAA,IAAC4L,OAAI;iBAAA,OAAE9K,EAAK,CAAC,CAAC+P;gBAAW;gBAAA,IAAAlF,WAAA;iBAAA,IAAAmF,IAAA1D,EAAA2D,EAAA;iBAEP,OAFOzD,EAAAwD,SAEzBhQ,EAAK,CAAC,CAAC+P,WAAW,GAAAC;gBAAA;eAAA,CAAA,CAAA;cAAA;aAAA,CAAA;YAK7B;WAAC,CAAA,CAAA,GAAAlD,GAAAoD,MAAAC,EAAAd,GAtCD3J,EAAQ,IACJ;YACEE,QAAQ,GAAGS,EAAY+J,aAAa,EAAC;YACrCT,UAAU;WACZ,IACAlM,KAAAA,GAASyM,CAAA,CAAA,GAAAb;UAAA;SAAA,CAAA;QAAA;OAAA,CAAA;MAAA;KAAA,CAAA;IAuCxB,CAAA;GAAA;EAAA;CAAA,CAAA,CAAA;AAIT;AAACgB,EAAA;CAAA;CAAA;CAAA;AAAA,CAAA"}