@12-apps/ui 1.5.0 → 1.5.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 (229) hide show
  1. package/package.json +17 -9
  2. package/src/button/index.ts +1 -0
  3. package/src/social-login-button/index.ts +1 -0
  4. package/src/{social-login-button.tsx → social-login-button/social-login-button.tsx} +5 -5
  5. package/src/user-avatar/index.ts +1 -0
  6. package/src/{user-avatar.tsx → user-avatar/user-avatar.tsx} +4 -4
  7. package/eslint.config.js +0 -89
  8. package/src/__tests__/data-grid.test.tsx +0 -125
  9. package/src/__tests__/package-wiring.test.ts +0 -41
  10. package/src/__tests__/setup.ts +0 -1
  11. package/src/__tests__/social-login-button.test.tsx +0 -186
  12. package/src/__tests__/user-avatar.test.tsx +0 -195
  13. package/src/__tests__/viewport.test.ts +0 -50
  14. package/src/components/command/__tests__/command.test.tsx +0 -112
  15. package/src/components/data-display/Alert/Alert.stories.tsx +0 -559
  16. package/src/components/data-display/Alert/Alert.test.stories.tsx +0 -707
  17. package/src/components/data-display/AlertDialog/AlertDialog.stories.tsx +0 -362
  18. package/src/components/data-display/AlertDialog/AlertDialog.test.stories.tsx +0 -763
  19. package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.stories.tsx +0 -230
  20. package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.test.stories.tsx +0 -270
  21. package/src/components/data-display/Avatar/Avatar.stories.tsx +0 -721
  22. package/src/components/data-display/Avatar/Avatar.test.stories.tsx +0 -822
  23. package/src/components/data-display/Badge/Badge.stories.tsx +0 -1134
  24. package/src/components/data-display/Badge/Badge.test.stories.tsx +0 -1194
  25. package/src/components/data-display/Banner/Banner.stories.tsx +0 -528
  26. package/src/components/data-display/Banner/Banner.test.stories.tsx +0 -511
  27. package/src/components/data-display/Carousel/Carousel.stories.tsx +0 -607
  28. package/src/components/data-display/Carousel/Carousel.test.stories.tsx +0 -701
  29. package/src/components/data-display/Chart/Chart.stories.tsx +0 -568
  30. package/src/components/data-display/Chart/Chart.test.stories.tsx +0 -174
  31. package/src/components/data-display/Chart/SpecChart.stories.tsx +0 -150
  32. package/src/components/data-display/Chart/SpecChart.test.stories.tsx +0 -56
  33. package/src/components/data-display/Chart/__tests__/SpecChart.test.tsx +0 -60
  34. package/src/components/data-display/Chart/__tests__/chart-format.test.ts +0 -43
  35. package/src/components/data-display/Chart/__tests__/chart-spec.test.ts +0 -119
  36. package/src/components/data-display/Chip/Chip.stories.tsx +0 -252
  37. package/src/components/data-display/Chip/Chip.test.stories.tsx +0 -266
  38. package/src/components/data-display/DataGrid/DataGrid.stories.tsx +0 -515
  39. package/src/components/data-display/DataGrid/DataGrid.test.stories.tsx +0 -653
  40. package/src/components/data-display/DataViews/__tests__/DataViewsGrid.test.tsx +0 -271
  41. package/src/components/data-display/DataViews/__tests__/DataViewsTableBase.test.tsx +0 -134
  42. package/src/components/data-display/DataViews/__tests__/SaveViewModal.test.tsx +0 -83
  43. package/src/components/data-display/DataViews/__tests__/data-views-filter.test.ts +0 -115
  44. package/src/components/data-display/DataViews/__tests__/data-views-preview.test.ts +0 -53
  45. package/src/components/data-display/DataViews/__tests__/range-pill.test.tsx +0 -114
  46. package/src/components/data-display/DataViews/base-card.stories.tsx +0 -136
  47. package/src/components/data-display/DescriptionItem/DescriptionItem.stories.tsx +0 -254
  48. package/src/components/data-display/EmptyState/EmptyState.stories.tsx +0 -282
  49. package/src/components/data-display/EmptyState/EmptyState.test.stories.tsx +0 -441
  50. package/src/components/data-display/ErrorState/ErrorState.stories.tsx +0 -110
  51. package/src/components/data-display/ErrorState/ErrorState.test.stories.tsx +0 -133
  52. package/src/components/data-display/HoverCard/HoverCard.stories.tsx +0 -650
  53. package/src/components/data-display/HoverCard/HoverCard.test.stories.tsx +0 -929
  54. package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.stories.tsx +0 -411
  55. package/src/components/data-display/LazyImage/LazyImage.stories.tsx +0 -387
  56. package/src/components/data-display/Lightbox/Lightbox.stories.tsx +0 -315
  57. package/src/components/data-display/Lightbox/Lightbox.test.stories.tsx +0 -598
  58. package/src/components/data-display/LoadingState/LoadingState.stories.tsx +0 -124
  59. package/src/components/data-display/LoadingState/LoadingState.test.stories.tsx +0 -99
  60. package/src/components/data-display/MapPreview/MapPreview.stories.tsx +0 -458
  61. package/src/components/data-display/MapPreview/MapPreview.test.stories.tsx +0 -394
  62. package/src/components/data-display/Popover/Popover.stories.tsx +0 -295
  63. package/src/components/data-display/Popover/Popover.test.stories.tsx +0 -1162
  64. package/src/components/data-display/Progress/Progress.stories.tsx +0 -481
  65. package/src/components/data-display/Progress/Progress.test.stories.tsx +0 -2070
  66. package/src/components/data-display/SectionOnboarding/SectionOnboarding.stories.tsx +0 -160
  67. package/src/components/data-display/SectionOnboarding/SectionOnboarding.test.stories.tsx +0 -190
  68. package/src/components/data-display/Sheet/Sheet.stories.tsx +0 -883
  69. package/src/components/data-display/Sheet/Sheet.test.stories.tsx +0 -1105
  70. package/src/components/data-display/StatCard/StatCard.stories.tsx +0 -167
  71. package/src/components/data-display/StatCard/StatCard.test.stories.tsx +0 -240
  72. package/src/components/data-display/Stepper/Stepper.stories.tsx +0 -540
  73. package/src/components/data-display/Stepper/Stepper.test.stories.tsx +0 -600
  74. package/src/components/data-display/Table/Table.stories.tsx +0 -803
  75. package/src/components/data-display/Table/Table.test.stories.tsx +0 -369
  76. package/src/components/data-display/Timeline/Timeline.stories.tsx +0 -442
  77. package/src/components/data-display/Timeline/Timeline.test.stories.tsx +0 -930
  78. package/src/components/data-display/TimingDiagram/TimingDiagram.stories.tsx +0 -475
  79. package/src/components/data-display/TimingDiagram/TimingDiagram.test.stories.tsx +0 -734
  80. package/src/components/data-display/Tooltip/Tooltip.stories.tsx +0 -468
  81. package/src/components/data-display/Tooltip/Tooltip.test.stories.tsx +0 -1154
  82. package/src/components/feedback/ConfirmAction/ConfirmAction.stories.tsx +0 -146
  83. package/src/components/feedback/ConfirmAction/ConfirmAction.test.stories.tsx +0 -114
  84. package/src/components/feedback/ConfirmAction/__tests__/confirm-action.test.tsx +0 -288
  85. package/src/components/feedback/Dialog/Dialog.stories.tsx +0 -833
  86. package/src/components/feedback/Dialog/Dialog.test.stories.tsx +0 -964
  87. package/src/components/feedback/Dialog/__tests__/dialog-content-spacing.test.tsx +0 -66
  88. package/src/components/feedback/Modal/Modal.stories.tsx +0 -765
  89. package/src/components/feedback/Modal/Modal.test.stories.tsx +0 -251
  90. package/src/components/feedback/Sonner/Sonner.stories.tsx +0 -698
  91. package/src/components/feedback/Sonner/Sonner.test.stories.tsx +0 -896
  92. package/src/components/feedback/StackedModal/StackedModal.stories.tsx +0 -1783
  93. package/src/components/feedback/StackedModal/StackedModal.test.stories.tsx +0 -973
  94. package/src/components/feedback/StackedModal/__tests__/stacked-modal-viewport.test.tsx +0 -104
  95. package/src/components/feedback/Toast/Toast.stories.tsx +0 -548
  96. package/src/components/feedback/Toast/Toast.test.stories.tsx +0 -834
  97. package/src/components/feedback/TutorialOverlay/TutorialOverlay.stories.tsx +0 -691
  98. package/src/components/feedback/TutorialOverlay/TutorialOverlay.test.stories.tsx +0 -634
  99. package/src/components/form/AddressAutocomplete/AddressAutocomplete.stories.tsx +0 -665
  100. package/src/components/form/AddressAutocomplete/AddressAutocomplete.test.stories.tsx +0 -727
  101. package/src/components/form/Autocomplete/Autocomplete.stories.tsx +0 -715
  102. package/src/components/form/Autocomplete/Autocomplete.test.stories.tsx +0 -825
  103. package/src/components/form/Button/Button.stories.tsx +0 -365
  104. package/src/components/form/Button/Button.test.stories.tsx +0 -607
  105. package/src/components/form/Calendar/Calendar.stories.tsx +0 -349
  106. package/src/components/form/Calendar/Calendar.test.stories.tsx +0 -464
  107. package/src/components/form/CepField/CepField.stories.tsx +0 -138
  108. package/src/components/form/CepField/CepField.test.stories.tsx +0 -281
  109. package/src/components/form/Checkbox/Checkbox.stories.tsx +0 -265
  110. package/src/components/form/Checkbox/Checkbox.test.stories.tsx +0 -181
  111. package/src/components/form/CodeEditor/CodeEditor.stories.tsx +0 -871
  112. package/src/components/form/CodeEditor/CodeEditor.test.stories.tsx +0 -574
  113. package/src/components/form/Command/Command.stories.tsx +0 -580
  114. package/src/components/form/Command/Command.test.stories.tsx +0 -215
  115. package/src/components/form/CreatableSelect/CreatableSelect.stories.tsx +0 -112
  116. package/src/components/form/CreatableSelect/CreatableSelect.test.stories.tsx +0 -134
  117. package/src/components/form/Form/Form.stories.tsx +0 -687
  118. package/src/components/form/Form/Form.test.stories.tsx +0 -601
  119. package/src/components/form/Input/Input.stories.tsx +0 -260
  120. package/src/components/form/Input/Input.test.stories.tsx +0 -1191
  121. package/src/components/form/InputOTP/InputOTP.stories.tsx +0 -774
  122. package/src/components/form/InputOTP/InputOTP.test.stories.tsx +0 -588
  123. package/src/components/form/Label/Label.stories.tsx +0 -473
  124. package/src/components/form/Label/Label.test.stories.tsx +0 -915
  125. package/src/components/form/Menubar/Menubar.stories.tsx +0 -472
  126. package/src/components/form/Menubar/Menubar.test.stories.tsx +0 -584
  127. package/src/components/form/PasswordStrength/PasswordStrength.stories.tsx +0 -562
  128. package/src/components/form/PasswordStrength/PasswordStrength.test.stories.tsx +0 -327
  129. package/src/components/form/PhoneInput/PhoneInput.stories.tsx +0 -495
  130. package/src/components/form/PhoneInput/PhoneInput.test.stories.tsx +0 -666
  131. package/src/components/form/RadioGroup/RadioGroup.stories.tsx +0 -518
  132. package/src/components/form/RadioGroup/RadioGroup.test.stories.tsx +0 -685
  133. package/src/components/form/RichTextEditor/RichTextEditor.stories.tsx +0 -261
  134. package/src/components/form/RichTextEditor/RichTextEditor.test.stories.tsx +0 -491
  135. package/src/components/form/SearchPalette/SearchPalette.stories.tsx +0 -135
  136. package/src/components/form/Select/Select.stories.tsx +0 -364
  137. package/src/components/form/Select/Select.test.stories.tsx +0 -985
  138. package/src/components/form/Slider/Slider.stories.tsx +0 -418
  139. package/src/components/form/Slider/Slider.test.stories.tsx +0 -1042
  140. package/src/components/form/Switch/Switch.stories.tsx +0 -697
  141. package/src/components/form/Switch/Switch.test.stories.tsx +0 -597
  142. package/src/components/form/Textarea/Textarea.stories.tsx +0 -473
  143. package/src/components/form/Textarea/Textarea.test.stories.tsx +0 -702
  144. package/src/components/form/Toggle/Toggle.stories.tsx +0 -638
  145. package/src/components/form/Toggle/Toggle.test.stories.tsx +0 -1159
  146. package/src/components/form/ToggleGroup/ToggleGroup.stories.tsx +0 -617
  147. package/src/components/form/ToggleGroup/ToggleGroup.test.stories.tsx +0 -915
  148. package/src/components/form/UploadButton/UploadButton.stories.tsx +0 -367
  149. package/src/components/form/UploadButton/UploadButton.test.stories.tsx +0 -573
  150. package/src/components/form/total-form/total-form.test.tsx +0 -214
  151. package/src/components/layout/Accordion/Accordion.stories.tsx +0 -694
  152. package/src/components/layout/Accordion/Accordion.test.stories.tsx +0 -1344
  153. package/src/components/layout/Card/Card.stories.tsx +0 -591
  154. package/src/components/layout/Card/Card.test.stories.tsx +0 -1134
  155. package/src/components/layout/CardGrid/__tests__/CardGrid.test.tsx +0 -92
  156. package/src/components/layout/Collapsible/Collapsible.stories.tsx +0 -180
  157. package/src/components/layout/Collapsible/Collapsible.test.stories.tsx +0 -308
  158. package/src/components/layout/Container/Container.stories.tsx +0 -557
  159. package/src/components/layout/Container/Container.test.stories.tsx +0 -745
  160. package/src/components/layout/ContentToolbar/ContentToolbar.stories.tsx +0 -129
  161. package/src/components/layout/ContentToolbar/ContentToolbar.test.stories.tsx +0 -251
  162. package/src/components/layout/ContentToolbar/__tests__/ColumnsMenu.test.tsx +0 -39
  163. package/src/components/layout/ContentToolbar/__tests__/MultiSelectDropdown.test.tsx +0 -131
  164. package/src/components/layout/ContentToolbar/__tests__/SavedViewsMenu.test.tsx +0 -99
  165. package/src/components/layout/Dashboard/Dashboard.stories.tsx +0 -104
  166. package/src/components/layout/Dashboard/Dashboard.test.stories.tsx +0 -190
  167. package/src/components/layout/Drawer/Drawer.stories.tsx +0 -658
  168. package/src/components/layout/Drawer/Drawer.test.stories.tsx +0 -1343
  169. package/src/components/layout/Resizable/Resizable.stories.tsx +0 -1039
  170. package/src/components/layout/Resizable/Resizable.test.stories.tsx +0 -754
  171. package/src/components/layout/ScrollArea/ScrollArea.stories.tsx +0 -651
  172. package/src/components/layout/ScrollArea/ScrollArea.test.stories.tsx +0 -619
  173. package/src/components/layout/Separator/Separator.stories.tsx +0 -563
  174. package/src/components/layout/Separator/Separator.test.stories.tsx +0 -518
  175. package/src/components/layout/SettingsLayout/SettingsLayout.stories.tsx +0 -192
  176. package/src/components/layout/SettingsLayout/SettingsLayout.test.stories.tsx +0 -175
  177. package/src/components/layout/Sidebar/Sidebar.stories.tsx +0 -609
  178. package/src/components/layout/Sidebar/Sidebar.test.stories.tsx +0 -1324
  179. package/src/components/layout/Skeleton/Skeleton.stories.tsx +0 -689
  180. package/src/components/layout/Skeleton/Skeleton.test.stories.tsx +0 -521
  181. package/src/components/layout/Spacer/Spacer.stories.tsx +0 -502
  182. package/src/components/layout/Spacer/Spacer.test.stories.tsx +0 -474
  183. package/src/components/layout/TableFilter/TableFilter.stories.tsx +0 -82
  184. package/src/components/layout/TableFilter/TableFilter.test.stories.tsx +0 -87
  185. package/src/components/navigation/Breadcrumbs/Breadcrumbs.stories.tsx +0 -638
  186. package/src/components/navigation/Breadcrumbs/Breadcrumbs.test.stories.tsx +0 -1008
  187. package/src/components/navigation/CommandPalette/CommandPalette.stories.tsx +0 -386
  188. package/src/components/navigation/CommandPalette/CommandPalette.test.stories.tsx +0 -435
  189. package/src/components/navigation/ContextMenu/ContextMenu.stories.tsx +0 -614
  190. package/src/components/navigation/ContextMenu/ContextMenu.test.stories.tsx +0 -845
  191. package/src/components/navigation/DropdownMenu/DropdownMenu.stories.tsx +0 -578
  192. package/src/components/navigation/DropdownMenu/DropdownMenu.test.stories.tsx +0 -660
  193. package/src/components/navigation/NavigationMenu/stories/NavigationMenu.stories.tsx +0 -516
  194. package/src/components/navigation/NavigationMenu/stories/NavigationMenu.test.stories.tsx +0 -935
  195. package/src/components/navigation/NavigationMenu/stories/NavigationMenuHorizontal.stories.tsx +0 -501
  196. package/src/components/navigation/NavigationMenu/stories/NavigationMenuVertical.stories.tsx +0 -453
  197. package/src/components/navigation/Pagination/Pagination.stories.tsx +0 -602
  198. package/src/components/navigation/Pagination/Pagination.test.stories.tsx +0 -520
  199. package/src/components/navigation/Tabs/Tabs.stories.tsx +0 -1004
  200. package/src/components/navigation/Tabs/Tabs.test.stories.tsx +0 -1225
  201. package/src/components/typography/Blockquote/Blockquote.stories.tsx +0 -359
  202. package/src/components/typography/Blockquote/Blockquote.test.stories.tsx +0 -432
  203. package/src/components/typography/Code/Code.stories.tsx +0 -686
  204. package/src/components/typography/Code/Code.test.stories.tsx +0 -703
  205. package/src/components/typography/Heading/Heading.stories.tsx +0 -451
  206. package/src/components/typography/Heading/Heading.test.stories.tsx +0 -830
  207. package/src/components/typography/Paragraph/Paragraph.stories.tsx +0 -280
  208. package/src/components/typography/Paragraph/Paragraph.test.stories.tsx +0 -231
  209. package/src/components/typography/Text/Text.stories.tsx +0 -359
  210. package/src/components/typography/Text/Text.test.stories.tsx +0 -759
  211. package/src/components/utility/AnimatedIcon/AnimatedIcon.stories.tsx +0 -945
  212. package/src/components/utility/AnimatedIcon/AnimatedIcon.test.stories.tsx +0 -603
  213. package/src/components/utility/AspectRatio/AspectRatio.stories.tsx +0 -414
  214. package/src/components/utility/AspectRatio/AspectRatio.test.stories.tsx +0 -859
  215. package/src/components/utility/InfiniteScroll/InfiniteScroll.stories.tsx +0 -620
  216. package/src/components/utility/InfiniteScroll/InfiniteScroll.test.stories.tsx +0 -361
  217. package/src/components/utility/InstallPrompt/InstallPrompt.stories.tsx +0 -118
  218. package/src/components/utility/InstallPrompt/InstallPrompt.test.stories.tsx +0 -83
  219. package/src/components/utility/InstallPrompt/__tests__/InstallPrompt.ios.test.tsx +0 -65
  220. package/src/components/utility/InstallPrompt/__tests__/usePwaInstall.test.tsx +0 -271
  221. package/src/components/utility/Portal/Portal.stories.tsx +0 -340
  222. package/src/components/utility/Portal/Portal.test.stories.tsx +0 -2086
  223. package/src/components/utility/Transition/Transition.stories.tsx +0 -493
  224. package/src/components/utility/Transition/Transition.test.stories.tsx +0 -854
  225. package/src/components/utility/VirtualList/VirtualList.stories.tsx +0 -1073
  226. package/src/components/utility/VirtualList/VirtualList.test.stories.tsx +0 -1085
  227. package/src/components/utility/WorkflowStep/WorkflowStep.stories.tsx +0 -431
  228. package/src/components/utility/WorkflowStep/WorkflowStep.test.stories.tsx +0 -364
  229. /package/src/{button.tsx → button/button.tsx} +0 -0
