@k2b/ui 0.33.0 → 0.35.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 +16 -4
- package/dist/browser/actions/Dropdown.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/index.js +1 -0
- package/dist/browser/actions/index.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 +525 -407
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/chat/chat-messages.js +4 -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/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/MatchText.js +61 -0
- package/dist/browser/content/MatchText.js.map +1 -0
- package/dist/browser/content/MessageRow.js +73 -53
- package/dist/browser/content/MessageRow.js.map +1 -1
- package/dist/browser/content/ReactionBar.js +3 -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 -1
- 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/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 +15 -13
- 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/layout/AnchoredPopover.js +180 -0
- package/dist/browser/layout/AnchoredPopover.js.map +1 -0
- package/dist/browser/layout/AppWorkspace.js +155 -20
- 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 +21 -7
- 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 +2 -1
- package/dist/browser/layout/index.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/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 +6 -2
- package/dist/browser/surfaces/resource-messages.js.map +1 -1
- package/dist/browser/text-editor/TextEditor.js +1358 -0
- package/dist/browser/text-editor/TextEditor.js.map +1 -0
- package/dist/browser/text-editor/clipboard-html.js +152 -0
- package/dist/browser/text-editor/clipboard-html.js.map +1 -0
- package/dist/browser/text-editor/clipboard-loading.js +68 -0
- package/dist/browser/text-editor/clipboard-loading.js.map +1 -0
- package/dist/browser/text-editor/clipboard.js +51 -0
- package/dist/browser/text-editor/clipboard.js.map +1 -0
- package/dist/browser/text-editor/engine.js +125 -0
- package/dist/browser/text-editor/engine.js.map +1 -0
- package/dist/browser/text-editor/format.js +218 -0
- package/dist/browser/text-editor/format.js.map +1 -0
- package/dist/browser/text-editor/formatted.js +164 -0
- package/dist/browser/text-editor/formatted.js.map +1 -0
- package/dist/browser/text-editor/language.js +19 -0
- package/dist/browser/text-editor/language.js.map +1 -0
- package/dist/browser/text-editor/markdown-table.js +563 -0
- package/dist/browser/text-editor/markdown-table.js.map +1 -0
- package/dist/browser/text-editor/messages.js +233 -0
- package/dist/browser/text-editor/messages.js.map +1 -0
- package/dist/browser/text-editor/paste.js +115 -0
- package/dist/browser/text-editor/paste.js.map +1 -0
- package/dist/browser/text-editor/table.js +1760 -0
- package/dist/browser/text-editor/table.js.map +1 -0
- package/dist/browser/text-editor.js +5 -0
- package/dist/browser/text-editor.js.map +1 -0
- 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 +15 -4
- package/dist/ssr/actions/Dropdown.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/index.js +1 -0
- package/dist/ssr/actions/index.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 +132 -53
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/chat/chat-messages.js +4 -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/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/MatchText.js +56 -0
- package/dist/ssr/content/MatchText.js.map +1 -0
- package/dist/ssr/content/MessageRow.js +16 -6
- package/dist/ssr/content/MessageRow.js.map +1 -1
- package/dist/ssr/content/ReactionBar.js +3 -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 -1
- 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/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 +13 -1
- 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/layout/AnchoredPopover.js +142 -0
- package/dist/ssr/layout/AnchoredPopover.js.map +1 -0
- package/dist/ssr/layout/AppWorkspace.js +154 -20
- 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 +20 -6
- 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 +2 -1
- package/dist/ssr/layout/index.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/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 +6 -2
- package/dist/ssr/surfaces/resource-messages.js.map +1 -1
- package/dist/ssr/text-editor/TextEditor.js +1155 -0
- package/dist/ssr/text-editor/TextEditor.js.map +1 -0
- package/dist/ssr/text-editor/clipboard-html.js +152 -0
- package/dist/ssr/text-editor/clipboard-html.js.map +1 -0
- package/dist/ssr/text-editor/clipboard-loading.js +68 -0
- package/dist/ssr/text-editor/clipboard-loading.js.map +1 -0
- package/dist/ssr/text-editor/clipboard.js +51 -0
- package/dist/ssr/text-editor/clipboard.js.map +1 -0
- package/dist/ssr/text-editor/engine.js +125 -0
- package/dist/ssr/text-editor/engine.js.map +1 -0
- package/dist/ssr/text-editor/format.js +218 -0
- package/dist/ssr/text-editor/format.js.map +1 -0
- package/dist/ssr/text-editor/formatted.js +164 -0
- package/dist/ssr/text-editor/formatted.js.map +1 -0
- package/dist/ssr/text-editor/language.js +19 -0
- package/dist/ssr/text-editor/language.js.map +1 -0
- package/dist/ssr/text-editor/markdown-table.js +563 -0
- package/dist/ssr/text-editor/markdown-table.js.map +1 -0
- package/dist/ssr/text-editor/messages.js +233 -0
- package/dist/ssr/text-editor/messages.js.map +1 -0
- package/dist/ssr/text-editor/paste.js +115 -0
- package/dist/ssr/text-editor/paste.js.map +1 -0
- package/dist/ssr/text-editor/table.js +1760 -0
- package/dist/ssr/text-editor/table.js.map +1 -0
- package/dist/ssr/text-editor.js +5 -0
- package/dist/ssr/text-editor.js.map +1 -0
- 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 +7 -0
- package/dist/types/actions/SelectionToolbar.d.ts +38 -0
- package/dist/types/actions/index.d.ts +2 -0
- package/dist/types/charts.d.ts +5 -0
- package/dist/types/chat/ChatComposer.d.ts +15 -0
- package/dist/types/chat/chat-messages.d.ts +2 -0
- package/dist/types/chat/composer-document.d.ts +5 -0
- package/dist/types/chat/index.d.ts +1 -1
- 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/MatchText.d.ts +21 -0
- package/dist/types/content/MessageRow.d.ts +2 -0
- 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 +3 -2
- package/dist/types/feedback/Tooltip.d.ts +8 -2
- 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/layout/AnchoredPopover.d.ts +31 -0
- package/dist/types/layout/AppWorkspace.d.ts +10 -0
- package/dist/types/layout/DetailPanel.d.ts +17 -0
- package/dist/types/layout/MobileShell.d.ts +5 -2
- 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 +3 -2
- package/dist/types/layout/settings-messages.d.ts +12 -0
- package/dist/types/surfaces/DotStrip.d.ts +22 -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/text-editor/TextEditor.d.ts +69 -0
- package/dist/types/text-editor/clipboard-html.d.ts +9 -0
- package/dist/types/text-editor/clipboard-loading.d.ts +8 -0
- package/dist/types/text-editor/clipboard.d.ts +20 -0
- package/dist/types/text-editor/engine.d.ts +34 -0
- package/dist/types/text-editor/format.d.ts +34 -0
- package/dist/types/text-editor/formatted.d.ts +1 -0
- package/dist/types/text-editor/language.d.ts +8 -0
- package/dist/types/text-editor/markdown-table.d.ts +105 -0
- package/dist/types/text-editor/messages.d.ts +113 -0
- package/dist/types/text-editor/paste.d.ts +6 -0
- package/dist/types/text-editor/table.d.ts +81 -0
- package/dist/types/text-editor.d.ts +4 -0
- package/dist/types/widgets/Widget.d.ts +3 -2
- package/package.json +28 -3
|
@@ -15,7 +15,7 @@ export { DocCode, DocConceptGrid, DocInlineCode, DocLead, DocNote, DocPage, DocR
|
|
|
15
15
|
export { FileBrowserPanel, openFileBrowser } from "./FileBrowser";
|
|
16
16
|
export { FileGrid } from "./FileGrid";
|
|
17
17
|
export { default as FileTree } from "./FileTree";
|
|
18
|
-
export { FileTypeIcon, fileTypeOf } from "./FileTypeIcon";
|
|
18
|
+
export { FileTypeIcon, fileKindLabel, fileTypeOf } from "./FileTypeIcon";
|
|
19
19
|
export { canPreviewFile, default as FileView, formatFileViewSize, getFileViewPreviewKind } from "./FileView";
|
|
20
20
|
export { Kbd } from "./Kbd";
|
|
21
21
|
export { LabelChip } from "./LabelChip";
|
|
@@ -25,6 +25,7 @@ export { MapAttribution } from "./MapAttribution";
|
|
|
25
25
|
export { MapView } from "./MapView";
|
|
26
26
|
export { MapViewFrame } from "./MapViewFrame";
|
|
27
27
|
export { default as MarkdownView, renderSafeMarkdown } from "./MarkdownView";
|
|
28
|
+
export { MatchText, matchParts } from "./MatchText";
|
|
28
29
|
export { MessageEventGroup, MessageEventRow, MessageRow, MessageSystemRow, startsMessageGroup } from "./MessageRow";
|
|
29
30
|
export { mapPalette } from "./map-palette";
|
|
30
31
|
export { mapAttribution, mapStyle } from "./map-style";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["content/index.ts"],"sourcesContent":["export type {\n CalendarAttendee,\n CalendarCommand,\n CalendarController,\n CalendarCustomView,\n CalendarDayBadge,\n CalendarEvent,\n CalendarEventColor,\n CalendarEventRenderContext,\n CalendarEventTimeChange,\n CalendarExternalDrag,\n CalendarLabels,\n CalendarProps,\n CalendarQuickCreateControls,\n CalendarRange,\n CalendarRecurrence,\n CalendarResource,\n CalendarSelectionControls,\n CalendarView,\n} from \"./Calendar\";\nexport { default as Calendar } from \"./Calendar\";\n\nexport type { ChartKind, ChartLabels, ChartProps, ChartRenderOptions } from \"./Chart\";\nexport { default as Chart } from \"./Chart\";\nexport type { ChartExplorerColumn, ChartExplorerProps, ChartLegendEntry } from \"./ChartExplorer\";\nexport { ChartExplorer } from \"./ChartExplorer\";\nexport type { ChartExplorerControlsProps } from \"./ChartExplorerControls\";\nexport { ChartExplorerControls } from \"./ChartExplorerControls\";\nexport { ChartFilterControls, type ChartFilterControlsProps } from \"./ChartFilterControls\";\nexport { ChartSnapshotView } from \"./ChartSnapshotView\";\nexport type { CodeDisplayLanguage, CodeDisplayProps } from \"./CodeDisplay\";\nexport { default as CodeDisplay } from \"./CodeDisplay\";\nexport { type ChartCursor, createChartCursor } from \"./chart-cursor\";\nexport type {\n ChartExplorerCharts,\n ChartExplorerController,\n ChartExplorerData,\n ChartExplorerOptions,\n ChartExplorerRequest,\n ChartExplorerRow,\n ChartExplorerSnapshot,\n} from \"./chart-explorer\";\nexport { createChartExplorer } from \"./chart-explorer\";\nexport type { ChartDatumRef, ChartSelection, ChartTooltip, ChartTooltipFormatter } from \"./chart-inspection-core\";\nexport type { ChartSnapshot } from \"./chart-snapshot\";\nexport { prepareChartSnapshot } from \"./chart-snapshot\";\nexport type {\n StateTimelineChartOptions,\n StateTimelineDomain,\n StateTimelineInterval,\n StateTimelineRow,\n StateTimelineState,\n} from \"./chart-state-timeline\";\nexport { highlightSql } from \"./code-highlight\";\nexport { type CollectionSelection, createCollectionSelection, type SelectionModifiers } from \"./collection-selection\";\nexport type {\n DataTableColumn,\n DataTableControlsProps,\n DataTableFooter,\n DataTableHeaderProps,\n DataTablePanelFooterProps,\n DataTablePanelProps,\n DataTableProps,\n DataTableRenderCell,\n DataTableRenderHeader,\n DataTableSort,\n} from \"./DataTable\";\nexport { default as DataTable } from \"./DataTable\";\nexport type { DocCodeHighlighter, DocCodeProps, DocConcept, DocNoteVariant, DocRow } from \"./Docs\";\nexport { DocCode, DocConceptGrid, DocInlineCode, DocLead, DocNote, DocPage, DocRows, DocSection } from \"./Docs\";\nexport { FileBrowserPanel, type FileBrowserPanelProps, type FileSource, openFileBrowser } from \"./FileBrowser\";\nexport { FileGrid, type FileGridProps } from \"./FileGrid\";\nexport { default as FileTree, type FileTreeActions, type FileTreeEntry, type FileTreeProps } from \"./FileTree\";\nexport { type FileType, FileTypeIcon, type FileTypeIconProps, fileTypeOf } from \"./FileTypeIcon\";\nexport {\n canPreviewFile,\n default as FileView,\n type FileViewContent,\n type FileViewFile,\n type FileViewPreviewKind,\n type FileViewProps,\n type FileViewRenderer,\n type FileViewRendererProps,\n formatFileViewSize,\n getFileViewPreviewKind,\n} from \"./FileView\";\nexport type { KbdProps } from \"./Kbd\";\nexport { Kbd } from \"./Kbd\";\nexport type { LabelChipProps } from \"./LabelChip\";\nexport { LabelChip } from \"./LabelChip\";\nexport type { LightboxAction, LightboxImage } from \"./Lightbox\";\nexport { default as Lightbox } from \"./Lightbox\";\nexport type { LogTableEntry } from \"./LogEntriesTable\";\nexport { default as LogEntriesTable } from \"./LogEntriesTable\";\nexport { MapAttribution } from \"./MapAttribution\";\nexport { MapView } from \"./MapView\";\nexport { MapViewFrame } from \"./MapViewFrame\";\nexport { default as MarkdownView, type MarkdownRenderOptions, type MarkdownViewProps, renderSafeMarkdown } from \"./MarkdownView\";\nexport type {\n MessageEventGroupProps,\n MessageEventRowProps,\n MessageGroupEntry,\n MessageRowAction,\n MessageRowAttachment,\n MessageRowAuthor,\n MessageRowFile,\n MessageRowMedia,\n MessageRowOrigin,\n MessageRowProgress,\n MessageRowProps,\n MessageRowQuote,\n MessageRowReaction,\n MessageRowStatus,\n MessageRowThread,\n MessageSystemRowProps,\n} from \"./MessageRow\";\nexport { MessageEventGroup, MessageEventRow, MessageRow, MessageSystemRow, startsMessageGroup } from \"./MessageRow\";\nexport { type MapPaletteColors, type MapTheme, mapPalette } from \"./map-palette\";\nexport { type MapStyleOptions, mapAttribution, mapStyle } from \"./map-style\";\nexport type {\n MapViewArea,\n MapViewFit,\n MapViewFrameProps,\n MapViewLine,\n MapViewLineTone,\n MapViewMarker,\n MapViewOwnLocation,\n MapViewPoint,\n MapViewProps,\n MapViewStyle,\n MapViewStyleSource,\n MapViewTone,\n} from \"./map-view-types\";\nexport {\n MARKDOWN_CALLOUT_CLASSES,\n MARKDOWN_CALLOUT_ICON_ATTRIBUTES,\n type MarkdownInfoBlock,\n type MarkdownInfoBlockRenderInput,\n type MarkdownInfoBlockType,\n markdownInfoBlocks,\n renderMarkdownInfoBlock,\n scanMarkdownInfoBlock,\n} from \"./markdown-info-blocks\";\nexport {\n type MarkdownLinkInput,\n type MarkdownReference,\n type MarkdownReferenceKind,\n type MarkdownReferenceType,\n markdownLinkReference,\n markdownReferenceIcon,\n markdownReferenceType,\n markdownReferenceTypeLabel,\n markStandaloneLinks,\n renderMarkdownLink,\n} from \"./markdown-links\";\nexport { Pagination, type PaginationProps } from \"./Pagination\";\nexport type { PdfPreviewProps, PdfPreviewRequest } from \"./PdfPreview\";\nexport { default as PdfPreview } from \"./PdfPreview\";\nexport type { RangeOption, RangePickerProps } from \"./RangePicker\";\nexport { default as RangePicker } from \"./RangePicker\";\nexport { ReactionBar, type ReactionBarItem, type ReactionBarProps } from \"./ReactionBar\";\nexport type {\n ReferenceChipObjectProps,\n ReferenceChipPersonProps,\n ReferenceChipProps,\n ReferenceChipTimeProps,\n} from \"./ReferenceChip\";\nexport { REFERENCE_CHIP_MAX_CHARACTERS, ReferenceChip, truncateMiddle } from \"./ReferenceChip\";\nexport type { StepsProps } from \"./Steps\";\nexport { Steps } from \"./Steps\";\nexport type { StructuredDataPreviewMode, StructuredDataPreviewProps, StructuredDataValue } from \"./StructuredDataPreview\";\nexport { default as StructuredDataPreview, isStructuredDataValue } from \"./StructuredDataPreview\";\nexport type { TimelineColor, TimelineController, TimelineItem, TimelineProps } from \"./Timeline\";\nexport { default as Timeline } from \"./Timeline\";\nexport { VideoPlayer, type VideoPlayerProps } from \"./VideoPlayer\";\nexport type { VirtualFeedController, VirtualFeedProps, VirtualFeedScrollOptions } from \"./VirtualFeed\";\nexport { VirtualFeed } from \"./VirtualFeed\";\nexport type { ZoomPanAction, ZoomPanFullscreen, ZoomPanViewportProps } from \"./ZoomPanViewport\";\nexport { ZoomPanViewport } from \"./ZoomPanViewport\";\n"],"mappings":"AAoBA,SAAS,OAAO,IAAI,QAAQ,QAAQ,YAAY;AAGhD,SAAS,OAAO,IAAI,KAAK,QAAQ,SAAS;AAE1C,SAAS,aAAa,QAAQ,iBAAiB;AAE/C,SAAS,qBAAqB,QAAQ,yBAAyB;AAC/D,SAAS,mBAAmB,QAAuC,uBAAuB;AAC1F,SAAS,iBAAiB,QAAQ,qBAAqB;AAEvD,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AACtD,SAA2B,iBAAiB,QAAQ,gBAAgB;AAUpE,SAAS,mBAAmB,QAAQ,kBAAkB;AAGtD,SAAS,oBAAoB,QAAQ,kBAAkB;AAQvD,SAAS,YAAY,QAAQ,kBAAkB;AAC/C,SAAmC,yBAAyB,QAAiC,wBAAwB;AAarH,SAAS,OAAO,IAAI,SAAS,QAAQ,aAAa;AAElD,SAAS,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,QAAQ,QAAQ;AAC/G,SAAS,gBAAgB,EAA+C,eAAe,QAAQ,eAAe;AAC9G,SAAS,QAAQ,
|
|
1
|
+
{"version":3,"names":[],"sources":["content/index.ts"],"sourcesContent":["export type {\n CalendarAttendee,\n CalendarCommand,\n CalendarController,\n CalendarCustomView,\n CalendarDayBadge,\n CalendarEvent,\n CalendarEventColor,\n CalendarEventRenderContext,\n CalendarEventTimeChange,\n CalendarExternalDrag,\n CalendarLabels,\n CalendarProps,\n CalendarQuickCreateControls,\n CalendarRange,\n CalendarRecurrence,\n CalendarResource,\n CalendarSelectionControls,\n CalendarView,\n} from \"./Calendar\";\nexport { default as Calendar } from \"./Calendar\";\n\nexport type { ChartKind, ChartLabels, ChartProps, ChartRenderOptions } from \"./Chart\";\nexport { default as Chart } from \"./Chart\";\nexport type { ChartExplorerColumn, ChartExplorerProps, ChartLegendEntry } from \"./ChartExplorer\";\nexport { ChartExplorer } from \"./ChartExplorer\";\nexport type { ChartExplorerControlsProps } from \"./ChartExplorerControls\";\nexport { ChartExplorerControls } from \"./ChartExplorerControls\";\nexport { ChartFilterControls, type ChartFilterControlsProps } from \"./ChartFilterControls\";\nexport { ChartSnapshotView } from \"./ChartSnapshotView\";\nexport type { CodeDisplayLanguage, CodeDisplayProps } from \"./CodeDisplay\";\nexport { default as CodeDisplay } from \"./CodeDisplay\";\nexport { type ChartCursor, createChartCursor } from \"./chart-cursor\";\nexport type {\n ChartExplorerCharts,\n ChartExplorerController,\n ChartExplorerData,\n ChartExplorerOptions,\n ChartExplorerRequest,\n ChartExplorerRow,\n ChartExplorerSnapshot,\n} from \"./chart-explorer\";\nexport { createChartExplorer } from \"./chart-explorer\";\nexport type { ChartDatumRef, ChartSelection, ChartTooltip, ChartTooltipFormatter } from \"./chart-inspection-core\";\nexport type { ChartSnapshot } from \"./chart-snapshot\";\nexport { prepareChartSnapshot } from \"./chart-snapshot\";\nexport type {\n StateTimelineChartOptions,\n StateTimelineDomain,\n StateTimelineInterval,\n StateTimelineRow,\n StateTimelineState,\n} from \"./chart-state-timeline\";\nexport { highlightSql } from \"./code-highlight\";\nexport { type CollectionSelection, createCollectionSelection, type SelectionModifiers } from \"./collection-selection\";\nexport type {\n DataTableColumn,\n DataTableControlsProps,\n DataTableFooter,\n DataTableHeaderProps,\n DataTablePanelFooterProps,\n DataTablePanelProps,\n DataTableProps,\n DataTableRenderCell,\n DataTableRenderHeader,\n DataTableSort,\n} from \"./DataTable\";\nexport { default as DataTable } from \"./DataTable\";\nexport type { DocCodeHighlighter, DocCodeProps, DocConcept, DocNoteVariant, DocRow } from \"./Docs\";\nexport { DocCode, DocConceptGrid, DocInlineCode, DocLead, DocNote, DocPage, DocRows, DocSection } from \"./Docs\";\nexport { FileBrowserPanel, type FileBrowserPanelProps, type FileSource, openFileBrowser } from \"./FileBrowser\";\nexport { FileGrid, type FileGridGroup, type FileGridOpenProps, type FileGridProps, type FileGridSelectableProps } from \"./FileGrid\";\nexport { default as FileTree, type FileTreeActions, type FileTreeEntry, type FileTreeProps } from \"./FileTree\";\nexport { type FileType, FileTypeIcon, type FileTypeIconProps, fileKindLabel, fileTypeOf } from \"./FileTypeIcon\";\nexport {\n canPreviewFile,\n default as FileView,\n type FileViewContent,\n type FileViewFile,\n type FileViewPreviewKind,\n type FileViewProps,\n type FileViewRenderer,\n type FileViewRendererProps,\n formatFileViewSize,\n getFileViewPreviewKind,\n} from \"./FileView\";\nexport type { KbdProps } from \"./Kbd\";\nexport { Kbd } from \"./Kbd\";\nexport type { LabelChipProps } from \"./LabelChip\";\nexport { LabelChip } from \"./LabelChip\";\nexport type { LightboxAction, LightboxImage } from \"./Lightbox\";\nexport { default as Lightbox } from \"./Lightbox\";\nexport type { LogTableEntry } from \"./LogEntriesTable\";\nexport { default as LogEntriesTable } from \"./LogEntriesTable\";\nexport { MapAttribution } from \"./MapAttribution\";\nexport { MapView } from \"./MapView\";\nexport { MapViewFrame } from \"./MapViewFrame\";\nexport { default as MarkdownView, type MarkdownRenderOptions, type MarkdownViewProps, renderSafeMarkdown } from \"./MarkdownView\";\nexport { type MatchRange, MatchText, type MatchTextProps, matchParts } from \"./MatchText\";\nexport type {\n MessageEventGroupProps,\n MessageEventRowProps,\n MessageGroupEntry,\n MessageRowAction,\n MessageRowAttachment,\n MessageRowAuthor,\n MessageRowFile,\n MessageRowMedia,\n MessageRowOrigin,\n MessageRowProgress,\n MessageRowProps,\n MessageRowQuote,\n MessageRowReaction,\n MessageRowStatus,\n MessageRowThread,\n MessageSystemRowProps,\n} from \"./MessageRow\";\nexport { MessageEventGroup, MessageEventRow, MessageRow, MessageSystemRow, startsMessageGroup } from \"./MessageRow\";\nexport { type MapPaletteColors, type MapTheme, mapPalette } from \"./map-palette\";\nexport { type MapStyleOptions, mapAttribution, mapStyle } from \"./map-style\";\nexport type {\n MapViewArea,\n MapViewFit,\n MapViewFrameProps,\n MapViewLine,\n MapViewLineTone,\n MapViewMarker,\n MapViewOwnLocation,\n MapViewPoint,\n MapViewProps,\n MapViewStyle,\n MapViewStyleSource,\n MapViewTone,\n} from \"./map-view-types\";\nexport {\n MARKDOWN_CALLOUT_CLASSES,\n MARKDOWN_CALLOUT_ICON_ATTRIBUTES,\n type MarkdownInfoBlock,\n type MarkdownInfoBlockRenderInput,\n type MarkdownInfoBlockType,\n markdownInfoBlocks,\n renderMarkdownInfoBlock,\n scanMarkdownInfoBlock,\n} from \"./markdown-info-blocks\";\nexport {\n type MarkdownLinkInput,\n type MarkdownReference,\n type MarkdownReferenceKind,\n type MarkdownReferenceType,\n markdownLinkReference,\n markdownReferenceIcon,\n markdownReferenceType,\n markdownReferenceTypeLabel,\n markStandaloneLinks,\n renderMarkdownLink,\n} from \"./markdown-links\";\nexport { Pagination, type PaginationProps } from \"./Pagination\";\nexport type { PdfPreviewProps, PdfPreviewRequest } from \"./PdfPreview\";\nexport { default as PdfPreview } from \"./PdfPreview\";\nexport type { RangeOption, RangePickerProps } from \"./RangePicker\";\nexport { default as RangePicker } from \"./RangePicker\";\nexport { ReactionBar, type ReactionBarItem, type ReactionBarProps } from \"./ReactionBar\";\nexport type {\n ReferenceChipObjectProps,\n ReferenceChipPersonProps,\n ReferenceChipProps,\n ReferenceChipTimeProps,\n} from \"./ReferenceChip\";\nexport { REFERENCE_CHIP_MAX_CHARACTERS, ReferenceChip, truncateMiddle } from \"./ReferenceChip\";\nexport type { StepsProps } from \"./Steps\";\nexport { Steps } from \"./Steps\";\nexport type { StructuredDataPreviewMode, StructuredDataPreviewProps, StructuredDataValue } from \"./StructuredDataPreview\";\nexport { default as StructuredDataPreview, isStructuredDataValue } from \"./StructuredDataPreview\";\nexport type { TimelineColor, TimelineController, TimelineItem, TimelineProps } from \"./Timeline\";\nexport { default as Timeline } from \"./Timeline\";\nexport { VideoPlayer, type VideoPlayerProps } from \"./VideoPlayer\";\nexport type { VirtualFeedController, VirtualFeedProps, VirtualFeedScrollOptions } from \"./VirtualFeed\";\nexport { VirtualFeed } from \"./VirtualFeed\";\nexport type { ZoomPanAction, ZoomPanFullscreen, ZoomPanViewportProps } from \"./ZoomPanViewport\";\nexport { ZoomPanViewport } from \"./ZoomPanViewport\";\n"],"mappings":"AAoBA,SAAS,OAAO,IAAI,QAAQ,QAAQ,YAAY;AAGhD,SAAS,OAAO,IAAI,KAAK,QAAQ,SAAS;AAE1C,SAAS,aAAa,QAAQ,iBAAiB;AAE/C,SAAS,qBAAqB,QAAQ,yBAAyB;AAC/D,SAAS,mBAAmB,QAAuC,uBAAuB;AAC1F,SAAS,iBAAiB,QAAQ,qBAAqB;AAEvD,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AACtD,SAA2B,iBAAiB,QAAQ,gBAAgB;AAUpE,SAAS,mBAAmB,QAAQ,kBAAkB;AAGtD,SAAS,oBAAoB,QAAQ,kBAAkB;AAQvD,SAAS,YAAY,QAAQ,kBAAkB;AAC/C,SAAmC,yBAAyB,QAAiC,wBAAwB;AAarH,SAAS,OAAO,IAAI,SAAS,QAAQ,aAAa;AAElD,SAAS,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,QAAQ,QAAQ;AAC/G,SAAS,gBAAgB,EAA+C,eAAe,QAAQ,eAAe;AAC9G,SAAS,QAAQ,QAAsG,YAAY;AACnI,SAAS,OAAO,IAAI,QAAQ,QAAsE,YAAY;AAC9G,SAAwB,YAAY,EAA0B,aAAa,EAAE,UAAU,QAAQ,gBAAgB;AAC/G,SACE,cAAc,EACd,OAAO,IAAI,QAAQ,EAOnB,kBAAkB,EAClB,sBAAsB,QACjB,YAAY;AAEnB,SAAS,GAAG,QAAQ,OAAO;AAE3B,SAAS,SAAS,QAAQ,aAAa;AAEvC,SAAS,OAAO,IAAI,QAAQ,QAAQ,YAAY;AAEhD,SAAS,OAAO,IAAI,eAAe,QAAQ,mBAAmB;AAC9D,SAAS,cAAc,QAAQ,kBAAkB;AACjD,SAAS,OAAO,QAAQ,WAAW;AACnC,SAAS,YAAY,QAAQ,gBAAgB;AAC7C,SAAS,OAAO,IAAI,YAAY,EAAsD,kBAAkB,QAAQ,gBAAgB;AAChI,SAA0B,SAAS,EAAuB,UAAU,QAAQ,aAAa;AAmBzF,SAAS,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,QAAQ,cAAc;AACnH,SAA+C,UAAU,QAAQ,eAAe;AAChF,SAA+B,cAAc,EAAE,QAAQ,QAAQ,aAAa;AAe5E,SACE,wBAAwB,EACxB,gCAAgC,EAIhC,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,QAChB,wBAAwB;AAC/B,SAKE,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,QACb,kBAAkB;AACzB,SAAS,UAAU,QAA8B,cAAc;AAE/D,SAAS,OAAO,IAAI,UAAU,QAAQ,cAAc;AAEpD,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AACtD,SAAS,WAAW,QAAqD,eAAe;AAOxF,SAAS,6BAA6B,EAAE,aAAa,EAAE,cAAc,QAAQ,iBAAiB;AAE9F,SAAS,KAAK,QAAQ,SAAS;AAE/B,SAAS,OAAO,IAAI,qBAAqB,EAAE,qBAAqB,QAAQ,yBAAyB;AAEjG,SAAS,OAAO,IAAI,QAAQ,QAAQ,YAAY;AAChD,SAAS,WAAW,QAA+B,eAAe;AAElE,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,eAAe,QAAQ,mBAAmB","ignoreList":[]}
|
|
@@ -41,6 +41,7 @@ function TooltipSurface(props) {
|
|
|
41
41
|
};
|
|
42
42
|
function dismissOnEscape(event) {
|
|
43
43
|
if (event.key !== "Escape" || !surface?.matches(":popover-open")) return;
|
|
44
|
+
event.preventDefault();
|
|
44
45
|
dismissedUntilLeave = true;
|
|
45
46
|
close();
|
|
46
47
|
}
|
|
@@ -82,18 +83,25 @@ function TooltipSurface(props) {
|
|
|
82
83
|
onMount(() => {
|
|
83
84
|
target = props.target();
|
|
84
85
|
if (!target) return;
|
|
86
|
+
const focusHost = props.focusTarget?.() ?? target;
|
|
85
87
|
|
|
86
88
|
// Server HTML may carry a native title as the no-JavaScript hint; once
|
|
87
89
|
// hydrated, this surface replaces it so the hint does not appear twice.
|
|
88
90
|
const originalTitle = target.getAttribute("title");
|
|
89
91
|
target.removeAttribute("title");
|
|
90
92
|
// A hint that only repeats the control's accessible name adds nothing for
|
|
91
|
-
// assistive technology, so it does not become a description.
|
|
92
|
-
|
|
93
|
-
const
|
|
93
|
+
// assistive technology, so it does not become a description. A focus
|
|
94
|
+
// container without an aria-label is named by the target's own label text.
|
|
95
|
+
const hint = surface?.textContent?.trim();
|
|
96
|
+
const label = focusHost.getAttribute("aria-label");
|
|
97
|
+
const repeatsName = label !== null ? hint === label.trim() : Boolean(props.focusTarget && hint && target.textContent?.includes(hint));
|
|
98
|
+
const originalDescription = focusHost.getAttribute("aria-describedby");
|
|
94
99
|
const descriptions = new Set(originalDescription?.split(/\s+/).filter(Boolean) ?? []);
|
|
95
100
|
if (!repeatsName) descriptions.add(tooltipId);
|
|
96
|
-
|
|
101
|
+
// A focus container named by its content, such as a tree item, would read
|
|
102
|
+
// the open hint as part of its name; a description still reads it.
|
|
103
|
+
if (surface && focusHost !== target && focusHost.contains(surface)) surface.setAttribute("aria-hidden", "true");
|
|
104
|
+
if (descriptions.size > 0) focusHost.setAttribute("aria-describedby", [...descriptions].join(" "));
|
|
97
105
|
|
|
98
106
|
// Touch has no hover, so a tap never opens the hint; the label stays the
|
|
99
107
|
// accessible name.
|
|
@@ -103,33 +111,42 @@ function TooltipSurface(props) {
|
|
|
103
111
|
// Only visible focus, as from the keyboard, opens the hint. Focus that a
|
|
104
112
|
// click or tap gives, or that a closing overlay returns silently, does not.
|
|
105
113
|
const focusIn = event => {
|
|
106
|
-
|
|
114
|
+
const focused = event.target;
|
|
115
|
+
if ((focusHost === target || focused === focusHost) && focused?.matches?.(":focus-visible")) open();
|
|
107
116
|
};
|
|
108
117
|
const leave = () => {
|
|
109
118
|
dismissedUntilLeave = false;
|
|
110
119
|
close();
|
|
111
120
|
};
|
|
112
121
|
const focusOut = event => {
|
|
113
|
-
if (!target
|
|
122
|
+
if (focusHost === target ? !target.contains(event.relatedTarget) : event.target === focusHost) leave();
|
|
114
123
|
};
|
|
115
|
-
const
|
|
124
|
+
const dismissForUse = () => {
|
|
116
125
|
dismissedUntilLeave = true;
|
|
117
126
|
close();
|
|
118
127
|
};
|
|
128
|
+
|
|
129
|
+
// Keyboard activation uses the control just as a pointer press does. Capture it before
|
|
130
|
+
// a local handler (for example drag pickup) stops propagation.
|
|
131
|
+
const keyDown = event => {
|
|
132
|
+
if (event.key === " " || event.key === "Enter") dismissForUse();
|
|
133
|
+
};
|
|
134
|
+
focusHost.addEventListener("keydown", keyDown, true);
|
|
119
135
|
target.addEventListener("pointerenter", enter);
|
|
120
136
|
target.addEventListener("pointerleave", leave);
|
|
121
|
-
target.addEventListener("pointerdown",
|
|
122
|
-
|
|
123
|
-
|
|
137
|
+
target.addEventListener("pointerdown", dismissForUse);
|
|
138
|
+
focusHost.addEventListener("focusin", focusIn);
|
|
139
|
+
focusHost.addEventListener("focusout", focusOut);
|
|
124
140
|
onCleanup(() => {
|
|
125
141
|
close();
|
|
126
142
|
if (originalTitle !== null) target?.setAttribute("title", originalTitle);
|
|
127
|
-
if (originalDescription)
|
|
143
|
+
if (originalDescription) focusHost.setAttribute("aria-describedby", originalDescription);else focusHost.removeAttribute("aria-describedby");
|
|
144
|
+
focusHost.removeEventListener("keydown", keyDown, true);
|
|
128
145
|
target?.removeEventListener("pointerenter", enter);
|
|
129
146
|
target?.removeEventListener("pointerleave", leave);
|
|
130
|
-
target?.removeEventListener("pointerdown",
|
|
131
|
-
|
|
132
|
-
|
|
147
|
+
target?.removeEventListener("pointerdown", dismissForUse);
|
|
148
|
+
focusHost.removeEventListener("focusin", focusIn);
|
|
149
|
+
focusHost.removeEventListener("focusout", focusOut);
|
|
133
150
|
});
|
|
134
151
|
});
|
|
135
152
|
return _$ssr(_tmpl$, _$ssrAttribute("id", _$escape(tooltipId, true), false), _$ssrAttribute("data-instant", props.delay !== undefined && props.delay <= 0 ? "true" : _$escape(undefined, true), false), _$escape(props.content));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["feedback/Tooltip.tsx"],"sourcesContent":["import { createContext, createEffect, createUniqueId, type JSX, onCleanup, onMount, splitProps, useContext } from \"solid-js\";\nimport { positionTooltipSurface, type TooltipPlacement } from \"./tooltip-position\";\n\nexport type TooltipProps = {\n content: JSX.Element;\n target: () => HTMLElement | undefined;\n placement?: TooltipPlacement;\n delay?: number;\n disabled?: boolean;\n};\n\nexport type TooltipAnchorProps = Omit<JSX.HTMLAttributes<HTMLSpanElement>, \"content\"> & Omit<TooltipProps, \"target\">;\n\nexport type TooltipTriggerProps = Omit<JSX.ButtonHTMLAttributes<HTMLButtonElement>, \"content\"> & Omit<TooltipProps, \"target\">;\n\n/** True below a Tooltip.Anchor, whose hint already covers the controls inside it. */\nconst AnchorContext = createContext(false);\n\n/**\n * The hint an icon-only control shows by default: its label, unless the caller\n * passes its own `tooltip` (or `false`) or an enclosing Tooltip.Anchor already\n * owns the hint.\n */\nexport const useLabelTooltip = (tooltip: () => JSX.Element | false | undefined, label: () => string | undefined) => {\n const anchored = useContext(AnchorContext);\n return (): JSX.Element | false | undefined => {\n const explicit = tooltip();\n if (explicit !== undefined) return explicit;\n return anchored ? false : label();\n };\n};\n\n/**\n * Low-level tooltip surface for components that already own their target DOM\n * element. Most callers should use Button.tooltip, IconButton.tooltip, or\n * Tooltip.Anchor instead.\n */\nfunction TooltipSurface(props: TooltipProps): JSX.Element {\n const tooltipId = `k2b-tooltip-${createUniqueId()}`;\n let surface: HTMLSpanElement | undefined;\n let target: HTMLElement | undefined;\n let openTimer: ReturnType<typeof setTimeout> | undefined;\n let dismissedUntilLeave = false;\n\n const clearTimer = () => {\n if (openTimer) clearTimeout(openTimer);\n openTimer = undefined;\n };\n\n function dismissOnEscape(event: KeyboardEvent) {\n if (event.key !== \"Escape\" || !surface?.matches(\":popover-open\")) return;\n dismissedUntilLeave = true;\n close();\n }\n\n function close() {\n clearTimer();\n if (surface?.matches(\":popover-open\")) {\n try {\n surface.hidePopover();\n } catch {\n // The surface may disconnect during cleanup.\n }\n }\n document.removeEventListener(\"keydown\", dismissOnEscape);\n window.removeEventListener(\"scroll\", close, true);\n window.removeEventListener(\"resize\", close);\n }\n\n const open = () => {\n clearTimer();\n if (props.disabled || dismissedUntilLeave || !surface || !target || surface.matches(\":popover-open\")) return;\n const show = () => {\n openTimer = undefined;\n if (props.disabled || !surface?.isConnected || !target) return;\n try {\n surface.showPopover();\n } catch {\n return;\n }\n positionTooltipSurface(surface, target, props.placement);\n document.addEventListener(\"keydown\", dismissOnEscape);\n window.addEventListener(\"scroll\", close, true);\n window.addEventListener(\"resize\", close);\n };\n const delay = props.delay ?? 250;\n if (delay <= 0) show();\n else openTimer = setTimeout(show, delay);\n };\n\n createEffect(() => {\n if (props.disabled) close();\n });\n\n onMount(() => {\n target = props.target();\n if (!target) return;\n\n // Server HTML may carry a native title as the no-JavaScript hint; once\n // hydrated, this surface replaces it so the hint does not appear twice.\n const originalTitle = target.getAttribute(\"title\");\n target.removeAttribute(\"title\");\n // A hint that only repeats the control's accessible name adds nothing for\n // assistive technology, so it does not become a description.\n const repeatsName = surface?.textContent?.trim() === target.getAttribute(\"aria-label\")?.trim();\n const originalDescription = target.getAttribute(\"aria-describedby\");\n const descriptions = new Set(originalDescription?.split(/\\s+/).filter(Boolean) ?? []);\n if (!repeatsName) descriptions.add(tooltipId);\n if (descriptions.size > 0) target.setAttribute(\"aria-describedby\", [...descriptions].join(\" \"));\n\n // Touch has no hover, so a tap never opens the hint; the label stays the\n // accessible name.\n const enter = (event: PointerEvent) => {\n if (event.pointerType !== \"touch\") open();\n };\n // Only visible focus, as from the keyboard, opens the hint. Focus that a\n // click or tap gives, or that a closing overlay returns silently, does not.\n const focusIn = (event: FocusEvent) => {\n if ((event.target as Element | null)?.matches?.(\":focus-visible\")) open();\n };\n const leave = () => {\n dismissedUntilLeave = false;\n close();\n };\n const focusOut = (event: FocusEvent) => {\n if (!target?.contains(event.relatedTarget as Node | null)) leave();\n };\n const pointerDown = () => {\n dismissedUntilLeave = true;\n close();\n };\n\n target.addEventListener(\"pointerenter\", enter);\n target.addEventListener(\"pointerleave\", leave);\n target.addEventListener(\"pointerdown\", pointerDown);\n target.addEventListener(\"focusin\", focusIn);\n target.addEventListener(\"focusout\", focusOut);\n\n onCleanup(() => {\n close();\n if (originalTitle !== null) target?.setAttribute(\"title\", originalTitle);\n if (originalDescription) target?.setAttribute(\"aria-describedby\", originalDescription);\n else target?.removeAttribute(\"aria-describedby\");\n target?.removeEventListener(\"pointerenter\", enter);\n target?.removeEventListener(\"pointerleave\", leave);\n target?.removeEventListener(\"pointerdown\", pointerDown);\n target?.removeEventListener(\"focusin\", focusIn);\n target?.removeEventListener(\"focusout\", focusOut);\n });\n });\n\n return (\n <span\n ref={surface}\n id={tooltipId}\n role=\"tooltip\"\n popover=\"manual\"\n class=\"k2b-tooltip\"\n data-instant={props.delay !== undefined && props.delay <= 0 ? \"true\" : undefined}\n >\n {props.content}\n </span>\n );\n}\n\n/** Explicit tooltip target for non-button content. */\nfunction TooltipAnchor(props: TooltipAnchorProps): JSX.Element {\n const [local, rest] = splitProps(props, [\"children\", \"class\", \"content\", \"delay\", \"disabled\", \"placement\"]);\n let target: HTMLSpanElement | undefined;\n\n return (\n <span {...rest} ref={target} class={`k2b-tooltip-wrapper ${local.class ?? \"\"}`}>\n <AnchorContext.Provider value={true}>{local.children}</AnchorContext.Provider>\n <TooltipSurface\n content={local.content}\n target={() => target}\n delay={local.delay}\n disabled={local.disabled}\n placement={local.placement}\n />\n </span>\n );\n}\n\n/** Native button target for specialized controls that do not use Button. */\nfunction TooltipTrigger(props: TooltipTriggerProps): JSX.Element {\n const [local, rest] = splitProps(props, [\"children\", \"content\", \"delay\", \"disabled\", \"placement\", \"ref\"]);\n let target: HTMLButtonElement | undefined;\n const register = (element: HTMLButtonElement) => {\n target = element;\n if (typeof local.ref === \"function\") local.ref(element);\n };\n\n return (\n <>\n <button {...rest} ref={register} disabled={local.disabled}>\n {local.children}\n </button>\n <TooltipSurface\n content={local.content}\n target={() => target}\n delay={local.delay}\n disabled={local.disabled}\n placement={local.placement}\n />\n </>\n );\n}\n\ntype TooltipComponent = ((props: TooltipProps) => JSX.Element) & {\n Anchor: (props: TooltipAnchorProps) => JSX.Element;\n Trigger: (props: TooltipTriggerProps) => JSX.Element;\n};\n\nexport const Tooltip = TooltipSurface as TooltipComponent;\nTooltip.Anchor = TooltipAnchor;\nTooltip.Trigger = TooltipTrigger;\n\nexport type { TooltipPlacement } from \"./tooltip-position\";\n\nexport default Tooltip;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["feedback/Tooltip.tsx"],"sourcesContent":["import { createContext, createEffect, createUniqueId, type JSX, onCleanup, onMount, splitProps, useContext } from \"solid-js\";\nimport { positionTooltipSurface, type TooltipPlacement } from \"./tooltip-position\";\n\nexport type TooltipProps = {\n content: JSX.Element;\n target: () => HTMLElement | undefined;\n placement?: TooltipPlacement;\n delay?: number;\n disabled?: boolean;\n /**\n * The element whose keyboard focus opens the hint, when a container holds\n * the focus instead of `target` (a tree item around its row). Defaults to\n * `target`.\n */\n focusTarget?: () => HTMLElement | undefined;\n};\n\nexport type TooltipAnchorProps = Omit<JSX.HTMLAttributes<HTMLSpanElement>, \"content\"> & Omit<TooltipProps, \"target\" | \"focusTarget\">;\n\nexport type TooltipTriggerProps = Omit<JSX.ButtonHTMLAttributes<HTMLButtonElement>, \"content\"> &\n Omit<TooltipProps, \"target\" | \"focusTarget\">;\n\n/** True below a Tooltip.Anchor, whose hint already covers the controls inside it. */\nconst AnchorContext = createContext(false);\n\n/**\n * The hint an icon-only control shows by default: its label, unless the caller\n * passes its own `tooltip` (or `false`) or an enclosing Tooltip.Anchor already\n * owns the hint.\n */\nexport const useLabelTooltip = (tooltip: () => JSX.Element | false | undefined, label: () => string | undefined) => {\n const anchored = useContext(AnchorContext);\n return (): JSX.Element | false | undefined => {\n const explicit = tooltip();\n if (explicit !== undefined) return explicit;\n return anchored ? false : label();\n };\n};\n\n/**\n * Low-level tooltip surface for components that already own their target DOM\n * element. Most callers should use Button.tooltip, IconButton.tooltip, or\n * Tooltip.Anchor instead.\n */\nfunction TooltipSurface(props: TooltipProps): JSX.Element {\n const tooltipId = `k2b-tooltip-${createUniqueId()}`;\n let surface: HTMLSpanElement | undefined;\n let target: HTMLElement | undefined;\n let openTimer: ReturnType<typeof setTimeout> | undefined;\n let dismissedUntilLeave = false;\n\n const clearTimer = () => {\n if (openTimer) clearTimeout(openTimer);\n openTimer = undefined;\n };\n\n function dismissOnEscape(event: KeyboardEvent) {\n if (event.key !== \"Escape\" || !surface?.matches(\":popover-open\")) return;\n event.preventDefault();\n dismissedUntilLeave = true;\n close();\n }\n\n function close() {\n clearTimer();\n if (surface?.matches(\":popover-open\")) {\n try {\n surface.hidePopover();\n } catch {\n // The surface may disconnect during cleanup.\n }\n }\n document.removeEventListener(\"keydown\", dismissOnEscape);\n window.removeEventListener(\"scroll\", close, true);\n window.removeEventListener(\"resize\", close);\n }\n\n const open = () => {\n clearTimer();\n if (props.disabled || dismissedUntilLeave || !surface || !target || surface.matches(\":popover-open\")) return;\n const show = () => {\n openTimer = undefined;\n if (props.disabled || !surface?.isConnected || !target) return;\n try {\n surface.showPopover();\n } catch {\n return;\n }\n positionTooltipSurface(surface, target, props.placement);\n document.addEventListener(\"keydown\", dismissOnEscape);\n window.addEventListener(\"scroll\", close, true);\n window.addEventListener(\"resize\", close);\n };\n const delay = props.delay ?? 250;\n if (delay <= 0) show();\n else openTimer = setTimeout(show, delay);\n };\n\n createEffect(() => {\n if (props.disabled) close();\n });\n\n onMount(() => {\n target = props.target();\n if (!target) return;\n const focusHost = props.focusTarget?.() ?? target;\n\n // Server HTML may carry a native title as the no-JavaScript hint; once\n // hydrated, this surface replaces it so the hint does not appear twice.\n const originalTitle = target.getAttribute(\"title\");\n target.removeAttribute(\"title\");\n // A hint that only repeats the control's accessible name adds nothing for\n // assistive technology, so it does not become a description. A focus\n // container without an aria-label is named by the target's own label text.\n const hint = surface?.textContent?.trim();\n const label = focusHost.getAttribute(\"aria-label\");\n const repeatsName = label !== null ? hint === label.trim() : Boolean(props.focusTarget && hint && target.textContent?.includes(hint));\n const originalDescription = focusHost.getAttribute(\"aria-describedby\");\n const descriptions = new Set(originalDescription?.split(/\\s+/).filter(Boolean) ?? []);\n if (!repeatsName) descriptions.add(tooltipId);\n // A focus container named by its content, such as a tree item, would read\n // the open hint as part of its name; a description still reads it.\n if (surface && focusHost !== target && focusHost.contains(surface)) surface.setAttribute(\"aria-hidden\", \"true\");\n if (descriptions.size > 0) focusHost.setAttribute(\"aria-describedby\", [...descriptions].join(\" \"));\n\n // Touch has no hover, so a tap never opens the hint; the label stays the\n // accessible name.\n const enter = (event: PointerEvent) => {\n if (event.pointerType !== \"touch\") open();\n };\n // Only visible focus, as from the keyboard, opens the hint. Focus that a\n // click or tap gives, or that a closing overlay returns silently, does not.\n const focusIn = (event: FocusEvent) => {\n const focused = event.target as Element | null;\n if ((focusHost === target || focused === focusHost) && focused?.matches?.(\":focus-visible\")) open();\n };\n const leave = () => {\n dismissedUntilLeave = false;\n close();\n };\n const focusOut = (event: FocusEvent) => {\n if (focusHost === target ? !target.contains(event.relatedTarget as Node | null) : event.target === focusHost) leave();\n };\n const dismissForUse = () => {\n dismissedUntilLeave = true;\n close();\n };\n\n // Keyboard activation uses the control just as a pointer press does. Capture it before\n // a local handler (for example drag pickup) stops propagation.\n const keyDown = (event: KeyboardEvent) => {\n if (event.key === \" \" || event.key === \"Enter\") dismissForUse();\n };\n\n focusHost.addEventListener(\"keydown\", keyDown, true);\n target.addEventListener(\"pointerenter\", enter);\n target.addEventListener(\"pointerleave\", leave);\n target.addEventListener(\"pointerdown\", dismissForUse);\n focusHost.addEventListener(\"focusin\", focusIn);\n focusHost.addEventListener(\"focusout\", focusOut);\n\n onCleanup(() => {\n close();\n if (originalTitle !== null) target?.setAttribute(\"title\", originalTitle);\n if (originalDescription) focusHost.setAttribute(\"aria-describedby\", originalDescription);\n else focusHost.removeAttribute(\"aria-describedby\");\n focusHost.removeEventListener(\"keydown\", keyDown, true);\n target?.removeEventListener(\"pointerenter\", enter);\n target?.removeEventListener(\"pointerleave\", leave);\n target?.removeEventListener(\"pointerdown\", dismissForUse);\n focusHost.removeEventListener(\"focusin\", focusIn);\n focusHost.removeEventListener(\"focusout\", focusOut);\n });\n });\n\n return (\n <span\n ref={surface}\n id={tooltipId}\n role=\"tooltip\"\n popover=\"manual\"\n class=\"k2b-tooltip\"\n data-instant={props.delay !== undefined && props.delay <= 0 ? \"true\" : undefined}\n >\n {props.content}\n </span>\n );\n}\n\n/** Explicit tooltip target for non-button content. */\nfunction TooltipAnchor(props: TooltipAnchorProps): JSX.Element {\n const [local, rest] = splitProps(props, [\"children\", \"class\", \"content\", \"delay\", \"disabled\", \"placement\"]);\n let target: HTMLSpanElement | undefined;\n\n return (\n <span {...rest} ref={target} class={`k2b-tooltip-wrapper ${local.class ?? \"\"}`}>\n <AnchorContext.Provider value={true}>{local.children}</AnchorContext.Provider>\n <TooltipSurface\n content={local.content}\n target={() => target}\n delay={local.delay}\n disabled={local.disabled}\n placement={local.placement}\n />\n </span>\n );\n}\n\n/** Native button target for specialized controls that do not use Button. */\nfunction TooltipTrigger(props: TooltipTriggerProps): JSX.Element {\n const [local, rest] = splitProps(props, [\"children\", \"content\", \"delay\", \"disabled\", \"placement\", \"ref\"]);\n let target: HTMLButtonElement | undefined;\n const register = (element: HTMLButtonElement) => {\n target = element;\n if (typeof local.ref === \"function\") local.ref(element);\n };\n\n return (\n <>\n <button {...rest} ref={register} disabled={local.disabled}>\n {local.children}\n </button>\n <TooltipSurface\n content={local.content}\n target={() => target}\n delay={local.delay}\n disabled={local.disabled}\n placement={local.placement}\n />\n </>\n );\n}\n\ntype TooltipComponent = ((props: TooltipProps) => JSX.Element) & {\n Anchor: (props: TooltipAnchorProps) => JSX.Element;\n Trigger: (props: TooltipTriggerProps) => JSX.Element;\n};\n\nexport const Tooltip = TooltipSurface as TooltipComponent;\nTooltip.Anchor = TooltipAnchor;\nTooltip.Trigger = TooltipTrigger;\n\nexport type { TooltipPlacement } from \"./tooltip-position\";\n\nexport default Tooltip;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { memo as _$memo } from "solid-js/web";
|
|
2
|
+
import { ssr as _$ssr } from "solid-js/web";
|
|
3
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
4
|
+
import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
|
|
5
|
+
import { escape as _$escape } from "solid-js/web";
|
|
6
|
+
var _tmpl$ = ["<div class=\"k2b-choice-list\" role=\"radiogroup\"", ">", "</div>"],
|
|
7
|
+
_tmpl$2 = ["<i class=\"ti ti-loader-2 k2b-spin\" role=\"img\"", "></i>"],
|
|
8
|
+
_tmpl$3 = ["<span class=\"k2b-choice-list__description\"", ">", "</span>"],
|
|
9
|
+
_tmpl$4 = ["<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>", "</span></button>"],
|
|
10
|
+
_tmpl$5 = ["<div class=\"k2b-choice-list__details\">", "</div>"],
|
|
11
|
+
_tmpl$6 = ["<span class=\"k2b-choice-list__marker\">", "</span>"];
|
|
12
|
+
import { Index, Show } from "solid-js";
|
|
13
|
+
import { createFieldMeta, Field, fieldDescribedBy } from "../internal/field";
|
|
14
|
+
import { radioKeyTarget } from "../internal/radio-keys";
|
|
15
|
+
import { resolveMaybeAccessor } from "./field-contract";
|
|
16
|
+
/**
|
|
17
|
+
* A labeled single choice shown as a short list of rows, each with a radio, a label and one sentence on what it
|
|
18
|
+
* means, for a few choices whose consequences need words. Choosing changes only paint, so no row moves; `details`
|
|
19
|
+
* opens under the chosen row. Use `ChoiceChips` for quick picks without explanation, `RichSelect` for longer lists
|
|
20
|
+
* in a dropdown, and `ChoiceTiles` when a preview decides.
|
|
21
|
+
*/
|
|
22
|
+
export function ChoiceList(props) {
|
|
23
|
+
const meta = createFieldMeta(props.id);
|
|
24
|
+
let group;
|
|
25
|
+
const value = () => resolveMaybeAccessor(props.value) ?? null;
|
|
26
|
+
const tabStop = (option, index) => value() === option.value || index === 0 && !props.options.some(candidate => candidate.value === value());
|
|
27
|
+
const choose = (index, focus = false) => {
|
|
28
|
+
const option = props.options[index];
|
|
29
|
+
if (!option || props.disabled) return;
|
|
30
|
+
props.onValueChange?.(option.value);
|
|
31
|
+
props.onValueCommit?.(option.value);
|
|
32
|
+
if (focus) queueMicrotask(() => group?.querySelectorAll('[role="radio"]')[index]?.focus());
|
|
33
|
+
};
|
|
34
|
+
return _$createComponent(Field, {
|
|
35
|
+
meta: meta,
|
|
36
|
+
labelFor: false,
|
|
37
|
+
get ["class"]() {
|
|
38
|
+
return props.class;
|
|
39
|
+
},
|
|
40
|
+
get label() {
|
|
41
|
+
return props.label;
|
|
42
|
+
},
|
|
43
|
+
get description() {
|
|
44
|
+
return props.description;
|
|
45
|
+
},
|
|
46
|
+
get error() {
|
|
47
|
+
return props.error;
|
|
48
|
+
},
|
|
49
|
+
get required() {
|
|
50
|
+
return props.required;
|
|
51
|
+
},
|
|
52
|
+
get disabled() {
|
|
53
|
+
return props.disabled;
|
|
54
|
+
},
|
|
55
|
+
get children() {
|
|
56
|
+
return _$ssr(_tmpl$, _$ssrAttribute("aria-label", props.label ? _$escape(undefined, true) : _$escape(props["aria-label"], true), false) + _$ssrAttribute("aria-labelledby", props.label ? _$escape(meta.labelId, true) : _$escape(undefined, true), false) + _$ssrAttribute("aria-describedby", _$escape(fieldDescribedBy(meta, props), true), false) + _$ssrAttribute("aria-disabled", props.disabled ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("aria-busy", props.busy ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Index, {
|
|
57
|
+
get each() {
|
|
58
|
+
return props.options;
|
|
59
|
+
},
|
|
60
|
+
children: (option, index) => {
|
|
61
|
+
const checked = () => value() === option().value;
|
|
62
|
+
const descriptionId = `${meta.controlId}-option-${index}`;
|
|
63
|
+
return [_$ssr(_tmpl$4, _$ssrAttribute("aria-checked", _$escape(checked(), true), false) + _$ssrAttribute("aria-describedby", option().description ? _$escape(descriptionId, true) : _$escape(undefined, true), false), _$ssrAttribute("disabled", props.disabled, true) + _$ssrAttribute("tabindex", tabStop(option(), index) ? 0 : -1, false), _$escape(option().label), _$escape(_$createComponent(Show, {
|
|
64
|
+
get when() {
|
|
65
|
+
return option().marker;
|
|
66
|
+
},
|
|
67
|
+
children: marker => _$ssr(_tmpl$6, _$escape(marker()))
|
|
68
|
+
})), _$escape(_$createComponent(Show, {
|
|
69
|
+
get when() {
|
|
70
|
+
return _$memo(() => !!checked())() && props.busy;
|
|
71
|
+
},
|
|
72
|
+
get children() {
|
|
73
|
+
return _$ssr(_tmpl$2, _$ssrAttribute("aria-label", _$escape(props.busyLabel, true), false));
|
|
74
|
+
}
|
|
75
|
+
})), _$escape(_$createComponent(Show, {
|
|
76
|
+
get when() {
|
|
77
|
+
return option().description;
|
|
78
|
+
},
|
|
79
|
+
get children() {
|
|
80
|
+
return _$ssr(_tmpl$3, _$ssrAttribute("id", _$escape(descriptionId, true), false), _$escape(option().description));
|
|
81
|
+
}
|
|
82
|
+
}))), _$createComponent(Show, {
|
|
83
|
+
get when() {
|
|
84
|
+
return _$memo(() => !!checked())() && props.details;
|
|
85
|
+
},
|
|
86
|
+
get children() {
|
|
87
|
+
return _$ssr(_tmpl$5, _$escape(props.details));
|
|
88
|
+
}
|
|
89
|
+
})];
|
|
90
|
+
}
|
|
91
|
+
})));
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
//# 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,191 @@
|
|
|
1
|
+
import { ssrStyleProperty as _$ssrStyleProperty } from "solid-js/web";
|
|
2
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
3
|
+
import { ssr as _$ssr } from "solid-js/web";
|
|
4
|
+
import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
|
|
5
|
+
import { escape as _$escape } from "solid-js/web";
|
|
6
|
+
var _tmpl$ = "<i class=\"ti ti-alert-triangle\" aria-hidden=\"true\"></i>",
|
|
7
|
+
_tmpl$2 = ["<div", " class=\"k2b-choice-slider__track\" role=\"slider\"", " aria-valuemin=\"1\"", ">", "", "<span class=\"k2b-choice-slider__thumb\"", "", " style=\"", "\"></span></div>"],
|
|
8
|
+
_tmpl$3 = ["<div", "><p class=\"k2b-choice-slider__line\"", " aria-live=\"polite\">", "<span>", "</span></p>", "</div>"],
|
|
9
|
+
_tmpl$4 = ["<span class=\"k2b-choice-slider__segment\"", " style=\"", "\"></span>"],
|
|
10
|
+
_tmpl$5 = ["<span class=\"k2b-choice-slider__stop\"", " style=\"", "\"></span>"];
|
|
11
|
+
import { createEffect, createMemo, createSignal, For, on, Show } from "solid-js";
|
|
12
|
+
import { resolveMaybeAccessor } from "./field-contract";
|
|
13
|
+
const position = (index, count) => count < 2 ? 0 : index / (count - 1) * 100;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* A slider over a few named stops. The fixed line above the track always shows
|
|
17
|
+
* the active stop's description, or why a stop cannot be chosen; its height
|
|
18
|
+
* never changes. Unavailable stops stay visible and are skipped.
|
|
19
|
+
*/
|
|
20
|
+
export function ChoiceSlider(props) {
|
|
21
|
+
// The previewed stop by value, so a change of the options can never leave it pointing at another stop.
|
|
22
|
+
const [previewValue, setPreviewValue] = createSignal(null);
|
|
23
|
+
const [notice, setNotice] = createSignal(null);
|
|
24
|
+
let track;
|
|
25
|
+
let drag = null;
|
|
26
|
+
const count = () => props.options.length;
|
|
27
|
+
const chosen = createMemo(() => {
|
|
28
|
+
const value = resolveMaybeAccessor(props.value);
|
|
29
|
+
return value === null ? -1 : props.options.findIndex(option => option.value === value);
|
|
30
|
+
});
|
|
31
|
+
const preview = createMemo(() => {
|
|
32
|
+
const value = previewValue();
|
|
33
|
+
const index = value === null ? -1 : props.options.findIndex(option => option.value === value);
|
|
34
|
+
return index < 0 ? null : index;
|
|
35
|
+
});
|
|
36
|
+
const setPreview = index => setPreviewValue(index === null ? null : props.options[index]?.value ?? null);
|
|
37
|
+
const shown = () => preview() ?? chosen();
|
|
38
|
+
const option = () => props.options[shown()];
|
|
39
|
+
const available = index => props.options[index] !== undefined && !props.options[index]?.disabledReason;
|
|
40
|
+
const warning = () => notice() ?? (preview() === null ? option()?.disabledReason ?? null : null);
|
|
41
|
+
const line = () => warning() ?? option()?.description ?? (shown() < 0 ? props.description : undefined) ?? "";
|
|
42
|
+
createEffect(on(chosen, () => {
|
|
43
|
+
setPreview(null);
|
|
44
|
+
setNotice(null);
|
|
45
|
+
}));
|
|
46
|
+
// A drag ends without a choice when its stop disappears, becomes unavailable, or the slider is disabled.
|
|
47
|
+
createEffect(() => {
|
|
48
|
+
const index = preview();
|
|
49
|
+
if (previewValue() !== null && (index === null || !available(index) || props.disabled)) {
|
|
50
|
+
drag = null;
|
|
51
|
+
setPreviewValue(null);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
createEffect(on(preview, index => props.onActiveChange?.(index === null ? null : props.options[index]?.value ?? null), {
|
|
55
|
+
defer: true
|
|
56
|
+
}));
|
|
57
|
+
const valueText = () => {
|
|
58
|
+
const current = option();
|
|
59
|
+
if (!current) return props.description ?? "";
|
|
60
|
+
return current.valueText ?? [current.label, warning() ?? current.description].filter(Boolean).join(", ");
|
|
61
|
+
};
|
|
62
|
+
const nearestAvailable = at => {
|
|
63
|
+
let best = null;
|
|
64
|
+
for (let index = 0; index < count(); index += 1) {
|
|
65
|
+
if (available(index) && (best === null || Math.abs(index - at) < Math.abs(best - at))) best = index;
|
|
66
|
+
}
|
|
67
|
+
return best;
|
|
68
|
+
};
|
|
69
|
+
const commit = index => {
|
|
70
|
+
const next = props.options[index];
|
|
71
|
+
setPreview(null);
|
|
72
|
+
if (next && !props.disabled && available(index) && index !== chosen()) props.onValueChange?.(next.value);
|
|
73
|
+
};
|
|
74
|
+
const step = direction => {
|
|
75
|
+
const from = shown() < 0 ? direction > 0 ? -1 : count() : shown();
|
|
76
|
+
for (let index = from + direction; index >= 0 && index < count(); index += direction) {
|
|
77
|
+
if (available(index)) {
|
|
78
|
+
setNotice(null);
|
|
79
|
+
commit(index);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const neighbour = props.options[from + direction];
|
|
84
|
+
if (neighbour?.disabledReason) setNotice(neighbour.disabledReason);
|
|
85
|
+
};
|
|
86
|
+
const edge = end => {
|
|
87
|
+
const indexes = props.options.map((_, index) => index).filter(available);
|
|
88
|
+
const target = end ? indexes.at(-1) : indexes[0];
|
|
89
|
+
if (target !== undefined) {
|
|
90
|
+
setNotice(null);
|
|
91
|
+
commit(target);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
const onKeyDown = event => {
|
|
95
|
+
if (props.disabled) return;
|
|
96
|
+
const keys = {
|
|
97
|
+
ArrowRight: () => step(1),
|
|
98
|
+
ArrowUp: () => step(1),
|
|
99
|
+
PageUp: () => step(1),
|
|
100
|
+
ArrowLeft: () => step(-1),
|
|
101
|
+
ArrowDown: () => step(-1),
|
|
102
|
+
PageDown: () => step(-1),
|
|
103
|
+
Home: () => edge(false),
|
|
104
|
+
End: () => edge(true)
|
|
105
|
+
};
|
|
106
|
+
const action = keys[event.key];
|
|
107
|
+
if (!action) return;
|
|
108
|
+
event.preventDefault();
|
|
109
|
+
action();
|
|
110
|
+
};
|
|
111
|
+
const at = clientX => {
|
|
112
|
+
const rect = track?.getBoundingClientRect();
|
|
113
|
+
if (!rect || rect.width === 0) return 0;
|
|
114
|
+
return Math.max(0, Math.min(1, (clientX - rect.left) / rect.width)) * (count() - 1);
|
|
115
|
+
};
|
|
116
|
+
const onPointerDown = event => {
|
|
117
|
+
// One pointer owns a drag; a second finger waits until it ends.
|
|
118
|
+
if (props.disabled || count() < 2 || event.button !== 0 || drag) return;
|
|
119
|
+
event.preventDefault();
|
|
120
|
+
track?.focus({
|
|
121
|
+
preventScroll: true
|
|
122
|
+
});
|
|
123
|
+
track?.setPointerCapture?.(event.pointerId);
|
|
124
|
+
const near = Math.round(at(event.clientX));
|
|
125
|
+
const pressed = props.options[near];
|
|
126
|
+
if (pressed?.disabledReason) {
|
|
127
|
+
drag = {
|
|
128
|
+
pointerId: event.pointerId,
|
|
129
|
+
blocked: near,
|
|
130
|
+
startX: event.clientX
|
|
131
|
+
};
|
|
132
|
+
setNotice(pressed.disabledReason);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
drag = {
|
|
136
|
+
pointerId: event.pointerId,
|
|
137
|
+
blocked: null,
|
|
138
|
+
startX: event.clientX
|
|
139
|
+
};
|
|
140
|
+
setNotice(null);
|
|
141
|
+
setPreview(nearestAvailable(at(event.clientX)));
|
|
142
|
+
};
|
|
143
|
+
const onPointerMove = event => {
|
|
144
|
+
if (!drag || drag.pointerId !== event.pointerId) return;
|
|
145
|
+
if (drag.blocked !== null && Math.abs(event.clientX - drag.startX) <= 2) return;
|
|
146
|
+
drag.blocked = null;
|
|
147
|
+
const next = nearestAvailable(at(event.clientX));
|
|
148
|
+
if (next !== null) {
|
|
149
|
+
setNotice(null);
|
|
150
|
+
setPreview(next);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
/** Only a release chooses; a cancel or a lost capture puts the slider back on its value. */
|
|
155
|
+
const onPointerEnd = event => {
|
|
156
|
+
if (!drag || drag.pointerId !== event.pointerId) return;
|
|
157
|
+
drag = null;
|
|
158
|
+
const index = preview();
|
|
159
|
+
if (event.type !== "pointerup" || index === null) {
|
|
160
|
+
setPreview(null);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
commit(index);
|
|
164
|
+
};
|
|
165
|
+
return _$ssr(_tmpl$3, _$ssrAttribute("class", _$escape(["k2b-choice-slider", props.class].filter(Boolean).join(" "), true), false) + _$ssrAttribute("data-size", _$escape(props.size ?? "md", true), false), _$ssrAttribute("data-tone", warning() ? "warning" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
|
|
166
|
+
get when() {
|
|
167
|
+
return warning();
|
|
168
|
+
},
|
|
169
|
+
get children() {
|
|
170
|
+
return _$ssr(_tmpl$);
|
|
171
|
+
}
|
|
172
|
+
})), _$escape(line()), _$escape(_$createComponent(Show, {
|
|
173
|
+
get when() {
|
|
174
|
+
return count() >= 2;
|
|
175
|
+
},
|
|
176
|
+
get children() {
|
|
177
|
+
return _$ssr(_tmpl$2, _$ssrAttribute("id", _$escape(props.id, true), false), _$ssrAttribute("tabindex", props.disabled ? -1 : 0, false) + _$ssrAttribute("aria-label", _$escape(props["aria-label"], true), false) + _$ssrAttribute("aria-labelledby", _$escape(props["aria-labelledby"], true), false), _$ssrAttribute("aria-valuemax", _$escape(count(), true), false) + _$ssrAttribute("aria-valuenow", _$escape(Math.max(0, shown()), true) + 1, false) + _$ssrAttribute("aria-valuetext", _$escape(valueText(), true), false) + _$ssrAttribute("aria-disabled", props.disabled ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(For, {
|
|
178
|
+
get each() {
|
|
179
|
+
return props.options.slice(1);
|
|
180
|
+
},
|
|
181
|
+
children: (_, index) => _$ssr(_tmpl$4, _$ssrAttribute("data-on", shown() > index() ? "" : _$escape(undefined, true), false), _$ssrStyleProperty("left:", `calc(${_$escape(position(index(), count()), true)}% + 8px)`) + _$ssrStyleProperty(";width:", `calc(${_$escape(position(index() + 1, count()), true) - _$escape(position(index(), count()), true)}% - 16px)`))
|
|
182
|
+
})), _$escape(_$createComponent(For, {
|
|
183
|
+
get each() {
|
|
184
|
+
return props.options;
|
|
185
|
+
},
|
|
186
|
+
children: (stop, index) => _$ssr(_tmpl$5, _$ssrAttribute("data-on", shown() > index() ? "" : _$escape(undefined, true), false) + _$ssrAttribute("data-unavailable", stop.disabledReason ? "" : _$escape(undefined, true), false) + _$ssrAttribute("data-current", index() === shown() ? "" : _$escape(undefined, true), false), _$ssrStyleProperty("left:", `${_$escape(position(index(), count()), true)}%`))
|
|
187
|
+
})), _$ssrAttribute("data-tone", warning() && preview() === null && option()?.disabledReason ? "warning" : _$escape(undefined, true), false), _$ssrAttribute("hidden", shown() < 0, true), _$ssrStyleProperty("left:", `${_$escape(position(Math.max(0, shown()), count()), true)}%`));
|
|
188
|
+
}
|
|
189
|
+
})));
|
|
190
|
+
}
|
|
191
|
+
//# 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":[]}
|