@llui/components 0.4.10 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/dist/components/accordion.d.ts +13 -13
  2. package/dist/components/accordion.d.ts.map +1 -1
  3. package/dist/components/accordion.js +9 -9
  4. package/dist/components/accordion.js.map +1 -1
  5. package/dist/components/alert-dialog.d.ts +8 -8
  6. package/dist/components/alert-dialog.d.ts.map +1 -1
  7. package/dist/components/alert-dialog.js +2 -2
  8. package/dist/components/alert-dialog.js.map +1 -1
  9. package/dist/components/angle-slider.d.ts +13 -13
  10. package/dist/components/angle-slider.d.ts.map +1 -1
  11. package/dist/components/angle-slider.js +11 -11
  12. package/dist/components/angle-slider.js.map +1 -1
  13. package/dist/components/async-list.d.ts +7 -7
  14. package/dist/components/async-list.d.ts.map +1 -1
  15. package/dist/components/async-list.js +5 -8
  16. package/dist/components/async-list.js.map +1 -1
  17. package/dist/components/avatar.d.ts +9 -9
  18. package/dist/components/avatar.d.ts.map +1 -1
  19. package/dist/components/avatar.js +7 -7
  20. package/dist/components/avatar.js.map +1 -1
  21. package/dist/components/carousel.d.ts +18 -18
  22. package/dist/components/carousel.d.ts.map +1 -1
  23. package/dist/components/carousel.js +12 -12
  24. package/dist/components/carousel.js.map +1 -1
  25. package/dist/components/cascade-select.d.ts +12 -12
  26. package/dist/components/cascade-select.d.ts.map +1 -1
  27. package/dist/components/cascade-select.js +8 -8
  28. package/dist/components/cascade-select.js.map +1 -1
  29. package/dist/components/checkbox.d.ts +14 -14
  30. package/dist/components/checkbox.d.ts.map +1 -1
  31. package/dist/components/checkbox.js +12 -12
  32. package/dist/components/checkbox.js.map +1 -1
  33. package/dist/components/clipboard.d.ts +8 -8
  34. package/dist/components/clipboard.d.ts.map +1 -1
  35. package/dist/components/clipboard.js +6 -6
  36. package/dist/components/clipboard.js.map +1 -1
  37. package/dist/components/collapsible.d.ts +11 -11
  38. package/dist/components/collapsible.d.ts.map +1 -1
  39. package/dist/components/collapsible.js +9 -9
  40. package/dist/components/collapsible.js.map +1 -1
  41. package/dist/components/color-picker.d.ts +19 -19
  42. package/dist/components/color-picker.d.ts.map +1 -1
  43. package/dist/components/color-picker.js +21 -21
  44. package/dist/components/color-picker.js.map +1 -1
  45. package/dist/components/combobox.d.ts +25 -25
  46. package/dist/components/combobox.d.ts.map +1 -1
  47. package/dist/components/combobox.js +54 -59
  48. package/dist/components/combobox.js.map +1 -1
  49. package/dist/components/context-menu.d.ts +14 -14
  50. package/dist/components/context-menu.d.ts.map +1 -1
  51. package/dist/components/context-menu.js +15 -19
  52. package/dist/components/context-menu.js.map +1 -1
  53. package/dist/components/date-input.d.ts +13 -13
  54. package/dist/components/date-input.d.ts.map +1 -1
  55. package/dist/components/date-input.js +11 -11
  56. package/dist/components/date-input.js.map +1 -1
  57. package/dist/components/date-picker.d.ts +11 -11
  58. package/dist/components/date-picker.d.ts.map +1 -1
  59. package/dist/components/date-picker.js +7 -7
  60. package/dist/components/date-picker.js.map +1 -1
  61. package/dist/components/dialog.d.ts +15 -15
  62. package/dist/components/dialog.d.ts.map +1 -1
  63. package/dist/components/dialog.js +45 -50
  64. package/dist/components/dialog.js.map +1 -1
  65. package/dist/components/drawer.d.ts +13 -13
  66. package/dist/components/drawer.d.ts.map +1 -1
  67. package/dist/components/drawer.js +44 -49
  68. package/dist/components/drawer.js.map +1 -1
  69. package/dist/components/editable.d.ts +11 -11
  70. package/dist/components/editable.d.ts.map +1 -1
  71. package/dist/components/editable.js +9 -9
  72. package/dist/components/editable.js.map +1 -1
  73. package/dist/components/file-upload.d.ts +19 -19
  74. package/dist/components/file-upload.d.ts.map +1 -1
  75. package/dist/components/file-upload.js +14 -14
  76. package/dist/components/file-upload.js.map +1 -1
  77. package/dist/components/floating-panel.d.ts +14 -14
  78. package/dist/components/floating-panel.d.ts.map +1 -1
  79. package/dist/components/floating-panel.js +13 -14
  80. package/dist/components/floating-panel.js.map +1 -1
  81. package/dist/components/form.d.ts +9 -9
  82. package/dist/components/form.d.ts.map +1 -1
  83. package/dist/components/form.js +7 -7
  84. package/dist/components/form.js.map +1 -1
  85. package/dist/components/hover-card.d.ts +9 -9
  86. package/dist/components/hover-card.d.ts.map +1 -1
  87. package/dist/components/hover-card.js +12 -13
  88. package/dist/components/hover-card.js.map +1 -1
  89. package/dist/components/image-cropper.d.ts +8 -8
  90. package/dist/components/image-cropper.d.ts.map +1 -1
  91. package/dist/components/image-cropper.js +7 -8
  92. package/dist/components/image-cropper.js.map +1 -1
  93. package/dist/components/in-view.d.ts +6 -6
  94. package/dist/components/in-view.d.ts.map +1 -1
  95. package/dist/components/in-view.js +2 -2
  96. package/dist/components/in-view.js.map +1 -1
  97. package/dist/components/listbox.d.ts +16 -16
  98. package/dist/components/listbox.d.ts.map +1 -1
  99. package/dist/components/listbox.js +16 -16
  100. package/dist/components/listbox.js.map +1 -1
  101. package/dist/components/marquee.d.ts +8 -8
  102. package/dist/components/marquee.d.ts.map +1 -1
  103. package/dist/components/marquee.js +8 -11
  104. package/dist/components/marquee.js.map +1 -1
  105. package/dist/components/menu.d.ts +15 -15
  106. package/dist/components/menu.d.ts.map +1 -1
  107. package/dist/components/menu.js +16 -17
  108. package/dist/components/menu.js.map +1 -1
  109. package/dist/components/navigation-menu.d.ts +12 -12
  110. package/dist/components/navigation-menu.d.ts.map +1 -1
  111. package/dist/components/navigation-menu.js +8 -8
  112. package/dist/components/navigation-menu.js.map +1 -1
  113. package/dist/components/number-input.d.ts +18 -18
  114. package/dist/components/number-input.d.ts.map +1 -1
  115. package/dist/components/number-input.js +16 -20
  116. package/dist/components/number-input.js.map +1 -1
  117. package/dist/components/pagination.d.ts +13 -13
  118. package/dist/components/pagination.d.ts.map +1 -1
  119. package/dist/components/pagination.js +11 -17
  120. package/dist/components/pagination.js.map +1 -1
  121. package/dist/components/password-input.d.ts +11 -11
  122. package/dist/components/password-input.d.ts.map +1 -1
  123. package/dist/components/password-input.js +11 -11
  124. package/dist/components/password-input.js.map +1 -1
  125. package/dist/components/pin-input.d.ts +9 -9
  126. package/dist/components/pin-input.d.ts.map +1 -1
  127. package/dist/components/pin-input.js +9 -9
  128. package/dist/components/pin-input.js.map +1 -1
  129. package/dist/components/popover.d.ts +11 -11
  130. package/dist/components/popover.d.ts.map +1 -1
  131. package/dist/components/popover.js +61 -60
  132. package/dist/components/popover.js.map +1 -1
  133. package/dist/components/presence.d.ts +7 -5
  134. package/dist/components/presence.d.ts.map +1 -1
  135. package/dist/components/presence.js +5 -3
  136. package/dist/components/presence.js.map +1 -1
  137. package/dist/components/progress.d.ts +14 -14
  138. package/dist/components/progress.d.ts.map +1 -1
  139. package/dist/components/progress.js +12 -12
  140. package/dist/components/progress.js.map +1 -1
  141. package/dist/components/qr-code.d.ts +7 -7
  142. package/dist/components/qr-code.d.ts.map +1 -1
  143. package/dist/components/qr-code.js +7 -7
  144. package/dist/components/qr-code.js.map +1 -1
  145. package/dist/components/radio-group.d.ts +15 -15
  146. package/dist/components/radio-group.d.ts.map +1 -1
  147. package/dist/components/radio-group.js +12 -13
  148. package/dist/components/radio-group.js.map +1 -1
  149. package/dist/components/rating-group.d.ts +13 -13
  150. package/dist/components/rating-group.d.ts.map +1 -1
  151. package/dist/components/rating-group.js +10 -11
  152. package/dist/components/rating-group.js.map +1 -1
  153. package/dist/components/scroll-area.d.ts +10 -10
  154. package/dist/components/scroll-area.d.ts.map +1 -1
  155. package/dist/components/scroll-area.js +10 -15
  156. package/dist/components/scroll-area.js.map +1 -1
  157. package/dist/components/select.d.ts +26 -26
  158. package/dist/components/select.d.ts.map +1 -1
  159. package/dist/components/select.js +29 -33
  160. package/dist/components/select.js.map +1 -1
  161. package/dist/components/signature-pad.d.ts +12 -12
  162. package/dist/components/signature-pad.d.ts.map +1 -1
  163. package/dist/components/signature-pad.js +10 -10
  164. package/dist/components/signature-pad.js.map +1 -1
  165. package/dist/components/slider.d.ts +22 -22
  166. package/dist/components/slider.d.ts.map +1 -1
  167. package/dist/components/slider.js +17 -17
  168. package/dist/components/slider.js.map +1 -1
  169. package/dist/components/sortable.d.ts +11 -11
  170. package/dist/components/sortable.d.ts.map +1 -1
  171. package/dist/components/sortable.js +20 -20
  172. package/dist/components/sortable.js.map +1 -1
  173. package/dist/components/splitter.d.ts +15 -15
  174. package/dist/components/splitter.d.ts.map +1 -1
  175. package/dist/components/splitter.js +15 -15
  176. package/dist/components/splitter.js.map +1 -1
  177. package/dist/components/steps.d.ts +14 -14
  178. package/dist/components/steps.d.ts.map +1 -1
  179. package/dist/components/steps.js +10 -16
  180. package/dist/components/steps.js.map +1 -1
  181. package/dist/components/switch.d.ts +12 -12
  182. package/dist/components/switch.d.ts.map +1 -1
  183. package/dist/components/switch.js +10 -10
  184. package/dist/components/switch.js.map +1 -1
  185. package/dist/components/tabs.d.ts +15 -15
  186. package/dist/components/tabs.d.ts.map +1 -1
  187. package/dist/components/tabs.js +11 -11
  188. package/dist/components/tabs.js.map +1 -1
  189. package/dist/components/tags-input.d.ts +14 -14
  190. package/dist/components/tags-input.d.ts.map +1 -1
  191. package/dist/components/tags-input.js +10 -10
  192. package/dist/components/tags-input.js.map +1 -1
  193. package/dist/components/theme-switch.d.ts +5 -5
  194. package/dist/components/theme-switch.d.ts.map +1 -1
  195. package/dist/components/theme-switch.js +3 -3
  196. package/dist/components/theme-switch.js.map +1 -1
  197. package/dist/components/time-picker.d.ts +19 -19
  198. package/dist/components/time-picker.d.ts.map +1 -1
  199. package/dist/components/time-picker.js +17 -17
  200. package/dist/components/time-picker.js.map +1 -1
  201. package/dist/components/timer.d.ts +10 -10
  202. package/dist/components/timer.d.ts.map +1 -1
  203. package/dist/components/timer.js +8 -8
  204. package/dist/components/timer.js.map +1 -1
  205. package/dist/components/toast.d.ts +8 -8
  206. package/dist/components/toast.d.ts.map +1 -1
  207. package/dist/components/toast.js +4 -4
  208. package/dist/components/toast.js.map +1 -1
  209. package/dist/components/toc.d.ts +12 -12
  210. package/dist/components/toc.d.ts.map +1 -1
  211. package/dist/components/toc.js +8 -8
  212. package/dist/components/toc.js.map +1 -1
  213. package/dist/components/toggle-group.d.ts +13 -13
  214. package/dist/components/toggle-group.d.ts.map +1 -1
  215. package/dist/components/toggle-group.js +9 -9
  216. package/dist/components/toggle-group.js.map +1 -1
  217. package/dist/components/toggle.d.ts +8 -8
  218. package/dist/components/toggle.d.ts.map +1 -1
  219. package/dist/components/toggle.js +6 -6
  220. package/dist/components/toggle.js.map +1 -1
  221. package/dist/components/tooltip.d.ts +10 -10
  222. package/dist/components/tooltip.d.ts.map +1 -1
  223. package/dist/components/tooltip.js +13 -14
  224. package/dist/components/tooltip.js.map +1 -1
  225. package/dist/components/tour.d.ts +7 -7
  226. package/dist/components/tour.d.ts.map +1 -1
  227. package/dist/components/tour.js +5 -5
  228. package/dist/components/tour.js.map +1 -1
  229. package/dist/components/tree-view.d.ts +19 -19
  230. package/dist/components/tree-view.d.ts.map +1 -1
  231. package/dist/components/tree-view.js +23 -23
  232. package/dist/components/tree-view.js.map +1 -1
  233. package/dist/patterns/confirm-dialog.d.ts +4 -4
  234. package/dist/patterns/confirm-dialog.d.ts.map +1 -1
  235. package/dist/patterns/confirm-dialog.js +7 -9
  236. package/dist/patterns/confirm-dialog.js.map +1 -1
  237. package/package.json +3 -3
  238. package/dist/components/enter-view.d.ts +0 -73
  239. package/dist/components/enter-view.d.ts.map +0 -1
  240. package/dist/components/enter-view.js +0 -51
  241. package/dist/utils/validators.d.ts +0 -34
  242. package/dist/utils/validators.d.ts.map +0 -1
  243. package/dist/utils/validators.js +0 -83
