@salt-ds/lab 1.0.0-alpha.94 → 1.0.0-alpha.95
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/CHANGELOG.md +110 -0
- package/css/salt-lab.css +28 -22
- package/dist-cjs/index.js +6 -50
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/mega-menu/MegaMenuGroup.js +2 -5
- package/dist-cjs/mega-menu/MegaMenuGroup.js.map +1 -1
- package/dist-cjs/mega-menu/MegaMenuGroups.css.js +6 -0
- package/dist-cjs/mega-menu/MegaMenuGroups.css.js.map +1 -0
- package/dist-cjs/mega-menu/{MegaMenuSection.js → MegaMenuGroups.js} +8 -8
- package/dist-cjs/mega-menu/MegaMenuGroups.js.map +1 -0
- package/dist-cjs/mega-menu/MegaMenuHeader.js +0 -1
- package/dist-cjs/mega-menu/MegaMenuHeader.js.map +1 -1
- package/dist-cjs/mega-menu/MegaMenuItem.css.js +1 -1
- package/dist-cjs/mega-menu/MegaMenuItem.js +6 -5
- package/dist-cjs/mega-menu/MegaMenuItem.js.map +1 -1
- package/dist-cjs/mega-menu/MegaMenuSupportingActions.css.js +6 -0
- package/dist-cjs/mega-menu/MegaMenuSupportingActions.css.js.map +1 -0
- package/dist-cjs/mega-menu/MegaMenuSupportingActions.js +31 -0
- package/dist-cjs/mega-menu/MegaMenuSupportingActions.js.map +1 -0
- package/dist-cjs/mega-menu/MegaMenuSupportingContent.css.js +6 -0
- package/dist-cjs/mega-menu/MegaMenuSupportingContent.css.js.map +1 -0
- package/dist-cjs/mega-menu/MegaMenuSupportingContent.js +31 -0
- package/dist-cjs/mega-menu/MegaMenuSupportingContent.js.map +1 -0
- package/dist-cjs/mega-menu/useMegaMenuKeyboard.js +2 -2
- package/dist-cjs/mega-menu/useMegaMenuKeyboard.js.map +1 -1
- package/dist-cjs/toolbar-next/ToolbarNextOverflow.js +2 -1
- package/dist-cjs/toolbar-next/ToolbarNextOverflow.js.map +1 -1
- package/dist-cjs/toolbar-next/toolbarNextKeyboardUtils.js +21 -3
- package/dist-cjs/toolbar-next/toolbarNextKeyboardUtils.js.map +1 -1
- package/dist-cjs/toolbar-next/useToolbarNextKeyboardNavigation.js +3 -25
- package/dist-cjs/toolbar-next/useToolbarNextKeyboardNavigation.js.map +1 -1
- package/dist-es/index.js +3 -8
- package/dist-es/index.js.map +1 -1
- package/dist-es/mega-menu/MegaMenuGroup.js +2 -5
- package/dist-es/mega-menu/MegaMenuGroup.js.map +1 -1
- package/dist-es/mega-menu/MegaMenuGroups.css.js +4 -0
- package/dist-es/mega-menu/MegaMenuGroups.css.js.map +1 -0
- package/dist-es/mega-menu/{MegaMenuSection.js → MegaMenuGroups.js} +7 -7
- package/dist-es/mega-menu/MegaMenuGroups.js.map +1 -0
- package/dist-es/mega-menu/MegaMenuHeader.js +0 -1
- package/dist-es/mega-menu/MegaMenuHeader.js.map +1 -1
- package/dist-es/mega-menu/MegaMenuItem.css.js +1 -1
- package/dist-es/mega-menu/MegaMenuItem.js +7 -6
- package/dist-es/mega-menu/MegaMenuItem.js.map +1 -1
- package/dist-es/mega-menu/MegaMenuSupportingActions.css.js +4 -0
- package/dist-es/mega-menu/MegaMenuSupportingActions.css.js.map +1 -0
- package/dist-es/mega-menu/MegaMenuSupportingActions.js +29 -0
- package/dist-es/mega-menu/MegaMenuSupportingActions.js.map +1 -0
- package/dist-es/mega-menu/MegaMenuSupportingContent.css.js +4 -0
- package/dist-es/mega-menu/MegaMenuSupportingContent.css.js.map +1 -0
- package/dist-es/mega-menu/MegaMenuSupportingContent.js +29 -0
- package/dist-es/mega-menu/MegaMenuSupportingContent.js.map +1 -0
- package/dist-es/mega-menu/useMegaMenuKeyboard.js +2 -2
- package/dist-es/mega-menu/useMegaMenuKeyboard.js.map +1 -1
- package/dist-es/toolbar-next/ToolbarNextOverflow.js +2 -1
- package/dist-es/toolbar-next/ToolbarNextOverflow.js.map +1 -1
- package/dist-es/toolbar-next/toolbarNextKeyboardUtils.js +21 -3
- package/dist-es/toolbar-next/toolbarNextKeyboardUtils.js.map +1 -1
- package/dist-es/toolbar-next/useToolbarNextKeyboardNavigation.js +4 -26
- package/dist-es/toolbar-next/useToolbarNextKeyboardNavigation.js.map +1 -1
- package/dist-types/index.d.ts +0 -4
- package/dist-types/mega-menu/MegaMenuGroups.d.ts +8 -0
- package/dist-types/mega-menu/MegaMenuItem.d.ts +3 -2
- package/dist-types/mega-menu/MegaMenuSupportingActions.d.ts +8 -0
- package/dist-types/mega-menu/MegaMenuSupportingContent.d.ts +8 -0
- package/dist-types/mega-menu/index.d.ts +3 -3
- package/dist-types/toolbar-next/useToolbarNextKeyboardNavigation.d.ts +1 -0
- package/package.json +2 -4
- package/dist-cjs/calendar/index.js +0 -61
- package/dist-cjs/calendar/index.js.map +0 -1
- package/dist-cjs/date-input/index.js +0 -23
- package/dist-cjs/date-input/index.js.map +0 -1
- package/dist-cjs/date-picker/index.js +0 -106
- package/dist-cjs/date-picker/index.js.map +0 -1
- package/dist-cjs/localization-provider/index.js +0 -26
- package/dist-cjs/localization-provider/index.js.map +0 -1
- package/dist-cjs/mega-menu/MegaMenuContent.css.js +0 -6
- package/dist-cjs/mega-menu/MegaMenuContent.css.js.map +0 -1
- package/dist-cjs/mega-menu/MegaMenuContent.js +0 -33
- package/dist-cjs/mega-menu/MegaMenuContent.js.map +0 -1
- package/dist-cjs/mega-menu/MegaMenuItemContent.css.js +0 -6
- package/dist-cjs/mega-menu/MegaMenuItemContent.css.js.map +0 -1
- package/dist-cjs/mega-menu/MegaMenuItemContent.js +0 -23
- package/dist-cjs/mega-menu/MegaMenuItemContent.js.map +0 -1
- package/dist-cjs/mega-menu/MegaMenuSection.css.js +0 -6
- package/dist-cjs/mega-menu/MegaMenuSection.css.js.map +0 -1
- package/dist-cjs/mega-menu/MegaMenuSection.js.map +0 -1
- package/dist-cjs/utils/deprecatedExport.js +0 -30
- package/dist-cjs/utils/deprecatedExport.js.map +0 -1
- package/dist-es/calendar/index.js +0 -50
- package/dist-es/calendar/index.js.map +0 -1
- package/dist-es/date-input/index.js +0 -20
- package/dist-es/date-input/index.js.map +0 -1
- package/dist-es/date-picker/index.js +0 -85
- package/dist-es/date-picker/index.js.map +0 -1
- package/dist-es/localization-provider/index.js +0 -20
- package/dist-es/localization-provider/index.js.map +0 -1
- package/dist-es/mega-menu/MegaMenuContent.css.js +0 -4
- package/dist-es/mega-menu/MegaMenuContent.css.js.map +0 -1
- package/dist-es/mega-menu/MegaMenuContent.js +0 -31
- package/dist-es/mega-menu/MegaMenuContent.js.map +0 -1
- package/dist-es/mega-menu/MegaMenuItemContent.css.js +0 -4
- package/dist-es/mega-menu/MegaMenuItemContent.css.js.map +0 -1
- package/dist-es/mega-menu/MegaMenuItemContent.js +0 -21
- package/dist-es/mega-menu/MegaMenuItemContent.js.map +0 -1
- package/dist-es/mega-menu/MegaMenuSection.css.js +0 -4
- package/dist-es/mega-menu/MegaMenuSection.css.js.map +0 -1
- package/dist-es/mega-menu/MegaMenuSection.js.map +0 -1
- package/dist-es/utils/deprecatedExport.js +0 -27
- package/dist-es/utils/deprecatedExport.js.map +0 -1
- package/dist-types/calendar/index.d.ts +0 -13
- package/dist-types/date-input/index.d.ts +0 -3
- package/dist-types/localization-provider/index.d.ts +0 -9
- package/dist-types/mega-menu/MegaMenuContent.d.ts +0 -8
- package/dist-types/mega-menu/MegaMenuItemContent.d.ts +0 -8
- package/dist-types/mega-menu/MegaMenuSection.d.ts +0 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMegaMenuKeyboard.js","sources":["../src/mega-menu/useMegaMenuKeyboard.ts"],"sourcesContent":["import type { ElementProps, FloatingRootContext } from \"@floating-ui/react\";\nimport { useMemo } from \"react\";\n\nconst COLUMN_SELECTOR = \"[data-mega-menu-column]\";\nconst ITEM_SELECTOR = \"[data-mega-menu-item]\";\nexport const FOCUSABLE_SELECTOR =\n 'a[href], button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Get navigable items within a column.\n * Prefers explicitly marked items (`data-mega-menu-item`), falling back\n * to all focusable elements when no marked items are found.\n */\nfunction getColumnItems(column: HTMLElement): HTMLElement[] {\n const marked = Array.from(\n column.querySelectorAll<HTMLElement>(ITEM_SELECTOR),\n );\n if (marked.length > 0) return marked;\n return Array.from(column.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR));\n}\n\n/**\n * Build a 2D grid of navigable items from the panel DOM.\n * Each column is a `[data-mega-menu-column]` wrapper; items within each\n * column are discovered via `getColumnItems`.\n * Items not inside any column (orphans) are inserted at their DOM position\n * as single-item columns so keyboard navigation follows visual order.\n */\nfunction buildGrid(panel: HTMLElement): HTMLElement[][] {\n const columns = new Set(panel.querySelectorAll<HTMLElement>(COLUMN_SELECTOR));\n const grid: HTMLElement[][] = [];\n const processedColumns = new Set<HTMLElement>();\n\n // Walk columns and items in DOM order so orphans are interleaved correctly.\n const all = panel.querySelectorAll<HTMLElement>(\n `${COLUMN_SELECTOR}, ${ITEM_SELECTOR}`,\n );\n\n for (const el of all) {\n if (columns.has(el) && !processedColumns.has(el)) {\n processedColumns.add(el);\n const items = getColumnItems(el);\n if (items.length > 0) grid.push(items);\n } else if (el.matches(ITEM_SELECTOR)) {\n const parentCol = el.closest(COLUMN_SELECTOR);\n if (!parentCol || !columns.has(parentCol as HTMLElement)) {\n grid.push([el]);\n }\n }\n }\n\n return grid;\n}\n\nfunction findPosition(\n grid: HTMLElement[][],\n el: HTMLElement,\n): { col: number; row: number } | null {\n for (let col = 0; col < grid.length; col++) {\n const row = grid[col].indexOf(el);\n if (row !== -1) return { col, row };\n }\n return null;\n}\n\nfunction focusTrigger(context: FloatingRootContext) {\n const reference = context.elements.reference as HTMLElement | null;\n const focusable =\n reference?.querySelector<HTMLElement>(FOCUSABLE_SELECTOR) ?? reference;\n focusable?.focus();\n}\n\nfunction focusNextAfterPanel(context: FloatingRootContext, panel: HTMLElement) {\n const reference = context.elements.reference as HTMLElement | null;\n const refFocusable =\n reference?.querySelector<HTMLElement>(FOCUSABLE_SELECTOR) ?? reference;\n\n const nextSibling = refFocusable\n ?.closest(\"li\")\n ?.nextElementSibling?.querySelector<HTMLElement>(FOCUSABLE_SELECTOR);\n\n const nextOutside =\n nextSibling ||\n (() => {\n const allFocusable = Array.from(\n panel.ownerDocument.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n ).filter((el) => !panel.contains(el));\n const idx = refFocusable ? allFocusable.indexOf(refFocusable) : -1;\n return idx >= 0 ? allFocusable[idx + 1] : undefined;\n })();\n\n if (nextOutside) {\n const view = panel.ownerDocument.defaultView;\n view?.requestAnimationFrame(() => {\n view?.requestAnimationFrame(() => {\n nextOutside.focus();\n });\n });\n }\n}\n\nexport interface UseMegaMenuKeyboardProps {\n /**\n * Whether the interaction is enabled.\n * @default true\n */\n enabled?: boolean;\n}\n\n/**\n * Floating-ui custom interaction hook for mega menu grid keyboard navigation.\n *\n * Returns `ElementProps` that get merged via `useInteractions`, handling\n * keyboard events on both the reference (trigger) and floating (panel) elements.\n *\n * - **↑ / ↓** move within the current column.\n * - **← / →** jump to the top of the previous / next column.\n * - **Tab / Shift+Tab** move linearly through every item.\n * - **Home / End** jump to the first / last item in the column.\n * - **↑ from the first item** or **← from the first column** returns\n * focus to the trigger.\n * - **→ from the last column** closes the panel and moves focus to the\n * next sibling trigger.\n */\nexport function useMegaMenuKeyboard(\n context: FloatingRootContext,\n props: UseMegaMenuKeyboardProps = {},\n): ElementProps {\n const { enabled = true } = props;\n const { open, onOpenChange } = context;\n\n return useMemo(() => {\n if (!enabled) {\n return {};\n }\n\n return {\n reference: {\n onKeyDown(event: React.KeyboardEvent) {\n if (event.key === \"ArrowDown\" && open) {\n event.preventDefault();\n const floating = context.elements.floating;\n if (floating instanceof HTMLElement) {\n focusFirstItem(floating);\n }\n }\n },\n },\n floating: {\n onKeyDown(event: React.KeyboardEvent) {\n if (!open) return;\n\n const panel = event.currentTarget as HTMLElement;\n const target = event.target as HTMLElement;\n\n const focusedItem =\n target.closest<HTMLElement>(ITEM_SELECTOR) ??\n target.closest<HTMLElement>(FOCUSABLE_SELECTOR);\n if (!focusedItem) return;\n\n const grid = buildGrid(panel);\n const pos = findPosition(grid, focusedItem);\n if (!pos) return;\n\n const allItems = grid.flat();\n const linearIndex = allItems.indexOf(focusedItem);\n\n switch (event.key) {\n case \"ArrowDown\": {\n event.preventDefault();\n const next = pos.row + 1;\n if (next < grid[pos.col].length) {\n grid[pos.col][next].focus();\n } else {\n const nextCol = pos.col + 1;\n if (nextCol < grid.length) {\n grid[nextCol][0].focus();\n }\n }\n break;\n }\n\n case \"ArrowUp\": {\n event.preventDefault();\n if (pos.row > 0) {\n grid[pos.col][pos.row - 1].focus();\n } else {\n const prevCol = pos.col - 1;\n if (prevCol >= 0) {\n grid[prevCol][grid[prevCol].length - 1].focus();\n } else {\n focusTrigger(context);\n }\n }\n break;\n }\n\n case \"ArrowRight\": {\n event.preventDefault();\n const nextCol = pos.col + 1;\n if (nextCol < grid.length) {\n grid[nextCol][0].focus();\n } else {\n // On the last column — close panel and move to next trigger\n const reference = context.elements\n .reference as HTMLElement | null;\n const trigger =\n reference?.querySelector<HTMLElement>(FOCUSABLE_SELECTOR) ??\n reference;\n const li = trigger?.closest(\"li\");\n const nextSibling =\n li?.nextElementSibling instanceof HTMLElement\n ? li.nextElementSibling.querySelector<HTMLElement>(\n FOCUSABLE_SELECTOR,\n )\n : null;\n if (nextSibling) {\n onOpenChange(false);\n nextSibling.focus();\n }\n }\n break;\n }\n\n case \"ArrowLeft\": {\n event.preventDefault();\n const prevCol = pos.col - 1;\n if (prevCol >= 0) {\n grid[prevCol][0].focus();\n } else {\n focusTrigger(context);\n }\n break;\n }\n\n case \"Tab\": {\n event.preventDefault();\n if (event.shiftKey) {\n if (linearIndex === 0) {\n focusTrigger(context);\n } else {\n allItems[linearIndex - 1]?.focus();\n }\n } else {\n if (linearIndex === allItems.length - 1) {\n onOpenChange(false);\n focusNextAfterPanel(context, panel);\n } else {\n allItems[linearIndex + 1]?.focus();\n }\n }\n break;\n }\n\n case \"Home\": {\n event.preventDefault();\n grid[pos.col][0]?.focus();\n break;\n }\n\n case \"End\": {\n event.preventDefault();\n grid[pos.col][grid[pos.col].length - 1]?.focus();\n break;\n }\n\n default:\n break;\n }\n },\n },\n };\n }, [enabled, open, context, onOpenChange]);\n}\n\n/**\n * Focus the first navigable item inside a mega menu panel.\n * Retries with `requestAnimationFrame` if content has not yet rendered.\n */\nexport function focusFirstItem(panel: HTMLElement, attempt = 0): void {\n const grid = buildGrid(panel);\n const firstItem = grid[0]?.[0];\n\n if (firstItem) {\n firstItem.focus();\n return;\n }\n\n const view = panel.ownerDocument.defaultView;\n if (attempt < 3 && view) {\n view.requestAnimationFrame(() => focusFirstItem(panel, attempt + 1));\n }\n}\n"],"names":["useMemo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useMegaMenuKeyboard.js","sources":["../src/mega-menu/useMegaMenuKeyboard.ts"],"sourcesContent":["import type { ElementProps, FloatingRootContext } from \"@floating-ui/react\";\nimport { useMemo } from \"react\";\n\nconst COLUMN_SELECTOR = \"[data-mega-menu-column]\";\nconst ITEM_SELECTOR = \"[data-mega-menu-item]\";\nexport const FOCUSABLE_SELECTOR =\n 'a[href], button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Get navigable items within a column.\n * Prefers explicitly marked items (`data-mega-menu-item`) that are focusable,\n * falling back to all focusable elements when no usable marked items are found.\n */\nfunction getColumnItems(column: HTMLElement): HTMLElement[] {\n const marked = Array.from(\n column.querySelectorAll<HTMLElement>(ITEM_SELECTOR),\n ).filter((el) => el.matches(FOCUSABLE_SELECTOR));\n if (marked.length > 0) return marked;\n return Array.from(column.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR));\n}\n\n/**\n * Build a 2D grid of navigable items from the panel DOM.\n * Each column is a `[data-mega-menu-column]` wrapper; items within each\n * column are discovered via `getColumnItems`.\n * Items not inside any column (orphans) are inserted at their DOM position\n * as single-item columns so keyboard navigation follows visual order.\n */\nfunction buildGrid(panel: HTMLElement): HTMLElement[][] {\n const columns = new Set(panel.querySelectorAll<HTMLElement>(COLUMN_SELECTOR));\n const grid: HTMLElement[][] = [];\n const processedColumns = new Set<HTMLElement>();\n\n // Walk columns and items in DOM order so orphans are interleaved correctly.\n const all = panel.querySelectorAll<HTMLElement>(\n `${COLUMN_SELECTOR}, ${ITEM_SELECTOR}`,\n );\n\n for (const el of all) {\n if (columns.has(el) && !processedColumns.has(el)) {\n processedColumns.add(el);\n const items = getColumnItems(el);\n if (items.length > 0) grid.push(items);\n } else if (el.matches(ITEM_SELECTOR)) {\n const parentCol = el.closest(COLUMN_SELECTOR);\n if (\n (!parentCol || !columns.has(parentCol as HTMLElement)) &&\n el.matches(FOCUSABLE_SELECTOR)\n ) {\n grid.push([el]);\n }\n }\n }\n\n return grid;\n}\n\nfunction findPosition(\n grid: HTMLElement[][],\n el: HTMLElement,\n): { col: number; row: number } | null {\n for (let col = 0; col < grid.length; col++) {\n const row = grid[col].indexOf(el);\n if (row !== -1) return { col, row };\n }\n return null;\n}\n\nfunction focusTrigger(context: FloatingRootContext) {\n const reference = context.elements.reference as HTMLElement | null;\n const focusable =\n reference?.querySelector<HTMLElement>(FOCUSABLE_SELECTOR) ?? reference;\n focusable?.focus();\n}\n\nfunction focusNextAfterPanel(context: FloatingRootContext, panel: HTMLElement) {\n const reference = context.elements.reference as HTMLElement | null;\n const refFocusable =\n reference?.querySelector<HTMLElement>(FOCUSABLE_SELECTOR) ?? reference;\n\n const nextSibling = refFocusable\n ?.closest(\"li\")\n ?.nextElementSibling?.querySelector<HTMLElement>(FOCUSABLE_SELECTOR);\n\n const nextOutside =\n nextSibling ||\n (() => {\n const allFocusable = Array.from(\n panel.ownerDocument.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n ).filter((el) => !panel.contains(el));\n const idx = refFocusable ? allFocusable.indexOf(refFocusable) : -1;\n return idx >= 0 ? allFocusable[idx + 1] : undefined;\n })();\n\n if (nextOutside) {\n const view = panel.ownerDocument.defaultView;\n view?.requestAnimationFrame(() => {\n view?.requestAnimationFrame(() => {\n nextOutside.focus();\n });\n });\n }\n}\n\nexport interface UseMegaMenuKeyboardProps {\n /**\n * Whether the interaction is enabled.\n * @default true\n */\n enabled?: boolean;\n}\n\n/**\n * Floating-ui custom interaction hook for mega menu grid keyboard navigation.\n *\n * Returns `ElementProps` that get merged via `useInteractions`, handling\n * keyboard events on both the reference (trigger) and floating (panel) elements.\n *\n * - **↑ / ↓** move within the current column.\n * - **← / →** jump to the top of the previous / next column.\n * - **Tab / Shift+Tab** move linearly through every item.\n * - **Home / End** jump to the first / last item in the column.\n * - **↑ from the first item** or **← from the first column** returns\n * focus to the trigger.\n * - **→ from the last column** closes the panel and moves focus to the\n * next sibling trigger.\n */\nexport function useMegaMenuKeyboard(\n context: FloatingRootContext,\n props: UseMegaMenuKeyboardProps = {},\n): ElementProps {\n const { enabled = true } = props;\n const { open, onOpenChange } = context;\n\n return useMemo(() => {\n if (!enabled) {\n return {};\n }\n\n return {\n reference: {\n onKeyDown(event: React.KeyboardEvent) {\n if (event.key === \"ArrowDown\" && open) {\n event.preventDefault();\n const floating = context.elements.floating;\n if (floating instanceof HTMLElement) {\n focusFirstItem(floating);\n }\n }\n },\n },\n floating: {\n onKeyDown(event: React.KeyboardEvent) {\n if (!open) return;\n\n const panel = event.currentTarget as HTMLElement;\n const target = event.target as HTMLElement;\n\n const focusedItem =\n target.closest<HTMLElement>(ITEM_SELECTOR) ??\n target.closest<HTMLElement>(FOCUSABLE_SELECTOR);\n if (!focusedItem) return;\n\n const grid = buildGrid(panel);\n const pos = findPosition(grid, focusedItem);\n if (!pos) return;\n\n const allItems = grid.flat();\n const linearIndex = allItems.indexOf(focusedItem);\n\n switch (event.key) {\n case \"ArrowDown\": {\n event.preventDefault();\n const next = pos.row + 1;\n if (next < grid[pos.col].length) {\n grid[pos.col][next].focus();\n } else {\n const nextCol = pos.col + 1;\n if (nextCol < grid.length) {\n grid[nextCol][0].focus();\n }\n }\n break;\n }\n\n case \"ArrowUp\": {\n event.preventDefault();\n if (pos.row > 0) {\n grid[pos.col][pos.row - 1].focus();\n } else {\n const prevCol = pos.col - 1;\n if (prevCol >= 0) {\n grid[prevCol][grid[prevCol].length - 1].focus();\n } else {\n focusTrigger(context);\n }\n }\n break;\n }\n\n case \"ArrowRight\": {\n event.preventDefault();\n const nextCol = pos.col + 1;\n if (nextCol < grid.length) {\n grid[nextCol][0].focus();\n } else {\n // On the last column — close panel and move to next trigger\n const reference = context.elements\n .reference as HTMLElement | null;\n const trigger =\n reference?.querySelector<HTMLElement>(FOCUSABLE_SELECTOR) ??\n reference;\n const li = trigger?.closest(\"li\");\n const nextSibling =\n li?.nextElementSibling instanceof HTMLElement\n ? li.nextElementSibling.querySelector<HTMLElement>(\n FOCUSABLE_SELECTOR,\n )\n : null;\n if (nextSibling) {\n onOpenChange(false);\n nextSibling.focus();\n }\n }\n break;\n }\n\n case \"ArrowLeft\": {\n event.preventDefault();\n const prevCol = pos.col - 1;\n if (prevCol >= 0) {\n grid[prevCol][0].focus();\n } else {\n focusTrigger(context);\n }\n break;\n }\n\n case \"Tab\": {\n event.preventDefault();\n if (event.shiftKey) {\n if (linearIndex === 0) {\n focusTrigger(context);\n } else {\n allItems[linearIndex - 1]?.focus();\n }\n } else {\n if (linearIndex === allItems.length - 1) {\n onOpenChange(false);\n focusNextAfterPanel(context, panel);\n } else {\n allItems[linearIndex + 1]?.focus();\n }\n }\n break;\n }\n\n case \"Home\": {\n event.preventDefault();\n grid[pos.col][0]?.focus();\n break;\n }\n\n case \"End\": {\n event.preventDefault();\n grid[pos.col][grid[pos.col].length - 1]?.focus();\n break;\n }\n\n default:\n break;\n }\n },\n },\n };\n }, [enabled, open, context, onOpenChange]);\n}\n\n/**\n * Focus the first navigable item inside a mega menu panel.\n * Retries with `requestAnimationFrame` if content has not yet rendered.\n */\nexport function focusFirstItem(panel: HTMLElement, attempt = 0): void {\n const grid = buildGrid(panel);\n const firstItem = grid[0]?.[0];\n\n if (firstItem) {\n firstItem.focus();\n return;\n }\n\n const view = panel.ownerDocument.defaultView;\n if (attempt < 3 && view) {\n view.requestAnimationFrame(() => focusFirstItem(panel, attempt + 1));\n }\n}\n"],"names":["useMemo"],"mappings":"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"}
|
|
@@ -18,6 +18,7 @@ var useToolbarNextKeyboardNavigation = require('./useToolbarNextKeyboardNavigati
|
|
|
18
18
|
|
|
19
19
|
const withBaseName = core.makePrefixer("saltToolbarNextOverflow");
|
|
20
20
|
const toolbarNextStatefulFocusRootSelector = [
|
|
21
|
+
".saltComboBox-focused",
|
|
21
22
|
".saltDateInput-focused",
|
|
22
23
|
".saltInput-focused"
|
|
23
24
|
].join(", ");
|
|
@@ -47,7 +48,7 @@ function notifyToolbarNextReparentedFocusLoss(mountNode) {
|
|
|
47
48
|
toolbarNextStatefulFocusRootSelector
|
|
48
49
|
)
|
|
49
50
|
).map(
|
|
50
|
-
(root) => root.querySelector(toolbarNextKeyboardUtils.toolbarNextFocusableSelector)
|
|
51
|
+
(root) => root.querySelector("input") ?? root.querySelector(toolbarNextKeyboardUtils.toolbarNextFocusableSelector)
|
|
51
52
|
).filter((target) => target != null);
|
|
52
53
|
for (const target of staleFocusTargets) {
|
|
53
54
|
const relatedTarget = activeElement instanceof Element ? activeElement : null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolbarNextOverflow.js","sources":["../src/toolbar-next/ToolbarNextOverflow.tsx"],"sourcesContent":["import {\n flip,\n offset,\n shift,\n size,\n useClick,\n useDismiss,\n useInteractions,\n} from \"@floating-ui/react\";\nimport {\n Button,\n makePrefixer,\n useFloatingComponent,\n useFloatingUI,\n useForkRef,\n useIcon,\n useId,\n useIsomorphicLayoutEffect,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { compute } from \"compute-scroll-into-view\";\nimport {\n Children,\n cloneElement,\n isValidElement,\n type ReactElement,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n type PointerEvent as ReactPointerEvent,\n type RefObject,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ToolbarContentNext } from \"./ToolbarContentNext\";\nimport toolbarNextOverflowCss from \"./ToolbarNextOverflow.css\";\nimport {\n getToolbarNextOverflowBoundaryKey,\n isTargetInsideOverflowBoundary,\n ToolbarNextOverflowFloatingComponentProvider,\n useToolbarNextOverflowFloatingBoundary,\n} from \"./ToolbarNextOverflowFloatingBoundary\";\nimport {\n getDocumentFocusableElements,\n getToolbarNextFocusMemory,\n getToolbarNextScopeFocusableElements,\n getToolbarNextTabMoveTarget,\n scheduleToolbarNextFocus,\n shouldToolbarNextPreserveNativeTab,\n TOOLBAR_NEXT_GROUP_KEY_ATTR,\n TOOLBAR_NEXT_ITEM_ATTR,\n TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR,\n TOOLBAR_NEXT_SCOPE_ROOT_ATTR,\n type ToolbarNextFocusMemory,\n toolbarNextFocusableSelector,\n} from \"./toolbarNextKeyboardUtils\";\nimport type {\n ToolbarNextContentModel,\n ToolbarNextOverflowItem,\n} from \"./toolbarNextUtils\";\nimport { buildContentOverflowRenderSlots } from \"./toolbarNextUtils\";\nimport { useToolbarNextKeyboardNavigation } from \"./useToolbarNextKeyboardNavigation\";\nimport type { ToolbarNextOverflowGroup } from \"./useToolbarNextOverflow\";\n\nconst withBaseName = makePrefixer(\"saltToolbarNextOverflow\");\n\nexport type ToolbarNextItemHostKind = \"main\" | \"measurement\" | \"overflow\";\n\nconst toolbarNextStatefulFocusRootSelector = [\n \".saltDateInput-focused\",\n \".saltInput-focused\",\n].join(\", \");\n\nconst toolbarNextOverflowFocusScrollRootSelector = [\n \".saltComboBox\",\n \".saltDateInput\",\n \".saltDropdown\",\n \".saltInput\",\n \".saltSwitch\",\n].join(\", \");\n\ntype ToolbarNextOverflowOpenModality = \"keyboard\" | \"pointer\" | null;\n\nfunction createToolbarNextFocusEvent(\n eventName: \"blur\" | \"focusout\",\n target: HTMLElement,\n relatedTarget: Element | null,\n) {\n const FocusEventCtor = target.ownerDocument.defaultView?.FocusEvent;\n const eventInit = {\n bubbles: eventName === \"focusout\",\n relatedTarget,\n };\n\n return FocusEventCtor\n ? new FocusEventCtor(eventName, eventInit)\n : new Event(eventName, eventInit);\n}\n\nfunction notifyToolbarNextReparentedFocusLoss(mountNode: HTMLDivElement) {\n const activeElement = mountNode.ownerDocument.activeElement;\n\n if (mountNode.contains(activeElement)) {\n return;\n }\n\n // Browser focus can move to the document when a portaled toolbar item is\n // reparented, without notifying controls that keep their own focused state.\n const staleFocusTargets = Array.from(\n mountNode.querySelectorAll<HTMLElement>(\n toolbarNextStatefulFocusRootSelector,\n ),\n )\n .map((root) =>\n root.querySelector<HTMLElement>(toolbarNextFocusableSelector),\n )\n .filter((target): target is HTMLElement => target != null);\n\n for (const target of staleFocusTargets) {\n const relatedTarget =\n activeElement instanceof Element ? activeElement : null;\n\n target.dispatchEvent(\n createToolbarNextFocusEvent(\"blur\", target, relatedTarget),\n );\n target.dispatchEvent(\n createToolbarNextFocusEvent(\"focusout\", target, relatedTarget),\n );\n }\n}\n\nfunction getToolbarNextOverflowFocusScrollTarget(target: HTMLElement) {\n const itemRoot = target.closest<HTMLElement>(`[${TOOLBAR_NEXT_ITEM_ATTR}]`);\n const controlRoot = target.closest<HTMLElement>(\n toolbarNextOverflowFocusScrollRootSelector,\n );\n\n return controlRoot && itemRoot?.contains(controlRoot) ? controlRoot : target;\n}\n\nfunction getToolbarNextOverflowPanelInlinePadding(target: HTMLElement) {\n const panelContent = target.closest<HTMLElement>(\n `[${TOOLBAR_NEXT_SCOPE_ROOT_ATTR}]`,\n );\n const styles =\n panelContent?.ownerDocument.defaultView?.getComputedStyle(panelContent);\n\n return {\n left: Number.parseFloat(styles?.paddingLeft ?? \"0\") || 0,\n right: Number.parseFloat(styles?.paddingRight ?? \"0\") || 0,\n };\n}\n\nfunction scrollToolbarNextOverflowTargetIntoView(\n panel: HTMLDivElement | null,\n target: HTMLElement,\n) {\n if (!panel || !panel.contains(target)) {\n return;\n }\n\n const scrollTarget = getToolbarNextOverflowFocusScrollTarget(target);\n const actions = compute(scrollTarget, {\n block: \"nearest\",\n boundary: panel,\n inline: \"nearest\",\n scrollMode: \"if-needed\",\n });\n\n for (const { el, left, top } of actions) {\n if (el === panel) {\n const targetRect = scrollTarget.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const viewportLeft = panelRect.left + panel.clientLeft;\n const viewportRight = viewportLeft + panel.clientWidth;\n const padding = getToolbarNextOverflowPanelInlinePadding(scrollTarget);\n const nextLeft =\n targetRect.left < viewportLeft + padding.left\n ? left - padding.left\n : targetRect.right > viewportRight - padding.right\n ? left + padding.right\n : left;\n\n el.scrollLeft = Math.max(0, nextLeft);\n } else {\n el.scrollLeft = left;\n }\n\n el.scrollTop = top;\n }\n}\n\nfunction canSeedOverflowFocusMemory(\n focusMemory: ToolbarNextFocusMemory | null | undefined,\n group: ToolbarNextOverflowGroup,\n): focusMemory is Extract<ToolbarNextFocusMemory, { type: \"item\" }> {\n return (\n focusMemory?.type === \"item\" &&\n group.items.some((item) => item.id === focusMemory.itemId)\n );\n}\n\ninterface ToolbarNextOverflowOwnersProps {\n hostNodes: Record<string, HTMLDivElement | null>;\n items: ToolbarNextOverflowItem[];\n}\n\nfunction ToolbarNextOverflowItemOwner({\n host,\n item,\n}: {\n host: HTMLDivElement | null;\n item: ToolbarNextOverflowItem;\n}) {\n const targetWindow = useWindow();\n const [mountNode, setMountNode] = useState<HTMLDivElement | null>(null);\n const mainToolbarTabIndexMemoryRef = useRef(\n new WeakMap<HTMLElement, string | null>(),\n );\n const lastOverflowBoundaryKeyRef = useRef<string | null>(null);\n const currentOverflowBoundaryKey = getToolbarNextOverflowBoundaryKey(host);\n\n if (host) {\n lastOverflowBoundaryKeyRef.current = currentOverflowBoundaryKey;\n }\n\n const boundaryKey = host\n ? currentOverflowBoundaryKey\n : lastOverflowBoundaryKeyRef.current;\n\n useIsomorphicLayoutEffect(() => {\n const nextMountNode = targetWindow?.document.createElement(\"div\");\n\n if (!nextMountNode) {\n return;\n }\n\n nextMountNode.className = withBaseName(\"contentHost\");\n setMountNode(nextMountNode);\n\n return () => {\n nextMountNode.parentElement?.removeChild(nextMountNode);\n };\n }, [targetWindow]);\n\n useIsomorphicLayoutEffect(() => {\n if (!mountNode) {\n return;\n }\n\n if (host) {\n if (mountNode.parentElement !== host) {\n host.appendChild(mountNode);\n notifyToolbarNextReparentedFocusLoss(mountNode);\n }\n\n const isMainToolbarHost =\n host\n .closest(`[${TOOLBAR_NEXT_SCOPE_ROOT_ATTR}]`)\n ?.getAttribute(TOOLBAR_NEXT_SCOPE_ROOT_ATTR) === \"main\";\n\n if (isMainToolbarHost) {\n const focusableElements = Array.from(\n mountNode.querySelectorAll<HTMLElement>(toolbarNextFocusableSelector),\n );\n\n for (const element of focusableElements) {\n const rememberedTabIndex =\n mainToolbarTabIndexMemoryRef.current.get(element);\n\n if (rememberedTabIndex !== undefined) {\n if (rememberedTabIndex == null) {\n element.removeAttribute(\"tabindex\");\n } else {\n element.setAttribute(\"tabindex\", rememberedTabIndex);\n }\n }\n }\n\n for (const element of focusableElements) {\n mainToolbarTabIndexMemoryRef.current.set(\n element,\n element.getAttribute(\"tabindex\"),\n );\n }\n }\n\n return;\n }\n\n notifyToolbarNextReparentedFocusLoss(mountNode);\n mountNode.parentElement?.removeChild(mountNode);\n }, [host, mountNode]);\n\n if (!mountNode) {\n return null;\n }\n\n const clonedItem = cloneElement(\n item.element as ReactElement<Record<string, ReactNode>>,\n {\n [TOOLBAR_NEXT_GROUP_KEY_ATTR]: item.overflowGroupKey,\n [TOOLBAR_NEXT_ITEM_ATTR]: item.id,\n },\n );\n const itemContent = (\n <ToolbarNextOverflowFloatingComponentProvider boundaryKey={boundaryKey}>\n {clonedItem}\n </ToolbarNextOverflowFloatingComponentProvider>\n );\n\n return createPortal(itemContent, mountNode);\n}\n\nexport function ToolbarNextOverflowOwners({\n hostNodes,\n items,\n}: ToolbarNextOverflowOwnersProps) {\n return (\n <>\n {items.map((item) => (\n <ToolbarNextOverflowItemOwner\n host={hostNodes[item.id] ?? null}\n item={item}\n key={item.id}\n />\n ))}\n </>\n );\n}\n\nfunction cloneDecorations(\n itemId: string,\n decorations: ReactElement[],\n slot: \"leading\" | \"trailing\",\n) {\n return Children.toArray(decorations).flatMap((decoration) => {\n if (!isValidElement(decoration)) {\n return [];\n }\n\n return [\n cloneElement(decoration, {\n key: `${itemId}-${slot}-${String(\n decoration.key ??\n (typeof decoration.type === \"string\"\n ? decoration.type\n : \"decoration\"),\n )}`,\n }),\n ];\n });\n}\n\nexport function ToolbarNextOverflowTriggerContent({\n label,\n named,\n}: {\n label: string;\n named: boolean;\n}) {\n const { OverflowIcon } = useIcon();\n\n if (named) {\n return <>{label}</>;\n }\n\n return <OverflowIcon aria-hidden />;\n}\n\nfunction getOverflowTriggerLabel(group: ToolbarNextOverflowGroup) {\n return group.named\n ? `${group.label} overflow. Hidden controls.`\n : \"Overflow. Hidden controls.\";\n}\n\ninterface ToolbarNextOverflowMenuProps {\n focusMemoryRef?: RefObject<ToolbarNextFocusMemory | null>;\n getItemHostRef: (\n id: string,\n kind: ToolbarNextItemHostKind,\n ) => (node: HTMLDivElement | null) => void;\n group: ToolbarNextOverflowGroup;\n onItemFocus?: (itemId: string, controlIndex: number) => void;\n}\n\nexport function ToolbarNextOverflowMenu({\n focusMemoryRef,\n getItemHostRef,\n group,\n onItemFocus,\n}: ToolbarNextOverflowMenuProps) {\n const panelId = useId();\n const [open, setOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const panelContentRef = useRef<HTMLDivElement>(null);\n const [panelContentNode, setPanelContentNode] =\n useState<HTMLDivElement | null>(null);\n const wasOpenRef = useRef(false);\n const focusedOpenPanelRef = useRef(false);\n const openModalityRef = useRef<ToolbarNextOverflowOpenModality>(null);\n const floatingBoundary = useToolbarNextOverflowFloatingBoundary();\n const {\n focusEntryTarget,\n handleScopeBlur,\n handleScopeFocus,\n handleScopeKeyDown,\n handleScopePointerDown,\n rememberedFocusRef,\n } = useToolbarNextKeyboardNavigation({\n includeTabIndexMinusOne: true,\n items: group.items,\n scopeRef: panelContentRef,\n });\n\n const { refs, x, y, strategy, context, elements } = useFloatingUI({\n open,\n onOpenChange(nextOpen, _, reason) {\n setOpen(nextOpen);\n\n if (!nextOpen) {\n openModalityRef.current = null;\n }\n\n if (!nextOpen && reason === \"escape-key\") {\n scheduleToolbarNextFocus(triggerRef.current);\n }\n },\n placement: \"bottom-end\",\n middleware: [\n offset(1),\n size({\n apply({ elements, availableHeight }) {\n Object.assign(elements.floating.style, {\n maxHeight: `${availableHeight}px`,\n });\n },\n }),\n flip(),\n shift({\n padding: 8,\n }),\n ],\n });\n const { getFloatingProps, getReferenceProps } = useInteractions([\n useClick(context),\n useDismiss(context, {\n escapeKey: false,\n outsidePress(event) {\n return !isTargetInsideOverflowBoundary(\n panelContentRef.current,\n floatingBoundary,\n group.key,\n event.target,\n );\n },\n }),\n ]);\n\n const handleTriggerKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLButtonElement>) => {\n if (!open && [\"Enter\", \" \"].includes(event.key)) {\n event.preventDefault();\n openModalityRef.current = \"keyboard\";\n setOpen(true);\n return;\n }\n\n if (open && event.key === \"Escape\") {\n event.preventDefault();\n setOpen(false);\n scheduleToolbarNextFocus(triggerRef.current);\n }\n },\n [open],\n );\n\n const handleTriggerPointerDown = useCallback(\n (event: ReactPointerEvent<HTMLButtonElement>) => {\n if (!open && event.button === 0) {\n openModalityRef.current = \"pointer\";\n }\n },\n [open],\n );\n\n const handleTriggerMouseDown = useCallback(\n (event: ReactMouseEvent<HTMLButtonElement>) => {\n if (!open && event.button === 0) {\n openModalityRef.current = \"pointer\";\n }\n },\n [open],\n );\n\n const handlePanelKeyDown = useCallback((event: KeyboardEvent) => {\n if (event.key === \"Tab\") {\n const panelContent = panelContentRef.current;\n const target = event.target;\n\n if (\n panelContent &&\n target instanceof HTMLElement &&\n shouldToolbarNextPreserveNativeTab(target)\n ) {\n const focusableElements = getDocumentFocusableElements(\n panelContent.ownerDocument,\n );\n const currentIndex = focusableElements.indexOf(target);\n const nextFocusTarget =\n focusableElements[currentIndex + (event.shiftKey ? -1 : 1)];\n\n if (\n currentIndex !== -1 &&\n nextFocusTarget &&\n panelContent.contains(nextFocusTarget)\n ) {\n return;\n }\n }\n }\n\n if (event.key === \"Tab\" && !event.shiftKey) {\n const toolbarRoot = triggerRef.current?.closest<HTMLElement>(\n `[${TOOLBAR_NEXT_SCOPE_ROOT_ATTR}]`,\n );\n const nextFocusTarget = toolbarRoot\n ? getToolbarNextTabMoveTarget(toolbarRoot, false)\n : null;\n\n if (nextFocusTarget) {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n scheduleToolbarNextFocus(nextFocusTarget);\n }\n\n return;\n }\n\n if (event.key === \"Tab\" && event.shiftKey) {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n scheduleToolbarNextFocus(triggerRef.current);\n return;\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n scheduleToolbarNextFocus(triggerRef.current);\n }\n }, []);\n\n const handleTriggerRef = useForkRef<HTMLButtonElement>(\n triggerRef,\n refs.setReference,\n );\n const handlePanelRef = useForkRef<HTMLDivElement>(panelRef, refs.setFloating);\n const handlePanelContentRef = useForkRef<HTMLDivElement>(\n panelContentRef,\n setPanelContentNode,\n );\n const handlePanelFocus = useCallback(\n (event: FocusEvent) => {\n handleScopeFocus(event);\n\n const panelContent = panelContentRef.current;\n const target = event.target;\n\n if (!panelContent || !(target instanceof HTMLElement)) {\n return;\n }\n\n const focusMemory = getToolbarNextFocusMemory(panelContent, target, {\n includeTabIndexMinusOne: true,\n });\n\n if (focusMemory?.type !== \"item\") {\n return;\n }\n\n scrollToolbarNextOverflowTargetIntoView(panelRef.current, target);\n onItemFocus?.(focusMemory.itemId, focusMemory.controlIndex);\n },\n [handleScopeFocus, onItemFocus],\n );\n const { Component: FloatingComponent } = useFloatingComponent();\n\n useEffect(() => {\n if (open && !wasOpenRef.current) {\n const externalFocusMemory = focusMemoryRef?.current;\n\n if (canSeedOverflowFocusMemory(externalFocusMemory, group)) {\n rememberedFocusRef.current = externalFocusMemory;\n }\n\n if (openModalityRef.current !== \"pointer\") {\n focusEntryTarget();\n }\n }\n\n wasOpenRef.current = open;\n }, [focusEntryTarget, focusMemoryRef, group, open, rememberedFocusRef]);\n\n useEffect(() => {\n if (!open || !panelContentNode) {\n return;\n }\n\n const handleFocusIn = (event: FocusEvent) => {\n handlePanelFocus(event);\n };\n const handleFocusOut = (event: FocusEvent) => {\n if (\n isTargetInsideOverflowBoundary(\n panelContentRef.current,\n floatingBoundary,\n group.key,\n event.relatedTarget,\n )\n ) {\n return;\n }\n\n handleScopeBlur(event);\n };\n const handleKeyDownCapture = (event: KeyboardEvent) => {\n handleScopeKeyDown(event);\n };\n const handlePointerDownCapture = (event: PointerEvent) => {\n handleScopePointerDown(event);\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!event.defaultPrevented) {\n handlePanelKeyDown(event);\n }\n };\n\n panelContentNode.addEventListener(\"focusin\", handleFocusIn);\n panelContentNode.addEventListener(\"focusout\", handleFocusOut);\n panelContentNode.addEventListener(\"keydown\", handleKeyDownCapture, true);\n panelContentNode.addEventListener(\n \"pointerdown\",\n handlePointerDownCapture,\n true,\n );\n panelContentNode.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n panelContentNode.removeEventListener(\"focusin\", handleFocusIn);\n panelContentNode.removeEventListener(\"focusout\", handleFocusOut);\n panelContentNode.removeEventListener(\n \"keydown\",\n handleKeyDownCapture,\n true,\n );\n panelContentNode.removeEventListener(\n \"pointerdown\",\n handlePointerDownCapture,\n true,\n );\n panelContentNode.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [\n handlePanelFocus,\n handlePanelKeyDown,\n handleScopeBlur,\n handleScopeKeyDown,\n handleScopePointerDown,\n floatingBoundary,\n group.key,\n open,\n panelContentNode,\n ]);\n\n useIsomorphicLayoutEffect(() => {\n if (!open) {\n focusedOpenPanelRef.current = false;\n return;\n }\n\n if (\n !panelContentNode ||\n focusedOpenPanelRef.current ||\n openModalityRef.current === \"pointer\"\n ) {\n return;\n }\n\n const getPanelFocusables = () =>\n getToolbarNextScopeFocusableElements(panelContentNode, {\n includeTabIndexMinusOne: true,\n });\n const focusEntryWhenReady = () => {\n const panelFocusables = getPanelFocusables();\n\n if (panelFocusables.length === 0) {\n return false;\n }\n\n focusedOpenPanelRef.current = true;\n focusEntryTarget();\n return true;\n };\n\n if (focusEntryWhenReady()) {\n return;\n }\n\n const panelWindow = panelContentNode.ownerDocument.defaultView;\n const mutationObserverCtor = panelWindow?.MutationObserver;\n const resizeObserverCtor = panelWindow?.ResizeObserver;\n let mutationObserver: MutationObserver | null = null;\n let resizeObserver: ResizeObserver | null = null;\n\n mutationObserver =\n mutationObserverCtor != null\n ? new mutationObserverCtor(() => {\n if (focusEntryWhenReady()) {\n mutationObserver?.disconnect();\n resizeObserver?.disconnect();\n }\n })\n : null;\n resizeObserver =\n resizeObserverCtor != null\n ? new resizeObserverCtor(() => {\n if (focusEntryWhenReady()) {\n mutationObserver?.disconnect();\n resizeObserver?.disconnect();\n }\n })\n : null;\n\n mutationObserver?.observe(panelContentNode, {\n childList: true,\n subtree: true,\n });\n resizeObserver?.observe(panelContentNode);\n\n return () => {\n mutationObserver?.disconnect();\n resizeObserver?.disconnect();\n };\n }, [focusEntryTarget, open, panelContentNode]);\n\n return (\n <div\n className={withBaseName(\"menu\")}\n data-overflowgroup={group.overflowGroup}\n >\n <Button\n appearance=\"transparent\"\n aria-controls={panelId}\n aria-expanded={open}\n aria-label={getOverflowTriggerLabel(group)}\n className={withBaseName(\"trigger\")}\n {...{\n [TOOLBAR_NEXT_GROUP_KEY_ATTR]: group.key,\n [TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR]: \"\",\n }}\n {...getReferenceProps({\n onKeyDown: handleTriggerKeyDown,\n onMouseDown: handleTriggerMouseDown,\n onPointerDown: handleTriggerPointerDown,\n })}\n ref={handleTriggerRef}\n sentiment=\"neutral\"\n >\n <ToolbarNextOverflowTriggerContent\n label={group.label}\n named={group.named}\n />\n </Button>\n <FloatingComponent\n {...getFloatingProps({\n role: \"presentation\",\n })}\n className={withBaseName(\"panel\")}\n focusManagerProps={\n context\n ? {\n context,\n initialFocus: -1,\n returnFocus: false,\n modal: false,\n closeOnFocusOut: false,\n }\n : undefined\n }\n id={panelId}\n left={x ?? 0}\n open={open}\n position={strategy}\n ref={handlePanelRef}\n top={y ?? 0}\n width={elements.floating?.offsetWidth}\n height={elements.floating?.offsetHeight}\n >\n <div\n aria-label={`${group.label} overflow`}\n aria-orientation=\"horizontal\"\n className={withBaseName(\"panelContent\")}\n {...{ [TOOLBAR_NEXT_SCOPE_ROOT_ATTR]: group.key }}\n role=\"toolbar\"\n ref={handlePanelContentRef}\n >\n {group.items.map((item, index) => (\n <div\n className={withBaseName(\"panelItem\")}\n key={`${group.id}-${item.id}`}\n >\n {index > 0 &&\n item.leadingDecorations.length > 0 &&\n cloneDecorations(item.id, item.leadingDecorations, \"leading\")}\n <div\n className={withBaseName(\"itemHost\")}\n ref={open ? getItemHostRef(item.id, \"overflow\") : null}\n />\n {cloneDecorations(item.id, item.trailingDecorations, \"trailing\")}\n </div>\n ))}\n </div>\n </FloatingComponent>\n </div>\n );\n}\n\nexport interface ToolbarNextOverflowContentProps {\n focusMemoryRef?: RefObject<ToolbarNextFocusMemory | null>;\n getItemHostRef: (\n id: string,\n kind: ToolbarNextItemHostKind,\n ) => (node: HTMLDivElement | null) => void;\n getItemRef: (id: string) => (node: HTMLDivElement | null) => void;\n getNamedTriggerRef: (id: string) => (node: HTMLDivElement | null) => void;\n getContentRef: (contentKey: string) => (node: HTMLDivElement | null) => void;\n onItemFocus?: (itemId: string, controlIndex: number) => void;\n overflowGroups: ToolbarNextOverflowGroup[];\n overflowedIds: Set<string>;\n content: ToolbarNextContentModel;\n}\n\nexport function ToolbarNextOverflowContent({\n content,\n focusMemoryRef,\n getItemHostRef,\n getItemRef,\n getNamedTriggerRef,\n getContentRef,\n onItemFocus,\n overflowGroups,\n overflowedIds,\n}: ToolbarNextOverflowContentProps) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-toolbar-next-overflow\",\n css: toolbarNextOverflowCss,\n window: targetWindow,\n });\n\n const { className, ...contentProps } = content.props;\n const handleContentRef = useForkRef(content.ref, getContentRef(content.key));\n const overflowGroupByKey = new Map(\n overflowGroups.map((group) => [group.key, group] as const),\n );\n\n const renderSlots = buildContentOverflowRenderSlots(\n content.items,\n overflowedIds,\n new Set(overflowGroups.map((group) => group.key)),\n );\n\n return (\n <ToolbarContentNext\n {...contentProps}\n data-implicit={content.implicit || undefined}\n className={clsx(className, withBaseName(\"content\"))}\n position={content.position}\n ref={handleContentRef}\n >\n {renderSlots.map(\n ({\n item,\n overflowed,\n showLeadingDecorations,\n showTrailingDecorations,\n triggerGroupKey,\n }) => {\n const triggerGroup =\n triggerGroupKey != null\n ? overflowGroupByKey.get(triggerGroupKey)\n : undefined;\n\n return (\n <div\n className={withBaseName(\"slot\")}\n data-align={item.align}\n data-priority={item.overflowPriority}\n key={\n triggerGroup\n ? `${content.key}-${triggerGroup.id}-anchor-${item.id}`\n : item.id\n }\n ref={\n triggerGroup ? getNamedTriggerRef(item.id) : getItemRef(item.id)\n }\n >\n {showLeadingDecorations\n ? cloneDecorations(item.id, item.leadingDecorations, \"leading\")\n : null}\n {!overflowed ? (\n <div className={withBaseName(\"item\")}>\n <div\n className={withBaseName(\"itemHost\")}\n ref={getItemHostRef(item.id, \"main\")}\n />\n </div>\n ) : null}\n {triggerGroup ? (\n <div className={withBaseName(\"item\")}>\n <ToolbarNextOverflowMenu\n focusMemoryRef={focusMemoryRef}\n getItemHostRef={getItemHostRef}\n group={triggerGroup}\n onItemFocus={onItemFocus}\n />\n </div>\n ) : null}\n {showTrailingDecorations\n ? cloneDecorations(\n item.id,\n item.trailingDecorations,\n \"trailing\",\n )\n : null}\n </div>\n );\n },\n )}\n </ToolbarContentNext>\n );\n}\n"],"names":["makePrefixer","toolbarNextFocusableSelector","TOOLBAR_NEXT_ITEM_ATTR","TOOLBAR_NEXT_SCOPE_ROOT_ATTR","compute","useWindow","useState","useRef","getToolbarNextOverflowBoundaryKey","useIsomorphicLayoutEffect","cloneElement","TOOLBAR_NEXT_GROUP_KEY_ATTR","jsx","ToolbarNextOverflowFloatingComponentProvider","createPortal","Fragment","Children","isValidElement","useIcon","useId","useToolbarNextOverflowFloatingBoundary","useToolbarNextKeyboardNavigation","useFloatingUI","scheduleToolbarNextFocus","offset","size","elements","flip","shift","useInteractions","useClick","useDismiss","isTargetInsideOverflowBoundary","useCallback","_a","shouldToolbarNextPreserveNativeTab","getDocumentFocusableElements","getToolbarNextTabMoveTarget","useForkRef","getToolbarNextFocusMemory","useFloatingComponent","useEffect","getToolbarNextScopeFocusableElements","jsxs","Button","TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR","useComponentCssInjection","toolbarNextOverflowCss","buildContentOverflowRenderSlots","ToolbarContentNext","clsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ToolbarNextOverflow.js","sources":["../src/toolbar-next/ToolbarNextOverflow.tsx"],"sourcesContent":["import {\n flip,\n offset,\n shift,\n size,\n useClick,\n useDismiss,\n useInteractions,\n} from \"@floating-ui/react\";\nimport {\n Button,\n makePrefixer,\n useFloatingComponent,\n useFloatingUI,\n useForkRef,\n useIcon,\n useId,\n useIsomorphicLayoutEffect,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { compute } from \"compute-scroll-into-view\";\nimport {\n Children,\n cloneElement,\n isValidElement,\n type ReactElement,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n type PointerEvent as ReactPointerEvent,\n type RefObject,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ToolbarContentNext } from \"./ToolbarContentNext\";\nimport toolbarNextOverflowCss from \"./ToolbarNextOverflow.css\";\nimport {\n getToolbarNextOverflowBoundaryKey,\n isTargetInsideOverflowBoundary,\n ToolbarNextOverflowFloatingComponentProvider,\n useToolbarNextOverflowFloatingBoundary,\n} from \"./ToolbarNextOverflowFloatingBoundary\";\nimport {\n getDocumentFocusableElements,\n getToolbarNextFocusMemory,\n getToolbarNextScopeFocusableElements,\n getToolbarNextTabMoveTarget,\n scheduleToolbarNextFocus,\n shouldToolbarNextPreserveNativeTab,\n TOOLBAR_NEXT_GROUP_KEY_ATTR,\n TOOLBAR_NEXT_ITEM_ATTR,\n TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR,\n TOOLBAR_NEXT_SCOPE_ROOT_ATTR,\n type ToolbarNextFocusMemory,\n toolbarNextFocusableSelector,\n} from \"./toolbarNextKeyboardUtils\";\nimport type {\n ToolbarNextContentModel,\n ToolbarNextOverflowItem,\n} from \"./toolbarNextUtils\";\nimport { buildContentOverflowRenderSlots } from \"./toolbarNextUtils\";\nimport { useToolbarNextKeyboardNavigation } from \"./useToolbarNextKeyboardNavigation\";\nimport type { ToolbarNextOverflowGroup } from \"./useToolbarNextOverflow\";\n\nconst withBaseName = makePrefixer(\"saltToolbarNextOverflow\");\n\nexport type ToolbarNextItemHostKind = \"main\" | \"measurement\" | \"overflow\";\n\nconst toolbarNextStatefulFocusRootSelector = [\n \".saltComboBox-focused\",\n \".saltDateInput-focused\",\n \".saltInput-focused\",\n].join(\", \");\n\nconst toolbarNextOverflowFocusScrollRootSelector = [\n \".saltComboBox\",\n \".saltDateInput\",\n \".saltDropdown\",\n \".saltInput\",\n \".saltSwitch\",\n].join(\", \");\n\ntype ToolbarNextOverflowOpenModality = \"keyboard\" | \"pointer\" | null;\n\nfunction createToolbarNextFocusEvent(\n eventName: \"blur\" | \"focusout\",\n target: HTMLElement,\n relatedTarget: Element | null,\n) {\n const FocusEventCtor = target.ownerDocument.defaultView?.FocusEvent;\n const eventInit = {\n bubbles: eventName === \"focusout\",\n relatedTarget,\n };\n\n return FocusEventCtor\n ? new FocusEventCtor(eventName, eventInit)\n : new Event(eventName, eventInit);\n}\n\nfunction notifyToolbarNextReparentedFocusLoss(mountNode: HTMLDivElement) {\n const activeElement = mountNode.ownerDocument.activeElement;\n\n if (mountNode.contains(activeElement)) {\n return;\n }\n\n // Browser focus can move to the document when a portaled toolbar item is\n // reparented, without notifying controls that keep their own focused state.\n const staleFocusTargets = Array.from(\n mountNode.querySelectorAll<HTMLElement>(\n toolbarNextStatefulFocusRootSelector,\n ),\n )\n .map(\n (root) =>\n root.querySelector<HTMLElement>(\"input\") ??\n root.querySelector<HTMLElement>(toolbarNextFocusableSelector),\n )\n .filter((target): target is HTMLElement => target != null);\n\n for (const target of staleFocusTargets) {\n const relatedTarget =\n activeElement instanceof Element ? activeElement : null;\n\n target.dispatchEvent(\n createToolbarNextFocusEvent(\"blur\", target, relatedTarget),\n );\n target.dispatchEvent(\n createToolbarNextFocusEvent(\"focusout\", target, relatedTarget),\n );\n }\n}\n\nfunction getToolbarNextOverflowFocusScrollTarget(target: HTMLElement) {\n const itemRoot = target.closest<HTMLElement>(`[${TOOLBAR_NEXT_ITEM_ATTR}]`);\n const controlRoot = target.closest<HTMLElement>(\n toolbarNextOverflowFocusScrollRootSelector,\n );\n\n return controlRoot && itemRoot?.contains(controlRoot) ? controlRoot : target;\n}\n\nfunction getToolbarNextOverflowPanelInlinePadding(target: HTMLElement) {\n const panelContent = target.closest<HTMLElement>(\n `[${TOOLBAR_NEXT_SCOPE_ROOT_ATTR}]`,\n );\n const styles =\n panelContent?.ownerDocument.defaultView?.getComputedStyle(panelContent);\n\n return {\n left: Number.parseFloat(styles?.paddingLeft ?? \"0\") || 0,\n right: Number.parseFloat(styles?.paddingRight ?? \"0\") || 0,\n };\n}\n\nfunction scrollToolbarNextOverflowTargetIntoView(\n panel: HTMLDivElement | null,\n target: HTMLElement,\n) {\n if (!panel || !panel.contains(target)) {\n return;\n }\n\n const scrollTarget = getToolbarNextOverflowFocusScrollTarget(target);\n const actions = compute(scrollTarget, {\n block: \"nearest\",\n boundary: panel,\n inline: \"nearest\",\n scrollMode: \"if-needed\",\n });\n\n for (const { el, left, top } of actions) {\n if (el === panel) {\n const targetRect = scrollTarget.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const viewportLeft = panelRect.left + panel.clientLeft;\n const viewportRight = viewportLeft + panel.clientWidth;\n const padding = getToolbarNextOverflowPanelInlinePadding(scrollTarget);\n const nextLeft =\n targetRect.left < viewportLeft + padding.left\n ? left - padding.left\n : targetRect.right > viewportRight - padding.right\n ? left + padding.right\n : left;\n\n el.scrollLeft = Math.max(0, nextLeft);\n } else {\n el.scrollLeft = left;\n }\n\n el.scrollTop = top;\n }\n}\n\nfunction canSeedOverflowFocusMemory(\n focusMemory: ToolbarNextFocusMemory | null | undefined,\n group: ToolbarNextOverflowGroup,\n): focusMemory is Extract<ToolbarNextFocusMemory, { type: \"item\" }> {\n return (\n focusMemory?.type === \"item\" &&\n group.items.some((item) => item.id === focusMemory.itemId)\n );\n}\n\ninterface ToolbarNextOverflowOwnersProps {\n hostNodes: Record<string, HTMLDivElement | null>;\n items: ToolbarNextOverflowItem[];\n}\n\nfunction ToolbarNextOverflowItemOwner({\n host,\n item,\n}: {\n host: HTMLDivElement | null;\n item: ToolbarNextOverflowItem;\n}) {\n const targetWindow = useWindow();\n const [mountNode, setMountNode] = useState<HTMLDivElement | null>(null);\n const mainToolbarTabIndexMemoryRef = useRef(\n new WeakMap<HTMLElement, string | null>(),\n );\n const lastOverflowBoundaryKeyRef = useRef<string | null>(null);\n const currentOverflowBoundaryKey = getToolbarNextOverflowBoundaryKey(host);\n\n if (host) {\n lastOverflowBoundaryKeyRef.current = currentOverflowBoundaryKey;\n }\n\n const boundaryKey = host\n ? currentOverflowBoundaryKey\n : lastOverflowBoundaryKeyRef.current;\n\n useIsomorphicLayoutEffect(() => {\n const nextMountNode = targetWindow?.document.createElement(\"div\");\n\n if (!nextMountNode) {\n return;\n }\n\n nextMountNode.className = withBaseName(\"contentHost\");\n setMountNode(nextMountNode);\n\n return () => {\n nextMountNode.parentElement?.removeChild(nextMountNode);\n };\n }, [targetWindow]);\n\n useIsomorphicLayoutEffect(() => {\n if (!mountNode) {\n return;\n }\n\n if (host) {\n if (mountNode.parentElement !== host) {\n host.appendChild(mountNode);\n notifyToolbarNextReparentedFocusLoss(mountNode);\n }\n\n const isMainToolbarHost =\n host\n .closest(`[${TOOLBAR_NEXT_SCOPE_ROOT_ATTR}]`)\n ?.getAttribute(TOOLBAR_NEXT_SCOPE_ROOT_ATTR) === \"main\";\n\n if (isMainToolbarHost) {\n const focusableElements = Array.from(\n mountNode.querySelectorAll<HTMLElement>(toolbarNextFocusableSelector),\n );\n\n for (const element of focusableElements) {\n const rememberedTabIndex =\n mainToolbarTabIndexMemoryRef.current.get(element);\n\n if (rememberedTabIndex !== undefined) {\n if (rememberedTabIndex == null) {\n element.removeAttribute(\"tabindex\");\n } else {\n element.setAttribute(\"tabindex\", rememberedTabIndex);\n }\n }\n }\n\n for (const element of focusableElements) {\n mainToolbarTabIndexMemoryRef.current.set(\n element,\n element.getAttribute(\"tabindex\"),\n );\n }\n }\n\n return;\n }\n\n notifyToolbarNextReparentedFocusLoss(mountNode);\n mountNode.parentElement?.removeChild(mountNode);\n }, [host, mountNode]);\n\n if (!mountNode) {\n return null;\n }\n\n const clonedItem = cloneElement(\n item.element as ReactElement<Record<string, ReactNode>>,\n {\n [TOOLBAR_NEXT_GROUP_KEY_ATTR]: item.overflowGroupKey,\n [TOOLBAR_NEXT_ITEM_ATTR]: item.id,\n },\n );\n const itemContent = (\n <ToolbarNextOverflowFloatingComponentProvider boundaryKey={boundaryKey}>\n {clonedItem}\n </ToolbarNextOverflowFloatingComponentProvider>\n );\n\n return createPortal(itemContent, mountNode);\n}\n\nexport function ToolbarNextOverflowOwners({\n hostNodes,\n items,\n}: ToolbarNextOverflowOwnersProps) {\n return (\n <>\n {items.map((item) => (\n <ToolbarNextOverflowItemOwner\n host={hostNodes[item.id] ?? null}\n item={item}\n key={item.id}\n />\n ))}\n </>\n );\n}\n\nfunction cloneDecorations(\n itemId: string,\n decorations: ReactElement[],\n slot: \"leading\" | \"trailing\",\n) {\n return Children.toArray(decorations).flatMap((decoration) => {\n if (!isValidElement(decoration)) {\n return [];\n }\n\n return [\n cloneElement(decoration, {\n key: `${itemId}-${slot}-${String(\n decoration.key ??\n (typeof decoration.type === \"string\"\n ? decoration.type\n : \"decoration\"),\n )}`,\n }),\n ];\n });\n}\n\nexport function ToolbarNextOverflowTriggerContent({\n label,\n named,\n}: {\n label: string;\n named: boolean;\n}) {\n const { OverflowIcon } = useIcon();\n\n if (named) {\n return <>{label}</>;\n }\n\n return <OverflowIcon aria-hidden />;\n}\n\nfunction getOverflowTriggerLabel(group: ToolbarNextOverflowGroup) {\n return group.named\n ? `${group.label} overflow. Hidden controls.`\n : \"Overflow. Hidden controls.\";\n}\n\ninterface ToolbarNextOverflowMenuProps {\n focusMemoryRef?: RefObject<ToolbarNextFocusMemory | null>;\n getItemHostRef: (\n id: string,\n kind: ToolbarNextItemHostKind,\n ) => (node: HTMLDivElement | null) => void;\n group: ToolbarNextOverflowGroup;\n onItemFocus?: (itemId: string, controlIndex: number) => void;\n}\n\nexport function ToolbarNextOverflowMenu({\n focusMemoryRef,\n getItemHostRef,\n group,\n onItemFocus,\n}: ToolbarNextOverflowMenuProps) {\n const panelId = useId();\n const [open, setOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const panelContentRef = useRef<HTMLDivElement>(null);\n const [panelContentNode, setPanelContentNode] =\n useState<HTMLDivElement | null>(null);\n const wasOpenRef = useRef(false);\n const focusedOpenPanelRef = useRef(false);\n const openModalityRef = useRef<ToolbarNextOverflowOpenModality>(null);\n const floatingBoundary = useToolbarNextOverflowFloatingBoundary();\n const {\n focusEntryTarget,\n handleScopeBlur,\n handleScopeFocus,\n handleScopeKeyDown,\n handleScopePointerDown,\n rememberedFocusRef,\n } = useToolbarNextKeyboardNavigation({\n includeTabIndexMinusOne: true,\n items: group.items,\n scopeRef: panelContentRef,\n });\n\n const { refs, x, y, strategy, context, elements } = useFloatingUI({\n open,\n onOpenChange(nextOpen, _, reason) {\n setOpen(nextOpen);\n\n if (!nextOpen) {\n openModalityRef.current = null;\n }\n\n if (!nextOpen && reason === \"escape-key\") {\n scheduleToolbarNextFocus(triggerRef.current);\n }\n },\n placement: \"bottom-end\",\n middleware: [\n offset(1),\n size({\n apply({ elements, availableHeight }) {\n Object.assign(elements.floating.style, {\n maxHeight: `${availableHeight}px`,\n });\n },\n }),\n flip(),\n shift({\n padding: 8,\n }),\n ],\n });\n const { getFloatingProps, getReferenceProps } = useInteractions([\n useClick(context),\n useDismiss(context, {\n escapeKey: false,\n outsidePress(event) {\n return !isTargetInsideOverflowBoundary(\n panelContentRef.current,\n floatingBoundary,\n group.key,\n event.target,\n );\n },\n }),\n ]);\n\n const handleTriggerKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLButtonElement>) => {\n if (!open && [\"Enter\", \" \"].includes(event.key)) {\n event.preventDefault();\n openModalityRef.current = \"keyboard\";\n setOpen(true);\n return;\n }\n\n if (open && event.key === \"Escape\") {\n event.preventDefault();\n setOpen(false);\n scheduleToolbarNextFocus(triggerRef.current);\n }\n },\n [open],\n );\n\n const handleTriggerPointerDown = useCallback(\n (event: ReactPointerEvent<HTMLButtonElement>) => {\n if (!open && event.button === 0) {\n openModalityRef.current = \"pointer\";\n }\n },\n [open],\n );\n\n const handleTriggerMouseDown = useCallback(\n (event: ReactMouseEvent<HTMLButtonElement>) => {\n if (!open && event.button === 0) {\n openModalityRef.current = \"pointer\";\n }\n },\n [open],\n );\n\n const handlePanelKeyDown = useCallback((event: KeyboardEvent) => {\n if (event.key === \"Tab\") {\n const panelContent = panelContentRef.current;\n const target = event.target;\n\n if (\n panelContent &&\n target instanceof HTMLElement &&\n shouldToolbarNextPreserveNativeTab(target)\n ) {\n const focusableElements = getDocumentFocusableElements(\n panelContent.ownerDocument,\n );\n const currentIndex = focusableElements.indexOf(target);\n const nextFocusTarget =\n focusableElements[currentIndex + (event.shiftKey ? -1 : 1)];\n\n if (\n currentIndex !== -1 &&\n nextFocusTarget &&\n panelContent.contains(nextFocusTarget)\n ) {\n return;\n }\n }\n }\n\n if (event.key === \"Tab\" && !event.shiftKey) {\n const toolbarRoot = triggerRef.current?.closest<HTMLElement>(\n `[${TOOLBAR_NEXT_SCOPE_ROOT_ATTR}]`,\n );\n const nextFocusTarget = toolbarRoot\n ? getToolbarNextTabMoveTarget(toolbarRoot, false)\n : null;\n\n if (nextFocusTarget) {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n scheduleToolbarNextFocus(nextFocusTarget);\n }\n\n return;\n }\n\n if (event.key === \"Tab\" && event.shiftKey) {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n scheduleToolbarNextFocus(triggerRef.current);\n return;\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n scheduleToolbarNextFocus(triggerRef.current);\n }\n }, []);\n\n const handleTriggerRef = useForkRef<HTMLButtonElement>(\n triggerRef,\n refs.setReference,\n );\n const handlePanelRef = useForkRef<HTMLDivElement>(panelRef, refs.setFloating);\n const handlePanelContentRef = useForkRef<HTMLDivElement>(\n panelContentRef,\n setPanelContentNode,\n );\n const handlePanelFocus = useCallback(\n (event: FocusEvent) => {\n handleScopeFocus(event);\n\n const panelContent = panelContentRef.current;\n const target = event.target;\n\n if (!panelContent || !(target instanceof HTMLElement)) {\n return;\n }\n\n const focusMemory = getToolbarNextFocusMemory(panelContent, target, {\n includeTabIndexMinusOne: true,\n });\n\n if (focusMemory?.type !== \"item\") {\n return;\n }\n\n scrollToolbarNextOverflowTargetIntoView(panelRef.current, target);\n onItemFocus?.(focusMemory.itemId, focusMemory.controlIndex);\n },\n [handleScopeFocus, onItemFocus],\n );\n const { Component: FloatingComponent } = useFloatingComponent();\n\n useEffect(() => {\n if (open && !wasOpenRef.current) {\n const externalFocusMemory = focusMemoryRef?.current;\n\n if (canSeedOverflowFocusMemory(externalFocusMemory, group)) {\n rememberedFocusRef.current = externalFocusMemory;\n }\n\n if (openModalityRef.current !== \"pointer\") {\n focusEntryTarget();\n }\n }\n\n wasOpenRef.current = open;\n }, [focusEntryTarget, focusMemoryRef, group, open, rememberedFocusRef]);\n\n useEffect(() => {\n if (!open || !panelContentNode) {\n return;\n }\n\n const handleFocusIn = (event: FocusEvent) => {\n handlePanelFocus(event);\n };\n const handleFocusOut = (event: FocusEvent) => {\n if (\n isTargetInsideOverflowBoundary(\n panelContentRef.current,\n floatingBoundary,\n group.key,\n event.relatedTarget,\n )\n ) {\n return;\n }\n\n handleScopeBlur(event);\n };\n const handleKeyDownCapture = (event: KeyboardEvent) => {\n handleScopeKeyDown(event);\n };\n const handlePointerDownCapture = (event: PointerEvent) => {\n handleScopePointerDown(event);\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!event.defaultPrevented) {\n handlePanelKeyDown(event);\n }\n };\n\n panelContentNode.addEventListener(\"focusin\", handleFocusIn);\n panelContentNode.addEventListener(\"focusout\", handleFocusOut);\n panelContentNode.addEventListener(\"keydown\", handleKeyDownCapture, true);\n panelContentNode.addEventListener(\n \"pointerdown\",\n handlePointerDownCapture,\n true,\n );\n panelContentNode.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n panelContentNode.removeEventListener(\"focusin\", handleFocusIn);\n panelContentNode.removeEventListener(\"focusout\", handleFocusOut);\n panelContentNode.removeEventListener(\n \"keydown\",\n handleKeyDownCapture,\n true,\n );\n panelContentNode.removeEventListener(\n \"pointerdown\",\n handlePointerDownCapture,\n true,\n );\n panelContentNode.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [\n handlePanelFocus,\n handlePanelKeyDown,\n handleScopeBlur,\n handleScopeKeyDown,\n handleScopePointerDown,\n floatingBoundary,\n group.key,\n open,\n panelContentNode,\n ]);\n\n useIsomorphicLayoutEffect(() => {\n if (!open) {\n focusedOpenPanelRef.current = false;\n return;\n }\n\n if (\n !panelContentNode ||\n focusedOpenPanelRef.current ||\n openModalityRef.current === \"pointer\"\n ) {\n return;\n }\n\n const getPanelFocusables = () =>\n getToolbarNextScopeFocusableElements(panelContentNode, {\n includeTabIndexMinusOne: true,\n });\n const focusEntryWhenReady = () => {\n const panelFocusables = getPanelFocusables();\n\n if (panelFocusables.length === 0) {\n return false;\n }\n\n focusedOpenPanelRef.current = true;\n focusEntryTarget();\n return true;\n };\n\n if (focusEntryWhenReady()) {\n return;\n }\n\n const panelWindow = panelContentNode.ownerDocument.defaultView;\n const mutationObserverCtor = panelWindow?.MutationObserver;\n const resizeObserverCtor = panelWindow?.ResizeObserver;\n let mutationObserver: MutationObserver | null = null;\n let resizeObserver: ResizeObserver | null = null;\n\n mutationObserver =\n mutationObserverCtor != null\n ? new mutationObserverCtor(() => {\n if (focusEntryWhenReady()) {\n mutationObserver?.disconnect();\n resizeObserver?.disconnect();\n }\n })\n : null;\n resizeObserver =\n resizeObserverCtor != null\n ? new resizeObserverCtor(() => {\n if (focusEntryWhenReady()) {\n mutationObserver?.disconnect();\n resizeObserver?.disconnect();\n }\n })\n : null;\n\n mutationObserver?.observe(panelContentNode, {\n childList: true,\n subtree: true,\n });\n resizeObserver?.observe(panelContentNode);\n\n return () => {\n mutationObserver?.disconnect();\n resizeObserver?.disconnect();\n };\n }, [focusEntryTarget, open, panelContentNode]);\n\n return (\n <div\n className={withBaseName(\"menu\")}\n data-overflowgroup={group.overflowGroup}\n >\n <Button\n appearance=\"transparent\"\n aria-controls={panelId}\n aria-expanded={open}\n aria-label={getOverflowTriggerLabel(group)}\n className={withBaseName(\"trigger\")}\n {...{\n [TOOLBAR_NEXT_GROUP_KEY_ATTR]: group.key,\n [TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR]: \"\",\n }}\n {...getReferenceProps({\n onKeyDown: handleTriggerKeyDown,\n onMouseDown: handleTriggerMouseDown,\n onPointerDown: handleTriggerPointerDown,\n })}\n ref={handleTriggerRef}\n sentiment=\"neutral\"\n >\n <ToolbarNextOverflowTriggerContent\n label={group.label}\n named={group.named}\n />\n </Button>\n <FloatingComponent\n {...getFloatingProps({\n role: \"presentation\",\n })}\n className={withBaseName(\"panel\")}\n focusManagerProps={\n context\n ? {\n context,\n initialFocus: -1,\n returnFocus: false,\n modal: false,\n closeOnFocusOut: false,\n }\n : undefined\n }\n id={panelId}\n left={x ?? 0}\n open={open}\n position={strategy}\n ref={handlePanelRef}\n top={y ?? 0}\n width={elements.floating?.offsetWidth}\n height={elements.floating?.offsetHeight}\n >\n <div\n aria-label={`${group.label} overflow`}\n aria-orientation=\"horizontal\"\n className={withBaseName(\"panelContent\")}\n {...{ [TOOLBAR_NEXT_SCOPE_ROOT_ATTR]: group.key }}\n role=\"toolbar\"\n ref={handlePanelContentRef}\n >\n {group.items.map((item, index) => (\n <div\n className={withBaseName(\"panelItem\")}\n key={`${group.id}-${item.id}`}\n >\n {index > 0 &&\n item.leadingDecorations.length > 0 &&\n cloneDecorations(item.id, item.leadingDecorations, \"leading\")}\n <div\n className={withBaseName(\"itemHost\")}\n ref={open ? getItemHostRef(item.id, \"overflow\") : null}\n />\n {cloneDecorations(item.id, item.trailingDecorations, \"trailing\")}\n </div>\n ))}\n </div>\n </FloatingComponent>\n </div>\n );\n}\n\nexport interface ToolbarNextOverflowContentProps {\n focusMemoryRef?: RefObject<ToolbarNextFocusMemory | null>;\n getItemHostRef: (\n id: string,\n kind: ToolbarNextItemHostKind,\n ) => (node: HTMLDivElement | null) => void;\n getItemRef: (id: string) => (node: HTMLDivElement | null) => void;\n getNamedTriggerRef: (id: string) => (node: HTMLDivElement | null) => void;\n getContentRef: (contentKey: string) => (node: HTMLDivElement | null) => void;\n onItemFocus?: (itemId: string, controlIndex: number) => void;\n overflowGroups: ToolbarNextOverflowGroup[];\n overflowedIds: Set<string>;\n content: ToolbarNextContentModel;\n}\n\nexport function ToolbarNextOverflowContent({\n content,\n focusMemoryRef,\n getItemHostRef,\n getItemRef,\n getNamedTriggerRef,\n getContentRef,\n onItemFocus,\n overflowGroups,\n overflowedIds,\n}: ToolbarNextOverflowContentProps) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-toolbar-next-overflow\",\n css: toolbarNextOverflowCss,\n window: targetWindow,\n });\n\n const { className, ...contentProps } = content.props;\n const handleContentRef = useForkRef(content.ref, getContentRef(content.key));\n const overflowGroupByKey = new Map(\n overflowGroups.map((group) => [group.key, group] as const),\n );\n\n const renderSlots = buildContentOverflowRenderSlots(\n content.items,\n overflowedIds,\n new Set(overflowGroups.map((group) => group.key)),\n );\n\n return (\n <ToolbarContentNext\n {...contentProps}\n data-implicit={content.implicit || undefined}\n className={clsx(className, withBaseName(\"content\"))}\n position={content.position}\n ref={handleContentRef}\n >\n {renderSlots.map(\n ({\n item,\n overflowed,\n showLeadingDecorations,\n showTrailingDecorations,\n triggerGroupKey,\n }) => {\n const triggerGroup =\n triggerGroupKey != null\n ? overflowGroupByKey.get(triggerGroupKey)\n : undefined;\n\n return (\n <div\n className={withBaseName(\"slot\")}\n data-align={item.align}\n data-priority={item.overflowPriority}\n key={\n triggerGroup\n ? `${content.key}-${triggerGroup.id}-anchor-${item.id}`\n : item.id\n }\n ref={\n triggerGroup ? getNamedTriggerRef(item.id) : getItemRef(item.id)\n }\n >\n {showLeadingDecorations\n ? cloneDecorations(item.id, item.leadingDecorations, \"leading\")\n : null}\n {!overflowed ? (\n <div className={withBaseName(\"item\")}>\n <div\n className={withBaseName(\"itemHost\")}\n ref={getItemHostRef(item.id, \"main\")}\n />\n </div>\n ) : null}\n {triggerGroup ? (\n <div className={withBaseName(\"item\")}>\n <ToolbarNextOverflowMenu\n focusMemoryRef={focusMemoryRef}\n getItemHostRef={getItemHostRef}\n group={triggerGroup}\n onItemFocus={onItemFocus}\n />\n </div>\n ) : null}\n {showTrailingDecorations\n ? cloneDecorations(\n item.id,\n item.trailingDecorations,\n \"trailing\",\n )\n : null}\n </div>\n );\n },\n )}\n </ToolbarContentNext>\n );\n}\n"],"names":["makePrefixer","toolbarNextFocusableSelector","TOOLBAR_NEXT_ITEM_ATTR","TOOLBAR_NEXT_SCOPE_ROOT_ATTR","compute","useWindow","useState","useRef","getToolbarNextOverflowBoundaryKey","useIsomorphicLayoutEffect","cloneElement","TOOLBAR_NEXT_GROUP_KEY_ATTR","jsx","ToolbarNextOverflowFloatingComponentProvider","createPortal","Fragment","Children","isValidElement","useIcon","useId","useToolbarNextOverflowFloatingBoundary","useToolbarNextKeyboardNavigation","useFloatingUI","scheduleToolbarNextFocus","offset","size","elements","flip","shift","useInteractions","useClick","useDismiss","isTargetInsideOverflowBoundary","useCallback","_a","shouldToolbarNextPreserveNativeTab","getDocumentFocusableElements","getToolbarNextTabMoveTarget","useForkRef","getToolbarNextFocusMemory","useFloatingComponent","useEffect","getToolbarNextScopeFocusableElements","jsxs","Button","TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR","useComponentCssInjection","toolbarNextOverflowCss","buildContentOverflowRenderSlots","ToolbarContentNext","clsx"],"mappings":"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"}
|
|
@@ -273,7 +273,7 @@ function isToolbarNextToggleGroupButton(target) {
|
|
|
273
273
|
return target.tagName === "BUTTON" && target.closest(".saltToggleButtonGroup") != null && isToolbarNextFocusable(target, { includeTabIndexMinusOne: true });
|
|
274
274
|
}
|
|
275
275
|
function getToolbarNextKeyboardPolicy(target) {
|
|
276
|
-
if (target.isContentEditable || isPlainTextInput(target) || isComboBoxInput(target)) {
|
|
276
|
+
if (target.isContentEditable || isPlainTextInput(target) || isComboBoxInput(target) || isPillInputPill(target)) {
|
|
277
277
|
return {
|
|
278
278
|
preserveHorizontalArrows: true,
|
|
279
279
|
preserveNativeTab: true
|
|
@@ -299,6 +299,9 @@ function getToolbarNextKeyboardPolicy(target) {
|
|
|
299
299
|
function isComboBoxInput(target) {
|
|
300
300
|
return target.tagName === "INPUT" && target.closest('[role="combobox"], .saltComboBox') != null;
|
|
301
301
|
}
|
|
302
|
+
function isPillInputPill(target) {
|
|
303
|
+
return target.tagName === "BUTTON" && target.classList.contains("saltPill") && target.closest(".saltPillInput") != null;
|
|
304
|
+
}
|
|
302
305
|
function isDropdownControl(target) {
|
|
303
306
|
return target.closest(".saltDropdown") != null;
|
|
304
307
|
}
|
|
@@ -342,10 +345,25 @@ function isToolbarNextFocusable(target, { includeTabIndexMinusOne = false } = {}
|
|
|
342
345
|
}
|
|
343
346
|
return target.getClientRects().length > 0;
|
|
344
347
|
}
|
|
348
|
+
const toolbarNextFocusEntryOverrides = [
|
|
349
|
+
{ root: ".saltComboBox", interactive: 'input[role="combobox"]' }
|
|
350
|
+
];
|
|
345
351
|
function focusToolbarNextElement(target) {
|
|
346
|
-
|
|
347
|
-
|
|
352
|
+
const focusTarget = resolveToolbarNextFocusEntryTarget(target);
|
|
353
|
+
if (focusTarget == null ? void 0 : focusTarget.isConnected) {
|
|
354
|
+
focusTarget.focus({ preventScroll: true });
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
function resolveToolbarNextFocusEntryTarget(target) {
|
|
358
|
+
if (!target) {
|
|
359
|
+
return target;
|
|
360
|
+
}
|
|
361
|
+
for (const { root, interactive } of toolbarNextFocusEntryOverrides) {
|
|
362
|
+
if (target.matches(root)) {
|
|
363
|
+
return target.querySelector(interactive) ?? target;
|
|
364
|
+
}
|
|
348
365
|
}
|
|
366
|
+
return target;
|
|
349
367
|
}
|
|
350
368
|
function scheduleToolbarNextFocus(target, targetWindow = target == null ? void 0 : target.ownerDocument.defaultView) {
|
|
351
369
|
if (!target) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolbarNextKeyboardUtils.js","sources":["../src/toolbar-next/toolbarNextKeyboardUtils.ts"],"sourcesContent":["import type { ToolbarNextOverflowItem } from \"./toolbarNextUtils\";\n\nexport const TOOLBAR_NEXT_SCOPE_ROOT_ATTR = \"data-salt-toolbar-next-scope-root\";\nexport const TOOLBAR_NEXT_ITEM_ATTR = \"data-salt-toolbar-next-item-id\";\nexport const TOOLBAR_NEXT_GROUP_KEY_ATTR =\n \"data-salt-toolbar-next-overflow-group-key\";\nexport const TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR =\n \"data-salt-toolbar-next-overflow-trigger\";\n\nexport const toolbarNextFocusableSelector = [\n \"button\",\n \"[href]\",\n \"input\",\n \"select\",\n \"textarea\",\n \"[tabindex]\",\n].join(\", \");\n\nconst textEntryInputTypes = new Set([\n \"\",\n \"date\",\n \"datetime-local\",\n \"email\",\n \"month\",\n \"number\",\n \"password\",\n \"search\",\n \"tel\",\n \"text\",\n \"time\",\n \"url\",\n \"week\",\n]);\n\nexport type ToolbarNextFocusMemory =\n | {\n controlIndex: number;\n itemId: string;\n scopeIndex: number;\n type: \"item\";\n }\n | {\n groupKey: string;\n scopeIndex: number;\n type: \"overflow-trigger\";\n }\n | {\n scopeIndex: number;\n type: \"scope\";\n };\n\nexport interface ToolbarNextFocusableOptions {\n includeTabIndexMinusOne?: boolean;\n}\n\ninterface ToolbarNextKeyboardPolicy {\n preserveHorizontalArrows: boolean;\n preserveNativeTab: boolean;\n}\n\nexport function getClosestToolbarNextScopeRoot(target: EventTarget | null) {\n if (!(target instanceof Element)) {\n return null;\n }\n\n return target.closest<HTMLElement>(`[${TOOLBAR_NEXT_SCOPE_ROOT_ATTR}]`);\n}\n\nexport function getToolbarNextItemId(target: Element | null) {\n return (\n target\n ?.closest<HTMLElement>(`[${TOOLBAR_NEXT_ITEM_ATTR}]`)\n ?.getAttribute(TOOLBAR_NEXT_ITEM_ATTR) ?? null\n );\n}\n\nexport function isToolbarNextFocusFromPointerTarget(\n focusTarget: HTMLElement,\n pointerTarget: EventTarget | null,\n) {\n if (!(pointerTarget instanceof Node)) {\n return false;\n }\n\n if (focusTarget === pointerTarget || focusTarget.contains(pointerTarget)) {\n return true;\n }\n\n if (!(pointerTarget instanceof Element)) {\n return false;\n }\n\n const focusItemId = getToolbarNextItemId(focusTarget);\n const pointerItemId = getToolbarNextItemId(pointerTarget);\n\n return focusItemId != null && focusItemId === pointerItemId;\n}\n\nexport function getToolbarNextScopeFocusableElements(\n scopeRoot: HTMLElement,\n options: ToolbarNextFocusableOptions = {},\n) {\n return Array.from(\n scopeRoot.querySelectorAll<HTMLElement>(toolbarNextFocusableSelector),\n ).filter((element) => {\n return (\n getClosestToolbarNextScopeRoot(element) === scopeRoot &&\n (isToolbarNextFocusable(element, options) ||\n isToolbarNextToggleGroupButton(element))\n );\n });\n}\n\nexport function getToolbarNextFocusMemory(\n scopeRoot: HTMLElement,\n target: HTMLElement,\n options: ToolbarNextFocusableOptions = {},\n): ToolbarNextFocusMemory | null {\n const scopeElements = getToolbarNextScopeFocusableElements(\n scopeRoot,\n options,\n );\n const scopeIndex = scopeElements.indexOf(target);\n if (scopeIndex === -1) {\n return null;\n }\n\n const groupTrigger = target.closest<HTMLElement>(\n `[${TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR}]`,\n );\n const groupKey = groupTrigger?.getAttribute(TOOLBAR_NEXT_GROUP_KEY_ATTR);\n\n if (groupKey) {\n return {\n groupKey,\n scopeIndex,\n type: \"overflow-trigger\",\n };\n }\n\n const itemRoot = target.closest<HTMLElement>(`[${TOOLBAR_NEXT_ITEM_ATTR}]`);\n const itemId = itemRoot?.getAttribute(TOOLBAR_NEXT_ITEM_ATTR);\n\n if (itemRoot && itemId) {\n const itemElements = getToolbarNextItemFocusableElements(\n itemRoot,\n scopeRoot,\n options,\n );\n const controlIndex = itemElements.indexOf(target);\n\n return {\n controlIndex: Math.max(controlIndex, 0),\n itemId,\n scopeIndex,\n type: \"item\",\n };\n }\n\n return {\n scopeIndex,\n type: \"scope\",\n };\n}\n\nexport function resolveToolbarNextFocusTarget(\n scopeRoot: HTMLElement,\n focusMemory: ToolbarNextFocusMemory | null,\n {\n includeTabIndexMinusOne,\n items = [],\n overflowedIds,\n }: {\n items?: ToolbarNextOverflowItem[];\n includeTabIndexMinusOne?: boolean;\n overflowedIds?: Set<string>;\n } = {},\n) {\n const focusableOptions = {\n includeTabIndexMinusOne,\n };\n\n if (!focusMemory) {\n return (\n getToolbarNextScopeFocusableElements(scopeRoot, focusableOptions)[0] ??\n null\n );\n }\n\n const fallback = getToolbarNextFocusFallback(\n scopeRoot,\n focusMemory.scopeIndex,\n focusableOptions,\n );\n\n if (focusMemory.type === \"overflow-trigger\") {\n const trigger = getToolbarNextOverflowTriggerElement(\n scopeRoot,\n focusMemory.groupKey,\n );\n\n if (trigger) {\n return trigger;\n }\n\n const firstVisibleItem = items.find((item) => {\n return item.overflowGroupKey === focusMemory.groupKey;\n });\n\n if (firstVisibleItem) {\n return (\n getToolbarNextFocusableElementForItem(\n scopeRoot,\n firstVisibleItem.id,\n 0,\n focusableOptions,\n ) ?? fallback\n );\n }\n\n return fallback;\n }\n\n if (focusMemory.type === \"item\") {\n const visibleItemTarget = getToolbarNextFocusableElementForItem(\n scopeRoot,\n focusMemory.itemId,\n focusMemory.controlIndex,\n focusableOptions,\n );\n\n if (visibleItemTarget) {\n return visibleItemTarget;\n }\n\n const item = items.find((entry) => entry.id === focusMemory.itemId);\n\n if (item && overflowedIds?.has(item.id)) {\n return (\n getToolbarNextOverflowTriggerElement(\n scopeRoot,\n item.overflowGroupKey,\n ) ?? fallback\n );\n }\n\n return fallback;\n }\n\n return fallback;\n}\n\nexport function getToolbarNextDirectionalMoveTarget(\n scopeRoot: HTMLElement,\n target: HTMLElement,\n key: string,\n options: ToolbarNextFocusableOptions = {},\n) {\n if (key !== \"ArrowLeft\" && key !== \"ArrowRight\") {\n return null;\n }\n\n if (getToolbarNextKeyboardPolicy(target).preserveHorizontalArrows) {\n return null;\n }\n\n const toggleGroupButtons = getToggleGroupButtons(target);\n\n if (toggleGroupButtons.length > 0) {\n const visualDelta = getVisualDelta(scopeRoot, key);\n const currentIndex = toggleGroupButtons.indexOf(target);\n\n if (\n currentIndex === -1 ||\n !isToggleGroupBoundary(\n currentIndex,\n toggleGroupButtons.length,\n visualDelta,\n )\n ) {\n return null;\n }\n }\n\n const scopeElements = getToolbarNextScopeFocusableElements(\n scopeRoot,\n options,\n );\n const currentIndex = scopeElements.indexOf(target);\n\n if (currentIndex === -1 || scopeElements.length <= 1) {\n return null;\n }\n\n const nextIndex =\n (currentIndex + getVisualDelta(scopeRoot, key) + scopeElements.length) %\n scopeElements.length;\n\n return scopeElements[nextIndex] ?? null;\n}\n\nexport function getToolbarNextTabMoveTarget(\n scopeRoot: HTMLElement,\n shiftKey: boolean,\n) {\n const focusableElements = getDocumentFocusableElements(\n scopeRoot.ownerDocument,\n );\n\n if (shiftKey) {\n for (let index = focusableElements.length - 1; index >= 0; index -= 1) {\n const element = focusableElements[index];\n\n if (!element || scopeRoot.contains(element)) {\n continue;\n }\n\n if (\n element.compareDocumentPosition(scopeRoot) &\n Node.DOCUMENT_POSITION_FOLLOWING\n ) {\n return element;\n }\n }\n\n return null;\n }\n\n return (\n focusableElements.find((element) => {\n return (\n !scopeRoot.contains(element) &&\n !!(\n scopeRoot.compareDocumentPosition(element) &\n Node.DOCUMENT_POSITION_FOLLOWING\n )\n );\n }) ?? null\n );\n}\n\nexport function shouldToolbarNextPreserveNativeTab(target: HTMLElement) {\n return getToolbarNextKeyboardPolicy(target).preserveNativeTab;\n}\n\nfunction getToolbarNextItemFocusableElements(\n itemRoot: HTMLElement,\n scopeRoot: HTMLElement,\n options: ToolbarNextFocusableOptions = {},\n) {\n return Array.from(\n itemRoot.querySelectorAll<HTMLElement>(toolbarNextFocusableSelector),\n ).filter((element) => {\n return (\n getClosestToolbarNextScopeRoot(element) === scopeRoot &&\n (isToolbarNextFocusable(element, options) ||\n isToolbarNextToggleGroupButton(element))\n );\n });\n}\n\nfunction getToolbarNextFocusableElementForItem(\n scopeRoot: HTMLElement,\n itemId: string,\n controlIndex: number,\n options: ToolbarNextFocusableOptions = {},\n) {\n const itemRoot = scopeRoot.querySelector<HTMLElement>(\n `[${TOOLBAR_NEXT_ITEM_ATTR}=\"${itemId}\"]`,\n );\n\n if (!itemRoot) {\n return null;\n }\n\n const itemElements = getToolbarNextItemFocusableElements(\n itemRoot,\n scopeRoot,\n options,\n );\n\n return (\n itemElements[Math.min(controlIndex, itemElements.length - 1)] ??\n itemElements[0] ??\n null\n );\n}\n\nfunction getToolbarNextOverflowTriggerElement(\n scopeRoot: HTMLElement,\n groupKey: string,\n) {\n return scopeRoot.querySelector<HTMLElement>(\n `[${TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR}][${TOOLBAR_NEXT_GROUP_KEY_ATTR}=\"${groupKey}\"]`,\n );\n}\n\nfunction getToolbarNextFocusFallback(\n scopeRoot: HTMLElement,\n rememberedIndex: number,\n options: ToolbarNextFocusableOptions = {},\n) {\n const focusableElements = getToolbarNextScopeFocusableElements(\n scopeRoot,\n options,\n );\n\n if (focusableElements.length === 0) {\n return null;\n }\n\n return (\n focusableElements[\n Math.max(0, Math.min(rememberedIndex, focusableElements.length - 1))\n ] ?? focusableElements[0]\n );\n}\n\nfunction getVisualDelta(scopeRoot: HTMLElement, key: string) {\n const direction =\n scopeRoot.ownerDocument.defaultView?.getComputedStyle(scopeRoot).direction;\n\n if (key === \"ArrowRight\") {\n return direction === \"rtl\" ? -1 : 1;\n }\n\n return direction === \"rtl\" ? 1 : -1;\n}\n\nfunction isToggleGroupBoundary(\n currentIndex: number,\n length: number,\n visualDelta: number,\n) {\n if (visualDelta > 0) {\n return currentIndex === length - 1;\n }\n\n return currentIndex === 0;\n}\n\nfunction getToggleGroupButtons(target: HTMLElement) {\n const toggleGroup = target.closest<HTMLElement>(\".saltToggleButtonGroup\");\n\n if (!toggleGroup || target.tagName !== \"BUTTON\") {\n return [];\n }\n\n return Array.from(toggleGroup.querySelectorAll<HTMLElement>(\"button\")).filter(\n (button) =>\n isToolbarNextFocusable(button, { includeTabIndexMinusOne: true }),\n );\n}\n\nfunction isToolbarNextToggleGroupButton(target: HTMLElement) {\n return (\n target.tagName === \"BUTTON\" &&\n target.closest(\".saltToggleButtonGroup\") != null &&\n isToolbarNextFocusable(target, { includeTabIndexMinusOne: true })\n );\n}\n\nfunction getToolbarNextKeyboardPolicy(\n target: HTMLElement,\n): ToolbarNextKeyboardPolicy {\n if (\n target.isContentEditable ||\n isPlainTextInput(target) ||\n isComboBoxInput(target)\n ) {\n return {\n preserveHorizontalArrows: true,\n preserveNativeTab: true,\n };\n }\n\n if (isDropdownControl(target)) {\n return {\n preserveHorizontalArrows: false,\n preserveNativeTab: false,\n };\n }\n\n if (\n isSelectLikeControl(target) ||\n target.closest(\".saltDatePickerTrigger\") != null\n ) {\n return {\n preserveHorizontalArrows: false,\n preserveNativeTab: true,\n };\n }\n\n return {\n preserveHorizontalArrows: false,\n preserveNativeTab: false,\n };\n}\n\nfunction isComboBoxInput(target: HTMLElement) {\n return (\n target.tagName === \"INPUT\" &&\n target.closest('[role=\"combobox\"], .saltComboBox') != null\n );\n}\n\nfunction isDropdownControl(target: HTMLElement) {\n return target.closest(\".saltDropdown\") != null;\n}\n\nfunction isSelectLikeControl(target: HTMLElement) {\n return (\n target.tagName === \"SELECT\" ||\n target.closest('[role=\"combobox\"], .saltComboBox, .saltDropdown') != null\n );\n}\n\nfunction isPlainTextInput(target: HTMLElement) {\n if (target.tagName === \"TEXTAREA\") {\n return true;\n }\n\n if (target.tagName !== \"INPUT\") {\n return false;\n }\n\n return textEntryInputTypes.has(\n (target as HTMLInputElement).type.toLowerCase(),\n );\n}\n\nfunction isNativeDisabledFormControl(target: HTMLElement) {\n return (\n \"disabled\" in target &&\n (target as HTMLButtonElement | HTMLInputElement).disabled\n );\n}\n\nexport function isToolbarNextFocusable(\n target: HTMLElement,\n { includeTabIndexMinusOne = false }: ToolbarNextFocusableOptions = {},\n) {\n if (isNativeDisabledFormControl(target)) {\n return false;\n }\n\n if (target.getAttribute(\"aria-hidden\") === \"true\") {\n return false;\n }\n\n if (!includeTabIndexMinusOne && target.getAttribute(\"tabindex\") === \"-1\") {\n return false;\n }\n\n if (target.hidden) {\n return false;\n }\n\n const win = target.ownerDocument.defaultView;\n\n if (!win) {\n return false;\n }\n\n const styles = win.getComputedStyle(target);\n\n if (styles.display === \"none\" || styles.visibility === \"hidden\") {\n return false;\n }\n\n return target.getClientRects().length > 0;\n}\n\nexport function focusToolbarNextElement(\n target: HTMLElement | null | undefined,\n) {\n if (target?.isConnected) {\n target.focus({ preventScroll: true });\n }\n}\n\nexport function scheduleToolbarNextFocus(\n target: HTMLElement | null | undefined,\n targetWindow = target?.ownerDocument.defaultView,\n) {\n if (!target) {\n return () => undefined;\n }\n\n if (targetWindow?.requestAnimationFrame) {\n const frame = targetWindow.requestAnimationFrame(() => {\n focusToolbarNextElement(target);\n });\n\n return () => {\n targetWindow.cancelAnimationFrame(frame);\n };\n }\n\n queueMicrotask(() => {\n focusToolbarNextElement(target);\n });\n\n return () => undefined;\n}\n\nexport function getDocumentFocusableElements(ownerDocument: Document) {\n return Array.from(\n ownerDocument.querySelectorAll<HTMLElement>(toolbarNextFocusableSelector),\n ).filter((element) => isToolbarNextFocusable(element));\n}\n"],"names":["currentIndex"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"toolbarNextKeyboardUtils.js","sources":["../src/toolbar-next/toolbarNextKeyboardUtils.ts"],"sourcesContent":["import type { ToolbarNextOverflowItem } from \"./toolbarNextUtils\";\n\nexport const TOOLBAR_NEXT_SCOPE_ROOT_ATTR = \"data-salt-toolbar-next-scope-root\";\nexport const TOOLBAR_NEXT_ITEM_ATTR = \"data-salt-toolbar-next-item-id\";\nexport const TOOLBAR_NEXT_GROUP_KEY_ATTR =\n \"data-salt-toolbar-next-overflow-group-key\";\nexport const TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR =\n \"data-salt-toolbar-next-overflow-trigger\";\n\nexport const toolbarNextFocusableSelector = [\n \"button\",\n \"[href]\",\n \"input\",\n \"select\",\n \"textarea\",\n \"[tabindex]\",\n].join(\", \");\n\nconst textEntryInputTypes = new Set([\n \"\",\n \"date\",\n \"datetime-local\",\n \"email\",\n \"month\",\n \"number\",\n \"password\",\n \"search\",\n \"tel\",\n \"text\",\n \"time\",\n \"url\",\n \"week\",\n]);\n\nexport type ToolbarNextFocusMemory =\n | {\n controlIndex: number;\n itemId: string;\n scopeIndex: number;\n type: \"item\";\n }\n | {\n groupKey: string;\n scopeIndex: number;\n type: \"overflow-trigger\";\n }\n | {\n scopeIndex: number;\n type: \"scope\";\n };\n\nexport interface ToolbarNextFocusableOptions {\n includeTabIndexMinusOne?: boolean;\n}\n\ninterface ToolbarNextKeyboardPolicy {\n preserveHorizontalArrows: boolean;\n preserveNativeTab: boolean;\n}\n\nexport function getClosestToolbarNextScopeRoot(target: EventTarget | null) {\n if (!(target instanceof Element)) {\n return null;\n }\n\n return target.closest<HTMLElement>(`[${TOOLBAR_NEXT_SCOPE_ROOT_ATTR}]`);\n}\n\nexport function getToolbarNextItemId(target: Element | null) {\n return (\n target\n ?.closest<HTMLElement>(`[${TOOLBAR_NEXT_ITEM_ATTR}]`)\n ?.getAttribute(TOOLBAR_NEXT_ITEM_ATTR) ?? null\n );\n}\n\nexport function isToolbarNextFocusFromPointerTarget(\n focusTarget: HTMLElement,\n pointerTarget: EventTarget | null,\n) {\n if (!(pointerTarget instanceof Node)) {\n return false;\n }\n\n if (focusTarget === pointerTarget || focusTarget.contains(pointerTarget)) {\n return true;\n }\n\n if (!(pointerTarget instanceof Element)) {\n return false;\n }\n\n const focusItemId = getToolbarNextItemId(focusTarget);\n const pointerItemId = getToolbarNextItemId(pointerTarget);\n\n return focusItemId != null && focusItemId === pointerItemId;\n}\n\nexport function getToolbarNextScopeFocusableElements(\n scopeRoot: HTMLElement,\n options: ToolbarNextFocusableOptions = {},\n) {\n return Array.from(\n scopeRoot.querySelectorAll<HTMLElement>(toolbarNextFocusableSelector),\n ).filter((element) => {\n return (\n getClosestToolbarNextScopeRoot(element) === scopeRoot &&\n (isToolbarNextFocusable(element, options) ||\n isToolbarNextToggleGroupButton(element))\n );\n });\n}\n\nexport function getToolbarNextFocusMemory(\n scopeRoot: HTMLElement,\n target: HTMLElement,\n options: ToolbarNextFocusableOptions = {},\n): ToolbarNextFocusMemory | null {\n const scopeElements = getToolbarNextScopeFocusableElements(\n scopeRoot,\n options,\n );\n const scopeIndex = scopeElements.indexOf(target);\n if (scopeIndex === -1) {\n return null;\n }\n\n const groupTrigger = target.closest<HTMLElement>(\n `[${TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR}]`,\n );\n const groupKey = groupTrigger?.getAttribute(TOOLBAR_NEXT_GROUP_KEY_ATTR);\n\n if (groupKey) {\n return {\n groupKey,\n scopeIndex,\n type: \"overflow-trigger\",\n };\n }\n\n const itemRoot = target.closest<HTMLElement>(`[${TOOLBAR_NEXT_ITEM_ATTR}]`);\n const itemId = itemRoot?.getAttribute(TOOLBAR_NEXT_ITEM_ATTR);\n\n if (itemRoot && itemId) {\n const itemElements = getToolbarNextItemFocusableElements(\n itemRoot,\n scopeRoot,\n options,\n );\n const controlIndex = itemElements.indexOf(target);\n\n return {\n controlIndex: Math.max(controlIndex, 0),\n itemId,\n scopeIndex,\n type: \"item\",\n };\n }\n\n return {\n scopeIndex,\n type: \"scope\",\n };\n}\n\nexport function resolveToolbarNextFocusTarget(\n scopeRoot: HTMLElement,\n focusMemory: ToolbarNextFocusMemory | null,\n {\n includeTabIndexMinusOne,\n items = [],\n overflowedIds,\n }: {\n items?: ToolbarNextOverflowItem[];\n includeTabIndexMinusOne?: boolean;\n overflowedIds?: Set<string>;\n } = {},\n) {\n const focusableOptions = {\n includeTabIndexMinusOne,\n };\n\n if (!focusMemory) {\n return (\n getToolbarNextScopeFocusableElements(scopeRoot, focusableOptions)[0] ??\n null\n );\n }\n\n const fallback = getToolbarNextFocusFallback(\n scopeRoot,\n focusMemory.scopeIndex,\n focusableOptions,\n );\n\n if (focusMemory.type === \"overflow-trigger\") {\n const trigger = getToolbarNextOverflowTriggerElement(\n scopeRoot,\n focusMemory.groupKey,\n );\n\n if (trigger) {\n return trigger;\n }\n\n const firstVisibleItem = items.find((item) => {\n return item.overflowGroupKey === focusMemory.groupKey;\n });\n\n if (firstVisibleItem) {\n return (\n getToolbarNextFocusableElementForItem(\n scopeRoot,\n firstVisibleItem.id,\n 0,\n focusableOptions,\n ) ?? fallback\n );\n }\n\n return fallback;\n }\n\n if (focusMemory.type === \"item\") {\n const visibleItemTarget = getToolbarNextFocusableElementForItem(\n scopeRoot,\n focusMemory.itemId,\n focusMemory.controlIndex,\n focusableOptions,\n );\n\n if (visibleItemTarget) {\n return visibleItemTarget;\n }\n\n const item = items.find((entry) => entry.id === focusMemory.itemId);\n\n if (item && overflowedIds?.has(item.id)) {\n return (\n getToolbarNextOverflowTriggerElement(\n scopeRoot,\n item.overflowGroupKey,\n ) ?? fallback\n );\n }\n\n return fallback;\n }\n\n return fallback;\n}\n\nexport function getToolbarNextDirectionalMoveTarget(\n scopeRoot: HTMLElement,\n target: HTMLElement,\n key: string,\n options: ToolbarNextFocusableOptions = {},\n) {\n if (key !== \"ArrowLeft\" && key !== \"ArrowRight\") {\n return null;\n }\n\n if (getToolbarNextKeyboardPolicy(target).preserveHorizontalArrows) {\n return null;\n }\n\n const toggleGroupButtons = getToggleGroupButtons(target);\n\n if (toggleGroupButtons.length > 0) {\n const visualDelta = getVisualDelta(scopeRoot, key);\n const currentIndex = toggleGroupButtons.indexOf(target);\n\n if (\n currentIndex === -1 ||\n !isToggleGroupBoundary(\n currentIndex,\n toggleGroupButtons.length,\n visualDelta,\n )\n ) {\n return null;\n }\n }\n\n const scopeElements = getToolbarNextScopeFocusableElements(\n scopeRoot,\n options,\n );\n const currentIndex = scopeElements.indexOf(target);\n\n if (currentIndex === -1 || scopeElements.length <= 1) {\n return null;\n }\n\n const nextIndex =\n (currentIndex + getVisualDelta(scopeRoot, key) + scopeElements.length) %\n scopeElements.length;\n\n return scopeElements[nextIndex] ?? null;\n}\n\nexport function getToolbarNextTabMoveTarget(\n scopeRoot: HTMLElement,\n shiftKey: boolean,\n) {\n const focusableElements = getDocumentFocusableElements(\n scopeRoot.ownerDocument,\n );\n\n if (shiftKey) {\n for (let index = focusableElements.length - 1; index >= 0; index -= 1) {\n const element = focusableElements[index];\n\n if (!element || scopeRoot.contains(element)) {\n continue;\n }\n\n if (\n element.compareDocumentPosition(scopeRoot) &\n Node.DOCUMENT_POSITION_FOLLOWING\n ) {\n return element;\n }\n }\n\n return null;\n }\n\n return (\n focusableElements.find((element) => {\n return (\n !scopeRoot.contains(element) &&\n !!(\n scopeRoot.compareDocumentPosition(element) &\n Node.DOCUMENT_POSITION_FOLLOWING\n )\n );\n }) ?? null\n );\n}\n\nexport function shouldToolbarNextPreserveNativeTab(target: HTMLElement) {\n return getToolbarNextKeyboardPolicy(target).preserveNativeTab;\n}\n\nfunction getToolbarNextItemFocusableElements(\n itemRoot: HTMLElement,\n scopeRoot: HTMLElement,\n options: ToolbarNextFocusableOptions = {},\n) {\n return Array.from(\n itemRoot.querySelectorAll<HTMLElement>(toolbarNextFocusableSelector),\n ).filter((element) => {\n return (\n getClosestToolbarNextScopeRoot(element) === scopeRoot &&\n (isToolbarNextFocusable(element, options) ||\n isToolbarNextToggleGroupButton(element))\n );\n });\n}\n\nfunction getToolbarNextFocusableElementForItem(\n scopeRoot: HTMLElement,\n itemId: string,\n controlIndex: number,\n options: ToolbarNextFocusableOptions = {},\n) {\n const itemRoot = scopeRoot.querySelector<HTMLElement>(\n `[${TOOLBAR_NEXT_ITEM_ATTR}=\"${itemId}\"]`,\n );\n\n if (!itemRoot) {\n return null;\n }\n\n const itemElements = getToolbarNextItemFocusableElements(\n itemRoot,\n scopeRoot,\n options,\n );\n\n return (\n itemElements[Math.min(controlIndex, itemElements.length - 1)] ??\n itemElements[0] ??\n null\n );\n}\n\nfunction getToolbarNextOverflowTriggerElement(\n scopeRoot: HTMLElement,\n groupKey: string,\n) {\n return scopeRoot.querySelector<HTMLElement>(\n `[${TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR}][${TOOLBAR_NEXT_GROUP_KEY_ATTR}=\"${groupKey}\"]`,\n );\n}\n\nfunction getToolbarNextFocusFallback(\n scopeRoot: HTMLElement,\n rememberedIndex: number,\n options: ToolbarNextFocusableOptions = {},\n) {\n const focusableElements = getToolbarNextScopeFocusableElements(\n scopeRoot,\n options,\n );\n\n if (focusableElements.length === 0) {\n return null;\n }\n\n return (\n focusableElements[\n Math.max(0, Math.min(rememberedIndex, focusableElements.length - 1))\n ] ?? focusableElements[0]\n );\n}\n\nfunction getVisualDelta(scopeRoot: HTMLElement, key: string) {\n const direction =\n scopeRoot.ownerDocument.defaultView?.getComputedStyle(scopeRoot).direction;\n\n if (key === \"ArrowRight\") {\n return direction === \"rtl\" ? -1 : 1;\n }\n\n return direction === \"rtl\" ? 1 : -1;\n}\n\nfunction isToggleGroupBoundary(\n currentIndex: number,\n length: number,\n visualDelta: number,\n) {\n if (visualDelta > 0) {\n return currentIndex === length - 1;\n }\n\n return currentIndex === 0;\n}\n\nfunction getToggleGroupButtons(target: HTMLElement) {\n const toggleGroup = target.closest<HTMLElement>(\".saltToggleButtonGroup\");\n\n if (!toggleGroup || target.tagName !== \"BUTTON\") {\n return [];\n }\n\n return Array.from(toggleGroup.querySelectorAll<HTMLElement>(\"button\")).filter(\n (button) =>\n isToolbarNextFocusable(button, { includeTabIndexMinusOne: true }),\n );\n}\n\nfunction isToolbarNextToggleGroupButton(target: HTMLElement) {\n return (\n target.tagName === \"BUTTON\" &&\n target.closest(\".saltToggleButtonGroup\") != null &&\n isToolbarNextFocusable(target, { includeTabIndexMinusOne: true })\n );\n}\n\nfunction getToolbarNextKeyboardPolicy(\n target: HTMLElement,\n): ToolbarNextKeyboardPolicy {\n if (\n target.isContentEditable ||\n isPlainTextInput(target) ||\n isComboBoxInput(target) ||\n isPillInputPill(target)\n ) {\n return {\n preserveHorizontalArrows: true,\n preserveNativeTab: true,\n };\n }\n\n if (isDropdownControl(target)) {\n return {\n preserveHorizontalArrows: false,\n preserveNativeTab: false,\n };\n }\n\n if (\n isSelectLikeControl(target) ||\n target.closest(\".saltDatePickerTrigger\") != null\n ) {\n return {\n preserveHorizontalArrows: false,\n preserveNativeTab: true,\n };\n }\n\n return {\n preserveHorizontalArrows: false,\n preserveNativeTab: false,\n };\n}\n\nfunction isComboBoxInput(target: HTMLElement) {\n return (\n target.tagName === \"INPUT\" &&\n target.closest('[role=\"combobox\"], .saltComboBox') != null\n );\n}\n\nfunction isPillInputPill(target: HTMLElement) {\n return (\n target.tagName === \"BUTTON\" &&\n target.classList.contains(\"saltPill\") &&\n target.closest(\".saltPillInput\") != null\n );\n}\n\nfunction isDropdownControl(target: HTMLElement) {\n return target.closest(\".saltDropdown\") != null;\n}\n\nfunction isSelectLikeControl(target: HTMLElement) {\n return (\n target.tagName === \"SELECT\" ||\n target.closest('[role=\"combobox\"], .saltComboBox, .saltDropdown') != null\n );\n}\n\nfunction isPlainTextInput(target: HTMLElement) {\n if (target.tagName === \"TEXTAREA\") {\n return true;\n }\n\n if (target.tagName !== \"INPUT\") {\n return false;\n }\n\n return textEntryInputTypes.has(\n (target as HTMLInputElement).type.toLowerCase(),\n );\n}\n\nfunction isNativeDisabledFormControl(target: HTMLElement) {\n return (\n \"disabled\" in target &&\n (target as HTMLButtonElement | HTMLInputElement).disabled\n );\n}\n\nexport function isToolbarNextFocusable(\n target: HTMLElement,\n { includeTabIndexMinusOne = false }: ToolbarNextFocusableOptions = {},\n) {\n if (isNativeDisabledFormControl(target)) {\n return false;\n }\n\n if (target.getAttribute(\"aria-hidden\") === \"true\") {\n return false;\n }\n\n if (!includeTabIndexMinusOne && target.getAttribute(\"tabindex\") === \"-1\") {\n return false;\n }\n\n if (target.hidden) {\n return false;\n }\n\n const win = target.ownerDocument.defaultView;\n\n if (!win) {\n return false;\n }\n\n const styles = win.getComputedStyle(target);\n\n if (styles.display === \"none\" || styles.visibility === \"hidden\") {\n return false;\n }\n\n return target.getClientRects().length > 0;\n}\n\n// Composite controls whose focus root (the element toolbar focus restore lands\n// on) differs from the inner element that handles keyboard interaction.\n// Restoring focus to the root would leave ArrowDown/Enter/Space targeting a\n// non-interactive wrapper, so we redirect to the interactive element\nconst toolbarNextFocusEntryOverrides = [\n { root: \".saltComboBox\", interactive: 'input[role=\"combobox\"]' },\n] as const;\n\nexport function focusToolbarNextElement(\n target: HTMLElement | null | undefined,\n) {\n const focusTarget = resolveToolbarNextFocusEntryTarget(target);\n\n if (focusTarget?.isConnected) {\n focusTarget.focus({ preventScroll: true });\n }\n}\n\nfunction resolveToolbarNextFocusEntryTarget(\n target: HTMLElement | null | undefined,\n) {\n if (!target) {\n return target;\n }\n\n for (const { root, interactive } of toolbarNextFocusEntryOverrides) {\n if (target.matches(root)) {\n return target.querySelector<HTMLElement>(interactive) ?? target;\n }\n }\n\n return target;\n}\n\nexport function scheduleToolbarNextFocus(\n target: HTMLElement | null | undefined,\n targetWindow = target?.ownerDocument.defaultView,\n) {\n if (!target) {\n return () => undefined;\n }\n\n if (targetWindow?.requestAnimationFrame) {\n const frame = targetWindow.requestAnimationFrame(() => {\n focusToolbarNextElement(target);\n });\n\n return () => {\n targetWindow.cancelAnimationFrame(frame);\n };\n }\n\n queueMicrotask(() => {\n focusToolbarNextElement(target);\n });\n\n return () => undefined;\n}\n\nexport function getDocumentFocusableElements(ownerDocument: Document) {\n return Array.from(\n ownerDocument.querySelectorAll<HTMLElement>(toolbarNextFocusableSelector),\n ).filter((element) => isToolbarNextFocusable(element));\n}\n"],"names":["currentIndex"],"mappings":"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"}
|
|
@@ -12,7 +12,6 @@ function useToolbarNextKeyboardNavigation({
|
|
|
12
12
|
const rememberedFocusRef = react.useRef(null);
|
|
13
13
|
const pointerDownTargetRef = react.useRef(null);
|
|
14
14
|
const restoringEntryFocusRef = react.useRef(false);
|
|
15
|
-
const restoreFrameRef = react.useRef(null);
|
|
16
15
|
const shouldPreserveItemMemoryForTrigger = react.useCallback(
|
|
17
16
|
(groupKey) => {
|
|
18
17
|
const rememberedFocus = rememberedFocusRef.current;
|
|
@@ -24,16 +23,6 @@ function useToolbarNextKeyboardNavigation({
|
|
|
24
23
|
},
|
|
25
24
|
[items, overflowedIds]
|
|
26
25
|
);
|
|
27
|
-
react.useEffect(() => {
|
|
28
|
-
return () => {
|
|
29
|
-
var _a;
|
|
30
|
-
const frame = restoreFrameRef.current;
|
|
31
|
-
const win = (_a = scopeRef.current) == null ? void 0 : _a.ownerDocument.defaultView;
|
|
32
|
-
if (frame != null && win) {
|
|
33
|
-
win.cancelAnimationFrame(frame);
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
}, [scopeRef]);
|
|
37
26
|
const rememberTarget = react.useCallback(
|
|
38
27
|
(target) => {
|
|
39
28
|
const scopeRoot = scopeRef.current;
|
|
@@ -111,20 +100,7 @@ function useToolbarNextKeyboardNavigation({
|
|
|
111
100
|
}, [includeTabIndexMinusOne, items, overflowedIds, scopeRef]);
|
|
112
101
|
const restoreEntryFocus = react.useCallback((target) => {
|
|
113
102
|
restoringEntryFocusRef.current = true;
|
|
114
|
-
|
|
115
|
-
restoreFrameRef.current = null;
|
|
116
|
-
toolbarNextKeyboardUtils.focusToolbarNextElement(target);
|
|
117
|
-
};
|
|
118
|
-
const win = target.ownerDocument.defaultView;
|
|
119
|
-
if (win == null ? void 0 : win.requestAnimationFrame) {
|
|
120
|
-
const currentFrame = restoreFrameRef.current;
|
|
121
|
-
if (currentFrame != null) {
|
|
122
|
-
win.cancelAnimationFrame(currentFrame);
|
|
123
|
-
}
|
|
124
|
-
restoreFrameRef.current = win.requestAnimationFrame(restoreFocus);
|
|
125
|
-
} else {
|
|
126
|
-
queueMicrotask(restoreFocus);
|
|
127
|
-
}
|
|
103
|
+
toolbarNextKeyboardUtils.focusToolbarNextElement(target);
|
|
128
104
|
}, []);
|
|
129
105
|
const handleScopeFocus = react.useCallback(
|
|
130
106
|
(event) => {
|
|
@@ -178,6 +154,7 @@ function useToolbarNextKeyboardNavigation({
|
|
|
178
154
|
}
|
|
179
155
|
);
|
|
180
156
|
if (restoreTarget2 && restoreTarget2 !== target) {
|
|
157
|
+
event.stopPropagation();
|
|
181
158
|
restoreEntryFocus(restoreTarget2);
|
|
182
159
|
return;
|
|
183
160
|
}
|
|
@@ -195,6 +172,7 @@ function useToolbarNextKeyboardNavigation({
|
|
|
195
172
|
}
|
|
196
173
|
);
|
|
197
174
|
if (restoreTarget && restoreTarget !== target) {
|
|
175
|
+
event.stopPropagation();
|
|
198
176
|
restoreEntryFocus(restoreTarget);
|
|
199
177
|
return;
|
|
200
178
|
}
|