react-panel-layout 0.5.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (463) hide show
  1. package/dist/{FloatingPanelFrame-D9Cp2al1.cjs → FloatingPanelFrame-CEmXDvUA.cjs} +2 -2
  2. package/dist/{FloatingPanelFrame-D9Cp2al1.cjs.map → FloatingPanelFrame-CEmXDvUA.cjs.map} +1 -1
  3. package/dist/{FloatingPanelFrame-lLg-Lpg7.js → FloatingPanelFrame-SgYLc6Ud.js} +11 -11
  4. package/dist/{FloatingPanelFrame-lLg-Lpg7.js.map → FloatingPanelFrame-SgYLc6Ud.js.map} +1 -1
  5. package/dist/FloatingWindow-BpdOpg_L.js +400 -0
  6. package/dist/FloatingWindow-BpdOpg_L.js.map +1 -0
  7. package/dist/FloatingWindow-TCDNY5gE.cjs +2 -0
  8. package/dist/FloatingWindow-TCDNY5gE.cjs.map +1 -0
  9. package/dist/GridLayout-B4VRsC0r.cjs +2 -0
  10. package/dist/GridLayout-B4VRsC0r.cjs.map +1 -0
  11. package/dist/GridLayout-BltqeCPK.js +927 -0
  12. package/dist/GridLayout-BltqeCPK.js.map +1 -0
  13. package/dist/HorizontalDivider-B5Z-KZLk.cjs +2 -0
  14. package/dist/HorizontalDivider-B5Z-KZLk.cjs.map +1 -0
  15. package/dist/HorizontalDivider-WF1k_qND.js +30 -0
  16. package/dist/HorizontalDivider-WF1k_qND.js.map +1 -0
  17. package/dist/PanelSystem-Bs8bQwQF.cjs +3 -0
  18. package/dist/PanelSystem-Bs8bQwQF.cjs.map +1 -0
  19. package/dist/PanelSystem-Dr1TBhxM.js +1946 -0
  20. package/dist/PanelSystem-Dr1TBhxM.js.map +1 -0
  21. package/dist/ResizeHandle-CScipO5l.cjs +2 -0
  22. package/dist/ResizeHandle-CScipO5l.cjs.map +1 -0
  23. package/dist/ResizeHandle-CdA_JYfN.js +120 -0
  24. package/dist/ResizeHandle-CdA_JYfN.js.map +1 -0
  25. package/dist/SwipePivotTabBar-BGO9X94m.js +407 -0
  26. package/dist/SwipePivotTabBar-BGO9X94m.js.map +1 -0
  27. package/dist/SwipePivotTabBar-BrQismcZ.cjs +2 -0
  28. package/dist/SwipePivotTabBar-BrQismcZ.cjs.map +1 -0
  29. package/dist/config.cjs +1 -1
  30. package/dist/config.cjs.map +1 -1
  31. package/dist/config.js +11 -9
  32. package/dist/config.js.map +1 -1
  33. package/dist/constants/styles.d.ts +18 -4
  34. package/dist/floating.cjs +1 -1
  35. package/dist/floating.js +1 -1
  36. package/dist/grid/index.d.ts +58 -0
  37. package/dist/grid.cjs +2 -0
  38. package/dist/grid.cjs.map +1 -0
  39. package/dist/grid.js +13 -0
  40. package/dist/grid.js.map +1 -0
  41. package/dist/hooks/gesture/presets.d.ts +33 -0
  42. package/dist/hooks/gesture/testing/createGestureSimulator.d.ts +110 -0
  43. package/dist/hooks/gesture/thresholdValue.d.ts +44 -0
  44. package/dist/hooks/gesture/types.d.ts +254 -0
  45. package/dist/hooks/gesture/useDirectionalLock.d.ts +20 -0
  46. package/dist/hooks/gesture/useEdgeSwipeInput.d.ts +23 -0
  47. package/dist/hooks/gesture/useNativeGestureGuard.d.ts +23 -0
  48. package/dist/hooks/gesture/usePointerTracking.d.ts +22 -0
  49. package/dist/hooks/gesture/useScrollBoundary.d.ts +23 -0
  50. package/dist/hooks/gesture/useSwipeInput.d.ts +5 -0
  51. package/dist/hooks/gesture/utils.d.ts +40 -0
  52. package/dist/hooks/useAnimatedVisibility.d.ts +58 -0
  53. package/dist/hooks/useAnimationFrame.d.ts +84 -0
  54. package/dist/hooks/useSnapAnimation.d.ts +54 -0
  55. package/dist/hooks/useSwipeContentTransform.d.ts +79 -0
  56. package/dist/index.cjs +1 -2
  57. package/dist/index.cjs.map +1 -1
  58. package/dist/index.d.ts +0 -1
  59. package/dist/index.js +25 -2006
  60. package/dist/index.js.map +1 -1
  61. package/dist/modules/pivot/PivotContent.d.ts +1 -1
  62. package/dist/modules/pivot/SwipePivotContent.d.ts +39 -0
  63. package/dist/modules/pivot/SwipePivotContent.debug.tmp.d.ts +25 -0
  64. package/dist/modules/pivot/SwipePivotContent.test.d.ts +1 -0
  65. package/dist/modules/pivot/SwipePivotTabBar.d.ts +89 -0
  66. package/dist/modules/pivot/index.d.ts +3 -0
  67. package/dist/modules/pivot/scaleInputState.d.ts +37 -0
  68. package/dist/modules/pivot/types.d.ts +67 -2
  69. package/dist/modules/pivot/usePivotSwipeInput.d.ts +68 -0
  70. package/dist/modules/stack/StackContent.d.ts +15 -0
  71. package/dist/modules/stack/SwipeStackContent.d.ts +63 -0
  72. package/dist/modules/stack/SwipeStackOutlet.d.ts +80 -0
  73. package/dist/modules/stack/computeStackContentState.d.ts +99 -0
  74. package/dist/modules/stack/computeSwipeStackTransform.d.ts +76 -0
  75. package/dist/modules/stack/types.d.ts +194 -0
  76. package/dist/modules/stack/useStackAnimationState.d.ts +32 -0
  77. package/dist/modules/stack/useStackNavigation.d.ts +23 -0
  78. package/dist/modules/stack/useStackSwipeInput.d.ts +27 -0
  79. package/dist/panels/index.d.ts +67 -0
  80. package/dist/panels.cjs +2 -0
  81. package/dist/panels.cjs.map +1 -0
  82. package/dist/panels.js +28 -0
  83. package/dist/panels.js.map +1 -0
  84. package/dist/pivot/index.d.ts +3 -0
  85. package/dist/pivot.cjs +1 -1
  86. package/dist/pivot.cjs.map +1 -1
  87. package/dist/pivot.js +20 -2
  88. package/dist/pivot.js.map +1 -1
  89. package/dist/resizer/index.d.ts +57 -0
  90. package/dist/resizer.cjs +2 -0
  91. package/dist/resizer.cjs.map +1 -0
  92. package/dist/resizer.js +8 -0
  93. package/dist/resizer.js.map +1 -0
  94. package/dist/stack/index.d.ts +72 -0
  95. package/dist/stack.cjs +2 -0
  96. package/dist/stack.cjs.map +1 -0
  97. package/dist/stack.js +980 -0
  98. package/dist/stack.js.map +1 -0
  99. package/dist/sticky-header/StickyArea.d.ts +38 -0
  100. package/dist/sticky-header/index.d.ts +4 -4
  101. package/dist/sticky-header/types.d.ts +35 -22
  102. package/dist/sticky-header.cjs +1 -1
  103. package/dist/sticky-header.cjs.map +1 -1
  104. package/dist/sticky-header.js +65 -174
  105. package/dist/sticky-header.js.map +1 -1
  106. package/dist/styles-DPPuJ0sf.js +57 -0
  107. package/dist/styles-DPPuJ0sf.js.map +1 -0
  108. package/dist/styles-qf6ptVLD.cjs +2 -0
  109. package/dist/styles-qf6ptVLD.cjs.map +1 -0
  110. package/dist/useContentCache-CO3LYNmz.js +24 -0
  111. package/dist/useContentCache-CO3LYNmz.js.map +1 -0
  112. package/dist/useContentCache-DqXtLrLs.cjs +2 -0
  113. package/dist/useContentCache-DqXtLrLs.cjs.map +1 -0
  114. package/dist/useDocumentPointerEvents-CKdhGXd0.js +46 -0
  115. package/dist/useDocumentPointerEvents-CKdhGXd0.js.map +1 -0
  116. package/dist/useDocumentPointerEvents-ChqrKXDk.cjs +2 -0
  117. package/dist/useDocumentPointerEvents-ChqrKXDk.cjs.map +1 -0
  118. package/dist/useEffectEvent-Dp7HLCf0.js +13 -0
  119. package/dist/useEffectEvent-Dp7HLCf0.js.map +1 -0
  120. package/dist/useEffectEvent-huSsGUnl.cjs +2 -0
  121. package/dist/useEffectEvent-huSsGUnl.cjs.map +1 -0
  122. package/dist/useFloatingState-C4kRaW_R.cjs +2 -0
  123. package/dist/useFloatingState-C4kRaW_R.cjs.map +1 -0
  124. package/dist/useFloatingState-tEfA_wbc.js +74 -0
  125. package/dist/useFloatingState-tEfA_wbc.js.map +1 -0
  126. package/dist/window/index.d.ts +61 -0
  127. package/dist/window.cjs +2 -0
  128. package/dist/window.cjs.map +1 -0
  129. package/dist/window.js +149 -0
  130. package/dist/window.js.map +1 -0
  131. package/docs/design-tokens.md +405 -0
  132. package/package.json +29 -4
  133. package/src/PanelSystemContext.tsx +88 -0
  134. package/src/components/grid/GridLayerList.tsx +172 -0
  135. package/src/components/grid/GridLayerResizeHandles.tsx +145 -0
  136. package/src/components/grid/GridLayout.spec.tsx +743 -0
  137. package/src/components/grid/GridLayout.tsx +130 -0
  138. package/src/components/grid/GridTrackResizeHandle.tsx +87 -0
  139. package/src/components/paneling/FloatingPanelFrame.tsx +203 -0
  140. package/src/components/panels/DropSuggestOverlay.tsx +131 -0
  141. package/src/components/panels/PanelGroupView.tsx +112 -0
  142. package/src/components/pivot/PivotLayer.tsx +27 -0
  143. package/src/components/resizer/HorizontalDivider.tsx +52 -0
  144. package/src/components/resizer/ResizeHandle.tsx +118 -0
  145. package/src/components/tabs/TabBar.tsx +223 -0
  146. package/src/components/tabs/TabBarTab.tsx +133 -0
  147. package/src/components/tabs/TabDragOverlay.tsx +92 -0
  148. package/src/components/window/DialogOverlay.tsx +180 -0
  149. package/src/components/window/Drawer.tsx +282 -0
  150. package/src/components/window/DrawerLayers.tsx +58 -0
  151. package/src/components/window/FloatingWindow.tsx +95 -0
  152. package/src/components/window/PopupLayerPortal.tsx +218 -0
  153. package/src/config/PanelContentDeclaration.tsx +427 -0
  154. package/src/config/index.tsx +52 -0
  155. package/src/config/panelJsx.spec.tsx +54 -0
  156. package/src/config/panelJsxConfig.spec.tsx +54 -0
  157. package/src/config/panelJsxDrawer.spec.tsx +33 -0
  158. package/src/config/panelRouter.spec.ts +68 -0
  159. package/src/config/panelRouter.tsx +155 -0
  160. package/src/constants/styles.ts +261 -0
  161. package/src/demo/Layout.module.css +258 -0
  162. package/src/demo/Layout.tsx +176 -0
  163. package/src/demo/components/CodeBlock.module.css +54 -0
  164. package/src/demo/components/CodeBlock.tsx +34 -0
  165. package/src/demo/components/CodePreview.module.css +37 -0
  166. package/src/demo/components/CodePreview.tsx +31 -0
  167. package/src/demo/components/DataPreview.module.css +177 -0
  168. package/src/demo/components/DataPreview.tsx +115 -0
  169. package/src/demo/components/Story.module.css +68 -0
  170. package/src/demo/components/Story.tsx +54 -0
  171. package/src/demo/components/layout/CodePanel.module.css +183 -0
  172. package/src/demo/components/layout/CodePanel.tsx +149 -0
  173. package/src/demo/components/layout/DemoPage.module.css +60 -0
  174. package/src/demo/components/layout/DemoPage.tsx +56 -0
  175. package/src/demo/components/layout/SingleSamplePage.module.css +11 -0
  176. package/src/demo/components/layout/SingleSamplePage.tsx +35 -0
  177. package/src/demo/components/layout/SplitDemoLayout.module.css +107 -0
  178. package/src/demo/components/layout/SplitDemoLayout.tsx +218 -0
  179. package/src/demo/components/layout/index.ts +11 -0
  180. package/src/demo/components/tab-styles/ChromeTabBar.module.css +75 -0
  181. package/src/demo/components/tab-styles/ChromeTabBar.tsx +111 -0
  182. package/src/demo/components/tab-styles/GitHubTabBar.module.css +81 -0
  183. package/src/demo/components/tab-styles/GitHubTabBar.tsx +109 -0
  184. package/src/demo/components/tab-styles/VSCodeTabBar.module.css +78 -0
  185. package/src/demo/components/tab-styles/VSCodeTabBar.tsx +109 -0
  186. package/src/demo/components/tab-styles/index.ts +6 -0
  187. package/src/demo/components/ui/DemoButton.module.css +63 -0
  188. package/src/demo/components/ui/DemoButton.tsx +32 -0
  189. package/src/demo/components/ui/DemoCard.module.css +15 -0
  190. package/src/demo/components/ui/DemoCard.tsx +30 -0
  191. package/src/demo/components/ui/DemoContainer.module.css +17 -0
  192. package/src/demo/components/ui/DemoContainer.tsx +30 -0
  193. package/src/demo/components/ui/DemoPanel.module.css +23 -0
  194. package/src/demo/components/ui/DemoPanel.tsx +33 -0
  195. package/src/demo/components/ui/PanelText.module.css +18 -0
  196. package/src/demo/components/ui/PanelText.tsx +29 -0
  197. package/src/demo/components/ui/PanelTitle.module.css +18 -0
  198. package/src/demo/components/ui/PanelTitle.tsx +31 -0
  199. package/src/demo/contexts/TabbarDemoConfig.tsx +218 -0
  200. package/src/demo/demo.css +172 -0
  201. package/src/demo/hooks/useMedia.ts +41 -0
  202. package/src/demo/hooks/useShikiHighlight.ts +55 -0
  203. package/src/demo/index.tsx +293 -0
  204. package/src/demo/pages/Drawer/animations/index.tsx +22 -0
  205. package/src/demo/pages/Drawer/basics/index.tsx +17 -0
  206. package/src/demo/pages/Drawer/components/DrawerAnimations.module.css +125 -0
  207. package/src/demo/pages/Drawer/components/DrawerAnimations.tsx +118 -0
  208. package/src/demo/pages/Drawer/components/DrawerBasics.module.css +55 -0
  209. package/src/demo/pages/Drawer/components/DrawerBasics.tsx +76 -0
  210. package/src/demo/pages/Drawer/components/DrawerMenuLayout.module.css +332 -0
  211. package/src/demo/pages/Drawer/components/DrawerMenuLayout.tsx +199 -0
  212. package/src/demo/pages/Drawer/menu/index.tsx +17 -0
  213. package/src/demo/pages/FloatingPanelFrame/ResizableFloatingPanelsPreview.module.css +163 -0
  214. package/src/demo/pages/FloatingPanelFrame/ResizableFloatingPanelsPreview.tsx +234 -0
  215. package/src/demo/pages/FloatingPanelFrame/basic/index.tsx +17 -0
  216. package/src/demo/pages/FloatingPanelFrame/complex/index.tsx +26 -0
  217. package/src/demo/pages/FloatingPanelFrame/components/BasicPanel.module.css +16 -0
  218. package/src/demo/pages/FloatingPanelFrame/components/BasicPanel.tsx +24 -0
  219. package/src/demo/pages/FloatingPanelFrame/components/ComplexPanel.module.css +54 -0
  220. package/src/demo/pages/FloatingPanelFrame/components/ComplexPanel.tsx +67 -0
  221. package/src/demo/pages/FloatingPanelFrame/components/PanelWithControls.module.css +21 -0
  222. package/src/demo/pages/FloatingPanelFrame/components/PanelWithControls.tsx +41 -0
  223. package/src/demo/pages/FloatingPanelFrame/components/PanelWithMeta.module.css +5 -0
  224. package/src/demo/pages/FloatingPanelFrame/components/PanelWithMeta.tsx +43 -0
  225. package/src/demo/pages/FloatingPanelFrame/components/ScrollablePanel.module.css +11 -0
  226. package/src/demo/pages/FloatingPanelFrame/components/ScrollablePanel.tsx +42 -0
  227. package/src/demo/pages/FloatingPanelFrame/index.tsx +80 -0
  228. package/src/demo/pages/FloatingPanelFrame/scrollable/index.tsx +30 -0
  229. package/src/demo/pages/FloatingPanelFrame/with-controls/index.tsx +30 -0
  230. package/src/demo/pages/FloatingPanelFrame/with-meta/index.tsx +17 -0
  231. package/src/demo/pages/HorizontalDivider/components/PanelsWithRichContent.module.css +112 -0
  232. package/src/demo/pages/HorizontalDivider/components/PanelsWithRichContent.tsx +56 -0
  233. package/src/demo/pages/HorizontalDivider/components/SimpleResizablePanels.module.css +46 -0
  234. package/src/demo/pages/HorizontalDivider/components/SimpleResizablePanels.tsx +29 -0
  235. package/src/demo/pages/HorizontalDivider/components/ThreePanelLayout.module.css +54 -0
  236. package/src/demo/pages/HorizontalDivider/components/ThreePanelLayout.tsx +30 -0
  237. package/src/demo/pages/HorizontalDivider/index.module.css +14 -0
  238. package/src/demo/pages/HorizontalDivider/index.tsx +64 -0
  239. package/src/demo/pages/HorizontalDivider/panels-with-rich-content/index.tsx +21 -0
  240. package/src/demo/pages/HorizontalDivider/simple-resizable-panels/index.tsx +21 -0
  241. package/src/demo/pages/HorizontalDivider/three-panel-layout/index.tsx +21 -0
  242. package/src/demo/pages/PanelLayout/PanelLayoutDemo.module.css +174 -0
  243. package/src/demo/pages/PanelLayout/PanelLayoutDemo.tsx +248 -0
  244. package/src/demo/pages/PanelLayout/components/DashboardLayout.module.css +115 -0
  245. package/src/demo/pages/PanelLayout/components/DashboardLayout.tsx +124 -0
  246. package/src/demo/pages/PanelLayout/components/DraggableOverlays.module.css +101 -0
  247. package/src/demo/pages/PanelLayout/components/DraggableOverlays.tsx +122 -0
  248. package/src/demo/pages/PanelLayout/components/IDELayout.module.css +104 -0
  249. package/src/demo/pages/PanelLayout/components/IDELayout.tsx +143 -0
  250. package/src/demo/pages/PanelLayout/components/SimpleGrid.module.css +19 -0
  251. package/src/demo/pages/PanelLayout/components/SimpleGrid.tsx +62 -0
  252. package/src/demo/pages/PanelLayout/dashboard/index.tsx +22 -0
  253. package/src/demo/pages/PanelLayout/draggable-overlays/index.tsx +22 -0
  254. package/src/demo/pages/PanelLayout/ide-layout/index.tsx +22 -0
  255. package/src/demo/pages/PanelLayout/index.tsx +94 -0
  256. package/src/demo/pages/PanelLayout/simple-grid/index.tsx +22 -0
  257. package/src/demo/pages/PanelSystem/PanelSystemPreview.module.css +20 -0
  258. package/src/demo/pages/PanelSystem/PanelSystemPreview.tsx +101 -0
  259. package/src/demo/pages/PanelSystem/preview/index.tsx +18 -0
  260. package/src/demo/pages/PanelSystem/tabbar/index.tsx +129 -0
  261. package/src/demo/pages/Pivot/basics/index.tsx +17 -0
  262. package/src/demo/pages/Pivot/components/Pivot.module.css +278 -0
  263. package/src/demo/pages/Pivot/components/PivotBasics.tsx +103 -0
  264. package/src/demo/pages/Pivot/components/PivotSidebar.tsx +168 -0
  265. package/src/demo/pages/Pivot/components/PivotTabs.tsx +129 -0
  266. package/src/demo/pages/Pivot/components/PivotTransitions.tsx +120 -0
  267. package/src/demo/pages/Pivot/components/SwipePivot.module.css +114 -0
  268. package/src/demo/pages/Pivot/components/SwipePivot.tsx +193 -0
  269. package/src/demo/pages/Pivot/components/SwipeTabsPivot.module.css +203 -0
  270. package/src/demo/pages/Pivot/components/SwipeTabsPivot.tsx +289 -0
  271. package/src/demo/pages/Pivot/sidebar/index.tsx +17 -0
  272. package/src/demo/pages/Pivot/swipe/index.tsx +16 -0
  273. package/src/demo/pages/Pivot/swipe-debug/index.tsx +287 -0
  274. package/src/demo/pages/Pivot/swipe-tabs/index.tsx +15 -0
  275. package/src/demo/pages/Pivot/tabs/index.tsx +17 -0
  276. package/src/demo/pages/Pivot/transitions/index.tsx +17 -0
  277. package/src/demo/pages/ResizeHandle/both-directions/index.tsx +17 -0
  278. package/src/demo/pages/ResizeHandle/components/BothDirectionsDemo.module.css +72 -0
  279. package/src/demo/pages/ResizeHandle/components/BothDirectionsDemo.tsx +41 -0
  280. package/src/demo/pages/ResizeHandle/components/HorizontalResizeDemo.module.css +61 -0
  281. package/src/demo/pages/ResizeHandle/components/HorizontalResizeDemo.tsx +33 -0
  282. package/src/demo/pages/ResizeHandle/components/NestedPanelsDemo.module.css +83 -0
  283. package/src/demo/pages/ResizeHandle/components/NestedPanelsDemo.tsx +53 -0
  284. package/src/demo/pages/ResizeHandle/components/VerticalResizeDemo.module.css +68 -0
  285. package/src/demo/pages/ResizeHandle/components/VerticalResizeDemo.tsx +33 -0
  286. package/src/demo/pages/ResizeHandle/horizontal/index.tsx +17 -0
  287. package/src/demo/pages/ResizeHandle/index.module.css +11 -0
  288. package/src/demo/pages/ResizeHandle/index.tsx +71 -0
  289. package/src/demo/pages/ResizeHandle/nested-panels/index.tsx +17 -0
  290. package/src/demo/pages/ResizeHandle/vertical/index.tsx +17 -0
  291. package/src/demo/pages/ResponsiveLayout/adaptive-workspace/index.tsx +22 -0
  292. package/src/demo/pages/ResponsiveLayout/components/ResponsiveWorkspace.module.css +423 -0
  293. package/src/demo/pages/ResponsiveLayout/components/ResponsiveWorkspace.tsx +398 -0
  294. package/src/demo/pages/Stack/basics/index.tsx +22 -0
  295. package/src/demo/pages/Stack/components/Stack.module.css +234 -0
  296. package/src/demo/pages/Stack/components/StackBasics.tsx +217 -0
  297. package/src/demo/pages/Stack/components/StackTablet.module.css +299 -0
  298. package/src/demo/pages/Stack/components/StackTablet.tsx +401 -0
  299. package/src/demo/pages/Stack/tablet/index.tsx +22 -0
  300. package/src/demo/pages/StickyHeader/basics/index.tsx +17 -0
  301. package/src/demo/pages/StickyHeader/components/StickyHeader.module.css +219 -0
  302. package/src/demo/pages/StickyHeader/components/StickyHeaderBasics.tsx +103 -0
  303. package/src/demo/routes.tsx +193 -0
  304. package/src/demo/styles/animations.css +68 -0
  305. package/src/demo/styles/stack-themes.css +35 -0
  306. package/src/demo/utils/createPanelView.tsx +58 -0
  307. package/src/floating/index.ts +24 -0
  308. package/src/grid/index.ts +75 -0
  309. package/src/hooks/ContentCacheContext.tsx +87 -0
  310. package/src/hooks/gesture/presets.spec.ts +86 -0
  311. package/src/hooks/gesture/presets.ts +95 -0
  312. package/src/hooks/gesture/testing/createGestureSimulator.spec.ts +237 -0
  313. package/src/hooks/gesture/testing/createGestureSimulator.ts +310 -0
  314. package/src/hooks/gesture/thresholdValue.spec.ts +103 -0
  315. package/src/hooks/gesture/thresholdValue.ts +77 -0
  316. package/src/hooks/gesture/types.ts +290 -0
  317. package/src/hooks/gesture/useDirectionalLock.spec.ts +271 -0
  318. package/src/hooks/gesture/useDirectionalLock.ts +115 -0
  319. package/src/hooks/gesture/useEdgeSwipeInput.spec.ts +454 -0
  320. package/src/hooks/gesture/useEdgeSwipeInput.ts +131 -0
  321. package/src/hooks/gesture/useNativeGestureGuard.spec.ts +413 -0
  322. package/src/hooks/gesture/useNativeGestureGuard.ts +133 -0
  323. package/src/hooks/gesture/usePointerTracking.spec.ts +364 -0
  324. package/src/hooks/gesture/usePointerTracking.ts +134 -0
  325. package/src/hooks/gesture/useScrollBoundary.spec.ts +249 -0
  326. package/src/hooks/gesture/useScrollBoundary.ts +113 -0
  327. package/src/hooks/gesture/useSwipeInput.spec.ts +592 -0
  328. package/src/hooks/gesture/useSwipeInput.ts +310 -0
  329. package/src/hooks/gesture/utils.spec.ts +152 -0
  330. package/src/hooks/gesture/utils.ts +87 -0
  331. package/src/hooks/useAnimatedVisibility.spec.ts +257 -0
  332. package/src/hooks/useAnimatedVisibility.ts +146 -0
  333. package/src/hooks/useAnimationFrame.ts +200 -0
  334. package/src/hooks/useCSSMatrix.spec.ts +214 -0
  335. package/src/hooks/useCSSMatrix.ts +262 -0
  336. package/src/hooks/useClonedElementPreview.ts +28 -0
  337. package/src/hooks/useContainerScroll.ts +78 -0
  338. package/src/hooks/useContentCache.spec.tsx +232 -0
  339. package/src/hooks/useContentCache.tsx +127 -0
  340. package/src/hooks/useDocumentPointerEvents.ts +137 -0
  341. package/src/hooks/useDocumentScroll.ts +41 -0
  342. package/src/hooks/useEffectEvent.ts +40 -0
  343. package/src/hooks/useElementComponentWrapper.tsx +63 -0
  344. package/src/hooks/useIntersectionObserver.tsx +125 -0
  345. package/src/hooks/useIsomorphicLayoutEffect.ts +29 -0
  346. package/src/hooks/useResizeObserver.tsx +81 -0
  347. package/src/hooks/useScrollContainer.ts +79 -0
  348. package/src/hooks/useSnapAnimation.ts +128 -0
  349. package/src/hooks/useSwipeContentTransform.spec.ts +133 -0
  350. package/src/hooks/useSwipeContentTransform.ts +235 -0
  351. package/src/hooks/useTransitionState.ts +95 -0
  352. package/src/index.tsx +88 -0
  353. package/src/modules/grid/GridLayoutContext.tsx +57 -0
  354. package/src/modules/grid/LayerInstanceContext.tsx +56 -0
  355. package/src/modules/grid/resizeHandles.ts +157 -0
  356. package/src/modules/grid/trackUtils.ts +146 -0
  357. package/src/modules/grid/useGridPlacements.ts +143 -0
  358. package/src/modules/grid/useGridTracks.ts +156 -0
  359. package/src/modules/grid/useLayerDragHandle.ts +16 -0
  360. package/src/modules/grid/useLayerInteractions.tsx +850 -0
  361. package/src/modules/keybindings/KeybindingsProvider.tsx +111 -0
  362. package/src/modules/panels/dom/DomRegistry.tsx +94 -0
  363. package/src/modules/panels/index.ts +45 -0
  364. package/src/modules/panels/interactions/InteractionsContext.test.tsx +330 -0
  365. package/src/modules/panels/interactions/InteractionsContext.tsx +394 -0
  366. package/src/modules/panels/interactions/dnd.ts +28 -0
  367. package/src/modules/panels/keybindings/KeybindingsInstaller.tsx +15 -0
  368. package/src/modules/panels/layout/adapter.ts +124 -0
  369. package/src/modules/panels/rendering/ContentRegistry.spec.tsx +304 -0
  370. package/src/modules/panels/rendering/ContentRegistry.tsx +205 -0
  371. package/src/modules/panels/rendering/GroupContainer.tsx +65 -0
  372. package/src/modules/panels/rendering/RenderBridge.tsx +115 -0
  373. package/src/modules/panels/rendering/RenderContext.tsx +31 -0
  374. package/src/modules/panels/state/PanelSplitHandles.tsx +147 -0
  375. package/src/modules/panels/state/PanelSystemContext.splitLimits.spec.tsx +50 -0
  376. package/src/modules/panels/state/PanelSystemContext.tsx +289 -0
  377. package/src/modules/panels/state/StateContext.tsx +12 -0
  378. package/src/modules/panels/state/cleanup.ts +37 -0
  379. package/src/modules/panels/state/commands.ts +53 -0
  380. package/src/modules/panels/state/focus/Context.tsx +25 -0
  381. package/src/modules/panels/state/focus/logic.ts +57 -0
  382. package/src/modules/panels/state/groups/Context.tsx +25 -0
  383. package/src/modules/panels/state/groups/logic.ts +105 -0
  384. package/src/modules/panels/state/splitLimits.spec.ts +46 -0
  385. package/src/modules/panels/state/splitLimits.ts +90 -0
  386. package/src/modules/panels/state/state.spec.ts +49 -0
  387. package/src/modules/panels/state/tree/Context.tsx +24 -0
  388. package/src/modules/panels/state/tree/logic.spec.ts +34 -0
  389. package/src/modules/panels/state/tree/logic.ts +138 -0
  390. package/src/modules/panels/state/types.ts +142 -0
  391. package/src/modules/panels/system/PanelSystem.empty-tabbar.spec.tsx +53 -0
  392. package/src/modules/panels/system/PanelSystem.tab-click-activates.spec.tsx +44 -0
  393. package/src/modules/panels/system/PanelSystem.tab-reorder.spec.tsx +64 -0
  394. package/src/modules/panels/system/PanelSystem.tabs-no-dup.spec.tsx +57 -0
  395. package/src/modules/panels/system/PanelSystem.tsx +206 -0
  396. package/src/modules/pivot/PivotContent.spec.tsx +179 -0
  397. package/src/modules/pivot/PivotContent.tsx +77 -0
  398. package/src/modules/pivot/SwipePivotContent.debug.tmp.tsx +237 -0
  399. package/src/modules/pivot/SwipePivotContent.position.spec.tsx +167 -0
  400. package/src/modules/pivot/SwipePivotContent.spec.tsx +464 -0
  401. package/src/modules/pivot/SwipePivotContent.test.tsx +502 -0
  402. package/src/modules/pivot/SwipePivotContent.tsx +197 -0
  403. package/src/modules/pivot/SwipePivotTabBar.spec.tsx +865 -0
  404. package/src/modules/pivot/SwipePivotTabBar.tsx +523 -0
  405. package/src/modules/pivot/index.ts +8 -0
  406. package/src/modules/pivot/scaleInputState.spec.ts +210 -0
  407. package/src/modules/pivot/scaleInputState.ts +66 -0
  408. package/src/modules/pivot/types.ts +139 -0
  409. package/src/modules/pivot/usePivot.spec.ts +621 -0
  410. package/src/modules/pivot/usePivot.spec.tsx +186 -0
  411. package/src/modules/pivot/usePivot.tsx +345 -0
  412. package/src/modules/pivot/usePivotSwipeInput.spec.ts +649 -0
  413. package/src/modules/pivot/usePivotSwipeInput.ts +136 -0
  414. package/src/modules/resizer/useResizeDrag.ts +94 -0
  415. package/src/modules/stack/StackContent.spec.tsx +264 -0
  416. package/src/modules/stack/StackContent.tsx +111 -0
  417. package/src/modules/stack/SwipeStackContent.spec.tsx +1277 -0
  418. package/src/modules/stack/SwipeStackContent.tsx +356 -0
  419. package/src/modules/stack/SwipeStackOutlet.spec.tsx +252 -0
  420. package/src/modules/stack/SwipeStackOutlet.tsx +221 -0
  421. package/src/modules/stack/computeStackContentState.spec.ts +281 -0
  422. package/src/modules/stack/computeStackContentState.ts +304 -0
  423. package/src/modules/stack/computeSwipeStackTransform.spec.ts +186 -0
  424. package/src/modules/stack/computeSwipeStackTransform.ts +145 -0
  425. package/src/modules/stack/types.ts +226 -0
  426. package/src/modules/stack/useStackAnimationState.spec.ts +186 -0
  427. package/src/modules/stack/useStackAnimationState.ts +138 -0
  428. package/src/modules/stack/useStackNavigation.spec.ts +477 -0
  429. package/src/modules/stack/useStackNavigation.tsx +336 -0
  430. package/src/modules/stack/useStackSwipeInput.spec.ts +276 -0
  431. package/src/modules/stack/useStackSwipeInput.ts +139 -0
  432. package/src/modules/window/useDrawerState.ts +81 -0
  433. package/src/modules/window/useFloatingState.spec.ts +252 -0
  434. package/src/modules/window/useFloatingState.ts +141 -0
  435. package/src/panels/index.ts +119 -0
  436. package/src/pivot/index.ts +19 -0
  437. package/src/resizer/index.ts +68 -0
  438. package/src/stack/index.ts +91 -0
  439. package/src/sticky-header/StickyArea.tsx +221 -0
  440. package/src/sticky-header/index.ts +18 -0
  441. package/src/sticky-header/types.ts +68 -0
  442. package/src/types.ts +323 -0
  443. package/src/utils/CSSMatrix.ts +321 -0
  444. package/src/utils/css.ts +65 -0
  445. package/src/utils/dialogUtils.ts +43 -0
  446. package/src/utils/math.ts +18 -0
  447. package/src/utils/polyfills/createDialogPolyfill.ts +18 -0
  448. package/src/utils/typedActions.ts +103 -0
  449. package/src/vite-env.d.ts +6 -0
  450. package/src/window/index.ts +67 -0
  451. package/dist/GridLayout-BQQ63eA1.cjs +0 -2
  452. package/dist/GridLayout-BQQ63eA1.cjs.map +0 -1
  453. package/dist/GridLayout-CJTKq7Mp.js +0 -1465
  454. package/dist/GridLayout-CJTKq7Mp.js.map +0 -1
  455. package/dist/sticky-header/StickyHeader.d.ts +0 -53
  456. package/dist/styles-CA2_zLZt.js +0 -52
  457. package/dist/styles-CA2_zLZt.js.map +0 -1
  458. package/dist/styles-PsqGOEJP.cjs +0 -2
  459. package/dist/styles-PsqGOEJP.cjs.map +0 -1
  460. package/dist/usePivot-7ctin_P_.cjs +0 -2
  461. package/dist/usePivot-7ctin_P_.cjs.map +0 -1
  462. package/dist/usePivot-CgQxB8rc.js +0 -124
  463. package/dist/usePivot-CgQxB8rc.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GridLayout-BltqeCPK.js","sources":["../src/hooks/useIntersectionObserver.tsx","../src/components/grid/GridLayerResizeHandles.tsx","../src/components/pivot/PivotLayer.tsx","../src/components/grid/GridLayerList.tsx","../src/components/grid/GridTrackResizeHandle.tsx","../src/modules/grid/useGridPlacements.ts","../src/utils/css.ts","../src/utils/math.ts","../src/modules/grid/trackUtils.ts","../src/modules/grid/resizeHandles.ts","../src/modules/grid/useGridTracks.ts","../src/modules/grid/useLayerInteractions.tsx","../src/components/grid/GridLayout.tsx"],"sourcesContent":["/**\n * @file Shared useIntersectionObserver hook with cached observer instances.\n */\nimport * as React from \"react\";\n\nconst createIdGenerator = () => {\n const map = new Map<object, number>();\n return (ref: object | null | undefined) => {\n if (!ref) {\n return undefined;\n }\n const existing = map.get(ref);\n if (existing !== undefined) {\n return existing;\n }\n const nextId = map.size;\n map.set(ref, nextId);\n return nextId;\n };\n};\n\nconst getId = createIdGenerator();\ntype Unobserve = () => void;\ntype Callback = (entry: IntersectionObserverEntry) => void;\ntype SharedObserver = {\n observe: (target: Element, callback: Callback) => Unobserve;\n};\nconst observerCache = new Map<string, SharedObserver>();\nconst getSharedObserver = (options: IntersectionObserverInit) => {\n const observerKey = `ovs-threshold:${options.threshold}-rootMargin:${options.rootMargin}-root:${getId(options.root)}`;\n\n if (observerCache.has(observerKey)) {\n return observerCache.get(observerKey)!;\n }\n const observer = new (class {\n #callbackMap = new Map<Element, Callback>();\n #intersectionObserver = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n const callback = this.#callbackMap.get(entry.target);\n if (callback) {\n callback(entry);\n }\n });\n }, options);\n observe(target: Element, callback: Callback) {\n this.#callbackMap.set(target, callback);\n this.#intersectionObserver.observe(target);\n return () => {\n this.#callbackMap.delete(target);\n this.#intersectionObserver.unobserve(target);\n };\n }\n })();\n observerCache.set(observerKey, observer);\n\n return observer;\n};\nconst voidClientRect = Object.freeze({\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n}) as DOMRectReadOnly;\n/**\n * Observe intersection changes for a given element reference using shared observers.\n *\n * @param ref - Ref holding the element to observe.\n * @param options - Intersection observer configuration.\n * @returns Latest intersection entry snapshot with sensible defaults.\n */\nexport function useIntersectionObserver<T extends HTMLElement>(\n ref: React.RefObject<T | null>,\n { threshold = 0, rootMargin = \"0px\", root = null }: IntersectionObserverInit,\n): {\n readonly boundingClientRect: DOMRectReadOnly;\n readonly intersectionRatio: number;\n readonly intersectionRect: DOMRectReadOnly;\n readonly isIntersecting: boolean;\n readonly rootBounds: DOMRectReadOnly | null;\n readonly target: Element | null;\n readonly time: DOMHighResTimeStamp;\n} {\n const [intersection, setIntersection] = React.useState<IntersectionObserverEntry | null>(null);\n\n React.useEffect(() => {\n const target = ref.current;\n if (!target) {\n return;\n }\n\n const observer = getSharedObserver({\n threshold,\n rootMargin,\n root,\n });\n\n return observer.observe(target, (entry) => {\n setIntersection({\n isIntersecting: entry.isIntersecting,\n boundingClientRect: entry.boundingClientRect,\n intersectionRatio: entry.intersectionRatio,\n intersectionRect: entry.intersectionRect,\n rootBounds: entry.rootBounds,\n target: entry.target,\n time: entry.time,\n });\n });\n }, [ref, threshold, rootMargin, root]);\n\n return React.useMemo(() => {\n return {\n isIntersecting: intersection?.isIntersecting ?? false,\n boundingClientRect: intersection?.boundingClientRect ?? voidClientRect,\n intersectionRatio: intersection?.intersectionRatio ?? 0,\n intersectionRect: intersection?.intersectionRect ?? voidClientRect,\n rootBounds: intersection?.rootBounds ?? null,\n target: intersection?.target ?? ref.current,\n time: intersection?.time ?? 0,\n };\n }, [intersection, ref]);\n}\n","/**\n * @file Presentational resize handles for floating layers (corner + edge).\n */\nimport * as React from \"react\";\nimport { GRID_LAYER_CORNER_HIT_SIZE, GRID_LAYER_EDGE_HIT_THICKNESS } from \"../../constants/styles\";\n\nconst resizeHandleBaseStyle: React.CSSProperties = {\n position: \"absolute\",\n pointerEvents: \"auto\",\n boxSizing: \"border-box\",\n background: \"transparent\",\n border: \"none\",\n};\n\nconst cornerHandleStyle: React.CSSProperties = {\n ...resizeHandleBaseStyle,\n width: GRID_LAYER_CORNER_HIT_SIZE,\n height: GRID_LAYER_CORNER_HIT_SIZE,\n zIndex: 2,\n};\n\nconst edgeHandleStyle: React.CSSProperties = {\n ...resizeHandleBaseStyle,\n zIndex: 1,\n};\n\nconst cornerPositions: Record<string, React.CSSProperties> = {\n \"top-left\": {\n top: 0,\n left: 0,\n transform: \"translate(-50%, -50%)\",\n cursor: \"nwse-resize\",\n },\n \"top-right\": {\n top: 0,\n right: 0,\n transform: \"translate(50%, -50%)\",\n cursor: \"nesw-resize\",\n },\n \"bottom-left\": {\n bottom: 0,\n left: 0,\n transform: \"translate(-50%, 50%)\",\n cursor: \"nesw-resize\",\n },\n \"bottom-right\": {\n bottom: 0,\n right: 0,\n transform: \"translate(50%, 50%)\",\n cursor: \"nwse-resize\",\n },\n};\n\nconst edgePositions: Record<string, React.CSSProperties> = {\n left: {\n top: GRID_LAYER_CORNER_HIT_SIZE,\n bottom: GRID_LAYER_CORNER_HIT_SIZE,\n left: 0,\n width: GRID_LAYER_EDGE_HIT_THICKNESS,\n transform: \"translateX(-50%)\",\n cursor: \"ew-resize\",\n },\n right: {\n top: GRID_LAYER_CORNER_HIT_SIZE,\n bottom: GRID_LAYER_CORNER_HIT_SIZE,\n right: 0,\n width: GRID_LAYER_EDGE_HIT_THICKNESS,\n transform: \"translateX(50%)\",\n cursor: \"ew-resize\",\n },\n top: {\n left: GRID_LAYER_CORNER_HIT_SIZE,\n right: GRID_LAYER_CORNER_HIT_SIZE,\n top: 0,\n height: GRID_LAYER_EDGE_HIT_THICKNESS,\n transform: \"translateY(-50%)\",\n cursor: \"ns-resize\",\n },\n bottom: {\n left: GRID_LAYER_CORNER_HIT_SIZE,\n right: GRID_LAYER_CORNER_HIT_SIZE,\n bottom: 0,\n height: GRID_LAYER_EDGE_HIT_THICKNESS,\n transform: \"translateY(50%)\",\n cursor: \"ns-resize\",\n },\n};\n\nexport type HorizontalEdge = \"left\" | \"right\";\nexport type VerticalEdge = \"top\" | \"bottom\";\n\nexport type ResizeHandleConfig =\n | {\n key: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n variant: \"corner\";\n horizontal: HorizontalEdge;\n vertical: VerticalEdge;\n }\n | {\n key: \"left\" | \"right\" | \"top\" | \"bottom\";\n variant: \"edge\";\n horizontal?: HorizontalEdge;\n vertical?: VerticalEdge;\n };\n\nconst RESIZE_HANDLE_CONFIGS: ReadonlyArray<ResizeHandleConfig> = [\n { key: \"top-left\", variant: \"corner\", horizontal: \"left\", vertical: \"top\" },\n { key: \"top-right\", variant: \"corner\", horizontal: \"right\", vertical: \"top\" },\n { key: \"bottom-left\", variant: \"corner\", horizontal: \"left\", vertical: \"bottom\" },\n { key: \"bottom-right\", variant: \"corner\", horizontal: \"right\", vertical: \"bottom\" },\n { key: \"left\", variant: \"edge\", horizontal: \"left\" },\n { key: \"right\", variant: \"edge\", horizontal: \"right\" },\n { key: \"top\", variant: \"edge\", vertical: \"top\" },\n { key: \"bottom\", variant: \"edge\", vertical: \"bottom\" },\n];\n\nexport type GridLayerResizeHandlesProps = {\n layerId: string;\n onPointerDown: (config: ResizeHandleConfig, event: React.PointerEvent<HTMLDivElement>) => void;\n};\n\nexport const GridLayerResizeHandles: React.FC<GridLayerResizeHandlesProps> = ({ layerId, onPointerDown }) => {\n return (\n <>\n {RESIZE_HANDLE_CONFIGS.map((config) => {\n const baseStyle = config.variant === \"corner\" ? cornerHandleStyle : edgeHandleStyle;\n const positionStyle = config.variant === \"corner\" ? cornerPositions[config.key] : edgePositions[config.key];\n const combinedStyle = { ...baseStyle, ...positionStyle };\n const datasetProps =\n config.variant === \"corner\" ? { \"data-resize-corner\": config.key } : { \"data-resize-edge\": config.key };\n return (\n <div\n key={config.key}\n role=\"presentation\"\n aria-hidden=\"true\"\n style={combinedStyle}\n {...datasetProps}\n data-layer-id={layerId}\n onPointerDown={(event) => onPointerDown(config, event)}\n />\n );\n })}\n </>\n );\n};\n","/**\n * @file PivotLayer component for rendering pivot behavior within GridLayout.\n * This component bridges the usePivot hook with the GridLayout layer system.\n */\nimport * as React from \"react\";\nimport type { PivotBehavior } from \"../../types\";\nimport { usePivot } from \"../../modules/pivot\";\n\nexport type PivotLayerProps = {\n pivot: PivotBehavior;\n};\n\n/**\n * Internal component that renders pivot content using React.Activity.\n * Used by GridLayerList when a layer has pivot behavior.\n */\nexport const PivotLayer: React.FC<PivotLayerProps> = ({ pivot }) => {\n const { Outlet } = usePivot({\n items: pivot.items,\n activeId: pivot.activeId,\n defaultActiveId: pivot.defaultActiveId,\n onActiveChange: pivot.onActiveChange,\n transitionMode: pivot.transitionMode,\n });\n\n return <Outlet />;\n};\n","/**\n * @file Layer list rendering inside the grid layout.\n *\n * Uses content caching from PanelSystemContext to preserve component state\n * when parent components re-render and recreate the layers array.\n */\nimport * as React from \"react\";\nimport type { LayerDefinition } from \"../../types\";\nimport { useGridLayoutContext } from \"../../modules/grid/GridLayoutContext\";\nimport type { ResizeHandleConfig } from \"../../modules/grid/GridLayoutContext\";\nimport { LayerInstanceProvider } from \"../../modules/grid/LayerInstanceContext\";\nimport { usePanelSystem } from \"../../PanelSystemContext\";\nimport { PopupLayerPortal } from \"../window/PopupLayerPortal\";\nimport { FloatingWindow } from \"../window/FloatingWindow\";\nimport { GridLayerResizeHandles } from \"./GridLayerResizeHandles\";\nimport { PivotLayer } from \"../pivot/PivotLayer\";\n\ntype GridLayerListProps = {\n layers: LayerDefinition[];\n};\n\n/**\n * Resolves layer content based on pivot and cache settings.\n * Pivot layers use PivotLayer component, others use cache or direct content.\n */\nconst resolveLayerContent = (\n layer: LayerDefinition,\n getCachedContent: (layerId: string) => React.ReactNode | null,\n): React.ReactNode => {\n if (layer.pivot) {\n return <PivotLayer pivot={layer.pivot} />;\n }\n if (layer.cache) {\n return getCachedContent(layer.id);\n }\n return layer.component;\n};\n\n/**\n * Renders layer content with optional FloatingWindow chrome.\n * Handles both chrome and non-chrome layers.\n * Uses cached content only when layer.cache is true.\n */\nconst LayerContentRenderer = React.memo<{\n layer: LayerDefinition;\n onClose: () => void;\n}>(({ layer, onClose }) => {\n const { getCachedContent } = usePanelSystem();\n\n const content = resolveLayerContent(layer, getCachedContent);\n\n if (!layer.floating?.chrome) {\n return content;\n }\n\n return (\n <FloatingWindow id={layer.id} config={layer.floating} onClose={onClose}>\n {content}\n </FloatingWindow>\n );\n});\nLayerContentRenderer.displayName = \"LayerContentRenderer\";\n\n/**\n * Renders resize handles if the layer is resizable.\n */\nconst LayerResizeHandles = React.memo<{\n layerId: string;\n isResizable: boolean;\n onPointerDown: (config: ResizeHandleConfig, event: React.PointerEvent<HTMLDivElement>) => void;\n}>(({ layerId, isResizable, onPointerDown }) => {\n if (!isResizable) {\n return null;\n }\n return <GridLayerResizeHandles layerId={layerId} onPointerDown={onPointerDown} />;\n});\nLayerResizeHandles.displayName = \"LayerResizeHandles\";\n\n/**\n * Determines the overflow style for a layer based on scrollable flag and floating status.\n * - scrollable: auto (enable scrolling within container)\n * - floating: visible (allow box-shadow to render outside bounds)\n * - Not scrollable and not floating: hidden (prevent overflow)\n */\nconst resolveOverflowStyle = (\n scrollable: boolean | undefined,\n isFloating: boolean,\n): React.CSSProperties[\"overflow\"] => {\n if (scrollable) {\n return \"auto\";\n }\n if (isFloating) {\n return \"visible\";\n }\n return \"hidden\";\n};\n\n/**\n * Renders a single embedded layer (non-popup).\n */\nconst EmbeddedLayer = React.memo<{\n layer: LayerDefinition;\n handleLayerPointerDown: (e: React.PointerEvent<HTMLDivElement>) => void;\n}>(({ layer, handleLayerPointerDown }) => {\n const { getLayerRenderState } = useGridLayoutContext();\n const { style, isResizable, isResizing, onResizeHandlePointerDown } = getLayerRenderState(layer);\n\n const gridPlacementStyle = React.useMemo<React.CSSProperties>(() => {\n const placement: React.CSSProperties = {};\n if (layer.gridArea) {\n placement.gridArea = layer.gridArea;\n }\n if (layer.gridRow) {\n placement.gridRow = layer.gridRow;\n }\n if (layer.gridColumn) {\n placement.gridColumn = layer.gridColumn;\n }\n return placement;\n }, [layer.gridArea, layer.gridRow, layer.gridColumn]);\n\n const combinedStyle = React.useMemo<React.CSSProperties>(() => {\n // min-width/height: 0 allows grid items to shrink below content size\n const isFloating = Boolean(layer.floating);\n const overflow = resolveOverflowStyle(layer.scrollable, isFloating);\n const baseStyle: React.CSSProperties = {\n ...style,\n ...gridPlacementStyle,\n minWidth: 0,\n minHeight: 0,\n overflow,\n };\n return isResizable ? { ...baseStyle, position: \"relative\" } : baseStyle;\n }, [style, gridPlacementStyle, isResizable, layer.scrollable, layer.floating]);\n\n const handleClose = React.useCallback(() => {\n layer.floating?.onClose?.();\n }, [layer.floating]);\n\n return (\n <div\n data-layer-id={layer.id}\n data-draggable={Boolean(layer.floating?.draggable)}\n data-resizable={isResizable}\n data-resizing={isResizing}\n style={combinedStyle}\n onPointerDown={handleLayerPointerDown}\n >\n <LayerInstanceProvider layerId={layer.id}>\n <LayerContentRenderer layer={layer} onClose={handleClose} />\n </LayerInstanceProvider>\n <LayerResizeHandles layerId={layer.id} isResizable={isResizable} onPointerDown={onResizeHandlePointerDown} />\n </div>\n );\n});\nEmbeddedLayer.displayName = \"EmbeddedLayer\";\n\nexport const GridLayerList: React.FC<GridLayerListProps> = ({ layers }) => {\n const { handleLayerPointerDown } = useGridLayoutContext();\n\n return (\n <>\n {layers.map((layer) => {\n const floatingMode = layer.floating?.mode ?? \"embedded\";\n if (layer.floating && floatingMode === \"popup\") {\n return <PopupLayerPortal key={layer.id} layer={layer} />;\n }\n return <EmbeddedLayer key={layer.id} layer={layer} handleLayerPointerDown={handleLayerPointerDown} />;\n })}\n </>\n );\n};\n","/**\n * @file Internal renderer for grid resize handles.\n */\nimport * as React from \"react\";\nimport { ResizeHandle } from \"../resizer/ResizeHandle\";\nimport { GRID_HANDLE_THICKNESS } from \"../../constants/styles\";\n\ntype TrackDirection = \"row\" | \"col\";\n\ntype GridTrackResizeHandleProps = {\n direction: TrackDirection;\n trackIndex: number;\n align: \"start\" | \"end\";\n gap: number;\n span: { start: number; end: number };\n onResize: (direction: TrackDirection, index: number, delta: number) => void;\n};\n\nconst resizeHandleWrapperBaseStyle: React.CSSProperties = {\n position: \"absolute\",\n pointerEvents: \"auto\",\n};\n\nexport const GridTrackResizeHandle: React.FC<GridTrackResizeHandleProps> = ({\n direction,\n trackIndex,\n align,\n gap,\n span,\n onResize,\n}) => {\n const resizeDirection = direction === \"col\" ? \"vertical\" : \"horizontal\";\n\n const handleResize = React.useCallback(\n (delta: number) => {\n const signedDelta = align === \"start\" ? -delta : delta;\n onResize(direction, trackIndex, signedDelta);\n },\n [align, direction, trackIndex, onResize],\n );\n\n const placementStyle = React.useMemo<React.CSSProperties>(() => {\n if (direction === \"col\") {\n return {\n gridColumn: `${trackIndex + 1} / ${trackIndex + 2}`,\n gridRow: `${span.start} / ${span.end}`,\n };\n }\n return {\n gridRow: `${trackIndex + 1} / ${trackIndex + 2}`,\n gridColumn: `${span.start} / ${span.end}`,\n };\n }, [direction, trackIndex, span]);\n\n const wrapperStyle = React.useMemo<React.CSSProperties>(() => {\n const halfGap = Math.max(0, gap) / 2;\n const offset = halfGap + GRID_HANDLE_THICKNESS / 2;\n\n if (direction === \"col\") {\n return {\n ...resizeHandleWrapperBaseStyle,\n width: GRID_HANDLE_THICKNESS,\n height: \"100%\",\n top: 0,\n bottom: 0,\n ...(align === \"start\" ? { left: -offset } : { right: -offset }),\n };\n }\n\n return {\n ...resizeHandleWrapperBaseStyle,\n width: \"100%\",\n height: GRID_HANDLE_THICKNESS,\n left: 0,\n right: 0,\n ...(align === \"start\" ? { top: -offset } : { bottom: -offset }),\n };\n }, [align, direction, gap]);\n\n return (\n <div data-resizable=\"true\" style={{ ...placementStyle, position: \"relative\", pointerEvents: \"none\" }}>\n <div data-direction={resizeDirection} data-align={align} data-handle=\"true\" style={wrapperStyle}>\n <ResizeHandle direction={resizeDirection} onResize={handleResize} />\n </div>\n </div>\n );\n};\n","/**\n * @file Hooks for deriving grid placements and layer collections.\n */\nimport * as React from \"react\";\nimport type { LayerDefinition, PanelLayoutConfig } from \"../../types\";\n\ntype GridPlacement = {\n gridArea: string;\n gridRow: string;\n gridColumn: string;\n};\n\nconst computeGridPlacements = (areas: PanelLayoutConfig[\"areas\"]): Map<string, GridPlacement> => {\n type Bounds = {\n rowStart: number;\n rowEnd: number;\n colStart: number;\n colEnd: number;\n };\n\n const boundsByArea = new Map<string, Bounds>();\n\n areas.forEach((row, rowIndex) => {\n row.forEach((area, colIndex) => {\n if (!area || area === \".\") {\n return;\n }\n\n const existing = boundsByArea.get(area);\n if (existing) {\n const nextBounds: Bounds = {\n rowStart: Math.min(existing.rowStart, rowIndex),\n rowEnd: Math.max(existing.rowEnd, rowIndex),\n colStart: Math.min(existing.colStart, colIndex),\n colEnd: Math.max(existing.colEnd, colIndex),\n };\n\n boundsByArea.set(area, nextBounds);\n return;\n }\n\n const initialBounds: Bounds = {\n rowStart: rowIndex,\n rowEnd: rowIndex,\n colStart: colIndex,\n colEnd: colIndex,\n };\n\n boundsByArea.set(area, initialBounds);\n });\n });\n\n const placements = new Map<string, GridPlacement>();\n boundsByArea.forEach((bounds, area) => {\n const rowStart = bounds.rowStart + 1;\n const rowEnd = bounds.rowEnd + 2;\n const colStart = bounds.colStart + 1;\n const colEnd = bounds.colEnd + 2;\n\n const placement: GridPlacement = {\n gridArea: area,\n gridRow: `${rowStart} / ${rowEnd}`,\n gridColumn: `${colStart} / ${colEnd}`,\n };\n\n placements.set(area, placement);\n });\n\n return placements;\n};\n\nconst normalizeLayerForGrid = (\n layer: LayerDefinition,\n placements: Map<string, GridPlacement>,\n): LayerDefinition => {\n const mode = layer.positionMode ?? \"grid\";\n if (mode !== \"grid\") {\n return layer;\n }\n\n const placementKey = layer.gridArea ?? layer.id;\n const placement = placements.get(placementKey);\n\n if (!placement) {\n return layer;\n }\n\n const needsGridArea = !layer.gridArea;\n const needsRow = !layer.gridRow;\n const needsColumn = !layer.gridColumn;\n\n if (!needsGridArea && !needsRow && !needsColumn) {\n return layer;\n }\n\n return {\n ...layer,\n gridArea: needsGridArea ? placement.gridArea : layer.gridArea,\n gridRow: needsRow ? placement.gridRow : layer.gridRow,\n gridColumn: needsColumn ? placement.gridColumn : layer.gridColumn,\n };\n};\n\nexport const useGridPlacements = (\n config: PanelLayoutConfig,\n layers: LayerDefinition[],\n): {\n normalizedLayers: LayerDefinition[];\n visibleLayers: LayerDefinition[];\n regularLayers: LayerDefinition[];\n layerById: Map<string, LayerDefinition>;\n} => {\n const placements = React.useMemo(() => computeGridPlacements(config.areas), [config.areas]);\n\n const normalizedLayers = React.useMemo(() => {\n return layers.map((layer) => normalizeLayerForGrid(layer, placements));\n }, [layers, placements]);\n\n const visibleLayers = React.useMemo(\n () => normalizedLayers.filter((layer) => layer.visible !== false),\n [normalizedLayers],\n );\n\n const regularLayers = React.useMemo(\n () => visibleLayers.filter((layer) => !layer.drawer),\n [visibleLayers],\n );\n\n const layerById = React.useMemo(() => {\n const map = new Map<string, LayerDefinition>();\n normalizedLayers.forEach((layer) => {\n map.set(layer.id, layer);\n });\n return map;\n }, [normalizedLayers]);\n\n return {\n normalizedLayers,\n visibleLayers,\n regularLayers,\n layerById,\n };\n};\n","/**\n * @file Generic CSS parsing and measurement utilities.\n */\n\nexport type ParsedGap = {\n rowGap: number;\n columnGap: number;\n};\n\n/**\n * Parses a CSS gap value string into row and column gap numbers.\n * Supports single value (applied to both) or two values (row column).\n * Only handles px units; other units return 0.\n */\nexport const parseGapValue = (gapValue?: string): ParsedGap => {\n if (!gapValue) {\n return { rowGap: 0, columnGap: 0 };\n }\n\n const tokens = gapValue\n .split(/\\s+/)\n .map((token) => token.trim())\n .filter(Boolean);\n\n const parseToken = (token: string): number => {\n const match = token.match(/^(-?\\d+(?:\\.\\d+)?)px$/);\n if (!match) {\n return 0;\n }\n return Number.parseFloat(match[1]);\n };\n\n if (tokens.length === 1) {\n const parsed = parseToken(tokens[0]);\n return { rowGap: parsed, columnGap: parsed };\n }\n\n return {\n rowGap: parseToken(tokens[0]),\n columnGap: parseToken(tokens[1]),\n };\n};\n\nexport type GridDirection = \"col\" | \"row\";\n\n/**\n * Measures actual rendered grid track sizes from computed style.\n * Returns pixel values parsed from gridTemplateColumns or gridTemplateRows.\n */\nexport const measureGridTrackSizes = (\n containerEl: HTMLElement | null,\n direction: GridDirection,\n): number[] => {\n if (!containerEl) {\n return [];\n }\n const style = getComputedStyle(containerEl);\n const template = direction === \"col\" ? style.gridTemplateColumns : style.gridTemplateRows;\n\n // Computed style returns resolved pixel values like \"370px 500px\"\n return template\n .split(/\\s+/)\n .map((s) => parseFloat(s))\n .filter((n) => !Number.isNaN(n));\n};\n","/**\n * @file Primitive math helpers shared across modules.\n */\n\nexport const clampNumber = (\n value: number,\n min: number = Number.NEGATIVE_INFINITY,\n max: number = Number.POSITIVE_INFINITY,\n): number => {\n return Math.min(Math.max(value, min), max);\n};\n\nexport const toFiniteNumberOr = (value: number | undefined, fallback: number): number => {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return fallback;\n }\n return value;\n};\n","/**\n * @file Grid track sizing utilities.\n */\nimport type * as React from \"react\";\nimport type { GridTrack } from \"../../types\";\nimport { clampNumber } from \"../../utils/math\";\nimport { measureGridTrackSizes, type GridDirection, type ParsedGap } from \"../../utils/css\";\n\nexport type TrackDirection = GridDirection;\n\nexport const createTrackKey = (direction: TrackDirection, index: number): string => {\n return `${direction}-${index}`;\n};\n\nexport const getTrackSize = (\n track: GridTrack,\n trackSizes: Record<string, number>,\n direction: TrackDirection,\n index: number,\n): string => {\n const key = createTrackKey(direction, index);\n const currentSize = trackSizes[key];\n if (currentSize !== undefined) {\n // Use minmax() to ensure the track can shrink if container is smaller\n // This prevents overflow when container width is less than the resized size\n const minSize = track.minSize ?? 0;\n return `minmax(${minSize}px, ${currentSize}px)`;\n }\n return track.size;\n};\n\nexport const buildTrackTemplateString = (\n tracks: GridTrack[],\n trackSizes: Record<string, number>,\n direction: TrackDirection,\n): string => {\n return tracks.map((track, index) => getTrackSize(track, trackSizes, direction, index)).join(\" \");\n};\n\nexport const extractInitialTrackSizes = (\n tracks: GridTrack[],\n direction: TrackDirection,\n): Record<string, number> => {\n return tracks.reduce<Record<string, number>>((acc, track, index) => {\n if (track.resizable && track.size.endsWith(\"px\")) {\n acc[createTrackKey(direction, index)] = parseInt(track.size, 10);\n }\n return acc;\n }, {});\n};\n\nexport type ResolveTrackSizeParams = {\n trackSizes: Record<string, number>;\n track: GridTrack;\n direction: TrackDirection;\n trackIndex: number;\n containerRef: React.RefObject<HTMLElement | null> | undefined;\n};\n\nexport const resolveCurrentTrackSize = ({\n trackSizes,\n track,\n direction,\n trackIndex,\n containerRef,\n}: ResolveTrackSizeParams): number => {\n const key = createTrackKey(direction, trackIndex);\n const storedSize = trackSizes[key];\n\n if (storedSize !== undefined) {\n return storedSize;\n }\n\n // Try to measure actual rendered size from DOM\n const measuredSizes = measureGridTrackSizes(containerRef?.current ?? null, direction);\n const measuredSize = measuredSizes[trackIndex];\n if (measuredSize !== undefined && measuredSize > 0) {\n return measuredSize;\n }\n\n // Fallback: parse simple px value from track definition\n if (track.size.endsWith(\"px\")) {\n return Number.parseInt(track.size, 10);\n }\n\n return 300;\n};\n\nconst calculateOtherTracksMinSpace = (tracks: GridTrack[], excludeIndex: number): number => {\n return tracks.reduce((sum, t, idx) => {\n if (idx === excludeIndex) {\n return sum;\n }\n // For fr tracks, assume minimum of 100px; for fixed tracks, use their minSize or parsed size\n if (t.size.includes(\"fr\")) {\n return sum + 100;\n }\n return sum + (t.minSize ?? 50);\n }, 0);\n};\n\nexport type EffectiveMaxSizeParams = {\n track: GridTrack;\n tracks: GridTrack[];\n trackIndex: number;\n direction: TrackDirection;\n containerRef: React.RefObject<HTMLElement | null> | undefined;\n gapSizes: ParsedGap;\n};\n\nexport const calculateEffectiveMaxSize = ({\n track,\n tracks,\n trackIndex,\n direction,\n containerRef,\n gapSizes,\n}: EffectiveMaxSizeParams): number | undefined => {\n if (!containerRef?.current) {\n return track.maxSize;\n }\n\n const containerSize =\n direction === \"col\" ? containerRef.current.offsetWidth : containerRef.current.offsetHeight;\n\n const otherTracksMinSpace = calculateOtherTracksMinSpace(tracks, trackIndex);\n\n const gapCount = tracks.length - 1;\n const gapSize = direction === \"col\" ? gapSizes.columnGap : gapSizes.rowGap;\n const totalGapSpace = gapCount * gapSize;\n\n const dynamicMax = containerSize - otherTracksMinSpace - totalGapSpace;\n\n if (track.maxSize !== undefined) {\n return Math.min(track.maxSize, dynamicMax);\n }\n return dynamicMax;\n};\n\nexport const applyTrackConstraints = (\n size: number,\n minSize?: number,\n maxSize?: number,\n): number => {\n return clampNumber(size, minSize ?? Number.NEGATIVE_INFINITY, maxSize ?? Number.POSITIVE_INFINITY);\n};\n","/**\n * @file Resize handle configuration computation for grid tracks.\n */\nimport type { GridTrack } from \"../../types\";\n\nexport type TrackHandleConfig = {\n trackIndex: number;\n align: \"start\" | \"end\";\n span: { start: number; end: number };\n};\n\n/**\n * Computes the valid row span for a column boundary.\n * Returns the contiguous range of rows where the adjacent areas differ.\n */\nconst computeColumnBoundarySpan = (\n areas: string[][],\n boundaryIndex: number,\n): { start: number; end: number } => {\n const rowCount = areas.length;\n\n // Find rows where left and right areas differ at this boundary\n const validRows: number[] = [];\n for (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {\n const row = areas[rowIndex];\n const leftArea = row[boundaryIndex];\n const rightArea = row[boundaryIndex + 1];\n if (leftArea !== rightArea) {\n validRows.push(rowIndex);\n }\n }\n\n if (validRows.length === 0) {\n // Fallback: full span if no valid rows found (shouldn't happen for resizable columns)\n return { start: 1, end: rowCount + 1 };\n }\n\n // Convert to 1-indexed grid lines\n const minRow = Math.min(...validRows);\n const maxRow = Math.max(...validRows);\n return { start: minRow + 1, end: maxRow + 2 };\n};\n\n/**\n * Computes the valid column span for a row boundary.\n * Returns the contiguous range of columns where the adjacent areas differ.\n */\nconst computeRowBoundarySpan = (\n areas: string[][],\n boundaryIndex: number,\n): { start: number; end: number } => {\n const topRow = areas[boundaryIndex];\n const bottomRow = areas[boundaryIndex + 1];\n const colCount = topRow?.length ?? 0;\n\n // Find columns where top and bottom areas differ at this boundary\n const validCols: number[] = [];\n for (let colIndex = 0; colIndex < colCount; colIndex++) {\n const topArea = topRow?.[colIndex];\n const bottomArea = bottomRow?.[colIndex];\n if (topArea !== bottomArea) {\n validCols.push(colIndex);\n }\n }\n\n if (validCols.length === 0) {\n // Fallback: full span if no valid columns found\n return { start: 1, end: colCount + 1 };\n }\n\n // Convert to 1-indexed grid lines\n const minCol = Math.min(...validCols);\n const maxCol = Math.max(...validCols);\n return { start: minCol + 1, end: maxCol + 2 };\n};\n\nexport const computeColumnResizeHandles = (\n tracks: GridTrack[],\n areas: string[][],\n): TrackHandleConfig[] => {\n if (tracks.length === 0) {\n return [];\n }\n\n const rowCount = areas.length;\n\n if (tracks.length === 1) {\n const onlyTrack = tracks[0];\n if (onlyTrack?.resizable) {\n const fullSpan = { start: 1, end: rowCount + 1 };\n return [{ trackIndex: 0, align: \"end\", span: fullSpan }];\n }\n return [];\n }\n\n const handles: TrackHandleConfig[] = [];\n\n const boundaryIndexes = Array.from({ length: tracks.length - 1 }, (_, index) => index);\n boundaryIndexes.forEach((boundaryIndex) => {\n const leftTrack = tracks[boundaryIndex];\n const rightTrack = tracks[boundaryIndex + 1];\n\n if (rightTrack?.resizable) {\n const span = computeColumnBoundarySpan(areas, boundaryIndex);\n handles.push({ trackIndex: boundaryIndex + 1, align: \"start\", span });\n return;\n }\n\n if (leftTrack?.resizable) {\n const span = computeColumnBoundarySpan(areas, boundaryIndex);\n handles.push({ trackIndex: boundaryIndex, align: \"end\", span });\n }\n });\n\n return handles;\n};\n\nexport const computeRowResizeHandles = (\n tracks: GridTrack[],\n areas: string[][],\n): TrackHandleConfig[] => {\n if (tracks.length === 0) {\n return [];\n }\n\n const colCount = areas[0]?.length ?? 0;\n\n if (tracks.length === 1) {\n const onlyTrack = tracks[0];\n if (onlyTrack?.resizable) {\n const fullSpan = { start: 1, end: colCount + 1 };\n return [{ trackIndex: 0, align: \"end\", span: fullSpan }];\n }\n return [];\n }\n\n const handles: TrackHandleConfig[] = [];\n\n const boundaryIndexes = Array.from({ length: tracks.length - 1 }, (_, index) => index);\n boundaryIndexes.forEach((boundaryIndex) => {\n const topTrack = tracks[boundaryIndex];\n const bottomTrack = tracks[boundaryIndex + 1];\n\n if (bottomTrack?.resizable) {\n const span = computeRowBoundarySpan(areas, boundaryIndex);\n handles.push({ trackIndex: boundaryIndex + 1, align: \"start\", span });\n return;\n }\n\n if (topTrack?.resizable) {\n const span = computeRowBoundarySpan(areas, boundaryIndex);\n handles.push({ trackIndex: boundaryIndex, align: \"end\", span });\n }\n });\n\n return handles;\n};\n","/**\n * @file Track sizing and resize handle hooks for the grid layout.\n */\nimport * as React from \"react\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport type { PanelLayoutConfig } from \"../../types\";\nimport { parseGapValue, type ParsedGap } from \"../../utils/css\";\nimport {\n type TrackDirection,\n createTrackKey,\n buildTrackTemplateString,\n extractInitialTrackSizes,\n resolveCurrentTrackSize,\n calculateEffectiveMaxSize,\n applyTrackConstraints,\n} from \"./trackUtils\";\nimport {\n type TrackHandleConfig,\n computeColumnResizeHandles,\n computeRowResizeHandles,\n} from \"./resizeHandles\";\n\n// Re-export types for external consumers\nexport type { TrackHandleConfig } from \"./resizeHandles\";\nexport type { TrackDirection } from \"./trackUtils\";\n\nconst getGapStyle = (gap?: string): React.CSSProperties => {\n return gap !== undefined ? { gap } : {};\n};\n\n/**\n * Merges new track sizes with existing ones, preserving user-resized values.\n * Only applies initial values for newly added tracks.\n */\nconst mergeTrackSizes = (\n prev: Record<string, number>,\n initialSizes: Record<string, number>,\n): Record<string, number> | null => {\n const nextKeys = Object.keys(initialSizes);\n\n // Preserve existing values; use initial values only for new tracks\n const merged: Record<string, number> = {};\n for (const key of nextKeys) {\n merged[key] = prev[key] ?? initialSizes[key];\n }\n\n // Check if there are any changes\n const prevKeys = Object.keys(prev);\n const keysChangedByLength = prevKeys.length !== nextKeys.length;\n const keysChangedByMissing = prevKeys.some(\n (key) => !Object.prototype.hasOwnProperty.call(merged, key),\n );\n const keysChanged = keysChangedByLength ? true : keysChangedByMissing;\n const valuesChanged = nextKeys.some((key) => prev[key] !== merged[key]);\n\n const hasChanges = keysChanged ? true : valuesChanged;\n return hasChanges ? merged : null;\n};\n\nexport const useGridTracks = (\n config: PanelLayoutConfig,\n styleProp?: React.CSSProperties,\n containerRef?: React.RefObject<HTMLElement | null>,\n): {\n columnHandles: TrackHandleConfig[];\n rowHandles: TrackHandleConfig[];\n gapSizes: ParsedGap;\n gridStyle: React.CSSProperties;\n handleResize: (direction: TrackDirection, trackIndex: number, delta: number) => void;\n} => {\n const [trackSizes, setTrackSizes] = React.useState<Record<string, number>>(() => ({\n ...extractInitialTrackSizes(config.columns, \"col\"),\n ...extractInitialTrackSizes(config.rows, \"row\"),\n }));\n\n useIsomorphicLayoutEffect(() => {\n const initialSizes = {\n ...extractInitialTrackSizes(config.columns, \"col\"),\n ...extractInitialTrackSizes(config.rows, \"row\"),\n };\n\n setTrackSizes((prev) => {\n const merged = mergeTrackSizes(prev, initialSizes);\n return merged ?? prev;\n });\n }, [config.columns, config.rows]);\n\n const areasString = React.useMemo(() => {\n return config.areas.map((row) => `\"${row.join(\" \")}\"`).join(\" \");\n }, [config.areas]);\n\n const gapSizes = React.useMemo(() => parseGapValue(config.gap), [config.gap]);\n\n const columnHandles = React.useMemo(\n () => computeColumnResizeHandles(config.columns, config.areas),\n [config.columns, config.areas],\n );\n\n const rowHandles = React.useMemo(\n () => computeRowResizeHandles(config.rows, config.areas),\n [config.rows, config.areas],\n );\n\n const gridStyle = React.useMemo((): React.CSSProperties => {\n return {\n ...config.style,\n ...styleProp,\n gridTemplateAreas: areasString,\n gridTemplateRows: buildTrackTemplateString(config.rows, trackSizes, \"row\"),\n gridTemplateColumns: buildTrackTemplateString(config.columns, trackSizes, \"col\"),\n ...getGapStyle(config.gap),\n };\n }, [areasString, config.columns, config.gap, config.rows, config.style, styleProp, trackSizes]);\n\n const handleResize = React.useCallback(\n (direction: TrackDirection, trackIndex: number, delta: number) => {\n const tracks = direction === \"row\" ? config.rows : config.columns;\n const track = tracks[trackIndex];\n if (!track || !track.resizable) {\n return;\n }\n\n const currentSize = resolveCurrentTrackSize({\n trackSizes,\n track,\n direction,\n trackIndex,\n containerRef,\n });\n const effectiveMaxSize = calculateEffectiveMaxSize({\n track,\n tracks,\n trackIndex,\n direction,\n containerRef,\n gapSizes,\n });\n\n const key = createTrackKey(direction, trackIndex);\n setTrackSizes((prev) => {\n const newSize = currentSize + delta;\n const constrained = applyTrackConstraints(newSize, track.minSize, effectiveMaxSize);\n return { ...prev, [key]: constrained };\n });\n },\n [config.columns, config.rows, trackSizes, containerRef, gapSizes],\n );\n\n return {\n columnHandles,\n rowHandles,\n gapSizes,\n gridStyle,\n handleResize,\n };\n};\n","/**\n * @file Drag and resize interaction management for floating grid layers.\n */\nimport * as React from \"react\";\nimport { useDocumentPointerEvents } from \"../../hooks/useDocumentPointerEvents\";\nimport { useEffectEvent } from \"../../hooks/useEffectEvent\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport type { LayerDefinition, WindowPosition, WindowSize } from \"../../types\";\nimport { clampNumber } from \"../../utils/math\";\n// Inline style computation previously in layerStyles to keep hook-local logic\nimport type { CSSProperties } from \"react\";\nimport type { GridLayerHandleProps, GridLayoutContextValue, ResizeHandleConfig } from \"./GridLayoutContext\";\n// UI components should not be imported here; expose pointer handlers instead.\n\ntype LayerSize = {\n width: number;\n height: number;\n};\n\ntype DragState = {\n pointerStartX: number;\n pointerStartY: number;\n initialTranslationX: number;\n initialTranslationY: number;\n baseLeft: number;\n baseTop: number;\n layerId: string;\n pointerId: number;\n target: HTMLElement;\n};\n\ntype HorizontalEdge = \"left\" | \"right\";\ntype VerticalEdge = \"top\" | \"bottom\";\n\ntype ResizeState = {\n layerId: string;\n pointerId: number;\n horizontalEdge?: HorizontalEdge;\n verticalEdge?: VerticalEdge;\n startX: number;\n startY: number;\n startWidth: number;\n startHeight: number;\n startPosition: { x: number; y: number };\n baseLeft: number;\n baseTop: number;\n minWidth?: number;\n maxWidth?: number;\n minHeight?: number;\n maxHeight?: number;\n target: HTMLElement;\n};\n\n// ------------------------------------------------------------------------------------------\n// Inline layer style computation (was layerStyles.ts)\n// ------------------------------------------------------------------------------------------\nconst resolvePositionMode = (layer: LayerDefinition): LayerDefinition[\"positionMode\"] => {\n if (layer.positionMode) {\n return layer.positionMode;\n }\n if (layer.floating) {\n const floatingMode = layer.floating.mode ?? \"embedded\";\n return floatingMode === \"embedded\" ? \"absolute\" : \"relative\";\n }\n return \"grid\";\n};\n\nconst getPositionModeStyle = (mode: LayerDefinition[\"positionMode\"]): CSSProperties => {\n return { position: mode === \"grid\" ? \"relative\" : mode };\n};\n\nconst getGridAreaStyle = (layer: LayerDefinition, mode: LayerDefinition[\"positionMode\"]): CSSProperties => {\n if (mode !== \"grid\") {\n return {};\n }\n return {\n gridArea: layer.gridArea,\n gridRow: layer.gridRow,\n gridColumn: layer.gridColumn,\n };\n};\n\nconst getAbsolutePositionStyle = (position?: WindowPosition | LayerDefinition[\"position\"]): CSSProperties => {\n if (!position) {\n return {};\n }\n\n return {\n top: position.top,\n right: position.right,\n bottom: position.bottom,\n left: position.left,\n };\n};\n\nconst getZIndexStyle = (zIndex?: number): CSSProperties => {\n return zIndex !== undefined ? { zIndex } : {};\n};\n\nconst getDimensionsStyle = (width?: number | string, height?: number | string): CSSProperties => {\n return {\n width,\n height,\n };\n};\n\nconst getPointerEventsStyle = (layer: LayerDefinition, mode: LayerDefinition[\"positionMode\"]): CSSProperties => {\n if (layer.pointerEvents !== undefined) {\n if (typeof layer.pointerEvents === \"boolean\") {\n return { pointerEvents: layer.pointerEvents ? \"auto\" : \"none\" };\n }\n return { pointerEvents: layer.pointerEvents };\n }\n\n if (mode === \"absolute\" || mode === \"fixed\") {\n return { pointerEvents: \"auto\" };\n }\n\n return {};\n};\n\nconst resolveEffectivePosition = (\n layer: LayerDefinition,\n): WindowPosition | LayerDefinition[\"position\"] | undefined => {\n // For floating layers, prioritize floating.position/defaultPosition\n if (layer.floating) {\n return layer.floating.position ?? layer.floating.defaultPosition ?? layer.position;\n }\n return layer.position;\n};\n\nconst resolveEffectiveSize = (\n layer: LayerDefinition,\n): {\n width?: number | string;\n height?: number | string;\n} => {\n // For floating layers, prioritize floating.size/defaultSize\n if (layer.floating) {\n const floatingSize = layer.floating.size ?? layer.floating.defaultSize;\n if (floatingSize) {\n return {\n width: floatingSize.width,\n height: floatingSize.height,\n };\n }\n }\n return {\n width: layer.width,\n height: layer.height,\n };\n};\n\nconst resolveEffectiveZIndex = (layer: LayerDefinition): number | undefined => {\n // For floating layers, prioritize floating.zIndex\n if (layer.floating?.zIndex !== undefined) {\n return layer.floating.zIndex;\n }\n return layer.zIndex;\n};\n\nconst buildLayerStyleObject = (layer: LayerDefinition): CSSProperties => {\n const resolvedMode = resolvePositionMode(layer);\n const effectivePosition = resolveEffectivePosition(layer);\n const effectiveSize = resolveEffectiveSize(layer);\n const effectiveZIndex = resolveEffectiveZIndex(layer);\n\n return {\n ...layer.style,\n ...getPositionModeStyle(resolvedMode),\n ...getGridAreaStyle(layer, resolvedMode),\n ...getAbsolutePositionStyle(effectivePosition),\n ...getZIndexStyle(effectiveZIndex),\n ...getDimensionsStyle(effectiveSize.width, effectiveSize.height),\n ...getPointerEventsStyle(layer, resolvedMode),\n };\n};\n\nconst resolveFloatingMode = (layer: LayerDefinition): \"embedded\" | \"popup\" | null => {\n const floating = layer.floating;\n if (!floating) {\n return null;\n }\n const mode = floating.mode ?? \"embedded\";\n return mode;\n};\n\nconst getEmbeddedFloatingConfig = (layer: LayerDefinition) => {\n const mode = resolveFloatingMode(layer);\n if (mode !== \"embedded\") {\n return null;\n }\n return layer.floating ?? null;\n};\n\nconst isInteractiveElement = (target: EventTarget | null): target is HTMLElement => {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n return [\"INPUT\", \"TEXTAREA\", \"SELECT\", \"BUTTON\"].includes(target.tagName);\n};\n\n\nconst clampDimension = (value: number, min?: number, max?: number): number => {\n const resolvedMin = min ?? Number.NEGATIVE_INFINITY;\n const resolvedMax = max ?? Number.POSITIVE_INFINITY;\n return clampNumber(value, resolvedMin, resolvedMax);\n};\n\nconst ensureNumericOffset = (value: number | string | undefined, key: keyof WindowPosition, layerId: string): number => {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n throw new Error(\n `Floating layer \"${layerId}\" must provide a numeric \"${key}\" value when draggable mode is enabled.`,\n );\n};\n\nconst resolveDragAnchor = (layer: LayerDefinition): { left: number; top: number } => {\n const floating = getEmbeddedFloatingConfig(layer);\n if (!floating) {\n throw new Error(`Floating layer \"${layer.id}\" is missing floating configuration required for dragging.`);\n }\n // Prioritize floating.position/defaultPosition over layer.position\n const position = floating.position ?? floating.defaultPosition ?? layer.position;\n if (!position) {\n throw new Error(`Floating layer \"${layer.id}\" must define position with left and top values.`);\n }\n return {\n left: ensureNumericOffset(position.left, \"left\", layer.id),\n top: ensureNumericOffset(position.top, \"top\", layer.id),\n };\n};\n\nconst resolveFloatingConstraints = (\n layer: LayerDefinition,\n): { minWidth?: number; maxWidth?: number; minHeight?: number; maxHeight?: number } => {\n const floating = getEmbeddedFloatingConfig(layer);\n if (!floating) {\n return {};\n }\n return floating.constraints ?? {};\n};\n\nconst resolveHorizontalSizeCandidate = (\n edge: HorizontalEdge | undefined,\n startSize: number,\n delta: number,\n): number => {\n if (!edge) {\n return startSize;\n }\n return edge === \"left\" ? startSize - delta : startSize + delta;\n};\n\nconst resolveVerticalSizeCandidate = (edge: VerticalEdge | undefined, startSize: number, delta: number): number => {\n if (!edge) {\n return startSize;\n }\n return edge === \"top\" ? startSize - delta : startSize + delta;\n};\n\nconst resolveHorizontalPosition = (\n edge: HorizontalEdge | undefined,\n startPosition: number,\n delta: number,\n): number => {\n if (!edge || edge === \"right\") {\n return startPosition;\n }\n return startPosition + delta;\n};\n\nconst resolveVerticalPosition = (\n edge: VerticalEdge | undefined,\n startPosition: number,\n delta: number,\n): number => {\n if (!edge || edge === \"bottom\") {\n return startPosition;\n }\n return startPosition + delta;\n};\n\nconst findLayerElementById = (element: HTMLElement | null, layerId: string): HTMLElement | null => {\n if (!element) {\n return null;\n }\n if (element.dataset.layerId === layerId) {\n return element;\n }\n return findLayerElementById(element.parentElement, layerId);\n};\n\nconst findAncestor = (\n element: HTMLElement | null,\n predicate: (node: HTMLElement) => boolean,\n stopPredicate?: (node: HTMLElement) => boolean,\n): HTMLElement | null => {\n if (!element) {\n return null;\n }\n if (stopPredicate?.(element)) {\n return null;\n }\n if (predicate(element)) {\n return element;\n }\n return findAncestor(element.parentElement, predicate, stopPredicate);\n};\n\nconst findDragHandleElement = (target: EventTarget | null): HTMLElement | null => {\n if (!(target instanceof HTMLElement)) {\n return null;\n }\n\n return findAncestor(\n target,\n (node) => node.dataset.dragHandle === \"true\",\n (node) => node.dataset.dragIgnore === \"true\",\n );\n};\n\nconst isResizeControl = (target: EventTarget | null): boolean => {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n\n return (\n findAncestor(\n target,\n (node) => node.dataset.resizeCorner !== undefined || node.dataset.resizeEdge !== undefined,\n ) !== null\n );\n};\n\nconst shouldRenderFloatingResize = (layer: LayerDefinition): boolean => {\n const floating = getEmbeddedFloatingConfig(layer);\n if (!floating) {\n return false;\n }\n return floating.resizable === true;\n};\n\nconst getLayerSizeFromDefinition = (layer: LayerDefinition): LayerSize | null => {\n const floating = getEmbeddedFloatingConfig(layer);\n if (!floating) {\n return null;\n }\n const size = getNumericLayerSize(layer);\n if (!size) {\n throw new Error(`Floating layer \"${layer.id}\" must define width and height when resizable or draggable.`);\n }\n return {\n width: size.width,\n height: size.height,\n };\n};\n\n// No-op placeholder: rendering is handled in component layer\n\nconst computeResizableLayerSizes = (\n layers: LayerDefinition[],\n previousSizes: Record<string, LayerSize>,\n activeResizeLayerId: string | null,\n): { sizes: Record<string, LayerSize>; changed: boolean } => {\n const nextSizes = layers\n .filter(shouldRenderFloatingResize)\n .reduce<Record<string, LayerSize>>((accumulator, layer) => {\n if (activeResizeLayerId === layer.id) {\n const existing = previousSizes[layer.id];\n if (existing) {\n accumulator[layer.id] = existing;\n return accumulator;\n }\n }\n\n const parsedSize = getLayerSizeFromDefinition(layer);\n if (!parsedSize) {\n return accumulator;\n }\n\n accumulator[layer.id] = parsedSize;\n return accumulator;\n }, {});\n\n const previousKeys = Object.keys(previousSizes);\n const nextKeys = Object.keys(nextSizes);\n\n const keysChangedByLength = previousKeys.length !== nextKeys.length;\n const keysChangedByMissing = previousKeys.some((key) => {\n return !Object.prototype.hasOwnProperty.call(nextSizes, key);\n });\n const keysChanged = keysChangedByLength ? true : keysChangedByMissing;\n\n const sizeChanged = nextKeys.some((key) => {\n const previous = previousSizes[key];\n const next = nextSizes[key];\n if (!previous || !next) {\n return true;\n }\n return previous.width !== next.width || previous.height !== next.height;\n });\n\n const changed = keysChanged ? true : sizeChanged;\n\n return {\n sizes: nextSizes,\n changed,\n };\n};\n\ntype UseLayerInteractionsArgs = {\n layers: LayerDefinition[];\n layerById: Map<string, LayerDefinition>;\n isRootLevel: boolean;\n};\n\nexport const useLayerInteractions = ({\n layers,\n layerById,\n isRootLevel,\n}: UseLayerInteractionsArgs): {\n providerValue: GridLayoutContextValue;\n draggingLayerId: string | null;\n resizingLayerId: string | null;\n} => {\n const [draggingLayerId, setDraggingLayerId] = React.useState<string | null>(null);\n const [resizingLayerId, setResizingLayerId] = React.useState<string | null>(null);\n\n const [layerPositions, setLayerPositions] = React.useState<Record<string, { x: number; y: number }>>({});\n const [layerSizes, setLayerSizes] = React.useState<Record<string, LayerSize>>({});\n\n const dragStartRef = React.useRef<DragState | null>(null);\n const resizeStartRef = React.useRef<ResizeState | null>(null);\n\n const notifyFloatingMove = useEffectEvent((layerId: string, position: WindowPosition) => {\n const layer = layerById.get(layerId);\n const floating = layer?.floating;\n floating?.onMove?.(position);\n });\n\n const notifyFloatingResize = useEffectEvent((layerId: string, size: WindowSize) => {\n const layer = layerById.get(layerId);\n const floating = layer?.floating;\n floating?.onResize?.(size);\n });\n\n useIsomorphicLayoutEffect(() => {\n const { sizes, changed } = computeResizableLayerSizes(layers, layerSizes, resizingLayerId);\n if (!changed) {\n return;\n }\n setLayerSizes(sizes);\n }, [layers, resizingLayerId]);\n\n const beginLayerDrag = React.useCallback(\n (layerId: string, layer: LayerDefinition, target: HTMLElement, event: React.PointerEvent) => {\n const anchor = resolveDragAnchor(layer);\n const translation = layerPositions[layerId] ?? { x: 0, y: 0 };\n const dragState: DragState = {\n pointerStartX: event.clientX,\n pointerStartY: event.clientY,\n initialTranslationX: translation.x,\n initialTranslationY: translation.y,\n baseLeft: anchor.left,\n baseTop: anchor.top,\n layerId,\n pointerId: event.pointerId,\n target: target as HTMLElement,\n };\n\n if (dragState.target.setPointerCapture) {\n try {\n dragState.target.setPointerCapture(dragState.pointerId);\n } catch {\n // Ignore pointer capture errors\n }\n }\n\n dragStartRef.current = dragState;\n setDraggingLayerId(layerId);\n },\n [layerPositions],\n );\n\n const handleLayerPointerDown = React.useCallback(\n (event: React.PointerEvent<HTMLDivElement>) => {\n const target = event.target;\n const dragHandle = findDragHandleElement(target);\n if (!dragHandle) {\n return;\n }\n\n const layerId = dragHandle.closest('[data-layer-id]')?.getAttribute(\"data-layer-id\");\n if (!layerId) {\n return;\n }\n const layer = layerById.get(layerId);\n if (!layer) {\n return;\n }\n const floating = getEmbeddedFloatingConfig(layer);\n if (!floating || floating.draggable !== true) {\n return;\n }\n\n if (isInteractiveElement(event.target)) {\n return;\n }\n\n if (isResizeControl(event.target)) {\n return;\n }\n\n if (dragHandle) {\n const layerElement = findLayerElementById(dragHandle as HTMLElement, layerId);\n if (!layerElement) {\n return;\n }\n beginLayerDrag(layerId, layer, layerElement, event);\n return;\n }\n },\n [beginLayerDrag, layerById],\n );\n\n const handleDragHandlePointerDown = React.useCallback(\n (layerId: string, event: React.PointerEvent<HTMLElement>) => {\n const layer = layerById.get(layerId);\n const floating = layer ? getEmbeddedFloatingConfig(layer) : null;\n if (!layer || !floating || floating.draggable !== true) {\n return;\n }\n\n if (isInteractiveElement(event.target)) {\n return;\n }\n\n if (isResizeControl(event.target)) {\n return;\n }\n\n const layerElement = findLayerElementById(event.currentTarget as HTMLElement, layerId);\n if (!layerElement) {\n return;\n }\n\n beginLayerDrag(layerId, layer, layerElement, event);\n },\n [beginLayerDrag, layerById],\n );\n\n const handleResizePointerDown = React.useCallback(\n (layerId: string, config: ResizeHandleConfig, event: React.PointerEvent<HTMLDivElement>) => {\n const layer = layerById.get(layerId);\n if (!layer || !shouldRenderFloatingResize(layer)) {\n return;\n }\n\n const sizeEntry = layerSizes[layerId] ?? getLayerSizeFromDefinition(layer);\n if (!sizeEntry) {\n return;\n }\n\n const baseAnchor = resolveDragAnchor(layer);\n const constraints = resolveFloatingConstraints(layer);\n\n const initialPosition = layerPositions[layerId] ?? { x: 0, y: 0 };\n\n event.stopPropagation();\n event.preventDefault();\n\n if (event.currentTarget.setPointerCapture) {\n try {\n event.currentTarget.setPointerCapture(event.pointerId);\n } catch {\n // Pointer capture may be unsupported; ignore gracefully.\n }\n }\n\n resizeStartRef.current = {\n layerId,\n pointerId: event.pointerId,\n horizontalEdge: config.horizontal,\n verticalEdge: config.vertical,\n startX: event.clientX,\n startY: event.clientY,\n startWidth: sizeEntry.width,\n startHeight: sizeEntry.height,\n startPosition: initialPosition,\n baseLeft: baseAnchor.left,\n baseTop: baseAnchor.top,\n minWidth: constraints.minWidth,\n maxWidth: constraints.maxWidth,\n minHeight: constraints.minHeight,\n maxHeight: constraints.maxHeight,\n target: event.currentTarget,\n };\n\n setResizingLayerId(layerId);\n },\n [layerById, layerPositions, layerSizes],\n );\n\n const handleDragPointerMove = React.useCallback(\n (event: PointerEvent) => {\n const dragStart = dragStartRef.current;\n if (!dragStart) {\n return;\n }\n\n const deltaX = event.clientX - dragStart.pointerStartX;\n const deltaY = event.clientY - dragStart.pointerStartY;\n const newPos = {\n x: dragStart.initialTranslationX + deltaX,\n y: dragStart.initialTranslationY + deltaY,\n };\n\n setLayerPositions((prev) => ({ ...prev, [dragStart.layerId]: newPos }));\n notifyFloatingMove(dragStart.layerId, {\n left: dragStart.baseLeft + newPos.x,\n top: dragStart.baseTop + newPos.y,\n });\n },\n [notifyFloatingMove],\n );\n\n const handleResizePointerMove = React.useCallback(\n (event: PointerEvent) => {\n const resizeStart = resizeStartRef.current;\n if (!resizeStart || resizeStart.pointerId !== event.pointerId) {\n return;\n }\n\n const layer = layerById.get(resizeStart.layerId);\n if (!layer) {\n return;\n }\n\n const deltaX = event.clientX - resizeStart.startX;\n const deltaY = event.clientY - resizeStart.startY;\n\n const widthCandidate = resolveHorizontalSizeCandidate(resizeStart.horizontalEdge, resizeStart.startWidth, deltaX);\n const heightCandidate = resolveVerticalSizeCandidate(resizeStart.verticalEdge, resizeStart.startHeight, deltaY);\n\n const nextWidth = clampDimension(widthCandidate, resizeStart.minWidth, resizeStart.maxWidth);\n const nextHeight = clampDimension(heightCandidate, resizeStart.minHeight, resizeStart.maxHeight);\n\n const widthDelta = resizeStart.startWidth - nextWidth;\n const heightDelta = resizeStart.startHeight - nextHeight;\n\n const nextPositionX = resolveHorizontalPosition(\n resizeStart.horizontalEdge,\n resizeStart.startPosition.x,\n widthDelta,\n );\n const nextPositionY = resolveVerticalPosition(resizeStart.verticalEdge, resizeStart.startPosition.y, heightDelta);\n\n const currentSize = layerSizes[resizeStart.layerId];\n const nextSize: WindowSize = { width: nextWidth, height: nextHeight };\n const sizeChanged =\n !currentSize || currentSize.width !== nextWidth || currentSize.height !== nextHeight;\n if (sizeChanged) {\n setLayerSizes((prev) => ({\n ...prev,\n [resizeStart.layerId]: nextSize,\n }));\n notifyFloatingResize(resizeStart.layerId, nextSize);\n }\n\n const currentPosition = layerPositions[resizeStart.layerId] ?? { x: 0, y: 0 };\n const nextPosition = { x: nextPositionX, y: nextPositionY };\n const positionChanged =\n currentPosition.x !== nextPosition.x || currentPosition.y !== nextPosition.y;\n if (positionChanged) {\n setLayerPositions((prev) => ({\n ...prev,\n [resizeStart.layerId]: nextPosition,\n }));\n notifyFloatingMove(resizeStart.layerId, {\n left: resizeStart.baseLeft + nextPosition.x,\n top: resizeStart.baseTop + nextPosition.y,\n });\n }\n },\n [layerById, layerPositions, layerSizes, notifyFloatingMove, notifyFloatingResize],\n );\n\n const finishDrag = React.useCallback((event: PointerEvent) => {\n const dragStart = dragStartRef.current;\n if (dragStart) {\n if (dragStart.pointerId === event.pointerId && dragStart.target.releasePointerCapture) {\n try {\n dragStart.target.releasePointerCapture(dragStart.pointerId);\n } catch {\n // Ignore release errors (e.g., already released).\n }\n }\n dragStartRef.current = null;\n }\n setDraggingLayerId(null);\n }, []);\n\n const finishResize = React.useCallback((event: PointerEvent) => {\n const resizeStart = resizeStartRef.current;\n if (resizeStart) {\n if (resizeStart.pointerId === event.pointerId && resizeStart.target.releasePointerCapture) {\n try {\n resizeStart.target.releasePointerCapture(resizeStart.pointerId);\n } catch {\n // Ignore pointer capture release errors.\n }\n }\n resizeStartRef.current = null;\n }\n setResizingLayerId(null);\n }, []);\n\n useDocumentPointerEvents(draggingLayerId !== null, {\n onMove: handleDragPointerMove,\n onUp: finishDrag,\n onCancel: finishDrag,\n });\n\n useDocumentPointerEvents(resizingLayerId !== null, {\n onMove: handleResizePointerMove,\n onUp: finishResize,\n onCancel: finishResize,\n });\n\n const buildDraggableLayerStyle = React.useCallback(\n (layer: LayerDefinition): React.CSSProperties => {\n const baseStyle = buildLayerStyleObject(layer);\n\n const floating = getEmbeddedFloatingConfig(layer);\n if (!floating || floating.draggable !== true) {\n return baseStyle;\n }\n\n const position = layerPositions[layer.id];\n const isDragging = draggingLayerId === layer.id;\n const isResizing = resizingLayerId === layer.id;\n const transformStyle = position ? { transform: `translate(${position.x}px, ${position.y}px)` } : {};\n const storedSize = layerSizes[layer.id];\n const fallbackSize = shouldRenderFloatingResize(layer) ? getLayerSizeFromDefinition(layer) : null;\n const sizeRecord = storedSize ?? fallbackSize;\n const sizeStyle = sizeRecord ? { width: `${sizeRecord.width}px`, height: `${sizeRecord.height}px` } : {};\n const cursorStyle = isDragging || isResizing ? { cursor: \"grabbing\" } : {};\n\n return {\n ...baseStyle,\n ...sizeStyle,\n ...transformStyle,\n ...cursorStyle,\n };\n },\n [draggingLayerId, layerPositions, layerSizes, resizingLayerId],\n );\n\n const getResizeHandleState = React.useCallback(\n (layer: LayerDefinition): { isResizable: boolean; onPointerDown?: (config: ResizeHandleConfig, event: React.PointerEvent<HTMLDivElement>) => void } => {\n const canResize = shouldRenderFloatingResize(layer);\n if (!canResize) {\n return { isResizable: false };\n }\n\n const storedLayerSize = layerSizes[layer.id];\n const fallbackLayerSize = getLayerSizeFromDefinition(layer);\n const sizeForHandle = storedLayerSize ?? fallbackLayerSize;\n const show = sizeForHandle !== null;\n if (!show) {\n return { isResizable: false };\n }\n\n const onPointerDown = (config: ResizeHandleConfig, event: React.PointerEvent<HTMLDivElement>) => {\n handleResizePointerDown(layer.id, config, event);\n };\n\n return { isResizable: true, onPointerDown };\n },\n [handleResizePointerDown, layerSizes],\n );\n\n const getLayerRenderState = React.useCallback(\n (layer: LayerDefinition) => {\n const { isResizable, onPointerDown } = getResizeHandleState(layer);\n const style = buildDraggableLayerStyle(layer);\n const isResizing = resizingLayerId === layer.id;\n\n return {\n style,\n isResizable,\n isResizing,\n onResizeHandlePointerDown: (config: ResizeHandleConfig, event: React.PointerEvent<HTMLDivElement>) => {\n if (onPointerDown) {\n onPointerDown(config, event);\n }\n },\n };\n },\n [buildDraggableLayerStyle, getResizeHandleState, resizingLayerId],\n );\n\n const getLayerHandleProps = React.useCallback(\n (layerId: string): GridLayerHandleProps => {\n return {\n \"data-drag-handle\": \"true\",\n role: \"button\",\n \"aria-roledescription\": \"Drag handle\",\n \"aria-label\": \"Drag layer\",\n onPointerDown: (event: React.PointerEvent<HTMLElement>) => {\n handleDragHandlePointerDown(layerId, event);\n },\n };\n },\n [handleDragHandlePointerDown],\n );\n\n const providerValue = React.useMemo<GridLayoutContextValue>(\n () => ({\n handleLayerPointerDown,\n getLayerRenderState,\n getLayerHandleProps,\n isRootLevel,\n }),\n [getLayerHandleProps, getLayerRenderState, handleLayerPointerDown, isRootLevel],\n );\n\n return {\n providerValue,\n draggingLayerId,\n resizingLayerId,\n };\n};\n\n/* Debug note: Reviewed GridLayout.module.css and LayerInstanceContext to keep drag handle integration consistent. */\nconst getNumericLayerSize = (layer: LayerDefinition): LayerSize | undefined => {\n // For floating layers, prioritize floating.size/defaultSize\n if (layer.floating) {\n const floatingSize = layer.floating.size ?? layer.floating.defaultSize;\n if (floatingSize) {\n return { width: floatingSize.width, height: floatingSize.height };\n }\n }\n if (typeof layer.width === \"number\" && typeof layer.height === \"number\") {\n return { width: layer.width, height: layer.height };\n }\n return undefined;\n};\n","/**\n * @file Top-level grid layout component that consumes PanelSystemContext core.\n */\nimport * as React from \"react\";\nimport { useIntersectionObserver } from \"../../hooks/useIntersectionObserver\";\nimport type { LayerDefinition, PanelLayoutConfig } from \"../../types\";\nimport { DrawerLayers } from \"../window/DrawerLayers\";\nimport { GridLayerList } from \"./GridLayerList\";\nimport { GridTrackResizeHandle } from \"./GridTrackResizeHandle\";\nimport { PanelSystemProvider, usePanelSystem } from \"../../PanelSystemContext\";\nimport { useGridPlacements } from \"../../modules/grid/useGridPlacements\";\nimport { useGridTracks } from \"../../modules/grid/useGridTracks\";\nimport { useLayerInteractions } from \"../../modules/grid/useLayerInteractions\";\nimport { GridLayoutProvider } from \"../../modules/grid/GridLayoutContext\";\n\nconst gridLayoutBaseStyle: React.CSSProperties = {\n display: \"grid\",\n width: \"100%\",\n height: \"100%\",\n overflow: \"hidden\",\n};\n\nconst gridLayoutDraggingStyle: React.CSSProperties = {\n touchAction: \"none\",\n WebkitTouchCallout: \"none\",\n WebkitUserSelect: \"none\",\n userSelect: \"none\",\n};\n\nconst gridLayoutRootLevelStyle: React.CSSProperties = {\n ...gridLayoutBaseStyle,\n overflow: \"visible\",\n height: \"auto\",\n minHeight: \"100%\",\n};\n\nconst resolveGridBaseStyle = (isRootLevel: boolean): React.CSSProperties => {\n return isRootLevel ? gridLayoutRootLevelStyle : gridLayoutBaseStyle;\n};\n\nexport type GridLayoutProps = {\n config: PanelLayoutConfig;\n layers: LayerDefinition[];\n style?: React.CSSProperties;\n /**\n * When true, enables browser-native scrolling for scrollable layers.\n * Use this when GridLayout is at the root level of the application.\n */\n root?: boolean;\n};\n\nexport const GridLayout: React.FC<GridLayoutProps> = ({ config, layers, style: styleProp, root = false }) => {\n const gridRef = React.useRef<HTMLDivElement | null>(null);\n const { isIntersecting } = useIntersectionObserver(gridRef, { threshold: 0 });\n\n return (\n <PanelSystemProvider config={config} layers={layers} style={styleProp}>\n <GridLayoutInner gridRef={gridRef} isIntersecting={isIntersecting} isRoot={root} />\n </PanelSystemProvider>\n );\n};\n\nconst GridLayoutInner: React.FC<{\n gridRef: React.RefObject<HTMLDivElement | null>;\n isIntersecting: boolean;\n isRoot: boolean;\n}> = ({ gridRef, isIntersecting, isRoot }) => {\n const { config, style, layers } = usePanelSystem();\n const { normalizedLayers, visibleLayers, regularLayers, layerById } = useGridPlacements(config, layers.defs);\n const { columnHandles, rowHandles, gapSizes, gridStyle, handleResize } = useGridTracks(config, style, gridRef);\n const { providerValue, draggingLayerId, resizingLayerId } = useLayerInteractions({\n layers: normalizedLayers,\n layerById,\n isRootLevel: isRoot,\n });\n\n const isDraggingOrResizing = draggingLayerId ? true : Boolean(resizingLayerId);\n const combinedStyle = React.useMemo(() => {\n const baseStyle = resolveGridBaseStyle(isRoot);\n return {\n ...baseStyle,\n ...gridStyle,\n ...(isDraggingOrResizing ? gridLayoutDraggingStyle : {}),\n };\n }, [gridStyle, isDraggingOrResizing, isRoot]);\n\n return (\n <>\n <div\n ref={gridRef}\n style={combinedStyle}\n data-dragging={Boolean(draggingLayerId)}\n data-resizing={Boolean(resizingLayerId)}\n data-visible={isIntersecting}\n >\n <GridLayoutProvider value={providerValue}>\n <GridLayerList layers={regularLayers} />\n </GridLayoutProvider>\n\n {columnHandles.map(({ trackIndex, align, span }) => (\n <GridTrackResizeHandle\n key={`col-${trackIndex}:${align}`}\n direction=\"col\"\n trackIndex={trackIndex}\n align={align}\n gap={gapSizes.columnGap}\n span={span}\n onResize={handleResize}\n />\n ))}\n\n {rowHandles.map(({ trackIndex, align, span }) => (\n <GridTrackResizeHandle\n key={`row-${trackIndex}:${align}`}\n direction=\"row\"\n trackIndex={trackIndex}\n align={align}\n gap={gapSizes.rowGap}\n span={span}\n onResize={handleResize}\n />\n ))}\n </div>\n\n <DrawerLayers layers={visibleLayers} />\n </>\n );\n};\n\n/* Debug note: Refactored to consume PanelSystemContext core for consistent separation. */\n"],"names":["createIdGenerator","map","ref","existing","nextId","getId","observerCache","getSharedObserver","options","observerKey","observer","#callbackMap","#intersectionObserver","entries","entry","callback","target","voidClientRect","useIntersectionObserver","threshold","rootMargin","root","intersection","setIntersection","React","resizeHandleBaseStyle","cornerHandleStyle","GRID_LAYER_CORNER_HIT_SIZE","edgeHandleStyle","cornerPositions","edgePositions","GRID_LAYER_EDGE_HIT_THICKNESS","RESIZE_HANDLE_CONFIGS","GridLayerResizeHandles","layerId","onPointerDown","jsx","Fragment","config","baseStyle","positionStyle","combinedStyle","datasetProps","event","PivotLayer","pivot","Outlet","usePivot","resolveLayerContent","layer","getCachedContent","LayerContentRenderer","onClose","usePanelSystem","content","FloatingWindow","LayerResizeHandles","isResizable","resolveOverflowStyle","scrollable","isFloating","EmbeddedLayer","handleLayerPointerDown","getLayerRenderState","useGridLayoutContext","style","isResizing","onResizeHandlePointerDown","gridPlacementStyle","placement","overflow","handleClose","jsxs","LayerInstanceProvider","GridLayerList","layers","floatingMode","PopupLayerPortal","resizeHandleWrapperBaseStyle","GridTrackResizeHandle","direction","trackIndex","align","gap","span","onResize","resizeDirection","handleResize","delta","signedDelta","placementStyle","wrapperStyle","offset","GRID_HANDLE_THICKNESS","ResizeHandle","computeGridPlacements","areas","boundsByArea","row","rowIndex","area","colIndex","nextBounds","initialBounds","placements","bounds","rowStart","rowEnd","colStart","colEnd","normalizeLayerForGrid","placementKey","needsGridArea","needsRow","needsColumn","useGridPlacements","normalizedLayers","visibleLayers","regularLayers","layerById","parseGapValue","gapValue","tokens","token","parseToken","match","parsed","measureGridTrackSizes","containerEl","s","n","clampNumber","value","min","max","toFiniteNumberOr","fallback","createTrackKey","index","getTrackSize","track","trackSizes","key","currentSize","buildTrackTemplateString","tracks","extractInitialTrackSizes","acc","resolveCurrentTrackSize","containerRef","storedSize","measuredSize","calculateOtherTracksMinSpace","excludeIndex","sum","t","idx","calculateEffectiveMaxSize","gapSizes","containerSize","otherTracksMinSpace","gapCount","gapSize","totalGapSpace","dynamicMax","applyTrackConstraints","size","minSize","maxSize","computeColumnBoundarySpan","boundaryIndex","rowCount","validRows","leftArea","rightArea","minRow","maxRow","computeRowBoundarySpan","topRow","bottomRow","colCount","validCols","topArea","bottomArea","minCol","maxCol","computeColumnResizeHandles","handles","_","leftTrack","computeRowResizeHandles","topTrack","getGapStyle","mergeTrackSizes","prev","initialSizes","nextKeys","merged","prevKeys","keysChangedByLength","keysChangedByMissing","keysChanged","valuesChanged","useGridTracks","styleProp","setTrackSizes","useIsomorphicLayoutEffect","areasString","columnHandles","rowHandles","gridStyle","effectiveMaxSize","newSize","constrained","resolvePositionMode","getPositionModeStyle","mode","getGridAreaStyle","getAbsolutePositionStyle","position","getZIndexStyle","zIndex","getDimensionsStyle","width","height","getPointerEventsStyle","resolveEffectivePosition","resolveEffectiveSize","floatingSize","resolveEffectiveZIndex","buildLayerStyleObject","resolvedMode","effectivePosition","effectiveSize","effectiveZIndex","resolveFloatingMode","floating","getEmbeddedFloatingConfig","isInteractiveElement","clampDimension","resolvedMin","resolvedMax","ensureNumericOffset","resolveDragAnchor","resolveFloatingConstraints","resolveHorizontalSizeCandidate","edge","startSize","resolveVerticalSizeCandidate","resolveHorizontalPosition","startPosition","resolveVerticalPosition","findLayerElementById","element","findAncestor","predicate","stopPredicate","findDragHandleElement","node","isResizeControl","shouldRenderFloatingResize","getLayerSizeFromDefinition","getNumericLayerSize","computeResizableLayerSizes","previousSizes","activeResizeLayerId","nextSizes","accumulator","parsedSize","previousKeys","sizeChanged","previous","next","useLayerInteractions","isRootLevel","draggingLayerId","setDraggingLayerId","resizingLayerId","setResizingLayerId","layerPositions","setLayerPositions","layerSizes","setLayerSizes","dragStartRef","resizeStartRef","notifyFloatingMove","useEffectEvent","notifyFloatingResize","sizes","changed","beginLayerDrag","anchor","translation","dragState","dragHandle","layerElement","handleDragHandlePointerDown","handleResizePointerDown","sizeEntry","baseAnchor","constraints","initialPosition","handleDragPointerMove","dragStart","deltaX","deltaY","newPos","handleResizePointerMove","resizeStart","widthCandidate","heightCandidate","nextWidth","nextHeight","widthDelta","heightDelta","nextPositionX","nextPositionY","nextSize","currentPosition","nextPosition","finishDrag","finishResize","useDocumentPointerEvents","buildDraggableLayerStyle","isDragging","transformStyle","fallbackSize","sizeRecord","sizeStyle","getResizeHandleState","storedLayerSize","fallbackLayerSize","getLayerHandleProps","gridLayoutBaseStyle","gridLayoutDraggingStyle","gridLayoutRootLevelStyle","resolveGridBaseStyle","GridLayout","gridRef","isIntersecting","PanelSystemProvider","GridLayoutInner","isRoot","providerValue","isDraggingOrResizing","GridLayoutProvider","DrawerLayers"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const c=require("react/jsx-runtime"),g=require("react"),D=require("./ResizeHandle-CScipO5l.cjs"),n=require("./styles-qf6ptVLD.cjs");function E(e){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const o=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,o.get?o:{enumerable:!0,get:()=>e[t]})}}return r.default=e,Object.freeze(r)}const u=E(g),f=e=>{const r=e==="drag"?n.COLOR_RESIZE_HANDLE_ACTIVE:e==="hover"?n.COLOR_RESIZE_HANDLE_HOVER:n.COLOR_RESIZE_HANDLE_IDLE;return{width:n.HORIZONTAL_DIVIDER_WIDTH,cursor:"col-resize",position:"relative",userSelect:"none",backgroundColor:r}},v=({onResize:e,component:r,element:t})=>{const{ref:o,isDragging:s,onPointerDown:l}=D.useResizeDrag({axis:"x",onResize:e}),[d,a]=u.useState(!1),i={ref:o,style:f(s?"drag":d?"hover":"idle"),role:"separator","aria-orientation":"vertical","data-dragging":s?"true":void 0,onPointerDown:l,onPointerEnter:()=>a(!0),onPointerLeave:()=>a(!1)};return t?u.cloneElement(t,i):r?c.jsx(r,{...i}):c.jsx("div",{...i})};exports.HorizontalDivider=v;
