@llui/components 0.0.30 → 0.0.33

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 (216) hide show
  1. package/dist/components/accordion.d.ts +27 -9
  2. package/dist/components/accordion.d.ts.map +1 -1
  3. package/dist/components/accordion.js +4 -3
  4. package/dist/components/accordion.js.map +1 -1
  5. package/dist/components/angle-slider.d.ts +15 -5
  6. package/dist/components/angle-slider.d.ts.map +1 -1
  7. package/dist/components/angle-slider.js +3 -2
  8. package/dist/components/angle-slider.js.map +1 -1
  9. package/dist/components/async-list.d.ts +18 -6
  10. package/dist/components/async-list.d.ts.map +1 -1
  11. package/dist/components/async-list.js +3 -2
  12. package/dist/components/async-list.js.map +1 -1
  13. package/dist/components/avatar.d.ts +12 -4
  14. package/dist/components/avatar.d.ts.map +1 -1
  15. package/dist/components/avatar.js +4 -3
  16. package/dist/components/avatar.js.map +1 -1
  17. package/dist/components/carousel.d.ts +21 -7
  18. package/dist/components/carousel.d.ts.map +1 -1
  19. package/dist/components/carousel.js +8 -8
  20. package/dist/components/carousel.js.map +1 -1
  21. package/dist/components/cascade-select.d.ts +9 -3
  22. package/dist/components/cascade-select.d.ts.map +1 -1
  23. package/dist/components/cascade-select.js +4 -4
  24. package/dist/components/cascade-select.js.map +1 -1
  25. package/dist/components/checkbox.d.ts +9 -3
  26. package/dist/components/checkbox.d.ts.map +1 -1
  27. package/dist/components/checkbox.js +4 -3
  28. package/dist/components/checkbox.js.map +1 -1
  29. package/dist/components/clipboard.d.ts +12 -4
  30. package/dist/components/clipboard.d.ts.map +1 -1
  31. package/dist/components/clipboard.js +3 -3
  32. package/dist/components/clipboard.js.map +1 -1
  33. package/dist/components/collapsible.d.ts +12 -4
  34. package/dist/components/collapsible.d.ts.map +1 -1
  35. package/dist/components/collapsible.js +2 -1
  36. package/dist/components/collapsible.js.map +1 -1
  37. package/dist/components/color-picker.d.ts +18 -6
  38. package/dist/components/color-picker.d.ts.map +1 -1
  39. package/dist/components/color-picker.js +5 -5
  40. package/dist/components/color-picker.js.map +1 -1
  41. package/dist/components/combobox.d.ts +39 -13
  42. package/dist/components/combobox.d.ts.map +1 -1
  43. package/dist/components/combobox.js +17 -9
  44. package/dist/components/combobox.js.map +1 -1
  45. package/dist/components/context-menu.d.ts +24 -8
  46. package/dist/components/context-menu.d.ts.map +1 -1
  47. package/dist/components/context-menu.js +8 -8
  48. package/dist/components/context-menu.js.map +1 -1
  49. package/dist/components/date-input.d.ts +21 -6
  50. package/dist/components/date-input.d.ts.map +1 -1
  51. package/dist/components/date-input.js +4 -4
  52. package/dist/components/date-input.js.map +1 -1
  53. package/dist/components/date-picker.d.ts +36 -12
  54. package/dist/components/date-picker.d.ts.map +1 -1
  55. package/dist/components/date-picker.js +15 -8
  56. package/dist/components/date-picker.js.map +1 -1
  57. package/dist/components/dialog.d.ts +12 -4
  58. package/dist/components/dialog.d.ts.map +1 -1
  59. package/dist/components/dialog.js +3 -3
  60. package/dist/components/dialog.js.map +1 -1
  61. package/dist/components/drawer.d.ts +12 -4
  62. package/dist/components/drawer.d.ts.map +1 -1
  63. package/dist/components/drawer.js +3 -3
  64. package/dist/components/drawer.js.map +1 -1
  65. package/dist/components/editable.d.ts +15 -5
  66. package/dist/components/editable.d.ts.map +1 -1
  67. package/dist/components/editable.js +14 -13
  68. package/dist/components/editable.js.map +1 -1
  69. package/dist/components/file-upload.d.ts +30 -10
  70. package/dist/components/file-upload.d.ts.map +1 -1
  71. package/dist/components/file-upload.js +10 -10
  72. package/dist/components/file-upload.js.map +1 -1
  73. package/dist/components/floating-panel.d.ts +48 -16
  74. package/dist/components/floating-panel.d.ts.map +1 -1
  75. package/dist/components/floating-panel.js +6 -6
  76. package/dist/components/floating-panel.js.map +1 -1
  77. package/dist/components/form.d.ts +18 -6
  78. package/dist/components/form.d.ts.map +1 -1
  79. package/dist/components/form.js +2 -1
  80. package/dist/components/form.js.map +1 -1
  81. package/dist/components/image-cropper.d.ts +33 -11
  82. package/dist/components/image-cropper.d.ts.map +1 -1
  83. package/dist/components/image-cropper.js +6 -6
  84. package/dist/components/image-cropper.js.map +1 -1
  85. package/dist/components/listbox.d.ts +33 -11
  86. package/dist/components/listbox.d.ts.map +1 -1
  87. package/dist/components/listbox.js +12 -4
  88. package/dist/components/listbox.js.map +1 -1
  89. package/dist/components/marquee.d.ts +21 -7
  90. package/dist/components/marquee.d.ts.map +1 -1
  91. package/dist/components/marquee.js +3 -2
  92. package/dist/components/marquee.js.map +1 -1
  93. package/dist/components/menu.d.ts +36 -12
  94. package/dist/components/menu.d.ts.map +1 -1
  95. package/dist/components/menu.js +23 -9
  96. package/dist/components/menu.js.map +1 -1
  97. package/dist/components/navigation-menu.d.ts +15 -5
  98. package/dist/components/navigation-menu.d.ts.map +1 -1
  99. package/dist/components/navigation-menu.js +8 -8
  100. package/dist/components/navigation-menu.js.map +1 -1
  101. package/dist/components/number-input.d.ts +24 -8
  102. package/dist/components/number-input.d.ts.map +1 -1
  103. package/dist/components/number-input.js +8 -8
  104. package/dist/components/number-input.js.map +1 -1
  105. package/dist/components/pagination.d.ts +21 -7
  106. package/dist/components/pagination.d.ts.map +1 -1
  107. package/dist/components/pagination.js +4 -4
  108. package/dist/components/pagination.js.map +1 -1
  109. package/dist/components/password-input.d.ts +9 -3
  110. package/dist/components/password-input.d.ts.map +1 -1
  111. package/dist/components/password-input.js +3 -3
  112. package/dist/components/password-input.js.map +1 -1
  113. package/dist/components/pin-input.d.ts +15 -5
  114. package/dist/components/pin-input.d.ts.map +1 -1
  115. package/dist/components/pin-input.js +8 -7
  116. package/dist/components/pin-input.js.map +1 -1
  117. package/dist/components/popover.d.ts +12 -4
  118. package/dist/components/popover.d.ts.map +1 -1
  119. package/dist/components/popover.js +3 -3
  120. package/dist/components/popover.js.map +1 -1
  121. package/dist/components/presence.d.ts +15 -5
  122. package/dist/components/presence.d.ts.map +1 -1
  123. package/dist/components/presence.js.map +1 -1
  124. package/dist/components/progress.d.ts +6 -2
  125. package/dist/components/progress.d.ts.map +1 -1
  126. package/dist/components/progress.js.map +1 -1
  127. package/dist/components/qr-code.d.ts +9 -3
  128. package/dist/components/qr-code.d.ts.map +1 -1
  129. package/dist/components/qr-code.js.map +1 -1
  130. package/dist/components/radio-group.d.ts +18 -6
  131. package/dist/components/radio-group.d.ts.map +1 -1
  132. package/dist/components/radio-group.js +4 -3
  133. package/dist/components/radio-group.js.map +1 -1
  134. package/dist/components/rating-group.d.ts +21 -7
  135. package/dist/components/rating-group.d.ts.map +1 -1
  136. package/dist/components/rating-group.js +8 -7
  137. package/dist/components/rating-group.js.map +1 -1
  138. package/dist/components/scroll-area.d.ts +9 -3
  139. package/dist/components/scroll-area.d.ts.map +1 -1
  140. package/dist/components/scroll-area.js +5 -4
  141. package/dist/components/scroll-area.js.map +1 -1
  142. package/dist/components/select.d.ts +42 -14
  143. package/dist/components/select.d.ts.map +1 -1
  144. package/dist/components/select.js +4 -4
  145. package/dist/components/select.js.map +1 -1
  146. package/dist/components/signature-pad.d.ts +24 -8
  147. package/dist/components/signature-pad.d.ts.map +1 -1
  148. package/dist/components/signature-pad.js +3 -3
  149. package/dist/components/signature-pad.js.map +1 -1
  150. package/dist/components/slider.d.ts +21 -7
  151. package/dist/components/slider.d.ts.map +1 -1
  152. package/dist/components/slider.js.map +1 -1
  153. package/dist/components/sortable.d.ts +18 -6
  154. package/dist/components/sortable.d.ts.map +1 -1
  155. package/dist/components/sortable.js +11 -10
  156. package/dist/components/sortable.js.map +1 -1
  157. package/dist/components/splitter.d.ts +21 -7
  158. package/dist/components/splitter.d.ts.map +1 -1
  159. package/dist/components/splitter.js +5 -4
  160. package/dist/components/splitter.js.map +1 -1
  161. package/dist/components/steps.d.ts +21 -7
  162. package/dist/components/steps.d.ts.map +1 -1
  163. package/dist/components/steps.js +4 -4
  164. package/dist/components/steps.js.map +1 -1
  165. package/dist/components/switch.d.ts +9 -3
  166. package/dist/components/switch.d.ts.map +1 -1
  167. package/dist/components/switch.js +4 -3
  168. package/dist/components/switch.js.map +1 -1
  169. package/dist/components/tabs.d.ts +24 -8
  170. package/dist/components/tabs.d.ts.map +1 -1
  171. package/dist/components/tabs.js +7 -6
  172. package/dist/components/tabs.js.map +1 -1
  173. package/dist/components/tags-input.d.ts +27 -9
  174. package/dist/components/tags-input.d.ts.map +1 -1
  175. package/dist/components/tags-input.js +10 -10
  176. package/dist/components/tags-input.js.map +1 -1
  177. package/dist/components/theme-switch.d.ts.map +1 -1
  178. package/dist/components/theme-switch.js +3 -2
  179. package/dist/components/theme-switch.js.map +1 -1
  180. package/dist/components/time-picker.d.ts +27 -9
  181. package/dist/components/time-picker.d.ts.map +1 -1
  182. package/dist/components/time-picker.js +10 -10
  183. package/dist/components/time-picker.js.map +1 -1
  184. package/dist/components/timer.d.ts +15 -5
  185. package/dist/components/timer.d.ts.map +1 -1
  186. package/dist/components/timer.js +4 -4
  187. package/dist/components/timer.js.map +1 -1
  188. package/dist/components/toast.d.ts +24 -8
  189. package/dist/components/toast.d.ts.map +1 -1
  190. package/dist/components/toast.js +6 -6
  191. package/dist/components/toast.js.map +1 -1
  192. package/dist/components/toc.d.ts +15 -5
  193. package/dist/components/toc.d.ts.map +1 -1
  194. package/dist/components/toc.js +2 -2
  195. package/dist/components/toc.js.map +1 -1
  196. package/dist/components/toggle-group.d.ts +15 -5
  197. package/dist/components/toggle-group.d.ts.map +1 -1
  198. package/dist/components/toggle-group.js +4 -3
  199. package/dist/components/toggle-group.js.map +1 -1
  200. package/dist/components/toggle.d.ts +9 -3
  201. package/dist/components/toggle.d.ts.map +1 -1
  202. package/dist/components/toggle.js +4 -3
  203. package/dist/components/toggle.js.map +1 -1
  204. package/dist/components/tooltip.d.ts +12 -4
  205. package/dist/components/tooltip.d.ts.map +1 -1
  206. package/dist/components/tooltip.js +3 -3
  207. package/dist/components/tooltip.js.map +1 -1
  208. package/dist/components/tour.d.ts +18 -6
  209. package/dist/components/tour.d.ts.map +1 -1
  210. package/dist/components/tour.js +6 -6
  211. package/dist/components/tour.js.map +1 -1
  212. package/dist/components/tree-view.d.ts +75 -25
  213. package/dist/components/tree-view.d.ts.map +1 -1
  214. package/dist/components/tree-view.js +18 -7
  215. package/dist/components/tree-view.js.map +1 -1
  216. package/package.json +3 -3
