@puzzle-ui/ui 0.3.0 → 0.5.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 (240) hide show
  1. package/README.md +70 -70
  2. package/dist/components/actions/button/button.css +5 -2
  3. package/dist/components/actions/button-group/button-group.css +16 -17
  4. package/dist/components/data-display/badge/badge.css +15 -2
  5. package/dist/components/data-display/badge/index.cjs +13 -2
  6. package/dist/components/data-display/badge/index.cjs.map +1 -1
  7. package/dist/components/data-display/badge/index.d.cts +7 -2
  8. package/dist/components/data-display/badge/index.d.ts +7 -2
  9. package/dist/components/data-display/badge/index.js +13 -2
  10. package/dist/components/data-display/badge/index.js.map +1 -1
  11. package/dist/components/data-display/empty-state/empty-state.css +128 -0
  12. package/dist/components/data-display/empty-state/empty-state.utils.cjs +6 -0
  13. package/dist/components/data-display/empty-state/empty-state.utils.cjs.map +1 -0
  14. package/dist/components/data-display/empty-state/empty-state.utils.js +6 -0
  15. package/dist/components/data-display/empty-state/empty-state.utils.js.map +1 -0
  16. package/dist/components/data-display/empty-state/index.cjs +49 -0
  17. package/dist/components/data-display/empty-state/index.cjs.map +1 -0
  18. package/dist/components/data-display/empty-state/index.d.cts +19 -0
  19. package/dist/components/data-display/empty-state/index.d.ts +19 -0
  20. package/dist/components/data-display/empty-state/index.js +44 -0
  21. package/dist/components/data-display/empty-state/index.js.map +1 -0
  22. package/dist/components/data-display/rating/index.cjs +84 -0
  23. package/dist/components/data-display/rating/index.cjs.map +1 -0
  24. package/dist/components/data-display/rating/index.d.cts +3 -0
  25. package/dist/components/data-display/rating/index.d.ts +3 -0
  26. package/dist/components/data-display/rating/index.js +84 -0
  27. package/dist/components/data-display/rating/index.js.map +1 -0
  28. package/dist/components/data-display/rating/rating.css +72 -0
  29. package/dist/components/data-display/rating/rating.types.d.cts +15 -0
  30. package/dist/components/data-display/rating/rating.types.d.ts +15 -0
  31. package/dist/components/data-display/rating/rating.utils.cjs +27 -0
  32. package/dist/components/data-display/rating/rating.utils.cjs.map +1 -0
  33. package/dist/components/data-display/rating/rating.utils.js +25 -0
  34. package/dist/components/data-display/rating/rating.utils.js.map +1 -0
  35. package/dist/components/editors/text-editor/editor.cjs.map +1 -1
  36. package/dist/components/editors/text-editor/editor.js.map +1 -1
  37. package/dist/components/editors/text-editor/text-document.cjs.map +1 -1
  38. package/dist/components/editors/text-editor/text-document.js.map +1 -1
  39. package/dist/components/editors/text-editor/text-parser.cjs.map +1 -1
  40. package/dist/components/editors/text-editor/text-parser.js.map +1 -1
  41. package/dist/components/editors/text-editor/text-renderer.cjs.map +1 -1
  42. package/dist/components/editors/text-editor/text-renderer.js.map +1 -1
  43. package/dist/components/forms/autocomplete/index.cjs.map +1 -1
  44. package/dist/components/forms/autocomplete/index.js.map +1 -1
  45. package/dist/components/forms/checkbox/checkbox.css +2 -10
  46. package/dist/components/forms/color-picker/color-picker.css +351 -0
  47. package/dist/components/forms/color-picker/color-picker.types.d.cts +25 -0
  48. package/dist/components/forms/color-picker/color-picker.types.d.ts +25 -0
  49. package/dist/components/forms/color-picker/color-picker.utils.cjs +116 -0
  50. package/dist/components/forms/color-picker/color-picker.utils.cjs.map +1 -0
  51. package/dist/components/forms/color-picker/color-picker.utils.js +109 -0
  52. package/dist/components/forms/color-picker/color-picker.utils.js.map +1 -0
  53. package/dist/components/forms/color-picker/index.cjs +340 -0
  54. package/dist/components/forms/color-picker/index.cjs.map +1 -0
  55. package/dist/components/forms/color-picker/index.d.cts +3 -0
  56. package/dist/components/forms/color-picker/index.d.ts +3 -0
  57. package/dist/components/forms/color-picker/index.js +340 -0
  58. package/dist/components/forms/color-picker/index.js.map +1 -0
  59. package/dist/components/forms/file-upload/file-upload.utils.cjs.map +1 -1
  60. package/dist/components/forms/file-upload/file-upload.utils.js.map +1 -1
  61. package/dist/components/forms/input/number-input.js +5 -5
  62. package/dist/components/forms/input/number-input.js.map +1 -1
  63. package/dist/components/forms/input-group/index.d.cts +3 -0
  64. package/dist/components/forms/input-group/index.d.ts +3 -0
  65. package/dist/components/forms/input-group/input-group.cjs +18 -0
  66. package/dist/components/forms/input-group/input-group.cjs.map +1 -0
  67. package/dist/components/forms/input-group/input-group.css +62 -0
  68. package/dist/components/forms/input-group/input-group.d.cts +7 -0
  69. package/dist/components/forms/input-group/input-group.d.ts +7 -0
  70. package/dist/components/forms/input-group/input-group.js +18 -0
  71. package/dist/components/forms/input-group/input-group.js.map +1 -0
  72. package/dist/components/forms/input-group/input-group.types.d.cts +7 -0
  73. package/dist/components/forms/input-group/input-group.types.d.ts +7 -0
  74. package/dist/components/forms/input-group/input-group.utils.cjs +5 -0
  75. package/dist/components/forms/input-group/input-group.utils.cjs.map +1 -0
  76. package/dist/components/forms/input-group/input-group.utils.js +5 -0
  77. package/dist/components/forms/input-group/input-group.utils.js.map +1 -0
  78. package/dist/components/forms/radio-group/index.d.cts +2 -1
  79. package/dist/components/forms/radio-group/index.d.ts +2 -1
  80. package/dist/components/forms/select/index.cjs.map +1 -1
  81. package/dist/components/forms/select/index.js.map +1 -1
  82. package/dist/components/forms/slider/index.cjs +1 -1
  83. package/dist/components/forms/slider/index.cjs.map +1 -1
  84. package/dist/components/forms/slider/index.js +1 -1
  85. package/dist/components/forms/slider/index.js.map +1 -1
  86. package/dist/components/forms/stepper/index.d.cts +4 -2
  87. package/dist/components/forms/stepper/index.d.ts +4 -2
  88. package/dist/components/forms/time-picker/index.cjs +108 -0
  89. package/dist/components/forms/time-picker/index.cjs.map +1 -0
  90. package/dist/components/forms/time-picker/index.d.cts +3 -0
  91. package/dist/components/forms/time-picker/index.d.ts +3 -0
  92. package/dist/components/forms/time-picker/index.js +108 -0
  93. package/dist/components/forms/time-picker/index.js.map +1 -0
  94. package/dist/components/forms/time-picker/time-picker.css +166 -0
  95. package/dist/components/forms/time-picker/time-picker.types.d.cts +34 -0
  96. package/dist/components/forms/time-picker/time-picker.types.d.ts +34 -0
  97. package/dist/components/forms/time-picker/time-picker.utils.cjs +25 -0
  98. package/dist/components/forms/time-picker/time-picker.utils.cjs.map +1 -0
  99. package/dist/components/forms/time-picker/time-picker.utils.js +24 -0
  100. package/dist/components/forms/time-picker/time-picker.utils.js.map +1 -0
  101. package/dist/components/forms/token-input/index.cjs +189 -0
  102. package/dist/components/forms/token-input/index.cjs.map +1 -0
  103. package/dist/components/forms/token-input/index.d.cts +3 -0
  104. package/dist/components/forms/token-input/index.d.ts +3 -0
  105. package/dist/components/forms/token-input/index.js +189 -0
  106. package/dist/components/forms/token-input/index.js.map +1 -0
  107. package/dist/components/forms/token-input/token-input.css +145 -0
  108. package/dist/components/forms/token-input/token-input.types.d.cts +48 -0
  109. package/dist/components/forms/token-input/token-input.types.d.ts +48 -0
  110. package/dist/components/forms/token-input/token-input.utils.cjs +30 -0
  111. package/dist/components/forms/token-input/token-input.utils.cjs.map +1 -0
  112. package/dist/components/forms/token-input/token-input.utils.js +24 -0
  113. package/dist/components/forms/token-input/token-input.utils.js.map +1 -0
  114. package/dist/components/layout/aspect-ratio/aspect-ratio.css +14 -0
  115. package/dist/components/layout/aspect-ratio/aspect-ratio.utils.cjs +11 -0
  116. package/dist/components/layout/aspect-ratio/aspect-ratio.utils.cjs.map +1 -0
  117. package/dist/components/layout/aspect-ratio/aspect-ratio.utils.js +11 -0
  118. package/dist/components/layout/aspect-ratio/aspect-ratio.utils.js.map +1 -0
  119. package/dist/components/layout/aspect-ratio/index.cjs +16 -0
  120. package/dist/components/layout/aspect-ratio/index.cjs.map +1 -0
  121. package/dist/components/layout/aspect-ratio/index.d.cts +11 -0
  122. package/dist/components/layout/aspect-ratio/index.d.ts +11 -0
  123. package/dist/components/layout/aspect-ratio/index.js +16 -0
  124. package/dist/components/layout/aspect-ratio/index.js.map +1 -0
  125. package/dist/components/layout/container/container.css +1 -0
  126. package/dist/components/layout/page-layout/page-layout.css +1 -0
  127. package/dist/components/layout/resizable-panels/index.cjs +1 -1
  128. package/dist/components/layout/resizable-panels/index.cjs.map +1 -1
  129. package/dist/components/layout/resizable-panels/index.js +1 -1
  130. package/dist/components/layout/resizable-panels/index.js.map +1 -1
  131. package/dist/components/layout/resizable-panels/resizable-panels.utils.cjs.map +1 -1
  132. package/dist/components/layout/resizable-panels/resizable-panels.utils.js.map +1 -1
  133. package/dist/components/layout/scroll-area/index.cjs +27 -0
  134. package/dist/components/layout/scroll-area/index.cjs.map +1 -0
  135. package/dist/components/layout/scroll-area/index.d.cts +15 -0
  136. package/dist/components/layout/scroll-area/index.d.ts +15 -0
  137. package/dist/components/layout/scroll-area/index.js +27 -0
  138. package/dist/components/layout/scroll-area/index.js.map +1 -0
  139. package/dist/components/layout/scroll-area/scroll-area.css +25 -0
  140. package/dist/components/layout/scroll-area/scroll-area.utils.cjs +8 -0
  141. package/dist/components/layout/scroll-area/scroll-area.utils.cjs.map +1 -0
  142. package/dist/components/layout/scroll-area/scroll-area.utils.d.cts +2 -0
  143. package/dist/components/layout/scroll-area/scroll-area.utils.d.ts +2 -0
  144. package/dist/components/layout/scroll-area/scroll-area.utils.js +8 -0
  145. package/dist/components/layout/scroll-area/scroll-area.utils.js.map +1 -0
  146. package/dist/components/layout/section/index.cjs +10 -4
  147. package/dist/components/layout/section/index.cjs.map +1 -1
  148. package/dist/components/layout/section/index.d.cts +1 -1
  149. package/dist/components/layout/section/index.d.ts +1 -1
  150. package/dist/components/layout/section/index.js +11 -5
  151. package/dist/components/layout/section/index.js.map +1 -1
  152. package/dist/components/layout/section/section.css +9 -3
  153. package/dist/components/layout/section/types.d.cts +5 -5
  154. package/dist/components/layout/section/types.d.ts +5 -5
  155. package/dist/components/layout/separator/index.cjs +18 -0
  156. package/dist/components/layout/separator/index.cjs.map +1 -0
  157. package/dist/components/layout/separator/index.d.cts +17 -0
  158. package/dist/components/layout/separator/index.d.ts +17 -0
  159. package/dist/components/layout/separator/index.js +18 -0
  160. package/dist/components/layout/separator/index.js.map +1 -0
  161. package/dist/components/layout/separator/separator.css +15 -0
  162. package/dist/components/layout/separator/separator.utils.cjs +11 -0
  163. package/dist/components/layout/separator/separator.utils.cjs.map +1 -0
  164. package/dist/components/layout/separator/separator.utils.d.cts +2 -0
  165. package/dist/components/layout/separator/separator.utils.d.ts +2 -0
  166. package/dist/components/layout/separator/separator.utils.js +11 -0
  167. package/dist/components/layout/separator/separator.utils.js.map +1 -0
  168. package/dist/components/layout/stack/index.cjs +18 -2
  169. package/dist/components/layout/stack/index.cjs.map +1 -1
  170. package/dist/components/layout/stack/index.d.cts +8 -6
  171. package/dist/components/layout/stack/index.d.ts +8 -6
  172. package/dist/components/layout/stack/index.js +18 -2
  173. package/dist/components/layout/stack/index.js.map +1 -1
  174. package/dist/components/layout/stack/stack.css +118 -138
  175. package/dist/components/navigation/accordion/index.cjs.map +1 -1
  176. package/dist/components/navigation/accordion/index.js.map +1 -1
  177. package/dist/components/navigation/carousel/index.cjs +5 -2
  178. package/dist/components/navigation/carousel/index.cjs.map +1 -1
  179. package/dist/components/navigation/carousel/index.js +5 -2
  180. package/dist/components/navigation/carousel/index.js.map +1 -1
  181. package/dist/components/navigation/pagination/index.cjs +146 -0
  182. package/dist/components/navigation/pagination/index.cjs.map +1 -0
  183. package/dist/components/navigation/pagination/index.d.cts +3 -0
  184. package/dist/components/navigation/pagination/index.d.ts +3 -0
  185. package/dist/components/navigation/pagination/index.js +146 -0
  186. package/dist/components/navigation/pagination/index.js.map +1 -0
  187. package/dist/components/navigation/pagination/pagination.css +134 -0
  188. package/dist/components/navigation/pagination/pagination.types.d.cts +38 -0
  189. package/dist/components/navigation/pagination/pagination.types.d.ts +38 -0
  190. package/dist/components/navigation/pagination/pagination.utils.cjs +54 -0
  191. package/dist/components/navigation/pagination/pagination.utils.cjs.map +1 -0
  192. package/dist/components/navigation/pagination/pagination.utils.js +53 -0
  193. package/dist/components/navigation/pagination/pagination.utils.js.map +1 -0
  194. package/dist/components/navigation/tabs/index.d.cts +3 -2
  195. package/dist/components/navigation/tabs/index.d.ts +3 -2
  196. package/dist/components/navigation/tree-view/index.cjs.map +1 -1
  197. package/dist/components/navigation/tree-view/index.js.map +1 -1
  198. package/dist/components/overlays/context-menu/context-menu.css +151 -0
  199. package/dist/components/overlays/context-menu/context-menu.types.d.cts +69 -0
  200. package/dist/components/overlays/context-menu/context-menu.types.d.ts +69 -0
  201. package/dist/components/overlays/context-menu/context-menu.utils.cjs +46 -0
  202. package/dist/components/overlays/context-menu/context-menu.utils.cjs.map +1 -0
  203. package/dist/components/overlays/context-menu/context-menu.utils.js +40 -0
  204. package/dist/components/overlays/context-menu/context-menu.utils.js.map +1 -0
  205. package/dist/components/overlays/context-menu/index.cjs +830 -0
  206. package/dist/components/overlays/context-menu/index.cjs.map +1 -0
  207. package/dist/components/overlays/context-menu/index.d.cts +42 -0
  208. package/dist/components/overlays/context-menu/index.d.ts +42 -0
  209. package/dist/components/overlays/context-menu/index.js +818 -0
  210. package/dist/components/overlays/context-menu/index.js.map +1 -0
  211. package/dist/components/overlays/dropdown-menu/dropdown-menu-content.cjs.map +1 -1
  212. package/dist/components/overlays/dropdown-menu/dropdown-menu-content.js.map +1 -1
  213. package/dist/components/overlays/dropdown-menu/dropdown-menu.utils.cjs.map +1 -1
  214. package/dist/components/overlays/dropdown-menu/dropdown-menu.utils.js.map +1 -1
  215. package/dist/components/typography/heading.cjs +6 -2
  216. package/dist/components/typography/heading.cjs.map +1 -1
  217. package/dist/components/typography/heading.d.cts +3 -2
  218. package/dist/components/typography/heading.d.ts +3 -2
  219. package/dist/components/typography/heading.js +6 -2
  220. package/dist/components/typography/heading.js.map +1 -1
  221. package/dist/components/typography/text.cjs +6 -2
  222. package/dist/components/typography/text.cjs.map +1 -1
  223. package/dist/components/typography/text.d.cts +3 -2
  224. package/dist/components/typography/text.d.ts +3 -2
  225. package/dist/components/typography/text.js +6 -2
  226. package/dist/components/typography/text.js.map +1 -1
  227. package/dist/components/utilities/preview/index.cjs +89 -21
  228. package/dist/components/utilities/preview/index.cjs.map +1 -1
  229. package/dist/components/utilities/preview/index.d.cts +6 -2
  230. package/dist/components/utilities/preview/index.d.ts +6 -2
  231. package/dist/components/utilities/preview/index.js +89 -21
  232. package/dist/components/utilities/preview/index.js.map +1 -1
  233. package/dist/components/utilities/preview/preview.css +26 -11
  234. package/dist/components/utilities/transition/index.d.cts +1 -1
  235. package/dist/components/utilities/transition/index.d.ts +1 -1
  236. package/dist/index.cjs +136 -97
  237. package/dist/index.d.cts +23 -2
  238. package/dist/index.d.ts +23 -2
  239. package/dist/index.js +12 -1
  240. package/package.json +7 -6
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/layout/resizable-panels/index.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"@puzzle-ui/core\";\n\nimport {\n Children,\n cloneElement,\n isValidElement,\n useId,\n useRef,\n useState,\n type ComponentPropsWithRef,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactElement,\n type ReactNode,\n} from \"react\";\n\nimport {\n getPanelPairBounds,\n normalizePanelSizes,\n resizePanelPair,\n type PanelSizeConstraint,\n} from \"./resizable-panels.utils\";\n\nimport \"./resizable-panels.css\";\n\ntype ResizablePanelsOrientation = \"horizontal\" | \"vertical\";\n\ntype ResizablePanelsProps = Omit<ComponentPropsWithRef<\"div\">, \"children\"> & {\n /** Layout direction. Defaults to horizontal. */\n orientation?: ResizablePanelsOrientation;\n\n /** Controlled panel sizes, expressed as percentages. */\n sizes?: readonly number[];\n\n /** Initial panel sizes for uncontrolled usage. */\n defaultSizes?: readonly number[];\n\n /** Called whenever the panel layout changes. */\n onSizesChange?: (sizes: number[]) => void;\n\n /** Disables all resizing interactions. */\n disabled?: boolean;\n\n /** Percentage change per keyboard interaction. Defaults to 1. */\n keyboardStep?: number;\n\n /** Panels and handles that make up the group. */\n children: ReactNode;\n};\n\ntype ResizablePanelProps = ComponentPropsWithRef<\"div\"> & {\n /** Minimum panel size in percentages. Defaults to 0. */\n minSize?: number;\n\n /** Maximum panel size in percentages. Defaults to 100. */\n maxSize?: number;\n};\n\ntype ResizableHandleProps = ComponentPropsWithRef<\"div\"> & {\n /** Renders a visible grip inside the resize handle. */\n withGrip?: boolean;\n\n /** Disables resizing through this handle. */\n disabled?: boolean;\n};\n\ntype ResizePointerHandler = (\n event: ReactPointerEvent<HTMLDivElement>,\n handleIndex: number,\n) => void;\n\ntype ResizeKeyboardHandler = (\n event: ReactKeyboardEvent<HTMLDivElement>,\n handleIndex: number,\n) => void;\n\ntype InternalResizablePanelProps = {\n panelIndex?: number;\n panelSize?: number;\n panelId?: string;\n};\n\ntype InternalResizableHandleProps = {\n handleIndex?: number;\n orientation?: ResizablePanelsOrientation;\n value?: number;\n minValue?: number;\n maxValue?: number;\n panelIds?: [string, string];\n inheritedDisabled?: boolean;\n\n onResizeStart?: ResizePointerHandler;\n onResizeMove?: ResizePointerHandler;\n onResizeEnd?: ResizePointerHandler;\n onResizeKeyDown?: ResizeKeyboardHandler;\n};\n\ntype PointerDragState = {\n handleIndex: number;\n pointerId: number;\n startCoordinate: number;\n availableSize: number;\n direction: number;\n sizes: number[];\n};\n\nconst isResizablePanelElement = (\n child: ReactNode,\n): child is ReactElement<ResizablePanelProps> =>\n isValidElement(child) && child.type === ResizablePanel;\n\nconst isResizableHandleElement = (\n child: ReactNode,\n): child is ReactElement<ResizableHandleProps> =>\n isValidElement(child) && child.type === ResizableHandle;\n\nconst parsePixels = (value: string | undefined) =>\n Number.parseFloat(value ?? \"\") || 0;\n\nconst getAvailableSize = (\n group: HTMLDivElement,\n orientation: ResizablePanelsOrientation,\n) => {\n const computedStyle =\n group.ownerDocument.defaultView?.getComputedStyle(group);\n\n const isHorizontal = orientation === \"horizontal\";\n\n const totalSize = isHorizontal ? group.clientWidth : group.clientHeight;\n\n const paddingSize = computedStyle\n ? isHorizontal\n ? parsePixels(computedStyle.paddingLeft) +\n parsePixels(computedStyle.paddingRight)\n : parsePixels(computedStyle.paddingTop) +\n parsePixels(computedStyle.paddingBottom)\n : 0;\n\n const handleSize = Array.from(group.children).reduce((total, child) => {\n const element = child as HTMLElement;\n\n if (!element.hasAttribute(\"data-puzzle-resizable-handle\")) {\n return total;\n }\n\n const rect = element.getBoundingClientRect();\n\n return total + (isHorizontal ? rect.width : rect.height);\n }, 0);\n\n return Math.max(0, totalSize - paddingSize - handleSize);\n};\n\nconst getResizeDirection = (\n element: HTMLElement,\n orientation: ResizablePanelsOrientation,\n) => {\n if (orientation !== \"horizontal\") {\n return 1;\n }\n\n const direction =\n element.ownerDocument.defaultView?.getComputedStyle(element).direction;\n\n return direction === \"rtl\" ? -1 : 1;\n};\n\nconst getPointerCoordinate = (\n event: ReactPointerEvent<HTMLDivElement>,\n orientation: ResizablePanelsOrientation,\n) => (orientation === \"horizontal\" ? event.clientX : event.clientY);\n\nconst ResizablePanel = ({\n id,\n minSize = 0,\n maxSize = 100,\n panelIndex = 0,\n panelSize = 1,\n panelId,\n className,\n style,\n ...props\n}: ResizablePanelProps & InternalResizablePanelProps) => (\n <div\n {...props}\n id={panelId ?? id}\n className={cn(\"puzzle-resizable-panels__panel\", className)}\n style={{\n ...style,\n flex: `${panelSize} 1 0%`,\n }}\n data-panel-index={panelIndex}\n data-panel-size={panelSize}\n data-panel-min-size={minSize}\n data-panel-max-size={maxSize}\n />\n);\n\nconst ResizableHandle = ({\n withGrip = false,\n disabled = false,\n handleIndex = -1,\n orientation = \"horizontal\",\n value,\n minValue,\n maxValue,\n panelIds,\n inheritedDisabled = false,\n onResizeStart,\n onResizeMove,\n onResizeEnd,\n onResizeKeyDown,\n onPointerDown,\n onPointerMove,\n onPointerUp,\n onPointerCancel,\n onLostPointerCapture,\n onKeyDown,\n className,\n children,\n tabIndex,\n \"aria-label\": ariaLabel,\n ...props\n}: ResizableHandleProps & InternalResizableHandleProps) => {\n const isDisabled = disabled || inheritedDisabled;\n\n const handlePointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n onPointerDown?.(event);\n\n if (!event.defaultPrevented && !isDisabled) {\n onResizeStart?.(event, handleIndex);\n }\n };\n\n const handlePointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n onPointerMove?.(event);\n\n if (!event.defaultPrevented && !isDisabled) {\n onResizeMove?.(event, handleIndex);\n }\n };\n\n const handlePointerUp = (event: ReactPointerEvent<HTMLDivElement>) => {\n onResizeEnd?.(event, handleIndex);\n onPointerUp?.(event);\n };\n\n const handlePointerCancel = (event: ReactPointerEvent<HTMLDivElement>) => {\n onResizeEnd?.(event, handleIndex);\n onPointerCancel?.(event);\n };\n\n const handleLostPointerCapture = (\n event: ReactPointerEvent<HTMLDivElement>,\n ) => {\n onResizeEnd?.(event, handleIndex);\n onLostPointerCapture?.(event);\n };\n\n const handleKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n\n if (!event.defaultPrevented && !isDisabled) {\n onResizeKeyDown?.(event, handleIndex);\n }\n };\n\n return (\n <div\n {...props}\n className={cn(\"puzzle-resizable-panels__handle\", className)}\n role=\"separator\"\n tabIndex={isDisabled ? -1 : (tabIndex ?? 0)}\n aria-label={ariaLabel ?? \"Resize panels\"}\n aria-orientation={\n orientation === \"horizontal\" ? \"vertical\" : \"horizontal\"\n }\n aria-controls={panelIds?.join(\" \")}\n aria-valuenow={value}\n aria-valuemin={minValue}\n aria-valuemax={maxValue}\n aria-valuetext={\n value === undefined ? undefined : `${Math.round(value * 100) / 100}%`\n }\n aria-disabled={isDisabled || undefined}\n data-puzzle-resizable-handle=\"\"\n data-orientation={orientation}\n data-disabled={isDisabled ? \"true\" : undefined}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerCancel}\n onLostPointerCapture={handleLostPointerCapture}\n onKeyDown={handleKeyDown}\n >\n {withGrip ? (\n <span\n className=\"puzzle-resizable-panels__handle-grip\"\n aria-hidden=\"true\"\n />\n ) : (\n children\n )}\n </div>\n );\n};\n\nconst ResizablePanelsRoot = ({\n children,\n orientation = \"horizontal\",\n sizes,\n defaultSizes,\n onSizesChange,\n disabled = false,\n keyboardStep = 1,\n id,\n role,\n className,\n style,\n ref: forwardedRef,\n ...rootProps\n}: ResizablePanelsProps) => {\n const generatedId = useId();\n\n const groupId = id ?? `puzzle-resizable-panels-${generatedId}`;\n\n if (!Number.isFinite(keyboardStep) || keyboardStep <= 0) {\n throw new RangeError(\"keyboardStep must be a positive finite number.\");\n }\n\n const childrenArray = Children.toArray(children);\n\n const validChildren =\n childrenArray.length >= 3 &&\n childrenArray.length % 2 === 1 &&\n childrenArray.every((child, index) =>\n index % 2 === 0\n ? isResizablePanelElement(child)\n : isResizableHandleElement(child),\n );\n\n if (!validChildren) {\n throw new Error(\n \"ResizablePanels requires alternating Panel and Handle children, starting and ending with a Panel. At least two panels are required.\",\n );\n }\n\n const panelElements = childrenArray.filter(isResizablePanelElement);\n\n const panelCount = panelElements.length;\n\n const panelConstraints: PanelSizeConstraint[] = panelElements.map(\n (panel) => ({\n minSize: panel.props.minSize,\n maxSize: panel.props.maxSize,\n }),\n );\n\n const panelIds = panelElements.map(\n (panel, index) => panel.props.id ?? `${groupId}-panel-${index}`,\n );\n\n if (new Set(panelIds).size !== panelIds.length) {\n throw new Error(\"ResizablePanels requires unique panel IDs.\");\n }\n\n const [uncontrolledSizes, setUncontrolledSizes] = useState<number[]>(() =>\n normalizePanelSizes(\n sizes === undefined ? defaultSizes : undefined,\n panelConstraints,\n ),\n );\n\n const layoutInput =\n sizes ??\n (uncontrolledSizes.length === panelCount ? uncontrolledSizes : undefined);\n\n const currentSizes = normalizePanelSizes(layoutInput, panelConstraints);\n\n const [isResizing, setIsResizing] = useState(false);\n\n const groupRef = useRef<HTMLDivElement | null>(null);\n\n const pointerDragRef = useRef<PointerDragState | null>(null);\n\n const updateSizes = (nextSizes: readonly number[]) => {\n const normalized = normalizePanelSizes(nextSizes, panelConstraints);\n\n const hasChanged = normalized.some(\n (size, index) => Math.abs(size - currentSizes[index]) > 0.000001,\n );\n\n if (!hasChanged) {\n return;\n }\n\n if (sizes === undefined) {\n setUncontrolledSizes(normalized);\n }\n\n onSizesChange?.(normalized);\n };\n\n const handlePointerDown: ResizePointerHandler = (event, handleIndex) => {\n const group = groupRef.current;\n\n if (!group || disabled) {\n return;\n }\n\n if (\n event.button !== 0 &&\n event.pointerType !== \"touch\" &&\n event.pointerType !== \"pen\"\n ) {\n return;\n }\n\n const availableSize = getAvailableSize(group, orientation);\n\n if (availableSize <= 0) {\n return;\n }\n\n pointerDragRef.current = {\n handleIndex,\n pointerId: event.pointerId,\n startCoordinate: getPointerCoordinate(event, orientation),\n availableSize,\n direction: getResizeDirection(group, orientation),\n sizes: [...currentSizes],\n };\n\n try {\n event.currentTarget.setPointerCapture(event.pointerId);\n } catch {\n // Synthetic pointer events and detached elements may not\n // support pointer capture.\n }\n\n event.preventDefault();\n setIsResizing(true);\n };\n\n const handlePointerMove: ResizePointerHandler = (event, handleIndex) => {\n const drag = pointerDragRef.current;\n\n if (\n !drag ||\n drag.pointerId !== event.pointerId ||\n drag.handleIndex !== handleIndex\n ) {\n return;\n }\n\n const currentCoordinate = getPointerCoordinate(event, orientation);\n\n const delta =\n ((currentCoordinate - drag.startCoordinate) / drag.availableSize) *\n 100 *\n drag.direction;\n\n const nextSizes = resizePanelPair(\n drag.sizes,\n panelConstraints,\n handleIndex,\n delta,\n );\n\n event.preventDefault();\n updateSizes(nextSizes);\n };\n\n const handlePointerEnd: ResizePointerHandler = (event, handleIndex) => {\n const drag = pointerDragRef.current;\n\n if (\n !drag ||\n drag.pointerId !== event.pointerId ||\n drag.handleIndex !== handleIndex\n ) {\n return;\n }\n\n pointerDragRef.current = null;\n setIsResizing(false);\n };\n\n const handleKeyDown: ResizeKeyboardHandler = (event, handleIndex) => {\n if (disabled) {\n return;\n }\n\n const currentSize = currentSizes[handleIndex];\n\n const bounds = getPanelPairBounds(\n currentSizes,\n panelConstraints,\n handleIndex,\n );\n\n const group = groupRef.current;\n\n const direction = group ? getResizeDirection(group, orientation) : 1;\n\n const step = keyboardStep * (event.shiftKey ? 10 : 1);\n\n let nextSize: number | undefined;\n\n if (event.key === \"Home\") {\n nextSize = bounds.minSize;\n } else if (event.key === \"End\") {\n nextSize = bounds.maxSize;\n } else if (orientation === \"horizontal\") {\n if (event.key === \"ArrowRight\") {\n nextSize = currentSize + step * direction;\n } else if (event.key === \"ArrowLeft\") {\n nextSize = currentSize - step * direction;\n }\n } else {\n if (event.key === \"ArrowDown\") {\n nextSize = currentSize + step;\n } else if (event.key === \"ArrowUp\") {\n nextSize = currentSize - step;\n }\n }\n\n if (nextSize === undefined) {\n return;\n }\n\n event.preventDefault();\n\n updateSizes(\n resizePanelPair(\n currentSizes,\n panelConstraints,\n handleIndex,\n nextSize - currentSize,\n ),\n );\n };\n\n let panelIndex = 0;\n\n const enhancedChildren = childrenArray.map((child) => {\n if (isResizablePanelElement(child)) {\n const index = panelIndex++;\n\n return cloneElement(\n child as ReactElement<\n ResizablePanelProps & InternalResizablePanelProps\n >,\n {\n panelIndex: index,\n panelSize: currentSizes[index],\n panelId: panelIds[index],\n },\n );\n }\n\n const handleIndex = panelIndex - 1;\n\n const bounds = getPanelPairBounds(\n currentSizes,\n panelConstraints,\n handleIndex,\n );\n\n return cloneElement(\n child as ReactElement<\n ResizableHandleProps & InternalResizableHandleProps\n >,\n {\n handleIndex,\n orientation,\n value: currentSizes[handleIndex],\n minValue: bounds.minSize,\n maxValue: bounds.maxSize,\n panelIds: [panelIds[handleIndex], panelIds[handleIndex + 1]],\n inheritedDisabled: disabled,\n onResizeStart: handlePointerDown,\n onResizeMove: handlePointerMove,\n onResizeEnd: handlePointerEnd,\n onResizeKeyDown: handleKeyDown,\n },\n );\n });\n\n return (\n <div\n {...rootProps}\n ref={(node) => {\n groupRef.current = node;\n\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n }}\n id={groupId}\n role={role ?? \"group\"}\n className={cn(\"puzzle-resizable-panels\", className)}\n style={style}\n data-orientation={orientation}\n data-disabled={disabled ? \"true\" : undefined}\n data-resizing={isResizing ? \"true\" : undefined}\n >\n {enhancedChildren}\n </div>\n );\n};\n\ntype ResizablePanelsComponent = typeof ResizablePanelsRoot & {\n Panel: typeof ResizablePanel;\n Handle: typeof ResizableHandle;\n};\n\nconst ResizablePanels = Object.assign(ResizablePanelsRoot, {\n Panel: ResizablePanel,\n Handle: ResizableHandle,\n}) as ResizablePanelsComponent;\n\nexport {\n ResizablePanels,\n ResizablePanel,\n ResizableHandle,\n type ResizablePanelsProps,\n type ResizablePanelProps,\n type ResizableHandleProps,\n type ResizablePanelsOrientation,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/layout/resizable-panels/index.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"@puzzle-ui/core\";\n\nimport {\n Children,\n cloneElement,\n isValidElement,\n useId,\n useRef,\n useState,\n type ComponentPropsWithRef,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactElement,\n type ReactNode,\n} from \"react\";\n\nimport {\n getPanelPairBounds,\n normalizePanelSizes,\n resizePanelPair,\n type PanelSizeConstraint,\n} from \"./resizable-panels.utils\";\n\nimport \"./resizable-panels.css\";\n\ntype ResizablePanelsOrientation = \"horizontal\" | \"vertical\";\n\ntype ResizablePanelsProps = Omit<ComponentPropsWithRef<\"div\">, \"children\"> & {\n /** Layout direction. Defaults to horizontal. */\n orientation?: ResizablePanelsOrientation;\n\n /** Controlled panel sizes, expressed as percentages. */\n sizes?: readonly number[];\n\n /** Initial panel sizes for uncontrolled usage. */\n defaultSizes?: readonly number[];\n\n /** Called whenever the panel layout changes. */\n onSizesChange?: (sizes: number[]) => void;\n\n /** Disables all resizing interactions. */\n disabled?: boolean;\n\n /** Percentage change per keyboard interaction. Defaults to 1. */\n keyboardStep?: number;\n\n /** Panels and handles that make up the group. */\n children: ReactNode;\n};\n\ntype ResizablePanelProps = ComponentPropsWithRef<\"div\"> & {\n /** Minimum panel size in percentages. Defaults to 0. */\n minSize?: number;\n\n /** Maximum panel size in percentages. Defaults to 100. */\n maxSize?: number;\n};\n\ntype ResizableHandleProps = ComponentPropsWithRef<\"div\"> & {\n /** Renders a visible grip inside the resize handle. */\n withGrip?: boolean;\n\n /** Disables resizing through this handle. */\n disabled?: boolean;\n};\n\ntype ResizePointerHandler = (\n event: ReactPointerEvent<HTMLDivElement>,\n handleIndex: number,\n) => void;\n\ntype ResizeKeyboardHandler = (\n event: ReactKeyboardEvent<HTMLDivElement>,\n handleIndex: number,\n) => void;\n\ntype InternalResizablePanelProps = {\n panelIndex?: number;\n panelSize?: number;\n panelId?: string;\n};\n\ntype InternalResizableHandleProps = {\n handleIndex?: number;\n orientation?: ResizablePanelsOrientation;\n value?: number;\n minValue?: number;\n maxValue?: number;\n panelIds?: [string, string];\n inheritedDisabled?: boolean;\n\n onResizeStart?: ResizePointerHandler;\n onResizeMove?: ResizePointerHandler;\n onResizeEnd?: ResizePointerHandler;\n onResizeKeyDown?: ResizeKeyboardHandler;\n};\n\ntype PointerDragState = {\n handleIndex: number;\n pointerId: number;\n startCoordinate: number;\n availableSize: number;\n direction: number;\n sizes: number[];\n};\n\nconst isResizablePanelElement = (\n child: ReactNode,\n): child is ReactElement<ResizablePanelProps> =>\n isValidElement(child) && child.type === ResizablePanel;\n\nconst isResizableHandleElement = (\n child: ReactNode,\n): child is ReactElement<ResizableHandleProps> =>\n isValidElement(child) && child.type === ResizableHandle;\n\nconst parsePixels = (value: string | undefined) =>\n Number.parseFloat(value ?? \"\") || 0;\n\nconst getAvailableSize = (\n group: HTMLDivElement,\n orientation: ResizablePanelsOrientation,\n) => {\n const computedStyle =\n group.ownerDocument.defaultView?.getComputedStyle(group);\n\n const isHorizontal = orientation === \"horizontal\";\n\n const totalSize = isHorizontal ? group.clientWidth : group.clientHeight;\n\n const paddingSize = computedStyle\n ? isHorizontal\n ? parsePixels(computedStyle.paddingLeft) +\n parsePixels(computedStyle.paddingRight)\n : parsePixels(computedStyle.paddingTop) +\n parsePixels(computedStyle.paddingBottom)\n : 0;\n\n const handleSize = Array.from(group.children).reduce((total, child) => {\n const element = child as HTMLElement;\n\n if (!element.hasAttribute(\"data-puzzle-resizable-handle\")) {\n return total;\n }\n\n const rect = element.getBoundingClientRect();\n\n return total + (isHorizontal ? rect.width : rect.height);\n }, 0);\n\n return Math.max(0, totalSize - paddingSize - handleSize);\n};\n\nconst getResizeDirection = (\n element: HTMLElement,\n orientation: ResizablePanelsOrientation,\n) => {\n if (orientation !== \"horizontal\") {\n return 1;\n }\n\n const direction =\n element.ownerDocument.defaultView?.getComputedStyle(element).direction;\n\n return direction === \"rtl\" ? -1 : 1;\n};\n\nconst getPointerCoordinate = (\n event: ReactPointerEvent<HTMLDivElement>,\n orientation: ResizablePanelsOrientation,\n) => (orientation === \"horizontal\" ? event.clientX : event.clientY);\n\nconst ResizablePanel = ({\n id,\n minSize = 0,\n maxSize = 100,\n panelIndex = 0,\n panelSize = 1,\n panelId,\n className,\n style,\n ...props\n}: ResizablePanelProps & InternalResizablePanelProps) => (\n <div\n {...props}\n id={panelId ?? id}\n className={cn(\"puzzle-resizable-panels__panel\", className)}\n style={{\n ...style,\n flex: `${panelSize} 1 0%`,\n }}\n data-panel-index={panelIndex}\n data-panel-size={panelSize}\n data-panel-min-size={minSize}\n data-panel-max-size={maxSize}\n />\n);\n\nconst ResizableHandle = ({\n withGrip = false,\n disabled = false,\n handleIndex = -1,\n orientation = \"horizontal\",\n value,\n minValue,\n maxValue,\n panelIds,\n inheritedDisabled = false,\n onResizeStart,\n onResizeMove,\n onResizeEnd,\n onResizeKeyDown,\n onPointerDown,\n onPointerMove,\n onPointerUp,\n onPointerCancel,\n onLostPointerCapture,\n onKeyDown,\n className,\n children,\n tabIndex,\n \"aria-label\": ariaLabel,\n ...props\n}: ResizableHandleProps & InternalResizableHandleProps) => {\n const isDisabled = disabled || inheritedDisabled;\n\n const handlePointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n onPointerDown?.(event);\n\n if (!event.defaultPrevented && !isDisabled) {\n onResizeStart?.(event, handleIndex);\n }\n };\n\n const handlePointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n onPointerMove?.(event);\n\n if (!event.defaultPrevented && !isDisabled) {\n onResizeMove?.(event, handleIndex);\n }\n };\n\n const handlePointerUp = (event: ReactPointerEvent<HTMLDivElement>) => {\n onResizeEnd?.(event, handleIndex);\n onPointerUp?.(event);\n };\n\n const handlePointerCancel = (event: ReactPointerEvent<HTMLDivElement>) => {\n onResizeEnd?.(event, handleIndex);\n onPointerCancel?.(event);\n };\n\n const handleLostPointerCapture = (\n event: ReactPointerEvent<HTMLDivElement>,\n ) => {\n onResizeEnd?.(event, handleIndex);\n onLostPointerCapture?.(event);\n };\n\n const handleKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n\n if (!event.defaultPrevented && !isDisabled) {\n onResizeKeyDown?.(event, handleIndex);\n }\n };\n\n return (\n <div\n {...props}\n className={cn(\"puzzle-resizable-panels__handle\", className)}\n role=\"separator\"\n tabIndex={isDisabled ? -1 : (tabIndex ?? 0)}\n aria-label={ariaLabel ?? \"Resize panels\"}\n aria-orientation={\n orientation === \"horizontal\" ? \"vertical\" : \"horizontal\"\n }\n aria-controls={panelIds?.join(\" \")}\n aria-valuenow={value}\n aria-valuemin={minValue}\n aria-valuemax={maxValue}\n aria-valuetext={\n value === undefined ? undefined : `${Math.round(value * 100) / 100}%`\n }\n aria-disabled={isDisabled || undefined}\n data-puzzle-resizable-handle=\"\"\n data-orientation={orientation}\n data-disabled={isDisabled ? \"true\" : undefined}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerCancel}\n onLostPointerCapture={handleLostPointerCapture}\n onKeyDown={handleKeyDown}\n >\n {withGrip ? (\n <span\n className=\"puzzle-resizable-panels__handle-grip\"\n aria-hidden=\"true\"\n />\n ) : (\n children\n )}\n </div>\n );\n};\n\nconst ResizablePanelsRoot = ({\n children,\n orientation = \"horizontal\",\n sizes,\n defaultSizes,\n onSizesChange,\n disabled = false,\n keyboardStep = 1,\n id,\n role,\n className,\n style,\n ref: forwardedRef,\n ...rootProps\n}: ResizablePanelsProps) => {\n const generatedId = useId();\n\n const groupId = id ?? `puzzle-resizable-panels-${generatedId}`;\n\n if (!Number.isFinite(keyboardStep) || keyboardStep <= 0) {\n throw new RangeError(\"keyboardStep must be a positive finite number.\");\n }\n\n const childrenArray = Children.toArray(children);\n\n const validChildren =\n childrenArray.length >= 3 &&\n childrenArray.length % 2 === 1 &&\n childrenArray.every((child, index) =>\n index % 2 === 0\n ? isResizablePanelElement(child)\n : isResizableHandleElement(child),\n );\n\n if (!validChildren) {\n throw new Error(\n \"ResizablePanels requires alternating Panel and Handle children, starting and ending with a Panel. At least two panels are required.\",\n );\n }\n\n const panelElements = childrenArray.filter(isResizablePanelElement);\n\n const panelCount = panelElements.length;\n\n const panelConstraints: PanelSizeConstraint[] = panelElements.map(\n (panel) => ({\n minSize: panel.props.minSize,\n maxSize: panel.props.maxSize,\n }),\n );\n\n const panelIds = panelElements.map(\n (panel, index) => panel.props.id ?? `${groupId}-panel-${index}`,\n );\n\n if (new Set(panelIds).size !== panelIds.length) {\n throw new Error(\"ResizablePanels requires unique panel IDs.\");\n }\n\n const [uncontrolledSizes, setUncontrolledSizes] = useState<number[]>(() =>\n normalizePanelSizes(\n sizes === undefined ? defaultSizes : undefined,\n panelConstraints,\n ),\n );\n\n const layoutInput =\n sizes ??\n (uncontrolledSizes.length === panelCount ? uncontrolledSizes : undefined);\n\n const currentSizes = normalizePanelSizes(layoutInput, panelConstraints);\n\n const [isResizing, setIsResizing] = useState(false);\n\n const groupRef = useRef<HTMLDivElement | null>(null);\n\n const pointerDragRef = useRef<PointerDragState | null>(null);\n\n const updateSizes = (nextSizes: readonly number[]) => {\n const normalized = normalizePanelSizes(nextSizes, panelConstraints);\n\n const hasChanged = normalized.some(\n (size, index) => Math.abs(size - (currentSizes[index] ?? 0)) > 0.000001,\n );\n\n if (!hasChanged) {\n return;\n }\n\n if (sizes === undefined) {\n setUncontrolledSizes(normalized);\n }\n\n onSizesChange?.(normalized);\n };\n\n const handlePointerDown: ResizePointerHandler = (event, handleIndex) => {\n const group = groupRef.current;\n\n if (!group || disabled) {\n return;\n }\n\n if (\n event.button !== 0 &&\n event.pointerType !== \"touch\" &&\n event.pointerType !== \"pen\"\n ) {\n return;\n }\n\n const availableSize = getAvailableSize(group, orientation);\n\n if (availableSize <= 0) {\n return;\n }\n\n pointerDragRef.current = {\n handleIndex,\n pointerId: event.pointerId,\n startCoordinate: getPointerCoordinate(event, orientation),\n availableSize,\n direction: getResizeDirection(group, orientation),\n sizes: [...currentSizes],\n };\n\n try {\n event.currentTarget.setPointerCapture(event.pointerId);\n } catch {\n // Synthetic pointer events and detached elements may not\n // support pointer capture.\n }\n\n event.preventDefault();\n setIsResizing(true);\n };\n\n const handlePointerMove: ResizePointerHandler = (event, handleIndex) => {\n const drag = pointerDragRef.current;\n\n if (\n !drag ||\n drag.pointerId !== event.pointerId ||\n drag.handleIndex !== handleIndex\n ) {\n return;\n }\n\n const currentCoordinate = getPointerCoordinate(event, orientation);\n\n const delta =\n ((currentCoordinate - drag.startCoordinate) / drag.availableSize) *\n 100 *\n drag.direction;\n\n const nextSizes = resizePanelPair(\n drag.sizes,\n panelConstraints,\n handleIndex,\n delta,\n );\n\n event.preventDefault();\n updateSizes(nextSizes);\n };\n\n const handlePointerEnd: ResizePointerHandler = (event, handleIndex) => {\n const drag = pointerDragRef.current;\n\n if (\n !drag ||\n drag.pointerId !== event.pointerId ||\n drag.handleIndex !== handleIndex\n ) {\n return;\n }\n\n pointerDragRef.current = null;\n setIsResizing(false);\n };\n\n const handleKeyDown: ResizeKeyboardHandler = (event, handleIndex) => {\n if (disabled) {\n return;\n }\n\n const currentSize = currentSizes[handleIndex]!;\n\n const bounds = getPanelPairBounds(\n currentSizes,\n panelConstraints,\n handleIndex,\n );\n\n const group = groupRef.current;\n\n const direction = group ? getResizeDirection(group, orientation) : 1;\n\n const step = keyboardStep * (event.shiftKey ? 10 : 1);\n\n let nextSize: number | undefined;\n\n if (event.key === \"Home\") {\n nextSize = bounds.minSize;\n } else if (event.key === \"End\") {\n nextSize = bounds.maxSize;\n } else if (orientation === \"horizontal\") {\n if (event.key === \"ArrowRight\") {\n nextSize = currentSize + step * direction;\n } else if (event.key === \"ArrowLeft\") {\n nextSize = currentSize - step * direction;\n }\n } else {\n if (event.key === \"ArrowDown\") {\n nextSize = currentSize + step;\n } else if (event.key === \"ArrowUp\") {\n nextSize = currentSize - step;\n }\n }\n\n if (nextSize === undefined) {\n return;\n }\n\n event.preventDefault();\n\n updateSizes(\n resizePanelPair(\n currentSizes,\n panelConstraints,\n handleIndex,\n nextSize - currentSize,\n ),\n );\n };\n\n let panelIndex = 0;\n\n const enhancedChildren = childrenArray.map((child) => {\n if (isResizablePanelElement(child)) {\n const index = panelIndex++;\n\n return cloneElement(\n child as ReactElement<\n ResizablePanelProps & InternalResizablePanelProps\n >,\n {\n panelIndex: index,\n panelSize: currentSizes[index],\n panelId: panelIds[index],\n },\n );\n }\n\n const handleIndex = panelIndex - 1;\n\n const bounds = getPanelPairBounds(\n currentSizes,\n panelConstraints,\n handleIndex,\n );\n\n return cloneElement(\n child as ReactElement<\n ResizableHandleProps & InternalResizableHandleProps\n >,\n {\n handleIndex,\n orientation,\n value: currentSizes[handleIndex],\n minValue: bounds.minSize,\n maxValue: bounds.maxSize,\n panelIds: [panelIds[handleIndex]!, panelIds[handleIndex + 1]!],\n inheritedDisabled: disabled,\n onResizeStart: handlePointerDown,\n onResizeMove: handlePointerMove,\n onResizeEnd: handlePointerEnd,\n onResizeKeyDown: handleKeyDown,\n },\n );\n });\n\n return (\n <div\n {...rootProps}\n ref={(node) => {\n groupRef.current = node;\n\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n }}\n id={groupId}\n role={role ?? \"group\"}\n className={cn(\"puzzle-resizable-panels\", className)}\n style={style}\n data-orientation={orientation}\n data-disabled={disabled ? \"true\" : undefined}\n data-resizing={isResizing ? \"true\" : undefined}\n >\n {enhancedChildren}\n </div>\n );\n};\n\ntype ResizablePanelsComponent = typeof ResizablePanelsRoot & {\n Panel: typeof ResizablePanel;\n Handle: typeof ResizableHandle;\n};\n\nconst ResizablePanels = Object.assign(ResizablePanelsRoot, {\n Panel: ResizablePanel,\n Handle: ResizableHandle,\n}) as ResizablePanelsComponent;\n\nexport {\n ResizablePanels,\n ResizablePanel,\n ResizableHandle,\n type ResizablePanelsProps,\n type ResizablePanelProps,\n type ResizableHandleProps,\n type ResizablePanelsOrientation,\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"resizable-panels.utils.cjs","names":[],"sources":["../../../../src/components/layout/resizable-panels/resizable-panels.utils.ts"],"sourcesContent":["export type PanelSizeConstraint = {\n minSize?: number;\n maxSize?: number;\n};\n\ntype NormalizedPanelSizeConstraint = {\n minSize: number;\n maxSize: number;\n};\n\ntype PanelPairBounds = {\n minSize: number;\n maxSize: number;\n};\n\nconst normalizePanelConstraints = (\n constraints: readonly PanelSizeConstraint[],\n): NormalizedPanelSizeConstraint[] => {\n if (constraints.length < 2) {\n throw new RangeError(\"ResizablePanels requires at least two panels.\");\n }\n\n const normalized = constraints.map((constraint, index) => {\n const minSize = constraint.minSize ?? 0;\n const maxSize = constraint.maxSize ?? 100;\n\n if (\n !Number.isFinite(minSize) ||\n !Number.isFinite(maxSize) ||\n minSize < 0 ||\n maxSize > 100 ||\n minSize > maxSize\n ) {\n throw new RangeError(`Invalid size constraints for panel ${index}.`);\n }\n\n return { minSize, maxSize };\n });\n\n const minimumTotal = normalized.reduce(\n (total, constraint) => total + constraint.minSize,\n 0,\n );\n\n const maximumTotal = normalized.reduce(\n (total, constraint) => total + constraint.maxSize,\n 0,\n );\n\n if (minimumTotal > 100 || maximumTotal < 100) {\n throw new RangeError(\n \"Panel size constraints cannot produce a layout totaling 100%.\",\n );\n }\n\n return normalized;\n};\n\n/**\n * Normalizes panel sizes to 100% while respecting every panel constraint.\n *\n * When a panel reaches its minimum or maximum, the remaining space is\n * distributed proportionally between the other panels.\n */\nconst normalizePanelSizes = (\n sizes: readonly number[] | undefined,\n constraints: readonly PanelSizeConstraint[],\n): number[] => {\n const normalizedConstraints = normalizePanelConstraints(constraints);\n\n if (sizes && sizes.length !== constraints.length) {\n throw new RangeError(\n \"The number of panel sizes must match the number of panels.\",\n );\n }\n\n const weights = normalizedConstraints.map((_, index) => {\n const size = sizes?.[index] ?? 1;\n\n return Number.isFinite(size) ? Math.max(0, size) : 0;\n });\n\n const result = new Array<number>(constraints.length).fill(0);\n\n const unresolved = normalizedConstraints.map((_, index) => index);\n\n let remainingSize = 100;\n\n while (unresolved.length > 0) {\n const activeWeightTotal = unresolved.reduce(\n (total, index) => total + weights[index],\n 0,\n );\n\n const useEqualDistribution = activeWeightTotal === 0;\n\n const candidates = unresolved.map((index) => ({\n index,\n size:\n (remainingSize * (useEqualDistribution ? 1 : weights[index])) /\n (useEqualDistribution ? unresolved.length : activeWeightTotal),\n }));\n\n const violations = candidates.filter(({ index, size }) => {\n const constraint = normalizedConstraints[index];\n\n return size < constraint.minSize || size > constraint.maxSize;\n });\n\n if (violations.length === 0) {\n for (const candidate of candidates) {\n result[candidate.index] = candidate.size;\n }\n\n break;\n }\n\n const clampedViolations = violations.map(({ index, size }) => {\n const constraint = normalizedConstraints[index];\n\n return {\n index,\n size,\n fixedSize: Math.min(\n constraint.maxSize,\n Math.max(constraint.minSize, size),\n ),\n };\n });\n\n // Only clamp in the direction of the net correction; clamping both\n // directions at once can overshoot or undershoot 100%.\n const totalCorrection = clampedViolations.reduce(\n (total, { size, fixedSize }) => total + fixedSize - size,\n 0,\n );\n\n const fixedIndexes = new Set<number>();\n\n for (const { index, size, fixedSize } of clampedViolations) {\n if (\n (totalCorrection > 0 && fixedSize < size) ||\n (totalCorrection < 0 && fixedSize > size)\n ) {\n continue;\n }\n\n result[index] = fixedSize;\n remainingSize -= fixedSize;\n fixedIndexes.add(index);\n }\n\n for (let index = unresolved.length - 1; index >= 0; index--) {\n if (fixedIndexes.has(unresolved[index])) {\n unresolved.splice(index, 1);\n }\n }\n }\n\n return result;\n};\n\n/**\n * Returns the allowed size range of the first panel in a pair.\n *\n * Both panels retain their combined size during resizing.\n */\nconst getPanelPairBounds = (\n sizes: readonly number[],\n constraints: readonly PanelSizeConstraint[],\n panelIndex: number,\n): PanelPairBounds => {\n const normalizedConstraints = normalizePanelConstraints(constraints);\n\n const normalizedSizes = normalizePanelSizes(sizes, normalizedConstraints);\n\n if (\n !Number.isInteger(panelIndex) ||\n panelIndex < 0 ||\n panelIndex >= normalizedSizes.length - 1\n ) {\n throw new RangeError(\"Invalid panel resize index.\");\n }\n\n const first = normalizedConstraints[panelIndex];\n const second = normalizedConstraints[panelIndex + 1];\n\n const combinedSize =\n normalizedSizes[panelIndex] + normalizedSizes[panelIndex + 1];\n\n return {\n minSize: Math.max(first.minSize, combinedSize - second.maxSize),\n maxSize: Math.min(first.maxSize, combinedSize - second.minSize),\n };\n};\n\n/**\n * Resizes two adjacent panels while keeping their combined size unchanged.\n *\n * A positive delta increases the first panel.\n * A negative delta decreases the first panel.\n */\nconst resizePanelPair = (\n sizes: readonly number[],\n constraints: readonly PanelSizeConstraint[],\n panelIndex: number,\n delta: number,\n): number[] => {\n if (!Number.isFinite(delta)) {\n throw new RangeError(\"Resize delta must be a finite number.\");\n }\n\n const normalizedSizes = normalizePanelSizes(sizes, constraints);\n\n const bounds = getPanelPairBounds(normalizedSizes, constraints, panelIndex);\n\n const combinedSize =\n normalizedSizes[panelIndex] + normalizedSizes[panelIndex + 1];\n\n const nextFirstSize = Math.min(\n bounds.maxSize,\n Math.max(bounds.minSize, normalizedSizes[panelIndex] + delta),\n );\n\n const nextSizes = [...normalizedSizes];\n\n nextSizes[panelIndex] = nextFirstSize;\n nextSizes[panelIndex + 1] = combinedSize - nextFirstSize;\n\n return nextSizes;\n};\n\nexport { normalizePanelSizes, getPanelPairBounds, resizePanelPair };\n"],"mappings":"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"}
1
+ {"version":3,"file":"resizable-panels.utils.cjs","names":[],"sources":["../../../../src/components/layout/resizable-panels/resizable-panels.utils.ts"],"sourcesContent":["export type PanelSizeConstraint = {\n minSize?: number;\n maxSize?: number;\n};\n\ntype NormalizedPanelSizeConstraint = {\n minSize: number;\n maxSize: number;\n};\n\ntype PanelPairBounds = {\n minSize: number;\n maxSize: number;\n};\n\nconst normalizePanelConstraints = (\n constraints: readonly PanelSizeConstraint[],\n): NormalizedPanelSizeConstraint[] => {\n if (constraints.length < 2) {\n throw new RangeError(\"ResizablePanels requires at least two panels.\");\n }\n\n const normalized = constraints.map((constraint, index) => {\n const minSize = constraint.minSize ?? 0;\n const maxSize = constraint.maxSize ?? 100;\n\n if (\n !Number.isFinite(minSize) ||\n !Number.isFinite(maxSize) ||\n minSize < 0 ||\n maxSize > 100 ||\n minSize > maxSize\n ) {\n throw new RangeError(`Invalid size constraints for panel ${index}.`);\n }\n\n return { minSize, maxSize };\n });\n\n const minimumTotal = normalized.reduce(\n (total, constraint) => total + constraint.minSize,\n 0,\n );\n\n const maximumTotal = normalized.reduce(\n (total, constraint) => total + constraint.maxSize,\n 0,\n );\n\n if (minimumTotal > 100 || maximumTotal < 100) {\n throw new RangeError(\n \"Panel size constraints cannot produce a layout totaling 100%.\",\n );\n }\n\n return normalized;\n};\n\n/**\n * Normalizes panel sizes to 100% while respecting every panel constraint.\n *\n * When a panel reaches its minimum or maximum, the remaining space is\n * distributed proportionally between the other panels.\n */\nconst normalizePanelSizes = (\n sizes: readonly number[] | undefined,\n constraints: readonly PanelSizeConstraint[],\n): number[] => {\n const normalizedConstraints = normalizePanelConstraints(constraints);\n\n if (sizes && sizes.length !== constraints.length) {\n throw new RangeError(\n \"The number of panel sizes must match the number of panels.\",\n );\n }\n\n const weights = normalizedConstraints.map((_, index) => {\n const size = sizes?.[index] ?? 1;\n\n return Number.isFinite(size) ? Math.max(0, size) : 0;\n });\n\n const result = new Array<number>(constraints.length).fill(0);\n\n const unresolved = normalizedConstraints.map((_, index) => index);\n\n let remainingSize = 100;\n\n while (unresolved.length > 0) {\n const activeWeightTotal = unresolved.reduce(\n (total, index) => total + weights[index]!,\n 0,\n );\n\n const useEqualDistribution = activeWeightTotal === 0;\n\n const candidates = unresolved.map((index) => ({\n index,\n size:\n (remainingSize * (useEqualDistribution ? 1 : weights[index]!)) /\n (useEqualDistribution ? unresolved.length : activeWeightTotal),\n }));\n\n const violations = candidates.filter(({ index, size }) => {\n const constraint = normalizedConstraints[index]!;\n\n return size < constraint.minSize || size > constraint.maxSize;\n });\n\n if (violations.length === 0) {\n for (const candidate of candidates) {\n result[candidate.index] = candidate.size;\n }\n\n break;\n }\n\n const clampedViolations = violations.map(({ index, size }) => {\n const constraint = normalizedConstraints[index]!;\n\n return {\n index,\n size,\n fixedSize: Math.min(\n constraint.maxSize,\n Math.max(constraint.minSize, size),\n ),\n };\n });\n\n // Only clamp in the direction of the net correction; clamping both\n // directions at once can overshoot or undershoot 100%.\n const totalCorrection = clampedViolations.reduce(\n (total, { size, fixedSize }) => total + fixedSize - size,\n 0,\n );\n\n const fixedIndexes = new Set<number>();\n\n for (const { index, size, fixedSize } of clampedViolations) {\n if (\n (totalCorrection > 0 && fixedSize < size) ||\n (totalCorrection < 0 && fixedSize > size)\n ) {\n continue;\n }\n\n result[index] = fixedSize;\n remainingSize -= fixedSize;\n fixedIndexes.add(index);\n }\n\n for (let index = unresolved.length - 1; index >= 0; index--) {\n if (fixedIndexes.has(unresolved[index]!)) {\n unresolved.splice(index, 1);\n }\n }\n }\n\n return result;\n};\n\n/**\n * Returns the allowed size range of the first panel in a pair.\n *\n * Both panels retain their combined size during resizing.\n */\nconst getPanelPairBounds = (\n sizes: readonly number[],\n constraints: readonly PanelSizeConstraint[],\n panelIndex: number,\n): PanelPairBounds => {\n const normalizedConstraints = normalizePanelConstraints(constraints);\n\n const normalizedSizes = normalizePanelSizes(sizes, normalizedConstraints);\n\n if (\n !Number.isInteger(panelIndex) ||\n panelIndex < 0 ||\n panelIndex >= normalizedSizes.length - 1\n ) {\n throw new RangeError(\"Invalid panel resize index.\");\n }\n\n // The guard above ensures both panels of the pair exist.\n const first = normalizedConstraints[panelIndex]!;\n const second = normalizedConstraints[panelIndex + 1]!;\n\n const combinedSize =\n normalizedSizes[panelIndex]! + normalizedSizes[panelIndex + 1]!;\n\n return {\n minSize: Math.max(first.minSize, combinedSize - second.maxSize),\n maxSize: Math.min(first.maxSize, combinedSize - second.minSize),\n };\n};\n\n/**\n * Resizes two adjacent panels while keeping their combined size unchanged.\n *\n * A positive delta increases the first panel.\n * A negative delta decreases the first panel.\n */\nconst resizePanelPair = (\n sizes: readonly number[],\n constraints: readonly PanelSizeConstraint[],\n panelIndex: number,\n delta: number,\n): number[] => {\n if (!Number.isFinite(delta)) {\n throw new RangeError(\"Resize delta must be a finite number.\");\n }\n\n const normalizedSizes = normalizePanelSizes(sizes, constraints);\n\n const bounds = getPanelPairBounds(normalizedSizes, constraints, panelIndex);\n\n // getPanelPairBounds has validated panelIndex.\n const combinedSize =\n normalizedSizes[panelIndex]! + normalizedSizes[panelIndex + 1]!;\n\n const nextFirstSize = Math.min(\n bounds.maxSize,\n Math.max(bounds.minSize, normalizedSizes[panelIndex]! + delta),\n );\n\n const nextSizes = [...normalizedSizes];\n\n nextSizes[panelIndex] = nextFirstSize;\n nextSizes[panelIndex + 1] = combinedSize - nextFirstSize;\n\n return nextSizes;\n};\n\nexport { normalizePanelSizes, getPanelPairBounds, resizePanelPair };\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"resizable-panels.utils.js","names":[],"sources":["../../../../src/components/layout/resizable-panels/resizable-panels.utils.ts"],"sourcesContent":["export type PanelSizeConstraint = {\n minSize?: number;\n maxSize?: number;\n};\n\ntype NormalizedPanelSizeConstraint = {\n minSize: number;\n maxSize: number;\n};\n\ntype PanelPairBounds = {\n minSize: number;\n maxSize: number;\n};\n\nconst normalizePanelConstraints = (\n constraints: readonly PanelSizeConstraint[],\n): NormalizedPanelSizeConstraint[] => {\n if (constraints.length < 2) {\n throw new RangeError(\"ResizablePanels requires at least two panels.\");\n }\n\n const normalized = constraints.map((constraint, index) => {\n const minSize = constraint.minSize ?? 0;\n const maxSize = constraint.maxSize ?? 100;\n\n if (\n !Number.isFinite(minSize) ||\n !Number.isFinite(maxSize) ||\n minSize < 0 ||\n maxSize > 100 ||\n minSize > maxSize\n ) {\n throw new RangeError(`Invalid size constraints for panel ${index}.`);\n }\n\n return { minSize, maxSize };\n });\n\n const minimumTotal = normalized.reduce(\n (total, constraint) => total + constraint.minSize,\n 0,\n );\n\n const maximumTotal = normalized.reduce(\n (total, constraint) => total + constraint.maxSize,\n 0,\n );\n\n if (minimumTotal > 100 || maximumTotal < 100) {\n throw new RangeError(\n \"Panel size constraints cannot produce a layout totaling 100%.\",\n );\n }\n\n return normalized;\n};\n\n/**\n * Normalizes panel sizes to 100% while respecting every panel constraint.\n *\n * When a panel reaches its minimum or maximum, the remaining space is\n * distributed proportionally between the other panels.\n */\nconst normalizePanelSizes = (\n sizes: readonly number[] | undefined,\n constraints: readonly PanelSizeConstraint[],\n): number[] => {\n const normalizedConstraints = normalizePanelConstraints(constraints);\n\n if (sizes && sizes.length !== constraints.length) {\n throw new RangeError(\n \"The number of panel sizes must match the number of panels.\",\n );\n }\n\n const weights = normalizedConstraints.map((_, index) => {\n const size = sizes?.[index] ?? 1;\n\n return Number.isFinite(size) ? Math.max(0, size) : 0;\n });\n\n const result = new Array<number>(constraints.length).fill(0);\n\n const unresolved = normalizedConstraints.map((_, index) => index);\n\n let remainingSize = 100;\n\n while (unresolved.length > 0) {\n const activeWeightTotal = unresolved.reduce(\n (total, index) => total + weights[index],\n 0,\n );\n\n const useEqualDistribution = activeWeightTotal === 0;\n\n const candidates = unresolved.map((index) => ({\n index,\n size:\n (remainingSize * (useEqualDistribution ? 1 : weights[index])) /\n (useEqualDistribution ? unresolved.length : activeWeightTotal),\n }));\n\n const violations = candidates.filter(({ index, size }) => {\n const constraint = normalizedConstraints[index];\n\n return size < constraint.minSize || size > constraint.maxSize;\n });\n\n if (violations.length === 0) {\n for (const candidate of candidates) {\n result[candidate.index] = candidate.size;\n }\n\n break;\n }\n\n const clampedViolations = violations.map(({ index, size }) => {\n const constraint = normalizedConstraints[index];\n\n return {\n index,\n size,\n fixedSize: Math.min(\n constraint.maxSize,\n Math.max(constraint.minSize, size),\n ),\n };\n });\n\n // Only clamp in the direction of the net correction; clamping both\n // directions at once can overshoot or undershoot 100%.\n const totalCorrection = clampedViolations.reduce(\n (total, { size, fixedSize }) => total + fixedSize - size,\n 0,\n );\n\n const fixedIndexes = new Set<number>();\n\n for (const { index, size, fixedSize } of clampedViolations) {\n if (\n (totalCorrection > 0 && fixedSize < size) ||\n (totalCorrection < 0 && fixedSize > size)\n ) {\n continue;\n }\n\n result[index] = fixedSize;\n remainingSize -= fixedSize;\n fixedIndexes.add(index);\n }\n\n for (let index = unresolved.length - 1; index >= 0; index--) {\n if (fixedIndexes.has(unresolved[index])) {\n unresolved.splice(index, 1);\n }\n }\n }\n\n return result;\n};\n\n/**\n * Returns the allowed size range of the first panel in a pair.\n *\n * Both panels retain their combined size during resizing.\n */\nconst getPanelPairBounds = (\n sizes: readonly number[],\n constraints: readonly PanelSizeConstraint[],\n panelIndex: number,\n): PanelPairBounds => {\n const normalizedConstraints = normalizePanelConstraints(constraints);\n\n const normalizedSizes = normalizePanelSizes(sizes, normalizedConstraints);\n\n if (\n !Number.isInteger(panelIndex) ||\n panelIndex < 0 ||\n panelIndex >= normalizedSizes.length - 1\n ) {\n throw new RangeError(\"Invalid panel resize index.\");\n }\n\n const first = normalizedConstraints[panelIndex];\n const second = normalizedConstraints[panelIndex + 1];\n\n const combinedSize =\n normalizedSizes[panelIndex] + normalizedSizes[panelIndex + 1];\n\n return {\n minSize: Math.max(first.minSize, combinedSize - second.maxSize),\n maxSize: Math.min(first.maxSize, combinedSize - second.minSize),\n };\n};\n\n/**\n * Resizes two adjacent panels while keeping their combined size unchanged.\n *\n * A positive delta increases the first panel.\n * A negative delta decreases the first panel.\n */\nconst resizePanelPair = (\n sizes: readonly number[],\n constraints: readonly PanelSizeConstraint[],\n panelIndex: number,\n delta: number,\n): number[] => {\n if (!Number.isFinite(delta)) {\n throw new RangeError(\"Resize delta must be a finite number.\");\n }\n\n const normalizedSizes = normalizePanelSizes(sizes, constraints);\n\n const bounds = getPanelPairBounds(normalizedSizes, constraints, panelIndex);\n\n const combinedSize =\n normalizedSizes[panelIndex] + normalizedSizes[panelIndex + 1];\n\n const nextFirstSize = Math.min(\n bounds.maxSize,\n Math.max(bounds.minSize, normalizedSizes[panelIndex] + delta),\n );\n\n const nextSizes = [...normalizedSizes];\n\n nextSizes[panelIndex] = nextFirstSize;\n nextSizes[panelIndex + 1] = combinedSize - nextFirstSize;\n\n return nextSizes;\n};\n\nexport { normalizePanelSizes, getPanelPairBounds, resizePanelPair };\n"],"mappings":"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"}
1
+ {"version":3,"file":"resizable-panels.utils.js","names":[],"sources":["../../../../src/components/layout/resizable-panels/resizable-panels.utils.ts"],"sourcesContent":["export type PanelSizeConstraint = {\n minSize?: number;\n maxSize?: number;\n};\n\ntype NormalizedPanelSizeConstraint = {\n minSize: number;\n maxSize: number;\n};\n\ntype PanelPairBounds = {\n minSize: number;\n maxSize: number;\n};\n\nconst normalizePanelConstraints = (\n constraints: readonly PanelSizeConstraint[],\n): NormalizedPanelSizeConstraint[] => {\n if (constraints.length < 2) {\n throw new RangeError(\"ResizablePanels requires at least two panels.\");\n }\n\n const normalized = constraints.map((constraint, index) => {\n const minSize = constraint.minSize ?? 0;\n const maxSize = constraint.maxSize ?? 100;\n\n if (\n !Number.isFinite(minSize) ||\n !Number.isFinite(maxSize) ||\n minSize < 0 ||\n maxSize > 100 ||\n minSize > maxSize\n ) {\n throw new RangeError(`Invalid size constraints for panel ${index}.`);\n }\n\n return { minSize, maxSize };\n });\n\n const minimumTotal = normalized.reduce(\n (total, constraint) => total + constraint.minSize,\n 0,\n );\n\n const maximumTotal = normalized.reduce(\n (total, constraint) => total + constraint.maxSize,\n 0,\n );\n\n if (minimumTotal > 100 || maximumTotal < 100) {\n throw new RangeError(\n \"Panel size constraints cannot produce a layout totaling 100%.\",\n );\n }\n\n return normalized;\n};\n\n/**\n * Normalizes panel sizes to 100% while respecting every panel constraint.\n *\n * When a panel reaches its minimum or maximum, the remaining space is\n * distributed proportionally between the other panels.\n */\nconst normalizePanelSizes = (\n sizes: readonly number[] | undefined,\n constraints: readonly PanelSizeConstraint[],\n): number[] => {\n const normalizedConstraints = normalizePanelConstraints(constraints);\n\n if (sizes && sizes.length !== constraints.length) {\n throw new RangeError(\n \"The number of panel sizes must match the number of panels.\",\n );\n }\n\n const weights = normalizedConstraints.map((_, index) => {\n const size = sizes?.[index] ?? 1;\n\n return Number.isFinite(size) ? Math.max(0, size) : 0;\n });\n\n const result = new Array<number>(constraints.length).fill(0);\n\n const unresolved = normalizedConstraints.map((_, index) => index);\n\n let remainingSize = 100;\n\n while (unresolved.length > 0) {\n const activeWeightTotal = unresolved.reduce(\n (total, index) => total + weights[index]!,\n 0,\n );\n\n const useEqualDistribution = activeWeightTotal === 0;\n\n const candidates = unresolved.map((index) => ({\n index,\n size:\n (remainingSize * (useEqualDistribution ? 1 : weights[index]!)) /\n (useEqualDistribution ? unresolved.length : activeWeightTotal),\n }));\n\n const violations = candidates.filter(({ index, size }) => {\n const constraint = normalizedConstraints[index]!;\n\n return size < constraint.minSize || size > constraint.maxSize;\n });\n\n if (violations.length === 0) {\n for (const candidate of candidates) {\n result[candidate.index] = candidate.size;\n }\n\n break;\n }\n\n const clampedViolations = violations.map(({ index, size }) => {\n const constraint = normalizedConstraints[index]!;\n\n return {\n index,\n size,\n fixedSize: Math.min(\n constraint.maxSize,\n Math.max(constraint.minSize, size),\n ),\n };\n });\n\n // Only clamp in the direction of the net correction; clamping both\n // directions at once can overshoot or undershoot 100%.\n const totalCorrection = clampedViolations.reduce(\n (total, { size, fixedSize }) => total + fixedSize - size,\n 0,\n );\n\n const fixedIndexes = new Set<number>();\n\n for (const { index, size, fixedSize } of clampedViolations) {\n if (\n (totalCorrection > 0 && fixedSize < size) ||\n (totalCorrection < 0 && fixedSize > size)\n ) {\n continue;\n }\n\n result[index] = fixedSize;\n remainingSize -= fixedSize;\n fixedIndexes.add(index);\n }\n\n for (let index = unresolved.length - 1; index >= 0; index--) {\n if (fixedIndexes.has(unresolved[index]!)) {\n unresolved.splice(index, 1);\n }\n }\n }\n\n return result;\n};\n\n/**\n * Returns the allowed size range of the first panel in a pair.\n *\n * Both panels retain their combined size during resizing.\n */\nconst getPanelPairBounds = (\n sizes: readonly number[],\n constraints: readonly PanelSizeConstraint[],\n panelIndex: number,\n): PanelPairBounds => {\n const normalizedConstraints = normalizePanelConstraints(constraints);\n\n const normalizedSizes = normalizePanelSizes(sizes, normalizedConstraints);\n\n if (\n !Number.isInteger(panelIndex) ||\n panelIndex < 0 ||\n panelIndex >= normalizedSizes.length - 1\n ) {\n throw new RangeError(\"Invalid panel resize index.\");\n }\n\n // The guard above ensures both panels of the pair exist.\n const first = normalizedConstraints[panelIndex]!;\n const second = normalizedConstraints[panelIndex + 1]!;\n\n const combinedSize =\n normalizedSizes[panelIndex]! + normalizedSizes[panelIndex + 1]!;\n\n return {\n minSize: Math.max(first.minSize, combinedSize - second.maxSize),\n maxSize: Math.min(first.maxSize, combinedSize - second.minSize),\n };\n};\n\n/**\n * Resizes two adjacent panels while keeping their combined size unchanged.\n *\n * A positive delta increases the first panel.\n * A negative delta decreases the first panel.\n */\nconst resizePanelPair = (\n sizes: readonly number[],\n constraints: readonly PanelSizeConstraint[],\n panelIndex: number,\n delta: number,\n): number[] => {\n if (!Number.isFinite(delta)) {\n throw new RangeError(\"Resize delta must be a finite number.\");\n }\n\n const normalizedSizes = normalizePanelSizes(sizes, constraints);\n\n const bounds = getPanelPairBounds(normalizedSizes, constraints, panelIndex);\n\n // getPanelPairBounds has validated panelIndex.\n const combinedSize =\n normalizedSizes[panelIndex]! + normalizedSizes[panelIndex + 1]!;\n\n const nextFirstSize = Math.min(\n bounds.maxSize,\n Math.max(bounds.minSize, normalizedSizes[panelIndex]! + delta),\n );\n\n const nextSizes = [...normalizedSizes];\n\n nextSizes[panelIndex] = nextFirstSize;\n nextSizes[panelIndex + 1] = combinedSize - nextFirstSize;\n\n return nextSizes;\n};\n\nexport { normalizePanelSizes, getPanelPairBounds, resizePanelPair };\n"],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ const require_scroll_area_utils = require("./scroll-area.utils.cjs");
2
+ ;/* empty css */
3
+ let _puzzle_ui_core = require("@puzzle-ui/core");
4
+ let react_jsx_runtime = require("react/jsx-runtime");
5
+ // src/components/layout/scroll-area/index.tsx
6
+ const ScrollArea = ({ orientation = "vertical", children, className, role, tabIndex, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, ref, ...props }) => {
7
+ const overflow = require_scroll_area_utils.getScrollAreaOverflow(orientation);
8
+ const accessibleName = ariaLabel || ariaLabelledBy;
9
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
10
+ ...props,
11
+ ref,
12
+ role: role ?? (accessibleName ? "region" : void 0),
13
+ tabIndex: tabIndex ?? 0,
14
+ className: (0, _puzzle_ui_core.cn)("puzzle-scroll-area", className),
15
+ "data-orientation": orientation,
16
+ style: {
17
+ ...overflow,
18
+ ...props.style
19
+ },
20
+ "aria-label": ariaLabel,
21
+ "aria-labelledby": ariaLabelledBy,
22
+ children
23
+ });
24
+ };
25
+ exports.ScrollArea = ScrollArea;
26
+
27
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["getScrollAreaOverflow","cn"],"sources":["../../../../src/components/layout/scroll-area/index.tsx"],"sourcesContent":["import { cn } from \"@puzzle-ui/core\";\nimport type { ComponentPropsWithRef, ReactNode } from \"react\";\nimport { getScrollAreaOverflow } from \"./scroll-area.utils\";\nimport type { ScrollAreaOrientation } from \"./scroll-area.utils\";\nimport \"./scroll-area.css\";\n\ntype ScrollAreaProps = Omit<ComponentPropsWithRef<\"div\">, \"children\"> & {\n /**\n * Content rendered inside the scrollable viewport.\n */\n children?: ReactNode;\n\n /**\n * The axis or axes that can scroll.\n * @default \"vertical\"\n */\n orientation?: ScrollAreaOrientation;\n};\n\nconst ScrollArea = ({\n orientation = \"vertical\",\n children,\n className,\n role,\n tabIndex,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n ref,\n ...props\n}: ScrollAreaProps) => {\n const overflow = getScrollAreaOverflow(orientation);\n const accessibleName = ariaLabel || ariaLabelledBy;\n\n return (\n <div\n {...props}\n ref={ref}\n role={role ?? (accessibleName ? \"region\" : undefined)}\n tabIndex={tabIndex ?? 0}\n className={cn(\"puzzle-scroll-area\", className)}\n data-orientation={orientation}\n style={{ ...overflow, ...props.style }}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n >\n {children}\n </div>\n );\n};\n\nexport { ScrollArea, type ScrollAreaProps, type ScrollAreaOrientation };\n"],"mappings":";;;;;AAmBA,MAAM,cAAc,EAClB,cAAc,YACd,UACA,WACA,MACA,UACA,cAAc,WACd,mBAAmB,gBACnB,KACA,GAAG,YACkB;CACrB,MAAM,WAAWA,0BAAAA,sBAAsB,WAAW;CAClD,MAAM,iBAAiB,aAAa;CAEpC,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EACE,GAAI;EACC;EACL,MAAM,SAAS,iBAAiB,WAAW,KAAA;EAC3C,UAAU,YAAY;EACtB,YAAA,GAAWC,gBAAAA,GAAAA,CAAG,sBAAsB,SAAS;EAC7C,oBAAkB;EAClB,OAAO;GAAE,GAAG;GAAU,GAAG,MAAM;EAAM;EACrC,cAAY;EACZ,mBAAiB;EAEhB;CACE,CAAA;AAET"}
@@ -0,0 +1,15 @@
1
+ import { ScrollAreaOrientation } from "./scroll-area.utils.cjs";
2
+ import { ComponentPropsWithRef, ReactNode } from "react";
3
+ type ScrollAreaProps = Omit<ComponentPropsWithRef<"div">, "children"> & {
4
+ /**
5
+ * Content rendered inside the scrollable viewport.
6
+ */
7
+ children?: ReactNode;
8
+ /**
9
+ * The axis or axes that can scroll.
10
+ * @default "vertical"
11
+ */
12
+ orientation?: ScrollAreaOrientation;
13
+ };
14
+ declare const ScrollArea: ({ orientation, children, className, role, tabIndex, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, ref, ...props }: ScrollAreaProps) => import("react").JSX.Element;
15
+ export { ScrollArea, type ScrollAreaOrientation, type ScrollAreaProps };
@@ -0,0 +1,15 @@
1
+ import { ScrollAreaOrientation } from "./scroll-area.utils.js";
2
+ import { ComponentPropsWithRef, ReactNode } from "react";
3
+ type ScrollAreaProps = Omit<ComponentPropsWithRef<"div">, "children"> & {
4
+ /**
5
+ * Content rendered inside the scrollable viewport.
6
+ */
7
+ children?: ReactNode;
8
+ /**
9
+ * The axis or axes that can scroll.
10
+ * @default "vertical"
11
+ */
12
+ orientation?: ScrollAreaOrientation;
13
+ };
14
+ declare const ScrollArea: ({ orientation, children, className, role, tabIndex, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, ref, ...props }: ScrollAreaProps) => import("react").JSX.Element;
15
+ export { ScrollArea, type ScrollAreaOrientation, type ScrollAreaProps };
@@ -0,0 +1,27 @@
1
+ import { getScrollAreaOverflow } from "./scroll-area.utils.js";
2
+ import "./scroll-area.css";
3
+ import { cn } from "@puzzle-ui/core";
4
+ import { jsx } from "react/jsx-runtime";
5
+ // src/components/layout/scroll-area/index.tsx
6
+ const ScrollArea = ({ orientation = "vertical", children, className, role, tabIndex, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, ref, ...props }) => {
7
+ const overflow = getScrollAreaOverflow(orientation);
8
+ const accessibleName = ariaLabel || ariaLabelledBy;
9
+ return /* @__PURE__ */ jsx("div", {
10
+ ...props,
11
+ ref,
12
+ role: role ?? (accessibleName ? "region" : void 0),
13
+ tabIndex: tabIndex ?? 0,
14
+ className: cn("puzzle-scroll-area", className),
15
+ "data-orientation": orientation,
16
+ style: {
17
+ ...overflow,
18
+ ...props.style
19
+ },
20
+ "aria-label": ariaLabel,
21
+ "aria-labelledby": ariaLabelledBy,
22
+ children
23
+ });
24
+ };
25
+ export { ScrollArea };
26
+
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/layout/scroll-area/index.tsx"],"sourcesContent":["import { cn } from \"@puzzle-ui/core\";\nimport type { ComponentPropsWithRef, ReactNode } from \"react\";\nimport { getScrollAreaOverflow } from \"./scroll-area.utils\";\nimport type { ScrollAreaOrientation } from \"./scroll-area.utils\";\nimport \"./scroll-area.css\";\n\ntype ScrollAreaProps = Omit<ComponentPropsWithRef<\"div\">, \"children\"> & {\n /**\n * Content rendered inside the scrollable viewport.\n */\n children?: ReactNode;\n\n /**\n * The axis or axes that can scroll.\n * @default \"vertical\"\n */\n orientation?: ScrollAreaOrientation;\n};\n\nconst ScrollArea = ({\n orientation = \"vertical\",\n children,\n className,\n role,\n tabIndex,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n ref,\n ...props\n}: ScrollAreaProps) => {\n const overflow = getScrollAreaOverflow(orientation);\n const accessibleName = ariaLabel || ariaLabelledBy;\n\n return (\n <div\n {...props}\n ref={ref}\n role={role ?? (accessibleName ? \"region\" : undefined)}\n tabIndex={tabIndex ?? 0}\n className={cn(\"puzzle-scroll-area\", className)}\n data-orientation={orientation}\n style={{ ...overflow, ...props.style }}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n >\n {children}\n </div>\n );\n};\n\nexport { ScrollArea, type ScrollAreaProps, type ScrollAreaOrientation };\n"],"mappings":";;;;;AAmBA,MAAM,cAAc,EAClB,cAAc,YACd,UACA,WACA,MACA,UACA,cAAc,WACd,mBAAmB,gBACnB,KACA,GAAG,YACkB;CACrB,MAAM,WAAW,sBAAsB,WAAW;CAClD,MAAM,iBAAiB,aAAa;CAEpC,OACE,oBAAC,OAAD;EACE,GAAI;EACC;EACL,MAAM,SAAS,iBAAiB,WAAW,KAAA;EAC3C,UAAU,YAAY;EACtB,WAAW,GAAG,sBAAsB,SAAS;EAC7C,oBAAkB;EAClB,OAAO;GAAE,GAAG;GAAU,GAAG,MAAM;EAAM;EACrC,cAAY;EACZ,mBAAiB;EAEhB;CACE,CAAA;AAET"}
@@ -0,0 +1,25 @@
1
+ .puzzle-scroll-area {
2
+ overscroll-behavior: contain;
3
+ -webkit-overflow-scrolling: touch;
4
+ scrollbar-width: thin;
5
+ scrollbar-color: var(--puzzle-color-border) transparent;
6
+ min-width: 0;
7
+ min-height: 0;
8
+ display: block;
9
+ }
10
+
11
+ .puzzle-scroll-area::-webkit-scrollbar {
12
+ width: .5rem;
13
+ height: .5rem;
14
+ }
15
+
16
+ .puzzle-scroll-area::-webkit-scrollbar-track {
17
+ background: none;
18
+ }
19
+
20
+ .puzzle-scroll-area::-webkit-scrollbar-thumb {
21
+ background-color: var(--puzzle-color-border);
22
+ background-clip: content-box;
23
+ border: 2px solid #0000;
24
+ border-radius: 999px;
25
+ }
@@ -0,0 +1,8 @@
1
+ // src/components/layout/scroll-area/scroll-area.utils.ts
2
+ const getScrollAreaOverflow = (orientation) => ({
3
+ overflowX: orientation === "horizontal" || orientation === "both" ? "auto" : "hidden",
4
+ overflowY: orientation === "vertical" || orientation === "both" ? "auto" : "hidden"
5
+ });
6
+ exports.getScrollAreaOverflow = getScrollAreaOverflow;
7
+
8
+ //# sourceMappingURL=scroll-area.utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scroll-area.utils.cjs","names":[],"sources":["../../../../src/components/layout/scroll-area/scroll-area.utils.ts"],"sourcesContent":["type ScrollAreaOrientation = \"vertical\" | \"horizontal\" | \"both\";\n\ntype ScrollAreaOverflow = {\n overflowX: \"auto\" | \"hidden\";\n overflowY: \"auto\" | \"hidden\";\n};\n\nconst getScrollAreaOverflow = (\n orientation: ScrollAreaOrientation,\n): ScrollAreaOverflow => ({\n overflowX:\n orientation === \"horizontal\" || orientation === \"both\" ? \"auto\" : \"hidden\",\n overflowY:\n orientation === \"vertical\" || orientation === \"both\" ? \"auto\" : \"hidden\",\n});\n\nexport {\n getScrollAreaOverflow,\n type ScrollAreaOrientation,\n type ScrollAreaOverflow,\n};\n"],"mappings":";AAOA,MAAM,yBACJ,iBACwB;CACxB,WACE,gBAAgB,gBAAgB,gBAAgB,SAAS,SAAS;CACpE,WACE,gBAAgB,cAAc,gBAAgB,SAAS,SAAS;AACpE"}
@@ -0,0 +1,2 @@
1
+ type ScrollAreaOrientation = "vertical" | "horizontal" | "both";
2
+ export type { ScrollAreaOrientation };
@@ -0,0 +1,2 @@
1
+ type ScrollAreaOrientation = "vertical" | "horizontal" | "both";
2
+ export type { ScrollAreaOrientation };
@@ -0,0 +1,8 @@
1
+ // src/components/layout/scroll-area/scroll-area.utils.ts
2
+ const getScrollAreaOverflow = (orientation) => ({
3
+ overflowX: orientation === "horizontal" || orientation === "both" ? "auto" : "hidden",
4
+ overflowY: orientation === "vertical" || orientation === "both" ? "auto" : "hidden"
5
+ });
6
+ export { getScrollAreaOverflow };
7
+
8
+ //# sourceMappingURL=scroll-area.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scroll-area.utils.js","names":[],"sources":["../../../../src/components/layout/scroll-area/scroll-area.utils.ts"],"sourcesContent":["type ScrollAreaOrientation = \"vertical\" | \"horizontal\" | \"both\";\n\ntype ScrollAreaOverflow = {\n overflowX: \"auto\" | \"hidden\";\n overflowY: \"auto\" | \"hidden\";\n};\n\nconst getScrollAreaOverflow = (\n orientation: ScrollAreaOrientation,\n): ScrollAreaOverflow => ({\n overflowX:\n orientation === \"horizontal\" || orientation === \"both\" ? \"auto\" : \"hidden\",\n overflowY:\n orientation === \"vertical\" || orientation === \"both\" ? \"auto\" : \"hidden\",\n});\n\nexport {\n getScrollAreaOverflow,\n type ScrollAreaOrientation,\n type ScrollAreaOverflow,\n};\n"],"mappings":";AAOA,MAAM,yBACJ,iBACwB;CACxB,WACE,gBAAgB,gBAAgB,gBAAgB,SAAS,SAAS;CACpE,WACE,gBAAgB,cAAc,gBAAgB,SAAS,SAAS;AACpE"}
@@ -1,13 +1,19 @@
1
+ const require_container_utils = require("../container/container.utils.cjs");
1
2
  ;/* empty css */
