@12-apps/ui 1.5.0 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +16 -8
- package/src/button/index.ts +1 -0
- package/src/social-login-button/index.ts +1 -0
- package/src/{social-login-button.tsx → social-login-button/social-login-button.tsx} +5 -5
- package/src/user-avatar/index.ts +1 -0
- package/src/{user-avatar.tsx → user-avatar/user-avatar.tsx} +4 -4
- package/eslint.config.js +0 -89
- package/src/__tests__/data-grid.test.tsx +0 -125
- package/src/__tests__/package-wiring.test.ts +0 -41
- package/src/__tests__/setup.ts +0 -1
- package/src/__tests__/social-login-button.test.tsx +0 -186
- package/src/__tests__/user-avatar.test.tsx +0 -195
- package/src/__tests__/viewport.test.ts +0 -50
- package/src/components/command/__tests__/command.test.tsx +0 -112
- package/src/components/data-display/Alert/Alert.stories.tsx +0 -559
- package/src/components/data-display/Alert/Alert.test.stories.tsx +0 -707
- package/src/components/data-display/AlertDialog/AlertDialog.stories.tsx +0 -362
- package/src/components/data-display/AlertDialog/AlertDialog.test.stories.tsx +0 -763
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.stories.tsx +0 -230
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.test.stories.tsx +0 -270
- package/src/components/data-display/Avatar/Avatar.stories.tsx +0 -721
- package/src/components/data-display/Avatar/Avatar.test.stories.tsx +0 -822
- package/src/components/data-display/Badge/Badge.stories.tsx +0 -1134
- package/src/components/data-display/Badge/Badge.test.stories.tsx +0 -1194
- package/src/components/data-display/Banner/Banner.stories.tsx +0 -528
- package/src/components/data-display/Banner/Banner.test.stories.tsx +0 -511
- package/src/components/data-display/Carousel/Carousel.stories.tsx +0 -607
- package/src/components/data-display/Carousel/Carousel.test.stories.tsx +0 -701
- package/src/components/data-display/Chart/Chart.stories.tsx +0 -568
- package/src/components/data-display/Chart/Chart.test.stories.tsx +0 -174
- package/src/components/data-display/Chart/SpecChart.stories.tsx +0 -150
- package/src/components/data-display/Chart/SpecChart.test.stories.tsx +0 -56
- package/src/components/data-display/Chart/__tests__/SpecChart.test.tsx +0 -60
- package/src/components/data-display/Chart/__tests__/chart-format.test.ts +0 -43
- package/src/components/data-display/Chart/__tests__/chart-spec.test.ts +0 -119
- package/src/components/data-display/Chip/Chip.stories.tsx +0 -252
- package/src/components/data-display/Chip/Chip.test.stories.tsx +0 -266
- package/src/components/data-display/DataGrid/DataGrid.stories.tsx +0 -515
- package/src/components/data-display/DataGrid/DataGrid.test.stories.tsx +0 -653
- package/src/components/data-display/DataViews/__tests__/DataViewsGrid.test.tsx +0 -271
- package/src/components/data-display/DataViews/__tests__/DataViewsTableBase.test.tsx +0 -134
- package/src/components/data-display/DataViews/__tests__/SaveViewModal.test.tsx +0 -83
- package/src/components/data-display/DataViews/__tests__/data-views-filter.test.ts +0 -115
- package/src/components/data-display/DataViews/__tests__/data-views-preview.test.ts +0 -53
- package/src/components/data-display/DataViews/__tests__/range-pill.test.tsx +0 -114
- package/src/components/data-display/DataViews/base-card.stories.tsx +0 -136
- package/src/components/data-display/DescriptionItem/DescriptionItem.stories.tsx +0 -254
- package/src/components/data-display/EmptyState/EmptyState.stories.tsx +0 -282
- package/src/components/data-display/EmptyState/EmptyState.test.stories.tsx +0 -441
- package/src/components/data-display/ErrorState/ErrorState.stories.tsx +0 -110
- package/src/components/data-display/ErrorState/ErrorState.test.stories.tsx +0 -133
- package/src/components/data-display/HoverCard/HoverCard.stories.tsx +0 -650
- package/src/components/data-display/HoverCard/HoverCard.test.stories.tsx +0 -929
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.stories.tsx +0 -411
- package/src/components/data-display/LazyImage/LazyImage.stories.tsx +0 -387
- package/src/components/data-display/Lightbox/Lightbox.stories.tsx +0 -315
- package/src/components/data-display/Lightbox/Lightbox.test.stories.tsx +0 -598
- package/src/components/data-display/LoadingState/LoadingState.stories.tsx +0 -124
- package/src/components/data-display/LoadingState/LoadingState.test.stories.tsx +0 -99
- package/src/components/data-display/MapPreview/MapPreview.stories.tsx +0 -458
- package/src/components/data-display/MapPreview/MapPreview.test.stories.tsx +0 -394
- package/src/components/data-display/Popover/Popover.stories.tsx +0 -295
- package/src/components/data-display/Popover/Popover.test.stories.tsx +0 -1162
- package/src/components/data-display/Progress/Progress.stories.tsx +0 -481
- package/src/components/data-display/Progress/Progress.test.stories.tsx +0 -2070
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.stories.tsx +0 -160
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.test.stories.tsx +0 -190
- package/src/components/data-display/Sheet/Sheet.stories.tsx +0 -883
- package/src/components/data-display/Sheet/Sheet.test.stories.tsx +0 -1105
- package/src/components/data-display/StatCard/StatCard.stories.tsx +0 -167
- package/src/components/data-display/StatCard/StatCard.test.stories.tsx +0 -240
- package/src/components/data-display/Stepper/Stepper.stories.tsx +0 -540
- package/src/components/data-display/Stepper/Stepper.test.stories.tsx +0 -600
- package/src/components/data-display/Table/Table.stories.tsx +0 -803
- package/src/components/data-display/Table/Table.test.stories.tsx +0 -369
- package/src/components/data-display/Timeline/Timeline.stories.tsx +0 -442
- package/src/components/data-display/Timeline/Timeline.test.stories.tsx +0 -930
- package/src/components/data-display/TimingDiagram/TimingDiagram.stories.tsx +0 -475
- package/src/components/data-display/TimingDiagram/TimingDiagram.test.stories.tsx +0 -734
- package/src/components/data-display/Tooltip/Tooltip.stories.tsx +0 -468
- package/src/components/data-display/Tooltip/Tooltip.test.stories.tsx +0 -1154
- package/src/components/feedback/ConfirmAction/ConfirmAction.stories.tsx +0 -146
- package/src/components/feedback/ConfirmAction/ConfirmAction.test.stories.tsx +0 -114
- package/src/components/feedback/ConfirmAction/__tests__/confirm-action.test.tsx +0 -288
- package/src/components/feedback/Dialog/Dialog.stories.tsx +0 -833
- package/src/components/feedback/Dialog/Dialog.test.stories.tsx +0 -964
- package/src/components/feedback/Dialog/__tests__/dialog-content-spacing.test.tsx +0 -66
- package/src/components/feedback/Modal/Modal.stories.tsx +0 -765
- package/src/components/feedback/Modal/Modal.test.stories.tsx +0 -251
- package/src/components/feedback/Sonner/Sonner.stories.tsx +0 -698
- package/src/components/feedback/Sonner/Sonner.test.stories.tsx +0 -896
- package/src/components/feedback/StackedModal/StackedModal.stories.tsx +0 -1783
- package/src/components/feedback/StackedModal/StackedModal.test.stories.tsx +0 -973
- package/src/components/feedback/StackedModal/__tests__/stacked-modal-viewport.test.tsx +0 -104
- package/src/components/feedback/Toast/Toast.stories.tsx +0 -548
- package/src/components/feedback/Toast/Toast.test.stories.tsx +0 -834
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.stories.tsx +0 -691
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.test.stories.tsx +0 -634
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.stories.tsx +0 -665
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.test.stories.tsx +0 -727
- package/src/components/form/Autocomplete/Autocomplete.stories.tsx +0 -715
- package/src/components/form/Autocomplete/Autocomplete.test.stories.tsx +0 -825
- package/src/components/form/Button/Button.stories.tsx +0 -365
- package/src/components/form/Button/Button.test.stories.tsx +0 -607
- package/src/components/form/Calendar/Calendar.stories.tsx +0 -349
- package/src/components/form/Calendar/Calendar.test.stories.tsx +0 -464
- package/src/components/form/CepField/CepField.stories.tsx +0 -138
- package/src/components/form/CepField/CepField.test.stories.tsx +0 -281
- package/src/components/form/Checkbox/Checkbox.stories.tsx +0 -265
- package/src/components/form/Checkbox/Checkbox.test.stories.tsx +0 -181
- package/src/components/form/CodeEditor/CodeEditor.stories.tsx +0 -871
- package/src/components/form/CodeEditor/CodeEditor.test.stories.tsx +0 -574
- package/src/components/form/Command/Command.stories.tsx +0 -580
- package/src/components/form/Command/Command.test.stories.tsx +0 -215
- package/src/components/form/CreatableSelect/CreatableSelect.stories.tsx +0 -112
- package/src/components/form/CreatableSelect/CreatableSelect.test.stories.tsx +0 -134
- package/src/components/form/Form/Form.stories.tsx +0 -687
- package/src/components/form/Form/Form.test.stories.tsx +0 -601
- package/src/components/form/Input/Input.stories.tsx +0 -260
- package/src/components/form/Input/Input.test.stories.tsx +0 -1191
- package/src/components/form/InputOTP/InputOTP.stories.tsx +0 -774
- package/src/components/form/InputOTP/InputOTP.test.stories.tsx +0 -588
- package/src/components/form/Label/Label.stories.tsx +0 -473
- package/src/components/form/Label/Label.test.stories.tsx +0 -915
- package/src/components/form/Menubar/Menubar.stories.tsx +0 -472
- package/src/components/form/Menubar/Menubar.test.stories.tsx +0 -584
- package/src/components/form/PasswordStrength/PasswordStrength.stories.tsx +0 -562
- package/src/components/form/PasswordStrength/PasswordStrength.test.stories.tsx +0 -327
- package/src/components/form/PhoneInput/PhoneInput.stories.tsx +0 -495
- package/src/components/form/PhoneInput/PhoneInput.test.stories.tsx +0 -666
- package/src/components/form/RadioGroup/RadioGroup.stories.tsx +0 -518
- package/src/components/form/RadioGroup/RadioGroup.test.stories.tsx +0 -685
- package/src/components/form/RichTextEditor/RichTextEditor.stories.tsx +0 -261
- package/src/components/form/RichTextEditor/RichTextEditor.test.stories.tsx +0 -491
- package/src/components/form/SearchPalette/SearchPalette.stories.tsx +0 -135
- package/src/components/form/Select/Select.stories.tsx +0 -364
- package/src/components/form/Select/Select.test.stories.tsx +0 -985
- package/src/components/form/Slider/Slider.stories.tsx +0 -418
- package/src/components/form/Slider/Slider.test.stories.tsx +0 -1042
- package/src/components/form/Switch/Switch.stories.tsx +0 -697
- package/src/components/form/Switch/Switch.test.stories.tsx +0 -597
- package/src/components/form/Textarea/Textarea.stories.tsx +0 -473
- package/src/components/form/Textarea/Textarea.test.stories.tsx +0 -702
- package/src/components/form/Toggle/Toggle.stories.tsx +0 -638
- package/src/components/form/Toggle/Toggle.test.stories.tsx +0 -1159
- package/src/components/form/ToggleGroup/ToggleGroup.stories.tsx +0 -617
- package/src/components/form/ToggleGroup/ToggleGroup.test.stories.tsx +0 -915
- package/src/components/form/UploadButton/UploadButton.stories.tsx +0 -367
- package/src/components/form/UploadButton/UploadButton.test.stories.tsx +0 -573
- package/src/components/form/total-form/total-form.test.tsx +0 -214
- package/src/components/layout/Accordion/Accordion.stories.tsx +0 -694
- package/src/components/layout/Accordion/Accordion.test.stories.tsx +0 -1344
- package/src/components/layout/Card/Card.stories.tsx +0 -591
- package/src/components/layout/Card/Card.test.stories.tsx +0 -1134
- package/src/components/layout/CardGrid/__tests__/CardGrid.test.tsx +0 -92
- package/src/components/layout/Collapsible/Collapsible.stories.tsx +0 -180
- package/src/components/layout/Collapsible/Collapsible.test.stories.tsx +0 -308
- package/src/components/layout/Container/Container.stories.tsx +0 -557
- package/src/components/layout/Container/Container.test.stories.tsx +0 -745
- package/src/components/layout/ContentToolbar/ContentToolbar.stories.tsx +0 -129
- package/src/components/layout/ContentToolbar/ContentToolbar.test.stories.tsx +0 -251
- package/src/components/layout/ContentToolbar/__tests__/ColumnsMenu.test.tsx +0 -39
- package/src/components/layout/ContentToolbar/__tests__/MultiSelectDropdown.test.tsx +0 -131
- package/src/components/layout/ContentToolbar/__tests__/SavedViewsMenu.test.tsx +0 -99
- package/src/components/layout/Dashboard/Dashboard.stories.tsx +0 -104
- package/src/components/layout/Dashboard/Dashboard.test.stories.tsx +0 -190
- package/src/components/layout/Drawer/Drawer.stories.tsx +0 -658
- package/src/components/layout/Drawer/Drawer.test.stories.tsx +0 -1343
- package/src/components/layout/Resizable/Resizable.stories.tsx +0 -1039
- package/src/components/layout/Resizable/Resizable.test.stories.tsx +0 -754
- package/src/components/layout/ScrollArea/ScrollArea.stories.tsx +0 -651
- package/src/components/layout/ScrollArea/ScrollArea.test.stories.tsx +0 -619
- package/src/components/layout/Separator/Separator.stories.tsx +0 -563
- package/src/components/layout/Separator/Separator.test.stories.tsx +0 -518
- package/src/components/layout/SettingsLayout/SettingsLayout.stories.tsx +0 -192
- package/src/components/layout/SettingsLayout/SettingsLayout.test.stories.tsx +0 -175
- package/src/components/layout/Sidebar/Sidebar.stories.tsx +0 -609
- package/src/components/layout/Sidebar/Sidebar.test.stories.tsx +0 -1324
- package/src/components/layout/Skeleton/Skeleton.stories.tsx +0 -689
- package/src/components/layout/Skeleton/Skeleton.test.stories.tsx +0 -521
- package/src/components/layout/Spacer/Spacer.stories.tsx +0 -502
- package/src/components/layout/Spacer/Spacer.test.stories.tsx +0 -474
- package/src/components/layout/TableFilter/TableFilter.stories.tsx +0 -82
- package/src/components/layout/TableFilter/TableFilter.test.stories.tsx +0 -87
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.stories.tsx +0 -638
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.test.stories.tsx +0 -1008
- package/src/components/navigation/CommandPalette/CommandPalette.stories.tsx +0 -386
- package/src/components/navigation/CommandPalette/CommandPalette.test.stories.tsx +0 -435
- package/src/components/navigation/ContextMenu/ContextMenu.stories.tsx +0 -614
- package/src/components/navigation/ContextMenu/ContextMenu.test.stories.tsx +0 -845
- package/src/components/navigation/DropdownMenu/DropdownMenu.stories.tsx +0 -578
- package/src/components/navigation/DropdownMenu/DropdownMenu.test.stories.tsx +0 -660
- package/src/components/navigation/NavigationMenu/stories/NavigationMenu.stories.tsx +0 -516
- package/src/components/navigation/NavigationMenu/stories/NavigationMenu.test.stories.tsx +0 -935
- package/src/components/navigation/NavigationMenu/stories/NavigationMenuHorizontal.stories.tsx +0 -501
- package/src/components/navigation/NavigationMenu/stories/NavigationMenuVertical.stories.tsx +0 -453
- package/src/components/navigation/Pagination/Pagination.stories.tsx +0 -602
- package/src/components/navigation/Pagination/Pagination.test.stories.tsx +0 -520
- package/src/components/navigation/Tabs/Tabs.stories.tsx +0 -1004
- package/src/components/navigation/Tabs/Tabs.test.stories.tsx +0 -1225
- package/src/components/typography/Blockquote/Blockquote.stories.tsx +0 -359
- package/src/components/typography/Blockquote/Blockquote.test.stories.tsx +0 -432
- package/src/components/typography/Code/Code.stories.tsx +0 -686
- package/src/components/typography/Code/Code.test.stories.tsx +0 -703
- package/src/components/typography/Heading/Heading.stories.tsx +0 -451
- package/src/components/typography/Heading/Heading.test.stories.tsx +0 -830
- package/src/components/typography/Paragraph/Paragraph.stories.tsx +0 -280
- package/src/components/typography/Paragraph/Paragraph.test.stories.tsx +0 -231
- package/src/components/typography/Text/Text.stories.tsx +0 -359
- package/src/components/typography/Text/Text.test.stories.tsx +0 -759
- package/src/components/utility/AnimatedIcon/AnimatedIcon.stories.tsx +0 -945
- package/src/components/utility/AnimatedIcon/AnimatedIcon.test.stories.tsx +0 -603
- package/src/components/utility/AspectRatio/AspectRatio.stories.tsx +0 -414
- package/src/components/utility/AspectRatio/AspectRatio.test.stories.tsx +0 -859
- package/src/components/utility/InfiniteScroll/InfiniteScroll.stories.tsx +0 -620
- package/src/components/utility/InfiniteScroll/InfiniteScroll.test.stories.tsx +0 -361
- package/src/components/utility/InstallPrompt/InstallPrompt.stories.tsx +0 -118
- package/src/components/utility/InstallPrompt/InstallPrompt.test.stories.tsx +0 -83
- package/src/components/utility/InstallPrompt/__tests__/InstallPrompt.ios.test.tsx +0 -65
- package/src/components/utility/InstallPrompt/__tests__/usePwaInstall.test.tsx +0 -271
- package/src/components/utility/Portal/Portal.stories.tsx +0 -340
- package/src/components/utility/Portal/Portal.test.stories.tsx +0 -2086
- package/src/components/utility/Transition/Transition.stories.tsx +0 -493
- package/src/components/utility/Transition/Transition.test.stories.tsx +0 -854
- package/src/components/utility/VirtualList/VirtualList.stories.tsx +0 -1073
- package/src/components/utility/VirtualList/VirtualList.test.stories.tsx +0 -1085
- package/src/components/utility/WorkflowStep/WorkflowStep.stories.tsx +0 -431
- package/src/components/utility/WorkflowStep/WorkflowStep.test.stories.tsx +0 -364
- /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 "Hello World";
|
|
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
|
-
> 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
|
-
};
|