@k2b/ui 0.32.0 → 0.34.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 (292) hide show
  1. package/dist/base.css +14 -1
  2. package/dist/browser/actions/ContextMenu.js +13 -0
  3. package/dist/browser/actions/ContextMenu.js.map +1 -1
  4. package/dist/browser/actions/Dropdown.js +173 -102
  5. package/dist/browser/actions/Dropdown.js.map +1 -1
  6. package/dist/browser/actions/FilterChip.js +113 -56
  7. package/dist/browser/actions/FilterChip.js.map +1 -1
  8. package/dist/browser/actions/SelectionToolbar.js +129 -0
  9. package/dist/browser/actions/SelectionToolbar.js.map +1 -0
  10. package/dist/browser/actions/filter-messages.js +26 -2
  11. package/dist/browser/actions/filter-messages.js.map +1 -1
  12. package/dist/browser/actions/index.js +1 -0
  13. package/dist/browser/actions/index.js.map +1 -1
  14. package/dist/browser/actions/menu-rows.js +23 -3
  15. package/dist/browser/actions/menu-rows.js.map +1 -1
  16. package/dist/browser/actions/menu-sheet.js +2 -7
  17. package/dist/browser/actions/menu-sheet.js.map +1 -1
  18. package/dist/browser/charts.js +6 -0
  19. package/dist/browser/charts.js.map +1 -0
  20. package/dist/browser/chat/ChatComposer.js +616 -421
  21. package/dist/browser/chat/ChatComposer.js.map +1 -1
  22. package/dist/browser/chat/chat-messages.js +18 -0
  23. package/dist/browser/chat/chat-messages.js.map +1 -1
  24. package/dist/browser/chat/composer-document.js +19 -0
  25. package/dist/browser/chat/composer-document.js.map +1 -1
  26. package/dist/browser/chat/index.js.map +1 -1
  27. package/dist/browser/content/Calendar.js +39 -29
  28. package/dist/browser/content/Calendar.js.map +1 -1
  29. package/dist/browser/content/CalendarDayView.js +159 -165
  30. package/dist/browser/content/CalendarDayView.js.map +1 -1
  31. package/dist/browser/content/Chart.js +8 -0
  32. package/dist/browser/content/Chart.js.map +1 -1
  33. package/dist/browser/content/FileGrid.js +231 -9
  34. package/dist/browser/content/FileGrid.js.map +1 -1
  35. package/dist/browser/content/FileTypeIcon.js +15 -0
  36. package/dist/browser/content/FileTypeIcon.js.map +1 -1
  37. package/dist/browser/content/FileView.js +11 -4
  38. package/dist/browser/content/FileView.js.map +1 -1
  39. package/dist/browser/content/MessageRow.js +627 -343
  40. package/dist/browser/content/MessageRow.js.map +1 -1
  41. package/dist/browser/content/ReactionBar.js +20 -1
  42. package/dist/browser/content/ReactionBar.js.map +1 -1
  43. package/dist/browser/content/calendar-day-scroll.js +4 -3
  44. package/dist/browser/content/calendar-day-scroll.js.map +1 -1
  45. package/dist/browser/content/chart-bar.js +476 -0
  46. package/dist/browser/content/chart-bar.js.map +1 -0
  47. package/dist/browser/content/file-list-messages.js +52 -0
  48. package/dist/browser/content/file-list-messages.js.map +1 -0
  49. package/dist/browser/content/index.js +2 -2
  50. package/dist/browser/content/index.js.map +1 -1
  51. package/dist/browser/feedback/Tooltip.js +31 -14
  52. package/dist/browser/feedback/Tooltip.js.map +1 -1
  53. package/dist/browser/feedback/dialog-core.js +6 -0
  54. package/dist/browser/feedback/dialog-core.js.map +1 -1
  55. package/dist/browser/inputs/ChoiceList.js +178 -0
  56. package/dist/browser/inputs/ChoiceList.js.map +1 -0
  57. package/dist/browser/inputs/ChoiceSlider.js +314 -0
  58. package/dist/browser/inputs/ChoiceSlider.js.map +1 -0
  59. package/dist/browser/inputs/ChoiceTiles.js +135 -0
  60. package/dist/browser/inputs/ChoiceTiles.js.map +1 -0
  61. package/dist/browser/inputs/ColorChoices.js +120 -0
  62. package/dist/browser/inputs/ColorChoices.js.map +1 -0
  63. package/dist/browser/inputs/QrScanner.js +95 -13
  64. package/dist/browser/inputs/QrScanner.js.map +1 -1
  65. package/dist/browser/inputs/TextInput.js +19 -14
  66. package/dist/browser/inputs/TextInput.js.map +1 -1
  67. package/dist/browser/inputs/index.js +4 -0
  68. package/dist/browser/inputs/index.js.map +1 -1
  69. package/dist/browser/inputs/qr-messages.js +2 -0
  70. package/dist/browser/inputs/qr-messages.js.map +1 -1
  71. package/dist/browser/internal/radio-keys.js +13 -0
  72. package/dist/browser/internal/radio-keys.js.map +1 -0
  73. package/dist/browser/intl/shortcut-messages.js +4 -0
  74. package/dist/browser/intl/shortcut-messages.js.map +1 -1
  75. package/dist/browser/intl/shortcut.js +4 -0
  76. package/dist/browser/intl/shortcut.js.map +1 -1
  77. package/dist/browser/layout/AnchoredPopover.js +180 -0
  78. package/dist/browser/layout/AnchoredPopover.js.map +1 -0
  79. package/dist/browser/layout/AppWorkspace.js +684 -532
  80. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  81. package/dist/browser/layout/DetailPanel.js +443 -333
  82. package/dist/browser/layout/DetailPanel.js.map +1 -1
  83. package/dist/browser/layout/MobileShell.js +231 -42
  84. package/dist/browser/layout/MobileShell.js.map +1 -1
  85. package/dist/browser/layout/Settings.js +283 -175
  86. package/dist/browser/layout/Settings.js.map +1 -1
  87. package/dist/browser/layout/SidebarRailHint.js +79 -0
  88. package/dist/browser/layout/SidebarRailHint.js.map +1 -0
  89. package/dist/browser/layout/SidebarSwitcher.js +79 -66
  90. package/dist/browser/layout/SidebarSwitcher.js.map +1 -1
  91. package/dist/browser/layout/TabBar.js +18 -4
  92. package/dist/browser/layout/TabBar.js.map +1 -1
  93. package/dist/browser/layout/app-workspace-controller.js +11 -4
  94. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  95. package/dist/browser/layout/detail-panel-messages.js +4 -2
  96. package/dist/browser/layout/detail-panel-messages.js.map +1 -1
  97. package/dist/browser/layout/index.js +3 -1
  98. package/dist/browser/layout/index.js.map +1 -1
  99. package/dist/browser/layout/scroll-fade.js +32 -5
  100. package/dist/browser/layout/scroll-fade.js.map +1 -1
  101. package/dist/browser/layout/settings-messages.js +26 -2
  102. package/dist/browser/layout/settings-messages.js.map +1 -1
  103. package/dist/browser/surfaces/Avatar.js +2 -14
  104. package/dist/browser/surfaces/Avatar.js.map +1 -1
  105. package/dist/browser/surfaces/DotStrip.js +70 -0
  106. package/dist/browser/surfaces/DotStrip.js.map +1 -0
  107. package/dist/browser/surfaces/NoticeCard.js +46 -30
  108. package/dist/browser/surfaces/NoticeCard.js.map +1 -1
  109. package/dist/browser/surfaces/ProgressRing.js +3 -0
  110. package/dist/browser/surfaces/ProgressRing.js.map +1 -1
  111. package/dist/browser/surfaces/ResourceCard.js +125 -68
  112. package/dist/browser/surfaces/ResourceCard.js.map +1 -1
  113. package/dist/browser/surfaces/index.js +2 -0
  114. package/dist/browser/surfaces/index.js.map +1 -1
  115. package/dist/browser/surfaces/person-color.js +18 -0
  116. package/dist/browser/surfaces/person-color.js.map +1 -0
  117. package/dist/browser/surfaces/resource-messages.js +8 -4
  118. package/dist/browser/surfaces/resource-messages.js.map +1 -1
  119. package/dist/browser/widgets/Widget.js +3 -2
  120. package/dist/browser/widgets/Widget.js.map +1 -1
  121. package/dist/ssr/actions/ContextMenu.js +9 -0
  122. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  123. package/dist/ssr/actions/Dropdown.js +65 -31
  124. package/dist/ssr/actions/Dropdown.js.map +1 -1
  125. package/dist/ssr/actions/FilterChip.js +67 -16
  126. package/dist/ssr/actions/FilterChip.js.map +1 -1
  127. package/dist/ssr/actions/SelectionToolbar.js +104 -0
  128. package/dist/ssr/actions/SelectionToolbar.js.map +1 -0
  129. package/dist/ssr/actions/filter-messages.js +26 -2
  130. package/dist/ssr/actions/filter-messages.js.map +1 -1
  131. package/dist/ssr/actions/index.js +1 -0
  132. package/dist/ssr/actions/index.js.map +1 -1
  133. package/dist/ssr/actions/menu-rows.js +23 -3
  134. package/dist/ssr/actions/menu-rows.js.map +1 -1
  135. package/dist/ssr/actions/menu-sheet.js +2 -7
  136. package/dist/ssr/actions/menu-sheet.js.map +1 -1
  137. package/dist/ssr/charts.js +6 -0
  138. package/dist/ssr/charts.js.map +1 -0
  139. package/dist/ssr/chat/ChatComposer.js +184 -76
  140. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  141. package/dist/ssr/chat/chat-messages.js +18 -0
  142. package/dist/ssr/chat/chat-messages.js.map +1 -1
  143. package/dist/ssr/chat/composer-document.js +19 -0
  144. package/dist/ssr/chat/composer-document.js.map +1 -1
  145. package/dist/ssr/chat/index.js.map +1 -1
  146. package/dist/ssr/content/Calendar.js +40 -31
  147. package/dist/ssr/content/Calendar.js.map +1 -1
  148. package/dist/ssr/content/CalendarDayView.js +40 -48
  149. package/dist/ssr/content/CalendarDayView.js.map +1 -1
  150. package/dist/ssr/content/Chart.js +8 -0
  151. package/dist/ssr/content/Chart.js.map +1 -1
  152. package/dist/ssr/content/FileGrid.js +132 -5
  153. package/dist/ssr/content/FileGrid.js.map +1 -1
  154. package/dist/ssr/content/FileTypeIcon.js +15 -0
  155. package/dist/ssr/content/FileTypeIcon.js.map +1 -1
  156. package/dist/ssr/content/FileView.js +11 -4
  157. package/dist/ssr/content/FileView.js.map +1 -1
  158. package/dist/ssr/content/MessageRow.js +274 -91
  159. package/dist/ssr/content/MessageRow.js.map +1 -1
  160. package/dist/ssr/content/ReactionBar.js +20 -1
  161. package/dist/ssr/content/ReactionBar.js.map +1 -1
  162. package/dist/ssr/content/calendar-day-scroll.js +4 -3
  163. package/dist/ssr/content/calendar-day-scroll.js.map +1 -1
  164. package/dist/ssr/content/chart-bar.js +476 -0
  165. package/dist/ssr/content/chart-bar.js.map +1 -0
  166. package/dist/ssr/content/file-list-messages.js +52 -0
  167. package/dist/ssr/content/file-list-messages.js.map +1 -0
  168. package/dist/ssr/content/index.js +2 -2
  169. package/dist/ssr/content/index.js.map +1 -1
  170. package/dist/ssr/feedback/Tooltip.js +31 -14
  171. package/dist/ssr/feedback/Tooltip.js.map +1 -1
  172. package/dist/ssr/feedback/dialog-core.js +6 -0
  173. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  174. package/dist/ssr/inputs/ChoiceList.js +95 -0
  175. package/dist/ssr/inputs/ChoiceList.js.map +1 -0
  176. package/dist/ssr/inputs/ChoiceSlider.js +191 -0
  177. package/dist/ssr/inputs/ChoiceSlider.js.map +1 -0
  178. package/dist/ssr/inputs/ChoiceTiles.js +61 -0
  179. package/dist/ssr/inputs/ChoiceTiles.js.map +1 -0
  180. package/dist/ssr/inputs/ColorChoices.js +60 -0
  181. package/dist/ssr/inputs/ColorChoices.js.map +1 -0
  182. package/dist/ssr/inputs/QrScanner.js +89 -10
  183. package/dist/ssr/inputs/QrScanner.js.map +1 -1
  184. package/dist/ssr/inputs/TextInput.js +17 -2
  185. package/dist/ssr/inputs/TextInput.js.map +1 -1
  186. package/dist/ssr/inputs/index.js +4 -0
  187. package/dist/ssr/inputs/index.js.map +1 -1
  188. package/dist/ssr/inputs/qr-messages.js +2 -0
  189. package/dist/ssr/inputs/qr-messages.js.map +1 -1
  190. package/dist/ssr/internal/radio-keys.js +13 -0
  191. package/dist/ssr/internal/radio-keys.js.map +1 -0
  192. package/dist/ssr/intl/shortcut-messages.js +4 -0
  193. package/dist/ssr/intl/shortcut-messages.js.map +1 -1
  194. package/dist/ssr/intl/shortcut.js +4 -0
  195. package/dist/ssr/intl/shortcut.js.map +1 -1
  196. package/dist/ssr/layout/AnchoredPopover.js +142 -0
  197. package/dist/ssr/layout/AnchoredPopover.js.map +1 -0
  198. package/dist/ssr/layout/AppWorkspace.js +287 -141
  199. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  200. package/dist/ssr/layout/DetailPanel.js +181 -108
  201. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  202. package/dist/ssr/layout/MobileShell.js +118 -24
  203. package/dist/ssr/layout/MobileShell.js.map +1 -1
  204. package/dist/ssr/layout/Settings.js +122 -45
  205. package/dist/ssr/layout/Settings.js.map +1 -1
  206. package/dist/ssr/layout/SidebarRailHint.js +79 -0
  207. package/dist/ssr/layout/SidebarRailHint.js.map +1 -0
  208. package/dist/ssr/layout/SidebarSwitcher.js +13 -3
  209. package/dist/ssr/layout/SidebarSwitcher.js.map +1 -1
  210. package/dist/ssr/layout/TabBar.js +11 -3
  211. package/dist/ssr/layout/TabBar.js.map +1 -1
  212. package/dist/ssr/layout/app-workspace-controller.js +11 -4
  213. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  214. package/dist/ssr/layout/detail-panel-messages.js +4 -2
  215. package/dist/ssr/layout/detail-panel-messages.js.map +1 -1
  216. package/dist/ssr/layout/index.js +3 -1
  217. package/dist/ssr/layout/index.js.map +1 -1
  218. package/dist/ssr/layout/scroll-fade.js +32 -5
  219. package/dist/ssr/layout/scroll-fade.js.map +1 -1
  220. package/dist/ssr/layout/settings-messages.js +26 -2
  221. package/dist/ssr/layout/settings-messages.js.map +1 -1
  222. package/dist/ssr/surfaces/Avatar.js +2 -14
  223. package/dist/ssr/surfaces/Avatar.js.map +1 -1
  224. package/dist/ssr/surfaces/DotStrip.js +31 -0
  225. package/dist/ssr/surfaces/DotStrip.js.map +1 -0
  226. package/dist/ssr/surfaces/NoticeCard.js +21 -12
  227. package/dist/ssr/surfaces/NoticeCard.js.map +1 -1
  228. package/dist/ssr/surfaces/ProgressRing.js +3 -0
  229. package/dist/ssr/surfaces/ProgressRing.js.map +1 -1
  230. package/dist/ssr/surfaces/ResourceCard.js +40 -15
  231. package/dist/ssr/surfaces/ResourceCard.js.map +1 -1
  232. package/dist/ssr/surfaces/index.js +2 -0
  233. package/dist/ssr/surfaces/index.js.map +1 -1
  234. package/dist/ssr/surfaces/person-color.js +18 -0
  235. package/dist/ssr/surfaces/person-color.js.map +1 -0
  236. package/dist/ssr/surfaces/resource-messages.js +8 -4
  237. package/dist/ssr/surfaces/resource-messages.js.map +1 -1
  238. package/dist/ssr/widgets/Widget.js +3 -2
  239. package/dist/ssr/widgets/Widget.js.map +1 -1
  240. package/dist/styles.css +1 -1
  241. package/dist/types/actions/ContextMenu.d.ts +5 -0
  242. package/dist/types/actions/Dropdown.d.ts +19 -0
  243. package/dist/types/actions/FilterChip.d.ts +11 -0
  244. package/dist/types/actions/SelectionToolbar.d.ts +38 -0
  245. package/dist/types/actions/filter-messages.d.ts +12 -0
  246. package/dist/types/actions/index.d.ts +2 -0
  247. package/dist/types/actions/menu-rows.d.ts +7 -2
  248. package/dist/types/charts.d.ts +5 -0
  249. package/dist/types/chat/ChatComposer.d.ts +28 -0
  250. package/dist/types/chat/chat-messages.d.ts +9 -0
  251. package/dist/types/chat/composer-document.d.ts +5 -0
  252. package/dist/types/chat/index.d.ts +1 -1
  253. package/dist/types/content/Calendar.d.ts +7 -0
  254. package/dist/types/content/Chart.d.ts +2 -1
  255. package/dist/types/content/FileGrid.d.ts +43 -3
  256. package/dist/types/content/FileTypeIcon.d.ts +10 -0
  257. package/dist/types/content/FileView.d.ts +5 -1
  258. package/dist/types/content/MessageRow.d.ts +66 -2
  259. package/dist/types/content/calendar-day-scroll.d.ts +2 -1
  260. package/dist/types/content/chart-bar.d.ts +60 -0
  261. package/dist/types/content/file-list-messages.d.ts +24 -0
  262. package/dist/types/content/index.d.ts +4 -4
  263. package/dist/types/feedback/Tooltip.d.ts +8 -2
  264. package/dist/types/feedback/dialog-core.d.ts +3 -0
  265. package/dist/types/inputs/ChoiceList.d.ts +28 -0
  266. package/dist/types/inputs/ChoiceSlider.d.ts +36 -0
  267. package/dist/types/inputs/ChoiceTiles.d.ts +25 -0
  268. package/dist/types/inputs/ColorChoices.d.ts +19 -0
  269. package/dist/types/inputs/index.d.ts +8 -0
  270. package/dist/types/inputs/qr-messages.d.ts +1 -0
  271. package/dist/types/internal/radio-keys.d.ts +5 -0
  272. package/dist/types/intl/shortcut-messages.d.ts +2 -0
  273. package/dist/types/layout/AnchoredPopover.d.ts +31 -0
  274. package/dist/types/layout/AppWorkspace.d.ts +12 -0
  275. package/dist/types/layout/DetailPanel.d.ts +17 -0
  276. package/dist/types/layout/MobileShell.d.ts +55 -5
  277. package/dist/types/layout/Settings.d.ts +22 -0
  278. package/dist/types/layout/SidebarRailHint.d.ts +26 -0
  279. package/dist/types/layout/TabBar.d.ts +5 -0
  280. package/dist/types/layout/detail-panel-messages.d.ts +1 -0
  281. package/dist/types/layout/index.d.ts +5 -3
  282. package/dist/types/layout/scroll-fade.d.ts +5 -0
  283. package/dist/types/layout/settings-messages.d.ts +12 -0
  284. package/dist/types/surfaces/DotStrip.d.ts +22 -0
  285. package/dist/types/surfaces/NoticeCard.d.ts +3 -0
  286. package/dist/types/surfaces/ProgressRing.d.ts +2 -1
  287. package/dist/types/surfaces/ResourceCard.d.ts +9 -0
  288. package/dist/types/surfaces/index.d.ts +4 -1
  289. package/dist/types/surfaces/person-color.d.ts +10 -0
  290. package/dist/types/surfaces/resource-messages.d.ts +2 -0
  291. package/dist/types/widgets/Widget.d.ts +3 -2
  292. package/package.json +7 -2