2
3
  ;/* empty css */
3
4
  let _puzzle_ui_core = require("@puzzle-ui/core");
4
5
  let react_jsx_runtime = require("react/jsx-runtime");
5
6
  // src/components/layout/section/index.tsx
6
- const Section = ({ children, className, theme = "default", fullWidth = false, noPadding = false, compactTop = false, compactBottom = false, divider = false }) => {
7
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
8
- className: (0, _puzzle_ui_core.cn)("puzzle-section", !fullWidth && "puzzle-container", compactTop && "puzzle-section--compact-top", compactBottom && "puzzle-section--compact-bottom", noPadding && "puzzle-section--no-padding", className),
7
+ const Section = ({ children, className, theme = "default", fullWidth = false, noPadding = false, compactTop = false, compactBottom = false, divider = false, as: Component = "section" }) => {
8
+ const constrainContent = theme !== "default" && !fullWidth;
9
+ const content = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [children, divider && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("hr", { className: "puzzle-section--divider" })] });
10
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Component, {
11
+ className: (0, _puzzle_ui_core.cn)("puzzle-section", !fullWidth && !constrainContent && ["puzzle-container", require_container_utils.getContainerPresetClass("container")], compactTop && "puzzle-section--compact-top", compactBottom && "puzzle-section--compact-bottom", noPadding && "puzzle-section--no-padding", className),
9
12
  "data-theme": theme,
10
- children: [children, divider && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("hr", { className: "puzzle-section--divider" })]
13
+ children: constrainContent ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
14
+ className: (0, _puzzle_ui_core.cn)("puzzle-section__content", "puzzle-container", require_container_utils.getContainerPresetClass("container")),
15
+ children: content
16
+ }) : content
11
17
  });
