@llui/components 0.4.10 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/dist/components/accordion.d.ts +13 -13
  2. package/dist/components/accordion.d.ts.map +1 -1
  3. package/dist/components/accordion.js +9 -9
  4. package/dist/components/accordion.js.map +1 -1
  5. package/dist/components/alert-dialog.d.ts +8 -8
  6. package/dist/components/alert-dialog.d.ts.map +1 -1
  7. package/dist/components/alert-dialog.js +2 -2
  8. package/dist/components/alert-dialog.js.map +1 -1
  9. package/dist/components/angle-slider.d.ts +13 -13
  10. package/dist/components/angle-slider.d.ts.map +1 -1
  11. package/dist/components/angle-slider.js +11 -11
  12. package/dist/components/angle-slider.js.map +1 -1
  13. package/dist/components/async-list.d.ts +7 -7
  14. package/dist/components/async-list.d.ts.map +1 -1
  15. package/dist/components/async-list.js +5 -8
  16. package/dist/components/async-list.js.map +1 -1
  17. package/dist/components/avatar.d.ts +9 -9
  18. package/dist/components/avatar.d.ts.map +1 -1
  19. package/dist/components/avatar.js +7 -7
  20. package/dist/components/avatar.js.map +1 -1
  21. package/dist/components/carousel.d.ts +18 -18
  22. package/dist/components/carousel.d.ts.map +1 -1
  23. package/dist/components/carousel.js +12 -12
  24. package/dist/components/carousel.js.map +1 -1
  25. package/dist/components/cascade-select.d.ts +12 -12
  26. package/dist/components/cascade-select.d.ts.map +1 -1
  27. package/dist/components/cascade-select.js +8 -8
  28. package/dist/components/cascade-select.js.map +1 -1
  29. package/dist/components/checkbox.d.ts +14 -14
  30. package/dist/components/checkbox.d.ts.map +1 -1
  31. package/dist/components/checkbox.js +12 -12
  32. package/dist/components/checkbox.js.map +1 -1
  33. package/dist/components/clipboard.d.ts +8 -8
  34. package/dist/components/clipboard.d.ts.map +1 -1
  35. package/dist/components/clipboard.js +6 -6
  36. package/dist/components/clipboard.js.map +1 -1
  37. package/dist/components/collapsible.d.ts +11 -11
  38. package/dist/components/collapsible.d.ts.map +1 -1
  39. package/dist/components/collapsible.js +9 -9
  40. package/dist/components/collapsible.js.map +1 -1
  41. package/dist/components/color-picker.d.ts +19 -19
  42. package/dist/components/color-picker.d.ts.map +1 -1
  43. package/dist/components/color-picker.js +21 -21
  44. package/dist/components/color-picker.js.map +1 -1
  45. package/dist/components/combobox.d.ts +25 -25
  46. package/dist/components/combobox.d.ts.map +1 -1
  47. package/dist/components/combobox.js +54 -59
  48. package/dist/components/combobox.js.map +1 -1
  49. package/dist/components/context-menu.d.ts +14 -14
  50. package/dist/components/context-menu.d.ts.map +1 -1
  51. package/dist/components/context-menu.js +15 -19
  52. package/dist/components/context-menu.js.map +1 -1
  53. package/dist/components/date-input.d.ts +13 -13
  54. package/dist/components/date-input.d.ts.map +1 -1
  55. package/dist/components/date-input.js +11 -11
  56. package/dist/components/date-input.js.map +1 -1
  57. package/dist/components/date-picker.d.ts +11 -11
  58. package/dist/components/date-picker.d.ts.map +1 -1
  59. package/dist/components/date-picker.js +7 -7
  60. package/dist/components/date-picker.js.map +1 -1
  61. package/dist/components/dialog.d.ts +15 -15
  62. package/dist/components/dialog.d.ts.map +1 -1
  63. package/dist/components/dialog.js +45 -50
  64. package/dist/components/dialog.js.map +1 -1
  65. package/dist/components/drawer.d.ts +13 -13
  66. package/dist/components/drawer.d.ts.map +1 -1
  67. package/dist/components/drawer.js +44 -49
  68. package/dist/components/drawer.js.map +1 -1
  69. package/dist/components/editable.d.ts +11 -11
  70. package/dist/components/editable.d.ts.map +1 -1
  71. package/dist/components/editable.js +9 -9
  72. package/dist/components/editable.js.map +1 -1
  73. package/dist/components/file-upload.d.ts +19 -19
  74. package/dist/components/file-upload.d.ts.map +1 -1
  75. package/dist/components/file-upload.js +14 -14
  76. package/dist/components/file-upload.js.map +1 -1
  77. package/dist/components/floating-panel.d.ts +14 -14
  78. package/dist/components/floating-panel.d.ts.map +1 -1
  79. package/dist/components/floating-panel.js +13 -14
  80. package/dist/components/floating-panel.js.map +1 -1
  81. package/dist/components/form.d.ts +9 -9
  82. package/dist/components/form.d.ts.map +1 -1
  83. package/dist/components/form.js +7 -7
  84. package/dist/components/form.js.map +1 -1
  85. package/dist/components/hover-card.d.ts +9 -9
  86. package/dist/components/hover-card.d.ts.map +1 -1
  87. package/dist/components/hover-card.js +12 -13
  88. package/dist/components/hover-card.js.map +1 -1
  89. package/dist/components/image-cropper.d.ts +8 -8
  90. package/dist/components/image-cropper.d.ts.map +1 -1
  91. package/dist/components/image-cropper.js +7 -8
  92. package/dist/components/image-cropper.js.map +1 -1
  93. package/dist/components/in-view.d.ts +6 -6
  94. package/dist/components/in-view.d.ts.map +1 -1
  95. package/dist/components/in-view.js +2 -2
  96. package/dist/components/in-view.js.map +1 -1
  97. package/dist/components/listbox.d.ts +16 -16
  98. package/dist/components/listbox.d.ts.map +1 -1
  99. package/dist/components/listbox.js +16 -16
  100. package/dist/components/listbox.js.map +1 -1
  101. package/dist/components/marquee.d.ts +8 -8
  102. package/dist/components/marquee.d.ts.map +1 -1
  103. package/dist/components/marquee.js +8 -11
  104. package/dist/components/marquee.js.map +1 -1
  105. package/dist/components/menu.d.ts +15 -15
  106. package/dist/components/menu.d.ts.map +1 -1
  107. package/dist/components/menu.js +16 -17
  108. package/dist/components/menu.js.map +1 -1
  109. package/dist/components/navigation-menu.d.ts +12 -12
  110. package/dist/components/navigation-menu.d.ts.map +1 -1
  111. package/dist/components/navigation-menu.js +8 -8
  112. package/dist/components/navigation-menu.js.map +1 -1
  113. package/dist/components/number-input.d.ts +18 -18
  114. package/dist/components/number-input.d.ts.map +1 -1
  115. package/dist/components/number-input.js +16 -20
  116. package/dist/components/number-input.js.map +1 -1
  117. package/dist/components/pagination.d.ts +13 -13
  118. package/dist/components/pagination.d.ts.map +1 -1
  119. package/dist/components/pagination.js +11 -17
  120. package/dist/components/pagination.js.map +1 -1
  121. package/dist/components/password-input.d.ts +11 -11
  122. package/dist/components/password-input.d.ts.map +1 -1
  123. package/dist/components/password-input.js +11 -11
  124. package/dist/components/password-input.js.map +1 -1
  125. package/dist/components/pin-input.d.ts +9 -9
  126. package/dist/components/pin-input.d.ts.map +1 -1
  127. package/dist/components/pin-input.js +9 -9
  128. package/dist/components/pin-input.js.map +1 -1
  129. package/dist/components/popover.d.ts +11 -11
  130. package/dist/components/popover.d.ts.map +1 -1
  131. package/dist/components/popover.js +61 -60
  132. package/dist/components/popover.js.map +1 -1
  133. package/dist/components/presence.d.ts +7 -5
  134. package/dist/components/presence.d.ts.map +1 -1
  135. package/dist/components/presence.js +5 -3
  136. package/dist/components/presence.js.map +1 -1
  137. package/dist/components/progress.d.ts +14 -14
  138. package/dist/components/progress.d.ts.map +1 -1
  139. package/dist/components/progress.js +12 -12
  140. package/dist/components/progress.js.map +1 -1
  141. package/dist/components/qr-code.d.ts +7 -7
  142. package/dist/components/qr-code.d.ts.map +1 -1
  143. package/dist/components/qr-code.js +7 -7
  144. package/dist/components/qr-code.js.map +1 -1
  145. package/dist/components/radio-group.d.ts +15 -15
  146. package/dist/components/radio-group.d.ts.map +1 -1
  147. package/dist/components/radio-group.js +12 -13
  148. package/dist/components/radio-group.js.map +1 -1
  149. package/dist/components/rating-group.d.ts +13 -13
  150. package/dist/components/rating-group.d.ts.map +1 -1
  151. package/dist/components/rating-group.js +10 -11
  152. package/dist/components/rating-group.js.map +1 -1
  153. package/dist/components/scroll-area.d.ts +10 -10
  154. package/dist/components/scroll-area.d.ts.map +1 -1
  155. package/dist/components/scroll-area.js +10 -15
  156. package/dist/components/scroll-area.js.map +1 -1
  157. package/dist/components/select.d.ts +26 -26
  158. package/dist/components/select.d.ts.map +1 -1
  159. package/dist/components/select.js +29 -33
  160. package/dist/components/select.js.map +1 -1
  161. package/dist/components/signature-pad.d.ts +12 -12
  162. package/dist/components/signature-pad.d.ts.map +1 -1
  163. package/dist/components/signature-pad.js +10 -10
  164. package/dist/components/signature-pad.js.map +1 -1
  165. package/dist/components/slider.d.ts +22 -22
  166. package/dist/components/slider.d.ts.map +1 -1
  167. package/dist/components/slider.js +17 -17
  168. package/dist/components/slider.js.map +1 -1
  169. package/dist/components/sortable.d.ts +11 -11
  170. package/dist/components/sortable.d.ts.map +1 -1
  171. package/dist/components/sortable.js +20 -20
  172. package/dist/components/sortable.js.map +1 -1
  173. package/dist/components/splitter.d.ts +15 -15
  174. package/dist/components/splitter.d.ts.map +1 -1
  175. package/dist/components/splitter.js +15 -15
  176. package/dist/components/splitter.js.map +1 -1
  177. package/dist/components/steps.d.ts +14 -14
  178. package/dist/components/steps.d.ts.map +1 -1
  179. package/dist/components/steps.js +10 -16
  180. package/dist/components/steps.js.map +1 -1
  181. package/dist/components/switch.d.ts +12 -12
  182. package/dist/components/switch.d.ts.map +1 -1
  183. package/dist/components/switch.js +10 -10
  184. package/dist/components/switch.js.map +1 -1
  185. package/dist/components/tabs.d.ts +15 -15
  186. package/dist/components/tabs.d.ts.map +1 -1
  187. package/dist/components/tabs.js +11 -11
  188. package/dist/components/tabs.js.map +1 -1
  189. package/dist/components/tags-input.d.ts +14 -14
  190. package/dist/components/tags-input.d.ts.map +1 -1
  191. package/dist/components/tags-input.js +10 -10
  192. package/dist/components/tags-input.js.map +1 -1
  193. package/dist/components/theme-switch.d.ts +5 -5
  194. package/dist/components/theme-switch.d.ts.map +1 -1
  195. package/dist/components/theme-switch.js +3 -3
  196. package/dist/components/theme-switch.js.map +1 -1
  197. package/dist/components/time-picker.d.ts +19 -19
  198. package/dist/components/time-picker.d.ts.map +1 -1
  199. package/dist/components/time-picker.js +17 -17
  200. package/dist/components/time-picker.js.map +1 -1
  201. package/dist/components/timer.d.ts +10 -10
  202. package/dist/components/timer.d.ts.map +1 -1
  203. package/dist/components/timer.js +8 -8
  204. package/dist/components/timer.js.map +1 -1
  205. package/dist/components/toast.d.ts +8 -8
  206. package/dist/components/toast.d.ts.map +1 -1
  207. package/dist/components/toast.js +4 -4
  208. package/dist/components/toast.js.map +1 -1
  209. package/dist/components/toc.d.ts +12 -12
  210. package/dist/components/toc.d.ts.map +1 -1
  211. package/dist/components/toc.js +8 -8
  212. package/dist/components/toc.js.map +1 -1
  213. package/dist/components/toggle-group.d.ts +13 -13
  214. package/dist/components/toggle-group.d.ts.map +1 -1
  215. package/dist/components/toggle-group.js +9 -9
  216. package/dist/components/toggle-group.js.map +1 -1
  217. package/dist/components/toggle.d.ts +8 -8
  218. package/dist/components/toggle.d.ts.map +1 -1
  219. package/dist/components/toggle.js +6 -6
  220. package/dist/components/toggle.js.map +1 -1
  221. package/dist/components/tooltip.d.ts +10 -10
  222. package/dist/components/tooltip.d.ts.map +1 -1
  223. package/dist/components/tooltip.js +13 -14
  224. package/dist/components/tooltip.js.map +1 -1
  225. package/dist/components/tour.d.ts +7 -7
  226. package/dist/components/tour.d.ts.map +1 -1
  227. package/dist/components/tour.js +5 -5
  228. package/dist/components/tour.js.map +1 -1
  229. package/dist/components/tree-view.d.ts +19 -19
  230. package/dist/components/tree-view.d.ts.map +1 -1
  231. package/dist/components/tree-view.js +23 -23
  232. package/dist/components/tree-view.js.map +1 -1
  233. package/dist/patterns/confirm-dialog.d.ts +4 -4
  234. package/dist/patterns/confirm-dialog.d.ts.map +1 -1
  235. package/dist/patterns/confirm-dialog.js +7 -9
  236. package/dist/patterns/confirm-dialog.js.map +1 -1
  237. package/package.json +3 -3
  238. package/dist/components/enter-view.d.ts +0 -73
  239. package/dist/components/enter-view.d.ts.map +0 -1
  240. package/dist/components/enter-view.js +0 -51
  241. package/dist/utils/validators.d.ts +0 -34
  242. package/dist/utils/validators.d.ts.map +0 -1
  243. package/dist/utils/validators.js +0 -83