2
+ //# sourceMappingURL=HorizontalDivider-B5Z-KZLk.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HorizontalDivider-B5Z-KZLk.cjs","sources":["../src/components/resizer/HorizontalDivider.tsx"],"sourcesContent":["/**\n * @file Horizontal divider component\n */\nimport * as React from \"react\";\nimport { useResizeDrag } from \"../../modules/resizer/useResizeDrag\";\nimport { HORIZONTAL_DIVIDER_WIDTH, COLOR_RESIZE_HANDLE_IDLE, COLOR_RESIZE_HANDLE_HOVER, COLOR_RESIZE_HANDLE_ACTIVE } from \"../../constants/styles\";\n\nexport type HorizontalDividerProps = {\n onResize: (deltaX: number) => void;\n /** Custom component for the divider */\n component?: React.ComponentType<React.HTMLAttributes<HTMLDivElement> & { ref?: React.Ref<HTMLDivElement> }>;\n /** Custom element for the divider */\n element?: React.ReactElement;\n};\n\nconst buildDividerStyle = (state: \"idle\" | \"hover\" | \"drag\"): React.CSSProperties => {\n const backgroundColor = state === \"drag\" ? COLOR_RESIZE_HANDLE_ACTIVE : state === \"hover\" ? COLOR_RESIZE_HANDLE_HOVER : COLOR_RESIZE_HANDLE_IDLE;\n return {\n width: HORIZONTAL_DIVIDER_WIDTH,\n cursor: \"col-resize\",\n position: \"relative\",\n userSelect: \"none\",\n backgroundColor,\n };\n};\n\nexport const HorizontalDivider: React.FC<HorizontalDividerProps> = ({ onResize, component: Component, element }) => {\n const { ref, isDragging, onPointerDown } = useResizeDrag<HTMLDivElement>({\n axis: \"x\",\n onResize: onResize,\n });\n const [hovered, setHovered] = React.useState(false);\n\n const dividerProps = {\n ref,\n style: buildDividerStyle(isDragging ? \"drag\" : hovered ? \"hover\" : \"idle\"),\n role: \"separator\" as const,\n \"aria-orientation\": \"vertical\" as const,\n \"data-dragging\": isDragging ? \"true\" : undefined,\n onPointerDown,\n onPointerEnter: () => setHovered(true),\n onPointerLeave: () => setHovered(false),\n };\n\n if (element) {\n return React.cloneElement(element, dividerProps);\n }\n if (Component) {\n return <Component {...dividerProps} />;\n }\n return <div {...dividerProps} />;\n};\n"],"names":["buildDividerStyle","state","backgroundColor","COLOR_RESIZE_HANDLE_ACTIVE","COLOR_RESIZE_HANDLE_HOVER","COLOR_RESIZE_HANDLE_IDLE","HORIZONTAL_DIVIDER_WIDTH","HorizontalDivider","onResize","Component","element","ref","isDragging","onPointerDown","useResizeDrag","hovered","setHovered","React","dividerProps","jsx"],"mappings":"2aAeMA,EAAqBC,GAA0D,CACnF,MAAMC,EAAkBD,IAAU,OAASE,EAAAA,2BAA6BF,IAAU,QAAUG,EAAAA,0BAA4BC,EAAAA,yBACxH,MAAO,CACL,MAAOC,EAAAA,yBACP,OAAQ,aACR,SAAU,WACV,WAAY,OACZ,gBAAAJ,CAAA,CAEJ,EAEaK,EAAsD,CAAC,CAAE,SAAAC,EAAU,UAAWC,EAAW,QAAAC,KAAc,CAClH,KAAM,CAAE,IAAAC,EAAK,WAAAC,EAAY,cAAAC,CAAA,EAAkBC,EAAAA,cAA8B,CACvE,KAAM,IACN,SAAAN,CAAA,CACD,EACK,CAACO,EAASC,CAAU,EAAIC,EAAM,SAAS,EAAK,EAE5CC,EAAe,CACnB,IAAAP,EACA,MAAOX,EAAkBY,EAAa,OAASG,EAAU,QAAU,MAAM,EACzE,KAAM,YACN,mBAAoB,WACpB,gBAAiBH,EAAa,OAAS,OACvC,cAAAC,EACA,eAAgB,IAAMG,EAAW,EAAI,EACrC,eAAgB,IAAMA,EAAW,EAAK,CAAA,EAGxC,OAAIN,EACKO,EAAM,aAAaP,EAASQ,CAAY,EAE7CT,EACKU,MAACV,EAAA,CAAW,GAAGS,CAAA,CAAc,EAE/BC,MAAC,MAAA,CAAK,GAAGD,CAAA,CAAc,CAChC"}
@@ -0,0 +1,30 @@
1
+ import { jsx as n } from "react/jsx-runtime";
2
+ import * as s from "react";
3
+ import { u as E } from "./ResizeHandle-CdA_JYfN.js";
4
+ import { a as u, b as v, c as D, H as g } from "./styles-DPPuJ0sf.js";
5
+ const R = (r) => ({
6
+ width: g,
7
+ cursor: "col-resize",
8
+ position: "relative",
9
+ userSelect: "none",
10
+ backgroundColor: r === "drag" ? u : r === "hover" ? v : D
11
+ }), I = ({ onResize: r, component: e, element: t }) => {
12
+ const { ref: d, isDragging: i, onPointerDown: c } = E({
13
+ axis: "x",
14
+ onResize: r
15
+ }), [l, a] = s.useState(!1), o = {
16
+ ref: d,
17
+ style: R(i ? "drag" : l ? "hover" : "idle"),
18
+ role: "separator",
19
+ "aria-orientation": "vertical",
20
+ "data-dragging": i ? "true" : void 0,
21
+ onPointerDown: c,
22
+ onPointerEnter: () => a(!0),
23
+ onPointerLeave: () => a(!1)
24
+ };
25
+ return t ? s.cloneElement(t, o) : e ? /* @__PURE__ */ n(e, { ...o }) : /* @__PURE__ */ n("div", { ...o });
26
+ };
27
+ export {
28
+ I as H
29
+ };
30
+ //# sourceMappingURL=HorizontalDivider-WF1k_qND.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HorizontalDivider-WF1k_qND.js","sources":["../src/components/resizer/HorizontalDivider.tsx"],"sourcesContent":["/**\n * @file Horizontal divider component\n */\nimport * as React from \"react\";\nimport { useResizeDrag } from \"../../modules/resizer/useResizeDrag\";\nimport { HORIZONTAL_DIVIDER_WIDTH, COLOR_RESIZE_HANDLE_IDLE, COLOR_RESIZE_HANDLE_HOVER, COLOR_RESIZE_HANDLE_ACTIVE } from \"../../constants/styles\";\n\nexport type HorizontalDividerProps = {\n onResize: (deltaX: number) => void;\n /** Custom component for the divider */\n component?: React.ComponentType<React.HTMLAttributes<HTMLDivElement> & { ref?: React.Ref<HTMLDivElement> }>;\n /** Custom element for the divider */\n element?: React.ReactElement;\n};\n\nconst buildDividerStyle = (state: \"idle\" | \"hover\" | \"drag\"): React.CSSProperties => {\n const backgroundColor = state === \"drag\" ? COLOR_RESIZE_HANDLE_ACTIVE : state === \"hover\" ? COLOR_RESIZE_HANDLE_HOVER : COLOR_RESIZE_HANDLE_IDLE;\n return {\n width: HORIZONTAL_DIVIDER_WIDTH,\n cursor: \"col-resize\",\n position: \"relative\",\n userSelect: \"none\",\n backgroundColor,\n };\n};\n\nexport const HorizontalDivider: React.FC<HorizontalDividerProps> = ({ onResize, component: Component, element }) => {\n const { ref, isDragging, onPointerDown } = useResizeDrag<HTMLDivElement>({\n axis: \"x\",\n onResize: onResize,\n });\n const [hovered, setHovered] = React.useState(false);\n\n const dividerProps = {\n ref,\n style: buildDividerStyle(isDragging ? \"drag\" : hovered ? \"hover\" : \"idle\"),\n role: \"separator\" as const,\n \"aria-orientation\": \"vertical\" as const,\n \"data-dragging\": isDragging ? \"true\" : undefined,\n onPointerDown,\n onPointerEnter: () => setHovered(true),\n onPointerLeave: () => setHovered(false),\n };\n\n if (element) {\n return React.cloneElement(element, dividerProps);\n }\n if (Component) {\n return <Component {...dividerProps} />;\n }\n return <div {...dividerProps} />;\n};\n"],"names":["buildDividerStyle","state","HORIZONTAL_DIVIDER_WIDTH","COLOR_RESIZE_HANDLE_ACTIVE","COLOR_RESIZE_HANDLE_HOVER","COLOR_RESIZE_HANDLE_IDLE","HorizontalDivider","onResize","Component","element","ref","isDragging","onPointerDown","useResizeDrag","hovered","setHovered","React","dividerProps","jsx"],"mappings":";;;;AAeA,MAAMA,IAAoB,CAACC,OAElB;AAAA,EACL,OAAOC;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,iBANsBD,MAAU,SAASE,IAA6BF,MAAU,UAAUG,IAA4BC;AAMtH,IAISC,IAAsD,CAAC,EAAE,UAAAC,GAAU,WAAWC,GAAW,SAAAC,QAAc;AAClH,QAAM,EAAE,KAAAC,GAAK,YAAAC,GAAY,eAAAC,EAAA,IAAkBC,EAA8B;AAAA,IACvE,MAAM;AAAA,IACN,UAAAN;AAAA,EAAA,CACD,GACK,CAACO,GAASC,CAAU,IAAIC,EAAM,SAAS,EAAK,GAE5CC,IAAe;AAAA,IACnB,KAAAP;AAAA,IACA,OAAOV,EAAkBW,IAAa,SAASG,IAAU,UAAU,MAAM;AAAA,IACzE,MAAM;AAAA,IACN,oBAAoB;AAAA,IACpB,iBAAiBH,IAAa,SAAS;AAAA,IACvC,eAAAC;AAAA,IACA,gBAAgB,MAAMG,EAAW,EAAI;AAAA,IACrC,gBAAgB,MAAMA,EAAW,EAAK;AAAA,EAAA;AAGxC,SAAIN,IACKO,EAAM,aAAaP,GAASQ,CAAY,IAE7CT,IACK,gBAAAU,EAACV,GAAA,EAAW,GAAGS,EAAA,CAAc,IAE/B,gBAAAC,EAAC,OAAA,EAAK,GAAGD,EAAA,CAAc;AAChC;"}
@@ -0,0 +1,3 @@
1
+ "use strict";const b=require("react/jsx-runtime"),Nt=require("react"),A=require("./GridLayout-B4VRsC0r.cjs"),J=require("./useEffectEvent-huSsGUnl.cjs"),Q=require("./ResizeHandle-CScipO5l.cjs"),k=require("./styles-qf6ptVLD.cjs"),st=require("./useIsomorphicLayoutEffect-DGRNF4Lf.cjs"),Bt=require("react-dom"),$t=require("./useContentCache-DqXtLrLs.cjs");function Lt(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const r in t)if(r!=="default"){const n=Object.getOwnPropertyDescriptor(t,r);Object.defineProperty(e,r,n.get?n:{enumerable:!0,get:()=>t[r]})}}return e.default=t,Object.freeze(e)}const l=Lt(Nt),ft=l.createContext(null),Ht=()=>{const t=l.useContext(ft);if(!t)throw new Error("useKeybindings must be used within KeybindingsProvider");return t},zt=t=>{const e=[];t.metaKey&&e.push("Mod"),t.ctrlKey&&e.push("Ctrl"),t.altKey&&e.push("Alt"),t.shiftKey&&e.push("Shift");const r=t.key.length===1?t.key.toUpperCase():t.key;return e.push(r),e.join("-")},Xt=({children:t,configure:e})=>{const r=l.useRef({}),n=l.useCallback((c,i)=>{r.current={...r.current,[c]:i}},[]),o=l.useCallback(c=>{const i={...r.current};delete i[c],r.current=i},[]);l.useEffect(()=>{const c=i=>{const u=zt(i),a=r.current[u];a&&a(i)};return window.addEventListener("keydown",c),()=>{window.removeEventListener("keydown",c)}},[]);const s=l.useMemo(()=>({register:n,unregister:o}),[n,o]);return l.useEffect(()=>{e&&e(s)},[s,e]),b.jsx(ft.Provider,{value:s,children:t})},Ft=(t,e)=>{t.register("Mod-\\",r=>{r.preventDefault(),e.splitFocused("vertical")}),t.register("Mod-Shift-\\",r=>{r.preventDefault(),e.splitFocused("horizontal")});for(const r of[1,2,3,4,5,6,7,8,9])t.register(`Mod-${String(r)}`,n=>{n.preventDefault(),e.focusGroupIndex(r)});t.register("Alt-ArrowRight",r=>{r.preventDefault(),e.focusNextGroup()}),t.register("Alt-ArrowLeft",r=>{r.preventDefault(),e.focusPrevGroup()})},Yt=t=>t.type==="group",bt=(t,e={x:0,y:0,w:100,h:100})=>{const r=new Map,n=(o,s)=>{if(Yt(o)){r.set(o.groupId,s);return}if(o.direction==="vertical"){const u=s.w*o.ratio,a=s.w-u;n(o.a,{x:s.x,y:s.y,w:u,h:s.h}),n(o.b,{x:s.x+u,y:s.y,w:a,h:s.h});return}const c=s.h*o.ratio,i=s.h-c;n(o.a,{x:s.x,y:s.y,w:s.w,h:c}),n(o.b,{x:s.x,y:s.y+c,w:s.w,h:i})};return n(t,e),r},qt=(t,e)=>{const r=bt(t.tree),n={areas:[["root"]],rows:[{size:"1fr"}],columns:[{size:"1fr"}],gap:"0px",style:{position:"relative"}},o=Array.from(r.entries()).map(([s,c])=>{const i={position:"absolute",left:`${c.x}%`,top:`${c.y}%`,width:`${c.w}%`,height:`${c.h}%`,overflow:"hidden",display:"flex",flexDirection:"column"};return{id:s,positionMode:"absolute",style:i,component:e(s)}});return{config:n,layers:o}},Wt=(t,e,r)=>{const n=bt(t.tree),o=Array.from(new Set(Array.from(n.values()).flatMap(g=>[g.x,g.x+g.w]))).sort((g,v)=>g-v),s=Array.from(new Set(Array.from(n.values()).flatMap(g=>[g.y,g.y+g.h]))).sort((g,v)=>g-v),c=o.slice(1).map((g,v)=>`${g-o[v]}fr`),i=s.slice(1).map((g,v)=>`${g-s[v]}fr`),u=c.map(g=>({size:g,resizable:r})),a=i.map(g=>({size:g,resizable:r})),d=(g,v,x,y)=>{for(const[f,I]of n.entries())if(g>=I.x&&v<=I.x+I.w&&x>=I.y&&y<=I.y+I.h)return f;return"."},h=[];for(let g=0;g<s.length-1;g+=1){const v=[];for(let x=0;x<o.length-1;x+=1)v.push(d(o[x],o[x+1],s[g],s[g+1]));h.push(v)}const m={areas:h,rows:a,columns:u,gap:"0px"},w=Array.from(n.keys()).map(g=>({id:g,gridArea:g,component:e(g)}));return{config:m,layers:w}},ht=l.createContext(null),Kt=()=>{const t=l.useContext(ht);if(!t)throw new Error("usePanelRenderContext must be used within PanelRenderProvider");return t},Ut=({value:t,children:e})=>b.jsx(ht.Provider,{value:t,children:e}),gt=l.createContext(null),mt=()=>{const t=l.useContext(gt);if(!t)throw new Error("useDomRegistry must be used within DomRegistryProvider");return t},Vt=({children:t})=>{const e=l.useRef(new Map),r=l.useCallback(u=>{const a=e.current.get(u);if(a)return a;const d={group:null,tabbar:null,content:null};return e.current.set(u,d),d},[]),n=l.useCallback((u,a)=>{const d=r(u);if(d.group=a,a===null){const h=e.current.get(u);(h?h.tabbar===null&&h.content===null:!1)&&e.current.delete(u)}},[r]),o=l.useCallback((u,a)=>{const d=r(u);if(d.tabbar=a,a===null){const h=e.current.get(u);(h?h.group===null&&h.content===null:!1)&&e.current.delete(u)}},[r]),s=l.useCallback((u,a)=>{const d=r(u);if(d.content=a,a===null){const h=e.current.get(u);(h?h.group===null&&h.tabbar===null:!1)&&e.current.delete(u)}},[r]),c=l.useCallback(()=>e.current,[]),i=l.useMemo(()=>({setGroupEl:n,setTabbarEl:o,setContentEl:s,getAll:c}),[n,o,s,c]);return b.jsx(gt.Provider,{value:i,children:t})},Zt={display:"flex",flexDirection:"column",width:"100%",height:"100%"},Jt={flex:"1 1 auto",minWidth:0,minHeight:0,position:"relative",overflow:"hidden"};function Qt(t,e,r,n){return t?l.cloneElement(t,r,n):e?b.jsx(e,{...r,children:n}):b.jsx("div",{...r,children:n})}function te(t,e,r,n){return t?l.cloneElement(t,r,n):e?b.jsx(e,{...r,children:n}):b.jsx("div",{...r,children:n})}const ee=({group:t,tabbar:e,content:r,onContentPointerDown:n,groupRef:o,contentRef:s,component:c,element:i,contentComponent:u,contentElement:a})=>{const d={ref:o,style:Zt,"data-group-id":t.id},m=Qt(a,u,{ref:s,style:Jt,"data-dnd-zone":"content",onPointerDown:n},r),w=b.jsxs(b.Fragment,{children:[e,m]});return te(i,c,d,w)},it=l.memo(ee,(t,e)=>t.group.id!==e.group.id||t.group.activeTabId!==e.group.activeTabId||t.group.tabs.length!==e.group.tabs.length?!1:t.group.tabs===e.group.tabs);it.displayName="PanelGroupView";const q=(t,e,r)=>{const n=t.left,o=t.top,s=t.width,c=t.height,i=e-n,u=r-o,a=s/3,d=c/3;return i>a&&i<s-a&&u>d&&u<c-d?"center":i<u&&i<s-i&&u<c-u?"left":s-i<u&&s-i<i&&u<c-u?"right":u<i&&u<c-u&&i<s-i?"top":"bottom"};function D(t,e){if(!e){const n=(()=>({type:t}));return Object.defineProperty(n,"type",{value:t,writable:!1,enumerable:!0}),n}const r=((...n)=>{const o=e(...n);return typeof o>"u"?{type:t}:{type:t,payload:o}});return Object.defineProperty(r,"type",{value:t,writable:!1,enumerable:!0}),r}const re=(t,e)=>{const r={};return Object.keys(t).forEach(n=>{const o=t[n];r[n]=((...s)=>{const c=o(...s);return e(c),c})}),r},vt=(t,e)=>{const r={};return Object.keys(e).forEach(n=>{const o=e[n];if(!o)return;const s=t[n];if(!s)throw new Error(`Missing action creator for key "${String(n)}"`);r[s.type]=o}),r},xt={phase:{kind:"idle"},suggest:null,pointer:null,tabbarHover:null,draggingTabElement:null},j={startContent:D("START_CONTENT",t=>t),startTab:D("START_TAB",t=>t),setSuggest:D("SET_SUGGEST",t=>t),setPointer:D("SET_POINTER",t=>t),setTabbarHover:D("SET_TABBAR_HOVER",t=>t),reset:D("RESET")},ne=vt(j,{startContent:(t,e)=>({phase:{kind:"content",startX:e.payload.x,startY:e.payload.y,fromGroupId:e.payload.groupId,tabId:e.payload.tabId,cache:e.payload.cache},suggest:null,pointer:null,tabbarHover:null,draggingTabElement:null}),startTab:(t,e)=>({phase:{kind:"tab",startX:e.payload.x,startY:e.payload.y,fromGroupId:e.payload.groupId,tabId:e.payload.tabId,cache:e.payload.cache},suggest:null,pointer:null,tabbarHover:null,draggingTabElement:e.payload.element}),setSuggest:(t,e)=>({...t,suggest:e.payload}),setPointer:(t,e)=>({...t,pointer:e.payload}),setTabbarHover:(t,e)=>({...t,tabbarHover:e.payload}),reset:()=>xt}),oe=(t,e)=>{const r=ne[e.type];return r?r(t,e,void 0):t},It=l.createContext(null),U=()=>{const t=l.useContext(It);if(!t)throw new Error("usePanelInteractions must be used within InteractionsProvider");return t},se=({containerRef:t,dragThresholdPx:e,onCommitContentDrop:r,onCommitTabDrop:n,isContentZoneAllowed:o,children:s})=>{const[c,i]=l.useReducer(oe,xt),u=mt(),a=l.useCallback(()=>{const x=Array.from(u.getAll().entries()),y=x.map(([p,G])=>({gid:p,el:G.content??G.group})).filter(p=>!!p.el).map(p=>({...p,rect:p.el.getBoundingClientRect()})),f=x.map(([p,G])=>({gid:p,el:G.tabbar})).filter(p=>!!p.el).map(p=>({...p,rect:p.el.getBoundingClientRect()})),I=x.map(([p,G])=>({gid:p,el:G.content??G.group})).filter(p=>!!p.el).map(p=>({...p,rect:p.el.getBoundingClientRect()}));return{groups:y,tabbars:f,contents:I}},[u]),d=J.useEffectEvent(x=>{if(!t.current)return;const f=x.clientX,I=x.clientY,p=c.phase;if(p.kind==="idle")return;const G=Math.abs(f-p.startX),E=Math.abs(I-p.startY);if(G<e&&E<e){c.phase.kind==="content"&&i(j.setSuggest(null)),i(j.setPointer(null)),i(j.setTabbarHover(null));return}if(i(j.setPointer({x:f,y:I})),p.kind==="content"){const S=p.cache.groups.find(({rect:T})=>f>=T.left&&f<=T.right&&I>=T.top&&I<=T.bottom);if(!S){i(j.setSuggest(null));return}const P=q(S.rect,f,I);if(o&&!o({targetGroupId:S.gid,zone:P})){i(j.setSuggest(null));return}i(j.setSuggest({rect:S.rect,zone:P}));return}if(p.kind==="tab"){const S=p.cache.tabbars.find(({rect:C})=>f>=C.left&&f<=C.right&&I>=C.top&&I<=C.bottom);if(S){const O=Array.from(S.el.querySelectorAll("[role='tab']")).map(z=>z.getBoundingClientRect()),R=O.map(z=>z.left+z.width/2),_=R.findIndex(z=>f<z),N=_===-1?R.length:_,_t=O.length===0?S.rect.left+8:N===0?O[0].left:N===O.length?O[O.length-1].right:(O[N-1].right+O[N].left)/2;i(j.setTabbarHover({groupId:S.gid,index:N,rect:S.rect,insertX:_t}))}else i(j.setTabbarHover(null));const P=p.cache.contents.find(({rect:C})=>f>=C.left&&f<=C.right&&I>=C.top&&I<=C.bottom);if(!P){i(j.setSuggest(null));return}const T=q(P.rect,f,I);if(o&&!o({targetGroupId:P.gid,zone:T})){i(j.setSuggest(null));return}i(j.setSuggest({rect:P.rect,zone:T}))}}),h=J.useEffectEvent(x=>{const y=t.current,f=c;if(i(j.reset()),!y)return;const I=x.clientX,p=x.clientY;if(f.phase.kind==="idle")return;const G=Math.abs(I-f.phase.startX),E=Math.abs(p-f.phase.startY);if(!(G<e&&E<e)){if(f.phase.kind==="content"){const S=f.phase.cache.groups.find(({rect:C})=>I>=C.left&&I<=C.right&&p>=C.top&&p<=C.bottom);if(!S)return;const P=S.gid??null;if(!P)return;const T=q(S.rect,I,p);if(o&&!o({targetGroupId:P,zone:T}))return;r({fromGroupId:f.phase.fromGroupId,tabId:f.phase.tabId,targetGroupId:P,zone:T});return}if(f.phase.kind==="tab"){const S=f.phase.cache.tabbars.find(({rect:T})=>I>=T.left&&I<=T.right&&p>=T.top&&p<=T.bottom);if(S){const T=S.gid;if(!T)return;const O=Array.from(S.el.querySelectorAll("[role='tab']")).map(N=>{const Z=N.getBoundingClientRect();return Z.left+Z.width/2}),R=O.findIndex(N=>I<N),_=R===-1?O.length:R;n({fromGroupId:f.phase.fromGroupId,tabId:f.phase.tabId,targetGroupId:T,targetIndex:_});return}const P=f.phase.cache.contents.find(({rect:T})=>I>=T.left&&I<=T.right&&p>=T.top&&p<=T.bottom);if(P){const T=P.gid??null;if(!T)return;const C=q(P.rect,I,p);if(o&&!o({targetGroupId:T,zone:C}))return;r({fromGroupId:f.phase.fromGroupId,tabId:f.phase.tabId,targetGroupId:T,zone:C})}}}}),m=J.useEffectEvent(()=>{i(j.reset())});l.useEffect(()=>{if(c.phase.kind!=="idle")return window.addEventListener("pointermove",d),window.addEventListener("pointerup",h,{once:!0}),window.addEventListener("pointercancel",m,{once:!0}),()=>{window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",h),window.removeEventListener("pointercancel",m)}},[c.phase.kind]);const w=l.useCallback((x,y,f)=>{if(f.button!==0)return;f.currentTarget.setPointerCapture(f.pointerId);const I=a();i(j.startContent({x:f.clientX,y:f.clientY,groupId:x,tabId:y,cache:I}))},[a]),g=l.useCallback((x,y,f)=>{if(f.button!==0)return;const I=f.currentTarget;I&&I.setPointerCapture(f.pointerId);const p=a();i(j.startTab({x:f.clientX,y:f.clientY,groupId:y,tabId:x,cache:p,element:I}))},[a]),v=l.useMemo(()=>({suggest:c.suggest,isTabDragging:c.phase.kind==="tab",draggingTabId:c.phase.kind==="tab"?c.phase.tabId:null,dragPointer:c.pointer,tabbarHover:c.tabbarHover,draggingTabElement:c.draggingTabElement,onStartContentDrag:w,onStartTabDrag:g}),[c.suggest,c.pointer,c.tabbarHover,c.phase,c.draggingTabElement,w,g]);return b.jsx(It.Provider,{value:v,children:s})},dt={display:"inline-flex",alignItems:"center",userSelect:"none"},ie=({groupId:t,tab:e,active:r,dragging:n,onClickTab:o,onStartDrag:s,onCloseTab:c,tabComponent:i,tabElement:u,onDoubleClick:a})=>{const d=l.useEffectEvent(()=>{o(e.id)}),h=l.useEffectEvent(v=>{s&&v.button===0&&s(e.id,t,v)}),m=()=>{const v=!!c;return b.jsx(l.Activity,{mode:v?"visible":"hidden",children:b.jsx("button",{type:"button","aria-label":`Close tab ${e.title}`,onClick:x=>{c&&(x.stopPropagation(),c(t,e.id))},style:{marginLeft:6},tabIndex:v?void 0:-1,disabled:!v,"aria-hidden":v?void 0:!0,children:"×"})})},w={role:"tab","aria-selected":r,tabIndex:r?0:-1,style:dt,onClick:d,onPointerDown:h,onDoubleClick:a,"data-tab-id":e.id,"data-active":r?"true":"false","data-dragging":n?"true":"false",children:b.jsxs(b.Fragment,{children:[b.jsx("span",{children:e.title}),m()]})},g={type:"button",role:"tab","aria-selected":r,tabIndex:r?0:-1,style:dt,onClick:()=>{o(e.id)},onPointerDown:v=>{s&&v.button===0&&s(e.id,t,v)},onDoubleClick:a,children:b.jsx("span",{children:e.title})};return u?u(g):i?b.jsx(i,{...g}):b.jsx("div",{...w})},ce={display:"flex",alignItems:"center"},ue={flex:"1 1 auto",alignSelf:"stretch"},ae=({group:t,onClickTab:e,onStartDrag:r,rootRef:n,component:o,element:s,tabComponent:c,tabElement:i,onAddTab:u,onCloseTab:a,doubleClickToAdd:d})=>{const{isTabDragging:h,draggingTabId:m}=U(),w=l.useRef(null),g=l.useCallback(p=>{if(w.current=p,!!n){if(typeof n=="function"){n(p);return}try{n.current=p}catch{}}},[n]),v=l.useEffectEvent(p=>{const G=w.current??p.currentTarget;if(!G)return;const E=Array.from(G.querySelectorAll('[role="tab"]'));if(E.length===0)return;const S=R=>{const _=Math.max(0,Math.min(R,E.length-1)),N=E[_];N&&N.focus()},P=document.activeElement,T=P?E.indexOf(P):E.findIndex(R=>R.getAttribute("data-tab-id")===t.activeTabId);if(p.key==="ArrowRight"){p.preventDefault();const R=T>=0?T+1:0;S(R>=E.length?0:R);return}if(p.key==="ArrowLeft"){p.preventDefault();const R=T>=0?T-1:E.length-1;S(R<0?E.length-1:R);return}if(p.key==="Home"){p.preventDefault(),S(0);return}if(p.key==="End"){p.preventDefault(),S(E.length-1);return}if(p.key==="Enter"||p.key===" "){p.preventDefault();const _=(T>=0?E[T]:null)?.getAttribute("data-tab-id")??null;_&&e(_);return}if(p.key==="Delete"||p.key==="Backspace"){if(a){p.preventDefault();const _=(T>=0?E[T]:null)?.getAttribute("data-tab-id")??null;_&&a(t.id,_)}return}const C=(p.ctrlKey?1:0)+(p.metaKey?1:0)>0,O=typeof p.key=="string"?p.key.toLowerCase():"";if(C&&O==="t"){u&&(p.preventDefault(),u(t.id));return}});l.useEffect(()=>{const p=w.current;if(!p)return;const G=p.querySelector(`[role="tab"][data-tab-id="${t.activeTabId}"]`);if(G===document.activeElement)return;!p.contains(document.activeElement)&&G&&G.focus()},[t.activeTabId]);const x={style:ce,role:"tablist","data-tabbar":"true","data-group-id":t.id,"data-dragging":h?"true":"false",onKeyDown:v},y=Q.useElementComponentWrapper({element:s,component:o}),f=()=>u?b.jsx("button",{type:"button","aria-label":"Add tab",onClick:()=>{u(t.id)},children:"+"}):null,I=l.useCallback(()=>{d&&u&&u(t.id)},[d,u,t.id]);return b.jsxs(y,{...x,ref:g,onDoubleClick:I,children:[t.tabs.map((p,G)=>b.jsx(ie,{groupId:t.id,tab:p,active:t.activeTabId===p.id,dragging:m===p.id,onClickTab:e,onStartDrag:r,onCloseTab:a,tabComponent:c,tabElement:i,onDoubleClick:E=>E.stopPropagation()},`${t.id}:${p.id}:${G}`)),b.jsx("span",{style:ue}),f()]})},le=({id:t,TabBarComponent:e,PanelGroupComponent:r})=>{const{getGroup:n,getGroupContent:o,onClickTab:s,onAddTab:c,onCloseTab:i,onStartTabDrag:u,doubleClickToAdd:a,registerContentContainer:d}=Kt(),{setGroupEl:h,setTabbarEl:m,setContentEl:w}=mt(),g=l.useCallback(G=>{h(t,G)},[t,h]),v=l.useCallback(G=>{w(t,G),d(t,G)},[t,w,d]),x=l.useCallback(G=>{m(t,G)},[t,m]),y=n(t);if(!y)return null;const f=o(t),I=e??ae,p=r??(G=>b.jsx(it,{...G}));return b.jsx(p,{group:y,tabbar:b.jsx(I,{rootRef:x,group:y,onClickTab:G=>s(t,G),onAddTab:c,onCloseTab:i,onStartDrag:(G,E,S)=>u(G,E,S),doubleClickToAdd:a}),content:f,groupRef:g,contentRef:v})},de=(t,e)=>{const r=new Array(16);for(let n=0;n<4;n++)for(let o=0;o<4;o++)r[n*4+o]=t[0+o]*e[n*4+0]+t[4+o]*e[n*4+1]+t[8+o]*e[n*4+2]+t[12+o]*e[n*4+3];return r},W=t=>{if(t.length!==16)throw new Error("Matrix must have exactly 16 values");const e=Object.freeze([...t]),r=n=>{const o=de(e,n);return W(o)};return Object.freeze({translate:(n=0,o=0,s=0)=>r([1,0,0,0,0,1,0,0,0,0,1,0,n,o,s,1]),translate3d:(n,o,s)=>r([1,0,0,0,0,1,0,0,0,0,1,0,n,o,s,1]),translateX:n=>r([1,0,0,0,0,1,0,0,0,0,1,0,n,0,0,1]),translateY:n=>r([1,0,0,0,0,1,0,0,0,0,1,0,0,n,0,1]),translateZ:n=>r([1,0,0,0,0,1,0,0,0,0,1,0,0,0,n,1]),scale:(n=1,o=1,s=1)=>r([n,0,0,0,0,o,0,0,0,0,s,0,0,0,0,1]),scale3d:(n,o,s)=>r([n,0,0,0,0,o,0,0,0,0,s,0,0,0,0,1]),scaleX:n=>r([n,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),scaleY:n=>r([1,0,0,0,0,n,0,0,0,0,1,0,0,0,0,1]),scaleZ:n=>r([1,0,0,0,0,1,0,0,0,0,n,0,0,0,0,1]),rotateX:n=>{const o=Math.cos(n),s=Math.sin(n);return r([1,0,0,0,0,o,s,0,0,-s,o,0,0,0,0,1])},rotateY:n=>{const o=Math.cos(n),s=Math.sin(n);return r([o,0,-s,0,0,1,0,0,s,0,o,0,0,0,0,1])},rotateZ:n=>{const o=Math.cos(n),s=Math.sin(n);return r([o,s,0,0,-s,o,0,0,0,0,1,0,0,0,0,1])},rotate:(n,o,s,c)=>{const i=Math.sqrt(o*o+s*s+c*c);if(i===0)return W(e);o/=i,s/=i,c/=i;const u=Math.cos(n),a=Math.sin(n),d=1-u;return r([d*o*o+u,d*o*s+a*c,d*o*c-a*s,0,d*o*s-a*c,d*s*s+u,d*s*c+a*o,0,d*o*c+a*s,d*s*c-a*o,d*c*c+u,0,0,0,0,1])},rotate3d:(n,o,s,c)=>{const i=Math.sqrt(n*n+o*o+s*s);if(i===0)return W(e);n/=i,o/=i,s/=i;const u=Math.cos(c),a=Math.sin(c),d=1-u;return r([d*n*n+u,d*n*o+a*s,d*n*s-a*o,0,d*n*o-a*s,d*o*o+u,d*o*s+a*n,0,d*n*s+a*o,d*o*s-a*n,d*s*s+u,0,0,0,0,1])},skew:(n=0,o=0)=>{const s=Math.tan(n),c=Math.tan(o);return r([1,c,0,0,s,1,0,0,0,0,1,0,0,0,0,1])},skewX:n=>{const o=Math.tan(n);return r([1,0,0,0,o,1,0,0,0,0,1,0,0,0,0,1])},skewY:n=>{const o=Math.tan(n);return r([1,o,0,0,0,1,0,0,0,0,1,0,0,0,0,1])},perspective:n=>{if(n===0)throw new Error("Perspective distance cannot be zero");return r([1,0,0,0,0,1,0,0,0,0,1,-1/n,0,0,0,1])},toCSS:()=>`matrix3d(${e.join(", ")})`,toArray:()=>e,toString:()=>[`[${e[0]}, ${e[4]}, ${e[8]}, ${e[12]}]`,`[${e[1]}, ${e[5]}, ${e[9]}, ${e[13]}]`,`[${e[2]}, ${e[6]}, ${e[10]}, ${e[14]}]`,`[${e[3]}, ${e[7]}, ${e[11]}, ${e[15]}]`].join(`
2
+ `)})},pe=()=>W([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),fe={position:"fixed",inset:0,pointerEvents:"none",zIndex:k.DROP_SUGGEST_Z_INDEX},be={position:"absolute",border:`${k.DROP_SUGGEST_BORDER_WIDTH} dashed ${k.DROP_SUGGEST_BORDER_COLOR}`,background:k.DROP_SUGGEST_BG_COLOR,borderRadius:k.DROP_SUGGEST_BORDER_RADIUS,transformOrigin:"top left"},B=(t,e)=>e<=0?0:A.clampNumber(t/e,0),he=(t,e,r)=>{const{width:n,height:o}=t,s=r/2,c=n>0?n:1,i=o>0?o:1,u={translateX:r,translateY:r,scaleX:B(A.clampNumber(n-r*2,0),c),scaleY:B(A.clampNumber(o-r*2,0),i)},a={translateX:r,translateY:r,scaleX:B(A.clampNumber(n/2-r*1.5,0),c),scaleY:B(A.clampNumber(o-r*2,0),i)},d={translateX:n/2+s,translateY:r,scaleX:B(A.clampNumber(n/2-r*1.5,0),c),scaleY:B(A.clampNumber(o-r*2,0),i)},h={translateX:r,translateY:r,scaleX:B(A.clampNumber(n-r*2,0),c),scaleY:B(A.clampNumber(o/2-r*1.5,0),i)},m={translateX:r,translateY:o/2+s,scaleX:B(A.clampNumber(n-r*2,0),c),scaleY:B(A.clampNumber(o/2-r*1.5,0),i)},w={center:u,left:a,right:d,top:h,bottom:m},{translateX:g,translateY:v,scaleX:x,scaleY:y}=w[e];return pe().translate(g,v,0).scale(x,y,1).toCSS()},ge=(t,e)=>{const r=k.DROP_SUGGEST_PADDING_PX;return{...be,left:t.left,top:t.top,width:t.width,height:t.height,transform:he(t,e,r)}},wt=({suggest:t})=>{if(!t)return null;const{rect:e,zone:r}=t,n=ge(e,r);return b.jsx("div",{style:fe,children:b.jsx("div",{style:n})})},me=typeof window<"u"&&typeof document<"u",ve=t=>{const[e,r]=l.useState(null),[n,o]=l.useState(null);return st.useIsomorphicLayoutEffect(()=>{if(!me||!t){r(null),o(null);return}const s=t.getBoundingClientRect();r({width:s.width,height:s.height}),o(t.outerHTML)},[t]),{html:n,size:e}},xe={position:"fixed",inset:0,pointerEvents:"none",zIndex:k.TAB_DRAG_OVERLAY_Z_INDEX},Ie={position:"absolute",width:k.TAB_DRAG_INSERT_GUIDE_WIDTH,borderRadius:k.TAB_DRAG_INSERT_GUIDE_BORDER_RADIUS,background:k.TAB_DRAG_INSERT_GUIDE_COLOR,boxShadow:k.TAB_DRAG_INSERT_GUIDE_SHADOW},we=()=>{const{isTabDragging:t,draggingTabId:e,dragPointer:r,tabbarHover:n,draggingTabElement:o}=U(),{html:s,size:c}=ve(o),i=r!==null&&e!==null,u=l.useMemo(()=>{if(!(!i||!r))return{position:"absolute",left:r.x,top:r.y,transform:`translate(${k.TAB_DRAG_PREVIEW_OFFSET_X}, ${k.TAB_DRAG_PREVIEW_OFFSET_Y})`,pointerEvents:"none"}},[i,r]),a=l.useMemo(()=>{if(!(!u||!o))return c?{...u,width:c.width,height:c.height}:u},[u,o,c]),d=l.useMemo(()=>{if(n)return{...Ie,left:n.insertX,top:n.rect.top+4,height:Math.max(0,n.rect.height-8)}},[n]);return t?b.jsxs("div",{style:xe,children:[b.jsx(l.Activity,{mode:a?"visible":"hidden",children:b.jsx("div",{style:a,children:b.jsx("div",{style:{width:"100%",height:"100%",pointerEvents:"none"},dangerouslySetInnerHTML:{__html:s??""}})})}),b.jsx(l.Activity,{mode:d?"visible":"hidden",children:b.jsx("div",{style:d})})]}):null},M=t=>t.type==="group",L=(t,e=[])=>{if(M(t))return[...e,t.groupId];const r=L(t.a,e);return L(t.b,r)},V=(t,e)=>e.reduce((r,n)=>M(r)?r:r[n],t),Y=(t,e,r)=>{if(e.length===0)return r;const[n,...o]=e;return M(t)?t:n==="a"?{...t,a:Y(t.a,o,r)}:{...t,b:Y(t.b,o,r)}},K=(t,e,r=[])=>{if(M(t))return t.groupId===e?{splitPath:null,side:null}:null;if(M(t.a)&&t.a.groupId===e)return{splitPath:r,side:"a"};if(M(t.b)&&t.b.groupId===e)return{splitPath:r,side:"b"};const n=K(t.a,e,[...r,"a"]);return n||K(t.b,e,[...r,"b"])},ct=(t,e,r,n)=>{const o=n(),s=K(t,e),c={type:"split",direction:r,ratio:.5,a:{type:"group",groupId:e},b:{type:"group",groupId:o}};if(!s||s.splitPath===null)return{tree:c,newGroupId:o};const i=s.splitPath,u=V(t,i);if(M(u))return{tree:c,newGroupId:o};const a=s.side==="a"?{...u,a:c}:{...u,b:c};return{tree:Y(t,i,a),newGroupId:o}},yt=(t,e)=>{const r=K(t,e);if(!r||r.splitPath===null)return{tree:t,survivorGroupId:e};const n=r.splitPath,o=V(t,n);if(M(o))return{tree:t,survivorGroupId:e};const s=r.side==="a"?o.b:o.a,c=Y(t,n,s),i=M(s)?s.groupId:L(s)[0]??null;return{tree:c,survivorGroupId:i}},Gt=(t,e,r)=>{const n=V(t,e);if(M(n))return t;const o={...n,ratio:A.clampNumber(r,.05,.95)};return Y(t,e,o)},tt=t=>{if(Object.keys(t.groups).filter(o=>t.groups[o].tabIds.length===0).length===0)return t;const n=(o,s)=>{const c=o.groups[s];if(!c||c.tabs.length>0||Object.keys(o.groups).length<=1)return o;const{tree:u,survivorGroupId:a}=yt(o.tree,s),{[s]:d,...h}=o.groups,m=L(u),w=o.focusedGroupId===s?a??m[0]??null:o.focusedGroupId;return{...o,tree:u,groups:h,groupOrder:m,focusedGroupId:w}};return t.groupOrder.reduce((o,s)=>n(o,s),t)},Tt=t=>({id:t,tabIds:[],tabs:[],activeTabId:null}),et=(t,e,r,n)=>{const o={...t.groups},s=o[e];if(!s)throw new Error(`Group ${e} does not exist.`);const c={...t.panels,[r.id]:r},i=[...s.tabIds,r.id],u=n?r.id:s.activeTabId??r.id,a=i.map(h=>c[h]),d={...s,tabIds:i,tabs:a,activeTabId:u};return o[e]=d,{...t,panels:c,groups:o}},St=(t,e,r)=>{const n={...t.groups},o=n[e];if(!o)throw new Error(`Group ${e} does not exist.`);const s=o.tabIds.filter(u=>u!==r),c=s.map(u=>t.panels[u]),i=o.activeTabId===r?s[0]??null:o.activeTabId;return n[e]={...o,tabIds:s,tabs:c,activeTabId:i},{...t,groups:n}},rt=(t,e,r,n,o)=>{const s=t.groups[e],c=t.groups[r];if(!s||!c)throw new Error("moveTab: source or target group is missing.");const i={...t.groups},u=s.tabIds.filter(h=>h!==n),a=[...c.tabIds.filter(h=>h!==n),n],d=s.activeTabId===n?u[0]??null:s.activeTabId;return i[e]={...s,tabIds:u,tabs:u.map(h=>t.panels[h]),activeTabId:d},i[r]={...c,tabIds:a,tabs:a.map(h=>t.panels[h]),activeTabId:o?n:c.activeTabId??n},{...t,groups:i}},ut=(t,e,r)=>{const n=t.groups[e];if(!n)throw new Error(`setActiveTab: group ${e} not found.`);if(!n.tabIds.some(s=>s===r))throw new Error(`setActiveTab: tab ${r} not found in group ${e}.`);const o={...t.groups,[e]:{...n,activeTabId:r}};return{...t,groups:o,focusedGroupId:e}},ye=(t,e,r,n)=>{const o=t.groups[e];if(!o)throw new Error(`reorderTabWithinGroup: group ${e} not found.`);const s=o.tabIds.findIndex(h=>h===r);if(s===-1)throw new Error(`reorderTabWithinGroup: tab ${r} not in group ${e}.`);const c=Math.max(0,Math.min(n,o.tabIds.length-1));if(s===c)return t;const i=o.tabIds.slice(),[u]=i.splice(s,1);i.splice(c,0,u);const a=i.map(h=>t.panels[h]),d={...t.groups,[e]:{...o,tabIds:i,tabs:a}};return{...t,groups:d}},nt=(t,e,r,n,o)=>{const s=t.groups[e];if(!s)throw new Error(`addTabToGroupAtIndex: group ${e} not found.`);const c={...t.panels,[r.id]:r},i=s.tabIds.slice(),u=Math.max(0,Math.min(n,i.length));i.splice(u,0,r.id);const a=i.map(m=>c[m]),d=o?r.id:s.activeTabId??r.id,h={...t.groups,[e]:{...s,tabIds:i,tabs:a,activeTabId:d}};return{...t,panels:c,groups:h}},$=(t,e)=>{if(!t.groups[e])throw new Error(`setFocusedGroup: group ${e} not found.`);return{...t,focusedGroupId:e}},Et=(t,e)=>{const r=e-1,n=t.groupOrder[r];return n?$(t,n):t},Ct=t=>{const e=t.groupOrder,r=t.focusedGroupId;if(!r){const s=e[0];return s?$(t,s):t}const n=e.indexOf(r),o=e[(n+1)%e.length];return $(t,o)},Pt=t=>{const e=t.groupOrder,r=t.focusedGroupId;if(!r){const s=e[e.length-1];return s?$(t,s):t}const n=e.indexOf(r),o=e[(n-1+e.length)%e.length];return $(t,o)},Ge=t=>{const e=L(t.tree);return{...t,groupOrder:e}},at=(t,e,r,n)=>{const{tree:o,newGroupId:s}=ct(t.tree,e,r,n),c={...t.groups,[s]:Tt(s)},i=L(o);return{...t,tree:o,groups:c,groupOrder:i,focusedGroupId:s}},Te=t=>{const r={type:"group",groupId:"g_1"},n=Object.fromEntries(t.map(i=>[i.id,i])),s={g_1:{id:"g_1",tabIds:t.map(i=>i.id),tabs:t,activeTabId:t[0]?.id??null}};return{tree:r,panels:n,groups:s,groupOrder:["g_1"],focusedGroupId:"g_1"}},Se=l.createContext(null),Ee=({value:t,children:e})=>b.jsx(Se.Provider,{value:t,children:e}),Rt=l.createContext(null),Ce=()=>{const t=l.useContext(Rt);if(!t)throw new Error("useTree must be used within TreeProvider");return t},Pe=({value:t,children:e})=>b.jsx(Rt.Provider,{value:t,children:e}),Re=l.createContext(null),je=({value:t,children:e})=>b.jsx(Re.Provider,{value:t,children:e}),X=t=>{const e=A.toFiniteNumberOr(t,Number.POSITIVE_INFINITY);return A.clampNumber(e,1)},De=t=>typeof t=="object"&&t!==null,Ae=t=>De(t)?"rows"in t?!0:"cols"in t:!1,jt=t=>{if(!t)return{rows:Number.POSITIVE_INFINITY,cols:Number.POSITIVE_INFINITY};if(typeof t=="number"){const r=X(t);return{rows:r,cols:r}}if(Ae(t))return{rows:X(t.rows),cols:X(t.cols)};const e=t;return{rows:X(e.maxHorizontal),cols:X(e.maxVertical)}},ot=t=>{if(M(t))return{horizontal:1,vertical:1};const e=ot(t.a),r=ot(t.b);return t.direction==="horizontal"?{horizontal:e.horizontal+r.horizontal,vertical:Math.max(e.vertical,r.vertical)}:{horizontal:Math.max(e.horizontal,r.horizontal),vertical:e.vertical+r.vertical}},ke=(t,e,r)=>{const{tree:n}=ct(t,e,r,()=>"__preview__");return n},lt=(t,e,r,n)=>{if(!Number.isFinite(n.rows)&&!Number.isFinite(n.cols))return!0;const o=ke(t,e,r),s=ot(o);return!(s.horizontal>n.rows||s.vertical>n.cols)},Dt={splitFocused:D("panelState/splitFocused",t=>({direction:t})),focusGroupIndex:D("panelState/focusGroupIndex",t=>({index1Based:t})),focusNextGroup:D("panelState/focusNextGroup"),focusPrevGroup:D("panelState/focusPrevGroup"),setActiveTab:D("panelState/setActiveTab",(t,e)=>({groupId:t,tabId:e})),addTab:D("panelState/addTab",t=>t),addNewTab:D("panelState/addNewTab",t=>t),removeTab:D("panelState/removeTab",(t,e)=>({groupId:t,tabId:e})),contentDrop:D("panelState/contentDrop",t=>t),tabDrop:D("panelState/tabDrop",t=>t),adjustSplitRatio:D("panelState/adjustSplitRatio",t=>t)},Me=(t,e,r)=>{const n=t.groups[e.fromGroupId],o=t.groups[e.targetGroupId];if(!n||!o||!n.tabs.find(h=>h.id===e.tabId))return t;if(e.zone==="center"&&e.fromGroupId===e.targetGroupId)return ut(t,e.fromGroupId,e.tabId);if(e.zone==="center"){const h=rt(t,e.fromGroupId,e.targetGroupId,e.tabId,!0);return $(h,e.targetGroupId)}const c=e.zone==="left"||e.zone==="right"?"vertical":"horizontal";if(!lt(t.tree,e.targetGroupId,c,r.splitLimits))return t;const i=r.createGroupId(),u=at(t,e.targetGroupId,c,()=>i),a=e.zone==="left"||e.zone==="top"?e.targetGroupId:i,d=rt(u,e.fromGroupId,a,e.tabId,!0);return $(d,a)},Oe=(t,e)=>{const r=t.groups[e.fromGroupId],n=t.groups[e.targetGroupId];if(!r||!n||!t.panels[e.tabId])return t;if(e.fromGroupId===e.targetGroupId){const m=r.tabIds.filter(y=>y!==e.tabId),w=Math.max(0,Math.min(e.targetIndex,m.length)),g=m.slice(0,w).concat([e.tabId],m.slice(w)),v=g.map(y=>t.panels[y]).filter(Boolean),x={...t.groups,[e.fromGroupId]:{...r,tabIds:g,tabs:v}};return{...t,groups:x}}const s={...t.groups},c=r.tabIds.filter(m=>m!==e.tabId),i=c.map(m=>t.panels[m]);s[e.fromGroupId]={...r,tabIds:c,tabs:i,activeTabId:r.activeTabId===e.tabId?i[0]?.id??null:r.activeTabId};const u=n.tabIds.filter(m=>m!==e.tabId),a=Math.max(0,Math.min(e.targetIndex,u.length)),d=u.slice(0,a).concat([e.tabId],u.slice(a)),h=d.map(m=>t.panels[m]).filter(Boolean);return s[e.targetGroupId]={...n,tabIds:d,tabs:h,activeTabId:e.tabId},{...t,groups:s,focusedGroupId:e.targetGroupId}},_e=vt(Dt,{splitFocused:(t,e,r)=>{const n=t.focusedGroupId??t.groupOrder[0]??null;return!n||!lt(t.tree,n,e.payload.direction,r.splitLimits)?t:at(t,n,e.payload.direction,r.createGroupId)},focusGroupIndex:(t,e)=>Et(t,e.payload.index1Based),focusNextGroup:t=>Ct(t),focusPrevGroup:t=>Pt(t),setActiveTab:(t,e)=>ut(t,e.payload.groupId,e.payload.tabId),addTab:(t,e)=>{const{groupId:r,tab:n,index:o,makeActive:s}=e.payload;return typeof o=="number"?nt(t,r,n,o,s??!0):et(t,r,n,s??!0)},addNewTab:(t,e,r)=>{if(!r.createPanelId)throw new Error("addNewTab requires PanelSystemProvider.createPanelId");const o={id:r.createPanelId(),title:e.payload.title,render:()=>e.payload.title},{groupId:s,index:c,makeActive:i}=e.payload;return typeof c=="number"?nt(t,s,o,c,i??!0):et(t,s,o,i??!0)},removeTab:(t,e)=>St(t,e.payload.groupId,e.payload.tabId),contentDrop:(t,e,r)=>Me(t,e.payload,r),tabDrop:(t,e)=>Oe(t,e.payload),adjustSplitRatio:(t,e)=>{const r=V(t.tree,e.payload.path);if(M(r))return t;const n=Gt(t.tree,e.payload.path,r.ratio+e.payload.deltaRatio);return{...t,tree:n}}}),pt=(t,e,r)=>{const n=_e[e.type];if(!n)return t;const o=n(t,e,r);return tt(o)},At=l.createContext(null),H=()=>{const t=l.useContext(At);if(!t)throw new Error("usePanelSystem must be used within PanelSystemProvider");return t},kt=({initialState:t,createGroupId:e,createPanelId:r,state:n,onStateChange:o,splitLimits:s,children:c})=>{const i=l.useMemo(()=>tt(t),[t]),u=l.useMemo(()=>jt(s),[s]),a=l.useRef({createGroupId:e,splitLimits:u,createPanelId:r});a.current.createGroupId=e,a.current.splitLimits=u,a.current.createPanelId=r;const[d,h]=l.useReducer((G,E)=>pt(G,E,a.current),i),m=l.useMemo(()=>n?tt(n):d,[n,d]),w=l.useRef(m);w.current=m;const g=n!==void 0,v=l.useCallback(G=>{if(g){const E=pt(w.current,G,a.current);o?.(E);return}h(G)},[g,o,h]),x=l.useMemo(()=>re(Dt,v),[v]),y=l.useMemo(()=>({setActiveTab:x.setActiveTab,tabDrop:x.tabDrop}),[x]),f=l.useMemo(()=>({adjustSplitRatio:x.adjustSplitRatio}),[x]),I=l.useMemo(()=>({focusGroupIndex:x.focusGroupIndex,focusNextGroup:x.focusNextGroup,focusPrevGroup:x.focusPrevGroup}),[x]),p=l.useMemo(()=>({state:m,dispatch:v,actions:x}),[m,v,x]);return b.jsx(At.Provider,{value:p,children:b.jsx(Ee,{value:y,children:b.jsx(Pe,{value:f,children:b.jsx(je,{value:I,children:c})})})})},Ne=()=>{const{actions:t}=H();return l.useMemo(()=>({splitFocused:e=>{t.splitFocused(e)},focusGroupIndex:e=>{t.focusGroupIndex(e)},focusNextGroup:()=>{t.focusNextGroup()},focusPrevGroup:()=>{t.focusPrevGroup()},closeFocusedGroup:()=>{}}),[t])},Be=()=>{const{actions:t}=H(),e=l.useCallback(({fromGroupId:n,tabId:o,targetGroupId:s,zone:c})=>{t.contentDrop({fromGroupId:n,tabId:o,targetGroupId:s,zone:c})},[t]),r=l.useCallback(({fromGroupId:n,tabId:o,targetGroupId:s,targetIndex:c})=>{t.tabDrop({fromGroupId:n,tabId:o,targetGroupId:s,targetIndex:c})},[t]);return{onCommitContentDrop:e,onCommitTabDrop:r}},$e=()=>{const t=Ht(),e=Ne();return l.useEffect(()=>{Ft(t,e)},[t,e]),null},Mt=l.createContext(null),Le=()=>{const t=l.useContext(Mt);if(!t)throw new Error("useContentRegistry must be used within ContentRegistryProvider");return t},He=t=>{const e=document.createElement("div");return e.setAttribute("data-panel-wrapper",t),e.style.display="contents",e},ze=(t,e,r)=>{const[n]=l.useState(()=>He(t));return st.useIsomorphicLayoutEffect(()=>(n.style.display=r?"contents":"none",e&&n.parentElement!==e&&e.appendChild(n),()=>{n.parentElement?.removeChild(n)}),[n,e,r]),n},Ot=l.memo(({panelId:t,content:e,placement:r,containerElement:n})=>{const o=r?.isActive??!1,s=ze(t,n,o);return Bt.createPortal(b.jsx(l.Activity,{mode:o?"visible":"hidden",children:e}),s)});Ot.displayName="PanelContentHost";const Xe=({children:t,panels:e,placements:r})=>{const[n,o]=l.useState(new Map),s=l.useCallback((m,w)=>{o(g=>{const v=new Map(g);return w?v.set(m,w):v.delete(m),v})},[]),c=l.useMemo(()=>({registerContentContainer:s}),[s]),i=l.useRef(e);i.current=e;const u=l.useCallback(m=>{const w=i.current[m];return w?w.render(w.id):null},[]),a=l.useMemo(()=>Object.keys(e),[e]),{getCachedContent:d}=$t.useContentCache({resolveContent:u,validIds:a}),h=Object.keys(e);return b.jsxs(Mt.Provider,{value:c,children:[t,h.map(m=>{if(!e[m])return null;const g=r[m]??null,v=g?n.get(g.groupId)??null:null,x=d(m);return b.jsx(Ot,{panelId:m,content:x,placement:g,containerElement:v},m)})]})},Fe=({children:t,emptyContentComponent:e,doubleClickToAdd:r})=>{const n=U(),{state:o,actions:s}=H(),{registerContentContainer:c}=Le(),i=l.useCallback(()=>l.createElement("div",{style:{color:"#888",fontSize:12,padding:12}},"No tabs"),[]),u=e??i,a=l.useCallback(y=>{const f=o.groups[y];if(!f)return null;const I=f.tabIds.map(p=>o.panels[p]).filter(Boolean);return{...f,tabs:I}},[o.groups,o.panels]),d=l.useCallback(y=>{const f=o.groups[y];return!f||f.tabIds.length===0?b.jsx(u,{}):null},[o.groups,u]),h=l.useCallback((y,f)=>{s.setActiveTab(y,f)},[s]),m=l.useCallback(y=>{s.addNewTab({groupId:y,title:"New Tab",makeActive:!0})},[s]),w=l.useCallback((y,f)=>{s.removeTab(y,f)},[s]),g=l.useCallback((y,f,I)=>{s.setActiveTab(f,y),n.onStartTabDrag(y,f,I)},[s,n]),v=l.useCallback((y,f)=>{const I=o.groups[y];!I||!I.activeTabId||n.onStartContentDrag(y,I.activeTabId,f)},[o.groups,n]),x=l.useMemo(()=>({getGroup:a,getGroupContent:d,onClickTab:h,onAddTab:m,onCloseTab:w,onStartTabDrag:g,onStartContentDrag:v,doubleClickToAdd:r,registerContentContainer:c}),[a,d,h,m,w,g,v,r,c]);return b.jsx(Ut,{value:x,children:t})},Ye=({children:t,emptyContentComponent:e,doubleClickToAdd:r})=>{const{state:n}=H(),o=l.useMemo(()=>{const s={};for(const[c,i]of Object.entries(n.groups))for(const u of i.tabIds)s[u]={groupId:c,isActive:u===i.activeTabId};return s},[n.groups]);return b.jsx(Xe,{panels:n.panels,placements:o,children:b.jsx(Fe,{emptyContentComponent:e,doubleClickToAdd:r,children:t})})},F=(t,e,r,n)=>{if(M(t))return n;const o=t.direction,s=o==="vertical"?r.x+r.w*t.ratio:r.y+r.h*t.ratio;if(n.push({path:e,direction:o,parentRect:r,linePos:s}),o==="vertical"){const u=r.w*t.ratio,a=r.w-u;return F(t.a,[...e,"a"],{x:r.x,y:r.y,w:u,h:r.h},n),F(t.b,[...e,"b"],{x:r.x+u,y:r.y,w:a,h:r.h},n),n}const c=r.h*t.ratio,i=r.h-c;return F(t.a,[...e,"a"],{x:r.x,y:r.y,w:r.w,h:c},n),F(t.b,[...e,"b"],{x:r.x,y:r.y+c,w:r.w,h:i},n),n},qe=({containerRef:t})=>{const{state:e}=H(),{adjustSplitRatio:r}=Ce(),n=l.useMemo(()=>F(e.tree,[],{x:0,y:0,w:100,h:100},[]),[e.tree]),[o,s]=l.useState(null);if(st.useIsomorphicLayoutEffect(()=>{const i=t.current;if(!i)return;const u=()=>{const w=i.getBoundingClientRect();s({left:w.left,top:w.top,width:w.width,height:w.height})};u();function a(){try{const w=window.ResizeObserver;return typeof w=="function"?w:null}catch{return null}}const d=a(),h=d?new d(()=>u()):null;h&&h.observe(i);const m=()=>u();return window.addEventListener("scroll",m,!0),()=>{window.removeEventListener("scroll",m,!0),h&&h.disconnect()}},[t,e.tree]),!o)return null;const c=(i,u)=>{const a={left:o.left+o.width*i.parentRect.x/100,top:o.top+o.height*i.parentRect.y/100,width:o.width*i.parentRect.w/100,height:o.height*i.parentRect.h/100},d=k.SPLIT_HANDLE_THICKNESS;if(i.direction==="vertical"){const g=a.left+a.width*(i.linePos-i.parentRect.x)/i.parentRect.w,v={position:"fixed",left:`calc(${Math.round(g)}px - ${d} / 2)`,top:Math.round(a.top),width:d,height:Math.round(a.height),cursor:"col-resize",pointerEvents:"auto"},x=y=>{const f=o.width*i.parentRect.w/100,I=f===0?0:y/f;r({path:i.path,deltaRatio:I})};return b.jsx("div",{style:v,children:b.jsx(Q.ResizeHandle,{direction:"vertical",onResize:x})},`split-${u}`)}const h=a.top+a.height*(i.linePos-i.parentRect.y)/i.parentRect.h,m={position:"fixed",left:Math.round(a.left),top:`calc(${Math.round(h)}px - ${d} / 2)`,width:Math.round(a.width),height:d,cursor:"row-resize",pointerEvents:"auto"},w=g=>{const v=o.height*i.parentRect.h/100,x=v===0?0:g/v;r({path:i.path,deltaRatio:x})};return b.jsx("div",{style:m,children:b.jsx(Q.ResizeHandle,{direction:"horizontal",onResize:w})},`split-${u}`)};return b.jsx("div",{style:{position:"fixed",inset:0,pointerEvents:"none"},children:n.map((i,u)=>c(i,u))})},We={position:"relative",display:"flex",width:"100%",height:"100%"},Ke=({state:t,layoutMode:e,gridTracksInteractive:r,view:n,tabBarComponent:o,panelGroupComponent:s})=>{const c=u=>{if(n){const a=n;return b.jsx(a,{groupId:u})}return b.jsx(le,{id:u,TabBarComponent:o,PanelGroupComponent:s})};if(e==="grid"){const u=Wt(t,c,!!r);return b.jsx(A.GridLayout,{config:u.config,layers:u.layers})}const i=qt(t,c);return b.jsx(A.GridLayout,{config:i.config,layers:i.layers})},Ue=({containerRef:t,layoutMode:e,gridTracksInteractive:r,dragThresholdPx:n,view:o,style:s,className:c,tabBarComponent:i,panelGroupComponent:u,splitLimits:a,emptyContentComponent:d,doubleClickToAdd:h})=>{const{state:m}=H(),{onCommitContentDrop:w,onCommitTabDrop:g}=Be(),v=l.useMemo(()=>({...We,...s}),[s]),x=l.useCallback(({targetGroupId:y,zone:f})=>{if(f==="center")return!0;const I=f==="left"||f==="right"?"vertical":"horizontal";return lt(m.tree,y,I,a)},[m.tree,a]);return b.jsx(Vt,{children:b.jsxs(se,{containerRef:t,dragThresholdPx:n,onCommitContentDrop:w,onCommitTabDrop:g,isContentZoneAllowed:x,children:[b.jsx(Ye,{emptyContentComponent:d,doubleClickToAdd:h,children:b.jsx("div",{ref:t,className:c,style:v,children:b.jsx(Ke,{state:m,layoutMode:e,gridTracksInteractive:r,view:o,tabBarComponent:i,panelGroupComponent:u})})}),b.jsx(qe,{containerRef:t}),b.jsx(Ve,{})]})})},Ve=()=>{const t=U();return b.jsxs(b.Fragment,{children:[b.jsx(wt,{suggest:t.suggest}),b.jsx(we,{})]})},Ze=({initialState:t,createGroupId:e,createPanelId:r,layoutMode:n,gridTracksInteractive:o,dragThresholdPx:s,view:c,emptyContentComponent:i,state:u,onStateChange:a,className:d,style:h,tabBarComponent:m,panelGroupComponent:w,splitLimits:g,doubleClickToAdd:v})=>{if(!t)throw new Error("PanelSystem requires initialState.");if(!e)throw new Error("PanelSystem requires explicit createGroupId function.");if(!n)throw new Error("PanelSystem requires explicit layoutMode ('absolute' | 'grid').");if(n==="grid"&&o===void 0)throw new Error("PanelSystem(layoutMode='grid') requires explicit 'gridTracksInteractive' flag.");if(s===void 0)throw new Error("PanelSystem requires explicit 'dragThresholdPx' value.");const x=l.useRef(null),y=l.useMemo(()=>jt(g),[g]);return b.jsx(kt,{initialState:t,createGroupId:e,createPanelId:r,state:u,onStateChange:a,splitLimits:g,children:b.jsxs(Xt,{children:[b.jsx($e,{}),b.jsx(Ue,{containerRef:x,layoutMode:n,gridTracksInteractive:o,dragThresholdPx:s,view:c,style:h,className:d,tabBarComponent:m,panelGroupComponent:w,splitLimits:y,emptyContentComponent:i,doubleClickToAdd:v})]})})};exports.DropSuggestOverlay=wt;exports.PanelGroupView=it;exports.PanelSystem=Ze;exports.PanelSystemProvider=kt;exports.addTabToGroup=et;exports.addTabToGroupAtIndex=nt;exports.buildInitialState=Te;exports.closeLeaf=yt;exports.collectGroupsInOrder=L;exports.createEmptyGroup=Tt;exports.focusGroupIndex=Et;exports.isGroup=M;exports.moveTab=rt;exports.nextGroup=Ct;exports.prevGroup=Pt;exports.refreshGroupOrder=Ge;exports.removeTabFromGroup=St;exports.reorderTabWithinGroup=ye;exports.setActiveTab=ut;exports.setFocusedGroup=$;exports.setSplitRatio=Gt;exports.splitGroup=at;exports.splitLeaf=ct;exports.usePanelSystem=H;
3
+ //# sourceMappingURL=PanelSystem-Bs8bQwQF.cjs.map