12
18
  };
13
19
  exports.Section = Section;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["cn"],"sources":["../../../../src/components/layout/section/index.tsx"],"sourcesContent":["import { cn } from \"@puzzle-ui/core\";\nimport type { SectionProps } from \"./types\";\n\nimport \"./section.css\";\nimport \"../container/container.css\";\n\nexport const Section = ({\n children,\n className,\n theme = \"default\",\n fullWidth = false,\n noPadding = false,\n compactTop = false,\n compactBottom = false,\n divider = false,\n}: SectionProps) => {\n return (\n <section\n className={cn(\n \"puzzle-section\",\n !fullWidth && \"puzzle-container\",\n compactTop && \"puzzle-section--compact-top\",\n compactBottom && \"puzzle-section--compact-bottom\",\n noPadding && \"puzzle-section--no-padding\",\n className,\n )}\n data-theme={theme}\n >\n {children}\n {divider && <hr className=\"puzzle-section--divider\" />}\n </section>\n );\n};\n"],"mappings":";;;;;AAMA,MAAa,WAAW,EACtB,UACA,WACA,QAAQ,WACR,YAAY,OACZ,YAAY,OACZ,aAAa,OACb,gBAAgB,OAChB,UAAU,YACQ;CAClB,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;EACE,YAAA,GAAWA,gBAAAA,GAAAA,CACT,kBACA,CAAC,aAAa,oBACd,cAAc,+BACd,iBAAiB,kCACjB,aAAa,8BACb,SACF;EACA,cAAY;EATd,UAAA,CAWG,UACA,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAI,WAAU,0BAA2B,CAAA,CAC9C;;AAEb"}