@@ -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 } 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 | { type: 'openAt'; x: number; y: number }\n | { type: 'close' }\n | { type: 'highlight'; value: string | null }\n | { type: 'highlightNext' }\n | { type: 'highlightPrev' }\n | { type: 'selectHighlighted' }\n | { type: 'select'; value: string }\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: (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: (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 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: () => {\n send({ type: 'select', value })\n opts.onSelect?.(value)\n },\n onPointerMove: () => 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, 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"]}
@@ -23,21 +23,36 @@ export interface DateInputState {
23
23
  readOnly: boolean;
24
24
  required: boolean;
25
25
  }
26
- export type DateInputMsg = {
26
+ export type DateInputMsg =
27
+ /** @intent("Update the raw text the user has typed (re-parses to a Date)") */
28
+ {
27
29
  type: 'setInput';
28
30
  value: string;
29
- } | {
31
+ }
32
+ /**
33
+ * @intent("Set the parsed date directly (also updates the displayed text)")
34
+ * @codec("iso-date")
35
+ */
36
+ | {
30
37
  type: 'setValue';
31
38
  value: Date | null;
32
- } | {
39
+ }
40
+ /** @intent("Clear the input and the parsed date") */
41
+ | {
33
42
  type: 'clear';
34
- } | {
43
+ }
44
+ /** @humanOnly */
45
+ | {
35
46
  type: 'setMin';
36
47
  min: Date | null;
37
- } | {
48
+ }
49
+ /** @humanOnly */
50
+ | {
38
51
  type: 'setMax';
39
52
  max: Date | null;
40
- } | {
53
+ }
54
+ /** @humanOnly */
55
+ | {
41
56
  type: 'setDisabled';
42
57
  disabled: boolean;
43
58
  };
@@ -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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"}
@@ -1,4 +1,4 @@
1
- import { useContext } from '@llui/dom';
1
+ import { useContext, tagSend } from '@llui/dom';
2
2
  import { LocaleContext } from '../locale.js';
3
3
  /**
4
4
  * Parse an ISO-ish date string. Accepts:
@@ -124,10 +124,10 @@ export function connect(get, send, opts = {}) {
124
124
  ...(opts.placeholder !== undefined ? { placeholder: opts.placeholder } : {}),
125
125
  'data-scope': 'date-input',
126
126
  'data-part': 'input',
127
- onInput: (e) => {
127
+ onInput: tagSend(send, ['setInput'], (e) => {
128
128
  const el = e.target;
129
129
  send({ type: 'setInput', value: el.value });
130
- },
130
+ }),
131
131
  onBlur: () => {
132
132
  /* consumers can add their own blur handling */
133
133
  },
@@ -138,7 +138,7 @@ export function connect(get, send, opts = {}) {
138
138
  disabled: (s) => get(s).input === '',
139
139
  'data-scope': 'date-input',
140
140
  'data-part': 'clear-trigger',
141
- onClick: () => send({ type: 'clear' }),
141
+ onClick: tagSend(send, ['clear'], () => send({ type: 'clear' })),
142
142
  },
143
143
  errorText: {
144
144
  role: 'alert',
@@ -1 +1 @@
1
- {"version":3,"file":"date-input.js","sourceRoot":"","sources":["../../src/components/date-input.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { useContext } from '@llui/dom'\nimport { LocaleContext } from '../locale.js'\nimport type { Locale } from '../locale.js'\n\n/**\n * Date input — keyboard-only date field with masked parsing. Unlike\n * date-picker, this is a plain <input> that parses ISO-ish date strings\n * as the user types. Separate from date-picker to keep each focused.\n *\n * The machine holds the raw input string + the parsed Date (null until\n * a complete/valid value is entered). Min/max bounds are validated on\n * every change, populating `error` when out of range.\n */\n\nexport type DateError = 'invalid' | 'before-min' | 'after-max' | null\n\nexport interface DateInputState {\n /** Raw string as typed by the user. */\n input: string\n /** Parsed date, or null if the input is empty/invalid/out-of-range. */\n value: Date | null\n /** Optional lower bound (inclusive). */\n min: Date | null\n /** Optional upper bound (inclusive). */\n max: Date | null\n error: DateError\n disabled: boolean\n readOnly: boolean\n required: boolean\n}\n\nexport type DateInputMsg =\n | { type: 'setInput'; value: string }\n | { type: 'setValue'; value: Date | null }\n | { type: 'clear' }\n | { type: 'setMin'; min: Date | null }\n | { type: 'setMax'; max: Date | null }\n | { type: 'setDisabled'; disabled: boolean }\n\nexport interface DateInputInit {\n input?: string\n value?: Date | null\n min?: Date | null\n max?: Date | null\n disabled?: boolean\n readOnly?: boolean\n required?: boolean\n}\n\n/**\n * Parse an ISO-ish date string. Accepts:\n * - YYYY-MM-DD\n * - YYYY/MM/DD\n * - MM/DD/YYYY (US)\n * - DD/MM/YYYY (EU)\n * Returns null for anything else.\n */\nexport function parseDate(input: string, format: 'iso' | 'us' | 'eu' = 'iso'): Date | null {\n const trimmed = input.trim()\n if (!trimmed) return null\n const parts = trimmed.split(/[-/]/).map((p) => p.trim())\n if (parts.length !== 3) return null\n const nums = parts.map((p) => parseInt(p, 10))\n if (nums.some((n) => isNaN(n))) return null\n let year: number, month: number, day: number\n if (format === 'iso' || parts[0]!.length === 4) {\n ;[year, month, day] = nums as [number, number, number]\n } else if (format === 'us') {\n ;[month, day, year] = nums as [number, number, number]\n } else {\n ;[day, month, year] = nums as [number, number, number]\n }\n if (month < 1 || month > 12 || day < 1 || day > 31 || year < 1) return null\n const d = new Date(year, month - 1, day)\n // JS Date normalizes: new Date(2024, 1, 30) → March 1. Reject that.\n if (d.getFullYear() !== year || d.getMonth() !== month - 1 || d.getDate() !== day) {\n return null\n }\n return d\n}\n\n/** Format a Date as 'YYYY-MM-DD'. */\nexport function formatDate(d: Date): string {\n const y = d.getFullYear().toString().padStart(4, '0')\n const m = (d.getMonth() + 1).toString().padStart(2, '0')\n const day = d.getDate().toString().padStart(2, '0')\n return `${y}-${m}-${day}`\n}\n\nfunction validate(value: Date | null, min: Date | null, max: Date | null): DateError {\n if (value === null) return null\n if (min !== null && value < min) return 'before-min'\n if (max !== null && value > max) return 'after-max'\n return null\n}\n\nexport function init(opts: DateInputInit = {}): DateInputState {\n const value = opts.value ?? null\n const input = opts.input ?? (value ? formatDate(value) : '')\n const min = opts.min ?? null\n const max = opts.max ?? null\n return {\n input,\n value,\n min,\n max,\n error: validate(value, min, max),\n disabled: opts.disabled ?? false,\n readOnly: opts.readOnly ?? false,\n required: opts.required ?? false,\n }\n}\n\nexport function update(\n state: DateInputState,\n msg: DateInputMsg,\n format: 'iso' | 'us' | 'eu' = 'iso',\n): [DateInputState, never[]] {\n if ((state.disabled || state.readOnly) && msg.type === 'setInput') return [state, []]\n switch (msg.type) {\n case 'setInput': {\n const parsed = parseDate(msg.value, format)\n const error: DateError = msg.value.trim()\n ? parsed === null\n ? 'invalid'\n : validate(parsed, state.min, state.max)\n : null\n return [{ ...state, input: msg.value, value: parsed, error }, []]\n }\n case 'setValue': {\n const input = msg.value ? formatDate(msg.value) : ''\n return [\n { ...state, input, value: msg.value, error: validate(msg.value, state.min, state.max) },\n [],\n ]\n }\n case 'clear':\n return [{ ...state, input: '', value: null, error: null }, []]\n case 'setMin':\n return [{ ...state, min: msg.min, error: validate(state.value, msg.min, state.max) }, []]\n case 'setMax':\n return [{ ...state, max: msg.max, error: validate(state.value, state.min, msg.max) }, []]\n case 'setDisabled':\n return [{ ...state, disabled: msg.disabled }, []]\n }\n}\n\nexport interface DateInputParts<S> {\n root: {\n 'data-scope': 'date-input'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n 'data-invalid': (s: S) => '' | undefined\n }\n input: {\n type: 'text'\n inputMode: 'numeric'\n autoComplete: 'off'\n spellCheck: false\n value: (s: S) => string\n disabled: (s: S) => boolean\n readOnly: (s: S) => boolean\n required: (s: S) => boolean\n 'aria-invalid': (s: S) => 'true' | undefined\n placeholder?: string\n 'data-scope': 'date-input'\n 'data-part': 'input'\n onInput: (e: Event) => void\n onBlur: (e: FocusEvent) => void\n }\n clearTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n disabled: (s: S) => boolean\n 'data-scope': 'date-input'\n 'data-part': 'clear-trigger'\n onClick: (e: MouseEvent) => void\n }\n errorText: {\n role: 'alert'\n 'aria-live': 'polite'\n 'data-scope': 'date-input'\n 'data-part': 'error-text'\n hidden: (s: S) => boolean\n }\n}\n\nexport interface ConnectOptions {\n placeholder?: string\n clearLabel?: string\n}\n\nexport function connect<S>(\n get: (s: S) => DateInputState,\n send: Send<DateInputMsg>,\n opts: ConnectOptions = {},\n): DateInputParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n return {\n root: {\n 'data-scope': 'date-input',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n 'data-invalid': (s) => (get(s).error ? '' : undefined),\n },\n input: {\n type: 'text',\n inputMode: 'numeric',\n autoComplete: 'off',\n spellCheck: false,\n value: (s) => get(s).input,\n disabled: (s) => get(s).disabled,\n readOnly: (s) => get(s).readOnly,\n required: (s) => get(s).required,\n 'aria-invalid': (s) => (get(s).error ? 'true' : undefined),\n ...(opts.placeholder !== undefined ? { placeholder: opts.placeholder } : {}),\n 'data-scope': 'date-input',\n 'data-part': 'input',\n onInput: (e) => {\n const el = e.target as HTMLInputElement\n send({ type: 'setInput', value: el.value })\n },\n onBlur: () => {\n /* consumers can add their own blur handling */\n },\n },\n clearTrigger: {\n type: 'button',\n 'aria-label': opts.clearLabel ?? ((s: S) => locale(s).dateInput.clear),\n disabled: (s) => get(s).input === '',\n 'data-scope': 'date-input',\n 'data-part': 'clear-trigger',\n onClick: () => send({ type: 'clear' }),\n },\n errorText: {\n role: 'alert',\n 'aria-live': 'polite',\n 'data-scope': 'date-input',\n 'data-part': 'error-text',\n hidden: (s) => get(s).error === null,\n },\n }\n}\n\nexport const dateInput = { init, update, connect, parseDate, formatDate }\n"]}
1
+ {"version":3,"file":"date-input.js","sourceRoot":"","sources":["../../src/components/date-input.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { useContext, tagSend } from '@llui/dom'\nimport { LocaleContext } from '../locale.js'\nimport type { Locale } from '../locale.js'\n\n/**\n * Date input — keyboard-only date field with masked parsing. Unlike\n * date-picker, this is a plain <input> that parses ISO-ish date strings\n * as the user types. Separate from date-picker to keep each focused.\n *\n * The machine holds the raw input string + the parsed Date (null until\n * a complete/valid value is entered). Min/max bounds are validated on\n * every change, populating `error` when out of range.\n */\n\nexport type DateError = 'invalid' | 'before-min' | 'after-max' | null\n\nexport interface DateInputState {\n /** Raw string as typed by the user. */\n input: string\n /** Parsed date, or null if the input is empty/invalid/out-of-range. */\n value: Date | null\n /** Optional lower bound (inclusive). */\n min: Date | null\n /** Optional upper bound (inclusive). */\n max: Date | null\n error: DateError\n disabled: boolean\n readOnly: boolean\n required: boolean\n}\n\nexport type DateInputMsg =\n /** @intent(\"Update the raw text the user has typed (re-parses to a Date)\") */\n | { type: 'setInput'; value: string }\n /**\n * @intent(\"Set the parsed date directly (also updates the displayed text)\")\n * @codec(\"iso-date\")\n */\n | { type: 'setValue'; value: Date | null }\n /** @intent(\"Clear the input and the parsed date\") */\n | { type: 'clear' }\n /** @humanOnly */\n | { type: 'setMin'; min: Date | null }\n /** @humanOnly */\n | { type: 'setMax'; max: Date | null }\n /** @humanOnly */\n | { type: 'setDisabled'; disabled: boolean }\n\nexport interface DateInputInit {\n input?: string\n value?: Date | null\n min?: Date | null\n max?: Date | null\n disabled?: boolean\n readOnly?: boolean\n required?: boolean\n}\n\n/**\n * Parse an ISO-ish date string. Accepts:\n * - YYYY-MM-DD\n * - YYYY/MM/DD\n * - MM/DD/YYYY (US)\n * - DD/MM/YYYY (EU)\n * Returns null for anything else.\n */\nexport function parseDate(input: string, format: 'iso' | 'us' | 'eu' = 'iso'): Date | null {\n const trimmed = input.trim()\n if (!trimmed) return null\n const parts = trimmed.split(/[-/]/).map((p) => p.trim())\n if (parts.length !== 3) return null\n const nums = parts.map((p) => parseInt(p, 10))\n if (nums.some((n) => isNaN(n))) return null\n let year: number, month: number, day: number\n if (format === 'iso' || parts[0]!.length === 4) {\n ;[year, month, day] = nums as [number, number, number]\n } else if (format === 'us') {\n ;[month, day, year] = nums as [number, number, number]\n } else {\n ;[day, month, year] = nums as [number, number, number]\n }\n if (month < 1 || month > 12 || day < 1 || day > 31 || year < 1) return null\n const d = new Date(year, month - 1, day)\n // JS Date normalizes: new Date(2024, 1, 30) → March 1. Reject that.\n if (d.getFullYear() !== year || d.getMonth() !== month - 1 || d.getDate() !== day) {\n return null\n }\n return d\n}\n\n/** Format a Date as 'YYYY-MM-DD'. */\nexport function formatDate(d: Date): string {\n const y = d.getFullYear().toString().padStart(4, '0')\n const m = (d.getMonth() + 1).toString().padStart(2, '0')\n const day = d.getDate().toString().padStart(2, '0')\n return `${y}-${m}-${day}`\n}\n\nfunction validate(value: Date | null, min: Date | null, max: Date | null): DateError {\n if (value === null) return null\n if (min !== null && value < min) return 'before-min'\n if (max !== null && value > max) return 'after-max'\n return null\n}\n\nexport function init(opts: DateInputInit = {}): DateInputState {\n const value = opts.value ?? null\n const input = opts.input ?? (value ? formatDate(value) : '')\n const min = opts.min ?? null\n const max = opts.max ?? null\n return {\n input,\n value,\n min,\n max,\n error: validate(value, min, max),\n disabled: opts.disabled ?? false,\n readOnly: opts.readOnly ?? false,\n required: opts.required ?? false,\n }\n}\n\nexport function update(\n state: DateInputState,\n msg: DateInputMsg,\n format: 'iso' | 'us' | 'eu' = 'iso',\n): [DateInputState, never[]] {\n if ((state.disabled || state.readOnly) && msg.type === 'setInput') return [state, []]\n switch (msg.type) {\n case 'setInput': {\n const parsed = parseDate(msg.value, format)\n const error: DateError = msg.value.trim()\n ? parsed === null\n ? 'invalid'\n : validate(parsed, state.min, state.max)\n : null\n return [{ ...state, input: msg.value, value: parsed, error }, []]\n }\n case 'setValue': {\n const input = msg.value ? formatDate(msg.value) : ''\n return [\n { ...state, input, value: msg.value, error: validate(msg.value, state.min, state.max) },\n [],\n ]\n }\n case 'clear':\n return [{ ...state, input: '', value: null, error: null }, []]\n case 'setMin':\n return [{ ...state, min: msg.min, error: validate(state.value, msg.min, state.max) }, []]\n case 'setMax':\n return [{ ...state, max: msg.max, error: validate(state.value, state.min, msg.max) }, []]\n case 'setDisabled':\n return [{ ...state, disabled: msg.disabled }, []]\n }\n}\n\nexport interface DateInputParts<S> {\n root: {\n 'data-scope': 'date-input'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n 'data-invalid': (s: S) => '' | undefined\n }\n input: {\n type: 'text'\n inputMode: 'numeric'\n autoComplete: 'off'\n spellCheck: false\n value: (s: S) => string\n disabled: (s: S) => boolean\n readOnly: (s: S) => boolean\n required: (s: S) => boolean\n 'aria-invalid': (s: S) => 'true' | undefined\n placeholder?: string\n 'data-scope': 'date-input'\n 'data-part': 'input'\n onInput: (e: Event) => void\n onBlur: (e: FocusEvent) => void\n }\n clearTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n disabled: (s: S) => boolean\n 'data-scope': 'date-input'\n 'data-part': 'clear-trigger'\n onClick: (e: MouseEvent) => void\n }\n errorText: {\n role: 'alert'\n 'aria-live': 'polite'\n 'data-scope': 'date-input'\n 'data-part': 'error-text'\n hidden: (s: S) => boolean\n }\n}\n\nexport interface ConnectOptions {\n placeholder?: string\n clearLabel?: string\n}\n\nexport function connect<S>(\n get: (s: S) => DateInputState,\n send: Send<DateInputMsg>,\n opts: ConnectOptions = {},\n): DateInputParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n return {\n root: {\n 'data-scope': 'date-input',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n 'data-invalid': (s) => (get(s).error ? '' : undefined),\n },\n input: {\n type: 'text',\n inputMode: 'numeric',\n autoComplete: 'off',\n spellCheck: false,\n value: (s) => get(s).input,\n disabled: (s) => get(s).disabled,\n readOnly: (s) => get(s).readOnly,\n required: (s) => get(s).required,\n 'aria-invalid': (s) => (get(s).error ? 'true' : undefined),\n ...(opts.placeholder !== undefined ? { placeholder: opts.placeholder } : {}),\n 'data-scope': 'date-input',\n 'data-part': 'input',\n onInput: tagSend(send, ['setInput'], (e) => {\n const el = e.target as HTMLInputElement\n send({ type: 'setInput', value: el.value })\n }),\n onBlur: () => {\n /* consumers can add their own blur handling */\n },\n },\n clearTrigger: {\n type: 'button',\n 'aria-label': opts.clearLabel ?? ((s: S) => locale(s).dateInput.clear),\n disabled: (s) => get(s).input === '',\n 'data-scope': 'date-input',\n 'data-part': 'clear-trigger',\n onClick: tagSend(send, ['clear'], () => send({ type: 'clear' })),\n },\n errorText: {\n role: 'alert',\n 'aria-live': 'polite',\n 'data-scope': 'date-input',\n 'data-part': 'error-text',\n hidden: (s) => get(s).error === null,\n },\n }\n}\n\nexport const dateInput = { init, update, connect, parseDate, formatDate }\n"]}
@@ -24,32 +24,56 @@ export interface DatePickerState {
24
24
  weekStartsOn: 0 | 1;
25
25
  disabled: boolean;
26
26
  }
27
- export type DatePickerMsg = {
27
+ export type DatePickerMsg =
28
+ /** @intent("Set the selected date (YYYY-MM-DD), or null to clear") */
29
+ {
28
30
  type: 'setValue';
29
31
  value: string | null;
30
- } | {
32
+ }
33
+ /** @humanOnly */
34
+ | {
31
35
  type: 'setFocused';
32
36
  date: string;
33
- } | {
37
+ }
38
+ /** @intent("Show the previous month in the calendar") */
39
+ | {
34
40
  type: 'prevMonth';
35
- } | {
41
+ }
42
+ /** @intent("Show the next month in the calendar") */
43
+ | {
36
44
  type: 'nextMonth';
37
- } | {
45
+ }
46
+ /** @intent("Show the previous year (same month)") */
47
+ | {
38
48
  type: 'prevYear';
39
- } | {
49
+ }
50
+ /** @intent("Show the next year (same month)") */
51
+ | {
40
52
  type: 'nextYear';
41
- } | {
53
+ }
54
+ /** @intent("Select the currently-focused date") */
55
+ | {
42
56
  type: 'selectFocused';
43
- } | {
57
+ }
58
+ /** @humanOnly */
59
+ | {
44
60
  type: 'moveFocus';
45
61
  days: number;
46
- } | {
62
+ }
63
+ /** @humanOnly */
64
+ | {
47
65
  type: 'focusStartOfWeek';
48
- } | {
66
+ }
67
+ /** @humanOnly */
68
+ | {
49
69
  type: 'focusEndOfWeek';
50
- } | {
70
+ }
71
+ /** @humanOnly */
72
+ | {
51
73
  type: 'focusToday';
52
- } | {
74
+ }
75
+ /** @intent("Clear the selected date") */
76
+ | {
53
77
  type: 'clear';
54
78
  };
55
79
  export interface DatePickerInit {
@@ -1 +1 @@
1
- {"version":3,"file":"date-picker.d.ts","sourceRoot":"","sources":["../../src/components/date-picker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"date-picker.d.ts","sourceRoot":"","sources":["../../src/components/date-picker.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { useContext } from '@llui/dom';
1
+ import { useContext, tagSend } from '@llui/dom';
2
2
  import { flipArrow } from '../utils/direction.js';
3
3
  import { LocaleContext, en } from '../locale.js';
4
4
  function pad(n) {
@@ -222,7 +222,7 @@ export function connect(get, send, opts = {}) {
222
222
  disabled: (s) => get(s).disabled,
223
223
  'data-scope': 'date-picker',
224
224
  'data-part': 'prev-month-trigger',
225
- onClick: () => send({ type: 'prevMonth' }),
225
+ onClick: tagSend(send, ['prevMonth'], () => send({ type: 'prevMonth' })),
226
226
  },
227
227
  nextMonthTrigger: {
228
228
  type: 'button',
@@ -230,7 +230,7 @@ export function connect(get, send, opts = {}) {
230
230
  disabled: (s) => get(s).disabled,
231
231
  'data-scope': 'date-picker',
232
232
  'data-part': 'next-month-trigger',
233
- onClick: () => send({ type: 'nextMonth' }),
233
+ onClick: tagSend(send, ['nextMonth'], () => send({ type: 'nextMonth' })),
234
234
  },
235
235
  dayCell: (cell) => ({
236
236
  cell: {
@@ -246,14 +246,21 @@ export function connect(get, send, opts = {}) {
246
246
  'data-selected': cell.isSelected ? '' : undefined,
247
247
  'data-focused': cell.isFocused ? '' : undefined,
248
248
  'data-disabled': cell.isDisabled ? '' : undefined,
249
- onClick: () => {
249
+ onClick: tagSend(send, ['setFocused', 'selectFocused'], () => {
250
250
  if (cell.isDisabled)
251
251
  return;
252
252
  send({ type: 'setFocused', date: cell.iso });
253
253
  send({ type: 'selectFocused' });
254
- },
255
- onFocus: () => send({ type: 'setFocused', date: cell.iso }),
256
- onKeyDown: (e) => {
254
+ }),
255
+ onFocus: tagSend(send, ['setFocused'], () => send({ type: 'setFocused', date: cell.iso })),
256
+ onKeyDown: tagSend(send, [
257
+ 'moveFocus',
258
+ 'prevMonth',
259
+ 'nextMonth',
260
+ 'focusStartOfWeek',
261
+ 'focusEndOfWeek',
262
+ 'selectFocused',
263
+ ], (e) => {
257
264
  const key = flipArrow(e.key, e.currentTarget);
258
265
  switch (key) {
259
266
  case 'ArrowLeft':
@@ -294,7 +301,7 @@ export function connect(get, send, opts = {}) {
294
301
  send({ type: 'selectFocused' });
295
302
  return;
296
303
  }
297
- },
304
+ }),
298
305
  },
299
306
  }),
300
307
  };
@@ -1 +1 @@
1
- {"version":3,"file":"date-picker.js","sourceRoot":"","sources":["../../src/components/date-picker.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { useContext } from '@llui/dom'\nimport { flipArrow } from '../utils/direction.js'\nimport { LocaleContext, en } from '../locale.js'\nimport type { Locale } from '../locale.js'\n\n/**\n * Date picker — calendar with month navigation and date selection. Works\n * with plain Date objects internally but exposes ISO strings (YYYY-MM-DD)\n * for serialization-friendly state.\n *\n * Keyboard navigation: arrow keys move by day, PageUp/Down by month,\n * Home/End to start/end of week, Enter to select.\n */\n\nexport interface DatePickerState {\n /** Selected date as YYYY-MM-DD, or null. */\n value: string | null\n /** The month currently visible (1-indexed, 1-12). */\n visibleMonth: number\n /** The year currently visible. */\n visibleYear: number\n /** The date currently focused by the keyboard (YYYY-MM-DD). */\n focused: string\n /** Minimum selectable date, inclusive. */\n min: string | null\n /** Maximum selectable date, inclusive. */\n max: string | null\n /** 0=Sunday, 1=Monday. */\n weekStartsOn: 0 | 1\n disabled: boolean\n}\n\nexport type DatePickerMsg =\n | { type: 'setValue'; value: string | null }\n | { type: 'setFocused'; date: string }\n | { type: 'prevMonth' }\n | { type: 'nextMonth' }\n | { type: 'prevYear' }\n | { type: 'nextYear' }\n | { type: 'selectFocused' }\n | { type: 'moveFocus'; days: number }\n | { type: 'focusStartOfWeek' }\n | { type: 'focusEndOfWeek' }\n | { type: 'focusToday' }\n | { type: 'clear' }\n\nexport interface DatePickerInit {\n value?: string | null\n visibleMonth?: number\n visibleYear?: number\n min?: string | null\n max?: string | null\n weekStartsOn?: 0 | 1\n disabled?: boolean\n}\n\nfunction pad(n: number): string {\n return n.toString().padStart(2, '0')\n}\n\nfunction parseIso(iso: string): { y: number; m: number; d: number } | null {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(iso)\n if (!match) return null\n return { y: Number(match[1]), m: Number(match[2]), d: Number(match[3]) }\n}\n\nfunction toIso(y: number, m: number, d: number): string {\n return `${y}-${pad(m)}-${pad(d)}`\n}\n\nfunction daysInMonth(year: number, month: number): number {\n return new Date(year, month, 0).getDate()\n}\n\nfunction todayIso(): string {\n const now = new Date()\n return toIso(now.getFullYear(), now.getMonth() + 1, now.getDate())\n}\n\nfunction addDays(iso: string, days: number): string {\n const p = parseIso(iso)\n if (!p) return iso\n const d = new Date(p.y, p.m - 1, p.d)\n d.setDate(d.getDate() + days)\n return toIso(d.getFullYear(), d.getMonth() + 1, d.getDate())\n}\n\nfunction isInRange(iso: string, min: string | null, max: string | null): boolean {\n if (min && iso < min) return false\n if (max && iso > max) return false\n return true\n}\n\nexport function init(opts: DatePickerInit = {}): DatePickerState {\n const today = todayIso()\n const parsed = opts.value ? parseIso(opts.value) : null\n const visibleMonth = opts.visibleMonth ?? parsed?.m ?? new Date().getMonth() + 1\n const visibleYear = opts.visibleYear ?? parsed?.y ?? new Date().getFullYear()\n return {\n value: opts.value ?? null,\n visibleMonth,\n visibleYear,\n focused: opts.value ?? today,\n min: opts.min ?? null,\n max: opts.max ?? null,\n weekStartsOn: opts.weekStartsOn ?? 0,\n disabled: opts.disabled ?? false,\n }\n}\n\nfunction normalizeMonth(year: number, month: number): { year: number; month: number } {\n let y = year\n let m = month\n while (m > 12) {\n m -= 12\n y += 1\n }\n while (m < 1) {\n m += 12\n y -= 1\n }\n return { year: y, month: m }\n}\n\nfunction syncVisibleMonth(state: DatePickerState, date: string): DatePickerState {\n const p = parseIso(date)\n if (!p) return state\n if (p.y === state.visibleYear && p.m === state.visibleMonth) return state\n return { ...state, visibleYear: p.y, visibleMonth: p.m }\n}\n\nexport function update(state: DatePickerState, msg: DatePickerMsg): [DatePickerState, never[]] {\n if (state.disabled) return [state, []]\n switch (msg.type) {\n case 'setValue':\n return [{ ...state, value: msg.value, focused: msg.value ?? state.focused }, []]\n case 'setFocused':\n return [syncVisibleMonth({ ...state, focused: msg.date }, msg.date), []]\n case 'prevMonth': {\n const n = normalizeMonth(state.visibleYear, state.visibleMonth - 1)\n return [{ ...state, visibleYear: n.year, visibleMonth: n.month }, []]\n }\n case 'nextMonth': {\n const n = normalizeMonth(state.visibleYear, state.visibleMonth + 1)\n return [{ ...state, visibleYear: n.year, visibleMonth: n.month }, []]\n }\n case 'prevYear':\n return [{ ...state, visibleYear: state.visibleYear - 1 }, []]\n case 'nextYear':\n return [{ ...state, visibleYear: state.visibleYear + 1 }, []]\n case 'selectFocused':\n if (!isInRange(state.focused, state.min, state.max)) return [state, []]\n return [{ ...state, value: state.focused }, []]\n case 'moveFocus': {\n const next = addDays(state.focused, msg.days)\n return [syncVisibleMonth({ ...state, focused: next }, next), []]\n }\n case 'focusStartOfWeek': {\n const p = parseIso(state.focused)\n if (!p) return [state, []]\n const d = new Date(p.y, p.m - 1, p.d)\n const delta = (d.getDay() - state.weekStartsOn + 7) % 7\n return [update(state, { type: 'moveFocus', days: -delta })[0], []]\n }\n case 'focusEndOfWeek': {\n const p = parseIso(state.focused)\n if (!p) return [state, []]\n const d = new Date(p.y, p.m - 1, p.d)\n const delta = 6 - ((d.getDay() - state.weekStartsOn + 7) % 7)\n return [update(state, { type: 'moveFocus', days: delta })[0], []]\n }\n case 'focusToday': {\n const today = todayIso()\n return [syncVisibleMonth({ ...state, focused: today }, today), []]\n }\n case 'clear':\n return [{ ...state, value: null }, []]\n }\n}\n\nexport interface DayCell {\n iso: string\n day: number\n inMonth: boolean\n isToday: boolean\n isSelected: boolean\n isFocused: boolean\n isDisabled: boolean\n}\n\n/**\n * Compute the grid of days visible in the current month view. Always returns\n * full weeks: leading days from previous month and trailing from next month\n * to fill the grid.\n */\nexport function monthGrid(state: DatePickerState): DayCell[] {\n const y = state.visibleYear\n const m = state.visibleMonth\n const first = new Date(y, m - 1, 1)\n const firstDay = first.getDay()\n const leadDays = (firstDay - state.weekStartsOn + 7) % 7\n const totalDays = daysInMonth(y, m)\n const today = todayIso()\n\n const cells: DayCell[] = []\n // Leading: previous month's trailing days\n for (let i = leadDays; i > 0; i--) {\n const d = new Date(y, m - 1, 1 - i)\n const iso = toIso(d.getFullYear(), d.getMonth() + 1, d.getDate())\n cells.push({\n iso,\n day: d.getDate(),\n inMonth: false,\n isToday: iso === today,\n isSelected: iso === state.value,\n isFocused: iso === state.focused,\n isDisabled: !isInRange(iso, state.min, state.max),\n })\n }\n // Current month\n for (let d = 1; d <= totalDays; d++) {\n const iso = toIso(y, m, d)\n cells.push({\n iso,\n day: d,\n inMonth: true,\n isToday: iso === today,\n isSelected: iso === state.value,\n isFocused: iso === state.focused,\n isDisabled: !isInRange(iso, state.min, state.max),\n })\n }\n // Trailing: next month's leading days to fill to multiple of 7\n const remaining = (7 - (cells.length % 7)) % 7\n for (let d = 1; d <= remaining; d++) {\n const next = new Date(y, m, d)\n const iso = toIso(next.getFullYear(), next.getMonth() + 1, next.getDate())\n cells.push({\n iso,\n day: d,\n inMonth: false,\n isToday: iso === today,\n isSelected: iso === state.value,\n isFocused: iso === state.focused,\n isDisabled: !isInRange(iso, state.min, state.max),\n })\n }\n return cells\n}\n\n/**\n * Group a flat `DayCell[]` (from `monthGrid`) into rows of 7 — one row\n * per week — so the view can wrap each in a `role=\"row\"` element as\n * required by the WAI-ARIA grid pattern.\n */\nexport function weekRows(cells: DayCell[]): DayCell[][] {\n const rows: DayCell[][] = []\n for (let i = 0; i < cells.length; i += 7) {\n rows.push(cells.slice(i, i + 7))\n }\n return rows\n}\n\nexport interface DayCellParts<_S> {\n cell: {\n role: 'gridcell'\n 'aria-selected': boolean\n 'aria-disabled': 'true' | undefined\n tabIndex: number\n 'data-scope': 'date-picker'\n 'data-part': 'day-cell'\n 'data-date': string\n 'data-in-month': '' | undefined\n 'data-today': '' | undefined\n 'data-selected': '' | undefined\n 'data-focused': '' | undefined\n 'data-disabled': '' | undefined\n onClick: (e: MouseEvent) => void\n onKeyDown: (e: KeyboardEvent) => void\n onFocus: (e: FocusEvent) => void\n }\n}\n\nexport interface DatePickerParts<S> {\n root: {\n 'data-scope': 'date-picker'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n }\n grid: {\n role: 'grid'\n 'aria-label': (s: S) => string\n 'data-scope': 'date-picker'\n 'data-part': 'grid'\n }\n row: {\n role: 'row'\n 'data-scope': 'date-picker'\n 'data-part': 'row'\n }\n prevMonthTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n disabled: (s: S) => boolean\n 'data-scope': 'date-picker'\n 'data-part': 'prev-month-trigger'\n onClick: (e: MouseEvent) => void\n }\n nextMonthTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n disabled: (s: S) => boolean\n 'data-scope': 'date-picker'\n 'data-part': 'next-month-trigger'\n onClick: (e: MouseEvent) => void\n }\n dayCell: (cell: DayCell) => DayCellParts<S>\n}\n\nexport interface ConnectOptions {\n prevLabel?: string\n nextLabel?: string\n gridLabel?: (year: number, month: number) => string\n}\n\nexport function connect<S>(\n get: (s: S) => DatePickerState,\n send: Send<DatePickerMsg>,\n opts: ConnectOptions = {},\n): DatePickerParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const prevLabel: string | ((s: S) => string) =\n opts.prevLabel ?? ((s: S) => locale(s).datePicker.prev)\n const nextLabel: string | ((s: S) => string) =\n opts.nextLabel ?? ((s: S) => locale(s).datePicker.next)\n const gridLabel = opts.gridLabel ?? en.datePicker.grid\n\n return {\n root: {\n 'data-scope': 'date-picker',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n },\n grid: {\n role: 'grid',\n 'aria-label': (s) => gridLabel(get(s).visibleYear, get(s).visibleMonth),\n 'data-scope': 'date-picker',\n 'data-part': 'grid',\n },\n row: {\n role: 'row',\n 'data-scope': 'date-picker',\n 'data-part': 'row',\n },\n prevMonthTrigger: {\n type: 'button',\n 'aria-label': prevLabel,\n disabled: (s) => get(s).disabled,\n 'data-scope': 'date-picker',\n 'data-part': 'prev-month-trigger',\n onClick: () => send({ type: 'prevMonth' }),\n },\n nextMonthTrigger: {\n type: 'button',\n 'aria-label': nextLabel,\n disabled: (s) => get(s).disabled,\n 'data-scope': 'date-picker',\n 'data-part': 'next-month-trigger',\n onClick: () => send({ type: 'nextMonth' }),\n },\n dayCell: (cell: DayCell): DayCellParts<S> => ({\n cell: {\n role: 'gridcell',\n 'aria-selected': cell.isSelected,\n 'aria-disabled': cell.isDisabled ? 'true' : undefined,\n tabIndex: cell.isFocused ? 0 : -1,\n 'data-scope': 'date-picker',\n 'data-part': 'day-cell',\n 'data-date': cell.iso,\n 'data-in-month': cell.inMonth ? '' : undefined,\n 'data-today': cell.isToday ? '' : undefined,\n 'data-selected': cell.isSelected ? '' : undefined,\n 'data-focused': cell.isFocused ? '' : undefined,\n 'data-disabled': cell.isDisabled ? '' : undefined,\n onClick: () => {\n if (cell.isDisabled) return\n send({ type: 'setFocused', date: cell.iso })\n send({ type: 'selectFocused' })\n },\n onFocus: () => send({ type: 'setFocused', date: cell.iso }),\n onKeyDown: (e) => {\n const key = flipArrow(e.key, e.currentTarget as Element)\n switch (key) {\n case 'ArrowLeft':\n e.preventDefault()\n send({ type: 'moveFocus', days: -1 })\n return\n case 'ArrowRight':\n e.preventDefault()\n send({ type: 'moveFocus', days: 1 })\n return\n case 'ArrowUp':\n e.preventDefault()\n send({ type: 'moveFocus', days: -7 })\n return\n case 'ArrowDown':\n e.preventDefault()\n send({ type: 'moveFocus', days: 7 })\n return\n case 'PageUp':\n e.preventDefault()\n send({ type: 'prevMonth' })\n return\n case 'PageDown':\n e.preventDefault()\n send({ type: 'nextMonth' })\n return\n case 'Home':\n e.preventDefault()\n send({ type: 'focusStartOfWeek' })\n return\n case 'End':\n e.preventDefault()\n send({ type: 'focusEndOfWeek' })\n return\n case 'Enter':\n case ' ':\n e.preventDefault()\n send({ type: 'selectFocused' })\n return\n }\n },\n },\n }),\n }\n}\n\nexport const datePicker = { init, update, connect, monthGrid, weekRows }\n"]}
1
+ {"version":3,"file":"date-picker.js","sourceRoot":"","sources":["../../src/components/date-picker.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { useContext, tagSend } from '@llui/dom'\nimport { flipArrow } from '../utils/direction.js'\nimport { LocaleContext, en } from '../locale.js'\nimport type { Locale } from '../locale.js'\n\n/**\n * Date picker — calendar with month navigation and date selection. Works\n * with plain Date objects internally but exposes ISO strings (YYYY-MM-DD)\n * for serialization-friendly state.\n *\n * Keyboard navigation: arrow keys move by day, PageUp/Down by month,\n * Home/End to start/end of week, Enter to select.\n */\n\nexport interface DatePickerState {\n /** Selected date as YYYY-MM-DD, or null. */\n value: string | null\n /** The month currently visible (1-indexed, 1-12). */\n visibleMonth: number\n /** The year currently visible. */\n visibleYear: number\n /** The date currently focused by the keyboard (YYYY-MM-DD). */\n focused: string\n /** Minimum selectable date, inclusive. */\n min: string | null\n /** Maximum selectable date, inclusive. */\n max: string | null\n /** 0=Sunday, 1=Monday. */\n weekStartsOn: 0 | 1\n disabled: boolean\n}\n\nexport type DatePickerMsg =\n /** @intent(\"Set the selected date (YYYY-MM-DD), or null to clear\") */\n | { type: 'setValue'; value: string | null }\n /** @humanOnly */\n | { type: 'setFocused'; date: string }\n /** @intent(\"Show the previous month in the calendar\") */\n | { type: 'prevMonth' }\n /** @intent(\"Show the next month in the calendar\") */\n | { type: 'nextMonth' }\n /** @intent(\"Show the previous year (same month)\") */\n | { type: 'prevYear' }\n /** @intent(\"Show the next year (same month)\") */\n | { type: 'nextYear' }\n /** @intent(\"Select the currently-focused date\") */\n | { type: 'selectFocused' }\n /** @humanOnly */\n | { type: 'moveFocus'; days: number }\n /** @humanOnly */\n | { type: 'focusStartOfWeek' }\n /** @humanOnly */\n | { type: 'focusEndOfWeek' }\n /** @humanOnly */\n | { type: 'focusToday' }\n /** @intent(\"Clear the selected date\") */\n | { type: 'clear' }\n\nexport interface DatePickerInit {\n value?: string | null\n visibleMonth?: number\n visibleYear?: number\n min?: string | null\n max?: string | null\n weekStartsOn?: 0 | 1\n disabled?: boolean\n}\n\nfunction pad(n: number): string {\n return n.toString().padStart(2, '0')\n}\n\nfunction parseIso(iso: string): { y: number; m: number; d: number } | null {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(iso)\n if (!match) return null\n return { y: Number(match[1]), m: Number(match[2]), d: Number(match[3]) }\n}\n\nfunction toIso(y: number, m: number, d: number): string {\n return `${y}-${pad(m)}-${pad(d)}`\n}\n\nfunction daysInMonth(year: number, month: number): number {\n return new Date(year, month, 0).getDate()\n}\n\nfunction todayIso(): string {\n const now = new Date()\n return toIso(now.getFullYear(), now.getMonth() + 1, now.getDate())\n}\n\nfunction addDays(iso: string, days: number): string {\n const p = parseIso(iso)\n if (!p) return iso\n const d = new Date(p.y, p.m - 1, p.d)\n d.setDate(d.getDate() + days)\n return toIso(d.getFullYear(), d.getMonth() + 1, d.getDate())\n}\n\nfunction isInRange(iso: string, min: string | null, max: string | null): boolean {\n if (min && iso < min) return false\n if (max && iso > max) return false\n return true\n}\n\nexport function init(opts: DatePickerInit = {}): DatePickerState {\n const today = todayIso()\n const parsed = opts.value ? parseIso(opts.value) : null\n const visibleMonth = opts.visibleMonth ?? parsed?.m ?? new Date().getMonth() + 1\n const visibleYear = opts.visibleYear ?? parsed?.y ?? new Date().getFullYear()\n return {\n value: opts.value ?? null,\n visibleMonth,\n visibleYear,\n focused: opts.value ?? today,\n min: opts.min ?? null,\n max: opts.max ?? null,\n weekStartsOn: opts.weekStartsOn ?? 0,\n disabled: opts.disabled ?? false,\n }\n}\n\nfunction normalizeMonth(year: number, month: number): { year: number; month: number } {\n let y = year\n let m = month\n while (m > 12) {\n m -= 12\n y += 1\n }\n while (m < 1) {\n m += 12\n y -= 1\n }\n return { year: y, month: m }\n}\n\nfunction syncVisibleMonth(state: DatePickerState, date: string): DatePickerState {\n const p = parseIso(date)\n if (!p) return state\n if (p.y === state.visibleYear && p.m === state.visibleMonth) return state\n return { ...state, visibleYear: p.y, visibleMonth: p.m }\n}\n\nexport function update(state: DatePickerState, msg: DatePickerMsg): [DatePickerState, never[]] {\n if (state.disabled) return [state, []]\n switch (msg.type) {\n case 'setValue':\n return [{ ...state, value: msg.value, focused: msg.value ?? state.focused }, []]\n case 'setFocused':\n return [syncVisibleMonth({ ...state, focused: msg.date }, msg.date), []]\n case 'prevMonth': {\n const n = normalizeMonth(state.visibleYear, state.visibleMonth - 1)\n return [{ ...state, visibleYear: n.year, visibleMonth: n.month }, []]\n }\n case 'nextMonth': {\n const n = normalizeMonth(state.visibleYear, state.visibleMonth + 1)\n return [{ ...state, visibleYear: n.year, visibleMonth: n.month }, []]\n }\n case 'prevYear':\n return [{ ...state, visibleYear: state.visibleYear - 1 }, []]\n case 'nextYear':\n return [{ ...state, visibleYear: state.visibleYear + 1 }, []]\n case 'selectFocused':\n if (!isInRange(state.focused, state.min, state.max)) return [state, []]\n return [{ ...state, value: state.focused }, []]\n case 'moveFocus': {\n const next = addDays(state.focused, msg.days)\n return [syncVisibleMonth({ ...state, focused: next }, next), []]\n }\n case 'focusStartOfWeek': {\n const p = parseIso(state.focused)\n if (!p) return [state, []]\n const d = new Date(p.y, p.m - 1, p.d)\n const delta = (d.getDay() - state.weekStartsOn + 7) % 7\n return [update(state, { type: 'moveFocus', days: -delta })[0], []]\n }\n case 'focusEndOfWeek': {\n const p = parseIso(state.focused)\n if (!p) return [state, []]\n const d = new Date(p.y, p.m - 1, p.d)\n const delta = 6 - ((d.getDay() - state.weekStartsOn + 7) % 7)\n return [update(state, { type: 'moveFocus', days: delta })[0], []]\n }\n case 'focusToday': {\n const today = todayIso()\n return [syncVisibleMonth({ ...state, focused: today }, today), []]\n }\n case 'clear':\n return [{ ...state, value: null }, []]\n }\n}\n\nexport interface DayCell {\n iso: string\n day: number\n inMonth: boolean\n isToday: boolean\n isSelected: boolean\n isFocused: boolean\n isDisabled: boolean\n}\n\n/**\n * Compute the grid of days visible in the current month view. Always returns\n * full weeks: leading days from previous month and trailing from next month\n * to fill the grid.\n */\nexport function monthGrid(state: DatePickerState): DayCell[] {\n const y = state.visibleYear\n const m = state.visibleMonth\n const first = new Date(y, m - 1, 1)\n const firstDay = first.getDay()\n const leadDays = (firstDay - state.weekStartsOn + 7) % 7\n const totalDays = daysInMonth(y, m)\n const today = todayIso()\n\n const cells: DayCell[] = []\n // Leading: previous month's trailing days\n for (let i = leadDays; i > 0; i--) {\n const d = new Date(y, m - 1, 1 - i)\n const iso = toIso(d.getFullYear(), d.getMonth() + 1, d.getDate())\n cells.push({\n iso,\n day: d.getDate(),\n inMonth: false,\n isToday: iso === today,\n isSelected: iso === state.value,\n isFocused: iso === state.focused,\n isDisabled: !isInRange(iso, state.min, state.max),\n })\n }\n // Current month\n for (let d = 1; d <= totalDays; d++) {\n const iso = toIso(y, m, d)\n cells.push({\n iso,\n day: d,\n inMonth: true,\n isToday: iso === today,\n isSelected: iso === state.value,\n isFocused: iso === state.focused,\n isDisabled: !isInRange(iso, state.min, state.max),\n })\n }\n // Trailing: next month's leading days to fill to multiple of 7\n const remaining = (7 - (cells.length % 7)) % 7\n for (let d = 1; d <= remaining; d++) {\n const next = new Date(y, m, d)\n const iso = toIso(next.getFullYear(), next.getMonth() + 1, next.getDate())\n cells.push({\n iso,\n day: d,\n inMonth: false,\n isToday: iso === today,\n isSelected: iso === state.value,\n isFocused: iso === state.focused,\n isDisabled: !isInRange(iso, state.min, state.max),\n })\n }\n return cells\n}\n\n/**\n * Group a flat `DayCell[]` (from `monthGrid`) into rows of 7 — one row\n * per week — so the view can wrap each in a `role=\"row\"` element as\n * required by the WAI-ARIA grid pattern.\n */\nexport function weekRows(cells: DayCell[]): DayCell[][] {\n const rows: DayCell[][] = []\n for (let i = 0; i < cells.length; i += 7) {\n rows.push(cells.slice(i, i + 7))\n }\n return rows\n}\n\nexport interface DayCellParts<_S> {\n cell: {\n role: 'gridcell'\n 'aria-selected': boolean\n 'aria-disabled': 'true' | undefined\n tabIndex: number\n 'data-scope': 'date-picker'\n 'data-part': 'day-cell'\n 'data-date': string\n 'data-in-month': '' | undefined\n 'data-today': '' | undefined\n 'data-selected': '' | undefined\n 'data-focused': '' | undefined\n 'data-disabled': '' | undefined\n onClick: (e: MouseEvent) => void\n onKeyDown: (e: KeyboardEvent) => void\n onFocus: (e: FocusEvent) => void\n }\n}\n\nexport interface DatePickerParts<S> {\n root: {\n 'data-scope': 'date-picker'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n }\n grid: {\n role: 'grid'\n 'aria-label': (s: S) => string\n 'data-scope': 'date-picker'\n 'data-part': 'grid'\n }\n row: {\n role: 'row'\n 'data-scope': 'date-picker'\n 'data-part': 'row'\n }\n prevMonthTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n disabled: (s: S) => boolean\n 'data-scope': 'date-picker'\n 'data-part': 'prev-month-trigger'\n onClick: (e: MouseEvent) => void\n }\n nextMonthTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n disabled: (s: S) => boolean\n 'data-scope': 'date-picker'\n 'data-part': 'next-month-trigger'\n onClick: (e: MouseEvent) => void\n }\n dayCell: (cell: DayCell) => DayCellParts<S>\n}\n\nexport interface ConnectOptions {\n prevLabel?: string\n nextLabel?: string\n gridLabel?: (year: number, month: number) => string\n}\n\nexport function connect<S>(\n get: (s: S) => DatePickerState,\n send: Send<DatePickerMsg>,\n opts: ConnectOptions = {},\n): DatePickerParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const prevLabel: string | ((s: S) => string) =\n opts.prevLabel ?? ((s: S) => locale(s).datePicker.prev)\n const nextLabel: string | ((s: S) => string) =\n opts.nextLabel ?? ((s: S) => locale(s).datePicker.next)\n const gridLabel = opts.gridLabel ?? en.datePicker.grid\n\n return {\n root: {\n 'data-scope': 'date-picker',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n },\n grid: {\n role: 'grid',\n 'aria-label': (s) => gridLabel(get(s).visibleYear, get(s).visibleMonth),\n 'data-scope': 'date-picker',\n 'data-part': 'grid',\n },\n row: {\n role: 'row',\n 'data-scope': 'date-picker',\n 'data-part': 'row',\n },\n prevMonthTrigger: {\n type: 'button',\n 'aria-label': prevLabel,\n disabled: (s) => get(s).disabled,\n 'data-scope': 'date-picker',\n 'data-part': 'prev-month-trigger',\n onClick: tagSend(send, ['prevMonth'], () => send({ type: 'prevMonth' })),\n },\n nextMonthTrigger: {\n type: 'button',\n 'aria-label': nextLabel,\n disabled: (s) => get(s).disabled,\n 'data-scope': 'date-picker',\n 'data-part': 'next-month-trigger',\n onClick: tagSend(send, ['nextMonth'], () => send({ type: 'nextMonth' })),\n },\n dayCell: (cell: DayCell): DayCellParts<S> => ({\n cell: {\n role: 'gridcell',\n 'aria-selected': cell.isSelected,\n 'aria-disabled': cell.isDisabled ? 'true' : undefined,\n tabIndex: cell.isFocused ? 0 : -1,\n 'data-scope': 'date-picker',\n 'data-part': 'day-cell',\n 'data-date': cell.iso,\n 'data-in-month': cell.inMonth ? '' : undefined,\n 'data-today': cell.isToday ? '' : undefined,\n 'data-selected': cell.isSelected ? '' : undefined,\n 'data-focused': cell.isFocused ? '' : undefined,\n 'data-disabled': cell.isDisabled ? '' : undefined,\n onClick: tagSend(send, ['setFocused', 'selectFocused'], () => {\n if (cell.isDisabled) return\n send({ type: 'setFocused', date: cell.iso })\n send({ type: 'selectFocused' })\n }),\n onFocus: tagSend(send, ['setFocused'], () => send({ type: 'setFocused', date: cell.iso })),\n onKeyDown: tagSend(\n send,\n [\n 'moveFocus',\n 'prevMonth',\n 'nextMonth',\n 'focusStartOfWeek',\n 'focusEndOfWeek',\n 'selectFocused',\n ],\n (e) => {\n const key = flipArrow(e.key, e.currentTarget as Element)\n switch (key) {\n case 'ArrowLeft':\n e.preventDefault()\n send({ type: 'moveFocus', days: -1 })\n return\n case 'ArrowRight':\n e.preventDefault()\n send({ type: 'moveFocus', days: 1 })\n return\n case 'ArrowUp':\n e.preventDefault()\n send({ type: 'moveFocus', days: -7 })\n return\n case 'ArrowDown':\n e.preventDefault()\n send({ type: 'moveFocus', days: 7 })\n return\n case 'PageUp':\n e.preventDefault()\n send({ type: 'prevMonth' })\n return\n case 'PageDown':\n e.preventDefault()\n send({ type: 'nextMonth' })\n return\n case 'Home':\n e.preventDefault()\n send({ type: 'focusStartOfWeek' })\n return\n case 'End':\n e.preventDefault()\n send({ type: 'focusEndOfWeek' })\n return\n case 'Enter':\n case ' ':\n e.preventDefault()\n send({ type: 'selectFocused' })\n return\n }\n },\n ),\n },\n }),\n }\n}\n\nexport const datePicker = { init, update, connect, monthGrid, weekRows }\n"]}
@@ -33,13 +33,21 @@ import type { Send, TransitionOptions } from '@llui/dom';
33
33
  export interface DialogState {
34
34
  open: boolean;
35
35
  }
36
- export type DialogMsg = {
36
+ export type DialogMsg =
37
+ /** @intent("Open the dialog") */
38
+ {
37
39
  type: 'open';
38
- } | {
40
+ }
41
+ /** @intent("Close the dialog") */
42
+ | {
39
43
  type: 'close';
40
- } | {
44
+ }
45
+ /** @intent("Toggle the dialog open/closed") */
46
+ | {
41
47
  type: 'toggle';
42
- } | {
48
+ }
49
+ /** @intent("Set the dialog's open state to a specific value") */
50
+ | {
43
51
  type: 'setOpen';
44
52
  open: boolean;
45
53
  };
@@ -1 +1 @@
1
- {"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../src/components/dialog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AASxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAA;CACd;AAED,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAA;AAEtC,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,wBAAgB,IAAI,CAAC,IAAI,GAAE,UAAe,GAAG,WAAW,CAEvD;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,CAWjF;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,OAAO,EAAE;QACP,IAAI,EAAE,QAAQ,CAAA;QACd,eAAe,EAAE,QAAQ,CAAA;QACzB,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;QAClC,eAAe,EAAE,MAAM,CAAA;QACvB,EAAE,EAAE,MAAM,CAAA;QACV,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,QAAQ,CAAA;QACzC,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,SAAS,CAAA;QACtB,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;KACjC,CAAA;IACD,QAAQ,EAAE;QACR,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,QAAQ,CAAA;QACzC,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,UAAU,CAAA;QACvB,aAAa,EAAE,MAAM,CAAA;KACtB,CAAA;IACD,UAAU,EAAE;QACV,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,YAAY,CAAA;KAC1B,CAAA;IACD,OAAO,EAAE;QACP,IAAI,EAAE,QAAQ,GAAG,aAAa,CAAA;QAC9B,EAAE,EAAE,MAAM,CAAA;QACV,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;QAChC,iBAAiB,EAAE,MAAM,CAAA;QACzB,kBAAkB,EAAE,MAAM,CAAA;QAC1B,QAAQ,EAAE,CAAC,CAAC,CAAA;QACZ,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,QAAQ,CAAA;QACzC,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,SAAS,CAAA;KACvB,CAAA;IACD,KAAK,EAAE;QACL,EAAE,EAAE,MAAM,CAAA;QACV,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,OAAO,CAAA;KACrB,CAAA;IACD,WAAW,EAAE;QACX,EAAE,EAAE,MAAM,CAAA;QACV,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,aAAa,CAAA;KAC3B,CAAA;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ,CAAA;QACd,YAAY,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAA;QACzC,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,eAAe,CAAA;QAC5B,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;KACjC,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,4DAA4D;IAC5D,EAAE,EAAE,MAAM,CAAA;IACV,sFAAsF;IACtF,IAAI,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAA;IAC/B,gEAAgE;IAChE,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,wBAAgB,OAAO,CAAC,CAAC,EACvB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,WAAW,EAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EACrB,IAAI,EAAE,cAAc,GACnB,WAAW,CAAC,CAAC,CAAC,CA+DhB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,sBAAsB;IACtB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,WAAW,CAAA;IAC1B,2CAA2C;IAC3C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;IACrB,yEAAyE;IACzE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAA;IACrB,yBAAyB;IACzB,OAAO,EAAE,MAAM,IAAI,EAAE,CAAA;IACrB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B,2CAA2C;IAC3C,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,sDAAsD;IACtD,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,yEAAyE;IACzE,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,oEAAoE;IACpE,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;IAC7B,4EAA4E;IAC5E,YAAY,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAA;IAC/C,8CAA8C;IAC9C,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CA0D1D;AAED,eAAO,MAAM,MAAM;;;;;CAAqC,CAAA"}
1
+ {"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../src/components/dialog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AASxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAA;CACd;AAED,MAAM,MAAM,SAAS;AACnB,iCAAiC;AAC/B;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE;AAClB,kCAAkC;GAChC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE;AACnB,+CAA+C;GAC7C;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE;AACpB,iEAAiE;GAC/D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAA;AAEtC,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,wBAAgB,IAAI,CAAC,IAAI,GAAE,UAAe,GAAG,WAAW,CAEvD;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,CAWjF;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,OAAO,EAAE;QACP,IAAI,EAAE,QAAQ,CAAA;QACd,eAAe,EAAE,QAAQ,CAAA;QACzB,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;QAClC,eAAe,EAAE,MAAM,CAAA;QACvB,EAAE,EAAE,MAAM,CAAA;QACV,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,QAAQ,CAAA;QACzC,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,SAAS,CAAA;QACtB,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;KACjC,CAAA;IACD,QAAQ,EAAE;QACR,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,QAAQ,CAAA;QACzC,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,UAAU,CAAA;QACvB,aAAa,EAAE,MAAM,CAAA;KACtB,CAAA;IACD,UAAU,EAAE;QACV,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,YAAY,CAAA;KAC1B,CAAA;IACD,OAAO,EAAE;QACP,IAAI,EAAE,QAAQ,GAAG,aAAa,CAAA;QAC9B,EAAE,EAAE,MAAM,CAAA;QACV,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;QAChC,iBAAiB,EAAE,MAAM,CAAA;QACzB,kBAAkB,EAAE,MAAM,CAAA;QAC1B,QAAQ,EAAE,CAAC,CAAC,CAAA;QACZ,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,QAAQ,CAAA;QACzC,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,SAAS,CAAA;KACvB,CAAA;IACD,KAAK,EAAE;QACL,EAAE,EAAE,MAAM,CAAA;QACV,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,OAAO,CAAA;KACrB,CAAA;IACD,WAAW,EAAE;QACX,EAAE,EAAE,MAAM,CAAA;QACV,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,aAAa,CAAA;KAC3B,CAAA;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ,CAAA;QACd,YAAY,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAA;QACzC,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,eAAe,CAAA;QAC5B,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;KACjC,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,4DAA4D;IAC5D,EAAE,EAAE,MAAM,CAAA;IACV,sFAAsF;IACtF,IAAI,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAA;IAC/B,gEAAgE;IAChE,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,wBAAgB,OAAO,CAAC,CAAC,EACvB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,WAAW,EAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EACrB,IAAI,EAAE,cAAc,GACnB,WAAW,CAAC,CAAC,CAAC,CA+DhB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,sBAAsB;IACtB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,WAAW,CAAA;IAC1B,2CAA2C;IAC3C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;IACrB,yEAAyE;IACzE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAA;IACrB,yBAAyB;IACzB,OAAO,EAAE,MAAM,IAAI,EAAE,CAAA;IACrB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B,2CAA2C;IAC3C,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,sDAAsD;IACtD,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,yEAAyE;IACzE,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,oEAAoE;IACpE,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;IAC7B,4EAA4E;IAC5E,YAAY,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAA;IAC/C,8CAA8C;IAC9C,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CA0D1D;AAED,eAAO,MAAM,MAAM;;;;;CAAqC,CAAA"}
@@ -1,4 +1,4 @@
1
- import { show, portal, onMount, div, useContext } from '@llui/dom';
1
+ import { show, portal, onMount, div, useContext, tagSend } from '@llui/dom';
2
2
  import { LocaleContext } from '../locale.js';
3
3
  import { pushFocusTrap } from '../utils/focus-trap.js';
4
4
  import { pushDismissable } from '../utils/dismissable.js';
@@ -39,7 +39,7 @@ export function connect(get, send, opts) {
39
39
  'data-state': (s) => (get(s).open ? 'open' : 'closed'),
40
40
  'data-scope': 'dialog',
41
41
  'data-part': 'trigger',
42
- onClick: () => send({ type: 'open' }),
42
+ onClick: tagSend(send, ['open'], () => send({ type: 'open' })),
43
43
  },
44
44
  backdrop: {
45
45
  'data-state': (s) => (get(s).open ? 'open' : 'closed'),
@@ -77,7 +77,7 @@ export function connect(get, send, opts) {
77
77
  'aria-label': closeLabel,
78
78
  'data-scope': 'dialog',
79
79
  'data-part': 'close-trigger',
80
- onClick: () => send({ type: 'close' }),
80
+ onClick: tagSend(send, ['close'], () => send({ type: 'close' })),
81
81
  },
82
82
  };
83
83
  }