@k2b/ui 0.27.0 → 0.29.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/README.md +1 -1
- package/dist/base.css +147 -2
- package/dist/browser/actions/ContextMenu.js +35 -4
- package/dist/browser/actions/ContextMenu.js.map +1 -1
- package/dist/browser/actions/DragAndDrop.js +89 -0
- package/dist/browser/actions/DragAndDrop.js.map +1 -0
- package/dist/browser/actions/Dropdown.js +184 -158
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/GestureMenu.js +95 -139
- package/dist/browser/actions/GestureMenu.js.map +1 -1
- package/dist/browser/actions/Toolbar.js +379 -48
- package/dist/browser/actions/Toolbar.js.map +1 -1
- package/dist/browser/actions/drag-and-drop-messages.js +75 -0
- package/dist/browser/actions/drag-and-drop-messages.js.map +1 -0
- package/dist/browser/actions/drag-and-drop.js +692 -0
- package/dist/browser/actions/drag-and-drop.js.map +1 -0
- package/dist/browser/actions/index.js +1 -0
- package/dist/browser/actions/index.js.map +1 -1
- package/dist/browser/actions/menu-rows.js +15 -0
- package/dist/browser/actions/menu-rows.js.map +1 -0
- package/dist/browser/actions/menu-sheet.js +154 -0
- package/dist/browser/actions/menu-sheet.js.map +1 -0
- package/dist/browser/actions/toolbar-messages.js +20 -0
- package/dist/browser/actions/toolbar-messages.js.map +1 -0
- package/dist/browser/chart-inspection.js +3 -0
- package/dist/browser/chart-inspection.js.map +1 -0
- package/dist/browser/chat/ChatComposer.js +714 -410
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/chat/ChatDecision.js +778 -0
- package/dist/browser/chat/ChatDecision.js.map +1 -0
- package/dist/browser/chat/ChatPrimitives.js +34 -28
- package/dist/browser/chat/ChatPrimitives.js.map +1 -1
- package/dist/browser/chat/ChatTimeline.js.map +1 -1
- package/dist/browser/chat/chat-messages.js +25 -1
- package/dist/browser/chat/chat-messages.js.map +1 -1
- package/dist/browser/chat/command-search.js +13 -3
- package/dist/browser/chat/command-search.js.map +1 -1
- package/dist/browser/chat/index.js +8 -1
- package/dist/browser/chat/index.js.map +1 -1
- package/dist/browser/chat/reaction-people.js +15 -0
- package/dist/browser/chat/reaction-people.js.map +1 -0
- package/dist/browser/chat/types.js.map +1 -1
- package/dist/browser/content/Calendar.js +3 -3
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/Chart.js +60 -86
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartSnapshotView.js +7 -10
- package/dist/browser/content/ChartSnapshotView.js.map +1 -1
- package/dist/browser/content/FileBrowser.js +2 -2
- package/dist/browser/content/FileBrowser.js.map +1 -1
- package/dist/browser/content/FileTree.js +42 -36
- package/dist/browser/content/FileTree.js.map +1 -1
- package/dist/browser/content/FileTypeIcon.js +72 -0
- package/dist/browser/content/FileTypeIcon.js.map +1 -0
- package/dist/browser/content/FileView.js +2 -2
- package/dist/browser/content/FileView.js.map +1 -1
- package/dist/browser/content/MessageRow.js +330 -448
- package/dist/browser/content/MessageRow.js.map +1 -1
- package/dist/browser/content/ReactionBar.js +419 -0
- package/dist/browser/content/ReactionBar.js.map +1 -0
- package/dist/browser/content/ReferenceChip.js +162 -0
- package/dist/browser/content/ReferenceChip.js.map +1 -0
- package/dist/browser/content/calendar-pointer.js +9 -0
- package/dist/browser/content/calendar-pointer.js.map +1 -1
- package/dist/browser/content/calendar-time-view.js +6 -3
- package/dist/browser/content/calendar-time-view.js.map +1 -1
- package/dist/browser/content/chart-inspection-core.js +557 -0
- package/dist/browser/content/chart-inspection-core.js.map +1 -0
- package/dist/browser/content/chart-inspection.js +10 -445
- package/dist/browser/content/chart-inspection.js.map +1 -1
- package/dist/browser/content/chart-line-gaps.js +1 -1
- package/dist/browser/content/chart-line-gaps.js.map +1 -1
- package/dist/browser/content/chart-snapshot.js +1 -1
- package/dist/browser/content/chart-snapshot.js.map +1 -1
- package/dist/browser/content/index.js +3 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/feedback/dialog-core.js +135 -23
- package/dist/browser/feedback/dialog-core.js.map +1 -1
- package/dist/browser/index.js +1 -0
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/input-mode.js +40 -0
- package/dist/browser/input-mode.js.map +1 -0
- package/dist/browser/inputs/FileDropTarget.js +24 -9
- package/dist/browser/inputs/FileDropTarget.js.map +1 -1
- package/dist/browser/inputs/FileInputs.js +2 -2
- package/dist/browser/inputs/FileInputs.js.map +1 -1
- package/dist/browser/inputs/SelectChip.js +9 -0
- package/dist/browser/inputs/SelectChip.js.map +1 -1
- package/dist/browser/inputs/emoji/EmojiPicker.js +13 -0
- package/dist/browser/inputs/emoji/EmojiPicker.js.map +1 -1
- package/dist/browser/inputs/file-drop.js.map +1 -1
- package/dist/browser/layout/AppOverview.js +1 -1
- package/dist/browser/layout/AppOverview.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +644 -445
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/DetailPanel.js +283 -197
- package/dist/browser/layout/DetailPanel.js.map +1 -1
- package/dist/browser/layout/Discussion.js +233 -185
- package/dist/browser/layout/Discussion.js.map +1 -1
- package/dist/browser/layout/PanelDialog.js +88 -86
- package/dist/browser/layout/PanelDialog.js.map +1 -1
- package/dist/browser/layout/ResizeSeparator.js +81 -0
- package/dist/browser/layout/ResizeSeparator.js.map +1 -0
- package/dist/browser/layout/SidebarSwitcher.js +9 -2
- package/dist/browser/layout/SidebarSwitcher.js.map +1 -1
- package/dist/browser/layout/TabBar.js +15 -12
- package/dist/browser/layout/TabBar.js.map +1 -1
- package/dist/browser/layout/TableOfContents.js +10 -2
- package/dist/browser/layout/TableOfContents.js.map +1 -1
- package/dist/browser/layout/app-workspace-controller.js +130 -17
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/detail-panel-messages.js +35 -0
- package/dist/browser/layout/detail-panel-messages.js.map +1 -0
- package/dist/browser/layout/index.js +3 -1
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/layout/resize-separator.js +90 -0
- package/dist/browser/layout/resize-separator.js.map +1 -0
- package/dist/browser/layout/workspace-messages.js +12 -2
- package/dist/browser/layout/workspace-messages.js.map +1 -1
- package/dist/browser/surfaces/Avatar.js +50 -20
- package/dist/browser/surfaces/Avatar.js.map +1 -1
- package/dist/browser/surfaces/AvatarStack.js +406 -0
- package/dist/browser/surfaces/AvatarStack.js.map +1 -0
- package/dist/browser/surfaces/LinkCard.js +1 -1
- package/dist/browser/surfaces/LinkCard.js.map +1 -1
- package/dist/browser/surfaces/Placeholder.js +14 -3
- package/dist/browser/surfaces/Placeholder.js.map +1 -1
- package/dist/browser/surfaces/StatCell.js +23 -0
- package/dist/browser/surfaces/StatCell.js.map +1 -1
- package/dist/browser/surfaces/avatar-messages.js +8 -2
- package/dist/browser/surfaces/avatar-messages.js.map +1 -1
- package/dist/browser/surfaces/index.js +1 -0
- package/dist/browser/surfaces/index.js.map +1 -1
- package/dist/browser/widgets/Widget.js +1 -1
- package/dist/browser/widgets/Widget.js.map +1 -1
- package/dist/ssr/actions/ContextMenu.js +26 -3
- package/dist/ssr/actions/ContextMenu.js.map +1 -1
- package/dist/ssr/actions/DragAndDrop.js +63 -0
- package/dist/ssr/actions/DragAndDrop.js.map +1 -0
- package/dist/ssr/actions/Dropdown.js +140 -72
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/GestureMenu.js +76 -107
- package/dist/ssr/actions/GestureMenu.js.map +1 -1
- package/dist/ssr/actions/Toolbar.js +294 -14
- package/dist/ssr/actions/Toolbar.js.map +1 -1
- package/dist/ssr/actions/drag-and-drop-messages.js +75 -0
- package/dist/ssr/actions/drag-and-drop-messages.js.map +1 -0
- package/dist/ssr/actions/drag-and-drop.js +692 -0
- package/dist/ssr/actions/drag-and-drop.js.map +1 -0
- package/dist/ssr/actions/index.js +1 -0
- package/dist/ssr/actions/index.js.map +1 -1
- package/dist/ssr/actions/menu-rows.js +15 -0
- package/dist/ssr/actions/menu-rows.js.map +1 -0
- package/dist/ssr/actions/menu-sheet.js +138 -0
- package/dist/ssr/actions/menu-sheet.js.map +1 -0
- package/dist/ssr/actions/toolbar-messages.js +20 -0
- package/dist/ssr/actions/toolbar-messages.js.map +1 -0
- package/dist/ssr/chart-inspection.js +3 -0
- package/dist/ssr/chart-inspection.js.map +1 -0
- package/dist/ssr/chat/ChatComposer.js +393 -102
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/chat/ChatDecision.js +465 -0
- package/dist/ssr/chat/ChatDecision.js.map +1 -0
- package/dist/ssr/chat/ChatPrimitives.js +2 -2
- package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
- package/dist/ssr/chat/ChatTimeline.js.map +1 -1
- package/dist/ssr/chat/chat-messages.js +25 -1
- package/dist/ssr/chat/chat-messages.js.map +1 -1
- package/dist/ssr/chat/command-search.js +13 -3
- package/dist/ssr/chat/command-search.js.map +1 -1
- package/dist/ssr/chat/index.js +8 -1
- package/dist/ssr/chat/index.js.map +1 -1
- package/dist/ssr/chat/reaction-people.js +15 -0
- package/dist/ssr/chat/reaction-people.js.map +1 -0
- package/dist/ssr/chat/types.js.map +1 -1
- package/dist/ssr/content/Calendar.js +3 -3
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/Chart.js +25 -38
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartSnapshotView.js +7 -10
- package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
- package/dist/ssr/content/FileBrowser.js +2 -2
- package/dist/ssr/content/FileBrowser.js.map +1 -1
- package/dist/ssr/content/FileTree.js +21 -14
- package/dist/ssr/content/FileTree.js.map +1 -1
- package/dist/ssr/content/FileTypeIcon.js +50 -0
- package/dist/ssr/content/FileTypeIcon.js.map +1 -0
- package/dist/ssr/content/FileView.js +2 -2
- package/dist/ssr/content/FileView.js.map +1 -1
- package/dist/ssr/content/MessageRow.js +98 -152
- package/dist/ssr/content/MessageRow.js.map +1 -1
- package/dist/ssr/content/ReactionBar.js +304 -0
- package/dist/ssr/content/ReactionBar.js.map +1 -0
- package/dist/ssr/content/ReferenceChip.js +121 -0
- package/dist/ssr/content/ReferenceChip.js.map +1 -0
- package/dist/ssr/content/calendar-pointer.js +9 -0
- package/dist/ssr/content/calendar-pointer.js.map +1 -1
- package/dist/ssr/content/calendar-time-view.js +6 -3
- package/dist/ssr/content/calendar-time-view.js.map +1 -1
- package/dist/ssr/content/chart-inspection-core.js +557 -0
- package/dist/ssr/content/chart-inspection-core.js.map +1 -0
- package/dist/ssr/content/chart-inspection.js +10 -445
- package/dist/ssr/content/chart-inspection.js.map +1 -1
- package/dist/ssr/content/chart-line-gaps.js +1 -1
- package/dist/ssr/content/chart-line-gaps.js.map +1 -1
- package/dist/ssr/content/chart-snapshot.js +1 -1
- package/dist/ssr/content/chart-snapshot.js.map +1 -1
- package/dist/ssr/content/index.js +3 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/feedback/dialog-core.js +135 -23
- package/dist/ssr/feedback/dialog-core.js.map +1 -1
- package/dist/ssr/index.js +1 -0
- package/dist/ssr/index.js.map +1 -1
- package/dist/ssr/input-mode.js +40 -0
- package/dist/ssr/input-mode.js.map +1 -0
- package/dist/ssr/inputs/FileDropTarget.js +17 -5
- package/dist/ssr/inputs/FileDropTarget.js.map +1 -1
- package/dist/ssr/inputs/FileInputs.js +2 -2
- package/dist/ssr/inputs/FileInputs.js.map +1 -1
- package/dist/ssr/inputs/SelectChip.js +9 -0
- package/dist/ssr/inputs/SelectChip.js.map +1 -1
- package/dist/ssr/inputs/emoji/EmojiPicker.js +12 -0
- package/dist/ssr/inputs/emoji/EmojiPicker.js.map +1 -1
- package/dist/ssr/inputs/file-drop.js.map +1 -1
- package/dist/ssr/layout/AppOverview.js +1 -1
- package/dist/ssr/layout/AppOverview.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +272 -95
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/DetailPanel.js +112 -58
- package/dist/ssr/layout/DetailPanel.js.map +1 -1
- package/dist/ssr/layout/Discussion.js +63 -36
- package/dist/ssr/layout/Discussion.js.map +1 -1
- package/dist/ssr/layout/PanelDialog.js +7 -6
- package/dist/ssr/layout/PanelDialog.js.map +1 -1
- package/dist/ssr/layout/ResizeSeparator.js +45 -0
- package/dist/ssr/layout/ResizeSeparator.js.map +1 -0
- package/dist/ssr/layout/SidebarSwitcher.js +9 -2
- package/dist/ssr/layout/SidebarSwitcher.js.map +1 -1
- package/dist/ssr/layout/TabBar.js +1 -1
- package/dist/ssr/layout/TabBar.js.map +1 -1
- package/dist/ssr/layout/TableOfContents.js +10 -2
- package/dist/ssr/layout/TableOfContents.js.map +1 -1
- package/dist/ssr/layout/app-workspace-controller.js +130 -17
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/detail-panel-messages.js +35 -0
- package/dist/ssr/layout/detail-panel-messages.js.map +1 -0
- package/dist/ssr/layout/index.js +3 -1
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/layout/resize-separator.js +90 -0
- package/dist/ssr/layout/resize-separator.js.map +1 -0
- package/dist/ssr/layout/workspace-messages.js +12 -2
- package/dist/ssr/layout/workspace-messages.js.map +1 -1
- package/dist/ssr/surfaces/Avatar.js +20 -2
- package/dist/ssr/surfaces/Avatar.js.map +1 -1
- package/dist/ssr/surfaces/AvatarStack.js +286 -0
- package/dist/ssr/surfaces/AvatarStack.js.map +1 -0
- package/dist/ssr/surfaces/LinkCard.js +1 -1
- package/dist/ssr/surfaces/LinkCard.js.map +1 -1
- package/dist/ssr/surfaces/Placeholder.js +4 -2
- package/dist/ssr/surfaces/Placeholder.js.map +1 -1
- package/dist/ssr/surfaces/StatCell.js +23 -0
- package/dist/ssr/surfaces/StatCell.js.map +1 -1
- package/dist/ssr/surfaces/avatar-messages.js +8 -2
- package/dist/ssr/surfaces/avatar-messages.js.map +1 -1
- package/dist/ssr/surfaces/index.js +1 -0
- package/dist/ssr/surfaces/index.js.map +1 -1
- package/dist/ssr/widgets/Widget.js +1 -1
- package/dist/ssr/widgets/Widget.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/ContextMenu.d.ts +9 -0
- package/dist/types/actions/DragAndDrop.d.ts +29 -0
- package/dist/types/actions/Dropdown.d.ts +12 -5
- package/dist/types/actions/GestureMenu.d.ts +6 -4
- package/dist/types/actions/Toolbar.d.ts +20 -0
- package/dist/types/actions/drag-and-drop-messages.d.ts +35 -0
- package/dist/types/actions/drag-and-drop.d.ts +36 -0
- package/dist/types/actions/index.d.ts +3 -1
- package/dist/types/actions/menu-rows.d.ts +5 -0
- package/dist/types/actions/menu-sheet.d.ts +22 -0
- package/dist/types/actions/toolbar-messages.d.ts +8 -0
- package/dist/types/chart-inspection.d.ts +2 -0
- package/dist/types/chat/ChatComposer.d.ts +26 -1
- package/dist/types/chat/ChatDecision.d.ts +133 -0
- package/dist/types/chat/ChatPrimitives.d.ts +4 -1
- package/dist/types/chat/ChatTimeline.d.ts +2 -1
- package/dist/types/chat/chat-messages.d.ts +13 -2
- package/dist/types/chat/command-search.d.ts +5 -0
- package/dist/types/chat/index.d.ts +25 -1
- package/dist/types/chat/reaction-people.d.ts +9 -0
- package/dist/types/chat/types.d.ts +54 -1
- package/dist/types/content/Chart.d.ts +11 -5
- package/dist/types/content/FileTypeIcon.d.ts +27 -0
- package/dist/types/content/MessageRow.d.ts +3 -10
- package/dist/types/content/ReactionBar.d.ts +32 -0
- package/dist/types/content/ReferenceChip.d.ts +49 -0
- package/dist/types/content/calendar-pointer.d.ts +6 -0
- package/dist/types/content/chart-inspection-core.d.ts +61 -0
- package/dist/types/content/chart-inspection.d.ts +4 -20
- package/dist/types/content/chart-snapshot.d.ts +1 -1
- package/dist/types/content/index.d.ts +5 -1
- package/dist/types/feedback/dialog-core.d.ts +16 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/input-mode.d.ts +7 -0
- package/dist/types/inputs/FileDropTarget.d.ts +6 -3
- package/dist/types/inputs/SelectChip.d.ts +2 -0
- package/dist/types/inputs/file-drop.d.ts +2 -0
- package/dist/types/layout/AppWorkspace.d.ts +5 -3
- package/dist/types/layout/DetailPanel.d.ts +11 -0
- package/dist/types/layout/Discussion.d.ts +8 -0
- package/dist/types/layout/ResizeSeparator.d.ts +9 -0
- package/dist/types/layout/TabBar.d.ts +7 -0
- package/dist/types/layout/TableOfContents.d.ts +2 -0
- package/dist/types/layout/app-workspace-controller.d.ts +2 -0
- package/dist/types/layout/detail-panel-messages.d.ts +15 -0
- package/dist/types/layout/index.d.ts +3 -1
- package/dist/types/layout/resize-separator.d.ts +18 -0
- package/dist/types/layout/workspace-messages.d.ts +5 -0
- package/dist/types/surfaces/Avatar.d.ts +12 -0
- package/dist/types/surfaces/AvatarStack.d.ts +41 -0
- package/dist/types/surfaces/StatCell.d.ts +6 -0
- package/dist/types/surfaces/avatar-messages.d.ts +3 -0
- package/dist/types/surfaces/index.d.ts +3 -1
- package/package.json +7 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["actions/drag-and-drop.ts"],"sourcesContent":["import { createSignal } from \"solid-js\";\nimport { suppressTextSelection } from \"../internal/text-selection\";\nimport type { DragAndDropMessages } from \"./drag-and-drop-messages\";\n\nexport type DragPayload<Type extends string = string> = {\n /** What is dragged, such as \"mail.message\"; targets accept by this. */\n type: Type;\n /** Opaque to @k2b/ui: the application's reference, such as an ID or a ref string. */\n value: string;\n /** Names the item in the preview and in announcements. */\n label: string;\n /** Tabler class for the preview, such as \"ti ti-mail\". */\n icon?: string;\n /** More than one item is dragged: shown as a count on the preview. */\n count?: number;\n};\n\nconst SLOP = 10;\nconst IGNORE = \"input, textarea, select, [contenteditable]:not([contenteditable='false']), [data-drag-ignore]\";\nconst HOLD_MS = 500;\nconst AUTOSCROLL_EDGE = 32;\nconst [readActiveDrag, setActiveDrag] = createSignal<DragPayload>();\n/** Reactive payload of the drag in progress, or undefined. */\nexport const activeDrag = (): DragPayload | undefined => readActiveDrag();\nconst dragStartListeners = new Set<(pointerId: number) => void>();\n/** Internal hand-over to the gesture menu that owns this press. */\nexport const onPointerDragStart = (listener: (pointerId: number) => void): (() => void) => {\n dragStartListeners.add(listener);\n return () => dragStartListeners.delete(listener);\n};\n\ntype Target = {\n element: HTMLElement;\n accept: readonly string[];\n label: string;\n messages: DragAndDropMessages;\n disabled?: boolean;\n drop: (payload: DragPayload) => void;\n};\ntype Session = {\n payload: DragPayload;\n origin: HTMLElement;\n cancel: () => void;\n targetsChanged?: () => void;\n};\ntype Engine = {\n targets: Set<Target>;\n byElement: WeakMap<Element, Target>;\n session?: Session;\n abandonPress?: () => void;\n};\nconst engines = new WeakMap<Document, Engine>();\nconst engineFor = (doc: Document): Engine => {\n let engine = engines.get(doc);\n if (!engine) {\n engine = { targets: new Set(), byElement: new WeakMap() };\n engines.set(doc, engine);\n }\n return engine;\n};\nconst accepts = (target: Target, payload: DragPayload) =>\n target.element.isConnected && !target.disabled && target.accept.includes(payload.type);\nconst isModal = (dialog: Element) => {\n try {\n return dialog.matches(\":modal\");\n } catch {\n return dialog.matches(\"dialog[open]\");\n }\n};\n/** The modal dialog around an element; while one is open, everything outside of it is inert. */\nconst modalOf = (element: Element): Element | undefined => {\n for (let dialog = element.closest(\"dialog\"); dialog; dialog = dialog.parentElement?.closest(\"dialog\") ?? null)\n if (isModal(dialog)) return dialog;\n return undefined;\n};\nconst visible = (element: Element) =>\n typeof element.checkVisibility === \"function\"\n ? element.checkVisibility({ checkVisibilityCSS: true })\n : element.getClientRects().length > 0 && getComputedStyle(element).visibility !== \"hidden\";\n/**\n * A keyboard destination must be one a pointer could reach from where the pickup started: shown and visible, not\n * inert, and in the same modal dialog as the origin.\n */\nconst reachable = (target: Target, origin: HTMLElement) => {\n const element = target.element;\n if (element.closest(\"[inert]\") || modalOf(element) !== modalOf(origin)) return false;\n return visible(element);\n};\nconst mark = (target: Target, payload?: DragPayload) => {\n if (payload && accepts(target, payload)) target.element.dataset.drop = \"ok\";\n else delete target.element.dataset.drop;\n};\nconst containerFor = (origin: HTMLElement): HTMLElement => {\n try {\n return origin.closest<HTMLDialogElement>(\"dialog[open]:modal\") ?? origin.ownerDocument.body;\n } catch {\n return origin.closest<HTMLDialogElement>(\"dialog[open]\") ?? origin.ownerDocument.body;\n }\n};\n/** A live region needs a moment between being inserted and being written to, or its first text goes unread. */\nconst ANNOUNCE_DELAY_MS = 100;\ntype Announcer = { region: HTMLElement; ready: number; queue: string[] };\n/** One live region per container: the body, or the modal dialog the drag happens in, as outside of it is inert. */\nconst announcers = new WeakMap<Element, Announcer>();\nconst announcerFor = (origin: HTMLElement): Announcer => {\n const parent = containerFor(origin);\n let announcer = announcers.get(parent);\n if (!announcer || announcer.region.parentElement !== parent) {\n const region = origin.ownerDocument.createElement(\"div\");\n region.className = \"k2b-drag-announcer\";\n region.setAttribute(\"role\", \"status\");\n region.setAttribute(\"aria-live\", \"polite\");\n region.setAttribute(\"aria-atomic\", \"true\");\n Object.assign(region.style, {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n clip: \"rect(0, 0, 0, 0)\",\n overflow: \"hidden\",\n whiteSpace: \"nowrap\",\n });\n // First in a dialog: a dialog stack keeps its top level as the dialog's last child, and finds it there.\n if (parent === origin.ownerDocument.body) parent.append(region);\n else parent.prepend(region);\n announcer = { region, ready: performance.now() + ANNOUNCE_DELAY_MS, queue: [] };\n announcers.set(parent, announcer);\n }\n return announcer;\n};\nconst announce = (origin: HTMLElement, text: string) => {\n const announcer = announcerFor(origin);\n const write = (next: string) => {\n announcer.region.textContent = announcer.region.textContent === next ? `${next}\\u00a0` : next;\n };\n const wait = announcer.ready - performance.now();\n if (wait <= 0 && !announcer.queue.length) {\n write(text);\n return;\n }\n // Texts that come before the region is ready are read together once it is, so none replaces another unread.\n if (announcer.queue.push(text) > 1) return;\n origin.ownerDocument.defaultView!.setTimeout(() => write(announcer.queue.splice(0).join(\" \")), Math.max(0, wait));\n};\n\nexport const registerDropTarget = (element: HTMLElement, initial: Omit<Target, \"element\">) => {\n const engine = engineFor(element.ownerDocument);\n const entry: Target = { element, ...initial };\n // The live region exists long before the first drag, so its first announcement is read.\n announcerFor(element);\n engine.targets.add(entry);\n engine.byElement.set(element, entry);\n mark(entry, engine.session?.payload);\n engine.session?.targetsChanged?.();\n return {\n update(next: Omit<Target, \"element\">) {\n Object.assign(entry, next);\n mark(entry, engine.session?.payload);\n engine.session?.targetsChanged?.();\n },\n dispose() {\n engine.targets.delete(entry);\n engine.byElement.delete(element);\n delete element.dataset.drop;\n engine.session?.targetsChanged?.();\n },\n };\n};\n\nconst clearSession = (engine: Engine, session: Session, source?: HTMLElement) => {\n if (engine.session !== session) return;\n engine.session = undefined;\n if (source) delete source.dataset.dragging;\n for (const target of engine.targets) mark(target);\n setActiveDrag(undefined);\n};\n\n/**\n * Suppresses the click and touchend that follow the release of a drag or a hold. A drag cancelled while the button is\n * still down waits for that pointer's release; a new press or a cancelled pointer drops the wait.\n */\nconst swallowRelease = (doc: Document, pointerId?: number) => {\n const win = doc.defaultView!;\n if (pointerId !== undefined) {\n const stop = () => {\n win.removeEventListener(\"pointerup\", released, true);\n win.removeEventListener(\"pointercancel\", gone, true);\n win.removeEventListener(\"pointerdown\", gone, true);\n };\n const released = (event: PointerEvent) => {\n if (event.pointerId !== pointerId) return;\n stop();\n swallowRelease(doc);\n };\n const gone = (event: PointerEvent) => {\n if (event.type === \"pointerdown\" || event.pointerId === pointerId) stop();\n };\n win.addEventListener(\"pointerup\", released, true);\n win.addEventListener(\"pointercancel\", gone, true);\n win.addEventListener(\"pointerdown\", gone, true);\n return;\n }\n const click = (event: Event) => {\n event.preventDefault();\n event.stopImmediatePropagation();\n win.removeEventListener(\"click\", click, true);\n };\n const touchEnd = (event: Event) => event.preventDefault();\n win.addEventListener(\"click\", click, true);\n win.addEventListener(\"touchend\", touchEnd, { capture: true, passive: false });\n win.setTimeout(() => {\n win.removeEventListener(\"click\", click, true);\n win.removeEventListener(\"touchend\", touchEnd, true);\n }, 0);\n};\n\n/** Walks ancestors only; neither hit testing nor scrolling scans the target registry. */\nconst SCROLLS = /^(auto|scroll|overlay)$/;\nconst LOCKED = /^(hidden|clip)$/;\n/**\n * Scrolls the first container under the pointer that can still scroll toward the edge the pointer rests near. The\n * walk stops at a dialog, so the page behind a modal never scrolls, and the viewport scrolls only while the page is\n * not locked, as `dialogCore` locks it with `overflow: hidden`.\n */\nconst scrollAt = (doc: Document, hit: Element | null, x: number, y: number, cache: WeakMap<Element, { x: string; y: string }>) => {\n const win = doc.defaultView!;\n const root = doc.scrollingElement;\n const overflowOf = (element: Element) => {\n let overflow = cache.get(element);\n if (!overflow) {\n const style = win.getComputedStyle(element);\n overflow = { x: style.overflowX, y: style.overflowY };\n cache.set(element, overflow);\n }\n return overflow;\n };\n for (let element = hit; element; element = element.parentElement) {\n const viewport = element === root;\n let canX: boolean;\n let canY: boolean;\n if (viewport) {\n // The body's overflow applies to the viewport while the root's is visible.\n const own = overflowOf(element);\n const body = doc.body ? overflowOf(doc.body) : own;\n canX = !LOCKED.test(own.x) && !(own.x === \"visible\" && LOCKED.test(body.x));\n canY = !LOCKED.test(own.y) && !(own.y === \"visible\" && LOCKED.test(body.y));\n } else {\n const own = overflowOf(element);\n canX = SCROLLS.test(own.x);\n canY = SCROLLS.test(own.y);\n }\n const rect = viewport ? { left: 0, top: 0, right: win.innerWidth, bottom: win.innerHeight } : element.getBoundingClientRect();\n const step = (point: number, start: number, end: number, position: number, max: number) => {\n if (point < start || point > end) return 0;\n const before = point - start;\n const after = end - point;\n if (before < AUTOSCROLL_EDGE && position > 0) return -Math.max(1, Math.ceil(12 * (1 - before / AUTOSCROLL_EDGE)));\n if (after < AUTOSCROLL_EDGE && position < max) return Math.max(1, Math.ceil(12 * (1 - after / AUTOSCROLL_EDGE)));\n return 0;\n };\n const dx = canX\n ? step(x, rect.left, rect.right, element.scrollLeft, element.scrollWidth - (viewport ? win.innerWidth : element.clientWidth))\n : 0;\n const dy = canY\n ? step(y, rect.top, rect.bottom, element.scrollTop, element.scrollHeight - (viewport ? win.innerHeight : element.clientHeight))\n : 0;\n if (dx || dy) {\n const beforeX = element.scrollLeft;\n const beforeY = element.scrollTop;\n element.scrollLeft += dx;\n element.scrollTop += dy;\n if (element.scrollLeft !== beforeX || element.scrollTop !== beforeY) return true;\n }\n if (element instanceof HTMLDialogElement) return false;\n }\n return false;\n};\n\nexport const bindDragSource = (\n source: HTMLElement,\n read: () => { payload: DragPayload; disabled?: boolean; messages: DragAndDropMessages },\n): (() => void) => {\n const doc = source.ownerDocument;\n const win = doc.defaultView!;\n const engine = engineFor(doc);\n let abandon: (() => void) | undefined;\n /** Set while a held finger or a drag owns the touch, so the page must not scroll. */\n let blockTouch = false;\n /**\n * Bound for the source's whole life: WebKit decides at touchstart whether a touch can still be kept from scrolling,\n * and only a non-passive listener present by then lets the later hold do so.\n */\n const preventScroll = (event: TouchEvent) => {\n if (blockTouch && event.cancelable) event.preventDefault();\n };\n /**\n * Fields, editable text, and marked regions inside the source keep their own press and native drag, and so does a\n * whole source inside editable content, such as a paragraph in an editor.\n */\n const ignored = (target: EventTarget | null) => {\n // An SVG part has no editable state of its own; its nearest HTML ancestor tells.\n let html = target instanceof Element ? target : null;\n while (html && !(html instanceof HTMLElement)) html = html.parentElement;\n if (html instanceof HTMLElement && html.isContentEditable) return true;\n const found = target instanceof Element ? target.closest(IGNORE) : null;\n return found !== null && source.contains(found);\n };\n const nativeDrag = (event: Event) => {\n if (!ignored(event.target)) event.preventDefault();\n };\n const down = (event: PointerEvent) => {\n if (!event.isPrimary || event.button !== 0 || engine.session || read().disabled) return;\n if (!(event.target instanceof Element) || event.target.closest(\".k2b-drag-source\") !== source) return;\n if (ignored(event.target)) return;\n engine.abandonPress?.();\n // Ready before the drag starts, so its first announcement is read.\n announcerFor(source);\n const id = event.pointerId;\n const mouse = event.pointerType === \"mouse\";\n const start = { x: event.clientX, y: event.clientY };\n let point = start;\n let held = false;\n let finished = false;\n /** The pointer went up or away, so no click of this press is still to come. */\n let released = false;\n let session: Session | undefined;\n let messages: DragAndDropMessages;\n let preview: HTMLElement | undefined;\n let releaseSelection: (() => void) | undefined;\n let frame = 0;\n let timer: number | undefined;\n let over: Target | undefined;\n let refused: Target | undefined;\n const overflowCache = new WeakMap<Element, { x: string; y: string }>();\n const hold = () => {\n if (held || finished) return;\n win.clearTimeout(timer);\n if (read().disabled) {\n cancel();\n return;\n }\n held = true;\n blockTouch = true;\n source.dataset.held = \"\";\n win.addEventListener(\"keydown\", key, true);\n };\n // Android reports a long press as a context-menu event, which may come before the timer and opens a GestureMenu\n // around the source then. It counts as the hold, so the following move drags.\n const preventContext = (event: Event) => {\n event.preventDefault();\n if (!session) hold();\n };\n const clean = () => {\n if (finished) return;\n finished = true;\n win.clearTimeout(timer);\n win.cancelAnimationFrame(frame);\n win.removeEventListener(\"pointermove\", move, true);\n win.removeEventListener(\"pointerup\", up, true);\n win.removeEventListener(\"pointercancel\", cancelPointer, true);\n win.removeEventListener(\"pointerdown\", other, true);\n win.removeEventListener(\"blur\", cancel);\n win.removeEventListener(\"keydown\", key, true);\n win.removeEventListener(\"contextmenu\", preventContext, true);\n blockTouch = false;\n source.removeEventListener(\"lostpointercapture\", lostCapture);\n if (source.hasPointerCapture?.(id)) source.releasePointerCapture(id);\n delete source.dataset.held;\n delete source.dataset.pressing;\n preview?.remove();\n releaseSelection?.();\n if (engine.abandonPress === cancel) engine.abandonPress = undefined;\n if (abandon === cancel) abandon = undefined;\n if (session) {\n clearSession(engine, session, source);\n swallowRelease(doc, released ? undefined : id);\n } else if (held) swallowRelease(doc, released ? undefined : id);\n };\n const cancel = () => {\n if (finished) return;\n const payload = session?.payload;\n clean();\n if (payload) announce(source, messages.cancelled(payload));\n };\n const hitTest = () => {\n const payload = session!.payload;\n const hit = doc.elementFromPoint(point.x, point.y);\n let inner: Target | undefined;\n let next: Target | undefined;\n for (let element = hit; element; element = element.parentElement) {\n const target = engine.byElement.get(element);\n // A dialog is a boundary: a target around it lies behind it.\n if (!target && element instanceof HTMLDialogElement) break;\n if (!target) continue;\n inner ??= target;\n if (accepts(target, payload)) {\n next = target;\n break;\n }\n }\n const rejected = next ? undefined : inner;\n if (next !== over || rejected !== refused) {\n if (over) mark(over, engine.targets.has(over) ? payload : undefined);\n if (refused) mark(refused, engine.targets.has(refused) ? payload : undefined);\n over = next;\n refused = rejected;\n if (over) {\n over.element.dataset.drop = \"over\";\n announce(source, over.messages.over({ target: over.label }));\n } else if (refused) {\n refused.element.dataset.drop = \"refused\";\n announce(source, refused.messages.refused({ target: refused.label, label: payload.label }));\n }\n }\n if (over) over.element.dataset.drop = \"over\";\n if (refused) refused.element.dataset.drop = \"refused\";\n return hit;\n };\n const renderFrame = () => {\n frame = 0;\n if (finished || !session) return;\n preview!.style.transform = `translate3d(${point.x}px, ${point.y}px, 0)`;\n const hit = hitTest();\n if (scrollAt(doc, hit, point.x, point.y, overflowCache)) frame = win.requestAnimationFrame(renderFrame);\n };\n const begin = () => {\n const current = read();\n if (current.disabled || engine.session) {\n cancel();\n return;\n }\n const payload = { ...current.payload };\n messages = current.messages;\n session = {\n payload,\n origin: source,\n cancel,\n targetsChanged: () => {\n if (!frame) frame = win.requestAnimationFrame(renderFrame);\n },\n };\n engine.session = session;\n for (const listener of dragStartListeners) listener(id);\n if (finished) return;\n delete source.dataset.held;\n source.dataset.dragging = \"\";\n win.addEventListener(\"contextmenu\", preventContext, true);\n releaseSelection = suppressTextSelection(id);\n // Captured, the mouse's moves and release reach this drag also over an iframe, such as a PDF preview. A finger\n // or pen is captured by the browser already.\n if (mouse)\n try {\n source.setPointerCapture(id);\n source.addEventListener(\"lostpointercapture\", lostCapture);\n } catch {\n // The pointer is already gone; its pointerup or pointercancel ends the drag.\n }\n preview = doc.createElement(\"div\");\n // Inside the source's own .k2b-ui scope the preview inherits its theme, also a scoped dark one; a second\n // .k2b-ui would reset the tokens to light.\n const scope = source.parentElement?.closest<HTMLElement>(\".k2b-ui\");\n preview.className = scope ? \"k2b-drag-preview\" : \"k2b-ui k2b-drag-preview\";\n preview.setAttribute(\"aria-hidden\", \"true\");\n const icon = doc.createElement(\"i\");\n icon.className = payload.icon ?? \"ti ti-file\";\n const label = doc.createElement(\"span\");\n label.className = \"k2b-drag-preview__label\";\n label.textContent = payload.label;\n preview.append(icon, label);\n if (payload.count && payload.count > 1) {\n const count = doc.createElement(\"span\");\n count.className = \"k2b-drag-preview__count\";\n count.textContent = String(payload.count);\n preview.append(count);\n }\n // In the top layer the preview is placed against the viewport, also inside a transformed dialog, and stays above it.\n preview.setAttribute(\"popover\", \"manual\");\n (scope ?? doc.body).append(preview);\n preview.showPopover?.();\n preview.style.transform = `translate3d(${point.x}px, ${point.y}px, 0)`;\n for (const target of engine.targets) mark(target, payload);\n setActiveDrag(payload);\n if (finished) return;\n announce(source, messages.pickedUp(payload));\n win.addEventListener(\"keydown\", key, true);\n };\n const move = (event: PointerEvent) => {\n if (event.pointerId !== id || finished) return;\n point = { x: event.clientX, y: event.clientY };\n if (!session && Math.hypot(point.x - start.x, point.y - start.y) >= SLOP) {\n if (event.pointerType !== \"mouse\" && !held) {\n cancel();\n return;\n }\n begin();\n }\n if (session && !finished && !frame) frame = win.requestAnimationFrame(renderFrame);\n };\n const up = (event: PointerEvent) => {\n if (event.pointerId !== id || finished) return;\n released = true;\n if (!session) {\n clean();\n return;\n }\n point = { x: event.clientX, y: event.clientY };\n hitTest();\n const target = over;\n const payload = session.payload;\n const result = target ? target.messages.dropped({ label: payload.label, target: target.label }) : messages.cancelled(payload);\n const drop = target?.drop;\n clean();\n announce(source, result);\n drop?.(payload);\n };\n // Capture ends without a release only when the browser takes the pointer away.\n const lostCapture = (event: PointerEvent) => {\n if (event.pointerId === id) cancel();\n };\n const cancelPointer = (event: PointerEvent) => {\n if (event.pointerId !== id) return;\n released = true;\n cancel();\n };\n const other = (event: PointerEvent) => {\n if (event.pointerId !== id) cancel();\n };\n const key = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n // A hold is not a drag yet: Escape ends it and still reaches the menu the hold opened.\n if (!session) {\n cancel();\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n cancel();\n };\n abandon = cancel;\n engine.abandonPress = cancel;\n win.addEventListener(\"pointermove\", move, true);\n win.addEventListener(\"pointerup\", up, true);\n win.addEventListener(\"pointercancel\", cancelPointer, true);\n win.addEventListener(\"pointerdown\", other, true);\n win.addEventListener(\"blur\", cancel);\n if (event.pointerType !== \"mouse\") {\n // A held finger drags: it selects no text, and Android's long-press menu does not open, also before the hold fires.\n source.dataset.pressing = \"\";\n win.addEventListener(\"contextmenu\", preventContext, true);\n timer = win.setTimeout(hold, HOLD_MS);\n }\n };\n announcerFor(source);\n source.addEventListener(\"pointerdown\", down);\n source.addEventListener(\"dragstart\", nativeDrag);\n source.addEventListener(\"touchmove\", preventScroll, { passive: false });\n return () => {\n abandon?.();\n if (engine.session && source.contains(engine.session.origin)) engine.session.cancel();\n source.removeEventListener(\"pointerdown\", down);\n source.removeEventListener(\"dragstart\", nativeDrag);\n source.removeEventListener(\"touchmove\", preventScroll);\n };\n};\n\nconst FOCUSABLE = \"a[href], button, input, select, textarea, [tabindex]\";\n/** The origin itself when it takes focus, else the nearest ancestor that does, such as a menu's group. */\nconst focusTarget = (origin: HTMLElement): HTMLElement =>\n (origin.matches(FOCUSABLE) ? origin : origin.closest<HTMLElement>(FOCUSABLE)) ?? origin;\n\nexport const startKeyboardDrag = (input: DragPayload, origin: HTMLElement, messages: DragAndDropMessages): (() => void) => {\n const doc = origin.ownerDocument;\n const win = doc.defaultView!;\n const engine = engineFor(doc);\n engine.session?.cancel();\n engine.abandonPress?.();\n const payload = { ...input };\n const choices = () =>\n [...engine.targets]\n .filter((target) => accepts(target, payload) && reachable(target, origin))\n .sort((a, b) => (a.element.compareDocumentPosition(b.element) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1));\n let targets: Target[] = [];\n let current: Target | undefined;\n /** Listening for keys: the first destination is chosen. */\n let ready = false;\n let finished = false;\n let frame = 0;\n const source = origin.closest<HTMLElement>(\".k2b-drag-source\") ?? undefined;\n const end = (target?: Target, text?: string) => {\n if (finished) return;\n finished = true;\n win.cancelAnimationFrame(frame);\n doc.removeEventListener(\"keydown\", key, true);\n doc.removeEventListener(\"pointerdown\", cancel, true);\n win.removeEventListener(\"blur\", cancel);\n const result = text ?? (target ? target.messages.dropped({ label: payload.label, target: target.label }) : messages.cancelled(payload));\n const drop = target?.drop;\n clearSession(engine, session, source);\n announce(origin, result);\n // Focus scrolls the origin back into view when choosing a destination scrolled it away.\n if (origin.isConnected) focusTarget(origin).focus();\n drop?.(payload);\n };\n const cancel = () => end();\n const pickupModal = modalOf(origin);\n /**\n * Whether a modal dialog opened over the pickup, leaving the origin inert: the key comes from inside another modal,\n * or a modal opened over a pickup that started outside of every modal.\n */\n const behindModal = (event: KeyboardEvent) => {\n const keyModal = event.target instanceof Element ? modalOf(event.target) : undefined;\n if (keyModal && keyModal !== pickupModal && !keyModal.contains(origin)) return true;\n // A dialog stack that shares one native dialog hides the level below, the origin's, when the next one opens.\n if (pickupModal && (!origin.isConnected || !visible(origin))) return true;\n return !pickupModal && Array.from(doc.querySelectorAll(\"dialog[open]\")).some(isModal);\n };\n const describe = (target: Target) =>\n target.messages.choice({ target: target.label, index: targets.indexOf(target) + 1, count: targets.length });\n const choose = (target: Target, text = describe(target)) => {\n if (current) mark(current, engine.targets.has(current) ? payload : undefined);\n current = target;\n current.element.dataset.drop = \"over\";\n current.element.scrollIntoView({ block: \"nearest\", inline: \"nearest\" });\n announce(origin, text);\n };\n const key = (event: KeyboardEvent) => {\n const backward = event.key === \"ArrowUp\" || event.key === \"ArrowLeft\" || (event.key === \"Tab\" && event.shiftKey);\n const forward = !backward && (event.key === \"ArrowDown\" || event.key === \"ArrowRight\" || event.key === \"Tab\");\n if (!backward && !forward && ![\"Home\", \"End\", \"Enter\", \" \", \"Escape\"].includes(event.key)) return;\n // A modal dialog opened since the pickup: its keys are its own, and the pickup behind it ends.\n if (behindModal(event)) {\n cancel();\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n if (event.key === \"Escape\") {\n cancel();\n return;\n }\n // Destinations may have been hidden or shown since the last key, for example by a layout change.\n targets = choices();\n if (!targets.length) {\n end(undefined, messages.noTarget(payload));\n return;\n }\n const index = current ? targets.indexOf(current) : -1;\n const count = targets.length;\n if (forward) choose(targets[index < 0 ? 0 : (index + 1) % count]!);\n else if (backward) choose(targets[index < 0 ? count - 1 : (index - 1 + count) % count]!);\n else if (event.key === \"Home\") choose(targets[0]!);\n else if (event.key === \"End\") choose(targets[count - 1]!);\n else end(index >= 0 ? current : undefined);\n };\n /** Chooses the first destination and starts listening; without one, the sequence ends at once. */\n const settle = () => {\n targets = choices();\n if (!targets.length) {\n end(undefined, messages.noTarget(payload));\n return;\n }\n ready = true;\n // One announcement, so a screen reader does not drop the instructions for the first choice.\n choose(targets[0]!, `${messages.pickedUpKeyboard({ label: payload.label, count: targets.length })} ${describe(targets[0]!)}`);\n // A menu's activating key has already traversed capture. Defer the listener until that dispatch has ended.\n queueMicrotask(() => {\n if (finished) return;\n doc.addEventListener(\"keydown\", key, true);\n doc.addEventListener(\"pointerdown\", cancel, true);\n win.addEventListener(\"blur\", cancel);\n });\n };\n const session: Session = {\n payload,\n origin,\n cancel,\n // Settled a frame later, so a target that a re-render replaces has registered again before none counts as left.\n targetsChanged() {\n if (!ready || finished || frame) return;\n frame = win.requestAnimationFrame(() => {\n frame = 0;\n if (finished) return;\n targets = choices();\n if (!targets.length) cancel();\n else choose(current && targets.includes(current) ? current : targets[0]!);\n });\n },\n };\n // The drag is active before destinations are counted, so a host can mount the ones it shows only while dragging.\n engine.session = session;\n for (const target of engine.targets) mark(target, payload);\n if (source) source.dataset.dragging = \"\";\n setActiveDrag(payload);\n if (finished) return cancel;\n if (choices().length) settle();\n else\n frame = win.requestAnimationFrame(() => {\n frame = 0;\n if (!finished) settle();\n });\n return cancel;\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -2,6 +2,7 @@ export { Button, ButtonLink, IconButton, IconButtonLink } from "./Button";
|
|
|
2
2
|
export { ContextMenu } from "./ContextMenu";
|
|
3
3
|
export { CopyButton } from "./CopyButton";
|
|
4
4
|
export { Disclosure } from "./Disclosure";
|
|
5
|
+
export { activeDrag, DragSource, DropTarget, useKeyboardDrag } from "./DragAndDrop";
|
|
5
6
|
export { Dropdown, DropdownItem, dropdownPosition } from "./Dropdown";
|
|
6
7
|
export { FilterChip } from "./FilterChip";
|
|
7
8
|
export { GestureMenu } from "./GestureMenu";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["actions/index.ts"],"sourcesContent":["export type { ButtonAlign, ButtonLinkProps, ButtonProps, ButtonSize, ButtonVariant, IconButtonLinkProps, IconButtonProps } from \"./Button\";\nexport { Button, ButtonLink, IconButton, IconButtonLink } from \"./Button\";\nexport type { ContextMenuProps } from \"./ContextMenu\";\nexport { ContextMenu } from \"./ContextMenu\";\nexport type { CopyButtonProps, CopyButtonValue } from \"./CopyButton\";\nexport { CopyButton } from \"./CopyButton\";\nexport type { DisclosureProps } from \"./Disclosure\";\nexport { Disclosure } from \"./Disclosure\";\nexport type {\n DropdownAction,\n DropdownActionBase,\n DropdownChoice,\n DropdownItemProps,\n DropdownPosition,\n DropdownProps,\n DropdownSection,\n DropdownTriggerProps,\n} from \"./Dropdown\";\nexport { Dropdown, DropdownItem, dropdownPosition } from \"./Dropdown\";\nexport type { FilterChipOption, FilterChipProps, FilterChipSection } from \"./FilterChip\";\nexport { FilterChip } from \"./FilterChip\";\nexport type { GestureKind, GestureMenuAction, GestureMenuItem, GestureMenuProps, GestureMenuSection } from \"./GestureMenu\";\nexport { GestureMenu } from \"./GestureMenu\";\nexport type { RemoveButtonProps } from \"./RemoveButton\";\nexport { RemoveButton } from \"./RemoveButton\";\nexport type { SegmentedControlProps, SegmentOption } from \"./SegmentedControl\";\nexport { SegmentedControl } from \"./SegmentedControl\";\nexport type { SplitButtonProps } from \"./SplitButton\";\nexport { SplitButton } from \"./SplitButton\";\nexport type {\n SpotlightButtonProps,\n SpotlightButtonVariant,\n SpotlightSearchOptions,\n SpotlightSearchResolver,\n} from \"./SpotlightSearch\";\nexport {\n openSpotlightSearch,\n SpotlightButton,\n} from \"./SpotlightSearch\";\nexport type { TabOption, TabsItemProps, TabsProps } from \"./Tabs\";\nexport { Tabs } from \"./Tabs\";\nexport type { ToolbarGroupProps, ToolbarProps, ToolbarSeparatorProps } from \"./Toolbar\";\nexport { Toolbar } from \"./Toolbar\";\n"],"mappings":"AACA,SAAS,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,QAAQ,UAAU;AAEzE,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,UAAU,QAAQ,cAAc;AAEzC,SAAS,UAAU,QAAQ,cAAc;
|
|
1
|
+
{"version":3,"names":[],"sources":["actions/index.ts"],"sourcesContent":["export type { ButtonAlign, ButtonLinkProps, ButtonProps, ButtonSize, ButtonVariant, IconButtonLinkProps, IconButtonProps } from \"./Button\";\nexport { Button, ButtonLink, IconButton, IconButtonLink } from \"./Button\";\nexport type { ContextMenuProps } from \"./ContextMenu\";\nexport { ContextMenu } from \"./ContextMenu\";\nexport type { CopyButtonProps, CopyButtonValue } from \"./CopyButton\";\nexport { CopyButton } from \"./CopyButton\";\nexport type { DisclosureProps } from \"./Disclosure\";\nexport { Disclosure } from \"./Disclosure\";\nexport type { DragPayload, DragSourceProps, DropTargetProps } from \"./DragAndDrop\";\nexport { activeDrag, DragSource, DropTarget, useKeyboardDrag } from \"./DragAndDrop\";\nexport type {\n DropdownAction,\n DropdownActionBase,\n DropdownChoice,\n DropdownItemProps,\n DropdownPosition,\n DropdownProps,\n DropdownSection,\n DropdownTriggerProps,\n} from \"./Dropdown\";\nexport { Dropdown, DropdownItem, dropdownPosition } from \"./Dropdown\";\nexport type { FilterChipOption, FilterChipProps, FilterChipSection } from \"./FilterChip\";\nexport { FilterChip } from \"./FilterChip\";\nexport type { GestureKind, GestureMenuAction, GestureMenuItem, GestureMenuProps, GestureMenuSection } from \"./GestureMenu\";\nexport { GestureMenu } from \"./GestureMenu\";\nexport type { RemoveButtonProps } from \"./RemoveButton\";\nexport { RemoveButton } from \"./RemoveButton\";\nexport type { SegmentedControlProps, SegmentOption } from \"./SegmentedControl\";\nexport { SegmentedControl } from \"./SegmentedControl\";\nexport type { SplitButtonProps } from \"./SplitButton\";\nexport { SplitButton } from \"./SplitButton\";\nexport type {\n SpotlightButtonProps,\n SpotlightButtonVariant,\n SpotlightSearchOptions,\n SpotlightSearchResolver,\n} from \"./SpotlightSearch\";\nexport {\n openSpotlightSearch,\n SpotlightButton,\n} from \"./SpotlightSearch\";\nexport type { TabOption, TabsItemProps, TabsProps } from \"./Tabs\";\nexport { Tabs } from \"./Tabs\";\nexport type { ToolbarActionProps, ToolbarGroupProps, ToolbarLabelProps, ToolbarProps, ToolbarSeparatorProps } from \"./Toolbar\";\nexport { Toolbar } from \"./Toolbar\";\n"],"mappings":"AACA,SAAS,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,QAAQ,UAAU;AAEzE,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,UAAU,QAAQ,cAAc;AAEzC,SAAS,UAAU,QAAQ,cAAc;AAEzC,SAAS,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,QAAQ,eAAe;AAWnF,SAAS,QAAQ,EAAE,YAAY,EAAE,gBAAgB,QAAQ,YAAY;AAErE,SAAS,UAAU,QAAQ,cAAc;AAEzC,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,YAAY,QAAQ,gBAAgB;AAE7C,SAAS,gBAAgB,QAAQ,oBAAoB;AAErD,SAAS,WAAW,QAAQ,eAAe;AAO3C,SACE,mBAAmB,EACnB,eAAe,QACV,mBAAmB;AAE1B,SAAS,IAAI,QAAQ,QAAQ;AAE7B,SAAS,OAAO,QAAQ,WAAW","ignoreList":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Left and Right cycle through the segments of a row section; Up and Down leave it like any item. Returns whether
|
|
3
|
+
* the key moved focus.
|
|
4
|
+
*/
|
|
5
|
+
export const focusRowSegment = (items, key) => {
|
|
6
|
+
if (key !== "ArrowLeft" && key !== "ArrowRight") return false;
|
|
7
|
+
const active = document.activeElement;
|
|
8
|
+
const row = active?.closest(".k2b-dropdown__row");
|
|
9
|
+
if (!active || !row) return false;
|
|
10
|
+
const segments = items.filter(item => row.contains(item));
|
|
11
|
+
const next = segments.indexOf(active) + (key === "ArrowRight" ? 1 : -1);
|
|
12
|
+
segments[(next + segments.length) % segments.length]?.focus();
|
|
13
|
+
return true;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=menu-rows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["actions/menu-rows.ts"],"sourcesContent":["/**\n * Left and Right cycle through the segments of a row section; Up and Down leave it like any item. Returns whether\n * the key moved focus.\n */\nexport const focusRowSegment = (items: HTMLElement[], key: string): boolean => {\n if (key !== \"ArrowLeft\" && key !== \"ArrowRight\") return false;\n const active = document.activeElement as HTMLElement | null;\n const row = active?.closest(\".k2b-dropdown__row\");\n if (!active || !row) return false;\n const segments = items.filter((item) => row.contains(item));\n const next = segments.indexOf(active) + (key === \"ArrowRight\" ? 1 : -1);\n segments[(next + segments.length) % segments.length]?.focus();\n return true;\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA,OAAO,MAAM,eAAe,GAAG,CAAC,KAAoB,EAAE,GAAW,KAAc;EAC7E,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,YAAY,EAAE,OAAO,KAAK;EAC7D,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAmC;EAC3D,MAAM,GAAG,GAAG,MAAM,EAAE,OAAO,CAAC,oBAAoB,CAAC;EACjD,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,OAAO,KAAK;EACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAE,IAAI,IAAK,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;EAC3D,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;EACvE,QAAQ,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;EAC7D,OAAO,IAAI;AACb,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { template as _$template } from "solid-js/web";
|
|
2
|
+
import { delegateEvents as _$delegateEvents } from "solid-js/web";
|
|
3
|
+
import { memo as _$memo } from "solid-js/web";
|
|
4
|
+
import { setAttribute as _$setAttribute } from "solid-js/web";
|
|
5
|
+
import { effect as _$effect } from "solid-js/web";
|
|
6
|
+
import { getNextElement as _$getNextElement } from "solid-js/web";
|
|
7
|
+
import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
|
|
8
|
+
import { insert as _$insert } from "solid-js/web";
|
|
9
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
10
|
+
import { use as _$use } from "solid-js/web";
|
|
11
|
+
var _tmpl$ = /*#__PURE__*/_$template(`<div class=k2b-gesture-menu__sheet-menu role=menu>`);
|
|
12
|
+
import { onCleanup, onMount } from "solid-js";
|
|
13
|
+
import { dialogCore } from "../feedback/dialog-core";
|
|
14
|
+
import { LocaleProvider } from "../intl/locale";
|
|
15
|
+
import BottomSheet, { bottomSheetOptions } from "../layout/BottomSheet";
|
|
16
|
+
import { focusRowSegment } from "./menu-rows";
|
|
17
|
+
|
|
18
|
+
/** Phones, where a menu opens as a bottom sheet instead of beside its trigger. */
|
|
19
|
+
export const PHONE_SHEET_QUERY = "(max-width: 47.999rem)";
|
|
20
|
+
export const prefersMenuSheet = () => typeof matchMedia === "function" && matchMedia(PHONE_SHEET_QUERY).matches;
|
|
21
|
+
/**
|
|
22
|
+
* Follows a link the way a click on it would, so a page's own link handling, such as progressive navigation, still
|
|
23
|
+
* applies; it runs only after the sheet has left the history.
|
|
24
|
+
*/
|
|
25
|
+
const followLink = href => {
|
|
26
|
+
const link = document.createElement("a");
|
|
27
|
+
link.href = href;
|
|
28
|
+
link.hidden = true;
|
|
29
|
+
document.body.append(link);
|
|
30
|
+
link.click();
|
|
31
|
+
link.remove();
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* The sheet's items hand their action to `run` instead of running it while the sheet closes: `dialogCore` settles the
|
|
36
|
+
* sheet after it left the history, and only then may an action navigate or open the next dialog.
|
|
37
|
+
* A choice or action that keeps the menu open, or an `immediate` action, runs at once.
|
|
38
|
+
*/
|
|
39
|
+
const afterClose = (items, run) => {
|
|
40
|
+
const entry = item => {
|
|
41
|
+
// A plain link would navigate while the sheet's history entry is still being removed, and that Back could
|
|
42
|
+
// undo the navigation; a plain click instead follows it once the sheet is gone. Modified clicks and external
|
|
43
|
+
// links keep the browser's own behavior.
|
|
44
|
+
if (!item.action && "href" in item && item.href && !("external" in item && item.external)) {
|
|
45
|
+
const href = item.href;
|
|
46
|
+
return {
|
|
47
|
+
...item,
|
|
48
|
+
action: () => run(() => followLink(href))
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const action = item.action;
|
|
52
|
+
if (!action || "closeOnSelect" in item && item.closeOnSelect === false || "immediate" in item && item.immediate) return item;
|
|
53
|
+
return {
|
|
54
|
+
...item,
|
|
55
|
+
action: () => run(action)
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
return items.map(item => {
|
|
59
|
+
const sheetItem = item;
|
|
60
|
+
return "items" in sheetItem ? {
|
|
61
|
+
...sheetItem,
|
|
62
|
+
items: sheetItem.items.map(entry)
|
|
63
|
+
} : entry(sheetItem);
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
const menuItems = menu => Array.from(menu.querySelectorAll("[role^='menuitem']:not([aria-disabled='true'])"));
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* The menu inside the sheet: the same items, at touch size, with arrow keys for a connected keyboard. Focus starts on
|
|
70
|
+
* the sheet itself, which shows no ring on a phone; the first arrow key moves it into the menu.
|
|
71
|
+
*/
|
|
72
|
+
function SheetMenu(props) {
|
|
73
|
+
let menu;
|
|
74
|
+
const focus = index => {
|
|
75
|
+
const items = menuItems(menu);
|
|
76
|
+
items[(index + items.length) % items.length]?.focus();
|
|
77
|
+
};
|
|
78
|
+
const onKeyDown = event => {
|
|
79
|
+
const items = menuItems(menu);
|
|
80
|
+
const current = items.indexOf(document.activeElement);
|
|
81
|
+
if (event.key === "ArrowDown") focus(current + 1);else if (event.key === "ArrowUp") focus(current < 0 ? -1 : current - 1);else if (event.key === "Home" || event.key === "End") focus(event.key === "Home" ? 0 : -1);else if (!focusRowSegment(items, event.key)) return;
|
|
82
|
+
event.preventDefault();
|
|
83
|
+
};
|
|
84
|
+
// Keys pressed on the sheet itself, while it is the top level of the shared dialog.
|
|
85
|
+
const onSheetKeyDown = event => {
|
|
86
|
+
if (event.target === props.dialog && props.dialog.lastElementChild?.contains(menu)) onKeyDown(event);
|
|
87
|
+
};
|
|
88
|
+
onMount(() => {
|
|
89
|
+
props.dialog.addEventListener("keydown", onSheetKeyDown);
|
|
90
|
+
onCleanup(() => props.dialog.removeEventListener("keydown", onSheetKeyDown));
|
|
91
|
+
});
|
|
92
|
+
return (() => {
|
|
93
|
+
var _el$ = _$getNextElement(_tmpl$);
|
|
94
|
+
_el$.$$keydown = onKeyDown;
|
|
95
|
+
var _ref$ = menu;
|
|
96
|
+
typeof _ref$ === "function" ? _$use(_ref$, _el$) : menu = _el$;
|
|
97
|
+
_$insert(_el$, _$createComponent(props.Items, {
|
|
98
|
+
get items() {
|
|
99
|
+
return props.items;
|
|
100
|
+
},
|
|
101
|
+
close: () => props.close()
|
|
102
|
+
}));
|
|
103
|
+
_$effect(() => _$setAttribute(_el$, "aria-label", props.label));
|
|
104
|
+
_$runHydrationEvents();
|
|
105
|
+
return _el$;
|
|
106
|
+
})();
|
|
107
|
+
}
|
|
108
|
+
/** Opens menu items as a bottom sheet; resolves after the sheet closed and the chosen action ran. */
|
|
109
|
+
export const openMenuSheet = options => {
|
|
110
|
+
let chosen;
|
|
111
|
+
const choose = action => {
|
|
112
|
+
chosen = action;
|
|
113
|
+
};
|
|
114
|
+
return dialogCore.open((close, context) => _$createComponent(LocaleProvider, {
|
|
115
|
+
get locale() {
|
|
116
|
+
return options.locale;
|
|
117
|
+
},
|
|
118
|
+
get children() {
|
|
119
|
+
return _$createComponent(BottomSheet, {
|
|
120
|
+
get onDismiss() {
|
|
121
|
+
return context.requestDismiss;
|
|
122
|
+
},
|
|
123
|
+
get children() {
|
|
124
|
+
return _$createComponent(BottomSheet.Body, {
|
|
125
|
+
get children() {
|
|
126
|
+
return [_$memo(() => options.top?.(() => close())), _$createComponent(SheetMenu, {
|
|
127
|
+
get Items() {
|
|
128
|
+
return options.Items;
|
|
129
|
+
},
|
|
130
|
+
get items() {
|
|
131
|
+
return afterClose(options.items, choose);
|
|
132
|
+
},
|
|
133
|
+
get label() {
|
|
134
|
+
return options.label;
|
|
135
|
+
},
|
|
136
|
+
close: () => close(),
|
|
137
|
+
get dialog() {
|
|
138
|
+
return context.dialog;
|
|
139
|
+
}
|
|
140
|
+
})];
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}), {
|
|
147
|
+
...bottomSheetOptions,
|
|
148
|
+
ariaLabel: options.label,
|
|
149
|
+
history: true,
|
|
150
|
+
signal: options.signal
|
|
151
|
+
}).then(() => chosen?.());
|
|
152
|
+
};
|
|
153
|
+
_$delegateEvents(["keydown"]);
|
|
154
|
+
//# sourceMappingURL=menu-sheet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["actions/menu-sheet.tsx"],"sourcesContent":["import { type JSX, onCleanup, onMount } from \"solid-js\";\nimport { dialogCore } from \"../feedback/dialog-core\";\nimport { LocaleProvider } from \"../intl/locale\";\nimport BottomSheet, { bottomSheetOptions } from \"../layout/BottomSheet\";\nimport type { DropdownAction, DropdownChoice, DropdownItem } from \"./Dropdown\";\nimport { focusRowSegment } from \"./menu-rows\";\n\n/** Phones, where a menu opens as a bottom sheet instead of beside its trigger. */\nexport const PHONE_SHEET_QUERY = \"(max-width: 47.999rem)\";\n\nexport const prefersMenuSheet = (): boolean => typeof matchMedia === \"function\" && matchMedia(PHONE_SHEET_QUERY).matches;\n\ntype SheetEntry = DropdownAction | DropdownChoice;\ntype SheetItem = SheetEntry | { items: readonly SheetEntry[] };\n\n/**\n * Follows a link the way a click on it would, so a page's own link handling, such as progressive navigation, still\n * applies; it runs only after the sheet has left the history.\n */\nconst followLink = (href: string) => {\n const link = document.createElement(\"a\");\n link.href = href;\n link.hidden = true;\n document.body.append(link);\n link.click();\n link.remove();\n};\n\n/**\n * The sheet's items hand their action to `run` instead of running it while the sheet closes: `dialogCore` settles the\n * sheet after it left the history, and only then may an action navigate or open the next dialog.\n * A choice or action that keeps the menu open, or an `immediate` action, runs at once.\n */\nconst afterClose = <T extends DropdownItem>(items: readonly T[], run: (action: () => void) => void): T[] => {\n const entry = (item: SheetEntry): SheetEntry => {\n // A plain link would navigate while the sheet's history entry is still being removed, and that Back could\n // undo the navigation; a plain click instead follows it once the sheet is gone. Modified clicks and external\n // links keep the browser's own behavior.\n if (!item.action && \"href\" in item && item.href && !(\"external\" in item && item.external)) {\n const href = item.href;\n return { ...item, action: () => run(() => followLink(href)) } as SheetEntry;\n }\n const action = item.action;\n if (!action || (\"closeOnSelect\" in item && item.closeOnSelect === false) || (\"immediate\" in item && item.immediate)) return item;\n return { ...item, action: () => run(action) } as SheetEntry;\n };\n return items.map((item) => {\n const sheetItem = item as SheetItem;\n return (\"items\" in sheetItem ? { ...sheetItem, items: sheetItem.items.map(entry) } : entry(sheetItem)) as T;\n });\n};\n\nconst menuItems = (menu: HTMLElement): HTMLElement[] =>\n Array.from(menu.querySelectorAll<HTMLElement>(\"[role^='menuitem']:not([aria-disabled='true'])\"));\n\n/**\n * The menu inside the sheet: the same items, at touch size, with arrow keys for a connected keyboard. Focus starts on\n * the sheet itself, which shows no ring on a phone; the first arrow key moves it into the menu.\n */\nfunction SheetMenu(props: {\n Items: MenuSheetOptions[\"Items\"];\n items: readonly DropdownItem[];\n label: string;\n close: () => void;\n dialog: HTMLDialogElement;\n}): JSX.Element {\n let menu!: HTMLDivElement;\n const focus = (index: number) => {\n const items = menuItems(menu);\n items[(index + items.length) % items.length]?.focus();\n };\n const onKeyDown = (event: KeyboardEvent) => {\n const items = menuItems(menu);\n const current = items.indexOf(document.activeElement as HTMLElement);\n if (event.key === \"ArrowDown\") focus(current + 1);\n else if (event.key === \"ArrowUp\") focus(current < 0 ? -1 : current - 1);\n else if (event.key === \"Home\" || event.key === \"End\") focus(event.key === \"Home\" ? 0 : -1);\n else if (!focusRowSegment(items, event.key)) return;\n event.preventDefault();\n };\n // Keys pressed on the sheet itself, while it is the top level of the shared dialog.\n const onSheetKeyDown = (event: KeyboardEvent) => {\n if (event.target === props.dialog && props.dialog.lastElementChild?.contains(menu)) onKeyDown(event);\n };\n onMount(() => {\n props.dialog.addEventListener(\"keydown\", onSheetKeyDown);\n onCleanup(() => props.dialog.removeEventListener(\"keydown\", onSheetKeyDown));\n });\n return (\n <div ref={menu} class=\"k2b-gesture-menu__sheet-menu\" role=\"menu\" aria-label={props.label} onKeyDown={onKeyDown}>\n <props.Items items={props.items} close={() => props.close()} />\n </div>\n );\n}\n\nexport type MenuSheetOptions = {\n /** Renders the rows: the dropdown's own `DropdownItems`, passed in so this module does not import it back. */\n Items: (props: { items: readonly DropdownItem[]; close: (restoreFocus?: boolean) => void }) => JSX.Element;\n items: readonly DropdownItem[];\n /** Names the sheet and its menu. */\n label: string;\n /** The render locale of the opener; the sheet renders outside its tree. */\n locale: string;\n /** Shown above the menu, for example a row of quick reactions. `close` closes the sheet. */\n top?: (close: () => void) => JSX.Element;\n signal?: AbortSignal;\n};\n\n/** Opens menu items as a bottom sheet; resolves after the sheet closed and the chosen action ran. */\nexport const openMenuSheet = (options: MenuSheetOptions): Promise<void> => {\n let chosen: (() => void) | undefined;\n const choose = (action: () => void) => {\n chosen = action;\n };\n return dialogCore\n .open<void>(\n (close, context) => (\n <LocaleProvider locale={options.locale}>\n <BottomSheet onDismiss={context.requestDismiss}>\n <BottomSheet.Body>\n {options.top?.(() => close())}\n <SheetMenu\n Items={options.Items}\n items={afterClose(options.items, choose)}\n label={options.label}\n close={() => close()}\n dialog={context.dialog}\n />\n </BottomSheet.Body>\n </BottomSheet>\n </LocaleProvider>\n ),\n { ...bottomSheetOptions, ariaLabel: options.label, history: true, signal: options.signal },\n )\n .then(() => chosen?.());\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { i18n } from "@k2b/stdlib";
|
|
2
|
+
import { useLocale } from "../intl/locale";
|
|
3
|
+
const toolbarMessages = i18n.define({
|
|
4
|
+
baseLocale: "en",
|
|
5
|
+
messages: {
|
|
6
|
+
en: {
|
|
7
|
+
moreActions: "More actions"
|
|
8
|
+
},
|
|
9
|
+
de: {
|
|
10
|
+
moreActions: "Weitere Aktionen"
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
/** Resolved from the inherited render locale. */
|
|
15
|
+
export const useToolbarMessages = () => {
|
|
16
|
+
const locale = useLocale();
|
|
17
|
+
return () => toolbarMessages.resolve([locale()]).t;
|
|
18
|
+
};
|
|
19
|
+
export const checkToolbarMessages = () => toolbarMessages.check();
|
|
20
|
+
//# sourceMappingURL=toolbar-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["actions/toolbar-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst toolbarMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n moreActions: \"More actions\",\n },\n de: {\n moreActions: \"Weitere Aktionen\",\n },\n },\n});\n\nexport type ToolbarMessages = ReturnType<(typeof toolbarMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useToolbarMessages = (): (() => ToolbarMessages) => {\n const locale = useLocale();\n return () => toolbarMessages.resolve([locale()]).t;\n};\n\nexport const checkToolbarMessages = () => toolbarMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC;EAClC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,WAAW,EAAE;IACf,CAAC;IACD,EAAE,EAAE;MACF,WAAW,EAAE;IACf;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,kBAAkB,GAAG,MAA+B;EAC/D,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,OAAO,MAAM,oBAAoB,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["chart-inspection.ts"],"sourcesContent":["export { type ChartCursor, createChartCursor } from \"./content/chart-cursor\";\nexport {\n type ChartDatumRef,\n type ChartInspection,\n type ChartKind,\n type ChartSelection,\n type ChartTooltip,\n type ChartTooltipFormatter,\n type InspectChartOptions,\n inspectChart,\n isChartDatum,\n sameChartDatum,\n} from \"./content/chart-inspection-core\";\n"],"mappings":"AAAA,SAA2B,iBAAiB,QAAQ,wBAAwB;AAC5E,SAQE,YAAY,EACZ,YAAY,EACZ,cAAc,QACT,iCAAiC","ignoreList":[]}
|