react-panel-layout 0.5.1 → 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 (466) hide show
  1. package/dist/{FloatingPanelFrame-D9Cp2al1.cjs → FloatingPanelFrame-CEmXDvUA.cjs} +2 -2
  2. package/dist/FloatingPanelFrame-CEmXDvUA.cjs.map +1 -0
  3. package/dist/{FloatingPanelFrame-6W5OexYe.js → FloatingPanelFrame-SgYLc6Ud.js} +12 -15
  4. package/dist/FloatingPanelFrame-SgYLc6Ud.js.map +1 -0
  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 +73 -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/types.d.ts +12 -0
  111. package/dist/useContentCache-CO3LYNmz.js +24 -0
  112. package/dist/useContentCache-CO3LYNmz.js.map +1 -0
  113. package/dist/useContentCache-DqXtLrLs.cjs +2 -0
  114. package/dist/useContentCache-DqXtLrLs.cjs.map +1 -0
  115. package/dist/useDocumentPointerEvents-CKdhGXd0.js +46 -0
  116. package/dist/useDocumentPointerEvents-CKdhGXd0.js.map +1 -0
  117. package/dist/useDocumentPointerEvents-ChqrKXDk.cjs +2 -0
  118. package/dist/useDocumentPointerEvents-ChqrKXDk.cjs.map +1 -0
  119. package/dist/useEffectEvent-Dp7HLCf0.js +13 -0
  120. package/dist/useEffectEvent-Dp7HLCf0.js.map +1 -0
  121. package/dist/useEffectEvent-huSsGUnl.cjs +2 -0
  122. package/dist/useEffectEvent-huSsGUnl.cjs.map +1 -0
  123. package/dist/useFloatingState-C4kRaW_R.cjs +2 -0
  124. package/dist/useFloatingState-C4kRaW_R.cjs.map +1 -0
  125. package/dist/useFloatingState-tEfA_wbc.js +74 -0
  126. package/dist/useFloatingState-tEfA_wbc.js.map +1 -0
  127. package/dist/window/index.d.ts +61 -0
  128. package/dist/window.cjs +2 -0
  129. package/dist/window.cjs.map +1 -0
  130. package/dist/window.js +149 -0
  131. package/dist/window.js.map +1 -0
  132. package/docs/design-tokens.md +405 -0
  133. package/package.json +29 -4
  134. package/src/PanelSystemContext.tsx +88 -0
  135. package/src/components/grid/GridLayerList.tsx +172 -0
  136. package/src/components/grid/GridLayerResizeHandles.tsx +145 -0
  137. package/src/components/grid/GridLayout.spec.tsx +743 -0
  138. package/src/components/grid/GridLayout.tsx +130 -0
  139. package/src/components/grid/GridTrackResizeHandle.tsx +87 -0
  140. package/src/components/paneling/FloatingPanelFrame.tsx +203 -0
  141. package/src/components/panels/DropSuggestOverlay.tsx +131 -0
  142. package/src/components/panels/PanelGroupView.tsx +112 -0
  143. package/src/components/pivot/PivotLayer.tsx +27 -0
  144. package/src/components/resizer/HorizontalDivider.tsx +52 -0
  145. package/src/components/resizer/ResizeHandle.tsx +118 -0
  146. package/src/components/tabs/TabBar.tsx +223 -0
  147. package/src/components/tabs/TabBarTab.tsx +133 -0
  148. package/src/components/tabs/TabDragOverlay.tsx +92 -0
  149. package/src/components/window/DialogOverlay.tsx +180 -0
  150. package/src/components/window/Drawer.tsx +282 -0
  151. package/src/components/window/DrawerLayers.tsx +58 -0
  152. package/src/components/window/FloatingWindow.tsx +95 -0
  153. package/src/components/window/PopupLayerPortal.tsx +218 -0
  154. package/src/config/PanelContentDeclaration.tsx +427 -0
  155. package/src/config/index.tsx +52 -0
  156. package/src/config/panelJsx.spec.tsx +54 -0
  157. package/src/config/panelJsxConfig.spec.tsx +54 -0
  158. package/src/config/panelJsxDrawer.spec.tsx +33 -0
  159. package/src/config/panelRouter.spec.ts +68 -0
  160. package/src/config/panelRouter.tsx +155 -0
  161. package/src/constants/styles.ts +261 -0
  162. package/src/demo/Layout.module.css +258 -0
  163. package/src/demo/Layout.tsx +176 -0
  164. package/src/demo/components/CodeBlock.module.css +54 -0
  165. package/src/demo/components/CodeBlock.tsx +34 -0
  166. package/src/demo/components/CodePreview.module.css +37 -0
  167. package/src/demo/components/CodePreview.tsx +31 -0
  168. package/src/demo/components/DataPreview.module.css +177 -0
  169. package/src/demo/components/DataPreview.tsx +115 -0
  170. package/src/demo/components/Story.module.css +68 -0
  171. package/src/demo/components/Story.tsx +54 -0
  172. package/src/demo/components/layout/CodePanel.module.css +183 -0
  173. package/src/demo/components/layout/CodePanel.tsx +149 -0
  174. package/src/demo/components/layout/DemoPage.module.css +60 -0
  175. package/src/demo/components/layout/DemoPage.tsx +56 -0
  176. package/src/demo/components/layout/SingleSamplePage.module.css +11 -0
  177. package/src/demo/components/layout/SingleSamplePage.tsx +35 -0
  178. package/src/demo/components/layout/SplitDemoLayout.module.css +107 -0
  179. package/src/demo/components/layout/SplitDemoLayout.tsx +218 -0
  180. package/src/demo/components/layout/index.ts +11 -0
  181. package/src/demo/components/tab-styles/ChromeTabBar.module.css +75 -0
  182. package/src/demo/components/tab-styles/ChromeTabBar.tsx +111 -0
  183. package/src/demo/components/tab-styles/GitHubTabBar.module.css +81 -0
  184. package/src/demo/components/tab-styles/GitHubTabBar.tsx +109 -0
  185. package/src/demo/components/tab-styles/VSCodeTabBar.module.css +78 -0
  186. package/src/demo/components/tab-styles/VSCodeTabBar.tsx +109 -0
  187. package/src/demo/components/tab-styles/index.ts +6 -0
  188. package/src/demo/components/ui/DemoButton.module.css +63 -0
  189. package/src/demo/components/ui/DemoButton.tsx +32 -0
  190. package/src/demo/components/ui/DemoCard.module.css +15 -0
  191. package/src/demo/components/ui/DemoCard.tsx +30 -0
  192. package/src/demo/components/ui/DemoContainer.module.css +17 -0
  193. package/src/demo/components/ui/DemoContainer.tsx +30 -0
  194. package/src/demo/components/ui/DemoPanel.module.css +23 -0
  195. package/src/demo/components/ui/DemoPanel.tsx +33 -0
  196. package/src/demo/components/ui/PanelText.module.css +18 -0
  197. package/src/demo/components/ui/PanelText.tsx +29 -0
  198. package/src/demo/components/ui/PanelTitle.module.css +18 -0
  199. package/src/demo/components/ui/PanelTitle.tsx +31 -0
  200. package/src/demo/contexts/TabbarDemoConfig.tsx +218 -0
  201. package/src/demo/demo.css +172 -0
  202. package/src/demo/hooks/useMedia.ts +41 -0
  203. package/src/demo/hooks/useShikiHighlight.ts +55 -0
  204. package/src/demo/index.tsx +293 -0
  205. package/src/demo/pages/Drawer/animations/index.tsx +22 -0
  206. package/src/demo/pages/Drawer/basics/index.tsx +17 -0
  207. package/src/demo/pages/Drawer/components/DrawerAnimations.module.css +125 -0
  208. package/src/demo/pages/Drawer/components/DrawerAnimations.tsx +118 -0
  209. package/src/demo/pages/Drawer/components/DrawerBasics.module.css +55 -0
  210. package/src/demo/pages/Drawer/components/DrawerBasics.tsx +76 -0
  211. package/src/demo/pages/Drawer/components/DrawerMenuLayout.module.css +332 -0
  212. package/src/demo/pages/Drawer/components/DrawerMenuLayout.tsx +199 -0
  213. package/src/demo/pages/Drawer/menu/index.tsx +17 -0
  214. package/src/demo/pages/FloatingPanelFrame/ResizableFloatingPanelsPreview.module.css +163 -0
  215. package/src/demo/pages/FloatingPanelFrame/ResizableFloatingPanelsPreview.tsx +234 -0
  216. package/src/demo/pages/FloatingPanelFrame/basic/index.tsx +17 -0
  217. package/src/demo/pages/FloatingPanelFrame/complex/index.tsx +26 -0
  218. package/src/demo/pages/FloatingPanelFrame/components/BasicPanel.module.css +16 -0
  219. package/src/demo/pages/FloatingPanelFrame/components/BasicPanel.tsx +24 -0
  220. package/src/demo/pages/FloatingPanelFrame/components/ComplexPanel.module.css +54 -0
  221. package/src/demo/pages/FloatingPanelFrame/components/ComplexPanel.tsx +67 -0
  222. package/src/demo/pages/FloatingPanelFrame/components/PanelWithControls.module.css +21 -0
  223. package/src/demo/pages/FloatingPanelFrame/components/PanelWithControls.tsx +41 -0
  224. package/src/demo/pages/FloatingPanelFrame/components/PanelWithMeta.module.css +5 -0
  225. package/src/demo/pages/FloatingPanelFrame/components/PanelWithMeta.tsx +43 -0
  226. package/src/demo/pages/FloatingPanelFrame/components/ScrollablePanel.module.css +11 -0
  227. package/src/demo/pages/FloatingPanelFrame/components/ScrollablePanel.tsx +42 -0
  228. package/src/demo/pages/FloatingPanelFrame/index.tsx +80 -0
  229. package/src/demo/pages/FloatingPanelFrame/scrollable/index.tsx +30 -0
  230. package/src/demo/pages/FloatingPanelFrame/with-controls/index.tsx +30 -0
  231. package/src/demo/pages/FloatingPanelFrame/with-meta/index.tsx +17 -0
  232. package/src/demo/pages/HorizontalDivider/components/PanelsWithRichContent.module.css +112 -0
  233. package/src/demo/pages/HorizontalDivider/components/PanelsWithRichContent.tsx +56 -0
  234. package/src/demo/pages/HorizontalDivider/components/SimpleResizablePanels.module.css +46 -0
  235. package/src/demo/pages/HorizontalDivider/components/SimpleResizablePanels.tsx +29 -0
  236. package/src/demo/pages/HorizontalDivider/components/ThreePanelLayout.module.css +54 -0
  237. package/src/demo/pages/HorizontalDivider/components/ThreePanelLayout.tsx +30 -0
  238. package/src/demo/pages/HorizontalDivider/index.module.css +14 -0
  239. package/src/demo/pages/HorizontalDivider/index.tsx +64 -0
  240. package/src/demo/pages/HorizontalDivider/panels-with-rich-content/index.tsx +21 -0
  241. package/src/demo/pages/HorizontalDivider/simple-resizable-panels/index.tsx +21 -0
  242. package/src/demo/pages/HorizontalDivider/three-panel-layout/index.tsx +21 -0
  243. package/src/demo/pages/PanelLayout/PanelLayoutDemo.module.css +174 -0
  244. package/src/demo/pages/PanelLayout/PanelLayoutDemo.tsx +248 -0
  245. package/src/demo/pages/PanelLayout/components/DashboardLayout.module.css +115 -0
  246. package/src/demo/pages/PanelLayout/components/DashboardLayout.tsx +124 -0
  247. package/src/demo/pages/PanelLayout/components/DraggableOverlays.module.css +101 -0
  248. package/src/demo/pages/PanelLayout/components/DraggableOverlays.tsx +122 -0
  249. package/src/demo/pages/PanelLayout/components/IDELayout.module.css +104 -0
  250. package/src/demo/pages/PanelLayout/components/IDELayout.tsx +143 -0
  251. package/src/demo/pages/PanelLayout/components/SimpleGrid.module.css +19 -0
  252. package/src/demo/pages/PanelLayout/components/SimpleGrid.tsx +62 -0
  253. package/src/demo/pages/PanelLayout/dashboard/index.tsx +22 -0
  254. package/src/demo/pages/PanelLayout/draggable-overlays/index.tsx +22 -0
  255. package/src/demo/pages/PanelLayout/ide-layout/index.tsx +22 -0
  256. package/src/demo/pages/PanelLayout/index.tsx +94 -0
  257. package/src/demo/pages/PanelLayout/simple-grid/index.tsx +22 -0
  258. package/src/demo/pages/PanelSystem/PanelSystemPreview.module.css +20 -0
  259. package/src/demo/pages/PanelSystem/PanelSystemPreview.tsx +101 -0
  260. package/src/demo/pages/PanelSystem/preview/index.tsx +18 -0
  261. package/src/demo/pages/PanelSystem/tabbar/index.tsx +129 -0
  262. package/src/demo/pages/Pivot/basics/index.tsx +17 -0
  263. package/src/demo/pages/Pivot/components/Pivot.module.css +278 -0
  264. package/src/demo/pages/Pivot/components/PivotBasics.tsx +103 -0
  265. package/src/demo/pages/Pivot/components/PivotSidebar.tsx +168 -0
  266. package/src/demo/pages/Pivot/components/PivotTabs.tsx +129 -0
  267. package/src/demo/pages/Pivot/components/PivotTransitions.tsx +120 -0
  268. package/src/demo/pages/Pivot/components/SwipePivot.module.css +114 -0
  269. package/src/demo/pages/Pivot/components/SwipePivot.tsx +193 -0
  270. package/src/demo/pages/Pivot/components/SwipeTabsPivot.module.css +203 -0
  271. package/src/demo/pages/Pivot/components/SwipeTabsPivot.tsx +289 -0
  272. package/src/demo/pages/Pivot/sidebar/index.tsx +17 -0
  273. package/src/demo/pages/Pivot/swipe/index.tsx +16 -0
  274. package/src/demo/pages/Pivot/swipe-debug/index.tsx +287 -0
  275. package/src/demo/pages/Pivot/swipe-tabs/index.tsx +15 -0
  276. package/src/demo/pages/Pivot/tabs/index.tsx +17 -0
  277. package/src/demo/pages/Pivot/transitions/index.tsx +17 -0
  278. package/src/demo/pages/ResizeHandle/both-directions/index.tsx +17 -0
  279. package/src/demo/pages/ResizeHandle/components/BothDirectionsDemo.module.css +72 -0
  280. package/src/demo/pages/ResizeHandle/components/BothDirectionsDemo.tsx +41 -0
  281. package/src/demo/pages/ResizeHandle/components/HorizontalResizeDemo.module.css +61 -0
  282. package/src/demo/pages/ResizeHandle/components/HorizontalResizeDemo.tsx +33 -0
  283. package/src/demo/pages/ResizeHandle/components/NestedPanelsDemo.module.css +83 -0
  284. package/src/demo/pages/ResizeHandle/components/NestedPanelsDemo.tsx +53 -0
  285. package/src/demo/pages/ResizeHandle/components/VerticalResizeDemo.module.css +68 -0
  286. package/src/demo/pages/ResizeHandle/components/VerticalResizeDemo.tsx +33 -0
  287. package/src/demo/pages/ResizeHandle/horizontal/index.tsx +17 -0
  288. package/src/demo/pages/ResizeHandle/index.module.css +11 -0
  289. package/src/demo/pages/ResizeHandle/index.tsx +71 -0
  290. package/src/demo/pages/ResizeHandle/nested-panels/index.tsx +17 -0
  291. package/src/demo/pages/ResizeHandle/vertical/index.tsx +17 -0
  292. package/src/demo/pages/ResponsiveLayout/adaptive-workspace/index.tsx +22 -0
  293. package/src/demo/pages/ResponsiveLayout/components/ResponsiveWorkspace.module.css +423 -0
  294. package/src/demo/pages/ResponsiveLayout/components/ResponsiveWorkspace.tsx +398 -0
  295. package/src/demo/pages/Stack/basics/index.tsx +22 -0
  296. package/src/demo/pages/Stack/components/Stack.module.css +234 -0
  297. package/src/demo/pages/Stack/components/StackBasics.tsx +217 -0
  298. package/src/demo/pages/Stack/components/StackTablet.module.css +299 -0
  299. package/src/demo/pages/Stack/components/StackTablet.tsx +401 -0
  300. package/src/demo/pages/Stack/tablet/index.tsx +22 -0
  301. package/src/demo/pages/StickyHeader/basics/index.tsx +17 -0
  302. package/src/demo/pages/StickyHeader/components/StickyHeader.module.css +219 -0
  303. package/src/demo/pages/StickyHeader/components/StickyHeaderBasics.tsx +103 -0
  304. package/src/demo/routes.tsx +193 -0
  305. package/src/demo/styles/animations.css +68 -0
  306. package/src/demo/styles/stack-themes.css +35 -0
  307. package/src/demo/utils/createPanelView.tsx +58 -0
  308. package/src/floating/index.ts +24 -0
  309. package/src/grid/index.ts +75 -0
  310. package/src/hooks/ContentCacheContext.tsx +87 -0
  311. package/src/hooks/gesture/presets.spec.ts +86 -0
  312. package/src/hooks/gesture/presets.ts +95 -0
  313. package/src/hooks/gesture/testing/createGestureSimulator.spec.ts +237 -0
  314. package/src/hooks/gesture/testing/createGestureSimulator.ts +310 -0
  315. package/src/hooks/gesture/thresholdValue.spec.ts +103 -0
  316. package/src/hooks/gesture/thresholdValue.ts +77 -0
  317. package/src/hooks/gesture/types.ts +290 -0
  318. package/src/hooks/gesture/useDirectionalLock.spec.ts +271 -0
  319. package/src/hooks/gesture/useDirectionalLock.ts +115 -0
  320. package/src/hooks/gesture/useEdgeSwipeInput.spec.ts +454 -0
  321. package/src/hooks/gesture/useEdgeSwipeInput.ts +131 -0
  322. package/src/hooks/gesture/useNativeGestureGuard.spec.ts +413 -0
  323. package/src/hooks/gesture/useNativeGestureGuard.ts +133 -0
  324. package/src/hooks/gesture/usePointerTracking.spec.ts +364 -0
  325. package/src/hooks/gesture/usePointerTracking.ts +134 -0
  326. package/src/hooks/gesture/useScrollBoundary.spec.ts +249 -0
  327. package/src/hooks/gesture/useScrollBoundary.ts +113 -0
  328. package/src/hooks/gesture/useSwipeInput.spec.ts +592 -0
  329. package/src/hooks/gesture/useSwipeInput.ts +310 -0
  330. package/src/hooks/gesture/utils.spec.ts +152 -0
  331. package/src/hooks/gesture/utils.ts +87 -0
  332. package/src/hooks/useAnimatedVisibility.spec.ts +257 -0
  333. package/src/hooks/useAnimatedVisibility.ts +146 -0
  334. package/src/hooks/useAnimationFrame.ts +200 -0
  335. package/src/hooks/useCSSMatrix.spec.ts +214 -0
  336. package/src/hooks/useCSSMatrix.ts +262 -0
  337. package/src/hooks/useClonedElementPreview.ts +28 -0
  338. package/src/hooks/useContainerScroll.ts +78 -0
  339. package/src/hooks/useContentCache.spec.tsx +232 -0
  340. package/src/hooks/useContentCache.tsx +127 -0
  341. package/src/hooks/useDocumentPointerEvents.ts +137 -0
  342. package/src/hooks/useDocumentScroll.ts +41 -0
  343. package/src/hooks/useEffectEvent.ts +40 -0
  344. package/src/hooks/useElementComponentWrapper.tsx +63 -0
  345. package/src/hooks/useIntersectionObserver.tsx +125 -0
  346. package/src/hooks/useIsomorphicLayoutEffect.ts +29 -0
  347. package/src/hooks/useResizeObserver.tsx +81 -0
  348. package/src/hooks/useScrollContainer.ts +79 -0
  349. package/src/hooks/useSnapAnimation.ts +128 -0
  350. package/src/hooks/useSwipeContentTransform.spec.ts +133 -0
  351. package/src/hooks/useSwipeContentTransform.ts +235 -0
  352. package/src/hooks/useTransitionState.ts +95 -0
  353. package/src/index.tsx +88 -0
  354. package/src/modules/grid/GridLayoutContext.tsx +57 -0
  355. package/src/modules/grid/LayerInstanceContext.tsx +56 -0
  356. package/src/modules/grid/resizeHandles.ts +157 -0
  357. package/src/modules/grid/trackUtils.ts +146 -0
  358. package/src/modules/grid/useGridPlacements.ts +143 -0
  359. package/src/modules/grid/useGridTracks.ts +156 -0
  360. package/src/modules/grid/useLayerDragHandle.ts +16 -0
  361. package/src/modules/grid/useLayerInteractions.tsx +850 -0
  362. package/src/modules/keybindings/KeybindingsProvider.tsx +111 -0
  363. package/src/modules/panels/dom/DomRegistry.tsx +94 -0
  364. package/src/modules/panels/index.ts +45 -0
  365. package/src/modules/panels/interactions/InteractionsContext.test.tsx +330 -0
  366. package/src/modules/panels/interactions/InteractionsContext.tsx +394 -0
  367. package/src/modules/panels/interactions/dnd.ts +28 -0
  368. package/src/modules/panels/keybindings/KeybindingsInstaller.tsx +15 -0
  369. package/src/modules/panels/layout/adapter.ts +124 -0
  370. package/src/modules/panels/rendering/ContentRegistry.spec.tsx +304 -0
  371. package/src/modules/panels/rendering/ContentRegistry.tsx +205 -0
  372. package/src/modules/panels/rendering/GroupContainer.tsx +65 -0
  373. package/src/modules/panels/rendering/RenderBridge.tsx +115 -0
  374. package/src/modules/panels/rendering/RenderContext.tsx +31 -0
  375. package/src/modules/panels/state/PanelSplitHandles.tsx +147 -0
  376. package/src/modules/panels/state/PanelSystemContext.splitLimits.spec.tsx +50 -0
  377. package/src/modules/panels/state/PanelSystemContext.tsx +289 -0
  378. package/src/modules/panels/state/StateContext.tsx +12 -0
  379. package/src/modules/panels/state/cleanup.ts +37 -0
  380. package/src/modules/panels/state/commands.ts +53 -0
  381. package/src/modules/panels/state/focus/Context.tsx +25 -0
  382. package/src/modules/panels/state/focus/logic.ts +57 -0
  383. package/src/modules/panels/state/groups/Context.tsx +25 -0
  384. package/src/modules/panels/state/groups/logic.ts +105 -0
  385. package/src/modules/panels/state/splitLimits.spec.ts +46 -0
  386. package/src/modules/panels/state/splitLimits.ts +90 -0
  387. package/src/modules/panels/state/state.spec.ts +49 -0
  388. package/src/modules/panels/state/tree/Context.tsx +24 -0
  389. package/src/modules/panels/state/tree/logic.spec.ts +34 -0
  390. package/src/modules/panels/state/tree/logic.ts +138 -0
  391. package/src/modules/panels/state/types.ts +142 -0
  392. package/src/modules/panels/system/PanelSystem.empty-tabbar.spec.tsx +53 -0
  393. package/src/modules/panels/system/PanelSystem.tab-click-activates.spec.tsx +44 -0
  394. package/src/modules/panels/system/PanelSystem.tab-reorder.spec.tsx +64 -0
  395. package/src/modules/panels/system/PanelSystem.tabs-no-dup.spec.tsx +57 -0
  396. package/src/modules/panels/system/PanelSystem.tsx +206 -0
  397. package/src/modules/pivot/PivotContent.spec.tsx +179 -0
  398. package/src/modules/pivot/PivotContent.tsx +77 -0
  399. package/src/modules/pivot/SwipePivotContent.debug.tmp.tsx +237 -0
  400. package/src/modules/pivot/SwipePivotContent.position.spec.tsx +167 -0
  401. package/src/modules/pivot/SwipePivotContent.spec.tsx +464 -0
  402. package/src/modules/pivot/SwipePivotContent.test.tsx +502 -0
  403. package/src/modules/pivot/SwipePivotContent.tsx +197 -0
  404. package/src/modules/pivot/SwipePivotTabBar.spec.tsx +865 -0
  405. package/src/modules/pivot/SwipePivotTabBar.tsx +523 -0
  406. package/src/modules/pivot/index.ts +8 -0
  407. package/src/modules/pivot/scaleInputState.spec.ts +210 -0
  408. package/src/modules/pivot/scaleInputState.ts +66 -0
  409. package/src/modules/pivot/types.ts +139 -0
  410. package/src/modules/pivot/usePivot.spec.ts +621 -0
  411. package/src/modules/pivot/usePivot.spec.tsx +186 -0
  412. package/src/modules/pivot/usePivot.tsx +345 -0
  413. package/src/modules/pivot/usePivotSwipeInput.spec.ts +649 -0
  414. package/src/modules/pivot/usePivotSwipeInput.ts +136 -0
  415. package/src/modules/resizer/useResizeDrag.ts +94 -0
  416. package/src/modules/stack/StackContent.spec.tsx +264 -0
  417. package/src/modules/stack/StackContent.tsx +111 -0
  418. package/src/modules/stack/SwipeStackContent.spec.tsx +1277 -0
  419. package/src/modules/stack/SwipeStackContent.tsx +356 -0
  420. package/src/modules/stack/SwipeStackOutlet.spec.tsx +252 -0
  421. package/src/modules/stack/SwipeStackOutlet.tsx +221 -0
  422. package/src/modules/stack/computeStackContentState.spec.ts +281 -0
  423. package/src/modules/stack/computeStackContentState.ts +304 -0
  424. package/src/modules/stack/computeSwipeStackTransform.spec.ts +186 -0
  425. package/src/modules/stack/computeSwipeStackTransform.ts +145 -0
  426. package/src/modules/stack/types.ts +226 -0
  427. package/src/modules/stack/useStackAnimationState.spec.ts +186 -0
  428. package/src/modules/stack/useStackAnimationState.ts +138 -0
  429. package/src/modules/stack/useStackNavigation.spec.ts +477 -0
  430. package/src/modules/stack/useStackNavigation.tsx +336 -0
  431. package/src/modules/stack/useStackSwipeInput.spec.ts +276 -0
  432. package/src/modules/stack/useStackSwipeInput.ts +139 -0
  433. package/src/modules/window/useDrawerState.ts +81 -0
  434. package/src/modules/window/useFloatingState.spec.ts +252 -0
  435. package/src/modules/window/useFloatingState.ts +141 -0
  436. package/src/panels/index.ts +119 -0
  437. package/src/pivot/index.ts +19 -0
  438. package/src/resizer/index.ts +68 -0
  439. package/src/stack/index.ts +91 -0
  440. package/src/sticky-header/StickyArea.tsx +221 -0
  441. package/src/sticky-header/index.ts +18 -0
  442. package/src/sticky-header/types.ts +68 -0
  443. package/src/types.ts +323 -0
  444. package/src/utils/CSSMatrix.ts +321 -0
  445. package/src/utils/css.ts +65 -0
  446. package/src/utils/dialogUtils.ts +43 -0
  447. package/src/utils/math.ts +18 -0
  448. package/src/utils/polyfills/createDialogPolyfill.ts +18 -0
  449. package/src/utils/typedActions.ts +103 -0
  450. package/src/vite-env.d.ts +6 -0
  451. package/src/window/index.ts +67 -0
  452. package/dist/FloatingPanelFrame-6W5OexYe.js.map +0 -1
  453. package/dist/FloatingPanelFrame-D9Cp2al1.cjs.map +0 -1
  454. package/dist/GridLayout-BzrIDrC9.js +0 -1465
  455. package/dist/GridLayout-BzrIDrC9.js.map +0 -1
  456. package/dist/GridLayout-ZrOhoLLB.cjs +0 -2
  457. package/dist/GridLayout-ZrOhoLLB.cjs.map +0 -1
  458. package/dist/sticky-header/StickyHeader.d.ts +0 -53
  459. package/dist/styles-CA2_zLZt.js +0 -52
  460. package/dist/styles-CA2_zLZt.js.map +0 -1
  461. package/dist/styles-PsqGOEJP.cjs +0 -2
  462. package/dist/styles-PsqGOEJP.cjs.map +0 -1
  463. package/dist/usePivot-BS-DGfwd.cjs +0 -2
  464. package/dist/usePivot-BS-DGfwd.cjs.map +0 -1
  465. package/dist/usePivot-BvOGxLQQ.js +0 -124
  466. package/dist/usePivot-BvOGxLQQ.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDocumentPointerEvents-CKdhGXd0.js","sources":["../src/hooks/useDocumentPointerEvents.ts"],"sourcesContent":["/**\n * @file Hooks for managing document-level pointer events with proper cleanup\n */\nimport * as React from \"react\";\nimport { useEffectEvent } from \"./useEffectEvent\";\n\nexport type UseDocumentPointerEventsOptions = {\n onMove?: (e: PointerEvent) => void;\n onUp?: (e: PointerEvent) => void;\n onCancel?: (e: PointerEvent) => void;\n};\n\n/**\n * Custom hook for managing document-level pointer events with proper cleanup\n * This pattern is commonly used for drag operations that need to continue\n * even when the pointer moves outside the original element\n */\nexport function useDocumentPointerEvents(enabled: boolean, handlers: UseDocumentPointerEventsOptions) {\n const handleMoveEvent = useEffectEvent(handlers.onMove);\n const handleUpEvent = useEffectEvent(handlers.onUp);\n const handleCancelEvent = useEffectEvent(handlers.onCancel);\n\n React.useEffect(() => {\n if (!enabled) {\n return;\n }\n\n if (handlers.onMove) {\n document.addEventListener(\"pointermove\", handleMoveEvent, { passive: false });\n }\n if (handlers.onUp) {\n document.addEventListener(\"pointerup\", handleUpEvent);\n }\n if (handlers.onCancel) {\n document.addEventListener(\"pointercancel\", handleCancelEvent);\n }\n\n // Cleanup function\n return () => {\n if (handlers.onMove) {\n document.removeEventListener(\"pointermove\", handleMoveEvent);\n }\n if (handlers.onUp) {\n document.removeEventListener(\"pointerup\", handleUpEvent);\n }\n if (handlers.onCancel) {\n document.removeEventListener(\"pointercancel\", handleCancelEvent);\n }\n };\n }, [enabled, handlers.onMove, handlers.onUp, handlers.onCancel, handleMoveEvent, handleUpEvent, handleCancelEvent]);\n}\n\n/**\n * Hook for capturing pointer during drag operations\n * This ensures that pointer events are delivered to the capturing element\n * even when the pointer moves outside its boundaries\n */\nexport function usePointerCapture(elementRef: React.RefObject<HTMLElement | null>, enabled: boolean, pointerId?: number) {\n React.useEffect(() => {\n const element = elementRef.current;\n if (!enabled || !element || pointerId === undefined) {\n return;\n }\n\n // Capture pointer\n element.setPointerCapture(pointerId);\n\n // Release capture on cleanup\n return () => {\n if (element.hasPointerCapture && element.hasPointerCapture(pointerId)) {\n element.releasePointerCapture(pointerId);\n }\n };\n }, [elementRef, enabled, pointerId]);\n}\n\n/**\n * Hook for preventing default pointer events during operations\n * Useful for preventing text selection, context menus, etc. during drag operations\n */\nexport function usePreventPointerDefaults(\n elementRef: React.RefObject<HTMLElement | null>,\n enabled: boolean,\n events: string[] = [\"pointerdown\", \"pointermove\", \"pointerup\"],\n) {\n React.useEffect(() => {\n const element = elementRef.current;\n if (!enabled || !element) {\n return;\n }\n\n const preventDefault = (e: Event) => {\n e.preventDefault();\n };\n\n // Add listeners\n events.forEach((eventType) => {\n element.addEventListener(eventType, preventDefault, { passive: false });\n });\n\n // Cleanup\n return () => {\n events.forEach((eventType) => {\n element.removeEventListener(eventType, preventDefault);\n });\n };\n }, [elementRef, enabled, events]);\n}\n\n/**\n * Hook that combines multiple pointer event patterns for drag operations\n */\nexport function useDragPointerEvents(\n elementRef: React.RefObject<HTMLElement | null>,\n enabled: boolean,\n options: {\n onMove?: (e: PointerEvent) => void;\n onUp?: (e: PointerEvent) => void;\n onCancel?: (e: PointerEvent) => void;\n pointerId?: number;\n capturePointer?: boolean;\n preventDefaults?: boolean;\n },\n) {\n const { onMove, onUp, onCancel, pointerId, capturePointer = true, preventDefaults = true } = options;\n\n // Document-level event handlers\n useDocumentPointerEvents(enabled, { onMove, onUp, onCancel });\n\n // Pointer capture\n const shouldCapturePointer = enabled ? capturePointer : false;\n usePointerCapture(elementRef, shouldCapturePointer, pointerId);\n\n // Prevent defaults\n const shouldPreventDefaults = enabled ? preventDefaults : false;\n usePreventPointerDefaults(elementRef, shouldPreventDefaults);\n}\n"],"names":["useDocumentPointerEvents","enabled","handlers","handleMoveEvent","useEffectEvent","handleUpEvent","handleCancelEvent","React","usePointerCapture","elementRef","pointerId","element","usePreventPointerDefaults","events","preventDefault","e","eventType","useDragPointerEvents","options","onMove","onUp","onCancel","capturePointer","preventDefaults"],"mappings":";;AAiBO,SAASA,EAAyBC,GAAkBC,GAA2C;AACpG,QAAMC,IAAkBC,EAAeF,EAAS,MAAM,GAChDG,IAAgBD,EAAeF,EAAS,IAAI,GAC5CI,IAAoBF,EAAeF,EAAS,QAAQ;AAE1D,EAAAK,EAAM,UAAU,MAAM;AACpB,QAAKN;AAIL,aAAIC,EAAS,UACX,SAAS,iBAAiB,eAAeC,GAAiB,EAAE,SAAS,IAAO,GAE1ED,EAAS,QACX,SAAS,iBAAiB,aAAaG,CAAa,GAElDH,EAAS,YACX,SAAS,iBAAiB,iBAAiBI,CAAiB,GAIvD,MAAM;AACX,QAAIJ,EAAS,UACX,SAAS,oBAAoB,eAAeC,CAAe,GAEzDD,EAAS,QACX,SAAS,oBAAoB,aAAaG,CAAa,GAErDH,EAAS,YACX,SAAS,oBAAoB,iBAAiBI,CAAiB;AAAA,MAEnE;AAAA,EACF,GAAG,CAACL,GAASC,EAAS,QAAQA,EAAS,MAAMA,EAAS,UAAUC,GAAiBE,GAAeC,CAAiB,CAAC;AACpH;AAOO,SAASE,EAAkBC,GAAiDR,GAAkBS,GAAoB;AACvH,EAAAH,EAAM,UAAU,MAAM;AACpB,UAAMI,IAAUF,EAAW;AAC3B,QAAI,GAACR,KAAW,CAACU,KAAWD,MAAc;AAK1C,aAAAC,EAAQ,kBAAkBD,CAAS,GAG5B,MAAM;AACX,QAAIC,EAAQ,qBAAqBA,EAAQ,kBAAkBD,CAAS,KAClEC,EAAQ,sBAAsBD,CAAS;AAAA,MAE3C;AAAA,EACF,GAAG,CAACD,GAAYR,GAASS,CAAS,CAAC;AACrC;AAMO,SAASE,EACdH,GACAR,GACAY,IAAmB,CAAC,eAAe,eAAe,WAAW,GAC7D;AACA,EAAAN,EAAM,UAAU,MAAM;AACpB,UAAMI,IAAUF,EAAW;AAC3B,QAAI,CAACR,KAAW,CAACU;AACf;AAGF,UAAMG,IAAiB,CAACC,MAAa;AACnC,MAAAA,EAAE,eAAA;AAAA,IACJ;AAGA,WAAAF,EAAO,QAAQ,CAACG,MAAc;AAC5B,MAAAL,EAAQ,iBAAiBK,GAAWF,GAAgB,EAAE,SAAS,IAAO;AAAA,IACxE,CAAC,GAGM,MAAM;AACX,MAAAD,EAAO,QAAQ,CAACG,MAAc;AAC5B,QAAAL,EAAQ,oBAAoBK,GAAWF,CAAc;AAAA,MACvD,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAACL,GAAYR,GAASY,CAAM,CAAC;AAClC;AAKO,SAASI,EACdR,GACAR,GACAiB,GAQA;AACA,QAAM,EAAE,QAAAC,GAAQ,MAAAC,GAAM,UAAAC,GAAU,WAAAX,GAAW,gBAAAY,IAAiB,IAAM,iBAAAC,IAAkB,GAAA,IAASL;AAG7F,EAAAlB,EAAyBC,GAAS,EAAE,QAAAkB,GAAQ,MAAAC,GAAM,UAAAC,GAAU,GAI5Db,EAAkBC,GADWR,IAAUqB,IAAiB,IACJZ,CAAS,GAI7DE,EAA0BH,GADIR,IAAUsB,IAAkB,EACC;AAC7D;"}