@@ -1 +1 @@
1
- {"version":3,"file":"combobox.js","sourceRoot":"","sources":["../../src/components/combobox.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send, TransitionOptions } from '@llui/dom'\nimport { show, portal, onMount, div, useContext, tagSend } from '@llui/dom'\nimport { LocaleContext } from '../locale.js'\nimport type { Locale } from '../locale.js'\nimport { pushDismissable } from '../utils/dismissable.js'\nimport { attachFloating, type Placement } from '../utils/floating.js'\n\n/**\n * Combobox — text input paired with a filtered listbox dropdown. User\n * types to filter items, arrow keys navigate the filtered set, Enter\n * selects. Supports single and multiple selection.\n */\n\nexport type SelectionMode = 'single' | 'multiple'\n\nexport interface ComboboxState {\n open: boolean\n value: string[]\n inputValue: string\n items: string[]\n disabledItems: string[]\n filteredItems: string[]\n highlightedIndex: number | null\n selectionMode: SelectionMode\n disabled: boolean\n}\n\nexport type ComboboxMsg =\n /** @intent(\"Open the combobox dropdown\") */\n | { type: 'open' }\n /** @intent(\"Close the combobox dropdown\") */\n | { type: 'close' }\n /** @intent(\"Set the text input contents (re-runs the filter)\") */\n | { type: 'setInputValue'; value: string }\n /** @intent(\"Pick the option with the given value (toggles in multi-select)\") */\n | { type: 'selectOption'; value: string }\n /** @intent(\"Replace the selected values with the provided list\") */\n | { type: 'setValue'; value: string[] }\n /** @intent(\"Clear all selected values and the input text\") */\n | { type: 'clear' }\n /** @humanOnly */\n | { type: 'highlightNext' }\n /** @humanOnly */\n | { type: 'highlightPrev' }\n /** @humanOnly */\n | { type: 'highlightFirst' }\n /** @humanOnly */\n | { type: 'highlightLast' }\n /** @humanOnly */\n | { type: 'highlight'; index: number | null }\n /** @intent(\"Pick the currently-highlighted option in the filtered list\") */\n | { type: 'selectHighlighted' }\n /** @humanOnly */\n | { type: 'setItems'; items: string[]; disabled?: string[] }\n\nexport interface ComboboxInit {\n value?: string[]\n inputValue?: string\n items?: string[]\n disabledItems?: string[]\n selectionMode?: SelectionMode\n disabled?: boolean\n}\n\nexport function init(opts: ComboboxInit = {}): ComboboxState {\n const items = opts.items ?? []\n const disabledItems = opts.disabledItems ?? []\n const inputValue = opts.inputValue ?? ''\n return {\n open: false,\n value: opts.value ?? [],\n inputValue,\n items,\n disabledItems,\n filteredItems: filterItems(items, inputValue),\n highlightedIndex: null,\n selectionMode: opts.selectionMode ?? 'single',\n disabled: opts.disabled ?? false,\n }\n}\n\nfunction filterItems(items: string[], query: string): string[] {\n if (query === '') return items\n const q = query.toLowerCase()\n return items.filter((item) => item.toLowerCase().includes(q))\n}\n\nfunction nextEnabledIndex(\n items: string[],\n disabled: string[],\n from: number | null,\n delta: 1 | -1,\n): number | null {\n if (items.length === 0) return null\n const start = from === null ? (delta === 1 ? -1 : items.length) : from\n const n = items.length\n for (let i = 1; i <= n; i++) {\n const idx = (start + delta * i + n * n) % n\n if (!disabled.includes(items[idx]!)) return idx\n }\n return null\n}\n\nfunction firstEnabledIndex(items: string[], disabled: string[]): number | null {\n for (let i = 0; i < items.length; i++) {\n if (!disabled.includes(items[i]!)) return i\n }\n return null\n}\n\nfunction lastEnabledIndex(items: string[], disabled: string[]): number | null {\n for (let i = items.length - 1; i >= 0; i--) {\n if (!disabled.includes(items[i]!)) return i\n }\n return null\n}\n\nfunction applySelection(state: ComboboxState, value: string): string[] {\n if (state.disabledItems.includes(value)) return state.value\n if (state.selectionMode === 'single') return [value]\n const isActive = state.value.includes(value)\n return isActive ? state.value.filter((v) => v !== value) : [...state.value, value]\n}\n\nexport function update(state: ComboboxState, msg: ComboboxMsg): [ComboboxState, never[]] {\n if (state.disabled && msg.type !== 'setItems') return [state, []]\n switch (msg.type) {\n case 'open':\n return [\n {\n ...state,\n open: true,\n highlightedIndex: firstEnabledIndex(state.filteredItems, state.disabledItems),\n },\n [],\n ]\n case 'close':\n return [{ ...state, open: false, highlightedIndex: null }, []]\n case 'setInputValue': {\n const filteredItems = filterItems(state.items, msg.value)\n return [\n {\n ...state,\n inputValue: msg.value,\n filteredItems,\n open: true,\n highlightedIndex: firstEnabledIndex(filteredItems, state.disabledItems),\n },\n [],\n ]\n }\n case 'selectOption': {\n const value = applySelection(state, msg.value)\n const inputValue = state.selectionMode === 'single' ? msg.value : ''\n const filteredItems = filterItems(state.items, inputValue)\n const open = state.selectionMode === 'single' ? false : state.open\n return [\n {\n ...state,\n value,\n inputValue,\n filteredItems,\n open,\n highlightedIndex: open ? state.highlightedIndex : null,\n },\n [],\n ]\n }\n case 'setValue':\n return [{ ...state, value: msg.value }, []]\n case 'clear':\n return [\n { ...state, value: [], inputValue: '', filteredItems: state.items, highlightedIndex: null },\n [],\n ]\n case 'highlight':\n return [{ ...state, highlightedIndex: msg.index }, []]\n case 'highlightNext':\n return [\n {\n ...state,\n highlightedIndex: nextEnabledIndex(\n state.filteredItems,\n state.disabledItems,\n state.highlightedIndex,\n 1,\n ),\n },\n [],\n ]\n case 'highlightPrev':\n return [\n {\n ...state,\n highlightedIndex: nextEnabledIndex(\n state.filteredItems,\n state.disabledItems,\n state.highlightedIndex,\n -1,\n ),\n },\n [],\n ]\n case 'highlightFirst':\n return [\n { ...state, highlightedIndex: firstEnabledIndex(state.filteredItems, state.disabledItems) },\n [],\n ]\n case 'highlightLast':\n return [\n { ...state, highlightedIndex: lastEnabledIndex(state.filteredItems, state.disabledItems) },\n [],\n ]\n case 'selectHighlighted': {\n if (state.highlightedIndex === null) return [state, []]\n const v = state.filteredItems[state.highlightedIndex]\n if (v === undefined) return [state, []]\n const value = applySelection(state, v)\n const inputValue = state.selectionMode === 'single' ? v : ''\n const filteredItems = filterItems(state.items, inputValue)\n const open = state.selectionMode === 'single' ? false : state.open\n return [\n {\n ...state,\n value,\n inputValue,\n filteredItems,\n open,\n highlightedIndex: open ? state.highlightedIndex : null,\n },\n [],\n ]\n }\n case 'setItems': {\n const disabled = msg.disabled ?? state.disabledItems\n const value = state.value.filter((v) => msg.items.includes(v) && !disabled.includes(v))\n return [\n {\n ...state,\n items: msg.items,\n disabledItems: disabled,\n filteredItems: filterItems(msg.items, state.inputValue),\n value,\n },\n [],\n ]\n }\n }\n}\n\nexport interface ComboboxItemParts<S> {\n item: {\n role: 'option'\n id: string\n 'aria-selected': (s: S) => boolean\n 'aria-disabled': (s: S) => 'true' | undefined\n 'data-state': (s: S) => 'selected' | undefined\n 'data-highlighted': (s: S) => '' | undefined\n 'data-disabled': (s: S) => '' | undefined\n 'data-scope': 'combobox'\n 'data-part': 'item'\n 'data-value': string\n 'data-index': string\n onClick: (e: MouseEvent) => void\n onPointerMove: (e: PointerEvent) => void\n }\n}\n\nexport interface ComboboxParts<S> {\n root: {\n role: 'combobox'\n 'aria-expanded': (s: S) => boolean\n 'aria-controls': string\n 'aria-haspopup': 'listbox'\n 'data-scope': 'combobox'\n 'data-part': 'root'\n 'data-state': (s: S) => 'open' | 'closed'\n }\n input: {\n type: 'text'\n role: 'combobox'\n autoComplete: 'off'\n 'aria-autocomplete': 'list'\n 'aria-expanded': (s: S) => boolean\n 'aria-controls': string\n 'aria-activedescendant': (s: S) => string | undefined\n 'aria-disabled': (s: S) => 'true' | undefined\n id: string\n disabled: (s: S) => boolean\n value: (s: S) => string\n 'data-scope': 'combobox'\n 'data-part': 'input'\n onInput: (e: Event) => void\n onKeyDown: (e: KeyboardEvent) => void\n onFocus: (e: FocusEvent) => void\n }\n trigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'aria-expanded': (s: S) => boolean\n 'aria-controls': string\n tabIndex: -1\n 'data-scope': 'combobox'\n 'data-part': 'trigger'\n onClick: (e: MouseEvent) => void\n }\n positioner: {\n 'data-scope': 'combobox'\n 'data-part': 'positioner'\n style: string\n }\n content: {\n role: 'listbox'\n id: string\n 'aria-labelledby': string\n tabIndex: -1\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-scope': 'combobox'\n 'data-part': 'content'\n }\n item: (value: string, index: number) => ComboboxItemParts<S>\n empty: {\n 'data-scope': 'combobox'\n 'data-part': 'empty'\n }\n}\n\nexport interface ConnectOptions {\n id: string\n triggerLabel?: string\n}\n\nexport function connect<S>(\n get: (s: S) => ComboboxState,\n send: Send<ComboboxMsg>,\n opts: ConnectOptions,\n): ComboboxParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const base = opts.id\n const inputId = `${base}:input`\n const contentId = `${base}:content`\n const itemId = (index: number): string => `${base}:item:${index}`\n const triggerLabel: string | ((s: S) => string) =\n opts.triggerLabel ?? ((s: S) => locale(s).combobox.toggle)\n\n return {\n root: {\n role: 'combobox',\n 'aria-expanded': (s) => get(s).open,\n 'aria-controls': contentId,\n 'aria-haspopup': 'listbox',\n 'data-scope': 'combobox',\n 'data-part': 'root',\n 'data-state': (s) => (get(s).open ? 'open' : 'closed'),\n },\n input: {\n type: 'text',\n role: 'combobox',\n autoComplete: 'off',\n 'aria-autocomplete': 'list',\n 'aria-expanded': (s) => get(s).open,\n 'aria-controls': contentId,\n 'aria-activedescendant': (s) => {\n const idx = get(s).highlightedIndex\n return idx === null ? undefined : itemId(idx)\n },\n 'aria-disabled': (s) => (get(s).disabled ? 'true' : undefined),\n id: inputId,\n disabled: (s) => get(s).disabled,\n value: (s) => get(s).inputValue,\n 'data-scope': 'combobox',\n 'data-part': 'input',\n onInput: tagSend(send, ['setInputValue'], (e) => {\n const value = (e.target as HTMLInputElement).value\n send({ type: 'setInputValue', value })\n }),\n onKeyDown: tagSend(\n send,\n [\n 'open',\n 'highlightNext',\n 'highlightPrev',\n 'highlightFirst',\n 'highlightLast',\n 'selectHighlighted',\n 'close',\n ],\n (e) => {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n send({ type: 'open' })\n send({ type: 'highlightNext' })\n return\n case 'ArrowUp':\n e.preventDefault()\n send({ type: 'open' })\n send({ type: 'highlightPrev' })\n return\n case 'Home':\n e.preventDefault()\n send({ type: 'highlightFirst' })\n return\n case 'End':\n e.preventDefault()\n send({ type: 'highlightLast' })\n return\n case 'Enter':\n e.preventDefault()\n send({ type: 'selectHighlighted' })\n return\n case 'Escape':\n e.preventDefault()\n send({ type: 'close' })\n return\n }\n },\n ),\n onFocus: tagSend(send, ['open'], () => send({ type: 'open' })),\n },\n trigger: {\n type: 'button',\n 'aria-label': triggerLabel,\n 'aria-expanded': (s) => get(s).open,\n 'aria-controls': contentId,\n tabIndex: -1,\n 'data-scope': 'combobox',\n 'data-part': 'trigger',\n onClick: tagSend(send, ['open'], () => send({ type: 'open' })),\n },\n positioner: {\n 'data-scope': 'combobox',\n 'data-part': 'positioner',\n style: 'position:absolute;top:0;left:0;',\n },\n content: {\n role: 'listbox',\n id: contentId,\n 'aria-labelledby': inputId,\n tabIndex: -1,\n 'data-state': (s) => (get(s).open ? 'open' : 'closed'),\n 'data-scope': 'combobox',\n 'data-part': 'content',\n },\n item: (value: string, index: number): ComboboxItemParts<S> => ({\n item: {\n role: 'option',\n id: itemId(index),\n 'aria-selected': (s) => get(s).value.includes(value),\n 'aria-disabled': (s) => (get(s).disabledItems.includes(value) ? 'true' : undefined),\n 'data-state': (s) => (get(s).value.includes(value) ? 'selected' : undefined),\n 'data-highlighted': (s) => (get(s).highlightedIndex === index ? '' : undefined),\n 'data-disabled': (s) => (get(s).disabledItems.includes(value) ? '' : undefined),\n 'data-scope': 'combobox',\n 'data-part': 'item',\n 'data-value': value,\n 'data-index': String(index),\n onClick: tagSend(send, ['selectOption'], () => send({ type: 'selectOption', value })),\n onPointerMove: tagSend(send, ['highlight'], () => send({ type: 'highlight', index })),\n },\n }),\n empty: {\n 'data-scope': 'combobox',\n 'data-part': 'empty',\n },\n }\n}\n\nexport interface OverlayOptions<S> {\n get: (s: S) => ComboboxState\n send: Send<ComboboxMsg>\n parts: ComboboxParts<S>\n content: () => Node[]\n placement?: Placement\n offset?: number\n flip?: boolean\n shift?: boolean\n sameWidth?: boolean\n transition?: TransitionOptions\n target?: string | HTMLElement\n}\n\nexport function overlay<S>(opts: OverlayOptions<S>): Node[] {\n const target = opts.target ?? 'body'\n const placement = opts.placement ?? 'bottom-start'\n const offset = opts.offset ?? 4\n const flip = opts.flip !== false\n const shift = opts.shift !== false\n const sameWidth = opts.sameWidth !== false\n const parts = opts.parts\n const contentId = parts.content.id\n const inputId = parts.input.id\n\n return show<S, ComboboxMsg>({\n when: (s) => opts.get(s).open,\n render: () =>\n portal({\n target,\n render: () => {\n onMount(() => {\n const contentEl = document.getElementById(contentId)\n const inputEl = document.getElementById(inputId)\n if (!contentEl || !inputEl) return\n\n const cleanups: Array<() => void> = []\n const positioner = contentEl.closest('[data-part=\"positioner\"]') as HTMLElement | null\n const floatingEl = positioner ?? contentEl\n if (sameWidth) {\n floatingEl.style.minWidth = `${inputEl.offsetWidth}px`\n }\n cleanups.push(\n attachFloating({\n anchor: inputEl,\n floating: floatingEl,\n placement,\n offset,\n flip,\n shift,\n }),\n )\n cleanups.push(\n pushDismissable({\n element: contentEl,\n ignore: () => [inputEl],\n onDismiss: () => opts.send({ type: 'close' }),\n }),\n )\n return () => {\n for (let i = cleanups.length - 1; i >= 0; i--) cleanups[i]!()\n }\n })\n return [div(parts.positioner, opts.content())]\n },\n }),\n enter: opts.transition?.enter,\n leave: opts.transition?.leave,\n })\n}\n\nexport const combobox = { init, update, connect, overlay }\n"]}
1
+ {"version":3,"file":"combobox.js","sourceRoot":"","sources":["../../src/components/combobox.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send, Signal, TransitionOptions } from '@llui/dom'\nimport { show, portal, onMount, div, useContext, tagSend } from '@llui/dom'\nimport { LocaleContext } from '../locale.js'\nimport { pushDismissable } from '../utils/dismissable.js'\nimport { attachFloating, type Placement } from '../utils/floating.js'\n\n/**\n * Combobox — text input paired with a filtered listbox dropdown. User\n * types to filter items, arrow keys navigate the filtered set, Enter\n * selects. Supports single and multiple selection.\n */\n\nexport type SelectionMode = 'single' | 'multiple'\n\nexport interface ComboboxState {\n open: boolean\n value: string[]\n inputValue: string\n items: string[]\n disabledItems: string[]\n filteredItems: string[]\n highlightedIndex: number | null\n selectionMode: SelectionMode\n disabled: boolean\n}\n\nexport type ComboboxMsg =\n /** @intent(\"Open the combobox dropdown\") */\n | { type: 'open' }\n /** @intent(\"Close the combobox dropdown\") */\n | { type: 'close' }\n /** @intent(\"Set the text input contents (re-runs the filter)\") */\n | { type: 'setInputValue'; value: string }\n /** @intent(\"Pick the option with the given value (toggles in multi-select)\") */\n | { type: 'selectOption'; value: string }\n /** @intent(\"Replace the selected values with the provided list\") */\n | { type: 'setValue'; value: string[] }\n /** @intent(\"Clear all selected values and the input text\") */\n | { type: 'clear' }\n /** @humanOnly */\n | { type: 'highlightNext' }\n /** @humanOnly */\n | { type: 'highlightPrev' }\n /** @humanOnly */\n | { type: 'highlightFirst' }\n /** @humanOnly */\n | { type: 'highlightLast' }\n /** @humanOnly */\n | { type: 'highlight'; index: number | null }\n /** @intent(\"Pick the currently-highlighted option in the filtered list\") */\n | { type: 'selectHighlighted' }\n /** @humanOnly */\n | { type: 'setItems'; items: string[]; disabled?: string[] }\n\nexport interface ComboboxInit {\n value?: string[]\n inputValue?: string\n items?: string[]\n disabledItems?: string[]\n selectionMode?: SelectionMode\n disabled?: boolean\n}\n\nexport function init(opts: ComboboxInit = {}): ComboboxState {\n const items = opts.items ?? []\n const disabledItems = opts.disabledItems ?? []\n const inputValue = opts.inputValue ?? ''\n return {\n open: false,\n value: opts.value ?? [],\n inputValue,\n items,\n disabledItems,\n filteredItems: filterItems(items, inputValue),\n highlightedIndex: null,\n selectionMode: opts.selectionMode ?? 'single',\n disabled: opts.disabled ?? false,\n }\n}\n\nfunction filterItems(items: string[], query: string): string[] {\n if (query === '') return items\n const q = query.toLowerCase()\n return items.filter((item) => item.toLowerCase().includes(q))\n}\n\nfunction nextEnabledIndex(\n items: string[],\n disabled: string[],\n from: number | null,\n delta: 1 | -1,\n): number | null {\n if (items.length === 0) return null\n const start = from === null ? (delta === 1 ? -1 : items.length) : from\n const n = items.length\n for (let i = 1; i <= n; i++) {\n const idx = (start + delta * i + n * n) % n\n if (!disabled.includes(items[idx]!)) return idx\n }\n return null\n}\n\nfunction firstEnabledIndex(items: string[], disabled: string[]): number | null {\n for (let i = 0; i < items.length; i++) {\n if (!disabled.includes(items[i]!)) return i\n }\n return null\n}\n\nfunction lastEnabledIndex(items: string[], disabled: string[]): number | null {\n for (let i = items.length - 1; i >= 0; i--) {\n if (!disabled.includes(items[i]!)) return i\n }\n return null\n}\n\nfunction applySelection(state: ComboboxState, value: string): string[] {\n if (state.disabledItems.includes(value)) return state.value\n if (state.selectionMode === 'single') return [value]\n const isActive = state.value.includes(value)\n return isActive ? state.value.filter((v) => v !== value) : [...state.value, value]\n}\n\nexport function update(state: ComboboxState, msg: ComboboxMsg): [ComboboxState, never[]] {\n if (state.disabled && msg.type !== 'setItems') return [state, []]\n switch (msg.type) {\n case 'open':\n return [\n {\n ...state,\n open: true,\n highlightedIndex: firstEnabledIndex(state.filteredItems, state.disabledItems),\n },\n [],\n ]\n case 'close':\n return [{ ...state, open: false, highlightedIndex: null }, []]\n case 'setInputValue': {\n const filteredItems = filterItems(state.items, msg.value)\n return [\n {\n ...state,\n inputValue: msg.value,\n filteredItems,\n open: true,\n highlightedIndex: firstEnabledIndex(filteredItems, state.disabledItems),\n },\n [],\n ]\n }\n case 'selectOption': {\n const value = applySelection(state, msg.value)\n const inputValue = state.selectionMode === 'single' ? msg.value : ''\n const filteredItems = filterItems(state.items, inputValue)\n const open = state.selectionMode === 'single' ? false : state.open\n return [\n {\n ...state,\n value,\n inputValue,\n filteredItems,\n open,\n highlightedIndex: open ? state.highlightedIndex : null,\n },\n [],\n ]\n }\n case 'setValue':\n return [{ ...state, value: msg.value }, []]\n case 'clear':\n return [\n { ...state, value: [], inputValue: '', filteredItems: state.items, highlightedIndex: null },\n [],\n ]\n case 'highlight':\n return [{ ...state, highlightedIndex: msg.index }, []]\n case 'highlightNext':\n return [\n {\n ...state,\n highlightedIndex: nextEnabledIndex(\n state.filteredItems,\n state.disabledItems,\n state.highlightedIndex,\n 1,\n ),\n },\n [],\n ]\n case 'highlightPrev':\n return [\n {\n ...state,\n highlightedIndex: nextEnabledIndex(\n state.filteredItems,\n state.disabledItems,\n state.highlightedIndex,\n -1,\n ),\n },\n [],\n ]\n case 'highlightFirst':\n return [\n { ...state, highlightedIndex: firstEnabledIndex(state.filteredItems, state.disabledItems) },\n [],\n ]\n case 'highlightLast':\n return [\n { ...state, highlightedIndex: lastEnabledIndex(state.filteredItems, state.disabledItems) },\n [],\n ]\n case 'selectHighlighted': {\n if (state.highlightedIndex === null) return [state, []]\n const v = state.filteredItems[state.highlightedIndex]\n if (v === undefined) return [state, []]\n const value = applySelection(state, v)\n const inputValue = state.selectionMode === 'single' ? v : ''\n const filteredItems = filterItems(state.items, inputValue)\n const open = state.selectionMode === 'single' ? false : state.open\n return [\n {\n ...state,\n value,\n inputValue,\n filteredItems,\n open,\n highlightedIndex: open ? state.highlightedIndex : null,\n },\n [],\n ]\n }\n case 'setItems': {\n const disabled = msg.disabled ?? state.disabledItems\n const value = state.value.filter((v) => msg.items.includes(v) && !disabled.includes(v))\n return [\n {\n ...state,\n items: msg.items,\n disabledItems: disabled,\n filteredItems: filterItems(msg.items, state.inputValue),\n value,\n },\n [],\n ]\n }\n }\n}\n\nexport interface ComboboxItemParts {\n item: {\n role: 'option'\n id: string\n 'aria-selected': Signal<boolean>\n 'aria-disabled': Signal<'true' | undefined>\n 'data-state': Signal<'selected' | undefined>\n 'data-highlighted': Signal<'' | undefined>\n 'data-disabled': Signal<'' | undefined>\n 'data-scope': 'combobox'\n 'data-part': 'item'\n 'data-value': string\n 'data-index': string\n onClick: (e: MouseEvent) => void\n onPointerMove: (e: PointerEvent) => void\n }\n}\n\nexport interface ComboboxParts {\n root: {\n role: 'combobox'\n 'aria-expanded': Signal<boolean>\n 'aria-controls': string\n 'aria-haspopup': 'listbox'\n 'data-scope': 'combobox'\n 'data-part': 'root'\n 'data-state': Signal<'open' | 'closed'>\n }\n input: {\n type: 'text'\n role: 'combobox'\n autoComplete: 'off'\n 'aria-autocomplete': 'list'\n 'aria-expanded': Signal<boolean>\n 'aria-controls': string\n 'aria-activedescendant': Signal<string | undefined>\n 'aria-disabled': Signal<'true' | undefined>\n id: string\n disabled: Signal<boolean>\n value: Signal<string>\n 'data-scope': 'combobox'\n 'data-part': 'input'\n onInput: (e: Event) => void\n onKeyDown: (e: KeyboardEvent) => void\n onFocus: (e: FocusEvent) => void\n }\n trigger: {\n type: 'button'\n 'aria-label': string\n 'aria-expanded': Signal<boolean>\n 'aria-controls': string\n tabIndex: -1\n 'data-scope': 'combobox'\n 'data-part': 'trigger'\n onClick: (e: MouseEvent) => void\n }\n positioner: {\n 'data-scope': 'combobox'\n 'data-part': 'positioner'\n style: string\n }\n content: {\n role: 'listbox'\n id: string\n 'aria-labelledby': string\n tabIndex: -1\n 'data-state': Signal<'open' | 'closed'>\n 'data-scope': 'combobox'\n 'data-part': 'content'\n }\n item: (value: string, index: number) => ComboboxItemParts\n empty: {\n 'data-scope': 'combobox'\n 'data-part': 'empty'\n }\n}\n\nexport interface ConnectOptions {\n id: string\n triggerLabel?: string\n}\n\nexport function connect(\n state: Signal<ComboboxState>,\n send: Send<ComboboxMsg>,\n opts: ConnectOptions,\n): ComboboxParts {\n const locale = useContext(LocaleContext)\n const base = opts.id\n const inputId = `${base}:input`\n const contentId = `${base}:content`\n const itemId = (index: number): string => `${base}:item:${index}`\n const triggerLabel = opts.triggerLabel ?? locale.combobox.toggle\n\n return {\n root: {\n role: 'combobox',\n 'aria-expanded': state.map((s) => s.open),\n 'aria-controls': contentId,\n 'aria-haspopup': 'listbox',\n 'data-scope': 'combobox',\n 'data-part': 'root',\n 'data-state': state.map((s) => (s.open ? 'open' : 'closed')),\n },\n input: {\n type: 'text',\n role: 'combobox',\n autoComplete: 'off',\n 'aria-autocomplete': 'list',\n 'aria-expanded': state.map((s) => s.open),\n 'aria-controls': contentId,\n 'aria-activedescendant': state.map((s) => {\n const idx = s.highlightedIndex\n return idx === null ? undefined : itemId(idx)\n }),\n 'aria-disabled': state.map((s) => (s.disabled ? 'true' : undefined)),\n id: inputId,\n disabled: state.map((s) => s.disabled),\n value: state.map((s) => s.inputValue),\n 'data-scope': 'combobox',\n 'data-part': 'input',\n onInput: tagSend(send, ['setInputValue'], (e) => {\n const value = (e.target as HTMLInputElement).value\n send({ type: 'setInputValue', value })\n }),\n onKeyDown: tagSend(\n send,\n [\n 'open',\n 'highlightNext',\n 'highlightPrev',\n 'highlightFirst',\n 'highlightLast',\n 'selectHighlighted',\n 'close',\n ],\n (e) => {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n send({ type: 'open' })\n send({ type: 'highlightNext' })\n return\n case 'ArrowUp':\n e.preventDefault()\n send({ type: 'open' })\n send({ type: 'highlightPrev' })\n return\n case 'Home':\n e.preventDefault()\n send({ type: 'highlightFirst' })\n return\n case 'End':\n e.preventDefault()\n send({ type: 'highlightLast' })\n return\n case 'Enter':\n e.preventDefault()\n send({ type: 'selectHighlighted' })\n return\n case 'Escape':\n e.preventDefault()\n send({ type: 'close' })\n return\n }\n },\n ),\n onFocus: tagSend(send, ['open'], () => send({ type: 'open' })),\n },\n trigger: {\n type: 'button',\n 'aria-label': triggerLabel,\n 'aria-expanded': state.map((s) => s.open),\n 'aria-controls': contentId,\n tabIndex: -1,\n 'data-scope': 'combobox',\n 'data-part': 'trigger',\n onClick: tagSend(send, ['open'], () => send({ type: 'open' })),\n },\n positioner: {\n 'data-scope': 'combobox',\n 'data-part': 'positioner',\n style: 'position:absolute;top:0;left:0;',\n },\n content: {\n role: 'listbox',\n id: contentId,\n 'aria-labelledby': inputId,\n tabIndex: -1,\n 'data-state': state.map((s) => (s.open ? 'open' : 'closed')),\n 'data-scope': 'combobox',\n 'data-part': 'content',\n },\n item: (value: string, index: number): ComboboxItemParts => ({\n item: {\n role: 'option',\n id: itemId(index),\n 'aria-selected': state.map((s) => s.value.includes(value)),\n 'aria-disabled': state.map((s) => (s.disabledItems.includes(value) ? 'true' : undefined)),\n 'data-state': state.map((s) => (s.value.includes(value) ? 'selected' : undefined)),\n 'data-highlighted': state.map((s) => (s.highlightedIndex === index ? '' : undefined)),\n 'data-disabled': state.map((s) => (s.disabledItems.includes(value) ? '' : undefined)),\n 'data-scope': 'combobox',\n 'data-part': 'item',\n 'data-value': value,\n 'data-index': String(index),\n onClick: tagSend(send, ['selectOption'], () => send({ type: 'selectOption', value })),\n onPointerMove: tagSend(send, ['highlight'], () => send({ type: 'highlight', index })),\n },\n }),\n empty: {\n 'data-scope': 'combobox',\n 'data-part': 'empty',\n },\n }\n}\n\nexport interface OverlayOptions {\n state: Signal<ComboboxState>\n send: Send<ComboboxMsg>\n parts: ComboboxParts\n content: () => readonly Node[]\n placement?: Placement\n offset?: number\n flip?: boolean\n shift?: boolean\n sameWidth?: boolean\n transition?: TransitionOptions\n target?: string | HTMLElement\n}\n\nexport function overlay(opts: OverlayOptions): Node {\n const targetOpt = opts.target ?? 'body'\n const placement = opts.placement ?? 'bottom-start'\n const offset = opts.offset ?? 4\n const flip = opts.flip !== false\n const shift = opts.shift !== false\n const sameWidth = opts.sameWidth !== false\n const parts = opts.parts\n const contentId = parts.content.id\n const inputId = parts.input.id\n const host =\n typeof targetOpt === 'string' ? (document.querySelector(targetOpt) ?? document.body) : targetOpt\n\n return show(\n opts.state.map((s) => s.open),\n () => [\n portal(() => {\n onMount(() => {\n const contentEl = document.getElementById(contentId)\n const inputEl = document.getElementById(inputId)\n if (!contentEl || !inputEl) return\n\n const cleanups: Array<() => void> = []\n const positioner = contentEl.closest('[data-part=\"positioner\"]') as HTMLElement | null\n const floatingEl = positioner ?? contentEl\n if (sameWidth) {\n floatingEl.style.minWidth = `${inputEl.offsetWidth}px`\n }\n cleanups.push(\n attachFloating({\n anchor: inputEl,\n floating: floatingEl,\n placement,\n offset,\n flip,\n shift,\n }),\n )\n cleanups.push(\n pushDismissable({\n element: contentEl,\n ignore: () => [inputEl],\n onDismiss: () => opts.send({ type: 'close' }),\n }),\n )\n return () => {\n for (let i = cleanups.length - 1; i >= 0; i--) cleanups[i]!()\n }\n })\n return [div(parts.positioner, opts.content())]\n }, host),\n ],\n )\n}\n\nexport const combobox = { init, update, connect, overlay }\n"]}
@@ -1,4 +1,4 @@
1
- import type { Send, TransitionOptions } from '@llui/dom';
1
+ import type { Send, Signal, TransitionOptions } from '@llui/dom';
2
2
  /**
3
3
  * Context menu — right-click (contextmenu) triggered menu positioned at
4
4
  * the pointer. Unlike regular menu, it has no trigger button — the user
@@ -60,13 +60,13 @@ export interface ContextMenuInit {
60
60
  }
61
61
  export declare function init(opts?: ContextMenuInit): ContextMenuState;
62
62
  export declare function update(state: ContextMenuState, msg: ContextMenuMsg): [ContextMenuState, never[]];
63
- export interface ContextMenuItemParts<S> {
63
+ export interface ContextMenuItemParts {
64
64
  item: {
65
65
  role: 'menuitem';
66
66
  id: string;
67
- 'aria-disabled': (s: S) => 'true' | undefined;
68
- 'data-state': (s: S) => 'highlighted' | undefined;
69
- 'data-disabled': (s: S) => '' | undefined;
67
+ 'aria-disabled': Signal<'true' | undefined>;
68
+ 'data-state': Signal<'highlighted' | undefined>;
69
+ 'data-disabled': Signal<'' | undefined>;
70
70
  'data-scope': 'context-menu';
71
71
  'data-part': 'item';
72
72
  'data-value': string;
@@ -75,7 +75,7 @@ export interface ContextMenuItemParts<S> {
75
75
  onPointerMove: (e: PointerEvent) => void;
76
76
  };
77
77
  }
78
- export interface ContextMenuParts<S> {
78
+ export interface ContextMenuParts {
79
79
  /** The element users right-click to open the menu. */
