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,1060 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import React, { useState } from "react"
|
|
3
|
+
import { Badge } from "@components/badge"
|
|
4
|
+
import { Button } from "@components/button"
|
|
5
|
+
import { Checkbox } from "@components/checkbox"
|
|
6
|
+
import { IconButton } from "@components/icon-button"
|
|
7
|
+
import Input from "@components/input"
|
|
8
|
+
import { Label } from "@components/label"
|
|
9
|
+
import Textarea from "@components/textarea"
|
|
10
|
+
import { AlertIcon } from "@icons/alert-icon"
|
|
11
|
+
import { ArrowRightIcon } from "@icons/arrow-right-icon"
|
|
12
|
+
import { ChevronRightIcon } from "@icons/chevron-right-icon"
|
|
13
|
+
import { FeatureShineIcon } from "@icons/feature-shine-icon"
|
|
14
|
+
import { FileChartIcon } from "@icons/file-chart-icon"
|
|
15
|
+
import { MagicBookIcon } from "@icons/magic-book-icon"
|
|
16
|
+
import { MaintenanceIcon } from "@icons/maintenance-icon"
|
|
17
|
+
import { SearchIcon } from "@icons/search-icon"
|
|
18
|
+
import { SiteLogoIcon } from "@icons/site-logo-icon"
|
|
19
|
+
import { TickCircleIcon } from "@icons/tick-circle-icon"
|
|
20
|
+
import type { Meta, StoryObj } from "@storybook/react"
|
|
21
|
+
|
|
22
|
+
import {
|
|
23
|
+
Sheet,
|
|
24
|
+
SheetClose,
|
|
25
|
+
SheetContent,
|
|
26
|
+
SheetDescription,
|
|
27
|
+
SheetFooter,
|
|
28
|
+
SheetHeader,
|
|
29
|
+
SheetTitle,
|
|
30
|
+
SheetTrigger,
|
|
31
|
+
} from "."
|
|
32
|
+
|
|
33
|
+
const meta: Meta<typeof Sheet> = {
|
|
34
|
+
title: "Components/UI/Sheet",
|
|
35
|
+
component: Sheet,
|
|
36
|
+
parameters: {
|
|
37
|
+
layout: "fullscreen",
|
|
38
|
+
backgrounds: {
|
|
39
|
+
default: "dark",
|
|
40
|
+
values: [
|
|
41
|
+
{ name: "dark", value: "#0a0a0a" },
|
|
42
|
+
{ name: "light", value: "#ffffff" },
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
docs: {
|
|
46
|
+
description: {
|
|
47
|
+
component: `
|
|
48
|
+
# Sheet Component
|
|
49
|
+
|
|
50
|
+
A slide-out panel component built on Radix UI Dialog primitives that provides a drawer-like interface for displaying content from different sides of the screen.
|
|
51
|
+
|
|
52
|
+
## Features
|
|
53
|
+
|
|
54
|
+
- **Multiple Sides**: Sheet can slide in from top, right, bottom, or left
|
|
55
|
+
- **Variant Colors**: Neutral, positive, negative, warning, and info color variants
|
|
56
|
+
- **Customizable Overlays**: Configurable opacity, glass effects, and noise textures
|
|
57
|
+
- **Smooth Animations**: Slide animations with proper easing for each direction
|
|
58
|
+
- **Accessible**: Full keyboard navigation and screen reader support
|
|
59
|
+
- **Flexible Content**: Header, footer, and body sections with custom styling
|
|
60
|
+
- **Auto Close Button**: Positioned close button with CrossIcon
|
|
61
|
+
- **Portal Rendering**: Renders outside normal DOM hierarchy
|
|
62
|
+
- **Focus Management**: Automatic focus trapping and restoration
|
|
63
|
+
- **Border Accents**: Colored borders that match the variant
|
|
64
|
+
|
|
65
|
+
## Component Structure
|
|
66
|
+
|
|
67
|
+
- **Sheet**: Root component that manages sheet state
|
|
68
|
+
- **SheetTrigger**: Button or element that opens the sheet
|
|
69
|
+
- **SheetContent**: Main sheet container with overlay, content, and close button
|
|
70
|
+
- **SheetHeader**: Header section for title and description
|
|
71
|
+
- **SheetFooter**: Footer section for action buttons
|
|
72
|
+
- **SheetTitle**: Accessible title element
|
|
73
|
+
- **SheetDescription**: Optional description text
|
|
74
|
+
- **SheetClose**: Close button component
|
|
75
|
+
|
|
76
|
+
## Usage Examples
|
|
77
|
+
|
|
78
|
+
### Basic Sheet
|
|
79
|
+
\`\`\`tsx
|
|
80
|
+
<Sheet>
|
|
81
|
+
<SheetTrigger asChild>
|
|
82
|
+
<Button>Open Sheet</Button>
|
|
83
|
+
</SheetTrigger>
|
|
84
|
+
<SheetContent>
|
|
85
|
+
<SheetHeader>
|
|
86
|
+
<SheetTitle>Sheet Title</SheetTitle>
|
|
87
|
+
<SheetDescription>Sheet description text.</SheetDescription>
|
|
88
|
+
</SheetHeader>
|
|
89
|
+
<div>Sheet content goes here.</div>
|
|
90
|
+
<SheetFooter>
|
|
91
|
+
<SheetClose asChild>
|
|
92
|
+
<Button variant="outline">Cancel</Button>
|
|
93
|
+
</SheetClose>
|
|
94
|
+
<Button>Confirm</Button>
|
|
95
|
+
</SheetFooter>
|
|
96
|
+
</SheetContent>
|
|
97
|
+
</Sheet>
|
|
98
|
+
\`\`\`
|
|
99
|
+
|
|
100
|
+
### Sheet from Different Sides
|
|
101
|
+
\`\`\`tsx
|
|
102
|
+
<SheetContent side="left">
|
|
103
|
+
{/* Left side sheet */}
|
|
104
|
+
</SheetContent>
|
|
105
|
+
|
|
106
|
+
<SheetContent side="right">
|
|
107
|
+
{/* Right side sheet (default) */}
|
|
108
|
+
</SheetContent>
|
|
109
|
+
|
|
110
|
+
<SheetContent side="top">
|
|
111
|
+
{/* Top side sheet */}
|
|
112
|
+
</SheetContent>
|
|
113
|
+
|
|
114
|
+
<SheetContent side="bottom">
|
|
115
|
+
{/* Bottom side sheet */}
|
|
116
|
+
</SheetContent>
|
|
117
|
+
\`\`\`
|
|
118
|
+
|
|
119
|
+
### Colored Variants
|
|
120
|
+
\`\`\`tsx
|
|
121
|
+
<SheetContent variant="positive">
|
|
122
|
+
{/* Success/positive themed sheet */}
|
|
123
|
+
</SheetContent>
|
|
124
|
+
|
|
125
|
+
<SheetContent variant="negative">
|
|
126
|
+
{/* Error/negative themed sheet */}
|
|
127
|
+
</SheetContent>
|
|
128
|
+
|
|
129
|
+
<SheetContent variant="warning">
|
|
130
|
+
{/* Warning themed sheet */}
|
|
131
|
+
</SheetContent>
|
|
132
|
+
|
|
133
|
+
<SheetContent variant="info">
|
|
134
|
+
{/* Info themed sheet */}
|
|
135
|
+
</SheetContent>
|
|
136
|
+
\`\`\`
|
|
137
|
+
|
|
138
|
+
### Custom Overlay
|
|
139
|
+
\`\`\`tsx
|
|
140
|
+
<SheetContent opacity="high" glass="medium" noise="low">
|
|
141
|
+
{/* High opacity overlay with glass effect and subtle noise */}
|
|
142
|
+
</SheetContent>
|
|
143
|
+
\`\`\`
|
|
144
|
+
`,
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
tags: ["autodocs"],
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export default meta
|
|
152
|
+
type Story = StoryObj<typeof Sheet>
|
|
153
|
+
|
|
154
|
+
// Demo background content
|
|
155
|
+
const BackgroundContent = () => (
|
|
156
|
+
<div className="min-h-screen bg-gradient-to-br from-blue-900 via-purple-900 to-pink-900 p-8">
|
|
157
|
+
<div className="mx-auto max-w-4xl space-y-8">
|
|
158
|
+
<header className="text-center">
|
|
159
|
+
<h1 className="mb-4 text-4xl font-bold text-white">
|
|
160
|
+
Main Content Area
|
|
161
|
+
</h1>
|
|
162
|
+
<p className="text-white/80">
|
|
163
|
+
This is the main content that sits behind the sheet overlay
|
|
164
|
+
</p>
|
|
165
|
+
</header>
|
|
166
|
+
|
|
167
|
+
<div className="grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3">
|
|
168
|
+
{Array.from({ length: 6 }, (_, i) => (
|
|
169
|
+
<div
|
|
170
|
+
key={i}
|
|
171
|
+
className="rounded-lg border border-white/20 bg-white/10 p-6"
|
|
172
|
+
>
|
|
173
|
+
<h3 className="mb-2 text-lg font-semibold text-white">
|
|
174
|
+
Content Block {i + 1}
|
|
175
|
+
</h3>
|
|
176
|
+
<p className="mb-4 text-sm text-white/70">
|
|
177
|
+
Sample content that demonstrates the sheet overlay effect
|
|
178
|
+
</p>
|
|
179
|
+
<Button size="sm" variant="outline">
|
|
180
|
+
Action
|
|
181
|
+
</Button>
|
|
182
|
+
</div>
|
|
183
|
+
))}
|
|
184
|
+
</div>
|
|
185
|
+
</div>
|
|
186
|
+
</div>
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
// 1. Sheet Sides and Variants
|
|
190
|
+
export const SidesAndVariants: Story = {
|
|
191
|
+
render: () => (
|
|
192
|
+
<div className="relative">
|
|
193
|
+
<BackgroundContent />
|
|
194
|
+
|
|
195
|
+
{/* Control Panel */}
|
|
196
|
+
<div className="fixed top-4 left-1/2 z-50 -translate-x-1/2 transform">
|
|
197
|
+
<div className="space-y-4 rounded-lg bg-black/80 p-6 backdrop-blur-sm">
|
|
198
|
+
<h3 className="text-center text-sm font-medium text-white">
|
|
199
|
+
Sheet Sides & Variants
|
|
200
|
+
</h3>
|
|
201
|
+
|
|
202
|
+
{/* Sides */}
|
|
203
|
+
<div className="space-y-2">
|
|
204
|
+
<h4 className="text-xs font-medium tracking-wide text-white/70 uppercase">
|
|
205
|
+
Sides
|
|
206
|
+
</h4>
|
|
207
|
+
<div className="grid grid-cols-2 gap-2">
|
|
208
|
+
{/* Left Sheet - Neutral */}
|
|
209
|
+
<Sheet>
|
|
210
|
+
<SheetTrigger asChild>
|
|
211
|
+
<Button size="sm" variant="outline">
|
|
212
|
+
Left
|
|
213
|
+
</Button>
|
|
214
|
+
</SheetTrigger>
|
|
215
|
+
<SheetContent side="left" variant="neutral">
|
|
216
|
+
<SheetHeader>
|
|
217
|
+
<SheetTitle>Left Side Sheet</SheetTitle>
|
|
218
|
+
<SheetDescription>
|
|
219
|
+
Slides in from the left with neutral styling
|
|
220
|
+
</SheetDescription>
|
|
221
|
+
</SheetHeader>
|
|
222
|
+
<div className="py-4">
|
|
223
|
+
<div className="space-y-4">
|
|
224
|
+
<div className="rounded-lg bg-white/5 p-4">
|
|
225
|
+
<h4 className="mb-2 font-medium text-white">
|
|
226
|
+
Navigation Menu
|
|
227
|
+
</h4>
|
|
228
|
+
<div className="space-y-2">
|
|
229
|
+
{["Dashboard", "Projects", "Team", "Settings"].map(
|
|
230
|
+
(item) => (
|
|
231
|
+
<div
|
|
232
|
+
key={item}
|
|
233
|
+
className="flex items-center gap-3 rounded p-2 hover:bg-white/10"
|
|
234
|
+
>
|
|
235
|
+
<SiteLogoIcon className="h-4 w-4 text-white/60" />
|
|
236
|
+
<span className="text-white">{item}</span>
|
|
237
|
+
</div>
|
|
238
|
+
)
|
|
239
|
+
)}
|
|
240
|
+
</div>
|
|
241
|
+
</div>
|
|
242
|
+
</div>
|
|
243
|
+
</div>
|
|
244
|
+
</SheetContent>
|
|
245
|
+
</Sheet>
|
|
246
|
+
|
|
247
|
+
{/* Right Sheet - Positive */}
|
|
248
|
+
<Sheet>
|
|
249
|
+
<SheetTrigger asChild>
|
|
250
|
+
<Button size="sm" variant="outline">
|
|
251
|
+
Right
|
|
252
|
+
</Button>
|
|
253
|
+
</SheetTrigger>
|
|
254
|
+
<SheetContent side="right" variant="positive">
|
|
255
|
+
<SheetHeader>
|
|
256
|
+
<SheetTitle>Right Side Sheet</SheetTitle>
|
|
257
|
+
<SheetDescription>
|
|
258
|
+
Slides in from the right with positive styling
|
|
259
|
+
</SheetDescription>
|
|
260
|
+
</SheetHeader>
|
|
261
|
+
<div className="py-4">
|
|
262
|
+
<div className="rounded-lg border border-green-500/20 bg-green-500/10 p-4">
|
|
263
|
+
<div className="mb-2 flex items-center gap-2">
|
|
264
|
+
<TickCircleIcon className="h-5 w-5 text-green-400" />
|
|
265
|
+
<h4 className="font-medium text-white">
|
|
266
|
+
Success Panel
|
|
267
|
+
</h4>
|
|
268
|
+
</div>
|
|
269
|
+
<p className="text-sm text-white/80">
|
|
270
|
+
This demonstrates the positive variant with green accent
|
|
271
|
+
border.
|
|
272
|
+
</p>
|
|
273
|
+
</div>
|
|
274
|
+
</div>
|
|
275
|
+
</SheetContent>
|
|
276
|
+
</Sheet>
|
|
277
|
+
|
|
278
|
+
{/* Top Sheet - Warning */}
|
|
279
|
+
<Sheet>
|
|
280
|
+
<SheetTrigger asChild>
|
|
281
|
+
<Button size="sm" variant="outline">
|
|
282
|
+
Top
|
|
283
|
+
</Button>
|
|
284
|
+
</SheetTrigger>
|
|
285
|
+
<SheetContent side="top" variant="warning">
|
|
286
|
+
<SheetHeader>
|
|
287
|
+
<SheetTitle>Top Side Sheet</SheetTitle>
|
|
288
|
+
<SheetDescription>
|
|
289
|
+
Slides down from the top with warning styling
|
|
290
|
+
</SheetDescription>
|
|
291
|
+
</SheetHeader>
|
|
292
|
+
<div className="py-4">
|
|
293
|
+
<div className="rounded-lg border border-yellow-500/20 bg-yellow-500/10 p-4">
|
|
294
|
+
<div className="mb-2 flex items-center gap-2">
|
|
295
|
+
<AlertIcon className="h-5 w-5 text-yellow-400" />
|
|
296
|
+
<h4 className="font-medium text-white">
|
|
297
|
+
Warning Notice
|
|
298
|
+
</h4>
|
|
299
|
+
</div>
|
|
300
|
+
<p className="text-sm text-white/80">
|
|
301
|
+
Top sheets are great for notifications and warnings.
|
|
302
|
+
</p>
|
|
303
|
+
</div>
|
|
304
|
+
</div>
|
|
305
|
+
</SheetContent>
|
|
306
|
+
</Sheet>
|
|
307
|
+
|
|
308
|
+
{/* Bottom Sheet - Info */}
|
|
309
|
+
<Sheet>
|
|
310
|
+
<SheetTrigger asChild>
|
|
311
|
+
<Button size="sm" variant="outline">
|
|
312
|
+
Bottom
|
|
313
|
+
</Button>
|
|
314
|
+
</SheetTrigger>
|
|
315
|
+
<SheetContent side="bottom" variant="info">
|
|
316
|
+
<SheetHeader>
|
|
317
|
+
<SheetTitle>Bottom Side Sheet</SheetTitle>
|
|
318
|
+
<SheetDescription>
|
|
319
|
+
Slides up from the bottom with info styling
|
|
320
|
+
</SheetDescription>
|
|
321
|
+
</SheetHeader>
|
|
322
|
+
<div className="py-4">
|
|
323
|
+
<div className="rounded-lg border border-blue-500/20 bg-blue-500/10 p-4">
|
|
324
|
+
<div className="mb-2 flex items-center gap-2">
|
|
325
|
+
<FileChartIcon className="h-5 w-5 text-blue-400" />
|
|
326
|
+
<h4 className="font-medium text-white">
|
|
327
|
+
Information Panel
|
|
328
|
+
</h4>
|
|
329
|
+
</div>
|
|
330
|
+
<p className="text-sm text-white/80">
|
|
331
|
+
Bottom sheets work well for mobile-style interactions.
|
|
332
|
+
</p>
|
|
333
|
+
</div>
|
|
334
|
+
</div>
|
|
335
|
+
</SheetContent>
|
|
336
|
+
</Sheet>
|
|
337
|
+
</div>
|
|
338
|
+
</div>
|
|
339
|
+
|
|
340
|
+
{/* Error Variant */}
|
|
341
|
+
<div className="space-y-2">
|
|
342
|
+
<h4 className="text-xs font-medium tracking-wide text-white/70 uppercase">
|
|
343
|
+
Error Variant
|
|
344
|
+
</h4>
|
|
345
|
+
<Sheet>
|
|
346
|
+
<SheetTrigger asChild>
|
|
347
|
+
<Button size="sm" variant="outline">
|
|
348
|
+
Error Sheet
|
|
349
|
+
</Button>
|
|
350
|
+
</SheetTrigger>
|
|
351
|
+
<SheetContent side="right" variant="negative">
|
|
352
|
+
<SheetHeader>
|
|
353
|
+
<SheetTitle>Error Sheet</SheetTitle>
|
|
354
|
+
<SheetDescription>
|
|
355
|
+
Demonstrates the negative variant for error states
|
|
356
|
+
</SheetDescription>
|
|
357
|
+
</SheetHeader>
|
|
358
|
+
<div className="py-4">
|
|
359
|
+
<div className="rounded-lg border border-red-500/20 bg-red-500/10 p-4">
|
|
360
|
+
<div className="mb-2 flex items-center gap-2">
|
|
361
|
+
<AlertIcon className="h-5 w-5 text-red-400" />
|
|
362
|
+
<h4 className="font-medium text-white">Error Details</h4>
|
|
363
|
+
</div>
|
|
364
|
+
<p className="mb-3 text-sm text-white/80">
|
|
365
|
+
Something went wrong. Please check the details below.
|
|
366
|
+
</p>
|
|
367
|
+
<div className="space-y-2">
|
|
368
|
+
<div className="text-xs text-red-200">
|
|
369
|
+
• Network connection failed
|
|
370
|
+
</div>
|
|
371
|
+
<div className="text-xs text-red-200">
|
|
372
|
+
• Invalid response format
|
|
373
|
+
</div>
|
|
374
|
+
</div>
|
|
375
|
+
</div>
|
|
376
|
+
</div>
|
|
377
|
+
<SheetFooter>
|
|
378
|
+
<Button variant="outline" size="sm">
|
|
379
|
+
Retry
|
|
380
|
+
</Button>
|
|
381
|
+
<SheetClose asChild>
|
|
382
|
+
<Button size="sm">Close</Button>
|
|
383
|
+
</SheetClose>
|
|
384
|
+
</SheetFooter>
|
|
385
|
+
</SheetContent>
|
|
386
|
+
</Sheet>
|
|
387
|
+
</div>
|
|
388
|
+
</div>
|
|
389
|
+
</div>
|
|
390
|
+
</div>
|
|
391
|
+
),
|
|
392
|
+
parameters: {
|
|
393
|
+
docs: {
|
|
394
|
+
description: {
|
|
395
|
+
story:
|
|
396
|
+
"Comprehensive demonstration of all sheet sides (left, right, top, bottom) and color variants (neutral, positive, negative, warning, info) with colored border accents.",
|
|
397
|
+
},
|
|
398
|
+
},
|
|
399
|
+
},
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// 2. Navigation Sheet
|
|
403
|
+
export const NavigationSheet: Story = {
|
|
404
|
+
render: () => (
|
|
405
|
+
<div className="relative">
|
|
406
|
+
<BackgroundContent />
|
|
407
|
+
|
|
408
|
+
{/* Mobile-style header */}
|
|
409
|
+
<div className="fixed top-0 right-0 left-0 z-40 bg-black/80 backdrop-blur-sm">
|
|
410
|
+
<div className="flex items-center justify-between p-4">
|
|
411
|
+
<Sheet>
|
|
412
|
+
<SheetTrigger asChild>
|
|
413
|
+
<IconButton
|
|
414
|
+
variant="ghost"
|
|
415
|
+
icon={<SiteLogoIcon />}
|
|
416
|
+
label="Menu"
|
|
417
|
+
/>
|
|
418
|
+
</SheetTrigger>
|
|
419
|
+
<SheetContent side="left" className="w-80">
|
|
420
|
+
<SheetHeader>
|
|
421
|
+
<SheetTitle>Navigation Menu</SheetTitle>
|
|
422
|
+
<SheetDescription>
|
|
423
|
+
Main navigation for the application
|
|
424
|
+
</SheetDescription>
|
|
425
|
+
</SheetHeader>
|
|
426
|
+
|
|
427
|
+
<div className="py-4">
|
|
428
|
+
<nav className="space-y-2">
|
|
429
|
+
{[
|
|
430
|
+
{
|
|
431
|
+
label: "Dashboard",
|
|
432
|
+
icon: SiteLogoIcon,
|
|
433
|
+
active: true,
|
|
434
|
+
badge: null,
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
label: "Projects",
|
|
438
|
+
icon: FeatureShineIcon,
|
|
439
|
+
active: false,
|
|
440
|
+
badge: "3",
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
label: "Analytics",
|
|
444
|
+
icon: FileChartIcon,
|
|
445
|
+
active: false,
|
|
446
|
+
badge: null,
|
|
447
|
+
},
|
|
448
|
+
{
|
|
449
|
+
label: "Team",
|
|
450
|
+
icon: TickCircleIcon,
|
|
451
|
+
active: false,
|
|
452
|
+
badge: "New",
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
label: "Settings",
|
|
456
|
+
icon: MaintenanceIcon,
|
|
457
|
+
active: false,
|
|
458
|
+
badge: null,
|
|
459
|
+
},
|
|
460
|
+
].map((item) => (
|
|
461
|
+
<a
|
|
462
|
+
key={item.label}
|
|
463
|
+
href="#"
|
|
464
|
+
className={`flex items-center gap-3 rounded-lg p-3 transition-colors ${
|
|
465
|
+
item.active
|
|
466
|
+
? "bg-blue-500/20 text-blue-300"
|
|
467
|
+
: "text-white hover:bg-white/10"
|
|
468
|
+
}`}
|
|
469
|
+
>
|
|
470
|
+
<item.icon className="h-5 w-5" />
|
|
471
|
+
<span className="flex-1">{item.label}</span>
|
|
472
|
+
{item.badge && (
|
|
473
|
+
<Badge
|
|
474
|
+
color={item.badge === "New" ? "positive" : "neutral"}
|
|
475
|
+
size="sm"
|
|
476
|
+
>
|
|
477
|
+
{item.badge}
|
|
478
|
+
</Badge>
|
|
479
|
+
)}
|
|
480
|
+
<ChevronRightIcon className="h-4 w-4" />
|
|
481
|
+
</a>
|
|
482
|
+
))}
|
|
483
|
+
</nav>
|
|
484
|
+
|
|
485
|
+
<div className="mt-8 space-y-4">
|
|
486
|
+
<div className="rounded-lg bg-white/5 p-4">
|
|
487
|
+
<h4 className="mb-2 text-sm font-medium text-white">
|
|
488
|
+
Quick Actions
|
|
489
|
+
</h4>
|
|
490
|
+
<div className="space-y-2">
|
|
491
|
+
<Button
|
|
492
|
+
size="sm"
|
|
493
|
+
variant="outline"
|
|
494
|
+
className="w-full justify-start"
|
|
495
|
+
>
|
|
496
|
+
<SearchIcon className="mr-2 h-4 w-4" />
|
|
497
|
+
Search
|
|
498
|
+
</Button>
|
|
499
|
+
<Button
|
|
500
|
+
size="sm"
|
|
501
|
+
variant="outline"
|
|
502
|
+
className="w-full justify-start"
|
|
503
|
+
>
|
|
504
|
+
<MagicBookIcon className="mr-2 h-4 w-4" />
|
|
505
|
+
Help & Support
|
|
506
|
+
</Button>
|
|
507
|
+
</div>
|
|
508
|
+
</div>
|
|
509
|
+
</div>
|
|
510
|
+
</div>
|
|
511
|
+
|
|
512
|
+
<SheetFooter>
|
|
513
|
+
<div className="w-full space-y-2">
|
|
514
|
+
<div className="flex items-center gap-3 rounded-lg bg-white/5 p-3">
|
|
515
|
+
<div className="h-8 w-8 rounded-full bg-gradient-to-r from-blue-500 to-purple-500"></div>
|
|
516
|
+
<div>
|
|
517
|
+
<p className="text-sm font-medium text-white">John Doe</p>
|
|
518
|
+
<p className="text-xs text-white/60">john@example.com</p>
|
|
519
|
+
</div>
|
|
520
|
+
</div>
|
|
521
|
+
<SheetClose asChild>
|
|
522
|
+
<Button variant="outline" className="w-full">
|
|
523
|
+
Close Menu
|
|
524
|
+
</Button>
|
|
525
|
+
</SheetClose>
|
|
526
|
+
</div>
|
|
527
|
+
</SheetFooter>
|
|
528
|
+
</SheetContent>
|
|
529
|
+
</Sheet>
|
|
530
|
+
|
|
531
|
+
<h1 className="text-lg font-semibold text-white">App Title</h1>
|
|
532
|
+
|
|
533
|
+
<IconButton
|
|
534
|
+
variant="ghost"
|
|
535
|
+
icon={<MaintenanceIcon />}
|
|
536
|
+
label="Settings"
|
|
537
|
+
/>
|
|
538
|
+
</div>
|
|
539
|
+
</div>
|
|
540
|
+
|
|
541
|
+
{/* Add padding top to account for fixed header */}
|
|
542
|
+
<div className="pt-16">
|
|
543
|
+
<BackgroundContent />
|
|
544
|
+
</div>
|
|
545
|
+
</div>
|
|
546
|
+
),
|
|
547
|
+
parameters: {
|
|
548
|
+
docs: {
|
|
549
|
+
description: {
|
|
550
|
+
story:
|
|
551
|
+
"Mobile-style navigation sheet with menu items, badges, user profile, and quick actions demonstrating common mobile app patterns.",
|
|
552
|
+
},
|
|
553
|
+
},
|
|
554
|
+
},
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
// 3. Form Sheet
|
|
558
|
+
export const FormSheet: Story = {
|
|
559
|
+
render: () => {
|
|
560
|
+
const [formData, setFormData] = useState({
|
|
561
|
+
name: "",
|
|
562
|
+
email: "",
|
|
563
|
+
subject: "",
|
|
564
|
+
message: "",
|
|
565
|
+
newsletter: false,
|
|
566
|
+
})
|
|
567
|
+
|
|
568
|
+
return (
|
|
569
|
+
<div className="relative">
|
|
570
|
+
<BackgroundContent />
|
|
571
|
+
|
|
572
|
+
<div className="fixed right-4 bottom-4 z-50">
|
|
573
|
+
<Sheet>
|
|
574
|
+
<SheetTrigger asChild>
|
|
575
|
+
<Button className="rounded-full shadow-lg">
|
|
576
|
+
<SearchIcon className="mr-2 h-4 w-4" />
|
|
577
|
+
Contact Us
|
|
578
|
+
</Button>
|
|
579
|
+
</SheetTrigger>
|
|
580
|
+
<SheetContent side="right" className="w-96">
|
|
581
|
+
<SheetHeader>
|
|
582
|
+
<SheetTitle>Contact Form</SheetTitle>
|
|
583
|
+
<SheetDescription>
|
|
584
|
+
Send us a message and we'll get back to you soon.
|
|
585
|
+
</SheetDescription>
|
|
586
|
+
</SheetHeader>
|
|
587
|
+
|
|
588
|
+
<div className="py-4">
|
|
589
|
+
<form className="space-y-4">
|
|
590
|
+
<div className="space-y-2">
|
|
591
|
+
<Label htmlFor="name">Name</Label>
|
|
592
|
+
<Input
|
|
593
|
+
id="name"
|
|
594
|
+
placeholder="Your full name"
|
|
595
|
+
value={formData.name}
|
|
596
|
+
onChange={(e: any) =>
|
|
597
|
+
setFormData((prev) => ({
|
|
598
|
+
...prev,
|
|
599
|
+
name: e.target.value,
|
|
600
|
+
}))
|
|
601
|
+
}
|
|
602
|
+
/>
|
|
603
|
+
</div>
|
|
604
|
+
|
|
605
|
+
<div className="space-y-2">
|
|
606
|
+
<Label htmlFor="email">Email</Label>
|
|
607
|
+
<Input
|
|
608
|
+
id="email"
|
|
609
|
+
type="email"
|
|
610
|
+
placeholder="your.email@example.com"
|
|
611
|
+
value={formData.email}
|
|
612
|
+
onChange={(e: any) =>
|
|
613
|
+
setFormData((prev) => ({
|
|
614
|
+
...prev,
|
|
615
|
+
email: e.target.value,
|
|
616
|
+
}))
|
|
617
|
+
}
|
|
618
|
+
/>
|
|
619
|
+
</div>
|
|
620
|
+
|
|
621
|
+
<div className="space-y-2">
|
|
622
|
+
<Label htmlFor="subject">Subject</Label>
|
|
623
|
+
<Input
|
|
624
|
+
id="subject"
|
|
625
|
+
placeholder="Message subject"
|
|
626
|
+
value={formData.subject}
|
|
627
|
+
onChange={(e: any) =>
|
|
628
|
+
setFormData((prev) => ({
|
|
629
|
+
...prev,
|
|
630
|
+
subject: e.target.value,
|
|
631
|
+
}))
|
|
632
|
+
}
|
|
633
|
+
/>
|
|
634
|
+
</div>
|
|
635
|
+
|
|
636
|
+
<div className="space-y-2">
|
|
637
|
+
<Label htmlFor="message">Message</Label>
|
|
638
|
+
<Textarea
|
|
639
|
+
id="message"
|
|
640
|
+
placeholder="Your message..."
|
|
641
|
+
rows={4}
|
|
642
|
+
value={formData.message}
|
|
643
|
+
onChange={(e: any) =>
|
|
644
|
+
setFormData((prev) => ({
|
|
645
|
+
...prev,
|
|
646
|
+
message: e.target.value,
|
|
647
|
+
}))
|
|
648
|
+
}
|
|
649
|
+
/>
|
|
650
|
+
</div>
|
|
651
|
+
|
|
652
|
+
<div className="flex items-center space-x-2">
|
|
653
|
+
<Checkbox
|
|
654
|
+
id="newsletter"
|
|
655
|
+
checked={formData.newsletter}
|
|
656
|
+
onCheckedChange={(checked) =>
|
|
657
|
+
setFormData((prev) => ({
|
|
658
|
+
...prev,
|
|
659
|
+
newsletter: checked as boolean,
|
|
660
|
+
}))
|
|
661
|
+
}
|
|
662
|
+
/>
|
|
663
|
+
<Label htmlFor="newsletter" className="text-sm">
|
|
664
|
+
Subscribe to newsletter
|
|
665
|
+
</Label>
|
|
666
|
+
</div>
|
|
667
|
+
|
|
668
|
+
<div className="rounded-lg bg-blue-500/10 p-3">
|
|
669
|
+
<p className="text-xs text-blue-200">
|
|
670
|
+
We typically respond within 24 hours. For urgent matters,
|
|
671
|
+
please call our support line.
|
|
672
|
+
</p>
|
|
673
|
+
</div>
|
|
674
|
+
</form>
|
|
675
|
+
</div>
|
|
676
|
+
|
|
677
|
+
<SheetFooter>
|
|
678
|
+
<div className="flex w-full gap-2">
|
|
679
|
+
<SheetClose asChild>
|
|
680
|
+
<Button variant="outline" className="flex-1">
|
|
681
|
+
Cancel
|
|
682
|
+
</Button>
|
|
683
|
+
</SheetClose>
|
|
684
|
+
<Button
|
|
685
|
+
className="flex-1"
|
|
686
|
+
disabled={
|
|
687
|
+
!formData.name || !formData.email || !formData.message
|
|
688
|
+
}
|
|
689
|
+
>
|
|
690
|
+
Send Message
|
|
691
|
+
</Button>
|
|
692
|
+
</div>
|
|
693
|
+
</SheetFooter>
|
|
694
|
+
</SheetContent>
|
|
695
|
+
</Sheet>
|
|
696
|
+
</div>
|
|
697
|
+
</div>
|
|
698
|
+
)
|
|
699
|
+
},
|
|
700
|
+
parameters: {
|
|
701
|
+
docs: {
|
|
702
|
+
description: {
|
|
703
|
+
story:
|
|
704
|
+
"Contact form sheet with form validation, checkbox input, and user feedback elements.",
|
|
705
|
+
},
|
|
706
|
+
},
|
|
707
|
+
},
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
// 4. Settings Panel Sheet
|
|
711
|
+
export const SettingsPanelSheet: Story = {
|
|
712
|
+
render: () => {
|
|
713
|
+
const [settings, setSettings] = useState({
|
|
714
|
+
notifications: true,
|
|
715
|
+
darkMode: true,
|
|
716
|
+
analytics: false,
|
|
717
|
+
autoSave: true,
|
|
718
|
+
emailUpdates: false,
|
|
719
|
+
})
|
|
720
|
+
|
|
721
|
+
const toggleSetting = (key: string) => {
|
|
722
|
+
setSettings((prev) => ({
|
|
723
|
+
...prev,
|
|
724
|
+
[key]: !prev[key as keyof typeof prev],
|
|
725
|
+
}))
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
return (
|
|
729
|
+
<div className="relative">
|
|
730
|
+
<BackgroundContent />
|
|
731
|
+
|
|
732
|
+
<div className="fixed top-4 right-4 z-50">
|
|
733
|
+
<Sheet>
|
|
734
|
+
<SheetTrigger asChild>
|
|
735
|
+
<Button variant="outline">
|
|
736
|
+
<MaintenanceIcon className="mr-2 h-4 w-4" />
|
|
737
|
+
Settings
|
|
738
|
+
</Button>
|
|
739
|
+
</SheetTrigger>
|
|
740
|
+
<SheetContent side="right" className="w-80">
|
|
741
|
+
<SheetHeader>
|
|
742
|
+
<SheetTitle>Application Settings</SheetTitle>
|
|
743
|
+
<SheetDescription>
|
|
744
|
+
Customize your experience and preferences
|
|
745
|
+
</SheetDescription>
|
|
746
|
+
</SheetHeader>
|
|
747
|
+
|
|
748
|
+
<div className="py-4">
|
|
749
|
+
<div className="space-y-6">
|
|
750
|
+
{/* Notifications Section */}
|
|
751
|
+
<div className="space-y-3">
|
|
752
|
+
<h4 className="text-sm font-medium text-white">
|
|
753
|
+
Notifications
|
|
754
|
+
</h4>
|
|
755
|
+
<div className="space-y-3">
|
|
756
|
+
<div className="flex items-center justify-between">
|
|
757
|
+
<span className="text-sm text-white">
|
|
758
|
+
Push Notifications
|
|
759
|
+
</span>
|
|
760
|
+
<Checkbox
|
|
761
|
+
checked={settings.notifications}
|
|
762
|
+
onCheckedChange={() => toggleSetting("notifications")}
|
|
763
|
+
/>
|
|
764
|
+
</div>
|
|
765
|
+
|
|
766
|
+
<div className="flex items-center justify-between">
|
|
767
|
+
<span className="text-sm text-white">
|
|
768
|
+
Email Updates
|
|
769
|
+
</span>
|
|
770
|
+
<Checkbox
|
|
771
|
+
checked={settings.emailUpdates}
|
|
772
|
+
onCheckedChange={() => toggleSetting("emailUpdates")}
|
|
773
|
+
/>
|
|
774
|
+
</div>
|
|
775
|
+
|
|
776
|
+
<div className="flex items-center justify-between">
|
|
777
|
+
<span className="text-sm text-white">Analytics</span>
|
|
778
|
+
<Checkbox
|
|
779
|
+
checked={settings.analytics}
|
|
780
|
+
onCheckedChange={() => toggleSetting("analytics")}
|
|
781
|
+
/>
|
|
782
|
+
</div>
|
|
783
|
+
</div>
|
|
784
|
+
</div>
|
|
785
|
+
|
|
786
|
+
{/* Appearance Section */}
|
|
787
|
+
<div className="space-y-3">
|
|
788
|
+
<h4 className="text-sm font-medium text-white">
|
|
789
|
+
Appearance
|
|
790
|
+
</h4>
|
|
791
|
+
<div className="space-y-3">
|
|
792
|
+
<div className="flex items-center justify-between">
|
|
793
|
+
<span className="text-sm text-white">Dark Mode</span>
|
|
794
|
+
<Checkbox
|
|
795
|
+
checked={settings.darkMode}
|
|
796
|
+
onCheckedChange={() => toggleSetting("darkMode")}
|
|
797
|
+
/>
|
|
798
|
+
</div>
|
|
799
|
+
</div>
|
|
800
|
+
</div>
|
|
801
|
+
|
|
802
|
+
{/* Advanced Section */}
|
|
803
|
+
<div className="space-y-3">
|
|
804
|
+
<h4 className="text-sm font-medium text-white">Advanced</h4>
|
|
805
|
+
<div className="space-y-3">
|
|
806
|
+
<div className="flex items-center justify-between">
|
|
807
|
+
<span className="text-sm text-white">Auto Save</span>
|
|
808
|
+
<Checkbox
|
|
809
|
+
checked={settings.autoSave}
|
|
810
|
+
onCheckedChange={() => toggleSetting("autoSave")}
|
|
811
|
+
/>
|
|
812
|
+
</div>
|
|
813
|
+
|
|
814
|
+
<Button variant="outline" size="sm" className="w-full">
|
|
815
|
+
<FileChartIcon className="mr-2 h-4 w-4" />
|
|
816
|
+
Clear Cache
|
|
817
|
+
</Button>
|
|
818
|
+
|
|
819
|
+
<Button variant="outline" size="sm" className="w-full">
|
|
820
|
+
<ArrowRightIcon className="mr-2 h-4 w-4" />
|
|
821
|
+
Export Data
|
|
822
|
+
</Button>
|
|
823
|
+
</div>
|
|
824
|
+
</div>
|
|
825
|
+
</div>
|
|
826
|
+
</div>
|
|
827
|
+
|
|
828
|
+
<SheetFooter>
|
|
829
|
+
<div className="flex w-full gap-2">
|
|
830
|
+
<Button variant="outline" size="sm" className="flex-1">
|
|
831
|
+
Reset
|
|
832
|
+
</Button>
|
|
833
|
+
<SheetClose asChild>
|
|
834
|
+
<Button size="sm" className="flex-1">
|
|
835
|
+
Save Changes
|
|
836
|
+
</Button>
|
|
837
|
+
</SheetClose>
|
|
838
|
+
</div>
|
|
839
|
+
</SheetFooter>
|
|
840
|
+
</SheetContent>
|
|
841
|
+
</Sheet>
|
|
842
|
+
</div>
|
|
843
|
+
</div>
|
|
844
|
+
)
|
|
845
|
+
},
|
|
846
|
+
parameters: {
|
|
847
|
+
docs: {
|
|
848
|
+
description: {
|
|
849
|
+
story:
|
|
850
|
+
"Settings panel sheet with checkboxes, sections, and action buttons demonstrating configuration interfaces.",
|
|
851
|
+
},
|
|
852
|
+
},
|
|
853
|
+
},
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
// 5. Overlay Variations
|
|
857
|
+
export const OverlayVariations: Story = {
|
|
858
|
+
render: () => (
|
|
859
|
+
<div className="relative">
|
|
860
|
+
<BackgroundContent />
|
|
861
|
+
|
|
862
|
+
<div className="fixed bottom-4 left-1/2 z-50 -translate-x-1/2 transform">
|
|
863
|
+
<div className="space-y-2 rounded-lg bg-black/80 p-4 backdrop-blur-sm">
|
|
864
|
+
<h3 className="text-center text-sm font-medium text-white">
|
|
865
|
+
Overlay Variations
|
|
866
|
+
</h3>
|
|
867
|
+
<div className="flex gap-2">
|
|
868
|
+
{/* Low Opacity */}
|
|
869
|
+
<Sheet>
|
|
870
|
+
<SheetTrigger asChild>
|
|
871
|
+
<Button size="sm" variant="outline">
|
|
872
|
+
Low Opacity
|
|
873
|
+
</Button>
|
|
874
|
+
</SheetTrigger>
|
|
875
|
+
<SheetContent side="right" opacity="low">
|
|
876
|
+
<SheetHeader>
|
|
877
|
+
<SheetTitle>Low Opacity</SheetTitle>
|
|
878
|
+
<SheetDescription>
|
|
879
|
+
Subtle background overlay that maintains visibility
|
|
880
|
+
</SheetDescription>
|
|
881
|
+
</SheetHeader>
|
|
882
|
+
<div className="py-4">
|
|
883
|
+
<p className="text-sm text-white/80">
|
|
884
|
+
This sheet uses low opacity overlay, allowing more of the
|
|
885
|
+
background content to remain visible.
|
|
886
|
+
</p>
|
|
887
|
+
</div>
|
|
888
|
+
</SheetContent>
|
|
889
|
+
</Sheet>
|
|
890
|
+
|
|
891
|
+
{/* High Opacity */}
|
|
892
|
+
<Sheet>
|
|
893
|
+
<SheetTrigger asChild>
|
|
894
|
+
<Button size="sm" variant="outline">
|
|
895
|
+
High Opacity
|
|
896
|
+
</Button>
|
|
897
|
+
</SheetTrigger>
|
|
898
|
+
<SheetContent side="right" opacity="high">
|
|
899
|
+
<SheetHeader>
|
|
900
|
+
<SheetTitle>High Opacity</SheetTitle>
|
|
901
|
+
<SheetDescription>
|
|
902
|
+
Strong background overlay for maximum focus
|
|
903
|
+
</SheetDescription>
|
|
904
|
+
</SheetHeader>
|
|
905
|
+
<div className="py-4">
|
|
906
|
+
<p className="text-sm text-white/80">
|
|
907
|
+
This sheet uses high opacity overlay, creating strong focus
|
|
908
|
+
on the sheet content by dimming the background
|
|
909
|
+
significantly.
|
|
910
|
+
</p>
|
|
911
|
+
</div>
|
|
912
|
+
</SheetContent>
|
|
913
|
+
</Sheet>
|
|
914
|
+
|
|
915
|
+
{/* Glass Effect */}
|
|
916
|
+
<Sheet>
|
|
917
|
+
<SheetTrigger asChild>
|
|
918
|
+
<Button size="sm" variant="outline">
|
|
919
|
+
Glass Effect
|
|
920
|
+
</Button>
|
|
921
|
+
</SheetTrigger>
|
|
922
|
+
<SheetContent side="right" glass="high">
|
|
923
|
+
<SheetHeader>
|
|
924
|
+
<SheetTitle>Glass Effect</SheetTitle>
|
|
925
|
+
<SheetDescription>
|
|
926
|
+
Frosted glass overlay for modern aesthetics
|
|
927
|
+
</SheetDescription>
|
|
928
|
+
</SheetHeader>
|
|
929
|
+
<div className="py-4">
|
|
930
|
+
<p className="text-sm text-white/80">
|
|
931
|
+
This sheet includes a glass effect with backdrop blur,
|
|
932
|
+
creating a modern frosted glass appearance.
|
|
933
|
+
</p>
|
|
934
|
+
</div>
|
|
935
|
+
</SheetContent>
|
|
936
|
+
</Sheet>
|
|
937
|
+
|
|
938
|
+
{/* Noise Texture */}
|
|
939
|
+
<Sheet>
|
|
940
|
+
<SheetTrigger asChild>
|
|
941
|
+
<Button size="sm" variant="outline">
|
|
942
|
+
Noise Texture
|
|
943
|
+
</Button>
|
|
944
|
+
</SheetTrigger>
|
|
945
|
+
<SheetContent side="right" noise="medium">
|
|
946
|
+
<SheetHeader>
|
|
947
|
+
<SheetTitle>Noise Texture</SheetTitle>
|
|
948
|
+
<SheetDescription>
|
|
949
|
+
Textured overlay for enhanced visual depth
|
|
950
|
+
</SheetDescription>
|
|
951
|
+
</SheetHeader>
|
|
952
|
+
<div className="py-4">
|
|
953
|
+
<p className="text-sm text-white/80">
|
|
954
|
+
This sheet includes noise texture overlay, adding visual
|
|
955
|
+
interest and depth to the background.
|
|
956
|
+
</p>
|
|
957
|
+
</div>
|
|
958
|
+
</SheetContent>
|
|
959
|
+
</Sheet>
|
|
960
|
+
</div>
|
|
961
|
+
</div>
|
|
962
|
+
</div>
|
|
963
|
+
</div>
|
|
964
|
+
),
|
|
965
|
+
parameters: {
|
|
966
|
+
docs: {
|
|
967
|
+
description: {
|
|
968
|
+
story:
|
|
969
|
+
"Different overlay configurations showing opacity levels, glass effects, and noise textures for various visual requirements.",
|
|
970
|
+
},
|
|
971
|
+
},
|
|
972
|
+
},
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
// 6. Mobile Bottom Sheet
|
|
976
|
+
export const MobileBottomSheet: Story = {
|
|
977
|
+
render: () => {
|
|
978
|
+
const [selectedOption, setSelectedOption] = useState<string | null>(null)
|
|
979
|
+
|
|
980
|
+
return (
|
|
981
|
+
<div className="relative">
|
|
982
|
+
<BackgroundContent />
|
|
983
|
+
|
|
984
|
+
{/* Simulate mobile content */}
|
|
985
|
+
<div className="fixed bottom-4 left-1/2 z-50 -translate-x-1/2 transform">
|
|
986
|
+
<Sheet>
|
|
987
|
+
<SheetTrigger asChild>
|
|
988
|
+
<Button>Share Options</Button>
|
|
989
|
+
</SheetTrigger>
|
|
990
|
+
<SheetContent side="bottom" className="h-auto max-h-96">
|
|
991
|
+
<SheetHeader>
|
|
992
|
+
<SheetTitle>Share</SheetTitle>
|
|
993
|
+
<SheetDescription>
|
|
994
|
+
Choose how you'd like to share this content
|
|
995
|
+
</SheetDescription>
|
|
996
|
+
</SheetHeader>
|
|
997
|
+
|
|
998
|
+
<div className="py-4">
|
|
999
|
+
<div className="mb-6 grid grid-cols-4 gap-4">
|
|
1000
|
+
{[
|
|
1001
|
+
{ name: "Message", icon: SearchIcon },
|
|
1002
|
+
{ name: "Email", icon: AlertIcon },
|
|
1003
|
+
{ name: "Copy Link", icon: TickCircleIcon },
|
|
1004
|
+
{ name: "More", icon: SiteLogoIcon },
|
|
1005
|
+
].map((option) => (
|
|
1006
|
+
<button
|
|
1007
|
+
key={option.name}
|
|
1008
|
+
onClick={() => setSelectedOption(option.name)}
|
|
1009
|
+
className={`flex flex-col items-center gap-2 rounded-lg p-3 transition-colors ${
|
|
1010
|
+
selectedOption === option.name
|
|
1011
|
+
? "bg-blue-500/20 text-blue-300"
|
|
1012
|
+
: "text-white hover:bg-white/10"
|
|
1013
|
+
}`}
|
|
1014
|
+
>
|
|
1015
|
+
<option.icon className="h-6 w-6" />
|
|
1016
|
+
<span className="text-xs">{option.name}</span>
|
|
1017
|
+
</button>
|
|
1018
|
+
))}
|
|
1019
|
+
</div>
|
|
1020
|
+
|
|
1021
|
+
<div className="space-y-2">
|
|
1022
|
+
<h4 className="text-sm font-medium text-white">
|
|
1023
|
+
Recent Contacts
|
|
1024
|
+
</h4>
|
|
1025
|
+
{Array.from({ length: 3 }, (_, i) => (
|
|
1026
|
+
<div
|
|
1027
|
+
key={i}
|
|
1028
|
+
className="flex items-center gap-3 rounded-lg p-2 hover:bg-white/10"
|
|
1029
|
+
>
|
|
1030
|
+
<div className="h-8 w-8 rounded-full bg-gradient-to-r from-blue-500 to-purple-500"></div>
|
|
1031
|
+
<span className="text-sm text-white">
|
|
1032
|
+
Contact {i + 1}
|
|
1033
|
+
</span>
|
|
1034
|
+
</div>
|
|
1035
|
+
))}
|
|
1036
|
+
</div>
|
|
1037
|
+
</div>
|
|
1038
|
+
|
|
1039
|
+
<SheetFooter>
|
|
1040
|
+
<SheetClose asChild>
|
|
1041
|
+
<Button variant="outline" className="w-full">
|
|
1042
|
+
Cancel
|
|
1043
|
+
</Button>
|
|
1044
|
+
</SheetClose>
|
|
1045
|
+
</SheetFooter>
|
|
1046
|
+
</SheetContent>
|
|
1047
|
+
</Sheet>
|
|
1048
|
+
</div>
|
|
1049
|
+
</div>
|
|
1050
|
+
)
|
|
1051
|
+
},
|
|
1052
|
+
parameters: {
|
|
1053
|
+
docs: {
|
|
1054
|
+
description: {
|
|
1055
|
+
story:
|
|
1056
|
+
"Mobile-style bottom sheet with share options and contact list, demonstrating common mobile interaction patterns.",
|
|
1057
|
+
},
|
|
1058
|
+
},
|
|
1059
|
+
},
|
|
1060
|
+
}
|