@@ -1,4 +1,4 @@
1
- import type { Send } from '@llui/dom';
1
+ import type { Send, Signal } from '@llui/dom';
2
2
  /**
3
3
  * Accordion — a stack of expandable panels. Items are identified by a string
4
4
  * value. Either a single item is expandable at a time (default) or many
@@ -71,15 +71,15 @@ export interface AccordionInit {
71
71
  }
72
72
  export declare function init(opts?: AccordionInit): AccordionState;
73
73
  export declare function update(state: AccordionState, msg: AccordionMsg): [AccordionState, never[]];
74
- export interface AccordionItemParts<S> {
74
+ export interface AccordionItemParts {
75
75
  trigger: {
76
76
  type: 'button';
77
- 'aria-expanded': (s: S) => boolean;
77
+ 'aria-expanded': Signal<boolean>;
78
78
  'aria-controls': string;
79
79
  id: string;
80
- 'data-state': (s: S) => 'open' | 'closed';
81
- 'data-disabled': (s: S) => '' | undefined;
82
- disabled: (s: S) => boolean;
80
+ 'data-state': Signal<'open' | 'closed'>;
81
+ 'data-disabled': Signal<'' | undefined>;
82
+ disabled: Signal<boolean>;
83
83
  'data-scope': 'accordion';
84
84
  'data-part': 'trigger';
85
85
  'data-value': string;
@@ -90,33 +90,33 @@ export interface AccordionItemParts<S> {
90
90
  role: 'region';
91
91
  id: string;
92
92
  'aria-labelledby': string;
93
- 'data-state': (s: S) => 'open' | 'closed';
93
+ 'data-state': Signal<'open' | 'closed'>;
94
94
  'data-scope': 'accordion';
95
95
  'data-part': 'content';
96
- hidden: (s: S) => boolean;
96
+ hidden: Signal<boolean>;
97
97
  };
98
98
  item: {
99
- 'data-state': (s: S) => 'open' | 'closed';
100
- 'data-disabled': (s: S) => '' | undefined;
99
+ 'data-state': Signal<'open' | 'closed'>;
100
+ 'data-disabled': Signal<'' | undefined>;
101
101
  'data-scope': 'accordion';
102
102
  'data-part': 'item';
103
103
  'data-value': string;
104
104
  };
105
105
  }
106
- export interface AccordionParts<S> {
106
+ export interface AccordionParts {
107
107
  root: {
108
108
  role: 'region';
109
109
  'data-scope': 'accordion';
110
110
  'data-part': 'root';
111
111
  'data-orientation': 'vertical';
112
112
  };
113
- item: (value: string) => AccordionItemParts<S>;
113
+ item: (value: string) => AccordionItemParts;
114
114
  }
115
115
  export interface ConnectOptions {
116
116
  /** Namespace prefix for part ids (for ARIA wiring). Should be unique per instance. */
