react-panel-layout 0.5.2 → 0.6.1

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 (541) hide show
  1. package/dist/{FloatingPanelFrame-lLg-Lpg7.js → FloatingPanelFrame-3eU9AwPo.js} +11 -11
  2. package/dist/{FloatingPanelFrame-lLg-Lpg7.js.map → FloatingPanelFrame-3eU9AwPo.js.map} +1 -1
  3. package/dist/{FloatingPanelFrame-D9Cp2al1.cjs → FloatingPanelFrame-CEmXDvUA.cjs} +2 -2
  4. package/dist/{FloatingPanelFrame-D9Cp2al1.cjs.map → FloatingPanelFrame-CEmXDvUA.cjs.map} +1 -1
  5. package/dist/FloatingWindow-CUXnEtrb.js +827 -0
  6. package/dist/FloatingWindow-CUXnEtrb.js.map +1 -0
  7. package/dist/FloatingWindow-DMwyK0eK.cjs +2 -0
  8. package/dist/FloatingWindow-DMwyK0eK.cjs.map +1 -0
  9. package/dist/GridLayout-DKTg_N61.cjs +2 -0
  10. package/dist/GridLayout-DKTg_N61.cjs.map +1 -0
  11. package/dist/GridLayout-UWNxXw77.js +926 -0
  12. package/dist/GridLayout-UWNxXw77.js.map +1 -0
  13. package/dist/HorizontalDivider-DdxzfV0l.js +30 -0
  14. package/dist/HorizontalDivider-DdxzfV0l.js.map +1 -0
  15. package/dist/HorizontalDivider-_pgV4Mcv.cjs +2 -0
  16. package/dist/HorizontalDivider-_pgV4Mcv.cjs.map +1 -0
  17. package/dist/PanelSystem-BqUzNtf2.js +1946 -0
  18. package/dist/PanelSystem-BqUzNtf2.js.map +1 -0
  19. package/dist/PanelSystem-D603LKKv.cjs +3 -0
  20. package/dist/PanelSystem-D603LKKv.cjs.map +1 -0
  21. package/dist/ResizeHandle-CBcAS918.cjs +2 -0
  22. package/dist/ResizeHandle-CBcAS918.cjs.map +1 -0
  23. package/dist/ResizeHandle-CXjc1meV.js +119 -0
  24. package/dist/ResizeHandle-CXjc1meV.js.map +1 -0
  25. package/dist/SwipePivotTabBar-DWrCuwEI.js +411 -0
  26. package/dist/SwipePivotTabBar-DWrCuwEI.js.map +1 -0
  27. package/dist/SwipePivotTabBar-fjjXkpj7.cjs +2 -0
  28. package/dist/SwipePivotTabBar-fjjXkpj7.cjs.map +1 -0
  29. package/dist/components/gesture/SwipeSafeZone.d.ts +40 -0
  30. package/dist/components/window/Drawer.d.ts +3 -1
  31. package/dist/components/window/DrawerLayers.d.ts +1 -1
  32. package/dist/components/window/drawerStyles.d.ts +69 -0
  33. package/dist/components/window/drawerSwipeConfig.d.ts +29 -0
  34. package/dist/components/window/useDrawerSwipeTransform.d.ts +23 -0
  35. package/dist/config.cjs +1 -1
  36. package/dist/config.cjs.map +1 -1
  37. package/dist/config.js +11 -9
  38. package/dist/config.js.map +1 -1
  39. package/dist/constants/styles.d.ts +35 -4
  40. package/dist/dialog/index.d.ts +69 -0
  41. package/dist/floating.cjs +1 -1
  42. package/dist/floating.js +1 -1
  43. package/dist/grid/index.d.ts +58 -0
  44. package/dist/grid.cjs +2 -0
  45. package/dist/grid.cjs.map +1 -0
  46. package/dist/grid.js +13 -0
  47. package/dist/grid.js.map +1 -0
  48. package/dist/hooks/gesture/presets.d.ts +33 -0
  49. package/dist/hooks/gesture/testing/createGestureSimulator.d.ts +117 -0
  50. package/dist/hooks/gesture/thresholdValue.d.ts +44 -0
  51. package/dist/hooks/gesture/types.d.ts +297 -0
  52. package/dist/hooks/gesture/useDirectionalLock.d.ts +20 -0
  53. package/dist/hooks/gesture/useEdgeSwipeInput.d.ts +23 -0
  54. package/dist/hooks/gesture/useNativeGestureGuard.d.ts +23 -0
  55. package/dist/hooks/gesture/usePointerTracking.d.ts +22 -0
  56. package/dist/hooks/gesture/useScrollBoundary.d.ts +23 -0
  57. package/dist/hooks/gesture/useSwipeInput.d.ts +5 -0
  58. package/dist/hooks/gesture/utils.d.ts +59 -0
  59. package/dist/hooks/useAnimatedVisibility.d.ts +58 -0
  60. package/dist/hooks/useAnimationFrame.d.ts +86 -0
  61. package/dist/hooks/useOperationContinuity.d.ts +64 -0
  62. package/dist/hooks/useResizeObserver.d.ts +33 -1
  63. package/dist/hooks/useSharedElementTransition.d.ts +112 -0
  64. package/dist/hooks/useSnapAnimation.d.ts +54 -0
  65. package/dist/hooks/useSwipeContentTransform.d.ts +86 -0
  66. package/dist/index.cjs +1 -2
  67. package/dist/index.cjs.map +1 -1
  68. package/dist/index.d.ts +0 -1
  69. package/dist/index.js +25 -2006
  70. package/dist/index.js.map +1 -1
  71. package/dist/modules/dialog/AlertDialog.d.ts +9 -0
  72. package/dist/modules/dialog/DialogContainer.d.ts +37 -0
  73. package/dist/modules/dialog/Modal.d.ts +26 -0
  74. package/dist/modules/dialog/SwipeDialogContainer.d.ts +16 -0
  75. package/dist/modules/dialog/dialogAnimationUtils.d.ts +113 -0
  76. package/dist/modules/dialog/types.d.ts +183 -0
  77. package/dist/modules/dialog/useDialog.d.ts +39 -0
  78. package/dist/modules/dialog/useDialogContainer.d.ts +47 -0
  79. package/dist/modules/dialog/useDialogSwipeInput.d.ts +70 -0
  80. package/dist/modules/dialog/useDialogTransform.d.ts +82 -0
  81. package/dist/modules/drawer/types.d.ts +74 -0
  82. package/dist/modules/drawer/useDrawerSwipeInput.d.ts +24 -0
  83. package/dist/modules/pivot/PivotContent.d.ts +1 -1
  84. package/dist/modules/pivot/SwipePivotContent.d.ts +39 -0
  85. package/dist/modules/pivot/SwipePivotContent.debug.tmp.d.ts +25 -0
  86. package/dist/modules/pivot/SwipePivotContent.test.d.ts +1 -0
  87. package/dist/modules/pivot/SwipePivotTabBar.d.ts +92 -0
  88. package/dist/modules/pivot/index.d.ts +3 -0
  89. package/dist/modules/pivot/scaleInputState.d.ts +37 -0
  90. package/dist/modules/pivot/types.d.ts +67 -2
  91. package/dist/modules/pivot/usePivotSwipeInput.d.ts +68 -0
  92. package/dist/modules/stack/StackContent.d.ts +15 -0
  93. package/dist/modules/stack/SwipeStackContent.d.ts +66 -0
  94. package/dist/modules/stack/SwipeStackOutlet.d.ts +80 -0
  95. package/dist/modules/stack/computeStackContentState.d.ts +99 -0
  96. package/dist/modules/stack/computeSwipeStackTransform.d.ts +76 -0
  97. package/dist/modules/stack/types.d.ts +194 -0
  98. package/dist/modules/stack/useStackAnimationState.d.ts +32 -0
  99. package/dist/modules/stack/useStackNavigation.d.ts +23 -0
  100. package/dist/modules/stack/useStackSwipeInput.d.ts +27 -0
  101. package/dist/panels/index.d.ts +67 -0
  102. package/dist/panels.cjs +2 -0
  103. package/dist/panels.cjs.map +1 -0
  104. package/dist/panels.js +28 -0
  105. package/dist/panels.js.map +1 -0
  106. package/dist/pivot/index.d.ts +3 -0
  107. package/dist/pivot.cjs +1 -1
  108. package/dist/pivot.cjs.map +1 -1
  109. package/dist/pivot.js +20 -2
  110. package/dist/pivot.js.map +1 -1
  111. package/dist/resizer/index.d.ts +57 -0
  112. package/dist/resizer.cjs +2 -0
  113. package/dist/resizer.cjs.map +1 -0
  114. package/dist/resizer.js +8 -0
  115. package/dist/resizer.js.map +1 -0
  116. package/dist/stack/index.d.ts +72 -0
  117. package/dist/stack.cjs +2 -0
  118. package/dist/stack.cjs.map +1 -0
  119. package/dist/stack.js +721 -0
  120. package/dist/stack.js.map +1 -0
  121. package/dist/sticky-header/StickyArea.d.ts +38 -0
  122. package/dist/sticky-header/calculateStickyMetrics.d.ts +28 -0
  123. package/dist/sticky-header/index.d.ts +4 -4
  124. package/dist/sticky-header/types.d.ts +35 -22
  125. package/dist/sticky-header.cjs +1 -1
  126. package/dist/sticky-header.cjs.map +1 -1
  127. package/dist/sticky-header.js +73 -174
  128. package/dist/sticky-header.js.map +1 -1
  129. package/dist/styles-NkjuMOVS.js +57 -0
  130. package/dist/styles-NkjuMOVS.js.map +1 -0
  131. package/dist/styles-qf6ptVLD.cjs +2 -0
  132. package/dist/styles-qf6ptVLD.cjs.map +1 -0
  133. package/dist/types.d.ts +16 -0
  134. package/dist/useContentCache-CO3LYNmz.js +24 -0
  135. package/dist/useContentCache-CO3LYNmz.js.map +1 -0
  136. package/dist/useContentCache-DqXtLrLs.cjs +2 -0
  137. package/dist/useContentCache-DqXtLrLs.cjs.map +1 -0
  138. package/dist/useDocumentPointerEvents-DXxw3qWj.js +54 -0
  139. package/dist/useDocumentPointerEvents-DXxw3qWj.js.map +1 -0
  140. package/dist/useDocumentPointerEvents-DxDSOtip.cjs +2 -0
  141. package/dist/useDocumentPointerEvents-DxDSOtip.cjs.map +1 -0
  142. package/dist/useFloatingState-C4kRaW_R.cjs +2 -0
  143. package/dist/useFloatingState-C4kRaW_R.cjs.map +1 -0
  144. package/dist/useFloatingState-tEfA_wbc.js +74 -0
  145. package/dist/useFloatingState-tEfA_wbc.js.map +1 -0
  146. package/dist/useNativeGestureGuard-C7TSqEkr.cjs +2 -0
  147. package/dist/useNativeGestureGuard-C7TSqEkr.cjs.map +1 -0
  148. package/dist/useNativeGestureGuard-CGYo6O0r.js +347 -0
  149. package/dist/useNativeGestureGuard-CGYo6O0r.js.map +1 -0
  150. package/dist/window/index.d.ts +63 -0
  151. package/dist/window.cjs +2 -0
  152. package/dist/window.cjs.map +1 -0
  153. package/dist/window.js +160 -0
  154. package/dist/window.js.map +1 -0
  155. package/docs/design-tokens.md +405 -0
  156. package/package.json +34 -4
  157. package/src/PanelSystemContext.tsx +88 -0
  158. package/src/components/gesture/SwipeSafeZone.tsx +69 -0
  159. package/src/components/grid/GridLayerList.tsx +172 -0
  160. package/src/components/grid/GridLayerResizeHandles.tsx +145 -0
  161. package/src/components/grid/GridLayout.spec.tsx +743 -0
  162. package/src/components/grid/GridLayout.tsx +130 -0
  163. package/src/components/grid/GridTrackResizeHandle.tsx +87 -0
  164. package/src/components/paneling/FloatingPanelFrame.tsx +203 -0
  165. package/src/components/panels/DropSuggestOverlay.tsx +131 -0
  166. package/src/components/panels/PanelGroupView.tsx +112 -0
  167. package/src/components/pivot/PivotLayer.tsx +27 -0
  168. package/src/components/resizer/HorizontalDivider.tsx +52 -0
  169. package/src/components/resizer/ResizeHandle.tsx +118 -0
  170. package/src/components/tabs/TabBar.tsx +223 -0
  171. package/src/components/tabs/TabBarTab.tsx +133 -0
  172. package/src/components/tabs/TabDragOverlay.tsx +92 -0
  173. package/src/components/window/DialogOverlay.tsx +180 -0
  174. package/src/components/window/Drawer.tsx +369 -0
  175. package/src/components/window/DrawerLayers.tsx +68 -0
  176. package/src/components/window/FloatingWindow.tsx +95 -0
  177. package/src/components/window/PopupLayerPortal.tsx +218 -0
  178. package/src/components/window/drawerStyles.spec.ts +263 -0
  179. package/src/components/window/drawerStyles.ts +228 -0
  180. package/src/components/window/drawerSwipeConfig.spec.ts +131 -0
  181. package/src/components/window/drawerSwipeConfig.ts +112 -0
  182. package/src/components/window/useDrawerSwipeTransform.spec.ts +234 -0
  183. package/src/components/window/useDrawerSwipeTransform.ts +129 -0
  184. package/src/config/PanelContentDeclaration.tsx +427 -0
  185. package/src/config/index.tsx +52 -0
  186. package/src/config/panelJsx.spec.tsx +54 -0
  187. package/src/config/panelJsxConfig.spec.tsx +54 -0
  188. package/src/config/panelJsxDrawer.spec.tsx +33 -0
  189. package/src/config/panelRouter.spec.ts +68 -0
  190. package/src/config/panelRouter.tsx +155 -0
  191. package/src/constants/styles.ts +280 -0
  192. package/src/demo/Layout.module.css +258 -0
  193. package/src/demo/Layout.tsx +176 -0
  194. package/src/demo/components/CodeBlock.module.css +54 -0
  195. package/src/demo/components/CodeBlock.tsx +34 -0
  196. package/src/demo/components/CodePreview.module.css +37 -0
  197. package/src/demo/components/CodePreview.tsx +31 -0
  198. package/src/demo/components/DataPreview.module.css +177 -0
  199. package/src/demo/components/DataPreview.tsx +115 -0
  200. package/src/demo/components/Story.module.css +68 -0
  201. package/src/demo/components/Story.tsx +54 -0
  202. package/src/demo/components/layout/CodePanel.module.css +183 -0
  203. package/src/demo/components/layout/CodePanel.tsx +149 -0
  204. package/src/demo/components/layout/DemoPage.module.css +60 -0
  205. package/src/demo/components/layout/DemoPage.tsx +56 -0
  206. package/src/demo/components/layout/SingleSamplePage.module.css +11 -0
  207. package/src/demo/components/layout/SingleSamplePage.tsx +35 -0
  208. package/src/demo/components/layout/SplitDemoLayout.module.css +107 -0
  209. package/src/demo/components/layout/SplitDemoLayout.tsx +218 -0
  210. package/src/demo/components/layout/index.ts +11 -0
  211. package/src/demo/components/tab-styles/ChromeTabBar.module.css +75 -0
  212. package/src/demo/components/tab-styles/ChromeTabBar.tsx +111 -0
  213. package/src/demo/components/tab-styles/GitHubTabBar.module.css +81 -0
  214. package/src/demo/components/tab-styles/GitHubTabBar.tsx +109 -0
  215. package/src/demo/components/tab-styles/VSCodeTabBar.module.css +78 -0
  216. package/src/demo/components/tab-styles/VSCodeTabBar.tsx +109 -0
  217. package/src/demo/components/tab-styles/index.ts +6 -0
  218. package/src/demo/components/ui/DemoButton.module.css +63 -0
  219. package/src/demo/components/ui/DemoButton.tsx +32 -0
  220. package/src/demo/components/ui/DemoCard.module.css +15 -0
  221. package/src/demo/components/ui/DemoCard.tsx +30 -0
  222. package/src/demo/components/ui/DemoContainer.module.css +17 -0
  223. package/src/demo/components/ui/DemoContainer.tsx +30 -0
  224. package/src/demo/components/ui/DemoPanel.module.css +23 -0
  225. package/src/demo/components/ui/DemoPanel.tsx +33 -0
  226. package/src/demo/components/ui/PanelText.module.css +18 -0
  227. package/src/demo/components/ui/PanelText.tsx +29 -0
  228. package/src/demo/components/ui/PanelTitle.module.css +18 -0
  229. package/src/demo/components/ui/PanelTitle.tsx +31 -0
  230. package/src/demo/contexts/TabbarDemoConfig.tsx +218 -0
  231. package/src/demo/demo.css +172 -0
  232. package/src/demo/hooks/useMedia.ts +41 -0
  233. package/src/demo/hooks/useShikiHighlight.ts +55 -0
  234. package/src/demo/index.tsx +293 -0
  235. package/src/demo/pages/Dialog/alerts/index.tsx +22 -0
  236. package/src/demo/pages/Dialog/card/index.tsx +22 -0
  237. package/src/demo/pages/Dialog/components/AlertDialogDemo.tsx +124 -0
  238. package/src/demo/pages/Dialog/components/CardExpandDemo.module.css +243 -0
  239. package/src/demo/pages/Dialog/components/CardExpandDemo.tsx +204 -0
  240. package/src/demo/pages/Dialog/components/CustomAlertDialogDemo.tsx +219 -0
  241. package/src/demo/pages/Dialog/components/DialogDemos.module.css +77 -0
  242. package/src/demo/pages/Dialog/components/ModalBasics.tsx +45 -0
  243. package/src/demo/pages/Dialog/components/SwipeDialogDemo.module.css +77 -0
  244. package/src/demo/pages/Dialog/components/SwipeDialogDemo.tsx +181 -0
  245. package/src/demo/pages/Dialog/custom-alert/index.tsx +22 -0
  246. package/src/demo/pages/Dialog/modal/index.tsx +17 -0
  247. package/src/demo/pages/Dialog/swipe/index.tsx +22 -0
  248. package/src/demo/pages/Drawer/animations/index.tsx +22 -0
  249. package/src/demo/pages/Drawer/basics/index.tsx +17 -0
  250. package/src/demo/pages/Drawer/components/DrawerAnimations.module.css +125 -0
  251. package/src/demo/pages/Drawer/components/DrawerAnimations.tsx +118 -0
  252. package/src/demo/pages/Drawer/components/DrawerBasics.module.css +55 -0
  253. package/src/demo/pages/Drawer/components/DrawerBasics.tsx +76 -0
  254. package/src/demo/pages/Drawer/components/DrawerMenuLayout.module.css +332 -0
  255. package/src/demo/pages/Drawer/components/DrawerMenuLayout.tsx +199 -0
  256. package/src/demo/pages/Drawer/components/DrawerSwipe.module.css +316 -0
  257. package/src/demo/pages/Drawer/components/DrawerSwipe.tsx +178 -0
  258. package/src/demo/pages/Drawer/menu/index.tsx +17 -0
  259. package/src/demo/pages/Drawer/swipe/index.tsx +17 -0
  260. package/src/demo/pages/FloatingPanelFrame/ResizableFloatingPanelsPreview.module.css +163 -0
  261. package/src/demo/pages/FloatingPanelFrame/ResizableFloatingPanelsPreview.tsx +234 -0
  262. package/src/demo/pages/FloatingPanelFrame/basic/index.tsx +17 -0
  263. package/src/demo/pages/FloatingPanelFrame/complex/index.tsx +26 -0
  264. package/src/demo/pages/FloatingPanelFrame/components/BasicPanel.module.css +16 -0
  265. package/src/demo/pages/FloatingPanelFrame/components/BasicPanel.tsx +24 -0
  266. package/src/demo/pages/FloatingPanelFrame/components/ComplexPanel.module.css +54 -0
  267. package/src/demo/pages/FloatingPanelFrame/components/ComplexPanel.tsx +67 -0
  268. package/src/demo/pages/FloatingPanelFrame/components/PanelWithControls.module.css +21 -0
  269. package/src/demo/pages/FloatingPanelFrame/components/PanelWithControls.tsx +41 -0
  270. package/src/demo/pages/FloatingPanelFrame/components/PanelWithMeta.module.css +5 -0
  271. package/src/demo/pages/FloatingPanelFrame/components/PanelWithMeta.tsx +43 -0
  272. package/src/demo/pages/FloatingPanelFrame/components/ScrollablePanel.module.css +11 -0
  273. package/src/demo/pages/FloatingPanelFrame/components/ScrollablePanel.tsx +42 -0
  274. package/src/demo/pages/FloatingPanelFrame/index.tsx +80 -0
  275. package/src/demo/pages/FloatingPanelFrame/scrollable/index.tsx +30 -0
  276. package/src/demo/pages/FloatingPanelFrame/with-controls/index.tsx +30 -0
  277. package/src/demo/pages/FloatingPanelFrame/with-meta/index.tsx +17 -0
  278. package/src/demo/pages/HorizontalDivider/components/PanelsWithRichContent.module.css +112 -0
  279. package/src/demo/pages/HorizontalDivider/components/PanelsWithRichContent.tsx +56 -0
  280. package/src/demo/pages/HorizontalDivider/components/SimpleResizablePanels.module.css +46 -0
  281. package/src/demo/pages/HorizontalDivider/components/SimpleResizablePanels.tsx +29 -0
  282. package/src/demo/pages/HorizontalDivider/components/ThreePanelLayout.module.css +54 -0
  283. package/src/demo/pages/HorizontalDivider/components/ThreePanelLayout.tsx +30 -0
  284. package/src/demo/pages/HorizontalDivider/index.module.css +14 -0
  285. package/src/demo/pages/HorizontalDivider/index.tsx +64 -0
  286. package/src/demo/pages/HorizontalDivider/panels-with-rich-content/index.tsx +21 -0
  287. package/src/demo/pages/HorizontalDivider/simple-resizable-panels/index.tsx +21 -0
  288. package/src/demo/pages/HorizontalDivider/three-panel-layout/index.tsx +21 -0
  289. package/src/demo/pages/PanelLayout/PanelLayoutDemo.module.css +174 -0
  290. package/src/demo/pages/PanelLayout/PanelLayoutDemo.tsx +248 -0
  291. package/src/demo/pages/PanelLayout/components/DashboardLayout.module.css +115 -0
  292. package/src/demo/pages/PanelLayout/components/DashboardLayout.tsx +124 -0
  293. package/src/demo/pages/PanelLayout/components/DraggableOverlays.module.css +101 -0
  294. package/src/demo/pages/PanelLayout/components/DraggableOverlays.tsx +122 -0
  295. package/src/demo/pages/PanelLayout/components/IDELayout.module.css +104 -0
  296. package/src/demo/pages/PanelLayout/components/IDELayout.tsx +143 -0
  297. package/src/demo/pages/PanelLayout/components/SimpleGrid.module.css +19 -0
  298. package/src/demo/pages/PanelLayout/components/SimpleGrid.tsx +62 -0
  299. package/src/demo/pages/PanelLayout/dashboard/index.tsx +22 -0
  300. package/src/demo/pages/PanelLayout/draggable-overlays/index.tsx +22 -0
  301. package/src/demo/pages/PanelLayout/ide-layout/index.tsx +22 -0
  302. package/src/demo/pages/PanelLayout/index.tsx +94 -0
  303. package/src/demo/pages/PanelLayout/simple-grid/index.tsx +22 -0
  304. package/src/demo/pages/PanelSystem/PanelSystemPreview.module.css +20 -0
  305. package/src/demo/pages/PanelSystem/PanelSystemPreview.tsx +101 -0
  306. package/src/demo/pages/PanelSystem/preview/index.tsx +18 -0
  307. package/src/demo/pages/PanelSystem/tabbar/index.tsx +129 -0
  308. package/src/demo/pages/Pivot/basics/index.tsx +17 -0
  309. package/src/demo/pages/Pivot/components/Pivot.module.css +278 -0
  310. package/src/demo/pages/Pivot/components/PivotBasics.tsx +103 -0
  311. package/src/demo/pages/Pivot/components/PivotSidebar.tsx +168 -0
  312. package/src/demo/pages/Pivot/components/PivotTabs.tsx +129 -0
  313. package/src/demo/pages/Pivot/components/PivotTransitions.tsx +120 -0
  314. package/src/demo/pages/Pivot/components/SwipePivot.module.css +114 -0
  315. package/src/demo/pages/Pivot/components/SwipePivot.tsx +193 -0
  316. package/src/demo/pages/Pivot/components/SwipeTabsPivot.module.css +203 -0
  317. package/src/demo/pages/Pivot/components/SwipeTabsPivot.tsx +320 -0
  318. package/src/demo/pages/Pivot/sidebar/index.tsx +17 -0
  319. package/src/demo/pages/Pivot/swipe/index.tsx +16 -0
  320. package/src/demo/pages/Pivot/swipe-debug/index.tsx +287 -0
  321. package/src/demo/pages/Pivot/swipe-tabs/index.tsx +15 -0
  322. package/src/demo/pages/Pivot/tabs/index.tsx +17 -0
  323. package/src/demo/pages/Pivot/transitions/index.tsx +17 -0
  324. package/src/demo/pages/ResizeHandle/both-directions/index.tsx +17 -0
  325. package/src/demo/pages/ResizeHandle/components/BothDirectionsDemo.module.css +72 -0
  326. package/src/demo/pages/ResizeHandle/components/BothDirectionsDemo.tsx +41 -0
  327. package/src/demo/pages/ResizeHandle/components/HorizontalResizeDemo.module.css +61 -0
  328. package/src/demo/pages/ResizeHandle/components/HorizontalResizeDemo.tsx +33 -0
  329. package/src/demo/pages/ResizeHandle/components/NestedPanelsDemo.module.css +83 -0
  330. package/src/demo/pages/ResizeHandle/components/NestedPanelsDemo.tsx +53 -0
  331. package/src/demo/pages/ResizeHandle/components/VerticalResizeDemo.module.css +68 -0
  332. package/src/demo/pages/ResizeHandle/components/VerticalResizeDemo.tsx +33 -0
  333. package/src/demo/pages/ResizeHandle/horizontal/index.tsx +17 -0
  334. package/src/demo/pages/ResizeHandle/index.module.css +11 -0
  335. package/src/demo/pages/ResizeHandle/index.tsx +71 -0
  336. package/src/demo/pages/ResizeHandle/nested-panels/index.tsx +17 -0
  337. package/src/demo/pages/ResizeHandle/vertical/index.tsx +17 -0
  338. package/src/demo/pages/ResponsiveLayout/adaptive-workspace/index.tsx +22 -0
  339. package/src/demo/pages/ResponsiveLayout/components/ResponsiveWorkspace.module.css +423 -0
  340. package/src/demo/pages/ResponsiveLayout/components/ResponsiveWorkspace.tsx +398 -0
  341. package/src/demo/pages/Stack/basics/index.tsx +22 -0
  342. package/src/demo/pages/Stack/components/Stack.module.css +234 -0
  343. package/src/demo/pages/Stack/components/StackBasics.spec.tsx +152 -0
  344. package/src/demo/pages/Stack/components/StackBasics.tsx +301 -0
  345. package/src/demo/pages/Stack/components/StackTablet.module.css +299 -0
  346. package/src/demo/pages/Stack/components/StackTablet.spec.tsx +120 -0
  347. package/src/demo/pages/Stack/components/StackTablet.tsx +422 -0
  348. package/src/demo/pages/Stack/tablet/index.tsx +22 -0
  349. package/src/demo/pages/StickyHeader/basics/index.tsx +17 -0
  350. package/src/demo/pages/StickyHeader/components/StickyHeader.module.css +219 -0
  351. package/src/demo/pages/StickyHeader/components/StickyHeaderBasics.tsx +103 -0
  352. package/src/demo/routes.tsx +214 -0
  353. package/src/demo/styles/animations.css +68 -0
  354. package/src/demo/styles/stack-themes.css +35 -0
  355. package/src/demo/utils/createPanelView.tsx +58 -0
  356. package/src/dialog/index.ts +85 -0
  357. package/src/floating/index.ts +24 -0
  358. package/src/grid/index.ts +75 -0
  359. package/src/hooks/ContentCacheContext.tsx +87 -0
  360. package/src/hooks/gesture/presets.spec.ts +86 -0
  361. package/src/hooks/gesture/presets.ts +95 -0
  362. package/src/hooks/gesture/testing/createGestureSimulator.spec.ts +241 -0
  363. package/src/hooks/gesture/testing/createGestureSimulator.ts +385 -0
  364. package/src/hooks/gesture/thresholdValue.spec.ts +103 -0
  365. package/src/hooks/gesture/thresholdValue.ts +77 -0
  366. package/src/hooks/gesture/types.ts +367 -0
  367. package/src/hooks/gesture/useDirectionalLock.spec.ts +271 -0
  368. package/src/hooks/gesture/useDirectionalLock.ts +115 -0
  369. package/src/hooks/gesture/useEdgeSwipeInput.spec.ts +462 -0
  370. package/src/hooks/gesture/useEdgeSwipeInput.ts +131 -0
  371. package/src/hooks/gesture/useNativeGestureGuard.spec.ts +473 -0
  372. package/src/hooks/gesture/useNativeGestureGuard.ts +135 -0
  373. package/src/hooks/gesture/usePointerTracking.spec.ts +364 -0
  374. package/src/hooks/gesture/usePointerTracking.ts +134 -0
  375. package/src/hooks/gesture/useScrollBoundary.spec.ts +249 -0
  376. package/src/hooks/gesture/useScrollBoundary.ts +113 -0
  377. package/src/hooks/gesture/useSwipeInput.spec.ts +592 -0
  378. package/src/hooks/gesture/useSwipeInput.ts +310 -0
  379. package/src/hooks/gesture/utils.spec.ts +152 -0
  380. package/src/hooks/gesture/utils.ts +178 -0
  381. package/src/hooks/useAnimatedVisibility.spec.ts +277 -0
  382. package/src/hooks/useAnimatedVisibility.ts +172 -0
  383. package/src/hooks/useAnimationFrame.ts +208 -0
  384. package/src/hooks/useCSSMatrix.spec.ts +214 -0
  385. package/src/hooks/useCSSMatrix.ts +262 -0
  386. package/src/hooks/useClonedElementPreview.ts +28 -0
  387. package/src/hooks/useContainerScroll.ts +78 -0
  388. package/src/hooks/useContentCache.spec.tsx +232 -0
  389. package/src/hooks/useContentCache.tsx +127 -0
  390. package/src/hooks/useDocumentPointerEvents.ts +137 -0
  391. package/src/hooks/useDocumentScroll.ts +41 -0
  392. package/src/hooks/useEffectEvent.ts +40 -0
  393. package/src/hooks/useElementComponentWrapper.tsx +63 -0
  394. package/src/hooks/useIntersectionObserver.tsx +125 -0
  395. package/src/hooks/useIsomorphicLayoutEffect.ts +29 -0
  396. package/src/hooks/useOperationContinuity.spec.ts +387 -0
  397. package/src/hooks/useOperationContinuity.ts +135 -0
  398. package/src/hooks/useResizeObserver.spec.tsx +277 -0
  399. package/src/hooks/useResizeObserver.tsx +150 -0
  400. package/src/hooks/useScrollContainer.ts +73 -0
  401. package/src/hooks/useSharedElementTransition.ts +333 -0
  402. package/src/hooks/useSnapAnimation.ts +128 -0
  403. package/src/hooks/useSwipeContentTransform.spec.ts +133 -0
  404. package/src/hooks/useSwipeContentTransform.ts +373 -0
  405. package/src/hooks/useTransitionState.ts +95 -0
  406. package/src/index.tsx +88 -0
  407. package/src/modules/dialog/AlertDialog.spec.tsx +387 -0
  408. package/src/modules/dialog/AlertDialog.tsx +221 -0
  409. package/src/modules/dialog/DialogContainer.spec.tsx +228 -0
  410. package/src/modules/dialog/DialogContainer.tsx +188 -0
  411. package/src/modules/dialog/Modal.spec.tsx +220 -0
  412. package/src/modules/dialog/Modal.tsx +182 -0
  413. package/src/modules/dialog/SwipeDialogContainer.tsx +208 -0
  414. package/src/modules/dialog/dialogAnimationUtils.spec.ts +253 -0
  415. package/src/modules/dialog/dialogAnimationUtils.ts +297 -0
  416. package/src/modules/dialog/types.ts +186 -0
  417. package/src/modules/dialog/useDialog.spec.tsx +447 -0
  418. package/src/modules/dialog/useDialog.ts +214 -0
  419. package/src/modules/dialog/useDialogContainer.spec.ts +331 -0
  420. package/src/modules/dialog/useDialogContainer.ts +150 -0
  421. package/src/modules/dialog/useDialogSwipeInput.spec.ts +157 -0
  422. package/src/modules/dialog/useDialogSwipeInput.ts +319 -0
  423. package/src/modules/dialog/useDialogTransform.spec.ts +370 -0
  424. package/src/modules/dialog/useDialogTransform.ts +407 -0
  425. package/src/modules/drawer/types.ts +102 -0
  426. package/src/modules/drawer/useDrawerSwipeInput.spec.ts +566 -0
  427. package/src/modules/drawer/useDrawerSwipeInput.ts +399 -0
  428. package/src/modules/grid/GridLayoutContext.tsx +57 -0
  429. package/src/modules/grid/LayerInstanceContext.tsx +56 -0
  430. package/src/modules/grid/resizeHandles.ts +157 -0
  431. package/src/modules/grid/trackUtils.ts +146 -0
  432. package/src/modules/grid/useGridPlacements.ts +143 -0
  433. package/src/modules/grid/useGridTracks.ts +156 -0
  434. package/src/modules/grid/useLayerDragHandle.ts +16 -0
  435. package/src/modules/grid/useLayerInteractions.tsx +850 -0
  436. package/src/modules/keybindings/KeybindingsProvider.tsx +111 -0
  437. package/src/modules/panels/dom/DomRegistry.tsx +94 -0
  438. package/src/modules/panels/index.ts +45 -0
  439. package/src/modules/panels/interactions/InteractionsContext.test.tsx +330 -0
  440. package/src/modules/panels/interactions/InteractionsContext.tsx +394 -0
  441. package/src/modules/panels/interactions/dnd.ts +28 -0
  442. package/src/modules/panels/keybindings/KeybindingsInstaller.tsx +15 -0
  443. package/src/modules/panels/layout/adapter.ts +124 -0
  444. package/src/modules/panels/rendering/ContentRegistry.spec.tsx +311 -0
  445. package/src/modules/panels/rendering/ContentRegistry.tsx +205 -0
  446. package/src/modules/panels/rendering/GroupContainer.tsx +65 -0
  447. package/src/modules/panels/rendering/RenderBridge.tsx +115 -0
  448. package/src/modules/panels/rendering/RenderContext.tsx +31 -0
  449. package/src/modules/panels/state/PanelSplitHandles.tsx +147 -0
  450. package/src/modules/panels/state/PanelSystemContext.splitLimits.spec.tsx +50 -0
  451. package/src/modules/panels/state/PanelSystemContext.tsx +289 -0
  452. package/src/modules/panels/state/StateContext.tsx +12 -0
  453. package/src/modules/panels/state/cleanup.ts +37 -0
  454. package/src/modules/panels/state/commands.ts +53 -0
  455. package/src/modules/panels/state/focus/Context.tsx +25 -0
  456. package/src/modules/panels/state/focus/logic.ts +57 -0
  457. package/src/modules/panels/state/groups/Context.tsx +25 -0
  458. package/src/modules/panels/state/groups/logic.ts +105 -0
  459. package/src/modules/panels/state/splitLimits.spec.ts +46 -0
  460. package/src/modules/panels/state/splitLimits.ts +90 -0
  461. package/src/modules/panels/state/state.spec.ts +49 -0
  462. package/src/modules/panels/state/tree/Context.tsx +24 -0
  463. package/src/modules/panels/state/tree/logic.spec.ts +34 -0
  464. package/src/modules/panels/state/tree/logic.ts +138 -0
  465. package/src/modules/panels/state/types.ts +142 -0
  466. package/src/modules/panels/system/PanelSystem.empty-tabbar.spec.tsx +53 -0
  467. package/src/modules/panels/system/PanelSystem.tab-click-activates.spec.tsx +44 -0
  468. package/src/modules/panels/system/PanelSystem.tab-reorder.spec.tsx +64 -0
  469. package/src/modules/panels/system/PanelSystem.tabs-no-dup.spec.tsx +57 -0
  470. package/src/modules/panels/system/PanelSystem.tsx +206 -0
  471. package/src/modules/pivot/PivotContent.spec.tsx +179 -0
  472. package/src/modules/pivot/PivotContent.tsx +77 -0
  473. package/src/modules/pivot/SwipePivotContent.debug.tmp.tsx +237 -0
  474. package/src/modules/pivot/SwipePivotContent.position.spec.tsx +171 -0
  475. package/src/modules/pivot/SwipePivotContent.spec.tsx +494 -0
  476. package/src/modules/pivot/SwipePivotContent.test.tsx +502 -0
  477. package/src/modules/pivot/SwipePivotContent.tsx +197 -0
  478. package/src/modules/pivot/SwipePivotTabBar.spec.tsx +882 -0
  479. package/src/modules/pivot/SwipePivotTabBar.tsx +583 -0
  480. package/src/modules/pivot/index.ts +8 -0
  481. package/src/modules/pivot/scaleInputState.spec.ts +219 -0
  482. package/src/modules/pivot/scaleInputState.ts +66 -0
  483. package/src/modules/pivot/types.ts +139 -0
  484. package/src/modules/pivot/usePivot.spec.ts +635 -0
  485. package/src/modules/pivot/usePivot.spec.tsx +186 -0
  486. package/src/modules/pivot/usePivot.tsx +345 -0
  487. package/src/modules/pivot/usePivotSwipeInput.spec.ts +708 -0
  488. package/src/modules/pivot/usePivotSwipeInput.ts +136 -0
  489. package/src/modules/resizer/useResizeDrag.ts +94 -0
  490. package/src/modules/stack/StackContent.spec.tsx +264 -0
  491. package/src/modules/stack/StackContent.tsx +111 -0
  492. package/src/modules/stack/SwipeStackContent.spec.tsx +1564 -0
  493. package/src/modules/stack/SwipeStackContent.tsx +366 -0
  494. package/src/modules/stack/SwipeStackOutlet.spec.tsx +250 -0
  495. package/src/modules/stack/SwipeStackOutlet.tsx +221 -0
  496. package/src/modules/stack/computeStackContentState.spec.ts +281 -0
  497. package/src/modules/stack/computeStackContentState.ts +304 -0
  498. package/src/modules/stack/computeSwipeStackTransform.spec.ts +186 -0
  499. package/src/modules/stack/computeSwipeStackTransform.ts +145 -0
  500. package/src/modules/stack/swipeTransitionContinuity.spec.tsx +1133 -0
  501. package/src/modules/stack/types.ts +226 -0
  502. package/src/modules/stack/useStackAnimationState.spec.ts +188 -0
  503. package/src/modules/stack/useStackAnimationState.ts +143 -0
  504. package/src/modules/stack/useStackNavigation.spec.ts +672 -0
  505. package/src/modules/stack/useStackNavigation.tsx +393 -0
  506. package/src/modules/stack/useStackSwipeInput.spec.ts +309 -0
  507. package/src/modules/stack/useStackSwipeInput.ts +139 -0
  508. package/src/modules/window/useDrawerState.ts +81 -0
  509. package/src/modules/window/useFloatingState.spec.ts +252 -0
  510. package/src/modules/window/useFloatingState.ts +141 -0
  511. package/src/panels/index.ts +119 -0
  512. package/src/pivot/index.ts +19 -0
  513. package/src/resizer/index.ts +68 -0
  514. package/src/stack/index.ts +91 -0
  515. package/src/sticky-header/StickyArea.tsx +193 -0
  516. package/src/sticky-header/calculateStickyMetrics.spec.ts +105 -0
  517. package/src/sticky-header/calculateStickyMetrics.ts +50 -0
  518. package/src/sticky-header/index.ts +18 -0
  519. package/src/sticky-header/types.ts +68 -0
  520. package/src/types.ts +341 -0
  521. package/src/utils/CSSMatrix.ts +321 -0
  522. package/src/utils/css.ts +65 -0
  523. package/src/utils/dialogUtils.ts +43 -0
  524. package/src/utils/math.ts +18 -0
  525. package/src/utils/polyfills/createDialogPolyfill.ts +18 -0
  526. package/src/utils/typedActions.ts +103 -0
  527. package/src/vite-env.d.ts +6 -0
  528. package/src/window/index.ts +69 -0
  529. package/dist/GridLayout-BQQ63eA1.cjs +0 -2
  530. package/dist/GridLayout-BQQ63eA1.cjs.map +0 -1
  531. package/dist/GridLayout-CJTKq7Mp.js +0 -1465
  532. package/dist/GridLayout-CJTKq7Mp.js.map +0 -1
  533. package/dist/sticky-header/StickyHeader.d.ts +0 -53
  534. package/dist/styles-CA2_zLZt.js +0 -52
  535. package/dist/styles-CA2_zLZt.js.map +0 -1
  536. package/dist/styles-PsqGOEJP.cjs +0 -2
  537. package/dist/styles-PsqGOEJP.cjs.map +0 -1
  538. package/dist/usePivot-7ctin_P_.cjs +0 -2
  539. package/dist/usePivot-7ctin_P_.cjs.map +0 -1
  540. package/dist/usePivot-CgQxB8rc.js +0 -124
  541. package/dist/usePivot-CgQxB8rc.js.map +0 -1