1
+ {"version":3,"file":"index.cjs","names":["cn","getContainerPresetClass"],"sources":["../../../../src/components/layout/section/index.tsx"],"sourcesContent":["import { cn } from \"@puzzle-ui/core\";\nimport type { SectionProps } from \"./types\";\nimport { getContainerPresetClass } from \"../container/container.utils\";\n\nimport \"./section.css\";\nimport \"../container/container.css\";\n\nexport const Section = ({\n children,\n className,\n theme = \"default\",\n fullWidth = false,\n noPadding = false,\n compactTop = false,\n compactBottom = false,\n divider = false,\n as: Component = \"section\",\n}: SectionProps) => {\n const constrainContent = theme !== \"default\" && !fullWidth;\n const content = (\n <>\n {children}\n {divider && <hr className=\"puzzle-section--divider\" />}\n </>\n );\n\n return (\n <Component\n className={cn(\n \"puzzle-section\",\n !fullWidth && !constrainContent && [\n \"puzzle-container\",\n getContainerPresetClass(\"container\"),\n ],\n compactTop && \"puzzle-section--compact-top\",\n compactBottom && \"puzzle-section--compact-bottom\",\n noPadding && \"puzzle-section--no-padding\",\n className,\n )}\n data-theme={theme}\n >\n {constrainContent ? (\n <div\n className={cn(\n \"puzzle-section__content\",\n \"puzzle-container\",\n getContainerPresetClass(\"container\"),\n )}\n >\n {content}\n </div>\n ) : content}\n </Component>\n );\n};\n"],"mappings":";;;;;;AAOA,MAAa,WAAW,EACtB,UACA,WACA,QAAQ,WACR,YAAY,OACZ,YAAY,OACZ,aAAa,OACb,gBAAgB,OAChB,UAAU,OACV,IAAI,YAAY,gBACE;CAClB,MAAM,mBAAmB,UAAU,aAAa,CAAC;CACjD,MAAM,UACJ,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACG,UACA,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAI,WAAU,0BAA2B,CAAA,CACrD,EAAA,CAAA;CAGJ,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;EACE,YAAA,GAAWA,gBAAAA,GAAAA,CACT,kBACA,CAAC,aAAa,CAAC,oBAAoB,CACjC,oBACAC,wBAAAA,wBAAwB,WAAW,CACrC,GACA,cAAc,+BACd,iBAAiB,kCACjB,aAAa,8BACb,SACF;EACA,cAAY;EAEX,UAAA,mBACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;GACE,YAAA,GAAWD,gBAAAA,GAAAA,CACT,2BACA,oBACAC,wBAAAA,wBAAwB,WAAW,CACrC;GAEC,UAAA;EACE,CAAA,IACH;CACK,CAAA;AAEf"}
@@ -1,2 +1,2 @@
1
1
  import { SectionProps } from "./types.cjs";
