@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.
- package/dist/base.css +14 -1
- package/dist/browser/actions/ContextMenu.js +13 -0
- package/dist/browser/actions/ContextMenu.js.map +1 -1
- package/dist/browser/actions/Dropdown.js +173 -102
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/FilterChip.js +113 -56
- package/dist/browser/actions/FilterChip.js.map +1 -1
- package/dist/browser/actions/SelectionToolbar.js +129 -0
- package/dist/browser/actions/SelectionToolbar.js.map +1 -0
- package/dist/browser/actions/filter-messages.js +26 -2
- package/dist/browser/actions/filter-messages.js.map +1 -1
- package/dist/browser/actions/index.js +1 -0
- package/dist/browser/actions/index.js.map +1 -1
- package/dist/browser/actions/menu-rows.js +23 -3
- package/dist/browser/actions/menu-rows.js.map +1 -1
- package/dist/browser/actions/menu-sheet.js +2 -7
- package/dist/browser/actions/menu-sheet.js.map +1 -1
- package/dist/browser/charts.js +6 -0
- package/dist/browser/charts.js.map +1 -0
- package/dist/browser/chat/ChatComposer.js +616 -421
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/chat/chat-messages.js +18 -0
- package/dist/browser/chat/chat-messages.js.map +1 -1
- package/dist/browser/chat/composer-document.js +19 -0
- package/dist/browser/chat/composer-document.js.map +1 -1
- package/dist/browser/chat/index.js.map +1 -1
- package/dist/browser/content/Calendar.js +39 -29
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/CalendarDayView.js +159 -165
- package/dist/browser/content/CalendarDayView.js.map +1 -1
- package/dist/browser/content/Chart.js +8 -0
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/FileGrid.js +231 -9
- package/dist/browser/content/FileGrid.js.map +1 -1
- package/dist/browser/content/FileTypeIcon.js +15 -0
- package/dist/browser/content/FileTypeIcon.js.map +1 -1
- package/dist/browser/content/FileView.js +11 -4
- package/dist/browser/content/FileView.js.map +1 -1
- package/dist/browser/content/MessageRow.js +627 -343
- package/dist/browser/content/MessageRow.js.map +1 -1
- package/dist/browser/content/ReactionBar.js +20 -1
- package/dist/browser/content/ReactionBar.js.map +1 -1
- package/dist/browser/content/calendar-day-scroll.js +4 -3
- package/dist/browser/content/calendar-day-scroll.js.map +1 -1
- package/dist/browser/content/chart-bar.js +476 -0
- package/dist/browser/content/chart-bar.js.map +1 -0
- package/dist/browser/content/file-list-messages.js +52 -0
- package/dist/browser/content/file-list-messages.js.map +1 -0
- package/dist/browser/content/index.js +2 -2
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/feedback/Tooltip.js +31 -14
- package/dist/browser/feedback/Tooltip.js.map +1 -1
- package/dist/browser/feedback/dialog-core.js +6 -0
- package/dist/browser/feedback/dialog-core.js.map +1 -1
- package/dist/browser/inputs/ChoiceList.js +178 -0
- package/dist/browser/inputs/ChoiceList.js.map +1 -0
- package/dist/browser/inputs/ChoiceSlider.js +314 -0
- package/dist/browser/inputs/ChoiceSlider.js.map +1 -0
- package/dist/browser/inputs/ChoiceTiles.js +135 -0
- package/dist/browser/inputs/ChoiceTiles.js.map +1 -0
- package/dist/browser/inputs/ColorChoices.js +120 -0
- package/dist/browser/inputs/ColorChoices.js.map +1 -0
- package/dist/browser/inputs/QrScanner.js +95 -13
- package/dist/browser/inputs/QrScanner.js.map +1 -1
- package/dist/browser/inputs/TextInput.js +19 -14
- package/dist/browser/inputs/TextInput.js.map +1 -1
- package/dist/browser/inputs/index.js +4 -0
- package/dist/browser/inputs/index.js.map +1 -1
- package/dist/browser/inputs/qr-messages.js +2 -0
- package/dist/browser/inputs/qr-messages.js.map +1 -1
- package/dist/browser/internal/radio-keys.js +13 -0
- package/dist/browser/internal/radio-keys.js.map +1 -0
- package/dist/browser/intl/shortcut-messages.js +4 -0
- package/dist/browser/intl/shortcut-messages.js.map +1 -1
- package/dist/browser/intl/shortcut.js +4 -0
- package/dist/browser/intl/shortcut.js.map +1 -1
- package/dist/browser/layout/AnchoredPopover.js +180 -0
- package/dist/browser/layout/AnchoredPopover.js.map +1 -0
- package/dist/browser/layout/AppWorkspace.js +684 -532
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/DetailPanel.js +443 -333
- package/dist/browser/layout/DetailPanel.js.map +1 -1
- package/dist/browser/layout/MobileShell.js +231 -42
- package/dist/browser/layout/MobileShell.js.map +1 -1
- package/dist/browser/layout/Settings.js +283 -175
- package/dist/browser/layout/Settings.js.map +1 -1
- package/dist/browser/layout/SidebarRailHint.js +79 -0
- package/dist/browser/layout/SidebarRailHint.js.map +1 -0
- package/dist/browser/layout/SidebarSwitcher.js +79 -66
- package/dist/browser/layout/SidebarSwitcher.js.map +1 -1
- package/dist/browser/layout/TabBar.js +18 -4
- package/dist/browser/layout/TabBar.js.map +1 -1
- package/dist/browser/layout/app-workspace-controller.js +11 -4
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/detail-panel-messages.js +4 -2
- package/dist/browser/layout/detail-panel-messages.js.map +1 -1
- package/dist/browser/layout/index.js +3 -1
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/layout/scroll-fade.js +32 -5
- package/dist/browser/layout/scroll-fade.js.map +1 -1
- package/dist/browser/layout/settings-messages.js +26 -2
- package/dist/browser/layout/settings-messages.js.map +1 -1
- package/dist/browser/surfaces/Avatar.js +2 -14
- package/dist/browser/surfaces/Avatar.js.map +1 -1
- package/dist/browser/surfaces/DotStrip.js +70 -0
- package/dist/browser/surfaces/DotStrip.js.map +1 -0
- package/dist/browser/surfaces/NoticeCard.js +46 -30
- package/dist/browser/surfaces/NoticeCard.js.map +1 -1
- package/dist/browser/surfaces/ProgressRing.js +3 -0
- package/dist/browser/surfaces/ProgressRing.js.map +1 -1
- package/dist/browser/surfaces/ResourceCard.js +125 -68
- package/dist/browser/surfaces/ResourceCard.js.map +1 -1
- package/dist/browser/surfaces/index.js +2 -0
- package/dist/browser/surfaces/index.js.map +1 -1
- package/dist/browser/surfaces/person-color.js +18 -0
- package/dist/browser/surfaces/person-color.js.map +1 -0
- package/dist/browser/surfaces/resource-messages.js +8 -4
- package/dist/browser/surfaces/resource-messages.js.map +1 -1
- package/dist/browser/widgets/Widget.js +3 -2
- package/dist/browser/widgets/Widget.js.map +1 -1
- package/dist/ssr/actions/ContextMenu.js +9 -0
- package/dist/ssr/actions/ContextMenu.js.map +1 -1
- package/dist/ssr/actions/Dropdown.js +65 -31
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/FilterChip.js +67 -16
- package/dist/ssr/actions/FilterChip.js.map +1 -1
- package/dist/ssr/actions/SelectionToolbar.js +104 -0
- package/dist/ssr/actions/SelectionToolbar.js.map +1 -0
- package/dist/ssr/actions/filter-messages.js +26 -2
- package/dist/ssr/actions/filter-messages.js.map +1 -1
- package/dist/ssr/actions/index.js +1 -0
- package/dist/ssr/actions/index.js.map +1 -1
- package/dist/ssr/actions/menu-rows.js +23 -3
- package/dist/ssr/actions/menu-rows.js.map +1 -1
- package/dist/ssr/actions/menu-sheet.js +2 -7
- package/dist/ssr/actions/menu-sheet.js.map +1 -1
- package/dist/ssr/charts.js +6 -0
- package/dist/ssr/charts.js.map +1 -0
- package/dist/ssr/chat/ChatComposer.js +184 -76
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/chat/chat-messages.js +18 -0
- package/dist/ssr/chat/chat-messages.js.map +1 -1
- package/dist/ssr/chat/composer-document.js +19 -0
- package/dist/ssr/chat/composer-document.js.map +1 -1
- package/dist/ssr/chat/index.js.map +1 -1
- package/dist/ssr/content/Calendar.js +40 -31
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/CalendarDayView.js +40 -48
- package/dist/ssr/content/CalendarDayView.js.map +1 -1
- package/dist/ssr/content/Chart.js +8 -0
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/FileGrid.js +132 -5
- package/dist/ssr/content/FileGrid.js.map +1 -1
- package/dist/ssr/content/FileTypeIcon.js +15 -0
- package/dist/ssr/content/FileTypeIcon.js.map +1 -1
- package/dist/ssr/content/FileView.js +11 -4
- package/dist/ssr/content/FileView.js.map +1 -1
- package/dist/ssr/content/MessageRow.js +274 -91
- package/dist/ssr/content/MessageRow.js.map +1 -1
- package/dist/ssr/content/ReactionBar.js +20 -1
- package/dist/ssr/content/ReactionBar.js.map +1 -1
- package/dist/ssr/content/calendar-day-scroll.js +4 -3
- package/dist/ssr/content/calendar-day-scroll.js.map +1 -1
- package/dist/ssr/content/chart-bar.js +476 -0
- package/dist/ssr/content/chart-bar.js.map +1 -0
- package/dist/ssr/content/file-list-messages.js +52 -0
- package/dist/ssr/content/file-list-messages.js.map +1 -0
- package/dist/ssr/content/index.js +2 -2
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/feedback/Tooltip.js +31 -14
- package/dist/ssr/feedback/Tooltip.js.map +1 -1
- package/dist/ssr/feedback/dialog-core.js +6 -0
- package/dist/ssr/feedback/dialog-core.js.map +1 -1
- package/dist/ssr/inputs/ChoiceList.js +95 -0
- package/dist/ssr/inputs/ChoiceList.js.map +1 -0
- package/dist/ssr/inputs/ChoiceSlider.js +191 -0
- package/dist/ssr/inputs/ChoiceSlider.js.map +1 -0
- package/dist/ssr/inputs/ChoiceTiles.js +61 -0
- package/dist/ssr/inputs/ChoiceTiles.js.map +1 -0
- package/dist/ssr/inputs/ColorChoices.js +60 -0
- package/dist/ssr/inputs/ColorChoices.js.map +1 -0
- package/dist/ssr/inputs/QrScanner.js +89 -10
- package/dist/ssr/inputs/QrScanner.js.map +1 -1
- package/dist/ssr/inputs/TextInput.js +17 -2
- package/dist/ssr/inputs/TextInput.js.map +1 -1
- package/dist/ssr/inputs/index.js +4 -0
- package/dist/ssr/inputs/index.js.map +1 -1
- package/dist/ssr/inputs/qr-messages.js +2 -0
- package/dist/ssr/inputs/qr-messages.js.map +1 -1
- package/dist/ssr/internal/radio-keys.js +13 -0
- package/dist/ssr/internal/radio-keys.js.map +1 -0
- package/dist/ssr/intl/shortcut-messages.js +4 -0
- package/dist/ssr/intl/shortcut-messages.js.map +1 -1
- package/dist/ssr/intl/shortcut.js +4 -0
- package/dist/ssr/intl/shortcut.js.map +1 -1
- package/dist/ssr/layout/AnchoredPopover.js +142 -0
- package/dist/ssr/layout/AnchoredPopover.js.map +1 -0
- package/dist/ssr/layout/AppWorkspace.js +287 -141
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/DetailPanel.js +181 -108
- package/dist/ssr/layout/DetailPanel.js.map +1 -1
- package/dist/ssr/layout/MobileShell.js +118 -24
- package/dist/ssr/layout/MobileShell.js.map +1 -1
- package/dist/ssr/layout/Settings.js +122 -45
- package/dist/ssr/layout/Settings.js.map +1 -1
- package/dist/ssr/layout/SidebarRailHint.js +79 -0
- package/dist/ssr/layout/SidebarRailHint.js.map +1 -0
- package/dist/ssr/layout/SidebarSwitcher.js +13 -3
- package/dist/ssr/layout/SidebarSwitcher.js.map +1 -1
- package/dist/ssr/layout/TabBar.js +11 -3
- package/dist/ssr/layout/TabBar.js.map +1 -1
- package/dist/ssr/layout/app-workspace-controller.js +11 -4
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/detail-panel-messages.js +4 -2
- package/dist/ssr/layout/detail-panel-messages.js.map +1 -1
- package/dist/ssr/layout/index.js +3 -1
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/layout/scroll-fade.js +32 -5
- package/dist/ssr/layout/scroll-fade.js.map +1 -1
- package/dist/ssr/layout/settings-messages.js +26 -2
- package/dist/ssr/layout/settings-messages.js.map +1 -1
- package/dist/ssr/surfaces/Avatar.js +2 -14
- package/dist/ssr/surfaces/Avatar.js.map +1 -1
- package/dist/ssr/surfaces/DotStrip.js +31 -0
- package/dist/ssr/surfaces/DotStrip.js.map +1 -0
- package/dist/ssr/surfaces/NoticeCard.js +21 -12
- package/dist/ssr/surfaces/NoticeCard.js.map +1 -1
- package/dist/ssr/surfaces/ProgressRing.js +3 -0
- package/dist/ssr/surfaces/ProgressRing.js.map +1 -1
- package/dist/ssr/surfaces/ResourceCard.js +40 -15
- package/dist/ssr/surfaces/ResourceCard.js.map +1 -1
- package/dist/ssr/surfaces/index.js +2 -0
- package/dist/ssr/surfaces/index.js.map +1 -1
- package/dist/ssr/surfaces/person-color.js +18 -0
- package/dist/ssr/surfaces/person-color.js.map +1 -0
- package/dist/ssr/surfaces/resource-messages.js +8 -4
- package/dist/ssr/surfaces/resource-messages.js.map +1 -1
- package/dist/ssr/widgets/Widget.js +3 -2
- package/dist/ssr/widgets/Widget.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/ContextMenu.d.ts +5 -0
- package/dist/types/actions/Dropdown.d.ts +19 -0
- package/dist/types/actions/FilterChip.d.ts +11 -0
- package/dist/types/actions/SelectionToolbar.d.ts +38 -0
- package/dist/types/actions/filter-messages.d.ts +12 -0
- package/dist/types/actions/index.d.ts +2 -0
- package/dist/types/actions/menu-rows.d.ts +7 -2
- package/dist/types/charts.d.ts +5 -0
- package/dist/types/chat/ChatComposer.d.ts +28 -0
- package/dist/types/chat/chat-messages.d.ts +9 -0
- package/dist/types/chat/composer-document.d.ts +5 -0
- package/dist/types/chat/index.d.ts +1 -1
- package/dist/types/content/Calendar.d.ts +7 -0
- package/dist/types/content/Chart.d.ts +2 -1
- package/dist/types/content/FileGrid.d.ts +43 -3
- package/dist/types/content/FileTypeIcon.d.ts +10 -0
- package/dist/types/content/FileView.d.ts +5 -1
- package/dist/types/content/MessageRow.d.ts +66 -2
- package/dist/types/content/calendar-day-scroll.d.ts +2 -1
- package/dist/types/content/chart-bar.d.ts +60 -0
- package/dist/types/content/file-list-messages.d.ts +24 -0
- package/dist/types/content/index.d.ts +4 -4
- package/dist/types/feedback/Tooltip.d.ts +8 -2
- package/dist/types/feedback/dialog-core.d.ts +3 -0
- package/dist/types/inputs/ChoiceList.d.ts +28 -0
- package/dist/types/inputs/ChoiceSlider.d.ts +36 -0
- package/dist/types/inputs/ChoiceTiles.d.ts +25 -0
- package/dist/types/inputs/ColorChoices.d.ts +19 -0
- package/dist/types/inputs/index.d.ts +8 -0
- package/dist/types/inputs/qr-messages.d.ts +1 -0
- package/dist/types/internal/radio-keys.d.ts +5 -0
- package/dist/types/intl/shortcut-messages.d.ts +2 -0
- package/dist/types/layout/AnchoredPopover.d.ts +31 -0
- package/dist/types/layout/AppWorkspace.d.ts +12 -0
- package/dist/types/layout/DetailPanel.d.ts +17 -0
- package/dist/types/layout/MobileShell.d.ts +55 -5
- package/dist/types/layout/Settings.d.ts +22 -0
- package/dist/types/layout/SidebarRailHint.d.ts +26 -0
- package/dist/types/layout/TabBar.d.ts +5 -0
- package/dist/types/layout/detail-panel-messages.d.ts +1 -0
- package/dist/types/layout/index.d.ts +5 -3
- package/dist/types/layout/scroll-fade.d.ts +5 -0
- package/dist/types/layout/settings-messages.d.ts +12 -0
- package/dist/types/surfaces/DotStrip.d.ts +22 -0
- package/dist/types/surfaces/NoticeCard.d.ts +3 -0
- package/dist/types/surfaces/ProgressRing.d.ts +2 -1
- package/dist/types/surfaces/ResourceCard.d.ts +9 -0
- package/dist/types/surfaces/index.d.ts +4 -1
- package/dist/types/surfaces/person-color.d.ts +10 -0
- package/dist/types/surfaces/resource-messages.d.ts +2 -0
- package/dist/types/widgets/Widget.d.ts +3 -2
- 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":[]}
|