@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
@@ -18,30 +18,48 @@ export interface AccordionState {
18
18
  /** Ordered list of item values (for keyboard navigation). */
19
19
  items: string[];
20
20
  }
21
- export type AccordionMsg = {
21
+ export type AccordionMsg =
22
+ /** @intent("Toggle the named accordion item open/closed") */
23
+ {
22
24
  type: 'toggle';
23
25
  value: string;
24
- } | {
26
+ }
27
+ /** @intent("Open the named accordion item") */
28
+ | {
25
29
  type: 'open';
26
30
  value: string;
27
- } | {
31
+ }
32
+ /** @intent("Close the named accordion item") */
33
+ | {
28
34
  type: 'close';
29
35
  value: string;
30
- } | {
36
+ }
37
+ /** @intent("Replace the set of currently-open items with the provided values") */
38
+ | {
31
39
  type: 'setValue';
32
40
  value: string[];
33
- } | {
41
+ }
42
+ /** @humanOnly */
43
+ | {
34
44
  type: 'setItems';
35
45
  items: string[];
36
- } | {
46
+ }
47
+ /** @humanOnly */
48
+ | {
37
49
  type: 'focusNext';
38
50
  value: string;
39
- } | {
51
+ }
52
+ /** @humanOnly */
53
+ | {
40
54
  type: 'focusPrev';
41
55
  value: string;
42
- } | {
56
+ }
57
+ /** @humanOnly */
58
+ | {
43
59
  type: 'focusFirst';
44
- } | {
60
+ }
61
+ /** @humanOnly */
62
+ | {
45
63
  type: 'focusLast';
46
64
  };
47
65
  export interface AccordionInit {
@@ -1 +1 @@
1
- {"version":3,"file":"accordion.d.ts","sourceRoot":"","sources":["../../src/components/accordion.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"accordion.d.ts","sourceRoot":"","sources":["../../src/components/accordion.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { tagSend } from '@llui/dom';
1
2
  export function init(opts = {}) {
2
3
  return {
3
4
  value: opts.value ?? [],
@@ -69,8 +70,8 @@ export function connect(get, send, opts) {
69
70
  'data-scope': 'accordion',
70
71
  'data-part': 'trigger',
71
72
  'data-value': value,
72
- onClick: () => send({ type: 'toggle', value }),
73
- onKeyDown: (e) => {
73
+ onClick: tagSend(send, ['toggle'], () => send({ type: 'toggle', value })),
74
+ onKeyDown: tagSend(send, ['focusNext', 'focusPrev', 'focusFirst', 'focusLast', 'toggle'], (e) => {
74
75
  switch (e.key) {
75
76
  case 'ArrowDown':
76
77
  e.preventDefault();
@@ -94,7 +95,7 @@ export function connect(get, send, opts) {
94
95
  send({ type: 'toggle', value });
95
96
  return;
96
97
  }
97
- },
98
+ }),
98
99
  },
99
100
  content: {
100
101
  role: 'region',
@@ -1 +1 @@
1
- {"version":3,"file":"accordion.js","sourceRoot":"","sources":["../../src/components/accordion.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\n\n/**\n * Accordion — a stack of expandable panels. Items are identified by a string\n * value. Either a single item is expandable at a time (default) or many\n * (`multiple: true`). `collapsible: false` prevents closing the only open\n * item in single mode.\n *\n * Items themselves are provided by the user's view (accordion is agnostic to\n * item data). The `connect()` API returns a `root` prop set and an `item(value)`\n * factory that produces `trigger` and `content` prop sets scoped to that item.\n */\n\nexport interface AccordionState {\n /** Values of currently-expanded items. */\n value: string[]\n multiple: boolean\n collapsible: boolean\n disabled: boolean\n /** Ordered list of item values (for keyboard navigation). */\n items: string[]\n}\n\nexport type AccordionMsg =\n | { type: 'toggle'; value: string }\n | { type: 'open'; value: string }\n | { type: 'close'; value: string }\n | { type: 'setValue'; value: string[] }\n | { type: 'setItems'; items: string[] }\n | { type: 'focusNext'; value: string }\n | { type: 'focusPrev'; value: string }\n | { type: 'focusFirst' }\n | { type: 'focusLast' }\n\nexport interface AccordionInit {\n value?: string[]\n multiple?: boolean\n collapsible?: boolean\n disabled?: boolean\n items?: string[]\n}\n\nexport function init(opts: AccordionInit = {}): AccordionState {\n return {\n value: opts.value ?? [],\n multiple: opts.multiple ?? false,\n collapsible: opts.collapsible ?? true,\n disabled: opts.disabled ?? false,\n items: opts.items ?? [],\n }\n}\n\nfunction toggleValue(state: AccordionState, value: string): string[] {\n const isOpen = state.value.includes(value)\n if (state.multiple) {\n return isOpen ? state.value.filter((v) => v !== value) : [...state.value, value]\n }\n // single mode\n if (isOpen) {\n return state.collapsible ? [] : state.value\n }\n return [value]\n}\n\nexport function update(state: AccordionState, msg: AccordionMsg): [AccordionState, never[]] {\n if (state.disabled) return [state, []]\n switch (msg.type) {\n case 'toggle':\n return [{ ...state, value: toggleValue(state, msg.value) }, []]\n case 'open':\n if (state.value.includes(msg.value)) return [state, []]\n return [{ ...state, value: state.multiple ? [...state.value, msg.value] : [msg.value] }, []]\n case 'close':\n if (!state.value.includes(msg.value)) return [state, []]\n if (!state.multiple && !state.collapsible) return [state, []]\n return [{ ...state, value: state.value.filter((v) => v !== msg.value) }, []]\n case 'setValue':\n return [{ ...state, value: msg.value }, []]\n case 'setItems':\n return [{ ...state, items: msg.items }, []]\n // Focus messages don't mutate state but are emitted so user handlers can respond.\n case 'focusNext':\n case 'focusPrev':\n case 'focusFirst':\n case 'focusLast':\n return [state, []]\n }\n}\n\nexport interface AccordionItemParts<S> {\n trigger: {\n type: 'button'\n 'aria-expanded': (s: S) => boolean\n 'aria-controls': string\n id: string\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-disabled': (s: S) => '' | undefined\n disabled: (s: S) => boolean\n 'data-scope': 'accordion'\n 'data-part': 'trigger'\n 'data-value': string\n onClick: (e: MouseEvent) => void\n onKeyDown: (e: KeyboardEvent) => void\n }\n content: {\n role: 'region'\n id: string\n 'aria-labelledby': string\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-scope': 'accordion'\n 'data-part': 'content'\n hidden: (s: S) => boolean\n }\n item: {\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-disabled': (s: S) => '' | undefined\n 'data-scope': 'accordion'\n 'data-part': 'item'\n 'data-value': string\n }\n}\n\nexport interface AccordionParts<S> {\n root: {\n role: 'region'\n 'data-scope': 'accordion'\n 'data-part': 'root'\n 'data-orientation': 'vertical'\n }\n item: (value: string) => AccordionItemParts<S>\n}\n\nexport interface ConnectOptions {\n /** Namespace prefix for part ids (for ARIA wiring). Should be unique per instance. */\n id: string\n}\n\nexport function connect<S>(\n get: (s: S) => AccordionState,\n send: Send<AccordionMsg>,\n opts: ConnectOptions,\n): AccordionParts<S> {\n const base = opts.id\n const triggerId = (v: string): string => `${base}:trigger:${v}`\n const contentId = (v: string): string => `${base}:content:${v}`\n\n return {\n root: {\n role: 'region',\n 'data-scope': 'accordion',\n 'data-part': 'root',\n 'data-orientation': 'vertical',\n },\n item: (value: string): AccordionItemParts<S> => ({\n trigger: {\n type: 'button',\n 'aria-expanded': (s) => get(s).value.includes(value),\n 'aria-controls': contentId(value),\n id: triggerId(value),\n 'data-state': (s) => (get(s).value.includes(value) ? 'open' : 'closed'),\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n disabled: (s) => get(s).disabled,\n 'data-scope': 'accordion',\n 'data-part': 'trigger',\n 'data-value': value,\n onClick: () => send({ type: 'toggle', value }),\n onKeyDown: (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n send({ type: 'focusNext', value })\n return\n case 'ArrowUp':\n e.preventDefault()\n send({ type: 'focusPrev', value })\n return\n case 'Home':\n e.preventDefault()\n send({ type: 'focusFirst' })\n return\n case 'End':\n e.preventDefault()\n send({ type: 'focusLast' })\n return\n case ' ':\n case 'Enter':\n e.preventDefault()\n send({ type: 'toggle', value })\n return\n }\n },\n },\n content: {\n role: 'region',\n id: contentId(value),\n 'aria-labelledby': triggerId(value),\n 'data-state': (s) => (get(s).value.includes(value) ? 'open' : 'closed'),\n 'data-scope': 'accordion',\n 'data-part': 'content',\n hidden: (s) => !get(s).value.includes(value),\n },\n item: {\n 'data-state': (s) => (get(s).value.includes(value) ? 'open' : 'closed'),\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n 'data-scope': 'accordion',\n 'data-part': 'item',\n 'data-value': value,\n },\n }),\n }\n}\n\n/**\n * Helper: compute the next/prev item value given a focus message + current state.\n * Users' view/onMount can use this to move DOM focus to the correct trigger.\n */\nexport function focusTarget(\n state: AccordionState,\n msg: Extract<AccordionMsg, { type: `focus${string}` }>,\n): string | null {\n const items = state.items\n if (items.length === 0) return null\n if (msg.type === 'focusFirst') return items[0]!\n if (msg.type === 'focusLast') return items[items.length - 1]!\n const idx = items.indexOf(msg.value)\n if (idx === -1) return null\n if (msg.type === 'focusNext') return items[(idx + 1) % items.length]!\n // focusPrev\n return items[(idx - 1 + items.length) % items.length]!\n}\n\nexport const accordion = { init, update, connect, focusTarget }\n"]}
1
+ {"version":3,"file":"accordion.js","sourceRoot":"","sources":["../../src/components/accordion.ts"],"names":[],"mappings":"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","sourcesContent":["import { tagSend } from '@llui/dom'\nimport type { Send } from '@llui/dom'\n\n/**\n * Accordion — a stack of expandable panels. Items are identified by a string\n * value. Either a single item is expandable at a time (default) or many\n * (`multiple: true`). `collapsible: false` prevents closing the only open\n * item in single mode.\n *\n * Items themselves are provided by the user's view (accordion is agnostic to\n * item data). The `connect()` API returns a `root` prop set and an `item(value)`\n * factory that produces `trigger` and `content` prop sets scoped to that item.\n */\n\nexport interface AccordionState {\n /** Values of currently-expanded items. */\n value: string[]\n multiple: boolean\n collapsible: boolean\n disabled: boolean\n /** Ordered list of item values (for keyboard navigation). */\n items: string[]\n}\n\nexport type AccordionMsg =\n /** @intent(\"Toggle the named accordion item open/closed\") */\n | { type: 'toggle'; value: string }\n /** @intent(\"Open the named accordion item\") */\n | { type: 'open'; value: string }\n /** @intent(\"Close the named accordion item\") */\n | { type: 'close'; value: string }\n /** @intent(\"Replace the set of currently-open items with the provided values\") */\n | { type: 'setValue'; value: string[] }\n /** @humanOnly */\n | { type: 'setItems'; items: string[] }\n /** @humanOnly */\n | { type: 'focusNext'; value: string }\n /** @humanOnly */\n | { type: 'focusPrev'; value: string }\n /** @humanOnly */\n | { type: 'focusFirst' }\n /** @humanOnly */\n | { type: 'focusLast' }\n\nexport interface AccordionInit {\n value?: string[]\n multiple?: boolean\n collapsible?: boolean\n disabled?: boolean\n items?: string[]\n}\n\nexport function init(opts: AccordionInit = {}): AccordionState {\n return {\n value: opts.value ?? [],\n multiple: opts.multiple ?? false,\n collapsible: opts.collapsible ?? true,\n disabled: opts.disabled ?? false,\n items: opts.items ?? [],\n }\n}\n\nfunction toggleValue(state: AccordionState, value: string): string[] {\n const isOpen = state.value.includes(value)\n if (state.multiple) {\n return isOpen ? state.value.filter((v) => v !== value) : [...state.value, value]\n }\n // single mode\n if (isOpen) {\n return state.collapsible ? [] : state.value\n }\n return [value]\n}\n\nexport function update(state: AccordionState, msg: AccordionMsg): [AccordionState, never[]] {\n if (state.disabled) return [state, []]\n switch (msg.type) {\n case 'toggle':\n return [{ ...state, value: toggleValue(state, msg.value) }, []]\n case 'open':\n if (state.value.includes(msg.value)) return [state, []]\n return [{ ...state, value: state.multiple ? [...state.value, msg.value] : [msg.value] }, []]\n case 'close':\n if (!state.value.includes(msg.value)) return [state, []]\n if (!state.multiple && !state.collapsible) return [state, []]\n return [{ ...state, value: state.value.filter((v) => v !== msg.value) }, []]\n case 'setValue':\n return [{ ...state, value: msg.value }, []]\n case 'setItems':\n return [{ ...state, items: msg.items }, []]\n // Focus messages don't mutate state but are emitted so user handlers can respond.\n case 'focusNext':\n case 'focusPrev':\n case 'focusFirst':\n case 'focusLast':\n return [state, []]\n }\n}\n\nexport interface AccordionItemParts<S> {\n trigger: {\n type: 'button'\n 'aria-expanded': (s: S) => boolean\n 'aria-controls': string\n id: string\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-disabled': (s: S) => '' | undefined\n disabled: (s: S) => boolean\n 'data-scope': 'accordion'\n 'data-part': 'trigger'\n 'data-value': string\n onClick: (e: MouseEvent) => void\n onKeyDown: (e: KeyboardEvent) => void\n }\n content: {\n role: 'region'\n id: string\n 'aria-labelledby': string\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-scope': 'accordion'\n 'data-part': 'content'\n hidden: (s: S) => boolean\n }\n item: {\n 'data-state': (s: S) => 'open' | 'closed'\n 'data-disabled': (s: S) => '' | undefined\n 'data-scope': 'accordion'\n 'data-part': 'item'\n 'data-value': string\n }\n}\n\nexport interface AccordionParts<S> {\n root: {\n role: 'region'\n 'data-scope': 'accordion'\n 'data-part': 'root'\n 'data-orientation': 'vertical'\n }\n item: (value: string) => AccordionItemParts<S>\n}\n\nexport interface ConnectOptions {\n /** Namespace prefix for part ids (for ARIA wiring). Should be unique per instance. */\n id: string\n}\n\nexport function connect<S>(\n get: (s: S) => AccordionState,\n send: Send<AccordionMsg>,\n opts: ConnectOptions,\n): AccordionParts<S> {\n const base = opts.id\n const triggerId = (v: string): string => `${base}:trigger:${v}`\n const contentId = (v: string): string => `${base}:content:${v}`\n\n return {\n root: {\n role: 'region',\n 'data-scope': 'accordion',\n 'data-part': 'root',\n 'data-orientation': 'vertical',\n },\n item: (value: string): AccordionItemParts<S> => ({\n trigger: {\n type: 'button',\n 'aria-expanded': (s) => get(s).value.includes(value),\n 'aria-controls': contentId(value),\n id: triggerId(value),\n 'data-state': (s) => (get(s).value.includes(value) ? 'open' : 'closed'),\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n disabled: (s) => get(s).disabled,\n 'data-scope': 'accordion',\n 'data-part': 'trigger',\n 'data-value': value,\n onClick: tagSend(send, ['toggle'], () => send({ type: 'toggle', value })),\n onKeyDown: tagSend(\n send,\n ['focusNext', 'focusPrev', 'focusFirst', 'focusLast', 'toggle'],\n (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n send({ type: 'focusNext', value })\n return\n case 'ArrowUp':\n e.preventDefault()\n send({ type: 'focusPrev', value })\n return\n case 'Home':\n e.preventDefault()\n send({ type: 'focusFirst' })\n return\n case 'End':\n e.preventDefault()\n send({ type: 'focusLast' })\n return\n case ' ':\n case 'Enter':\n e.preventDefault()\n send({ type: 'toggle', value })\n return\n }\n },\n ),\n },\n content: {\n role: 'region',\n id: contentId(value),\n 'aria-labelledby': triggerId(value),\n 'data-state': (s) => (get(s).value.includes(value) ? 'open' : 'closed'),\n 'data-scope': 'accordion',\n 'data-part': 'content',\n hidden: (s) => !get(s).value.includes(value),\n },\n item: {\n 'data-state': (s) => (get(s).value.includes(value) ? 'open' : 'closed'),\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n 'data-scope': 'accordion',\n 'data-part': 'item',\n 'data-value': value,\n },\n }),\n }\n}\n\n/**\n * Helper: compute the next/prev item value given a focus message + current state.\n * Users' view/onMount can use this to move DOM focus to the correct trigger.\n */\nexport function focusTarget(\n state: AccordionState,\n msg: Extract<AccordionMsg, { type: `focus${string}` }>,\n): string | null {\n const items = state.items\n if (items.length === 0) return null\n if (msg.type === 'focusFirst') return items[0]!\n if (msg.type === 'focusLast') return items[items.length - 1]!\n const idx = items.indexOf(msg.value)\n if (idx === -1) return null\n if (msg.type === 'focusNext') return items[(idx + 1) % items.length]!\n // focusPrev\n return items[(idx - 1 + items.length) % items.length]!\n}\n\nexport const accordion = { init, update, connect, focusTarget }\n"]}
@@ -20,19 +20,29 @@ export interface AngleSliderState {
20
20
  disabled: boolean;
21
21
  readOnly: boolean;
22
22
  }
23
- export type AngleSliderMsg = {
23
+ export type AngleSliderMsg =
24
+ /** @intent("Set the angle in degrees (clamped to min/max, snapped to step)") */
25
+ {
24
26
  type: 'setValue';
25
27
  value: number;
26
- } | {
28
+ }
29
+ /** @intent("Increase the angle by `steps` × step (default: 1 step)") */
30
+ | {
27
31
  type: 'increment';
28
32
  steps?: number;
29
- } | {
33
+ }
34
+ /** @intent("Decrease the angle by `steps` × step (default: 1 step)") */
35
+ | {
30
36
  type: 'decrement';
31
37
  steps?: number;
32
- } | {
38
+ }
39
+ /** @humanOnly */
40
+ | {
33
41
  type: 'setMin';
34
42
  min: number;
35
- } | {
43
+ }
44
+ /** @humanOnly */
45
+ | {
36
46
  type: 'setMax';
37
47
  max: number;
38
48
  };
@@ -1 +1 @@
1
- {"version":3,"file":"angle-slider.d.ts","sourceRoot":"","sources":["../../src/components/angle-slider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAGrC;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AAEnC,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAWD,wBAAgB,IAAI,CAAC,IAAI,GAAE,eAAoB,GAAG,gBAAgB,CAYjE;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAAE,cAAc,GAAG,CAAC,gBAAgB,EAAE,KAAK,EAAE,CAAC,CA0BhG;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAW1E;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAGzE;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ,CAAA;QACd,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;QACjC,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;QACjC,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;QACjC,gBAAgB,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;QAClC,kBAAkB,EAAE,YAAY,CAAA;QAChC,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;QAC7C,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;QAC7C,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;QAC1B,YAAY,EAAE,cAAc,CAAA;QAC5B,WAAW,EAAE,MAAM,CAAA;QACnB,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,SAAS,CAAA;QACzC,SAAS,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAA;KACtC,CAAA;IACD,OAAO,EAAE;QACP,YAAY,EAAE,cAAc,CAAA;QAC5B,WAAW,EAAE,SAAS,CAAA;KACvB,CAAA;IACD;;;;OAIG;IACH,KAAK,EAAE;QACL,YAAY,EAAE,cAAc,CAAA;QAC5B,WAAW,EAAE,OAAO,CAAA;QACpB,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;KAC/B,CAAA;IACD,SAAS,EAAE;QACT,YAAY,EAAE,cAAc,CAAA;QAC5B,WAAW,EAAE,YAAY,CAAA;KAC1B,CAAA;IACD,6CAA6C;IAC7C,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAA;QACd,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;QACvB,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,YAAY,EAAE,cAAc,CAAA;QAC5B,WAAW,EAAE,cAAc,CAAA;KAC5B,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,0DAA0D;IAC1D,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;CACnC;AAED,wBAAgB,OAAO,CAAC,CAAC,EACvB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,gBAAgB,EAC/B,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,EAC1B,IAAI,GAAE,cAAmB,GACxB,gBAAgB,CAAC,CAAC,CAAC,CAsErB;AAED,eAAO,MAAM,WAAW;;;;;;CAA4D,CAAA"}
1
+ {"version":3,"file":"angle-slider.d.ts","sourceRoot":"","sources":["../../src/components/angle-slider.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
  function clamp(v, min, max) {
3
4
  return Math.max(min, Math.min(max, v));
@@ -90,7 +91,7 @@ export function connect(get, send, opts = {}) {
90
91
  'data-scope': 'angle-slider',
91
92
  'data-part': 'root',
92
93
  'data-disabled': (s) => (get(s).disabled ? '' : undefined),
93
- onKeyDown: (e) => {
94
+ onKeyDown: tagSend(send, ['increment', 'decrement', 'setValue'], (e) => {
94
95
  const key = flipArrow(e.key, e.currentTarget);
95
96
  switch (key) {
96
97
  case 'ArrowRight':
@@ -120,7 +121,7 @@ export function connect(get, send, opts = {}) {
120
121
  send({ type: 'setValue', value: Infinity });
121
122
  return;
122
123
  }
123
- },
124
+ }),
124
125
  },
125
126
  control: {
126
127
  'data-scope': 'angle-slider',
@@ -1 +1 @@
1
- {"version":3,"file":"angle-slider.js","sourceRoot":"","sources":["../../src/components/angle-slider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAyCjD,SAAS,KAAK,CAAC,CAAS,EAAE,GAAW,EAAE,GAAW;IAChD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;AACxC,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,IAAY,EAAE,GAAW;IAC3D,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,KAAK,CAAA;IAC3B,OAAO,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;AACtD,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAwB,EAAE;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;IACzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,CAAA;IAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAA;IAC3B,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC;QAC/D,GAAG;QACH,GAAG;QACH,IAAI;QACJ,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK;QAChC,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK;KACjC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAuB,EAAE,GAAmB;IACjE,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACrC,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACpF,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACpB,CAAC;IACH,CAAC;IACD,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;YACpF,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACrC,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,CAAC,CAAA;YAC5B,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;YACvE,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACrC,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,CAAC,CAAA;YAC5B,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;YACvE,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACrC,CAAC;QACD,KAAK,QAAQ;YACX,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACxF,KAAK,QAAQ;YACX,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IAC1F,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,IAAa,EAAE,CAAS,EAAE,CAAS;IAChE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;IACrC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;IACrC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAA;IACjB,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAA;IACjB,wEAAwE;IACxE,kDAAkD;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IAC9B,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACpC,IAAI,GAAG,GAAG,CAAC;QAAE,GAAG,IAAI,GAAG,CAAA;IACvB,OAAO,GAAG,GAAG,GAAG,CAAA;AAClB,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAA;IAC7C,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAA;AAC/C,CAAC;AAqDD,MAAM,UAAU,OAAO,CACrB,GAA+B,EAC/B,IAA0B,EAC1B,OAAuB,EAAE;IAEzB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IAE/D,OAAO;QACL,IAAI,EAAE;YACJ,IAAI,EAAE,QAAQ;YACd,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG;YAClC,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG;YAClC,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK;YACpC,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAC1C,kBAAkB,EAAE,YAAY;YAChC,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9D,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9D,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,YAAY,EAAE,cAAc;YAC5B,WAAW,EAAE,MAAM;YACnB,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAC1D,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;gBACf,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,aAAwB,CAAC,CAAA;gBACxD,QAAQ,GAAG,EAAE,CAAC;oBACZ,KAAK,YAAY,CAAC;oBAClB,KAAK,SAAS;wBACZ,CAAC,CAAC,cAAc,EAAE,CAAA;wBAClB,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;wBAC3B,OAAM;oBACR,KAAK,WAAW,CAAC;oBACjB,KAAK,WAAW;wBACd,CAAC,CAAC,cAAc,EAAE,CAAA;wBAClB,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;wBAC3B,OAAM;oBACR,KAAK,QAAQ;wBACX,CAAC,CAAC,cAAc,EAAE,CAAA;wBAClB,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;wBACtC,OAAM;oBACR,KAAK,UAAU;wBACb,CAAC,CAAC,cAAc,EAAE,CAAA;wBAClB,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;wBACtC,OAAM;oBACR,KAAK,MAAM;wBACT,CAAC,CAAC,cAAc,EAAE,CAAA;wBAClB,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAA;wBAC5C,OAAM;oBACR,KAAK,KAAK;wBACR,CAAC,CAAC,cAAc,EAAE,CAAA;wBAClB,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;wBAC3C,OAAM;gBACV,CAAC;YACH,CAAC;SACF;QACD,OAAO,EAAE;YACP,YAAY,EAAE,cAAc;YAC5B,WAAW,EAAE,SAAS;SACvB;QACD,KAAK,EAAE;YACL,YAAY,EAAE,cAAc;YAC5B,WAAW,EAAE,OAAO;YACpB,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;SAC1C;QACD,SAAS,EAAE;YACT,YAAY,EAAE,cAAc;YAC5B,WAAW,EAAE,YAAY;SAC1B;QACD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAClC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,YAAY,EAAE,cAAc;YAC5B,WAAW,EAAE,cAAc;SAC5B;KACF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,CAAA","sourcesContent":["import type { Send } from '@llui/dom'\nimport { flipArrow } from '../utils/direction.js'\n\n/**\n * Angle slider — a circular input that selects a value in 0..360 degrees\n * by dragging a thumb around a control. The state machine tracks the\n * current angle; the view layer computes angles from pointer positions\n * (helpers exported for that purpose).\n *\n * Typical view wiring: on pointerdown/pointermove, read the control\n * element's bounding rect, compute the angle from `(pointerX, pointerY)`\n * to the rect center via `angleFromPoint()`, and dispatch `setValue`.\n *\n * Keyboard: Arrow keys adjust by `step`; Home/End jump to min/max;\n * PageUp/PageDown adjust by `step * 10`.\n */\n\nexport interface AngleSliderState {\n value: number\n min: number\n max: number\n step: number\n disabled: boolean\n readOnly: boolean\n}\n\nexport type AngleSliderMsg =\n | { type: 'setValue'; value: number }\n | { type: 'increment'; steps?: number }\n | { type: 'decrement'; steps?: number }\n | { type: 'setMin'; min: number }\n | { type: 'setMax'; max: number }\n\nexport interface AngleSliderInit {\n value?: number\n min?: number\n max?: number\n step?: number\n disabled?: boolean\n readOnly?: boolean\n}\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, v))\n}\n\nfunction roundToStep(value: number, step: number, min: number): number {\n if (step <= 0) return value\n return min + Math.round((value - min) / step) * step\n}\n\nexport function init(opts: AngleSliderInit = {}): AngleSliderState {\n const min = opts.min ?? 0\n const max = opts.max ?? 360\n const step = opts.step ?? 1\n return {\n value: clamp(roundToStep(opts.value ?? 0, step, min), min, max),\n min,\n max,\n step,\n disabled: opts.disabled ?? false,\n readOnly: opts.readOnly ?? false,\n }\n}\n\nexport function update(state: AngleSliderState, msg: AngleSliderMsg): [AngleSliderState, never[]] {\n if (state.disabled || state.readOnly) {\n if (msg.type === 'setValue' || msg.type === 'increment' || msg.type === 'decrement') {\n return [state, []]\n }\n }\n switch (msg.type) {\n case 'setValue': {\n const v = clamp(roundToStep(msg.value, state.step, state.min), state.min, state.max)\n return [{ ...state, value: v }, []]\n }\n case 'increment': {\n const steps = msg.steps ?? 1\n const v = clamp(state.value + state.step * steps, state.min, state.max)\n return [{ ...state, value: v }, []]\n }\n case 'decrement': {\n const steps = msg.steps ?? 1\n const v = clamp(state.value - state.step * steps, state.min, state.max)\n return [{ ...state, value: v }, []]\n }\n case 'setMin':\n return [{ ...state, min: msg.min, value: clamp(state.value, msg.min, state.max) }, []]\n case 'setMax':\n return [{ ...state, max: msg.max, value: clamp(state.value, state.min, msg.max) }, []]\n }\n}\n\n/**\n * Compute the angle in degrees from the center of a rect to a point.\n * 0° = up (12 o'clock), increases clockwise. Result is in 0..360.\n *\n * Useful inside a pointermove handler:\n * const rect = control.getBoundingClientRect()\n * const angle = angleFromPoint(rect, e.clientX, e.clientY)\n * send({ type: 'setValue', value: angle })\n */\nexport function angleFromPoint(rect: DOMRect, x: number, y: number): number {\n const cx = rect.left + rect.width / 2\n const cy = rect.top + rect.height / 2\n const dx = x - cx\n const dy = y - cy\n // atan2 gives 0° at east growing counter-clockwise; we want 0° at north\n // growing clockwise, so rotate by 90° and negate.\n const rad = Math.atan2(dy, dx)\n let deg = (rad * 180) / Math.PI + 90\n if (deg < 0) deg += 360\n return deg % 360\n}\n\n/** Convert an angle to (x, y) on a unit circle (radius 1 at origin). */\nexport function pointFromAngle(angleDeg: number): { x: number; y: number } {\n const rad = ((angleDeg - 90) * Math.PI) / 180\n return { x: Math.cos(rad), y: Math.sin(rad) }\n}\n\nexport interface AngleSliderParts<S> {\n root: {\n role: 'slider'\n 'aria-valuemin': (s: S) => number\n 'aria-valuemax': (s: S) => number\n 'aria-valuenow': (s: S) => number\n 'aria-valuetext': (s: S) => string\n 'aria-orientation': 'horizontal'\n 'aria-disabled': (s: S) => 'true' | undefined\n 'aria-readonly': (s: S) => 'true' | undefined\n tabIndex: (s: S) => number\n 'data-scope': 'angle-slider'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n onKeyDown: (e: KeyboardEvent) => void\n }\n control: {\n 'data-scope': 'angle-slider'\n 'data-part': 'control'\n }\n /**\n * The draggable thumb element. Its position is typically computed via\n * CSS custom properties `--angle` (0..360) that the consumer sets from\n * `state.value` using pointFromAngle() or a CSS `transform: rotate()`.\n */\n thumb: {\n 'data-scope': 'angle-slider'\n 'data-part': 'thumb'\n 'data-value': (s: S) => string\n }\n valueText: {\n 'data-scope': 'angle-slider'\n 'data-part': 'value-text'\n }\n /** A hidden input for form participation. */\n hiddenInput: {\n type: 'hidden'\n value: (s: S) => string\n name?: string\n 'data-scope': 'angle-slider'\n 'data-part': 'hidden-input'\n }\n}\n\nexport interface ConnectOptions {\n /** Name for the hidden input (form integration). */\n name?: string\n /** Formatter for aria-valuetext (default: \"{value}°\"). */\n format?: (value: number) => string\n}\n\nexport function connect<S>(\n get: (s: S) => AngleSliderState,\n send: Send<AngleSliderMsg>,\n opts: ConnectOptions = {},\n): AngleSliderParts<S> {\n const fmt = opts.format ?? ((v: number) => `${Math.round(v)}°`)\n\n return {\n root: {\n role: 'slider',\n 'aria-valuemin': (s) => get(s).min,\n 'aria-valuemax': (s) => get(s).max,\n 'aria-valuenow': (s) => get(s).value,\n 'aria-valuetext': (s) => fmt(get(s).value),\n 'aria-orientation': 'horizontal',\n 'aria-disabled': (s) => (get(s).disabled ? 'true' : undefined),\n 'aria-readonly': (s) => (get(s).readOnly ? 'true' : undefined),\n tabIndex: (s) => (get(s).disabled ? -1 : 0),\n 'data-scope': 'angle-slider',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n onKeyDown: (e) => {\n const key = flipArrow(e.key, e.currentTarget as Element)\n switch (key) {\n case 'ArrowRight':\n case 'ArrowUp':\n e.preventDefault()\n send({ type: 'increment' })\n return\n case 'ArrowLeft':\n case 'ArrowDown':\n e.preventDefault()\n send({ type: 'decrement' })\n return\n case 'PageUp':\n e.preventDefault()\n send({ type: 'increment', steps: 10 })\n return\n case 'PageDown':\n e.preventDefault()\n send({ type: 'decrement', steps: 10 })\n return\n case 'Home':\n e.preventDefault()\n send({ type: 'setValue', value: -Infinity })\n return\n case 'End':\n e.preventDefault()\n send({ type: 'setValue', value: Infinity })\n return\n }\n },\n },\n control: {\n 'data-scope': 'angle-slider',\n 'data-part': 'control',\n },\n thumb: {\n 'data-scope': 'angle-slider',\n 'data-part': 'thumb',\n 'data-value': (s) => String(get(s).value),\n },\n valueText: {\n 'data-scope': 'angle-slider',\n 'data-part': 'value-text',\n },\n hiddenInput: {\n type: 'hidden',\n value: (s) => String(get(s).value),\n ...(opts.name !== undefined ? { name: opts.name } : {}),\n 'data-scope': 'angle-slider',\n 'data-part': 'hidden-input',\n },\n }\n}\n\nexport const angleSlider = { init, update, connect, angleFromPoint, pointFromAngle }\n"]}
1
+ {"version":3,"file":"angle-slider.js","sourceRoot":"","sources":["../../src/components/angle-slider.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'\n\n/**\n * Angle slider — a circular input that selects a value in 0..360 degrees\n * by dragging a thumb around a control. The state machine tracks the\n * current angle; the view layer computes angles from pointer positions\n * (helpers exported for that purpose).\n *\n * Typical view wiring: on pointerdown/pointermove, read the control\n * element's bounding rect, compute the angle from `(pointerX, pointerY)`\n * to the rect center via `angleFromPoint()`, and dispatch `setValue`.\n *\n * Keyboard: Arrow keys adjust by `step`; Home/End jump to min/max;\n * PageUp/PageDown adjust by `step * 10`.\n */\n\nexport interface AngleSliderState {\n value: number\n min: number\n max: number\n step: number\n disabled: boolean\n readOnly: boolean\n}\n\nexport type AngleSliderMsg =\n /** @intent(\"Set the angle in degrees (clamped to min/max, snapped to step)\") */\n | { type: 'setValue'; value: number }\n /** @intent(\"Increase the angle by `steps` × step (default: 1 step)\") */\n | { type: 'increment'; steps?: number }\n /** @intent(\"Decrease the angle by `steps` × step (default: 1 step)\") */\n | { type: 'decrement'; steps?: number }\n /** @humanOnly */\n | { type: 'setMin'; min: number }\n /** @humanOnly */\n | { type: 'setMax'; max: number }\n\nexport interface AngleSliderInit {\n value?: number\n min?: number\n max?: number\n step?: number\n disabled?: boolean\n readOnly?: boolean\n}\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, v))\n}\n\nfunction roundToStep(value: number, step: number, min: number): number {\n if (step <= 0) return value\n return min + Math.round((value - min) / step) * step\n}\n\nexport function init(opts: AngleSliderInit = {}): AngleSliderState {\n const min = opts.min ?? 0\n const max = opts.max ?? 360\n const step = opts.step ?? 1\n return {\n value: clamp(roundToStep(opts.value ?? 0, step, min), min, max),\n min,\n max,\n step,\n disabled: opts.disabled ?? false,\n readOnly: opts.readOnly ?? false,\n }\n}\n\nexport function update(state: AngleSliderState, msg: AngleSliderMsg): [AngleSliderState, never[]] {\n if (state.disabled || state.readOnly) {\n if (msg.type === 'setValue' || msg.type === 'increment' || msg.type === 'decrement') {\n return [state, []]\n }\n }\n switch (msg.type) {\n case 'setValue': {\n const v = clamp(roundToStep(msg.value, state.step, state.min), state.min, state.max)\n return [{ ...state, value: v }, []]\n }\n case 'increment': {\n const steps = msg.steps ?? 1\n const v = clamp(state.value + state.step * steps, state.min, state.max)\n return [{ ...state, value: v }, []]\n }\n case 'decrement': {\n const steps = msg.steps ?? 1\n const v = clamp(state.value - state.step * steps, state.min, state.max)\n return [{ ...state, value: v }, []]\n }\n case 'setMin':\n return [{ ...state, min: msg.min, value: clamp(state.value, msg.min, state.max) }, []]\n case 'setMax':\n return [{ ...state, max: msg.max, value: clamp(state.value, state.min, msg.max) }, []]\n }\n}\n\n/**\n * Compute the angle in degrees from the center of a rect to a point.\n * 0° = up (12 o'clock), increases clockwise. Result is in 0..360.\n *\n * Useful inside a pointermove handler:\n * const rect = control.getBoundingClientRect()\n * const angle = angleFromPoint(rect, e.clientX, e.clientY)\n * send({ type: 'setValue', value: angle })\n */\nexport function angleFromPoint(rect: DOMRect, x: number, y: number): number {\n const cx = rect.left + rect.width / 2\n const cy = rect.top + rect.height / 2\n const dx = x - cx\n const dy = y - cy\n // atan2 gives 0° at east growing counter-clockwise; we want 0° at north\n // growing clockwise, so rotate by 90° and negate.\n const rad = Math.atan2(dy, dx)\n let deg = (rad * 180) / Math.PI + 90\n if (deg < 0) deg += 360\n return deg % 360\n}\n\n/** Convert an angle to (x, y) on a unit circle (radius 1 at origin). */\nexport function pointFromAngle(angleDeg: number): { x: number; y: number } {\n const rad = ((angleDeg - 90) * Math.PI) / 180\n return { x: Math.cos(rad), y: Math.sin(rad) }\n}\n\nexport interface AngleSliderParts<S> {\n root: {\n role: 'slider'\n 'aria-valuemin': (s: S) => number\n 'aria-valuemax': (s: S) => number\n 'aria-valuenow': (s: S) => number\n 'aria-valuetext': (s: S) => string\n 'aria-orientation': 'horizontal'\n 'aria-disabled': (s: S) => 'true' | undefined\n 'aria-readonly': (s: S) => 'true' | undefined\n tabIndex: (s: S) => number\n 'data-scope': 'angle-slider'\n 'data-part': 'root'\n 'data-disabled': (s: S) => '' | undefined\n onKeyDown: (e: KeyboardEvent) => void\n }\n control: {\n 'data-scope': 'angle-slider'\n 'data-part': 'control'\n }\n /**\n * The draggable thumb element. Its position is typically computed via\n * CSS custom properties `--angle` (0..360) that the consumer sets from\n * `state.value` using pointFromAngle() or a CSS `transform: rotate()`.\n */\n thumb: {\n 'data-scope': 'angle-slider'\n 'data-part': 'thumb'\n 'data-value': (s: S) => string\n }\n valueText: {\n 'data-scope': 'angle-slider'\n 'data-part': 'value-text'\n }\n /** A hidden input for form participation. */\n hiddenInput: {\n type: 'hidden'\n value: (s: S) => string\n name?: string\n 'data-scope': 'angle-slider'\n 'data-part': 'hidden-input'\n }\n}\n\nexport interface ConnectOptions {\n /** Name for the hidden input (form integration). */\n name?: string\n /** Formatter for aria-valuetext (default: \"{value}°\"). */\n format?: (value: number) => string\n}\n\nexport function connect<S>(\n get: (s: S) => AngleSliderState,\n send: Send<AngleSliderMsg>,\n opts: ConnectOptions = {},\n): AngleSliderParts<S> {\n const fmt = opts.format ?? ((v: number) => `${Math.round(v)}°`)\n\n return {\n root: {\n role: 'slider',\n 'aria-valuemin': (s) => get(s).min,\n 'aria-valuemax': (s) => get(s).max,\n 'aria-valuenow': (s) => get(s).value,\n 'aria-valuetext': (s) => fmt(get(s).value),\n 'aria-orientation': 'horizontal',\n 'aria-disabled': (s) => (get(s).disabled ? 'true' : undefined),\n 'aria-readonly': (s) => (get(s).readOnly ? 'true' : undefined),\n tabIndex: (s) => (get(s).disabled ? -1 : 0),\n 'data-scope': 'angle-slider',\n 'data-part': 'root',\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n onKeyDown: tagSend(send, ['increment', 'decrement', 'setValue'], (e) => {\n const key = flipArrow(e.key, e.currentTarget as Element)\n switch (key) {\n case 'ArrowRight':\n case 'ArrowUp':\n e.preventDefault()\n send({ type: 'increment' })\n return\n case 'ArrowLeft':\n case 'ArrowDown':\n e.preventDefault()\n send({ type: 'decrement' })\n return\n case 'PageUp':\n e.preventDefault()\n send({ type: 'increment', steps: 10 })\n return\n case 'PageDown':\n e.preventDefault()\n send({ type: 'decrement', steps: 10 })\n return\n case 'Home':\n e.preventDefault()\n send({ type: 'setValue', value: -Infinity })\n return\n case 'End':\n e.preventDefault()\n send({ type: 'setValue', value: Infinity })\n return\n }\n }),\n },\n control: {\n 'data-scope': 'angle-slider',\n 'data-part': 'control',\n },\n thumb: {\n 'data-scope': 'angle-slider',\n 'data-part': 'thumb',\n 'data-value': (s) => String(get(s).value),\n },\n valueText: {\n 'data-scope': 'angle-slider',\n 'data-part': 'value-text',\n },\n hiddenInput: {\n type: 'hidden',\n value: (s) => String(get(s).value),\n ...(opts.name !== undefined ? { name: opts.name } : {}),\n 'data-scope': 'angle-slider',\n 'data-part': 'hidden-input',\n },\n }\n}\n\nexport const angleSlider = { init, update, connect, angleFromPoint, pointFromAngle }\n"]}
@@ -25,22 +25,34 @@ export interface AsyncListState<T = unknown> {
25
25
  status: AsyncStatus;
26
26
  error: string | null;
27
27
  }
28
- export type AsyncListMsg<T = unknown> = {
28
+ export type AsyncListMsg<T = unknown> =
29
+ /** @intent("Request the next page of items") */
30
+ {
29
31
  type: 'loadMore';
30
- } | {
32
+ }
33
+ /** @humanOnly */
34
+ | {
31
35
  type: 'pageLoaded';
32
36
  items: T[];
33
37
  hasMore: boolean;
34
- } | {
38
+ }
39
+ /** @humanOnly */
40
+ | {
35
41
  type: 'pageFailed';
36
42
  error: string;
37
- } | {
43
+ }
44
+ /** @intent("Discard the loaded items and reset back to page 0") */
45
+ | {
38
46
  type: 'reset';
39
- } | {
47
+ }
48
+ /** @humanOnly */
49
+ | {
40
50
  type: 'setItems';
41
51
  items: T[];
42
52
  hasMore?: boolean;
43
- } | {
53
+ }
54
+ /** @intent("Retry the last failed page request") */
55
+ | {
44
56
  type: 'retry';
45
57
  };
46
58
  export interface AsyncListInit<T = unknown> {
@@ -1 +1 @@
1
- {"version":3,"file":"async-list.d.ts","sourceRoot":"","sources":["../../src/components/async-list.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"async-list.d.ts","sourceRoot":"","sources":["../../src/components/async-list.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { tagSend } from '@llui/dom';
1
2
  export function init(opts = {}) {
2
3
  return {
3
4
  items: opts.items ?? [],
@@ -72,14 +73,14 @@ export function connect(get, send) {
72
73
  },
73
74
  'data-scope': 'async-list',
74
75
  'data-part': 'load-more-trigger',
75
- onClick: () => send({ type: 'loadMore' }),
76
+ onClick: tagSend(send, ['loadMore'], () => send({ type: 'loadMore' })),
76
77
  },
77
78
  retryTrigger: {
78
79
  type: 'button',
79
80
  'data-scope': 'async-list',
80
81
  'data-part': 'retry-trigger',
81
82
  hidden: (s) => get(s).status !== 'error',
82
- onClick: () => send({ type: 'retry' }),
83
+ onClick: tagSend(send, ['retry'], () => send({ type: 'retry' })),
83
84
  },
84
85
  errorText: {
85
86
  role: 'alert',
@@ -1 +1 @@
1
- {"version":3,"file":"async-list.js","sourceRoot":"","sources":["../../src/components/async-list.ts"],"names":[],"mappings":"AA6CA,MAAM,UAAU,IAAI,CAAc,OAAyB,EAAE;IAC3D,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;QACpB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;QAC7B,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,IAAI;KACZ,CAAA;AACH,CAAC;AAED,MAAM,UAAU,MAAM,CACpB,KAAwB,EACxB,GAAoB;IAEpB,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,UAAU,CAAC;QAChB,KAAK,OAAO;YACV,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO;gBAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;YACpE,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;QAC3D,KAAK,YAAY;YACf,OAAO;gBACL;oBACE,GAAG,KAAK;oBACR,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;oBACrC,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC;oBACpB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE,IAAI;iBACZ;gBACD,EAAE;aACH,CAAA;QACH,KAAK,YAAY;YACf,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;QAC9D,KAAK,OAAO;YACV,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;QACjF,KAAK,UAAU;YACb,OAAO;gBACL;oBACE,GAAG,KAAK;oBACR,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO;oBACrC,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE,IAAI;iBACZ;gBACD,EAAE;aACH,CAAA;IACL,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAI,KAAwB;IACnD,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,CAAA;AACnC,CAAC;AAED,MAAM,UAAU,OAAO,CAAI,KAAwB;IACjD,OAAO,KAAK,CAAC,MAAM,KAAK,OAAO,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,OAAO,CAAI,KAAwB;IACjD,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAA;AACjC,CAAC;AAoCD,MAAM,UAAU,OAAO,CACrB,GAAgC,EAChC,IAA2B;IAE3B,OAAO;QACL,IAAI,EAAE;YACJ,YAAY,EAAE,YAAY;YAC1B,WAAW,EAAE,MAAM;YACnB,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM;SACpC;QACD,QAAQ,EAAE;YACR,YAAY,EAAE,YAAY;YAC1B,WAAW,EAAE,UAAU;YACvB,aAAa,EAAE,MAAM;SACtB;QACD,eAAe,EAAE;YACf,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gBACd,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;gBACjB,OAAO,EAAE,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,EAAE,CAAC,OAAO,CAAA;YAC/C,CAAC;YACD,YAAY,EAAE,YAAY;YAC1B,WAAW,EAAE,mBAAmB;YAChC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;SAC1C;QACD,YAAY,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,YAAY,EAAE,YAAY;YAC1B,WAAW,EAAE,eAAe;YAC5B,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO;YACxC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;SACvC;QACD,SAAS,EAAE;YACT,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,QAAQ;YACrB,YAAY,EAAE,YAAY;YAC1B,WAAW,EAAE,YAAY;YACzB,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO;SACzC;KACF,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,IAA2B,EAC3B,QAAiB,EACjB,aAAqB,OAAO;IAE5B,MAAM,EAAE,GAAG,IAAI,oBAAoB,CACjC,CAAC,OAAO,EAAE,EAAE;QACV,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;gBACrB,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA;gBAC1B,OAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC,EACD,EAAE,UAAU,EAAE,CACf,CAAA;IACD,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACpB,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,CAAA;AAC9B,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,IAAI;IACJ,MAAM;IACN,OAAO;IACP,SAAS;IACT,OAAO;IACP,OAAO;IACP,aAAa;CACd,CAAA","sourcesContent":["import type { Send } from '@llui/dom'\n\n/**\n * Async list — paginated/infinite-scroll list that accumulates pages.\n * The machine is generic over the item type; the consumer runs the\n * actual fetch in response to `loadMore` (via a custom handler or\n * effect) and dispatches `pageLoaded`/`pageFailed` when the request\n * completes.\n *\n * Typical flow in consumer's update handler:\n *\n * (state, msg) => {\n * if (msg.type === 'loadMore') {\n * fetch(`/api/items?page=${state.list.page + 1}`)\n * .then(r => r.json())\n * .then(items => send({type: 'pageLoaded', items, hasMore: items.length === PAGE_SIZE}))\n * .catch(e => send({type: 'pageFailed', error: String(e)}))\n * }\n * }\n */\n\nexport type AsyncStatus = 'idle' | 'loading' | 'loaded' | 'error'\n\nexport interface AsyncListState<T = unknown> {\n items: T[]\n page: number\n hasMore: boolean\n status: AsyncStatus\n error: string | null\n}\n\nexport type AsyncListMsg<T = unknown> =\n | { type: 'loadMore' }\n | { type: 'pageLoaded'; items: T[]; hasMore: boolean }\n | { type: 'pageFailed'; error: string }\n | { type: 'reset' }\n | { type: 'setItems'; items: T[]; hasMore?: boolean }\n | { type: 'retry' }\n\nexport interface AsyncListInit<T = unknown> {\n items?: T[]\n page?: number\n hasMore?: boolean\n}\n\nexport function init<T = unknown>(opts: AsyncListInit<T> = {}): AsyncListState<T> {\n return {\n items: opts.items ?? [],\n page: opts.page ?? 0,\n hasMore: opts.hasMore ?? true,\n status: 'idle',\n error: null,\n }\n}\n\nexport function update<T>(\n state: AsyncListState<T>,\n msg: AsyncListMsg<T>,\n): [AsyncListState<T>, never[]] {\n switch (msg.type) {\n case 'loadMore':\n case 'retry':\n if (state.status === 'loading' || !state.hasMore) return [state, []]\n return [{ ...state, status: 'loading', error: null }, []]\n case 'pageLoaded':\n return [\n {\n ...state,\n items: [...state.items, ...msg.items],\n page: state.page + 1,\n hasMore: msg.hasMore,\n status: 'loaded',\n error: null,\n },\n [],\n ]\n case 'pageFailed':\n return [{ ...state, status: 'error', error: msg.error }, []]\n case 'reset':\n return [{ items: [], page: 0, hasMore: true, status: 'idle', error: null }, []]\n case 'setItems':\n return [\n {\n ...state,\n items: msg.items,\n hasMore: msg.hasMore ?? state.hasMore,\n status: 'loaded',\n error: null,\n },\n [],\n ]\n }\n}\n\nexport function isLoading<T>(state: AsyncListState<T>): boolean {\n return state.status === 'loading'\n}\n\nexport function isError<T>(state: AsyncListState<T>): boolean {\n return state.status === 'error'\n}\n\nexport function isEmpty<T>(state: AsyncListState<T>): boolean {\n return state.items.length === 0\n}\n\nexport interface AsyncListParts<S, _T> {\n root: {\n 'data-scope': 'async-list'\n 'data-part': 'root'\n 'data-status': (s: S) => AsyncStatus\n }\n sentinel: {\n 'data-scope': 'async-list'\n 'data-part': 'sentinel'\n 'aria-hidden': 'true'\n }\n loadMoreTrigger: {\n type: 'button'\n disabled: (s: S) => boolean\n 'data-scope': 'async-list'\n 'data-part': 'load-more-trigger'\n onClick: (e: MouseEvent) => void\n }\n retryTrigger: {\n type: 'button'\n 'data-scope': 'async-list'\n 'data-part': 'retry-trigger'\n hidden: (s: S) => boolean\n onClick: (e: MouseEvent) => void\n }\n errorText: {\n role: 'alert'\n 'aria-live': 'polite'\n 'data-scope': 'async-list'\n 'data-part': 'error-text'\n hidden: (s: S) => boolean\n }\n}\n\nexport function connect<S, T>(\n get: (s: S) => AsyncListState<T>,\n send: Send<AsyncListMsg<T>>,\n): AsyncListParts<S, T> {\n return {\n root: {\n 'data-scope': 'async-list',\n 'data-part': 'root',\n 'data-status': (s) => get(s).status,\n },\n sentinel: {\n 'data-scope': 'async-list',\n 'data-part': 'sentinel',\n 'aria-hidden': 'true',\n },\n loadMoreTrigger: {\n type: 'button',\n disabled: (s) => {\n const st = get(s)\n return st.status === 'loading' || !st.hasMore\n },\n 'data-scope': 'async-list',\n 'data-part': 'load-more-trigger',\n onClick: () => send({ type: 'loadMore' }),\n },\n retryTrigger: {\n type: 'button',\n 'data-scope': 'async-list',\n 'data-part': 'retry-trigger',\n hidden: (s) => get(s).status !== 'error',\n onClick: () => send({ type: 'retry' }),\n },\n errorText: {\n role: 'alert',\n 'aria-live': 'polite',\n 'data-scope': 'async-list',\n 'data-part': 'error-text',\n hidden: (s) => get(s).status !== 'error',\n },\n }\n}\n\n/**\n * Install an IntersectionObserver on the sentinel element that auto-dispatches\n * `loadMore` whenever the sentinel scrolls into view. Call from onMount.\n */\nexport function watchSentinel<T>(\n send: Send<AsyncListMsg<T>>,\n sentinel: Element,\n rootMargin: string = '200px',\n): () => void {\n const io = new IntersectionObserver(\n (entries) => {\n for (const e of entries) {\n if (e.isIntersecting) {\n send({ type: 'loadMore' })\n return\n }\n }\n },\n { rootMargin },\n )\n io.observe(sentinel)\n return () => io.disconnect()\n}\n\nexport const asyncList = {\n init,\n update,\n connect,\n isLoading,\n isError,\n isEmpty,\n watchSentinel,\n}\n"]}
1
+ {"version":3,"file":"async-list.js","sourceRoot":"","sources":["../../src/components/async-list.ts"],"names":[],"mappings":"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","sourcesContent":["import { tagSend } from '@llui/dom'\nimport type { Send } from '@llui/dom'\n\n/**\n * Async list — paginated/infinite-scroll list that accumulates pages.\n * The machine is generic over the item type; the consumer runs the\n * actual fetch in response to `loadMore` (via a custom handler or\n * effect) and dispatches `pageLoaded`/`pageFailed` when the request\n * completes.\n *\n * Typical flow in consumer's update handler:\n *\n * (state, msg) => {\n * if (msg.type === 'loadMore') {\n * fetch(`/api/items?page=${state.list.page + 1}`)\n * .then(r => r.json())\n * .then(items => send({type: 'pageLoaded', items, hasMore: items.length === PAGE_SIZE}))\n * .catch(e => send({type: 'pageFailed', error: String(e)}))\n * }\n * }\n */\n\nexport type AsyncStatus = 'idle' | 'loading' | 'loaded' | 'error'\n\nexport interface AsyncListState<T = unknown> {\n items: T[]\n page: number\n hasMore: boolean\n status: AsyncStatus\n error: string | null\n}\n\nexport type AsyncListMsg<T = unknown> =\n /** @intent(\"Request the next page of items\") */\n | { type: 'loadMore' }\n /** @humanOnly */\n | { type: 'pageLoaded'; items: T[]; hasMore: boolean }\n /** @humanOnly */\n | { type: 'pageFailed'; error: string }\n /** @intent(\"Discard the loaded items and reset back to page 0\") */\n | { type: 'reset' }\n /** @humanOnly */\n | { type: 'setItems'; items: T[]; hasMore?: boolean }\n /** @intent(\"Retry the last failed page request\") */\n | { type: 'retry' }\n\nexport interface AsyncListInit<T = unknown> {\n items?: T[]\n page?: number\n hasMore?: boolean\n}\n\nexport function init<T = unknown>(opts: AsyncListInit<T> = {}): AsyncListState<T> {\n return {\n items: opts.items ?? [],\n page: opts.page ?? 0,\n hasMore: opts.hasMore ?? true,\n status: 'idle',\n error: null,\n }\n}\n\nexport function update<T>(\n state: AsyncListState<T>,\n msg: AsyncListMsg<T>,\n): [AsyncListState<T>, never[]] {\n switch (msg.type) {\n case 'loadMore':\n case 'retry':\n if (state.status === 'loading' || !state.hasMore) return [state, []]\n return [{ ...state, status: 'loading', error: null }, []]\n case 'pageLoaded':\n return [\n {\n ...state,\n items: [...state.items, ...msg.items],\n page: state.page + 1,\n hasMore: msg.hasMore,\n status: 'loaded',\n error: null,\n },\n [],\n ]\n case 'pageFailed':\n return [{ ...state, status: 'error', error: msg.error }, []]\n case 'reset':\n return [{ items: [], page: 0, hasMore: true, status: 'idle', error: null }, []]\n case 'setItems':\n return [\n {\n ...state,\n items: msg.items,\n hasMore: msg.hasMore ?? state.hasMore,\n status: 'loaded',\n error: null,\n },\n [],\n ]\n }\n}\n\nexport function isLoading<T>(state: AsyncListState<T>): boolean {\n return state.status === 'loading'\n}\n\nexport function isError<T>(state: AsyncListState<T>): boolean {\n return state.status === 'error'\n}\n\nexport function isEmpty<T>(state: AsyncListState<T>): boolean {\n return state.items.length === 0\n}\n\nexport interface AsyncListParts<S, _T> {\n root: {\n 'data-scope': 'async-list'\n 'data-part': 'root'\n 'data-status': (s: S) => AsyncStatus\n }\n sentinel: {\n 'data-scope': 'async-list'\n 'data-part': 'sentinel'\n 'aria-hidden': 'true'\n }\n loadMoreTrigger: {\n type: 'button'\n disabled: (s: S) => boolean\n 'data-scope': 'async-list'\n 'data-part': 'load-more-trigger'\n onClick: (e: MouseEvent) => void\n }\n retryTrigger: {\n type: 'button'\n 'data-scope': 'async-list'\n 'data-part': 'retry-trigger'\n hidden: (s: S) => boolean\n onClick: (e: MouseEvent) => void\n }\n errorText: {\n role: 'alert'\n 'aria-live': 'polite'\n 'data-scope': 'async-list'\n 'data-part': 'error-text'\n hidden: (s: S) => boolean\n }\n}\n\nexport function connect<S, T>(\n get: (s: S) => AsyncListState<T>,\n send: Send<AsyncListMsg<T>>,\n): AsyncListParts<S, T> {\n return {\n root: {\n 'data-scope': 'async-list',\n 'data-part': 'root',\n 'data-status': (s) => get(s).status,\n },\n sentinel: {\n 'data-scope': 'async-list',\n 'data-part': 'sentinel',\n 'aria-hidden': 'true',\n },\n loadMoreTrigger: {\n type: 'button',\n disabled: (s) => {\n const st = get(s)\n return st.status === 'loading' || !st.hasMore\n },\n 'data-scope': 'async-list',\n 'data-part': 'load-more-trigger',\n onClick: tagSend(send, ['loadMore'], () => send({ type: 'loadMore' })),\n },\n retryTrigger: {\n type: 'button',\n 'data-scope': 'async-list',\n 'data-part': 'retry-trigger',\n hidden: (s) => get(s).status !== 'error',\n onClick: tagSend(send, ['retry'], () => send({ type: 'retry' })),\n },\n errorText: {\n role: 'alert',\n 'aria-live': 'polite',\n 'data-scope': 'async-list',\n 'data-part': 'error-text',\n hidden: (s) => get(s).status !== 'error',\n },\n }\n}\n\n/**\n * Install an IntersectionObserver on the sentinel element that auto-dispatches\n * `loadMore` whenever the sentinel scrolls into view. Call from onMount.\n */\nexport function watchSentinel<T>(\n send: Send<AsyncListMsg<T>>,\n sentinel: Element,\n rootMargin: string = '200px',\n): () => void {\n const io = new IntersectionObserver(\n (entries) => {\n for (const e of entries) {\n if (e.isIntersecting) {\n send({ type: 'loadMore' })\n return\n }\n }\n },\n { rootMargin },\n )\n io.observe(sentinel)\n return () => io.disconnect()\n}\n\nexport const asyncList = {\n init,\n update,\n connect,\n isLoading,\n isError,\n isEmpty,\n watchSentinel,\n}\n"]}
@@ -8,13 +8,21 @@ export type ImageStatus = 'idle' | 'loading' | 'loaded' | 'error';
8
8
  export interface AvatarState {
9
9
  status: ImageStatus;
10
10
  }
11
- export type AvatarMsg = {
11
+ export type AvatarMsg =
12
+ /** @humanOnly */
13
+ {
12
14
  type: 'loadStart';
13
- } | {
15
+ }
16
+ /** @humanOnly */
17
+ | {
14
18
  type: 'loaded';
15
- } | {
19
+ }
20
+ /** @humanOnly */
21
+ | {
16
22
  type: 'error';
17
- } | {
23
+ }
24
+ /** @intent("Reset the avatar's load status back to idle") */
25
+ | {
18
26
  type: 'reset';
19
27
  };
20
28
  export interface AvatarInit {
@@ -1 +1 @@
1
- {"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../src/components/avatar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAErC;;;;GAIG;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAA;AAEjE,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,CAAA;CACpB;AAED,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAA;AAErB,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;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,IAAI,EAAE;QACJ,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,MAAM,CAAA;QACnB,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,WAAW,CAAA;KACrC,CAAA;IACD,KAAK,EAAE;QACL,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,OAAO,CAAA;QACpB,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,WAAW,CAAA;QACpC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;QACzB,GAAG,EAAE,MAAM,CAAA;QACX,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;QAC1B,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;QAC3B,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;KAChC,CAAA;IACD,QAAQ,EAAE;QACR,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,UAAU,CAAA;QACvB,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,WAAW,CAAA;QACpC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;QACzB,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;KAC5C,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,OAAO,CAAC,CAAC,EACvB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,WAAW,EAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EACrB,IAAI,GAAE,cAAmB,GACxB,WAAW,CAAC,CAAC,CAAC,CA0BhB;AAED,eAAO,MAAM,MAAM;;;;CAA4B,CAAA"}
1
+ {"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../src/components/avatar.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAErC;;;;GAIG;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAA;AAEjE,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,CAAA;CACpB;AAED,MAAM,MAAM,SAAS;AACnB,iBAAiB;AACf;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE;AACvB,iBAAiB;GACf;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE;AACpB,iBAAiB;GACf;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE;AACnB,6DAA6D;GAC3D;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAA;AAErB,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;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,IAAI,EAAE;QACJ,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,MAAM,CAAA;QACnB,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,WAAW,CAAA;KACrC,CAAA;IACD,KAAK,EAAE;QACL,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,OAAO,CAAA;QACpB,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,WAAW,CAAA;QACpC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;QACzB,GAAG,EAAE,MAAM,CAAA;QACX,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;QAC1B,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;QAC3B,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;KAChC,CAAA;IACD,QAAQ,EAAE;QACR,YAAY,EAAE,QAAQ,CAAA;QACtB,WAAW,EAAE,UAAU,CAAA;QACvB,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,WAAW,CAAA;QACpC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAA;QACzB,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;KAC5C,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,OAAO,CAAC,CAAC,EACvB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,WAAW,EAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EACrB,IAAI,GAAE,cAAmB,GACxB,WAAW,CAAC,CAAC,CAAC,CA0BhB;AAED,eAAO,MAAM,MAAM;;;;CAA4B,CAAA"}
@@ -1,3 +1,4 @@
1
+ import { tagSend } from '@llui/dom';
1
2
  export function init(opts = {}) {
2
3
  return { status: opts.status ?? 'idle' };
3
4
  }
@@ -27,9 +28,9 @@ export function connect(get, send, opts = {}) {
27
28
  'data-status': (s) => get(s).status,
28
29
  hidden: (s) => get(s).status !== 'loaded',
29
30
  alt,
30
- onLoad: () => send({ type: 'loaded' }),
31
- onError: () => send({ type: 'error' }),
32
- onLoadStart: () => send({ type: 'loadStart' }),
31
+ onLoad: tagSend(send, ['loaded'], () => send({ type: 'loaded' })),
32
+ onError: tagSend(send, ['error'], () => send({ type: 'error' })),
33
+ onLoadStart: tagSend(send, ['loadStart'], () => send({ type: 'loadStart' })),
33
34
  },
34
35
  fallback: {
35
36
  'data-scope': 'avatar',
@@ -1 +1 @@
1
- {"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../src/components/avatar.ts"],"names":[],"mappings":"AAwBA,MAAM,UAAU,IAAI,CAAC,OAAmB,EAAE;IACxC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,MAAM,EAAE,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAkB,EAAE,GAAc;IACvD,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,WAAW;YACd,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAA;QAC9C,KAAK,QAAQ;YACX,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAA;QAC7C,KAAK,OAAO;YACV,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;QAC5C,KAAK,OAAO;YACV,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;IAC7C,CAAC;AACH,CAAC;AA+BD,MAAM,UAAU,OAAO,CACrB,GAA0B,EAC1B,IAAqB,EACrB,OAAuB,EAAE;IAEzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAA;IAC1B,OAAO;QACL,IAAI,EAAE;YACJ,YAAY,EAAE,QAAQ;YACtB,WAAW,EAAE,MAAM;YACnB,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM;SACpC;QACD,KAAK,EAAE;YACL,YAAY,EAAE,QAAQ;YACtB,WAAW,EAAE,OAAO;YACpB,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM;YACnC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ;YACzC,GAAG;YACH,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YACtC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YACtC,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;SAC/C;QACD,QAAQ,EAAE;YACR,YAAY,EAAE,QAAQ;YACtB,WAAW,EAAE,UAAU;YACvB,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM;YACnC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ;YACzC,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;SACxE;KACF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA","sourcesContent":["import type { Send } from '@llui/dom'\n\n/**\n * Avatar — image with automatic fallback. Tracks image load status so\n * consumers can render the image, a fallback (initials, icon), or a\n * loading placeholder.\n */\n\nexport type ImageStatus = 'idle' | 'loading' | 'loaded' | 'error'\n\nexport interface AvatarState {\n status: ImageStatus\n}\n\nexport type AvatarMsg =\n | { type: 'loadStart' }\n | { type: 'loaded' }\n | { type: 'error' }\n | { type: 'reset' }\n\nexport interface AvatarInit {\n status?: ImageStatus\n}\n\nexport function init(opts: AvatarInit = {}): AvatarState {\n return { status: opts.status ?? 'idle' }\n}\n\nexport function update(state: AvatarState, msg: AvatarMsg): [AvatarState, never[]] {\n switch (msg.type) {\n case 'loadStart':\n return [{ ...state, status: 'loading' }, []]\n case 'loaded':\n return [{ ...state, status: 'loaded' }, []]\n case 'error':\n return [{ ...state, status: 'error' }, []]\n case 'reset':\n return [{ ...state, status: 'idle' }, []]\n }\n}\n\nexport interface AvatarParts<S> {\n root: {\n 'data-scope': 'avatar'\n 'data-part': 'root'\n 'data-status': (s: S) => ImageStatus\n }\n image: {\n 'data-scope': 'avatar'\n 'data-part': 'image'\n 'data-status': (s: S) => ImageStatus\n hidden: (s: S) => boolean\n alt: string\n onLoad: (e: Event) => void\n onError: (e: Event) => void\n onLoadStart: (e: Event) => void\n }\n fallback: {\n 'data-scope': 'avatar'\n 'data-part': 'fallback'\n 'data-status': (s: S) => ImageStatus\n hidden: (s: S) => boolean\n 'aria-hidden': (s: S) => 'true' | undefined\n }\n}\n\nexport interface ConnectOptions {\n alt?: string\n}\n\nexport function connect<S>(\n get: (s: S) => AvatarState,\n send: Send<AvatarMsg>,\n opts: ConnectOptions = {},\n): AvatarParts<S> {\n const alt = opts.alt ?? ''\n return {\n root: {\n 'data-scope': 'avatar',\n 'data-part': 'root',\n 'data-status': (s) => get(s).status,\n },\n image: {\n 'data-scope': 'avatar',\n 'data-part': 'image',\n 'data-status': (s) => get(s).status,\n hidden: (s) => get(s).status !== 'loaded',\n alt,\n onLoad: () => send({ type: 'loaded' }),\n onError: () => send({ type: 'error' }),\n onLoadStart: () => send({ type: 'loadStart' }),\n },\n fallback: {\n 'data-scope': 'avatar',\n 'data-part': 'fallback',\n 'data-status': (s) => get(s).status,\n hidden: (s) => get(s).status === 'loaded',\n 'aria-hidden': (s) => (get(s).status === 'loaded' ? 'true' : undefined),\n },\n }\n}\n\nexport const avatar = { init, update, connect }\n"]}
1
+ {"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../src/components/avatar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA6BnC,MAAM,UAAU,IAAI,CAAC,OAAmB,EAAE;IACxC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,MAAM,EAAE,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAkB,EAAE,GAAc;IACvD,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,WAAW;YACd,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAA;QAC9C,KAAK,QAAQ;YACX,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAA;QAC7C,KAAK,OAAO;YACV,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;QAC5C,KAAK,OAAO;YACV,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;IAC7C,CAAC;AACH,CAAC;AA+BD,MAAM,UAAU,OAAO,CACrB,GAA0B,EAC1B,IAAqB,EACrB,OAAuB,EAAE;IAEzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAA;IAC1B,OAAO;QACL,IAAI,EAAE;YACJ,YAAY,EAAE,QAAQ;YACtB,WAAW,EAAE,MAAM;YACnB,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM;SACpC;QACD,KAAK,EAAE;YACL,YAAY,EAAE,QAAQ;YACtB,WAAW,EAAE,OAAO;YACpB,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM;YACnC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ;YACzC,GAAG;YACH,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YACjE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAChE,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;SAC7E;QACD,QAAQ,EAAE;YACR,YAAY,EAAE,QAAQ;YACtB,WAAW,EAAE,UAAU;YACvB,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM;YACnC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ;YACzC,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;SACxE;KACF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA","sourcesContent":["import { tagSend } from '@llui/dom'\nimport type { Send } from '@llui/dom'\n\n/**\n * Avatar — image with automatic fallback. Tracks image load status so\n * consumers can render the image, a fallback (initials, icon), or a\n * loading placeholder.\n */\n\nexport type ImageStatus = 'idle' | 'loading' | 'loaded' | 'error'\n\nexport interface AvatarState {\n status: ImageStatus\n}\n\nexport type AvatarMsg =\n /** @humanOnly */\n | { type: 'loadStart' }\n /** @humanOnly */\n | { type: 'loaded' }\n /** @humanOnly */\n | { type: 'error' }\n /** @intent(\"Reset the avatar's load status back to idle\") */\n | { type: 'reset' }\n\nexport interface AvatarInit {\n status?: ImageStatus\n}\n\nexport function init(opts: AvatarInit = {}): AvatarState {\n return { status: opts.status ?? 'idle' }\n}\n\nexport function update(state: AvatarState, msg: AvatarMsg): [AvatarState, never[]] {\n switch (msg.type) {\n case 'loadStart':\n return [{ ...state, status: 'loading' }, []]\n case 'loaded':\n return [{ ...state, status: 'loaded' }, []]\n case 'error':\n return [{ ...state, status: 'error' }, []]\n case 'reset':\n return [{ ...state, status: 'idle' }, []]\n }\n}\n\nexport interface AvatarParts<S> {\n root: {\n 'data-scope': 'avatar'\n 'data-part': 'root'\n 'data-status': (s: S) => ImageStatus\n }\n image: {\n 'data-scope': 'avatar'\n 'data-part': 'image'\n 'data-status': (s: S) => ImageStatus\n hidden: (s: S) => boolean\n alt: string\n onLoad: (e: Event) => void\n onError: (e: Event) => void\n onLoadStart: (e: Event) => void\n }\n fallback: {\n 'data-scope': 'avatar'\n 'data-part': 'fallback'\n 'data-status': (s: S) => ImageStatus\n hidden: (s: S) => boolean\n 'aria-hidden': (s: S) => 'true' | undefined\n }\n}\n\nexport interface ConnectOptions {\n alt?: string\n}\n\nexport function connect<S>(\n get: (s: S) => AvatarState,\n send: Send<AvatarMsg>,\n opts: ConnectOptions = {},\n): AvatarParts<S> {\n const alt = opts.alt ?? ''\n return {\n root: {\n 'data-scope': 'avatar',\n 'data-part': 'root',\n 'data-status': (s) => get(s).status,\n },\n image: {\n 'data-scope': 'avatar',\n 'data-part': 'image',\n 'data-status': (s) => get(s).status,\n hidden: (s) => get(s).status !== 'loaded',\n alt,\n onLoad: tagSend(send, ['loaded'], () => send({ type: 'loaded' })),\n onError: tagSend(send, ['error'], () => send({ type: 'error' })),\n onLoadStart: tagSend(send, ['loadStart'], () => send({ type: 'loadStart' })),\n },\n fallback: {\n 'data-scope': 'avatar',\n 'data-part': 'fallback',\n 'data-status': (s) => get(s).status,\n hidden: (s) => get(s).status === 'loaded',\n 'aria-hidden': (s) => (get(s).status === 'loaded' ? 'true' : undefined),\n },\n }\n}\n\nexport const avatar = { init, update, connect }\n"]}
@@ -13,21 +13,35 @@ export interface CarouselState {
13
13
  /** Direction of the last transition — useful for entry animations. */
14
14
  direction: 'forward' | 'backward';
15
15
  }
16
- export type CarouselMsg = {
16
+ export type CarouselMsg =
17
+ /** @intent("Jump to a specific slide by zero-based index") */
18
+ {
17
19
  type: 'goTo';
18
20
  index: number;
19
- } | {
21
+ }
22
+ /** @intent("Advance to the next slide (wraps if loop is enabled)") */
23
+ | {
20
24
  type: 'next';
21
- } | {
25
+ }
26
+ /** @intent("Go back to the previous slide (wraps if loop is enabled)") */
27
+ | {
22
28
  type: 'prev';
23
- } | {
29
+ }
30
+ /** @humanOnly */
31
+ | {
24
32
  type: 'setCount';
25
33
  count: number;
26
- } | {
34
+ }
35
+ /** @intent("Pause autoplay (typically while user hovers or focuses the carousel)") */
36
+ | {
27
37
  type: 'pause';
28
- } | {
38
+ }
39
+ /** @intent("Resume autoplay after a pause") */
40
+ | {
29
41
  type: 'resume';
30
- } | {
42
+ }
43
+ /** @intent("Turn autoplay on or off") */
44
+ | {
31
45
  type: 'setAutoplay';
32
46
  autoplay: boolean;
33
47
  };
@@ -1 +1 @@
1
- {"version":3,"file":"carousel.d.ts","sourceRoot":"","sources":["../../src/components/carousel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"carousel.d.ts","sourceRoot":"","sources":["../../src/components/carousel.ts"],"names":[],"mappings":"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"}