2
- export declare const Section: ({ children, className, theme, fullWidth, noPadding, compactTop, compactBottom, divider }: SectionProps) => import("react").JSX.Element;
2
+ export declare const Section: ({ children, className, theme, fullWidth, noPadding, compactTop, compactBottom, divider, as: Component }: SectionProps) => import("react").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  import { SectionProps } from "./types.js";
2
- export declare const Section: ({ children, className, theme, fullWidth, noPadding, compactTop, compactBottom, divider }: SectionProps) => import("react").JSX.Element;
2
+ export declare const Section: ({ children, className, theme, fullWidth, noPadding, compactTop, compactBottom, divider, as: Component }: SectionProps) => import("react").JSX.Element;
@@ -1,13 +1,19 @@
1
+ import { getContainerPresetClass } from "../container/container.utils.js";
1
2
  import "./section.css";
2
3
  import "../container/container.css";
3
4
  import { cn } from "@puzzle-ui/core";
4
- import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
6
  // src/components/layout/section/index.tsx
6
- const Section = ({ children, className, theme = "default", fullWidth = false, noPadding = false, compactTop = false, compactBottom = false, divider = false }) => {
7
- return /* @__PURE__ */ jsxs("section", {
8
- className: cn("puzzle-section", !fullWidth && "puzzle-container", compactTop && "puzzle-section--compact-top", compactBottom && "puzzle-section--compact-bottom", noPadding && "puzzle-section--no-padding", className),
7
+ const Section = ({ children, className, theme = "default", fullWidth = false, noPadding = false, compactTop = false, compactBottom = false, divider = false, as: Component = "section" }) => {
8
+ const constrainContent = theme !== "default" && !fullWidth;
9
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [children, divider && /* @__PURE__ */ jsx("hr", { className: "puzzle-section--divider" })] });
10
+ return /* @__PURE__ */ jsx(Component, {
11
+ className: cn("puzzle-section", !fullWidth && !constrainContent && ["puzzle-container", getContainerPresetClass("container")], compactTop && "puzzle-section--compact-top", compactBottom && "puzzle-section--compact-bottom", noPadding && "puzzle-section--no-padding", className),
9
12
  "data-theme": theme,
10
- children: [children, divider && /* @__PURE__ */ jsx("hr", { className: "puzzle-section--divider" })]
13
+ children: constrainContent ? /* @__PURE__ */ jsx("div", {
14
+ className: cn("puzzle-section__content", "puzzle-container", getContainerPresetClass("container")),
15
+ children: content
16
+ }) : content
11
17
  });
12
18
  };
13
19
  export { Section };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/layout/section/index.tsx"],"sourcesContent":["import { cn } from \"@puzzle-ui/core\";\nimport type { SectionProps } from \"./types\";\n\nimport \"./section.css\";\nimport \"../container/container.css\";\n\nexport const Section = ({\n children,\n className,\n theme = \"default\",\n fullWidth = false,\n noPadding = false,\n compactTop = false,\n compactBottom = false,\n divider = false,\n}: SectionProps) => {\n return (\n <section\n className={cn(\n \"puzzle-section\",\n !fullWidth && \"puzzle-container\",\n compactTop && \"puzzle-section--compact-top\",\n compactBottom && \"puzzle-section--compact-bottom\",\n noPadding && \"puzzle-section--no-padding\",\n className,\n )}\n data-theme={theme}\n >\n {children}\n {divider && <hr className=\"puzzle-section--divider\" />}\n </section>\n );\n};\n"],"mappings":";;;;;AAMA,MAAa,WAAW,EACtB,UACA,WACA,QAAQ,WACR,YAAY,OACZ,YAAY,OACZ,aAAa,OACb,gBAAgB,OAChB,UAAU,YACQ;CAClB,OACE,qBAAC,WAAD;EACE,WAAW,GACT,kBACA,CAAC,aAAa,oBACd,cAAc,+BACd,iBAAiB,kCACjB,aAAa,8BACb,SACF;EACA,cAAY;EATd,UAAA,CAWG,UACA,WAAW,oBAAC,MAAD,EAAI,WAAU,0BAA2B,CAAA,CAC9C;;AAEb"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/layout/section/index.tsx"],"sourcesContent":["import { cn } from \"@puzzle-ui/core\";\nimport type { SectionProps } from \"./types\";\nimport { getContainerPresetClass } from \"../container/container.utils\";\n\nimport \"./section.css\";\nimport \"../container/container.css\";\n\nexport const Section = ({\n children,\n className,\n theme = \"default\",\n fullWidth = false,\n noPadding = false,\n compactTop = false,\n compactBottom = false,\n divider = false,\n as: Component = \"section\",\n}: SectionProps) => {\n const constrainContent = theme !== \"default\" && !fullWidth;\n const content = (\n <>\n {children}\n {divider && <hr className=\"puzzle-section--divider\" />}\n </>\n );\n\n return (\n <Component\n className={cn(\n \"puzzle-section\",\n !fullWidth && !constrainContent && [\n \"puzzle-container\",\n getContainerPresetClass(\"container\"),\n ],\n compactTop && \"puzzle-section--compact-top\",\n compactBottom && \"puzzle-section--compact-bottom\",\n noPadding && \"puzzle-section--no-padding\",\n className,\n )}\n data-theme={theme}\n >\n {constrainContent ? (\n <div\n className={cn(\n \"puzzle-section__content\",\n \"puzzle-container\",\n getContainerPresetClass(\"container\"),\n )}\n >\n {content}\n </div>\n ) : content}\n </Component>\n );\n};\n"],"mappings":";;;;;;AAOA,MAAa,WAAW,EACtB,UACA,WACA,QAAQ,WACR,YAAY,OACZ,YAAY,OACZ,aAAa,OACb,gBAAgB,OAChB,UAAU,OACV,IAAI,YAAY,gBACE;CAClB,MAAM,mBAAmB,UAAU,aAAa,CAAC;CACjD,MAAM,UACJ,qBAAA,UAAA,EAAA,UAAA,CACG,UACA,WAAW,oBAAC,MAAD,EAAI,WAAU,0BAA2B,CAAA,CACrD,EAAA,CAAA;CAGJ,OACE,oBAAC,WAAD;EACE,WAAW,GACT,kBACA,CAAC,aAAa,CAAC,oBAAoB,CACjC,oBACA,wBAAwB,WAAW,CACrC,GACA,cAAc,+BACd,iBAAiB,kCACjB,aAAa,8BACb,SACF;EACA,cAAY;EAEX,UAAA,mBACC,oBAAC,OAAD;GACE,WAAW,GACT,2BACA,oBACA,wBAAwB,WAAW,CACrC;GAEC,UAAA;EACE,CAAA,IACH;CACK,CAAA;AAEf"}
