@tribepad/themis 1.0.1 → 1.0.2

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 (301) hide show
  1. package/dist/elements/Accordion/index.js +1 -335
  2. package/dist/elements/Accordion/index.js.map +1 -1
  3. package/dist/elements/Accordion/index.mjs +1 -317
  4. package/dist/elements/Accordion/index.mjs.map +1 -1
  5. package/dist/elements/AlertDialog/AlertDialog.d.ts +43 -0
  6. package/dist/elements/AlertDialog/AlertDialog.d.ts.map +1 -0
  7. package/dist/elements/AlertDialog/AlertDialog.styles.d.ts +15 -0
  8. package/dist/elements/AlertDialog/AlertDialog.styles.d.ts.map +1 -0
  9. package/dist/elements/AlertDialog/AlertDialog.types.d.ts +72 -0
  10. package/dist/elements/AlertDialog/AlertDialog.types.d.ts.map +1 -0
  11. package/dist/elements/AlertDialog/index.d.ts +25 -0
  12. package/dist/elements/AlertDialog/index.d.ts.map +1 -0
  13. package/dist/elements/AlertDialog/index.js +3 -0
  14. package/dist/elements/AlertDialog/index.js.map +1 -0
  15. package/dist/elements/AlertDialog/index.mjs +3 -0
  16. package/dist/elements/AlertDialog/index.mjs.map +1 -0
  17. package/dist/elements/Avatar/index.js +1 -468
  18. package/dist/elements/Avatar/index.js.map +1 -1
  19. package/dist/elements/Avatar/index.mjs +1 -456
  20. package/dist/elements/Avatar/index.mjs.map +1 -1
  21. package/dist/elements/Badge/index.js +1 -243
  22. package/dist/elements/Badge/index.js.map +1 -1
  23. package/dist/elements/Badge/index.mjs +1 -234
  24. package/dist/elements/Badge/index.mjs.map +1 -1
  25. package/dist/elements/Breadcrumbs/index.js +1 -821
  26. package/dist/elements/Breadcrumbs/index.js.map +1 -1
  27. package/dist/elements/Breadcrumbs/index.mjs +1 -810
  28. package/dist/elements/Breadcrumbs/index.mjs.map +1 -1
  29. package/dist/elements/Button/Button.d.ts +26 -81
  30. package/dist/elements/Button/Button.d.ts.map +1 -1
  31. package/dist/elements/Button/Button.styles.d.ts +35 -0
  32. package/dist/elements/Button/Button.styles.d.ts.map +1 -0
  33. package/dist/elements/Button/Button.types.d.ts +20 -8
  34. package/dist/elements/Button/Button.types.d.ts.map +1 -1
  35. package/dist/elements/Button/index.js +1 -288
  36. package/dist/elements/Button/index.js.map +1 -1
  37. package/dist/elements/Button/index.mjs +1 -283
  38. package/dist/elements/Button/index.mjs.map +1 -1
  39. package/dist/elements/ButtonGroup/index.js +1 -237
  40. package/dist/elements/ButtonGroup/index.js.map +1 -1
  41. package/dist/elements/ButtonGroup/index.mjs +1 -222
  42. package/dist/elements/ButtonGroup/index.mjs.map +1 -1
  43. package/dist/elements/Card/index.js +1 -579
  44. package/dist/elements/Card/index.js.map +1 -1
  45. package/dist/elements/Card/index.mjs +1 -560
  46. package/dist/elements/Card/index.mjs.map +1 -1
  47. package/dist/elements/Carousel/Carousel.d.ts +1 -11
  48. package/dist/elements/Carousel/Carousel.d.ts.map +1 -1
  49. package/dist/elements/Carousel/LazyCarousel.d.ts +1 -1
  50. package/dist/elements/Carousel/LazyCarousel.d.ts.map +1 -1
  51. package/dist/elements/Carousel/index.js +1 -789
  52. package/dist/elements/Carousel/index.js.map +1 -1
  53. package/dist/elements/Carousel/index.mjs +1 -786
  54. package/dist/elements/Carousel/index.mjs.map +1 -1
  55. package/dist/elements/Chart/ChartContext.d.ts.map +1 -1
  56. package/dist/elements/Chart/index.js +1 -1842
  57. package/dist/elements/Chart/index.js.map +1 -1
  58. package/dist/elements/Chart/index.mjs +1 -1832
  59. package/dist/elements/Chart/index.mjs.map +1 -1
  60. package/dist/elements/Checkbox/index.js +1 -316
  61. package/dist/elements/Checkbox/index.js.map +1 -1
  62. package/dist/elements/Checkbox/index.mjs +1 -306
  63. package/dist/elements/Checkbox/index.mjs.map +1 -1
  64. package/dist/elements/CheckboxGroup/index.js +1 -455
  65. package/dist/elements/CheckboxGroup/index.js.map +1 -1
  66. package/dist/elements/CheckboxGroup/index.mjs +1 -439
  67. package/dist/elements/CheckboxGroup/index.mjs.map +1 -1
  68. package/dist/elements/Combobox/Combobox.d.ts +56 -0
  69. package/dist/elements/Combobox/Combobox.d.ts.map +1 -0
  70. package/dist/elements/Combobox/Combobox.styles.d.ts +29 -0
  71. package/dist/elements/Combobox/Combobox.styles.d.ts.map +1 -0
  72. package/dist/elements/Combobox/Combobox.types.d.ts +67 -0
  73. package/dist/elements/Combobox/Combobox.types.d.ts.map +1 -0
  74. package/dist/elements/Combobox/index.d.ts +20 -0
  75. package/dist/elements/Combobox/index.d.ts.map +1 -0
  76. package/dist/elements/Combobox/index.js +3 -0
  77. package/dist/elements/Combobox/index.js.map +1 -0
  78. package/dist/elements/Combobox/index.mjs +3 -0
  79. package/dist/elements/Combobox/index.mjs.map +1 -0
  80. package/dist/elements/DatePicker/DatePicker.d.ts +1 -1
  81. package/dist/elements/DatePicker/DatePicker.d.ts.map +1 -1
  82. package/dist/elements/DatePicker/index.js +1 -903
  83. package/dist/elements/DatePicker/index.js.map +1 -1
  84. package/dist/elements/DatePicker/index.mjs +1 -853
  85. package/dist/elements/DatePicker/index.mjs.map +1 -1
  86. package/dist/elements/Dropdown/Dropdown.d.ts +7 -15
  87. package/dist/elements/Dropdown/Dropdown.d.ts.map +1 -1
  88. package/dist/elements/Dropdown/Dropdown.styles.d.ts +22 -0
  89. package/dist/elements/Dropdown/Dropdown.styles.d.ts.map +1 -0
  90. package/dist/elements/Dropdown/index.d.ts +1 -0
  91. package/dist/elements/Dropdown/index.d.ts.map +1 -1
  92. package/dist/elements/Dropdown/index.js +1 -193
  93. package/dist/elements/Dropdown/index.js.map +1 -1
  94. package/dist/elements/Dropdown/index.mjs +1 -184
  95. package/dist/elements/Dropdown/index.mjs.map +1 -1
  96. package/dist/elements/FileField/index.js +1 -1539
  97. package/dist/elements/FileField/index.js.map +1 -1
  98. package/dist/elements/FileField/index.mjs +1 -1507
  99. package/dist/elements/FileField/index.mjs.map +1 -1
  100. package/dist/elements/FormLayout/index.js +1 -170
  101. package/dist/elements/FormLayout/index.js.map +1 -1
  102. package/dist/elements/FormLayout/index.mjs +1 -167
  103. package/dist/elements/FormLayout/index.mjs.map +1 -1
  104. package/dist/elements/Modal/Modal.d.ts +9 -14
  105. package/dist/elements/Modal/Modal.d.ts.map +1 -1
  106. package/dist/elements/Modal/Modal.styles.d.ts +29 -0
  107. package/dist/elements/Modal/Modal.styles.d.ts.map +1 -0
  108. package/dist/elements/Modal/index.d.ts +1 -0
  109. package/dist/elements/Modal/index.d.ts.map +1 -1
  110. package/dist/elements/Modal/index.js +1 -232
  111. package/dist/elements/Modal/index.js.map +1 -1
  112. package/dist/elements/Modal/index.mjs +1 -220
  113. package/dist/elements/Modal/index.mjs.map +1 -1
  114. package/dist/elements/NumberField/index.js +1 -666
  115. package/dist/elements/NumberField/index.js.map +1 -1
  116. package/dist/elements/NumberField/index.mjs +1 -654
  117. package/dist/elements/NumberField/index.mjs.map +1 -1
  118. package/dist/elements/OTPInput/OTPInput.d.ts.map +1 -1
  119. package/dist/elements/OTPInput/index.js +1 -734
  120. package/dist/elements/OTPInput/index.js.map +1 -1
  121. package/dist/elements/OTPInput/index.mjs +1 -732
  122. package/dist/elements/OTPInput/index.mjs.map +1 -1
  123. package/dist/elements/Pagination/Pagination.d.ts +45 -0
  124. package/dist/elements/Pagination/Pagination.d.ts.map +1 -0
  125. package/dist/elements/Pagination/Pagination.styles.d.ts +10 -0
  126. package/dist/elements/Pagination/Pagination.styles.d.ts.map +1 -0
  127. package/dist/elements/Pagination/Pagination.types.d.ts +55 -0
  128. package/dist/elements/Pagination/Pagination.types.d.ts.map +1 -0
  129. package/dist/elements/Pagination/index.d.ts +21 -0
  130. package/dist/elements/Pagination/index.d.ts.map +1 -0
  131. package/dist/elements/Pagination/index.js +3 -0
  132. package/dist/elements/Pagination/index.js.map +1 -0
  133. package/dist/elements/Pagination/index.mjs +3 -0
  134. package/dist/elements/Pagination/index.mjs.map +1 -0
  135. package/dist/elements/Panel/index.js +1 -330
  136. package/dist/elements/Panel/index.js.map +1 -1
  137. package/dist/elements/Panel/index.mjs +1 -323
  138. package/dist/elements/Panel/index.mjs.map +1 -1
  139. package/dist/elements/PasswordField/PasswordField.d.ts +27 -0
  140. package/dist/elements/PasswordField/PasswordField.d.ts.map +1 -0
  141. package/dist/elements/PasswordField/PasswordField.styles.d.ts +32 -0
  142. package/dist/elements/PasswordField/PasswordField.styles.d.ts.map +1 -0
  143. package/dist/elements/PasswordField/PasswordField.types.d.ts +100 -0
  144. package/dist/elements/PasswordField/PasswordField.types.d.ts.map +1 -0
  145. package/dist/elements/PasswordField/index.css +2 -0
  146. package/dist/elements/PasswordField/index.css.map +1 -0
  147. package/dist/elements/PasswordField/index.d.ts +20 -0
  148. package/dist/elements/PasswordField/index.d.ts.map +1 -0
  149. package/dist/elements/PasswordField/index.js +3 -0
  150. package/dist/elements/PasswordField/index.js.map +1 -0
  151. package/dist/elements/PasswordField/index.mjs +3 -0
  152. package/dist/elements/PasswordField/index.mjs.map +1 -0
  153. package/dist/elements/Progress/index.js +1 -187
  154. package/dist/elements/Progress/index.js.map +1 -1
  155. package/dist/elements/Progress/index.mjs +1 -181
  156. package/dist/elements/Progress/index.mjs.map +1 -1
  157. package/dist/elements/RadioGroup/index.js +1 -369
  158. package/dist/elements/RadioGroup/index.js.map +1 -1
  159. package/dist/elements/RadioGroup/index.mjs +1 -359
  160. package/dist/elements/RadioGroup/index.mjs.map +1 -1
  161. package/dist/elements/Resizable/index.js +1 -1580
  162. package/dist/elements/Resizable/index.js.map +1 -1
  163. package/dist/elements/Resizable/index.mjs +1 -1566
  164. package/dist/elements/Resizable/index.mjs.map +1 -1
  165. package/dist/elements/SearchField/SearchField.d.ts +27 -0
  166. package/dist/elements/SearchField/SearchField.d.ts.map +1 -0
  167. package/dist/elements/SearchField/SearchField.styles.d.ts +32 -0
  168. package/dist/elements/SearchField/SearchField.styles.d.ts.map +1 -0
  169. package/dist/elements/SearchField/SearchField.types.d.ts +45 -0
  170. package/dist/elements/SearchField/SearchField.types.d.ts.map +1 -0
  171. package/dist/elements/SearchField/index.css +2 -0
  172. package/dist/elements/SearchField/index.css.map +1 -0
  173. package/dist/elements/SearchField/index.d.ts +21 -0
  174. package/dist/elements/SearchField/index.d.ts.map +1 -0
  175. package/dist/elements/SearchField/index.js +3 -0
  176. package/dist/elements/SearchField/index.js.map +1 -0
  177. package/dist/elements/SearchField/index.mjs +3 -0
  178. package/dist/elements/SearchField/index.mjs.map +1 -0
  179. package/dist/elements/Select/Select.d.ts +19 -48
  180. package/dist/elements/Select/Select.d.ts.map +1 -1
  181. package/dist/elements/Select/Select.styles.d.ts +55 -0
  182. package/dist/elements/Select/Select.styles.d.ts.map +1 -0
  183. package/dist/elements/Select/index.js +1 -589
  184. package/dist/elements/Select/index.js.map +1 -1
  185. package/dist/elements/Select/index.mjs +1 -582
  186. package/dist/elements/Select/index.mjs.map +1 -1
  187. package/dist/elements/Skeleton/index.js +1 -82
  188. package/dist/elements/Skeleton/index.js.map +1 -1
  189. package/dist/elements/Skeleton/index.mjs +1 -78
  190. package/dist/elements/Skeleton/index.mjs.map +1 -1
  191. package/dist/elements/Switch/index.js +1 -179
  192. package/dist/elements/Switch/index.js.map +1 -1
  193. package/dist/elements/Switch/index.mjs +1 -173
  194. package/dist/elements/Switch/index.mjs.map +1 -1
  195. package/dist/elements/Table/Table.d.ts +3 -24
  196. package/dist/elements/Table/Table.d.ts.map +1 -1
  197. package/dist/elements/Table/Table.styles.d.ts +24 -0
  198. package/dist/elements/Table/Table.styles.d.ts.map +1 -0
  199. package/dist/elements/Table/index.js +1 -595
  200. package/dist/elements/Table/index.js.map +1 -1
  201. package/dist/elements/Table/index.mjs +1 -578
  202. package/dist/elements/Table/index.mjs.map +1 -1
  203. package/dist/elements/Tabs/index.js +1 -337
  204. package/dist/elements/Tabs/index.js.map +1 -1
  205. package/dist/elements/Tabs/index.mjs +1 -320
  206. package/dist/elements/Tabs/index.mjs.map +1 -1
  207. package/dist/elements/TextField/TextField.d.ts +6 -42
  208. package/dist/elements/TextField/TextField.d.ts.map +1 -1
  209. package/dist/elements/TextField/TextField.hooks.d.ts +63 -0
  210. package/dist/elements/TextField/TextField.hooks.d.ts.map +1 -0
  211. package/dist/elements/TextField/TextField.icons.d.ts +19 -0
  212. package/dist/elements/TextField/TextField.icons.d.ts.map +1 -0
  213. package/dist/elements/TextField/TextField.styles.d.ts +37 -0
  214. package/dist/elements/TextField/TextField.styles.d.ts.map +1 -0
  215. package/dist/elements/TextField/TextField.types.d.ts +3 -0
  216. package/dist/elements/TextField/TextField.types.d.ts.map +1 -1
  217. package/dist/elements/TextField/index.css +1 -22
  218. package/dist/elements/TextField/index.css.map +1 -1
  219. package/dist/elements/TextField/index.js +1 -902
  220. package/dist/elements/TextField/index.js.map +1 -1
  221. package/dist/elements/TextField/index.mjs +1 -882
  222. package/dist/elements/TextField/index.mjs.map +1 -1
  223. package/dist/elements/TimeField/index.js +1 -254
  224. package/dist/elements/TimeField/index.js.map +1 -1
  225. package/dist/elements/TimeField/index.mjs +1 -238
  226. package/dist/elements/TimeField/index.mjs.map +1 -1
  227. package/dist/elements/Toast/Toast.d.ts +0 -22
  228. package/dist/elements/Toast/Toast.d.ts.map +1 -1
  229. package/dist/elements/Toast/index.js +1 -737
  230. package/dist/elements/Toast/index.js.map +1 -1
  231. package/dist/elements/Toast/index.mjs +1 -724
  232. package/dist/elements/Toast/index.mjs.map +1 -1
  233. package/dist/elements/Tooltip/index.js +1 -323
  234. package/dist/elements/Tooltip/index.js.map +1 -1
  235. package/dist/elements/Tooltip/index.mjs +1 -310
  236. package/dist/elements/Tooltip/index.mjs.map +1 -1
  237. package/dist/elements/index.css +1 -22
  238. package/dist/elements/index.css.map +1 -1
  239. package/dist/elements/index.d.ts +13 -1
  240. package/dist/elements/index.d.ts.map +1 -1
  241. package/dist/elements/index.js +1 -12455
  242. package/dist/elements/index.js.map +1 -1
  243. package/dist/elements/index.mjs +1 -12233
  244. package/dist/elements/index.mjs.map +1 -1
  245. package/dist/index.css +1 -22
  246. package/dist/index.css.map +1 -1
  247. package/dist/index.js +2 -12490
  248. package/dist/index.js.map +1 -1
  249. package/dist/index.mjs +2 -12262
  250. package/dist/index.mjs.map +1 -1
  251. package/dist/schemas/index.js +2 -54
  252. package/dist/schemas/index.js.map +1 -1
  253. package/dist/schemas/index.mjs +2 -48
  254. package/dist/schemas/index.mjs.map +1 -1
  255. package/dist/styles/defaults.css +151 -0
  256. package/dist/styles/index.js +1 -166
  257. package/dist/styles/index.js.map +1 -1
  258. package/dist/styles/index.mjs +1 -129
  259. package/dist/styles/index.mjs.map +1 -1
  260. package/dist/utils/index.js +1 -12
  261. package/dist/utils/index.js.map +1 -1
  262. package/dist/utils/index.mjs +1 -10
  263. package/dist/utils/index.mjs.map +1 -1
  264. package/package.json +9 -7
  265. package/src/elements/Accordion/Accordion.stories.tsx +1 -1
  266. package/src/elements/AlertDialog/AlertDialog.stories.tsx +124 -0
  267. package/src/elements/Avatar/Avatar.stories.tsx +1 -1
  268. package/src/elements/Badge/Badge.stories.tsx +1 -1
  269. package/src/elements/Breadcrumbs/Breadcrumbs.stories.tsx +1 -1
  270. package/src/elements/Button/Button.stories.tsx +1 -1
  271. package/src/elements/ButtonGroup/ButtonGroup.stories.tsx +1 -1
  272. package/src/elements/Card/Card.stories.tsx +1 -1
  273. package/src/elements/Carousel/Carousel.stories.tsx +1 -1
  274. package/src/elements/Chart/Chart.stories.tsx +1 -1
  275. package/src/elements/Checkbox/Checkbox.stories.tsx +1 -1
  276. package/src/elements/CheckboxGroup/CheckboxGroup.stories.tsx +1 -1
  277. package/src/elements/Combobox/Combobox.stories.tsx +133 -0
  278. package/src/elements/DatePicker/DatePicker.stories.tsx +1 -1
  279. package/src/elements/Dropdown/Dropdown.stories.tsx +1 -1
  280. package/src/elements/FileField/FileField.stories.tsx +1 -1
  281. package/src/elements/FileField/FileProgress.stories.tsx +1 -1
  282. package/src/elements/FormLayout/FormLayout.stories.tsx +1 -1
  283. package/src/elements/Modal/Modal.stories.tsx +1 -1
  284. package/src/elements/NumberField/NumberField.stories.tsx +1 -1
  285. package/src/elements/OTPInput/OTPInput.stories.tsx +1 -1
  286. package/src/elements/Pagination/Pagination.stories.tsx +203 -0
  287. package/src/elements/Panel/Panel.stories.tsx +1 -1
  288. package/src/elements/PasswordField/PasswordField.stories.tsx +167 -0
  289. package/src/elements/Progress/Progress.stories.tsx +1 -1
  290. package/src/elements/RadioGroup/RadioGroup.stories.tsx +1 -1
  291. package/src/elements/Resizable/Resizable.stories.tsx +1 -1
  292. package/src/elements/SearchField/SearchField.stories.tsx +146 -0
  293. package/src/elements/Select/Select.stories.tsx +1 -1
  294. package/src/elements/Skeleton/Skeleton.stories.tsx +1 -1
  295. package/src/elements/Switch/Switch.stories.tsx +1 -1
  296. package/src/elements/Table/Table.stories.tsx +1 -1
  297. package/src/elements/Tabs/Tabs.stories.tsx +1 -1
  298. package/src/elements/TextField/TextField.stories.tsx +1 -1
  299. package/src/elements/TimeField/TimeField.stories.tsx +1 -1
  300. package/src/elements/Toast/Toast.stories.tsx +1 -1
  301. package/src/elements/Tooltip/Tooltip.stories.tsx +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/cn.ts","../../../src/elements/Resizable/hooks/useResizableContext.ts","../../../src/elements/Resizable/components/ResizablePanelGroup.tsx","../../../src/elements/Resizable/Resizable.types.ts","../../../src/elements/Resizable/components/ResizablePanel.tsx","../../../src/elements/Resizable/hooks/useResizable.ts","../../../src/styles/interaction-states.ts","../../../src/elements/ButtonGroup/ButtonGroupContext.tsx","../../../src/elements/ButtonGroup/ButtonGroup.variants.ts","../../../src/elements/Button/Button.tsx","../../../src/elements/NumberField/NumberField.types.ts","../../../src/elements/NumberField/NumberField.variants.ts","../../../src/elements/NumberField/NumberField.tsx","../../../src/elements/Resizable/components/ResizablePopover.tsx","../../../src/elements/Resizable/components/ResizableHandle.tsx"],"names":["twMerge","clsx","createContext","useContext","useState","useRef","useCallback","useEffect","forwardRef","ResizablePanelGroup","useImperativeHandle","jsx","z","cva","ResizablePanel","memo","useId","AriaButton","jsxs","Fragment","Loader2","Zap","AriaNumberField","AriaLabel","AriaGroup","Minus","AriaInput","Plus","AriaText","AriaFieldError","ResizablePopover","leftSize","rightSize","DialogTrigger","Popover","Dialog","X","ResizableHandle","GripVertical","GripHorizontal"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Class Name Utility\n * Merges Tailwind CSS classes with conflict resolution\n *\n * Combines clsx for conditional classes and tailwind-merge for deduplication\n *\n * @example\n * cn('px-2 py-1', 'px-4') // => 'py-1 px-4' (px-4 overrides px-2)\n * cn('text-red-500', condition && 'text-blue-500') // => conditional application\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * Resizable Context Hook\n *\n * Provides context for ResizablePanelGroup compound components.\n * Manages panel sizes, registration, and screen reader announcements.\n */\n\nimport {\n createContext,\n useContext,\n useRef,\n useState,\n useCallback,\n useEffect,\n type ReactNode,\n} from 'react';\nimport type { ResizableContextValue, PanelInfo } from '../Resizable.types';\n\n// ============================================================================\n// Context\n// ============================================================================\n\n/**\n * Context for Resizable compound components.\n * Must be used within a ResizablePanelGroup.\n */\nexport const ResizableContext = createContext<ResizableContextValue | null>(\n null\n);\n\nResizableContext.displayName = 'ResizableContext';\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook to access ResizableContext.\n * Throws an error if used outside of ResizablePanelGroup.\n *\n * @returns ResizableContextValue\n * @throws Error if used outside ResizablePanelGroup\n */\nexport function useResizableContext(): ResizableContextValue {\n const context = useContext(ResizableContext);\n\n if (!context) {\n throw new Error(\n 'useResizableContext must be used within a ResizablePanelGroup. ' +\n 'Make sure ResizablePanel and ResizableHandle are children of ResizablePanelGroup.'\n );\n }\n\n return context;\n}\n\n// ============================================================================\n// Provider Props\n// ============================================================================\n\ninterface ResizableProviderProps {\n direction: 'horizontal' | 'vertical';\n groupLabel: string;\n sizes?: number[];\n defaultSizes?: number[];\n onSizesChange?: (sizes: number[]) => void;\n children: ReactNode;\n}\n\n// ============================================================================\n// Provider Hook\n// ============================================================================\n\n/**\n * Hook to create ResizableContext value for the provider.\n * Handles both controlled and uncontrolled modes.\n */\nexport function useResizableProvider({\n direction,\n groupLabel,\n sizes: controlledSizes,\n onSizesChange,\n}: Omit<ResizableProviderProps, 'children'>): ResizableContextValue {\n // Internal state for uncontrolled mode\n const [internalSizes, setInternalSizes] = useState<number[]>([]);\n\n // Panel registration\n const [panels, setPanels] = useState<PanelInfo[]>([]);\n\n // Container ref for size calculations\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Live region ref for announcements\n const liveRegionRef = useRef<HTMLDivElement | null>(null);\n const announceTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Track if sizes have been initialized\n const sizesInitializedRef = useRef(false);\n\n // Determine if controlled\n const isControlled = controlledSizes !== undefined;\n const sizes = isControlled ? controlledSizes : internalSizes;\n\n /**\n * Update sizes - handles both controlled and uncontrolled modes.\n */\n const setSizes = useCallback(\n (newSizes: number[]) => {\n if (isControlled) {\n onSizesChange?.(newSizes);\n } else {\n setInternalSizes(newSizes);\n }\n },\n [isControlled, onSizesChange]\n );\n\n /**\n * Register a panel with the group.\n */\n const registerPanel = useCallback((index: number, info: PanelInfo) => {\n setPanels((prev) => {\n const newPanels = [...prev];\n newPanels[index] = info;\n return newPanels;\n });\n }, []);\n\n /**\n * Unregister a panel from the group.\n */\n const unregisterPanel = useCallback((index: number) => {\n setPanels((prev) => {\n const newPanels = [...prev];\n delete newPanels[index];\n return newPanels.filter(Boolean);\n });\n }, []);\n\n // Initialize sizes when panels are registered (uncontrolled mode only)\n useEffect(() => {\n // Skip if controlled or already initialized\n if (isControlled || sizesInitializedRef.current) return;\n\n // Get registered panel count\n const registeredPanels = panels.filter(Boolean);\n const panelCount = registeredPanels.length;\n\n // Wait until we have at least 2 panels (common case: panel + panel with handle between)\n if (panelCount < 2) return;\n\n // Check if sizes need initialization\n const needsInit = sizes.length < panelCount || sizes.some((s) => s === undefined);\n\n if (needsInit) {\n // Initialize with equal distribution using defaultSize from each panel if available\n const newSizes: number[] = [];\n const equalSize = 100 / panelCount;\n\n for (let i = 0; i < panelCount; i++) {\n newSizes[i] = equalSize;\n }\n\n sizesInitializedRef.current = true;\n setInternalSizes(newSizes);\n }\n }, [panels, sizes, isControlled]);\n\n // Cleanup live region on unmount\n useEffect(() => {\n return () => {\n if (announceTimeoutRef.current) {\n clearTimeout(announceTimeoutRef.current);\n }\n if (liveRegionRef.current) {\n document.body.removeChild(liveRegionRef.current);\n liveRegionRef.current = null;\n }\n };\n }, []);\n\n /**\n * Announce a message to screen readers via live region.\n */\n const announce = useCallback((message: string) => {\n // Create live region if it doesn't exist\n if (!liveRegionRef.current) {\n const liveRegion = document.createElement('div');\n liveRegion.setAttribute('aria-live', 'polite');\n liveRegion.setAttribute('aria-atomic', 'true');\n liveRegion.className = 'sr-only';\n liveRegion.style.cssText =\n 'position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;';\n document.body.appendChild(liveRegion);\n liveRegionRef.current = liveRegion;\n }\n\n // Update live region content\n liveRegionRef.current.textContent = message;\n\n // Clear previous timeout if any\n if (announceTimeoutRef.current) {\n clearTimeout(announceTimeoutRef.current);\n }\n\n // Clear after announcement\n announceTimeoutRef.current = setTimeout(() => {\n if (liveRegionRef.current) {\n liveRegionRef.current.textContent = '';\n }\n }, 1000);\n }, []);\n\n return {\n direction,\n groupLabel,\n sizes,\n setSizes,\n panels,\n registerPanel,\n unregisterPanel,\n announce,\n containerRef,\n };\n}\n","'use client';\n\n/**\n * ResizablePanelGroup Component\n *\n * Container component for resizable panel layouts.\n * Provides context for child panels and handles.\n *\n * @see {@link ../../docs/prd/resizable-prd.md} for full requirements\n */\n\nimport { forwardRef, useImperativeHandle, type ReactElement } from 'react';\nimport { cn } from '../../../utils/cn';\nimport type { ResizablePanelGroupProps } from '../Resizable.types';\nimport {\n ResizableContext,\n useResizableProvider,\n} from '../hooks/useResizableContext';\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * ResizablePanelGroup - Container for resizable panels.\n *\n * Provides context for child ResizablePanel and ResizableHandle components.\n * Supports both controlled and uncontrolled modes.\n *\n * @example\n * ```tsx\n * <ResizablePanelGroup direction=\"horizontal\" groupLabel=\"Main layout\">\n * <ResizablePanel name=\"Sidebar\">Content</ResizablePanel>\n * <ResizableHandle />\n * <ResizablePanel name=\"Main\">Content</ResizablePanel>\n * </ResizablePanelGroup>\n * ```\n */\nexport const ResizablePanelGroup = forwardRef<\n HTMLDivElement | null,\n ResizablePanelGroupProps\n>(function ResizablePanelGroup(\n { direction, groupLabel, sizes, onSizesChange, className, children },\n ref\n): ReactElement {\n // Create context value with controlled/uncontrolled handling\n const contextValue = useResizableProvider({\n direction,\n groupLabel,\n sizes,\n onSizesChange,\n });\n\n // Expose containerRef to parent via forwarded ref\n useImperativeHandle<HTMLDivElement | null, HTMLDivElement | null>(\n ref,\n () => contextValue.containerRef.current,\n [contextValue.containerRef]\n );\n\n return (\n <ResizableContext.Provider value={contextValue}>\n <div\n ref={contextValue.containerRef}\n role=\"group\"\n aria-label={`${groupLabel}, ${direction}`}\n data-direction={direction}\n className={cn(\n 'flex h-full w-full',\n direction === 'horizontal' ? 'flex-row' : 'flex-col',\n className\n )}\n >\n {children}\n </div>\n </ResizableContext.Provider>\n );\n});\n\nResizablePanelGroup.displayName = 'ResizablePanelGroup';\n","/**\n * Resizable Component Types\n *\n * Zod schemas and TypeScript types for the Resizable compound component.\n * Provides accessible, keyboard-navigable resizable panel layouts.\n *\n * @see {@link ../../docs/prd/resizable-prd.md} for full requirements\n */\n\nimport { z } from 'zod';\nimport { type ReactNode } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default minimum panel size (percentage).\n */\nexport const DEFAULT_MIN_SIZE = 10;\n\n/**\n * Default maximum panel size (percentage).\n */\nexport const DEFAULT_MAX_SIZE = 90;\n\n/**\n * Long-press threshold for touch devices (ms).\n * Tap (< threshold) opens popover, long-press (>= threshold) enables drag.\n */\nexport const LONG_PRESS_THRESHOLD = 300;\n\n// ============================================================================\n// Preset Type\n// ============================================================================\n\n/**\n * Size preset for quick adjustment via popover.\n */\nexport interface ResizePreset {\n /** Display label for the preset button */\n label: string;\n /** Size percentages for each panel (must sum to 100) */\n sizes: number[];\n}\n\n/**\n * Zod schema for ResizePreset validation.\n */\nexport const ResizePresetSchema = z.object({\n label: z.string().min(1),\n sizes: z.array(z.number().min(0).max(100)),\n});\n\n// ============================================================================\n// ResizablePanelGroup Props\n// ============================================================================\n\n/**\n * Zod schema for ResizablePanelGroup props.\n */\nexport const ResizablePanelGroupPropsSchema = z.object({\n /** Layout direction */\n direction: z.enum(['horizontal', 'vertical']),\n\n /** REQUIRED: Label for screen reader identification of this group */\n groupLabel: z.string().min(1),\n\n /** Controlled mode: current sizes as percentages */\n sizes: z.array(z.number().min(0).max(100)).optional(),\n\n /** Callback when sizes change */\n onSizesChange: z.function().optional(),\n\n /** Additional CSS classes */\n className: z.string().optional(),\n\n /** Panel children */\n children: z.custom<ReactNode>(),\n});\n\n/**\n * Props for ResizablePanelGroup component.\n */\nexport interface ResizablePanelGroupProps {\n /** Layout direction: 'horizontal' or 'vertical' */\n direction: 'horizontal' | 'vertical';\n\n /** REQUIRED: Label for screen reader identification (e.g., \"Main layout\") */\n groupLabel: string;\n\n /** Controlled mode: current sizes as percentages (must sum to 100) */\n sizes?: number[];\n\n /** Callback when sizes change */\n onSizesChange?: (sizes: number[]) => void;\n\n /** Additional CSS classes */\n className?: string;\n\n /** Panel and Handle children */\n children: ReactNode;\n}\n\n// ============================================================================\n// ResizablePanel Props\n// ============================================================================\n\n/**\n * Zod schema for ResizablePanel props.\n */\nexport const ResizablePanelPropsSchema = z.object({\n /** REQUIRED: Name for screen reader identification */\n name: z.string().min(1),\n\n /** Default size as percentage (auto-distributes equally if omitted) */\n defaultSize: z.number().min(0).max(100).optional(),\n\n /** Minimum size as percentage */\n minSize: z.number().min(0).max(100).optional().default(DEFAULT_MIN_SIZE),\n\n /** Maximum size as percentage */\n maxSize: z.number().min(0).max(100).optional().default(DEFAULT_MAX_SIZE),\n\n /** Whether panel can collapse to 0% */\n collapsible: z.boolean().optional().default(false),\n\n /** Callback when panel collapses */\n onCollapse: z.function().optional(),\n\n /** Callback when panel expands from collapsed */\n onExpand: z.function().optional(),\n\n /** Callback when panel resizes */\n onResize: z.function().optional(),\n\n /** Additional CSS classes */\n className: z.string().optional(),\n\n /** Panel content */\n children: z.custom<ReactNode>(),\n});\n\n/**\n * Props for ResizablePanel component.\n */\nexport interface ResizablePanelProps {\n /** REQUIRED: Name for screen reader identification (e.g., \"Sidebar\") */\n name: string;\n\n /** Default size as percentage (0-100). Auto-distributes equally if omitted. */\n defaultSize?: number;\n\n /** Minimum size as percentage (default: 10) */\n minSize?: number;\n\n /** Maximum size as percentage (default: 90) */\n maxSize?: number;\n\n /** Whether panel can collapse to 0% */\n collapsible?: boolean;\n\n /** Callback when panel collapses to 0% */\n onCollapse?: () => void;\n\n /** Callback when panel expands from collapsed state */\n onExpand?: () => void;\n\n /** Callback when panel size changes */\n onResize?: (size: number) => void;\n\n /** Additional CSS classes */\n className?: string;\n\n /** Panel content */\n children: ReactNode;\n}\n\n// ============================================================================\n// ResizableHandle Props\n// ============================================================================\n\n/**\n * Zod schema for ResizableHandle props.\n */\nexport const ResizableHandlePropsSchema = z.object({\n /** Whether to show the visual grip indicator */\n withHandle: z.boolean().optional().default(true),\n\n /** Size presets for quick adjustment */\n presets: z.array(ResizePresetSchema).optional(),\n\n /** Whether the handle is disabled */\n disabled: z.boolean().optional().default(false),\n\n /** Additional CSS classes */\n className: z.string().optional(),\n});\n\n/**\n * Props for ResizableHandle component.\n */\nexport interface ResizableHandleProps {\n /** Whether to show the visual grip indicator (default: true) */\n withHandle?: boolean;\n\n /** Size presets for quick adjustment via popover */\n presets?: ResizePreset[];\n\n /** Whether the handle is disabled */\n disabled?: boolean;\n\n /** Additional CSS classes */\n className?: string;\n}\n\n// ============================================================================\n// Context Types\n// ============================================================================\n\n/**\n * Panel registration info stored in context.\n */\nexport interface PanelInfo {\n name: string;\n minSize: number;\n maxSize: number;\n collapsible: boolean;\n}\n\n/**\n * Context value for ResizablePanelGroup.\n */\nexport interface ResizableContextValue {\n /** Layout direction */\n direction: 'horizontal' | 'vertical';\n\n /** Group label for screen reader announcements */\n groupLabel: string;\n\n /** Current panel sizes as percentages */\n sizes: number[];\n\n /** Update panel sizes */\n setSizes: (sizes: number[]) => void;\n\n /** Registered panel info */\n panels: PanelInfo[];\n\n /** Register a panel with the group */\n registerPanel: (index: number, info: PanelInfo) => void;\n\n /** Unregister a panel */\n unregisterPanel: (index: number) => void;\n\n /** Announce a message to screen readers */\n announce: (message: string) => void;\n\n /** Reference to the container element */\n containerRef: React.RefObject<HTMLDivElement | null>;\n}\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * CVA variants for ResizableHandle styling.\n * Ensures 44x44px touch target for WCAG 2.2 AAA compliance.\n */\nexport const resizableHandleVariants = cva(\n [\n // Base styles - 44px touch target\n 'relative flex items-center justify-center',\n 'shrink-0',\n 'bg-transparent',\n 'transition-colors duration-150',\n // Focus styles\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2',\n // Touch target padding for accessibility\n 'touch-none select-none',\n ],\n {\n variants: {\n direction: {\n horizontal: [\n 'w-3 min-w-[12px]',\n 'cursor-col-resize',\n 'hover:bg-[var(--accent)]/50',\n // Ensure 44px touch target via padding\n 'before:absolute before:inset-y-0 before:-inset-x-4',\n 'before:min-w-[44px]',\n ],\n vertical: [\n 'h-3 min-h-[12px]',\n 'cursor-row-resize',\n 'hover:bg-[var(--accent)]/50',\n // Ensure 44px touch target via padding\n 'before:absolute before:inset-x-0 before:-inset-y-4',\n 'before:min-h-[44px]',\n ],\n },\n disabled: {\n true: 'cursor-not-allowed opacity-50 pointer-events-none',\n false: '',\n },\n isDragging: {\n true: 'bg-[var(--accent)]',\n false: '',\n },\n },\n defaultVariants: {\n direction: 'horizontal',\n disabled: false,\n isDragging: false,\n },\n }\n);\n\n/**\n * CVA variants for the grip indicator inside the handle.\n */\nexport const resizableGripVariants = cva(\n [\n 'flex items-center justify-center',\n 'rounded-full',\n 'bg-[var(--border)]',\n 'text-[var(--menu-muted)]',\n ],\n {\n variants: {\n direction: {\n horizontal: 'h-8 w-1',\n vertical: 'h-1 w-8',\n },\n },\n defaultVariants: {\n direction: 'horizontal',\n },\n }\n);\n\n/**\n * Type for resizableHandleVariants props.\n */\nexport type ResizableHandleVariantProps = VariantProps<\n typeof resizableHandleVariants\n>;\n","'use client';\n\n/**\n * ResizablePanel Component\n *\n * Individual panel within a ResizablePanelGroup.\n * Registers with context and applies size from group state.\n *\n * @see {@link ../../docs/prd/resizable-prd.md} for full requirements\n */\n\nimport {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type ReactElement,\n} from 'react';\nimport { cn } from '../../../utils/cn';\nimport type { ResizablePanelProps } from '../Resizable.types';\nimport { DEFAULT_MIN_SIZE, DEFAULT_MAX_SIZE } from '../Resizable.types';\nimport { useResizableContext } from '../hooks/useResizableContext';\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * ResizablePanel - Individual panel in a resizable layout.\n *\n * Must be used within a ResizablePanelGroup.\n * Registers itself with context for size management.\n *\n * @example\n * ```tsx\n * <ResizablePanel name=\"Sidebar\" defaultSize={25} minSize={15} maxSize={40}>\n * <SidebarContent />\n * </ResizablePanel>\n * ```\n */\nexport const ResizablePanel = forwardRef<HTMLDivElement, ResizablePanelProps>(\n function ResizablePanel(\n {\n name,\n defaultSize: _defaultSize,\n minSize = DEFAULT_MIN_SIZE,\n maxSize = DEFAULT_MAX_SIZE,\n collapsible = false,\n onCollapse,\n onExpand,\n onResize,\n className,\n children,\n },\n ref\n ): ReactElement {\n const { sizes, registerPanel, unregisterPanel, containerRef } =\n useResizableContext();\n\n // Internal ref for DOM element\n const internalRef = useRef<HTMLDivElement>(null);\n\n // Track panel index based on DOM order (use state to trigger re-renders)\n const [panelIndex, setPanelIndex] = useState<number>(-1);\n const prevSizeRef = useRef<number | null>(null);\n const isRegisteredRef = useRef(false);\n const registeredIndexRef = useRef<number>(-1);\n\n // Calculate panel index from DOM position (useEffect runs after refs are set)\n useEffect(() => {\n const panel = internalRef.current;\n const container = containerRef.current;\n if (!panel || !container) return;\n\n // Count panels before this one in the DOM\n const allPanels = container.querySelectorAll('[data-resizable-panel]');\n let foundIndex = -1;\n for (let i = 0; i < allPanels.length; i++) {\n if (allPanels[i] === panel) {\n foundIndex = i;\n break;\n }\n }\n\n if (foundIndex === -1) return;\n\n // Update index state (triggers re-render)\n if (panelIndex !== foundIndex) {\n setPanelIndex(foundIndex);\n }\n\n // Register/update panel info\n if (!isRegisteredRef.current) {\n isRegisteredRef.current = true;\n registeredIndexRef.current = foundIndex;\n registerPanel(foundIndex, {\n name,\n minSize,\n maxSize,\n collapsible,\n });\n }\n\n return () => {\n if (isRegisteredRef.current) {\n unregisterPanel(registeredIndexRef.current);\n isRegisteredRef.current = false;\n }\n };\n }, [containerRef, registerPanel, unregisterPanel, name, minSize, maxSize, collapsible, panelIndex]);\n\n // Get current size for this panel\n const currentSize = panelIndex >= 0 ? sizes[panelIndex] ?? 50 : 50;\n\n // Handle collapse/expand callbacks\n useEffect(() => {\n if (prevSizeRef.current === null) {\n prevSizeRef.current = currentSize;\n return;\n }\n\n const wasCollapsed = prevSizeRef.current === 0;\n const isCollapsed = currentSize === 0;\n\n if (!wasCollapsed && isCollapsed && onCollapse) {\n onCollapse();\n } else if (wasCollapsed && !isCollapsed && onExpand) {\n onExpand();\n }\n\n if (onResize && prevSizeRef.current !== currentSize) {\n onResize(currentSize);\n }\n\n prevSizeRef.current = currentSize;\n }, [currentSize, onCollapse, onExpand, onResize]);\n\n return (\n <div\n ref={(node) => {\n // Update internal ref\n (internalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n // Forward to external ref if provided\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }\n }}\n role=\"region\"\n aria-label={name}\n data-resizable-panel=\"\"\n data-panel-name={name}\n data-panel-index={panelIndex}\n data-collapsed={currentSize === 0}\n style={{\n flexBasis: `${currentSize}%`,\n flexGrow: 0,\n flexShrink: 0,\n overflow: 'hidden',\n }}\n className={cn('relative', className)}\n >\n {children}\n </div>\n );\n }\n);\n\nResizablePanel.displayName = 'ResizablePanel';\n","/**\n * useResizable Hook\n *\n * Core resize logic for handling drag interactions.\n * Manages pointer events, calculates size changes, and enforces constraints.\n *\n * @see {@link ../../docs/prd/resizable-prd.md} for full requirements\n */\n\nimport { useCallback, useRef, useState, useEffect } from 'react';\nimport type { PanelInfo } from '../Resizable.types';\nimport { LONG_PRESS_THRESHOLD } from '../Resizable.types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface UseResizableOptions {\n /** Layout direction */\n direction: 'horizontal' | 'vertical';\n /** Current panel sizes */\n sizes: number[];\n /** Update panel sizes */\n setSizes: (sizes: number[]) => void;\n /** Registered panel info */\n panels: PanelInfo[];\n /** Reference to container element for size calculations */\n containerRef: React.RefObject<HTMLDivElement | null>;\n /** Index of the left/top panel this handle controls */\n leftPanelIndex: number;\n /** Index of the right/bottom panel this handle controls */\n rightPanelIndex: number;\n /** Whether the handle is disabled */\n disabled?: boolean;\n /** Callback to announce size changes */\n announce?: (message: string) => void;\n /** Group label for announcements */\n groupLabel?: string;\n /** Callback when popover should open */\n onOpenPopover?: () => void;\n}\n\ninterface UseResizableReturn {\n /** Whether currently dragging */\n isDragging: boolean;\n /** Pointer down handler for drag start */\n handlePointerDown: (event: React.PointerEvent) => void;\n /** Keyboard handler for arrow key resizing */\n handleKeyDown: (event: React.KeyboardEvent) => void;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Clamp a size value within min/max bounds.\n */\nfunction clampSize(size: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, size));\n}\n\n/**\n * Calculate new sizes when adjusting by a delta.\n * Only affects adjacent panels - other panels remain unchanged.\n */\nfunction calculateNewSizes(\n sizes: number[],\n panels: PanelInfo[],\n leftIndex: number,\n rightIndex: number,\n delta: number\n): number[] {\n const newSizes = [...sizes];\n const leftPanel = panels[leftIndex];\n const rightPanel = panels[rightIndex];\n\n if (!leftPanel || !rightPanel) return sizes;\n\n // Current sizes\n const leftSize = sizes[leftIndex] ?? 50;\n const rightSize = sizes[rightIndex] ?? 50;\n\n // Calculate new sizes\n let newLeftSize = leftSize + delta;\n let newRightSize = rightSize - delta;\n\n // Apply constraints\n const leftMin = leftPanel.collapsible ? 0 : leftPanel.minSize;\n const leftMax = leftPanel.maxSize;\n const rightMin = rightPanel.collapsible ? 0 : rightPanel.minSize;\n const rightMax = rightPanel.maxSize;\n\n // Clamp left panel\n newLeftSize = clampSize(newLeftSize, leftMin, leftMax);\n\n // Adjust right panel to compensate\n newRightSize = leftSize + rightSize - newLeftSize;\n\n // Clamp right panel\n newRightSize = clampSize(newRightSize, rightMin, rightMax);\n\n // Re-adjust left panel if right was clamped\n newLeftSize = leftSize + rightSize - newRightSize;\n\n newSizes[leftIndex] = newLeftSize;\n newSizes[rightIndex] = newRightSize;\n\n return newSizes;\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook for managing resize interactions.\n *\n * @param options - Resize options\n * @returns Drag state and event handlers\n */\nexport function useResizable({\n direction,\n sizes,\n setSizes,\n panels,\n containerRef,\n leftPanelIndex,\n rightPanelIndex,\n disabled = false,\n announce,\n groupLabel,\n onOpenPopover,\n}: UseResizableOptions): UseResizableReturn {\n const [isDragging, setIsDragging] = useState(false);\n\n // Track drag start position and sizes\n const dragStartRef = useRef<{\n position: number;\n sizes: number[];\n containerSize: number;\n } | null>(null);\n\n // Track long press for touch interaction\n const longPressTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pointerDownTimeRef = useRef<number>(0);\n const wasLongPressRef = useRef<boolean>(false);\n\n // Store latest values in refs for stable event handlers\n const panelsRef = useRef(panels);\n const sizesRef = useRef(sizes);\n const setSizesRef = useRef(setSizes);\n\n // Refs for stable event listener references (prevents memory leaks)\n const handlePointerMoveRef = useRef<(e: PointerEvent) => void>(() => {});\n const handlePointerUpRef = useRef<() => void>(() => {});\n\n // Keep refs updated\n useEffect(() => {\n panelsRef.current = panels;\n sizesRef.current = sizes;\n setSizesRef.current = setSizes;\n }, [panels, sizes, setSizes]);\n\n /**\n * Get container size in the resize direction.\n */\n const getContainerSize = useCallback((): number => {\n const container = containerRef.current;\n if (!container) return 0;\n return direction === 'horizontal'\n ? container.offsetWidth\n : container.offsetHeight;\n }, [containerRef, direction]);\n\n /**\n * Convert pixel delta to percentage delta.\n */\n const pixelsToPercent = useCallback(\n (pixels: number): number => {\n const containerSize = getContainerSize();\n if (containerSize === 0) return 0;\n return (pixels / containerSize) * 100;\n },\n [getContainerSize]\n );\n\n // Stable wrapper functions for event listeners (prevent memory leaks)\n // These are created once and never change, using refs to call current handlers\n const onPointerMove = useCallback((e: PointerEvent) => {\n handlePointerMoveRef.current(e);\n }, []);\n\n const onPointerUp = useCallback(() => {\n handlePointerUpRef.current();\n }, []);\n\n /**\n * Handle pointer move during drag.\n * Uses refs to avoid stale closures and prevent listener removal on re-render.\n */\n const handlePointerMove = useCallback(\n (event: PointerEvent) => {\n if (!dragStartRef.current || disabled) return;\n\n const position =\n direction === 'horizontal' ? event.clientX : event.clientY;\n const delta = position - dragStartRef.current.position;\n const percentDelta = pixelsToPercent(delta);\n\n const newSizes = calculateNewSizes(\n dragStartRef.current.sizes,\n panelsRef.current,\n leftPanelIndex,\n rightPanelIndex,\n percentDelta\n );\n\n setSizesRef.current(newSizes);\n },\n [\n direction,\n disabled,\n leftPanelIndex,\n pixelsToPercent,\n rightPanelIndex,\n ]\n );\n\n /**\n * Handle pointer up to end drag.\n * Uses refs to avoid stale closures.\n */\n const handlePointerUp = useCallback(() => {\n // Clear long press timer\n if (longPressTimerRef.current) {\n clearTimeout(longPressTimerRef.current);\n longPressTimerRef.current = null;\n }\n\n // Check if this was a tap (not a long press or drag)\n const duration = Date.now() - pointerDownTimeRef.current;\n const wasTap = duration < LONG_PRESS_THRESHOLD && !wasLongPressRef.current;\n\n if (wasTap && onOpenPopover && !disabled) {\n onOpenPopover();\n }\n\n // End drag\n if (isDragging) {\n setIsDragging(false);\n\n // Announce final size\n const leftPanel = panelsRef.current[leftPanelIndex];\n const newSize = Math.round(sizesRef.current[leftPanelIndex] ?? 50);\n if (announce && leftPanel && groupLabel) {\n announce(\n `${leftPanel.name} in ${groupLabel} resized to ${newSize} percent`\n );\n }\n }\n\n dragStartRef.current = null;\n wasLongPressRef.current = false;\n\n // Remove document listeners (use stable wrappers to match what was added)\n document.removeEventListener('pointermove', onPointerMove);\n document.removeEventListener('pointerup', onPointerUp);\n document.removeEventListener('pointercancel', onPointerUp);\n\n // Reset cursor\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n }, [\n announce,\n disabled,\n groupLabel,\n isDragging,\n leftPanelIndex,\n onOpenPopover,\n onPointerMove,\n onPointerUp,\n ]);\n\n // Keep handler refs updated so stable wrappers call the latest handlers\n useEffect(() => {\n handlePointerMoveRef.current = handlePointerMove;\n handlePointerUpRef.current = handlePointerUp;\n });\n\n /**\n * Handle pointer down to start drag.\n */\n const handlePointerDown = useCallback(\n (event: React.PointerEvent) => {\n if (disabled) return;\n\n // Prevent text selection during drag\n event.preventDefault();\n\n const position =\n direction === 'horizontal' ? event.clientX : event.clientY;\n pointerDownTimeRef.current = Date.now();\n wasLongPressRef.current = false;\n\n // Store initial state\n dragStartRef.current = {\n position,\n sizes: [...sizes],\n containerSize: getContainerSize(),\n };\n\n // Set up long press timer for touch\n longPressTimerRef.current = setTimeout(() => {\n wasLongPressRef.current = true;\n setIsDragging(true);\n\n // Set cursor during drag\n document.body.style.cursor =\n direction === 'horizontal' ? 'col-resize' : 'row-resize';\n document.body.style.userSelect = 'none';\n }, LONG_PRESS_THRESHOLD);\n\n // Add document listeners (use stable wrappers to prevent memory leaks)\n document.addEventListener('pointermove', onPointerMove);\n document.addEventListener('pointerup', onPointerUp);\n document.addEventListener('pointercancel', onPointerUp);\n\n // For mouse, start dragging immediately\n if (event.pointerType === 'mouse') {\n // Clear long press timer for mouse - drag starts immediately\n if (longPressTimerRef.current) {\n clearTimeout(longPressTimerRef.current);\n longPressTimerRef.current = null;\n }\n wasLongPressRef.current = true;\n setIsDragging(true);\n document.body.style.cursor =\n direction === 'horizontal' ? 'col-resize' : 'row-resize';\n document.body.style.userSelect = 'none';\n }\n },\n [\n direction,\n disabled,\n getContainerSize,\n onPointerMove,\n onPointerUp,\n sizes,\n ]\n );\n\n /**\n * Handle keyboard navigation.\n */\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (disabled) return;\n\n const step = event.shiftKey ? 10 : 1;\n let delta = 0;\n\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowUp':\n delta = -step;\n break;\n case 'ArrowRight':\n case 'ArrowDown':\n delta = step;\n break;\n case 'Home': {\n // Set to minimum\n const leftPanel = panels[leftPanelIndex];\n if (leftPanel) {\n const minSize = leftPanel.collapsible ? 0 : leftPanel.minSize;\n delta = minSize - (sizes[leftPanelIndex] ?? 50);\n }\n break;\n }\n case 'End': {\n // Set to maximum\n const leftPanel = panels[leftPanelIndex];\n if (leftPanel) {\n delta = leftPanel.maxSize - (sizes[leftPanelIndex] ?? 50);\n }\n break;\n }\n case 'Enter':\n case ' ':\n // Open popover\n event.preventDefault();\n onOpenPopover?.();\n return;\n default:\n return;\n }\n\n if (delta !== 0) {\n event.preventDefault();\n const newSizes = calculateNewSizes(\n sizes,\n panels,\n leftPanelIndex,\n rightPanelIndex,\n delta\n );\n setSizes(newSizes);\n\n // Announce the change\n const leftPanel = panels[leftPanelIndex];\n const newSize = Math.round(newSizes[leftPanelIndex] ?? 50);\n if (announce && leftPanel && groupLabel) {\n announce(\n `${leftPanel.name} in ${groupLabel} resized to ${newSize} percent`\n );\n }\n }\n },\n [\n announce,\n disabled,\n groupLabel,\n leftPanelIndex,\n onOpenPopover,\n panels,\n rightPanelIndex,\n setSizes,\n sizes,\n ]\n );\n\n // Cleanup on unmount only (empty deps = only runs on unmount)\n useEffect(() => {\n // Capture stable wrappers for cleanup\n const moveHandler = onPointerMove;\n const upHandler = onPointerUp;\n return () => {\n if (longPressTimerRef.current) {\n clearTimeout(longPressTimerRef.current);\n }\n // Use stable wrappers for cleanup\n document.removeEventListener('pointermove', moveHandler);\n document.removeEventListener('pointerup', upHandler);\n document.removeEventListener('pointercancel', upHandler);\n };\n }, [onPointerMove, onPointerUp]);\n\n return {\n isDragging,\n handlePointerDown,\n handleKeyDown,\n };\n}\n","/**\n * Global Interaction State Styles\n *\n * Consistent interaction patterns across all Themis components.\n * These styles ensure WCAG 2.2 AAA compliance and predictable UX.\n *\n * @see spec.md FR-010 (Visible focus ring for keyboard navigation)\n * @see spec.md FR-031 (Pressed state feedback)\n * @see spec.md FR-012 (High contrast mode support)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\n/**\n * Focus state styles (FR-010)\n * Visible focus ring for keyboard navigation - WCAG 2.2 Level AAA\n *\n * Components can override by extending these styles:\n * @example\n * cn(FOCUS_STYLES, \"ring-4\") // Increases ring width to 4px\n */\nexport const FOCUS_STYLES = \"data-[focus-visible]:ring-2 data-[focus-visible]:ring-[var(--themis-ring)] data-[focus-visible]:ring-offset-2\";\n\n/**\n * Pressed/Active state styles (FR-031)\n * Visual feedback for press interactions\n *\n * Components can override the scale amount:\n * @example\n * cn(PRESSED_STYLES_BASE, \"data-[pressed]:scale-[0.95]\") // More pronounced scale\n */\nexport const PRESSED_STYLES = \"data-[pressed]:scale-[0.97]\";\n\n/**\n * Base pressed styles without scale (for components that need different feedback)\n */\nexport const PRESSED_STYLES_BASE = \"data-[pressed]:transition-transform data-[pressed]:duration-100\";\n\n/**\n * Hover state styles\n * Elevation change on hover for better affordance\n *\n * Components can override shadow depth:\n * @example\n * cn(HOVER_STYLES_BASE, \"data-[hovered]:shadow-lg\") // Larger shadow\n */\nexport const HOVER_STYLES = \"data-[hovered]:shadow-md\";\n\n/**\n * Base hover styles without shadow (for components that use different hover effects)\n */\nexport const HOVER_STYLES_BASE = \"data-[hovered]:transition-shadow data-[hovered]:duration-200\";\n\n/**\n * High contrast mode focus (FR-012)\n * Enhanced outlines for users requiring high contrast\n *\n * Uses 'hc:' prefix for prefers-contrast: more media query\n */\nexport const HIGH_CONTRAST_FOCUS = \"hc:data-[focus-visible]:outline hc:data-[focus-visible]:outline-4 hc:data-[focus-visible]:outline-offset-2 hc:data-[focus-visible]:outline-foreground\";\n\n/**\n * High contrast mode hover (FR-012)\n * Enhanced outlines for hover in high contrast mode\n */\nexport const HIGH_CONTRAST_HOVER = \"hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground\";\n\n/**\n * High contrast mode pressed state\n * Enhanced outlines for pressed state in high contrast mode\n */\nexport const HIGH_CONTRAST_PRESSED = \"hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground\";\n\n/**\n * Combined high contrast styles\n * Use this for components that need all high contrast interaction states\n */\nexport const HIGH_CONTRAST_INTERACTIONS = `${HIGH_CONTRAST_FOCUS} ${HIGH_CONTRAST_HOVER} ${HIGH_CONTRAST_PRESSED}`;\n\n/**\n * Disabled state styles\n * Consistent disabled appearance across all components\n */\nexport const DISABLED_STYLES = \"disabled:pointer-events-none disabled:opacity-50\";\n\n/**\n * Default interaction bundle\n * Most common combination for interactive components\n *\n * Includes: focus ring, pressed scale, hover shadow, high contrast enhancements\n *\n * @example\n * <button className={cn(DEFAULT_INTERACTIONS, \"bg-primary\")}>Click</button>\n */\nexport const DEFAULT_INTERACTIONS = `${FOCUS_STYLES} ${PRESSED_STYLES} ${HOVER_STYLES} ${HIGH_CONTRAST_FOCUS} ${HIGH_CONTRAST_HOVER} ${HIGH_CONTRAST_PRESSED}`;\n\n/**\n * Subtle interaction bundle\n * For components that need less pronounced feedback\n *\n * Includes: focus ring and high contrast, but no hover shadow or pressed scale\n */\nexport const SUBTLE_INTERACTIONS = `${FOCUS_STYLES} ${HIGH_CONTRAST_FOCUS}`;\n\n/**\n * Non-interactive element styles\n * For elements that should indicate they are not interactive\n */\nexport const NON_INTERACTIVE = \"cursor-default select-none\";\n","\"use client\";\n\nimport { createContext, useContext } from 'react';\nimport type {\n ButtonGroupContextValue,\n ButtonGroupItemContextValue,\n} from './ButtonGroup.types';\n\n/**\n * ButtonGroup Context System (Two-Level)\n *\n * Provides a two-level context pattern for ButtonGroup:\n *\n * 1. ButtonGroupContext (group-level):\n * - Provides: orientation, variant, size, isDisabled\n * - Consumed by: Button (for prop inheritance), Separator (for orientation)\n *\n * 2. ButtonGroupItemContext (item-level):\n * - Provides: position ('first' | 'middle' | 'last' | 'only')\n * - Consumed by: Button (for border-radius styling)\n *\n * Both contexts return null when not in a provider, allowing Button\n * to work standalone without any group context.\n *\n * @see plan.md for architecture details\n * @see ButtonGroup.tsx for Provider implementation\n */\n\n// =============================================================================\n// Group-Level Context\n// =============================================================================\n\n/**\n * Context for group-level props (orientation, variant, size, isDisabled)\n * Default value is null to indicate \"not in a group\"\n */\nconst ButtonGroupContext = createContext<ButtonGroupContextValue | null>(null);\n\nButtonGroupContext.displayName = 'ButtonGroupContext';\n\n/**\n * Hook to access group-level context\n * @returns ButtonGroupContextValue if inside a ButtonGroup, null otherwise\n */\nexport function useButtonGroupContext(): ButtonGroupContextValue | null {\n return useContext(ButtonGroupContext);\n}\n\n// =============================================================================\n// Item-Level Context\n// =============================================================================\n\n/**\n * Context for per-button position information\n * Default value is null to indicate \"not wrapped with position context\"\n */\nconst ButtonGroupItemContext =\n createContext<ButtonGroupItemContextValue | null>(null);\n\nButtonGroupItemContext.displayName = 'ButtonGroupItemContext';\n\n/**\n * Hook to access item-level context (position)\n * @returns ButtonGroupItemContextValue if wrapped with position context, null otherwise\n */\nexport function useButtonGroupItemContext(): ButtonGroupItemContextValue | null {\n return useContext(ButtonGroupItemContext);\n}\n\n// =============================================================================\n// Exports\n// =============================================================================\n\nexport { ButtonGroupContext, ButtonGroupItemContext };\n","import { cva } from 'class-variance-authority';\n\n/**\n * ButtonGroup CVA Variants\n *\n * Defines Class Variance Authority (CVA) variants for:\n * - ButtonGroup container (orientation-based layout)\n * - ButtonGroupItem (position-based border-radius)\n * - ButtonGroupSeparator (orientation-based styling)\n *\n * @see plan.md Phase 1: Design & Contracts - CVA Variants\n * @see constitution.md Principle V (Component Quality Standards)\n */\n\n// =============================================================================\n// Container Variants\n// =============================================================================\n\n/**\n * ButtonGroup container variants\n * Controls the layout direction based on orientation\n * Uses gap-0 to ensure buttons are connected (share borders)\n */\nexport const buttonGroupVariants = cva('inline-flex items-center gap-0', {\n variants: {\n orientation: {\n horizontal: 'flex-row',\n vertical: 'flex-col w-full',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n\n// =============================================================================\n// Item Position Variants\n// =============================================================================\n\n/**\n * ButtonGroupItem position variants\n * Applied to Button's visual layer (Layer 2) for position-aware border-radius\n *\n * Compound variants handle both orientation and position combinations:\n * - Horizontal: left/right borders and radii\n * - Vertical: top/bottom borders and radii\n */\nexport const buttonGroupItemVariants = cva('', {\n variants: {\n orientation: {\n // min-w-[44px] ensures visual layer fills touch target width (for icon buttons)\n horizontal: 'min-w-[44px]',\n // flex (overrides inline-flex) + min-h-[44px] makes visual layer fill touch target,\n // eliminating gaps between stacked buttons in vertical orientation\n vertical: 'flex min-h-[44px]',\n },\n position: {\n first: '',\n middle: '',\n last: '',\n only: '', // Single button - no modifications needed\n },\n },\n compoundVariants: [\n // ==========================================================================\n // Horizontal Orientation\n // ==========================================================================\n {\n orientation: 'horizontal',\n position: 'first',\n className: 'rounded-r-none border-r-0',\n },\n {\n orientation: 'horizontal',\n position: 'middle',\n className: 'rounded-none border-r-0',\n },\n {\n orientation: 'horizontal',\n position: 'last',\n className: 'rounded-l-none',\n },\n // ==========================================================================\n // Vertical Orientation\n // Note: w-full is handled by Button's effectiveFullWidth for both layers\n // ==========================================================================\n {\n orientation: 'vertical',\n position: 'first',\n className: 'rounded-b-none border-b-0',\n },\n {\n orientation: 'vertical',\n position: 'middle',\n className: 'rounded-none border-b-0',\n },\n {\n orientation: 'vertical',\n position: 'last',\n className: 'rounded-t-none',\n },\n ],\n defaultVariants: {\n orientation: 'horizontal',\n position: 'only',\n },\n});\n\n// =============================================================================\n// Separator Variants\n// =============================================================================\n\n/**\n * ButtonGroupSeparator variants\n * Orientation-aware visual divider between button groups\n */\nexport const buttonGroupSeparatorVariants = cva('bg-[var(--border)]', {\n variants: {\n orientation: {\n horizontal: 'w-px h-6 mx-1',\n vertical: 'h-px w-full my-1',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n","\"use client\";\n\n/**\n * Button Component - 3-Layer Architecture\n * Accessible button with React Aria primitives and CVA styling\n *\n * Architecture:\n * - Layer 1: Touch Target (44x44px WCAG AAA compliant, transparent)\n * - Layer 2: Visual Button (configurable size, colors, borders)\n * - Layer 3: Content & Effects (text, icons, ripple, loading spinner)\n *\n * @see 3layer-plan.md for architecture details\n * @see spec.md FR-029 to FR-037 (Button Component Requirements)\n * @see spec.md FR-009 (WCAG 2.2 AAA - 7:1 contrast ratio)\n * @see spec.md FR-014 (44x44px minimum touch targets)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport { forwardRef, memo, useId, type ReactNode } from 'react';\nimport {\n Button as AriaButton,\n type ButtonProps as AriaButtonProps,\n} from 'react-aria-components';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Loader2, Zap } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { PRESSED_STYLES, HOVER_STYLES, HIGH_CONTRAST_HOVER, HIGH_CONTRAST_PRESSED } from '../../styles/interaction-states';\nimport {\n useButtonGroupContext,\n useButtonGroupItemContext,\n} from '../ButtonGroup/ButtonGroupContext';\nimport { buttonGroupItemVariants } from '../ButtonGroup/ButtonGroup.variants';\n\n/**\n * Layer 1: Transparent outer touch target (44x44px minimum)\n * Handles WCAG 2.2 AAA touch target requirement\n * Always transparent, centers the visual button inside\n * IMPORTANT: Focus ring stays on Layer 1 for AAA compliance (2.4.13)\n *\n * In vertical ButtonGroups, uses items-stretch so the visual layer (Layer 2)\n * can fill the full touch target height, eliminating gaps between buttons.\n */\nconst buttonOuterVariants = cva(\n \"inline-flex justify-center min-h-[44px] min-w-[44px] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n fullWidth: {\n true: \"w-full\",\n false: \"\",\n },\n inVerticalGroup: {\n true: \"items-stretch\",\n false: \"items-center\",\n },\n },\n defaultVariants: {\n fullWidth: false,\n inVerticalGroup: false,\n },\n }\n);\n\n/**\n * Layer 2: Visual button appearance (adjustable size)\n * Provides the visual appearance with configurable size\n * Can be smaller than touch target for use cases like carousel dots\n * NOTE: NO focus-visible styles here - focus ring is on Layer 1\n */\nconst buttonVisualVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 relative cursor-pointer\",\n {\n variants: {\n variant: {\n default:\n \"bg-[var(--primary-action)] text-[var(--primary-action-foreground)] shadow-md hover:bg-[var(--primary-action-hover)] data-[pressed]:bg-[var(--primary-action)]/80\",\n destructive:\n \"bg-[var(--destructive-background)] text-[var(--destructive-foreground)] shadow-md hover:bg-[var(--destructive-background)]/90 data-[pressed]:bg-[var(--destructive-background)]/80\",\n outline:\n \"border border-[var(--input-border)] bg-[var(--page-background)] hover:bg-[var(--input-border)] data-[pressed]:bg-[var(--input-border)]\",\n secondary:\n \"bg-[var(--secondary)] text-[var(--secondary-foreground)] shadow-md hover:bg-[var(--secondary)]/80 data-[pressed]:bg-[var(--secondary)]/70\",\n ghost:\n \"hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)] data-[pressed]:bg-[var(--accent)]\",\n link: \"text-[var(--text-link)] underline-offset-4 hover:underline data-[pressed]:text-[var(--text-link-hover)]\",\n },\n fullWidth: {\n true: \"w-full\",\n false: \"\",\n },\n visualSize: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3 text-xs\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n dot: \"h-5 w-5 rounded-full p-0 min-h-0 min-w-0\",\n },\n paywall: {\n true: \"!bg-[var(--paywall)] !text-[var(--paywall-foreground)] !shadow-md hover:!bg-[var(--paywall)]/90 !cursor-not-allowed !border-transparent\",\n false: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n visualSize: \"default\",\n paywall: false,\n },\n }\n);\n\n/**\n * @deprecated Use buttonVisualVariants instead. This alias is kept for backward compatibility.\n */\nconst buttonVariants = buttonVisualVariants;\n\nexport interface ButtonProps\n extends Omit<AriaButtonProps, 'className'>,\n VariantProps<typeof buttonVisualVariants> {\n as?: 'button' | 'a';\n loading?: boolean;\n loadingText?: string;\n shortcut?: string;\n className?: string;\n buttonVisualClassName?: string;\n children?: ReactNode;\n /** Enables paywall state - overrides variant styling and prevents normal action */\n paywall?: boolean;\n /** URL to open in new tab when paywalled button is clicked */\n paywallRedirect?: string;\n /** Description of the premium feature for tooltips and screen readers (max 200 chars) */\n paywallDescription?: string;\n /** Full width button */\n fullWidth?: boolean;\n /**\n * Visual size of the button (Layer 2)\n * Defaults to `size` for backward compatibility\n * Use independently for small visual buttons with large touch targets\n * @example <Button size=\"default\" visualSize=\"dot\" /> // 44px touch, 12px visual\n */\n visualSize?: 'sm' | 'default' | 'lg' | 'icon' | 'dot';\n /**\n * Size of the button - controls both touch target awareness and visual size\n * @deprecated For independent visual sizing, use visualSize prop instead\n */\n size?: 'sm' | 'default' | 'lg' | 'icon';\n}\n\n/**\n * Button Component - 3-Layer Architecture\n * Fully accessible button with React Aria and themed styling\n *\n * Layer 1: Touch Target (AriaButton) - 44x44px WCAG AAA compliant\n * Layer 2: Visual Button (span) - configurable appearance\n * Layer 3: Content (children) - text, icons, effects\n */\nconst Button = memo(forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n buttonVisualClassName,\n variant,\n size,\n visualSize,\n fullWidth,\n loading = false,\n loadingText = \"Loading...\",\n shortcut,\n children,\n isDisabled,\n paywall = false,\n paywallRedirect,\n paywallDescription,\n onPress,\n ...props\n },\n ref\n ) => {\n const paywallDescriptionId = useId();\n\n // ==========================================================================\n // ButtonGroup Context Integration\n // ==========================================================================\n\n // Consume group-level context (variant, size, isDisabled, orientation)\n const groupContext = useButtonGroupContext();\n\n // Consume item-level context (position for border-radius styling)\n const itemContext = useButtonGroupItemContext();\n\n // Merge context values with props (props take precedence)\n const effectiveVariant = variant ?? groupContext?.variant ?? 'default';\n const effectiveSize = size ?? groupContext?.size;\n const effectiveIsDisabled = isDisabled ?? groupContext?.isDisabled ?? false;\n\n // In vertical groups, buttons should be full width automatically\n const isInVerticalGroup = groupContext?.orientation === 'vertical';\n const effectiveFullWidth = fullWidth || isInVerticalGroup;\n\n // Position styling for ButtonGroup (only applied when in a group)\n const positionClassName = itemContext\n ? buttonGroupItemVariants({\n orientation: groupContext?.orientation ?? 'horizontal',\n position: itemContext.position,\n })\n : '';\n\n // Default visualSize to size for backward compatibility\n const effectiveVisualSize = visualSize ?? effectiveSize ?? 'default';\n\n // AAA Accessibility: Warn in dev/test if icon/dot variant lacks accessible name\n if (process.env.NODE_ENV !== 'production') {\n if (\n (effectiveVisualSize === 'dot' || effectiveVisualSize === 'icon') &&\n !props['aria-label'] &&\n !children\n ) {\n console.warn(\n '[Button] visualSize=\"dot\" or \"icon\" requires aria-label when no visible text is provided (WCAG 1.1.1)'\n );\n }\n }\n\n /**\n * Handle button press - intercepts action when paywalled\n * If paywalled with redirect URL, opens in new tab\n * Otherwise, calls the normal onPress handler\n */\n const handlePress = (e: Parameters<NonNullable<AriaButtonProps['onPress']>>[0]): void => {\n if (paywall) {\n if (paywallRedirect) {\n window.open(paywallRedirect, '_blank', 'noopener,noreferrer');\n }\n // Don't call onPress when paywalled\n return;\n }\n onPress?.(e);\n };\n\n // Only set isDisabled when we have a reason to disable\n // Otherwise, let slot system control disabled state (e.g., in NumberField)\n const computedIsDisabled = effectiveIsDisabled || loading || undefined;\n\n return (\n <AriaButton\n ref={ref}\n isDisabled={computedIsDisabled}\n aria-disabled={paywall ? true : undefined}\n aria-describedby={paywall ? paywallDescriptionId : undefined}\n onPress={handlePress}\n className={cn(buttonOuterVariants({ fullWidth: effectiveFullWidth, inVerticalGroup: isInVerticalGroup }), className)}\n {...props}\n >\n {(renderProps) => (\n /* Layer 2: Visual Button */\n <span\n className={cn(\n buttonVisualVariants({\n variant: effectiveVariant,\n visualSize: effectiveVisualSize,\n paywall,\n fullWidth: effectiveFullWidth,\n }),\n // Position styling from ButtonGroup context (border-radius adjustments)\n positionClassName,\n buttonVisualClassName,\n // Layer 2 interaction styles (no focus - focus ring is on Layer 1)\n PRESSED_STYLES,\n HOVER_STYLES,\n HIGH_CONTRAST_HOVER,\n HIGH_CONTRAST_PRESSED\n )}\n data-pressed={renderProps.isPressed || undefined}\n >\n {/* Layer 3: Content & Effects */}\n\n {/* FR-033: Loading spinner with screen reader announcement */}\n {/* Uses motion-safe: for WCAG 2.3.3 AAA (Animation from Interactions) */}\n {loading && (\n <>\n <Loader2 className=\"motion-safe:animate-spin\" aria-hidden=\"true\" />\n <span className=\"sr-only\" aria-live=\"polite\">\n {loadingText}\n </span>\n </>\n )}\n\n {/* Hide children during loading */}\n {!loading && children}\n\n {/* Paywall: Lightning bolt icon */}\n {paywall && (\n <Zap\n data-testid=\"zap-icon\"\n aria-hidden=\"true\"\n className=\"ml-1\"\n />\n )}\n\n {/* Paywall: Screen reader description */}\n {paywall && (\n <span id={paywallDescriptionId} className=\"sr-only\">\n Premium feature: {paywallDescription || \"Upgrade required to access this feature\"}\n </span>\n )}\n\n {/* FR-034: Keyboard shortcut display on focus */}\n {renderProps.isFocusVisible && shortcut && (\n <kbd className=\"ml-auto hidden text-xs opacity-60 lg:inline\">\n {shortcut}\n </kbd>\n )}\n\n {/* Touch/press ripple effect - FR-031: Pressed state feedback */}\n {/* Uses motion-safe: for WCAG 2.3.3 AAA (Animation from Interactions) */}\n {renderProps.isPressed && (\n <span\n className=\"absolute inset-0 rounded-[inherit] bg-current opacity-10 motion-safe:animate-in motion-safe:zoom-in-95\"\n aria-hidden=\"true\"\n />\n )}\n </span>\n )}\n </AriaButton>\n );\n }\n));\n\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants, buttonOuterVariants, buttonVisualVariants };\n","/**\n * NumberField Component Types\n *\n * Zod schemas and TypeScript types for the NumberField component.\n * CVA variants are in a separate file (NumberField.variants.ts) to separate\n * styling concerns from type definitions.\n *\n * Note: Zod schemas are used for contract tests and developer guardrails,\n * not runtime validation. This follows the established Themis pattern.\n *\n * @see {@link ../../docs/prd/numberfield-prd.md} for full requirements\n */\n\nimport { z } from 'zod';\nimport type {\n NumberFieldProps as AriaNumberFieldProps,\n ValidationResult,\n} from 'react-aria-components';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default maximum value (UINT32_MAX) to prevent overflow/Infinity.\n */\nexport const DEFAULT_MAX_VALUE = 4294967295;\n\n/**\n * Default minimum value for non-negative numbers.\n */\nexport const DEFAULT_MIN_VALUE = 0;\n\n/**\n * Minimum value when allowNegative is enabled (INT32_MIN + 1).\n */\nexport const NEGATIVE_MIN_VALUE = -2147483647;\n\n// ============================================================================\n// Size Variant Type\n// ============================================================================\n\n/**\n * Size variants for NumberField component.\n * - 'sm': Compact size (36px height) - touch targets via padding\n * - 'default': Standard size (40px height) - AAA compliant\n * - 'lg': Large size (48px height) - AAA compliant\n */\nexport type NumberFieldSize = 'sm' | 'default' | 'lg';\n\n// ============================================================================\n// Stepper Layout Type\n// ============================================================================\n\n/**\n * Layout options for stepper buttons.\n * - 'sides': Buttons on left (-) and right (+) of input (default)\n * - 'stacked': Buttons stacked vertically on right side\n * - 'hidden': No stepper buttons (keyboard/typing only)\n */\nexport type StepperLayout = 'sides' | 'stacked' | 'hidden';\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/**\n * Zod schema for NumberField props validation.\n * Used for contract tests and developer guardrails, not runtime validation.\n */\nexport const NumberFieldPropsSchema = z.object({\n // Value props\n /** Current value (controlled mode) */\n value: z.number().nullable().optional(),\n /** Default value (uncontrolled mode) */\n defaultValue: z.number().optional(),\n\n // Constraint props\n /** Minimum allowed value (default: 0) */\n minValue: z.number().optional(),\n /** Maximum allowed value (default: 4294967295 / UINT32_MAX) */\n maxValue: z.number().optional(),\n /** Allow negative numbers (sets minValue to -2147483647 if not explicitly set) */\n allowNegative: z.boolean().optional(),\n /** Step increment for stepper buttons and arrow keys (default: 1) */\n step: z.number().positive().optional(),\n\n // Formatting props\n /** Intl.NumberFormat options for locale-aware formatting */\n formatOptions: z.custom<Intl.NumberFormatOptions>().optional(),\n\n // State props\n /** Whether the field is disabled */\n isDisabled: z.boolean().optional(),\n /** Whether the field is read-only */\n isReadOnly: z.boolean().optional(),\n /** Whether the field is required */\n isRequired: z.boolean().optional(),\n /** Whether the field is in an invalid state */\n isInvalid: z.boolean().optional(),\n /** Whether scroll wheel adjustment is disabled */\n isWheelDisabled: z.boolean().optional(),\n\n // Validation props\n /** Custom validation function that returns an error message or null */\n validate: z.function().optional(),\n /** Validation behavior: 'native' for HTML5 validation, 'aria' for ARIA-only */\n validationBehavior: z.enum(['native', 'aria']).default('native'),\n\n // Display props\n /** Field label (required for accessibility) */\n label: z.string(),\n /** Description text below the field */\n description: z.string().optional(),\n /** Error message string or render function */\n errorMessage: z.union([z.string(), z.function()]).optional(),\n\n // Stepper props\n /** Layout for stepper buttons */\n stepperLayout: z.enum(['sides', 'stacked', 'hidden']).default('sides'),\n /** Custom aria-label for increment button */\n incrementAriaLabel: z.string().optional(),\n /** Custom aria-label for decrement button */\n decrementAriaLabel: z.string().optional(),\n\n // Form props\n /** Name attribute for form submission */\n name: z.string().optional(),\n\n // Variant props\n /** Size variant */\n size: z.enum(['sm', 'default', 'lg']).default('default'),\n\n // Event props\n /** Called when the numeric value changes */\n onChange: z.function().optional(),\n /** Called when the field gains focus */\n onFocus: z.function().optional(),\n /** Called when the field loses focus */\n onBlur: z.function().optional(),\n /** Called when focus state changes */\n onFocusChange: z.function().optional(),\n\n // Standard props\n /** Additional CSS classes */\n className: z.string().optional(),\n /** Whether to auto-focus on mount */\n autoFocus: z.boolean().optional(),\n});\n\n// ============================================================================\n// TypeScript Types\n// ============================================================================\n\n/**\n * Custom props added to NumberField (not from React Aria).\n */\nexport interface ThemisNumberFieldCustomProps {\n /** Size variant: 'sm', 'default', or 'lg' */\n size?: NumberFieldSize;\n /** Field label (required for accessibility) */\n label: string;\n /** Description text below the field */\n description?: string;\n /** Error message when field is invalid */\n errorMessage?: string | ((validation: ValidationResult) => string);\n /** Layout for stepper buttons */\n stepperLayout?: StepperLayout;\n /** Custom aria-label for increment button */\n incrementAriaLabel?: string;\n /** Custom aria-label for decrement button */\n decrementAriaLabel?: string;\n /** Allow negative numbers (sets minValue to -2147483647 if not explicitly set) */\n allowNegative?: boolean;\n}\n\n/**\n * Props for the NumberField component.\n * Combines React Aria's NumberFieldProps with Themis-specific props.\n */\nexport type NumberFieldProps = Omit<AriaNumberFieldProps, 'children'> &\n ThemisNumberFieldCustomProps;\n","/**\n * NumberField Component CVA Variants\n *\n * Class Variance Authority (CVA) variant definitions for the NumberField component.\n * Separated from types to maintain clean separation of concerns.\n *\n * Styling uses semantic CSS tokens that map to ThemeProvider variables:\n * - --background: Input background color\n * - --foreground: Text color\n * - --input: Input border color (default state)\n * - --ring: Focus ring color\n * - --accent: Stepper button hover background\n * - --accent-foreground: Stepper button hover text\n * - --destructive: Error state border and text\n * - --muted-foreground: Placeholder/disabled text\n *\n * @see {@link ../../docs/prd/numberfield-prd.md} for full requirements\n */\n\nimport { cva, type VariantProps } from 'class-variance-authority';\n\n// ============================================================================\n// Container Variants\n// ============================================================================\n\n/**\n * Variants for the NumberField container (Group element).\n * Contains the input and stepper buttons.\n *\n * Size notes:\n * - sm (36px): Compact, touch targets achieved via padding\n * - default (40px): Standard size, AAA compliant touch targets\n * - lg (48px): Large size, enhanced touch targets\n */\nexport const numberFieldVariants = cva(\n [\n // Base styles\n 'inline-flex items-center rounded-md border',\n 'bg-[var(--content-background)] text-[var(--content-foreground)]',\n 'transition-colors duration-200',\n // Focus within\n 'focus-within:ring-2 focus-within:ring-[var(--ring)] focus-within:ring-offset-2',\n // Disabled\n 'data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50',\n ],\n {\n variants: {\n size: {\n sm: 'h-9 text-sm',\n default: 'h-10 text-base',\n lg: 'h-12 text-lg',\n },\n isInvalid: {\n true: 'border-[var(--destructive)] focus-within:ring-[var(--destructive)]',\n false: 'border-[var(--input)] hover:border-[var(--input)]/80',\n },\n },\n defaultVariants: {\n size: 'default',\n isInvalid: false,\n },\n }\n);\n\n// ============================================================================\n// Input Variants\n// ============================================================================\n\n/**\n * Variants for the numeric input element.\n * Hides native spinners and centers text.\n */\nexport const numberFieldInputVariants = cva(\n [\n // Base styles\n 'flex-1 bg-transparent text-center tabular-nums',\n 'min-w-0', // Allow shrinking\n // Focus\n 'focus:outline-none',\n // Hide native spinners\n '[appearance:textfield]',\n '[&::-webkit-outer-spin-button]:appearance-none',\n '[&::-webkit-inner-spin-button]:appearance-none',\n ],\n {\n variants: {\n size: {\n sm: 'px-2 text-sm',\n default: 'px-3 text-base',\n lg: 'px-4 text-lg',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Stepper Button Variants\n// ============================================================================\n\n/**\n * Variants for the stepper buttons (increment/decrement).\n * Supports different positions for sides and stacked layouts.\n *\n * Touch target strategy:\n * - Visual button size varies with component size\n * - 44x44px minimum touch target achieved via padding/hit area\n */\nexport const numberFieldStepperVariants = cva(\n [\n // Base styles\n 'flex items-center justify-center',\n 'transition-colors duration-150',\n 'select-none',\n // Hover\n 'hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)]',\n // Focus\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)]',\n 'focus-visible:ring-inset',\n // Active (pressed)\n 'active:bg-[var(--accent)]/80',\n // Disabled\n 'disabled:pointer-events-none disabled:opacity-50',\n ],\n {\n variants: {\n size: {\n sm: 'min-w-8 min-h-8 text-sm',\n default: 'min-w-10 min-h-10 text-base',\n lg: 'min-w-12 min-h-12 text-lg',\n },\n position: {\n left: 'rounded-l-md border-r border-[var(--input)]',\n right: 'rounded-r-md border-l border-[var(--input)]',\n top: 'rounded-tr-md border-b border-l border-[var(--input)] h-1/2',\n bottom: 'rounded-br-md border-l border-[var(--input)] h-1/2',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Label Variants\n// ============================================================================\n\n/**\n * Variants for the NumberField label.\n */\nexport const numberFieldLabelVariants = cva(\n [\n 'block font-medium text-[var(--content-foreground)]',\n 'mb-1.5',\n // Required indicator\n 'data-[required]:after:content-[\"*\"] data-[required]:after:ml-0.5',\n 'data-[required]:after:text-[var(--destructive)]',\n ],\n {\n variants: {\n size: {\n sm: 'text-sm',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Description Variants\n// ============================================================================\n\n/**\n * Variants for the description text below the field.\n */\nexport const numberFieldDescriptionVariants = cva(\n [\n 'text-[var(--menu-muted)]',\n 'mt-1',\n ],\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Error Variants\n// ============================================================================\n\n/**\n * Variants for the error message display.\n */\nexport const numberFieldErrorVariants = cva(\n [\n 'flex items-center gap-1',\n 'text-[var(--destructive)]',\n 'mt-1',\n ],\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Variant Types (from CVA)\n// ============================================================================\n\n/**\n * Variant props for numberFieldVariants CVA function.\n */\nexport type NumberFieldVariantProps = VariantProps<typeof numberFieldVariants>;\n\n/**\n * Variant props for numberFieldInputVariants CVA function.\n */\nexport type NumberFieldInputVariantProps = VariantProps<typeof numberFieldInputVariants>;\n\n/**\n * Variant props for numberFieldStepperVariants CVA function.\n */\nexport type NumberFieldStepperVariantProps = VariantProps<typeof numberFieldStepperVariants>;\n","'use client';\n\n/**\n * NumberField Component\n *\n * A fully accessible numeric input component built on React Aria's NumberField primitive.\n * Provides keyboard-editable input with optional increment/decrement stepper buttons.\n *\n * Features:\n * - WCAG 2.2 AAA compliant (44x44px touch targets, 7:1 contrast)\n * - Spinbutton ARIA semantics\n * - Locale-aware number formatting via Intl.NumberFormat\n * - Configurable min/max/step constraints\n * - Optional stepper buttons (sides, stacked, or hidden layouts)\n * - Scroll wheel support\n * - Form integration with hidden input\n * - Full keyboard navigation (Arrow, Page Up/Down, Home/End)\n * - Screen reader accessible\n *\n * @see {@link ../../docs/prd/numberfield-prd.md} for full requirements\n */\n\nimport { forwardRef, type ReactElement } from 'react';\nimport {\n NumberField as AriaNumberField,\n Group as AriaGroup,\n Input as AriaInput,\n Label as AriaLabel,\n Text as AriaText,\n FieldError as AriaFieldError,\n} from 'react-aria-components';\nimport { Minus, Plus } from 'lucide-react';\nimport { Button } from '../Button';\nimport { cn } from '../../utils/cn';\nimport type { NumberFieldProps } from './NumberField.types';\nimport {\n DEFAULT_MAX_VALUE,\n DEFAULT_MIN_VALUE,\n NEGATIVE_MIN_VALUE,\n} from './NumberField.types';\nimport {\n numberFieldVariants,\n numberFieldInputVariants,\n numberFieldStepperVariants,\n numberFieldLabelVariants,\n numberFieldDescriptionVariants,\n numberFieldErrorVariants,\n} from './NumberField.variants';\n\n// =============================================================================\n// NumberField Component\n// =============================================================================\n\n/**\n * NumberField component for numeric input with optional stepper buttons.\n *\n * @example\n * ```tsx\n * import { NumberField } from '@tribepad/themis/elements/NumberField';\n *\n * // Basic usage\n * <NumberField label=\"Quantity\" />\n *\n * // With constraints\n * <NumberField\n * label=\"Quantity\"\n * minValue={1}\n * maxValue={100}\n * step={1}\n * defaultValue={5}\n * />\n *\n * // Currency formatting\n * <NumberField\n * label=\"Price\"\n * formatOptions={{ style: 'currency', currency: 'USD' }}\n * step={0.01}\n * defaultValue={9.99}\n * />\n *\n * // Allow negative numbers\n * <NumberField\n * label=\"Temperature\"\n * allowNegative\n * formatOptions={{ style: 'unit', unit: 'celsius' }}\n * />\n *\n * // Hidden steppers\n * <NumberField\n * label=\"Account Number\"\n * stepperLayout=\"hidden\"\n * />\n * ```\n */\nexport const NumberField = forwardRef<HTMLDivElement, NumberFieldProps>(\n (\n {\n // Display props\n label,\n description,\n errorMessage,\n // Variant props\n size = 'default',\n stepperLayout = 'sides',\n // Custom props\n allowNegative = false,\n incrementAriaLabel,\n decrementAriaLabel,\n // Constraint props (apply defaults)\n minValue,\n maxValue,\n // Standard props\n className,\n isInvalid,\n isRequired,\n isDisabled,\n isReadOnly,\n // All other props go to AriaNumberField\n ...props\n },\n ref\n ): ReactElement => {\n // Calculate effective min/max values\n const effectiveMinValue =\n minValue ?? (allowNegative ? NEGATIVE_MIN_VALUE : DEFAULT_MIN_VALUE);\n const effectiveMaxValue = maxValue ?? DEFAULT_MAX_VALUE;\n\n // Determine if steppers should be shown\n const showSteppers = stepperLayout !== 'hidden' && !isReadOnly;\n const isStackedLayout = stepperLayout === 'stacked';\n\n return (\n <AriaNumberField\n ref={ref}\n className={cn('group flex flex-col', className)}\n minValue={effectiveMinValue}\n maxValue={effectiveMaxValue}\n isInvalid={isInvalid}\n isRequired={isRequired}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n {...props}\n >\n {/* Label */}\n <AriaLabel\n className={cn(numberFieldLabelVariants({ size }))}\n data-required={isRequired || undefined}\n >\n {label}\n </AriaLabel>\n\n {/* Input Group */}\n <AriaGroup\n className={cn(\n numberFieldVariants({\n size,\n isInvalid: isInvalid ?? false,\n }),\n isStackedLayout && 'pr-0'\n )}\n >\n {/* Decrement Button (left side for sides layout) */}\n {showSteppers && !isStackedLayout && (\n <Button\n slot=\"decrement\"\n variant=\"ghost\"\n className=\"!min-h-0 !min-w-0\"\n buttonVisualClassName={cn(\n numberFieldStepperVariants({\n size,\n position: 'left',\n })\n )}\n aria-label={decrementAriaLabel ?? 'Decrease value'}\n >\n <Minus className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n )}\n\n {/* Input */}\n <AriaInput\n className={cn(numberFieldInputVariants({ size }))}\n />\n\n {/* Stacked Layout Buttons */}\n {showSteppers && isStackedLayout && (\n <div className=\"flex flex-col h-full\">\n <Button\n slot=\"increment\"\n variant=\"ghost\"\n className=\"!min-h-0 !min-w-0\"\n buttonVisualClassName={cn(\n numberFieldStepperVariants({\n size,\n position: 'top',\n })\n )}\n aria-label={incrementAriaLabel ?? 'Increase value'}\n >\n <Plus className=\"h-3 w-3\" aria-hidden=\"true\" />\n </Button>\n <Button\n slot=\"decrement\"\n variant=\"ghost\"\n className=\"!min-h-0 !min-w-0\"\n buttonVisualClassName={cn(\n numberFieldStepperVariants({\n size,\n position: 'bottom',\n })\n )}\n aria-label={decrementAriaLabel ?? 'Decrease value'}\n >\n <Minus className=\"h-3 w-3\" aria-hidden=\"true\" />\n </Button>\n </div>\n )}\n\n {/* Increment Button (right side for sides layout) */}\n {showSteppers && !isStackedLayout && (\n <Button\n slot=\"increment\"\n variant=\"ghost\"\n className=\"!min-h-0 !min-w-0\"\n buttonVisualClassName={cn(\n numberFieldStepperVariants({\n size,\n position: 'right',\n })\n )}\n aria-label={incrementAriaLabel ?? 'Increase value'}\n >\n <Plus className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n )}\n </AriaGroup>\n\n {/* Description */}\n {description && (\n <AriaText\n slot=\"description\"\n className={cn(numberFieldDescriptionVariants({ size }))}\n >\n {description}\n </AriaText>\n )}\n\n {/* Error Message */}\n <AriaFieldError className={cn(numberFieldErrorVariants({ size }))}>\n {errorMessage}\n </AriaFieldError>\n </AriaNumberField>\n );\n }\n);\n\nNumberField.displayName = 'NumberField';\n","'use client';\n\n/**\n * ResizablePopover Component\n *\n * Precision control popover for resizable panels.\n * Shows linked NumberFields and preset buttons for exact sizing.\n *\n * @see {@link ../../docs/prd/resizable-prd.md} for full requirements\n */\n\nimport {\n forwardRef,\n useState,\n useCallback,\n useEffect,\n useRef,\n type ReactElement,\n} from 'react';\nimport {\n DialogTrigger,\n Popover,\n Dialog,\n Button as AriaButton,\n} from 'react-aria-components';\nimport { X } from 'lucide-react';\nimport { cn } from '../../../utils/cn';\nimport type { ResizePreset, PanelInfo } from '../Resizable.types';\nimport { NumberField } from '../../NumberField/NumberField';\nimport { Button } from '../../Button/Button';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface ResizablePopoverProps {\n /** Whether popover is open */\n isOpen: boolean;\n /** Callback when open state changes */\n onOpenChange: (isOpen: boolean) => void;\n /** Group label for the title */\n groupLabel: string;\n /** Left/top panel info */\n leftPanel: PanelInfo;\n /** Right/bottom panel info */\n rightPanel: PanelInfo;\n /** Left/top panel size (percentage) */\n leftSize: number;\n /** Right/bottom panel size (percentage) */\n rightSize: number;\n /** Callback when sizes change */\n onSizesChange: (leftSize: number, rightSize: number) => void;\n /** Size presets */\n presets?: ResizePreset[];\n /** The trigger element (handle) */\n triggerRef: React.RefObject<HTMLDivElement | null>;\n /** Direction for positioning */\n direction: 'horizontal' | 'vertical';\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * ResizablePopover - Precision control for panel sizes.\n *\n * Features:\n * - Two linked NumberFields that sum to 100%\n * - Preset buttons for quick sizing\n * - Cancel reverts to original, Close keeps changes\n * - Live preview as values change\n */\nexport const ResizablePopover = forwardRef<HTMLDivElement, ResizablePopoverProps>(\n function ResizablePopover(\n {\n isOpen,\n onOpenChange,\n groupLabel,\n leftPanel,\n rightPanel,\n leftSize,\n rightSize,\n onSizesChange,\n presets,\n triggerRef,\n direction,\n },\n _ref\n ): ReactElement | null {\n // Store original sizes when popover opens (for cancel)\n const [originalSizes, setOriginalSizes] = useState({ left: leftSize, right: rightSize });\n\n // Capture original sizes only when popover transitions from closed to open\n const wasOpenRef = useRef(false);\n useEffect(() => {\n if (isOpen && !wasOpenRef.current) {\n setOriginalSizes({ left: leftSize, right: rightSize });\n }\n wasOpenRef.current = isOpen;\n }, [isOpen, leftSize, rightSize]);\n\n /**\n * Handle left panel size change.\n * Auto-adjusts right panel to sum to 100%.\n */\n const handleLeftChange = useCallback(\n (value: number | null) => {\n if (value === null) return;\n\n // Clamp to valid range\n const newLeft = Math.max(\n leftPanel.collapsible ? 0 : leftPanel.minSize,\n Math.min(leftPanel.maxSize, value)\n );\n\n // Calculate right size (remaining percentage)\n const newRight = 100 - newLeft;\n\n // Check right panel constraints\n const rightMin = rightPanel.collapsible ? 0 : rightPanel.minSize;\n const rightMax = rightPanel.maxSize;\n\n if (newRight < rightMin || newRight > rightMax) {\n // Can't make this change - right panel would be out of bounds\n return;\n }\n\n onSizesChange(newLeft, newRight);\n },\n [leftPanel, rightPanel, onSizesChange]\n );\n\n /**\n * Handle right panel size change.\n * Auto-adjusts left panel to sum to 100%.\n */\n const handleRightChange = useCallback(\n (value: number | null) => {\n if (value === null) return;\n\n // Clamp to valid range\n const newRight = Math.max(\n rightPanel.collapsible ? 0 : rightPanel.minSize,\n Math.min(rightPanel.maxSize, value)\n );\n\n // Calculate left size (remaining percentage)\n const newLeft = 100 - newRight;\n\n // Check left panel constraints\n const leftMin = leftPanel.collapsible ? 0 : leftPanel.minSize;\n const leftMax = leftPanel.maxSize;\n\n if (newLeft < leftMin || newLeft > leftMax) {\n // Can't make this change - left panel would be out of bounds\n return;\n }\n\n onSizesChange(newLeft, newRight);\n },\n [leftPanel, rightPanel, onSizesChange]\n );\n\n /**\n * Apply a preset.\n */\n const handlePreset = useCallback(\n (preset: ResizePreset) => {\n const leftSize = preset.sizes[0];\n const rightSize = preset.sizes[1];\n if (leftSize !== undefined && rightSize !== undefined) {\n onSizesChange(leftSize, rightSize);\n }\n },\n [onSizesChange]\n );\n\n /**\n * Handle cancel - revert to original sizes.\n */\n const handleCancel = useCallback(() => {\n onSizesChange(originalSizes.left, originalSizes.right);\n onOpenChange(false);\n }, [onSizesChange, onOpenChange, originalSizes]);\n\n /**\n * Handle close (X button or click outside) - keep changes.\n */\n const handleClose = useCallback(() => {\n onOpenChange(false);\n }, [onOpenChange]);\n\n if (!isOpen) return null;\n\n // Popover placement based on direction\n const placement = direction === 'horizontal' ? 'bottom' : 'right';\n\n return (\n <DialogTrigger isOpen={isOpen} onOpenChange={onOpenChange}>\n <AriaButton className=\"sr-only\">Open resize controls</AriaButton>\n <Popover\n triggerRef={triggerRef}\n placement={placement}\n offset={8}\n className={cn(\n 'w-72',\n 'rounded-lg border border-[var(--border)]',\n 'bg-[var(--popover)] text-[var(--popover-foreground)]',\n 'shadow-lg',\n 'outline-none',\n 'animate-in fade-in-0 zoom-in-95',\n 'data-[exiting]:animate-out data-[exiting]:fade-out-0 data-[exiting]:zoom-out-95'\n )}\n >\n <Dialog className=\"outline-none\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-[var(--border)] px-4 py-3\">\n <h3 className=\"text-sm font-medium\">Resize: {groupLabel}</h3>\n <AriaButton\n onPress={handleClose}\n className={cn(\n 'inline-flex items-center justify-center rounded-md',\n 'min-h-[44px] min-w-[44px]',\n 'text-[var(--menu-muted)]',\n 'hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)]',\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2'\n )}\n aria-label=\"Close\"\n >\n <X className=\"h-4 w-4\" />\n </AriaButton>\n </div>\n\n {/* Content */}\n <div className=\"space-y-4 px-4 py-4\">\n {/* Left/Top Panel NumberField */}\n <div>\n <NumberField\n label={`${leftPanel.name} (%)`}\n value={Math.round(leftSize)}\n onChange={handleLeftChange}\n minValue={leftPanel.collapsible ? 0 : leftPanel.minSize}\n maxValue={leftPanel.maxSize}\n step={1}\n stepperLayout=\"sides\"\n />\n </div>\n\n {/* Right/Bottom Panel NumberField */}\n <div>\n <NumberField\n label={`${rightPanel.name} (%)`}\n value={Math.round(rightSize)}\n onChange={handleRightChange}\n minValue={rightPanel.collapsible ? 0 : rightPanel.minSize}\n maxValue={rightPanel.maxSize}\n step={1}\n stepperLayout=\"sides\"\n />\n </div>\n\n {/* Presets */}\n {presets && presets.length > 0 && (\n <div className=\"border-t border-[var(--border)] pt-4\">\n <div className=\"mb-2 text-xs font-medium text-[var(--menu-muted)]\">\n Presets\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {presets.map((preset, index) => (\n <Button\n key={index}\n variant=\"outline\"\n size=\"sm\"\n onPress={() => handlePreset(preset)}\n >\n {preset.label}\n </Button>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"flex justify-end border-t border-[var(--border)] px-4 py-3\">\n <Button variant=\"ghost\" size=\"sm\" onPress={handleCancel}>\n Cancel\n </Button>\n </div>\n </Dialog>\n </Popover>\n </DialogTrigger>\n );\n }\n);\n\nResizablePopover.displayName = 'ResizablePopover';\n","'use client';\n\n/**\n * ResizableHandle Component\n *\n * Draggable handle between resizable panels.\n * Provides keyboard navigation, ARIA slider semantics, and precision popover.\n *\n * @see {@link ../../docs/prd/resizable-prd.md} for full requirements\n */\n\nimport {\n forwardRef,\n useRef,\n useEffect,\n useState,\n useCallback,\n type ReactElement,\n} from 'react';\nimport { GripVertical, GripHorizontal } from 'lucide-react';\nimport { cn } from '../../../utils/cn';\nimport type { ResizableHandleProps } from '../Resizable.types';\nimport {\n resizableHandleVariants,\n resizableGripVariants,\n DEFAULT_MIN_SIZE,\n DEFAULT_MAX_SIZE,\n} from '../Resizable.types';\nimport { useResizableContext } from '../hooks/useResizableContext';\nimport { useResizable } from '../hooks/useResizable';\nimport { ResizablePopover } from './ResizablePopover';\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * ResizableHandle - Draggable handle between panels.\n *\n * Must be used within a ResizablePanelGroup, between ResizablePanels.\n * Provides drag, keyboard, and popover controls for resizing.\n *\n * @example\n * ```tsx\n * <ResizableHandle\n * presets={[\n * { label: 'Equal', sizes: [50, 50] },\n * { label: 'Focus Left', sizes: [70, 30] },\n * ]}\n * />\n * ```\n */\nexport const ResizableHandle = forwardRef<HTMLDivElement, ResizableHandleProps>(\n function ResizableHandle(\n { withHandle = true, presets, disabled = false, className },\n ref\n ): ReactElement {\n const {\n direction,\n groupLabel,\n sizes,\n setSizes,\n panels,\n announce,\n containerRef,\n } = useResizableContext();\n\n // Track handle index based on DOM position\n const internalRef = useRef<HTMLDivElement>(null);\n const handleRef = (ref as React.RefObject<HTMLDivElement>) || internalRef;\n const [handleIndex, setHandleIndex] = useState(0);\n\n // Calculate handle index based on DOM position\n useEffect(() => {\n const handle = handleRef.current;\n const container = containerRef.current;\n if (!handle || !container) return;\n\n // Count handles before this one\n const handles = container.querySelectorAll('[role=\"slider\"]');\n let index = 0;\n handles.forEach((h, i) => {\n if (h === handle) {\n index = i;\n }\n });\n setHandleIndex(index);\n }, [containerRef, handleRef]);\n\n // Handle controls panels at handleIndex and handleIndex + 1\n const leftPanelIndex = handleIndex;\n const rightPanelIndex = handleIndex + 1;\n\n // Get adjacent panel info\n const leftPanel = panels[leftPanelIndex];\n const rightPanel = panels[rightPanelIndex];\n\n // Get current sizes for adjacent panels\n const leftSize = sizes[leftPanelIndex] ?? 50;\n const rightSize = sizes[rightPanelIndex] ?? 50;\n\n // Popover state\n const [isPopoverOpen, setIsPopoverOpen] = useState(false);\n\n // Handle size changes from popover\n const handlePopoverSizesChange = useCallback(\n (newLeftSize: number, newRightSize: number) => {\n const newSizes = [...sizes];\n newSizes[leftPanelIndex] = newLeftSize;\n newSizes[rightPanelIndex] = newRightSize;\n setSizes(newSizes);\n },\n [sizes, setSizes, leftPanelIndex, rightPanelIndex]\n );\n\n // Use resize hook for drag/keyboard handling\n const { isDragging, handlePointerDown, handleKeyDown } = useResizable({\n direction,\n sizes,\n setSizes,\n panels,\n containerRef,\n leftPanelIndex,\n rightPanelIndex,\n disabled,\n announce,\n groupLabel,\n onOpenPopover: () => setIsPopoverOpen(true),\n });\n\n // Build aria-label with panel names and group context\n const ariaLabel =\n leftPanel && rightPanel\n ? `Resize handle between ${leftPanel.name} and ${rightPanel.name} in ${groupLabel}`\n : `Resize handle in ${groupLabel}`;\n\n // Select grip icon based on direction\n const GripIcon = direction === 'horizontal' ? GripVertical : GripHorizontal;\n\n // Default panel info for popover when panels not registered yet\n const leftPanelInfo = leftPanel ?? {\n name: 'Panel 1',\n minSize: DEFAULT_MIN_SIZE,\n maxSize: DEFAULT_MAX_SIZE,\n collapsible: false,\n };\n const rightPanelInfo = rightPanel ?? {\n name: 'Panel 2',\n minSize: DEFAULT_MIN_SIZE,\n maxSize: DEFAULT_MAX_SIZE,\n collapsible: false,\n };\n\n return (\n <>\n <div\n ref={handleRef}\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-label={ariaLabel}\n aria-valuenow={Math.round(leftSize)}\n aria-valuemin={leftPanel?.collapsible ? 0 : (leftPanel?.minSize ?? 0)}\n aria-valuemax={leftPanel?.maxSize ?? 100}\n aria-orientation={direction}\n aria-disabled={disabled}\n data-direction={direction}\n data-dragging={isDragging}\n data-disabled={disabled}\n onPointerDown={handlePointerDown}\n onKeyDown={handleKeyDown}\n className={cn(\n resizableHandleVariants({\n direction,\n disabled,\n isDragging,\n }),\n className\n )}\n >\n {withHandle && (\n <div\n className={cn(resizableGripVariants({ direction }))}\n aria-hidden=\"true\"\n >\n <GripIcon className=\"h-4 w-4\" />\n </div>\n )}\n </div>\n\n {/* Precision Control Popover */}\n <ResizablePopover\n isOpen={isPopoverOpen}\n onOpenChange={setIsPopoverOpen}\n groupLabel={groupLabel}\n leftPanel={leftPanelInfo}\n rightPanel={rightPanelInfo}\n leftSize={leftSize}\n rightSize={rightSize}\n onSizesChange={handlePopoverSizesChange}\n presets={presets}\n triggerRef={handleRef}\n direction={direction}\n />\n </>\n );\n }\n);\n\nResizableHandle.displayName = 'ResizableHandle';\n\n// Re-export presets prop type for consumers\nexport type { ResizePreset } from '../Resizable.types';\n"]}