@@ -0,0 +1,2 @@
1
+ "use strict";const p=require("react"),c=require("./useEffectEvent-huSsGUnl.cjs");function E(o){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(o){for(const t in o)if(t!=="default"){const n=Object.getOwnPropertyDescriptor(o,t);Object.defineProperty(e,t,n.get?n:{enumerable:!0,get:()=>o[t]})}}return e.default=o,Object.freeze(e)}const i=E(p);function s(o,e){const t=c.useEffectEvent(e.onMove),n=c.useEffectEvent(e.onUp),r=c.useEffectEvent(e.onCancel);i.useEffect(()=>{if(o)return e.onMove&&document.addEventListener("pointermove",t,{passive:!1}),e.onUp&&document.addEventListener("pointerup",n),e.onCancel&&document.addEventListener("pointercancel",r),()=>{e.onMove&&document.removeEventListener("pointermove",t),e.onUp&&document.removeEventListener("pointerup",n),e.onCancel&&document.removeEventListener("pointercancel",r)}},[o,e.onMove,e.onUp,e.onCancel,t,n,r])}function l(o,e,t){i.useEffect(()=>{const n=o.current;if(!(!e||!n||t===void 0))return n.setPointerCapture(t),()=>{n.hasPointerCapture&&n.hasPointerCapture(t)&&n.releasePointerCapture(t)}},[o,e,t])}function m(o,e,t=["pointerdown","pointermove","pointerup"]){i.useEffect(()=>{const n=o.current;if(!e||!n)return;const r=u=>{u.preventDefault()};return t.forEach(u=>{n.addEventListener(u,r,{passive:!1})}),()=>{t.forEach(u=>{n.removeEventListener(u,r)})}},[o,e,t])}function P(o,e,t){const{onMove:n,onUp:r,onCancel:u,pointerId:f,capturePointer:v=!0,preventDefaults:a=!0}=t;s(e,{onMove:n,onUp:r,onCancel:u}),l(o,e?v:!1,f),m(o,e?a:!1)}exports.useDocumentPointerEvents=s;exports.useDragPointerEvents=P;
2
+ //# sourceMappingURL=useDocumentPointerEvents-ChqrKXDk.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDocumentPointerEvents-ChqrKXDk.cjs","sources":["../src/hooks/useDocumentPointerEvents.ts"],"sourcesContent":["/**\n * @file Hooks for managing document-level pointer events with proper cleanup\n */\nimport * as React from \"react\";\nimport { useEffectEvent } from \"./useEffectEvent\";\n\nexport type UseDocumentPointerEventsOptions = {\n onMove?: (e: PointerEvent) => void;\n onUp?: (e: PointerEvent) => void;\n onCancel?: (e: PointerEvent) => void;\n};\n\n/**\n * Custom hook for managing document-level pointer events with proper cleanup\n * This pattern is commonly used for drag operations that need to continue\n * even when the pointer moves outside the original element\n */\nexport function useDocumentPointerEvents(enabled: boolean, handlers: UseDocumentPointerEventsOptions) {\n const handleMoveEvent = useEffectEvent(handlers.onMove);\n const handleUpEvent = useEffectEvent(handlers.onUp);\n const handleCancelEvent = useEffectEvent(handlers.onCancel);\n\n React.useEffect(() => {\n if (!enabled) {\n return;\n }\n\n if (handlers.onMove) {\n document.addEventListener(\"pointermove\", handleMoveEvent, { passive: false });\n }\n if (handlers.onUp) {\n document.addEventListener(\"pointerup\", handleUpEvent);\n }\n if (handlers.onCancel) {\n document.addEventListener(\"pointercancel\", handleCancelEvent);\n }\n\n // Cleanup function\n return () => {\n if (handlers.onMove) {\n document.removeEventListener(\"pointermove\", handleMoveEvent);\n }\n if (handlers.onUp) {\n document.removeEventListener(\"pointerup\", handleUpEvent);\n }\n if (handlers.onCancel) {\n document.removeEventListener(\"pointercancel\", handleCancelEvent);\n }\n };\n }, [enabled, handlers.onMove, handlers.onUp, handlers.onCancel, handleMoveEvent, handleUpEvent, handleCancelEvent]);\n}\n\n/**\n * Hook for capturing pointer during drag operations\n * This ensures that pointer events are delivered to the capturing element\n * even when the pointer moves outside its boundaries\n */\nexport function usePointerCapture(elementRef: React.RefObject<HTMLElement | null>, enabled: boolean, pointerId?: number) {\n React.useEffect(() => {\n const element = elementRef.current;\n if (!enabled || !element || pointerId === undefined) {\n return;\n }\n\n // Capture pointer\n element.setPointerCapture(pointerId);\n\n // Release capture on cleanup\n return () => {\n if (element.hasPointerCapture && element.hasPointerCapture(pointerId)) {\n element.releasePointerCapture(pointerId);\n }\n };\n }, [elementRef, enabled, pointerId]);\n}\n\n/**\n * Hook for preventing default pointer events during operations\n * Useful for preventing text selection, context menus, etc. during drag operations\n */\nexport function usePreventPointerDefaults(\n elementRef: React.RefObject<HTMLElement | null>,\n enabled: boolean,\n events: string[] = [\"pointerdown\", \"pointermove\", \"pointerup\"],\n) {\n React.useEffect(() => {\n const element = elementRef.current;\n if (!enabled || !element) {\n return;\n }\n\n const preventDefault = (e: Event) => {\n e.preventDefault();\n };\n\n // Add listeners\n events.forEach((eventType) => {\n element.addEventListener(eventType, preventDefault, { passive: false });\n });\n\n // Cleanup\n return () => {\n events.forEach((eventType) => {\n element.removeEventListener(eventType, preventDefault);\n });\n };\n }, [elementRef, enabled, events]);\n}\n\n/**\n * Hook that combines multiple pointer event patterns for drag operations\n */\nexport function useDragPointerEvents(\n elementRef: React.RefObject<HTMLElement | null>,\n enabled: boolean,\n options: {\n onMove?: (e: PointerEvent) => void;\n onUp?: (e: PointerEvent) => void;\n onCancel?: (e: PointerEvent) => void;\n pointerId?: number;\n capturePointer?: boolean;\n preventDefaults?: boolean;\n },\n) {\n const { onMove, onUp, onCancel, pointerId, capturePointer = true, preventDefaults = true } = options;\n\n // Document-level event handlers\n useDocumentPointerEvents(enabled, { onMove, onUp, onCancel });\n\n // Pointer capture\n const shouldCapturePointer = enabled ? capturePointer : false;\n usePointerCapture(elementRef, shouldCapturePointer, pointerId);\n\n // Prevent defaults\n const shouldPreventDefaults = enabled ? preventDefaults : false;\n usePreventPointerDefaults(elementRef, shouldPreventDefaults);\n}\n"],"names":["useDocumentPointerEvents","enabled","handlers","handleMoveEvent","useEffectEvent","handleUpEvent","handleCancelEvent","React","usePointerCapture","elementRef","pointerId","element","usePreventPointerDefaults","events","preventDefault","e","eventType","useDragPointerEvents","options","onMove","onUp","onCancel","capturePointer","preventDefaults"],"mappings":"2WAiBO,SAASA,EAAyBC,EAAkBC,EAA2C,CACpG,MAAMC,EAAkBC,EAAAA,eAAeF,EAAS,MAAM,EAChDG,EAAgBD,EAAAA,eAAeF,EAAS,IAAI,EAC5CI,EAAoBF,EAAAA,eAAeF,EAAS,QAAQ,EAE1DK,EAAM,UAAU,IAAM,CACpB,GAAKN,EAIL,OAAIC,EAAS,QACX,SAAS,iBAAiB,cAAeC,EAAiB,CAAE,QAAS,GAAO,EAE1ED,EAAS,MACX,SAAS,iBAAiB,YAAaG,CAAa,EAElDH,EAAS,UACX,SAAS,iBAAiB,gBAAiBI,CAAiB,EAIvD,IAAM,CACPJ,EAAS,QACX,SAAS,oBAAoB,cAAeC,CAAe,EAEzDD,EAAS,MACX,SAAS,oBAAoB,YAAaG,CAAa,EAErDH,EAAS,UACX,SAAS,oBAAoB,gBAAiBI,CAAiB,CAEnE,CACF,EAAG,CAACL,EAASC,EAAS,OAAQA,EAAS,KAAMA,EAAS,SAAUC,EAAiBE,EAAeC,CAAiB,CAAC,CACpH,CAOO,SAASE,EAAkBC,EAAiDR,EAAkBS,EAAoB,CACvHH,EAAM,UAAU,IAAM,CACpB,MAAMI,EAAUF,EAAW,QAC3B,GAAI,GAACR,GAAW,CAACU,GAAWD,IAAc,QAK1C,OAAAC,EAAQ,kBAAkBD,CAAS,EAG5B,IAAM,CACPC,EAAQ,mBAAqBA,EAAQ,kBAAkBD,CAAS,GAClEC,EAAQ,sBAAsBD,CAAS,CAE3C,CACF,EAAG,CAACD,EAAYR,EAASS,CAAS,CAAC,CACrC,CAMO,SAASE,EACdH,EACAR,EACAY,EAAmB,CAAC,cAAe,cAAe,WAAW,EAC7D,CACAN,EAAM,UAAU,IAAM,CACpB,MAAMI,EAAUF,EAAW,QAC3B,GAAI,CAACR,GAAW,CAACU,EACf,OAGF,MAAMG,EAAkBC,GAAa,CACnCA,EAAE,eAAA,CACJ,EAGA,OAAAF,EAAO,QAASG,GAAc,CAC5BL,EAAQ,iBAAiBK,EAAWF,EAAgB,CAAE,QAAS,GAAO,CACxE,CAAC,EAGM,IAAM,CACXD,EAAO,QAASG,GAAc,CAC5BL,EAAQ,oBAAoBK,EAAWF,CAAc,CACvD,CAAC,CACH,CACF,EAAG,CAACL,EAAYR,EAASY,CAAM,CAAC,CAClC,CAKO,SAASI,EACdR,EACAR,EACAiB,EAQA,CACA,KAAM,CAAE,OAAAC,EAAQ,KAAAC,EAAM,SAAAC,EAAU,UAAAX,EAAW,eAAAY,EAAiB,GAAM,gBAAAC,EAAkB,EAAA,EAASL,EAG7FlB,EAAyBC,EAAS,CAAE,OAAAkB,EAAQ,KAAAC,EAAM,SAAAC,EAAU,EAI5Db,EAAkBC,EADWR,EAAUqB,EAAiB,GACJZ,CAAS,EAI7DE,EAA0BH,EADIR,EAAUsB,EAAkB,EACC,CAC7D"}
@@ -0,0 +1,13 @@
1
+ import * as n from "react";
2
+ function c(r) {
3
+ const e = n.useRef(r);
4
+ return e.current = r, n.useCallback((...u) => {
5
+ const t = e.current;
6
+ if (t)
7
+ return t(...u);
8
+ }, []);
9
+ }
10
+ export {
11
+ c as u
12
+ };
13
+ //# sourceMappingURL=useEffectEvent-Dp7HLCf0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEffectEvent-Dp7HLCf0.js","sources":["../src/hooks/useEffectEvent.ts"],"sourcesContent":["/**\n * @file useEffectEvent hook - Stable event handler for Effects\n *\n * This hook allows you to extract event handlers from Effects without causing them to re-run.\n * The returned function is stable and can be safely used in effect dependencies.\n *\n * @see https://react.dev/learn/separating-events-from-effects#declaring-an-effect-event\n */\nimport * as React from \"react\";\n\n/**\n * Extract event handlers from Effects to avoid unnecessary re-runs\n *\n * @example\n * ```tsx\n * function Component({ onEvent }) {\n * const onEventHandler = useEffectEvent(onEvent);\n *\n * React.useEffect(() => {\n * // onEventHandler is stable, but always calls the latest onEvent\n * const cleanup = subscribe(onEventHandler);\n * return cleanup;\n * }, []); // No need to include onEvent in dependencies\n * }\n * ```\n */\nexport function useEffectEvent<Args extends unknown[], Return>(\n fn: ((...args: Args) => Return) | undefined,\n): (...args: Args) => Return | undefined {\n const ref = React.useRef<typeof fn>(fn);\n ref.current = fn;\n\n return React.useCallback((...args: Args): Return | undefined => {\n const currentFn = ref.current;\n if (currentFn) {\n return currentFn(...args);\n }\n return undefined;\n }, []);\n}\n"],"names":["useEffectEvent","fn","ref","React","args","currentFn"],"mappings":";AA0BO,SAASA,EACdC,GACuC;AACvC,QAAMC,IAAMC,EAAM,OAAkBF,CAAE;AACtC,SAAAC,EAAI,UAAUD,GAEPE,EAAM,YAAY,IAAIC,MAAmC;AAC9D,UAAMC,IAAYH,EAAI;AACtB,QAAIG;AACF,aAAOA,EAAU,GAAGD,CAAI;AAAA,EAG5B,GAAG,CAAA,CAAE;AACP;"}
@@ -0,0 +1,2 @@
1
+ "use strict";const u=require("react");function o(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const c=o(u);function f(e){const t=c.useRef(e);return t.current=e,c.useCallback((...r)=>{const n=t.current;if(n)return n(...r)},[])}exports.useEffectEvent=f;
2
+ //# sourceMappingURL=useEffectEvent-huSsGUnl.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEffectEvent-huSsGUnl.cjs","sources":["../src/hooks/useEffectEvent.ts"],"sourcesContent":["/**\n * @file useEffectEvent hook - Stable event handler for Effects\n *\n * This hook allows you to extract event handlers from Effects without causing them to re-run.\n * The returned function is stable and can be safely used in effect dependencies.\n *\n * @see https://react.dev/learn/separating-events-from-effects#declaring-an-effect-event\n */\nimport * as React from \"react\";\n\n/**\n * Extract event handlers from Effects to avoid unnecessary re-runs\n *\n * @example\n * ```tsx\n * function Component({ onEvent }) {\n * const onEventHandler = useEffectEvent(onEvent);\n *\n * React.useEffect(() => {\n * // onEventHandler is stable, but always calls the latest onEvent\n * const cleanup = subscribe(onEventHandler);\n * return cleanup;\n * }, []); // No need to include onEvent in dependencies\n * }\n * ```\n */\nexport function useEffectEvent<Args extends unknown[], Return>(\n fn: ((...args: Args) => Return) | undefined,\n): (...args: Args) => Return | undefined {\n const ref = React.useRef<typeof fn>(fn);\n ref.current = fn;\n\n return React.useCallback((...args: Args): Return | undefined => {\n const currentFn = ref.current;\n if (currentFn) {\n return currentFn(...args);\n }\n return undefined;\n }, []);\n}\n"],"names":["useEffectEvent","fn","ref","React","args","currentFn"],"mappings":"gUA0BO,SAASA,EACdC,EACuC,CACvC,MAAMC,EAAMC,EAAM,OAAkBF,CAAE,EACtC,OAAAC,EAAI,QAAUD,EAEPE,EAAM,YAAY,IAAIC,IAAmC,CAC9D,MAAMC,EAAYH,EAAI,QACtB,GAAIG,EACF,OAAOA,EAAU,GAAGD,CAAI,CAG5B,EAAG,CAAA,CAAE,CACP"}
@@ -0,0 +1,2 @@
1
+ "use strict";const k=require("react");function C(i){const a=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(i){for(const c in i)if(c!=="default"){const n=Object.getOwnPropertyDescriptor(i,c);Object.defineProperty(a,c,n.get?n:{enumerable:!0,get:()=>i[c]})}}return a.default=i,Object.freeze(a)}const s=C(k),u={left:0,top:0},f={width:400,height:300},O=i=>{const[a,c]=s.useState(()=>{const t={};return i.forEach(e=>{if(e.floating){const o=e.floating;t[e.id]={position:o.defaultPosition??u,size:o.defaultSize??f}}}),t}),n=s.useMemo(()=>{const t=new Map;return i.forEach(e=>t.set(e.id,e)),t},[i]),g=s.useCallback(t=>{const e=n.get(t);return e?.floating?.position!==void 0?e.floating.position:a[t]?.position??u},[n,a]),S=s.useCallback(t=>{const e=n.get(t);return e?.floating?.size!==void 0?e.floating.size:a[t]?.size??f},[n,a]),b=s.useCallback(t=>n.get(t)?.floating?.zIndex,[n]),d=s.useCallback((t,e)=>{const o=n.get(t);o?.floating&&(o.floating.position===void 0&&c(r=>{const l=r[t];return l?{...r,[t]:{...l,position:e}}:r}),o.floating.onMove?.(e))},[n]),p=s.useCallback((t,e)=>{const o=n.get(t);o?.floating&&(o.floating.size===void 0&&c(r=>{const l=r[t];return l?{...r,[t]:{...l,size:e}}:r}),o.floating.onResize?.(e))},[n]),z=s.useCallback(t=>{n.get(t)?.floating?.onClose?.()},[n]);return{getPosition:g,getSize:S,getZIndex:b,updatePosition:d,updateSize:p,close:z}};exports.useFloatingState=O;
2
+ //# sourceMappingURL=useFloatingState-C4kRaW_R.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFloatingState-C4kRaW_R.cjs","sources":["../src/modules/window/useFloatingState.ts"],"sourcesContent":["/**\n * @file Hook for managing floating window state (controlled/uncontrolled)\n * Pattern based on useDrawerState.ts\n */\nimport * as React from \"react\";\nimport type { LayerDefinition, WindowPosition, WindowSize } from \"../../types\";\n\ntype FloatingState = {\n position: WindowPosition;\n size: WindowSize;\n};\n\nconst DEFAULT_POSITION: WindowPosition = { left: 0, top: 0 };\nconst DEFAULT_SIZE: WindowSize = { width: 400, height: 300 };\n\nexport const useFloatingState = (layers: LayerDefinition[]) => {\n const [floatingStates, setFloatingStates] = React.useState<Record<string, FloatingState>>(() => {\n const initial: Record<string, FloatingState> = {};\n layers.forEach((layer) => {\n if (layer.floating) {\n const floating = layer.floating;\n initial[layer.id] = {\n position: floating.defaultPosition ?? DEFAULT_POSITION,\n size: floating.defaultSize ?? DEFAULT_SIZE,\n };\n }\n });\n return initial;\n });\n\n const layerMap = React.useMemo(() => {\n const map = new Map<string, LayerDefinition>();\n layers.forEach((layer) => map.set(layer.id, layer));\n return map;\n }, [layers]);\n\n const getPosition = React.useCallback(\n (layerId: string): WindowPosition => {\n const layer = layerMap.get(layerId);\n // Controlled mode: use position prop directly\n if (layer?.floating?.position !== undefined) {\n return layer.floating.position;\n }\n // Uncontrolled mode: use internal state\n return floatingStates[layerId]?.position ?? DEFAULT_POSITION;\n },\n [layerMap, floatingStates],\n );\n\n const getSize = React.useCallback(\n (layerId: string): WindowSize => {\n const layer = layerMap.get(layerId);\n // Controlled mode: use size prop directly\n if (layer?.floating?.size !== undefined) {\n return layer.floating.size;\n }\n // Uncontrolled mode: use internal state\n return floatingStates[layerId]?.size ?? DEFAULT_SIZE;\n },\n [layerMap, floatingStates],\n );\n\n const getZIndex = React.useCallback(\n (layerId: string): number | undefined => {\n const layer = layerMap.get(layerId);\n return layer?.floating?.zIndex;\n },\n [layerMap],\n );\n\n const updatePosition = React.useCallback(\n (layerId: string, position: WindowPosition) => {\n const layer = layerMap.get(layerId);\n if (!layer?.floating) {\n return;\n }\n\n // Update internal state only if uncontrolled\n if (layer.floating.position === undefined) {\n setFloatingStates((prev) => {\n const currentState = prev[layerId];\n if (!currentState) {\n return prev;\n }\n return {\n ...prev,\n [layerId]: { ...currentState, position },\n };\n });\n }\n\n // Always call callback\n layer.floating.onMove?.(position);\n },\n [layerMap],\n );\n\n const updateSize = React.useCallback(\n (layerId: string, size: WindowSize) => {\n const layer = layerMap.get(layerId);\n if (!layer?.floating) {\n return;\n }\n\n // Update internal state only if uncontrolled\n if (layer.floating.size === undefined) {\n setFloatingStates((prev) => {\n const currentState = prev[layerId];\n if (!currentState) {\n return prev;\n }\n return {\n ...prev,\n [layerId]: { ...currentState, size },\n };\n });\n }\n\n // Always call callback\n layer.floating.onResize?.(size);\n },\n [layerMap],\n );\n\n const close = React.useCallback(\n (layerId: string) => {\n const layer = layerMap.get(layerId);\n layer?.floating?.onClose?.();\n },\n [layerMap],\n );\n\n return {\n getPosition,\n getSize,\n getZIndex,\n updatePosition,\n updateSize,\n close,\n };\n};\n"],"names":["DEFAULT_POSITION","DEFAULT_SIZE","useFloatingState","layers","floatingStates","setFloatingStates","React","initial","layer","floating","layerMap","map","getPosition","layerId","getSize","getZIndex","updatePosition","position","prev","currentState","updateSize","size","close"],"mappings":"gUAYMA,EAAmC,CAAE,KAAM,EAAG,IAAK,CAAA,EACnDC,EAA2B,CAAE,MAAO,IAAK,OAAQ,GAAA,EAE1CC,EAAoBC,GAA8B,CAC7D,KAAM,CAACC,EAAgBC,CAAiB,EAAIC,EAAM,SAAwC,IAAM,CAC9F,MAAMC,EAAyC,CAAA,EAC/C,OAAAJ,EAAO,QAASK,GAAU,CACxB,GAAIA,EAAM,SAAU,CAClB,MAAMC,EAAWD,EAAM,SACvBD,EAAQC,EAAM,EAAE,EAAI,CAClB,SAAUC,EAAS,iBAAmBT,EACtC,KAAMS,EAAS,aAAeR,CAAA,CAElC,CACF,CAAC,EACMM,CACT,CAAC,EAEKG,EAAWJ,EAAM,QAAQ,IAAM,CACnC,MAAMK,MAAU,IAChB,OAAAR,EAAO,QAASK,GAAUG,EAAI,IAAIH,EAAM,GAAIA,CAAK,CAAC,EAC3CG,CACT,EAAG,CAACR,CAAM,CAAC,EAELS,EAAcN,EAAM,YACvBO,GAAoC,CACnC,MAAML,EAAQE,EAAS,IAAIG,CAAO,EAElC,OAAIL,GAAO,UAAU,WAAa,OACzBA,EAAM,SAAS,SAGjBJ,EAAeS,CAAO,GAAG,UAAYb,CAC9C,EACA,CAACU,EAAUN,CAAc,CAAA,EAGrBU,EAAUR,EAAM,YACnBO,GAAgC,CAC/B,MAAML,EAAQE,EAAS,IAAIG,CAAO,EAElC,OAAIL,GAAO,UAAU,OAAS,OACrBA,EAAM,SAAS,KAGjBJ,EAAeS,CAAO,GAAG,MAAQZ,CAC1C,EACA,CAACS,EAAUN,CAAc,CAAA,EAGrBW,EAAYT,EAAM,YACrBO,GACeH,EAAS,IAAIG,CAAO,GACpB,UAAU,OAE1B,CAACH,CAAQ,CAAA,EAGLM,EAAiBV,EAAM,YAC3B,CAACO,EAAiBI,IAA6B,CAC7C,MAAMT,EAAQE,EAAS,IAAIG,CAAO,EAC7BL,GAAO,WAKRA,EAAM,SAAS,WAAa,QAC9BH,EAAmBa,GAAS,CAC1B,MAAMC,EAAeD,EAAKL,CAAO,EACjC,OAAKM,EAGE,CACL,GAAGD,EACH,CAACL,CAAO,EAAG,CAAE,GAAGM,EAAc,SAAAF,CAAA,CAAS,EAJhCC,CAMX,CAAC,EAIHV,EAAM,SAAS,SAASS,CAAQ,EAClC,EACA,CAACP,CAAQ,CAAA,EAGLU,EAAad,EAAM,YACvB,CAACO,EAAiBQ,IAAqB,CACrC,MAAMb,EAAQE,EAAS,IAAIG,CAAO,EAC7BL,GAAO,WAKRA,EAAM,SAAS,OAAS,QAC1BH,EAAmBa,GAAS,CAC1B,MAAMC,EAAeD,EAAKL,CAAO,EACjC,OAAKM,EAGE,CACL,GAAGD,EACH,CAACL,CAAO,EAAG,CAAE,GAAGM,EAAc,KAAAE,CAAA,CAAK,EAJ5BH,CAMX,CAAC,EAIHV,EAAM,SAAS,WAAWa,CAAI,EAChC,EACA,CAACX,CAAQ,CAAA,EAGLY,EAAQhB,EAAM,YACjBO,GAAoB,CACLH,EAAS,IAAIG,CAAO,GAC3B,UAAU,UAAA,CACnB,EACA,CAACH,CAAQ,CAAA,EAGX,MAAO,CACL,YAAAE,EACA,QAAAE,EACA,UAAAC,EACA,eAAAC,EACA,WAAAI,EACA,MAAAE,CAAA,CAEJ"}
@@ -0,0 +1,74 @@
1
+ import * as e from "react";
2
+ const r = { left: 0, top: 0 }, u = { width: 400, height: 300 }, b = (l) => {
3
+ const [c, f] = e.useState(() => {
4
+ const t = {};
5
+ return l.forEach((o) => {
6
+ if (o.floating) {
7
+ const i = o.floating;
8
+ t[o.id] = {
9
+ position: i.defaultPosition ?? r,
10
+ size: i.defaultSize ?? u
11
+ };
12
+ }
13
+ }), t;
14
+ }), n = e.useMemo(() => {
15
+ const t = /* @__PURE__ */ new Map();
16
+ return l.forEach((o) => t.set(o.id, o)), t;
17
+ }, [l]), g = e.useCallback(
18
+ (t) => {
19
+ const o = n.get(t);
20
+ return o?.floating?.position !== void 0 ? o.floating.position : c[t]?.position ?? r;
21
+ },
22
+ [n, c]
23
+ ), S = e.useCallback(
24
+ (t) => {
25
+ const o = n.get(t);
26
+ return o?.floating?.size !== void 0 ? o.floating.size : c[t]?.size ?? u;
27
+ },
28
+ [n, c]
29
+ ), z = e.useCallback(
30
+ (t) => n.get(t)?.floating?.zIndex,
31
+ [n]
32
+ ), p = e.useCallback(
33
+ (t, o) => {
34
+ const i = n.get(t);
35
+ i?.floating && (i.floating.position === void 0 && f((s) => {
36
+ const a = s[t];
37
+ return a ? {
38
+ ...s,
39
+ [t]: { ...a, position: o }
40
+ } : s;
41
+ }), i.floating.onMove?.(o));
42
+ },
43
+ [n]
44
+ ), d = e.useCallback(
45
+ (t, o) => {
46
+ const i = n.get(t);
47
+ i?.floating && (i.floating.size === void 0 && f((s) => {
48
+ const a = s[t];
49
+ return a ? {
50
+ ...s,
51
+ [t]: { ...a, size: o }
52
+ } : s;
53
+ }), i.floating.onResize?.(o));
54
+ },
55
+ [n]
56
+ ), C = e.useCallback(
57
+ (t) => {
58
+ n.get(t)?.floating?.onClose?.();
59
+ },
60
+ [n]
61
+ );
62
+ return {
63
+ getPosition: g,
64
+ getSize: S,
65
+ getZIndex: z,
66
+ updatePosition: p,
67
+ updateSize: d,
68
+ close: C
69
+ };
70
+ };
71
+ export {
72
+ b as u
73
+ };
74
+ //# sourceMappingURL=useFloatingState-tEfA_wbc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFloatingState-tEfA_wbc.js","sources":["../src/modules/window/useFloatingState.ts"],"sourcesContent":["/**\n * @file Hook for managing floating window state (controlled/uncontrolled)\n * Pattern based on useDrawerState.ts\n */\nimport * as React from \"react\";\nimport type { LayerDefinition, WindowPosition, WindowSize } from \"../../types\";\n\ntype FloatingState = {\n position: WindowPosition;\n size: WindowSize;\n};\n\nconst DEFAULT_POSITION: WindowPosition = { left: 0, top: 0 };\nconst DEFAULT_SIZE: WindowSize = { width: 400, height: 300 };\n\nexport const useFloatingState = (layers: LayerDefinition[]) => {\n const [floatingStates, setFloatingStates] = React.useState<Record<string, FloatingState>>(() => {\n const initial: Record<string, FloatingState> = {};\n layers.forEach((layer) => {\n if (layer.floating) {\n const floating = layer.floating;\n initial[layer.id] = {\n position: floating.defaultPosition ?? DEFAULT_POSITION,\n size: floating.defaultSize ?? DEFAULT_SIZE,\n };\n }\n });\n return initial;\n });\n\n const layerMap = React.useMemo(() => {\n const map = new Map<string, LayerDefinition>();\n layers.forEach((layer) => map.set(layer.id, layer));\n return map;\n }, [layers]);\n\n const getPosition = React.useCallback(\n (layerId: string): WindowPosition => {\n const layer = layerMap.get(layerId);\n // Controlled mode: use position prop directly\n if (layer?.floating?.position !== undefined) {\n return layer.floating.position;\n }\n // Uncontrolled mode: use internal state\n return floatingStates[layerId]?.position ?? DEFAULT_POSITION;\n },\n [layerMap, floatingStates],\n );\n\n const getSize = React.useCallback(\n (layerId: string): WindowSize => {\n const layer = layerMap.get(layerId);\n // Controlled mode: use size prop directly\n if (layer?.floating?.size !== undefined) {\n return layer.floating.size;\n }\n // Uncontrolled mode: use internal state\n return floatingStates[layerId]?.size ?? DEFAULT_SIZE;\n },\n [layerMap, floatingStates],\n );\n\n const getZIndex = React.useCallback(\n (layerId: string): number | undefined => {\n const layer = layerMap.get(layerId);\n return layer?.floating?.zIndex;\n },\n [layerMap],\n );\n\n const updatePosition = React.useCallback(\n (layerId: string, position: WindowPosition) => {\n const layer = layerMap.get(layerId);\n if (!layer?.floating) {\n return;\n }\n\n // Update internal state only if uncontrolled\n if (layer.floating.position === undefined) {\n setFloatingStates((prev) => {\n const currentState = prev[layerId];\n if (!currentState) {\n return prev;\n }\n return {\n ...prev,\n [layerId]: { ...currentState, position },\n };\n });\n }\n\n // Always call callback\n layer.floating.onMove?.(position);\n },\n [layerMap],\n );\n\n const updateSize = React.useCallback(\n (layerId: string, size: WindowSize) => {\n const layer = layerMap.get(layerId);\n if (!layer?.floating) {\n return;\n }\n\n // Update internal state only if uncontrolled\n if (layer.floating.size === undefined) {\n setFloatingStates((prev) => {\n const currentState = prev[layerId];\n if (!currentState) {\n return prev;\n }\n return {\n ...prev,\n [layerId]: { ...currentState, size },\n };\n });\n }\n\n // Always call callback\n layer.floating.onResize?.(size);\n },\n [layerMap],\n );\n\n const close = React.useCallback(\n (layerId: string) => {\n const layer = layerMap.get(layerId);\n layer?.floating?.onClose?.();\n },\n [layerMap],\n );\n\n return {\n getPosition,\n getSize,\n getZIndex,\n updatePosition,\n updateSize,\n close,\n };\n};\n"],"names":["DEFAULT_POSITION","DEFAULT_SIZE","useFloatingState","layers","floatingStates","setFloatingStates","React","initial","layer","floating","layerMap","map","getPosition","layerId","getSize","getZIndex","updatePosition","position","prev","currentState","updateSize","size","close"],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @file Window entry point - Floating window and drawer components
3
+ * @packageDocumentation
4
+ *
5
+ * This is a subpath export entry point for `react-panel-layout/window`.
6
+ *
7
+ * ## Overview
8
+ * Window provides floating panels, drawers, and dialog overlays for modal
9
+ * and non-modal UI patterns. Supports draggable windows, slide-in drawers,
10
+ * and popup portals.
11
+ *
12
+ * ## Installation
13
+ * ```ts
14
+ * import { Drawer, FloatingWindow, useDrawerState } from "react-panel-layout/window";
15
+ * ```
16
+ *
17
+ * ## Drawer Usage
18
+ * ```tsx
19
+ * function App() {
20
+ * const [isOpen, setIsOpen] = useState(false);
21
+ *
22
+ * return (
23
+ * <>
24
+ * <button onClick={() => setIsOpen(true)}>Open Drawer</button>
25
+ * <Drawer
26
+ * id="settings"
27
+ * config={{ anchor: 'right', header: { title: 'Settings' } }}
28
+ * isOpen={isOpen}
29
+ * onClose={() => setIsOpen(false)}
30
+ * >
31
+ * <SettingsPanel />
32
+ * </Drawer>
33
+ * </>
34
+ * );
35
+ * }
36
+ * ```
37
+ *
38
+ * ## Floating Window Usage
39
+ * ```tsx
40
+ * <FloatingWindow
41
+ * id="inspector"
42
+ * config={{
43
+ * draggable: true,
44
+ * chrome: true,
45
+ * header: { title: 'Inspector', showCloseButton: true },
46
+ * }}
47
+ * onClose={handleClose}
48
+ * >
49
+ * <InspectorContent />
50
+ * </FloatingWindow>
51
+ * ```
52
+ */
53
+ export { FloatingWindow } from "../components/window/FloatingWindow.js";
54
+ export { Drawer } from "../components/window/Drawer.js";
55
+ export { DrawerLayers } from "../components/window/DrawerLayers.js";
56
+ export { DialogOverlay } from "../components/window/DialogOverlay.js";
57
+ export { PopupLayerPortal } from "../components/window/PopupLayerPortal.js";
58
+ export { useFloatingState } from "../modules/window/useFloatingState.js";
59
+ export { useDrawerState } from "../modules/window/useDrawerState.js";
60
+ export type { FloatingWindowProps } from "../components/window/FloatingWindow.js";
61
+ export type { DrawerProps } from "../components/window/Drawer.js";
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("./FloatingWindow-TCDNY5gE.cjs"),y=require("react/jsx-runtime"),E=require("react"),p=require("./useEffectEvent-huSsGUnl.cjs"),S=require("./useIsomorphicLayoutEffect-DGRNF4Lf.cjs"),M=require("./styles-qf6ptVLD.cjs"),j=require("./useFloatingState-C4kRaW_R.cjs");function P(e){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const s=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(n,t,s.get?s:{enumerable:!0,get:()=>e[t]})}}return n.default=e,Object.freeze(n)}const c=P(E),R=()=>typeof window>"u"?{width:0,height:0}:{width:window.innerWidth,height:window.innerHeight},z=(e,n,t,s,r)=>{const o=e+t>r.width?Math.max(0,r.width-t):e,i=n+s>r.height?Math.max(0,r.height-s):n;return{x:o,y:i}},v=new Map,L=e=>{const{box:n="content-box"}=e,t=`resize-box:${n}`,s=v.get(t);if(s)return s;const r=new class{#e=new Map;#t=new ResizeObserver((o,i)=>{o.forEach(a=>{const u=this.#e.get(a.target);u&&u(a,i)})});observe(o,i){return this.#e.set(o,i),this.#t.observe(o,e),()=>{this.#e.delete(o),this.#t.unobserve(o)}}};return v.set(t,r),r};function q(e,{box:n}){const[t,s]=c.useState(null),r=e.current;c.useEffect(()=>r?L({box:n}).observe(r,a=>{s(a)}):void 0,[n,r]);const o=c.useMemo(()=>{if(!t)return null;if(t.borderBoxSize?.length>0){const i=t.borderBoxSize[0];return new DOMRect(0,0,i.inlineSize,i.blockSize)}return t.contentRect},[t]);return{entry:t,rect:o}}const C={border:"none",padding:0,background:"transparent"},I={position:"fixed",zIndex:M.DIALOG_OVERLAY_Z_INDEX},k=typeof window<"u"&&typeof document<"u",F=({anchor:e,onClose:n,children:t,contentClassName:s,contentStyle:r,dataAttributes:o,onKeyDown:i,onPositionChange:a})=>{const u=c.useRef(null),{rect:l}=q(u,{box:"border-box"}),d=c.useMemo(()=>{const f=R(),h=l?.width??0,w=l?.height??0;return z(e.x,e.y,h,w,f)},[e.x,e.y,l?.width,l?.height]),g=p.useEffectEvent(a);c.useEffect(()=>{g?.(d)},[d]);const m=p.useEffectEvent(n);c.useEffect(()=>{const f=h=>{h.target instanceof Node&&u.current&&!u.current.contains(h.target)&&m()};return document.addEventListener("pointerdown",f),()=>document.removeEventListener("pointerdown",f)},[]);const D=c.useMemo(()=>({...I,...r,left:d.x,top:d.y}),[r,d.x,d.y]),O=c.useMemo(()=>o?Object.entries(o).reduce((f,[h,w])=>(w==null||(f[`data-${h}`]=w),f),{}):{},[o]);return y.jsx("div",{ref:u,className:s,style:D,onKeyDown:i,...O,children:t})},_=({visible:e,onClose:n,anchor:t,children:s,contentClassName:r,contentStyle:o,dataAttributes:i,onKeyDown:a,onPositionChange:u})=>{const l=c.useRef(null);S.useIsomorphicLayoutEffect(()=>{if(!l.current)return;const g=l.current;e?g.showModal():g.open&&g.close()},[e]);const d=c.useCallback(g=>{g.preventDefault(),n()},[n]);return y.jsx("dialog",{ref:l,style:C,onCancel:d,children:y.jsx(c.Activity,{mode:e?"visible":"hidden",children:y.jsx(F,{anchor:t,onClose:n,contentClassName:r,contentStyle:o,dataAttributes:i,onKeyDown:a,onPositionChange:u,children:s})})})},x=e=>k?y.jsx(_,{...e}):null;x.displayName="DialogOverlay";exports.Drawer=b.Drawer;exports.DrawerLayers=b.DrawerLayers;exports.FloatingWindow=b.FloatingWindow;exports.PopupLayerPortal=b.PopupLayerPortal;exports.useDrawerState=b.useDrawerState;exports.useFloatingState=j.useFloatingState;exports.DialogOverlay=x;
2
+ //# sourceMappingURL=window.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"window.cjs","sources":["../src/utils/dialogUtils.ts","../src/hooks/useResizeObserver.tsx","../src/components/window/DialogOverlay.tsx"],"sourcesContent":["/**\n * @file Dialog positioning utilities\n */\n\nexport type ViewportInfo = {\n width: number;\n height: number;\n};\n\n/**\n * Get viewport dimensions\n */\nexport const getViewportInfo = (): ViewportInfo => {\n if (typeof window === \"undefined\") {\n return { width: 0, height: 0 };\n }\n\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n};\n\n/**\n * Calculate context menu position to keep it within viewport\n */\nexport const calculateContextMenuPosition = (\n anchorX: number,\n anchorY: number,\n menuWidth: number,\n menuHeight: number,\n viewport: ViewportInfo,\n): { x: number; y: number } => {\n // Adjust horizontal position if menu would overflow\n const x =\n anchorX + menuWidth > viewport.width ? Math.max(0, viewport.width - menuWidth) : anchorX;\n\n // Adjust vertical position if menu would overflow\n const y =\n anchorY + menuHeight > viewport.height ? Math.max(0, viewport.height - menuHeight) : anchorY;\n\n return { x, y };\n};\n","/**\n * @file Shared useResizeObserver hook with cached observer instances.\n */\nimport * as React from \"react\";\n\ntype Unobserve = () => void;\ntype Callback = (entry: ResizeObserverEntry, observer: ResizeObserver) => void;\ntype SharedObserver = {\n observe: (target: Element, callback: Callback) => Unobserve;\n};\nconst observerCache = new Map<string, SharedObserver>();\nconst getSharedObserver = (options: ResizeObserverOptions) => {\n const { box = \"content-box\" } = options;\n const observerKey = `resize-box:${box}`;\n const cached = observerCache.get(observerKey);\n if (cached) {\n return cached;\n }\n const observer = new (class {\n #callbackMap = new Map<Element, Callback>();\n #resizeObserver = new ResizeObserver((entries, observer) => {\n entries.forEach((entry) => {\n const callback = this.#callbackMap.get(entry.target);\n if (callback) {\n callback(entry, observer);\n }\n });\n });\n observe(target: Element, callback: Callback) {\n this.#callbackMap.set(target, callback);\n this.#resizeObserver.observe(target, options);\n return () => {\n this.#callbackMap.delete(target);\n this.#resizeObserver.unobserve(target);\n };\n }\n })();\n observerCache.set(observerKey, observer);\n\n return observer;\n};\n/**\n * Observe size changes for a given element reference using shared resize observers.\n *\n * @param ref - Ref holding the element whose size to monitor.\n * @param options - Resize observer configuration.\n * @returns Latest resize entry and a derived DOMRect snapshot.\n */\nexport function useResizeObserver<T extends HTMLElement>(\n ref: React.RefObject<T | null>,\n { box }: ResizeObserverOptions,\n) {\n const [entry, setEntry] = React.useState<ResizeObserverEntry | null>(null);\n const target = ref.current;\n\n React.useEffect(() => {\n if (!target) {\n return;\n }\n\n const observer = getSharedObserver({ box });\n return observer.observe(target, (nextEntry) => {\n setEntry(nextEntry);\n });\n }, [box, target]);\n\n const rect = React.useMemo(() => {\n if (!entry) {\n return null;\n }\n\n if (entry.borderBoxSize?.length > 0) {\n const size = entry.borderBoxSize[0];\n return new DOMRect(0, 0, size.inlineSize, size.blockSize);\n }\n\n return entry.contentRect;\n }, [entry]);\n\n return { entry, rect };\n}\n","/**\n * @file Dialog-based overlay component with automatic positioning\n */\nimport * as React from \"react\";\nimport type { Position } from \"../../types\";\nimport { calculateContextMenuPosition, getViewportInfo } from \"../../utils/dialogUtils\";\nimport { ensureDialogPolyfill } from \"../../utils/polyfills/createDialogPolyfill\";\nimport { useEffectEvent } from \"../../hooks/useEffectEvent\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useResizeObserver } from \"../../hooks/useResizeObserver\";\nimport { DIALOG_OVERLAY_Z_INDEX } from \"../../constants/styles\";\n\nconst contextDialogStyle: React.CSSProperties = {\n border: \"none\",\n padding: 0,\n background: \"transparent\",\n};\n\nconst contextContentStyle: React.CSSProperties = {\n position: \"fixed\",\n zIndex: DIALOG_OVERLAY_Z_INDEX,\n};\n\ntype DataAttributes = Record<string, string | number | boolean>;\n\nexport type DialogOverlayProps = {\n anchor: Position;\n visible: boolean;\n onClose: () => void;\n children: React.ReactNode;\n contentClassName?: string;\n contentStyle?: React.CSSProperties;\n dataAttributes?: Record<string, string | number | boolean | null | undefined>;\n onKeyDown?: React.KeyboardEventHandler<HTMLDivElement>;\n onPositionChange?: (position: Position) => void;\n};\n\nconst isBrowser = typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\nensureDialogPolyfill();\n\nconst DialogOverlayContent: React.FC<Omit<DialogOverlayProps, \"visible\">> = ({\n anchor,\n onClose,\n children,\n contentClassName,\n contentStyle,\n dataAttributes,\n onKeyDown,\n onPositionChange,\n}) => {\n const contentRef = React.useRef<HTMLDivElement>(null);\n const { rect } = useResizeObserver(contentRef, { box: \"border-box\" });\n\n const computedPosition = React.useMemo(() => {\n const viewport = getViewportInfo();\n const width = rect?.width ?? 0;\n const height = rect?.height ?? 0;\n return calculateContextMenuPosition(anchor.x, anchor.y, width, height, viewport);\n }, [anchor.x, anchor.y, rect?.width, rect?.height]);\n\n const handlePositionChange = useEffectEvent(onPositionChange);\n\n React.useEffect(() => {\n handlePositionChange?.(computedPosition);\n }, [computedPosition]);\n\n const handleClose = useEffectEvent(onClose);\n\n React.useEffect(() => {\n const handlePointerDown = (event: PointerEvent) => {\n if (!(event.target instanceof Node)) {\n return;\n }\n if (contentRef.current && !contentRef.current.contains(event.target)) {\n handleClose();\n }\n };\n\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, []);\n\n const mergedStyle: React.CSSProperties = React.useMemo(\n () => ({\n ...contextContentStyle,\n ...contentStyle,\n left: computedPosition.x,\n top: computedPosition.y,\n }),\n [contentStyle, computedPosition.x, computedPosition.y],\n );\n\n const dataProps = React.useMemo<DataAttributes>(() => {\n if (!dataAttributes) {\n return {};\n }\n return Object.entries(dataAttributes).reduce<DataAttributes>((acc, [key, value]) => {\n if (value === null || value === undefined) {\n return acc;\n }\n acc[`data-${key}`] = value;\n return acc;\n }, {});\n }, [dataAttributes]);\n\n return (\n <div\n ref={contentRef}\n className={contentClassName}\n style={mergedStyle}\n onKeyDown={onKeyDown}\n {...dataProps}\n >\n {children}\n </div>\n );\n};\n\nconst DialogOverlayImpl: React.FC<DialogOverlayProps> = ({\n visible,\n onClose,\n anchor,\n children,\n contentClassName,\n contentStyle,\n dataAttributes,\n onKeyDown,\n onPositionChange,\n}) => {\n const dialogRef = React.useRef<HTMLDialogElement>(null);\n\n useIsomorphicLayoutEffect(() => {\n if (!dialogRef.current) {\n return;\n }\n\n const dialog = dialogRef.current;\n if (visible) {\n dialog.showModal();\n } else if (dialog.open) {\n dialog.close();\n }\n }, [visible]);\n\n const handleCancel = React.useCallback(\n (event: React.SyntheticEvent) => {\n event.preventDefault();\n onClose();\n },\n [onClose],\n );\n\n return (\n <dialog ref={dialogRef} style={contextDialogStyle} onCancel={handleCancel}>\n <React.Activity mode={visible ? \"visible\" : \"hidden\"}>\n <DialogOverlayContent\n anchor={anchor}\n onClose={onClose}\n contentClassName={contentClassName}\n contentStyle={contentStyle}\n dataAttributes={dataAttributes}\n onKeyDown={onKeyDown}\n onPositionChange={onPositionChange}\n >\n {children}\n </DialogOverlayContent>\n </React.Activity>\n </dialog>\n );\n};\n\nexport const DialogOverlay: React.FC<DialogOverlayProps> = (props) => {\n if (!isBrowser) {\n return null;\n }\n return <DialogOverlayImpl {...props} />;\n};\n\nDialogOverlay.displayName = \"DialogOverlay\";\n"],"names":["getViewportInfo","calculateContextMenuPosition","anchorX","anchorY","menuWidth","menuHeight","viewport","x","y","observerCache","getSharedObserver","options","box","observerKey","cached","observer","#callbackMap","#resizeObserver","entries","entry","callback","target","useResizeObserver","ref","setEntry","React","nextEntry","rect","size","contextDialogStyle","contextContentStyle","DIALOG_OVERLAY_Z_INDEX","isBrowser","DialogOverlayContent","anchor","onClose","children","contentClassName","contentStyle","dataAttributes","onKeyDown","onPositionChange","contentRef","computedPosition","width","height","handlePositionChange","useEffectEvent","handleClose","handlePointerDown","event","mergedStyle","dataProps","acc","key","value","jsx","DialogOverlayImpl","visible","dialogRef","useIsomorphicLayoutEffect","dialog","handleCancel","DialogOverlay","props"],"mappings":"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"}
package/dist/window.js ADDED
@@ -0,0 +1,149 @@
1
+ import { D as $, b as A, F as G, P as K, d as W } from "./FloatingWindow-BpdOpg_L.js";
2
+ import { jsx as m } from "react/jsx-runtime";
3
+ import * as i from "react";
4
+ import { u as p } from "./useEffectEvent-Dp7HLCf0.js";
5
+ import { u as D } from "./useIsomorphicLayoutEffect-DhmEnmZ_.js";
6
+ import { D as E } from "./styles-DPPuJ0sf.js";
7
+ import { u as q } from "./useFloatingState-tEfA_wbc.js";
8
+ const M = () => typeof window > "u" ? { width: 0, height: 0 } : {
9
+ width: window.innerWidth,
10
+ height: window.innerHeight
11
+ }, O = (e, o, t, c, n) => {
12
+ const r = e + t > n.width ? Math.max(0, n.width - t) : e, s = o + c > n.height ? Math.max(0, n.height - c) : o;
13
+ return { x: r, y: s };
14
+ }, b = /* @__PURE__ */ new Map(), z = (e) => {
15
+ const { box: o = "content-box" } = e, t = `resize-box:${o}`, c = b.get(t);
16
+ if (c)
17
+ return c;
18
+ const n = new class {
19
+ #e = /* @__PURE__ */ new Map();
20
+ #t = new ResizeObserver((r, s) => {
21
+ r.forEach((u) => {
22
+ const a = this.#e.get(u.target);
23
+ a && a(u, s);
24
+ });
25
+ });
26
+ observe(r, s) {
27
+ return this.#e.set(r, s), this.#t.observe(r, e), () => {
28
+ this.#e.delete(r), this.#t.unobserve(r);
29
+ };
30
+ }
31
+ }();
32
+ return b.set(t, n), n;
33
+ };
34
+ function R(e, { box: o }) {
35
+ const [t, c] = i.useState(null), n = e.current;
36
+ i.useEffect(() => n ? z({ box: o }).observe(n, (u) => {
37
+ c(u);
38
+ }) : void 0, [o, n]);
39
+ const r = i.useMemo(() => {
40
+ if (!t)
41
+ return null;
42
+ if (t.borderBoxSize?.length > 0) {
43
+ const s = t.borderBoxSize[0];
44
+ return new DOMRect(0, 0, s.inlineSize, s.blockSize);
45
+ }
46
+ return t.contentRect;
47
+ }, [t]);
48
+ return { entry: t, rect: r };
49
+ }
50
+ const S = {
51
+ border: "none",
52
+ padding: 0,
53
+ background: "transparent"
54
+ }, P = {
55
+ position: "fixed",
56
+ zIndex: E
57
+ }, C = typeof window < "u" && typeof document < "u", L = ({
58
+ anchor: e,
59
+ onClose: o,
60
+ children: t,
61
+ contentClassName: c,
62
+ contentStyle: n,
63
+ dataAttributes: r,
64
+ onKeyDown: s,
65
+ onPositionChange: u
66
+ }) => {
67
+ const a = i.useRef(null), { rect: d } = R(a, { box: "border-box" }), l = i.useMemo(() => {
68
+ const f = M(), w = d?.width ?? 0, g = d?.height ?? 0;
69
+ return O(e.x, e.y, w, g, f);
70
+ }, [e.x, e.y, d?.width, d?.height]), h = p(u);
71
+ i.useEffect(() => {
72
+ h?.(l);
73
+ }, [l]);
74
+ const y = p(o);
75
+ i.useEffect(() => {
76
+ const f = (w) => {
77
+ w.target instanceof Node && a.current && !a.current.contains(w.target) && y();
78
+ };
79
+ return document.addEventListener("pointerdown", f), () => document.removeEventListener("pointerdown", f);
80
+ }, []);
81
+ const x = i.useMemo(
82
+ () => ({
83
+ ...P,
84
+ ...n,
85
+ left: l.x,
86
+ top: l.y
87
+ }),
88
+ [n, l.x, l.y]
89
+ ), v = i.useMemo(() => r ? Object.entries(r).reduce((f, [w, g]) => (g == null || (f[`data-${w}`] = g), f), {}) : {}, [r]);
90
+ return /* @__PURE__ */ m(
91
+ "div",
92
+ {
93
+ ref: a,
94
+ className: c,
95
+ style: x,
96
+ onKeyDown: s,
97
+ ...v,
98
+ children: t
99
+ }
100
+ );
101
+ }, I = ({
102
+ visible: e,
103
+ onClose: o,
104
+ anchor: t,
105
+ children: c,
106
+ contentClassName: n,
107
+ contentStyle: r,
108
+ dataAttributes: s,
109
+ onKeyDown: u,
110
+ onPositionChange: a
111
+ }) => {
112
+ const d = i.useRef(null);
113
+ D(() => {
114
+ if (!d.current)
115
+ return;
116
+ const h = d.current;
117
+ e ? h.showModal() : h.open && h.close();
118
+ }, [e]);
119
+ const l = i.useCallback(
120
+ (h) => {
121
+ h.preventDefault(), o();
122
+ },
123
+ [o]
124
+ );
125
+ return /* @__PURE__ */ m("dialog", { ref: d, style: S, onCancel: l, children: /* @__PURE__ */ m(i.Activity, { mode: e ? "visible" : "hidden", children: /* @__PURE__ */ m(
126
+ L,
127
+ {
128
+ anchor: t,
129
+ onClose: o,
130
+ contentClassName: n,
131
+ contentStyle: r,
132
+ dataAttributes: s,
133
+ onKeyDown: u,
134
+ onPositionChange: a,
135
+ children: c
136
+ }
137
+ ) }) });
138
+ }, k = (e) => C ? /* @__PURE__ */ m(I, { ...e }) : null;
139
+ k.displayName = "DialogOverlay";
140
+ export {
141
+ k as DialogOverlay,
142
+ $ as Drawer,
143
+ A as DrawerLayers,
144
+ G as FloatingWindow,
145
+ K as PopupLayerPortal,
146
+ W as useDrawerState,
147
+ q as useFloatingState
148
+ };
149
+ //# sourceMappingURL=window.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"window.js","sources":["../src/utils/dialogUtils.ts","../src/hooks/useResizeObserver.tsx","../src/components/window/DialogOverlay.tsx"],"sourcesContent":["/**\n * @file Dialog positioning utilities\n */\n\nexport type ViewportInfo = {\n width: number;\n height: number;\n};\n\n/**\n * Get viewport dimensions\n */\nexport const getViewportInfo = (): ViewportInfo => {\n if (typeof window === \"undefined\") {\n return { width: 0, height: 0 };\n }\n\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n};\n\n/**\n * Calculate context menu position to keep it within viewport\n */\nexport const calculateContextMenuPosition = (\n anchorX: number,\n anchorY: number,\n menuWidth: number,\n menuHeight: number,\n viewport: ViewportInfo,\n): { x: number; y: number } => {\n // Adjust horizontal position if menu would overflow\n const x =\n anchorX + menuWidth > viewport.width ? Math.max(0, viewport.width - menuWidth) : anchorX;\n\n // Adjust vertical position if menu would overflow\n const y =\n anchorY + menuHeight > viewport.height ? Math.max(0, viewport.height - menuHeight) : anchorY;\n\n return { x, y };\n};\n","/**\n * @file Shared useResizeObserver hook with cached observer instances.\n */\nimport * as React from \"react\";\n\ntype Unobserve = () => void;\ntype Callback = (entry: ResizeObserverEntry, observer: ResizeObserver) => void;\ntype SharedObserver = {\n observe: (target: Element, callback: Callback) => Unobserve;\n};\nconst observerCache = new Map<string, SharedObserver>();\nconst getSharedObserver = (options: ResizeObserverOptions) => {\n const { box = \"content-box\" } = options;\n const observerKey = `resize-box:${box}`;\n const cached = observerCache.get(observerKey);\n if (cached) {\n return cached;\n }\n const observer = new (class {\n #callbackMap = new Map<Element, Callback>();\n #resizeObserver = new ResizeObserver((entries, observer) => {\n entries.forEach((entry) => {\n const callback = this.#callbackMap.get(entry.target);\n if (callback) {\n callback(entry, observer);\n }\n });\n });\n observe(target: Element, callback: Callback) {\n this.#callbackMap.set(target, callback);\n this.#resizeObserver.observe(target, options);\n return () => {\n this.#callbackMap.delete(target);\n this.#resizeObserver.unobserve(target);\n };\n }\n })();\n observerCache.set(observerKey, observer);\n\n return observer;\n};\n/**\n * Observe size changes for a given element reference using shared resize observers.\n *\n * @param ref - Ref holding the element whose size to monitor.\n * @param options - Resize observer configuration.\n * @returns Latest resize entry and a derived DOMRect snapshot.\n */\nexport function useResizeObserver<T extends HTMLElement>(\n ref: React.RefObject<T | null>,\n { box }: ResizeObserverOptions,\n) {\n const [entry, setEntry] = React.useState<ResizeObserverEntry | null>(null);\n const target = ref.current;\n\n React.useEffect(() => {\n if (!target) {\n return;\n }\n\n const observer = getSharedObserver({ box });\n return observer.observe(target, (nextEntry) => {\n setEntry(nextEntry);\n });\n }, [box, target]);\n\n const rect = React.useMemo(() => {\n if (!entry) {\n return null;\n }\n\n if (entry.borderBoxSize?.length > 0) {\n const size = entry.borderBoxSize[0];\n return new DOMRect(0, 0, size.inlineSize, size.blockSize);\n }\n\n return entry.contentRect;\n }, [entry]);\n\n return { entry, rect };\n}\n","/**\n * @file Dialog-based overlay component with automatic positioning\n */\nimport * as React from \"react\";\nimport type { Position } from \"../../types\";\nimport { calculateContextMenuPosition, getViewportInfo } from \"../../utils/dialogUtils\";\nimport { ensureDialogPolyfill } from \"../../utils/polyfills/createDialogPolyfill\";\nimport { useEffectEvent } from \"../../hooks/useEffectEvent\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useResizeObserver } from \"../../hooks/useResizeObserver\";\nimport { DIALOG_OVERLAY_Z_INDEX } from \"../../constants/styles\";\n\nconst contextDialogStyle: React.CSSProperties = {\n border: \"none\",\n padding: 0,\n background: \"transparent\",\n};\n\nconst contextContentStyle: React.CSSProperties = {\n position: \"fixed\",\n zIndex: DIALOG_OVERLAY_Z_INDEX,\n};\n\ntype DataAttributes = Record<string, string | number | boolean>;\n\nexport type DialogOverlayProps = {\n anchor: Position;\n visible: boolean;\n onClose: () => void;\n children: React.ReactNode;\n contentClassName?: string;\n contentStyle?: React.CSSProperties;\n dataAttributes?: Record<string, string | number | boolean | null | undefined>;\n onKeyDown?: React.KeyboardEventHandler<HTMLDivElement>;\n onPositionChange?: (position: Position) => void;\n};\n\nconst isBrowser = typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\nensureDialogPolyfill();\n\nconst DialogOverlayContent: React.FC<Omit<DialogOverlayProps, \"visible\">> = ({\n anchor,\n onClose,\n children,\n contentClassName,\n contentStyle,\n dataAttributes,\n onKeyDown,\n onPositionChange,\n}) => {\n const contentRef = React.useRef<HTMLDivElement>(null);\n const { rect } = useResizeObserver(contentRef, { box: \"border-box\" });\n\n const computedPosition = React.useMemo(() => {\n const viewport = getViewportInfo();\n const width = rect?.width ?? 0;\n const height = rect?.height ?? 0;\n return calculateContextMenuPosition(anchor.x, anchor.y, width, height, viewport);\n }, [anchor.x, anchor.y, rect?.width, rect?.height]);\n\n const handlePositionChange = useEffectEvent(onPositionChange);\n\n React.useEffect(() => {\n handlePositionChange?.(computedPosition);\n }, [computedPosition]);\n\n const handleClose = useEffectEvent(onClose);\n\n React.useEffect(() => {\n const handlePointerDown = (event: PointerEvent) => {\n if (!(event.target instanceof Node)) {\n return;\n }\n if (contentRef.current && !contentRef.current.contains(event.target)) {\n handleClose();\n }\n };\n\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, []);\n\n const mergedStyle: React.CSSProperties = React.useMemo(\n () => ({\n ...contextContentStyle,\n ...contentStyle,\n left: computedPosition.x,\n top: computedPosition.y,\n }),\n [contentStyle, computedPosition.x, computedPosition.y],\n );\n\n const dataProps = React.useMemo<DataAttributes>(() => {\n if (!dataAttributes) {\n return {};\n }\n return Object.entries(dataAttributes).reduce<DataAttributes>((acc, [key, value]) => {\n if (value === null || value === undefined) {\n return acc;\n }\n acc[`data-${key}`] = value;\n return acc;\n }, {});\n }, [dataAttributes]);\n\n return (\n <div\n ref={contentRef}\n className={contentClassName}\n style={mergedStyle}\n onKeyDown={onKeyDown}\n {...dataProps}\n >\n {children}\n </div>\n );\n};\n\nconst DialogOverlayImpl: React.FC<DialogOverlayProps> = ({\n visible,\n onClose,\n anchor,\n children,\n contentClassName,\n contentStyle,\n dataAttributes,\n onKeyDown,\n onPositionChange,\n}) => {\n const dialogRef = React.useRef<HTMLDialogElement>(null);\n\n useIsomorphicLayoutEffect(() => {\n if (!dialogRef.current) {\n return;\n }\n\n const dialog = dialogRef.current;\n if (visible) {\n dialog.showModal();\n } else if (dialog.open) {\n dialog.close();\n }\n }, [visible]);\n\n const handleCancel = React.useCallback(\n (event: React.SyntheticEvent) => {\n event.preventDefault();\n onClose();\n },\n [onClose],\n );\n\n return (\n <dialog ref={dialogRef} style={contextDialogStyle} onCancel={handleCancel}>\n <React.Activity mode={visible ? \"visible\" : \"hidden\"}>\n <DialogOverlayContent\n anchor={anchor}\n onClose={onClose}\n contentClassName={contentClassName}\n contentStyle={contentStyle}\n dataAttributes={dataAttributes}\n onKeyDown={onKeyDown}\n onPositionChange={onPositionChange}\n >\n {children}\n </DialogOverlayContent>\n </React.Activity>\n </dialog>\n );\n};\n\nexport const DialogOverlay: React.FC<DialogOverlayProps> = (props) => {\n if (!isBrowser) {\n return null;\n }\n return <DialogOverlayImpl {...props} />;\n};\n\nDialogOverlay.displayName = \"DialogOverlay\";\n"],"names":["getViewportInfo","calculateContextMenuPosition","anchorX","anchorY","menuWidth","menuHeight","viewport","x","y","observerCache","getSharedObserver","options","box","observerKey","cached","observer","#callbackMap","#resizeObserver","entries","entry","callback","target","useResizeObserver","ref","setEntry","React","nextEntry","rect","size","contextDialogStyle","contextContentStyle","DIALOG_OVERLAY_Z_INDEX","isBrowser","DialogOverlayContent","anchor","onClose","children","contentClassName","contentStyle","dataAttributes","onKeyDown","onPositionChange","contentRef","computedPosition","width","height","handlePositionChange","useEffectEvent","handleClose","handlePointerDown","event","mergedStyle","dataProps","acc","key","value","jsx","DialogOverlayImpl","visible","dialogRef","useIsomorphicLayoutEffect","dialog","handleCancel","DialogOverlay","props"],"mappings":"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"}