@@ -5,7 +5,7 @@
5
5
  }
6
6
 
7
7
  .puzzle-section {
8
- --section-padding-y: var(--puzzle-container-gutter, clamp(1rem, 3vw, 3rem));
8
+ --section-padding-y: var(--puzzle-container-gutter, clamp(2rem, 6vw, 6rem));
9
9
  --section-gap: var(--puzzle-space-4, 1rem);
10
10
  gap: var(--section-gap);
11
11
  box-sizing: border-box;
@@ -18,6 +18,12 @@
18
18
  display: flex;
19
19
  }
20
20
 
21
+ .puzzle-section__content {
22
+ gap: var(--section-gap);
23
+ flex-direction: column;
24
+ display: flex;
25
+ }
26
+
21
27
  .puzzle-section--divider {
22
28
  border: none;
23
29
  border-top: var(--puzzle-border-width, 1px) solid var(--puzzle-color-border);
@@ -36,12 +42,12 @@
36
42
  padding-block: 0;
37
43
  }
38
44
 
39
- .puzzle-section[data-theme="normal"] {
45
+ .puzzle-section[data-theme="default"] {
40
46
  --section-background: var(--puzzle-color-background);
41
47
  --section-color: var(--puzzle-color-text);
42
48
  }
43
49
 
44
- .puzzle-section[data-theme="normal"] .puzzle-section--divider {
50
+ .puzzle-section[data-theme="default"] .puzzle-section--divider {
45
51
  border-top-color: var(--puzzle-color-border);
46
52
  }
47
53
 
@@ -1,8 +1,7 @@
1
- import { ReactNode } from "react";
1
+ import { ComponentPropsWithRef, ElementType } from "react";
2
2
  export type SectionTheme = "default" | "light" | "dark" | "primary" | "secondary" | "accent";
3
- export type SectionProps = {
4
- children?: ReactNode;
5
- className?: string;
3
+ export type SectionOwnProps<C extends ElementType = "section"> = {
4
+ as?: C;
6
5
  theme?: SectionTheme;
7
6
  fullWidth?: boolean;
8
7
  noPadding?: boolean;
@@ -10,4 +9,5 @@ export type SectionProps = {
10
9
  compactTop?: boolean;
11
10
  compactBottom?: boolean;
12
11
  divider?: boolean;
13
- };
12
+ };
13
+ export type SectionProps<C extends ElementType = "section"> = Omit<ComponentPropsWithRef<C>, keyof SectionOwnProps<C> | "as"> & SectionOwnProps<C>;
@@ -1,8 +1,7 @@
1
- import { ReactNode } from "react";
1
+ import { ComponentPropsWithRef, ElementType } from "react";
2
2
  export type SectionTheme = "default" | "light" | "dark" | "primary" | "secondary" | "accent";
3
- export type SectionProps = {
4
- children?: ReactNode;
5
- className?: string;
3
+ export type SectionOwnProps<C extends ElementType = "section"> = {
4
+ as?: C;
6
5
  theme?: SectionTheme;
7
6
  fullWidth?: boolean;
8
7
  noPadding?: boolean;
@@ -10,4 +9,5 @@ export type SectionProps = {
10
9
  compactTop?: boolean;
11
10
  compactBottom?: boolean;
12
11
  divider?: boolean;
13
- };
12
+ };
13
+ export type SectionProps<C extends ElementType = "section"> = Omit<ComponentPropsWithRef<C>, keyof SectionOwnProps<C> | "as"> & SectionOwnProps<C>;
@@ -0,0 +1,18 @@
1
+ const require_separator_utils = require("./separator.utils.cjs");
2
+ ;/* empty css */
3
+ let _puzzle_ui_core = require("@puzzle-ui/core");
4
+ let react_jsx_runtime = require("react/jsx-runtime");
5
+ // src/components/layout/separator/index.tsx
6
+ const Separator = ({ orientation = "horizontal", decorative = true, className, ref, ...props }) => {
7
+ const semantics = require_separator_utils.getSeparatorSemantics(orientation, decorative);
8
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
9
+ ...props,
10
+ ...semantics,
11
+ ref,
12
+ className: (0, _puzzle_ui_core.cn)("puzzle-separator", className),
13
+ "data-orientation": orientation
14
+ });
15
+ };
16
+ exports.Separator = Separator;
17
+
18
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["getSeparatorSemantics","cn"],"sources":["../../../../src/components/layout/separator/index.tsx"],"sourcesContent":["import { cn } from \"@puzzle-ui/core\";\nimport type { ComponentPropsWithRef } from \"react\";\nimport { getSeparatorSemantics } from \"./separator.utils\";\nimport type { SeparatorOrientation } from \"./separator.utils\";\nimport \"./separator.css\";\n\ntype SeparatorProps = Omit<\n ComponentPropsWithRef<\"div\">,\n \"children\" | \"role\" | \"aria-orientation\"\n> & {\n /**\n * The orientation of the separator.\n * @default \"horizontal\"\n */\n orientation?: SeparatorOrientation;\n\n /**\n * Whether the separator is purely decorative.\n * Decorative separators are hidden from assistive technology.\n * @default true\n */\n decorative?: boolean;\n};\n\nconst Separator = ({\n orientation = \"horizontal\",\n decorative = true,\n className,\n ref,\n ...props\n}: SeparatorProps) => {\n const semantics = getSeparatorSemantics(orientation, decorative);\n\n return (\n <div\n {...props}\n {...semantics}\n ref={ref}\n className={cn(\"puzzle-separator\", className)}\n data-orientation={orientation}\n />\n );\n};\n\nexport { Separator, type SeparatorProps, type SeparatorOrientation };\n"],"mappings":";;;;;AAwBA,MAAM,aAAa,EACjB,cAAc,cACd,aAAa,MACb,WACA,KACA,GAAG,YACiB;CACpB,MAAM,YAAYA,wBAAAA,sBAAsB,aAAa,UAAU;CAE/D,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EACE,GAAI;EACJ,GAAI;EACC;EACL,YAAA,GAAWC,gBAAAA,GAAAA,CAAG,oBAAoB,SAAS;EAC3C,oBAAkB;CACnB,CAAA;AAEL"}
@@ -0,0 +1,17 @@
1
+ import { SeparatorOrientation } from "./separator.utils.cjs";
2
+ import { ComponentPropsWithRef } from "react";
3
+ type SeparatorProps = Omit<ComponentPropsWithRef<"div">, "children" | "role" | "aria-orientation"> & {
4
+ /**
5
+ * The orientation of the separator.
6
+ * @default "horizontal"
7
+ */
8
+ orientation?: SeparatorOrientation;
9
+ /**
10
+ * Whether the separator is purely decorative.
11
+ * Decorative separators are hidden from assistive technology.
12
+ * @default true
13
+ */
14
+ decorative?: boolean;
15
+ };
16
+ declare const Separator: ({ orientation, decorative, className, ref, ...props }: SeparatorProps) => import("react").JSX.Element;
17
+ export { Separator, type SeparatorOrientation, type SeparatorProps };