1
+ {"version":3,"sources":["../../../src/utils/cn.ts","../../../src/elements/Resizable/hooks/useResizableContext.ts","../../../src/elements/Resizable/components/ResizablePanelGroup.tsx","../../../src/elements/Resizable/Resizable.types.ts","../../../src/elements/Resizable/components/ResizablePanel.tsx","../../../src/elements/Resizable/hooks/useResizable.ts","../../../src/elements/Button/Button.styles.ts","../../../src/styles/interaction-states.ts","../../../src/elements/ButtonGroup/ButtonGroupContext.tsx","../../../src/elements/ButtonGroup/ButtonGroup.variants.ts","../../../src/elements/Button/Button.tsx","../../../src/elements/NumberField/NumberField.types.ts","../../../src/elements/NumberField/NumberField.variants.ts","../../../src/elements/NumberField/NumberField.tsx","../../../src/elements/Resizable/components/ResizablePopover.tsx","../../../src/elements/Resizable/components/ResizableHandle.tsx"],"names":["cn","inputs","twMerge","clsx","ResizableContext","createContext","useResizableContext","context","useContext","useResizableProvider","direction","groupLabel","controlledSizes","onSizesChange","internalSizes","setInternalSizes","useState","panels","setPanels","containerRef","useRef","liveRegionRef","announceTimeoutRef","sizesInitializedRef","isControlled","sizes","setSizes","useCallback","newSizes","registerPanel","index","info","prev","newPanels","unregisterPanel","useEffect","panelCount","s","equalSize","i","announce","message","liveRegion","ResizablePanelGroup","forwardRef","className","children","ref","contextValue","useImperativeHandle","jsx","DEFAULT_MIN_SIZE","DEFAULT_MAX_SIZE","LONG_PRESS_THRESHOLD","ResizePresetSchema","z","ResizablePanelGroupPropsSchema","ResizablePanelPropsSchema","ResizableHandlePropsSchema","resizableHandleVariants","cva","resizableGripVariants","ResizablePanel","name","_defaultSize","minSize","maxSize","collapsible","onCollapse","onExpand","onResize","internalRef","panelIndex","setPanelIndex","prevSizeRef","isRegisteredRef","registeredIndexRef","panel","container","allPanels","foundIndex","currentSize","wasCollapsed","isCollapsed","node","clampSize","size","min","max","calculateNewSizes","leftIndex","rightIndex","delta","leftPanel","rightPanel","leftSize","rightSize","newLeftSize","newRightSize","leftMin","leftMax","rightMin","rightMax","useResizable","leftPanelIndex","rightPanelIndex","disabled","onOpenPopover","isDragging","setIsDragging","dragStartRef","longPressTimerRef","pointerDownTimeRef","wasLongPressRef","panelsRef","sizesRef","setSizesRef","handlePointerMoveRef","handlePointerUpRef","getContainerSize","pixelsToPercent","pixels","containerSize","onPointerMove","e","onPointerUp","handlePointerMove","event","percentDelta","handlePointerUp","newSize","handlePointerDown","position","handleKeyDown","step","moveHandler","upHandler","buttonOuterVariants","buttonVisualVariants","PRESSED_STYLES","HOVER_STYLES","HIGH_CONTRAST_HOVER","HIGH_CONTRAST_PRESSED","ButtonGroupContext","useButtonGroupContext","ButtonGroupItemContext","useButtonGroupItemContext","buttonGroupItemVariants","Button","memo","buttonVisualClassName","variant","visualSize","fullWidth","loading","loadingText","shortcut","isDisabled","paywall","paywallRedirect","paywallDescription","onPress","props","paywallDescriptionId","useId","groupContext","itemContext","effectiveVariant","effectiveSize","effectiveIsDisabled","isInVerticalGroup","effectiveFullWidth","positionClassName","effectiveVisualSize","AriaButton","renderProps","jsxs","Fragment","Loader2","Zap","DEFAULT_MAX_VALUE","DEFAULT_MIN_VALUE","NEGATIVE_MIN_VALUE","numberFieldVariants","numberFieldInputVariants","numberFieldStepperVariants","numberFieldLabelVariants","numberFieldDescriptionVariants","numberFieldErrorVariants","NumberField","label","description","errorMessage","stepperLayout","allowNegative","incrementAriaLabel","decrementAriaLabel","minValue","maxValue","isInvalid","isRequired","isReadOnly","effectiveMinValue","effectiveMaxValue","showSteppers","isStackedLayout","AriaNumberField","AriaLabel","AriaGroup","Minus","AriaInput","Plus","AriaText","AriaFieldError","ResizablePopover","isOpen","onOpenChange","presets","triggerRef","_ref","originalSizes","setOriginalSizes","wasOpenRef","handleLeftChange","value","newLeft","newRight","handleRightChange","handlePreset","preset","handleCancel","handleClose","DialogTrigger","Popover","Dialog","X","ResizableHandle","withHandle","handleRef","handleIndex","setHandleIndex","handle","handles","h","isPopoverOpen","setIsPopoverOpen","handlePopoverSizesChange","ariaLabel","GripIcon","GripVertical","GripHorizontal","leftPanelInfo","rightPanelInfo"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Class Name Utility\n * Merges Tailwind CSS classes with conflict resolution\n *\n * Combines clsx for conditional classes and tailwind-merge for deduplication\n *\n * @example\n * cn('px-2 py-1', 'px-4') // => 'py-1 px-4' (px-4 overrides px-2)\n * cn('text-red-500', condition && 'text-blue-500') // => conditional application\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * Resizable Context Hook\n *\n * Provides context for ResizablePanelGroup compound components.\n * Manages panel sizes, registration, and screen reader announcements.\n */\n\nimport {\n createContext,\n useContext,\n useRef,\n useState,\n useCallback,\n useEffect,\n type ReactNode,\n} from 'react';\nimport type { ResizableContextValue, PanelInfo } from '../Resizable.types';\n\n// ============================================================================\n// Context\n// ============================================================================\n\n/**\n * Context for Resizable compound components.\n * Must be used within a ResizablePanelGroup.\n */\nexport const ResizableContext = createContext<ResizableContextValue | null>(\n null\n);\n\nResizableContext.displayName = 'ResizableContext';\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook to access ResizableContext.\n * Throws an error if used outside of ResizablePanelGroup.\n *\n * @returns ResizableContextValue\n * @throws Error if used outside ResizablePanelGroup\n */\nexport function useResizableContext(): ResizableContextValue {\n const context = useContext(ResizableContext);\n\n if (!context) {\n throw new Error(\n 'useResizableContext must be used within a ResizablePanelGroup. ' +\n 'Make sure ResizablePanel and ResizableHandle are children of ResizablePanelGroup.'\n );\n }\n\n return context;\n}\n\n// ============================================================================\n// Provider Props\n// ============================================================================\n\ninterface ResizableProviderProps {\n direction: 'horizontal' | 'vertical';\n groupLabel: string;\n sizes?: number[];\n defaultSizes?: number[];\n onSizesChange?: (sizes: number[]) => void;\n children: ReactNode;\n}\n\n// ============================================================================\n// Provider Hook\n// ============================================================================\n\n/**\n * Hook to create ResizableContext value for the provider.\n * Handles both controlled and uncontrolled modes.\n */\nexport function useResizableProvider({\n direction,\n groupLabel,\n sizes: controlledSizes,\n onSizesChange,\n}: Omit<ResizableProviderProps, 'children'>): ResizableContextValue {\n // Internal state for uncontrolled mode\n const [internalSizes, setInternalSizes] = useState<number[]>([]);\n\n // Panel registration\n const [panels, setPanels] = useState<PanelInfo[]>([]);\n\n // Container ref for size calculations\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Live region ref for announcements\n const liveRegionRef = useRef<HTMLDivElement | null>(null);\n const announceTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Track if sizes have been initialized\n const sizesInitializedRef = useRef(false);\n\n // Determine if controlled\n const isControlled = controlledSizes !== undefined;\n const sizes = isControlled ? controlledSizes : internalSizes;\n\n /**\n * Update sizes - handles both controlled and uncontrolled modes.\n */\n const setSizes = useCallback(\n (newSizes: number[]) => {\n if (isControlled) {\n onSizesChange?.(newSizes);\n } else {\n setInternalSizes(newSizes);\n }\n },\n [isControlled, onSizesChange]\n );\n\n /**\n * Register a panel with the group.\n */\n const registerPanel = useCallback((index: number, info: PanelInfo) => {\n setPanels((prev) => {\n const newPanels = [...prev];\n newPanels[index] = info;\n return newPanels;\n });\n }, []);\n\n /**\n * Unregister a panel from the group.\n */\n const unregisterPanel = useCallback((index: number) => {\n setPanels((prev) => {\n const newPanels = [...prev];\n delete newPanels[index];\n return newPanels.filter(Boolean);\n });\n }, []);\n\n // Initialize sizes when panels are registered (uncontrolled mode only)\n useEffect(() => {\n // Skip if controlled or already initialized\n if (isControlled || sizesInitializedRef.current) return;\n\n // Get registered panel count\n const registeredPanels = panels.filter(Boolean);\n const panelCount = registeredPanels.length;\n\n // Wait until we have at least 2 panels (common case: panel + panel with handle between)\n if (panelCount < 2) return;\n\n // Check if sizes need initialization\n const needsInit = sizes.length < panelCount || sizes.some((s) => s === undefined);\n\n if (needsInit) {\n // Initialize with equal distribution using defaultSize from each panel if available\n const newSizes: number[] = [];\n const equalSize = 100 / panelCount;\n\n for (let i = 0; i < panelCount; i++) {\n newSizes[i] = equalSize;\n }\n\n sizesInitializedRef.current = true;\n setInternalSizes(newSizes);\n }\n }, [panels, sizes, isControlled]);\n\n // Cleanup live region on unmount\n useEffect(() => {\n return () => {\n if (announceTimeoutRef.current) {\n clearTimeout(announceTimeoutRef.current);\n }\n if (liveRegionRef.current) {\n document.body.removeChild(liveRegionRef.current);\n liveRegionRef.current = null;\n }\n };\n }, []);\n\n /**\n * Announce a message to screen readers via live region.\n */\n const announce = useCallback((message: string) => {\n // Create live region if it doesn't exist\n if (!liveRegionRef.current) {\n const liveRegion = document.createElement('div');\n liveRegion.setAttribute('aria-live', 'polite');\n liveRegion.setAttribute('aria-atomic', 'true');\n liveRegion.className = 'sr-only';\n liveRegion.style.cssText =\n 'position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;';\n document.body.appendChild(liveRegion);\n liveRegionRef.current = liveRegion;\n }\n\n // Update live region content\n liveRegionRef.current.textContent = message;\n\n // Clear previous timeout if any\n if (announceTimeoutRef.current) {\n clearTimeout(announceTimeoutRef.current);\n }\n\n // Clear after announcement\n announceTimeoutRef.current = setTimeout(() => {\n if (liveRegionRef.current) {\n liveRegionRef.current.textContent = '';\n }\n }, 1000);\n }, []);\n\n return {\n direction,\n groupLabel,\n sizes,\n setSizes,\n panels,\n registerPanel,\n unregisterPanel,\n announce,\n containerRef,\n };\n}\n","'use client';\n\n/**\n * ResizablePanelGroup Component\n *\n * Container component for resizable panel layouts.\n * Provides context for child panels and handles.\n *\n * @see {@link ../../docs/prd/resizable-prd.md} for full requirements\n */\n\nimport { forwardRef, useImperativeHandle, type ReactElement } from 'react';\nimport { cn } from '../../../utils/cn';\nimport type { ResizablePanelGroupProps } from '../Resizable.types';\nimport {\n ResizableContext,\n useResizableProvider,\n} from '../hooks/useResizableContext';\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * ResizablePanelGroup - Container for resizable panels.\n *\n * Provides context for child ResizablePanel and ResizableHandle components.\n * Supports both controlled and uncontrolled modes.\n *\n * @example\n * ```tsx\n * <ResizablePanelGroup direction=\"horizontal\" groupLabel=\"Main layout\">\n * <ResizablePanel name=\"Sidebar\">Content</ResizablePanel>\n * <ResizableHandle />\n * <ResizablePanel name=\"Main\">Content</ResizablePanel>\n * </ResizablePanelGroup>\n * ```\n */\nexport const ResizablePanelGroup = forwardRef<\n HTMLDivElement | null,\n ResizablePanelGroupProps\n>(function ResizablePanelGroup(\n { direction, groupLabel, sizes, onSizesChange, className, children },\n ref\n): ReactElement {\n // Create context value with controlled/uncontrolled handling\n const contextValue = useResizableProvider({\n direction,\n groupLabel,\n sizes,\n onSizesChange,\n });\n\n // Expose containerRef to parent via forwarded ref\n useImperativeHandle<HTMLDivElement | null, HTMLDivElement | null>(\n ref,\n () => contextValue.containerRef.current,\n [contextValue.containerRef]\n );\n\n return (\n <ResizableContext.Provider value={contextValue}>\n <div\n ref={contextValue.containerRef}\n role=\"group\"\n aria-label={`${groupLabel}, ${direction}`}\n data-direction={direction}\n className={cn(\n 'flex h-full w-full',\n direction === 'horizontal' ? 'flex-row' : 'flex-col',\n className\n )}\n >\n {children}\n </div>\n </ResizableContext.Provider>\n );\n});\n\nResizablePanelGroup.displayName = 'ResizablePanelGroup';\n","/**\n * Resizable Component Types\n *\n * Zod schemas and TypeScript types for the Resizable compound component.\n * Provides accessible, keyboard-navigable resizable panel layouts.\n *\n * @see {@link ../../docs/prd/resizable-prd.md} for full requirements\n */\n\nimport { z } from 'zod';\nimport { type ReactNode } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default minimum panel size (percentage).\n */\nexport const DEFAULT_MIN_SIZE = 10;\n\n/**\n * Default maximum panel size (percentage).\n */\nexport const DEFAULT_MAX_SIZE = 90;\n\n/**\n * Long-press threshold for touch devices (ms).\n * Tap (< threshold) opens popover, long-press (>= threshold) enables drag.\n */\nexport const LONG_PRESS_THRESHOLD = 300;\n\n// ============================================================================\n// Preset Type\n// ============================================================================\n\n/**\n * Size preset for quick adjustment via popover.\n */\nexport interface ResizePreset {\n /** Display label for the preset button */\n label: string;\n /** Size percentages for each panel (must sum to 100) */\n sizes: number[];\n}\n\n/**\n * Zod schema for ResizePreset validation.\n */\nexport const ResizePresetSchema = z.object({\n label: z.string().min(1),\n sizes: z.array(z.number().min(0).max(100)),\n});\n\n// ============================================================================\n// ResizablePanelGroup Props\n// ============================================================================\n\n/**\n * Zod schema for ResizablePanelGroup props.\n */\nexport const ResizablePanelGroupPropsSchema = z.object({\n /** Layout direction */\n direction: z.enum(['horizontal', 'vertical']),\n\n /** REQUIRED: Label for screen reader identification of this group */\n groupLabel: z.string().min(1),\n\n /** Controlled mode: current sizes as percentages */\n sizes: z.array(z.number().min(0).max(100)).optional(),\n\n /** Callback when sizes change */\n onSizesChange: z.function().optional(),\n\n /** Additional CSS classes */\n className: z.string().optional(),\n\n /** Panel children */\n children: z.custom<ReactNode>(),\n});\n\n/**\n * Props for ResizablePanelGroup component.\n */\nexport interface ResizablePanelGroupProps {\n /** Layout direction: 'horizontal' or 'vertical' */\n direction: 'horizontal' | 'vertical';\n\n /** REQUIRED: Label for screen reader identification (e.g., \"Main layout\") */\n groupLabel: string;\n\n /** Controlled mode: current sizes as percentages (must sum to 100) */\n sizes?: number[];\n\n /** Callback when sizes change */\n onSizesChange?: (sizes: number[]) => void;\n\n /** Additional CSS classes */\n className?: string;\n\n /** Panel and Handle children */\n children: ReactNode;\n}\n\n// ============================================================================\n// ResizablePanel Props\n// ============================================================================\n\n/**\n * Zod schema for ResizablePanel props.\n */\nexport const ResizablePanelPropsSchema = z.object({\n /** REQUIRED: Name for screen reader identification */\n name: z.string().min(1),\n\n /** Default size as percentage (auto-distributes equally if omitted) */\n defaultSize: z.number().min(0).max(100).optional(),\n\n /** Minimum size as percentage */\n minSize: z.number().min(0).max(100).optional().default(DEFAULT_MIN_SIZE),\n\n /** Maximum size as percentage */\n maxSize: z.number().min(0).max(100).optional().default(DEFAULT_MAX_SIZE),\n\n /** Whether panel can collapse to 0% */\n collapsible: z.boolean().optional().default(false),\n\n /** Callback when panel collapses */\n onCollapse: z.function().optional(),\n\n /** Callback when panel expands from collapsed */\n onExpand: z.function().optional(),\n\n /** Callback when panel resizes */\n onResize: z.function().optional(),\n\n /** Additional CSS classes */\n className: z.string().optional(),\n\n /** Panel content */\n children: z.custom<ReactNode>(),\n});\n\n/**\n * Props for ResizablePanel component.\n */\nexport interface ResizablePanelProps {\n /** REQUIRED: Name for screen reader identification (e.g., \"Sidebar\") */\n name: string;\n\n /** Default size as percentage (0-100). Auto-distributes equally if omitted. */\n defaultSize?: number;\n\n /** Minimum size as percentage (default: 10) */\n minSize?: number;\n\n /** Maximum size as percentage (default: 90) */\n maxSize?: number;\n\n /** Whether panel can collapse to 0% */\n collapsible?: boolean;\n\n /** Callback when panel collapses to 0% */\n onCollapse?: () => void;\n\n /** Callback when panel expands from collapsed state */\n onExpand?: () => void;\n\n /** Callback when panel size changes */\n onResize?: (size: number) => void;\n\n /** Additional CSS classes */\n className?: string;\n\n /** Panel content */\n children: ReactNode;\n}\n\n// ============================================================================\n// ResizableHandle Props\n// ============================================================================\n\n/**\n * Zod schema for ResizableHandle props.\n */\nexport const ResizableHandlePropsSchema = z.object({\n /** Whether to show the visual grip indicator */\n withHandle: z.boolean().optional().default(true),\n\n /** Size presets for quick adjustment */\n presets: z.array(ResizePresetSchema).optional(),\n\n /** Whether the handle is disabled */\n disabled: z.boolean().optional().default(false),\n\n /** Additional CSS classes */\n className: z.string().optional(),\n});\n\n/**\n * Props for ResizableHandle component.\n */\nexport interface ResizableHandleProps {\n /** Whether to show the visual grip indicator (default: true) */\n withHandle?: boolean;\n\n /** Size presets for quick adjustment via popover */\n presets?: ResizePreset[];\n\n /** Whether the handle is disabled */\n disabled?: boolean;\n\n /** Additional CSS classes */\n className?: string;\n}\n\n// ============================================================================\n// Context Types\n// ============================================================================\n\n/**\n * Panel registration info stored in context.\n */\nexport interface PanelInfo {\n name: string;\n minSize: number;\n maxSize: number;\n collapsible: boolean;\n}\n\n/**\n * Context value for ResizablePanelGroup.\n */\nexport interface ResizableContextValue {\n /** Layout direction */\n direction: 'horizontal' | 'vertical';\n\n /** Group label for screen reader announcements */\n groupLabel: string;\n\n /** Current panel sizes as percentages */\n sizes: number[];\n\n /** Update panel sizes */\n setSizes: (sizes: number[]) => void;\n\n /** Registered panel info */\n panels: PanelInfo[];\n\n /** Register a panel with the group */\n registerPanel: (index: number, info: PanelInfo) => void;\n\n /** Unregister a panel */\n unregisterPanel: (index: number) => void;\n\n /** Announce a message to screen readers */\n announce: (message: string) => void;\n\n /** Reference to the container element */\n containerRef: React.RefObject<HTMLDivElement | null>;\n}\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * CVA variants for ResizableHandle styling.\n * Ensures 44x44px touch target for WCAG 2.2 AAA compliance.\n */\nexport const resizableHandleVariants = cva(\n [\n // Base styles - 44px touch target\n 'relative flex items-center justify-center',\n 'shrink-0',\n 'bg-transparent',\n 'transition-colors duration-150',\n // Focus styles\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2',\n // Touch target padding for accessibility\n 'touch-none select-none',\n ],\n {\n variants: {\n direction: {\n horizontal: [\n 'w-3 min-w-[12px]',\n 'cursor-col-resize',\n 'hover:bg-[var(--accent)]/50',\n // Ensure 44px touch target via padding\n 'before:absolute before:inset-y-0 before:-inset-x-4',\n 'before:min-w-[44px]',\n ],\n vertical: [\n 'h-3 min-h-[12px]',\n 'cursor-row-resize',\n 'hover:bg-[var(--accent)]/50',\n // Ensure 44px touch target via padding\n 'before:absolute before:inset-x-0 before:-inset-y-4',\n 'before:min-h-[44px]',\n ],\n },\n disabled: {\n true: 'cursor-not-allowed opacity-50 pointer-events-none',\n false: '',\n },\n isDragging: {\n true: 'bg-[var(--accent)]',\n false: '',\n },\n },\n defaultVariants: {\n direction: 'horizontal',\n disabled: false,\n isDragging: false,\n },\n }\n);\n\n/**\n * CVA variants for the grip indicator inside the handle.\n */\nexport const resizableGripVariants = cva(\n [\n 'flex items-center justify-center',\n 'rounded-full',\n 'bg-[var(--border)]',\n 'text-[var(--menu-muted)]',\n ],\n {\n variants: {\n direction: {\n horizontal: 'h-8 w-1',\n vertical: 'h-1 w-8',\n },\n },\n defaultVariants: {\n direction: 'horizontal',\n },\n }\n);\n\n/**\n * Type for resizableHandleVariants props.\n */\nexport type ResizableHandleVariantProps = VariantProps<\n typeof resizableHandleVariants\n>;\n","'use client';\n\n/**\n * ResizablePanel Component\n *\n * Individual panel within a ResizablePanelGroup.\n * Registers with context and applies size from group state.\n *\n * @see {@link ../../docs/prd/resizable-prd.md} for full requirements\n */\n\nimport {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type ReactElement,\n} from 'react';\nimport { cn } from '../../../utils/cn';\nimport type { ResizablePanelProps } from '../Resizable.types';\nimport { DEFAULT_MIN_SIZE, DEFAULT_MAX_SIZE } from '../Resizable.types';\nimport { useResizableContext } from '../hooks/useResizableContext';\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * ResizablePanel - Individual panel in a resizable layout.\n *\n * Must be used within a ResizablePanelGroup.\n * Registers itself with context for size management.\n *\n * @example\n * ```tsx\n * <ResizablePanel name=\"Sidebar\" defaultSize={25} minSize={15} maxSize={40}>\n * <SidebarContent />\n * </ResizablePanel>\n * ```\n */\nexport const ResizablePanel = forwardRef<HTMLDivElement, ResizablePanelProps>(\n function ResizablePanel(\n {\n name,\n defaultSize: _defaultSize,\n minSize = DEFAULT_MIN_SIZE,\n maxSize = DEFAULT_MAX_SIZE,\n collapsible = false,\n onCollapse,\n onExpand,\n onResize,\n className,\n children,\n },\n ref\n ): ReactElement {\n const { sizes, registerPanel, unregisterPanel, containerRef } =\n useResizableContext();\n\n // Internal ref for DOM element\n const internalRef = useRef<HTMLDivElement>(null);\n\n // Track panel index based on DOM order (use state to trigger re-renders)\n const [panelIndex, setPanelIndex] = useState<number>(-1);\n const prevSizeRef = useRef<number | null>(null);\n const isRegisteredRef = useRef(false);\n const registeredIndexRef = useRef<number>(-1);\n\n // Calculate panel index from DOM position (useEffect runs after refs are set)\n useEffect(() => {\n const panel = internalRef.current;\n const container = containerRef.current;\n if (!panel || !container) return;\n\n // Count panels before this one in the DOM\n const allPanels = container.querySelectorAll('[data-resizable-panel]');\n let foundIndex = -1;\n for (let i = 0; i < allPanels.length; i++) {\n if (allPanels[i] === panel) {\n foundIndex = i;\n break;\n }\n }\n\n if (foundIndex === -1) return;\n\n // Update index state (triggers re-render)\n if (panelIndex !== foundIndex) {\n setPanelIndex(foundIndex);\n }\n\n // Register/update panel info\n if (!isRegisteredRef.current) {\n isRegisteredRef.current = true;\n registeredIndexRef.current = foundIndex;\n registerPanel(foundIndex, {\n name,\n minSize,\n maxSize,\n collapsible,\n });\n }\n\n return () => {\n if (isRegisteredRef.current) {\n unregisterPanel(registeredIndexRef.current);\n isRegisteredRef.current = false;\n }\n };\n }, [containerRef, registerPanel, unregisterPanel, name, minSize, maxSize, collapsible, panelIndex]);\n\n // Get current size for this panel\n const currentSize = panelIndex >= 0 ? sizes[panelIndex] ?? 50 : 50;\n\n // Handle collapse/expand callbacks\n useEffect(() => {\n if (prevSizeRef.current === null) {\n prevSizeRef.current = currentSize;\n return;\n }\n\n const wasCollapsed = prevSizeRef.current === 0;\n const isCollapsed = currentSize === 0;\n\n if (!wasCollapsed && isCollapsed && onCollapse) {\n onCollapse();\n } else if (wasCollapsed && !isCollapsed && onExpand) {\n onExpand();\n }\n\n if (onResize && prevSizeRef.current !== currentSize) {\n onResize(currentSize);\n }\n\n prevSizeRef.current = currentSize;\n }, [currentSize, onCollapse, onExpand, onResize]);\n\n return (\n <div\n ref={(node) => {\n // Update internal ref\n (internalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n // Forward to external ref if provided\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }\n }}\n role=\"region\"\n aria-label={name}\n data-resizable-panel=\"\"\n data-panel-name={name}\n data-panel-index={panelIndex}\n data-collapsed={currentSize === 0}\n style={{\n flexBasis: `${currentSize}%`,\n flexGrow: 0,\n flexShrink: 0,\n overflow: 'hidden',\n }}\n className={cn('relative', className)}\n >\n {children}\n </div>\n );\n }\n);\n\nResizablePanel.displayName = 'ResizablePanel';\n","/**\n * useResizable Hook\n *\n * Core resize logic for handling drag interactions.\n * Manages pointer events, calculates size changes, and enforces constraints.\n *\n * @see {@link ../../docs/prd/resizable-prd.md} for full requirements\n */\n\nimport { useCallback, useRef, useState, useEffect } from 'react';\nimport type { PanelInfo } from '../Resizable.types';\nimport { LONG_PRESS_THRESHOLD } from '../Resizable.types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface UseResizableOptions {\n /** Layout direction */\n direction: 'horizontal' | 'vertical';\n /** Current panel sizes */\n sizes: number[];\n /** Update panel sizes */\n setSizes: (sizes: number[]) => void;\n /** Registered panel info */\n panels: PanelInfo[];\n /** Reference to container element for size calculations */\n containerRef: React.RefObject<HTMLDivElement | null>;\n /** Index of the left/top panel this handle controls */\n leftPanelIndex: number;\n /** Index of the right/bottom panel this handle controls */\n rightPanelIndex: number;\n /** Whether the handle is disabled */\n disabled?: boolean;\n /** Callback to announce size changes */\n announce?: (message: string) => void;\n /** Group label for announcements */\n groupLabel?: string;\n /** Callback when popover should open */\n onOpenPopover?: () => void;\n}\n\ninterface UseResizableReturn {\n /** Whether currently dragging */\n isDragging: boolean;\n /** Pointer down handler for drag start */\n handlePointerDown: (event: React.PointerEvent) => void;\n /** Keyboard handler for arrow key resizing */\n handleKeyDown: (event: React.KeyboardEvent) => void;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Clamp a size value within min/max bounds.\n */\nfunction clampSize(size: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, size));\n}\n\n/**\n * Calculate new sizes when adjusting by a delta.\n * Only affects adjacent panels - other panels remain unchanged.\n */\nfunction calculateNewSizes(\n sizes: number[],\n panels: PanelInfo[],\n leftIndex: number,\n rightIndex: number,\n delta: number\n): number[] {\n const newSizes = [...sizes];\n const leftPanel = panels[leftIndex];\n const rightPanel = panels[rightIndex];\n\n if (!leftPanel || !rightPanel) return sizes;\n\n // Current sizes\n const leftSize = sizes[leftIndex] ?? 50;\n const rightSize = sizes[rightIndex] ?? 50;\n\n // Calculate new sizes\n let newLeftSize = leftSize + delta;\n let newRightSize = rightSize - delta;\n\n // Apply constraints\n const leftMin = leftPanel.collapsible ? 0 : leftPanel.minSize;\n const leftMax = leftPanel.maxSize;\n const rightMin = rightPanel.collapsible ? 0 : rightPanel.minSize;\n const rightMax = rightPanel.maxSize;\n\n // Clamp left panel\n newLeftSize = clampSize(newLeftSize, leftMin, leftMax);\n\n // Adjust right panel to compensate\n newRightSize = leftSize + rightSize - newLeftSize;\n\n // Clamp right panel\n newRightSize = clampSize(newRightSize, rightMin, rightMax);\n\n // Re-adjust left panel if right was clamped\n newLeftSize = leftSize + rightSize - newRightSize;\n\n newSizes[leftIndex] = newLeftSize;\n newSizes[rightIndex] = newRightSize;\n\n return newSizes;\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook for managing resize interactions.\n *\n * @param options - Resize options\n * @returns Drag state and event handlers\n */\nexport function useResizable({\n direction,\n sizes,\n setSizes,\n panels,\n containerRef,\n leftPanelIndex,\n rightPanelIndex,\n disabled = false,\n announce,\n groupLabel,\n onOpenPopover,\n}: UseResizableOptions): UseResizableReturn {\n const [isDragging, setIsDragging] = useState(false);\n\n // Track drag start position and sizes\n const dragStartRef = useRef<{\n position: number;\n sizes: number[];\n containerSize: number;\n } | null>(null);\n\n // Track long press for touch interaction\n const longPressTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pointerDownTimeRef = useRef<number>(0);\n const wasLongPressRef = useRef<boolean>(false);\n\n // Store latest values in refs for stable event handlers\n const panelsRef = useRef(panels);\n const sizesRef = useRef(sizes);\n const setSizesRef = useRef(setSizes);\n\n // Refs for stable event listener references (prevents memory leaks)\n const handlePointerMoveRef = useRef<(e: PointerEvent) => void>(() => {});\n const handlePointerUpRef = useRef<() => void>(() => {});\n\n // Keep refs updated\n useEffect(() => {\n panelsRef.current = panels;\n sizesRef.current = sizes;\n setSizesRef.current = setSizes;\n }, [panels, sizes, setSizes]);\n\n /**\n * Get container size in the resize direction.\n */\n const getContainerSize = useCallback((): number => {\n const container = containerRef.current;\n if (!container) return 0;\n return direction === 'horizontal'\n ? container.offsetWidth\n : container.offsetHeight;\n }, [containerRef, direction]);\n\n /**\n * Convert pixel delta to percentage delta.\n */\n const pixelsToPercent = useCallback(\n (pixels: number): number => {\n const containerSize = getContainerSize();\n if (containerSize === 0) return 0;\n return (pixels / containerSize) * 100;\n },\n [getContainerSize]\n );\n\n // Stable wrapper functions for event listeners (prevent memory leaks)\n // These are created once and never change, using refs to call current handlers\n const onPointerMove = useCallback((e: PointerEvent) => {\n handlePointerMoveRef.current(e);\n }, []);\n\n const onPointerUp = useCallback(() => {\n handlePointerUpRef.current();\n }, []);\n\n /**\n * Handle pointer move during drag.\n * Uses refs to avoid stale closures and prevent listener removal on re-render.\n */\n const handlePointerMove = useCallback(\n (event: PointerEvent) => {\n if (!dragStartRef.current || disabled) return;\n\n const position =\n direction === 'horizontal' ? event.clientX : event.clientY;\n const delta = position - dragStartRef.current.position;\n const percentDelta = pixelsToPercent(delta);\n\n const newSizes = calculateNewSizes(\n dragStartRef.current.sizes,\n panelsRef.current,\n leftPanelIndex,\n rightPanelIndex,\n percentDelta\n );\n\n setSizesRef.current(newSizes);\n },\n [\n direction,\n disabled,\n leftPanelIndex,\n pixelsToPercent,\n rightPanelIndex,\n ]\n );\n\n /**\n * Handle pointer up to end drag.\n * Uses refs to avoid stale closures.\n */\n const handlePointerUp = useCallback(() => {\n // Clear long press timer\n if (longPressTimerRef.current) {\n clearTimeout(longPressTimerRef.current);\n longPressTimerRef.current = null;\n }\n\n // Check if this was a tap (not a long press or drag)\n const duration = Date.now() - pointerDownTimeRef.current;\n const wasTap = duration < LONG_PRESS_THRESHOLD && !wasLongPressRef.current;\n\n if (wasTap && onOpenPopover && !disabled) {\n onOpenPopover();\n }\n\n // End drag\n if (isDragging) {\n setIsDragging(false);\n\n // Announce final size\n const leftPanel = panelsRef.current[leftPanelIndex];\n const newSize = Math.round(sizesRef.current[leftPanelIndex] ?? 50);\n if (announce && leftPanel && groupLabel) {\n announce(\n `${leftPanel.name} in ${groupLabel} resized to ${newSize} percent`\n );\n }\n }\n\n dragStartRef.current = null;\n wasLongPressRef.current = false;\n\n // Remove document listeners (use stable wrappers to match what was added)\n document.removeEventListener('pointermove', onPointerMove);\n document.removeEventListener('pointerup', onPointerUp);\n document.removeEventListener('pointercancel', onPointerUp);\n\n // Reset cursor\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n }, [\n announce,\n disabled,\n groupLabel,\n isDragging,\n leftPanelIndex,\n onOpenPopover,\n onPointerMove,\n onPointerUp,\n ]);\n\n // Keep handler refs updated so stable wrappers call the latest handlers\n useEffect(() => {\n handlePointerMoveRef.current = handlePointerMove;\n handlePointerUpRef.current = handlePointerUp;\n });\n\n /**\n * Handle pointer down to start drag.\n */\n const handlePointerDown = useCallback(\n (event: React.PointerEvent) => {\n if (disabled) return;\n\n // Prevent text selection during drag\n event.preventDefault();\n\n const position =\n direction === 'horizontal' ? event.clientX : event.clientY;\n pointerDownTimeRef.current = Date.now();\n wasLongPressRef.current = false;\n\n // Store initial state\n dragStartRef.current = {\n position,\n sizes: [...sizes],\n containerSize: getContainerSize(),\n };\n\n // Set up long press timer for touch\n longPressTimerRef.current = setTimeout(() => {\n wasLongPressRef.current = true;\n setIsDragging(true);\n\n // Set cursor during drag\n document.body.style.cursor =\n direction === 'horizontal' ? 'col-resize' : 'row-resize';\n document.body.style.userSelect = 'none';\n }, LONG_PRESS_THRESHOLD);\n\n // Add document listeners (use stable wrappers to prevent memory leaks)\n document.addEventListener('pointermove', onPointerMove);\n document.addEventListener('pointerup', onPointerUp);\n document.addEventListener('pointercancel', onPointerUp);\n\n // For mouse, start dragging immediately\n if (event.pointerType === 'mouse') {\n // Clear long press timer for mouse - drag starts immediately\n if (longPressTimerRef.current) {\n clearTimeout(longPressTimerRef.current);\n longPressTimerRef.current = null;\n }\n wasLongPressRef.current = true;\n setIsDragging(true);\n document.body.style.cursor =\n direction === 'horizontal' ? 'col-resize' : 'row-resize';\n document.body.style.userSelect = 'none';\n }\n },\n [\n direction,\n disabled,\n getContainerSize,\n onPointerMove,\n onPointerUp,\n sizes,\n ]\n );\n\n /**\n * Handle keyboard navigation.\n */\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (disabled) return;\n\n const step = event.shiftKey ? 10 : 1;\n let delta = 0;\n\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowUp':\n delta = -step;\n break;\n case 'ArrowRight':\n case 'ArrowDown':\n delta = step;\n break;\n case 'Home': {\n // Set to minimum\n const leftPanel = panels[leftPanelIndex];\n if (leftPanel) {\n const minSize = leftPanel.collapsible ? 0 : leftPanel.minSize;\n delta = minSize - (sizes[leftPanelIndex] ?? 50);\n }\n break;\n }\n case 'End': {\n // Set to maximum\n const leftPanel = panels[leftPanelIndex];\n if (leftPanel) {\n delta = leftPanel.maxSize - (sizes[leftPanelIndex] ?? 50);\n }\n break;\n }\n case 'Enter':\n case ' ':\n // Open popover\n event.preventDefault();\n onOpenPopover?.();\n return;\n default:\n return;\n }\n\n if (delta !== 0) {\n event.preventDefault();\n const newSizes = calculateNewSizes(\n sizes,\n panels,\n leftPanelIndex,\n rightPanelIndex,\n delta\n );\n setSizes(newSizes);\n\n // Announce the change\n const leftPanel = panels[leftPanelIndex];\n const newSize = Math.round(newSizes[leftPanelIndex] ?? 50);\n if (announce && leftPanel && groupLabel) {\n announce(\n `${leftPanel.name} in ${groupLabel} resized to ${newSize} percent`\n );\n }\n }\n },\n [\n announce,\n disabled,\n groupLabel,\n leftPanelIndex,\n onOpenPopover,\n panels,\n rightPanelIndex,\n setSizes,\n sizes,\n ]\n );\n\n // Cleanup on unmount only (empty deps = only runs on unmount)\n useEffect(() => {\n // Capture stable wrappers for cleanup\n const moveHandler = onPointerMove;\n const upHandler = onPointerUp;\n return () => {\n if (longPressTimerRef.current) {\n clearTimeout(longPressTimerRef.current);\n }\n // Use stable wrappers for cleanup\n document.removeEventListener('pointermove', moveHandler);\n document.removeEventListener('pointerup', upHandler);\n document.removeEventListener('pointercancel', upHandler);\n };\n }, [onPointerMove, onPointerUp]);\n\n return {\n isDragging,\n handlePointerDown,\n handleKeyDown,\n };\n}\n","import { cva } from 'class-variance-authority';\n\n/**\n * Layer 1: Transparent outer touch target (44x44px minimum)\n * Handles WCAG 2.2 AAA touch target requirement\n * Always transparent, centers the visual button inside\n * IMPORTANT: Focus ring stays on Layer 1 for AAA compliance (2.4.13)\n *\n * In vertical ButtonGroups, uses items-stretch so the visual layer (Layer 2)\n * can fill the full touch target height, eliminating gaps between buttons.\n */\nexport const buttonOuterVariants = cva(\n \"inline-flex justify-center min-h-[44px] min-w-[44px] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n fullWidth: {\n true: \"w-full\",\n false: \"\",\n },\n inVerticalGroup: {\n true: \"items-stretch\",\n false: \"items-center\",\n },\n },\n defaultVariants: {\n fullWidth: false,\n inVerticalGroup: false,\n },\n }\n);\n\n/**\n * Layer 2: Visual button appearance (adjustable size)\n * Provides the visual appearance with configurable size\n * Can be smaller than touch target for use cases like carousel dots\n * NOTE: NO focus-visible styles here - focus ring is on Layer 1\n */\nexport const buttonVisualVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 relative cursor-pointer\",\n {\n variants: {\n variant: {\n default:\n \"bg-[var(--primary-action)] text-[var(--primary-action-foreground)] shadow-md hover:bg-[var(--primary-action-hover)] data-[pressed]:bg-[var(--primary-action)]/80\",\n destructive:\n \"bg-[var(--destructive-background)] text-[var(--destructive-foreground)] shadow-md hover:bg-[var(--destructive-background)]/90 data-[pressed]:bg-[var(--destructive-background)]/80\",\n outline:\n \"border border-[var(--input-border)] bg-[var(--page-background)] hover:bg-[var(--input-border)] data-[pressed]:bg-[var(--input-border)]\",\n secondary:\n \"bg-[var(--secondary)] text-[var(--secondary-foreground)] shadow-md hover:bg-[var(--secondary)]/80 data-[pressed]:bg-[var(--secondary)]/70\",\n ghost:\n \"hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)] data-[pressed]:bg-[var(--accent)]\",\n link: \"text-[var(--text-link)] underline-offset-4 hover:underline data-[pressed]:text-[var(--text-link-hover)]\",\n },\n fullWidth: {\n true: \"w-full\",\n false: \"\",\n },\n visualSize: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3 text-xs\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n dot: \"h-5 w-5 rounded-full p-0 min-h-0 min-w-0\",\n },\n paywall: {\n true: \"!bg-[var(--paywall)] !text-[var(--paywall-foreground)] !shadow-md hover:!bg-[var(--paywall)]/90 !cursor-not-allowed !border-transparent\",\n false: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n visualSize: \"default\",\n paywall: false,\n },\n }\n);\n\n/**\n * @deprecated Use buttonVisualVariants instead. This alias is kept for backward compatibility.\n */\nexport const buttonVariants = buttonVisualVariants;\n","/**\n * Global Interaction State Styles\n *\n * Consistent interaction patterns across all Themis components.\n * These styles ensure WCAG 2.2 AAA compliance and predictable UX.\n *\n * @see spec.md FR-010 (Visible focus ring for keyboard navigation)\n * @see spec.md FR-031 (Pressed state feedback)\n * @see spec.md FR-012 (High contrast mode support)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\n/**\n * Focus state styles (FR-010)\n * Visible focus ring for keyboard navigation - WCAG 2.2 Level AAA\n *\n * Components can override by extending these styles:\n * @example\n * cn(FOCUS_STYLES, \"ring-4\") // Increases ring width to 4px\n */\nexport const FOCUS_STYLES = \"data-[focus-visible]:ring-2 data-[focus-visible]:ring-[var(--themis-ring)] data-[focus-visible]:ring-offset-2\";\n\n/**\n * Pressed/Active state styles (FR-031)\n * Visual feedback for press interactions\n *\n * Components can override the scale amount:\n * @example\n * cn(PRESSED_STYLES_BASE, \"data-[pressed]:scale-[0.95]\") // More pronounced scale\n */\nexport const PRESSED_STYLES = \"data-[pressed]:scale-[0.97]\";\n\n/**\n * Base pressed styles without scale (for components that need different feedback)\n */\nexport const PRESSED_STYLES_BASE = \"data-[pressed]:transition-transform data-[pressed]:duration-100\";\n\n/**\n * Hover state styles\n * Elevation change on hover for better affordance\n *\n * Components can override shadow depth:\n * @example\n * cn(HOVER_STYLES_BASE, \"data-[hovered]:shadow-lg\") // Larger shadow\n */\nexport const HOVER_STYLES = \"data-[hovered]:shadow-md\";\n\n/**\n * Base hover styles without shadow (for components that use different hover effects)\n */\nexport const HOVER_STYLES_BASE = \"data-[hovered]:transition-shadow data-[hovered]:duration-200\";\n\n/**\n * High contrast mode focus (FR-012)\n * Enhanced outlines for users requiring high contrast\n *\n * Uses 'hc:' prefix for prefers-contrast: more media query\n */\nexport const HIGH_CONTRAST_FOCUS = \"hc:data-[focus-visible]:outline hc:data-[focus-visible]:outline-4 hc:data-[focus-visible]:outline-offset-2 hc:data-[focus-visible]:outline-foreground\";\n\n/**\n * High contrast mode hover (FR-012)\n * Enhanced outlines for hover in high contrast mode\n */\nexport const HIGH_CONTRAST_HOVER = \"hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground\";\n\n/**\n * High contrast mode pressed state\n * Enhanced outlines for pressed state in high contrast mode\n */\nexport const HIGH_CONTRAST_PRESSED = \"hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground\";\n\n/**\n * Combined high contrast styles\n * Use this for components that need all high contrast interaction states\n */\nexport const HIGH_CONTRAST_INTERACTIONS = `${HIGH_CONTRAST_FOCUS} ${HIGH_CONTRAST_HOVER} ${HIGH_CONTRAST_PRESSED}`;\n\n/**\n * Disabled state styles\n * Consistent disabled appearance across all components\n */\nexport const DISABLED_STYLES = \"disabled:pointer-events-none disabled:opacity-50\";\n\n/**\n * Default interaction bundle\n * Most common combination for interactive components\n *\n * Includes: focus ring, pressed scale, hover shadow, high contrast enhancements\n *\n * @example\n * <button className={cn(DEFAULT_INTERACTIONS, \"bg-primary\")}>Click</button>\n */\nexport const DEFAULT_INTERACTIONS = `${FOCUS_STYLES} ${PRESSED_STYLES} ${HOVER_STYLES} ${HIGH_CONTRAST_FOCUS} ${HIGH_CONTRAST_HOVER} ${HIGH_CONTRAST_PRESSED}`;\n\n/**\n * Subtle interaction bundle\n * For components that need less pronounced feedback\n *\n * Includes: focus ring and high contrast, but no hover shadow or pressed scale\n */\nexport const SUBTLE_INTERACTIONS = `${FOCUS_STYLES} ${HIGH_CONTRAST_FOCUS}`;\n\n/**\n * Non-interactive element styles\n * For elements that should indicate they are not interactive\n */\nexport const NON_INTERACTIVE = \"cursor-default select-none\";\n","\"use client\";\n\nimport { createContext, useContext } from 'react';\nimport type {\n ButtonGroupContextValue,\n ButtonGroupItemContextValue,\n} from './ButtonGroup.types';\n\n/**\n * ButtonGroup Context System (Two-Level)\n *\n * Provides a two-level context pattern for ButtonGroup:\n *\n * 1. ButtonGroupContext (group-level):\n * - Provides: orientation, variant, size, isDisabled\n * - Consumed by: Button (for prop inheritance), Separator (for orientation)\n *\n * 2. ButtonGroupItemContext (item-level):\n * - Provides: position ('first' | 'middle' | 'last' | 'only')\n * - Consumed by: Button (for border-radius styling)\n *\n * Both contexts return null when not in a provider, allowing Button\n * to work standalone without any group context.\n *\n * @see plan.md for architecture details\n * @see ButtonGroup.tsx for Provider implementation\n */\n\n// =============================================================================\n// Group-Level Context\n// =============================================================================\n\n/**\n * Context for group-level props (orientation, variant, size, isDisabled)\n * Default value is null to indicate \"not in a group\"\n */\nconst ButtonGroupContext = createContext<ButtonGroupContextValue | null>(null);\n\nButtonGroupContext.displayName = 'ButtonGroupContext';\n\n/**\n * Hook to access group-level context\n * @returns ButtonGroupContextValue if inside a ButtonGroup, null otherwise\n */\nexport function useButtonGroupContext(): ButtonGroupContextValue | null {\n return useContext(ButtonGroupContext);\n}\n\n// =============================================================================\n// Item-Level Context\n// =============================================================================\n\n/**\n * Context for per-button position information\n * Default value is null to indicate \"not wrapped with position context\"\n */\nconst ButtonGroupItemContext =\n createContext<ButtonGroupItemContextValue | null>(null);\n\nButtonGroupItemContext.displayName = 'ButtonGroupItemContext';\n\n/**\n * Hook to access item-level context (position)\n * @returns ButtonGroupItemContextValue if wrapped with position context, null otherwise\n */\nexport function useButtonGroupItemContext(): ButtonGroupItemContextValue | null {\n return useContext(ButtonGroupItemContext);\n}\n\n// =============================================================================\n// Exports\n// =============================================================================\n\nexport { ButtonGroupContext, ButtonGroupItemContext };\n","import { cva } from 'class-variance-authority';\n\n/**\n * ButtonGroup CVA Variants\n *\n * Defines Class Variance Authority (CVA) variants for:\n * - ButtonGroup container (orientation-based layout)\n * - ButtonGroupItem (position-based border-radius)\n * - ButtonGroupSeparator (orientation-based styling)\n *\n * @see plan.md Phase 1: Design & Contracts - CVA Variants\n * @see constitution.md Principle V (Component Quality Standards)\n */\n\n// =============================================================================\n// Container Variants\n// =============================================================================\n\n/**\n * ButtonGroup container variants\n * Controls the layout direction based on orientation\n * Uses gap-0 to ensure buttons are connected (share borders)\n */\nexport const buttonGroupVariants = cva('inline-flex items-center gap-0', {\n variants: {\n orientation: {\n horizontal: 'flex-row',\n vertical: 'flex-col w-full',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n\n// =============================================================================\n// Item Position Variants\n// =============================================================================\n\n/**\n * ButtonGroupItem position variants\n * Applied to Button's visual layer (Layer 2) for position-aware border-radius\n *\n * Compound variants handle both orientation and position combinations:\n * - Horizontal: left/right borders and radii\n * - Vertical: top/bottom borders and radii\n */\nexport const buttonGroupItemVariants = cva('', {\n variants: {\n orientation: {\n // min-w-[44px] ensures visual layer fills touch target width (for icon buttons)\n horizontal: 'min-w-[44px]',\n // flex (overrides inline-flex) + min-h-[44px] makes visual layer fill touch target,\n // eliminating gaps between stacked buttons in vertical orientation\n vertical: 'flex min-h-[44px]',\n },\n position: {\n first: '',\n middle: '',\n last: '',\n only: '', // Single button - no modifications needed\n },\n },\n compoundVariants: [\n // ==========================================================================\n // Horizontal Orientation\n // ==========================================================================\n {\n orientation: 'horizontal',\n position: 'first',\n className: 'rounded-r-none border-r-0',\n },\n {\n orientation: 'horizontal',\n position: 'middle',\n className: 'rounded-none border-r-0',\n },\n {\n orientation: 'horizontal',\n position: 'last',\n className: 'rounded-l-none',\n },\n // ==========================================================================\n // Vertical Orientation\n // Note: w-full is handled by Button's effectiveFullWidth for both layers\n // ==========================================================================\n {\n orientation: 'vertical',\n position: 'first',\n className: 'rounded-b-none border-b-0',\n },\n {\n orientation: 'vertical',\n position: 'middle',\n className: 'rounded-none border-b-0',\n },\n {\n orientation: 'vertical',\n position: 'last',\n className: 'rounded-t-none',\n },\n ],\n defaultVariants: {\n orientation: 'horizontal',\n position: 'only',\n },\n});\n\n// =============================================================================\n// Separator Variants\n// =============================================================================\n\n/**\n * ButtonGroupSeparator variants\n * Orientation-aware visual divider between button groups\n */\nexport const buttonGroupSeparatorVariants = cva('bg-[var(--border)]', {\n variants: {\n orientation: {\n horizontal: 'w-px h-6 mx-1',\n vertical: 'h-px w-full my-1',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n","\"use client\";\n\n/**\n * Button Component - 3-Layer Architecture\n * Accessible button with React Aria primitives and CVA styling\n *\n * Architecture:\n * - Layer 1: Touch Target (44x44px WCAG AAA compliant, transparent)\n * - Layer 2: Visual Button (configurable size, colors, borders)\n * - Layer 3: Content & Effects (text, icons, ripple, loading spinner)\n *\n * @see 3layer-plan.md for architecture details\n * @see spec.md FR-029 to FR-037 (Button Component Requirements)\n * @see spec.md FR-009 (WCAG 2.2 AAA - 7:1 contrast ratio)\n * @see spec.md FR-014 (44x44px minimum touch targets)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport { forwardRef, memo, useId } from 'react';\nimport {\n Button as AriaButton,\n type ButtonProps as AriaButtonProps,\n} from 'react-aria-components';\nimport { Loader2, Zap } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type { ButtonProps } from './Button.types';\nimport { buttonOuterVariants, buttonVisualVariants, buttonVariants } from './Button.styles';\nimport { PRESSED_STYLES, HOVER_STYLES, HIGH_CONTRAST_HOVER, HIGH_CONTRAST_PRESSED } from '../../styles/interaction-states';\nimport {\n useButtonGroupContext,\n useButtonGroupItemContext,\n} from '../ButtonGroup/ButtonGroupContext';\nimport { buttonGroupItemVariants } from '../ButtonGroup/ButtonGroup.variants';\n\n/**\n * Button Component - 3-Layer Architecture\n * Fully accessible button with React Aria and themed styling\n *\n * Layer 1: Touch Target (AriaButton) - 44x44px WCAG AAA compliant\n * Layer 2: Visual Button (span) - configurable appearance\n * Layer 3: Content (children) - text, icons, effects\n */\nconst Button = memo(forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n buttonVisualClassName,\n variant,\n size,\n visualSize,\n fullWidth,\n loading = false,\n loadingText = \"Loading...\",\n shortcut,\n children,\n isDisabled,\n paywall = false,\n paywallRedirect,\n paywallDescription,\n onPress,\n ...props\n },\n ref\n ) => {\n const paywallDescriptionId = useId();\n\n // ==========================================================================\n // ButtonGroup Context Integration\n // ==========================================================================\n\n // Consume group-level context (variant, size, isDisabled, orientation)\n const groupContext = useButtonGroupContext();\n\n // Consume item-level context (position for border-radius styling)\n const itemContext = useButtonGroupItemContext();\n\n // Merge context values with props (props take precedence)\n const effectiveVariant = variant ?? groupContext?.variant ?? 'default';\n const effectiveSize = size ?? groupContext?.size;\n const effectiveIsDisabled = isDisabled ?? groupContext?.isDisabled ?? false;\n\n // In vertical groups, buttons should be full width automatically\n const isInVerticalGroup = groupContext?.orientation === 'vertical';\n const effectiveFullWidth = fullWidth || isInVerticalGroup;\n\n // Position styling for ButtonGroup (only applied when in a group)\n const positionClassName = itemContext\n ? buttonGroupItemVariants({\n orientation: groupContext?.orientation ?? 'horizontal',\n position: itemContext.position,\n })\n : '';\n\n // Default visualSize to size for backward compatibility\n const effectiveVisualSize = visualSize ?? effectiveSize ?? 'default';\n\n // AAA Accessibility: Warn in dev/test if icon/dot variant lacks accessible name\n if (process.env.NODE_ENV !== 'production') {\n if (\n (effectiveVisualSize === 'dot' || effectiveVisualSize === 'icon') &&\n !props['aria-label'] &&\n !children\n ) {\n console.warn(\n '[Button] visualSize=\"dot\" or \"icon\" requires aria-label when no visible text is provided (WCAG 1.1.1)'\n );\n }\n }\n\n /**\n * Handle button press - intercepts action when paywalled\n * If paywalled with redirect URL, opens in new tab\n * Otherwise, calls the normal onPress handler\n */\n const handlePress = (e: Parameters<NonNullable<AriaButtonProps['onPress']>>[0]): void => {\n if (paywall) {\n if (paywallRedirect) {\n window.open(paywallRedirect, '_blank', 'noopener,noreferrer');\n }\n // Don't call onPress when paywalled\n return;\n }\n onPress?.(e);\n };\n\n // Only set isDisabled when we have a reason to disable\n // Otherwise, let slot system control disabled state (e.g., in NumberField)\n const computedIsDisabled = effectiveIsDisabled || loading || undefined;\n\n return (\n <AriaButton\n ref={ref}\n isDisabled={computedIsDisabled}\n aria-disabled={paywall ? true : undefined}\n aria-describedby={paywall ? paywallDescriptionId : undefined}\n onPress={handlePress}\n className={cn(buttonOuterVariants({ fullWidth: effectiveFullWidth, inVerticalGroup: isInVerticalGroup }), className)}\n {...props}\n >\n {(renderProps) => (\n /* Layer 2: Visual Button */\n <span\n className={cn(\n buttonVisualVariants({\n variant: effectiveVariant,\n visualSize: effectiveVisualSize,\n paywall,\n fullWidth: effectiveFullWidth,\n }),\n // Position styling from ButtonGroup context (border-radius adjustments)\n positionClassName,\n buttonVisualClassName,\n // Layer 2 interaction styles (no focus - focus ring is on Layer 1)\n PRESSED_STYLES,\n HOVER_STYLES,\n HIGH_CONTRAST_HOVER,\n HIGH_CONTRAST_PRESSED\n )}\n data-pressed={renderProps.isPressed || undefined}\n >\n {/* Layer 3: Content & Effects */}\n\n {/* FR-033: Loading spinner with screen reader announcement */}\n {/* Uses motion-safe: for WCAG 2.3.3 AAA (Animation from Interactions) */}\n {loading && (\n <>\n <Loader2 className=\"motion-safe:animate-spin\" aria-hidden=\"true\" />\n <span className=\"sr-only\" aria-live=\"polite\">\n {loadingText}\n </span>\n </>\n )}\n\n {/* Hide children during loading */}\n {!loading && children}\n\n {/* Paywall: Lightning bolt icon */}\n {paywall && (\n <Zap\n data-testid=\"zap-icon\"\n aria-hidden=\"true\"\n className=\"ml-1\"\n />\n )}\n\n {/* Paywall: Screen reader description */}\n {paywall && (\n <span id={paywallDescriptionId} className=\"sr-only\">\n Premium feature: {paywallDescription || \"Upgrade required to access this feature\"}\n </span>\n )}\n\n {/* FR-034: Keyboard shortcut display on focus */}\n {renderProps.isFocusVisible && shortcut && (\n <kbd className=\"ml-auto hidden text-xs opacity-60 lg:inline\">\n {shortcut}\n </kbd>\n )}\n\n {/* Touch/press ripple effect - FR-031: Pressed state feedback */}\n {/* Uses motion-safe: for WCAG 2.3.3 AAA (Animation from Interactions) */}\n {renderProps.isPressed && (\n <span\n className=\"absolute inset-0 rounded-[inherit] bg-current opacity-10 motion-safe:animate-in motion-safe:zoom-in-95\"\n aria-hidden=\"true\"\n />\n )}\n </span>\n )}\n </AriaButton>\n );\n }\n));\n\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants, buttonOuterVariants, buttonVisualVariants };\nexport type { ButtonProps } from './Button.types';\n","/**\n * NumberField Component Types\n *\n * Zod schemas and TypeScript types for the NumberField component.\n * CVA variants are in a separate file (NumberField.variants.ts) to separate\n * styling concerns from type definitions.\n *\n * Note: Zod schemas are used for contract tests and developer guardrails,\n * not runtime validation. This follows the established Themis pattern.\n *\n * @see {@link ../../docs/prd/numberfield-prd.md} for full requirements\n */\n\nimport { z } from 'zod';\nimport type {\n NumberFieldProps as AriaNumberFieldProps,\n ValidationResult,\n} from 'react-aria-components';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default maximum value (UINT32_MAX) to prevent overflow/Infinity.\n */\nexport const DEFAULT_MAX_VALUE = 4294967295;\n\n/**\n * Default minimum value for non-negative numbers.\n */\nexport const DEFAULT_MIN_VALUE = 0;\n\n/**\n * Minimum value when allowNegative is enabled (INT32_MIN + 1).\n */\nexport const NEGATIVE_MIN_VALUE = -2147483647;\n\n// ============================================================================\n// Size Variant Type\n// ============================================================================\n\n/**\n * Size variants for NumberField component.\n * - 'sm': Compact size (36px height) - touch targets via padding\n * - 'default': Standard size (40px height) - AAA compliant\n * - 'lg': Large size (48px height) - AAA compliant\n */\nexport type NumberFieldSize = 'sm' | 'default' | 'lg';\n\n// ============================================================================\n// Stepper Layout Type\n// ============================================================================\n\n/**\n * Layout options for stepper buttons.\n * - 'sides': Buttons on left (-) and right (+) of input (default)\n * - 'stacked': Buttons stacked vertically on right side\n * - 'hidden': No stepper buttons (keyboard/typing only)\n */\nexport type StepperLayout = 'sides' | 'stacked' | 'hidden';\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/**\n * Zod schema for NumberField props validation.\n * Used for contract tests and developer guardrails, not runtime validation.\n */\nexport const NumberFieldPropsSchema = z.object({\n // Value props\n /** Current value (controlled mode) */\n value: z.number().nullable().optional(),\n /** Default value (uncontrolled mode) */\n defaultValue: z.number().optional(),\n\n // Constraint props\n /** Minimum allowed value (default: 0) */\n minValue: z.number().optional(),\n /** Maximum allowed value (default: 4294967295 / UINT32_MAX) */\n maxValue: z.number().optional(),\n /** Allow negative numbers (sets minValue to -2147483647 if not explicitly set) */\n allowNegative: z.boolean().optional(),\n /** Step increment for stepper buttons and arrow keys (default: 1) */\n step: z.number().positive().optional(),\n\n // Formatting props\n /** Intl.NumberFormat options for locale-aware formatting */\n formatOptions: z.custom<Intl.NumberFormatOptions>().optional(),\n\n // State props\n /** Whether the field is disabled */\n isDisabled: z.boolean().optional(),\n /** Whether the field is read-only */\n isReadOnly: z.boolean().optional(),\n /** Whether the field is required */\n isRequired: z.boolean().optional(),\n /** Whether the field is in an invalid state */\n isInvalid: z.boolean().optional(),\n /** Whether scroll wheel adjustment is disabled */\n isWheelDisabled: z.boolean().optional(),\n\n // Validation props\n /** Custom validation function that returns an error message or null */\n validate: z.function().optional(),\n /** Validation behavior: 'native' for HTML5 validation, 'aria' for ARIA-only */\n validationBehavior: z.enum(['native', 'aria']).default('native'),\n\n // Display props\n /** Field label (required for accessibility) */\n label: z.string(),\n /** Description text below the field */\n description: z.string().optional(),\n /** Error message string or render function */\n errorMessage: z.union([z.string(), z.function()]).optional(),\n\n // Stepper props\n /** Layout for stepper buttons */\n stepperLayout: z.enum(['sides', 'stacked', 'hidden']).default('sides'),\n /** Custom aria-label for increment button */\n incrementAriaLabel: z.string().optional(),\n /** Custom aria-label for decrement button */\n decrementAriaLabel: z.string().optional(),\n\n // Form props\n /** Name attribute for form submission */\n name: z.string().optional(),\n\n // Variant props\n /** Size variant */\n size: z.enum(['sm', 'default', 'lg']).default('default'),\n\n // Event props\n /** Called when the numeric value changes */\n onChange: z.function().optional(),\n /** Called when the field gains focus */\n onFocus: z.function().optional(),\n /** Called when the field loses focus */\n onBlur: z.function().optional(),\n /** Called when focus state changes */\n onFocusChange: z.function().optional(),\n\n // Standard props\n /** Additional CSS classes */\n className: z.string().optional(),\n /** Whether to auto-focus on mount */\n autoFocus: z.boolean().optional(),\n});\n\n// ============================================================================\n// TypeScript Types\n// ============================================================================\n\n/**\n * Custom props added to NumberField (not from React Aria).\n */\nexport interface ThemisNumberFieldCustomProps {\n /** Size variant: 'sm', 'default', or 'lg' */\n size?: NumberFieldSize;\n /** Field label (required for accessibility) */\n label: string;\n /** Description text below the field */\n description?: string;\n /** Error message when field is invalid */\n errorMessage?: string | ((validation: ValidationResult) => string);\n /** Layout for stepper buttons */\n stepperLayout?: StepperLayout;\n /** Custom aria-label for increment button */\n incrementAriaLabel?: string;\n /** Custom aria-label for decrement button */\n decrementAriaLabel?: string;\n /** Allow negative numbers (sets minValue to -2147483647 if not explicitly set) */\n allowNegative?: boolean;\n}\n\n/**\n * Props for the NumberField component.\n * Combines React Aria's NumberFieldProps with Themis-specific props.\n */\nexport type NumberFieldProps = Omit<AriaNumberFieldProps, 'children'> &\n ThemisNumberFieldCustomProps;\n","/**\n * NumberField Component CVA Variants\n *\n * Class Variance Authority (CVA) variant definitions for the NumberField component.\n * Separated from types to maintain clean separation of concerns.\n *\n * Styling uses semantic CSS tokens that map to ThemeProvider variables:\n * - --background: Input background color\n * - --foreground: Text color\n * - --input: Input border color (default state)\n * - --ring: Focus ring color\n * - --accent: Stepper button hover background\n * - --accent-foreground: Stepper button hover text\n * - --destructive: Error state border and text\n * - --muted-foreground: Placeholder/disabled text\n *\n * @see {@link ../../docs/prd/numberfield-prd.md} for full requirements\n */\n\nimport { cva, type VariantProps } from 'class-variance-authority';\n\n// ============================================================================\n// Container Variants\n// ============================================================================\n\n/**\n * Variants for the NumberField container (Group element).\n * Contains the input and stepper buttons.\n *\n * Size notes:\n * - sm (36px): Compact, touch targets achieved via padding\n * - default (40px): Standard size, AAA compliant touch targets\n * - lg (48px): Large size, enhanced touch targets\n */\nexport const numberFieldVariants = cva(\n [\n // Base styles\n 'inline-flex items-center rounded-md border',\n 'bg-[var(--content-background)] text-[var(--content-foreground)]',\n 'transition-colors duration-200',\n // Focus within\n 'focus-within:ring-2 focus-within:ring-[var(--ring)] focus-within:ring-offset-2',\n // Disabled\n 'data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50',\n ],\n {\n variants: {\n size: {\n sm: 'h-9 text-sm',\n default: 'h-10 text-base',\n lg: 'h-12 text-lg',\n },\n isInvalid: {\n true: 'border-[var(--destructive)] focus-within:ring-[var(--destructive)]',\n false: 'border-[var(--input)] hover:border-[var(--input)]/80',\n },\n },\n defaultVariants: {\n size: 'default',\n isInvalid: false,\n },\n }\n);\n\n// ============================================================================\n// Input Variants\n// ============================================================================\n\n/**\n * Variants for the numeric input element.\n * Hides native spinners and centers text.\n */\nexport const numberFieldInputVariants = cva(\n [\n // Base styles\n 'flex-1 bg-transparent text-center tabular-nums',\n 'min-w-0', // Allow shrinking\n // Focus\n 'focus:outline-none',\n // Hide native spinners\n '[appearance:textfield]',\n '[&::-webkit-outer-spin-button]:appearance-none',\n '[&::-webkit-inner-spin-button]:appearance-none',\n ],\n {\n variants: {\n size: {\n sm: 'px-2 text-sm',\n default: 'px-3 text-base',\n lg: 'px-4 text-lg',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Stepper Button Variants\n// ============================================================================\n\n/**\n * Variants for the stepper buttons (increment/decrement).\n * Supports different positions for sides and stacked layouts.\n *\n * Touch target strategy:\n * - Visual button size varies with component size\n * - 44x44px minimum touch target achieved via padding/hit area\n */\nexport const numberFieldStepperVariants = cva(\n [\n // Base styles\n 'flex items-center justify-center',\n 'transition-colors duration-150',\n 'select-none',\n // Hover\n 'hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)]',\n // Focus\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)]',\n 'focus-visible:ring-inset',\n // Active (pressed)\n 'active:bg-[var(--accent)]/80',\n // Disabled\n 'disabled:pointer-events-none disabled:opacity-50',\n ],\n {\n variants: {\n size: {\n sm: 'min-w-8 min-h-8 text-sm',\n default: 'min-w-10 min-h-10 text-base',\n lg: 'min-w-12 min-h-12 text-lg',\n },\n position: {\n left: 'rounded-l-md border-r border-[var(--input)]',\n right: 'rounded-r-md border-l border-[var(--input)]',\n top: 'rounded-tr-md border-b border-l border-[var(--input)] h-1/2',\n bottom: 'rounded-br-md border-l border-[var(--input)] h-1/2',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Label Variants\n// ============================================================================\n\n/**\n * Variants for the NumberField label.\n */\nexport const numberFieldLabelVariants = cva(\n [\n 'block font-medium text-[var(--content-foreground)]',\n 'mb-1.5',\n // Required indicator\n 'data-[required]:after:content-[\"*\"] data-[required]:after:ml-0.5',\n 'data-[required]:after:text-[var(--destructive)]',\n ],\n {\n variants: {\n size: {\n sm: 'text-sm',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Description Variants\n// ============================================================================\n\n/**\n * Variants for the description text below the field.\n */\nexport const numberFieldDescriptionVariants = cva(\n [\n 'text-[var(--menu-muted)]',\n 'mt-1',\n ],\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Error Variants\n// ============================================================================\n\n/**\n * Variants for the error message display.\n */\nexport const numberFieldErrorVariants = cva(\n [\n 'flex items-center gap-1',\n 'text-[var(--destructive)]',\n 'mt-1',\n ],\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Variant Types (from CVA)\n// ============================================================================\n\n/**\n * Variant props for numberFieldVariants CVA function.\n */\nexport type NumberFieldVariantProps = VariantProps<typeof numberFieldVariants>;\n\n/**\n * Variant props for numberFieldInputVariants CVA function.\n */\nexport type NumberFieldInputVariantProps = VariantProps<typeof numberFieldInputVariants>;\n\n/**\n * Variant props for numberFieldStepperVariants CVA function.\n */\nexport type NumberFieldStepperVariantProps = VariantProps<typeof numberFieldStepperVariants>;\n","'use client';\n\n/**\n * NumberField Component\n *\n * A fully accessible numeric input component built on React Aria's NumberField primitive.\n * Provides keyboard-editable input with optional increment/decrement stepper buttons.\n *\n * Features:\n * - WCAG 2.2 AAA compliant (44x44px touch targets, 7:1 contrast)\n * - Spinbutton ARIA semantics\n * - Locale-aware number formatting via Intl.NumberFormat\n * - Configurable min/max/step constraints\n * - Optional stepper buttons (sides, stacked, or hidden layouts)\n * - Scroll wheel support\n * - Form integration with hidden input\n * - Full keyboard navigation (Arrow, Page Up/Down, Home/End)\n * - Screen reader accessible\n *\n * @see {@link ../../docs/prd/numberfield-prd.md} for full requirements\n */\n\nimport { forwardRef, type ReactElement } from 'react';\nimport {\n NumberField as AriaNumberField,\n Group as AriaGroup,\n Input as AriaInput,\n Label as AriaLabel,\n Text as AriaText,\n FieldError as AriaFieldError,\n} from 'react-aria-components';\nimport { Minus, Plus } from 'lucide-react';\nimport { Button } from '../Button';\nimport { cn } from '../../utils/cn';\nimport type { NumberFieldProps } from './NumberField.types';\nimport {\n DEFAULT_MAX_VALUE,\n DEFAULT_MIN_VALUE,\n NEGATIVE_MIN_VALUE,\n} from './NumberField.types';\nimport {\n numberFieldVariants,\n numberFieldInputVariants,\n numberFieldStepperVariants,\n numberFieldLabelVariants,\n numberFieldDescriptionVariants,\n numberFieldErrorVariants,\n} from './NumberField.variants';\n\n// =============================================================================\n// NumberField Component\n// =============================================================================\n\n/**\n * NumberField component for numeric input with optional stepper buttons.\n *\n * @example\n * ```tsx\n * import { NumberField } from '@tribepad/themis/elements/NumberField';\n *\n * // Basic usage\n * <NumberField label=\"Quantity\" />\n *\n * // With constraints\n * <NumberField\n * label=\"Quantity\"\n * minValue={1}\n * maxValue={100}\n * step={1}\n * defaultValue={5}\n * />\n *\n * // Currency formatting\n * <NumberField\n * label=\"Price\"\n * formatOptions={{ style: 'currency', currency: 'USD' }}\n * step={0.01}\n * defaultValue={9.99}\n * />\n *\n * // Allow negative numbers\n * <NumberField\n * label=\"Temperature\"\n * allowNegative\n * formatOptions={{ style: 'unit', unit: 'celsius' }}\n * />\n *\n * // Hidden steppers\n * <NumberField\n * label=\"Account Number\"\n * stepperLayout=\"hidden\"\n * />\n * ```\n */\nexport const NumberField = forwardRef<HTMLDivElement, NumberFieldProps>(\n (\n {\n // Display props\n label,\n description,\n errorMessage,\n // Variant props\n size = 'default',\n stepperLayout = 'sides',\n // Custom props\n allowNegative = false,\n incrementAriaLabel,\n decrementAriaLabel,\n // Constraint props (apply defaults)\n minValue,\n maxValue,\n // Standard props\n className,\n isInvalid,\n isRequired,\n isDisabled,\n isReadOnly,\n // All other props go to AriaNumberField\n ...props\n },\n ref\n ): ReactElement => {\n // Calculate effective min/max values\n const effectiveMinValue =\n minValue ?? (allowNegative ? NEGATIVE_MIN_VALUE : DEFAULT_MIN_VALUE);\n const effectiveMaxValue = maxValue ?? DEFAULT_MAX_VALUE;\n\n // Determine if steppers should be shown\n const showSteppers = stepperLayout !== 'hidden' && !isReadOnly;\n const isStackedLayout = stepperLayout === 'stacked';\n\n return (\n <AriaNumberField\n ref={ref}\n className={cn('group flex flex-col', className)}\n minValue={effectiveMinValue}\n maxValue={effectiveMaxValue}\n isInvalid={isInvalid}\n isRequired={isRequired}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n {...props}\n >\n {/* Label */}\n <AriaLabel\n className={cn(numberFieldLabelVariants({ size }))}\n data-required={isRequired || undefined}\n >\n {label}\n </AriaLabel>\n\n {/* Input Group */}\n <AriaGroup\n className={cn(\n numberFieldVariants({\n size,\n isInvalid: isInvalid ?? false,\n }),\n isStackedLayout && 'pr-0'\n )}\n >\n {/* Decrement Button (left side for sides layout) */}\n {showSteppers && !isStackedLayout && (\n <Button\n slot=\"decrement\"\n variant=\"ghost\"\n className=\"!min-h-0 !min-w-0\"\n buttonVisualClassName={cn(\n numberFieldStepperVariants({\n size,\n position: 'left',\n })\n )}\n aria-label={decrementAriaLabel ?? 'Decrease value'}\n >\n <Minus className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n )}\n\n {/* Input */}\n <AriaInput\n className={cn(numberFieldInputVariants({ size }))}\n />\n\n {/* Stacked Layout Buttons */}\n {showSteppers && isStackedLayout && (\n <div className=\"flex flex-col h-full\">\n <Button\n slot=\"increment\"\n variant=\"ghost\"\n className=\"!min-h-0 !min-w-0\"\n buttonVisualClassName={cn(\n numberFieldStepperVariants({\n size,\n position: 'top',\n })\n )}\n aria-label={incrementAriaLabel ?? 'Increase value'}\n >\n <Plus className=\"h-3 w-3\" aria-hidden=\"true\" />\n </Button>\n <Button\n slot=\"decrement\"\n variant=\"ghost\"\n className=\"!min-h-0 !min-w-0\"\n buttonVisualClassName={cn(\n numberFieldStepperVariants({\n size,\n position: 'bottom',\n })\n )}\n aria-label={decrementAriaLabel ?? 'Decrease value'}\n >\n <Minus className=\"h-3 w-3\" aria-hidden=\"true\" />\n </Button>\n </div>\n )}\n\n {/* Increment Button (right side for sides layout) */}\n {showSteppers && !isStackedLayout && (\n <Button\n slot=\"increment\"\n variant=\"ghost\"\n className=\"!min-h-0 !min-w-0\"\n buttonVisualClassName={cn(\n numberFieldStepperVariants({\n size,\n position: 'right',\n })\n )}\n aria-label={incrementAriaLabel ?? 'Increase value'}\n >\n <Plus className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n )}\n </AriaGroup>\n\n {/* Description */}\n {description && (\n <AriaText\n slot=\"description\"\n className={cn(numberFieldDescriptionVariants({ size }))}\n >\n {description}\n </AriaText>\n )}\n\n {/* Error Message */}\n <AriaFieldError className={cn(numberFieldErrorVariants({ size }))}>\n {errorMessage}\n </AriaFieldError>\n </AriaNumberField>\n );\n }\n);\n\nNumberField.displayName = 'NumberField';\n","'use client';\n\n/**\n * ResizablePopover Component\n *\n * Precision control popover for resizable panels.\n * Shows linked NumberFields and preset buttons for exact sizing.\n *\n * @see {@link ../../docs/prd/resizable-prd.md} for full requirements\n */\n\nimport {\n forwardRef,\n useState,\n useCallback,\n useEffect,\n useRef,\n type ReactElement,\n} from 'react';\nimport {\n DialogTrigger,\n Popover,\n Dialog,\n Button as AriaButton,\n} from 'react-aria-components';\nimport { X } from 'lucide-react';\nimport { cn } from '../../../utils/cn';\nimport type { ResizePreset, PanelInfo } from '../Resizable.types';\nimport { NumberField } from '../../NumberField/NumberField';\nimport { Button } from '../../Button/Button';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface ResizablePopoverProps {\n /** Whether popover is open */\n isOpen: boolean;\n /** Callback when open state changes */\n onOpenChange: (isOpen: boolean) => void;\n /** Group label for the title */\n groupLabel: string;\n /** Left/top panel info */\n leftPanel: PanelInfo;\n /** Right/bottom panel info */\n rightPanel: PanelInfo;\n /** Left/top panel size (percentage) */\n leftSize: number;\n /** Right/bottom panel size (percentage) */\n rightSize: number;\n /** Callback when sizes change */\n onSizesChange: (leftSize: number, rightSize: number) => void;\n /** Size presets */\n presets?: ResizePreset[];\n /** The trigger element (handle) */\n triggerRef: React.RefObject<HTMLDivElement | null>;\n /** Direction for positioning */\n direction: 'horizontal' | 'vertical';\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * ResizablePopover - Precision control for panel sizes.\n *\n * Features:\n * - Two linked NumberFields that sum to 100%\n * - Preset buttons for quick sizing\n * - Cancel reverts to original, Close keeps changes\n * - Live preview as values change\n */\nexport const ResizablePopover = forwardRef<HTMLDivElement, ResizablePopoverProps>(\n function ResizablePopover(\n {\n isOpen,\n onOpenChange,\n groupLabel,\n leftPanel,\n rightPanel,\n leftSize,\n rightSize,\n onSizesChange,\n presets,\n triggerRef,\n direction,\n },\n _ref\n ): ReactElement | null {\n // Store original sizes when popover opens (for cancel)\n const [originalSizes, setOriginalSizes] = useState({ left: leftSize, right: rightSize });\n\n // Capture original sizes only when popover transitions from closed to open\n const wasOpenRef = useRef(false);\n useEffect(() => {\n if (isOpen && !wasOpenRef.current) {\n setOriginalSizes({ left: leftSize, right: rightSize });\n }\n wasOpenRef.current = isOpen;\n }, [isOpen, leftSize, rightSize]);\n\n /**\n * Handle left panel size change.\n * Auto-adjusts right panel to sum to 100%.\n */\n const handleLeftChange = useCallback(\n (value: number | null) => {\n if (value === null) return;\n\n // Clamp to valid range\n const newLeft = Math.max(\n leftPanel.collapsible ? 0 : leftPanel.minSize,\n Math.min(leftPanel.maxSize, value)\n );\n\n // Calculate right size (remaining percentage)\n const newRight = 100 - newLeft;\n\n // Check right panel constraints\n const rightMin = rightPanel.collapsible ? 0 : rightPanel.minSize;\n const rightMax = rightPanel.maxSize;\n\n if (newRight < rightMin || newRight > rightMax) {\n // Can't make this change - right panel would be out of bounds\n return;\n }\n\n onSizesChange(newLeft, newRight);\n },\n [leftPanel, rightPanel, onSizesChange]\n );\n\n /**\n * Handle right panel size change.\n * Auto-adjusts left panel to sum to 100%.\n */\n const handleRightChange = useCallback(\n (value: number | null) => {\n if (value === null) return;\n\n // Clamp to valid range\n const newRight = Math.max(\n rightPanel.collapsible ? 0 : rightPanel.minSize,\n Math.min(rightPanel.maxSize, value)\n );\n\n // Calculate left size (remaining percentage)\n const newLeft = 100 - newRight;\n\n // Check left panel constraints\n const leftMin = leftPanel.collapsible ? 0 : leftPanel.minSize;\n const leftMax = leftPanel.maxSize;\n\n if (newLeft < leftMin || newLeft > leftMax) {\n // Can't make this change - left panel would be out of bounds\n return;\n }\n\n onSizesChange(newLeft, newRight);\n },\n [leftPanel, rightPanel, onSizesChange]\n );\n\n /**\n * Apply a preset.\n */\n const handlePreset = useCallback(\n (preset: ResizePreset) => {\n const leftSize = preset.sizes[0];\n const rightSize = preset.sizes[1];\n if (leftSize !== undefined && rightSize !== undefined) {\n onSizesChange(leftSize, rightSize);\n }\n },\n [onSizesChange]\n );\n\n /**\n * Handle cancel - revert to original sizes.\n */\n const handleCancel = useCallback(() => {\n onSizesChange(originalSizes.left, originalSizes.right);\n onOpenChange(false);\n }, [onSizesChange, onOpenChange, originalSizes]);\n\n /**\n * Handle close (X button or click outside) - keep changes.\n */\n const handleClose = useCallback(() => {\n onOpenChange(false);\n }, [onOpenChange]);\n\n if (!isOpen) return null;\n\n // Popover placement based on direction\n const placement = direction === 'horizontal' ? 'bottom' : 'right';\n\n return (\n <DialogTrigger isOpen={isOpen} onOpenChange={onOpenChange}>\n <AriaButton className=\"sr-only\">Open resize controls</AriaButton>\n <Popover\n triggerRef={triggerRef}\n placement={placement}\n offset={8}\n className={cn(\n 'w-72',\n 'rounded-lg border border-[var(--border)]',\n 'bg-[var(--popover)] text-[var(--popover-foreground)]',\n 'shadow-lg',\n 'outline-none',\n 'animate-in fade-in-0 zoom-in-95',\n 'data-[exiting]:animate-out data-[exiting]:fade-out-0 data-[exiting]:zoom-out-95'\n )}\n >\n <Dialog className=\"outline-none\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-[var(--border)] px-4 py-3\">\n <h3 className=\"text-sm font-medium\">Resize: {groupLabel}</h3>\n <AriaButton\n onPress={handleClose}\n className={cn(\n 'inline-flex items-center justify-center rounded-md',\n 'min-h-[44px] min-w-[44px]',\n 'text-[var(--menu-muted)]',\n 'hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)]',\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2'\n )}\n aria-label=\"Close\"\n >\n <X className=\"h-4 w-4\" />\n </AriaButton>\n </div>\n\n {/* Content */}\n <div className=\"space-y-4 px-4 py-4\">\n {/* Left/Top Panel NumberField */}\n <div>\n <NumberField\n label={`${leftPanel.name} (%)`}\n value={Math.round(leftSize)}\n onChange={handleLeftChange}\n minValue={leftPanel.collapsible ? 0 : leftPanel.minSize}\n maxValue={leftPanel.maxSize}\n step={1}\n stepperLayout=\"sides\"\n />\n </div>\n\n {/* Right/Bottom Panel NumberField */}\n <div>\n <NumberField\n label={`${rightPanel.name} (%)`}\n value={Math.round(rightSize)}\n onChange={handleRightChange}\n minValue={rightPanel.collapsible ? 0 : rightPanel.minSize}\n maxValue={rightPanel.maxSize}\n step={1}\n stepperLayout=\"sides\"\n />\n </div>\n\n {/* Presets */}\n {presets && presets.length > 0 && (\n <div className=\"border-t border-[var(--border)] pt-4\">\n <div className=\"mb-2 text-xs font-medium text-[var(--menu-muted)]\">\n Presets\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {presets.map((preset, index) => (\n <Button\n key={index}\n variant=\"outline\"\n size=\"sm\"\n onPress={() => handlePreset(preset)}\n >\n {preset.label}\n </Button>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"flex justify-end border-t border-[var(--border)] px-4 py-3\">\n <Button variant=\"ghost\" size=\"sm\" onPress={handleCancel}>\n Cancel\n </Button>\n </div>\n </Dialog>\n </Popover>\n </DialogTrigger>\n );\n }\n);\n\nResizablePopover.displayName = 'ResizablePopover';\n","'use client';\n\n/**\n * ResizableHandle Component\n *\n * Draggable handle between resizable panels.\n * Provides keyboard navigation, ARIA slider semantics, and precision popover.\n *\n * @see {@link ../../docs/prd/resizable-prd.md} for full requirements\n */\n\nimport {\n forwardRef,\n useRef,\n useEffect,\n useState,\n useCallback,\n type ReactElement,\n} from 'react';\nimport { GripVertical, GripHorizontal } from 'lucide-react';\nimport { cn } from '../../../utils/cn';\nimport type { ResizableHandleProps } from '../Resizable.types';\nimport {\n resizableHandleVariants,\n resizableGripVariants,\n DEFAULT_MIN_SIZE,\n DEFAULT_MAX_SIZE,\n} from '../Resizable.types';\nimport { useResizableContext } from '../hooks/useResizableContext';\nimport { useResizable } from '../hooks/useResizable';\nimport { ResizablePopover } from './ResizablePopover';\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * ResizableHandle - Draggable handle between panels.\n *\n * Must be used within a ResizablePanelGroup, between ResizablePanels.\n * Provides drag, keyboard, and popover controls for resizing.\n *\n * @example\n * ```tsx\n * <ResizableHandle\n * presets={[\n * { label: 'Equal', sizes: [50, 50] },\n * { label: 'Focus Left', sizes: [70, 30] },\n * ]}\n * />\n * ```\n */\nexport const ResizableHandle = forwardRef<HTMLDivElement, ResizableHandleProps>(\n function ResizableHandle(\n { withHandle = true, presets, disabled = false, className },\n ref\n ): ReactElement {\n const {\n direction,\n groupLabel,\n sizes,\n setSizes,\n panels,\n announce,\n containerRef,\n } = useResizableContext();\n\n // Track handle index based on DOM position\n const internalRef = useRef<HTMLDivElement>(null);\n const handleRef = (ref as React.RefObject<HTMLDivElement>) || internalRef;\n const [handleIndex, setHandleIndex] = useState(0);\n\n // Calculate handle index based on DOM position\n useEffect(() => {\n const handle = handleRef.current;\n const container = containerRef.current;\n if (!handle || !container) return;\n\n // Count handles before this one\n const handles = container.querySelectorAll('[role=\"slider\"]');\n let index = 0;\n handles.forEach((h, i) => {\n if (h === handle) {\n index = i;\n }\n });\n setHandleIndex(index);\n }, [containerRef, handleRef]);\n\n // Handle controls panels at handleIndex and handleIndex + 1\n const leftPanelIndex = handleIndex;\n const rightPanelIndex = handleIndex + 1;\n\n // Get adjacent panel info\n const leftPanel = panels[leftPanelIndex];\n const rightPanel = panels[rightPanelIndex];\n\n // Get current sizes for adjacent panels\n const leftSize = sizes[leftPanelIndex] ?? 50;\n const rightSize = sizes[rightPanelIndex] ?? 50;\n\n // Popover state\n const [isPopoverOpen, setIsPopoverOpen] = useState(false);\n\n // Handle size changes from popover\n const handlePopoverSizesChange = useCallback(\n (newLeftSize: number, newRightSize: number) => {\n const newSizes = [...sizes];\n newSizes[leftPanelIndex] = newLeftSize;\n newSizes[rightPanelIndex] = newRightSize;\n setSizes(newSizes);\n },\n [sizes, setSizes, leftPanelIndex, rightPanelIndex]\n );\n\n // Use resize hook for drag/keyboard handling\n const { isDragging, handlePointerDown, handleKeyDown } = useResizable({\n direction,\n sizes,\n setSizes,\n panels,\n containerRef,\n leftPanelIndex,\n rightPanelIndex,\n disabled,\n announce,\n groupLabel,\n onOpenPopover: () => setIsPopoverOpen(true),\n });\n\n // Build aria-label with panel names and group context\n const ariaLabel =\n leftPanel && rightPanel\n ? `Resize handle between ${leftPanel.name} and ${rightPanel.name} in ${groupLabel}`\n : `Resize handle in ${groupLabel}`;\n\n // Select grip icon based on direction\n const GripIcon = direction === 'horizontal' ? GripVertical : GripHorizontal;\n\n // Default panel info for popover when panels not registered yet\n const leftPanelInfo = leftPanel ?? {\n name: 'Panel 1',\n minSize: DEFAULT_MIN_SIZE,\n maxSize: DEFAULT_MAX_SIZE,\n collapsible: false,\n };\n const rightPanelInfo = rightPanel ?? {\n name: 'Panel 2',\n minSize: DEFAULT_MIN_SIZE,\n maxSize: DEFAULT_MAX_SIZE,\n collapsible: false,\n };\n\n return (\n <>\n <div\n ref={handleRef}\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-label={ariaLabel}\n aria-valuenow={Math.round(leftSize)}\n aria-valuemin={leftPanel?.collapsible ? 0 : (leftPanel?.minSize ?? 0)}\n aria-valuemax={leftPanel?.maxSize ?? 100}\n aria-orientation={direction}\n aria-disabled={disabled}\n data-direction={direction}\n data-dragging={isDragging}\n data-disabled={disabled}\n onPointerDown={handlePointerDown}\n onKeyDown={handleKeyDown}\n className={cn(\n resizableHandleVariants({\n direction,\n disabled,\n isDragging,\n }),\n className\n )}\n >\n {withHandle && (\n <div\n className={cn(resizableGripVariants({ direction }))}\n aria-hidden=\"true\"\n >\n <GripIcon className=\"h-4 w-4\" />\n </div>\n )}\n </div>\n\n {/* Precision Control Popover */}\n <ResizablePopover\n isOpen={isPopoverOpen}\n onOpenChange={setIsPopoverOpen}\n groupLabel={groupLabel}\n leftPanel={leftPanelInfo}\n rightPanel={rightPanelInfo}\n leftSize={leftSize}\n rightSize={rightSize}\n onSizesChange={handlePopoverSizesChange}\n presets={presets}\n triggerRef={handleRef}\n direction={direction}\n />\n </>\n );\n }\n);\n\nResizableHandle.displayName = 'ResizableHandle';\n\n// Re-export presets prop type for consumers\nexport type { ResizePreset } from '../Resizable.types';\n"]}