aural-ui 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +456 -0
  3. package/dist/components/aspect-ratio/AspectRatio.stories.tsx +1327 -0
  4. package/dist/components/aspect-ratio/index.tsx +10 -0
  5. package/dist/components/aspect-ratio/meta.ts +8 -0
  6. package/dist/components/avatar/Avatar.stories.tsx +645 -0
  7. package/dist/components/avatar/index.tsx +50 -0
  8. package/dist/components/avatar/meta.ts +8 -0
  9. package/dist/components/badge/Badge.stories.tsx +169 -0
  10. package/dist/components/badge/index.tsx +28 -0
  11. package/dist/components/badge/meta.ts +6 -0
  12. package/dist/components/banner/Banner.stories.tsx +475 -0
  13. package/dist/components/banner/index.tsx +256 -0
  14. package/dist/components/banner/meta.ts +36 -0
  15. package/dist/components/button/Button.stories.tsx +74 -0
  16. package/dist/components/button/index.tsx +158 -0
  17. package/dist/components/button/meta.ts +33 -0
  18. package/dist/components/card/Card.stories.tsx +377 -0
  19. package/dist/components/card/index.tsx +85 -0
  20. package/dist/components/card/meta.ts +14 -0
  21. package/dist/components/char-count/CharCount.stories.tsx +334 -0
  22. package/dist/components/char-count/index.tsx +51 -0
  23. package/dist/components/char-count/meta.ts +13 -0
  24. package/dist/components/checkbox/Checkbox.stories.tsx +209 -0
  25. package/dist/components/checkbox/index.tsx +34 -0
  26. package/dist/components/checkbox/meta.ts +19 -0
  27. package/dist/components/chip/Chip.stories.tsx +207 -0
  28. package/dist/components/chip/index.tsx +92 -0
  29. package/dist/components/chip/meta.ts +17 -0
  30. package/dist/components/circular-loader/CircularLoader.stories.tsx +741 -0
  31. package/dist/components/circular-loader/index.tsx +138 -0
  32. package/dist/components/circular-loader/meta.ts +11 -0
  33. package/dist/components/collapsible/Collapsible.stories.tsx +319 -0
  34. package/dist/components/collapsible/index.tsx +158 -0
  35. package/dist/components/collapsible/meta.ts +22 -0
  36. package/dist/components/command/Command.stories.tsx +996 -0
  37. package/dist/components/command/index.tsx +324 -0
  38. package/dist/components/command/meta.ts +18 -0
  39. package/dist/components/dialog/Dialog.stories.tsx +963 -0
  40. package/dist/components/dialog/index.tsx +250 -0
  41. package/dist/components/dialog/meta.ts +28 -0
  42. package/dist/components/divider/Divider.stories.tsx +633 -0
  43. package/dist/components/divider/index.tsx +181 -0
  44. package/dist/components/divider/meta.ts +12 -0
  45. package/dist/components/dot-loader/DotLoader.stories.tsx +352 -0
  46. package/dist/components/dot-loader/index.tsx +78 -0
  47. package/dist/components/dot-loader/meta.ts +14 -0
  48. package/dist/components/dropdown/Dropdown.stories.tsx +1210 -0
  49. package/dist/components/dropdown/index.tsx +479 -0
  50. package/dist/components/dropdown/meta.ts +21 -0
  51. package/dist/components/form/Form.stories.tsx +320 -0
  52. package/dist/components/form/index.tsx +183 -0
  53. package/dist/components/form/meta.ts +11 -0
  54. package/dist/components/helper-text/HelperText.stories.tsx +254 -0
  55. package/dist/components/helper-text/index.tsx +102 -0
  56. package/dist/components/helper-text/meta.ts +18 -0
  57. package/dist/components/hover-card/HoverCard.stories.tsx +1328 -0
  58. package/dist/components/hover-card/index.tsx +42 -0
  59. package/dist/components/hover-card/meta.ts +12 -0
  60. package/dist/components/icon-button/IconButton.stories.tsx +252 -0
  61. package/dist/components/icon-button/index.tsx +130 -0
  62. package/dist/components/icon-button/meta.ts +20 -0
  63. package/dist/components/if-else/if-else.stories.tsx +100 -0
  64. package/dist/components/if-else/index.tsx +56 -0
  65. package/dist/components/if-else/meta.ts +6 -0
  66. package/dist/components/index.ts +70 -0
  67. package/dist/components/input/Input.stories.tsx +431 -0
  68. package/dist/components/input/index.tsx +487 -0
  69. package/dist/components/input/meta.ts +28 -0
  70. package/dist/components/label/Label.stories.tsx +200 -0
  71. package/dist/components/label/index.tsx +43 -0
  72. package/dist/components/label/meta.ts +14 -0
  73. package/dist/components/list/List.stories.tsx +963 -0
  74. package/dist/components/list/index.tsx +567 -0
  75. package/dist/components/list/meta.ts +24 -0
  76. package/dist/components/marquee/Marquee.stories.tsx +819 -0
  77. package/dist/components/marquee/index.tsx +107 -0
  78. package/dist/components/marquee/meta.ts +6 -0
  79. package/dist/components/overlay/Overlay.stories.tsx +954 -0
  80. package/dist/components/overlay/index.tsx +58 -0
  81. package/dist/components/overlay/meta.ts +10 -0
  82. package/dist/components/pagination/Pagination.stories.tsx +354 -0
  83. package/dist/components/pagination/index.tsx +455 -0
  84. package/dist/components/pagination/meta.ts +29 -0
  85. package/dist/components/popover/Popover.stories.tsx +1037 -0
  86. package/dist/components/popover/index.tsx +67 -0
  87. package/dist/components/popover/meta.ts +12 -0
  88. package/dist/components/radio/Radio.stories.tsx +146 -0
  89. package/dist/components/radio/index.tsx +41 -0
  90. package/dist/components/radio/meta.ts +19 -0
  91. package/dist/components/resizable/Resizable.stories.tsx +866 -0
  92. package/dist/components/resizable/index.tsx +55 -0
  93. package/dist/components/resizable/meta.ts +12 -0
  94. package/dist/components/scroll-area/ScrollArea.stories.tsx +1104 -0
  95. package/dist/components/scroll-area/index.tsx +55 -0
  96. package/dist/components/scroll-area/meta.ts +8 -0
  97. package/dist/components/search/Search.stories.tsx +678 -0
  98. package/dist/components/search/index.tsx +141 -0
  99. package/dist/components/search/meta.ts +6 -0
  100. package/dist/components/select/Select.stories.tsx +962 -0
  101. package/dist/components/select/index.tsx +512 -0
  102. package/dist/components/select/meta.ts +40 -0
  103. package/dist/components/sheet/Sheet.stories.tsx +1060 -0
  104. package/dist/components/sheet/index.tsx +440 -0
  105. package/dist/components/sheet/meta.ts +38 -0
  106. package/dist/components/skelton/Skelton.stories.tsx +859 -0
  107. package/dist/components/skelton/index.tsx +17 -0
  108. package/dist/components/skelton/meta.ts +6 -0
  109. package/dist/components/slider/Slider.stories.tsx +876 -0
  110. package/dist/components/slider/index.tsx +156 -0
  111. package/dist/components/slider/meta.ts +29 -0
  112. package/dist/components/stepper/Stepper.stories.tsx +639 -0
  113. package/dist/components/stepper/index.tsx +650 -0
  114. package/dist/components/stepper/meta.ts +19 -0
  115. package/dist/components/switch/Switch.stories.tsx +85 -0
  116. package/dist/components/switch/index.tsx +37 -0
  117. package/dist/components/switch/meta.ts +24 -0
  118. package/dist/components/switch-case/SwitchCase.stories.tsx +209 -0
  119. package/dist/components/switch-case/index.tsx +89 -0
  120. package/dist/components/switch-case/meta.ts +6 -0
  121. package/dist/components/table/Table.stories.tsx +1095 -0
  122. package/dist/components/table/index.tsx +113 -0
  123. package/dist/components/table/meta.ts +20 -0
  124. package/dist/components/tabs/Tabs.stories.tsx +1379 -0
  125. package/dist/components/tabs/index.tsx +186 -0
  126. package/dist/components/tabs/meta.ts +25 -0
  127. package/dist/components/tag/Tag.stories.tsx +625 -0
  128. package/dist/components/tag/index.tsx +320 -0
  129. package/dist/components/tag/meta.ts +52 -0
  130. package/dist/components/textarea/TextArea.stories.tsx +723 -0
  131. package/dist/components/textarea/index.tsx +480 -0
  132. package/dist/components/textarea/meta.ts +23 -0
  133. package/dist/components/toast/Toast.stories.tsx +1427 -0
  134. package/dist/components/toast/index.tsx +26 -0
  135. package/dist/components/toast/meta.ts +19 -0
  136. package/dist/components/toggle/Toggle.stories.tsx +1093 -0
  137. package/dist/components/toggle/index.tsx +44 -0
  138. package/dist/components/toggle/meta.ts +19 -0
  139. package/dist/components/tooltip/Tooltip.stories.tsx +1548 -0
  140. package/dist/components/tooltip/index.tsx +304 -0
  141. package/dist/components/tooltip/meta.ts +21 -0
  142. package/dist/components/typography/Typography.stories.tsx +197 -0
  143. package/dist/components/typography/index.tsx +184 -0
  144. package/dist/components/typography/meta.ts +38 -0
  145. package/dist/fonts/LabGrotesque-Regular.ttf +0 -0
  146. package/dist/fonts/LabGrotesqueTRIAL-Bold.otf +0 -0
  147. package/dist/fonts/LabGrotesqueTRIAL-Light.otf +0 -0
  148. package/dist/fonts/LabGrotesqueTRIAL-Medium.otf +0 -0
  149. package/dist/fonts/LabGrotesqueTRIAL-Regular.otf +0 -0
  150. package/dist/fonts/PPSupplySans-Regular (1).otf +0 -0
  151. package/dist/fonts/PPSupplySans-Regular.otf +0 -0
  152. package/dist/fonts/PPSupplySans-Ultralight.otf +0 -0
  153. package/dist/hooks/index.ts +3 -0
  154. package/dist/hooks/use-previous/UsePrevious.stories.tsx +997 -0
  155. package/dist/hooks/use-previous/index.ts +15 -0
  156. package/dist/hooks/use-previous/meta.ts +6 -0
  157. package/dist/hooks/use-standalone-pagination/UseStandalonePagination.stories.tsx +983 -0
  158. package/dist/hooks/use-standalone-pagination/index.ts +146 -0
  159. package/dist/hooks/use-standalone-pagination/meta.ts +6 -0
  160. package/dist/icons/Icons.stories.tsx +29 -0
  161. package/dist/icons/alert-icon/AlertIcon.stories.tsx +991 -0
  162. package/dist/icons/alert-icon/index.tsx +48 -0
  163. package/dist/icons/alert-icon/meta.ts +8 -0
  164. package/dist/icons/all-icons.tsx +738 -0
  165. package/dist/icons/angle-down-icon/AngleDownIcon.stories.tsx +1031 -0
  166. package/dist/icons/angle-down-icon/index.tsx +25 -0
  167. package/dist/icons/angle-down-icon/meta.ts +8 -0
  168. package/dist/icons/arrow-box-left-icon/ArrowBoxLeftIcon.stories.tsx +1080 -0
  169. package/dist/icons/arrow-box-left-icon/index.tsx +24 -0
  170. package/dist/icons/arrow-box-left-icon/meta.ts +8 -0
  171. package/dist/icons/arrow-right-icon/ArrowRightIcon.stories.tsx +1151 -0
  172. package/dist/icons/arrow-right-icon/index.tsx +26 -0
  173. package/dist/icons/arrow-right-icon/meta.ts +8 -0
  174. package/dist/icons/arrow-right-up-icon/ArrowRightUpIcon.stories.tsx +1273 -0
  175. package/dist/icons/arrow-right-up-icon/index.tsx +24 -0
  176. package/dist/icons/arrow-right-up-icon/meta.ts +8 -0
  177. package/dist/icons/art-board-icon/ArtBoardIcon.stories.tsx +670 -0
  178. package/dist/icons/art-board-icon/index.tsx +24 -0
  179. package/dist/icons/art-board-icon/meta.ts +7 -0
  180. package/dist/icons/audio-bar-icon/AudioBarIcon.stories.tsx +1244 -0
  181. package/dist/icons/audio-bar-icon/index.tsx +19 -0
  182. package/dist/icons/audio-bar-icon/meta.ts +8 -0
  183. package/dist/icons/bubble-check-icon/BubbleCheckIcon.stories.tsx +1239 -0
  184. package/dist/icons/bubble-check-icon/index.tsx +24 -0
  185. package/dist/icons/bubble-check-icon/meta.ts +8 -0
  186. package/dist/icons/bubble-crossed-icon/BubbleCrossedIcon.stories.tsx +1228 -0
  187. package/dist/icons/bubble-crossed-icon/index.tsx +24 -0
  188. package/dist/icons/bubble-crossed-icon/meta.ts +8 -0
  189. package/dist/icons/bubble-sparkle-icon/BubbleSparkleIcon.stories.tsx +912 -0
  190. package/dist/icons/bubble-sparkle-icon/index.tsx +26 -0
  191. package/dist/icons/bubble-sparkle-icon/meta.ts +8 -0
  192. package/dist/icons/chevron-double-left-icon/ChevronDoubleLeftIcon.stories.tsx +1021 -0
  193. package/dist/icons/chevron-double-left-icon/index.tsx +34 -0
  194. package/dist/icons/chevron-double-left-icon/meta.ts +8 -0
  195. package/dist/icons/chevron-double-right-icon/ChevronDoubleRightIcon.stories.tsx +1021 -0
  196. package/dist/icons/chevron-double-right-icon/index.tsx +34 -0
  197. package/dist/icons/chevron-double-right-icon/meta.ts +8 -0
  198. package/dist/icons/chevron-down-icon/ChevronDownIcon.stories.tsx +1001 -0
  199. package/dist/icons/chevron-down-icon/index.tsx +27 -0
  200. package/dist/icons/chevron-down-icon/meta.ts +8 -0
  201. package/dist/icons/chevron-left-icon/ChevronLeftIcon.stories.tsx +1029 -0
  202. package/dist/icons/chevron-left-icon/index.tsx +27 -0
  203. package/dist/icons/chevron-left-icon/meta.ts +8 -0
  204. package/dist/icons/chevron-right-icon/ChevronRightIcon.stories.tsx +1021 -0
  205. package/dist/icons/chevron-right-icon/index.tsx +27 -0
  206. package/dist/icons/chevron-right-icon/meta.ts +8 -0
  207. package/dist/icons/chevron-up-icon/ChevronUpIcon.stories.tsx +1036 -0
  208. package/dist/icons/chevron-up-icon/index.tsx +27 -0
  209. package/dist/icons/chevron-up-icon/meta.ts +8 -0
  210. package/dist/icons/command-icon/CommandIcon.stories.tsx +1098 -0
  211. package/dist/icons/command-icon/index.tsx +24 -0
  212. package/dist/icons/command-icon/meta.ts +8 -0
  213. package/dist/icons/cross-circle-icon/CrossCircleIcon.stories.tsx +1061 -0
  214. package/dist/icons/cross-circle-icon/index.tsx +23 -0
  215. package/dist/icons/cross-circle-icon/meta.ts +8 -0
  216. package/dist/icons/cross-icon/CrossIcon.stories.tsx +1027 -0
  217. package/dist/icons/cross-icon/index.tsx +24 -0
  218. package/dist/icons/cross-icon/meta.ts +8 -0
  219. package/dist/icons/edit-big-icon/EditBigIcon.stories.tsx +1092 -0
  220. package/dist/icons/edit-big-icon/index.tsx +22 -0
  221. package/dist/icons/edit-big-icon/meta.ts +8 -0
  222. package/dist/icons/eye-close-icon/EyeCloseIcon.stories.tsx +1090 -0
  223. package/dist/icons/eye-close-icon/index.tsx +26 -0
  224. package/dist/icons/eye-close-icon/meta.ts +8 -0
  225. package/dist/icons/eye-open-icon/EyeOpenIcon.stories.tsx +1098 -0
  226. package/dist/icons/eye-open-icon/index.tsx +24 -0
  227. package/dist/icons/eye-open-icon/meta.ts +8 -0
  228. package/dist/icons/feature-shine-icon/FeatureShineIcon.stories.tsx +1071 -0
  229. package/dist/icons/feature-shine-icon/index.tsx +29 -0
  230. package/dist/icons/feature-shine-icon/meta.ts +8 -0
  231. package/dist/icons/file-chart-icon/FileChartIcon.stories.tsx +1115 -0
  232. package/dist/icons/file-chart-icon/index.tsx +24 -0
  233. package/dist/icons/file-chart-icon/meta.ts +8 -0
  234. package/dist/icons/file-text-icon/FileTextIcon.stories.tsx +668 -0
  235. package/dist/icons/file-text-icon/index.tsx +24 -0
  236. package/dist/icons/file-text-icon/meta.ts +8 -0
  237. package/dist/icons/grip-vertical-icon/GripVerticalIcon.stories.tsx +1239 -0
  238. package/dist/icons/grip-vertical-icon/index.tsx +28 -0
  239. package/dist/icons/grip-vertical-icon/meta.ts +8 -0
  240. package/dist/icons/image-icon/ImageIcon.stories.tsx +1181 -0
  241. package/dist/icons/image-icon/index.tsx +24 -0
  242. package/dist/icons/image-icon/meta.ts +8 -0
  243. package/dist/icons/import-folder-icon/ImportFolderIcon.stories.tsx +1248 -0
  244. package/dist/icons/import-folder-icon/index.tsx +22 -0
  245. package/dist/icons/import-folder-icon/meta.ts +8 -0
  246. package/dist/icons/index.ts +46 -0
  247. package/dist/icons/light-bulb-simple-icon/LightBulbSimpleIcon.stories.tsx +1272 -0
  248. package/dist/icons/light-bulb-simple-icon/index.tsx +24 -0
  249. package/dist/icons/light-bulb-simple-icon/meta.ts +8 -0
  250. package/dist/icons/magic-book-icon/MagicBookIcon.stories.tsx +1245 -0
  251. package/dist/icons/magic-book-icon/index.tsx +32 -0
  252. package/dist/icons/magic-book-icon/meta.ts +8 -0
  253. package/dist/icons/maintenance-icon/MaintenanceIcon.stories.tsx +1251 -0
  254. package/dist/icons/maintenance-icon/index.tsx +23 -0
  255. package/dist/icons/maintenance-icon/meta.ts +8 -0
  256. package/dist/icons/message-icon/MessageIcon.stories.tsx +595 -0
  257. package/dist/icons/message-icon/index.tsx +30 -0
  258. package/dist/icons/message-icon/meta.ts +8 -0
  259. package/dist/icons/move-horizontal-icon/MoveHorizontalIcon.stories.tsx +1245 -0
  260. package/dist/icons/move-horizontal-icon/index.tsx +23 -0
  261. package/dist/icons/move-horizontal-icon/meta.ts +8 -0
  262. package/dist/icons/move-vertical-icon/MoveVerticalIcon.stories.tsx +1196 -0
  263. package/dist/icons/move-vertical-icon/index.tsx +23 -0
  264. package/dist/icons/move-vertical-icon/meta.ts +8 -0
  265. package/dist/icons/page-search-icon/PageSearchIcon.stories.tsx +1167 -0
  266. package/dist/icons/page-search-icon/index.tsx +21 -0
  267. package/dist/icons/page-search-icon/meta.ts +8 -0
  268. package/dist/icons/pencil-icon/PencilIcon.stories.tsx +1131 -0
  269. package/dist/icons/pencil-icon/index.tsx +21 -0
  270. package/dist/icons/pencil-icon/meta.ts +8 -0
  271. package/dist/icons/plus-icon/PlusIcon.stories.tsx +1151 -0
  272. package/dist/icons/plus-icon/index.tsx +24 -0
  273. package/dist/icons/plus-icon/meta.ts +8 -0
  274. package/dist/icons/search-icon/SearchIcon.stories.tsx +1181 -0
  275. package/dist/icons/search-icon/index.tsx +24 -0
  276. package/dist/icons/search-icon/meta.ts +8 -0
  277. package/dist/icons/site-logo-icon/SiteLogoIcon.stories.tsx +1167 -0
  278. package/dist/icons/site-logo-icon/index.tsx +79 -0
  279. package/dist/icons/site-logo-icon/meta.ts +8 -0
  280. package/dist/icons/spinner-gradient-icon/SpinnerGradientIcon.stories.tsx +637 -0
  281. package/dist/icons/spinner-gradient-icon/index.tsx +53 -0
  282. package/dist/icons/spinner-gradient-icon/meta.ts +8 -0
  283. package/dist/icons/spinner-solid-icon/SpinnerSolidIcon.stories.tsx +644 -0
  284. package/dist/icons/spinner-solid-icon/index.tsx +59 -0
  285. package/dist/icons/spinner-solid-icon/meta.ts +8 -0
  286. package/dist/icons/spinner-solid-neutral-icon/SpinnerSolidINeutralcon.stories.tsx +736 -0
  287. package/dist/icons/spinner-solid-neutral-icon/index.tsx +53 -0
  288. package/dist/icons/spinner-solid-neutral-icon/meta.ts +8 -0
  289. package/dist/icons/tick-circle-icon/TickCircleIcon.stories.tsx +1204 -0
  290. package/dist/icons/tick-circle-icon/index.tsx +23 -0
  291. package/dist/icons/tick-circle-icon/meta.ts +8 -0
  292. package/dist/icons/tick-icon/TickIcon.stories.tsx +1340 -0
  293. package/dist/icons/tick-icon/index.tsx +24 -0
  294. package/dist/icons/tick-icon/meta.ts +8 -0
  295. package/dist/icons/trash-icon/TrashIcon.stories.tsx +996 -0
  296. package/dist/icons/trash-icon/index.tsx +24 -0
  297. package/dist/icons/trash-icon/meta.ts +8 -0
  298. package/dist/icons/upload-icon/UploadIcon.stories.tsx +947 -0
  299. package/dist/icons/upload-icon/index.tsx +24 -0
  300. package/dist/icons/upload-icon/meta.ts +8 -0
  301. package/dist/icons/vertical-menu-icon/VerticalMenuIcon.stories.tsx +1045 -0
  302. package/dist/icons/vertical-menu-icon/index.tsx +27 -0
  303. package/dist/icons/vertical-menu-icon/meta.ts +8 -0
  304. package/dist/index.d.ts +6 -0
  305. package/dist/index.js +206 -0
  306. package/dist/lib/utils.ts +6 -0
  307. package/dist/styles/aural-theme.css +1008 -0
  308. package/package.json +142 -0