@@ -0,0 +1,178 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { delegateEvents as _$delegateEvents } from "solid-js/web";
3
+ import { setProperty as _$setProperty } from "solid-js/web";
4
+ import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
5
+ import { getNextMarker as _$getNextMarker } from "solid-js/web";
6
+ import { memo as _$memo } from "solid-js/web";
7
+ import { setAttribute as _$setAttribute } from "solid-js/web";
8
+ import { effect as _$effect } from "solid-js/web";
9
+ import { getNextElement as _$getNextElement } from "solid-js/web";
10
+ import { insert as _$insert } from "solid-js/web";
11
+ import { createComponent as _$createComponent } from "solid-js/web";
12
+ import { use as _$use } from "solid-js/web";
13
+ var _tmpl$ = /*#__PURE__*/_$template(`<div class=k2b-choice-list role=radiogroup>`),
14
+ _tmpl$2 = /*#__PURE__*/_$template(`<i class="ti ti-loader-2 k2b-spin"role=img>`),
15
+ _tmpl$3 = /*#__PURE__*/_$template(`<span class=k2b-choice-list__description>`),
16
+ _tmpl$4 = /*#__PURE__*/_$template(`<button type=button role=radio class=k2b-choice-list__option><span class=k2b-choice-list__radio aria-hidden=true></span><span class=k2b-choice-list__text><span class=k2b-choice-list__label><!$><!/><!$><!/><span class=k2b-choice-list__busy></span></span><!$><!/>`),
17
+ _tmpl$5 = /*#__PURE__*/_$template(`<div class=k2b-choice-list__details>`),
18
+ _tmpl$6 = /*#__PURE__*/_$template(`<span class=k2b-choice-list__marker>`);
19
+ import { Index, Show } from "solid-js";
20
+ import { createFieldMeta, Field, fieldDescribedBy } from "../internal/field";
21
+ import { radioKeyTarget } from "../internal/radio-keys";
22
+ import { resolveMaybeAccessor } from "./field-contract";
23
+ /**
24
+ * A labeled single choice shown as a short list of rows, each with a radio, a label and one sentence on what it
25
+ * means, for a few choices whose consequences need words. Choosing changes only paint, so no row moves; `details`
26
+ * opens under the chosen row. Use `ChoiceChips` for quick picks without explanation, `RichSelect` for longer lists
27
+ * in a dropdown, and `ChoiceTiles` when a preview decides.
28
+ */
29
+ export function ChoiceList(props) {
30
+ const meta = createFieldMeta(props.id);
31
+ let group;
32
+ const value = () => resolveMaybeAccessor(props.value) ?? null;
33
+ const tabStop = (option, index) => value() === option.value || index === 0 && !props.options.some(candidate => candidate.value === value());
34
+ const choose = (index, focus = false) => {
35
+ const option = props.options[index];
36
+ if (!option || props.disabled) return;
37
+ props.onValueChange?.(option.value);
38
+ props.onValueCommit?.(option.value);
39
+ if (focus) queueMicrotask(() => group?.querySelectorAll('[role="radio"]')[index]?.focus());
40
+ };
41
+ return _$createComponent(Field, {
42
+ meta: meta,
43
+ labelFor: false,
44
+ get ["class"]() {
45
+ return props.class;
46
+ },
47
+ get label() {
48
+ return props.label;
49
+ },
50
+ get description() {
51
+ return props.description;
52
+ },
53
+ get error() {
54
+ return props.error;
55
+ },
56
+ get required() {
57
+ return props.required;
58
+ },
59
+ get disabled() {
60
+ return props.disabled;
61
+ },
62
+ get children() {
63
+ var _el$ = _$getNextElement(_tmpl$);
64
+ var _ref$ = group;
65
+ typeof _ref$ === "function" ? _$use(_ref$, _el$) : group = _el$;
66
+ _$insert(_el$, _$createComponent(Index, {
67
+ get each() {
68
+ return props.options;
69
+ },
70
+ children: (option, index) => {
71
+ const checked = () => value() === option().value;
72
+ const descriptionId = `${meta.controlId}-option-${index}`;
73
+ return [(() => {
74
+ var _el$2 = _$getNextElement(_tmpl$4),
75
+ _el$3 = _el$2.firstChild,
76
+ _el$4 = _el$3.nextSibling,
77
+ _el$5 = _el$4.firstChild,
78
+ _el$8 = _el$5.firstChild,
79
+ [_el$9, _co$] = _$getNextMarker(_el$8.nextSibling),
80
+ _el$0 = _el$9.nextSibling,
81
+ [_el$1, _co$2] = _$getNextMarker(_el$0.nextSibling),
82
+ _el$6 = _el$1.nextSibling,
83
+ _el$11 = _el$5.nextSibling,
84
+ [_el$12, _co$3] = _$getNextMarker(_el$11.nextSibling);
85
+ _el$2.$$keydown = event => {
86
+ const target = radioKeyTarget(event.key, index, props.options.length);
87
+ if (target === undefined) return;
88
+ event.preventDefault();
89
+ choose(target, true);
90
+ };
91
+ _el$2.$$click = () => choose(index);
92
+ _$insert(_el$5, () => option().label, _el$9, _co$);
93
+ _$insert(_el$5, _$createComponent(Show, {
94
+ get when() {
95
+ return option().marker;
96
+ },
97
+ children: marker => (() => {
98
+ var _el$14 = _$getNextElement(_tmpl$6);
99
+ _$insert(_el$14, marker);
100
+ return _el$14;
101
+ })()
102
+ }), _el$1, _co$2);
103
+ _$insert(_el$6, _$createComponent(Show, {
104
+ get when() {
105
+ return _$memo(() => !!checked())() && props.busy;
106
+ },
107
+ get children() {
108
+ var _el$7 = _$getNextElement(_tmpl$2);
109
+ _$effect(() => _$setAttribute(_el$7, "aria-label", props.busyLabel));
110
+ return _el$7;
111
+ }
112
+ }));
113
+ _$insert(_el$4, _$createComponent(Show, {
114
+ get when() {
115
+ return option().description;
116
+ },
117
+ get children() {
118
+ var _el$10 = _$getNextElement(_tmpl$3);
119
+ _$setAttribute(_el$10, "id", descriptionId);
120
+ _$insert(_el$10, () => option().description);
121
+ return _el$10;
122
+ }
123
+ }), _el$12, _co$3);
124
+ _$effect(_p$ => {
125
+ var _v$6 = checked(),
126
+ _v$7 = option().description ? descriptionId : undefined,
127
+ _v$8 = props.disabled,
128
+ _v$9 = tabStop(option(), index) ? 0 : -1;
129
+ _v$6 !== _p$.e && _$setAttribute(_el$2, "aria-checked", _p$.e = _v$6);
130
+ _v$7 !== _p$.t && _$setAttribute(_el$2, "aria-describedby", _p$.t = _v$7);
131
+ _v$8 !== _p$.a && _$setProperty(_el$2, "disabled", _p$.a = _v$8);
132
+ _v$9 !== _p$.o && _$setAttribute(_el$2, "tabindex", _p$.o = _v$9);
133
+ return _p$;
134
+ }, {
135
+ e: undefined,
136
+ t: undefined,
137
+ a: undefined,
138
+ o: undefined
139
+ });
140
+ _$runHydrationEvents();
141
+ return _el$2;
142
+ })(), _$createComponent(Show, {
143
+ get when() {
144
+ return _$memo(() => !!checked())() && props.details;
145
+ },
146
+ get children() {
147
+ var _el$13 = _$getNextElement(_tmpl$5);
148
+ _$insert(_el$13, () => props.details);
149
+ return _el$13;
150
+ }
151
+ })];
152
+ }
153
+ }));
154
+ _$effect(_p$ => {
155
+ var _v$ = props.label ? undefined : props["aria-label"],
156
+ _v$2 = props.label ? meta.labelId : undefined,
157
+ _v$3 = fieldDescribedBy(meta, props),
158
+ _v$4 = props.disabled ? "true" : undefined,
159
+ _v$5 = props.busy ? "true" : undefined;
160
+ _v$ !== _p$.e && _$setAttribute(_el$, "aria-label", _p$.e = _v$);
161
+ _v$2 !== _p$.t && _$setAttribute(_el$, "aria-labelledby", _p$.t = _v$2);
162
+ _v$3 !== _p$.a && _$setAttribute(_el$, "aria-describedby", _p$.a = _v$3);
163
+ _v$4 !== _p$.o && _$setAttribute(_el$, "aria-disabled", _p$.o = _v$4);
164
+ _v$5 !== _p$.i && _$setAttribute(_el$, "aria-busy", _p$.i = _v$5);
165
+ return _p$;
166
+ }, {
167
+ e: undefined,
168
+ t: undefined,
169
+ a: undefined,
170
+ o: undefined,
171
+ i: undefined
172
+ });
173
+ return _el$;
174
+ }
175
+ });
176
+ }
177
+ _$delegateEvents(["click", "keydown"]);
178
+ //# sourceMappingURL=ChoiceList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["inputs/ChoiceList.tsx"],"sourcesContent":["import { Index, type JSX, Show } from \"solid-js\";\nimport { createFieldMeta, Field, fieldDescribedBy } from \"../internal/field\";\nimport { radioKeyTarget } from \"../internal/radio-keys\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { resolveMaybeAccessor } from \"./field-contract\";\n\nexport type ChoiceListOption<T extends string = string> = {\n value: T;\n label: string;\n /** One sentence on what the choice means. */\n description?: string;\n /** A quiet tag after the label, such as \"Default\" for the choice that applies without one. */\n marker?: string;\n};\n\nexport type ChoiceListProps<T extends string = string> = Omit<ValueFieldProps<T | null>, \"onValueChange\" | \"onValueCommit\"> & {\n options: readonly ChoiceListOption<T>[];\n /** The chosen value is being saved: a spinner beside its label, and the group is busy. Choosing again is still possible. */\n busy?: boolean;\n /** Busy spinner's name for screen readers, such as \"Saving\". */\n busyLabel?: string;\n /** Follow-up controls for the chosen option, shown under it and indented to its text, such as a duration. */\n details?: JSX.Element;\n onValueChange?: (value: T) => void;\n onValueCommit?: (value: T) => void;\n};\n\n/**\n * A labeled single choice shown as a short list of rows, each with a radio, a label and one sentence on what it\n * means, for a few choices whose consequences need words. Choosing changes only paint, so no row moves; `details`\n * opens under the chosen row. Use `ChoiceChips` for quick picks without explanation, `RichSelect` for longer lists\n * in a dropdown, and `ChoiceTiles` when a preview decides.\n */\nexport function ChoiceList<T extends string = string>(props: ChoiceListProps<T>): JSX.Element {\n const meta = createFieldMeta(props.id);\n let group: HTMLDivElement | undefined;\n const value = () => resolveMaybeAccessor(props.value) ?? null;\n const tabStop = (option: ChoiceListOption<T>, index: number) =>\n value() === option.value || (index === 0 && !props.options.some((candidate) => candidate.value === value()));\n const choose = (index: number, focus = false) => {\n const option = props.options[index];\n if (!option || props.disabled) return;\n props.onValueChange?.(option.value);\n props.onValueCommit?.(option.value);\n if (focus) queueMicrotask(() => group?.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]')[index]?.focus());\n };\n return (\n <Field\n meta={meta}\n labelFor={false}\n class={props.class}\n label={props.label}\n description={props.description}\n error={props.error}\n required={props.required}\n disabled={props.disabled}\n >\n <div\n class=\"k2b-choice-list\"\n ref={group}\n role=\"radiogroup\"\n aria-label={props.label ? undefined : props[\"aria-label\"]}\n aria-labelledby={props.label ? meta.labelId : undefined}\n aria-describedby={fieldDescribedBy(meta, props)}\n aria-disabled={props.disabled ? \"true\" : undefined}\n aria-busy={props.busy ? \"true\" : undefined}\n >\n {/* Rows stay by position, so options rebuilt with new objects keep their buttons and the focus on them. */}\n <Index each={props.options}>\n {(option, index) => {\n const checked = () => value() === option().value;\n const descriptionId = `${meta.controlId}-option-${index}`;\n return (\n <>\n <button\n type=\"button\"\n role=\"radio\"\n class=\"k2b-choice-list__option\"\n aria-checked={checked()}\n aria-describedby={option().description ? descriptionId : undefined}\n disabled={props.disabled}\n tabIndex={tabStop(option(), index) ? 0 : -1}\n onClick={() => choose(index)}\n onKeyDown={(event) => {\n const target = radioKeyTarget(event.key, index, props.options.length);\n if (target === undefined) return;\n event.preventDefault();\n choose(target, true);\n }}\n >\n <span class=\"k2b-choice-list__radio\" aria-hidden=\"true\" />\n <span class=\"k2b-choice-list__text\">\n <span class=\"k2b-choice-list__label\">\n {option().label}\n <Show when={option().marker}>{(marker) => <span class=\"k2b-choice-list__marker\">{marker()}</span>}</Show>\n {/* The spinner's place is always there, so a save starting or ending moves nothing. */}\n <span class=\"k2b-choice-list__busy\">\n <Show when={checked() && props.busy}>\n <i class=\"ti ti-loader-2 k2b-spin\" role=\"img\" aria-label={props.busyLabel} />\n </Show>\n </span>\n </span>\n <Show when={option().description}>\n <span class=\"k2b-choice-list__description\" id={descriptionId}>\n {option().description}\n </span>\n </Show>\n </span>\n </button>\n <Show when={checked() && props.details}>\n <div class=\"k2b-choice-list__details\">{props.details}</div>\n </Show>\n </>\n );\n }}\n </Index>\n </div>\n </Field>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,314 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { delegateEvents as _$delegateEvents } from "solid-js/web";
3
+ import { className as _$className } from "solid-js/web";
4
+ import { setStyleProperty as _$setStyleProperty } from "solid-js/web";
5
+ import { setProperty as _$setProperty } from "solid-js/web";
6
+ import { setAttribute as _$setAttribute } from "solid-js/web";
7
+ import { effect as _$effect } from "solid-js/web";
8
+ import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
9
+ import { use as _$use } from "solid-js/web";
10
+ import { getNextMarker as _$getNextMarker } from "solid-js/web";
11
+ import { insert as _$insert } from "solid-js/web";
12
+ import { createComponent as _$createComponent } from "solid-js/web";
13
+ import { getNextElement as _$getNextElement } from "solid-js/web";
14
+ var _tmpl$ = /*#__PURE__*/_$template(`<i class="ti ti-alert-triangle"aria-hidden=true>`),
15
+ _tmpl$2 = /*#__PURE__*/_$template(`<div class=k2b-choice-slider__track role=slider aria-valuemin=1><!$><!/><!$><!/><span class=k2b-choice-slider__thumb>`),
16
+ _tmpl$3 = /*#__PURE__*/_$template(`<div><p class=k2b-choice-slider__line aria-live=polite><!$><!/><span></span></p><!$><!/>`),
17
+ _tmpl$4 = /*#__PURE__*/_$template(`<span class=k2b-choice-slider__segment>`),
18
+ _tmpl$5 = /*#__PURE__*/_$template(`<span class=k2b-choice-slider__stop>`);
19
+ import { createEffect, createMemo, createSignal, For, on, Show } from "solid-js";
20
+ import { resolveMaybeAccessor } from "./field-contract";
21
+ const position = (index, count) => count < 2 ? 0 : index / (count - 1) * 100;
22
+
23
+ /**
24
+ * A slider over a few named stops. The fixed line above the track always shows
25
+ * the active stop's description, or why a stop cannot be chosen; its height
26
+ * never changes. Unavailable stops stay visible and are skipped.
27
+ */
28
+ export function ChoiceSlider(props) {
29
+ // The previewed stop by value, so a change of the options can never leave it pointing at another stop.
30
+ const [previewValue, setPreviewValue] = createSignal(null);
31
+ const [notice, setNotice] = createSignal(null);
32
+ let track;
33
+ let drag = null;
34
+ const count = () => props.options.length;
35
+ const chosen = createMemo(() => {
36
+ const value = resolveMaybeAccessor(props.value);
37
+ return value === null ? -1 : props.options.findIndex(option => option.value === value);
38
+ });
39
+ const preview = createMemo(() => {
40
+ const value = previewValue();
41
+ const index = value === null ? -1 : props.options.findIndex(option => option.value === value);
42
+ return index < 0 ? null : index;
43
+ });
44
+ const setPreview = index => setPreviewValue(index === null ? null : props.options[index]?.value ?? null);
45
+ const shown = () => preview() ?? chosen();
46
+ const option = () => props.options[shown()];
47
+ const available = index => props.options[index] !== undefined && !props.options[index]?.disabledReason;
48
+ const warning = () => notice() ?? (preview() === null ? option()?.disabledReason ?? null : null);
49
+ const line = () => warning() ?? option()?.description ?? (shown() < 0 ? props.description : undefined) ?? "";
50
+ createEffect(on(chosen, () => {
51
+ setPreview(null);
52
+ setNotice(null);
53
+ }));
54
+ // A drag ends without a choice when its stop disappears, becomes unavailable, or the slider is disabled.
55
+ createEffect(() => {
56
+ const index = preview();
57
+ if (previewValue() !== null && (index === null || !available(index) || props.disabled)) {
58
+ drag = null;
59
+ setPreviewValue(null);
60
+ }
61
+ });
62
+ createEffect(on(preview, index => props.onActiveChange?.(index === null ? null : props.options[index]?.value ?? null), {
63
+ defer: true
64
+ }));
65
+ const valueText = () => {
66
+ const current = option();
67
+ if (!current) return props.description ?? "";
68
+ return current.valueText ?? [current.label, warning() ?? current.description].filter(Boolean).join(", ");
69
+ };
70
+ const nearestAvailable = at => {
71
+ let best = null;
72
+ for (let index = 0; index < count(); index += 1) {
73
+ if (available(index) && (best === null || Math.abs(index - at) < Math.abs(best - at))) best = index;
74
+ }
75
+ return best;
76
+ };
77
+ const commit = index => {
78
+ const next = props.options[index];
79
+ setPreview(null);
80
+ if (next && !props.disabled && available(index) && index !== chosen()) props.onValueChange?.(next.value);
81
+ };
82
+ const step = direction => {
83
+ const from = shown() < 0 ? direction > 0 ? -1 : count() : shown();
84
+ for (let index = from + direction; index >= 0 && index < count(); index += direction) {
85
+ if (available(index)) {
86
+ setNotice(null);
87
+ commit(index);
88
+ return;
89
+ }
90
+ }
91
+ const neighbour = props.options[from + direction];
92
+ if (neighbour?.disabledReason) setNotice(neighbour.disabledReason);
93
+ };
94
+ const edge = end => {
95
+ const indexes = props.options.map((_, index) => index).filter(available);
96
+ const target = end ? indexes.at(-1) : indexes[0];
97
+ if (target !== undefined) {
98
+ setNotice(null);
99
+ commit(target);
100
+ }
101
+ };
102
+ const onKeyDown = event => {
103
+ if (props.disabled) return;
104
+ const keys = {
105
+ ArrowRight: () => step(1),
106
+ ArrowUp: () => step(1),
107
+ PageUp: () => step(1),
108
+ ArrowLeft: () => step(-1),
109
+ ArrowDown: () => step(-1),
110
+ PageDown: () => step(-1),
111
+ Home: () => edge(false),
112
+ End: () => edge(true)
113
+ };
114
+ const action = keys[event.key];
115
+ if (!action) return;
116
+ event.preventDefault();
117
+ action();
118
+ };
119
+ const at = clientX => {
120
+ const rect = track?.getBoundingClientRect();
121
+ if (!rect || rect.width === 0) return 0;
122
+ return Math.max(0, Math.min(1, (clientX - rect.left) / rect.width)) * (count() - 1);
123
+ };
124
+ const onPointerDown = event => {
125
+ // One pointer owns a drag; a second finger waits until it ends.
126
+ if (props.disabled || count() < 2 || event.button !== 0 || drag) return;
127
+ event.preventDefault();
128
+ track?.focus({
129
+ preventScroll: true
130
+ });
131
+ track?.setPointerCapture?.(event.pointerId);
132
+ const near = Math.round(at(event.clientX));
133
+ const pressed = props.options[near];
134
+ if (pressed?.disabledReason) {
135
+ drag = {
136
+ pointerId: event.pointerId,
137
+ blocked: near,
138
+ startX: event.clientX
139
+ };
140
+ setNotice(pressed.disabledReason);
141
+ return;
142
+ }
143
+ drag = {
144
+ pointerId: event.pointerId,
145
+ blocked: null,
146
+ startX: event.clientX
147
+ };
148
+ setNotice(null);
149
+ setPreview(nearestAvailable(at(event.clientX)));
150
+ };
151
+ const onPointerMove = event => {
152
+ if (!drag || drag.pointerId !== event.pointerId) return;
153
+ if (drag.blocked !== null && Math.abs(event.clientX - drag.startX) <= 2) return;
154
+ drag.blocked = null;
155
+ const next = nearestAvailable(at(event.clientX));
156
+ if (next !== null) {
157
+ setNotice(null);
158
+ setPreview(next);
159
+ }
160
+ };
161
+
162
+ /** Only a release chooses; a cancel or a lost capture puts the slider back on its value. */
163
+ const onPointerEnd = event => {
164
+ if (!drag || drag.pointerId !== event.pointerId) return;
165
+ drag = null;
166
+ const index = preview();
167
+ if (event.type !== "pointerup" || index === null) {
168
+ setPreview(null);
169
+ return;
170
+ }
171
+ commit(index);
172
+ };
173
+ return (() => {
174
+ var _el$ = _$getNextElement(_tmpl$3),
175
+ _el$2 = _el$.firstChild,
176
+ _el$5 = _el$2.firstChild,
177
+ [_el$6, _co$] = _$getNextMarker(_el$5.nextSibling),
178
+ _el$4 = _el$6.nextSibling,
179
+ _el$11 = _el$2.nextSibling,
180
+ [_el$12, _co$4] = _$getNextMarker(_el$11.nextSibling);
181
+ _$insert(_el$2, _$createComponent(Show, {
182
+ get when() {
183
+ return warning();
184
+ },
185
+ get children() {
186
+ return _$getNextElement(_tmpl$);
187
+ }
188
+ }), _el$6, _co$);
189
+ _$insert(_el$4, line);
190
+ _$insert(_el$, _$createComponent(Show, {
191
+ get when() {
192
+ return count() >= 2;
193
+ },
194
+ get children() {
195
+ var _el$7 = _$getNextElement(_tmpl$2),
196
+ _el$9 = _el$7.firstChild,
197
+ [_el$0, _co$2] = _$getNextMarker(_el$9.nextSibling),
198
+ _el$1 = _el$0.nextSibling,
199
+ [_el$10, _co$3] = _$getNextMarker(_el$1.nextSibling),
200
+ _el$8 = _el$10.nextSibling;
201
+ _el$7.addEventListener("lostpointercapture", onPointerEnd);
202
+ _el$7.addEventListener("pointercancel", onPointerEnd);
203
+ _el$7.$$pointerup = onPointerEnd;
204
+ _el$7.$$pointermove = onPointerMove;
205
+ _el$7.$$pointerdown = onPointerDown;
206
+ _el$7.$$keydown = onKeyDown;
207
+ var _ref$ = track;
208
+ typeof _ref$ === "function" ? _$use(_ref$, _el$7) : track = _el$7;
209
+ _$insert(_el$7, _$createComponent(For, {
210
+ get each() {
211
+ return props.options.slice(1);
212
+ },
213
+ children: (_, index) => (() => {
214
+ var _el$13 = _$getNextElement(_tmpl$4);
215
+ _$effect(_p$ => {
216
+ var _v$13 = shown() > index() ? "" : undefined,
217
+ _v$14 = `calc(${position(index(), count())}% + 8px)`,
218
+ _v$15 = `calc(${position(index() + 1, count()) - position(index(), count())}% - 16px)`;
219
+ _v$13 !== _p$.e && _$setAttribute(_el$13, "data-on", _p$.e = _v$13);
220
+ _v$14 !== _p$.t && _$setStyleProperty(_el$13, "left", _p$.t = _v$14);
221
+ _v$15 !== _p$.a && _$setStyleProperty(_el$13, "width", _p$.a = _v$15);
222
+ return _p$;
223
+ }, {
224
+ e: undefined,
225
+ t: undefined,
226
+ a: undefined
227
+ });
228
+ return _el$13;
229
+ })()
230
+ }), _el$0, _co$2);
231
+ _$insert(_el$7, _$createComponent(For, {
232
+ get each() {
233
+ return props.options;
234
+ },
235
+ children: (stop, index) => (() => {
236
+ var _el$14 = _$getNextElement(_tmpl$5);
237
+ _$effect(_p$ => {
238
+ var _v$16 = shown() > index() ? "" : undefined,
239
+ _v$17 = stop.disabledReason ? "" : undefined,
240
+ _v$18 = index() === shown() ? "" : undefined,
241
+ _v$19 = `${position(index(), count())}%`;
242
+ _v$16 !== _p$.e && _$setAttribute(_el$14, "data-on", _p$.e = _v$16);
243
+ _v$17 !== _p$.t && _$setAttribute(_el$14, "data-unavailable", _p$.t = _v$17);
244
+ _v$18 !== _p$.a && _$setAttribute(_el$14, "data-current", _p$.a = _v$18);
245
+ _v$19 !== _p$.o && _$setStyleProperty(_el$14, "left", _p$.o = _v$19);
246
+ return _p$;
247
+ }, {
248
+ e: undefined,
249
+ t: undefined,
250
+ a: undefined,
251
+ o: undefined
252
+ });
253
+ return _el$14;
254
+ })()
255
+ }), _el$10, _co$3);
256
+ _$effect(_p$ => {
257
+ var _v$ = props.id,
258
+ _v$2 = props.disabled ? -1 : 0,
259
+ _v$3 = props["aria-label"],
260
+ _v$4 = props["aria-labelledby"],
261
+ _v$5 = count(),
262
+ _v$6 = Math.max(0, shown()) + 1,
263
+ _v$7 = valueText(),
264
+ _v$8 = props.disabled ? "true" : undefined,
265
+ _v$9 = warning() && preview() === null && option()?.disabledReason ? "warning" : undefined,
266
+ _v$0 = shown() < 0,
267
+ _v$1 = `${position(Math.max(0, shown()), count())}%`;
268
+ _v$ !== _p$.e && _$setAttribute(_el$7, "id", _p$.e = _v$);
269
+ _v$2 !== _p$.t && _$setAttribute(_el$7, "tabindex", _p$.t = _v$2);
270
+ _v$3 !== _p$.a && _$setAttribute(_el$7, "aria-label", _p$.a = _v$3);
271
+ _v$4 !== _p$.o && _$setAttribute(_el$7, "aria-labelledby", _p$.o = _v$4);
272
+ _v$5 !== _p$.i && _$setAttribute(_el$7, "aria-valuemax", _p$.i = _v$5);
273
+ _v$6 !== _p$.n && _$setAttribute(_el$7, "aria-valuenow", _p$.n = _v$6);
274
+ _v$7 !== _p$.s && _$setAttribute(_el$7, "aria-valuetext", _p$.s = _v$7);
275
+ _v$8 !== _p$.h && _$setAttribute(_el$7, "aria-disabled", _p$.h = _v$8);
276
+ _v$9 !== _p$.r && _$setAttribute(_el$8, "data-tone", _p$.r = _v$9);
277
+ _v$0 !== _p$.d && _$setProperty(_el$8, "hidden", _p$.d = _v$0);
278
+ _v$1 !== _p$.l && _$setStyleProperty(_el$8, "left", _p$.l = _v$1);
279
+ return _p$;
280
+ }, {
281
+ e: undefined,
282
+ t: undefined,
283
+ a: undefined,
284
+ o: undefined,
285
+ i: undefined,
286
+ n: undefined,
287
+ s: undefined,
288
+ h: undefined,
289
+ r: undefined,
290
+ d: undefined,
291
+ l: undefined
292
+ });
293
+ _$runHydrationEvents();
294
+ return _el$7;
295
+ }
296
+ }), _el$12, _co$4);
297
+ _$effect(_p$ => {
298
+ var _v$10 = ["k2b-choice-slider", props.class].filter(Boolean).join(" "),
299
+ _v$11 = props.size ?? "md",
300
+ _v$12 = warning() ? "warning" : undefined;
301
+ _v$10 !== _p$.e && _$className(_el$, _p$.e = _v$10);
302
+ _v$11 !== _p$.t && _$setAttribute(_el$, "data-size", _p$.t = _v$11);
303
+ _v$12 !== _p$.a && _$setAttribute(_el$2, "data-tone", _p$.a = _v$12);
304
+ return _p$;
305
+ }, {
306
+ e: undefined,
307
+ t: undefined,
308
+ a: undefined
309
+ });
310
+ return _el$;
311
+ })();
312
+ }
313
+ _$delegateEvents(["keydown", "pointerdown", "pointermove", "pointerup"]);
314
+ //# sourceMappingURL=ChoiceSlider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["inputs/ChoiceSlider.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, For, type JSX, on, Show } from \"solid-js\";\nimport { type MaybeAccessor, resolveMaybeAccessor } from \"./field-contract\";\n\nexport type ChoiceSliderOption = {\n value: string;\n label: string;\n /** One short line shown below the label line while this stop is active. */\n description?: string;\n /** Makes the stop unavailable. The text replaces the description when someone reaches the stop. */\n disabledReason?: string;\n /** Spoken value; defaults to the label and the description or reason. */\n valueText?: string;\n};\n\nexport type ChoiceSliderProps = {\n options: readonly ChoiceSliderOption[];\n /** The chosen stop. `null` shows no thumb, for a choice that is none of the stops. */\n value: MaybeAccessor<string | null>;\n /** A person released the thumb on a stop or moved to one with the keyboard. */\n onValueChange?: (value: string) => void;\n /** The stop the slider shows while someone drags or arrows through it; `null` when it shows `value` again. */\n onActiveChange?: (value: string | null) => void;\n /** Line text while no stop is chosen. */\n description?: string;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n id?: string;\n class?: string;\n disabled?: boolean;\n /** `lg` gives a 44 px track and a 28 px thumb for touch sheets. */\n size?: \"md\" | \"lg\";\n};\n\nconst position = (index: number, count: number) => (count < 2 ? 0 : (index / (count - 1)) * 100);\n\n/**\n * A slider over a few named stops. The fixed line above the track always shows\n * the active stop's description, or why a stop cannot be chosen; its height\n * never changes. Unavailable stops stay visible and are skipped.\n */\nexport function ChoiceSlider(props: ChoiceSliderProps): JSX.Element {\n // The previewed stop by value, so a change of the options can never leave it pointing at another stop.\n const [previewValue, setPreviewValue] = createSignal<string | null>(null);\n const [notice, setNotice] = createSignal<string | null>(null);\n let track: HTMLDivElement | undefined;\n let drag: { pointerId: number; blocked: number | null; startX: number } | null = null;\n\n const count = () => props.options.length;\n const chosen = createMemo(() => {\n const value = resolveMaybeAccessor(props.value);\n return value === null ? -1 : props.options.findIndex((option) => option.value === value);\n });\n const preview = createMemo(() => {\n const value = previewValue();\n const index = value === null ? -1 : props.options.findIndex((option) => option.value === value);\n return index < 0 ? null : index;\n });\n const setPreview = (index: number | null) => setPreviewValue(index === null ? null : (props.options[index]?.value ?? null));\n const shown = () => preview() ?? chosen();\n const option = () => props.options[shown()];\n const available = (index: number) => props.options[index] !== undefined && !props.options[index]?.disabledReason;\n const warning = () => notice() ?? (preview() === null ? (option()?.disabledReason ?? null) : null);\n const line = () => warning() ?? option()?.description ?? (shown() < 0 ? props.description : undefined) ?? \"\";\n\n createEffect(\n on(chosen, () => {\n setPreview(null);\n setNotice(null);\n }),\n );\n // A drag ends without a choice when its stop disappears, becomes unavailable, or the slider is disabled.\n createEffect(() => {\n const index = preview();\n if (previewValue() !== null && (index === null || !available(index) || props.disabled)) {\n drag = null;\n setPreviewValue(null);\n }\n });\n createEffect(\n on(preview, (index) => props.onActiveChange?.(index === null ? null : (props.options[index]?.value ?? null)), { defer: true }),\n );\n\n const valueText = () => {\n const current = option();\n if (!current) return props.description ?? \"\";\n return current.valueText ?? [current.label, warning() ?? current.description].filter(Boolean).join(\", \");\n };\n\n const nearestAvailable = (at: number) => {\n let best: number | null = null;\n for (let index = 0; index < count(); index += 1) {\n if (available(index) && (best === null || Math.abs(index - at) < Math.abs(best - at))) best = index;\n }\n return best;\n };\n\n const commit = (index: number) => {\n const next = props.options[index];\n setPreview(null);\n if (next && !props.disabled && available(index) && index !== chosen()) props.onValueChange?.(next.value);\n };\n\n const step = (direction: 1 | -1) => {\n const from = shown() < 0 ? (direction > 0 ? -1 : count()) : shown();\n for (let index = from + direction; index >= 0 && index < count(); index += direction) {\n if (available(index)) {\n setNotice(null);\n commit(index);\n return;\n }\n }\n const neighbour = props.options[from + direction];\n if (neighbour?.disabledReason) setNotice(neighbour.disabledReason);\n };\n\n const edge = (end: boolean) => {\n const indexes = props.options.map((_, index) => index).filter(available);\n const target = end ? indexes.at(-1) : indexes[0];\n if (target !== undefined) {\n setNotice(null);\n commit(target);\n }\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (props.disabled) return;\n const keys: Record<string, () => void> = {\n ArrowRight: () => step(1),\n ArrowUp: () => step(1),\n PageUp: () => step(1),\n ArrowLeft: () => step(-1),\n ArrowDown: () => step(-1),\n PageDown: () => step(-1),\n Home: () => edge(false),\n End: () => edge(true),\n };\n const action = keys[event.key];\n if (!action) return;\n event.preventDefault();\n action();\n };\n\n const at = (clientX: number) => {\n const rect = track?.getBoundingClientRect();\n if (!rect || rect.width === 0) return 0;\n return Math.max(0, Math.min(1, (clientX - rect.left) / rect.width)) * (count() - 1);\n };\n\n const onPointerDown = (event: PointerEvent) => {\n // One pointer owns a drag; a second finger waits until it ends.\n if (props.disabled || count() < 2 || event.button !== 0 || drag) return;\n event.preventDefault();\n track?.focus({ preventScroll: true });\n track?.setPointerCapture?.(event.pointerId);\n const near = Math.round(at(event.clientX));\n const pressed = props.options[near];\n if (pressed?.disabledReason) {\n drag = { pointerId: event.pointerId, blocked: near, startX: event.clientX };\n setNotice(pressed.disabledReason);\n return;\n }\n drag = { pointerId: event.pointerId, blocked: null, startX: event.clientX };\n setNotice(null);\n setPreview(nearestAvailable(at(event.clientX)));\n };\n\n const onPointerMove = (event: PointerEvent) => {\n if (!drag || drag.pointerId !== event.pointerId) return;\n if (drag.blocked !== null && Math.abs(event.clientX - drag.startX) <= 2) return;\n drag.blocked = null;\n const next = nearestAvailable(at(event.clientX));\n if (next !== null) {\n setNotice(null);\n setPreview(next);\n }\n };\n\n /** Only a release chooses; a cancel or a lost capture puts the slider back on its value. */\n const onPointerEnd = (event: PointerEvent) => {\n if (!drag || drag.pointerId !== event.pointerId) return;\n drag = null;\n const index = preview();\n if (event.type !== \"pointerup\" || index === null) {\n setPreview(null);\n return;\n }\n commit(index);\n };\n\n return (\n <div class={[\"k2b-choice-slider\", props.class].filter(Boolean).join(\" \")} data-size={props.size ?? \"md\"}>\n <p class=\"k2b-choice-slider__line\" data-tone={warning() ? \"warning\" : undefined} aria-live=\"polite\">\n <Show when={warning()}>\n <i class=\"ti ti-alert-triangle\" aria-hidden=\"true\" />\n </Show>\n <span>{line()}</span>\n </p>\n <Show when={count() >= 2}>\n <div\n ref={track}\n id={props.id}\n class=\"k2b-choice-slider__track\"\n role=\"slider\"\n tabIndex={props.disabled ? -1 : 0}\n aria-label={props[\"aria-label\"]}\n aria-labelledby={props[\"aria-labelledby\"]}\n aria-valuemin={1}\n aria-valuemax={count()}\n aria-valuenow={Math.max(0, shown()) + 1}\n aria-valuetext={valueText()}\n aria-disabled={props.disabled ? \"true\" : undefined}\n onKeyDown={onKeyDown}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerEnd}\n onPointerCancel={onPointerEnd}\n onLostPointerCapture={onPointerEnd}\n >\n <For each={props.options.slice(1)}>\n {(_, index) => (\n <span\n class=\"k2b-choice-slider__segment\"\n data-on={shown() > index() ? \"\" : undefined}\n style={{\n left: `calc(${position(index(), count())}% + 8px)`,\n width: `calc(${position(index() + 1, count()) - position(index(), count())}% - 16px)`,\n }}\n />\n )}\n </For>\n <For each={props.options}>\n {(stop, index) => (\n <span\n class=\"k2b-choice-slider__stop\"\n data-on={shown() > index() ? \"\" : undefined}\n data-unavailable={stop.disabledReason ? \"\" : undefined}\n data-current={index() === shown() ? \"\" : undefined}\n style={{ left: `${position(index(), count())}%` }}\n />\n )}\n </For>\n <span\n class=\"k2b-choice-slider__thumb\"\n data-tone={warning() && preview() === null && option()?.disabledReason ? \"warning\" : undefined}\n hidden={shown() < 0}\n style={{ left: `${position(Math.max(0, shown()), count())}%` }}\n />\n </div>\n </Show>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}