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,85 @@
|
|
|
1
|
+
import React from "react"
|
|
2
|
+
import { Button } from "@components/button"
|
|
3
|
+
import Label from "@components/label"
|
|
4
|
+
import type { Meta, StoryObj } from "@storybook/react"
|
|
5
|
+
|
|
6
|
+
import { Switch } from "."
|
|
7
|
+
|
|
8
|
+
const meta: Meta<typeof Switch> = {
|
|
9
|
+
title: "Components/UI/Switch",
|
|
10
|
+
component: Switch,
|
|
11
|
+
parameters: {
|
|
12
|
+
layout: "centered",
|
|
13
|
+
},
|
|
14
|
+
tags: ["autodocs"],
|
|
15
|
+
argTypes: {
|
|
16
|
+
checked: {
|
|
17
|
+
control: { type: "boolean" },
|
|
18
|
+
description: "Whether the switch is checked or not",
|
|
19
|
+
},
|
|
20
|
+
disabled: {
|
|
21
|
+
control: { type: "boolean" },
|
|
22
|
+
description: "Whether the switch is disabled or not",
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export default meta
|
|
28
|
+
type Story = StoryObj<typeof Switch>
|
|
29
|
+
|
|
30
|
+
export const Default: Story = {
|
|
31
|
+
args: {
|
|
32
|
+
checked: false,
|
|
33
|
+
},
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const Checked: Story = {
|
|
37
|
+
args: {
|
|
38
|
+
checked: true,
|
|
39
|
+
},
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export const Disabled: Story = {
|
|
43
|
+
args: {
|
|
44
|
+
disabled: true,
|
|
45
|
+
},
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export const DisabledAndChecked: Story = {
|
|
49
|
+
args: {
|
|
50
|
+
disabled: true,
|
|
51
|
+
checked: true,
|
|
52
|
+
},
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export const WithLabel: Story = {
|
|
56
|
+
render: () => (
|
|
57
|
+
<div className="flex items-center space-x-2">
|
|
58
|
+
<Switch id="switch-with-label" value="Toggle me" />
|
|
59
|
+
<Label htmlFor="switch-with-label">Toggle me</Label>
|
|
60
|
+
</div>
|
|
61
|
+
),
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export const WithForm: Story = {
|
|
65
|
+
render: () => (
|
|
66
|
+
<form
|
|
67
|
+
onSubmit={(e) => {
|
|
68
|
+
e.preventDefault()
|
|
69
|
+
// Handle form submission
|
|
70
|
+
}}
|
|
71
|
+
>
|
|
72
|
+
<div className="grid gap-4">
|
|
73
|
+
<div className="flex items-center space-x-2">
|
|
74
|
+
<Switch id="notifications" />
|
|
75
|
+
<Label htmlFor="notifications">Enable notifications</Label>
|
|
76
|
+
</div>
|
|
77
|
+
<div className="flex items-center space-x-2">
|
|
78
|
+
<Switch id="newsletter" defaultChecked />
|
|
79
|
+
<Label htmlFor="newsletter">Subscribe to newsletter</Label>
|
|
80
|
+
</div>
|
|
81
|
+
<Button>Submit</Button>
|
|
82
|
+
</div>
|
|
83
|
+
</form>
|
|
84
|
+
),
|
|
85
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
import { cn } from "@lib/utils"
|
|
3
|
+
import * as SwitchPrimitives from "@radix-ui/react-switch"
|
|
4
|
+
|
|
5
|
+
const Switch = React.forwardRef<
|
|
6
|
+
React.ElementRef<typeof SwitchPrimitives.Root>,
|
|
7
|
+
React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>
|
|
8
|
+
>(({ className, ...props }, ref) => (
|
|
9
|
+
<SwitchPrimitives.Root
|
|
10
|
+
className={cn(
|
|
11
|
+
"data-[state=checked]:not-[:disabled]:border-fm-divider-positive data-[state=checked]:not-[:disabled]:bg-fm-green-50 data-[state=unchecked]:not-[:disabled]:border-fm-divider-primary data-[state=unchecked]:not-[:disabled]:bg-fm-surface-primary data-[state=unchecked]:disabled:border-fm-divider-tertiary data-[state=unchecked]:disabled:bg-fm-surface-secondary data-[state=checked]:disabled:border-fm-green-100 data-[state=checked]:disabled:bg-fm-green-50 focus-visible:ring-fm-primary focus-visible:ring-offset-fm-green-50 hover:bg-fm-surface-secondary data-[state=unchecked]:not-[:disabled]:hover:bg-fm-surface-secondary h-8 w-14 rounded-full border border-solid transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
|
|
12
|
+
"data-[state=unchecked]:not-[:disabled]:hover:border-fm-divider-primary relative disabled:cursor-not-allowed",
|
|
13
|
+
className
|
|
14
|
+
)}
|
|
15
|
+
{...props}
|
|
16
|
+
ref={ref}
|
|
17
|
+
>
|
|
18
|
+
<span
|
|
19
|
+
className="font-fm-brand text-fm-positive data-[disabled=true]:text-fm-positive-tert absolute top-1/2 left-2 -translate-y-1/2 [font-size:var(--text-fm-sm)]"
|
|
20
|
+
data-state={props.checked ? "checked" : "unchecked"}
|
|
21
|
+
data-disabled={props.disabled || undefined}
|
|
22
|
+
>
|
|
23
|
+
ON
|
|
24
|
+
</span>
|
|
25
|
+
<span
|
|
26
|
+
className="font-fm-brand text-fm-tertiary absolute top-1/2 right-1.5 -translate-y-1/2 [font-size:var(--text-fm-sm)]"
|
|
27
|
+
data-state={props.checked ? "checked" : "unchecked"}
|
|
28
|
+
data-disabled={props.disabled || undefined}
|
|
29
|
+
>
|
|
30
|
+
OFF
|
|
31
|
+
</span>
|
|
32
|
+
<SwitchPrimitives.Thumb className="bg-fm-icon-active data-[disabled]:bg-fm-icon-inactive pointer-events-none z-10 block size-6 rounded-full shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-7 data-[state=unchecked]:translate-x-1" />
|
|
33
|
+
</SwitchPrimitives.Root>
|
|
34
|
+
))
|
|
35
|
+
Switch.displayName = SwitchPrimitives.Root.displayName
|
|
36
|
+
|
|
37
|
+
export { Switch }
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const meta = {
|
|
2
|
+
dependencies: {
|
|
3
|
+
"@radix-ui/react-switch": "^1.2.5",
|
|
4
|
+
},
|
|
5
|
+
devDependencies: {},
|
|
6
|
+
internalDependencies: [],
|
|
7
|
+
tokens: [
|
|
8
|
+
"--color-fm-divider-positive",
|
|
9
|
+
"--color-fm-divider-primary",
|
|
10
|
+
"--color-fm-divider-tertiary",
|
|
11
|
+
"--color-fm-green-50",
|
|
12
|
+
"--color-fm-green-100",
|
|
13
|
+
"--color-fm-icon-active",
|
|
14
|
+
"--color-fm-icon-inactive",
|
|
15
|
+
"--color-fm-positive",
|
|
16
|
+
"--color-fm-positive-tert",
|
|
17
|
+
"--color-fm-primary",
|
|
18
|
+
"--color-fm-surface-primary",
|
|
19
|
+
"--color-fm-surface-secondary",
|
|
20
|
+
"--color-fm-tertiary",
|
|
21
|
+
"--font-fm-brand",
|
|
22
|
+
"--text-fm-sm",
|
|
23
|
+
],
|
|
24
|
+
}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import React, { useState } from "react"
|
|
2
|
+
import type { Meta, StoryObj } from "@storybook/react"
|
|
3
|
+
|
|
4
|
+
import { Case, Default, SwitchCase } from "."
|
|
5
|
+
|
|
6
|
+
const meta = {
|
|
7
|
+
title: "Components/Logical/SwitchCase",
|
|
8
|
+
component: SwitchCase,
|
|
9
|
+
parameters: {
|
|
10
|
+
layout: "centered",
|
|
11
|
+
},
|
|
12
|
+
tags: ["autodocs"],
|
|
13
|
+
} satisfies Meta<typeof SwitchCase>
|
|
14
|
+
|
|
15
|
+
export default meta
|
|
16
|
+
type Story = StoryObj<typeof meta>
|
|
17
|
+
|
|
18
|
+
// Basic example with a static case
|
|
19
|
+
export const BasicExample: Story = {
|
|
20
|
+
args: {
|
|
21
|
+
value: "success",
|
|
22
|
+
children: [
|
|
23
|
+
<Case key="loading" value="loading">
|
|
24
|
+
Loading...
|
|
25
|
+
</Case>,
|
|
26
|
+
<Case key="error" value="error">
|
|
27
|
+
An error occurred!
|
|
28
|
+
</Case>,
|
|
29
|
+
<Case key="success" value="success">
|
|
30
|
+
Data loaded successfully!
|
|
31
|
+
</Case>,
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Example with default prop
|
|
37
|
+
export const WithDefaultProp: Story = {
|
|
38
|
+
args: {
|
|
39
|
+
value: "other",
|
|
40
|
+
default: <div style={{ color: "gray" }}>Unknown value selected</div>,
|
|
41
|
+
children: [
|
|
42
|
+
<Case key="one" value="one">
|
|
43
|
+
Option One
|
|
44
|
+
</Case>,
|
|
45
|
+
<Case key="two" value="two">
|
|
46
|
+
Option Two
|
|
47
|
+
</Case>,
|
|
48
|
+
<Case key="three" value="three">
|
|
49
|
+
Option Three
|
|
50
|
+
</Case>,
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Interactive examples using decorators for state
|
|
56
|
+
export const StatusExample: React.FC = () => {
|
|
57
|
+
const [status, setStatus] = useState<
|
|
58
|
+
"loading" | "success" | "error" | "idle"
|
|
59
|
+
>("idle")
|
|
60
|
+
|
|
61
|
+
return (
|
|
62
|
+
<div style={{ width: "300px" }}>
|
|
63
|
+
<div
|
|
64
|
+
style={{
|
|
65
|
+
marginBottom: "20px",
|
|
66
|
+
display: "flex",
|
|
67
|
+
gap: "10px",
|
|
68
|
+
flexWrap: "wrap",
|
|
69
|
+
}}
|
|
70
|
+
>
|
|
71
|
+
<button
|
|
72
|
+
onClick={() => setStatus("loading")}
|
|
73
|
+
style={{ padding: "5px 10px" }}
|
|
74
|
+
>
|
|
75
|
+
Loading
|
|
76
|
+
</button>
|
|
77
|
+
<button
|
|
78
|
+
onClick={() => setStatus("success")}
|
|
79
|
+
style={{ padding: "5px 10px" }}
|
|
80
|
+
>
|
|
81
|
+
Success
|
|
82
|
+
</button>
|
|
83
|
+
<button
|
|
84
|
+
onClick={() => setStatus("error")}
|
|
85
|
+
style={{ padding: "5px 10px" }}
|
|
86
|
+
>
|
|
87
|
+
Error
|
|
88
|
+
</button>
|
|
89
|
+
<button
|
|
90
|
+
onClick={() => setStatus("idle")}
|
|
91
|
+
style={{ padding: "5px 10px" }}
|
|
92
|
+
>
|
|
93
|
+
Idle
|
|
94
|
+
</button>
|
|
95
|
+
</div>
|
|
96
|
+
<div
|
|
97
|
+
style={{
|
|
98
|
+
padding: "20px",
|
|
99
|
+
border: "1px solid #eee",
|
|
100
|
+
borderRadius: "8px",
|
|
101
|
+
}}
|
|
102
|
+
>
|
|
103
|
+
<div>
|
|
104
|
+
Current status: <strong>{status}</strong>
|
|
105
|
+
</div>
|
|
106
|
+
<div style={{ marginTop: "10px" }}>
|
|
107
|
+
<SwitchCase value={status}>
|
|
108
|
+
<Case value="loading">
|
|
109
|
+
<div style={{ color: "blue" }}>
|
|
110
|
+
Loading your data, please wait...
|
|
111
|
+
</div>
|
|
112
|
+
</Case>
|
|
113
|
+
<Case value="success">
|
|
114
|
+
<div style={{ color: "green" }}>
|
|
115
|
+
Your data was loaded successfully!
|
|
116
|
+
</div>
|
|
117
|
+
</Case>
|
|
118
|
+
<Case value="error">
|
|
119
|
+
<div style={{ color: "red" }}>
|
|
120
|
+
An error occurred while loading your data.
|
|
121
|
+
</div>
|
|
122
|
+
</Case>
|
|
123
|
+
<Case value="idle">
|
|
124
|
+
<div style={{ color: "gray" }}>
|
|
125
|
+
Waiting for you to take an action.
|
|
126
|
+
</div>
|
|
127
|
+
</Case>
|
|
128
|
+
</SwitchCase>
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
</div>
|
|
132
|
+
)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Example with Default component
|
|
136
|
+
export const WithDefaultComponent: React.FC = () => {
|
|
137
|
+
const [fruit, setFruit] = useState<"apple" | "banana" | "orange" | "other">(
|
|
138
|
+
"other"
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
return (
|
|
142
|
+
<div style={{ width: "300px" }}>
|
|
143
|
+
<div
|
|
144
|
+
style={{
|
|
145
|
+
marginBottom: "20px",
|
|
146
|
+
display: "flex",
|
|
147
|
+
gap: "10px",
|
|
148
|
+
flexWrap: "wrap",
|
|
149
|
+
}}
|
|
150
|
+
>
|
|
151
|
+
<button
|
|
152
|
+
onClick={() => setFruit("apple")}
|
|
153
|
+
style={{ padding: "5px 10px" }}
|
|
154
|
+
>
|
|
155
|
+
Apple
|
|
156
|
+
</button>
|
|
157
|
+
<button
|
|
158
|
+
onClick={() => setFruit("banana")}
|
|
159
|
+
style={{ padding: "5px 10px" }}
|
|
160
|
+
>
|
|
161
|
+
Banana
|
|
162
|
+
</button>
|
|
163
|
+
<button
|
|
164
|
+
onClick={() => setFruit("orange")}
|
|
165
|
+
style={{ padding: "5px 10px" }}
|
|
166
|
+
>
|
|
167
|
+
Orange
|
|
168
|
+
</button>
|
|
169
|
+
<button
|
|
170
|
+
onClick={() => setFruit("other")}
|
|
171
|
+
style={{ padding: "5px 10px" }}
|
|
172
|
+
>
|
|
173
|
+
Other
|
|
174
|
+
</button>
|
|
175
|
+
</div>
|
|
176
|
+
<div
|
|
177
|
+
style={{
|
|
178
|
+
padding: "20px",
|
|
179
|
+
border: "1px solid #eee",
|
|
180
|
+
borderRadius: "8px",
|
|
181
|
+
}}
|
|
182
|
+
>
|
|
183
|
+
<div>
|
|
184
|
+
Selected fruit: <strong>{fruit}</strong>
|
|
185
|
+
</div>
|
|
186
|
+
<div style={{ marginTop: "10px" }}>
|
|
187
|
+
<SwitchCase value={fruit}>
|
|
188
|
+
<Case value="apple">
|
|
189
|
+
<div style={{ color: "red" }}>🍎 Apples are red and crunchy.</div>
|
|
190
|
+
</Case>
|
|
191
|
+
<Case value="banana">
|
|
192
|
+
<div style={{ color: "#FFD700" }}>
|
|
193
|
+
🍌 Bananas are yellow and soft.
|
|
194
|
+
</div>
|
|
195
|
+
</Case>
|
|
196
|
+
<Case value="orange">
|
|
197
|
+
<div style={{ color: "orange" }}>
|
|
198
|
+
🍊 Oranges are orange and juicy.
|
|
199
|
+
</div>
|
|
200
|
+
</Case>
|
|
201
|
+
<Default>
|
|
202
|
+
<div style={{ color: "purple" }}>Unknown fruit selected.</div>
|
|
203
|
+
</Default>
|
|
204
|
+
</SwitchCase>
|
|
205
|
+
</div>
|
|
206
|
+
</div>
|
|
207
|
+
</div>
|
|
208
|
+
)
|
|
209
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
3
|
+
import React, { createContext, ReactNode, useContext } from "react"
|
|
4
|
+
|
|
5
|
+
// Create a simple context to check if Case/Default are within a SwitchCase
|
|
6
|
+
const SwitchCaseContext = createContext<boolean>(false)
|
|
7
|
+
interface DefaultProps {
|
|
8
|
+
children: ReactNode
|
|
9
|
+
}
|
|
10
|
+
interface CaseProps extends DefaultProps {
|
|
11
|
+
value: any
|
|
12
|
+
}
|
|
13
|
+
interface SwitchCaseProps extends CaseProps {
|
|
14
|
+
default?: ReactNode
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function SwitchCase({
|
|
18
|
+
value,
|
|
19
|
+
children,
|
|
20
|
+
default: defaultContent,
|
|
21
|
+
}: SwitchCaseProps) {
|
|
22
|
+
// Track if any Case has matched
|
|
23
|
+
let hasMatch = false
|
|
24
|
+
let renderedContent: React.ReactNode = null
|
|
25
|
+
let hasDefaultComponent = false
|
|
26
|
+
|
|
27
|
+
// Process children to find matches and default components
|
|
28
|
+
React.Children.forEach(children, (child) => {
|
|
29
|
+
if (!React.isValidElement(child)) return
|
|
30
|
+
|
|
31
|
+
// Handle Case components
|
|
32
|
+
if (child.type === Case) {
|
|
33
|
+
if (
|
|
34
|
+
React.isValidElement<CaseProps>(child) &&
|
|
35
|
+
child.props.value === value &&
|
|
36
|
+
!hasMatch
|
|
37
|
+
) {
|
|
38
|
+
hasMatch = true
|
|
39
|
+
renderedContent = (child.props as { children: ReactNode }).children
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Check for Default component
|
|
43
|
+
else if (child.type === Default) {
|
|
44
|
+
hasDefaultComponent = true
|
|
45
|
+
}
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
// If no match found, look for a Default component
|
|
49
|
+
if (!hasMatch && hasDefaultComponent) {
|
|
50
|
+
React.Children.forEach(children, (child) => {
|
|
51
|
+
if (React.isValidElement(child) && child.type === Default) {
|
|
52
|
+
renderedContent = (child.props as { children: ReactNode }).children
|
|
53
|
+
}
|
|
54
|
+
})
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// If no match and no Default component, use the defaultContent
|
|
58
|
+
if (!hasMatch && !hasDefaultComponent && defaultContent) {
|
|
59
|
+
renderedContent = defaultContent
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return (
|
|
63
|
+
<SwitchCaseContext.Provider value={true}>
|
|
64
|
+
{renderedContent}
|
|
65
|
+
</SwitchCaseContext.Provider>
|
|
66
|
+
)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function Case({ value, children }: CaseProps) {
|
|
70
|
+
const insideSwitchCase = useContext(SwitchCaseContext)
|
|
71
|
+
|
|
72
|
+
if (!insideSwitchCase) {
|
|
73
|
+
throw new Error("Case must be used within a SwitchCase component")
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// This component doesn't render directly - it's processed by SwitchCase
|
|
77
|
+
return null
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function Default({ children }: DefaultProps) {
|
|
81
|
+
const insideSwitchCase = useContext(SwitchCaseContext)
|
|
82
|
+
|
|
83
|
+
if (!insideSwitchCase) {
|
|
84
|
+
throw new Error("Default must be used within a SwitchCase component")
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// This component doesn't render directly - it's processed by SwitchCase
|
|
88
|
+
return null
|
|
89
|
+
}
|