package/dist/window.js ADDED
@@ -0,0 +1,160 @@
1
+ import { D as A, b as G, F as K, P as T, S as W, d as q } from "./FloatingWindow-CUXnEtrb.js";
2
+ import { jsx as m } from "react/jsx-runtime";
3
+ import * as c from "react";
4
+ import { u as p } from "./useDocumentPointerEvents-DXxw3qWj.js";
5
+ import { u as x } from "./useIsomorphicLayoutEffect-DhmEnmZ_.js";
6
+ import { D as z } from "./styles-NkjuMOVS.js";
7
+ import { u as J } from "./useFloatingState-tEfA_wbc.js";
8
+ const D = () => typeof window > "u" ? { width: 0, height: 0 } : {
9
+ width: window.innerWidth,
10
+ height: window.innerHeight
11
+ }, O = (e, t, n, o, r) => {
12
+ const s = e + n > r.width ? Math.max(0, r.width - n) : e, i = t + o > r.height ? Math.max(0, r.height - o) : t;
13
+ return { x: s, y: i };
14
+ }, b = /* @__PURE__ */ new Map(), R = (e) => {
15
+ const t = `resize-box:${e}`, n = b.get(t);
16
+ if (n)
17
+ return n;
18
+ const o = /* @__PURE__ */ new Map(), r = new ResizeObserver((i) => {
19
+ for (const a of i) {
20
+ const u = o.get(a.target);
21
+ u && u(a);
22
+ }
23
+ }), s = {
24
+ observe(i, a) {
25
+ return o.set(i, a), r.observe(i, { box: e }), () => {
26
+ o.delete(i), r.unobserve(i);
27
+ };
28
+ }
29
+ };
30
+ return b.set(t, s), s;
31
+ }, E = (e) => {
32
+ const t = e.getBoundingClientRect();
33
+ return {
34
+ target: e,
35
+ contentRect: t,
36
+ borderBoxSize: [{ inlineSize: t.width, blockSize: t.height }],
37
+ contentBoxSize: [{ inlineSize: t.width, blockSize: t.height }],
38
+ devicePixelContentBoxSize: []
39
+ };
40
+ }, M = (e) => {
41
+ if (e.borderBoxSize?.length > 0) {
42
+ const t = e.borderBoxSize[0];
43
+ return new DOMRect(0, 0, t.inlineSize, t.blockSize);
44
+ }
45
+ return e.contentRect;
46
+ };
47
+ function C(e, { box: t = "content-box" }) {
48
+ const [n, o] = c.useState(null);
49
+ x(() => {
50
+ const s = e.current;
51
+ if (!s) {
52
+ o(null);
53
+ return;
54
+ }
55
+ return o(E(s)), R(t).observe(s, o);
56
+ }, [e, t]);
57
+ const r = c.useMemo(() => n ? M(n) : null, [n]);
58
+ return { entry: n, rect: r };
59
+ }
60
+ const P = {
61
+ border: "none",
62
+ padding: 0,
63
+ background: "transparent"
64
+ }, k = {
65
+ position: "fixed",
66
+ zIndex: z
67
+ }, B = typeof window < "u" && typeof document < "u", L = ({
68
+ anchor: e,
69
+ onClose: t,
70
+ children: n,
71
+ contentClassName: o,
72
+ contentStyle: r,
73
+ dataAttributes: s,
74
+ onKeyDown: i,
75
+ onPositionChange: a
76
+ }) => {
77
+ const u = c.useRef(null), { rect: d } = C(u, { box: "border-box" }), l = c.useMemo(() => {
78
+ const f = D(), g = d?.width ?? 0, w = d?.height ?? 0;
79
+ return O(e.x, e.y, g, w, f);
80
+ }, [e.x, e.y, d?.width, d?.height]), h = p(a);
81
+ c.useEffect(() => {
82
+ h?.(l);
83
+ }, [l]);
84
+ const y = p(t);
85
+ c.useEffect(() => {
86
+ const f = (g) => {
87
+ g.target instanceof Node && u.current && !u.current.contains(g.target) && y();
88
+ };
89
+ return document.addEventListener("pointerdown", f), () => document.removeEventListener("pointerdown", f);
90
+ }, []);
91
+ const v = c.useMemo(
92
+ () => ({
93
+ ...k,
94
+ ...r,
95
+ left: l.x,
96
+ top: l.y
97
+ }),
98
+ [r, l.x, l.y]
99
+ ), S = c.useMemo(() => s ? Object.entries(s).reduce((f, [g, w]) => (w == null || (f[`data-${g}`] = w), f), {}) : {}, [s]);
100
+ return /* @__PURE__ */ m(
101
+ "div",
102
+ {
103
+ ref: u,
104
+ className: o,
105
+ style: v,
106
+ onKeyDown: i,
107
+ ...S,
108
+ children: n
109
+ }
110
+ );
111
+ }, I = ({
112
+ visible: e,
113
+ onClose: t,
114
+ anchor: n,
115
+ children: o,
116
+ contentClassName: r,
117
+ contentStyle: s,
118
+ dataAttributes: i,
119
+ onKeyDown: a,
120
+ onPositionChange: u
121
+ }) => {
122
+ const d = c.useRef(null);
123
+ x(() => {
124
+ if (!d.current)
125
+ return;
126
+ const h = d.current;
127
+ e ? h.showModal() : h.open && h.close();
128
+ }, [e]);
129
+ const l = c.useCallback(
130
+ (h) => {
131
+ h.preventDefault(), t();
132
+ },
133
+ [t]
134
+ );
135
+ return /* @__PURE__ */ m("dialog", { ref: d, style: P, onCancel: l, children: /* @__PURE__ */ m(c.Activity, { mode: e ? "visible" : "hidden", children: /* @__PURE__ */ m(
136
+ L,
137
+ {
138
+ anchor: n,
139
+ onClose: t,
140
+ contentClassName: r,
141
+ contentStyle: s,
142
+ dataAttributes: i,
143
+ onKeyDown: a,
144
+ onPositionChange: u,
145
+ children: o
146
+ }
147
+ ) }) });
148
+ }, N = (e) => B ? /* @__PURE__ */ m(I, { ...e }) : null;
149
+ N.displayName = "DialogOverlay";
150
+ export {
151
+ N as DialogOverlay,
152
+ A as Drawer,
153
+ G as DrawerLayers,
154
+ K as FloatingWindow,
155
+ T as PopupLayerPortal,
156
+ W as SwipeSafeZone,
157
+ q as useDrawerState,
158
+ J as useFloatingState
159
+ };
160
+ //# 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 *\n * Provides element size observation with shared observers for memory efficiency.\n * Size becomes available after the first useLayoutEffect cycle completes.\n *\n * Note: Due to React's effect execution order (children before parents),\n * child components may see containerSize=0 on their first effect run.\n * This is a React constraint, not a bug. Consumers should check for\n * valid size before using it for calculations like animation positions.\n */\nimport * as React from \"react\";\nimport { useIsomorphicLayoutEffect } from \"./useIsomorphicLayoutEffect.js\";\n\n/**\n * Shared ResizeObserver that can observe multiple elements.\n */\ntype SharedObserver = {\n observe: (target: Element, callback: (entry: ResizeObserverEntry) => void) => () => void;\n};\n\n/** Cache of shared observers per box option */\nconst observerCache = new Map<string, SharedObserver>();\n\n/**\n * Get or create a shared ResizeObserver for the given box option.\n */\nconst getSharedObserver = (box: ResizeObserverBoxOptions): SharedObserver => {\n const observerKey = `resize-box:${box}`;\n const cached = observerCache.get(observerKey);\n if (cached) {\n return cached;\n }\n\n const callbacks = new Map<Element, (entry: ResizeObserverEntry) => void>();\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const callback = callbacks.get(entry.target);\n if (callback) {\n callback(entry);\n }\n }\n });\n\n const sharedObserver: SharedObserver = {\n observe(target, callback) {\n callbacks.set(target, callback);\n resizeObserver.observe(target, { box });\n\n return () => {\n callbacks.delete(target);\n resizeObserver.unobserve(target);\n };\n },\n };\n\n observerCache.set(observerKey, sharedObserver);\n return sharedObserver;\n};\n\n/**\n * Create a ResizeObserverEntry from getBoundingClientRect.\n */\nconst measureElement = (target: Element): ResizeObserverEntry => {\n const rect = target.getBoundingClientRect();\n return {\n target,\n contentRect: rect,\n borderBoxSize: [{ inlineSize: rect.width, blockSize: rect.height }],\n contentBoxSize: [{ inlineSize: rect.width, blockSize: rect.height }],\n devicePixelContentBoxSize: [],\n };\n};\n\n/**\n * Extract DOMRect from ResizeObserverEntry.\n */\nconst entryToRect = (entry: ResizeObserverEntry): DOMRect => {\n if (entry.borderBoxSize?.length > 0) {\n const size = entry.borderBoxSize[0];\n return new DOMRect(0, 0, size.inlineSize, size.blockSize);\n }\n return entry.contentRect;\n};\n\n/**\n * Clear observer cache. Exported for testing purposes.\n */\nexport function clearObserverCache(): void {\n observerCache.clear();\n}\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 *\n * @remarks\n * The `rect` will be `null` on the first render. After the initial\n * useLayoutEffect runs and triggers a re-render, `rect` will contain\n * the measured size.\n *\n * Due to React's effect execution order, child components' effects run\n * before parent effects. If you pass `rect.width` to a child as a prop,\n * the child's first effect will see `0` (or whatever default you use).\n * This is expected React behavior.\n *\n * @example\n * ```tsx\n * const containerRef = useRef<HTMLDivElement>(null);\n * const { rect } = useResizeObserver(containerRef, { box: \"border-box\" });\n * const width = rect?.width ?? 0;\n *\n * // Check if size is ready before using for calculations\n * const isReady = rect !== null;\n * ```\n */\nexport function useResizeObserver<T extends HTMLElement>(\n ref: React.RefObject<T | null>,\n { box = \"content-box\" }: ResizeObserverOptions,\n) {\n const [entry, setEntry] = React.useState<ResizeObserverEntry | null>(null);\n\n useIsomorphicLayoutEffect(() => {\n const target = ref.current;\n if (!target) {\n setEntry(null);\n return;\n }\n\n // Measure immediately\n setEntry(measureElement(target));\n\n // Set up ResizeObserver for subsequent updates\n const observer = getSharedObserver(box);\n return observer.observe(target, setEntry);\n }, [ref, box]);\n\n const rect = React.useMemo(() => {\n if (!entry) {\n return null;\n }\n return entryToRect(entry);\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","box","observerKey","cached","callbacks","resizeObserver","entries","entry","callback","sharedObserver","target","measureElement","rect","entryToRect","size","useResizeObserver","ref","setEntry","React","useIsomorphicLayoutEffect","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","dialog","handleCancel","DialogOverlay","props"],"mappings":"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"}
@@ -0,0 +1,405 @@
1
+ # Design Tokens (CSS Variables)
2
+
3
+ react-panel-layout uses CSS custom properties (CSS variables) for theming. All design tokens are prefixed with `--rpl-` to avoid conflicts with other libraries.
4
+
5
+ ## Overview
6
+
7
+ The library provides a comprehensive set of CSS variables that control the appearance of panels, tabs, and interactive elements. You can customize these variables in your own stylesheet to match your application's design.
8
+
9
+ **No JavaScript configuration needed** - all theming is done purely through CSS.
10
+
11
+ ## CSS Variables Reference
12
+
13
+ ### Colors
14
+
15
+ #### Tab Colors
16
+
17
+ | Variable | Default | Description |
18
+ |----------|---------|-------------|
19
+ | `--rpl-color-tab-fg` | `#d5d7de` | Tab text color |
20
+ | `--rpl-color-tab-active-bg` | `#2b2d35` | Active tab background |
21
+ | `--rpl-color-tabbar-bg` | `#1e1f24` | Tab bar background |
22
+
23
+ #### Panel Colors
24
+
25
+ | Variable | Default | Description |
26
+ |----------|---------|-------------|
27
+ | `--rpl-color-panel-border` | `rgba(0, 0, 0, 0.3)` | Panel border color |
28
+ | `--rpl-color-panel-bg` | `#0b0b0c` | Panel content background |
29
+ | `--rpl-color-primary` | `#2196f3` | Primary accent color (resize handles) |
30
+
31
+ #### Resize Handle Colors
32
+
33
+ | Variable | Default | Description |
34
+ |----------|---------|-------------|
35
+ | `--rpl-color-resize-handle-hover` | `rgba(33, 150, 243, 0.35)` | Divider color when hovered |
36
+ | `--rpl-color-resize-handle-active` | `rgba(33, 150, 243, 0.55)` | Divider color while dragging |
37
+
38
+ #### Drag & Drop Colors
39
+
40
+ | Variable | Default | Description |
41
+ |----------|---------|-------------|
42
+ | `--rpl-color-drop-suggest-border` | `rgba(90, 150, 255, 0.9)` | Drop zone border color |
43
+ | `--rpl-color-drop-suggest-bg` | `rgba(90, 150, 255, 0.15)` | Drop zone background |
44
+ | `--rpl-color-tabdrag-bg` | `rgba(34, 36, 42, 0.95)` | Dragged tab background |
45
+ | `--rpl-color-tabdrag-fg` | `#e9ebf0` | Dragged tab text color |
46
+ | `--rpl-color-tabdrag-border` | `rgba(120, 160, 255, 0.6)` | Dragged tab border |
47
+ | `--rpl-color-tabdrag-shadow` | `0 6px 20px rgba(0, 0, 0, 0.35)` | Dragged tab shadow |
48
+ | `--rpl-color-insert-guide` | `rgba(120, 160, 255, 0.95)` | Tab insert guide color |
49
+ | `--rpl-color-insert-guide-shadow` | `0 0 0 2px rgba(120, 160, 255, 0.2)` | Insert guide shadow |
50
+
51
+ ### Sizing & Spacing
52
+
53
+ #### Tab Sizing
54
+
55
+ | Variable | Default | Description |
56
+ |----------|---------|-------------|
57
+ | `--rpl-size-tab-font` | `12px` | Tab font size |
58
+ | `--rpl-space-tab-padding-y` | `4px` | Tab vertical padding |
59
+ | `--rpl-space-tab-padding-x` | `8px` | Tab horizontal padding |
60
+
61
+ #### Tab Bar Spacing
62
+
63
+ | Variable | Default | Description |
64
+ |----------|---------|-------------|
65
+ | `--rpl-space-tabbar-gap` | `6px` | Gap between tabs |
66
+ | `--rpl-space-tabbar-padding-y` | `4px` | Tab bar vertical padding |
67
+ | `--rpl-space-tabbar-padding-x` | `6px` | Tab bar horizontal padding |
68
+
69
+ #### Border Radius
70
+
71
+ | Variable | Default | Description |
72
+ |----------|---------|-------------|
73
+ | `--rpl-radius-tab` | `4px` | Tab corner radius |
74
+ | `--rpl-radius-suggest` | `6px` | Drop suggestion corner radius |
75
+
76
+ #### Border Widths
77
+
78
+ | Variable | Default | Description |
79
+ |----------|---------|-------------|
80
+ | `--rpl-size-suggest-border` | `2px` | Drop suggestion border width |
81
+
82
+ #### Handle Thicknesses
83
+
84
+ | Variable | Default | Description |
85
+ |----------|---------|-------------|
86
+ | `--rpl-size-grid-handle-thickness` | `4px` | Grid track resize handle thickness |
87
+ | `--rpl-size-resize-handle-thickness` | `4px` | Component resize handle thickness |
88
+ | `--rpl-size-split-handle-thickness` | `6px` | Panel split handle thickness |
89
+
90
+ #### Padding
91
+
92
+ | Variable | Default | Description |
93
+ |----------|---------|-------------|
94
+ | `--rpl-space-drop-suggest-padding` | `6px` | Padding inside drop suggestion zone |
95
+
96
+ ### Z-Index
97
+
98
+ | Variable | Default | Description |
99
+ |----------|---------|-------------|
100
+ | `--rpl-z-overlay` | `9998` | Drop suggestion overlay z-index |
101
+ | `--rpl-z-tabdrag-overlay` | `9999` | Tab drag overlay z-index |
102
+
103
+ ### Pivot Animations
104
+
105
+ | Variable | Default | Description |
106
+ |----------|---------|-------------|
107
+ | `--rpl-pivot-animation-enter` | `none` | Animation when content becomes active |
108
+ | `--rpl-pivot-animation-leave` | `none` | Animation when content becomes inactive |
109
+
110
+ User defines `@keyframes` in their CSS and references via these tokens:
111
+
112
+ ```css
113
+ @keyframes pivotEnter {
114
+ from { opacity: 0; transform: translateY(8px); }
115
+ to { opacity: 1; transform: translateY(0); }
116
+ }
117
+
118
+ @keyframes pivotLeave {
119
+ from { opacity: 1; }
120
+ to { opacity: 0; }
121
+ }
122
+
123
+ :root {
124
+ --rpl-pivot-animation-enter: pivotEnter 150ms ease-out forwards;
125
+ --rpl-pivot-animation-leave: pivotLeave 150ms ease-out forwards;
126
+ }
127
+
128
+ ## Usage
129
+
130
+ ### Basic Import
131
+
132
+ ```tsx
133
+ import 'react-panel-layout/style.css'
134
+ ```
135
+
136
+ The CSS variables are automatically applied when you import the stylesheet.
137
+
138
+ ### Customizing Theme
139
+
140
+ Override CSS variables in your own stylesheet:
141
+
142
+ ```css
143
+ /* Override specific variables */
144
+ :root {
145
+ --rpl-color-primary: #ff6b6b;
146
+ --rpl-color-tab-active-bg: #3a3f4b;
147
+ --rpl-radius-tab: 8px;
148
+ }
149
+ ```
150
+
151
+ ### Scoped Theming
152
+
153
+ Apply different themes to different parts of your app:
154
+
155
+ ```css
156
+ /* Dark theme (default) */
157
+ .dark-theme {
158
+ --rpl-color-tabbar-bg: #1e1f24;
159
+ --rpl-color-panel-bg: #0b0b0c;
160
+ --rpl-color-panel-border: rgba(0, 0, 0, 0.3);
161
+ }
162
+
163
+ /* Light theme */
164
+ .light-theme {
165
+ --rpl-color-tabbar-bg: #f5f5f5;
166
+ --rpl-color-panel-bg: #ffffff;
167
+ --rpl-color-panel-border: rgba(0, 0, 0, 0.1);
168
+ --rpl-color-tab-fg: #1a1a1a;
169
+ --rpl-color-tab-active-bg: #e0e0e0;
170
+ }
171
+ ```
172
+
173
+ ```tsx
174
+ <div className="light-theme">
175
+ <PanelSystem {...props} />
176
+ </div>
177
+ ```
178
+
179
+ ## Examples
180
+
181
+ ### Example 1: Brand Colors
182
+
183
+ ```css
184
+ :root {
185
+ /* Use your brand primary color */
186
+ --rpl-color-primary: #7c3aed;
187
+ --rpl-color-tab-active-bg: #6d28d9;
188
+
189
+ /* Matching drop suggestions */
190
+ --rpl-color-drop-suggest-border: rgba(124, 58, 237, 0.9);
191
+ --rpl-color-drop-suggest-bg: rgba(124, 58, 237, 0.15);
192
+ }
193
+ ```
194
+
195
+ ### Example 2: Larger UI
196
+
197
+ ```css
198
+ :root {
199
+ /* Increase font size and spacing */
200
+ --rpl-size-tab-font: 14px;
201
+ --rpl-space-tab-padding-y: 6px;
202
+ --rpl-space-tab-padding-x: 12px;
203
+ --rpl-space-tabbar-gap: 8px;
204
+
205
+ /* Thicker handles for easier grabbing */
206
+ --rpl-size-split-handle-thickness: 8px;
207
+ --rpl-size-resize-handle-thickness: 6px;
208
+ }
209
+ ```
210
+
211
+ ### Example 3: Minimal Style
212
+
213
+ ```css
214
+ :root {
215
+ /* Remove rounded corners */
216
+ --rpl-radius-tab: 0;
217
+ --rpl-radius-suggest: 0;
218
+
219
+ /* Minimal spacing */
220
+ --rpl-space-tab-padding-y: 2px;
221
+ --rpl-space-tab-padding-x: 6px;
222
+ --rpl-space-tabbar-gap: 2px;
223
+
224
+ /* Subtle colors */
225
+ --rpl-color-panel-border: rgba(0, 0, 0, 0.1);
226
+ --rpl-color-primary: #666;
227
+ }
228
+ ```
229
+
230
+ ### Example 4: High Contrast
231
+
232
+ ```css
233
+ :root {
234
+ /* High contrast colors */
235
+ --rpl-color-tab-fg: #ffffff;
236
+ --rpl-color-tab-active-bg: #000000;
237
+ --rpl-color-tabbar-bg: #1a1a1a;
238
+ --rpl-color-panel-bg: #000000;
239
+ --rpl-color-panel-border: #ffffff;
240
+ --rpl-color-primary: #00ff00;
241
+
242
+ /* Thicker borders for visibility */
243
+ --rpl-size-suggest-border: 3px;
244
+ }
245
+ ```
246
+
247
+ ### Example 5: VS Code Theme
248
+
249
+ ```css
250
+ :root {
251
+ /* VS Code Dark+ colors */
252
+ --rpl-color-tabbar-bg: #2d2d30;
253
+ --rpl-color-tab-fg: #cccccc;
254
+ --rpl-color-tab-active-bg: #1e1e1e;
255
+ --rpl-color-panel-bg: #1e1e1e;
256
+ --rpl-color-panel-border: #3e3e42;
257
+ --rpl-color-primary: #007acc;
258
+
259
+ /* VS Code tab styling */
260
+ --rpl-size-tab-font: 13px;
261
+ --rpl-space-tab-padding-y: 8px;
262
+ --rpl-space-tab-padding-x: 10px;
263
+ --rpl-radius-tab: 0;
264
+ }
265
+ ```
266
+
267
+ ## Best Practices
268
+
269
+ ### 1. Use CSS Custom Properties for Dynamic Themes
270
+
271
+ ```css
272
+ /* Define theme tokens */
273
+ .app {
274
+ --brand-primary: #3b82f6;
275
+ --surface-1: #1f2937;
276
+ --surface-2: #111827;
277
+ }
278
+
279
+ /* Map to panel tokens */
280
+ :root {
281
+ --rpl-color-primary: var(--brand-primary);
282
+ --rpl-color-tabbar-bg: var(--surface-1);
283
+ --rpl-color-panel-bg: var(--surface-2);
284
+ }
285
+ ```
286
+
287
+ ### 2. Respect User Preferences
288
+
289
+ ```css
290
+ @media (prefers-color-scheme: light) {
291
+ :root {
292
+ --rpl-color-tabbar-bg: #f5f5f5;
293
+ --rpl-color-panel-bg: #ffffff;
294
+ --rpl-color-tab-fg: #1a1a1a;
295
+ /* ... other light theme colors */
296
+ }
297
+ }
298
+
299
+ @media (prefers-color-scheme: dark) {
300
+ :root {
301
+ --rpl-color-tabbar-bg: #1e1f24;
302
+ --rpl-color-panel-bg: #0b0b0c;
303
+ --rpl-color-tab-fg: #d5d7de;
304
+ /* ... other dark theme colors */
305
+ }
306
+ }
307
+ ```
308
+
309
+ ### 3. Layer Your Customizations
310
+
311
+ ```css
312
+ /* Base layer - application defaults */
313
+ :root {
314
+ --rpl-color-primary: #3b82f6;
315
+ }
316
+
317
+ /* Component layer - specific component overrides */
318
+ .editor-panels {
319
+ --rpl-color-panel-bg: #1a1a1a;
320
+ --rpl-size-tab-font: 11px;
321
+ }
322
+
323
+ /* State layer - interactive states */
324
+ .editor-panels[data-focus="true"] {
325
+ --rpl-color-panel-border: var(--rpl-color-primary);
326
+ }
327
+ ```
328
+
329
+ ## Troubleshooting
330
+
331
+ ### Theme Not Applying
332
+
333
+ Make sure you're importing the CSS:
334
+
335
+ ```tsx
336
+ import 'react-panel-layout/style.css'
337
+ ```
338
+
339
+ ### Variables Not Working
340
+
341
+ Check that your CSS variables are defined before the component mounts:
342
+
343
+ ```html
344
+ <!-- ❌ Wrong - overrides loaded after component -->
345
+ <PanelSystem />
346
+ <link rel="stylesheet" href="custom-theme.css">
347
+
348
+ <!-- ✅ Correct - overrides loaded before component -->
349
+ <link rel="stylesheet" href="custom-theme.css">
350
+ <PanelSystem />
351
+ ```
352
+
353
+ ### Specificity Issues
354
+
355
+ If variables aren't applying, check CSS specificity:
356
+
357
+ ```css
358
+ /* ❌ May not work if overridden */
359
+ .my-theme {
360
+ --rpl-color-primary: red;
361
+ }
362
+
363
+ /* ✅ Higher specificity */
364
+ .app .my-theme {
365
+ --rpl-color-primary: red;
366
+ }
367
+
368
+ /* ✅ Or use :root for global */
369
+ :root {
370
+ --rpl-color-primary: red;
371
+ }
372
+ ```
373
+
374
+ ## Migration from v0.0.x
375
+
376
+ Previous versions used a `themeTokens` prop on `PanelThemeProvider`. This has been removed in favor of CSS variables.
377
+
378
+ **Before:**
379
+ ```tsx
380
+ <PanelThemeProvider tokens={{
381
+ colorPrimary: '#ff6b6b',
382
+ splitHandleThickness: 8
383
+ }}>
384
+ <PanelSystem {...props} />
385
+ </PanelThemeProvider>
386
+ ```
387
+
388
+ **After:**
389
+ ```css
390
+ :root {
391
+ --rpl-color-primary: #ff6b6b;
392
+ --rpl-size-split-handle-thickness: 8px;
393
+ }
394
+ ```
395
+
396
+ ```tsx
397
+ <PanelSystem {...props} />
398
+ ```
399
+
400
+ Benefits:
401
+ - ✅ No extra provider needed
402
+ - ✅ Better performance (no React re-renders for theme changes)
403
+ - ✅ Standard CSS - works with any CSS preprocessor
404
+ - ✅ Easier to override with media queries
405
+ - ✅ Smaller bundle size
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-panel-layout",
3
- "version": "0.5.2",
3
+ "version": "0.6.1",
4
4
  "license": "Unlicense",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -11,9 +11,6 @@
11
11
  "type": "git",
12
12
  "url": "git+https://github.com/trkbt10/react-panel-layout.git"
13
13
  },
14
- "sideEffects": [
15
- "**/*.css"
16
- ],
17
14
  "exports": {
18
15
  ".": {
19
16
  "types": "./dist/index.d.ts",
@@ -40,9 +37,41 @@
40
37
  "import": "./dist/sticky-header.js",
41
38
  "require": "./dist/sticky-header.cjs"
42
39
  },
40
+ "./stack": {
41
+ "types": "./dist/stack/index.d.ts",
42
+ "import": "./dist/stack.js",
43
+ "require": "./dist/stack.cjs"
44
+ },
45
+ "./resizer": {
46
+ "types": "./dist/resizer/index.d.ts",
47
+ "import": "./dist/resizer.js",
48
+ "require": "./dist/resizer.cjs"
49
+ },
50
+ "./grid": {
51
+ "types": "./dist/grid/index.d.ts",
52
+ "import": "./dist/grid.js",
53
+ "require": "./dist/grid.cjs"
54
+ },
55
+ "./window": {
56
+ "types": "./dist/window/index.d.ts",
57
+ "import": "./dist/window.js",
58
+ "require": "./dist/window.cjs"
59
+ },
60
+ "./panels": {
61
+ "types": "./dist/panels/index.d.ts",
62
+ "import": "./dist/panels.js",
63
+ "require": "./dist/panels.cjs"
64
+ },
65
+ "./dialog": {
66
+ "types": "./dist/dialog/index.d.ts",
67
+ "import": "./dist/dialog.js",
68
+ "require": "./dist/dialog.cjs"
69
+ },
43
70
  "./package.json": "./package.json"
44
71
  },
45
72
  "files": [
73
+ "src",
74
+ "docs",
46
75
  "dist",
47
76
  "README.md"
48
77
  ],
@@ -80,6 +109,7 @@
80
109
  "react-icons": "^5.5.0",
81
110
  "react-router": "^7.9.4",
82
111
  "rimraf": "^6.0.1",
112
+ "shiki": "^3.20.0",
83
113
  "typescript": "^5.9.3",
84
114
  "typescript-eslint": "^8.46.2",
85
115
  "vite": "^7.1.12",