117
117
  id: string;
118
118
  }
119
- export declare function connect<S>(get: (s: S) => AccordionState, send: Send<AccordionMsg>, opts: ConnectOptions): AccordionParts<S>;
119
+ export declare function connect(state: Signal<AccordionState>, send: Send<AccordionMsg>, opts: ConnectOptions): AccordionParts;
120
120
  /**
121
121
  * Helper: compute the next/prev item value given a focus message + current state.
122
122
  * Users' view/onMount can use this to move DOM focus to the correct trigger.
@@ -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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"}
@@ -47,7 +47,7 @@ export function update(state, msg) {
47
47
  return [state, []];
48
48
  }
49
49
  }
50
- export function connect(get, send, opts) {
50
+ export function connect(state, send, opts) {
51
51
  const base = opts.id;
52
52
  const triggerId = (v) => `${base}:trigger:${v}`;
53
53
  const contentId = (v) => `${base}:content:${v}`;
@@ -61,12 +61,12 @@ export function connect(get, send, opts) {
61
61
  item: (value) => ({
62
62
  trigger: {
63
63
  type: 'button',
64
- 'aria-expanded': (s) => get(s).value.includes(value),
64
+ 'aria-expanded': state.map((st) => st.value.includes(value)),
65
65
  'aria-controls': contentId(value),
66
66
  id: triggerId(value),
67
- 'data-state': (s) => (get(s).value.includes(value) ? 'open' : 'closed'),
68
- 'data-disabled': (s) => (get(s).disabled ? '' : undefined),
69
- disabled: (s) => get(s).disabled,
67
+ 'data-state': state.map((st) => (st.value.includes(value) ? 'open' : 'closed')),
68
+ 'data-disabled': state.map((st) => (st.disabled ? '' : undefined)),
69
+ disabled: state.map((st) => st.disabled),
70
70
  'data-scope': 'accordion',
71
71
  'data-part': 'trigger',
72
72
  'data-value': value,
@@ -101,14 +101,14 @@ export function connect(get, send, opts) {
101
101
  role: 'region',
102
102
  id: contentId(value),
103
103
  'aria-labelledby': triggerId(value),
104
- 'data-state': (s) => (get(s).value.includes(value) ? 'open' : 'closed'),
104
+ 'data-state': state.map((st) => (st.value.includes(value) ? 'open' : 'closed')),
105
105
  'data-scope': 'accordion',
106
106
  'data-part': 'content',
107
- hidden: (s) => !get(s).value.includes(value),
107
+ hidden: state.map((st) => !st.value.includes(value)),
108
108
  },
109
109
  item: {
110
- 'data-state': (s) => (get(s).value.includes(value) ? 'open' : 'closed'),
111
- 'data-disabled': (s) => (get(s).disabled ? '' : undefined),
110
+ 'data-state': state.map((st) => (st.value.includes(value) ? 'open' : 'closed')),
111
+ 'data-disabled': state.map((st) => (st.disabled ? '' : undefined)),
112
112
  'data-scope': 'accordion',
113
113
  'data-part': 'item',
114
114
  'data-value': value,
@@ -1 +1 @@
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"]}
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, Signal } 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 {\n trigger: {\n type: 'button'\n 'aria-expanded': Signal<boolean>\n 'aria-controls': string\n id: string\n 'data-state': Signal<'open' | 'closed'>\n 'data-disabled': Signal<'' | undefined>\n disabled: Signal<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': Signal<'open' | 'closed'>\n 'data-scope': 'accordion'\n 'data-part': 'content'\n hidden: Signal<boolean>\n }\n item: {\n 'data-state': Signal<'open' | 'closed'>\n 'data-disabled': Signal<'' | undefined>\n 'data-scope': 'accordion'\n 'data-part': 'item'\n 'data-value': string\n }\n}\n\nexport interface AccordionParts {\n root: {\n role: 'region'\n 'data-scope': 'accordion'\n 'data-part': 'root'\n 'data-orientation': 'vertical'\n }\n item: (value: string) => AccordionItemParts\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(\n state: Signal<AccordionState>,\n send: Send<AccordionMsg>,\n opts: ConnectOptions,\n): AccordionParts {\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 => ({\n trigger: {\n type: 'button',\n 'aria-expanded': state.map((st) => st.value.includes(value)),\n 'aria-controls': contentId(value),\n id: triggerId(value),\n 'data-state': state.map((st) => (st.value.includes(value) ? 'open' : 'closed')),\n 'data-disabled': state.map((st) => (st.disabled ? '' : undefined)),\n disabled: state.map((st) => st.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': state.map((st) => (st.value.includes(value) ? 'open' : 'closed')),\n 'data-scope': 'accordion',\n 'data-part': 'content',\n hidden: state.map((st) => !st.value.includes(value)),\n },\n item: {\n 'data-state': state.map((st) => (st.value.includes(value) ? 'open' : 'closed')),\n 'data-disabled': state.map((st) => (st.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,4 +1,4 @@
1
- import type { Send, TransitionOptions } from '@llui/dom';
1
+ import type { Send, Signal, TransitionOptions } from '@llui/dom';
2
2
  import { init, update, type DialogState, type DialogMsg, type DialogParts, type ConnectOptions as DialogConnectOptions } from './dialog.js';
3
3
  /**
4
4
  * Alert dialog — a variant of dialog for destructive confirmations or
@@ -17,13 +17,13 @@ export interface AlertDialogConnectOptions extends Omit<DialogConnectOptions, 'r
17
17
  /** Accessible label for the confirm button (default: 'Confirm'). */
