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