@k2b/ui 0.28.0 → 0.30.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 +2 -2
- package/dist/browser/actions/ContextMenu.js +5 -0
- 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 +6 -3
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/FilterChip.js +137 -7
- package/dist/browser/actions/FilterChip.js.map +1 -1
- package/dist/browser/actions/GestureMenu.js +26 -3
- package/dist/browser/actions/GestureMenu.js.map +1 -1
- package/dist/browser/actions/SegmentedControl.js +5 -9
- package/dist/browser/actions/SegmentedControl.js.map +1 -1
- package/dist/browser/actions/SpotlightSearch.js +6 -3
- package/dist/browser/actions/SpotlightSearch.js.map +1 -1
- package/dist/browser/actions/Tabs.js +5 -2
- package/dist/browser/actions/Tabs.js.map +1 -1
- package/dist/browser/actions/ViewTabs.js +294 -0
- package/dist/browser/actions/ViewTabs.js.map +1 -0
- 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/filter-messages.js +6 -2
- package/dist/browser/actions/filter-messages.js.map +1 -1
- package/dist/browser/actions/index.js +3 -1
- package/dist/browser/actions/index.js.map +1 -1
- package/dist/browser/chat/ChatComposer.js +1229 -605
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/chat/ChatDecision.js +814 -0
- package/dist/browser/chat/ChatDecision.js.map +1 -0
- package/dist/browser/chat/ChatPrimitives.js +292 -153
- 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 +14 -0
- package/dist/browser/chat/chat-messages.js.map +1 -1
- package/dist/browser/chat/command-search.js +35 -17
- package/dist/browser/chat/command-search.js.map +1 -1
- package/dist/browser/chat/index.js +10 -3
- package/dist/browser/chat/index.js.map +1 -1
- package/dist/browser/chat/types.js.map +1 -1
- package/dist/browser/content/Calendar.js +146 -119
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/CalendarWeekView.js +291 -266
- package/dist/browser/content/CalendarWeekView.js.map +1 -1
- package/dist/browser/content/Chart.js +54 -71
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/DataTable.js +224 -155
- package/dist/browser/content/DataTable.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/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/data-table-messages.js +4 -2
- package/dist/browser/content/data-table-messages.js.map +1 -1
- package/dist/browser/content/index.js +2 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/feedback/MovedHint.js +197 -0
- package/dist/browser/feedback/MovedHint.js.map +1 -0
- package/dist/browser/feedback/dialog-core.js +66 -9
- package/dist/browser/feedback/dialog-core.js.map +1 -1
- package/dist/browser/feedback/index.js +1 -0
- package/dist/browser/feedback/index.js.map +1 -1
- package/dist/browser/feedback/prompts.js +6 -1
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/inputs/DatePicker.js +337 -212
- package/dist/browser/inputs/DatePicker.js.map +1 -1
- package/dist/browser/inputs/date-picker.js +59 -5
- package/dist/browser/inputs/date-picker.js.map +1 -1
- package/dist/browser/intl/messages.js +12 -0
- package/dist/browser/intl/messages.js.map +1 -1
- package/dist/browser/intl/weekend.js +39 -0
- package/dist/browser/intl/weekend.js.map +1 -0
- package/dist/browser/layout/AppOverview.js +1 -2
- package/dist/browser/layout/AppOverview.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +947 -531
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/PageTitle.js +3 -2
- package/dist/browser/layout/PageTitle.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/SettingsModal.js +2 -2
- package/dist/browser/layout/SettingsModal.js.map +1 -1
- package/dist/browser/layout/SidebarSwitcher.js +19 -11
- package/dist/browser/layout/SidebarSwitcher.js.map +1 -1
- package/dist/browser/layout/TabBar.js +16 -13
- package/dist/browser/layout/TabBar.js.map +1 -1
- package/dist/browser/layout/app-host-width.js +44 -0
- package/dist/browser/layout/app-host-width.js.map +1 -0
- package/dist/browser/layout/app-workspace-controller.js +337 -44
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/index.js +4 -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/LinkCard.js +1 -1
- package/dist/browser/surfaces/LinkCard.js.map +1 -1
- package/dist/browser/surfaces/Placeholder.js +45 -11
- 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/widgets/Widget.js +1 -1
- package/dist/browser/widgets/Widget.js.map +1 -1
- package/dist/ssr/actions/ContextMenu.js +5 -0
- 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 +5 -2
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/FilterChip.js +59 -7
- package/dist/ssr/actions/FilterChip.js.map +1 -1
- package/dist/ssr/actions/GestureMenu.js +26 -3
- package/dist/ssr/actions/GestureMenu.js.map +1 -1
- package/dist/ssr/actions/SegmentedControl.js +1 -2
- package/dist/ssr/actions/SegmentedControl.js.map +1 -1
- package/dist/ssr/actions/SpotlightSearch.js +2 -2
- package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
- package/dist/ssr/actions/Tabs.js +2 -2
- package/dist/ssr/actions/Tabs.js.map +1 -1
- package/dist/ssr/actions/ViewTabs.js +211 -0
- package/dist/ssr/actions/ViewTabs.js.map +1 -0
- 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/filter-messages.js +6 -2
- package/dist/ssr/actions/filter-messages.js.map +1 -1
- package/dist/ssr/actions/index.js +3 -1
- package/dist/ssr/actions/index.js.map +1 -1
- package/dist/ssr/chat/ChatComposer.js +668 -136
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/chat/ChatDecision.js +479 -0
- package/dist/ssr/chat/ChatDecision.js.map +1 -0
- package/dist/ssr/chat/ChatPrimitives.js +95 -24
- 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 +14 -0
- package/dist/ssr/chat/chat-messages.js.map +1 -1
- package/dist/ssr/chat/command-search.js +35 -17
- package/dist/ssr/chat/command-search.js.map +1 -1
- package/dist/ssr/chat/index.js +10 -3
- package/dist/ssr/chat/index.js.map +1 -1
- package/dist/ssr/chat/types.js.map +1 -1
- package/dist/ssr/content/Calendar.js +112 -103
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/CalendarWeekView.js +42 -28
- package/dist/ssr/content/CalendarWeekView.js.map +1 -1
- package/dist/ssr/content/Chart.js +19 -23
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/DataTable.js +78 -31
- package/dist/ssr/content/DataTable.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/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/data-table-messages.js +4 -2
- package/dist/ssr/content/data-table-messages.js.map +1 -1
- package/dist/ssr/content/index.js +2 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/feedback/MovedHint.js +166 -0
- package/dist/ssr/feedback/MovedHint.js.map +1 -0
- package/dist/ssr/feedback/dialog-core.js +66 -9
- package/dist/ssr/feedback/dialog-core.js.map +1 -1
- package/dist/ssr/feedback/index.js +1 -0
- package/dist/ssr/feedback/index.js.map +1 -1
- package/dist/ssr/feedback/prompts.js +6 -1
- package/dist/ssr/feedback/prompts.js.map +1 -1
- package/dist/ssr/inputs/DatePicker.js +138 -69
- package/dist/ssr/inputs/DatePicker.js.map +1 -1
- package/dist/ssr/inputs/date-picker.js +59 -5
- package/dist/ssr/inputs/date-picker.js.map +1 -1
- package/dist/ssr/intl/messages.js +12 -0
- package/dist/ssr/intl/messages.js.map +1 -1
- package/dist/ssr/intl/weekend.js +39 -0
- package/dist/ssr/intl/weekend.js.map +1 -0
- package/dist/ssr/layout/AppOverview.js +1 -2
- package/dist/ssr/layout/AppOverview.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +457 -116
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/PageTitle.js +3 -2
- package/dist/ssr/layout/PageTitle.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/SettingsModal.js +2 -2
- package/dist/ssr/layout/SettingsModal.js.map +1 -1
- package/dist/ssr/layout/SidebarSwitcher.js +19 -11
- package/dist/ssr/layout/SidebarSwitcher.js.map +1 -1
- package/dist/ssr/layout/TabBar.js +2 -2
- package/dist/ssr/layout/TabBar.js.map +1 -1
- package/dist/ssr/layout/app-host-width.js +44 -0
- package/dist/ssr/layout/app-host-width.js.map +1 -0
- package/dist/ssr/layout/app-workspace-controller.js +337 -44
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/index.js +4 -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/LinkCard.js +1 -1
- package/dist/ssr/surfaces/LinkCard.js.map +1 -1
- package/dist/ssr/surfaces/Placeholder.js +25 -6
- 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/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 +1 -0
- package/dist/types/actions/DragAndDrop.d.ts +29 -0
- package/dist/types/actions/Dropdown.d.ts +4 -0
- package/dist/types/actions/FilterChip.d.ts +22 -0
- package/dist/types/actions/ViewTabs.d.ts +30 -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/filter-messages.d.ts +2 -0
- package/dist/types/actions/index.d.ts +6 -2
- package/dist/types/chat/ChatComposer.d.ts +71 -1
- package/dist/types/chat/ChatDecision.d.ts +149 -0
- package/dist/types/chat/ChatPrimitives.d.ts +14 -1
- package/dist/types/chat/ChatTimeline.d.ts +2 -1
- package/dist/types/chat/chat-messages.d.ts +7 -0
- package/dist/types/chat/command-search.d.ts +5 -0
- package/dist/types/chat/index.d.ts +28 -5
- package/dist/types/chat/types.d.ts +54 -1
- package/dist/types/content/Chart.d.ts +9 -3
- package/dist/types/content/DataTable.d.ts +3 -0
- package/dist/types/content/FileTypeIcon.d.ts +27 -0
- package/dist/types/content/ReferenceChip.d.ts +49 -0
- package/dist/types/content/calendar-pointer.d.ts +6 -0
- package/dist/types/content/data-table-messages.d.ts +1 -0
- package/dist/types/content/index.d.ts +3 -0
- package/dist/types/feedback/MovedHint.d.ts +25 -0
- package/dist/types/feedback/dialog-core.d.ts +5 -2
- package/dist/types/feedback/index.d.ts +2 -0
- package/dist/types/feedback/prompts.d.ts +2 -0
- package/dist/types/inputs/DatePicker.d.ts +7 -0
- package/dist/types/inputs/date-picker.d.ts +25 -1
- package/dist/types/intl/messages.d.ts +6 -0
- package/dist/types/intl/weekend.d.ts +12 -0
- package/dist/types/layout/AppWorkspace.d.ts +48 -10
- package/dist/types/layout/ResizeSeparator.d.ts +9 -0
- package/dist/types/layout/TabBar.d.ts +7 -0
- package/dist/types/layout/app-host-width.d.ts +6 -0
- package/dist/types/layout/app-workspace-controller.d.ts +2 -0
- package/dist/types/layout/index.d.ts +5 -2
- package/dist/types/layout/resize-separator.d.ts +18 -0
- package/dist/types/layout/workspace-messages.d.ts +5 -0
- package/dist/types/surfaces/Placeholder.d.ts +2 -1
- package/dist/types/surfaces/StatCell.d.ts +6 -0
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -59,7 +59,7 @@ See the [TextInput guide](https://cloud.k2b.dev/en/ui/input/text) for details.
|
|
|
59
59
|
| --- | --- |
|
|
60
60
|
| Actions | Buttons, menus, tabs, toolbars |
|
|
61
61
|
| Inputs | Text fields, selectors, date pickers, file inputs |
|
|
62
|
-
| Layout | Panels, settings, split panes, floating windows, TableOfContents |
|
|
62
|
+
| Layout | Panels, settings, split panes, floating windows, TableOfContents, watchAppHostWidth |
|
|
63
63
|
| Surfaces | Cards, avatars, badges, empty states |
|
|
64
64
|
| Feedback | Dialogs, prompts, tooltips, toasts, screen-reader announcements |
|
|
65
65
|
| Content | Tables, charts, calendars, Markdown, file previews, Kbd, LabelChip, Steps, message rows, ReactionBar |
|
package/dist/base.css
CHANGED
|
@@ -41,8 +41,8 @@
|
|
|
41
41
|
--k2b-surface-muted: light-dark(#f4f4f5, #20242a);
|
|
42
42
|
--k2b-surface-elevated: light-dark(#ffffff, #181d24);
|
|
43
43
|
--k2b-text: light-dark(#09090b, #fafafa);
|
|
44
|
-
--k2b-text-secondary: light-dark(#
|
|
45
|
-
--k2b-text-muted: light-dark(#
|
|
44
|
+
--k2b-text-secondary: light-dark(#27272a, #f1f1f3);
|
|
45
|
+
--k2b-text-muted: light-dark(#45454e, #bdbdc6);
|
|
46
46
|
--k2b-placeholder-color: light-dark(#71717a, color-mix(in srgb, #a1a1aa 70%, #71717a));
|
|
47
47
|
--k2b-border: light-dark(#e4e4e7, #29313a);
|
|
48
48
|
--k2b-border-strong: light-dark(#d4d4d8, #3a4552);
|
|
@@ -166,6 +166,11 @@ export function ContextMenuBase(props) {
|
|
|
166
166
|
}
|
|
167
167
|
};
|
|
168
168
|
props.openAt?.(open);
|
|
169
|
+
// A close from outside, such as a drag taking over the press, returns focus that sits in the menu to where it came from.
|
|
170
|
+
props.closeWith?.(() => {
|
|
171
|
+
if (isOpen() && menu?.contains(document.activeElement)) returnFocus(opener?.isConnected ? opener : host, hostRing);
|
|
172
|
+
close();
|
|
173
|
+
});
|
|
169
174
|
onMount(() => {
|
|
170
175
|
onCleanup(() => {
|
|
171
176
|
detachOpenListeners();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["actions/ContextMenu.tsx"],"sourcesContent":["import { createMemo, createSignal, createUniqueId, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { Portal } from \"solid-js/web\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { type DropdownItem, DropdownItems, type DropdownPosition, dropdownPosition } from \"./Dropdown\";\nimport { focusRowSegment } from \"./menu-rows\";\n\nexport type ContextMenuProps = {\n items: readonly DropdownItem[];\n children: JSX.Element;\n class?: string | ((isOpen: boolean) => string);\n /** Tab order of the context-menu host. Descendant-focused composite widgets use -1. */\n tabIndex?: number;\n disabled?: boolean;\n onClose?: () => void;\n onOpen?: () => void;\n id?: string;\n label?: string;\n};\n\nlet closeActiveContextMenu: (() => void) | undefined;\n\nconst focusableItems = (menu: HTMLElement | undefined): HTMLElement[] =>\n menu\n ? Array.from(\n menu.querySelectorAll<HTMLElement>(\n [\n \"[role='menuitem']:not([aria-disabled='true'])\",\n \"[role='menuitemcheckbox']:not([aria-disabled='true'])\",\n \"[role='menuitemradio']:not([aria-disabled='true'])\",\n ].join(\", \"),\n ),\n )\n : [];\n\n/** Right-click menu with keyboard invocation, one-open-at-a-time behavior, and viewport clamping. */\nexport function ContextMenu(props: ContextMenuProps): JSX.Element {\n return ContextMenuBase(props);\n}\n\n/**\n * Package-internal, not exported from the package index: `openAt` lets GestureMenu open the menu at a held finger, and\n * `title` names what was pressed above the entries, since the finger covers it.\n */\nexport function ContextMenuBase(\n props: ContextMenuProps & { openAt?: (open: (x: number, y: number) => void) => void; title?: string },\n): JSX.Element {\n const messages = useUiMessages();\n const generatedId = `k2b-context-${createUniqueId()}`;\n const menuId = `${generatedId}-menu`;\n const [position, setPosition] = createSignal<{ x: number; y: number }>();\n let host: HTMLDivElement | undefined;\n let menu: HTMLDivElement | undefined;\n let listenersAttached = false;\n let hostRing = true;\n /** The element inside the host that had focus as the menu opened, such as a row or a day of a composite widget. */\n let opener: HTMLElement | undefined;\n let anchor = { x: 0, y: 0 };\n let viewport = { width: 0, height: 0 };\n let resizeObserver: ResizeObserver | undefined;\n\n const isOpen = () => position() !== undefined;\n const hostClass = createMemo(() => (typeof props.class === \"function\" ? props.class(isOpen()) : props.class));\n const items = createMemo<readonly DropdownItem[]>(() => props.items);\n\n const dismiss = (event: PointerEvent) => {\n if (menu?.contains(event.target as Node)) return;\n close();\n };\n const closeOnScroll = (event: Event) => {\n const target = event.target;\n if (target instanceof Node && menu?.contains(target)) return;\n close();\n };\n // A resize event may leave the viewport's size unchanged; headless Chromium\n // was seen to fire one on a fresh page. The clamped menu is still in place.\n const closeOnResize = () => {\n if (window.innerWidth === viewport.width && window.innerHeight === viewport.height) return;\n close();\n };\n const attachOpenListeners = () => {\n if (listenersAttached) return;\n listenersAttached = true;\n document.addEventListener(\"pointerdown\", dismiss);\n document.addEventListener(\"keydown\", keyDown);\n window.addEventListener(\"resize\", closeOnResize);\n window.addEventListener(\"scroll\", closeOnScroll, true);\n };\n const detachOpenListeners = () => {\n if (!listenersAttached) return;\n listenersAttached = false;\n document.removeEventListener(\"pointerdown\", dismiss);\n document.removeEventListener(\"keydown\", keyDown);\n window.removeEventListener(\"resize\", closeOnResize);\n window.removeEventListener(\"scroll\", closeOnScroll, true);\n resizeObserver?.disconnect();\n };\n /** Clamps the rendered menu into the viewport beside the point that opened it. */\n const place = () => {\n if (!isOpen() || !menu?.isConnected) return;\n const point = dropdownPosition(\n new DOMRect(anchor.x, anchor.y, 0, 0),\n menu.getBoundingClientRect(),\n \"bottom-right\" satisfies DropdownPosition,\n { width: window.innerWidth, height: window.innerHeight },\n 0,\n );\n setPosition({ x: point.left, y: point.top });\n };\n const close = () => {\n detachOpenListeners();\n if (!isOpen()) return;\n setPosition();\n if (closeActiveContextMenu === close) closeActiveContextMenu = undefined;\n props.onClose?.();\n };\n const focusItem = (index: number) => {\n const items = focusableItems(menu);\n if (items.length === 0) return;\n items[(index + items.length) % items.length]?.focus();\n };\n const open = (x: number, y: number) => {\n if (props.disabled) return;\n closeActiveContextMenu?.();\n // Focus may sit on a descendant of the host, as in composite widgets; Escape returns it there.\n const focused = document.activeElement;\n opener = focused instanceof HTMLElement && focused !== host && host?.contains(focused) ? focused : undefined;\n hostRing = ringOnReturn(focused);\n anchor = { x, y };\n viewport = { width: window.innerWidth, height: window.innerHeight };\n setPosition({ x, y });\n closeActiveContextMenu = close;\n attachOpenListeners();\n props.onOpen?.();\n // The menu sizes to its entries, so it is measured once rendered and\n // clamped into the viewport before the next paint, and again whenever its\n // entries change its size while it is open.\n queueMicrotask(() => {\n if (!isOpen() || !menu?.isConnected) return;\n place();\n if (typeof ResizeObserver !== \"undefined\") {\n resizeObserver ??= new ResizeObserver(place);\n resizeObserver.observe(menu);\n }\n focusItem(0);\n });\n };\n const keyDown = (event: KeyboardEvent) => {\n if (!isOpen()) return;\n const items = focusableItems(menu);\n const current = items.indexOf(document.activeElement as HTMLElement);\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n focusItem(current + (event.key === \"ArrowDown\" ? 1 : -1));\n } else if (focusRowSegment(items, event.key)) {\n event.preventDefault();\n } else if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n focusItem(event.key === \"Home\" ? 0 : -1);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n close();\n returnFocus(opener?.isConnected ? opener : host, hostRing);\n } else if (event.key === \"Tab\") {\n close();\n }\n };\n\n props.openAt?.(open);\n\n onMount(() => {\n onCleanup(() => {\n detachOpenListeners();\n if (closeActiveContextMenu === close) closeActiveContextMenu = undefined;\n });\n });\n\n return (\n <>\n {/* biome-ignore lint/a11y/useAriaPropsSupportedByRole: the named group owns the context-menu relationship without pretending arbitrary children form one button. */}\n <div\n ref={host}\n id={props.id ?? generatedId}\n class={hostClass()}\n role=\"group\"\n tabIndex={props.disabled ? undefined : (props.tabIndex ?? 0)}\n aria-label={props.label ?? messages().contextMenu}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen()}\n aria-controls={isOpen() ? menuId : undefined}\n aria-disabled={props.disabled ? \"true\" : undefined}\n onContextMenu={(event) => {\n if (props.disabled) return;\n event.preventDefault();\n event.stopPropagation();\n open(event.clientX, event.clientY);\n }}\n onKeyDown={(event) => {\n if (props.disabled || (event.key !== \"ContextMenu\" && !(event.shiftKey && event.key === \"F10\"))) return;\n event.preventDefault();\n // Beside the focused element, such as a row of a composite widget, rather than the corner of the whole host.\n const focused = document.activeElement;\n const rect = (focused instanceof HTMLElement && host?.contains(focused) ? focused : host)?.getBoundingClientRect();\n if (rect) open(rect.left + 12, rect.top + 12);\n }}\n >\n {props.children}\n </div>\n <Show when={position()}>\n {(point) => (\n <Portal>\n <div\n ref={menu}\n id={menuId}\n class=\"k2b-ui k2b-context-menu\"\n role=\"menu\"\n aria-label={props.label ?? messages().contextMenu}\n style={{ left: `${point().x}px`, top: `${point().y}px` }}\n onPointerDown={(event) => event.stopPropagation()}\n >\n {/* The menu carries the same name for assistive technology. */}\n <Show when={props.title}>\n <div class=\"k2b-context-menu__title\" aria-hidden=\"true\">\n {props.title}\n </div>\n </Show>\n <DropdownItems items={items()} close={close} />\n </div>\n </Portal>\n )}\n </Show>\n </>\n );\n}\n\nexport default ContextMenu;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["actions/ContextMenu.tsx"],"sourcesContent":["import { createMemo, createSignal, createUniqueId, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { Portal } from \"solid-js/web\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { type DropdownItem, DropdownItems, type DropdownPosition, dropdownPosition } from \"./Dropdown\";\nimport { focusRowSegment } from \"./menu-rows\";\n\nexport type ContextMenuProps = {\n items: readonly DropdownItem[];\n children: JSX.Element;\n class?: string | ((isOpen: boolean) => string);\n /** Tab order of the context-menu host. Descendant-focused composite widgets use -1. */\n tabIndex?: number;\n disabled?: boolean;\n onClose?: () => void;\n onOpen?: () => void;\n id?: string;\n label?: string;\n};\n\nlet closeActiveContextMenu: (() => void) | undefined;\n\nconst focusableItems = (menu: HTMLElement | undefined): HTMLElement[] =>\n menu\n ? Array.from(\n menu.querySelectorAll<HTMLElement>(\n [\n \"[role='menuitem']:not([aria-disabled='true'])\",\n \"[role='menuitemcheckbox']:not([aria-disabled='true'])\",\n \"[role='menuitemradio']:not([aria-disabled='true'])\",\n ].join(\", \"),\n ),\n )\n : [];\n\n/** Right-click menu with keyboard invocation, one-open-at-a-time behavior, and viewport clamping. */\nexport function ContextMenu(props: ContextMenuProps): JSX.Element {\n return ContextMenuBase(props);\n}\n\n/**\n * Package-internal, not exported from the package index: `openAt` lets GestureMenu open the menu at a held finger, and\n * `title` names what was pressed above the entries, since the finger covers it.\n */\nexport function ContextMenuBase(\n props: ContextMenuProps & {\n openAt?: (open: (x: number, y: number) => void) => void;\n title?: string;\n closeWith?: (close: () => void) => void;\n },\n): JSX.Element {\n const messages = useUiMessages();\n const generatedId = `k2b-context-${createUniqueId()}`;\n const menuId = `${generatedId}-menu`;\n const [position, setPosition] = createSignal<{ x: number; y: number }>();\n let host: HTMLDivElement | undefined;\n let menu: HTMLDivElement | undefined;\n let listenersAttached = false;\n let hostRing = true;\n /** The element inside the host that had focus as the menu opened, such as a row or a day of a composite widget. */\n let opener: HTMLElement | undefined;\n let anchor = { x: 0, y: 0 };\n let viewport = { width: 0, height: 0 };\n let resizeObserver: ResizeObserver | undefined;\n\n const isOpen = () => position() !== undefined;\n const hostClass = createMemo(() => (typeof props.class === \"function\" ? props.class(isOpen()) : props.class));\n const items = createMemo<readonly DropdownItem[]>(() => props.items);\n\n const dismiss = (event: PointerEvent) => {\n if (menu?.contains(event.target as Node)) return;\n close();\n };\n const closeOnScroll = (event: Event) => {\n const target = event.target;\n if (target instanceof Node && menu?.contains(target)) return;\n close();\n };\n // A resize event may leave the viewport's size unchanged; headless Chromium\n // was seen to fire one on a fresh page. The clamped menu is still in place.\n const closeOnResize = () => {\n if (window.innerWidth === viewport.width && window.innerHeight === viewport.height) return;\n close();\n };\n const attachOpenListeners = () => {\n if (listenersAttached) return;\n listenersAttached = true;\n document.addEventListener(\"pointerdown\", dismiss);\n document.addEventListener(\"keydown\", keyDown);\n window.addEventListener(\"resize\", closeOnResize);\n window.addEventListener(\"scroll\", closeOnScroll, true);\n };\n const detachOpenListeners = () => {\n if (!listenersAttached) return;\n listenersAttached = false;\n document.removeEventListener(\"pointerdown\", dismiss);\n document.removeEventListener(\"keydown\", keyDown);\n window.removeEventListener(\"resize\", closeOnResize);\n window.removeEventListener(\"scroll\", closeOnScroll, true);\n resizeObserver?.disconnect();\n };\n /** Clamps the rendered menu into the viewport beside the point that opened it. */\n const place = () => {\n if (!isOpen() || !menu?.isConnected) return;\n const point = dropdownPosition(\n new DOMRect(anchor.x, anchor.y, 0, 0),\n menu.getBoundingClientRect(),\n \"bottom-right\" satisfies DropdownPosition,\n { width: window.innerWidth, height: window.innerHeight },\n 0,\n );\n setPosition({ x: point.left, y: point.top });\n };\n const close = () => {\n detachOpenListeners();\n if (!isOpen()) return;\n setPosition();\n if (closeActiveContextMenu === close) closeActiveContextMenu = undefined;\n props.onClose?.();\n };\n const focusItem = (index: number) => {\n const items = focusableItems(menu);\n if (items.length === 0) return;\n items[(index + items.length) % items.length]?.focus();\n };\n const open = (x: number, y: number) => {\n if (props.disabled) return;\n closeActiveContextMenu?.();\n // Focus may sit on a descendant of the host, as in composite widgets; Escape returns it there.\n const focused = document.activeElement;\n opener = focused instanceof HTMLElement && focused !== host && host?.contains(focused) ? focused : undefined;\n hostRing = ringOnReturn(focused);\n anchor = { x, y };\n viewport = { width: window.innerWidth, height: window.innerHeight };\n setPosition({ x, y });\n closeActiveContextMenu = close;\n attachOpenListeners();\n props.onOpen?.();\n // The menu sizes to its entries, so it is measured once rendered and\n // clamped into the viewport before the next paint, and again whenever its\n // entries change its size while it is open.\n queueMicrotask(() => {\n if (!isOpen() || !menu?.isConnected) return;\n place();\n if (typeof ResizeObserver !== \"undefined\") {\n resizeObserver ??= new ResizeObserver(place);\n resizeObserver.observe(menu);\n }\n focusItem(0);\n });\n };\n const keyDown = (event: KeyboardEvent) => {\n if (!isOpen()) return;\n const items = focusableItems(menu);\n const current = items.indexOf(document.activeElement as HTMLElement);\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n focusItem(current + (event.key === \"ArrowDown\" ? 1 : -1));\n } else if (focusRowSegment(items, event.key)) {\n event.preventDefault();\n } else if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n focusItem(event.key === \"Home\" ? 0 : -1);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n close();\n returnFocus(opener?.isConnected ? opener : host, hostRing);\n } else if (event.key === \"Tab\") {\n close();\n }\n };\n\n props.openAt?.(open);\n // A close from outside, such as a drag taking over the press, returns focus that sits in the menu to where it came from.\n props.closeWith?.(() => {\n if (isOpen() && menu?.contains(document.activeElement)) returnFocus(opener?.isConnected ? opener : host, hostRing);\n close();\n });\n\n onMount(() => {\n onCleanup(() => {\n detachOpenListeners();\n if (closeActiveContextMenu === close) closeActiveContextMenu = undefined;\n });\n });\n\n return (\n <>\n {/* biome-ignore lint/a11y/useAriaPropsSupportedByRole: the named group owns the context-menu relationship without pretending arbitrary children form one button. */}\n <div\n ref={host}\n id={props.id ?? generatedId}\n class={hostClass()}\n role=\"group\"\n tabIndex={props.disabled ? undefined : (props.tabIndex ?? 0)}\n aria-label={props.label ?? messages().contextMenu}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen()}\n aria-controls={isOpen() ? menuId : undefined}\n aria-disabled={props.disabled ? \"true\" : undefined}\n onContextMenu={(event) => {\n if (props.disabled) return;\n event.preventDefault();\n event.stopPropagation();\n open(event.clientX, event.clientY);\n }}\n onKeyDown={(event) => {\n if (props.disabled || (event.key !== \"ContextMenu\" && !(event.shiftKey && event.key === \"F10\"))) return;\n event.preventDefault();\n // Beside the focused element, such as a row of a composite widget, rather than the corner of the whole host.\n const focused = document.activeElement;\n const rect = (focused instanceof HTMLElement && host?.contains(focused) ? focused : host)?.getBoundingClientRect();\n if (rect) open(rect.left + 12, rect.top + 12);\n }}\n >\n {props.children}\n </div>\n <Show when={position()}>\n {(point) => (\n <Portal>\n <div\n ref={menu}\n id={menuId}\n class=\"k2b-ui k2b-context-menu\"\n role=\"menu\"\n aria-label={props.label ?? messages().contextMenu}\n style={{ left: `${point().x}px`, top: `${point().y}px` }}\n onPointerDown={(event) => event.stopPropagation()}\n >\n {/* The menu carries the same name for assistive technology. */}\n <Show when={props.title}>\n <div class=\"k2b-context-menu__title\" aria-hidden=\"true\">\n {props.title}\n </div>\n </Show>\n <DropdownItems items={items()} close={close} />\n </div>\n </Portal>\n )}\n </Show>\n </>\n );\n}\n\nexport default ContextMenu;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { template as _$template } from "solid-js/web";
|
|
2
|
+
import { setAttribute as _$setAttribute } from "solid-js/web";
|
|
3
|
+
import { className as _$className } from "solid-js/web";
|
|
4
|
+
import { effect as _$effect } from "solid-js/web";
|
|
5
|
+
import { getNextElement as _$getNextElement } from "solid-js/web";
|
|
6
|
+
import { insert as _$insert } from "solid-js/web";
|
|
7
|
+
import { use as _$use } from "solid-js/web";
|
|
8
|
+
var _tmpl$ = /*#__PURE__*/_$template(`<div>`);
|
|
9
|
+
import { createEffect, onCleanup, onMount } from "solid-js";
|
|
10
|
+
import { bindDragSource, registerDropTarget, startKeyboardDrag } from "./drag-and-drop";
|
|
11
|
+
import { useDragAndDropMessages } from "./drag-and-drop-messages";
|
|
12
|
+
export { activeDrag } from "./drag-and-drop";
|
|
13
|
+
export function DragSource(props) {
|
|
14
|
+
const messages = useDragAndDropMessages();
|
|
15
|
+
let source;
|
|
16
|
+
onMount(() => onCleanup(bindDragSource(source, () => ({
|
|
17
|
+
payload: props.payload,
|
|
18
|
+
disabled: props.disabled,
|
|
19
|
+
messages: messages()
|
|
20
|
+
}))));
|
|
21
|
+
return (() => {
|
|
22
|
+
var _el$ = _$getNextElement(_tmpl$);
|
|
23
|
+
var _ref$ = source;
|
|
24
|
+
typeof _ref$ === "function" ? _$use(_ref$, _el$) : source = _el$;
|
|
25
|
+
_$insert(_el$, () => props.children);
|
|
26
|
+
_$effect(_p$ => {
|
|
27
|
+
var _v$ = `k2b-drag-source${props.class ? ` ${props.class}` : ""}`,
|
|
28
|
+
_v$2 = props.disabled ? "" : undefined;
|
|
29
|
+
_v$ !== _p$.e && _$className(_el$, _p$.e = _v$);
|
|
30
|
+
_v$2 !== _p$.t && _$setAttribute(_el$, "data-drag-disabled", _p$.t = _v$2);
|
|
31
|
+
return _p$;
|
|
32
|
+
}, {
|
|
33
|
+
e: undefined,
|
|
34
|
+
t: undefined
|
|
35
|
+
});
|
|
36
|
+
return _el$;
|
|
37
|
+
})();
|
|
38
|
+
}
|
|
39
|
+
export function DropTarget(props) {
|
|
40
|
+
// Resolve the inherited locale in the component's owner, as DragSource and the keyboard hook do.
|
|
41
|
+
const messages = useDragAndDropMessages();
|
|
42
|
+
let element;
|
|
43
|
+
onMount(() => {
|
|
44
|
+
const read = () => {
|
|
45
|
+
const accept = props.accept;
|
|
46
|
+
const onDrop = props.onDrop;
|
|
47
|
+
return {
|
|
48
|
+
accept,
|
|
49
|
+
label: props.label,
|
|
50
|
+
messages: messages(),
|
|
51
|
+
disabled: props.disabled,
|
|
52
|
+
drop: payload => {
|
|
53
|
+
// Only this membership guard narrows the opaque payload type at the registry boundary.
|
|
54
|
+
const type = accept.find(type => type === payload.type);
|
|
55
|
+
if (type !== undefined) onDrop({
|
|
56
|
+
...payload,
|
|
57
|
+
type
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
const target = registerDropTarget(element, read());
|
|
63
|
+
createEffect(() => target.update(read()));
|
|
64
|
+
onCleanup(() => target.dispose());
|
|
65
|
+
});
|
|
66
|
+
return (() => {
|
|
67
|
+
var _el$2 = _$getNextElement(_tmpl$);
|
|
68
|
+
var _ref$2 = element;
|
|
69
|
+
typeof _ref$2 === "function" ? _$use(_ref$2, _el$2) : element = _el$2;
|
|
70
|
+
_$insert(_el$2, () => props.children);
|
|
71
|
+
_$effect(() => _$className(_el$2, `k2b-drop-target${props.class ? ` ${props.class}` : ""}`));
|
|
72
|
+
return _el$2;
|
|
73
|
+
})();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Starts the optional keyboard pick-up sequence from a menu entry. Focus returns to `origin` afterwards, or to its
|
|
78
|
+
* nearest focusable ancestor, such as the group of a `GestureMenu`.
|
|
79
|
+
*/
|
|
80
|
+
export function useKeyboardDrag() {
|
|
81
|
+
const messages = useDragAndDropMessages();
|
|
82
|
+
let cancel;
|
|
83
|
+
onCleanup(() => cancel?.());
|
|
84
|
+
return (payload, origin) => {
|
|
85
|
+
cancel?.();
|
|
86
|
+
cancel = startKeyboardDrag(payload, origin, messages());
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=DragAndDrop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["actions/DragAndDrop.tsx"],"sourcesContent":["import { createEffect, type JSX, onCleanup, onMount } from \"solid-js\";\nimport { bindDragSource, type DragPayload, registerDropTarget, startKeyboardDrag } from \"./drag-and-drop\";\nimport { useDragAndDropMessages } from \"./drag-and-drop-messages\";\n\nexport type { DragPayload } from \"./drag-and-drop\";\nexport { activeDrag } from \"./drag-and-drop\";\n\nexport type DragSourceProps<Type extends string = string> = {\n /** Read when the drag starts, so a selection can decide what is dragged. */\n payload: DragPayload<Type>;\n disabled?: boolean;\n class?: string;\n children: JSX.Element;\n};\nexport type DropTargetProps<Type extends string = string> = {\n /** The payload types this target takes. */\n accept: readonly Type[];\n /** Names the target in announcements and in the keyboard path, such as \"Archive\". */\n label: string;\n onDrop: (payload: DragPayload<Type>) => void;\n /** The target takes nothing now, for example without access; it refuses every drop. */\n disabled?: boolean;\n class?: string;\n children: JSX.Element;\n};\n\nexport function DragSource<Type extends string = string>(props: DragSourceProps<Type>): JSX.Element {\n const messages = useDragAndDropMessages();\n let source!: HTMLDivElement;\n onMount(() => onCleanup(bindDragSource(source, () => ({ payload: props.payload, disabled: props.disabled, messages: messages() }))));\n return (\n <div ref={source} class={`k2b-drag-source${props.class ? ` ${props.class}` : \"\"}`} data-drag-disabled={props.disabled ? \"\" : undefined}>\n {props.children}\n </div>\n );\n}\n\nexport function DropTarget<Type extends string = string>(props: DropTargetProps<Type>): JSX.Element {\n // Resolve the inherited locale in the component's owner, as DragSource and the keyboard hook do.\n const messages = useDragAndDropMessages();\n let element!: HTMLDivElement;\n onMount(() => {\n const read = () => {\n const accept = props.accept;\n const onDrop = props.onDrop;\n return {\n accept,\n label: props.label,\n messages: messages(),\n disabled: props.disabled,\n drop: (payload: DragPayload) => {\n // Only this membership guard narrows the opaque payload type at the registry boundary.\n const type = accept.find((type) => type === payload.type);\n if (type !== undefined) onDrop({ ...payload, type });\n },\n };\n };\n const target = registerDropTarget(element, read());\n createEffect(() => target.update(read()));\n onCleanup(() => target.dispose());\n });\n return (\n <div ref={element} class={`k2b-drop-target${props.class ? ` ${props.class}` : \"\"}`}>\n {props.children}\n </div>\n );\n}\n\n/**\n * Starts the optional keyboard pick-up sequence from a menu entry. Focus returns to `origin` afterwards, or to its\n * nearest focusable ancestor, such as the group of a `GestureMenu`.\n */\nexport function useKeyboardDrag(): (payload: DragPayload, origin: HTMLElement) => void {\n const messages = useDragAndDropMessages();\n let cancel: (() => void) | undefined;\n onCleanup(() => cancel?.());\n return (payload, origin) => {\n cancel?.();\n cancel = startKeyboardDrag(payload, origin, messages());\n };\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,YAAY,EAAY,SAAS,EAAE,OAAO,QAAQ,UAAU;AACrE,SAAS,cAAc,EAAoB,kBAAkB,EAAE,iBAAiB,QAAQ,iBAAiB;AACzG,SAAS,sBAAsB,QAAQ,0BAA0B;AAGjE,SAAS,UAAU,QAAQ,iBAAiB;AAqB5C,OAAO,SAAS,UAAU,CAA+B,KAA4B,EAAe;EAClG,MAAM,QAAQ,GAAG,sBAAsB,CAAC,CAAC;EACzC,IAAI,MAAuB;EAC3B,OAAO,CAAC,MAAM,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO;IAAE,OAAO,EAAE,KAAK,CAAC,OAAO;IAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ;IAAE,QAAQ,EAAE,QAAQ,CAAC;EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;EACpI;IAAA;IAAA,YACY,MAAM;IAAA,mDAAN,MAAM;IAAA,qBACb,KAAK,CAAC,QAAQ;IAAA;MAAA,UADQ,kBAAkB,KAAK,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAAA,OAAsB,KAAK,CAAC,QAAQ,GAAG,EAAE,GAAG,SAAS;MAAA;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;IAAA;EAAA;AAI1I;AAEA,OAAO,SAAS,UAAU,CAA+B,KAA4B,EAAe;EAClG;EACA,MAAM,QAAQ,GAAG,sBAAsB,CAAC,CAAC;EACzC,IAAI,OAAwB;EAC5B,OAAO,CAAC,MAAM;IACZ,MAAM,IAAI,GAAG,MAAM;MACjB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;MAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;MAC3B,OAAO;QACL,MAAM;QACN,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,IAAI,EAAG,OAAoB,IAAK;UAC9B;UACA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAE,IAAI,IAAK,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC;UACzD,IAAI,IAAI,KAAK,SAAS,EAAE,MAAM,CAAC;YAAE,GAAG,OAAO;YAAE;UAAK,CAAC,CAAC;QACtD;MACF,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAClD,YAAY,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzC,SAAS,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;EACnC,CAAC,CAAC;EACF;IAAA;IAAA,aACY,OAAO;IAAA,sDAAP,OAAO;IAAA,sBACd,KAAK,CAAC,QAAQ;IAAA,kCADS,kBAAkB,KAAK,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IAAA;EAAA;AAItF;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAAS,eAAe,GAAwD;EACrF,MAAM,QAAQ,GAAG,sBAAsB,CAAC,CAAC;EACzC,IAAI,MAAgC;EACpC,SAAS,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC;EAC3B,OAAO,CAAC,OAAO,EAAE,MAAM,KAAK;IAC1B,MAAM,GAAG,CAAC;IACV,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;EACzD,CAAC;AACH","ignoreList":[]}
|
|
@@ -7,10 +7,10 @@ import { mergeProps as _$mergeProps } from "solid-js/web";
|
|
|
7
7
|
import { setStyleProperty as _$setStyleProperty } from "solid-js/web";
|
|
8
8
|
import { setProperty as _$setProperty } from "solid-js/web";
|
|
9
9
|
import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
|
|
10
|
-
import { memo as _$memo } from "solid-js/web";
|
|
11
10
|
import { setAttribute as _$setAttribute } from "solid-js/web";
|
|
12
11
|
import { className as _$className } from "solid-js/web";
|
|
13
12
|
import { effect as _$effect } from "solid-js/web";
|
|
13
|
+
import { memo as _$memo } from "solid-js/web";
|
|
14
14
|
import { getNextElement as _$getNextElement } from "solid-js/web";
|
|
15
15
|
import { getNextMarker as _$getNextMarker } from "solid-js/web";
|
|
16
16
|
import { insert as _$insert } from "solid-js/web";
|
|
@@ -105,7 +105,7 @@ const itemContent = props => [_$createComponent(Show, {
|
|
|
105
105
|
})()
|
|
106
106
|
}), _el$4, _co$);
|
|
107
107
|
return _el$;
|
|
108
|
-
})()];
|
|
108
|
+
})(), _$memo(() => props.trailing)];
|
|
109
109
|
export function DropdownItem(props) {
|
|
110
110
|
const menu = useContext(MenuContext);
|
|
111
111
|
const danger = () => props.danger || props.variant === "danger";
|
|
@@ -306,7 +306,7 @@ function DropdownChoiceItem(props) {
|
|
|
306
306
|
})()
|
|
307
307
|
}), _el$13, _co$2);
|
|
308
308
|
return _el$10;
|
|
309
|
-
})(), _$createComponent(Show, {
|
|
309
|
+
})(), _$memo(() => props.trailing), _$createComponent(Show, {
|
|
310
310
|
get when() {
|
|
311
311
|
return props.choice === "radio";
|
|
312
312
|
},
|
|
@@ -337,6 +337,9 @@ export function DropdownItems(props) {
|
|
|
337
337
|
get description() {
|
|
338
338
|
return item.description;
|
|
339
339
|
},
|
|
340
|
+
get trailing() {
|
|
341
|
+
return item.trailing;
|
|
342
|
+
},
|
|
340
343
|
get variant() {
|
|
341
344
|
return item.variant;
|
|
342
345
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["actions/Dropdown.tsx"],"sourcesContent":["import {\n createContext,\n createEffect,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n onCleanup,\n onMount,\n Show,\n splitProps,\n useContext,\n} from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\nimport { Tooltip, type TooltipPlacement, useLabelTooltip } from \"../feedback/Tooltip\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { Button, type ButtonProps, type ButtonSize, type ButtonVariant, iconTitle } from \"./Button\";\nimport { focusRowSegment } from \"./menu-rows\";\nimport { openMenuSheet, prefersMenuSheet } from \"./menu-sheet\";\n\n// Resolved outside JSX: a conditional attribute compiles to a lazy memo, which would be created inside the click handler.\nconst selectAction = (item: { action?: () => void }) => item.action;\n\nexport type DropdownPosition = \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\" | \"right-start\";\n\nexport type DropdownActionBase = {\n class?: string;\n disabled?: boolean;\n icon?: string;\n image?: string;\n label: string;\n /**\n * Accessible name when it must say more than the visible label, such as the current value and what the next\n * activation does. It must contain the visible label.\n */\n ariaLabel?: string;\n description?: string;\n variant?: \"danger\";\n};\n\nexport type DropdownAction =\n | (DropdownActionBase & {\n action: () => void;\n /**\n * Set `false` for an action that changes a value in place, such as cycling a setting: the menu stays open and\n * the focus stays on the row. Defaults to `true`.\n */\n closeOnSelect?: boolean;\n /**\n * In a phone sheet, run while the tap still counts as the person's gesture, before the sheet closes, as browsers\n * require for clipboard writes. Other actions run after the sheet has left the history. Such an action must\n * not navigate or open a dialog.\n */\n immediate?: boolean;\n href?: never;\n external?: never;\n })\n | (DropdownActionBase & {\n href: string;\n external?: boolean;\n /** Runs on a plain click instead of following the link; modified clicks, middle-click, and the link's menu keep it. */\n action?: () => void;\n })\n | (DropdownActionBase & {\n disabled: true;\n action?: never;\n href?: never;\n external?: never;\n });\n\n/** Declarative radio or checkbox row for compact action menus. */\nexport type DropdownChoice = DropdownActionBase & {\n action: () => void;\n checked: boolean | (() => boolean);\n choice: \"checkbox\" | \"radio\";\n href?: string;\n closeOnSelect?: boolean;\n color?: string;\n};\n\nexport type DropdownSection = {\n sectionLabel?: string;\n /**\n * `row` sets a few short radio choices, such as a sort direction, side by side as one segmented row. Give it a\n * `sectionLabel`: the label names the choice above the row and for screen readers.\n */\n layout?: \"row\";\n items: readonly (DropdownAction | DropdownChoice)[];\n};\n\nexport type DropdownItem = DropdownAction | DropdownChoice | DropdownSection;\n\nexport type DropdownProps = {\n items: readonly DropdownItem[];\n children: JSX.Element;\n position?: DropdownPosition | (() => DropdownPosition);\n /** Larger menu rows and typography for touch. Defaults to `default`. */\n variant?: \"default\" | \"touch\";\n /**\n * Exact menu width as a CSS length. Without it the menu sizes to its longest\n * entry: at least `12rem` (`18rem` for touch), at most the viewport width\n * less `1rem` per side, where longer entries wrap.\n */\n width?: string;\n class?: string;\n menuClass?: string;\n onClose?: () => void;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n disabled?: boolean;\n label?: string;\n align?: \"start\" | \"end\";\n /**\n * `sheet` opens the same items as a bottom sheet on phones (below 48rem) instead of a menu beside the trigger.\n * Defaults to `menu`. A controlled menu (`open`) always stays a menu.\n */\n phone?: \"menu\" | \"sheet\";\n};\n\nexport type DropdownTriggerProps = Omit<\n ButtonProps,\n \"aria-controls\" | \"aria-expanded\" | \"aria-haspopup\" | \"children\" | \"disabled\" | \"onClick\" | \"onKeyDown\"\n> & {\n children: JSX.Element;\n /** Use `plain` when a specialized component class owns the complete visual treatment. */\n appearance?: \"button\" | \"plain\";\n disabled?: boolean;\n iconOnly?: boolean;\n label?: string;\n size?: ButtonSize;\n tooltip?: JSX.Element | false;\n tooltipDelay?: number;\n tooltipPlacement?: TooltipPlacement;\n variant?: ButtonVariant;\n};\n\nexport type DropdownItemProps = {\n children: JSX.Element;\n closeOnSelect?: boolean;\n ariaLabel?: string;\n icon?: string;\n image?: string;\n description?: string;\n disabled?: boolean;\n danger?: boolean;\n variant?: \"danger\";\n href?: string;\n external?: boolean;\n /** Runs when the item is chosen. With `href`, a plain click runs it instead of following the link. */\n onSelect?: () => void;\n class?: string;\n};\n\ntype MenuContextValue = {\n close: (restoreFocus?: boolean) => void;\n};\n\ntype DropdownContextValue = {\n disabled: () => boolean;\n menuId: string;\n open: () => boolean;\n registerTrigger: (element: HTMLButtonElement) => void;\n toggle: () => void;\n triggerKeyDown: JSX.EventHandlerUnion<HTMLButtonElement, KeyboardEvent>;\n};\n\nconst MenuContext = createContext<MenuContextValue>();\nconst DropdownContext = createContext<DropdownContextValue>();\n\nconst actionableItems = (menu: HTMLElement | undefined): HTMLElement[] =>\n menu\n ? Array.from(\n menu.querySelectorAll<HTMLElement>(\n [\n \"[role='menuitem']:not([aria-disabled='true'])\",\n \"[role='menuitemcheckbox']:not([aria-disabled='true'])\",\n \"[role='menuitemradio']:not([aria-disabled='true'])\",\n ].join(\", \"),\n ),\n )\n : [];\n\nconst focusMenuItem = (menu: HTMLElement | undefined, index: number): void => {\n const items = actionableItems(menu);\n if (items.length === 0) return;\n items[(index + items.length) % items.length]?.focus();\n};\n\nexport const dropdownPosition = (\n trigger: DOMRect,\n menu: Pick<DOMRect, \"width\" | \"height\">,\n position: DropdownPosition,\n viewport: { width: number; height: number },\n gap = 4,\n): { left: number; top: number } => {\n let left = trigger.left;\n let top = trigger.bottom + gap;\n\n if (position === \"bottom-left\" || position === \"top-left\") left = trigger.right - menu.width;\n if (position === \"top-right\" || position === \"top-left\") top = trigger.top - menu.height - gap;\n if (position === \"right-start\") {\n left = trigger.right + gap;\n top = trigger.top;\n }\n\n return {\n left: Math.max(8, Math.min(left, viewport.width - menu.width - 8)),\n top: Math.max(8, Math.min(top, viewport.height - menu.height - 8)),\n };\n};\n\nconst itemContent = (props: { description?: string; icon?: string; image?: string; children: JSX.Element }): JSX.Element => (\n <>\n <Show when={props.image} fallback={<Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}>\n {(image) => <img class=\"k2b-dropdown__image\" src={image()} alt=\"\" />}\n </Show>\n <span class=\"k2b-dropdown__copy\">\n <span>{props.children}</span>\n <Show when={props.description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n </>\n);\n\nexport function DropdownItem(props: DropdownItemProps): JSX.Element {\n const menu = useContext(MenuContext);\n const danger = () => props.danger || props.variant === \"danger\";\n const content = itemContent(props);\n\n return (\n <Show\n when={!props.disabled ? props.href : undefined}\n fallback={\n <button\n type=\"button\"\n role=\"menuitem\"\n aria-label={props.ariaLabel}\n tabIndex={-1}\n class={`k2b-dropdown__item ${props.class ?? \"\"}`}\n data-danger={danger() ? \"true\" : undefined}\n disabled={props.disabled}\n aria-disabled={props.disabled ? \"true\" : undefined}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n if (props.closeOnSelect !== false) menu?.close();\n props.onSelect?.();\n }}\n >\n {content}\n </button>\n }\n >\n {(href) => (\n <a\n href={href()}\n target={props.external ? \"_blank\" : undefined}\n rel={props.external ? \"noopener noreferrer\" : undefined}\n role=\"menuitem\"\n aria-label={props.ariaLabel}\n tabIndex={-1}\n class={`k2b-dropdown__item ${props.class ?? \"\"}`}\n data-danger={danger() ? \"true\" : undefined}\n onClick={(event) => {\n // With `onSelect`, a plain click runs it in place of the link; a modified click keeps its browser meaning.\n if (props.onSelect && !(event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)) {\n event.preventDefault();\n menu?.close();\n props.onSelect();\n return;\n }\n menu?.close(false);\n }}\n >\n {content}\n </a>\n )}\n </Show>\n );\n}\n\nfunction DropdownChoiceItem(props: DropdownChoice): JSX.Element {\n const menu = useContext(MenuContext);\n const checked = () => (typeof props.checked === \"function\" ? props.checked() : props.checked);\n let element: HTMLElement | undefined;\n return (\n <Dynamic\n ref={(node: HTMLAnchorElement | HTMLButtonElement) => {\n element = node;\n }}\n component={!props.disabled && props.href ? \"a\" : \"button\"}\n href={!props.disabled ? props.href : undefined}\n type={!props.disabled && props.href ? undefined : \"button\"}\n role={props.choice === \"checkbox\" ? \"menuitemcheckbox\" : \"menuitemradio\"}\n aria-label={props.ariaLabel}\n aria-checked={checked()}\n aria-disabled={props.disabled ? \"true\" : undefined}\n tabIndex={-1}\n class={`k2b-dropdown__item ${props.class ?? \"\"}`}\n data-selected={checked() ? \"true\" : undefined}\n disabled={props.disabled}\n onClick={(event: MouseEvent) => {\n if (props.href && (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)) {\n menu?.close(false);\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n if (props.closeOnSelect !== false) menu?.close();\n props.action();\n }}\n onKeyDown={(event: KeyboardEvent) => {\n // A link answers only Enter; as a menu choice it also answers Space, like the button form.\n if (event.key !== \" \" || props.disabled || !props.href) return;\n event.preventDefault();\n element?.click();\n }}\n >\n <Show when={props.choice === \"checkbox\"}>\n <span class=\"k2b-dropdown__checkbox\" aria-hidden=\"true\">\n <Show when={checked()}>\n <i class=\"ti ti-check\" />\n </Show>\n </span>\n </Show>\n <Show when={props.image} fallback={<Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}>\n {(image) => <img class=\"k2b-dropdown__image\" src={image()} alt=\"\" />}\n </Show>\n <Show when={props.color}>\n {(color) => <span class=\"k2b-dropdown__color\" style={{ \"--k2b-dropdown-color\": color() }} aria-hidden=\"true\" />}\n </Show>\n <span class=\"k2b-dropdown__copy\">\n <span>{props.label}</span>\n <Show when={props.description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n {/* Always present for radios, so selecting the widest entry cannot widen a content-sized menu. */}\n <Show when={props.choice === \"radio\"}>\n <i class=\"ti ti-check k2b-dropdown__check\" data-hidden={checked() ? undefined : \"true\"} aria-hidden=\"true\" />\n </Show>\n </Dynamic>\n );\n}\n\nexport function DropdownItems(props: { items: readonly DropdownItem[]; close: (restoreFocus?: boolean) => void }): JSX.Element {\n const messages = useUiMessages();\n const renderItem = (item: DropdownAction | DropdownChoice): JSX.Element =>\n \"choice\" in item ? (\n <DropdownChoiceItem {...item} />\n ) : (\n <DropdownItem\n ariaLabel={item.ariaLabel}\n closeOnSelect={\"closeOnSelect\" in item ? item.closeOnSelect : undefined}\n icon={item.icon}\n image={item.image}\n description={item.description}\n variant={item.variant}\n disabled={item.disabled}\n class={item.class}\n href={\"href\" in item ? item.href : undefined}\n external={\"external\" in item ? item.external : undefined}\n onSelect={selectAction(item)}\n >\n {item.label}\n </DropdownItem>\n );\n\n return (\n <MenuContext.Provider value={{ close: props.close }}>\n <For each={props.items}>\n {(item, index) => (\n <Show when={\"items\" in item} fallback={renderItem(item as DropdownAction | DropdownChoice)}>\n <div\n class=\"k2b-dropdown__section\"\n data-divided={index() > 0 ? \"true\" : undefined}\n role=\"group\"\n // A row of choices is no set of actions: without a label it stays unnamed rather than misnamed.\n aria-label={\n (item as DropdownSection).sectionLabel ?? ((item as DropdownSection).layout === \"row\" ? undefined : messages().actions)\n }\n >\n <Show when={(item as DropdownSection).sectionLabel}>{(label) => <div class=\"k2b-dropdown__label\">{label()}</div>}</Show>\n <Show\n when={(item as DropdownSection).layout === \"row\"}\n fallback={<For each={(item as DropdownSection).items}>{renderItem}</For>}\n >\n <div class=\"k2b-dropdown__row\">\n <For each={(item as DropdownSection).items}>{renderItem}</For>\n </div>\n </Show>\n </div>\n </Show>\n )}\n </For>\n </MenuContext.Provider>\n );\n}\n\nfunction DropdownTrigger(props: DropdownTriggerProps): JSX.Element {\n const context = useContext(DropdownContext);\n if (!context) throw new Error(\"Dropdown.Trigger must be used inside Dropdown.Root\");\n const [local, rest] = splitProps(props, [\n \"appearance\",\n \"children\",\n \"class\",\n \"disabled\",\n \"iconOnly\",\n \"label\",\n \"ref\",\n \"size\",\n \"tabIndex\",\n \"title\",\n \"tooltip\",\n \"tooltipDelay\",\n \"tooltipPlacement\",\n \"type\",\n \"variant\",\n ]);\n let target: HTMLButtonElement | undefined;\n const disabled = () => Boolean(context.disabled() || local.disabled);\n // An icon-only trigger shows its label as a hint, like IconButton.\n const tooltip = useLabelTooltip(\n () => local.tooltip,\n () => (local.iconOnly ? (local.title ?? local.label) : undefined),\n );\n const register = (element: HTMLButtonElement) => {\n target = element;\n context.registerTrigger(element);\n if (typeof local.ref === \"function\") local.ref(element);\n };\n const click: JSX.EventHandlerUnion<HTMLButtonElement, MouseEvent> = (event) => {\n event.stopPropagation();\n context.toggle();\n };\n\n if (local.appearance !== \"plain\") {\n return (\n <Button\n {...rest}\n ref={register}\n aria-controls={context.menuId}\n aria-expanded={context.open()}\n aria-haspopup=\"menu\"\n aria-label={local.label}\n disabled={disabled()}\n tabIndex={disabled() ? -1 : local.tabIndex}\n onClick={click}\n onKeyDown={context.triggerKeyDown}\n type={local.type ?? \"button\"}\n class={`${local.iconOnly ? \"k2b-icon-button\" : \"\"} k2b-dropdown__trigger ${local.class ?? \"\"}`}\n size={local.size}\n variant={local.variant ?? (local.iconOnly ? \"ghost\" : undefined)}\n title={iconTitle(local.title, tooltip())}\n tooltip={tooltip()}\n tooltipDelay={local.tooltipDelay}\n tooltipPlacement={local.tooltipPlacement}\n >\n {local.children}\n </Button>\n );\n }\n\n return (\n <>\n <button\n {...rest}\n ref={register}\n aria-controls={context.menuId}\n aria-expanded={context.open()}\n aria-haspopup=\"menu\"\n aria-label={local.label}\n disabled={disabled()}\n tabIndex={disabled() ? -1 : local.tabIndex}\n onClick={click}\n onKeyDown={context.triggerKeyDown}\n type={local.type ?? \"button\"}\n class={`k2b-dropdown__trigger ${local.class ?? \"\"}`}\n title={iconTitle(local.title, tooltip())}\n >\n {local.children}\n </button>\n <Show when={tooltip() !== false && tooltip() !== undefined}>\n <Tooltip\n content={tooltip() as JSX.Element}\n target={() => target}\n delay={local.tooltipDelay}\n disabled={disabled()}\n placement={local.tooltipPlacement}\n />\n </Show>\n </>\n );\n}\n\n/** Accessible top-layer menu with explicit trigger ownership. */\nfunction DropdownRoot(props: DropdownProps): JSX.Element {\n const messages = useUiMessages();\n const locale = useLocale();\n /** The open phone sheet's cancel switch: it closes when the menu goes or is disabled, as the popover does. */\n let sheet: AbortController | undefined;\n const id = createUniqueId().replace(/[^a-zA-Z0-9_-]/g, \"-\");\n const menuId = `k2b-dropdown-${id}`;\n const [internalOpen, setInternalOpen] = createSignal(false);\n let triggerRef: HTMLButtonElement | undefined;\n let menuRef: HTMLDivElement | undefined;\n let triggerRing = true;\n let mounted = false;\n /** Where a key on the trigger asked the focus to go; a controlled menu opens later, in its owner's update. */\n let keyFocus: \"first\" | \"last\" | false = false;\n let viewportListenersAttached = false;\n let resizeObserver: ResizeObserver | undefined;\n\n const isOpen = () => props.open ?? internalOpen();\n const position = (): DropdownPosition =>\n typeof props.position === \"function\" ? props.position() : (props.position ?? (props.align === \"end\" ? \"bottom-left\" : \"bottom-right\"));\n\n const place = () => {\n if (!triggerRef || !menuRef) return;\n const rect = dropdownPosition(triggerRef.getBoundingClientRect(), menuRef.getBoundingClientRect(), position(), {\n width: window.innerWidth,\n height: window.innerHeight,\n });\n menuRef.style.left = `${rect.left}px`;\n menuRef.style.top = `${rect.top}px`;\n };\n const reposition = () => {\n if (isOpen()) place();\n };\n const attachViewportListeners = () => {\n if (viewportListenersAttached) return;\n viewportListenersAttached = true;\n window.addEventListener(\"resize\", reposition);\n window.addEventListener(\"scroll\", reposition, true);\n // A content-sized menu changes size when its items change while it is open.\n if (menuRef && typeof ResizeObserver !== \"undefined\") {\n resizeObserver ??= new ResizeObserver(reposition);\n resizeObserver.observe(menuRef);\n }\n };\n const detachViewportListeners = () => {\n if (!viewportListenersAttached) return;\n viewportListenersAttached = false;\n window.removeEventListener(\"resize\", reposition);\n window.removeEventListener(\"scroll\", reposition, true);\n resizeObserver?.disconnect();\n };\n const close = (restoreFocus = true) => {\n // Before hiding, so the popover does not return focus on its own.\n if (restoreFocus) returnFocus(triggerRef, triggerRing);\n if (menuRef?.matches(\":popover-open\")) menuRef.hidePopover();\n // Like `open`, expose the closed state now: the toggle event can arrive after the next key press, and a trigger\n // that still reads as open would ignore Enter (Escape, then Enter at once, must reopen).\n setInternalOpen(false);\n detachViewportListeners();\n };\n const open = (focus: \"first\" | \"last\" | false = \"first\") => {\n if (props.disabled || !menuRef || menuRef.matches(\":popover-open\")) return;\n triggerRing = ringOnReturn(triggerRef);\n menuRef.showPopover();\n // The toggle event arrives a task later; expose the open state before focus moves into the menu.\n setInternalOpen(true);\n attachViewportListeners();\n place();\n queueMicrotask(() => {\n if (focus) focusMenuItem(menuRef, focus === \"first\" ? 0 : -1);\n });\n };\n const requestOpen = (next: boolean, focus: \"first\" | \"last\" | false = \"first\") => {\n if (props.disabled && next) return;\n if (props.open !== undefined) {\n props.onOpenChange?.(next);\n return;\n }\n if (next && props.phone === \"sheet\" && prefersMenuSheet()) {\n if (sheet) return;\n const current = new AbortController();\n sheet = current;\n // The sheet is this menu's open state: the trigger reports it and the owner hears both ends.\n setInternalOpen(true);\n props.onOpenChange?.(true);\n void openMenuSheet({\n Items: DropdownItems,\n items: props.items,\n label: props.label ?? messages().dropdownMenu,\n locale: locale(),\n signal: current.signal,\n }).finally(() => {\n sheet = undefined;\n setInternalOpen(false);\n props.onOpenChange?.(false);\n props.onClose?.();\n });\n return;\n }\n if (next) open(focus);\n else close(false);\n };\n const handleMenuKeyDown = (event: KeyboardEvent) => {\n const items = actionableItems(menuRef);\n const current = items.indexOf(document.activeElement as HTMLElement);\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n focusMenuItem(menuRef, current + (event.key === \"ArrowDown\" ? 1 : -1));\n } else if (focusRowSegment(items, event.key)) {\n event.preventDefault();\n } else if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n focusMenuItem(menuRef, event.key === \"Home\" ? 0 : -1);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n returnFocus(triggerRef, triggerRing);\n requestOpen(false);\n } else if (event.key === \"Tab\") {\n requestOpen(false);\n }\n };\n\n const context: DropdownContextValue = {\n disabled: () => Boolean(props.disabled),\n menuId,\n open: isOpen,\n registerTrigger: (element) => {\n triggerRef = element;\n },\n toggle: () => requestOpen(!isOpen()),\n triggerKeyDown: (event) => {\n if (![\"Enter\", \" \", \"ArrowDown\", \"ArrowUp\"].includes(event.key)) return;\n event.preventDefault();\n event.stopPropagation();\n if (isOpen()) {\n focusMenuItem(menuRef, event.key === \"ArrowUp\" ? -1 : 0);\n return;\n }\n keyFocus = event.key === \"ArrowUp\" ? \"last\" : \"first\";\n requestOpen(true, keyFocus);\n keyFocus = false;\n },\n };\n\n createEffect(() => {\n const controlled = props.open;\n if (!mounted || controlled === undefined || !menuRef) return;\n if (controlled && !menuRef.matches(\":popover-open\")) open(keyFocus);\n if (!controlled && menuRef.matches(\":popover-open\")) close(false);\n });\n createEffect(() => {\n if (!props.disabled) return;\n sheet?.abort();\n if (mounted) close(false);\n });\n onMount(() => {\n mounted = true;\n if (props.open) open(false);\n onCleanup(detachViewportListeners);\n });\n onCleanup(() => sheet?.abort());\n\n return (\n <DropdownContext.Provider value={context}>\n <span class={`k2b-dropdown ${props.class ?? \"\"}`}>\n {props.children}\n <div\n ref={menuRef}\n id={menuId}\n popover=\"auto\"\n role=\"menu\"\n aria-label={props.label ?? messages().dropdownMenu}\n class={`k2b-dropdown__menu ${props.menuClass ?? \"\"}`}\n style={props.width ? { \"--k2b-dropdown-width\": props.width } : undefined}\n data-width={props.width ? \"fixed\" : undefined}\n data-variant={props.variant ?? \"default\"}\n data-position={position()}\n onKeyDown={handleMenuKeyDown}\n onToggle={(event) => {\n const nextOpen = (event as ToggleEvent).newState === \"open\";\n const wasOpen = (event as ToggleEvent).oldState === \"open\";\n setInternalOpen(nextOpen);\n if (nextOpen) attachViewportListeners();\n else detachViewportListeners();\n if (props.open === undefined || props.open !== nextOpen) props.onOpenChange?.(nextOpen);\n if (wasOpen && !nextOpen) props.onClose?.();\n if (!nextOpen && props.open === true) queueMicrotask(() => props.open === true && open(false));\n }}\n >\n <DropdownItems items={props.items} close={close} />\n </div>\n </span>\n </DropdownContext.Provider>\n );\n}\n\ntype DropdownComponent = ((props: DropdownProps) => JSX.Element) & {\n Root: (props: DropdownProps) => JSX.Element;\n Trigger: (props: DropdownTriggerProps) => JSX.Element;\n Item: (props: DropdownItemProps) => JSX.Element;\n};\n\nexport const Dropdown = DropdownRoot as DropdownComponent;\nDropdown.Root = DropdownRoot;\nDropdown.Trigger = DropdownTrigger;\nDropdown.Item = DropdownItem;\n\nexport default Dropdown;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["actions/Dropdown.tsx"],"sourcesContent":["import {\n createContext,\n createEffect,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n onCleanup,\n onMount,\n Show,\n splitProps,\n useContext,\n} from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\nimport { Tooltip, type TooltipPlacement, useLabelTooltip } from \"../feedback/Tooltip\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { Button, type ButtonProps, type ButtonSize, type ButtonVariant, iconTitle } from \"./Button\";\nimport { focusRowSegment } from \"./menu-rows\";\nimport { openMenuSheet, prefersMenuSheet } from \"./menu-sheet\";\n\n// Resolved outside JSX: a conditional attribute compiles to a lazy memo, which would be created inside the click handler.\nconst selectAction = (item: { action?: () => void }) => item.action;\n\nexport type DropdownPosition = \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\" | \"right-start\";\n\nexport type DropdownActionBase = {\n class?: string;\n disabled?: boolean;\n icon?: string;\n image?: string;\n label: string;\n /**\n * Accessible name when it must say more than the visible label, such as the current value and what the next\n * activation does. It must contain the visible label.\n */\n ariaLabel?: string;\n description?: string;\n /** Quiet trailing information, such as a count. */\n trailing?: JSX.Element;\n variant?: \"danger\";\n};\n\nexport type DropdownAction =\n | (DropdownActionBase & {\n action: () => void;\n /**\n * Set `false` for an action that changes a value in place, such as cycling a setting: the menu stays open and\n * the focus stays on the row. Defaults to `true`.\n */\n closeOnSelect?: boolean;\n /**\n * In a phone sheet, run while the tap still counts as the person's gesture, before the sheet closes, as browsers\n * require for clipboard writes. Other actions run after the sheet has left the history. Such an action must\n * not navigate or open a dialog.\n */\n immediate?: boolean;\n href?: never;\n external?: never;\n })\n | (DropdownActionBase & {\n href: string;\n external?: boolean;\n /** Runs on a plain click instead of following the link; modified clicks, middle-click, and the link's menu keep it. */\n action?: () => void;\n })\n | (DropdownActionBase & {\n disabled: true;\n action?: never;\n href?: never;\n external?: never;\n });\n\n/** Declarative radio or checkbox row for compact action menus. */\nexport type DropdownChoice = DropdownActionBase & {\n action: () => void;\n checked: boolean | (() => boolean);\n choice: \"checkbox\" | \"radio\";\n href?: string;\n closeOnSelect?: boolean;\n color?: string;\n};\n\nexport type DropdownSection = {\n sectionLabel?: string;\n /**\n * `row` sets a few short radio choices, such as a sort direction, side by side as one segmented row. Give it a\n * `sectionLabel`: the label names the choice above the row and for screen readers.\n */\n layout?: \"row\";\n items: readonly (DropdownAction | DropdownChoice)[];\n};\n\nexport type DropdownItem = DropdownAction | DropdownChoice | DropdownSection;\n\nexport type DropdownProps = {\n items: readonly DropdownItem[];\n children: JSX.Element;\n position?: DropdownPosition | (() => DropdownPosition);\n /** Larger menu rows and typography for touch. Defaults to `default`. */\n variant?: \"default\" | \"touch\";\n /**\n * Exact menu width as a CSS length. Without it the menu sizes to its longest\n * entry: at least `12rem` (`18rem` for touch), at most the viewport width\n * less `1rem` per side, where longer entries wrap.\n */\n width?: string;\n class?: string;\n menuClass?: string;\n onClose?: () => void;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n disabled?: boolean;\n label?: string;\n align?: \"start\" | \"end\";\n /**\n * `sheet` opens the same items as a bottom sheet on phones (below 48rem) instead of a menu beside the trigger.\n * Defaults to `menu`. A controlled menu (`open`) always stays a menu.\n */\n phone?: \"menu\" | \"sheet\";\n};\n\nexport type DropdownTriggerProps = Omit<\n ButtonProps,\n \"aria-controls\" | \"aria-expanded\" | \"aria-haspopup\" | \"children\" | \"disabled\" | \"onClick\" | \"onKeyDown\"\n> & {\n children: JSX.Element;\n /** Use `plain` when a specialized component class owns the complete visual treatment. */\n appearance?: \"button\" | \"plain\";\n disabled?: boolean;\n iconOnly?: boolean;\n label?: string;\n size?: ButtonSize;\n tooltip?: JSX.Element | false;\n tooltipDelay?: number;\n tooltipPlacement?: TooltipPlacement;\n variant?: ButtonVariant;\n};\n\nexport type DropdownItemProps = {\n children: JSX.Element;\n closeOnSelect?: boolean;\n ariaLabel?: string;\n icon?: string;\n image?: string;\n description?: string;\n /** Quiet trailing information, such as a count. */\n trailing?: JSX.Element;\n disabled?: boolean;\n danger?: boolean;\n variant?: \"danger\";\n href?: string;\n external?: boolean;\n /** Runs when the item is chosen. With `href`, a plain click runs it instead of following the link. */\n onSelect?: () => void;\n class?: string;\n};\n\ntype MenuContextValue = {\n close: (restoreFocus?: boolean) => void;\n};\n\ntype DropdownContextValue = {\n disabled: () => boolean;\n menuId: string;\n open: () => boolean;\n registerTrigger: (element: HTMLButtonElement) => void;\n toggle: () => void;\n triggerKeyDown: JSX.EventHandlerUnion<HTMLButtonElement, KeyboardEvent>;\n};\n\nconst MenuContext = createContext<MenuContextValue>();\nconst DropdownContext = createContext<DropdownContextValue>();\n\nconst actionableItems = (menu: HTMLElement | undefined): HTMLElement[] =>\n menu\n ? Array.from(\n menu.querySelectorAll<HTMLElement>(\n [\n \"[role='menuitem']:not([aria-disabled='true'])\",\n \"[role='menuitemcheckbox']:not([aria-disabled='true'])\",\n \"[role='menuitemradio']:not([aria-disabled='true'])\",\n ].join(\", \"),\n ),\n )\n : [];\n\nconst focusMenuItem = (menu: HTMLElement | undefined, index: number): void => {\n const items = actionableItems(menu);\n if (items.length === 0) return;\n items[(index + items.length) % items.length]?.focus();\n};\n\nexport const dropdownPosition = (\n trigger: DOMRect,\n menu: Pick<DOMRect, \"width\" | \"height\">,\n position: DropdownPosition,\n viewport: { width: number; height: number },\n gap = 4,\n): { left: number; top: number } => {\n let left = trigger.left;\n let top = trigger.bottom + gap;\n\n if (position === \"bottom-left\" || position === \"top-left\") left = trigger.right - menu.width;\n if (position === \"top-right\" || position === \"top-left\") top = trigger.top - menu.height - gap;\n if (position === \"right-start\") {\n left = trigger.right + gap;\n top = trigger.top;\n }\n\n return {\n left: Math.max(8, Math.min(left, viewport.width - menu.width - 8)),\n top: Math.max(8, Math.min(top, viewport.height - menu.height - 8)),\n };\n};\n\nconst itemContent = (props: {\n description?: string;\n icon?: string;\n image?: string;\n trailing?: JSX.Element;\n children: JSX.Element;\n}): JSX.Element => (\n <>\n <Show when={props.image} fallback={<Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}>\n {(image) => <img class=\"k2b-dropdown__image\" src={image()} alt=\"\" />}\n </Show>\n <span class=\"k2b-dropdown__copy\">\n <span>{props.children}</span>\n <Show when={props.description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n {props.trailing}\n </>\n);\n\nexport function DropdownItem(props: DropdownItemProps): JSX.Element {\n const menu = useContext(MenuContext);\n const danger = () => props.danger || props.variant === \"danger\";\n const content = itemContent(props);\n\n return (\n <Show\n when={!props.disabled ? props.href : undefined}\n fallback={\n <button\n type=\"button\"\n role=\"menuitem\"\n aria-label={props.ariaLabel}\n tabIndex={-1}\n class={`k2b-dropdown__item ${props.class ?? \"\"}`}\n data-danger={danger() ? \"true\" : undefined}\n disabled={props.disabled}\n aria-disabled={props.disabled ? \"true\" : undefined}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n if (props.closeOnSelect !== false) menu?.close();\n props.onSelect?.();\n }}\n >\n {content}\n </button>\n }\n >\n {(href) => (\n <a\n href={href()}\n target={props.external ? \"_blank\" : undefined}\n rel={props.external ? \"noopener noreferrer\" : undefined}\n role=\"menuitem\"\n aria-label={props.ariaLabel}\n tabIndex={-1}\n class={`k2b-dropdown__item ${props.class ?? \"\"}`}\n data-danger={danger() ? \"true\" : undefined}\n onClick={(event) => {\n // With `onSelect`, a plain click runs it in place of the link; a modified click keeps its browser meaning.\n if (props.onSelect && !(event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)) {\n event.preventDefault();\n menu?.close();\n props.onSelect();\n return;\n }\n menu?.close(false);\n }}\n >\n {content}\n </a>\n )}\n </Show>\n );\n}\n\nfunction DropdownChoiceItem(props: DropdownChoice): JSX.Element {\n const menu = useContext(MenuContext);\n const checked = () => (typeof props.checked === \"function\" ? props.checked() : props.checked);\n let element: HTMLElement | undefined;\n return (\n <Dynamic\n ref={(node: HTMLAnchorElement | HTMLButtonElement) => {\n element = node;\n }}\n component={!props.disabled && props.href ? \"a\" : \"button\"}\n href={!props.disabled ? props.href : undefined}\n type={!props.disabled && props.href ? undefined : \"button\"}\n role={props.choice === \"checkbox\" ? \"menuitemcheckbox\" : \"menuitemradio\"}\n aria-label={props.ariaLabel}\n aria-checked={checked()}\n aria-disabled={props.disabled ? \"true\" : undefined}\n tabIndex={-1}\n class={`k2b-dropdown__item ${props.class ?? \"\"}`}\n data-selected={checked() ? \"true\" : undefined}\n disabled={props.disabled}\n onClick={(event: MouseEvent) => {\n if (props.href && (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)) {\n menu?.close(false);\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n if (props.closeOnSelect !== false) menu?.close();\n props.action();\n }}\n onKeyDown={(event: KeyboardEvent) => {\n // A link answers only Enter; as a menu choice it also answers Space, like the button form.\n if (event.key !== \" \" || props.disabled || !props.href) return;\n event.preventDefault();\n element?.click();\n }}\n >\n <Show when={props.choice === \"checkbox\"}>\n <span class=\"k2b-dropdown__checkbox\" aria-hidden=\"true\">\n <Show when={checked()}>\n <i class=\"ti ti-check\" />\n </Show>\n </span>\n </Show>\n <Show when={props.image} fallback={<Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}>\n {(image) => <img class=\"k2b-dropdown__image\" src={image()} alt=\"\" />}\n </Show>\n <Show when={props.color}>\n {(color) => <span class=\"k2b-dropdown__color\" style={{ \"--k2b-dropdown-color\": color() }} aria-hidden=\"true\" />}\n </Show>\n <span class=\"k2b-dropdown__copy\">\n <span>{props.label}</span>\n <Show when={props.description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n {props.trailing}\n {/* Always present for radios, so selecting the widest entry cannot widen a content-sized menu. */}\n <Show when={props.choice === \"radio\"}>\n <i class=\"ti ti-check k2b-dropdown__check\" data-hidden={checked() ? undefined : \"true\"} aria-hidden=\"true\" />\n </Show>\n </Dynamic>\n );\n}\n\nexport function DropdownItems(props: { items: readonly DropdownItem[]; close: (restoreFocus?: boolean) => void }): JSX.Element {\n const messages = useUiMessages();\n const renderItem = (item: DropdownAction | DropdownChoice): JSX.Element =>\n \"choice\" in item ? (\n <DropdownChoiceItem {...item} />\n ) : (\n <DropdownItem\n ariaLabel={item.ariaLabel}\n closeOnSelect={\"closeOnSelect\" in item ? item.closeOnSelect : undefined}\n icon={item.icon}\n image={item.image}\n description={item.description}\n trailing={item.trailing}\n variant={item.variant}\n disabled={item.disabled}\n class={item.class}\n href={\"href\" in item ? item.href : undefined}\n external={\"external\" in item ? item.external : undefined}\n onSelect={selectAction(item)}\n >\n {item.label}\n </DropdownItem>\n );\n\n return (\n <MenuContext.Provider value={{ close: props.close }}>\n <For each={props.items}>\n {(item, index) => (\n <Show when={\"items\" in item} fallback={renderItem(item as DropdownAction | DropdownChoice)}>\n <div\n class=\"k2b-dropdown__section\"\n data-divided={index() > 0 ? \"true\" : undefined}\n role=\"group\"\n // A row of choices is no set of actions: without a label it stays unnamed rather than misnamed.\n aria-label={\n (item as DropdownSection).sectionLabel ?? ((item as DropdownSection).layout === \"row\" ? undefined : messages().actions)\n }\n >\n <Show when={(item as DropdownSection).sectionLabel}>{(label) => <div class=\"k2b-dropdown__label\">{label()}</div>}</Show>\n <Show\n when={(item as DropdownSection).layout === \"row\"}\n fallback={<For each={(item as DropdownSection).items}>{renderItem}</For>}\n >\n <div class=\"k2b-dropdown__row\">\n <For each={(item as DropdownSection).items}>{renderItem}</For>\n </div>\n </Show>\n </div>\n </Show>\n )}\n </For>\n </MenuContext.Provider>\n );\n}\n\nfunction DropdownTrigger(props: DropdownTriggerProps): JSX.Element {\n const context = useContext(DropdownContext);\n if (!context) throw new Error(\"Dropdown.Trigger must be used inside Dropdown.Root\");\n const [local, rest] = splitProps(props, [\n \"appearance\",\n \"children\",\n \"class\",\n \"disabled\",\n \"iconOnly\",\n \"label\",\n \"ref\",\n \"size\",\n \"tabIndex\",\n \"title\",\n \"tooltip\",\n \"tooltipDelay\",\n \"tooltipPlacement\",\n \"type\",\n \"variant\",\n ]);\n let target: HTMLButtonElement | undefined;\n const disabled = () => Boolean(context.disabled() || local.disabled);\n // An icon-only trigger shows its label as a hint, like IconButton.\n const tooltip = useLabelTooltip(\n () => local.tooltip,\n () => (local.iconOnly ? (local.title ?? local.label) : undefined),\n );\n const register = (element: HTMLButtonElement) => {\n target = element;\n context.registerTrigger(element);\n if (typeof local.ref === \"function\") local.ref(element);\n };\n const click: JSX.EventHandlerUnion<HTMLButtonElement, MouseEvent> = (event) => {\n event.stopPropagation();\n context.toggle();\n };\n\n if (local.appearance !== \"plain\") {\n return (\n <Button\n {...rest}\n ref={register}\n aria-controls={context.menuId}\n aria-expanded={context.open()}\n aria-haspopup=\"menu\"\n aria-label={local.label}\n disabled={disabled()}\n tabIndex={disabled() ? -1 : local.tabIndex}\n onClick={click}\n onKeyDown={context.triggerKeyDown}\n type={local.type ?? \"button\"}\n class={`${local.iconOnly ? \"k2b-icon-button\" : \"\"} k2b-dropdown__trigger ${local.class ?? \"\"}`}\n size={local.size}\n variant={local.variant ?? (local.iconOnly ? \"ghost\" : undefined)}\n title={iconTitle(local.title, tooltip())}\n tooltip={tooltip()}\n tooltipDelay={local.tooltipDelay}\n tooltipPlacement={local.tooltipPlacement}\n >\n {local.children}\n </Button>\n );\n }\n\n return (\n <>\n <button\n {...rest}\n ref={register}\n aria-controls={context.menuId}\n aria-expanded={context.open()}\n aria-haspopup=\"menu\"\n aria-label={local.label}\n disabled={disabled()}\n tabIndex={disabled() ? -1 : local.tabIndex}\n onClick={click}\n onKeyDown={context.triggerKeyDown}\n type={local.type ?? \"button\"}\n class={`k2b-dropdown__trigger ${local.class ?? \"\"}`}\n title={iconTitle(local.title, tooltip())}\n >\n {local.children}\n </button>\n <Show when={tooltip() !== false && tooltip() !== undefined}>\n <Tooltip\n content={tooltip() as JSX.Element}\n target={() => target}\n delay={local.tooltipDelay}\n disabled={disabled()}\n placement={local.tooltipPlacement}\n />\n </Show>\n </>\n );\n}\n\n/** Accessible top-layer menu with explicit trigger ownership. */\nfunction DropdownRoot(props: DropdownProps): JSX.Element {\n const messages = useUiMessages();\n const locale = useLocale();\n /** The open phone sheet's cancel switch: it closes when the menu goes or is disabled, as the popover does. */\n let sheet: AbortController | undefined;\n const id = createUniqueId().replace(/[^a-zA-Z0-9_-]/g, \"-\");\n const menuId = `k2b-dropdown-${id}`;\n const [internalOpen, setInternalOpen] = createSignal(false);\n let triggerRef: HTMLButtonElement | undefined;\n let menuRef: HTMLDivElement | undefined;\n let triggerRing = true;\n let mounted = false;\n /** Where a key on the trigger asked the focus to go; a controlled menu opens later, in its owner's update. */\n let keyFocus: \"first\" | \"last\" | false = false;\n let viewportListenersAttached = false;\n let resizeObserver: ResizeObserver | undefined;\n\n const isOpen = () => props.open ?? internalOpen();\n const position = (): DropdownPosition =>\n typeof props.position === \"function\" ? props.position() : (props.position ?? (props.align === \"end\" ? \"bottom-left\" : \"bottom-right\"));\n\n const place = () => {\n if (!triggerRef || !menuRef) return;\n const rect = dropdownPosition(triggerRef.getBoundingClientRect(), menuRef.getBoundingClientRect(), position(), {\n width: window.innerWidth,\n height: window.innerHeight,\n });\n menuRef.style.left = `${rect.left}px`;\n menuRef.style.top = `${rect.top}px`;\n };\n const reposition = () => {\n if (isOpen()) place();\n };\n const attachViewportListeners = () => {\n if (viewportListenersAttached) return;\n viewportListenersAttached = true;\n window.addEventListener(\"resize\", reposition);\n window.addEventListener(\"scroll\", reposition, true);\n // A content-sized menu changes size when its items change while it is open.\n if (menuRef && typeof ResizeObserver !== \"undefined\") {\n resizeObserver ??= new ResizeObserver(reposition);\n resizeObserver.observe(menuRef);\n }\n };\n const detachViewportListeners = () => {\n if (!viewportListenersAttached) return;\n viewportListenersAttached = false;\n window.removeEventListener(\"resize\", reposition);\n window.removeEventListener(\"scroll\", reposition, true);\n resizeObserver?.disconnect();\n };\n const close = (restoreFocus = true) => {\n // Before hiding, so the popover does not return focus on its own.\n if (restoreFocus) returnFocus(triggerRef, triggerRing);\n if (menuRef?.matches(\":popover-open\")) menuRef.hidePopover();\n // Like `open`, expose the closed state now: the toggle event can arrive after the next key press, and a trigger\n // that still reads as open would ignore Enter (Escape, then Enter at once, must reopen).\n setInternalOpen(false);\n detachViewportListeners();\n };\n const open = (focus: \"first\" | \"last\" | false = \"first\") => {\n if (props.disabled || !menuRef || menuRef.matches(\":popover-open\")) return;\n triggerRing = ringOnReturn(triggerRef);\n menuRef.showPopover();\n // The toggle event arrives a task later; expose the open state before focus moves into the menu.\n setInternalOpen(true);\n attachViewportListeners();\n place();\n queueMicrotask(() => {\n if (focus) focusMenuItem(menuRef, focus === \"first\" ? 0 : -1);\n });\n };\n const requestOpen = (next: boolean, focus: \"first\" | \"last\" | false = \"first\") => {\n if (props.disabled && next) return;\n if (props.open !== undefined) {\n props.onOpenChange?.(next);\n return;\n }\n if (next && props.phone === \"sheet\" && prefersMenuSheet()) {\n if (sheet) return;\n const current = new AbortController();\n sheet = current;\n // The sheet is this menu's open state: the trigger reports it and the owner hears both ends.\n setInternalOpen(true);\n props.onOpenChange?.(true);\n void openMenuSheet({\n Items: DropdownItems,\n items: props.items,\n label: props.label ?? messages().dropdownMenu,\n locale: locale(),\n signal: current.signal,\n }).finally(() => {\n sheet = undefined;\n setInternalOpen(false);\n props.onOpenChange?.(false);\n props.onClose?.();\n });\n return;\n }\n if (next) open(focus);\n else close(false);\n };\n const handleMenuKeyDown = (event: KeyboardEvent) => {\n const items = actionableItems(menuRef);\n const current = items.indexOf(document.activeElement as HTMLElement);\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n focusMenuItem(menuRef, current + (event.key === \"ArrowDown\" ? 1 : -1));\n } else if (focusRowSegment(items, event.key)) {\n event.preventDefault();\n } else if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n focusMenuItem(menuRef, event.key === \"Home\" ? 0 : -1);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n returnFocus(triggerRef, triggerRing);\n requestOpen(false);\n } else if (event.key === \"Tab\") {\n requestOpen(false);\n }\n };\n\n const context: DropdownContextValue = {\n disabled: () => Boolean(props.disabled),\n menuId,\n open: isOpen,\n registerTrigger: (element) => {\n triggerRef = element;\n },\n toggle: () => requestOpen(!isOpen()),\n triggerKeyDown: (event) => {\n if (![\"Enter\", \" \", \"ArrowDown\", \"ArrowUp\"].includes(event.key)) return;\n event.preventDefault();\n event.stopPropagation();\n if (isOpen()) {\n focusMenuItem(menuRef, event.key === \"ArrowUp\" ? -1 : 0);\n return;\n }\n keyFocus = event.key === \"ArrowUp\" ? \"last\" : \"first\";\n requestOpen(true, keyFocus);\n keyFocus = false;\n },\n };\n\n createEffect(() => {\n const controlled = props.open;\n if (!mounted || controlled === undefined || !menuRef) return;\n if (controlled && !menuRef.matches(\":popover-open\")) open(keyFocus);\n if (!controlled && menuRef.matches(\":popover-open\")) close(false);\n });\n createEffect(() => {\n if (!props.disabled) return;\n sheet?.abort();\n if (mounted) close(false);\n });\n onMount(() => {\n mounted = true;\n if (props.open) open(false);\n onCleanup(detachViewportListeners);\n });\n onCleanup(() => sheet?.abort());\n\n return (\n <DropdownContext.Provider value={context}>\n <span class={`k2b-dropdown ${props.class ?? \"\"}`}>\n {props.children}\n <div\n ref={menuRef}\n id={menuId}\n popover=\"auto\"\n role=\"menu\"\n aria-label={props.label ?? messages().dropdownMenu}\n class={`k2b-dropdown__menu ${props.menuClass ?? \"\"}`}\n style={props.width ? { \"--k2b-dropdown-width\": props.width } : undefined}\n data-width={props.width ? \"fixed\" : undefined}\n data-variant={props.variant ?? \"default\"}\n data-position={position()}\n onKeyDown={handleMenuKeyDown}\n onToggle={(event) => {\n const nextOpen = (event as ToggleEvent).newState === \"open\";\n const wasOpen = (event as ToggleEvent).oldState === \"open\";\n setInternalOpen(nextOpen);\n if (nextOpen) attachViewportListeners();\n else detachViewportListeners();\n if (props.open === undefined || props.open !== nextOpen) props.onOpenChange?.(nextOpen);\n if (wasOpen && !nextOpen) props.onClose?.();\n if (!nextOpen && props.open === true) queueMicrotask(() => props.open === true && open(false));\n }}\n >\n <DropdownItems items={props.items} close={close} />\n </div>\n </span>\n </DropdownContext.Provider>\n );\n}\n\ntype DropdownComponent = ((props: DropdownProps) => JSX.Element) & {\n Root: (props: DropdownProps) => JSX.Element;\n Trigger: (props: DropdownTriggerProps) => JSX.Element;\n Item: (props: DropdownItemProps) => JSX.Element;\n};\n\nexport const Dropdown = DropdownRoot as DropdownComponent;\nDropdown.Root = DropdownRoot;\nDropdown.Trigger = DropdownTrigger;\nDropdown.Item = DropdownItem;\n\nexport default Dropdown;\n"],"mappings":"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","ignoreList":[]}
|