18
18
  confirmLabel?: string;
19
19
  }
20
- export type AlertDialogParts<S> = DialogParts<S>;
21
- export declare function connect<S>(get: (s: S) => DialogState, send: Send<DialogMsg>, opts: AlertDialogConnectOptions): AlertDialogParts<S>;
22
- export interface AlertDialogOverlayOptions<S> {
23
- get: (s: S) => DialogState;
20
+ export type AlertDialogParts = DialogParts;
21
+ export declare function connect(state: Signal<DialogState>, send: Send<DialogMsg>, opts: AlertDialogConnectOptions): AlertDialogParts;
22
+ export interface AlertDialogOverlayOptions {
23
+ state: Signal<DialogState>;
24
24
  send: Send<DialogMsg>;
25
- parts: AlertDialogParts<S>;
26
- content: () => Node[];
25
+ parts: AlertDialogParts;
26
+ content: () => readonly Node[];
27
27
  transition?: TransitionOptions;
28
28
  closeOnEscape?: boolean;
29
29
  /** Whether outside-click should dismiss (default: false for alert dialogs). */
@@ -35,7 +35,7 @@ export interface AlertDialogOverlayOptions<S> {
35
35
  initialFocus?: Element | (() => Element | null);
36
36
  restoreFocus?: boolean;
37
37
  }
38
- export declare function overlay<S>(opts: AlertDialogOverlayOptions<S>): Node[];
38
+ export declare function overlay(opts: AlertDialogOverlayOptions): Node;
39
39
  export declare const alertDialog: {
40
40
  init: typeof init;
41
41
  update: typeof update;
@@ -1 +1 @@
1
- {"version":3,"file":"alert-dialog.d.ts","sourceRoot":"","sources":["../../src/components/alert-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AACxD,OAAO,EACL,IAAI,EACJ,MAAM,EAGN,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,cAAc,IAAI,oBAAoB,EAC5C,MAAM,aAAa,CAAA;AAEpB;;;;;;;;GAQG;AAEH,YAAY,EAAE,WAAW,IAAI,gBAAgB,EAAE,SAAS,IAAI,cAAc,EAAE,CAAA;AAE5E,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AAEvB,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACnF,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAA;AAEhD,wBAAgB,OAAO,CAAC,CAAC,EACvB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,WAAW,EAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EACrB,IAAI,EAAE,yBAAyB,GAC9B,gBAAgB,CAAC,CAAC,CAAC,CAErB;AAED,MAAM,WAAW,yBAAyB,CAAC,CAAC;IAC1C,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,WAAW,CAAA;IAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;IACrB,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAA;IAC1B,OAAO,EAAE,MAAM,IAAI,EAAE,CAAA;IACrB,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,+EAA+E;IAC/E,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;IAC7B,YAAY,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAA;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAKrE;AAED,eAAO,MAAM,WAAW;;;;;CAAqC,CAAA"}
1
+ {"version":3,"file":"alert-dialog.d.ts","sourceRoot":"","sources":["../../src/components/alert-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAChE,OAAO,EACL,IAAI,EACJ,MAAM,EAGN,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,cAAc,IAAI,oBAAoB,EAC5C,MAAM,aAAa,CAAA;AAEpB;;;;;;;;GAQG;AAEH,YAAY,EAAE,WAAW,IAAI,gBAAgB,EAAE,SAAS,IAAI,cAAc,EAAE,CAAA;AAE5E,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AAEvB,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACnF,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAA;AAE1C,wBAAgB,OAAO,CACrB,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,EAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EACrB,IAAI,EAAE,yBAAyB,GAC9B,gBAAgB,CAElB;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;IAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;IACrB,KAAK,EAAE,gBAAgB,CAAA;IACvB,OAAO,EAAE,MAAM,SAAS,IAAI,EAAE,CAAA;IAC9B,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,+EAA+E;IAC/E,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;IAC7B,YAAY,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAA;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,yBAAyB,GAAG,IAAI,CAK7D;AAED,eAAO,MAAM,WAAW;;;;;CAAqC,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import { init, update, connect as dialogConnect, overlay as dialogOverlay, } from './dialog.js';
2
2
  export { init, update };
3
- export function connect(get, send, opts) {
4
- return dialogConnect(get, send, { ...opts, role: 'alertdialog' });
3
+ export function connect(state, send, opts) {
4
+ return dialogConnect(state, send, { ...opts, role: 'alertdialog' });
5
5
  }
6
6
  export function overlay(opts) {
7
7
  return dialogOverlay({
@@ -1 +1 @@
1
- {"version":3,"file":"alert-dialog.js","sourceRoot":"","sources":["../../src/components/alert-dialog.ts"],"names":[],"mappings":"AACA,OAAO,EACL,IAAI,EACJ,MAAM,EACN,OAAO,IAAI,aAAa,EACxB,OAAO,IAAI,aAAa,GAKzB,MAAM,aAAa,CAAA;AAcpB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AAWvB,MAAM,UAAU,OAAO,CACrB,GAA0B,EAC1B,IAAqB,EACrB,IAA+B;IAE/B,OAAO,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAA;AACnE,CAAC;AAmBD,MAAM,UAAU,OAAO,CAAI,IAAkC;IAC3D,OAAO,aAAa,CAAC;QACnB,GAAG,IAAI;QACP,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,IAAI,KAAK;KACvD,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAA","sourcesContent":["import type { Send, TransitionOptions } from '@llui/dom'\nimport {\n init,\n update,\n connect as dialogConnect,\n overlay as dialogOverlay,\n type DialogState,\n type DialogMsg,\n type DialogParts,\n type ConnectOptions as DialogConnectOptions,\n} from './dialog.js'\n\n/**\n * Alert dialog — a variant of dialog for destructive confirmations or\n * blocking messages. Uses `role=\"alertdialog\"` and defaults to:\n * - `closeOnOutsideClick: false` (user must choose an action explicitly)\n *\n * Shares state, messages, and part structure with `dialog`. Render a\n * `cancelTrigger` alongside the `closeTrigger` and let the application\n * dispatch a follow-up action after the dialog closes.\n */\n\nexport type { DialogState as AlertDialogState, DialogMsg as AlertDialogMsg }\n\nexport { init, update }\n\nexport interface AlertDialogConnectOptions extends Omit<DialogConnectOptions, 'role'> {\n /** Accessible label for the cancel button (default: 'Cancel'). */\n cancelLabel?: string\n /** Accessible label for the confirm button (default: 'Confirm'). */\n confirmLabel?: string\n}\n\nexport type AlertDialogParts<S> = DialogParts<S>\n\nexport function connect<S>(\n get: (s: S) => DialogState,\n send: Send<DialogMsg>,\n opts: AlertDialogConnectOptions,\n): AlertDialogParts<S> {\n return dialogConnect(get, send, { ...opts, role: 'alertdialog' })\n}\n\nexport interface AlertDialogOverlayOptions<S> {\n get: (s: S) => DialogState\n send: Send<DialogMsg>\n parts: AlertDialogParts<S>\n content: () => Node[]\n transition?: TransitionOptions\n closeOnEscape?: boolean\n /** Whether outside-click should dismiss (default: false for alert dialogs). */\n closeOnOutsideClick?: boolean\n trapFocus?: boolean\n lockScroll?: boolean\n hideSiblings?: boolean\n target?: string | HTMLElement\n initialFocus?: Element | (() => Element | null)\n restoreFocus?: boolean\n}\n\nexport function overlay<S>(opts: AlertDialogOverlayOptions<S>): Node[] {\n return dialogOverlay({\n ...opts,\n closeOnOutsideClick: opts.closeOnOutsideClick ?? false,\n })\n}\n\nexport const alertDialog = { init, update, connect, overlay }\n"]}
1
+ {"version":3,"file":"alert-dialog.js","sourceRoot":"","sources":["../../src/components/alert-dialog.ts"],"names":[],"mappings":"AACA,OAAO,EACL,IAAI,EACJ,MAAM,EACN,OAAO,IAAI,aAAa,EACxB,OAAO,IAAI,aAAa,GAKzB,MAAM,aAAa,CAAA;AAcpB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AAWvB,MAAM,UAAU,OAAO,CACrB,KAA0B,EAC1B,IAAqB,EACrB,IAA+B;IAE/B,OAAO,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAA;AACrE,CAAC;AAmBD,MAAM,UAAU,OAAO,CAAC,IAA+B;IACrD,OAAO,aAAa,CAAC;QACnB,GAAG,IAAI;QACP,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,IAAI,KAAK;KACvD,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAA","sourcesContent":["import type { Send, Signal, TransitionOptions } from '@llui/dom'\nimport {\n init,\n update,\n connect as dialogConnect,\n overlay as dialogOverlay,\n type DialogState,\n type DialogMsg,\n type DialogParts,\n type ConnectOptions as DialogConnectOptions,\n} from './dialog.js'\n\n/**\n * Alert dialog — a variant of dialog for destructive confirmations or\n * blocking messages. Uses `role=\"alertdialog\"` and defaults to:\n * - `closeOnOutsideClick: false` (user must choose an action explicitly)\n *\n * Shares state, messages, and part structure with `dialog`. Render a\n * `cancelTrigger` alongside the `closeTrigger` and let the application\n * dispatch a follow-up action after the dialog closes.\n */\n\nexport type { DialogState as AlertDialogState, DialogMsg as AlertDialogMsg }\n\nexport { init, update }\n\nexport interface AlertDialogConnectOptions extends Omit<DialogConnectOptions, 'role'> {\n /** Accessible label for the cancel button (default: 'Cancel'). */\n cancelLabel?: string\n /** Accessible label for the confirm button (default: 'Confirm'). */\n confirmLabel?: string\n}\n\nexport type AlertDialogParts = DialogParts\n\nexport function connect(\n state: Signal<DialogState>,\n send: Send<DialogMsg>,\n opts: AlertDialogConnectOptions,\n): AlertDialogParts {\n return dialogConnect(state, send, { ...opts, role: 'alertdialog' })\n}\n\nexport interface AlertDialogOverlayOptions {\n state: Signal<DialogState>\n send: Send<DialogMsg>\n parts: AlertDialogParts\n content: () => readonly Node[]\n transition?: TransitionOptions\n closeOnEscape?: boolean\n /** Whether outside-click should dismiss (default: false for alert dialogs). */\n closeOnOutsideClick?: boolean\n trapFocus?: boolean\n lockScroll?: boolean\n hideSiblings?: boolean\n target?: string | HTMLElement\n initialFocus?: Element | (() => Element | null)\n restoreFocus?: boolean\n}\n\nexport function overlay(opts: AlertDialogOverlayOptions): Node {\n return dialogOverlay({\n ...opts,\n closeOnOutsideClick: opts.closeOnOutsideClick ?? false,\n })\n}\n\nexport const alertDialog = { init, update, connect, overlay }\n"]}
@@ -1,4 +1,4 @@
1
- import type { Send } from '@llui/dom';
1
+ import type { Send, Signal } from '@llui/dom';
2
2
  /**
3
3
  * Angle slider — a circular input that selects a value in 0..360 degrees
4
4
  * by dragging a thumb around a control. The state machine tracks the
@@ -71,20 +71,20 @@ export declare function pointFromAngle(angleDeg: number): {
71
71
  x: number;
72
72
  y: number;
73
73
  };
74
- export interface AngleSliderParts<S> {
74
+ export interface AngleSliderParts {
75
75
  root: {
76
76
  role: 'slider';
77
- 'aria-valuemin': (s: S) => number;
78
- 'aria-valuemax': (s: S) => number;
79
- 'aria-valuenow': (s: S) => number;
80
- 'aria-valuetext': (s: S) => string;
77
+ 'aria-valuemin': Signal<number>;
78
+ 'aria-valuemax': Signal<number>;
79
+ 'aria-valuenow': Signal<number>;
80
+ 'aria-valuetext': Signal<string>;
81
81
  'aria-orientation': 'horizontal';
82
- 'aria-disabled': (s: S) => 'true' | undefined;
83
- 'aria-readonly': (s: S) => 'true' | undefined;
84
- tabIndex: (s: S) => number;
82
+ 'aria-disabled': Signal<'true' | undefined>;
83
+ 'aria-readonly': Signal<'true' | undefined>;
84
+ tabIndex: Signal<number>;
85
85
  'data-scope': 'angle-slider';
86
86
  'data-part': 'root';
87
- 'data-disabled': (s: S) => '' | undefined;
87
+ 'data-disabled': Signal<'' | undefined>;
88
88
  onKeyDown: (e: KeyboardEvent) => void;
89
89
  };
90
90
  control: {
@@ -99,7 +99,7 @@ export interface AngleSliderParts<S> {
99
99
  thumb: {
100
100
  'data-scope': 'angle-slider';
101
101
  'data-part': 'thumb';
102
- 'data-value': (s: S) => string;
102
+ 'data-value': Signal<string>;
103
103
  };
104
104
  valueText: {
105
105
  'data-scope': 'angle-slider';
@@ -108,7 +108,7 @@ export interface AngleSliderParts<S> {
108
108
  /** A hidden input for form participation. */
109
109
  hiddenInput: {
110
110
  type: 'hidden';
111
- value: (s: S) => string;
111
+ value: Signal<string>;
112
112
  name?: string;
113
113
  'data-scope': 'angle-slider';
114
114
  'data-part': 'hidden-input';
@@ -120,7 +120,7 @@ export interface ConnectOptions {
120
120
  /** Formatter for aria-valuetext (default: "{value}°"). */
121
121
  format?: (value: number) => string;
122
122
  }
123
- export declare function connect<S>(get: (s: S) => AngleSliderState, send: Send<AngleSliderMsg>, opts?: ConnectOptions): AngleSliderParts<S>;
123
+ export declare function connect(state: Signal<AngleSliderState>, send: Send<AngleSliderMsg>, opts?: ConnectOptions): AngleSliderParts;
124
124
  export declare const angleSlider: {
125
125
  init: typeof init;
126
126
  update: typeof update;
@@ -1 +1 @@
1
- {"version":3,"file":"angle-slider.d.ts","sourceRoot":"","sources":["../../src/components/angle-slider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"angle-slider.d.ts","sourceRoot":"","sources":["../../src/components/angle-slider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAG7C;;;;;;;;;;;;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;AACxB,gFAAgF;AAC9E;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AACrC,wEAAwE;GACtE;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;AACvC,wEAAwE;GACtE;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;AACvC,iBAAiB;GACf;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE;AACjC,iBAAiB;GACf;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;IAC/B,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ,CAAA;QACd,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QAC/B,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QAC/B,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QAC/B,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QAChC,kBAAkB,EAAE,YAAY,CAAA;QAChC,eAAe,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;QAC3C,eAAe,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;QAC3C,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QACxB,YAAY,EAAE,cAAc,CAAA;QAC5B,WAAW,EAAE,MAAM,CAAA;QACnB,eAAe,EAAE,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC,CAAA;QACvC,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,MAAM,CAAC,MAAM,CAAC,CAAA;KAC7B,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,MAAM,CAAC,MAAM,CAAC,CAAA;QACrB,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,CACrB,KAAK,EAAE,MAAM,CAAC,gBAAgB,CAAC,EAC/B,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,EAC1B,IAAI,GAAE,cAAmB,GACxB,gBAAgB,CAsElB;AAED,eAAO,MAAM,WAAW;;;;;;CAA4D,CAAA"}
@@ -75,22 +75,22 @@ export function pointFromAngle(angleDeg) {
75
75
  const rad = ((angleDeg - 90) * Math.PI) / 180;
76
76
  return { x: Math.cos(rad), y: Math.sin(rad) };
77
77
  }
78
- export function connect(get, send, opts = {}) {
78
+ export function connect(state, send, opts = {}) {
79
79
  const fmt = opts.format ?? ((v) => `${Math.round(v)}°`);
80
80
  return {
81
81
  root: {
82
82
  role: 'slider',
83
- 'aria-valuemin': (s) => get(s).min,
84
- 'aria-valuemax': (s) => get(s).max,
85
- 'aria-valuenow': (s) => get(s).value,
86
- 'aria-valuetext': (s) => fmt(get(s).value),
83
+ 'aria-valuemin': state.map((s) => s.min),
84
+ 'aria-valuemax': state.map((s) => s.max),
85
+ 'aria-valuenow': state.map((s) => s.value),
86
+ 'aria-valuetext': state.map((s) => fmt(s.value)),
87
87
  'aria-orientation': 'horizontal',
88
- 'aria-disabled': (s) => (get(s).disabled ? 'true' : undefined),
89
- 'aria-readonly': (s) => (get(s).readOnly ? 'true' : undefined),
90
- tabIndex: (s) => (get(s).disabled ? -1 : 0),
88
+ 'aria-disabled': state.map((s) => (s.disabled ? 'true' : undefined)),
89
+ 'aria-readonly': state.map((s) => (s.readOnly ? 'true' : undefined)),
90
+ tabIndex: state.map((s) => (s.disabled ? -1 : 0)),
91
91
  'data-scope': 'angle-slider',
92
92
  'data-part': 'root',
93
- 'data-disabled': (s) => (get(s).disabled ? '' : undefined),
93
+ 'data-disabled': state.map((s) => (s.disabled ? '' : undefined)),
94
94
  onKeyDown: tagSend(send, ['increment', 'decrement', 'setValue'], (e) => {
95
95
  const key = flipArrow(e.key, e.currentTarget);
96
96
  switch (key) {
@@ -130,7 +130,7 @@ export function connect(get, send, opts = {}) {
130
130
  thumb: {
131
131
  'data-scope': 'angle-slider',
132
132
  'data-part': 'thumb',
133
- 'data-value': (s) => String(get(s).value),
133
+ 'data-value': state.map((s) => String(s.value)),
134
134
  },
135
135
  valueText: {
136
136
  'data-scope': 'angle-slider',
@@ -138,7 +138,7 @@ export function connect(get, send, opts = {}) {
138
138
  },
139
139
  hiddenInput: {
140
140
  type: 'hidden',
141
- value: (s) => String(get(s).value),
141
+ value: state.map((s) => String(s.value)),
142
142
  ...(opts.name !== undefined ? { name: opts.name } : {}),
143
143
  'data-scope': 'angle-slider',
144
144
  'data-part': 'hidden-input',
@@ -1 +1 @@
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"]}
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, Signal } 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 {\n root: {\n role: 'slider'\n 'aria-valuemin': Signal<number>\n 'aria-valuemax': Signal<number>\n 'aria-valuenow': Signal<number>\n 'aria-valuetext': Signal<string>\n 'aria-orientation': 'horizontal'\n 'aria-disabled': Signal<'true' | undefined>\n 'aria-readonly': Signal<'true' | undefined>\n tabIndex: Signal<number>\n 'data-scope': 'angle-slider'\n 'data-part': 'root'\n 'data-disabled': Signal<'' | 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': Signal<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: Signal<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(\n state: Signal<AngleSliderState>,\n send: Send<AngleSliderMsg>,\n opts: ConnectOptions = {},\n): AngleSliderParts {\n const fmt = opts.format ?? ((v: number) => `${Math.round(v)}°`)\n\n return {\n root: {\n role: 'slider',\n 'aria-valuemin': state.map((s) => s.min),\n 'aria-valuemax': state.map((s) => s.max),\n 'aria-valuenow': state.map((s) => s.value),\n 'aria-valuetext': state.map((s) => fmt(s.value)),\n 'aria-orientation': 'horizontal',\n 'aria-disabled': state.map((s) => (s.disabled ? 'true' : undefined)),\n 'aria-readonly': state.map((s) => (s.readOnly ? 'true' : undefined)),\n tabIndex: state.map((s) => (s.disabled ? -1 : 0)),\n 'data-scope': 'angle-slider',\n 'data-part': 'root',\n 'data-disabled': state.map((s) => (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': state.map((s) => String(s.value)),\n },\n valueText: {\n 'data-scope': 'angle-slider',\n 'data-part': 'value-text',\n },\n hiddenInput: {\n type: 'hidden',\n value: state.map((s) => String(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,4 +1,4 @@
1
- import type { Send } from '@llui/dom';
1
+ import type { Send, Signal } from '@llui/dom';
2
2
  /**
3
3
  * Async list — paginated/infinite-scroll list that accumulates pages.
4
4
  * The machine is generic over the item type; the consumer runs the
@@ -65,11 +65,11 @@ export declare function update<T>(state: AsyncListState<T>, msg: AsyncListMsg<T>
65
65
  export declare function isLoading<T>(state: AsyncListState<T>): boolean;
66
66
  export declare function isError<T>(state: AsyncListState<T>): boolean;
67
67
  export declare function isEmpty<T>(state: AsyncListState<T>): boolean;
68
- export interface AsyncListParts<S, _T> {
68
+ export interface AsyncListParts {
69
69
  root: {
70
70
  'data-scope': 'async-list';
71
71
  'data-part': 'root';
72
- 'data-status': (s: S) => AsyncStatus;
72
+ 'data-status': Signal<AsyncStatus>;
73
73
  };
74
74
  sentinel: {
75
75
  'data-scope': 'async-list';
@@ -78,7 +78,7 @@ export interface AsyncListParts<S, _T> {
78
78
  };
79
79
  loadMoreTrigger: {
80
80
  type: 'button';
81
- disabled: (s: S) => boolean;
81
+ disabled: Signal<boolean>;
82
82
  'data-scope': 'async-list';
83
83
  'data-part': 'load-more-trigger';
84
84
  onClick: (e: MouseEvent) => void;
@@ -87,7 +87,7 @@ export interface AsyncListParts<S, _T> {
87
87
  type: 'button';
88
88
  'data-scope': 'async-list';
89
89
  'data-part': 'retry-trigger';
90
- hidden: (s: S) => boolean;
90
+ hidden: Signal<boolean>;
91
91
  onClick: (e: MouseEvent) => void;
92
92
  };
93
93
  errorText: {
@@ -95,10 +95,10 @@ export interface AsyncListParts<S, _T> {
95
95
  'aria-live': 'polite';
96
96
  'data-scope': 'async-list';
97
97
  'data-part': 'error-text';
98
- hidden: (s: S) => boolean;
98
+ hidden: Signal<boolean>;
99
99
  };
100
100
  }
101
- export declare function connect<S, T>(get: (s: S) => AsyncListState<T>, send: Send<AsyncListMsg<T>>): AsyncListParts<S, T>;
101
+ export declare function connect<T>(state: Signal<AsyncListState<T>>, send: Send<AsyncListMsg<T>>): AsyncListParts;
102
102
  /**
103
103
  * Install an IntersectionObserver on the sentinel element that auto-dispatches
104
104
  * `loadMore` whenever the sentinel scrolls into view. Call from onMount.
@@ -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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"}
@@ -53,12 +53,12 @@ export function isError(state) {
53
53
  export function isEmpty(state) {
54
54
  return state.items.length === 0;
55
55
  }
56
- export function connect(get, send) {
56
+ export function connect(state, send) {
57
57
  return {
58
58
  root: {
59
59
  'data-scope': 'async-list',
60
60
  'data-part': 'root',
61
- 'data-status': (s) => get(s).status,
61
+ 'data-status': state.map((st) => st.status),
62
62
  },
63
63
  sentinel: {
64
64
  'data-scope': 'async-list',
@@ -67,10 +67,7 @@ export function connect(get, send) {
67
67
  },
68
68
  loadMoreTrigger: {
69
69
  type: 'button',
70
- disabled: (s) => {
71
- const st = get(s);
72
- return st.status === 'loading' || !st.hasMore;
73
- },
70
+ disabled: state.map((st) => st.status === 'loading' || !st.hasMore),
74
71
  'data-scope': 'async-list',
75
72
  'data-part': 'load-more-trigger',
76
73
  onClick: tagSend(send, ['loadMore'], () => send({ type: 'loadMore' })),
@@ -79,7 +76,7 @@ export function connect(get, send) {
79
76
  type: 'button',
80
77
  'data-scope': 'async-list',
81
78
  'data-part': 'retry-trigger',
82
- hidden: (s) => get(s).status !== 'error',
79
+ hidden: state.map((st) => st.status !== 'error'),
83
80
  onClick: tagSend(send, ['retry'], () => send({ type: 'retry' })),
84
81
  },
85
82
  errorText: {
@@ -87,7 +84,7 @@ export function connect(get, send) {
87
84
  'aria-live': 'polite',
88
85
  'data-scope': 'async-list',
89
86
  'data-part': 'error-text',
90
- hidden: (s) => get(s).status !== 'error',
87
+ hidden: state.map((st) => st.status !== 'error'),
91
88
  },
92
89
  };
93
90
  }