@salt-ds/lab 1.0.0-alpha.93 → 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.
Files changed (226) hide show
  1. package/CHANGELOG.md +214 -0
  2. package/css/salt-lab.css +190 -143
  3. package/dist-cjs/index.js +12 -58
  4. package/dist-cjs/index.js.map +1 -1
  5. package/dist-cjs/mega-menu/MegaMenuGroup.js +2 -5
  6. package/dist-cjs/mega-menu/MegaMenuGroup.js.map +1 -1
  7. package/dist-cjs/mega-menu/MegaMenuGroups.css.js +6 -0
  8. package/dist-cjs/mega-menu/MegaMenuGroups.css.js.map +1 -0
  9. package/dist-cjs/mega-menu/{MegaMenuSection.js → MegaMenuGroups.js} +8 -8
  10. package/dist-cjs/mega-menu/MegaMenuGroups.js.map +1 -0
  11. package/dist-cjs/mega-menu/MegaMenuHeader.js +0 -1
  12. package/dist-cjs/mega-menu/MegaMenuHeader.js.map +1 -1
  13. package/dist-cjs/mega-menu/MegaMenuItem.css.js +1 -1
  14. package/dist-cjs/mega-menu/MegaMenuItem.js +6 -5
  15. package/dist-cjs/mega-menu/MegaMenuItem.js.map +1 -1
  16. package/dist-cjs/mega-menu/MegaMenuSupportingActions.css.js +6 -0
  17. package/dist-cjs/mega-menu/MegaMenuSupportingActions.css.js.map +1 -0
  18. package/dist-cjs/mega-menu/MegaMenuSupportingActions.js +31 -0
  19. package/dist-cjs/mega-menu/MegaMenuSupportingActions.js.map +1 -0
  20. package/dist-cjs/mega-menu/MegaMenuSupportingContent.css.js +6 -0
  21. package/dist-cjs/mega-menu/MegaMenuSupportingContent.css.js.map +1 -0
  22. package/dist-cjs/mega-menu/MegaMenuSupportingContent.js +31 -0
  23. package/dist-cjs/mega-menu/MegaMenuSupportingContent.js.map +1 -0
  24. package/dist-cjs/mega-menu/useMegaMenuKeyboard.js +2 -2
  25. package/dist-cjs/mega-menu/useMegaMenuKeyboard.js.map +1 -1
  26. package/dist-cjs/toolbar-next/ToolbarContentNext.css.js +6 -0
  27. package/dist-cjs/toolbar-next/ToolbarContentNext.css.js.map +1 -0
  28. package/dist-cjs/toolbar-next/ToolbarContentNext.js +32 -0
  29. package/dist-cjs/toolbar-next/ToolbarContentNext.js.map +1 -0
  30. package/dist-cjs/toolbar-next/ToolbarNext.css.js +6 -0
  31. package/dist-cjs/toolbar-next/ToolbarNext.css.js.map +1 -0
  32. package/dist-cjs/toolbar-next/ToolbarNext.js +394 -0
  33. package/dist-cjs/toolbar-next/ToolbarNext.js.map +1 -0
  34. package/dist-cjs/toolbar-next/ToolbarNextOverflow.css.js +6 -0
  35. package/dist-cjs/toolbar-next/ToolbarNextOverflow.css.js.map +1 -0
  36. package/dist-cjs/toolbar-next/ToolbarNextOverflow.js +706 -0
  37. package/dist-cjs/toolbar-next/ToolbarNextOverflow.js.map +1 -0
  38. package/dist-cjs/toolbar-next/ToolbarNextOverflowFloatingBoundary.js +165 -0
  39. package/dist-cjs/toolbar-next/ToolbarNextOverflowFloatingBoundary.js.map +1 -0
  40. package/dist-cjs/toolbar-next/TooltrayNext.css.js +6 -0
  41. package/dist-cjs/toolbar-next/TooltrayNext.css.js.map +1 -0
  42. package/dist-cjs/toolbar-next/TooltrayNext.js +55 -0
  43. package/dist-cjs/toolbar-next/TooltrayNext.js.map +1 -0
  44. package/dist-cjs/toolbar-next/toolbarNextKeyboardUtils.js +409 -0
  45. package/dist-cjs/toolbar-next/toolbarNextKeyboardUtils.js.map +1 -0
  46. package/dist-cjs/toolbar-next/toolbarNextUtils.js +215 -0
  47. package/dist-cjs/toolbar-next/toolbarNextUtils.js.map +1 -0
  48. package/dist-cjs/toolbar-next/useToolbarNextKeyboardNavigation.js +312 -0
  49. package/dist-cjs/toolbar-next/useToolbarNextKeyboardNavigation.js.map +1 -0
  50. package/dist-cjs/toolbar-next/useToolbarNextOverflow.js +743 -0
  51. package/dist-cjs/toolbar-next/useToolbarNextOverflow.js.map +1 -0
  52. package/dist-es/index.js +6 -12
  53. package/dist-es/index.js.map +1 -1
  54. package/dist-es/mega-menu/MegaMenuGroup.js +2 -5
  55. package/dist-es/mega-menu/MegaMenuGroup.js.map +1 -1
  56. package/dist-es/mega-menu/MegaMenuGroups.css.js +4 -0
  57. package/dist-es/mega-menu/MegaMenuGroups.css.js.map +1 -0
  58. package/dist-es/mega-menu/{MegaMenuSection.js → MegaMenuGroups.js} +7 -7
  59. package/dist-es/mega-menu/MegaMenuGroups.js.map +1 -0
  60. package/dist-es/mega-menu/MegaMenuHeader.js +0 -1
  61. package/dist-es/mega-menu/MegaMenuHeader.js.map +1 -1
  62. package/dist-es/mega-menu/MegaMenuItem.css.js +1 -1
  63. package/dist-es/mega-menu/MegaMenuItem.js +7 -6
  64. package/dist-es/mega-menu/MegaMenuItem.js.map +1 -1
  65. package/dist-es/mega-menu/MegaMenuSupportingActions.css.js +4 -0
  66. package/dist-es/mega-menu/MegaMenuSupportingActions.css.js.map +1 -0
  67. package/dist-es/mega-menu/MegaMenuSupportingActions.js +29 -0
  68. package/dist-es/mega-menu/MegaMenuSupportingActions.js.map +1 -0
  69. package/dist-es/mega-menu/MegaMenuSupportingContent.css.js +4 -0
  70. package/dist-es/mega-menu/MegaMenuSupportingContent.css.js.map +1 -0
  71. package/dist-es/mega-menu/MegaMenuSupportingContent.js +29 -0
  72. package/dist-es/mega-menu/MegaMenuSupportingContent.js.map +1 -0
  73. package/dist-es/mega-menu/useMegaMenuKeyboard.js +2 -2
  74. package/dist-es/mega-menu/useMegaMenuKeyboard.js.map +1 -1
  75. package/dist-es/toolbar-next/ToolbarContentNext.css.js +4 -0
  76. package/dist-es/toolbar-next/ToolbarContentNext.css.js.map +1 -0
  77. package/dist-es/toolbar-next/ToolbarContentNext.js +30 -0
  78. package/dist-es/toolbar-next/ToolbarContentNext.js.map +1 -0
  79. package/dist-es/toolbar-next/ToolbarNext.css.js +4 -0
  80. package/dist-es/toolbar-next/ToolbarNext.css.js.map +1 -0
  81. package/dist-es/toolbar-next/ToolbarNext.js +392 -0
  82. package/dist-es/toolbar-next/ToolbarNext.js.map +1 -0
  83. package/dist-es/toolbar-next/ToolbarNextOverflow.css.js +4 -0
  84. package/dist-es/toolbar-next/ToolbarNextOverflow.css.js.map +1 -0
  85. package/dist-es/toolbar-next/ToolbarNextOverflow.js +701 -0
  86. package/dist-es/toolbar-next/ToolbarNextOverflow.js.map +1 -0
  87. package/dist-es/toolbar-next/ToolbarNextOverflowFloatingBoundary.js +159 -0
  88. package/dist-es/toolbar-next/ToolbarNextOverflowFloatingBoundary.js.map +1 -0
  89. package/dist-es/toolbar-next/TooltrayNext.css.js +4 -0
  90. package/dist-es/toolbar-next/TooltrayNext.css.js.map +1 -0
  91. package/dist-es/toolbar-next/TooltrayNext.js +53 -0
  92. package/dist-es/toolbar-next/TooltrayNext.js.map +1 -0
  93. package/dist-es/toolbar-next/toolbarNextKeyboardUtils.js +390 -0
  94. package/dist-es/toolbar-next/toolbarNextKeyboardUtils.js.map +1 -0
  95. package/dist-es/toolbar-next/toolbarNextUtils.js +211 -0
  96. package/dist-es/toolbar-next/toolbarNextUtils.js.map +1 -0
  97. package/dist-es/toolbar-next/useToolbarNextKeyboardNavigation.js +310 -0
  98. package/dist-es/toolbar-next/useToolbarNextKeyboardNavigation.js.map +1 -0
  99. package/dist-es/toolbar-next/useToolbarNextOverflow.js +741 -0
  100. package/dist-es/toolbar-next/useToolbarNextOverflow.js.map +1 -0
  101. package/dist-types/index.d.ts +1 -5
  102. package/dist-types/mega-menu/MegaMenuGroups.d.ts +8 -0
  103. package/dist-types/mega-menu/MegaMenuItem.d.ts +3 -2
  104. package/dist-types/mega-menu/MegaMenuSupportingActions.d.ts +8 -0
  105. package/dist-types/mega-menu/MegaMenuSupportingContent.d.ts +8 -0
  106. package/dist-types/mega-menu/index.d.ts +3 -3
  107. package/dist-types/toolbar-next/ToolbarContentNext.d.ts +11 -0
  108. package/dist-types/toolbar-next/ToolbarNext.d.ts +12 -0
  109. package/dist-types/toolbar-next/ToolbarNextOverflow.d.ts +34 -0
  110. package/dist-types/toolbar-next/ToolbarNextOverflowFloatingBoundary.d.ts +16 -0
  111. package/dist-types/toolbar-next/TooltrayNext.d.ts +37 -0
  112. package/dist-types/toolbar-next/index.d.ts +3 -0
  113. package/dist-types/toolbar-next/toolbarNextKeyboardUtils.d.ts +39 -0
  114. package/dist-types/toolbar-next/toolbarNextUtils.d.ts +42 -0
  115. package/dist-types/toolbar-next/useToolbarNextKeyboardNavigation.d.ts +42 -0
  116. package/dist-types/toolbar-next/useToolbarNextOverflow.d.ts +37 -0
  117. package/package.json +2 -4
  118. package/dist-cjs/calendar/index.js +0 -61
  119. package/dist-cjs/calendar/index.js.map +0 -1
  120. package/dist-cjs/date-input/index.js +0 -23
  121. package/dist-cjs/date-input/index.js.map +0 -1
  122. package/dist-cjs/date-picker/index.js +0 -106
  123. package/dist-cjs/date-picker/index.js.map +0 -1
  124. package/dist-cjs/localization-provider/index.js +0 -26
  125. package/dist-cjs/localization-provider/index.js.map +0 -1
  126. package/dist-cjs/mega-menu/MegaMenuContent.css.js +0 -6
  127. package/dist-cjs/mega-menu/MegaMenuContent.css.js.map +0 -1
  128. package/dist-cjs/mega-menu/MegaMenuContent.js +0 -33
  129. package/dist-cjs/mega-menu/MegaMenuContent.js.map +0 -1
  130. package/dist-cjs/mega-menu/MegaMenuItemContent.css.js +0 -6
  131. package/dist-cjs/mega-menu/MegaMenuItemContent.css.js.map +0 -1
  132. package/dist-cjs/mega-menu/MegaMenuItemContent.js +0 -23
  133. package/dist-cjs/mega-menu/MegaMenuItemContent.js.map +0 -1
  134. package/dist-cjs/mega-menu/MegaMenuSection.css.js +0 -6
  135. package/dist-cjs/mega-menu/MegaMenuSection.css.js.map +0 -1
  136. package/dist-cjs/mega-menu/MegaMenuSection.js.map +0 -1
  137. package/dist-cjs/tree/Tree.css.js +0 -6
  138. package/dist-cjs/tree/Tree.css.js.map +0 -1
  139. package/dist-cjs/tree/Tree.js +0 -303
  140. package/dist-cjs/tree/Tree.js.map +0 -1
  141. package/dist-cjs/tree/TreeContext.js +0 -31
  142. package/dist-cjs/tree/TreeContext.js.map +0 -1
  143. package/dist-cjs/tree/TreeNode.css.js +0 -6
  144. package/dist-cjs/tree/TreeNode.css.js.map +0 -1
  145. package/dist-cjs/tree/TreeNode.js +0 -103
  146. package/dist-cjs/tree/TreeNode.js.map +0 -1
  147. package/dist-cjs/tree/TreeNodeExpansionIcon.css.js +0 -6
  148. package/dist-cjs/tree/TreeNodeExpansionIcon.css.js.map +0 -1
  149. package/dist-cjs/tree/TreeNodeExpansionIcon.js +0 -62
  150. package/dist-cjs/tree/TreeNodeExpansionIcon.js.map +0 -1
  151. package/dist-cjs/tree/TreeNodeLabel.css.js +0 -6
  152. package/dist-cjs/tree/TreeNodeLabel.css.js.map +0 -1
  153. package/dist-cjs/tree/TreeNodeLabel.js +0 -26
  154. package/dist-cjs/tree/TreeNodeLabel.js.map +0 -1
  155. package/dist-cjs/tree/TreeNodeTrigger.css.js +0 -6
  156. package/dist-cjs/tree/TreeNodeTrigger.css.js.map +0 -1
  157. package/dist-cjs/tree/TreeNodeTrigger.js +0 -153
  158. package/dist-cjs/tree/TreeNodeTrigger.js.map +0 -1
  159. package/dist-cjs/tree/treeModel.js +0 -61
  160. package/dist-cjs/tree/treeModel.js.map +0 -1
  161. package/dist-cjs/tree/useTree.js +0 -337
  162. package/dist-cjs/tree/useTree.js.map +0 -1
  163. package/dist-cjs/utils/deprecatedExport.js +0 -30
  164. package/dist-cjs/utils/deprecatedExport.js.map +0 -1
  165. package/dist-es/calendar/index.js +0 -50
  166. package/dist-es/calendar/index.js.map +0 -1
  167. package/dist-es/date-input/index.js +0 -20
  168. package/dist-es/date-input/index.js.map +0 -1
  169. package/dist-es/date-picker/index.js +0 -85
  170. package/dist-es/date-picker/index.js.map +0 -1
  171. package/dist-es/localization-provider/index.js +0 -20
  172. package/dist-es/localization-provider/index.js.map +0 -1
  173. package/dist-es/mega-menu/MegaMenuContent.css.js +0 -4
  174. package/dist-es/mega-menu/MegaMenuContent.css.js.map +0 -1
  175. package/dist-es/mega-menu/MegaMenuContent.js +0 -31
  176. package/dist-es/mega-menu/MegaMenuContent.js.map +0 -1
  177. package/dist-es/mega-menu/MegaMenuItemContent.css.js +0 -4
  178. package/dist-es/mega-menu/MegaMenuItemContent.css.js.map +0 -1
  179. package/dist-es/mega-menu/MegaMenuItemContent.js +0 -21
  180. package/dist-es/mega-menu/MegaMenuItemContent.js.map +0 -1
  181. package/dist-es/mega-menu/MegaMenuSection.css.js +0 -4
  182. package/dist-es/mega-menu/MegaMenuSection.css.js.map +0 -1
  183. package/dist-es/mega-menu/MegaMenuSection.js.map +0 -1
  184. package/dist-es/tree/Tree.css.js +0 -4
  185. package/dist-es/tree/Tree.css.js.map +0 -1
  186. package/dist-es/tree/Tree.js +0 -301
  187. package/dist-es/tree/Tree.js.map +0 -1
  188. package/dist-es/tree/TreeContext.js +0 -26
  189. package/dist-es/tree/TreeContext.js.map +0 -1
  190. package/dist-es/tree/TreeNode.css.js +0 -4
  191. package/dist-es/tree/TreeNode.css.js.map +0 -1
  192. package/dist-es/tree/TreeNode.js +0 -101
  193. package/dist-es/tree/TreeNode.js.map +0 -1
  194. package/dist-es/tree/TreeNodeExpansionIcon.css.js +0 -4
  195. package/dist-es/tree/TreeNodeExpansionIcon.css.js.map +0 -1
  196. package/dist-es/tree/TreeNodeExpansionIcon.js +0 -60
  197. package/dist-es/tree/TreeNodeExpansionIcon.js.map +0 -1
  198. package/dist-es/tree/TreeNodeLabel.css.js +0 -4
  199. package/dist-es/tree/TreeNodeLabel.css.js.map +0 -1
  200. package/dist-es/tree/TreeNodeLabel.js +0 -24
  201. package/dist-es/tree/TreeNodeLabel.js.map +0 -1
  202. package/dist-es/tree/TreeNodeTrigger.css.js +0 -4
  203. package/dist-es/tree/TreeNodeTrigger.css.js.map +0 -1
  204. package/dist-es/tree/TreeNodeTrigger.js +0 -151
  205. package/dist-es/tree/TreeNodeTrigger.js.map +0 -1
  206. package/dist-es/tree/treeModel.js +0 -57
  207. package/dist-es/tree/treeModel.js.map +0 -1
  208. package/dist-es/tree/useTree.js +0 -335
  209. package/dist-es/tree/useTree.js.map +0 -1
  210. package/dist-es/utils/deprecatedExport.js +0 -27
  211. package/dist-es/utils/deprecatedExport.js.map +0 -1
  212. package/dist-types/calendar/index.d.ts +0 -13
  213. package/dist-types/date-input/index.d.ts +0 -3
  214. package/dist-types/localization-provider/index.d.ts +0 -9
  215. package/dist-types/mega-menu/MegaMenuContent.d.ts +0 -8
  216. package/dist-types/mega-menu/MegaMenuItemContent.d.ts +0 -8
  217. package/dist-types/mega-menu/MegaMenuSection.d.ts +0 -8
  218. package/dist-types/tree/Tree.d.ts +0 -36
  219. package/dist-types/tree/TreeContext.d.ts +0 -77
  220. package/dist-types/tree/TreeNode.d.ts +0 -25
  221. package/dist-types/tree/TreeNodeExpansionIcon.d.ts +0 -4
  222. package/dist-types/tree/TreeNodeLabel.d.ts +0 -4
  223. package/dist-types/tree/TreeNodeTrigger.d.ts +0 -8
  224. package/dist-types/tree/index.d.ts +0 -4
  225. package/dist-types/tree/treeModel.d.ts +0 -24
  226. package/dist-types/tree/useTree.d.ts +0 -68
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbarNextUtils.js","sources":["../src/toolbar-next/toolbarNextUtils.ts"],"sourcesContent":["import { Divider, getRefFromChildren } from \"@salt-ds/core\";\nimport {\n Children,\n Fragment,\n isValidElement,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from \"react\";\n\nimport {\n ToolbarContentNext,\n type ToolbarContentNextPosition,\n type ToolbarContentNextProps,\n} from \"./ToolbarContentNext\";\nimport {\n TooltrayNext,\n type TooltrayNextOverflowMode,\n type TooltrayNextProps,\n} from \"./TooltrayNext\";\n\nexport type ToolbarNextMode = \"explicit\" | \"flat\" | \"invalid\";\n\ntype ToolbarNextChild = Exclude<ReactNode, boolean | null | undefined>;\n\nexport interface ToolbarNextOverflowItem {\n align: NonNullable<TooltrayNextProps[\"align\"]>;\n element: ReactElement<TooltrayNextProps>;\n id: string;\n leadingDecorations: ReactElement[];\n order: number;\n overflowGroup: string;\n overflowGroupKey: string;\n overflowLabel?: string;\n overflowMode: TooltrayNextOverflowMode;\n overflowPriority: number;\n contentKey: string;\n trailingDecorations: ReactElement[];\n}\n\nexport interface ToolbarNextOverflowRenderSlot {\n item: ToolbarNextOverflowItem;\n overflowed: boolean;\n showLeadingDecorations: boolean;\n showTrailingDecorations: boolean;\n triggerGroupKey?: string;\n}\n\nexport interface ToolbarNextContentModel {\n implicit: boolean;\n items: ToolbarNextOverflowItem[];\n key: string;\n position: ToolbarContentNextPosition;\n props: Omit<ToolbarContentNextProps, \"children\" | \"position\">;\n ref: Ref<HTMLDivElement> | null;\n}\n\nexport interface ToolbarNextModel {\n mode: ToolbarNextMode;\n content: ToolbarNextContentModel[];\n}\n\nexport function buildContentOverflowRenderSlots(\n items: ToolbarNextOverflowItem[],\n overflowedIds: Set<string>,\n activeNamedGroupKeys: Set<string>,\n) {\n const triggerGroupByItemId = new Map<string, string>();\n\n for (const groupKey of activeNamedGroupKeys) {\n const anchorItem = items.find((item) => {\n return overflowedIds.has(item.id) && item.overflowGroupKey === groupKey;\n });\n\n if (anchorItem) {\n triggerGroupByItemId.set(anchorItem.id, groupKey);\n }\n }\n\n const slots: ToolbarNextOverflowRenderSlot[] = [];\n let hasSurvivingPredecessor = false;\n\n for (const item of items) {\n const overflowed = overflowedIds.has(item.id);\n const triggerGroupKey = triggerGroupByItemId.get(item.id);\n const survives = !overflowed || triggerGroupKey != null;\n\n if (overflowed && !triggerGroupKey) {\n continue;\n }\n\n slots.push({\n item,\n overflowed,\n showLeadingDecorations:\n item.leadingDecorations.length > 0 &&\n hasSurvivingPredecessor &&\n survives,\n showTrailingDecorations:\n !overflowed && item.trailingDecorations.length > 0,\n triggerGroupKey,\n });\n\n if (survives) {\n hasSurvivingPredecessor = true;\n }\n }\n\n return slots;\n}\n\nexport function flattenToolbarChildren(\n children: ReactNode,\n): ToolbarNextChild[] {\n const flattened: ToolbarNextChild[] = [];\n\n Children.forEach(children, (child) => {\n if (child == null || typeof child === \"boolean\") {\n return;\n }\n\n if (isValidElement(child) && child.type === Fragment) {\n flattened.push(...flattenToolbarChildren(child.props.children));\n return;\n }\n\n flattened.push(child);\n });\n\n return flattened;\n}\n\nfunction isToolbarContentNextElement(\n child: ToolbarNextChild,\n): child is ReactElement<ToolbarContentNextProps> {\n return isValidElement(child) && child.type === ToolbarContentNext;\n}\n\nfunction isTooltrayElement(\n child: ToolbarNextChild,\n): child is ReactElement<TooltrayNextProps> {\n return isValidElement(child) && child.type === TooltrayNext;\n}\n\nfunction isDividerElement(child: ToolbarNextChild): child is ReactElement {\n return isValidElement(child) && child.type === Divider;\n}\n\nfunction buildItemId(\n contentKey: string,\n element: ReactElement<TooltrayNextProps>,\n order: number,\n) {\n const elementKey =\n element.key != null ? String(element.key) : `tray-${order}`;\n return `${contentKey}-${elementKey}-${order}`;\n}\n\nfunction buildOverflowGroupKey(contentKey: string, overflowGroup: string) {\n return overflowGroup === \"shared\"\n ? \"shared\"\n : `${contentKey}:${overflowGroup}`;\n}\n\nfunction normalizeContentItems(\n children: ReactNode,\n contentKey: string,\n): ToolbarNextOverflowItem[] | null {\n const flattenedChildren = flattenToolbarChildren(children);\n const items: ToolbarNextOverflowItem[] = [];\n let pendingLeadingDecorations: ReactElement[] = [];\n\n for (const child of flattenedChildren) {\n if (isDividerElement(child)) {\n pendingLeadingDecorations.push(child);\n continue;\n }\n\n if (!isTooltrayElement(child)) {\n return null;\n }\n\n const {\n align = \"start\",\n overflowGroup = \"shared\",\n overflowLabel,\n overflowMode = \"independent\",\n overflowPriority = 0,\n } = child.props;\n const order = items.length;\n\n items.push({\n align,\n element: child,\n id: buildItemId(contentKey, child, order),\n leadingDecorations: pendingLeadingDecorations,\n order,\n overflowGroup,\n overflowGroupKey: buildOverflowGroupKey(contentKey, overflowGroup),\n overflowLabel,\n overflowMode,\n overflowPriority,\n contentKey,\n trailingDecorations: [],\n });\n\n pendingLeadingDecorations = [];\n }\n\n if (pendingLeadingDecorations.length > 0 && items.length > 0) {\n items[items.length - 1]?.trailingDecorations.push(\n ...pendingLeadingDecorations,\n );\n }\n\n return items;\n}\n\nfunction normalizeExplicitContent(\n children: ToolbarNextChild[],\n): ToolbarNextContentModel[] | null {\n const content: ToolbarNextContentModel[] = [];\n\n for (const [index, child] of children.entries()) {\n if (!isToolbarContentNextElement(child)) {\n continue;\n }\n\n const {\n children: contentChildren,\n position,\n ...contentProps\n } = child.props;\n const contentKey =\n child.key != null ? String(child.key) : `${position}-content-${index}`;\n const items = normalizeContentItems(contentChildren, contentKey);\n\n if (items == null) {\n return null;\n }\n\n content.push({\n implicit: false,\n items,\n key: contentKey,\n position,\n props: contentProps,\n ref: getRefFromChildren(child),\n });\n }\n\n return content;\n}\n\nfunction normalizeFlatChildren(children: ToolbarNextChild[]) {\n const buckets: Record<ToolbarContentNextPosition, ToolbarNextChild[]> = {\n start: [],\n center: [],\n end: [],\n };\n let currentPosition: ToolbarContentNextPosition = \"start\";\n\n for (const child of children) {\n if (isTooltrayElement(child)) {\n currentPosition = child.props.align ?? \"start\";\n buckets[currentPosition].push(child);\n continue;\n }\n\n if (isDividerElement(child)) {\n buckets[currentPosition].push(child);\n continue;\n }\n\n return null;\n }\n\n return (Object.keys(buckets) as ToolbarContentNextPosition[]).reduce<\n ToolbarNextContentModel[]\n >((content, position) => {\n const contentKey = `${position}-implicit`;\n const contentItems = normalizeContentItems(buckets[position], contentKey);\n\n if (contentItems == null || contentItems.length === 0) {\n return content;\n }\n\n content.push({\n implicit: true,\n items: contentItems,\n key: contentKey,\n position,\n props: {},\n ref: null,\n });\n\n return content;\n }, []);\n}\n\nexport function normalizeToolbarChildren(\n children: ReactNode,\n): ToolbarNextModel {\n const flattenedChildren = flattenToolbarChildren(children);\n const hasContentChildren = flattenedChildren.some(\n isToolbarContentNextElement,\n );\n const hasOnlyContent =\n hasContentChildren && flattenedChildren.every(isToolbarContentNextElement);\n const hasOnlyFlatChildren = flattenedChildren.every(\n (child) => isTooltrayElement(child) || isDividerElement(child),\n );\n\n if (hasOnlyContent) {\n const content = normalizeExplicitContent(flattenedChildren);\n\n if (content == null) {\n return { mode: \"invalid\", content: [] };\n }\n\n return {\n mode: \"explicit\",\n content,\n };\n }\n\n if (hasOnlyFlatChildren) {\n const content = normalizeFlatChildren(flattenedChildren);\n\n if (content == null) {\n return { mode: \"invalid\", content: [] };\n }\n\n return {\n mode: \"flat\",\n content,\n };\n }\n\n return {\n mode: \"invalid\",\n content: [],\n };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,310 @@
1
+ import { useRef, useCallback } from 'react';
2
+ import { getToolbarNextFocusMemory, getToolbarNextScopeFocusableElements, TOOLBAR_NEXT_ITEM_ATTR, TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR, TOOLBAR_NEXT_GROUP_KEY_ATTR, resolveToolbarNextFocusTarget, focusToolbarNextElement, getClosestToolbarNextScopeRoot, isToolbarNextFocusFromPointerTarget, TOOLBAR_NEXT_SCOPE_ROOT_ATTR, shouldToolbarNextPreserveNativeTab, getToolbarNextTabMoveTarget, getToolbarNextDirectionalMoveTarget } from './toolbarNextKeyboardUtils.js';
3
+
4
+ function useToolbarNextKeyboardNavigation({
5
+ includeTabIndexMinusOne = false,
6
+ items = [],
7
+ overflowedIds,
8
+ scopeRef
9
+ }) {
10
+ const rememberedFocusRef = useRef(null);
11
+ const pointerDownTargetRef = useRef(null);
12
+ const restoringEntryFocusRef = useRef(false);
13
+ const shouldPreserveItemMemoryForTrigger = useCallback(
14
+ (groupKey) => {
15
+ const rememberedFocus = rememberedFocusRef.current;
16
+ if ((rememberedFocus == null ? void 0 : rememberedFocus.type) !== "item") {
17
+ return false;
18
+ }
19
+ const item = items.find((entry) => entry.id === rememberedFocus.itemId);
20
+ return (item == null ? void 0 : item.overflowGroupKey) === groupKey && (overflowedIds == null || overflowedIds.has(item.id));
21
+ },
22
+ [items, overflowedIds]
23
+ );
24
+ const rememberTarget = useCallback(
25
+ (target) => {
26
+ const scopeRoot = scopeRef.current;
27
+ if (!scopeRoot) {
28
+ return;
29
+ }
30
+ const focusMemory = getToolbarNextFocusMemory(scopeRoot, target, {
31
+ includeTabIndexMinusOne
32
+ });
33
+ if (focusMemory) {
34
+ if (focusMemory.type === "overflow-trigger" && shouldPreserveItemMemoryForTrigger(focusMemory.groupKey)) {
35
+ return;
36
+ }
37
+ rememberedFocusRef.current = focusMemory;
38
+ }
39
+ },
40
+ [includeTabIndexMinusOne, scopeRef, shouldPreserveItemMemoryForTrigger]
41
+ );
42
+ const rememberItemFocus = useCallback(
43
+ (itemId, controlIndex) => {
44
+ var _a;
45
+ const scopeRoot = scopeRef.current;
46
+ if (!scopeRoot) {
47
+ return;
48
+ }
49
+ const focusables = getToolbarNextScopeFocusableElements(scopeRoot, {
50
+ includeTabIndexMinusOne
51
+ });
52
+ const itemFocusables = focusables.filter((element) => {
53
+ var _a2;
54
+ return ((_a2 = element.closest(`[${TOOLBAR_NEXT_ITEM_ATTR}]`)) == null ? void 0 : _a2.getAttribute(TOOLBAR_NEXT_ITEM_ATTR)) === itemId;
55
+ });
56
+ const item = items.find((entry) => entry.id === itemId);
57
+ const visibleItemTarget = itemFocusables[Math.min(controlIndex, itemFocusables.length - 1)] ?? itemFocusables[0];
58
+ const overflowTriggerTarget = item ? focusables.find((element) => {
59
+ const trigger = element.closest(
60
+ `[${TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR}]`
61
+ );
62
+ return (trigger == null ? void 0 : trigger.getAttribute(TOOLBAR_NEXT_GROUP_KEY_ATTR)) === item.overflowGroupKey;
63
+ }) : void 0;
64
+ const scopeIndex = Math.max(
65
+ focusables.indexOf(visibleItemTarget ?? overflowTriggerTarget),
66
+ ((_a = rememberedFocusRef.current) == null ? void 0 : _a.scopeIndex) ?? 0
67
+ );
68
+ const focusMemory = {
69
+ controlIndex,
70
+ itemId,
71
+ scopeIndex,
72
+ type: "item"
73
+ };
74
+ rememberedFocusRef.current = focusMemory;
75
+ },
76
+ [includeTabIndexMinusOne, items, scopeRef]
77
+ );
78
+ const focusEntryTarget = useCallback(() => {
79
+ const scopeRoot = scopeRef.current;
80
+ if (!scopeRoot) {
81
+ return;
82
+ }
83
+ const target = resolveToolbarNextFocusTarget(
84
+ scopeRoot,
85
+ rememberedFocusRef.current,
86
+ {
87
+ items,
88
+ includeTabIndexMinusOne,
89
+ overflowedIds
90
+ }
91
+ );
92
+ if (!target) {
93
+ return;
94
+ }
95
+ queueMicrotask(() => {
96
+ focusToolbarNextElement(target);
97
+ });
98
+ }, [includeTabIndexMinusOne, items, overflowedIds, scopeRef]);
99
+ const restoreEntryFocus = useCallback((target) => {
100
+ restoringEntryFocusRef.current = true;
101
+ focusToolbarNextElement(target);
102
+ }, []);
103
+ const handleScopeFocus = useCallback(
104
+ (event) => {
105
+ var _a;
106
+ const scopeRoot = scopeRef.current;
107
+ const target = event.target;
108
+ if (!scopeRoot || !(target instanceof HTMLElement) || getClosestToolbarNextScopeRoot(target) !== scopeRoot) {
109
+ return;
110
+ }
111
+ if (restoringEntryFocusRef.current) {
112
+ restoringEntryFocusRef.current = false;
113
+ pointerDownTargetRef.current = null;
114
+ rememberTarget(target);
115
+ return;
116
+ }
117
+ const relatedTarget = event.relatedTarget;
118
+ const enteringFromOutside = !(relatedTarget instanceof HTMLElement) || getClosestToolbarNextScopeRoot(relatedTarget) !== scopeRoot;
119
+ if (!enteringFromOutside) {
120
+ pointerDownTargetRef.current = null;
121
+ rememberTarget(target);
122
+ return;
123
+ }
124
+ const targetMemory = getToolbarNextFocusMemory(scopeRoot, target, {
125
+ includeTabIndexMinusOne
126
+ });
127
+ const pointerDownTarget = pointerDownTargetRef.current;
128
+ pointerDownTargetRef.current = null;
129
+ const focusFromPointerTarget = isToolbarNextFocusFromPointerTarget(
130
+ target,
131
+ pointerDownTarget
132
+ );
133
+ if (focusFromPointerTarget) {
134
+ rememberTarget(target);
135
+ return;
136
+ }
137
+ if ((targetMemory == null ? void 0 : targetMemory.type) === "overflow-trigger") {
138
+ const shouldPreserve = shouldPreserveItemMemoryForTrigger(
139
+ targetMemory.groupKey
140
+ );
141
+ if (shouldPreserve) {
142
+ return;
143
+ }
144
+ if (((_a = rememberedFocusRef.current) == null ? void 0 : _a.type) === "item") {
145
+ const restoreTarget2 = resolveToolbarNextFocusTarget(
146
+ scopeRoot,
147
+ rememberedFocusRef.current,
148
+ {
149
+ items,
150
+ includeTabIndexMinusOne,
151
+ overflowedIds
152
+ }
153
+ );
154
+ if (restoreTarget2 && restoreTarget2 !== target) {
155
+ event.stopPropagation();
156
+ restoreEntryFocus(restoreTarget2);
157
+ return;
158
+ }
159
+ }
160
+ rememberedFocusRef.current = targetMemory;
161
+ return;
162
+ }
163
+ const restoreTarget = resolveToolbarNextFocusTarget(
164
+ scopeRoot,
165
+ rememberedFocusRef.current,
166
+ {
167
+ items,
168
+ includeTabIndexMinusOne,
169
+ overflowedIds
170
+ }
171
+ );
172
+ if (restoreTarget && restoreTarget !== target) {
173
+ event.stopPropagation();
174
+ restoreEntryFocus(restoreTarget);
175
+ return;
176
+ }
177
+ rememberTarget(target);
178
+ },
179
+ [
180
+ includeTabIndexMinusOne,
181
+ items,
182
+ overflowedIds,
183
+ rememberTarget,
184
+ restoreEntryFocus,
185
+ scopeRef,
186
+ shouldPreserveItemMemoryForTrigger
187
+ ]
188
+ );
189
+ const handleFocusCapture = useCallback(
190
+ (event) => {
191
+ handleScopeFocus(event);
192
+ },
193
+ [handleScopeFocus]
194
+ );
195
+ const handleScopePointerDown = useCallback(
196
+ (event) => {
197
+ const scopeRoot = scopeRef.current;
198
+ const target = event.target;
199
+ if (!scopeRoot || !(target instanceof Element) || getClosestToolbarNextScopeRoot(target) !== scopeRoot) {
200
+ pointerDownTargetRef.current = null;
201
+ return;
202
+ }
203
+ pointerDownTargetRef.current = target;
204
+ },
205
+ [scopeRef]
206
+ );
207
+ const handlePointerDownCapture = useCallback(
208
+ (event) => {
209
+ handleScopePointerDown(event);
210
+ },
211
+ [handleScopePointerDown]
212
+ );
213
+ const handleScopeBlur = useCallback(
214
+ (event) => {
215
+ const scopeRoot = scopeRef.current;
216
+ const target = event.target;
217
+ if (!scopeRoot || !(target instanceof HTMLElement) || getClosestToolbarNextScopeRoot(target) !== scopeRoot) {
218
+ return;
219
+ }
220
+ const relatedTarget = event.relatedTarget;
221
+ const leavingScope = !(relatedTarget instanceof HTMLElement) || getClosestToolbarNextScopeRoot(relatedTarget) !== scopeRoot;
222
+ if (leavingScope) {
223
+ rememberTarget(target);
224
+ }
225
+ },
226
+ [rememberTarget, scopeRef]
227
+ );
228
+ const handleBlurCapture = useCallback(
229
+ (event) => {
230
+ handleScopeBlur(event);
231
+ },
232
+ [handleScopeBlur]
233
+ );
234
+ const handleScopeKeyDown = useCallback(
235
+ (event) => {
236
+ const scopeRoot = scopeRef.current;
237
+ const target = event.target;
238
+ if (!scopeRoot || !(target instanceof HTMLElement) || getClosestToolbarNextScopeRoot(target) !== scopeRoot || event.altKey || event.ctrlKey || event.metaKey) {
239
+ return;
240
+ }
241
+ if (event.key === "Tab" && scopeRoot.getAttribute(TOOLBAR_NEXT_SCOPE_ROOT_ATTR) === "main" && !shouldToolbarNextPreserveNativeTab(target)) {
242
+ const moveTarget2 = getToolbarNextTabMoveTarget(
243
+ scopeRoot,
244
+ event.shiftKey
245
+ );
246
+ event.preventDefault();
247
+ event.stopPropagation();
248
+ rememberTarget(target);
249
+ queueMicrotask(() => {
250
+ if (moveTarget2 == null ? void 0 : moveTarget2.isConnected) {
251
+ focusToolbarNextElement(moveTarget2);
252
+ } else {
253
+ target.blur();
254
+ }
255
+ });
256
+ return;
257
+ }
258
+ const moveTarget = getToolbarNextDirectionalMoveTarget(
259
+ scopeRoot,
260
+ target,
261
+ event.key,
262
+ { includeTabIndexMinusOne }
263
+ );
264
+ if (!moveTarget) {
265
+ return;
266
+ }
267
+ event.preventDefault();
268
+ event.stopPropagation();
269
+ rememberTarget(moveTarget);
270
+ focusToolbarNextElement(moveTarget);
271
+ },
272
+ [includeTabIndexMinusOne, rememberTarget, scopeRef]
273
+ );
274
+ const handleKeyDownCapture = useCallback(
275
+ (event) => {
276
+ handleScopeKeyDown(event);
277
+ },
278
+ [handleScopeKeyDown]
279
+ );
280
+ const getEntryFocusable = useCallback(() => {
281
+ const scopeRoot = scopeRef.current;
282
+ if (!scopeRoot) {
283
+ return null;
284
+ }
285
+ return resolveToolbarNextFocusTarget(scopeRoot, rememberedFocusRef.current, {
286
+ items,
287
+ includeTabIndexMinusOne,
288
+ overflowedIds
289
+ }) ?? getToolbarNextScopeFocusableElements(scopeRoot, {
290
+ includeTabIndexMinusOne
291
+ })[0] ?? null;
292
+ }, [includeTabIndexMinusOne, items, overflowedIds, scopeRef]);
293
+ return {
294
+ focusEntryTarget,
295
+ getEntryFocusable,
296
+ handleBlurCapture,
297
+ handleFocusCapture,
298
+ handleKeyDownCapture,
299
+ handlePointerDownCapture,
300
+ handleScopeBlur,
301
+ handleScopeFocus,
302
+ handleScopeKeyDown,
303
+ handleScopePointerDown,
304
+ rememberItemFocus,
305
+ rememberedFocusRef
306
+ };
307
+ }
308
+
309
+ export { useToolbarNextKeyboardNavigation };
310
+ //# sourceMappingURL=useToolbarNextKeyboardNavigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useToolbarNextKeyboardNavigation.js","sources":["../src/toolbar-next/useToolbarNextKeyboardNavigation.ts"],"sourcesContent":["import {\n type FocusEventHandler,\n type KeyboardEventHandler,\n type PointerEventHandler,\n type RefObject,\n useCallback,\n useRef,\n} from \"react\";\nimport {\n focusToolbarNextElement,\n getClosestToolbarNextScopeRoot,\n getToolbarNextDirectionalMoveTarget,\n getToolbarNextFocusMemory,\n getToolbarNextScopeFocusableElements,\n getToolbarNextTabMoveTarget,\n isToolbarNextFocusFromPointerTarget,\n resolveToolbarNextFocusTarget,\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} from \"./toolbarNextKeyboardUtils\";\nimport type { ToolbarNextOverflowItem } from \"./toolbarNextUtils\";\n\ninterface UseToolbarNextKeyboardNavigationProps {\n includeTabIndexMinusOne?: boolean;\n items?: ToolbarNextOverflowItem[];\n overflowedIds?: Set<string>;\n scopeRef: RefObject<HTMLElement | null>;\n}\n\ninterface ToolbarNextFocusEvent {\n relatedTarget: EventTarget | null;\n stopPropagation: () => void;\n target: EventTarget | null;\n}\n\ninterface ToolbarNextKeyDownEvent {\n altKey: boolean;\n ctrlKey: boolean;\n key: string;\n metaKey: boolean;\n preventDefault: () => void;\n shiftKey: boolean;\n stopPropagation: () => void;\n target: EventTarget | null;\n}\n\ninterface ToolbarNextPointerEvent {\n target: EventTarget | null;\n}\n\nexport function useToolbarNextKeyboardNavigation({\n includeTabIndexMinusOne = false,\n items = [],\n overflowedIds,\n scopeRef,\n}: UseToolbarNextKeyboardNavigationProps) {\n const rememberedFocusRef = useRef<ToolbarNextFocusMemory | null>(null);\n const pointerDownTargetRef = useRef<EventTarget | null>(null);\n const restoringEntryFocusRef = useRef(false);\n\n const shouldPreserveItemMemoryForTrigger = useCallback(\n (groupKey: string) => {\n const rememberedFocus = rememberedFocusRef.current;\n\n if (rememberedFocus?.type !== \"item\") {\n return false;\n }\n\n const item = items.find((entry) => entry.id === rememberedFocus.itemId);\n\n return (\n item?.overflowGroupKey === groupKey &&\n (overflowedIds == null || overflowedIds.has(item.id))\n );\n },\n [items, overflowedIds],\n );\n\n const rememberTarget = useCallback(\n (target: HTMLElement) => {\n const scopeRoot = scopeRef.current;\n\n if (!scopeRoot) {\n return;\n }\n\n const focusMemory = getToolbarNextFocusMemory(scopeRoot, target, {\n includeTabIndexMinusOne,\n });\n\n if (focusMemory) {\n if (\n focusMemory.type === \"overflow-trigger\" &&\n shouldPreserveItemMemoryForTrigger(focusMemory.groupKey)\n ) {\n return;\n }\n\n rememberedFocusRef.current = focusMemory;\n }\n },\n [includeTabIndexMinusOne, scopeRef, shouldPreserveItemMemoryForTrigger],\n );\n\n const rememberItemFocus = useCallback(\n (itemId: string, controlIndex: number) => {\n const scopeRoot = scopeRef.current;\n\n if (!scopeRoot) {\n return;\n }\n\n const focusables = getToolbarNextScopeFocusableElements(scopeRoot, {\n includeTabIndexMinusOne,\n });\n const itemFocusables = focusables.filter((element) => {\n return (\n element\n .closest<HTMLElement>(`[${TOOLBAR_NEXT_ITEM_ATTR}]`)\n ?.getAttribute(TOOLBAR_NEXT_ITEM_ATTR) === itemId\n );\n });\n const item = items.find((entry) => entry.id === itemId);\n const visibleItemTarget =\n itemFocusables[Math.min(controlIndex, itemFocusables.length - 1)] ??\n itemFocusables[0];\n const overflowTriggerTarget = item\n ? focusables.find((element) => {\n const trigger = element.closest<HTMLElement>(\n `[${TOOLBAR_NEXT_OVERFLOW_TRIGGER_ATTR}]`,\n );\n\n return (\n trigger?.getAttribute(TOOLBAR_NEXT_GROUP_KEY_ATTR) ===\n item.overflowGroupKey\n );\n })\n : undefined;\n const scopeIndex = Math.max(\n focusables.indexOf(visibleItemTarget ?? overflowTriggerTarget),\n rememberedFocusRef.current?.scopeIndex ?? 0,\n );\n const focusMemory: ToolbarNextFocusMemory = {\n controlIndex,\n itemId,\n scopeIndex,\n type: \"item\",\n };\n\n rememberedFocusRef.current = focusMemory;\n },\n [includeTabIndexMinusOne, items, scopeRef],\n );\n\n const focusEntryTarget = useCallback(() => {\n const scopeRoot = scopeRef.current;\n\n if (!scopeRoot) {\n return;\n }\n\n const target = resolveToolbarNextFocusTarget(\n scopeRoot,\n rememberedFocusRef.current,\n {\n items,\n includeTabIndexMinusOne,\n overflowedIds,\n },\n );\n\n if (!target) {\n return;\n }\n\n queueMicrotask(() => {\n focusToolbarNextElement(target);\n });\n }, [includeTabIndexMinusOne, items, overflowedIds, scopeRef]);\n\n const restoreEntryFocus = useCallback((target: HTMLElement) => {\n restoringEntryFocusRef.current = true;\n focusToolbarNextElement(target);\n }, []);\n\n const handleScopeFocus = useCallback(\n (event: ToolbarNextFocusEvent) => {\n const scopeRoot = scopeRef.current;\n const target = event.target;\n\n if (\n !scopeRoot ||\n !(target instanceof HTMLElement) ||\n getClosestToolbarNextScopeRoot(target) !== scopeRoot\n ) {\n return;\n }\n\n if (restoringEntryFocusRef.current) {\n restoringEntryFocusRef.current = false;\n pointerDownTargetRef.current = null;\n rememberTarget(target);\n return;\n }\n\n const relatedTarget = event.relatedTarget;\n const enteringFromOutside =\n !(relatedTarget instanceof HTMLElement) ||\n getClosestToolbarNextScopeRoot(relatedTarget) !== scopeRoot;\n\n if (!enteringFromOutside) {\n pointerDownTargetRef.current = null;\n rememberTarget(target);\n return;\n }\n\n const targetMemory = getToolbarNextFocusMemory(scopeRoot, target, {\n includeTabIndexMinusOne,\n });\n const pointerDownTarget = pointerDownTargetRef.current;\n pointerDownTargetRef.current = null;\n const focusFromPointerTarget = isToolbarNextFocusFromPointerTarget(\n target,\n pointerDownTarget,\n );\n\n if (focusFromPointerTarget) {\n rememberTarget(target);\n return;\n }\n\n if (targetMemory?.type === \"overflow-trigger\") {\n const shouldPreserve = shouldPreserveItemMemoryForTrigger(\n targetMemory.groupKey,\n );\n if (shouldPreserve) {\n return;\n }\n\n if (rememberedFocusRef.current?.type === \"item\") {\n const restoreTarget = resolveToolbarNextFocusTarget(\n scopeRoot,\n rememberedFocusRef.current,\n {\n items,\n includeTabIndexMinusOne,\n overflowedIds,\n },\n );\n\n if (restoreTarget && restoreTarget !== target) {\n event.stopPropagation();\n restoreEntryFocus(restoreTarget);\n return;\n }\n }\n\n rememberedFocusRef.current = targetMemory;\n return;\n }\n\n const restoreTarget = resolveToolbarNextFocusTarget(\n scopeRoot,\n rememberedFocusRef.current,\n {\n items,\n includeTabIndexMinusOne,\n overflowedIds,\n },\n );\n\n if (restoreTarget && restoreTarget !== target) {\n event.stopPropagation();\n restoreEntryFocus(restoreTarget);\n return;\n }\n\n rememberTarget(target);\n },\n [\n includeTabIndexMinusOne,\n items,\n overflowedIds,\n rememberTarget,\n restoreEntryFocus,\n scopeRef,\n shouldPreserveItemMemoryForTrigger,\n ],\n );\n\n const handleFocusCapture = useCallback<FocusEventHandler<HTMLElement>>(\n (event) => {\n handleScopeFocus(event);\n },\n [handleScopeFocus],\n );\n\n const handleScopePointerDown = useCallback(\n (event: ToolbarNextPointerEvent) => {\n const scopeRoot = scopeRef.current;\n const target = event.target;\n\n if (\n !scopeRoot ||\n !(target instanceof Element) ||\n getClosestToolbarNextScopeRoot(target) !== scopeRoot\n ) {\n pointerDownTargetRef.current = null;\n return;\n }\n\n pointerDownTargetRef.current = target;\n },\n [scopeRef],\n );\n\n const handlePointerDownCapture = useCallback<\n PointerEventHandler<HTMLElement>\n >(\n (event) => {\n handleScopePointerDown(event);\n },\n [handleScopePointerDown],\n );\n\n const handleScopeBlur = useCallback(\n (event: ToolbarNextFocusEvent) => {\n const scopeRoot = scopeRef.current;\n const target = event.target;\n\n if (\n !scopeRoot ||\n !(target instanceof HTMLElement) ||\n getClosestToolbarNextScopeRoot(target) !== scopeRoot\n ) {\n return;\n }\n\n const relatedTarget = event.relatedTarget;\n const leavingScope =\n !(relatedTarget instanceof HTMLElement) ||\n getClosestToolbarNextScopeRoot(relatedTarget) !== scopeRoot;\n\n if (leavingScope) {\n rememberTarget(target);\n }\n },\n [rememberTarget, scopeRef],\n );\n\n const handleBlurCapture = useCallback<FocusEventHandler<HTMLElement>>(\n (event) => {\n handleScopeBlur(event);\n },\n [handleScopeBlur],\n );\n\n const handleScopeKeyDown = useCallback(\n (event: ToolbarNextKeyDownEvent) => {\n const scopeRoot = scopeRef.current;\n const target = event.target;\n\n if (\n !scopeRoot ||\n !(target instanceof HTMLElement) ||\n getClosestToolbarNextScopeRoot(target) !== scopeRoot ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey\n ) {\n return;\n }\n\n if (\n event.key === \"Tab\" &&\n scopeRoot.getAttribute(TOOLBAR_NEXT_SCOPE_ROOT_ATTR) === \"main\" &&\n !shouldToolbarNextPreserveNativeTab(target)\n ) {\n const moveTarget = getToolbarNextTabMoveTarget(\n scopeRoot,\n event.shiftKey,\n );\n\n event.preventDefault();\n event.stopPropagation();\n\n rememberTarget(target);\n queueMicrotask(() => {\n if (moveTarget?.isConnected) {\n focusToolbarNextElement(moveTarget);\n } else {\n target.blur();\n }\n });\n return;\n }\n\n const moveTarget = getToolbarNextDirectionalMoveTarget(\n scopeRoot,\n target,\n event.key,\n { includeTabIndexMinusOne },\n );\n\n if (!moveTarget) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n rememberTarget(moveTarget);\n focusToolbarNextElement(moveTarget);\n },\n [includeTabIndexMinusOne, rememberTarget, scopeRef],\n );\n\n const handleKeyDownCapture = useCallback<KeyboardEventHandler<HTMLElement>>(\n (event) => {\n handleScopeKeyDown(event);\n },\n [handleScopeKeyDown],\n );\n\n const getEntryFocusable = useCallback(() => {\n const scopeRoot = scopeRef.current;\n\n if (!scopeRoot) {\n return null;\n }\n\n return (\n resolveToolbarNextFocusTarget(scopeRoot, rememberedFocusRef.current, {\n items,\n includeTabIndexMinusOne,\n overflowedIds,\n }) ??\n getToolbarNextScopeFocusableElements(scopeRoot, {\n includeTabIndexMinusOne,\n })[0] ??\n null\n );\n }, [includeTabIndexMinusOne, items, overflowedIds, scopeRef]);\n\n return {\n focusEntryTarget,\n getEntryFocusable,\n handleBlurCapture,\n handleFocusCapture,\n handleKeyDownCapture,\n handlePointerDownCapture,\n handleScopeBlur,\n handleScopeFocus,\n handleScopeKeyDown,\n handleScopePointerDown,\n rememberItemFocus,\n rememberedFocusRef,\n };\n}\n"],"names":["_a","restoreTarget","moveTarget"],"mappings":"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"}