@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":"pagination.d.ts","sourceRoot":"","sources":["../../src/components/pagination.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/components/pagination.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, en } from '../locale.js';
3
3
  export function init(opts = {}) {
4
4
  return {
@@ -100,7 +100,7 @@ export function connect(get, send, opts = {}) {
100
100
  disabled: (s) => get(s).page <= 1 || get(s).disabled,
101
101
  'data-scope': 'pagination',
102
102
  'data-part': 'prev-trigger',
103
- onClick: () => send({ type: 'prev' }),
103
+ onClick: tagSend(send, ['prev'], () => send({ type: 'prev' })),
104
104
  },
105
105
  nextTrigger: {
106
106
  type: 'button',
@@ -115,7 +115,7 @@ export function connect(get, send, opts = {}) {
115
115
  },
116
116
  'data-scope': 'pagination',
117
117
  'data-part': 'next-trigger',
118
- onClick: () => send({ type: 'next' }),
118
+ onClick: tagSend(send, ['next'], () => send({ type: 'next' })),
119
119
  },
120
120
  item: (page) => ({
121
121
  type: 'button',
@@ -125,7 +125,7 @@ export function connect(get, send, opts = {}) {
125
125
  'data-scope': 'pagination',
126
126
  'data-part': 'item',
127
127
  'data-value': String(page),
128
- onClick: () => send({ type: 'goTo', page }),
128
+ onClick: tagSend(send, ['goTo'], () => send({ type: 'goTo', page })),
129
129
  }),
130
130
  ellipsis: (position) => ({
131
131
  'aria-hidden': 'true',
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/components/pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { useContext } from '@llui/dom'\nimport { LocaleContext, en } from '../locale.js'\nimport type { Locale } from '../locale.js'\n\n/**\n * Pagination — page navigation with ellipses for large ranges.\n * `page` is 1-based. Siblings are the count of pages shown on each side\n * of the current page. Boundaries are shown at the start/end.\n */\n\nexport interface PaginationState {\n page: number\n pageSize: number\n total: number\n siblings: number\n boundaries: number\n disabled: boolean\n}\n\nexport type PaginationMsg =\n | { type: 'goTo'; page: number }\n | { type: 'next' }\n | { type: 'prev' }\n | { type: 'first' }\n | { type: 'last' }\n | { type: 'setPageSize'; pageSize: number }\n | { type: 'setTotal'; total: number }\n\nexport interface PaginationInit {\n page?: number\n pageSize?: number\n total?: number\n siblings?: number\n boundaries?: number\n disabled?: boolean\n}\n\nexport function init(opts: PaginationInit = {}): PaginationState {\n return {\n page: opts.page ?? 1,\n pageSize: opts.pageSize ?? 10,\n total: opts.total ?? 0,\n siblings: opts.siblings ?? 1,\n boundaries: opts.boundaries ?? 1,\n disabled: opts.disabled ?? false,\n }\n}\n\nexport function totalPages(state: PaginationState): number {\n if (state.pageSize <= 0 || state.total <= 0) return 0\n return Math.max(1, Math.ceil(state.total / state.pageSize))\n}\n\nfunction clampPage(page: number, total: number): number {\n if (total === 0) return 1\n return Math.max(1, Math.min(page, total))\n}\n\nexport function update(state: PaginationState, msg: PaginationMsg): [PaginationState, never[]] {\n if (state.disabled) return [state, []]\n const pages = totalPages(state)\n switch (msg.type) {\n case 'goTo':\n return [{ ...state, page: clampPage(msg.page, pages) }, []]\n case 'next':\n return [{ ...state, page: clampPage(state.page + 1, pages) }, []]\n case 'prev':\n return [{ ...state, page: clampPage(state.page - 1, pages) }, []]\n case 'first':\n return [{ ...state, page: 1 }, []]\n case 'last':\n return [{ ...state, page: pages }, []]\n case 'setPageSize': {\n // Preserve first visible item when pageSize changes\n const firstItem = (state.page - 1) * state.pageSize\n const nextPage = Math.floor(firstItem / msg.pageSize) + 1\n const nextPages = Math.max(1, Math.ceil(state.total / msg.pageSize))\n return [{ ...state, pageSize: msg.pageSize, page: Math.min(nextPage, nextPages) }, []]\n }\n case 'setTotal': {\n const nextPages = Math.max(1, Math.ceil(msg.total / state.pageSize))\n return [{ ...state, total: msg.total, page: Math.min(state.page, nextPages) }, []]\n }\n }\n}\n\nexport type PageItem =\n | { type: 'page'; page: number }\n | { type: 'ellipsis'; position: 'start' | 'end' }\n\n/**\n * Compute the visible page buttons with ellipses:\n * `[first ..boundaries] … [siblings around current] … [boundaries ..last]`.\n */\nexport function pageItems(state: PaginationState): PageItem[] {\n const pages = totalPages(state)\n if (pages === 0) return []\n\n // Build the set of pages we want to show: first boundary, last boundary,\n // and current ± siblings.\n const pageSet = new Set<number>()\n for (let i = 1; i <= Math.min(state.boundaries, pages); i++) pageSet.add(i)\n for (let i = Math.max(pages - state.boundaries + 1, 1); i <= pages; i++) pageSet.add(i)\n const start = Math.max(1, state.page - state.siblings)\n const end = Math.min(pages, state.page + state.siblings)\n for (let i = start; i <= end; i++) pageSet.add(i)\n\n // Emit items in order, inserting ellipses for gaps > 1.\n const sorted = [...pageSet].sort((a, b) => a - b)\n const items: PageItem[] = []\n for (let i = 0; i < sorted.length; i++) {\n const page = sorted[i]!\n items.push({ type: 'page', page })\n if (i < sorted.length - 1 && sorted[i + 1]! - page > 1) {\n items.push({ type: 'ellipsis', position: page < state.page ? 'start' : 'end' })\n }\n }\n return items\n}\n\nexport interface PaginationParts<S> {\n root: {\n role: 'navigation'\n 'aria-label': string | ((s: S) => string)\n 'data-scope': 'pagination'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n }\n prevTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'aria-disabled': (s: S) => 'true' | undefined\n disabled: (s: S) => boolean\n 'data-scope': 'pagination'\n 'data-part': 'prev-trigger'\n onClick: (e: MouseEvent) => void\n }\n nextTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'aria-disabled': (s: S) => 'true' | undefined\n disabled: (s: S) => boolean\n 'data-scope': 'pagination'\n 'data-part': 'next-trigger'\n onClick: (e: MouseEvent) => void\n }\n item: (page: number) => {\n type: 'button'\n 'aria-label': string\n 'aria-current': (s: S) => 'page' | undefined\n 'data-selected': (s: S) => '' | undefined\n 'data-scope': 'pagination'\n 'data-part': 'item'\n 'data-value': string\n onClick: (e: MouseEvent) => void\n }\n ellipsis: (position: 'start' | 'end') => {\n 'aria-hidden': 'true'\n 'data-scope': 'pagination'\n 'data-part': 'ellipsis'\n 'data-position': 'start' | 'end'\n }\n}\n\nexport interface ConnectOptions {\n label?: string\n prevLabel?: string\n nextLabel?: string\n pageLabel?: (page: number) => string\n}\n\nexport function connect<S>(\n get: (s: S) => PaginationState,\n send: Send<PaginationMsg>,\n opts: ConnectOptions = {},\n): PaginationParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const label: string | ((s: S) => string) = opts.label ?? ((s: S) => locale(s).pagination.label)\n const prevLabel: string | ((s: S) => string) =\n opts.prevLabel ?? ((s: S) => locale(s).pagination.prev)\n const nextLabel: string | ((s: S) => string) =\n opts.nextLabel ?? ((s: S) => locale(s).pagination.next)\n const pageLabel = opts.pageLabel ?? en.pagination.page\n\n return {\n root: {\n role: 'navigation',\n 'aria-label': label,\n 'data-scope': 'pagination',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n },\n prevTrigger: {\n type: 'button',\n 'aria-label': prevLabel,\n 'aria-disabled': (s) => (get(s).page <= 1 || get(s).disabled ? 'true' : undefined),\n disabled: (s) => get(s).page <= 1 || get(s).disabled,\n 'data-scope': 'pagination',\n 'data-part': 'prev-trigger',\n onClick: () => send({ type: 'prev' }),\n },\n nextTrigger: {\n type: 'button',\n 'aria-label': nextLabel,\n 'aria-disabled': (s) => {\n const st = get(s)\n return st.page >= totalPages(st) || st.disabled ? 'true' : undefined\n },\n disabled: (s) => {\n const st = get(s)\n return st.page >= totalPages(st) || st.disabled\n },\n 'data-scope': 'pagination',\n 'data-part': 'next-trigger',\n onClick: () => send({ type: 'next' }),\n },\n item: (page: number) => ({\n type: 'button',\n 'aria-label': pageLabel(page),\n 'aria-current': (s) => (get(s).page === page ? 'page' : undefined),\n 'data-selected': (s) => (get(s).page === page ? '' : undefined),\n 'data-scope': 'pagination',\n 'data-part': 'item',\n 'data-value': String(page),\n onClick: () => send({ type: 'goTo', page }),\n }),\n ellipsis: (position: 'start' | 'end') => ({\n 'aria-hidden': 'true',\n 'data-scope': 'pagination',\n 'data-part': 'ellipsis',\n 'data-position': position,\n }),\n }\n}\n\nexport const pagination = { init, update, connect, totalPages, pageItems }\n"]}
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/components/pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { useContext, tagSend } from '@llui/dom'\nimport { LocaleContext, en } from '../locale.js'\nimport type { Locale } from '../locale.js'\n\n/**\n * Pagination — page navigation with ellipses for large ranges.\n * `page` is 1-based. Siblings are the count of pages shown on each side\n * of the current page. Boundaries are shown at the start/end.\n */\n\nexport interface PaginationState {\n page: number\n pageSize: number\n total: number\n siblings: number\n boundaries: number\n disabled: boolean\n}\n\nexport type PaginationMsg =\n /** @intent(\"Jump to a specific 1-based page number\") */\n | { type: 'goTo'; page: number }\n /** @intent(\"Advance to the next page\") */\n | { type: 'next' }\n /** @intent(\"Go back to the previous page\") */\n | { type: 'prev' }\n /** @intent(\"Jump to the first page\") */\n | { type: 'first' }\n /** @intent(\"Jump to the last page\") */\n | { type: 'last' }\n /** @intent(\"Change how many items each page contains\") */\n | { type: 'setPageSize'; pageSize: number }\n /** @humanOnly */\n | { type: 'setTotal'; total: number }\n\nexport interface PaginationInit {\n page?: number\n pageSize?: number\n total?: number\n siblings?: number\n boundaries?: number\n disabled?: boolean\n}\n\nexport function init(opts: PaginationInit = {}): PaginationState {\n return {\n page: opts.page ?? 1,\n pageSize: opts.pageSize ?? 10,\n total: opts.total ?? 0,\n siblings: opts.siblings ?? 1,\n boundaries: opts.boundaries ?? 1,\n disabled: opts.disabled ?? false,\n }\n}\n\nexport function totalPages(state: PaginationState): number {\n if (state.pageSize <= 0 || state.total <= 0) return 0\n return Math.max(1, Math.ceil(state.total / state.pageSize))\n}\n\nfunction clampPage(page: number, total: number): number {\n if (total === 0) return 1\n return Math.max(1, Math.min(page, total))\n}\n\nexport function update(state: PaginationState, msg: PaginationMsg): [PaginationState, never[]] {\n if (state.disabled) return [state, []]\n const pages = totalPages(state)\n switch (msg.type) {\n case 'goTo':\n return [{ ...state, page: clampPage(msg.page, pages) }, []]\n case 'next':\n return [{ ...state, page: clampPage(state.page + 1, pages) }, []]\n case 'prev':\n return [{ ...state, page: clampPage(state.page - 1, pages) }, []]\n case 'first':\n return [{ ...state, page: 1 }, []]\n case 'last':\n return [{ ...state, page: pages }, []]\n case 'setPageSize': {\n // Preserve first visible item when pageSize changes\n const firstItem = (state.page - 1) * state.pageSize\n const nextPage = Math.floor(firstItem / msg.pageSize) + 1\n const nextPages = Math.max(1, Math.ceil(state.total / msg.pageSize))\n return [{ ...state, pageSize: msg.pageSize, page: Math.min(nextPage, nextPages) }, []]\n }\n case 'setTotal': {\n const nextPages = Math.max(1, Math.ceil(msg.total / state.pageSize))\n return [{ ...state, total: msg.total, page: Math.min(state.page, nextPages) }, []]\n }\n }\n}\n\nexport type PageItem =\n | { type: 'page'; page: number }\n | { type: 'ellipsis'; position: 'start' | 'end' }\n\n/**\n * Compute the visible page buttons with ellipses:\n * `[first ..boundaries] … [siblings around current] … [boundaries ..last]`.\n */\nexport function pageItems(state: PaginationState): PageItem[] {\n const pages = totalPages(state)\n if (pages === 0) return []\n\n // Build the set of pages we want to show: first boundary, last boundary,\n // and current ± siblings.\n const pageSet = new Set<number>()\n for (let i = 1; i <= Math.min(state.boundaries, pages); i++) pageSet.add(i)\n for (let i = Math.max(pages - state.boundaries + 1, 1); i <= pages; i++) pageSet.add(i)\n const start = Math.max(1, state.page - state.siblings)\n const end = Math.min(pages, state.page + state.siblings)\n for (let i = start; i <= end; i++) pageSet.add(i)\n\n // Emit items in order, inserting ellipses for gaps > 1.\n const sorted = [...pageSet].sort((a, b) => a - b)\n const items: PageItem[] = []\n for (let i = 0; i < sorted.length; i++) {\n const page = sorted[i]!\n items.push({ type: 'page', page })\n if (i < sorted.length - 1 && sorted[i + 1]! - page > 1) {\n items.push({ type: 'ellipsis', position: page < state.page ? 'start' : 'end' })\n }\n }\n return items\n}\n\nexport interface PaginationParts<S> {\n root: {\n role: 'navigation'\n 'aria-label': string | ((s: S) => string)\n 'data-scope': 'pagination'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n }\n prevTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'aria-disabled': (s: S) => 'true' | undefined\n disabled: (s: S) => boolean\n 'data-scope': 'pagination'\n 'data-part': 'prev-trigger'\n onClick: (e: MouseEvent) => void\n }\n nextTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'aria-disabled': (s: S) => 'true' | undefined\n disabled: (s: S) => boolean\n 'data-scope': 'pagination'\n 'data-part': 'next-trigger'\n onClick: (e: MouseEvent) => void\n }\n item: (page: number) => {\n type: 'button'\n 'aria-label': string\n 'aria-current': (s: S) => 'page' | undefined\n 'data-selected': (s: S) => '' | undefined\n 'data-scope': 'pagination'\n 'data-part': 'item'\n 'data-value': string\n onClick: (e: MouseEvent) => void\n }\n ellipsis: (position: 'start' | 'end') => {\n 'aria-hidden': 'true'\n 'data-scope': 'pagination'\n 'data-part': 'ellipsis'\n 'data-position': 'start' | 'end'\n }\n}\n\nexport interface ConnectOptions {\n label?: string\n prevLabel?: string\n nextLabel?: string\n pageLabel?: (page: number) => string\n}\n\nexport function connect<S>(\n get: (s: S) => PaginationState,\n send: Send<PaginationMsg>,\n opts: ConnectOptions = {},\n): PaginationParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const label: string | ((s: S) => string) = opts.label ?? ((s: S) => locale(s).pagination.label)\n const prevLabel: string | ((s: S) => string) =\n opts.prevLabel ?? ((s: S) => locale(s).pagination.prev)\n const nextLabel: string | ((s: S) => string) =\n opts.nextLabel ?? ((s: S) => locale(s).pagination.next)\n const pageLabel = opts.pageLabel ?? en.pagination.page\n\n return {\n root: {\n role: 'navigation',\n 'aria-label': label,\n 'data-scope': 'pagination',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n },\n prevTrigger: {\n type: 'button',\n 'aria-label': prevLabel,\n 'aria-disabled': (s) => (get(s).page <= 1 || get(s).disabled ? 'true' : undefined),\n disabled: (s) => get(s).page <= 1 || get(s).disabled,\n 'data-scope': 'pagination',\n 'data-part': 'prev-trigger',\n onClick: tagSend(send, ['prev'], () => send({ type: 'prev' })),\n },\n nextTrigger: {\n type: 'button',\n 'aria-label': nextLabel,\n 'aria-disabled': (s) => {\n const st = get(s)\n return st.page >= totalPages(st) || st.disabled ? 'true' : undefined\n },\n disabled: (s) => {\n const st = get(s)\n return st.page >= totalPages(st) || st.disabled\n },\n 'data-scope': 'pagination',\n 'data-part': 'next-trigger',\n onClick: tagSend(send, ['next'], () => send({ type: 'next' })),\n },\n item: (page: number) => ({\n type: 'button',\n 'aria-label': pageLabel(page),\n 'aria-current': (s) => (get(s).page === page ? 'page' : undefined),\n 'data-selected': (s) => (get(s).page === page ? '' : undefined),\n 'data-scope': 'pagination',\n 'data-part': 'item',\n 'data-value': String(page),\n onClick: tagSend(send, ['goTo'], () => send({ type: 'goTo', page })),\n }),\n ellipsis: (position: 'start' | 'end') => ({\n 'aria-hidden': 'true',\n 'data-scope': 'pagination',\n 'data-part': 'ellipsis',\n 'data-position': position,\n }),\n }\n}\n\nexport const pagination = { init, update, connect, totalPages, pageItems }\n"]}
@@ -7,12 +7,18 @@ export interface PasswordInputState {
7
7
  visible: boolean;
8
8
  disabled: boolean;
9
9
  }
10
- export type PasswordInputMsg = {
10
+ export type PasswordInputMsg =
11
+ /** @intent("Update the password value as the user types") */
12
+ {
11
13
  type: 'setValue';
12
14
  value: string;
13
- } | {
15
+ }
16
+ /** @intent("Toggle the show/hide-password state") */
17
+ | {
14
18
  type: 'toggleVisibility';
15
- } | {
19
+ }
20
+ /** @intent("Set the show/hide-password state to a specific value") */
21
+ | {
16
22
  type: 'setVisible';
17
23
  visible: boolean;
18
24
  };
@@ -1 +1 @@
1
- {"version":3,"file":"password-input.d.ts","sourceRoot":"","sources":["../../src/components/password-input.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAKrC;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAA;AAE5C,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,IAAI,CAAC,IAAI,GAAE,iBAAsB,GAAG,kBAAkB,CAMrE;AAED,wBAAgB,MAAM,CACpB,KAAK,EAAE,kBAAkB,EACzB,GAAG,EAAE,gBAAgB,GACpB,CAAC,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAU/B;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,IAAI,EAAE;QACJ,YAAY,EAAE,gBAAgB,CAAA;QAC9B,WAAW,EAAE,MAAM,CAAA;QACnB,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,SAAS,CAAA;QACxC,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,SAAS,CAAA;KAC1C,CAAA;IACD,KAAK,EAAE;QACL,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,UAAU,CAAA;QACnC,YAAY,EAAE,MAAM,CAAA;QACpB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;QAC3B,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;QACvB,YAAY,EAAE,gBAAgB,CAAA;QAC9B,WAAW,EAAE,OAAO,CAAA;QACpB,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;KAC5B,CAAA;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,QAAQ,CAAA;QACd,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;QAC9B,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;QACjC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;QAC3B,QAAQ,EAAE,CAAC,CAAC,CAAA;QACZ,YAAY,EAAE,gBAAgB,CAAA;QAC9B,WAAW,EAAE,oBAAoB,CAAA;QACjC,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;KACjC,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,OAAO,CAAC,CAAC,EACvB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,kBAAkB,EACjC,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAC5B,IAAI,GAAE,cAAmB,GACxB,kBAAkB,CAAC,CAAC,CAAC,CAoCvB;AAED,eAAO,MAAM,aAAa;;;;CAA4B,CAAA"}
1
+ {"version":3,"file":"password-input.d.ts","sourceRoot":"","sources":["../../src/components/password-input.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAKrC;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,MAAM,gBAAgB;AAC1B,6DAA6D;AAC3D;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AACrC,qDAAqD;GACnD;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE;AAC9B,sEAAsE;GACpE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAA;AAE5C,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,IAAI,CAAC,IAAI,GAAE,iBAAsB,GAAG,kBAAkB,CAMrE;AAED,wBAAgB,MAAM,CACpB,KAAK,EAAE,kBAAkB,EACzB,GAAG,EAAE,gBAAgB,GACpB,CAAC,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAU/B;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,IAAI,EAAE;QACJ,YAAY,EAAE,gBAAgB,CAAA;QAC9B,WAAW,EAAE,MAAM,CAAA;QACnB,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,SAAS,CAAA;QACxC,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,SAAS,CAAA;KAC1C,CAAA;IACD,KAAK,EAAE;QACL,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,UAAU,CAAA;QACnC,YAAY,EAAE,MAAM,CAAA;QACpB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;QAC3B,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;QACvB,YAAY,EAAE,gBAAgB,CAAA;QAC9B,WAAW,EAAE,OAAO,CAAA;QACpB,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;KAC5B,CAAA;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,QAAQ,CAAA;QACd,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;QAC9B,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;QACjC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;QAC3B,QAAQ,EAAE,CAAC,CAAC,CAAA;QACZ,YAAY,EAAE,gBAAgB,CAAA;QAC9B,WAAW,EAAE,oBAAoB,CAAA;QACjC,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;KACjC,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,OAAO,CAAC,CAAC,EACvB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,kBAAkB,EACjC,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAC5B,IAAI,GAAE,cAAmB,GACxB,kBAAkB,CAAC,CAAC,CAAC,CAsCvB;AAED,eAAO,MAAM,aAAa;;;;CAA4B,CAAA"}
@@ -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
  export function init(opts = {}) {
4
4
  return {
@@ -38,7 +38,7 @@ export function connect(get, send, opts = {}) {
38
38
  value: (s) => get(s).value,
39
39
  'data-scope': 'password-input',
40
40
  'data-part': 'input',
41
- onInput: (e) => send({ type: 'setValue', value: e.target.value }),
41
+ onInput: tagSend(send, ['setValue'], (e) => send({ type: 'setValue', value: e.target.value })),
42
42
  },
43
43
  visibilityTrigger: {
44
44
  type: 'button',
@@ -50,7 +50,7 @@ export function connect(get, send, opts = {}) {
50
50
  tabIndex: -1,
51
51
  'data-scope': 'password-input',
52
52
  'data-part': 'visibility-trigger',
53
- onClick: () => send({ type: 'toggleVisibility' }),
53
+ onClick: tagSend(send, ['toggleVisibility'], () => send({ type: 'toggleVisibility' })),
54
54
  },
55
55
  };
56
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"password-input.js","sourceRoot":"","sources":["../../src/components/password-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 * Password input — text input with show/hide visibility toggle.\n */\n\nexport interface PasswordInputState {\n value: string\n visible: boolean\n disabled: boolean\n}\n\nexport type PasswordInputMsg =\n | { type: 'setValue'; value: string }\n | { type: 'toggleVisibility' }\n | { type: 'setVisible'; visible: boolean }\n\nexport interface PasswordInputInit {\n value?: string\n visible?: boolean\n disabled?: boolean\n}\n\nexport function init(opts: PasswordInputInit = {}): PasswordInputState {\n return {\n value: opts.value ?? '',\n visible: opts.visible ?? false,\n disabled: opts.disabled ?? false,\n }\n}\n\nexport function update(\n state: PasswordInputState,\n msg: PasswordInputMsg,\n): [PasswordInputState, never[]] {\n if (state.disabled && msg.type !== 'setValue') return [state, []]\n switch (msg.type) {\n case 'setValue':\n return [{ ...state, value: msg.value }, []]\n case 'toggleVisibility':\n return [{ ...state, visible: !state.visible }, []]\n case 'setVisible':\n return [{ ...state, visible: msg.visible }, []]\n }\n}\n\nexport interface PasswordInputParts<S> {\n root: {\n 'data-scope': 'password-input'\n 'data-part': 'root'\n 'data-visible': (s: S) => '' | undefined\n 'data-disabled': (s: S) => '' | undefined\n }\n input: {\n type: (s: S) => 'text' | 'password'\n autoComplete: string\n disabled: (s: S) => boolean\n value: (s: S) => string\n 'data-scope': 'password-input'\n 'data-part': 'input'\n onInput: (e: Event) => void\n }\n visibilityTrigger: {\n type: 'button'\n 'aria-label': (s: S) => string\n 'aria-pressed': (s: S) => boolean\n disabled: (s: S) => boolean\n tabIndex: -1\n 'data-scope': 'password-input'\n 'data-part': 'visibility-trigger'\n onClick: (e: MouseEvent) => void\n }\n}\n\nexport interface ConnectOptions {\n autoComplete?: string\n showLabel?: string\n hideLabel?: string\n}\n\nexport function connect<S>(\n get: (s: S) => PasswordInputState,\n send: Send<PasswordInputMsg>,\n opts: ConnectOptions = {},\n): PasswordInputParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const autoComplete = opts.autoComplete ?? 'current-password'\n const showLabel = opts.showLabel\n const hideLabel = opts.hideLabel\n\n return {\n root: {\n 'data-scope': 'password-input',\n 'data-part': 'root',\n 'data-visible': (s) => (get(s).visible ? '' : undefined),\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n },\n input: {\n type: (s) => (get(s).visible ? 'text' : 'password'),\n autoComplete,\n disabled: (s) => get(s).disabled,\n value: (s) => get(s).value,\n 'data-scope': 'password-input',\n 'data-part': 'input',\n onInput: (e) => send({ type: 'setValue', value: (e.target as HTMLInputElement).value }),\n },\n visibilityTrigger: {\n type: 'button',\n 'aria-label': (s) =>\n get(s).visible\n ? (hideLabel ?? locale(s).passwordInput.hide)\n : (showLabel ?? locale(s).passwordInput.show),\n 'aria-pressed': (s) => get(s).visible,\n disabled: (s) => get(s).disabled,\n tabIndex: -1,\n 'data-scope': 'password-input',\n 'data-part': 'visibility-trigger',\n onClick: () => send({ type: 'toggleVisibility' }),\n },\n }\n}\n\nexport const passwordInput = { init, update, connect }\n"]}
1
+ {"version":3,"file":"password-input.js","sourceRoot":"","sources":["../../src/components/password-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 * Password input — text input with show/hide visibility toggle.\n */\n\nexport interface PasswordInputState {\n value: string\n visible: boolean\n disabled: boolean\n}\n\nexport type PasswordInputMsg =\n /** @intent(\"Update the password value as the user types\") */\n | { type: 'setValue'; value: string }\n /** @intent(\"Toggle the show/hide-password state\") */\n | { type: 'toggleVisibility' }\n /** @intent(\"Set the show/hide-password state to a specific value\") */\n | { type: 'setVisible'; visible: boolean }\n\nexport interface PasswordInputInit {\n value?: string\n visible?: boolean\n disabled?: boolean\n}\n\nexport function init(opts: PasswordInputInit = {}): PasswordInputState {\n return {\n value: opts.value ?? '',\n visible: opts.visible ?? false,\n disabled: opts.disabled ?? false,\n }\n}\n\nexport function update(\n state: PasswordInputState,\n msg: PasswordInputMsg,\n): [PasswordInputState, never[]] {\n if (state.disabled && msg.type !== 'setValue') return [state, []]\n switch (msg.type) {\n case 'setValue':\n return [{ ...state, value: msg.value }, []]\n case 'toggleVisibility':\n return [{ ...state, visible: !state.visible }, []]\n case 'setVisible':\n return [{ ...state, visible: msg.visible }, []]\n }\n}\n\nexport interface PasswordInputParts<S> {\n root: {\n 'data-scope': 'password-input'\n 'data-part': 'root'\n 'data-visible': (s: S) => '' | undefined\n 'data-disabled': (s: S) => '' | undefined\n }\n input: {\n type: (s: S) => 'text' | 'password'\n autoComplete: string\n disabled: (s: S) => boolean\n value: (s: S) => string\n 'data-scope': 'password-input'\n 'data-part': 'input'\n onInput: (e: Event) => void\n }\n visibilityTrigger: {\n type: 'button'\n 'aria-label': (s: S) => string\n 'aria-pressed': (s: S) => boolean\n disabled: (s: S) => boolean\n tabIndex: -1\n 'data-scope': 'password-input'\n 'data-part': 'visibility-trigger'\n onClick: (e: MouseEvent) => void\n }\n}\n\nexport interface ConnectOptions {\n autoComplete?: string\n showLabel?: string\n hideLabel?: string\n}\n\nexport function connect<S>(\n get: (s: S) => PasswordInputState,\n send: Send<PasswordInputMsg>,\n opts: ConnectOptions = {},\n): PasswordInputParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const autoComplete = opts.autoComplete ?? 'current-password'\n const showLabel = opts.showLabel\n const hideLabel = opts.hideLabel\n\n return {\n root: {\n 'data-scope': 'password-input',\n 'data-part': 'root',\n 'data-visible': (s) => (get(s).visible ? '' : undefined),\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n },\n input: {\n type: (s) => (get(s).visible ? 'text' : 'password'),\n autoComplete,\n disabled: (s) => get(s).disabled,\n value: (s) => get(s).value,\n 'data-scope': 'password-input',\n 'data-part': 'input',\n onInput: tagSend(send, ['setValue'], (e) =>\n send({ type: 'setValue', value: (e.target as HTMLInputElement).value }),\n ),\n },\n visibilityTrigger: {\n type: 'button',\n 'aria-label': (s) =>\n get(s).visible\n ? (hideLabel ?? locale(s).passwordInput.hide)\n : (showLabel ?? locale(s).passwordInput.show),\n 'aria-pressed': (s) => get(s).visible,\n disabled: (s) => get(s).disabled,\n tabIndex: -1,\n 'data-scope': 'password-input',\n 'data-part': 'visibility-trigger',\n onClick: tagSend(send, ['toggleVisibility'], () => send({ type: 'toggleVisibility' })),\n },\n }\n}\n\nexport const passwordInput = { init, update, connect }\n"]}
@@ -13,19 +13,29 @@ export interface PinInputState {
13
13
  disabled: boolean;
14
14
  focusedIndex: number;
15
15
  }
16
- export type PinInputMsg = {
16
+ export type PinInputMsg =
17
+ /** @intent("Set the character at a given field index (auto-advances focus on accept)") */
18
+ {
17
19
  type: 'setValue';
18
20
  index: number;
19
21
  value: string;
20
- } | {
22
+ }
23
+ /** @intent("Replace every field at once (typically from paste)") */
24
+ | {
21
25
  type: 'setAll';
22
26
  values: string[];
23
- } | {
27
+ }
28
+ /** @humanOnly */
29
+ | {
24
30
  type: 'focus';
25
31
  index: number;
26
- } | {
32
+ }
33
+ /** @intent("Clear every field") */
34
+ | {
27
35
  type: 'clear';
28
- } | {
36
+ }
37
+ /** @humanOnly */
38
+ | {
29
39
  type: 'backspace';
30
40
  index: number;
31
41
  };
@@ -1 +1 @@
1
- {"version":3,"file":"pin-input.d.ts","sourceRoot":"","sources":["../../src/components/pin-input.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pin-input.d.ts","sourceRoot":"","sources":["../../src/components/pin-input.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { tagSend } from '@llui/dom';
1
2
  import { flipArrow } from '../utils/direction.js';
2
3
  import { en } from '../locale.js';
3
4
  export function init(opts = {}) {
@@ -107,7 +108,7 @@ export function connect(get, send, opts) {
107
108
  'data-scope': 'pin-input',
108
109
  'data-part': 'input',
109
110
  'data-index': String(index),
110
- onInput: (e) => {
111
+ onInput: tagSend(send, ['setValue'], (e) => {
111
112
  const value = e.target.value;
112
113
  if (validate && value !== '') {
113
114
  const errors = validate(value.slice(-1));
@@ -115,8 +116,8 @@ export function connect(get, send, opts) {
115
116
  return;
116
117
  }
117
118
  send({ type: 'setValue', index, value });
118
- },
119
- onKeyDown: (e) => {
119
+ }),
120
+ onKeyDown: tagSend(send, ['backspace', 'focus'], (e) => {
120
121
  const key = flipArrow(e.key, e.currentTarget);
121
122
  if (key === 'Backspace') {
122
123
  send({ type: 'backspace', index });
@@ -129,13 +130,13 @@ export function connect(get, send, opts) {
129
130
  e.preventDefault();
130
131
  send({ type: 'focus', index: index + 1 });
131
132
  }
132
- },
133
- onFocus: () => send({ type: 'focus', index }),
134
- onPaste: (e) => {
133
+ }),
134
+ onFocus: tagSend(send, ['focus'], () => send({ type: 'focus', index })),
135
+ onPaste: tagSend(send, ['setAll'], (e) => {
135
136
  e.preventDefault();
136
137
  const text = e.clipboardData?.getData('text') ?? '';
137
138
  send({ type: 'setAll', values: text.split('') });
138
- },
139
+ }),
139
140
  }),
140
141
  };
141
142
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pin-input.js","sourceRoot":"","sources":["../../src/components/pin-input.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { flipArrow } from '../utils/direction.js'\nimport { en } from '../locale.js'\n\n/**\n * Pin input — a sequence of single-character fields for OTP codes, etc.\n * Auto-advances on input, handles backspace to previous field, supports\n * paste-to-fill across multiple fields.\n */\n\nexport type PinType = 'numeric' | 'alphanumeric' | 'alphabetic'\n\nexport interface PinInputState {\n values: string[]\n length: number\n type: PinType\n mask: boolean\n disabled: boolean\n focusedIndex: number\n}\n\nexport type PinInputMsg =\n | { type: 'setValue'; index: number; value: string }\n | { type: 'setAll'; values: string[] }\n | { type: 'focus'; index: number }\n | { type: 'clear' }\n | { type: 'backspace'; index: number }\n\nexport interface PinInputInit {\n length?: number\n type?: PinType\n mask?: boolean\n disabled?: boolean\n values?: string[]\n}\n\nexport function init(opts: PinInputInit = {}): PinInputState {\n const length = opts.length ?? 4\n const values = opts.values ?? new Array<string>(length).fill('')\n return {\n values,\n length,\n type: opts.type ?? 'numeric',\n mask: opts.mask ?? false,\n disabled: opts.disabled ?? false,\n focusedIndex: 0,\n }\n}\n\nfunction sanitize(char: string, type: PinType): string {\n if (char.length !== 1) return ''\n if (type === 'numeric' && !/\\d/.test(char)) return ''\n if (type === 'alphabetic' && !/[a-zA-Z]/.test(char)) return ''\n if (type === 'alphanumeric' && !/[a-zA-Z0-9]/.test(char)) return ''\n return char\n}\n\nexport function update(state: PinInputState, msg: PinInputMsg): [PinInputState, never[]] {\n if (state.disabled) return [state, []]\n switch (msg.type) {\n case 'setValue': {\n const char = sanitize(msg.value.slice(-1), state.type)\n if (!char && msg.value !== '') return [state, []]\n const values = [...state.values]\n values[msg.index] = char\n // Auto-advance\n const nextIndex = char ? Math.min(msg.index + 1, state.length - 1) : msg.index\n return [{ ...state, values, focusedIndex: nextIndex }, []]\n }\n case 'setAll': {\n const values = new Array<string>(state.length).fill('')\n for (let i = 0; i < Math.min(msg.values.length, state.length); i++) {\n values[i] = sanitize(msg.values[i]!, state.type)\n }\n const lastFilled = values.findIndex((v) => v === '')\n const focusedIndex = lastFilled === -1 ? state.length - 1 : lastFilled\n return [{ ...state, values, focusedIndex }, []]\n }\n case 'focus':\n return [{ ...state, focusedIndex: Math.max(0, Math.min(msg.index, state.length - 1)) }, []]\n case 'clear':\n return [{ ...state, values: new Array<string>(state.length).fill(''), focusedIndex: 0 }, []]\n case 'backspace': {\n const values = [...state.values]\n if (values[msg.index]) {\n values[msg.index] = ''\n return [{ ...state, values }, []]\n }\n // Field is empty — move focus back and clear prior\n const prev = Math.max(0, msg.index - 1)\n values[prev] = ''\n return [{ ...state, values, focusedIndex: prev }, []]\n }\n }\n}\n\nexport function isComplete(state: PinInputState): boolean {\n return state.values.every((v) => v !== '')\n}\n\nexport function getValue(state: PinInputState): string {\n return state.values.join('')\n}\n\nexport interface PinInputParts<S> {\n root: {\n role: 'group'\n 'aria-labelledby': string\n 'data-scope': 'pin-input'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n }\n label: {\n id: string\n 'data-scope': 'pin-input'\n 'data-part': 'label'\n }\n /** Props for the input at a given index. */\n input: (index: number) => {\n type: (s: S) => 'text' | 'password'\n inputMode: (s: S) => 'numeric' | 'text'\n pattern: (s: S) => string\n maxLength: 1\n autoComplete: 'off'\n 'aria-label': string\n disabled: (s: S) => boolean\n value: (s: S) => string\n 'data-scope': 'pin-input'\n 'data-part': 'input'\n 'data-index': string\n onInput: (e: Event) => void\n onKeyDown: (e: KeyboardEvent) => void\n onFocus: (e: FocusEvent) => void\n onPaste: (e: ClipboardEvent) => void\n }\n}\n\nexport interface ConnectOptions {\n id: string\n inputLabel?: (index: number) => string\n /** Validate each character before setting. Non-empty array blocks setDigit. */\n validate?: (value: string) => string[] | null\n}\n\nexport function connect<S>(\n get: (s: S) => PinInputState,\n send: Send<PinInputMsg>,\n opts: ConnectOptions,\n): PinInputParts<S> {\n const labelId = `${opts.id}:label`\n const inputLabel = opts.inputLabel ?? en.pinInput.input\n const validate = opts.validate\n\n return {\n root: {\n role: 'group',\n 'aria-labelledby': labelId,\n 'data-scope': 'pin-input',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n },\n label: {\n id: labelId,\n 'data-scope': 'pin-input',\n 'data-part': 'label',\n },\n input: (index: number) => ({\n type: (s) => (get(s).mask ? 'password' : 'text'),\n inputMode: (s) => (get(s).type === 'numeric' ? 'numeric' : 'text'),\n pattern: (s) => {\n switch (get(s).type) {\n case 'numeric':\n return '[0-9]*'\n case 'alphabetic':\n return '[a-zA-Z]*'\n case 'alphanumeric':\n return '[a-zA-Z0-9]*'\n }\n },\n maxLength: 1,\n autoComplete: 'off',\n 'aria-label': inputLabel(index),\n disabled: (s) => get(s).disabled,\n value: (s) => get(s).values[index] ?? '',\n 'data-scope': 'pin-input',\n 'data-part': 'input',\n 'data-index': String(index),\n onInput: (e) => {\n const value = (e.target as HTMLInputElement).value\n if (validate && value !== '') {\n const errors = validate(value.slice(-1))\n if (errors && errors.length > 0) return\n }\n send({ type: 'setValue', index, value })\n },\n onKeyDown: (e) => {\n const key = flipArrow(e.key, e.currentTarget as Element)\n if (key === 'Backspace') {\n send({ type: 'backspace', index })\n } else if (key === 'ArrowLeft') {\n e.preventDefault()\n send({ type: 'focus', index: index - 1 })\n } else if (key === 'ArrowRight') {\n e.preventDefault()\n send({ type: 'focus', index: index + 1 })\n }\n },\n onFocus: () => send({ type: 'focus', index }),\n onPaste: (e) => {\n e.preventDefault()\n const text = e.clipboardData?.getData('text') ?? ''\n send({ type: 'setAll', values: text.split('') })\n },\n }),\n }\n}\n\nexport const pinInput = { init, update, connect, isComplete, getValue }\n"]}
1
+ {"version":3,"file":"pin-input.js","sourceRoot":"","sources":["../../src/components/pin-input.ts"],"names":[],"mappings":"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","sourcesContent":["import { tagSend } from '@llui/dom'\nimport type { Send } from '@llui/dom'\nimport { flipArrow } from '../utils/direction.js'\nimport { en } from '../locale.js'\n\n/**\n * Pin input — a sequence of single-character fields for OTP codes, etc.\n * Auto-advances on input, handles backspace to previous field, supports\n * paste-to-fill across multiple fields.\n */\n\nexport type PinType = 'numeric' | 'alphanumeric' | 'alphabetic'\n\nexport interface PinInputState {\n values: string[]\n length: number\n type: PinType\n mask: boolean\n disabled: boolean\n focusedIndex: number\n}\n\nexport type PinInputMsg =\n /** @intent(\"Set the character at a given field index (auto-advances focus on accept)\") */\n | { type: 'setValue'; index: number; value: string }\n /** @intent(\"Replace every field at once (typically from paste)\") */\n | { type: 'setAll'; values: string[] }\n /** @humanOnly */\n | { type: 'focus'; index: number }\n /** @intent(\"Clear every field\") */\n | { type: 'clear' }\n /** @humanOnly */\n | { type: 'backspace'; index: number }\n\nexport interface PinInputInit {\n length?: number\n type?: PinType\n mask?: boolean\n disabled?: boolean\n values?: string[]\n}\n\nexport function init(opts: PinInputInit = {}): PinInputState {\n const length = opts.length ?? 4\n const values = opts.values ?? new Array<string>(length).fill('')\n return {\n values,\n length,\n type: opts.type ?? 'numeric',\n mask: opts.mask ?? false,\n disabled: opts.disabled ?? false,\n focusedIndex: 0,\n }\n}\n\nfunction sanitize(char: string, type: PinType): string {\n if (char.length !== 1) return ''\n if (type === 'numeric' && !/\\d/.test(char)) return ''\n if (type === 'alphabetic' && !/[a-zA-Z]/.test(char)) return ''\n if (type === 'alphanumeric' && !/[a-zA-Z0-9]/.test(char)) return ''\n return char\n}\n\nexport function update(state: PinInputState, msg: PinInputMsg): [PinInputState, never[]] {\n if (state.disabled) return [state, []]\n switch (msg.type) {\n case 'setValue': {\n const char = sanitize(msg.value.slice(-1), state.type)\n if (!char && msg.value !== '') return [state, []]\n const values = [...state.values]\n values[msg.index] = char\n // Auto-advance\n const nextIndex = char ? Math.min(msg.index + 1, state.length - 1) : msg.index\n return [{ ...state, values, focusedIndex: nextIndex }, []]\n }\n case 'setAll': {\n const values = new Array<string>(state.length).fill('')\n for (let i = 0; i < Math.min(msg.values.length, state.length); i++) {\n values[i] = sanitize(msg.values[i]!, state.type)\n }\n const lastFilled = values.findIndex((v) => v === '')\n const focusedIndex = lastFilled === -1 ? state.length - 1 : lastFilled\n return [{ ...state, values, focusedIndex }, []]\n }\n case 'focus':\n return [{ ...state, focusedIndex: Math.max(0, Math.min(msg.index, state.length - 1)) }, []]\n case 'clear':\n return [{ ...state, values: new Array<string>(state.length).fill(''), focusedIndex: 0 }, []]\n case 'backspace': {\n const values = [...state.values]\n if (values[msg.index]) {\n values[msg.index] = ''\n return [{ ...state, values }, []]\n }\n // Field is empty — move focus back and clear prior\n const prev = Math.max(0, msg.index - 1)\n values[prev] = ''\n return [{ ...state, values, focusedIndex: prev }, []]\n }\n }\n}\n\nexport function isComplete(state: PinInputState): boolean {\n return state.values.every((v) => v !== '')\n}\n\nexport function getValue(state: PinInputState): string {\n return state.values.join('')\n}\n\nexport interface PinInputParts<S> {\n root: {\n role: 'group'\n 'aria-labelledby': string\n 'data-scope': 'pin-input'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n }\n label: {\n id: string\n 'data-scope': 'pin-input'\n 'data-part': 'label'\n }\n /** Props for the input at a given index. */\n input: (index: number) => {\n type: (s: S) => 'text' | 'password'\n inputMode: (s: S) => 'numeric' | 'text'\n pattern: (s: S) => string\n maxLength: 1\n autoComplete: 'off'\n 'aria-label': string\n disabled: (s: S) => boolean\n value: (s: S) => string\n 'data-scope': 'pin-input'\n 'data-part': 'input'\n 'data-index': string\n onInput: (e: Event) => void\n onKeyDown: (e: KeyboardEvent) => void\n onFocus: (e: FocusEvent) => void\n onPaste: (e: ClipboardEvent) => void\n }\n}\n\nexport interface ConnectOptions {\n id: string\n inputLabel?: (index: number) => string\n /** Validate each character before setting. Non-empty array blocks setDigit. */\n validate?: (value: string) => string[] | null\n}\n\nexport function connect<S>(\n get: (s: S) => PinInputState,\n send: Send<PinInputMsg>,\n opts: ConnectOptions,\n): PinInputParts<S> {\n const labelId = `${opts.id}:label`\n const inputLabel = opts.inputLabel ?? en.pinInput.input\n const validate = opts.validate\n\n return {\n root: {\n role: 'group',\n 'aria-labelledby': labelId,\n 'data-scope': 'pin-input',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n },\n label: {\n id: labelId,\n 'data-scope': 'pin-input',\n 'data-part': 'label',\n },\n input: (index: number) => ({\n type: (s) => (get(s).mask ? 'password' : 'text'),\n inputMode: (s) => (get(s).type === 'numeric' ? 'numeric' : 'text'),\n pattern: (s) => {\n switch (get(s).type) {\n case 'numeric':\n return '[0-9]*'\n case 'alphabetic':\n return '[a-zA-Z]*'\n case 'alphanumeric':\n return '[a-zA-Z0-9]*'\n }\n },\n maxLength: 1,\n autoComplete: 'off',\n 'aria-label': inputLabel(index),\n disabled: (s) => get(s).disabled,\n value: (s) => get(s).values[index] ?? '',\n 'data-scope': 'pin-input',\n 'data-part': 'input',\n 'data-index': String(index),\n onInput: tagSend(send, ['setValue'], (e) => {\n const value = (e.target as HTMLInputElement).value\n if (validate && value !== '') {\n const errors = validate(value.slice(-1))\n if (errors && errors.length > 0) return\n }\n send({ type: 'setValue', index, value })\n }),\n onKeyDown: tagSend(send, ['backspace', 'focus'], (e) => {\n const key = flipArrow(e.key, e.currentTarget as Element)\n if (key === 'Backspace') {\n send({ type: 'backspace', index })\n } else if (key === 'ArrowLeft') {\n e.preventDefault()\n send({ type: 'focus', index: index - 1 })\n } else if (key === 'ArrowRight') {\n e.preventDefault()\n send({ type: 'focus', index: index + 1 })\n }\n }),\n onFocus: tagSend(send, ['focus'], () => send({ type: 'focus', index })),\n onPaste: tagSend(send, ['setAll'], (e) => {\n e.preventDefault()\n const text = e.clipboardData?.getData('text') ?? ''\n send({ type: 'setAll', values: text.split('') })\n }),\n }),\n }\n}\n\nexport const pinInput = { init, update, connect, isComplete, getValue }\n"]}
@@ -10,13 +10,21 @@ import { type Placement } from '../utils/floating.js';
10
10
  export interface PopoverState {
11
11
  open: boolean;
12
12
  }
13
- export type PopoverMsg = {
13
+ export type PopoverMsg =
14
+ /** @intent("Open the popover") */
15
+ {
14
16
  type: 'open';
15
- } | {
17
+ }
18
+ /** @intent("Close the popover") */
19
+ | {
16
20
  type: 'close';
17
- } | {
21
+ }
22
+ /** @intent("Toggle the popover open/closed") */
23
+ | {
18
24
  type: 'toggle';
19
- } | {
25
+ }
26
+ /** @intent("Set the popover's open state to a specific value") */
27
+ | {
20
28
  type: 'setOpen';
21
29
  open: boolean;
22
30
  };
@@ -1 +1 @@
1
- {"version":3,"file":"popover.d.ts","sourceRoot":"","sources":["../../src/components/popover.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"popover.d.ts","sourceRoot":"","sources":["../../src/components/popover.ts"],"names":[],"mappings":"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"}
@@ -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 { pushDismissable } from '../utils/dismissable.js';
4
4
  import { pushFocusTrap } from '../utils/focus-trap.js';
@@ -36,7 +36,7 @@ export function connect(get, send, opts) {
36
36
  'data-state': (s) => (get(s).open ? 'open' : 'closed'),
37
37
  'data-scope': 'popover',
38
38
  'data-part': 'trigger',
39
- onClick: () => send({ type: 'toggle' }),
39
+ onClick: tagSend(send, ['toggle'], () => send({ type: 'toggle' })),
40
40
  },
41
41
  positioner: {
42
42
  'data-scope': 'popover',
@@ -71,7 +71,7 @@ export function connect(get, send, opts) {
71
71
  'aria-label': closeLabel,
72
72
  'data-scope': 'popover',
73
73
  'data-part': 'close-trigger',
74
- onClick: () => send({ type: 'close' }),
74
+ onClick: tagSend(send, ['close'], () => send({ type: 'close' })),
75
75
  },
76
76
  };
77
77
  }
@@ -1 +1 @@
1
- {"version":3,"file":"popover.js","sourceRoot":"","sources":["../../src/components/popover.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send, TransitionOptions } from '@llui/dom'\nimport { show, portal, onMount, div, useContext } from '@llui/dom'\nimport { LocaleContext } from '../locale.js'\nimport type { Locale } from '../locale.js'\nimport { pushDismissable } from '../utils/dismissable.js'\nimport { pushFocusTrap } from '../utils/focus-trap.js'\nimport { attachFloating, type Placement } from '../utils/floating.js'\n\n/**\n * Popover — click-triggered, non-modal floating overlay anchored to its\n * trigger. Use for menus, date pickers, color pickers, filters, etc.\n *\n * Like dialog, has a pure state machine + a view helper (`overlay()`) that\n * wires floating-ui positioning, dismissable, and optional focus trapping.\n */\n\nexport interface PopoverState {\n open: boolean\n}\n\nexport type PopoverMsg =\n | { type: 'open' }\n | { type: 'close' }\n | { type: 'toggle' }\n | { type: 'setOpen'; open: boolean }\n\nexport interface PopoverInit {\n open?: boolean\n}\n\nexport function init(opts: PopoverInit = {}): PopoverState {\n return { open: opts.open ?? false }\n}\n\nexport function update(state: PopoverState, msg: PopoverMsg): [PopoverState, never[]] {\n switch (msg.type) {\n case 'open':\n return [{ ...state, open: true }, []]\n case 'close':\n return [{ ...state, open: false }, []]\n case 'toggle':\n return [{ ...state, open: !state.open }, []]\n case 'setOpen':\n return [{ ...state, open: msg.open }, []]\n }\n}\n\nexport interface PopoverParts<S> {\n trigger: {\n type: 'button'\n 'aria-haspopup': 'dialog'\n 'aria-expanded': (s: S) => boolean\n 'aria-controls': string\n id: string\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-scope': 'popover'\n 'data-part': 'trigger'\n onClick: (e: MouseEvent) => void\n }\n positioner: {\n 'data-scope': 'popover'\n 'data-part': 'positioner'\n style: string\n }\n content: {\n role: 'dialog'\n id: string\n 'aria-labelledby': string\n tabIndex: -1\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-scope': 'popover'\n 'data-part': 'content'\n }\n title: {\n id: string\n 'data-scope': 'popover'\n 'data-part': 'title'\n }\n description: {\n id: string\n 'data-scope': 'popover'\n 'data-part': 'description'\n }\n arrow: {\n 'data-scope': 'popover'\n 'data-part': 'arrow'\n }\n closeTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'data-scope': 'popover'\n 'data-part': 'close-trigger'\n onClick: (e: MouseEvent) => void\n }\n}\n\nexport interface ConnectOptions {\n id: string\n closeLabel?: string\n}\n\nexport function connect<S>(\n get: (s: S) => PopoverState,\n send: Send<PopoverMsg>,\n opts: ConnectOptions,\n): PopoverParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const base = opts.id\n const triggerId = `${base}:trigger`\n const contentId = `${base}:content`\n const titleId = `${base}:title`\n const descId = `${base}:description`\n const closeLabel: string | ((s: S) => string) =\n opts.closeLabel ?? ((s: S) => locale(s).popover.close)\n\n return {\n trigger: {\n type: 'button',\n 'aria-haspopup': 'dialog',\n 'aria-expanded': (s) => get(s).open,\n 'aria-controls': contentId,\n id: triggerId,\n 'data-state': (s) => (get(s).open ? 'open' : 'closed'),\n 'data-scope': 'popover',\n 'data-part': 'trigger',\n onClick: () => send({ type: 'toggle' }),\n },\n positioner: {\n 'data-scope': 'popover',\n 'data-part': 'positioner',\n style: 'position:absolute;top:0;left:0;',\n },\n content: {\n role: 'dialog',\n id: contentId,\n 'aria-labelledby': titleId,\n tabIndex: -1,\n 'data-state': (s) => (get(s).open ? 'open' : 'closed'),\n 'data-scope': 'popover',\n 'data-part': 'content',\n },\n title: {\n id: titleId,\n 'data-scope': 'popover',\n 'data-part': 'title',\n },\n description: {\n id: descId,\n 'data-scope': 'popover',\n 'data-part': 'description',\n },\n arrow: {\n 'data-scope': 'popover',\n 'data-part': 'arrow',\n },\n closeTrigger: {\n type: 'button',\n 'aria-label': closeLabel,\n 'data-scope': 'popover',\n 'data-part': 'close-trigger',\n onClick: () => send({ type: 'close' }),\n },\n }\n}\n\nexport interface OverlayOptions<S> {\n get: (s: S) => PopoverState\n send: Send<PopoverMsg>\n parts: PopoverParts<S>\n content: () => Node[]\n /** Placement preference — bottom | top | right | left with -start/-end variants. */\n placement?: Placement\n /** Offset between trigger and content, px (default: 8). */\n offset?: number\n /** Auto-flip to opposite side (default: true). */\n flip?: boolean\n /** Shift to keep in viewport (default: true). */\n shift?: boolean\n /** Optional transition. */\n transition?: TransitionOptions\n /** Close on Escape (default: true). */\n closeOnEscape?: boolean\n /** Close on outside click (default: true). */\n closeOnOutsideClick?: boolean\n /** Trap focus inside popover while open (default: false — non-modal). */\n trapFocus?: boolean\n /** Restore focus to trigger on close (default: true). */\n restoreFocus?: boolean\n /** Portal target (default: 'body'). */\n target?: string | HTMLElement\n /** Arrow element selector within content (optional). */\n arrowSelector?: string\n}\n\nexport function overlay<S>(opts: OverlayOptions<S>): Node[] {\n const target = opts.target ?? 'body'\n const placement = opts.placement ?? 'bottom'\n const offset = opts.offset ?? 8\n const flip = opts.flip !== false\n const shift = opts.shift !== false\n const closeOnEscape = opts.closeOnEscape !== false\n const closeOnOutsideClick = opts.closeOnOutsideClick !== false\n const trapFocus = opts.trapFocus === true\n const restoreFocus = opts.restoreFocus !== false\n const parts = opts.parts\n const contentId = parts.content.id\n const triggerId = parts.trigger.id\n\n return show<S, PopoverMsg>({\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 triggerEl = document.getElementById(triggerId)\n if (!contentEl || !triggerEl) return\n\n const cleanups: Array<() => void> = []\n\n // Position content relative to trigger\n const positioner = contentEl.closest('[data-part=\"positioner\"]') as HTMLElement | null\n const floatingEl = positioner ?? contentEl\n const arrow = opts.arrowSelector\n ? (contentEl.querySelector(opts.arrowSelector) as HTMLElement | null)\n : null\n cleanups.push(\n attachFloating({\n anchor: triggerEl,\n floating: floatingEl,\n placement,\n offset,\n flip,\n shift,\n arrow: arrow ?? undefined,\n }),\n )\n\n if (trapFocus) {\n cleanups.push(\n pushFocusTrap({\n container: contentEl,\n restoreFocus,\n }),\n )\n }\n\n if (closeOnEscape || closeOnOutsideClick) {\n cleanups.push(\n pushDismissable({\n element: contentEl,\n ignore: () => [triggerEl],\n disableEscape: !closeOnEscape,\n disableOutside: !closeOnOutsideClick,\n onDismiss: () => {\n opts.send({ type: 'close' })\n if (restoreFocus) triggerEl.focus()\n },\n }),\n )\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 popover = { init, update, connect, overlay }\n"]}
1
+ {"version":3,"file":"popover.js","sourceRoot":"","sources":["../../src/components/popover.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 { pushFocusTrap } from '../utils/focus-trap.js'\nimport { attachFloating, type Placement } from '../utils/floating.js'\n\n/**\n * Popover — click-triggered, non-modal floating overlay anchored to its\n * trigger. Use for menus, date pickers, color pickers, filters, etc.\n *\n * Like dialog, has a pure state machine + a view helper (`overlay()`) that\n * wires floating-ui positioning, dismissable, and optional focus trapping.\n */\n\nexport interface PopoverState {\n open: boolean\n}\n\nexport type PopoverMsg =\n /** @intent(\"Open the popover\") */\n | { type: 'open' }\n /** @intent(\"Close the popover\") */\n | { type: 'close' }\n /** @intent(\"Toggle the popover open/closed\") */\n | { type: 'toggle' }\n /** @intent(\"Set the popover's open state to a specific value\") */\n | { type: 'setOpen'; open: boolean }\n\nexport interface PopoverInit {\n open?: boolean\n}\n\nexport function init(opts: PopoverInit = {}): PopoverState {\n return { open: opts.open ?? false }\n}\n\nexport function update(state: PopoverState, msg: PopoverMsg): [PopoverState, never[]] {\n switch (msg.type) {\n case 'open':\n return [{ ...state, open: true }, []]\n case 'close':\n return [{ ...state, open: false }, []]\n case 'toggle':\n return [{ ...state, open: !state.open }, []]\n case 'setOpen':\n return [{ ...state, open: msg.open }, []]\n }\n}\n\nexport interface PopoverParts<S> {\n trigger: {\n type: 'button'\n 'aria-haspopup': 'dialog'\n 'aria-expanded': (s: S) => boolean\n 'aria-controls': string\n id: string\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-scope': 'popover'\n 'data-part': 'trigger'\n onClick: (e: MouseEvent) => void\n }\n positioner: {\n 'data-scope': 'popover'\n 'data-part': 'positioner'\n style: string\n }\n content: {\n role: 'dialog'\n id: string\n 'aria-labelledby': string\n tabIndex: -1\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-scope': 'popover'\n 'data-part': 'content'\n }\n title: {\n id: string\n 'data-scope': 'popover'\n 'data-part': 'title'\n }\n description: {\n id: string\n 'data-scope': 'popover'\n 'data-part': 'description'\n }\n arrow: {\n 'data-scope': 'popover'\n 'data-part': 'arrow'\n }\n closeTrigger: {\n type: 'button'\n 'aria-label': string | ((s: S) => string)\n 'data-scope': 'popover'\n 'data-part': 'close-trigger'\n onClick: (e: MouseEvent) => void\n }\n}\n\nexport interface ConnectOptions {\n id: string\n closeLabel?: string\n}\n\nexport function connect<S>(\n get: (s: S) => PopoverState,\n send: Send<PopoverMsg>,\n opts: ConnectOptions,\n): PopoverParts<S> {\n const locale = useContext<S, Locale>(LocaleContext)\n const base = opts.id\n const triggerId = `${base}:trigger`\n const contentId = `${base}:content`\n const titleId = `${base}:title`\n const descId = `${base}:description`\n const closeLabel: string | ((s: S) => string) =\n opts.closeLabel ?? ((s: S) => locale(s).popover.close)\n\n return {\n trigger: {\n type: 'button',\n 'aria-haspopup': 'dialog',\n 'aria-expanded': (s) => get(s).open,\n 'aria-controls': contentId,\n id: triggerId,\n 'data-state': (s) => (get(s).open ? 'open' : 'closed'),\n 'data-scope': 'popover',\n 'data-part': 'trigger',\n onClick: tagSend(send, ['toggle'], () => send({ type: 'toggle' })),\n },\n positioner: {\n 'data-scope': 'popover',\n 'data-part': 'positioner',\n style: 'position:absolute;top:0;left:0;',\n },\n content: {\n role: 'dialog',\n id: contentId,\n 'aria-labelledby': titleId,\n tabIndex: -1,\n 'data-state': (s) => (get(s).open ? 'open' : 'closed'),\n 'data-scope': 'popover',\n 'data-part': 'content',\n },\n title: {\n id: titleId,\n 'data-scope': 'popover',\n 'data-part': 'title',\n },\n description: {\n id: descId,\n 'data-scope': 'popover',\n 'data-part': 'description',\n },\n arrow: {\n 'data-scope': 'popover',\n 'data-part': 'arrow',\n },\n closeTrigger: {\n type: 'button',\n 'aria-label': closeLabel,\n 'data-scope': 'popover',\n 'data-part': 'close-trigger',\n onClick: tagSend(send, ['close'], () => send({ type: 'close' })),\n },\n }\n}\n\nexport interface OverlayOptions<S> {\n get: (s: S) => PopoverState\n send: Send<PopoverMsg>\n parts: PopoverParts<S>\n content: () => Node[]\n /** Placement preference — bottom | top | right | left with -start/-end variants. */\n placement?: Placement\n /** Offset between trigger and content, px (default: 8). */\n offset?: number\n /** Auto-flip to opposite side (default: true). */\n flip?: boolean\n /** Shift to keep in viewport (default: true). */\n shift?: boolean\n /** Optional transition. */\n transition?: TransitionOptions\n /** Close on Escape (default: true). */\n closeOnEscape?: boolean\n /** Close on outside click (default: true). */\n closeOnOutsideClick?: boolean\n /** Trap focus inside popover while open (default: false — non-modal). */\n trapFocus?: boolean\n /** Restore focus to trigger on close (default: true). */\n restoreFocus?: boolean\n /** Portal target (default: 'body'). */\n target?: string | HTMLElement\n /** Arrow element selector within content (optional). */\n arrowSelector?: string\n}\n\nexport function overlay<S>(opts: OverlayOptions<S>): Node[] {\n const target = opts.target ?? 'body'\n const placement = opts.placement ?? 'bottom'\n const offset = opts.offset ?? 8\n const flip = opts.flip !== false\n const shift = opts.shift !== false\n const closeOnEscape = opts.closeOnEscape !== false\n const closeOnOutsideClick = opts.closeOnOutsideClick !== false\n const trapFocus = opts.trapFocus === true\n const restoreFocus = opts.restoreFocus !== false\n const parts = opts.parts\n const contentId = parts.content.id\n const triggerId = parts.trigger.id\n\n return show<S, PopoverMsg>({\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 triggerEl = document.getElementById(triggerId)\n if (!contentEl || !triggerEl) return\n\n const cleanups: Array<() => void> = []\n\n // Position content relative to trigger\n const positioner = contentEl.closest('[data-part=\"positioner\"]') as HTMLElement | null\n const floatingEl = positioner ?? contentEl\n const arrow = opts.arrowSelector\n ? (contentEl.querySelector(opts.arrowSelector) as HTMLElement | null)\n : null\n cleanups.push(\n attachFloating({\n anchor: triggerEl,\n floating: floatingEl,\n placement,\n offset,\n flip,\n shift,\n arrow: arrow ?? undefined,\n }),\n )\n\n if (trapFocus) {\n cleanups.push(\n pushFocusTrap({\n container: contentEl,\n restoreFocus,\n }),\n )\n }\n\n if (closeOnEscape || closeOnOutsideClick) {\n cleanups.push(\n pushDismissable({\n element: contentEl,\n ignore: () => [triggerEl],\n disableEscape: !closeOnEscape,\n disableOutside: !closeOnOutsideClick,\n onDismiss: () => {\n opts.send({ type: 'close' })\n if (restoreFocus) triggerEl.focus()\n },\n }),\n )\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 popover = { init, update, connect, overlay }\n"]}
@@ -24,15 +24,25 @@ export interface PresenceState {
24
24
  status: PresenceStatus;
25
25
  unmountOnExit: boolean;
26
26
  }
27
- export type PresenceMsg = {
27
+ export type PresenceMsg =
28
+ /** @intent("Begin opening the element (closed → opening, plays enter animation)") */
29
+ {
28
30
  type: 'open';
29
- } | {
31
+ }
32
+ /** @intent("Begin closing the element (open → closing, plays exit animation)") */
33
+ | {
30
34
  type: 'close';
31
- } | {
35
+ }
36
+ /** @intent("Toggle between open and closed states") */
37
+ | {
32
38
  type: 'toggle';
33
- } | {
39
+ }
40
+ /** @humanOnly */
41
+ | {
34
42
  type: 'animationEnd';
35
- } | {
43
+ }
44
+ /** @intent("Set the desired presence directly (true = open, false = closed)") */
45
+ | {
36
46
  type: 'setPresent';
37
47
  present: boolean;
38
48
  };
@@ -1 +1 @@
1
- {"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../../src/components/presence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAErC;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAA;AAEtE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,cAAc,CAAA;IACtB,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAA;AAE5C,MAAM,WAAW,YAAY;IAC3B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,8FAA8F;IAC9F,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,wBAAgB,IAAI,CAAC,IAAI,GAAE,YAAiB,GAAG,aAAa,CAK3D;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,WAAW,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,CAmBvF;AAED,0DAA0D;AAC1D,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAGvD;AAED,sEAAsE;AACtE,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAEvD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAEzD;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,IAAI,EAAE;QACJ,YAAY,EAAE,UAAU,CAAA;QACxB,WAAW,EAAE,MAAM,CAAA;QACnB,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,cAAc,CAAA;QACtC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;QACzB,cAAc,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,CAAA;QAC3C,eAAe,EAAE,CAAC,CAAC,EAAE,eAAe,KAAK,IAAI,CAAA;KAC9C,CAAA;CACF;AAED,wBAAgB,OAAO,CAAC,CAAC,EACvB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,aAAa,EAC5B,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,GACtB,aAAa,CAAC,CAAC,CAAC,CAYlB;AAED,eAAO,MAAM,QAAQ;;;;;;;CAA+D,CAAA"}
1
+ {"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../../src/components/presence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAErC;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAA;AAEtE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,cAAc,CAAA;IACtB,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,MAAM,WAAW;AACrB,qFAAqF;AACnF;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE;AAClB,kFAAkF;GAChF;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE;AACnB,uDAAuD;GACrD;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE;AACpB,iBAAiB;GACf;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE;AAC1B,iFAAiF;GAC/E;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAA;AAE5C,MAAM,WAAW,YAAY;IAC3B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,8FAA8F;IAC9F,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,wBAAgB,IAAI,CAAC,IAAI,GAAE,YAAiB,GAAG,aAAa,CAK3D;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,WAAW,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,CAmBvF;AAED,0DAA0D;AAC1D,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAGvD;AAED,sEAAsE;AACtE,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAEvD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAEzD;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,IAAI,EAAE;QACJ,YAAY,EAAE,UAAU,CAAA;QACxB,WAAW,EAAE,MAAM,CAAA;QACnB,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,cAAc,CAAA;QACtC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;QACzB,cAAc,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,CAAA;QAC3C,eAAe,EAAE,CAAC,CAAC,EAAE,eAAe,KAAK,IAAI,CAAA;KAC9C,CAAA;CACF;AAED,wBAAgB,OAAO,CAAC,CAAC,EACvB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,aAAa,EAC5B,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,GACtB,aAAa,CAAC,CAAC,CAAC,CAYlB;AAED,eAAO,MAAM,QAAQ;;;;;;;CAA+D,CAAA"}