@@ -1,1039 +0,0 @@
1
- import { Box, List, ListItem, ListItemText,Paper, Typography } from '@mui/material';
2
- import type { Meta, StoryObj } from '@storybook/react-vite';
3
- import React, { useState } from 'react';
4
-
5
- import { Resizable } from './Resizable';
6
-
7
- const meta: Meta<typeof Resizable> = {
8
- title: 'Layout/Resizable',
9
- component: Resizable,
10
- parameters: {
11
- layout: 'centered',
12
- docs: {
13
- description: {
14
- component:
15
- 'A resizable container component that allows users to adjust dimensions by dragging handles. Supports horizontal, vertical, and both-direction resizing.',
16
- },
17
- },
18
- },
19
- tags: ['autodocs', 'component:Resizable'],
20
- argTypes: {
21
- variant: {
22
- control: { type: 'select' },
23
- options: ['horizontal', 'vertical', 'both'],
24
- description: 'Resize direction constraint',
25
- table: {
26
- type: { summary: 'horizontal | vertical | both' },
27
- defaultValue: { summary: 'both' },
28
- },
29
- },
30
- width: {
31
- control: { type: 'number', min: 50, max: 1000, step: 10 },
32
- description: 'Initial width of the resizable container',
33
- },
34
- height: {
35
- control: { type: 'number', min: 50, max: 1000, step: 10 },
36
- description: 'Initial height of the resizable container',
37
- },
38
- minWidth: {
39
- control: { type: 'number', min: 10, max: 500, step: 10 },
40
- description: 'Minimum width constraint',
41
- },
42
- maxWidth: {
43
- control: { type: 'number', min: 100, max: 2000, step: 10 },
44
- description: 'Maximum width constraint',
45
- },
46
- minHeight: {
47
- control: { type: 'number', min: 10, max: 500, step: 10 },
48
- description: 'Minimum height constraint',
49
- },
50
- maxHeight: {
51
- control: { type: 'number', min: 100, max: 2000, step: 10 },
52
- description: 'Maximum height constraint',
53
- },
54
- disabled: {
55
- control: { type: 'boolean' },
56
- description: 'Whether resizing is disabled',
57
- },
58
- handles: {
59
- control: { type: 'check' },
60
- options: [
61
- 'top',
62
- 'right',
63
- 'bottom',
64
- 'left',
65
- 'topRight',
66
- 'bottomRight',
67
- 'bottomLeft',
68
- 'topLeft',
69
- ],
70
- description: 'Custom resize handles to display',
71
- },
72
- onResize: {
73
- action: 'resized',
74
- description: 'Callback fired when component is resized',
75
- },
76
- },
77
- };
78
-
79
- export default meta;
80
- type Story = StoryObj<typeof meta>;
81
-
82
- interface ContentBoxProps {
83
- title?: string;
84
- description?: string;
85
- }
86
-
87
- const ContentBox: React.FC<ContentBoxProps> = ({
88
- title = 'Resizable Content',
89
- description = 'Drag the handles to resize this container. The content will adapt to the new dimensions.',
90
- }) => (
91
- <Box
92
- sx={{ p: 2, height: '100%', display: 'flex', flexDirection: 'column' }}
93
- data-testid="resizable-content"
94
- >
95
- <Typography variant="h6" gutterBottom>
96
- {title}
97
- </Typography>
98
- <Typography variant="body2" color="text.secondary" paragraph>
99
- {description}
100
- </Typography>
101
- <Box sx={{ flex: 1, bgcolor: 'grey.100', borderRadius: 1, p: 1 }}>
102
- <Typography variant="caption">Content Area</Typography>
103
- </Box>
104
- </Box>
105
- );
106
-
107
- export const Default: Story = {
108
- args: {
109
- width: 300,
110
- height: 200,
111
- children: <ContentBox />,
112
- },
113
- parameters: {
114
- docs: {
115
- description: {
116
- story:
117
- 'Basic resizable container with both horizontal and vertical resizing enabled. Drag the handles on the right edge, bottom edge, or corner to resize.',
118
- },
119
- },
120
- },
121
- };
122
-
123
- export const HorizontalOnly: Story = {
124
- args: {
125
- variant: 'horizontal',
126
- width: 250,
127
- height: 150,
128
- children: (
129
- <Box sx={{ p: 2, bgcolor: 'primary.50', height: '100%' }} data-testid="horizontal-content">
130
- <Typography variant="body1">Horizontal Resize Only</Typography>
131
- <Typography variant="caption" color="text.secondary">
132
- Drag the right edge to resize width
133
- </Typography>
134
- </Box>
135
- ),
136
- },
137
- parameters: {
138
- docs: {
139
- description: {
140
- story:
141
- 'Resizable container constrained to horizontal resizing only. Only the right edge handle is available for resizing.',
142
- },
143
- },
144
- },
145
- };
146
-
147
- export const VerticalOnly: Story = {
148
- args: {
149
- variant: 'vertical',
150
- width: 300,
151
- height: 120,
152
- children: (
153
- <Box sx={{ p: 2, bgcolor: 'secondary.50', height: '100%' }} data-testid="vertical-content">
154
- <Typography variant="body1">Vertical Resize Only</Typography>
155
- <Typography variant="caption" color="text.secondary">
156
- Drag the bottom edge to resize height
157
- </Typography>
158
- </Box>
159
- ),
160
- },
161
- parameters: {
162
- docs: {
163
- description: {
164
- story:
165
- 'Resizable container constrained to vertical resizing only. Only the bottom edge handle is available for resizing.',
166
- },
167
- },
168
- },
169
- };
170
-
171
- export const BothDirections: Story = {
172
- args: {
173
- variant: 'both',
174
- width: 280,
175
- height: 180,
176
- children: (
177
- <Box sx={{ p: 2, bgcolor: 'info.50', height: '100%' }} data-testid="both-directions-content">
178
- <Typography variant="body1">Both Directions</Typography>
179
- <Typography variant="caption" color="text.secondary">
180
- Drag edges or corner to resize
181
- </Typography>
182
- </Box>
183
- ),
184
- },
185
- parameters: {
186
- docs: {
187
- description: {
188
- story:
189
- 'Resizable container with both horizontal and vertical resizing enabled. Provides handles on right edge, bottom edge, and bottom-right corner.',
190
- },
191
- },
192
- },
193
- };
194
-
195
- export const WithConstraints: Story = {
196
- args: {
197
- variant: 'both',
198
- width: 200,
199
- height: 150,
200
- minWidth: 150,
201
- maxWidth: 400,
202
- minHeight: 100,
203
- maxHeight: 300,
204
- children: (
205
- <Box sx={{ p: 2, bgcolor: 'warning.50', height: '100%' }} data-testid="constrained-content">
206
- <Typography variant="body2" gutterBottom>
207
- Constrained Resizing
208
- </Typography>
209
- <Typography variant="caption">
210
- Min: 150x100
211
- <br />
212
- Max: 400x300
213
- </Typography>
214
- </Box>
215
- ),
216
- },
217
- parameters: {
218
- docs: {
219
- description: {
220
- story:
221
- 'Demonstrates size constraints in action. The container cannot be resized below 150x100 or above 400x300 pixels.',
222
- },
223
- },
224
- },
225
- };
226
-
227
- const WithCallbackComponent: React.FC = () => {
228
- const [dimensions, setDimensions] = useState({ width: 250, height: 150 });
229
-
230
- return (
231
- <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2, alignItems: 'center' }}>
232
- <Box sx={{ bgcolor: 'grey.100', p: 2, borderRadius: 1 }}>
233
- <Typography variant="body2">
234
- Current size: {dimensions.width}px × {dimensions.height}px
235
- </Typography>
236
- </Box>
237
-
238
- <Resizable
239
- variant="both"
240
- width={250}
241
- height={150}
242
- onResize={(width, height) => setDimensions({ width, height })}
243
- data-testid="callback-resizable"
244
- >
245
- <Box sx={{ p: 2, bgcolor: 'success.50', height: '100%' }}>
246
- <Typography variant="body1">Resize Tracking</Typography>
247
- <Typography variant="caption">Size updates in real-time</Typography>
248
- </Box>
249
- </Resizable>
250
- </Box>
251
- );
252
- };
253
-
254
- export const WithCallback: Story = {
255
- render: () => <WithCallbackComponent />,
256
- parameters: {
257
- docs: {
258
- description: {
259
- story:
260
- 'Demonstrates the onResize callback functionality. The current dimensions are displayed above the resizable container and update in real-time.',
261
- },
262
- },
263
- },
264
- };
265
-
266
- // Additional comprehensive stories
267
-
268
- export const CustomHandles: Story = {
269
- args: {
270
- variant: 'both',
271
- width: 200,
272
- height: 150,
273
- handles: ['top', 'right', 'bottom', 'left'],
274
- children: (
275
- <Box
276
- sx={{ p: 2, bgcolor: 'success.50', height: '100%' }}
277
- data-testid="custom-handles-content"
278
- >
279
- <Typography variant="body1">Custom Handles</Typography>
280
- <Typography variant="caption" color="text.secondary">
281
- All edge handles enabled (no corners)
282
- </Typography>
283
- </Box>
284
- ),
285
- },
286
- parameters: {
287
- docs: {
288
- description: {
289
- story:
290
- 'Custom handle configuration showing only edge handles (top, right, bottom, left) without corner handles.',
291
- },
292
- },
293
- },
294
- };
295
-
296
- export const AllHandles: Story = {
297
- args: {
298
- variant: 'both',
299
- width: 250,
300
- height: 180,
301
- handles: ['top', 'right', 'bottom', 'left', 'topRight', 'bottomRight', 'bottomLeft', 'topLeft'],
302
- children: (
303
- <Box sx={{ p: 2, bgcolor: 'error.50', height: '100%' }} data-testid="all-handles-content">
304
- <Typography variant="body1">All Resize Handles</Typography>
305
- <Typography variant="caption" color="text.secondary">
306
- 8 handles: 4 edges + 4 corners
307
- </Typography>
308
- </Box>
309
- ),
310
- },
311
- parameters: {
312
- docs: {
313
- description: {
314
- story:
315
- 'Maximum handle configuration with all 8 possible handles enabled (4 edges + 4 corners).',
316
- },
317
- },
318
- },
319
- };
320
-
321
- export const MinimalSize: Story = {
322
- args: {
323
- variant: 'both',
324
- width: 100,
325
- height: 80,
326
- minWidth: 80,
327
- minHeight: 60,
328
- maxWidth: 200,
329
- maxHeight: 150,
330
- children: (
331
- <Box
332
- sx={{ p: 1, bgcolor: 'info.50', height: '100%', fontSize: '0.75rem' }}
333
- data-testid="minimal-size-content"
334
- >
335
- <Typography variant="caption">Small</Typography>
336
- </Box>
337
- ),
338
- },
339
- parameters: {
340
- docs: {
341
- description: {
342
- story:
343
- 'Resizable container starting at a small size with tight constraints to test minimal size handling.',
344
- },
345
- },
346
- },
347
- };
348
-
349
- export const LargeSize: Story = {
350
- args: {
351
- variant: 'both',
352
- width: 600,
353
- height: 400,
354
- minWidth: 400,
355
- minHeight: 300,
356
- maxWidth: 800,
357
- maxHeight: 600,
358
- children: (
359
- <Box
360
- sx={{
361
- p: 3,
362
- bgcolor: 'warning.50',
363
- height: '100%',
364
- display: 'flex',
365
- flexDirection: 'column',
366
- }}
367
- data-testid="large-size-content"
368
- >
369
- <Typography variant="h4" gutterBottom>
370
- Large Container
371
- </Typography>
372
- <Typography variant="body1" paragraph>
373
- This is a larger resizable container to test performance and behavior with bigger
374
- dimensions.
375
- </Typography>
376
- <Box sx={{ flex: 1, bgcolor: 'grey.100', borderRadius: 1, p: 2 }}>
377
- <Typography variant="body2">Large content area</Typography>
378
- </Box>
379
- </Box>
380
- ),
381
- },
382
- parameters: {
383
- docs: {
384
- description: {
385
- story: 'Large resizable container to test performance and handling of bigger dimensions.',
386
- },
387
- },
388
- },
389
- };
390
-
391
- const ResponsiveContentComponent: React.FC = () => {
392
- const [size, setSize] = useState({ width: 300, height: 200 });
393
-
394
- return (
395
- <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2, alignItems: 'center' }}>
396
- <Typography variant="body2" color="text.secondary">
397
- Container: {size.width}px × {size.height}px
398
- </Typography>
399
-
400
- <Resizable
401
- variant="both"
402
- width={300}
403
- height={200}
404
- onResize={(width, height) => setSize({ width, height })}
405
- data-testid="responsive-resizable"
406
- >
407
- <Box
408
- sx={{
409
- p: 2,
410
- bgcolor: 'primary.50',
411
- height: '100%',
412
- display: 'flex',
413
- flexDirection: 'column',
414
- }}
415
- >
416
- <Typography variant="h6" gutterBottom>
417
- Responsive Content
418
- </Typography>
419
- <Typography variant="body2" paragraph>
420
- Content adapts to container size:
421
- </Typography>
422
- <Box
423
- sx={{
424
- display: 'grid',
425
- gridTemplateColumns:
426
- size.width > 250 ? 'repeat(3, 1fr)' : size.width > 150 ? 'repeat(2, 1fr)' : '1fr',
427
- gap: 1,
428
- flex: 1,
429
- }}
430
- >
431
- <Paper sx={{ p: 1, textAlign: 'center' }}>
432
- <Typography variant="caption">Item 1</Typography>
433
- </Paper>
434
- <Paper sx={{ p: 1, textAlign: 'center' }}>
435
- <Typography variant="caption">Item 2</Typography>
436
- </Paper>
437
- <Paper sx={{ p: 1, textAlign: 'center' }}>
438
- <Typography variant="caption">Item 3</Typography>
439
- </Paper>
440
- </Box>
441
- </Box>
442
- </Resizable>
443
- </Box>
444
- );
445
- };
446
-
447
- export const ResponsiveContent: Story = {
448
- render: () => <ResponsiveContentComponent />,
449
- parameters: {
450
- docs: {
451
- description: {
452
- story:
453
- 'Demonstrates how content can adapt responsively to container size changes. The grid layout changes based on available width.',
454
- },
455
- },
456
- },
457
- };
458
-
459
- export const NestedResizable: Story = {
460
- render: () => (
461
- <Box sx={{ p: 2, border: 1, borderColor: 'divider' }} data-testid="nested-layout">
462
- <Typography variant="h6" gutterBottom>
463
- Nested Resizable Containers
464
- </Typography>
465
-
466
- <Resizable variant="both" width={400} height={300} data-testid="outer-resizable">
467
- <Box
468
- sx={{
469
- p: 2,
470
- bgcolor: 'primary.50',
471
- height: '100%',
472
- display: 'flex',
473
- flexDirection: 'column',
474
- }}
475
- >
476
- <Typography variant="subtitle1" gutterBottom>
477
- Outer Container
478
- </Typography>
479
-
480
- <Resizable
481
- variant="both"
482
- width={200}
483
- height={120}
484
- minWidth={100}
485
- minHeight={80}
486
- data-testid="inner-resizable"
487
- >
488
- <Box sx={{ p: 2, bgcolor: 'secondary.50', height: '100%' }}>
489
- <Typography variant="body2">Inner Container</Typography>
490
- <Typography variant="caption">Nested resizable</Typography>
491
- </Box>
492
- </Resizable>
493
- </Box>
494
- </Resizable>
495
- </Box>
496
- ),
497
- parameters: {
498
- docs: {
499
- description: {
500
- story:
501
- 'Nested resizable containers to test complex scenarios where one resizable is inside another.',
502
- },
503
- },
504
- },
505
- };
506
-
507
- export const AccessibilityEnhanced: Story = {
508
- args: {
509
- variant: 'both',
510
- width: 300,
511
- height: 200,
512
- children: (
513
- <Box
514
- sx={{ p: 2, bgcolor: 'info.50', height: '100%' }}
515
- role="region"
516
- aria-label="Resizable content area"
517
- data-testid="accessible-content"
518
- >
519
- <Typography variant="h6" gutterBottom>
520
- Accessible Resizable
521
- </Typography>
522
- <Typography variant="body2" paragraph>
523
- This container includes proper ARIA attributes and semantic HTML for better accessibility.
524
- </Typography>
525
- <Typography variant="caption" color="text.secondary">
526
- Use mouse or touch to resize by dragging the handles.
527
- </Typography>
528
- </Box>
529
- ),
530
- },
531
- parameters: {
532
- docs: {
533
- description: {
534
- story:
535
- 'Enhanced accessibility example with proper ARIA attributes and semantic HTML structure.',
536
- },
537
- },
538
- },
539
- };
540
-
541
- export const DisabledState: Story = {
542
- args: {
543
- variant: 'both',
544
- width: 250,
545
- height: 150,
546
- disabled: true,
547
- children: (
548
- <Box sx={{ p: 2, bgcolor: 'grey.200', height: '100%' }} data-testid="disabled-content">
549
- <Typography variant="body1" color="text.disabled">
550
- Disabled Resizing
551
- </Typography>
552
- <Typography variant="caption" color="text.disabled">
553
- Resizing is disabled for this container
554
- </Typography>
555
- </Box>
556
- ),
557
- },
558
- parameters: {
559
- docs: {
560
- description: {
561
- story:
562
- 'When disabled is true, resize handles are hidden and resizing functionality is completely disabled.',
563
- },
564
- },
565
- },
566
- };
567
-
568
- export const SidePanel: Story = {
569
- render: () => (
570
- <Box
571
- sx={{ display: 'flex', height: 400, border: 1, borderColor: 'divider' }}
572
- data-testid="side-panel-layout"
573
- >
574
- <Resizable
575
- variant="horizontal"
576
- width={200}
577
- minWidth={150}
578
- maxWidth={350}
579
- data-testid="resizable-sidebar"
580
- >
581
- <Box sx={{ bgcolor: 'primary.50', height: '100%', p: 2 }}>
582
- <Typography variant="h6" gutterBottom>
583
- Sidebar
584
- </Typography>
585
- <List dense>
586
- <ListItem>
587
- <ListItemText primary="Item 1" />
588
- </ListItem>
589
- <ListItem>
590
- <ListItemText primary="Item 2" />
591
- </ListItem>
592
- <ListItem>
593
- <ListItemText primary="Item 3" />
594
- </ListItem>
595
- </List>
596
- </Box>
597
- </Resizable>
598
-
599
- <Box sx={{ flex: 1, p: 3 }} data-testid="main-content">
600
- <Typography variant="h5" gutterBottom>
601
- Main Content
602
- </Typography>
603
- <Typography variant="body1" color="text.secondary">
604
- The sidebar on the left is resizable. Drag its right edge to adjust the width.
605
- </Typography>
606
- </Box>
607
- </Box>
608
- ),
609
- parameters: {
610
- docs: {
611
- description: {
612
- story:
613
- 'Common use case: Resizable sidebar panel in a layout. The sidebar can be resized horizontally while the main content area adapts.',
614
- },
615
- },
616
- },
617
- };
618
-
619
- export const TextEditor: Story = {
620
- render: () => (
621
- <Box
622
- sx={{
623
- display: 'flex',
624
- flexDirection: 'column',
625
- height: 500,
626
- border: 1,
627
- borderColor: 'divider',
628
- }}
629
- data-testid="text-editor-layout"
630
- >
631
- <Box sx={{ p: 2, borderBottom: 1, borderColor: 'divider', bgcolor: 'grey.50' }}>
632
- <Typography variant="h6">Code Editor</Typography>
633
- </Box>
634
-
635
- <Box sx={{ flex: 1, display: 'flex', overflow: 'hidden' }}>
636
- <Box
637
- sx={{ flex: 1, p: 2, bgcolor: 'grey.900', color: 'common.white' }}
638
- data-testid="code-area"
639
- >
640
- <Typography variant="body2" fontFamily="monospace">
641
- {/* Main editor content */}
642
- <br />
643
- function example() {'{'}
644
- <br />
645
- {' '}return &quot;Hello World&quot;;
646
- <br />
647
- {'}'}
648
- </Typography>
649
- </Box>
650
-
651
- <Resizable
652
- variant="vertical"
653
- width={300}
654
- height={200}
655
- minHeight={100}
656
- data-testid="resizable-console"
657
- >
658
- <Box sx={{ bgcolor: 'grey.100', height: '100%', p: 2 }}>
659
- <Typography variant="subtitle2" gutterBottom>
660
- Console Output
661
- </Typography>
662
- <Typography variant="body2" fontFamily="monospace" color="success.main">
663
- &gt; Hello World
664
- </Typography>
665
- </Box>
666
- </Resizable>
667
- </Box>
668
- </Box>
669
- ),
670
- parameters: {
671
- docs: {
672
- description: {
673
- story:
674
- 'Code editor layout with resizable console panel. The console can be resized vertically to show more or less output.',
675
- },
676
- },
677
- },
678
- };
679
-
680
- export const GridLayout: Story = {
681
- render: () => (
682
- <Box
683
- sx={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 2, p: 2, bgcolor: 'grey.50' }}
684
- data-testid="grid-layout"
685
- >
686
- <Resizable variant="both" width={250} height={150} data-testid="widget-1">
687
- <Paper sx={{ p: 2, height: '100%' }}>
688
- <Typography variant="h6">Widget 1</Typography>
689
- <Typography variant="caption">Resizable widget</Typography>
690
- </Paper>
691
- </Resizable>
692
-
693
- <Resizable variant="both" width={250} height={150} data-testid="widget-2">
694
- <Paper sx={{ p: 2, height: '100%', bgcolor: 'primary.50' }}>
695
- <Typography variant="h6">Widget 2</Typography>
696
- <Typography variant="caption">Another resizable widget</Typography>
697
- </Paper>
698
- </Resizable>
699
-
700
- <Resizable variant="both" width={250} height={150} data-testid="widget-3">
701
- <Paper sx={{ p: 2, height: '100%', bgcolor: 'secondary.50' }}>
702
- <Typography variant="h6">Widget 3</Typography>
703
- <Typography variant="caption">Dashboard component</Typography>
704
- </Paper>
705
- </Resizable>
706
-
707
- <Resizable variant="both" width={250} height={150} data-testid="widget-4">
708
- <Paper sx={{ p: 2, height: '100%', bgcolor: 'info.50' }}>
709
- <Typography variant="h6">Widget 4</Typography>
710
- <Typography variant="caption">Flexible layout</Typography>
711
- </Paper>
712
- </Resizable>
713
- </Box>
714
- ),
715
- parameters: {
716
- docs: {
717
- description: {
718
- story:
719
- 'Dashboard-style grid layout with multiple resizable widgets. Each widget can be independently resized in both dimensions.',
720
- },
721
- },
722
- },
723
- };
724
-
725
- // Required story exports for validation
726
-
727
- export const AllVariants: Story = {
728
- render: () => (
729
- <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, alignItems: 'center', p: 2 }}>
730
- <Typography variant="h6">All Resizable Variants</Typography>
731
-
732
- <Box sx={{ display: 'flex', gap: 2, flexWrap: 'wrap', justifyContent: 'center' }}>
733
- <Box>
734
- <Typography variant="subtitle2" gutterBottom>
735
- Horizontal Only
736
- </Typography>
737
- <Resizable variant="horizontal" width={200} height={100}>
738
- <Box sx={{ p: 2, bgcolor: 'primary.50', height: '100%', textAlign: 'center' }}>
739
- <Typography variant="caption">Horizontal</Typography>
740
- </Box>
741
- </Resizable>
742
- </Box>
743
-
744
- <Box>
745
- <Typography variant="subtitle2" gutterBottom>
746
- Vertical Only
747
- </Typography>
748
- <Resizable variant="vertical" width={200} height={100}>
749
- <Box sx={{ p: 2, bgcolor: 'secondary.50', height: '100%', textAlign: 'center' }}>
750
- <Typography variant="caption">Vertical</Typography>
751
- </Box>
752
- </Resizable>
753
- </Box>
754
-
755
- <Box>
756
- <Typography variant="subtitle2" gutterBottom>
757
- Both Directions
758
- </Typography>
759
- <Resizable variant="both" width={200} height={100}>
760
- <Box sx={{ p: 2, bgcolor: 'info.50', height: '100%', textAlign: 'center' }}>
761
- <Typography variant="caption">Both</Typography>
762
- </Box>
763
- </Resizable>
764
- </Box>
765
- </Box>
766
- </Box>
767
- ),
768
- parameters: {
769
- docs: {
770
- description: {
771
- story: 'Showcase of all resizable variants side by side.',
772
- },
773
- },
774
- },
775
- };
776
-
777
- export const AllSizes: Story = {
778
- render: () => (
779
- <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, alignItems: 'center', p: 2 }}>
780
- <Typography variant="h6">All Resizable Sizes</Typography>
781
-
782
- <Box
783
- sx={{
784
- display: 'flex',
785
- gap: 2,
786
- flexWrap: 'wrap',
787
- justifyContent: 'center',
788
- alignItems: 'flex-end',
789
- }}
790
- >
791
- <Box>
792
- <Typography variant="subtitle2" gutterBottom>
793
- Small
794
- </Typography>
795
- <Resizable variant="both" width={100} height={80}>
796
- <Box sx={{ p: 1, bgcolor: 'primary.50', height: '100%', textAlign: 'center' }}>
797
- <Typography variant="caption">Small</Typography>
798
- </Box>
799
- </Resizable>
800
- </Box>
801
-
802
- <Box>
803
- <Typography variant="subtitle2" gutterBottom>
804
- Medium
805
- </Typography>
806
- <Resizable variant="both" width={200} height={150}>
807
- <Box sx={{ p: 2, bgcolor: 'secondary.50', height: '100%', textAlign: 'center' }}>
808
- <Typography variant="body2">Medium</Typography>
809
- </Box>
810
- </Resizable>
811
- </Box>
812
-
813
- <Box>
814
- <Typography variant="subtitle2" gutterBottom>
815
- Large
816
- </Typography>
817
- <Resizable variant="both" width={300} height={200}>
818
- <Box sx={{ p: 2, bgcolor: 'info.50', height: '100%', textAlign: 'center' }}>
819
- <Typography variant="body1">Large</Typography>
820
- </Box>
821
- </Resizable>
822
- </Box>
823
- </Box>
824
- </Box>
825
- ),
826
- parameters: {
827
- docs: {
828
- description: {
829
- story: 'Resizable containers in different sizes.',
830
- },
831
- },
832
- },
833
- };
834
-
835
- export const AllStates: Story = {
836
- render: () => (
837
- <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, alignItems: 'center', p: 2 }}>
838
- <Typography variant="h6">All Resizable States</Typography>
839
-
840
- <Box sx={{ display: 'flex', gap: 2, flexWrap: 'wrap', justifyContent: 'center' }}>
841
- <Box>
842
- <Typography variant="subtitle2" gutterBottom>
843
- Default
844
- </Typography>
845
- <Resizable variant="both" width={150} height={100}>
846
- <Box sx={{ p: 2, bgcolor: 'grey.100', height: '100%', textAlign: 'center' }}>
847
- <Typography variant="caption">Default</Typography>
848
- </Box>
849
- </Resizable>
850
- </Box>
851
-
852
- <Box>
853
- <Typography variant="subtitle2" gutterBottom>
854
- Disabled
855
- </Typography>
856
- <Resizable variant="both" width={150} height={100} disabled>
857
- <Box sx={{ p: 2, bgcolor: 'grey.300', height: '100%', textAlign: 'center' }}>
858
- <Typography variant="caption" color="text.disabled">
859
- Disabled
860
- </Typography>
861
- </Box>
862
- </Resizable>
863
- </Box>
864
-
865
- <Box>
866
- <Typography variant="subtitle2" gutterBottom>
867
- With Constraints
868
- </Typography>
869
- <Resizable
870
- variant="both"
871
- width={150}
872
- height={100}
873
- minWidth={100}
874
- maxWidth={200}
875
- minHeight={80}
876
- maxHeight={150}
877
- >
878
- <Box sx={{ p: 2, bgcolor: 'warning.50', height: '100%', textAlign: 'center' }}>
879
- <Typography variant="caption">Constrained</Typography>
880
- </Box>
881
- </Resizable>
882
- </Box>
883
- </Box>
884
- </Box>
885
- ),
886
- parameters: {
887
- docs: {
888
- description: {
889
- story: 'Resizable containers in different states.',
890
- },
891
- },
892
- },
893
- };
894
-
895
- export const InteractiveStates: Story = {
896
- render: () => {
897
- const [hoveredId, setHoveredId] = useState<string | null>(null);
898
- const [activeId, setActiveId] = useState<string | null>(null);
899
-
900
- return (
901
- <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, alignItems: 'center', p: 2 }}>
902
- <Typography variant="h6">Interactive States</Typography>
903
-
904
- <Box sx={{ display: 'flex', gap: 2, flexWrap: 'wrap', justifyContent: 'center' }}>
905
- <Box onMouseEnter={() => setHoveredId('hover')} onMouseLeave={() => setHoveredId(null)}>
906
- <Typography variant="subtitle2" gutterBottom>
907
- Hover State
908
- </Typography>
909
- <Resizable variant="both" width={150} height={100}>
910
- <Box
911
- sx={{
912
- p: 2,
913
- bgcolor: hoveredId === 'hover' ? 'primary.100' : 'primary.50',
914
- height: '100%',
915
- textAlign: 'center',
916
- transition: 'background-color 0.3s',
917
- }}
918
- >
919
- <Typography variant="caption">
920
- {hoveredId === 'hover' ? 'Hovered' : 'Hover me'}
921
- </Typography>
922
- </Box>
923
- </Resizable>
924
- </Box>
925
-
926
- <Box onMouseDown={() => setActiveId('active')} onMouseUp={() => setActiveId(null)}>
927
- <Typography variant="subtitle2" gutterBottom>
928
- Active State
929
- </Typography>
930
- <Resizable variant="both" width={150} height={100}>
931
- <Box
932
- sx={{
933
- p: 2,
934
- bgcolor: activeId === 'active' ? 'secondary.200' : 'secondary.50',
935
- height: '100%',
936
- textAlign: 'center',
937
- transition: 'background-color 0.3s',
938
- }}
939
- >
940
- <Typography variant="caption">
941
- {activeId === 'active' ? 'Active' : 'Click me'}
942
- </Typography>
943
- </Box>
944
- </Resizable>
945
- </Box>
946
-
947
- <Box>
948
- <Typography variant="subtitle2" gutterBottom>
949
- Focus State
950
- </Typography>
951
- <Resizable variant="both" width={150} height={100}>
952
- <Box
953
- sx={{
954
- p: 2,
955
- bgcolor: 'info.50',
956
- height: '100%',
957
- textAlign: 'center',
958
- '&:focus-within': {
959
- bgcolor: 'info.100',
960
- },
961
- }}
962
- tabIndex={0}
963
- >
964
- <Typography variant="caption">Tab to focus</Typography>
965
- </Box>
966
- </Resizable>
967
- </Box>
968
- </Box>
969
- </Box>
970
- );
971
- },
972
- parameters: {
973
- docs: {
974
- description: {
975
- story: 'Interactive states demonstration with hover, active, and focus states.',
976
- },
977
- },
978
- },
979
- };
980
-
981
- export const Responsive: Story = {
982
- render: () => (
983
- <Box sx={{ p: 2 }}>
984
- <Typography variant="h6" gutterBottom>
985
- Responsive Resizable
986
- </Typography>
987
- <Typography variant="body2" color="text.secondary" paragraph>
988
- This resizable container adapts to different screen sizes
989
- </Typography>
990
-
991
- <Box
992
- sx={{
993
- display: 'flex',
994
- flexDirection: { xs: 'column', sm: 'row' },
995
- gap: 2,
996
- alignItems: 'center',
997
- }}
998
- >
999
- <Resizable variant="both" width={300} height={200} minWidth={150} maxWidth={500}>
1000
- <Box
1001
- sx={{
1002
- p: 2,
1003
- bgcolor: 'primary.50',
1004
- height: '100%',
1005
- display: 'flex',
1006
- flexDirection: 'column',
1007
- justifyContent: 'center',
1008
- alignItems: 'center',
1009
- }}
1010
- >
1011
- <Typography variant="h6">Responsive Container</Typography>
1012
- <Typography variant="body2" color="text.secondary">
1013
- Adapts to viewport size
1014
- </Typography>
1015
- <Typography variant="caption" sx={{ mt: 1 }}>
1016
- Min: 150px | Max: 500px
1017
- </Typography>
1018
- </Box>
1019
- </Resizable>
1020
-
1021
- <Box sx={{ flex: 1, p: 2, bgcolor: 'grey.100', borderRadius: 1 }}>
1022
- <Typography variant="body2">
1023
- Adjacent content that flows with the resizable container
1024
- </Typography>
1025
- </Box>
1026
- </Box>
1027
- </Box>
1028
- ),
1029
- parameters: {
1030
- docs: {
1031
- description: {
1032
- story: 'Responsive resizable container that adapts to different viewport sizes.',
1033
- },
1034
- },
1035
- viewport: {
1036
- defaultViewport: 'responsive',
1037
- },
1038
- },
1039
- };