80
80
  trigger: {
81
81
  'data-scope': 'context-menu';
@@ -85,33 +85,33 @@ export interface ContextMenuParts<S> {
85
85
  positioner: {
86
86
  'data-scope': 'context-menu';
87
87
  'data-part': 'positioner';
88
- style: (s: S) => string;
88
+ style: Signal<string>;
89
89
  };
90
90
  content: {
91
91
  role: 'menu';
92
92
  id: string;
93
93
  tabIndex: -1;
94
- 'data-state': (s: S) => 'open' | 'closed';
94
+ 'data-state': Signal<'open' | 'closed'>;
95
95
  'data-scope': 'context-menu';
96
96
  'data-part': 'content';
97
97
  onKeyDown: (e: KeyboardEvent) => void;
98
98
  };
99
- item: (value: string) => ContextMenuItemParts<S>;
99
+ item: (value: string) => ContextMenuItemParts;
100
100
  }
101
101
  export interface ConnectOptions {
102
102
  id: string;
103
103
  onSelect?: (value: string) => void;
104
104
  }
105
- export declare function connect<S>(get: (s: S) => ContextMenuState, send: Send<ContextMenuMsg>, opts: ConnectOptions): ContextMenuParts<S>;
106
- export interface OverlayOptions<S> {
107
- get: (s: S) => ContextMenuState;
105
+ export declare function connect(state: Signal<ContextMenuState>, send: Send<ContextMenuMsg>, opts: ConnectOptions): ContextMenuParts;
106
+ export interface OverlayOptions {
107
+ state: Signal<ContextMenuState>;
108
108
  send: Send<ContextMenuMsg>;
109
- parts: ContextMenuParts<S>;
109
+ parts: ContextMenuParts;
110
110
  content: () => Node[];
111
111
  transition?: TransitionOptions;
112
112
  target?: string | HTMLElement;
113
113
  }
114
- export declare function overlay<S>(opts: OverlayOptions<S>): Node[];
114
+ export declare function overlay(opts: OverlayOptions): Node;
115
115
  export declare const contextMenu: {
116
116
  init: typeof init;
117
117
  update: typeof update;
@@ -1 +1 @@
1
- {"version":3,"file":"context-menu.d.ts","sourceRoot":"","sources":["../../src/components/context-menu.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context-menu.d.ts","sourceRoot":"","sources":["../../src/components/context-menu.ts"],"names":[],"mappings":"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"}
@@ -78,7 +78,7 @@ export function update(state, msg) {
78
78
  }
79
79
  }
80
80
  }
81
- export function connect(get, send, opts) {
81
+ export function connect(state, send, opts) {
82
82
  const contentId = `${opts.id}:content`;
83
83
  const itemId = (v) => `${opts.id}:item:${v}`;
84
84
  return {
@@ -93,16 +93,13 @@ export function connect(get, send, opts) {
93
93
  positioner: {
94
94
  'data-scope': 'context-menu',
95
95
  'data-part': 'positioner',
96
- style: (s) => {
97
- const st = get(s);
98
- return `position:fixed;top:${st.y}px;left:${st.x}px;`;
99
- },
96
+ style: state.map((st) => `position:fixed;top:${st.y}px;left:${st.x}px;`),
100
97
  },
101
98
  content: {
102
99
  role: 'menu',
103
100
  id: contentId,
104
101
  tabIndex: -1,
105
- 'data-state': (s) => (get(s).open ? 'open' : 'closed'),
102
+ 'data-state': state.map((s) => (s.open ? 'open' : 'closed')),
106
103
  'data-scope': 'context-menu',
107
104
  'data-part': 'content',
108
105
  onKeyDown: tagSend(send, ['highlightNext', 'highlightPrev', 'selectHighlighted', 'close'], (e) => {
@@ -131,9 +128,9 @@ export function connect(get, send, opts) {
131
128
  item: {
132
129
  role: 'menuitem',
133
130
  id: itemId(value),
134
- 'aria-disabled': (s) => (get(s).disabledItems.includes(value) ? 'true' : undefined),
135
- 'data-state': (s) => (get(s).highlighted === value ? 'highlighted' : undefined),
136
- 'data-disabled': (s) => (get(s).disabledItems.includes(value) ? '' : undefined),
131
+ 'aria-disabled': state.map((s) => (s.disabledItems.includes(value) ? 'true' : undefined)),
132
+ 'data-state': state.map((s) => (s.highlighted === value ? 'highlighted' : undefined)),
133
+ 'data-disabled': state.map((s) => (s.disabledItems.includes(value) ? '' : undefined)),
137
134
  'data-scope': 'context-menu',
138
135
  'data-part': 'item',
139
136
  'data-value': value,
@@ -148,14 +145,15 @@ export function connect(get, send, opts) {
148
145
  };
149
146
  }
150
147
  export function overlay(opts) {
151
- const target = opts.target ?? 'body';
148
+ const rawTarget = opts.target ?? 'body';
152
149
  const parts = opts.parts;
153
150
  const contentId = parts.content.id;
154
- return show({
155
- when: (s) => opts.get(s).open,
156
- render: () => portal({
157
- target,
158
- render: () => {
151
+ return show(opts.state.map((s) => s.open), () => {
152
+ const targetEl = typeof rawTarget === 'string'
153
+ ? (document.querySelector(rawTarget) ?? document.body)
154
+ : rawTarget;
155
+ return [
156
+ portal(() => {
159
157
  onMount(() => {
160
158
  const contentEl = document.getElementById(contentId);
161
159
  if (!contentEl)
@@ -168,10 +166,8 @@ export function overlay(opts) {
168
166
  return cleanup;
169
167
  });
170
168
  return [div(parts.positioner, opts.content())];
171
- },
172
- }),
173
- enter: opts.transition?.enter,
174
- leave: opts.transition?.leave,
169
+ }, targetEl),
170
+ ];
175
171
  });
176
172
  }
177
173
  export const contextMenu = { init, update, connect, overlay };
@@ -1 +1 @@
1
- {"version":3,"file":"context-menu.js","sourceRoot":"","sources":["../../src/components/context-menu.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send, TransitionOptions } from '@llui/dom'\nimport { show, portal, onMount, div, tagSend } from '@llui/dom'\nimport { pushDismissable } from '../utils/dismissable.js'\n\n/**\n * Context menu — right-click (contextmenu) triggered menu positioned at\n * the pointer. Unlike regular menu, it has no trigger button — the user\n * right-clicks anywhere in the associated region.\n *\n * Uses raw x/y positioning instead of floating-ui (pointer is the anchor,\n * not an element).\n */\n\nexport interface ContextMenuState {\n open: boolean\n x: number\n y: number\n items: string[]\n disabledItems: string[]\n highlighted: string | null\n}\n\nexport type ContextMenuMsg =\n /** @humanOnly */\n | { type: 'openAt'; x: number; y: number }\n /** @intent(\"Close the context menu\") */\n | { type: 'close' }\n /** @humanOnly */\n | { type: 'highlight'; value: string | null }\n /** @humanOnly */\n | { type: 'highlightNext' }\n /** @humanOnly */\n | { type: 'highlightPrev' }\n /** @intent(\"Activate the currently-highlighted menu item\") */\n | { type: 'selectHighlighted' }\n /** @intent(\"Activate the menu item with the given value\") */\n | { type: 'select'; value: string }\n /** @humanOnly */\n | { type: 'setItems'; items: string[]; disabled?: string[] }\n\nexport interface ContextMenuInit {\n items?: string[]\n disabledItems?: string[]\n}\n\nexport function init(opts: ContextMenuInit = {}): ContextMenuState {\n return {\n open: false,\n x: 0,\n y: 0,\n items: opts.items ?? [],\n disabledItems: opts.disabledItems ?? [],\n highlighted: null,\n }\n}\n\nfunction firstEnabled(items: string[], disabled: string[]): string | null {\n for (const v of items) if (!disabled.includes(v)) return v\n return null\n}\n\nfunction nextEnabled(\n items: string[],\n disabled: string[],\n from: string | null,\n delta: 1 | -1,\n): string | null {\n if (items.length === 0) return null\n const start = from === null ? -1 : items.indexOf(from)\n const n = items.length\n for (let i = 1; i <= n; i++) {\n const idx = start === -1 && delta === 1 ? i - 1 : (start + delta * i + n * n) % n\n const v = items[idx]!\n if (!disabled.includes(v)) return v\n }\n return null\n}\n\nexport function update(state: ContextMenuState, msg: ContextMenuMsg): [ContextMenuState, never[]] {\n switch (msg.type) {\n case 'openAt':\n return [\n {\n ...state,\n open: true,\n x: msg.x,\n y: msg.y,\n highlighted: firstEnabled(state.items, state.disabledItems),\n },\n [],\n ]\n case 'close':\n return [{ ...state, open: false, highlighted: null }, []]\n case 'highlight':\n if (msg.value !== null && state.disabledItems.includes(msg.value)) return [state, []]\n return [{ ...state, highlighted: msg.value }, []]\n case 'highlightNext':\n return [\n {\n ...state,\n highlighted: nextEnabled(state.items, state.disabledItems, state.highlighted, 1),\n },\n [],\n ]\n case 'highlightPrev':\n return [\n {\n ...state,\n highlighted: nextEnabled(state.items, state.disabledItems, state.highlighted, -1),\n },\n [],\n ]\n case 'selectHighlighted':\n if (state.highlighted === null) return [state, []]\n return [{ ...state, open: false, highlighted: null }, []]\n case 'select':\n if (state.disabledItems.includes(msg.value)) return [state, []]\n return [{ ...state, open: false, highlighted: null }, []]\n case 'setItems': {\n const disabled = msg.disabled ?? state.disabledItems\n return [{ ...state, items: msg.items, disabledItems: disabled }, []]\n }\n }\n}\n\nexport interface ContextMenuItemParts<S> {\n item: {\n role: 'menuitem'\n id: string\n 'aria-disabled': (s: S) => 'true' | undefined\n 'data-state': (s: S) => 'highlighted' | undefined\n 'data-disabled': (s: S) => '' | undefined\n 'data-scope': 'context-menu'\n 'data-part': 'item'\n 'data-value': string\n tabIndex: -1\n onClick: (e: MouseEvent) => void\n onPointerMove: (e: PointerEvent) => void\n }\n}\n\nexport interface ContextMenuParts<S> {\n /** The element users right-click to open the menu. */\n trigger: {\n 'data-scope': 'context-menu'\n 'data-part': 'trigger'\n onContextMenu: (e: MouseEvent) => void\n }\n positioner: {\n 'data-scope': 'context-menu'\n 'data-part': 'positioner'\n style: (s: S) => string\n }\n content: {\n role: 'menu'\n id: string\n tabIndex: -1\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-scope': 'context-menu'\n 'data-part': 'content'\n onKeyDown: (e: KeyboardEvent) => void\n }\n item: (value: string) => ContextMenuItemParts<S>\n}\n\nexport interface ConnectOptions {\n id: string\n onSelect?: (value: string) => void\n}\n\nexport function connect<S>(\n get: (s: S) => ContextMenuState,\n send: Send<ContextMenuMsg>,\n opts: ConnectOptions,\n): ContextMenuParts<S> {\n const contentId = `${opts.id}:content`\n const itemId = (v: string): string => `${opts.id}:item:${v}`\n\n return {\n trigger: {\n 'data-scope': 'context-menu',\n 'data-part': 'trigger',\n onContextMenu: tagSend(send, ['openAt'], (e) => {\n e.preventDefault()\n send({ type: 'openAt', x: e.clientX, y: e.clientY })\n }),\n },\n positioner: {\n 'data-scope': 'context-menu',\n 'data-part': 'positioner',\n style: (s) => {\n const st = get(s)\n return `position:fixed;top:${st.y}px;left:${st.x}px;`\n },\n },\n content: {\n role: 'menu',\n id: contentId,\n tabIndex: -1,\n 'data-state': (s) => (get(s).open ? 'open' : 'closed'),\n 'data-scope': 'context-menu',\n 'data-part': 'content',\n onKeyDown: tagSend(\n send,\n ['highlightNext', 'highlightPrev', 'selectHighlighted', 'close'],\n (e) => {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n send({ type: 'highlightNext' })\n return\n case 'ArrowUp':\n e.preventDefault()\n send({ type: 'highlightPrev' })\n return\n case 'Enter':\n case ' ':\n e.preventDefault()\n send({ type: 'selectHighlighted' })\n return\n case 'Escape':\n e.preventDefault()\n send({ type: 'close' })\n return\n }\n },\n ),\n },\n item: (value: string): ContextMenuItemParts<S> => ({\n item: {\n role: 'menuitem',\n id: itemId(value),\n 'aria-disabled': (s) => (get(s).disabledItems.includes(value) ? 'true' : undefined),\n 'data-state': (s) => (get(s).highlighted === value ? 'highlighted' : undefined),\n 'data-disabled': (s) => (get(s).disabledItems.includes(value) ? '' : undefined),\n 'data-scope': 'context-menu',\n 'data-part': 'item',\n 'data-value': value,\n tabIndex: -1,\n onClick: tagSend(send, ['select'], () => {\n send({ type: 'select', value })\n opts.onSelect?.(value)\n }),\n onPointerMove: tagSend(send, ['highlight'], () => send({ type: 'highlight', value })),\n },\n }),\n }\n}\n\nexport interface OverlayOptions<S> {\n get: (s: S) => ContextMenuState\n send: Send<ContextMenuMsg>\n parts: ContextMenuParts<S>\n content: () => Node[]\n transition?: TransitionOptions\n target?: string | HTMLElement\n}\n\nexport function overlay<S>(opts: OverlayOptions<S>): Node[] {\n const target = opts.target ?? 'body'\n const parts = opts.parts\n const contentId = parts.content.id\n\n return show<S, ContextMenuMsg>({\n when: (s) => opts.get(s).open,\n render: () =>\n portal({\n target,\n render: () => {\n onMount(() => {\n const contentEl = document.getElementById(contentId)\n if (!contentEl) return\n contentEl.focus({ preventScroll: true })\n const cleanup = pushDismissable({\n element: contentEl,\n onDismiss: () => opts.send({ type: 'close' }),\n })\n return cleanup\n })\n return [div(parts.positioner, opts.content())]\n },\n }),\n enter: opts.transition?.enter,\n leave: opts.transition?.leave,\n })\n}\n\nexport const contextMenu = { init, update, connect, overlay }\n"]}
1
+ {"version":3,"file":"context-menu.js","sourceRoot":"","sources":["../../src/components/context-menu.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send, Signal, TransitionOptions } from '@llui/dom'\nimport { show, portal, onMount, div, tagSend } from '@llui/dom'\nimport { pushDismissable } from '../utils/dismissable.js'\n\n/**\n * Context menu — right-click (contextmenu) triggered menu positioned at\n * the pointer. Unlike regular menu, it has no trigger button — the user\n * right-clicks anywhere in the associated region.\n *\n * Uses raw x/y positioning instead of floating-ui (pointer is the anchor,\n * not an element).\n */\n\nexport interface ContextMenuState {\n open: boolean\n x: number\n y: number\n items: string[]\n disabledItems: string[]\n highlighted: string | null\n}\n\nexport type ContextMenuMsg =\n /** @humanOnly */\n | { type: 'openAt'; x: number; y: number }\n /** @intent(\"Close the context menu\") */\n | { type: 'close' }\n /** @humanOnly */\n | { type: 'highlight'; value: string | null }\n /** @humanOnly */\n | { type: 'highlightNext' }\n /** @humanOnly */\n | { type: 'highlightPrev' }\n /** @intent(\"Activate the currently-highlighted menu item\") */\n | { type: 'selectHighlighted' }\n /** @intent(\"Activate the menu item with the given value\") */\n | { type: 'select'; value: string }\n /** @humanOnly */\n | { type: 'setItems'; items: string[]; disabled?: string[] }\n\nexport interface ContextMenuInit {\n items?: string[]\n disabledItems?: string[]\n}\n\nexport function init(opts: ContextMenuInit = {}): ContextMenuState {\n return {\n open: false,\n x: 0,\n y: 0,\n items: opts.items ?? [],\n disabledItems: opts.disabledItems ?? [],\n highlighted: null,\n }\n}\n\nfunction firstEnabled(items: string[], disabled: string[]): string | null {\n for (const v of items) if (!disabled.includes(v)) return v\n return null\n}\n\nfunction nextEnabled(\n items: string[],\n disabled: string[],\n from: string | null,\n delta: 1 | -1,\n): string | null {\n if (items.length === 0) return null\n const start = from === null ? -1 : items.indexOf(from)\n const n = items.length\n for (let i = 1; i <= n; i++) {\n const idx = start === -1 && delta === 1 ? i - 1 : (start + delta * i + n * n) % n\n const v = items[idx]!\n if (!disabled.includes(v)) return v\n }\n return null\n}\n\nexport function update(state: ContextMenuState, msg: ContextMenuMsg): [ContextMenuState, never[]] {\n switch (msg.type) {\n case 'openAt':\n return [\n {\n ...state,\n open: true,\n x: msg.x,\n y: msg.y,\n highlighted: firstEnabled(state.items, state.disabledItems),\n },\n [],\n ]\n case 'close':\n return [{ ...state, open: false, highlighted: null }, []]\n case 'highlight':\n if (msg.value !== null && state.disabledItems.includes(msg.value)) return [state, []]\n return [{ ...state, highlighted: msg.value }, []]\n case 'highlightNext':\n return [\n {\n ...state,\n highlighted: nextEnabled(state.items, state.disabledItems, state.highlighted, 1),\n },\n [],\n ]\n case 'highlightPrev':\n return [\n {\n ...state,\n highlighted: nextEnabled(state.items, state.disabledItems, state.highlighted, -1),\n },\n [],\n ]\n case 'selectHighlighted':\n if (state.highlighted === null) return [state, []]\n return [{ ...state, open: false, highlighted: null }, []]\n case 'select':\n if (state.disabledItems.includes(msg.value)) return [state, []]\n return [{ ...state, open: false, highlighted: null }, []]\n case 'setItems': {\n const disabled = msg.disabled ?? state.disabledItems\n return [{ ...state, items: msg.items, disabledItems: disabled }, []]\n }\n }\n}\n\nexport interface ContextMenuItemParts {\n item: {\n role: 'menuitem'\n id: string\n 'aria-disabled': Signal<'true' | undefined>\n 'data-state': Signal<'highlighted' | undefined>\n 'data-disabled': Signal<'' | undefined>\n 'data-scope': 'context-menu'\n 'data-part': 'item'\n 'data-value': string\n tabIndex: -1\n onClick: (e: MouseEvent) => void\n onPointerMove: (e: PointerEvent) => void\n }\n}\n\nexport interface ContextMenuParts {\n /** The element users right-click to open the menu. */\n trigger: {\n 'data-scope': 'context-menu'\n 'data-part': 'trigger'\n onContextMenu: (e: MouseEvent) => void\n }\n positioner: {\n 'data-scope': 'context-menu'\n 'data-part': 'positioner'\n style: Signal<string>\n }\n content: {\n role: 'menu'\n id: string\n tabIndex: -1\n 'data-state': Signal<'open' | 'closed'>\n 'data-scope': 'context-menu'\n 'data-part': 'content'\n onKeyDown: (e: KeyboardEvent) => void\n }\n item: (value: string) => ContextMenuItemParts\n}\n\nexport interface ConnectOptions {\n id: string\n onSelect?: (value: string) => void\n}\n\nexport function connect(\n state: Signal<ContextMenuState>,\n send: Send<ContextMenuMsg>,\n opts: ConnectOptions,\n): ContextMenuParts {\n const contentId = `${opts.id}:content`\n const itemId = (v: string): string => `${opts.id}:item:${v}`\n\n return {\n trigger: {\n 'data-scope': 'context-menu',\n 'data-part': 'trigger',\n onContextMenu: tagSend(send, ['openAt'], (e) => {\n e.preventDefault()\n send({ type: 'openAt', x: e.clientX, y: e.clientY })\n }),\n },\n positioner: {\n 'data-scope': 'context-menu',\n 'data-part': 'positioner',\n style: state.map((st) => `position:fixed;top:${st.y}px;left:${st.x}px;`),\n },\n content: {\n role: 'menu',\n id: contentId,\n tabIndex: -1,\n 'data-state': state.map((s) => (s.open ? 'open' : 'closed')),\n 'data-scope': 'context-menu',\n 'data-part': 'content',\n onKeyDown: tagSend(\n send,\n ['highlightNext', 'highlightPrev', 'selectHighlighted', 'close'],\n (e) => {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n send({ type: 'highlightNext' })\n return\n case 'ArrowUp':\n e.preventDefault()\n send({ type: 'highlightPrev' })\n return\n case 'Enter':\n case ' ':\n e.preventDefault()\n send({ type: 'selectHighlighted' })\n return\n case 'Escape':\n e.preventDefault()\n send({ type: 'close' })\n return\n }\n },\n ),\n },\n item: (value: string): ContextMenuItemParts => ({\n item: {\n role: 'menuitem',\n id: itemId(value),\n 'aria-disabled': state.map((s) => (s.disabledItems.includes(value) ? 'true' : undefined)),\n 'data-state': state.map((s) => (s.highlighted === value ? 'highlighted' : undefined)),\n 'data-disabled': state.map((s) => (s.disabledItems.includes(value) ? '' : undefined)),\n 'data-scope': 'context-menu',\n 'data-part': 'item',\n 'data-value': value,\n tabIndex: -1,\n onClick: tagSend(send, ['select'], () => {\n send({ type: 'select', value })\n opts.onSelect?.(value)\n }),\n onPointerMove: tagSend(send, ['highlight'], () => send({ type: 'highlight', value })),\n },\n }),\n }\n}\n\nexport interface OverlayOptions {\n state: Signal<ContextMenuState>\n send: Send<ContextMenuMsg>\n parts: ContextMenuParts\n content: () => Node[]\n transition?: TransitionOptions\n target?: string | HTMLElement\n}\n\nexport function overlay(opts: OverlayOptions): Node {\n const rawTarget = opts.target ?? 'body'\n const parts = opts.parts\n const contentId = parts.content.id\n\n return show(\n opts.state.map((s) => s.open),\n () => {\n const targetEl =\n typeof rawTarget === 'string'\n ? (document.querySelector(rawTarget) ?? document.body)\n : rawTarget\n return [\n portal(() => {\n onMount(() => {\n const contentEl = document.getElementById(contentId)\n if (!contentEl) return\n contentEl.focus({ preventScroll: true })\n const cleanup = pushDismissable({\n element: contentEl,\n onDismiss: () => opts.send({ type: 'close' }),\n })\n return cleanup\n })\n return [div(parts.positioner, opts.content())]\n }, targetEl),\n ]\n },\n )\n}\n\nexport const contextMenu = { init, update, connect, overlay }\n"]}
@@ -1,4 +1,4 @@
1
- import type { Send } from '@llui/dom';
1
+ import type { Send, Signal } from '@llui/dom';
2
2
  /**
3
3
  * Date input — keyboard-only date field with masked parsing. Unlike
4
4
  * date-picker, this is a plain <input> that parses ISO-ish date strings
@@ -78,23 +78,23 @@ export declare function parseDate(input: string, format?: 'iso' | 'us' | 'eu'):
78
78
  export declare function formatDate(d: Date): string;
79
79
  export declare function init(opts?: DateInputInit): DateInputState;
80
80
  export declare function update(state: DateInputState, msg: DateInputMsg, format?: 'iso' | 'us' | 'eu'): [DateInputState, never[]];
81
- export interface DateInputParts<S> {
81
+ export interface DateInputParts {
82
82
  root: {
83
83
  'data-scope': 'date-input';
84
84
  'data-part': 'root';
85
- 'data-disabled': (s: S) => '' | undefined;
86
- 'data-invalid': (s: S) => '' | undefined;
85
+ 'data-disabled': Signal<'' | undefined>;
86
+ 'data-invalid': Signal<'' | undefined>;
87
87
  };
88
88
  input: {
89
89
  type: 'text';
90
90
  inputMode: 'numeric';
91
91
  autoComplete: 'off';
92
92
  spellCheck: false;
93
- value: (s: S) => string;
94
- disabled: (s: S) => boolean;
95
- readOnly: (s: S) => boolean;
96
- required: (s: S) => boolean;
97
- 'aria-invalid': (s: S) => 'true' | undefined;
93
+ value: Signal<string>;
94
+ disabled: Signal<boolean>;
95
+ readOnly: Signal<boolean>;
96
+ required: Signal<boolean>;
97
+ 'aria-invalid': Signal<'true' | undefined>;
98
98
  placeholder?: string;
99
99
  'data-scope': 'date-input';
100
100
  'data-part': 'input';
@@ -103,8 +103,8 @@ export interface DateInputParts<S> {
103
103
  };
104
104
  clearTrigger: {
105
105
  type: 'button';
106
- 'aria-label': string | ((s: S) => string);
107
- disabled: (s: S) => boolean;
106
+ 'aria-label': string;
107
+ disabled: Signal<boolean>;
108
108
  'data-scope': 'date-input';
109
109
  'data-part': 'clear-trigger';
110
110
  onClick: (e: MouseEvent) => void;
@@ -114,14 +114,14 @@ export interface DateInputParts<S> {
114
114
  'aria-live': 'polite';
115
115
  'data-scope': 'date-input';
116
116
  'data-part': 'error-text';
117
- hidden: (s: S) => boolean;
117
+ hidden: Signal<boolean>;
118
118
  };
119
119
  }
120
120
  export interface ConnectOptions {
121
121
  placeholder?: string;
122
122
  clearLabel?: string;
123
123
  }
124
- export declare function connect<S>(get: (s: S) => DateInputState, send: Send<DateInputMsg>, opts?: ConnectOptions): DateInputParts<S>;
124
+ export declare function connect(state: Signal<DateInputState>, send: Send<DateInputMsg>, opts?: ConnectOptions): DateInputParts;
125
125
  export declare const dateInput: {
126
126
  init: typeof init;
127
127
  update: typeof update;
@@ -1 +1 @@
1
- {"version":3,"file":"date-input.d.ts","sourceRoot":"","sources":["../../src/components/date-input.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"date-input.d.ts","sourceRoot":"","sources":["../../src/components/date-input.ts"],"names":[],"mappings":"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"}
@@ -102,25 +102,25 @@ export function update(state, msg, format = 'iso') {
102
102
  return [{ ...state, disabled: msg.disabled }, []];
103
103
  }
104
104
  }
105
- export function connect(get, send, opts = {}) {
105
+ export function connect(state, send, opts = {}) {
106
106
  const locale = useContext(LocaleContext);
107
107
  return {
108
108
  root: {
109
109
  'data-scope': 'date-input',
110
110
  'data-part': 'root',
111
- 'data-disabled': (s) => (get(s).disabled ? '' : undefined),
112
- 'data-invalid': (s) => (get(s).error ? '' : undefined),
111
+ 'data-disabled': state.map((s) => (s.disabled ? '' : undefined)),
112
+ 'data-invalid': state.map((s) => (s.error ? '' : undefined)),
113
113
  },
114
114
  input: {
115
115
  type: 'text',
116
116
  inputMode: 'numeric',
117
117
  autoComplete: 'off',
118
118
  spellCheck: false,
119
- value: (s) => get(s).input,
120
- disabled: (s) => get(s).disabled,
121
- readOnly: (s) => get(s).readOnly,
122
- required: (s) => get(s).required,
123
- 'aria-invalid': (s) => (get(s).error ? 'true' : undefined),
119
+ value: state.map((s) => s.input),
120
+ disabled: state.map((s) => s.disabled),
121
+ readOnly: state.map((s) => s.readOnly),
122
+ required: state.map((s) => s.required),
123
+ 'aria-invalid': state.map((s) => (s.error ? 'true' : undefined)),
124
124
  ...(opts.placeholder !== undefined ? { placeholder: opts.placeholder } : {}),
125
125
  'data-scope': 'date-input',
126
126
  'data-part': 'input',
@@ -134,8 +134,8 @@ export function connect(get, send, opts = {}) {
134
134
  },
135
135
  clearTrigger: {
136
136
  type: 'button',
137
- 'aria-label': opts.clearLabel ?? ((s) => locale(s).dateInput.clear),
138
- disabled: (s) => get(s).input === '',
137
+ 'aria-label': opts.clearLabel ?? locale.dateInput.clear,
138
+ disabled: state.map((s) => s.input === ''),
139
139
  'data-scope': 'date-input',
140
140
  'data-part': 'clear-trigger',
141
141
  onClick: tagSend(send, ['clear'], () => send({ type: 'clear' })),
@@ -145,7 +145,7 @@ export function connect(get, send, opts = {}) {
145
145
  'aria-live': 'polite',
146
146
  'data-scope': 'date-input',
147
147
  'data-part': 'error-text',
148
- hidden: (s) => get(s).error === null,
148
+ hidden: state.map((s) => s.error === null),
149
149
  },
150
150
  };
151
151
  }