@@ -0,0 +1,866 @@
1
+ import React from "react"
2
+ import type { Meta, StoryObj } from "@storybook/react"
3
+
4
+ import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from "."
5
+
6
+ const meta: Meta<typeof ResizablePanelGroup> = {
7
+ title: "Components/UI/Resizable",
8
+ component: ResizablePanelGroup,
9
+ parameters: {
10
+ layout: "fullscreen",
11
+ backgrounds: {
12
+ default: "dark",
13
+ values: [
14
+ { name: "dark", value: "#0a0a0a" },
15
+ { name: "light", value: "#ffffff" },
16
+ ],
17
+ },
18
+ docs: {
19
+ description: {
20
+ component: `
21
+ # Resizable Component
22
+
23
+ A flexible resizable panel system built on top of react-resizable-panels, providing smooth panel resizing with customizable handles and layouts.
24
+
25
+ ## Components
26
+
27
+ ### Core Components
28
+ - **ResizablePanelGroup**: Container that manages the resizable layout and direction
29
+ - **ResizablePanel**: Individual panel that can be resized
30
+ - **ResizableHandle**: The draggable handle between panels with optional visual indicator
31
+
32
+ ## Features
33
+
34
+ - **Bi-directional**: Supports both horizontal and vertical panel layouts
35
+ - **Smooth Resizing**: Fluid drag-to-resize interactions
36
+ - **Visual Handles**: Optional drag handles with move icons
37
+ - **Keyboard Accessible**: Full keyboard navigation support
38
+ - **Flexible Sizing**: Supports percentage-based and minimum size constraints
39
+ - **Auto-rotation**: Icons automatically rotate for vertical layouts
40
+ - **Design System**: Integrated with design tokens for consistent styling
41
+ - **Focus Management**: Proper focus indicators and keyboard navigation
42
+
43
+ ## Usage Examples
44
+
45
+ ### Basic Horizontal Layout
46
+ \`\`\`tsx
47
+ <ResizablePanelGroup direction="horizontal">
48
+ <ResizablePanel defaultSize={50}>
49
+ Left Panel Content
50
+ </ResizablePanel>
51
+ <ResizableHandle />
52
+ <ResizablePanel defaultSize={50}>
53
+ Right Panel Content
54
+ </ResizablePanel>
55
+ </ResizablePanelGroup>
56
+ \`\`\`
57
+
58
+ ### Vertical Layout with Handles
59
+ \`\`\`tsx
60
+ <ResizablePanelGroup direction="vertical" className="h-96">
61
+ <ResizablePanel defaultSize={30}>
62
+ Top Panel
63
+ </ResizablePanel>
64
+ <ResizableHandle withHandle />
65
+ <ResizablePanel defaultSize={70}>
66
+ Bottom Panel
67
+ </ResizablePanel>
68
+ </ResizablePanelGroup>
69
+ \`\`\`
70
+
71
+ ### Three Panel Layout
72
+ \`\`\`tsx
73
+ <ResizablePanelGroup direction="horizontal">
74
+ <ResizablePanel defaultSize={25} minSize={20}>
75
+ Sidebar
76
+ </ResizablePanel>
77
+ <ResizableHandle withHandle />
78
+ <ResizablePanel defaultSize={50}>
79
+ Main Content
80
+ </ResizablePanel>
81
+ <ResizableHandle withHandle />
82
+ <ResizablePanel defaultSize={25} minSize={15}>
83
+ Right Panel
84
+ </ResizablePanel>
85
+ </ResizablePanelGroup>
86
+ \`\`\`
87
+
88
+ ### Nested Resizable Layouts
89
+ \`\`\`tsx
90
+ <ResizablePanelGroup direction="horizontal">
91
+ <ResizablePanel defaultSize={30}>
92
+ Sidebar Content
93
+ </ResizablePanel>
94
+ <ResizableHandle withHandle />
95
+ <ResizablePanel defaultSize={70}>
96
+ <ResizablePanelGroup direction="vertical">
97
+ <ResizablePanel defaultSize={60}>
98
+ Main Content
99
+ </ResizablePanel>
100
+ <ResizableHandle withHandle />
101
+ <ResizablePanel defaultSize={40}>
102
+ Bottom Panel
103
+ </ResizablePanel>
104
+ </ResizablePanelGroup>
105
+ </ResizablePanel>
106
+ </ResizablePanelGroup>
107
+ \`\`\`
108
+
109
+ ## Accessibility
110
+
111
+ - **Keyboard Navigation**: Handles can be focused and adjusted with arrow keys
112
+ - **ARIA Support**: Proper ARIA roles and attributes for screen readers
113
+ - **Focus Indicators**: Clear focus rings following design system patterns
114
+ - **Semantic Structure**: Proper DOM structure for assistive technologies
115
+
116
+ ## Design Tokens
117
+
118
+ The component uses design system tokens:
119
+ - \`--color-fm-button-fill-secondary\`: Handle background color
120
+ - \`--color-fm-primary\`: Focus ring color
121
+ - \`--color-fm-contrast\`: Focus ring offset color
122
+ - \`--radius-fm-xs\`: Handle border radius
123
+ `,
124
+ },
125
+ },
126
+ },
127
+ tags: ["autodocs"],
128
+ argTypes: {
129
+ direction: {
130
+ control: "select",
131
+ options: ["horizontal", "vertical"],
132
+ description: "Direction of the panel group layout",
133
+ },
134
+ className: {
135
+ control: "text",
136
+ description: "Additional CSS classes",
137
+ },
138
+ },
139
+ }
140
+
141
+ export default meta
142
+ type Story = StoryObj<typeof ResizablePanelGroup>
143
+
144
+ // 1. Basic Horizontal Layout
145
+ export const BasicHorizontal: Story = {
146
+ args: {
147
+ direction: "horizontal",
148
+ },
149
+ render: (args) => (
150
+ <div className="h-96 w-full p-8">
151
+ <h3 className="mb-4 text-lg font-medium text-white">
152
+ Basic Horizontal Layout
153
+ </h3>
154
+ <ResizablePanelGroup
155
+ {...args}
156
+ className="overflow-hidden rounded-lg border border-white/10"
157
+ >
158
+ <ResizablePanel defaultSize={50}>
159
+ <div className="flex h-full items-center justify-center bg-blue-500/10 p-4">
160
+ <div className="text-center">
161
+ <h4 className="text-lg font-medium text-white">Left Panel</h4>
162
+ <p className="text-sm text-white/60">Resize me!</p>
163
+ </div>
164
+ </div>
165
+ </ResizablePanel>
166
+ <ResizableHandle />
167
+ <ResizablePanel defaultSize={50}>
168
+ <div className="flex h-full items-center justify-center bg-purple-500/10 p-4">
169
+ <div className="text-center">
170
+ <h4 className="text-lg font-medium text-white">Right Panel</h4>
171
+ <p className="text-sm text-white/60">I resize too!</p>
172
+ </div>
173
+ </div>
174
+ </ResizablePanel>
175
+ </ResizablePanelGroup>
176
+ </div>
177
+ ),
178
+ parameters: {
179
+ docs: {
180
+ description: {
181
+ story:
182
+ "Basic two-panel horizontal layout with a simple resize handle between panels.",
183
+ },
184
+ },
185
+ },
186
+ }
187
+
188
+ // 2. Vertical Layout with Handles
189
+ export const VerticalWithHandles: Story = {
190
+ render: () => (
191
+ <div className="h-96 w-full p-8">
192
+ <h3 className="mb-4 text-lg font-medium text-white">
193
+ Vertical Layout with Visual Handles
194
+ </h3>
195
+ <ResizablePanelGroup
196
+ direction="vertical"
197
+ className="overflow-hidden rounded-lg border border-white/10"
198
+ >
199
+ <ResizablePanel defaultSize={40}>
200
+ <div className="flex h-full items-center justify-center bg-green-500/10 p-4">
201
+ <div className="text-center">
202
+ <h4 className="text-lg font-medium text-white">Top Panel</h4>
203
+ <p className="text-sm text-white/60">40% default size</p>
204
+ </div>
205
+ </div>
206
+ </ResizablePanel>
207
+ <ResizableHandle withHandle />
208
+ <ResizablePanel defaultSize={60}>
209
+ <div className="flex h-full items-center justify-center bg-orange-500/10 p-4">
210
+ <div className="text-center">
211
+ <h4 className="text-lg font-medium text-white">Bottom Panel</h4>
212
+ <p className="text-sm text-white/60">60% default size</p>
213
+ <p className="mt-2 text-xs text-white/40">
214
+ Notice the rotated handle icon
215
+ </p>
216
+ </div>
217
+ </div>
218
+ </ResizablePanel>
219
+ </ResizablePanelGroup>
220
+ </div>
221
+ ),
222
+ parameters: {
223
+ docs: {
224
+ description: {
225
+ story:
226
+ "Vertical panel layout with visual drag handles. Notice how the move icon automatically rotates for vertical orientation.",
227
+ },
228
+ },
229
+ },
230
+ }
231
+
232
+ // 3. Three Panel Layout
233
+ export const ThreePanel: Story = {
234
+ render: () => (
235
+ <div className="h-96 w-full p-8">
236
+ <h3 className="mb-4 text-lg font-medium text-white">
237
+ Three Panel Layout
238
+ </h3>
239
+ <ResizablePanelGroup
240
+ direction="horizontal"
241
+ className="overflow-hidden rounded-lg border border-white/10"
242
+ >
243
+ <ResizablePanel defaultSize={25} minSize={15}>
244
+ <div className="flex h-full flex-col justify-center bg-red-500/10 p-4">
245
+ <h4 className="text-sm font-medium text-white">Sidebar</h4>
246
+ <p className="mt-1 text-xs text-white/60">25% default</p>
247
+ <p className="mt-1 text-xs text-white/40">15% minimum</p>
248
+ </div>
249
+ </ResizablePanel>
250
+ <ResizableHandle withHandle />
251
+ <ResizablePanel defaultSize={50}>
252
+ <div className="flex h-full items-center justify-center bg-blue-500/10 p-4">
253
+ <div className="text-center">
254
+ <h4 className="text-lg font-medium text-white">Main Content</h4>
255
+ <p className="text-sm text-white/60">50% default size</p>
256
+ <p className="mt-2 text-xs text-white/40">Primary content area</p>
257
+ </div>
258
+ </div>
259
+ </ResizablePanel>
260
+ <ResizableHandle withHandle />
261
+ <ResizablePanel defaultSize={25} minSize={20}>
262
+ <div className="flex h-full flex-col justify-center bg-purple-500/10 p-4">
263
+ <h4 className="text-sm font-medium text-white">Right Panel</h4>
264
+ <p className="mt-1 text-xs text-white/60">25% default</p>
265
+ <p className="mt-1 text-xs text-white/40">20% minimum</p>
266
+ </div>
267
+ </ResizablePanel>
268
+ </ResizablePanelGroup>
269
+ </div>
270
+ ),
271
+ parameters: {
272
+ docs: {
273
+ description: {
274
+ story:
275
+ "Three-panel layout with minimum size constraints and visual drag handles between each panel.",
276
+ },
277
+ },
278
+ },
279
+ }
280
+
281
+ // 4. Nested Layouts
282
+ export const NestedLayouts: Story = {
283
+ render: () => (
284
+ <div className="h-96 w-full p-8">
285
+ <h3 className="mb-4 text-lg font-medium text-white">
286
+ Nested Resizable Layouts
287
+ </h3>
288
+ <ResizablePanelGroup
289
+ direction="horizontal"
290
+ className="overflow-hidden rounded-lg border border-white/10"
291
+ >
292
+ <ResizablePanel defaultSize={30} minSize={25}>
293
+ <div className="flex h-full flex-col justify-center bg-indigo-500/10 p-4">
294
+ <h4 className="text-sm font-medium text-white">Sidebar</h4>
295
+ <p className="mt-1 text-xs text-white/60">Navigation & Tools</p>
296
+ <div className="mt-4 space-y-2">
297
+ <div className="h-2 rounded bg-white/10"></div>
298
+ <div className="h-2 rounded bg-white/5"></div>
299
+ <div className="h-2 rounded bg-white/5"></div>
300
+ </div>
301
+ </div>
302
+ </ResizablePanel>
303
+ <ResizableHandle withHandle />
304
+ <ResizablePanel defaultSize={70}>
305
+ <ResizablePanelGroup direction="vertical">
306
+ <ResizablePanel defaultSize={65}>
307
+ <div className="flex h-full items-center justify-center bg-green-500/10 p-4">
308
+ <div className="text-center">
309
+ <h4 className="text-lg font-medium text-white">
310
+ Main Content Area
311
+ </h4>
312
+ <p className="text-sm text-white/60">Primary workspace</p>
313
+ <p className="mt-2 text-xs text-white/40">
314
+ This panel can be resized vertically
315
+ </p>
316
+ </div>
317
+ </div>
318
+ </ResizablePanel>
319
+ <ResizableHandle withHandle />
320
+ <ResizablePanel defaultSize={35} minSize={25}>
321
+ <div className="flex h-full items-center justify-center bg-orange-500/10 p-4">
322
+ <div className="text-center">
323
+ <h4 className="text-md font-medium text-white">
324
+ Bottom Panel
325
+ </h4>
326
+ <p className="text-sm text-white/60">Console / Terminal</p>
327
+ <p className="mt-2 text-xs text-white/40">
328
+ Nested vertical layout
329
+ </p>
330
+ </div>
331
+ </div>
332
+ </ResizablePanel>
333
+ </ResizablePanelGroup>
334
+ </ResizablePanel>
335
+ </ResizablePanelGroup>
336
+ </div>
337
+ ),
338
+ parameters: {
339
+ docs: {
340
+ description: {
341
+ story:
342
+ "Complex nested layout demonstrating horizontal and vertical resizable panels within each other, similar to IDE layouts.",
343
+ },
344
+ },
345
+ },
346
+ }
347
+
348
+ // 5. Handle Variations
349
+ export const HandleVariations: Story = {
350
+ render: () => (
351
+ <div className="space-y-8 p-8">
352
+ <h3 className="text-center text-lg font-medium text-white">
353
+ Handle Variations
354
+ </h3>
355
+
356
+ <div className="space-y-6">
357
+ {/* Without Visual Handle */}
358
+ <div className="space-y-2">
359
+ <h4 className="text-sm font-medium text-white/70">
360
+ Without Visual Handle
361
+ </h4>
362
+ <div className="h-32">
363
+ <ResizablePanelGroup
364
+ direction="horizontal"
365
+ className="overflow-hidden rounded-lg border border-white/10"
366
+ >
367
+ <ResizablePanel defaultSize={50}>
368
+ <div className="flex h-full items-center justify-center bg-blue-500/10 p-4">
369
+ <span className="text-sm text-white">Minimal Handle</span>
370
+ </div>
371
+ </ResizablePanel>
372
+ <ResizableHandle />
373
+ <ResizablePanel defaultSize={50}>
374
+ <div className="flex h-full items-center justify-center bg-purple-500/10 p-4">
375
+ <span className="text-sm text-white">Clean Look</span>
376
+ </div>
377
+ </ResizablePanel>
378
+ </ResizablePanelGroup>
379
+ </div>
380
+ </div>
381
+
382
+ {/* With Visual Handle */}
383
+ <div className="space-y-2">
384
+ <h4 className="text-sm font-medium text-white/70">
385
+ With Visual Handle
386
+ </h4>
387
+ <div className="h-32">
388
+ <ResizablePanelGroup
389
+ direction="horizontal"
390
+ className="overflow-hidden rounded-lg border border-white/10"
391
+ >
392
+ <ResizablePanel defaultSize={50}>
393
+ <div className="flex h-full items-center justify-center bg-green-500/10 p-4">
394
+ <span className="text-sm text-white">Clear Affordance</span>
395
+ </div>
396
+ </ResizablePanel>
397
+ <ResizableHandle withHandle />
398
+ <ResizablePanel defaultSize={50}>
399
+ <div className="flex h-full items-center justify-center bg-orange-500/10 p-4">
400
+ <span className="text-sm text-white">Easy to Spot</span>
401
+ </div>
402
+ </ResizablePanel>
403
+ </ResizablePanelGroup>
404
+ </div>
405
+ </div>
406
+
407
+ {/* Custom Styled Handle */}
408
+ <div className="space-y-2">
409
+ <h4 className="text-sm font-medium text-white/70">
410
+ Custom Styled Handle
411
+ </h4>
412
+ <div className="h-32">
413
+ <ResizablePanelGroup
414
+ direction="horizontal"
415
+ className="overflow-hidden rounded-lg border border-white/10"
416
+ >
417
+ <ResizablePanel defaultSize={50}>
418
+ <div className="flex h-full items-center justify-center bg-red-500/10 p-4">
419
+ <span className="text-sm text-white">Custom Styling</span>
420
+ </div>
421
+ </ResizablePanel>
422
+ <ResizableHandle
423
+ withHandle
424
+ className="bg-blue-500/20 transition-colors hover:bg-blue-500/30"
425
+ />
426
+ <ResizablePanel defaultSize={50}>
427
+ <div className="flex h-full items-center justify-center bg-indigo-500/10 p-4">
428
+ <span className="text-sm text-white">Themed Handle</span>
429
+ </div>
430
+ </ResizablePanel>
431
+ </ResizablePanelGroup>
432
+ </div>
433
+ </div>
434
+ </div>
435
+ </div>
436
+ ),
437
+ parameters: {
438
+ docs: {
439
+ description: {
440
+ story:
441
+ "Different handle variations showing minimal handles, visual handles with icons, and custom styled handles.",
442
+ },
443
+ },
444
+ },
445
+ }
446
+
447
+ // 6. Real-world Examples
448
+ export const RealWorldExamples: Story = {
449
+ render: () => (
450
+ <div className="space-y-8 p-8">
451
+ <h3 className="text-center text-lg font-medium text-white">
452
+ Real-world Examples
453
+ </h3>
454
+
455
+ <div className="space-y-8">
456
+ {/* IDE Layout */}
457
+ <div className="space-y-4">
458
+ <h4 className="text-sm font-medium text-white/70">
459
+ IDE / Code Editor Layout
460
+ </h4>
461
+ <div className="h-80">
462
+ <ResizablePanelGroup
463
+ direction="horizontal"
464
+ className="overflow-hidden rounded-lg border border-white/10"
465
+ >
466
+ {/* File Explorer */}
467
+ <ResizablePanel defaultSize={20} minSize={15}>
468
+ <div className="h-full bg-gray-900/50 p-3">
469
+ <h5 className="mb-3 text-xs font-medium text-white">
470
+ EXPLORER
471
+ </h5>
472
+ <div className="space-y-1 text-xs text-white/60">
473
+ <div className="flex items-center gap-1">
474
+ <span>📁</span> src
475
+ </div>
476
+ <div className="ml-3 flex items-center gap-1">
477
+ <span>📄</span> index.tsx
478
+ </div>
479
+ <div className="ml-3 flex items-center gap-1">
480
+ <span>📄</span> App.tsx
481
+ </div>
482
+ <div className="flex items-center gap-1">
483
+ <span>📁</span> components
484
+ </div>
485
+ </div>
486
+ </div>
487
+ </ResizablePanel>
488
+ <ResizableHandle withHandle />
489
+
490
+ {/* Main Content */}
491
+ <ResizablePanel defaultSize={60}>
492
+ <ResizablePanelGroup direction="vertical">
493
+ {/* Editor */}
494
+ <ResizablePanel defaultSize={70}>
495
+ <div className="h-full bg-gray-900/30 p-4">
496
+ <div className="mb-4 flex items-center gap-2 border-b border-white/10 pb-2">
497
+ <span className="text-xs text-white/60">App.tsx</span>
498
+ <span className="text-xs text-white/40">×</span>
499
+ </div>
500
+ <div className="space-y-2 font-mono text-xs text-white/70">
501
+ <div>
502
+ <span className="text-purple-400">import</span> React{" "}
503
+ <span className="text-purple-400">from</span>{" "}
504
+ <span className="text-green-400">'react'</span>
505
+ </div>
506
+ <div></div>
507
+ <div>
508
+ <span className="text-purple-400">function</span>{" "}
509
+ <span className="text-blue-400">App</span>() {"{"}
510
+ </div>
511
+ <div className="ml-4">
512
+ <span className="text-purple-400">return</span> (
513
+ </div>
514
+ <div className="ml-8">
515
+ &lt;<span className="text-red-400">div</span>&gt;Hello
516
+ World&lt;/<span className="text-red-400">div</span>
517
+ &gt;
518
+ </div>
519
+ <div className="ml-4">)</div>
520
+ <div>{"}"}</div>
521
+ </div>
522
+ </div>
523
+ </ResizablePanel>
524
+ <ResizableHandle withHandle />
525
+
526
+ {/* Terminal */}
527
+ <ResizablePanel defaultSize={30} minSize={20}>
528
+ <div className="h-full bg-black/50 p-3">
529
+ <div className="mb-2 flex items-center gap-2">
530
+ <h5 className="text-xs font-medium text-white">
531
+ TERMINAL
532
+ </h5>
533
+ <span className="text-xs text-white/40">bash</span>
534
+ </div>
535
+ <div className="font-mono text-xs text-green-400">
536
+ <div>$ npm start</div>
537
+ <div className="text-white/60">
538
+ Starting development server...
539
+ </div>
540
+ <div className="text-white/60">
541
+ Local: http://localhost:3000
542
+ </div>
543
+ <div className="text-green-400">
544
+ ✓ Compiled successfully!
545
+ </div>
546
+ </div>
547
+ </div>
548
+ </ResizablePanel>
549
+ </ResizablePanelGroup>
550
+ </ResizablePanel>
551
+ <ResizableHandle withHandle />
552
+
553
+ {/* Right Sidebar */}
554
+ <ResizablePanel defaultSize={20} minSize={15}>
555
+ <div className="h-full bg-gray-900/50 p-3">
556
+ <h5 className="mb-3 text-xs font-medium text-white">
557
+ OUTLINE
558
+ </h5>
559
+ <div className="space-y-1 text-xs text-white/60">
560
+ <div>📋 Components</div>
561
+ <div className="ml-3">⚛️ App</div>
562
+ <div className="ml-3">🎨 Header</div>
563
+ <div className="ml-3">📝 Content</div>
564
+ <div>🎯 Hooks</div>
565
+ <div className="ml-3">🔄 useState</div>
566
+ </div>
567
+ </div>
568
+ </ResizablePanel>
569
+ </ResizablePanelGroup>
570
+ </div>
571
+ </div>
572
+
573
+ {/* Dashboard Layout */}
574
+ <div className="space-y-4">
575
+ <h4 className="text-sm font-medium text-white/70">
576
+ Dashboard Layout
577
+ </h4>
578
+ <div className="h-64">
579
+ <ResizablePanelGroup
580
+ direction="horizontal"
581
+ className="overflow-hidden rounded-lg border border-white/10"
582
+ >
583
+ {/* Sidebar */}
584
+ <ResizablePanel defaultSize={25} minSize={20}>
585
+ <div className="h-full bg-blue-900/20 p-4">
586
+ <h5 className="mb-4 text-sm font-medium text-white">
587
+ Navigation
588
+ </h5>
589
+ <div className="space-y-3">
590
+ <div className="flex items-center gap-2 text-sm text-white/80">
591
+ <span>📊</span> Dashboard
592
+ </div>
593
+ <div className="flex items-center gap-2 text-sm text-white/60">
594
+ <span>👥</span> Users
595
+ </div>
596
+ <div className="flex items-center gap-2 text-sm text-white/60">
597
+ <span>⚙️</span> Settings
598
+ </div>
599
+ </div>
600
+ </div>
601
+ </ResizablePanel>
602
+ <ResizableHandle withHandle />
603
+
604
+ {/* Main Dashboard */}
605
+ <ResizablePanel defaultSize={75}>
606
+ <ResizablePanelGroup direction="vertical">
607
+ {/* Top Metrics */}
608
+ <ResizablePanel defaultSize={40}>
609
+ <div className="h-full bg-green-900/20 p-4">
610
+ <h5 className="mb-3 text-sm font-medium text-white">
611
+ Key Metrics
612
+ </h5>
613
+ <div className="grid h-20 grid-cols-3 gap-4">
614
+ <div className="rounded bg-white/5 p-3 text-center">
615
+ <div className="text-lg font-bold text-white">
616
+ 1,234
617
+ </div>
618
+ <div className="text-xs text-white/60">Users</div>
619
+ </div>
620
+ <div className="rounded bg-white/5 p-3 text-center">
621
+ <div className="text-lg font-bold text-white">
622
+ $12.3k
623
+ </div>
624
+ <div className="text-xs text-white/60">Revenue</div>
625
+ </div>
626
+ <div className="rounded bg-white/5 p-3 text-center">
627
+ <div className="text-lg font-bold text-white">
628
+ 98.5%
629
+ </div>
630
+ <div className="text-xs text-white/60">Uptime</div>
631
+ </div>
632
+ </div>
633
+ </div>
634
+ </ResizablePanel>
635
+ <ResizableHandle withHandle />
636
+
637
+ {/* Bottom Charts */}
638
+ <ResizablePanel defaultSize={60}>
639
+ <div className="h-full bg-purple-900/20 p-4">
640
+ <h5 className="mb-3 text-sm font-medium text-white">
641
+ Analytics
642
+ </h5>
643
+ <div className="flex h-full items-center justify-center rounded bg-white/5 p-4">
644
+ <span className="text-white/60">📈 Chart Area</span>
645
+ </div>
646
+ </div>
647
+ </ResizablePanel>
648
+ </ResizablePanelGroup>
649
+ </ResizablePanel>
650
+ </ResizablePanelGroup>
651
+ </div>
652
+ </div>
653
+ </div>
654
+ </div>
655
+ ),
656
+ parameters: {
657
+ docs: {
658
+ description: {
659
+ story:
660
+ "Real-world application layouts including IDE/code editor interface and dashboard layout with multiple nested panels.",
661
+ },
662
+ },
663
+ },
664
+ }
665
+
666
+ // 7. Accessibility Demo
667
+ export const AccessibilityDemo: Story = {
668
+ render: () => (
669
+ <div className="space-y-6 p-8">
670
+ <h3 className="text-center text-lg font-medium text-white">
671
+ Accessibility Features
672
+ </h3>
673
+
674
+ <div className="space-y-4">
675
+ <div className="rounded-lg border border-blue-500/30 bg-blue-900/10 p-4">
676
+ <h4 className="mb-2 text-sm font-medium text-blue-300">
677
+ Keyboard Navigation
678
+ </h4>
679
+ <p className="mb-2 text-xs text-blue-200/70">
680
+ Try these keyboard interactions:
681
+ </p>
682
+ <ul className="space-y-1 text-xs text-blue-200/70">
683
+ <li>
684
+ • <kbd className="rounded bg-white/10 px-1">Tab</kbd> to focus
685
+ resize handles
686
+ </li>
687
+ <li>
688
+ • <kbd className="rounded bg-white/10 px-1">Arrow Keys</kbd> to
689
+ resize panels
690
+ </li>
691
+ <li>
692
+ • <kbd className="rounded bg-white/10 px-1">Enter</kbd> to
693
+ activate resize mode
694
+ </li>
695
+ <li>
696
+ • <kbd className="rounded bg-white/10 px-1">Escape</kbd> to exit
697
+ resize mode
698
+ </li>
699
+ </ul>
700
+ </div>
701
+
702
+ <div className="h-48">
703
+ <h4 className="mb-2 text-sm font-medium text-white/70">
704
+ Keyboard Accessible Resizing
705
+ </h4>
706
+ <ResizablePanelGroup
707
+ direction="horizontal"
708
+ className="overflow-hidden rounded-lg border border-white/10"
709
+ >
710
+ <ResizablePanel defaultSize={40}>
711
+ <div className="flex h-full items-center justify-center bg-blue-500/10 p-4">
712
+ <div className="text-center">
713
+ <h5 className="text-md font-medium text-white">Left Panel</h5>
714
+ <p className="mt-1 text-xs text-white/60">
715
+ Tab to the handle and use arrow keys
716
+ </p>
717
+ </div>
718
+ </div>
719
+ </ResizablePanel>
720
+ <ResizableHandle withHandle />
721
+ <ResizablePanel defaultSize={60}>
722
+ <div className="flex h-full items-center justify-center bg-purple-500/10 p-4">
723
+ <div className="text-center">
724
+ <h5 className="text-md font-medium text-white">
725
+ Right Panel
726
+ </h5>
727
+ <p className="mt-1 text-xs text-white/60">
728
+ Focus ring visible when handle is focused
729
+ </p>
730
+ </div>
731
+ </div>
732
+ </ResizablePanel>
733
+ </ResizablePanelGroup>
734
+ </div>
735
+
736
+ <div className="rounded-lg border border-white/10 bg-white/5 p-4">
737
+ <h4 className="mb-3 text-sm font-medium text-white/70">
738
+ Screen Reader Support
739
+ </h4>
740
+ <div className="space-y-1 text-xs text-white/60">
741
+ <p>• Resize handles have proper ARIA labels</p>
742
+ <p>• Panel relationships are properly communicated</p>
743
+ <p>• Size changes are announced to screen readers</p>
744
+ <p>• Keyboard instructions are provided contextually</p>
745
+ </div>
746
+ </div>
747
+ </div>
748
+ </div>
749
+ ),
750
+ parameters: {
751
+ docs: {
752
+ description: {
753
+ story:
754
+ "Demonstration of accessibility features including keyboard navigation, focus management, and screen reader support.",
755
+ },
756
+ },
757
+ },
758
+ }
759
+
760
+ // 8. Interactive Playground
761
+ export const InteractivePlayground: Story = {
762
+ render: () => {
763
+ const [sizes, setSizes] = React.useState([25, 50, 25])
764
+
765
+ return (
766
+ <div className="space-y-6 p-8">
767
+ <h3 className="text-center text-lg font-medium text-white">
768
+ Interactive Playground
769
+ </h3>
770
+
771
+ <div className="rounded-lg border border-white/10 bg-white/5 p-4">
772
+ <h4 className="mb-2 text-sm font-medium text-white/70">
773
+ Current Panel Sizes
774
+ </h4>
775
+ <div className="grid grid-cols-3 gap-4 text-xs">
776
+ <div className="text-center">
777
+ <div className="text-white">Left Panel</div>
778
+ <div className="font-mono text-blue-400">
779
+ {sizes[0].toFixed(1)}%
780
+ </div>
781
+ </div>
782
+ <div className="text-center">
783
+ <div className="text-white">Center Panel</div>
784
+ <div className="font-mono text-green-400">
785
+ {sizes[1].toFixed(1)}%
786
+ </div>
787
+ </div>
788
+ <div className="text-center">
789
+ <div className="text-white">Right Panel</div>
790
+ <div className="font-mono text-purple-400">
791
+ {sizes[2].toFixed(1)}%
792
+ </div>
793
+ </div>
794
+ </div>
795
+ </div>
796
+
797
+ <div className="h-64">
798
+ <ResizablePanelGroup
799
+ direction="horizontal"
800
+ className="overflow-hidden rounded-lg border border-white/10"
801
+ onLayout={(newSizes) => setSizes(newSizes)}
802
+ >
803
+ <ResizablePanel defaultSize={25} minSize={15}>
804
+ <div className="flex h-full items-center justify-center bg-blue-500/10 p-4">
805
+ <div className="text-center">
806
+ <h5 className="text-md font-medium text-white">Panel 1</h5>
807
+ <p className="mt-1 text-xs text-white/60">Min: 15%</p>
808
+ <div className="mx-auto mt-3 flex h-16 w-16 items-center justify-center rounded-full bg-blue-500/20">
809
+ <span className="font-mono text-xs text-blue-300">
810
+ {sizes[0]?.toFixed(0)}%
811
+ </span>
812
+ </div>
813
+ </div>
814
+ </div>
815
+ </ResizablePanel>
816
+ <ResizableHandle withHandle />
817
+
818
+ <ResizablePanel defaultSize={50}>
819
+ <div className="flex h-full items-center justify-center bg-green-500/10 p-4">
820
+ <div className="text-center">
821
+ <h5 className="text-md font-medium text-white">Panel 2</h5>
822
+ <p className="mt-1 text-xs text-white/60">Flexible</p>
823
+ <div className="mx-auto mt-3 flex h-16 w-16 items-center justify-center rounded-full bg-green-500/20">
824
+ <span className="font-mono text-xs text-green-300">
825
+ {sizes[1]?.toFixed(0)}%
826
+ </span>
827
+ </div>
828
+ </div>
829
+ </div>
830
+ </ResizablePanel>
831
+ <ResizableHandle withHandle />
832
+
833
+ <ResizablePanel defaultSize={25} minSize={20}>
834
+ <div className="flex h-full items-center justify-center bg-purple-500/10 p-4">
835
+ <div className="text-center">
836
+ <h5 className="text-md font-medium text-white">Panel 3</h5>
837
+ <p className="mt-1 text-xs text-white/60">Min: 20%</p>
838
+ <div className="mx-auto mt-3 flex h-16 w-16 items-center justify-center rounded-full bg-purple-500/20">
839
+ <span className="font-mono text-xs text-purple-300">
840
+ {sizes[2]?.toFixed(0)}%
841
+ </span>
842
+ </div>
843
+ </div>
844
+ </div>
845
+ </ResizablePanel>
846
+ </ResizablePanelGroup>
847
+ </div>
848
+
849
+ <div className="text-center text-xs text-white/60">
850
+ <p>
851
+ Drag the handles to resize panels and see the live size updates
852
+ above!
853
+ </p>
854
+ </div>
855
+ </div>
856
+ )
857
+ },
858
+ parameters: {
859
+ docs: {
860
+ description: {
861
+ story:
862
+ "Interactive playground showing real-time panel size updates and demonstrating the onLayout callback functionality.",
863
+ },
864
+ },
865
+ },
866
+ }