aural-ui 4.0.1 → 4.2.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/README.md +8 -1
- package/dist/components/aspect-ratio/AspectRatio.stories.tsx +290 -1228
- package/dist/components/avatar/Avatar.stories.tsx +219 -235
- package/dist/components/badge/Badge.stories.tsx +379 -116
- package/dist/components/banner/Banner.stories.tsx +445 -391
- package/dist/components/breadcrumb/Breadcrumb.stories.tsx +453 -199
- package/dist/components/button/Button.stories.tsx +585 -230
- package/dist/components/card/Card.stories.tsx +619 -301
- package/dist/components/char-count/CharCount.stories.tsx +350 -248
- package/dist/components/checkbox/Checkbox.stories.tsx +309 -167
- package/dist/components/chip/Chip.stories.tsx +362 -168
- package/dist/components/circular-loader/CircularLoader.stories.tsx +221 -636
- package/dist/components/clamp-lines/ClampLines.stories.tsx +246 -117
- package/dist/components/collapsible/Collapsible.stories.tsx +391 -252
- package/dist/components/command/Command.stories.tsx +530 -867
- package/dist/components/dialog/Dialog.stories.tsx +501 -950
- package/dist/components/divider/Divider.stories.tsx +264 -527
- package/dist/components/dot-loader/DotLoader.stories.tsx +256 -257
- package/dist/components/drawer/Drawer.stories.tsx +659 -1023
- package/dist/components/dropdown/Dropdown.stories.tsx +643 -1028
- package/dist/components/form/Form.stories.tsx +560 -274
- package/dist/components/helper-text/HelperText.stories.tsx +199 -200
- package/dist/components/hover-card/HoverCard.stories.tsx +318 -1254
- package/dist/components/icon-button/IconButton.stories.tsx +837 -194
- package/dist/components/if-else/if-else.stories.tsx +370 -83
- package/dist/components/input/Input.stories.tsx +436 -368
- package/dist/components/label/Label.stories.tsx +156 -154
- package/dist/components/list/List.stories.tsx +484 -835
- package/dist/components/marquee/Marquee.stories.tsx +356 -712
- package/dist/components/otp-inputs/OtpInputs.stories.tsx +352 -422
- package/dist/components/overlay/Overlay.stories.tsx +452 -824
- package/dist/components/pagination/Pagination.stories.tsx +721 -210
- package/dist/components/popover/Popover.stories.tsx +481 -896
- package/dist/components/radio/Radio.stories.tsx +432 -124
- package/dist/components/resizable/Resizable.stories.tsx +495 -799
- package/dist/components/scroll-area/ScrollArea.stories.tsx +383 -1059
- package/dist/components/search/Search.stories.tsx +312 -595
- package/dist/components/select/Select.stories.tsx +684 -789
- package/dist/components/sheet/Sheet.stories.tsx +671 -950
- package/dist/components/skelton/Skelton.stories.tsx +230 -764
- package/dist/components/slider/Slider.stories.tsx +383 -760
- package/dist/components/stepper/Stepper.stories.tsx +371 -514
- package/dist/components/switch/Switch.stories.tsx +461 -208
- package/dist/components/switch-case/SwitchCase.stories.tsx +367 -188
- package/dist/components/table/Table.stories.tsx +770 -916
- package/dist/components/tabs/Tabs.stories.tsx +458 -1455
- package/dist/components/tag/Tag.stories.tsx +714 -542
- package/dist/components/textarea/TextArea.stories.tsx +621 -562
- package/dist/components/thumbnail-tags/ThumbnailTags.stories.tsx +228 -154
- package/dist/components/toast/Toast.stories.tsx +452 -1339
- package/dist/components/toggle/Toggle.stories.tsx +488 -931
- package/dist/components/tooltip/Tooltip.stories.tsx +344 -1388
- package/dist/components/typography/Typography.stories.tsx +406 -89
- package/dist/hooks/use-change-state/UseChangeState.stories.tsx +309 -606
- package/dist/hooks/use-previous/UsePrevious.stories.tsx +367 -917
- package/dist/hooks/use-standalone-pagination/UseStandalonePagination.stories.tsx +639 -867
- package/dist/icons/Icons.stories.tsx +0 -12
- package/dist/icons/ai-avatar-icon/AiAvatarIcon.stories.tsx +223 -1060
- package/dist/icons/alert-icon/AlertIcon.stories.tsx +106 -968
- package/dist/icons/all-icons.tsx +37 -16
- package/dist/icons/angle-down-icon/AngleDownIcon.stories.tsx +137 -1010
- package/dist/icons/apple-logo-icon/AppleLogoIcon.stories.tsx +145 -935
- package/dist/icons/arrow-box-left-icon/ArrowBoxLeftIcon.stories.tsx +132 -1046
- package/dist/icons/arrow-corner-up-left-icon/ArrowCornerUpLeftIcon.stories.tsx +134 -986
- package/dist/icons/arrow-corner-up-right-icon/ArrowCornerUpRightIcon.stories.tsx +135 -1028
- package/dist/icons/arrow-left-icon/ArrowLeftIcon.stories.tsx +133 -971
- package/dist/icons/arrow-right-icon/ArrowRightIcon.stories.tsx +145 -1123
- package/dist/icons/arrow-right-up-icon/ArrowRightUpIcon.stories.tsx +143 -1252
- package/dist/icons/art-board-icon/ArtBoardIcon.stories.tsx +123 -632
- package/dist/icons/audio-bar-icon/AudioBarIcon.stories.tsx +141 -1223
- package/dist/icons/backward-ten-seconds-icon/BackwardTenSecondsIcon.stories.tsx +164 -1018
- package/dist/icons/bubble-check-icon/BubbleCheckIcon.stories.tsx +121 -1236
- package/dist/icons/bubble-crossed-icon/BubbleCrossedIcon.stories.tsx +121 -1213
- package/dist/icons/bubble-sparkle-icon/BubbleSparkleIcon.stories.tsx +116 -893
- package/dist/icons/camera-icon/CameraIcon.stories.tsx +109 -1254
- package/dist/icons/capital-a-letter-icon/CapitalALetterIcon.stories.tsx +114 -975
- package/dist/icons/chevron-double-left-icon/ChevronDoubleLeftIcon.stories.tsx +157 -994
- package/dist/icons/chevron-double-right-icon/ChevronDoubleRightIcon.stories.tsx +160 -992
- package/dist/icons/chevron-down-icon/ChevronDownIcon.stories.tsx +140 -970
- package/dist/icons/chevron-left-icon/ChevronLeftIcon.stories.tsx +126 -993
- package/dist/icons/chevron-right-icon/ChevronRightIcon.stories.tsx +144 -987
- package/dist/icons/chevron-up-icon/ChevronUpIcon.stories.tsx +141 -1007
- package/dist/icons/circle-tick-icon/CircleTickIcon.stories.tsx +147 -1187
- package/dist/icons/circular-play-icon/CircularPlayIcon.stories.tsx +110 -476
- package/dist/icons/coin-icon/CoinIcon.stories.tsx +120 -1364
- package/dist/icons/coin-toons-icon/CoinToonsIcon.stories.tsx +113 -1360
- package/dist/icons/column-wide-add-icon/ColumnWideAddIcon.stories.tsx +111 -942
- package/dist/icons/command-icon/CommandIcon.stories.tsx +124 -1087
- package/dist/icons/copy-icon/CopyIcon.stories.tsx +119 -996
- package/dist/icons/cross-circle-icon/CrossCircleIcon.stories.tsx +144 -1046
- package/dist/icons/cross-icon/CrossIcon.stories.tsx +136 -999
- package/dist/icons/download-icon/DownloadIcon.stories.tsx +123 -857
- package/dist/icons/edit-big-icon/EditBigIcon.stories.tsx +121 -1080
- package/dist/icons/email-icon/EmailIcon.stories.tsx +112 -979
- package/dist/icons/expand-icon/ExpandIcon.stories.tsx +109 -1146
- package/dist/icons/eye-close-icon/EyeCloseIcon.stories.tsx +141 -1068
- package/dist/icons/eye-open-icon/EyeOpenIcon.stories.tsx +140 -1081
- package/dist/icons/feature-shine-icon/FeatureShineIcon.stories.tsx +124 -1050
- package/dist/icons/file-chart-icon/FileChartIcon.stories.tsx +123 -1091
- package/dist/icons/file-text-icon/FileTextIcon.stories.tsx +122 -633
- package/dist/icons/filter-bar-row-icon/FilterBarRowIcon.stories.tsx +116 -1087
- package/dist/icons/forward-ten-seconds-icon/ForwardTenSecondsIcon.stories.tsx +166 -1020
- package/dist/icons/git-branch-icon/GitBranchIcon.stories.tsx +112 -1182
- package/dist/icons/git-fork-icon/GitForkIcon.stories.tsx +112 -1155
- package/dist/icons/globe-icon/GlobeIcon.stories.tsx +127 -325
- package/dist/icons/google-logo-icon/GoogleLogoIcon.stories.tsx +142 -985
- package/dist/icons/grip-vertical-icon/GripVerticalIcon.stories.tsx +116 -1217
- package/dist/icons/head-icon/HeadIcon.stories.tsx +108 -953
- package/dist/icons/heart-icon/HeartIcon.stories.tsx +117 -1060
- package/dist/icons/image-avatar-sparkle-icon/ImageAvatarSparkleIcon.stories.tsx +116 -716
- package/dist/icons/image-icon/ImageIcon.stories.tsx +102 -1164
- package/dist/icons/import-folder-icon/ImportFolderIcon.stories.tsx +108 -1233
- package/dist/icons/import-left-arrow-folder-icon/ImportLeftArrowFolderIcon.stories.tsx +133 -1289
- package/dist/icons/indian-flag-icon/IndianFlagIcon.stories.tsx +155 -1012
- package/dist/icons/instagram-icon/InstagramIcon.stories.tsx +158 -1438
- package/dist/icons/layout-column-icon/LayoutColumnIcon.stories.tsx +121 -1011
- package/dist/icons/layout-left-icon/LayoutLeftIcon.stories.tsx +116 -981
- package/dist/icons/layout-right-icon/LayoutRightIcon.stories.tsx +116 -979
- package/dist/icons/light-bulb-simple-icon/LightBulbSimpleIcon.stories.tsx +105 -1252
- package/dist/icons/linked-in-icon/LinkedInIcon.stories.tsx +151 -1554
- package/dist/icons/magic-book-icon/MagicBookIcon.stories.tsx +107 -1227
- package/dist/icons/magic-edit-icon/MagicEditIcon.stories.tsx +116 -707
- package/dist/icons/maintenance-icon/MaintenanceIcon.stories.tsx +119 -1226
- package/dist/icons/message-icon/MessageIcon.stories.tsx +111 -557
- package/dist/icons/minimize-icon/MinimizeIcon.stories.tsx +112 -1198
- package/dist/icons/moon-icon/MoonIcon.stories.tsx +117 -557
- package/dist/icons/move-horizontal-icon/MoveHorizontalIcon.stories.tsx +106 -1235
- package/dist/icons/move-vertical-icon/MoveVerticalIcon.stories.tsx +112 -1185
- package/dist/icons/musical-note-icon/MusicalNoteIcon.stories.tsx +116 -1012
- package/dist/icons/notepad-icon/NotepadIcon.stories.tsx +108 -1137
- package/dist/icons/notes-icon/NotesIcon.stories.tsx +116 -1138
- package/dist/icons/page-search-icon/PageSearchIcon.stories.tsx +106 -1146
- package/dist/icons/page-text-icon/PageTextIcon.stories.tsx +119 -719
- package/dist/icons/paint-roll-icon/PaintRollIcon.stories.tsx +110 -999
- package/dist/icons/paper-plane-icon/PaperPlaneIcon.stories.tsx +109 -912
- package/dist/icons/pause-icon/PauseIcon.stories.tsx +110 -1041
- package/dist/icons/pencil-icon/PencilIcon.stories.tsx +112 -1109
- package/dist/icons/phone-icon/PhoneIcon.stories.tsx +112 -1023
- package/dist/icons/plus-icon/PlusIcon.stories.tsx +103 -1132
- package/dist/icons/pocket-studio-icon/PocketStudioIcon.stories.tsx +104 -870
- package/dist/icons/scroll-down-icon/ScrollDownIcon.stories.tsx +99 -476
- package/dist/icons/search-icon/SearchIcon.stories.tsx +108 -1161
- package/dist/icons/setting-icon/SettingIcon.stories.tsx +104 -1009
- package/dist/icons/share-icon/ShareIcon.stories.tsx +117 -1064
- package/dist/icons/shield-icon/ShieldIcon.stories.tsx +114 -974
- package/dist/icons/site-logo-icon/SiteLogoIcon.stories.tsx +134 -1160
- package/dist/icons/skip-backward-icon/SkipBackwardIcon.stories.tsx +169 -1017
- package/dist/icons/skip-forward-icon/SkipForwardIcon.stories.tsx +161 -1016
- package/dist/icons/sparkles-soft-icon/SparklesSoftIcon.stories.tsx +102 -1001
- package/dist/icons/spinner-gradient-icon/SpinnerGradientIcon.stories.tsx +155 -593
- package/dist/icons/spinner-solid-icon/SpinnerSolidIcon.stories.tsx +155 -608
- package/dist/icons/spinner-solid-neutral-icon/SpinnerSolidINeutralcon.stories.tsx +142 -712
- package/dist/icons/star-icon/StarIcon.stories.tsx +120 -946
- package/dist/icons/store-coin-icon/StoreCoinIcon.stories.tsx +109 -1013
- package/dist/icons/suggestion-icon/SuggestionIcon.stories.tsx +113 -891
- package/dist/icons/sun-icon/SunIcon.stories.tsx +117 -864
- package/dist/icons/text-color-icon/TextColorIcon.stories.tsx +113 -989
- package/dist/icons/text-indicator-icon/TextIndicatorIcon.stories.tsx +120 -1027
- package/dist/icons/threads-icon/ThreadsIcon.stories.tsx +153 -1476
- package/dist/icons/tick-circle-icon/TickCircleIcon.stories.tsx +143 -1187
- package/dist/icons/tick-icon/TickIcon.stories.tsx +142 -1322
- package/dist/icons/trash-icon/TrashIcon.stories.tsx +105 -970
- package/dist/icons/twitter-x-icon/TwitterXIcon.stories.tsx +154 -1457
- package/dist/icons/upload-icon/UploadIcon.stories.tsx +112 -930
- package/dist/icons/vertical-menu-icon/VerticalMenuIcon.stories.tsx +115 -1019
- package/dist/icons/video-play-list-icon/VideoPlaylistIcon.stories.tsx +122 -1092
- package/dist/icons/voice-playing-icon/VoicePlayingIcon.stories.tsx +120 -1401
- package/dist/icons/volume-full-icon/VolumeFullIcon.stories.tsx +107 -1212
- package/dist/icons/volume-half-icon/VolumeHalfIcon.stories.tsx +109 -1122
- package/dist/icons/volume-off-icon/VolumeOffIcon.stories.tsx +112 -1124
- package/dist/icons/warning-icon/WarningIcon.stories.tsx +119 -1083
- package/dist/icons/youtube-icon/YoutubeIcon.stories.tsx +158 -983
- package/dist/index.cjs +90 -90
- package/dist/index.js +90 -90
- package/package.json +8 -3
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import React from "react"
|
|
2
|
-
import { Button } from "@components/button"
|
|
1
|
+
import React, { useState } from "react"
|
|
3
2
|
import { Label } from "@components/label"
|
|
4
3
|
import type { Meta, StoryObj } from "@storybook/react-vite"
|
|
5
4
|
|
|
5
|
+
import { AuralComponentDocsPage } from "src/ui/story-spec/components/component-story-docs-page"
|
|
6
|
+
|
|
6
7
|
import { Checkbox } from "."
|
|
7
8
|
|
|
8
9
|
const meta: Meta<typeof Checkbox> = {
|
|
@@ -10,12 +11,29 @@ const meta: Meta<typeof Checkbox> = {
|
|
|
10
11
|
component: Checkbox,
|
|
11
12
|
parameters: {
|
|
12
13
|
layout: "centered",
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
docs: {
|
|
15
|
+
description: {
|
|
16
|
+
component:
|
|
17
|
+
"A Radix-based checkbox with unchecked, checked, and indeterminate states. Supports disabled variants and integrates with Label for accessible form controls in settings, preferences, and multi-select UIs.",
|
|
18
|
+
},
|
|
19
|
+
page: () => (
|
|
20
|
+
<AuralComponentDocsPage
|
|
21
|
+
features={[
|
|
22
|
+
{
|
|
23
|
+
title: "3 States",
|
|
24
|
+
description: "Check, partial, unchecked",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
title: "Indeterminate",
|
|
28
|
+
description: "Partial selection support",
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
title: "Label Integration",
|
|
32
|
+
description: "Works with Label element",
|
|
33
|
+
},
|
|
34
|
+
]}
|
|
35
|
+
/>
|
|
36
|
+
),
|
|
19
37
|
},
|
|
20
38
|
},
|
|
21
39
|
tags: ["autodocs"],
|
|
@@ -24,193 +42,317 @@ const meta: Meta<typeof Checkbox> = {
|
|
|
24
42
|
export default meta
|
|
25
43
|
type Story = StoryObj<typeof Checkbox>
|
|
26
44
|
|
|
27
|
-
|
|
28
|
-
render: () => (
|
|
29
|
-
<div className="flex items-center space-x-2">
|
|
30
|
-
<Checkbox id="terms" />
|
|
31
|
-
<Label htmlFor="terms">Accept terms and conditions</Label>
|
|
32
|
-
</div>
|
|
33
|
-
),
|
|
34
|
-
}
|
|
45
|
+
// ─── 1. States ────────────────────────────────────────────────────────────────
|
|
35
46
|
|
|
36
47
|
export const States: Story = {
|
|
37
48
|
render: () => (
|
|
38
|
-
<div className="
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
<
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
<
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
<h3 className="text-lg font-medium">Disabled Unchecked</h3>
|
|
69
|
-
<div className="flex items-center space-x-2">
|
|
70
|
-
<Checkbox id="disabled" disabled />
|
|
71
|
-
<Label htmlFor="disabled" disabled>
|
|
72
|
-
Disabled Unchecked
|
|
73
|
-
</Label>
|
|
74
|
-
</div>
|
|
75
|
-
</div>
|
|
76
|
-
|
|
77
|
-
{/* Disabled Checked */}
|
|
78
|
-
<div className="space-y-2">
|
|
79
|
-
<h3 className="text-lg font-medium">Disabled Checked</h3>
|
|
80
|
-
<div className="flex items-center space-x-2">
|
|
81
|
-
<Checkbox id="disabled-checked" disabled defaultChecked />
|
|
82
|
-
<Label htmlFor="disabled-checked" disabled>
|
|
83
|
-
Disabled Checked
|
|
84
|
-
</Label>
|
|
49
|
+
<div className="space-y-8">
|
|
50
|
+
<div className="space-y-4">
|
|
51
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
52
|
+
Active States
|
|
53
|
+
</h4>
|
|
54
|
+
<div className="flex flex-wrap gap-6">
|
|
55
|
+
<div className="space-y-2 text-center">
|
|
56
|
+
<div className="flex justify-center">
|
|
57
|
+
<Checkbox id="s-unchecked" />
|
|
58
|
+
</div>
|
|
59
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
60
|
+
Unchecked
|
|
61
|
+
</p>
|
|
62
|
+
</div>
|
|
63
|
+
<div className="space-y-2 text-center">
|
|
64
|
+
<div className="flex justify-center">
|
|
65
|
+
<Checkbox id="s-checked" defaultChecked />
|
|
66
|
+
</div>
|
|
67
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
68
|
+
Checked
|
|
69
|
+
</p>
|
|
70
|
+
</div>
|
|
71
|
+
<div className="space-y-2 text-center">
|
|
72
|
+
<div className="flex justify-center">
|
|
73
|
+
<Checkbox id="s-indeterminate" indeterminate defaultChecked />
|
|
74
|
+
</div>
|
|
75
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
76
|
+
Indeterminate
|
|
77
|
+
</p>
|
|
78
|
+
</div>
|
|
85
79
|
</div>
|
|
86
80
|
</div>
|
|
87
81
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
82
|
+
<div className="space-y-4">
|
|
83
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
84
|
+
Disabled States
|
|
85
|
+
</h4>
|
|
86
|
+
<div className="flex flex-wrap gap-6">
|
|
87
|
+
<div className="space-y-2 text-center">
|
|
88
|
+
<div className="flex justify-center">
|
|
89
|
+
<Checkbox id="s-disabled-unchecked" disabled />
|
|
90
|
+
</div>
|
|
91
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
92
|
+
Disabled
|
|
93
|
+
</p>
|
|
94
|
+
</div>
|
|
95
|
+
<div className="space-y-2 text-center">
|
|
96
|
+
<div className="flex justify-center">
|
|
97
|
+
<Checkbox id="s-disabled-checked" disabled defaultChecked />
|
|
98
|
+
</div>
|
|
99
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
100
|
+
Disabled Checked
|
|
101
|
+
</p>
|
|
102
|
+
</div>
|
|
103
|
+
<div className="space-y-2 text-center">
|
|
104
|
+
<div className="flex justify-center">
|
|
105
|
+
<Checkbox
|
|
106
|
+
id="s-disabled-indeterminate"
|
|
107
|
+
disabled
|
|
108
|
+
indeterminate
|
|
109
|
+
defaultChecked
|
|
110
|
+
/>
|
|
111
|
+
</div>
|
|
112
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
113
|
+
Disabled Indeterminate
|
|
114
|
+
</p>
|
|
115
|
+
</div>
|
|
98
116
|
</div>
|
|
99
117
|
</div>
|
|
100
118
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
</
|
|
119
|
+
<div className="space-y-4">
|
|
120
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
121
|
+
With Labels
|
|
122
|
+
</h4>
|
|
123
|
+
<div className="space-y-3">
|
|
124
|
+
<div className="flex items-center gap-3">
|
|
125
|
+
<Checkbox id="sl-unchecked" />
|
|
126
|
+
<Label htmlFor="sl-unchecked">Unchecked option</Label>
|
|
127
|
+
</div>
|
|
128
|
+
<div className="flex items-center gap-3">
|
|
129
|
+
<Checkbox id="sl-checked" defaultChecked />
|
|
130
|
+
<Label htmlFor="sl-checked">Checked option</Label>
|
|
131
|
+
</div>
|
|
132
|
+
<div className="flex items-center gap-3">
|
|
133
|
+
<Checkbox id="sl-indeterminate" indeterminate defaultChecked />
|
|
134
|
+
<Label htmlFor="sl-indeterminate">Indeterminate option</Label>
|
|
135
|
+
</div>
|
|
136
|
+
<div className="flex items-center gap-3">
|
|
137
|
+
<Checkbox id="sl-disabled" disabled />
|
|
138
|
+
<Label htmlFor="sl-disabled" disabled>
|
|
139
|
+
Disabled option
|
|
140
|
+
</Label>
|
|
141
|
+
</div>
|
|
114
142
|
</div>
|
|
115
143
|
</div>
|
|
116
144
|
</div>
|
|
117
145
|
),
|
|
146
|
+
parameters: {
|
|
147
|
+
docs: {
|
|
148
|
+
description: {
|
|
149
|
+
story:
|
|
150
|
+
"All checkbox states — unchecked, checked, indeterminate, and their disabled counterparts — shown as item cards and with label pairings.",
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
},
|
|
118
154
|
}
|
|
119
155
|
|
|
120
|
-
|
|
121
|
-
render: () => (
|
|
122
|
-
<form
|
|
123
|
-
onSubmit={(e) => {
|
|
124
|
-
e.preventDefault()
|
|
125
|
-
alert("Form submitted!")
|
|
126
|
-
}}
|
|
127
|
-
className="space-y-6"
|
|
128
|
-
>
|
|
129
|
-
<div className="space-y-4">
|
|
130
|
-
<div className="flex items-center space-x-2">
|
|
131
|
-
<Checkbox id="newsletter" />
|
|
132
|
-
<Label htmlFor="newsletter">Subscribe to newsletter</Label>
|
|
133
|
-
</div>
|
|
134
|
-
<div className="flex items-center space-x-2">
|
|
135
|
-
<Checkbox id="marketing" />
|
|
136
|
-
<Label htmlFor="marketing">Receive marketing emails</Label>
|
|
137
|
-
</div>
|
|
138
|
-
</div>
|
|
139
|
-
<Button type="submit">Submit</Button>
|
|
140
|
-
</form>
|
|
141
|
-
),
|
|
142
|
-
}
|
|
156
|
+
// ─── 2. Use Cases ─────────────────────────────────────────────────────────────
|
|
143
157
|
|
|
144
|
-
export const
|
|
158
|
+
export const UseCases: Story = {
|
|
145
159
|
render: () => {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
option3: false,
|
|
160
|
+
const [notifications, setNotifications] = useState({
|
|
161
|
+
newReleases: true,
|
|
162
|
+
playlistUpdates: false,
|
|
163
|
+
liveEvents: true,
|
|
164
|
+
weeklyDigest: false,
|
|
152
165
|
})
|
|
153
166
|
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
|
|
167
|
+
const [quality, setQuality] = useState({
|
|
168
|
+
lossless: false,
|
|
169
|
+
spatialAudio: true,
|
|
170
|
+
offlineDownloads: true,
|
|
171
|
+
})
|
|
157
172
|
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
option1: newValue,
|
|
162
|
-
option2: newValue,
|
|
163
|
-
option3: newValue,
|
|
164
|
-
})
|
|
165
|
-
}
|
|
173
|
+
const allNotificationsChecked = Object.values(notifications).every(Boolean)
|
|
174
|
+
const someNotificationsChecked =
|
|
175
|
+
Object.values(notifications).some(Boolean) && !allNotificationsChecked
|
|
166
176
|
|
|
167
|
-
const
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
177
|
+
const handleAllNotifications = () => {
|
|
178
|
+
const next = !allNotificationsChecked
|
|
179
|
+
setNotifications({
|
|
180
|
+
newReleases: next,
|
|
181
|
+
playlistUpdates: next,
|
|
182
|
+
liveEvents: next,
|
|
183
|
+
weeklyDigest: next,
|
|
184
|
+
})
|
|
172
185
|
}
|
|
173
186
|
|
|
174
187
|
return (
|
|
175
|
-
<div className="space-y-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
188
|
+
<div className="mx-auto max-w-3xl space-y-8 p-8">
|
|
189
|
+
{/* Notification Preferences */}
|
|
190
|
+
<div className="space-y-4">
|
|
191
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
192
|
+
Notification Preferences
|
|
193
|
+
</h4>
|
|
194
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary mx-auto max-w-md space-y-1 rounded-xl border p-5">
|
|
195
|
+
{/* Select all */}
|
|
196
|
+
<div className="flex items-center gap-3 pb-3">
|
|
197
|
+
<Checkbox
|
|
198
|
+
id="uc-all-notifications"
|
|
199
|
+
checked={allNotificationsChecked || someNotificationsChecked}
|
|
200
|
+
indeterminate={someNotificationsChecked}
|
|
201
|
+
onCheckedChange={handleAllNotifications}
|
|
202
|
+
/>
|
|
203
|
+
<Label
|
|
204
|
+
htmlFor="uc-all-notifications"
|
|
205
|
+
className="text-fm-primary font-medium"
|
|
206
|
+
>
|
|
207
|
+
All notifications
|
|
208
|
+
</Label>
|
|
209
|
+
</div>
|
|
210
|
+
<div className="border-fm-divider-secondary border-t pt-3">
|
|
211
|
+
<div className="space-y-3 pl-4">
|
|
212
|
+
<div className="flex items-center gap-3">
|
|
213
|
+
<Checkbox
|
|
214
|
+
id="uc-new-releases"
|
|
215
|
+
checked={notifications.newReleases}
|
|
216
|
+
onCheckedChange={(v) =>
|
|
217
|
+
setNotifications((p) => ({
|
|
218
|
+
...p,
|
|
219
|
+
newReleases: v === true,
|
|
220
|
+
}))
|
|
221
|
+
}
|
|
222
|
+
/>
|
|
223
|
+
<div>
|
|
224
|
+
<Label htmlFor="uc-new-releases">New Releases</Label>
|
|
225
|
+
<p className="text-fm-tertiary font-fm-text text-fm-sm leading-fm-sm mt-0.5">
|
|
226
|
+
Artists you follow drop new tracks
|
|
227
|
+
</p>
|
|
228
|
+
</div>
|
|
229
|
+
</div>
|
|
230
|
+
<div className="flex items-center gap-3">
|
|
231
|
+
<Checkbox
|
|
232
|
+
id="uc-playlist-updates"
|
|
233
|
+
checked={notifications.playlistUpdates}
|
|
234
|
+
onCheckedChange={(v) =>
|
|
235
|
+
setNotifications((p) => ({
|
|
236
|
+
...p,
|
|
237
|
+
playlistUpdates: v === true,
|
|
238
|
+
}))
|
|
239
|
+
}
|
|
240
|
+
/>
|
|
241
|
+
<div>
|
|
242
|
+
<Label htmlFor="uc-playlist-updates">
|
|
243
|
+
Playlist Updates
|
|
244
|
+
</Label>
|
|
245
|
+
<p className="text-fm-tertiary font-fm-text text-fm-sm leading-fm-sm mt-0.5">
|
|
246
|
+
Collaborative playlists you're part of
|
|
247
|
+
</p>
|
|
248
|
+
</div>
|
|
249
|
+
</div>
|
|
250
|
+
<div className="flex items-center gap-3">
|
|
251
|
+
<Checkbox
|
|
252
|
+
id="uc-live-events"
|
|
253
|
+
checked={notifications.liveEvents}
|
|
254
|
+
onCheckedChange={(v) =>
|
|
255
|
+
setNotifications((p) => ({
|
|
256
|
+
...p,
|
|
257
|
+
liveEvents: v === true,
|
|
258
|
+
}))
|
|
259
|
+
}
|
|
260
|
+
/>
|
|
261
|
+
<div>
|
|
262
|
+
<Label htmlFor="uc-live-events">Live Events</Label>
|
|
263
|
+
<p className="text-fm-tertiary font-fm-text text-fm-sm leading-fm-sm mt-0.5">
|
|
264
|
+
Concerts and live streams near you
|
|
265
|
+
</p>
|
|
266
|
+
</div>
|
|
267
|
+
</div>
|
|
268
|
+
<div className="flex items-center gap-3">
|
|
269
|
+
<Checkbox
|
|
270
|
+
id="uc-weekly-digest"
|
|
271
|
+
checked={notifications.weeklyDigest}
|
|
272
|
+
onCheckedChange={(v) =>
|
|
273
|
+
setNotifications((p) => ({
|
|
274
|
+
...p,
|
|
275
|
+
weeklyDigest: v === true,
|
|
276
|
+
}))
|
|
277
|
+
}
|
|
278
|
+
/>
|
|
279
|
+
<div>
|
|
280
|
+
<Label htmlFor="uc-weekly-digest">Weekly Digest</Label>
|
|
281
|
+
<p className="text-fm-tertiary font-fm-text text-fm-sm leading-fm-sm mt-0.5">
|
|
282
|
+
Your personalised listening summary
|
|
283
|
+
</p>
|
|
284
|
+
</div>
|
|
285
|
+
</div>
|
|
286
|
+
</div>
|
|
287
|
+
</div>
|
|
195
288
|
</div>
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
289
|
+
</div>
|
|
290
|
+
|
|
291
|
+
{/* Playback Quality */}
|
|
292
|
+
<div className="space-y-4">
|
|
293
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
294
|
+
Playback Quality Settings
|
|
295
|
+
</h4>
|
|
296
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary mx-auto max-w-md space-y-3 rounded-xl border p-5">
|
|
297
|
+
<div className="flex items-center justify-between gap-4">
|
|
298
|
+
<div>
|
|
299
|
+
<Label htmlFor="uc-lossless">Lossless Audio</Label>
|
|
300
|
+
<p className="text-fm-tertiary font-fm-text text-fm-sm leading-fm-sm mt-0.5">
|
|
301
|
+
Stream at full CD-quality resolution
|
|
302
|
+
</p>
|
|
303
|
+
</div>
|
|
304
|
+
<Checkbox
|
|
305
|
+
id="uc-lossless"
|
|
306
|
+
checked={quality.lossless}
|
|
307
|
+
onCheckedChange={(v) =>
|
|
308
|
+
setQuality((p) => ({ ...p, lossless: v === true }))
|
|
309
|
+
}
|
|
310
|
+
/>
|
|
311
|
+
</div>
|
|
312
|
+
<div className="border-fm-divider-secondary border-t" />
|
|
313
|
+
<div className="flex items-center justify-between gap-4">
|
|
314
|
+
<div>
|
|
315
|
+
<Label htmlFor="uc-spatial">Spatial Audio</Label>
|
|
316
|
+
<p className="text-fm-tertiary font-fm-text text-fm-sm leading-fm-sm mt-0.5">
|
|
317
|
+
Immersive 3D sound on supported tracks
|
|
318
|
+
</p>
|
|
319
|
+
</div>
|
|
320
|
+
<Checkbox
|
|
321
|
+
id="uc-spatial"
|
|
322
|
+
checked={quality.spatialAudio}
|
|
323
|
+
onCheckedChange={(v) =>
|
|
324
|
+
setQuality((p) => ({ ...p, spatialAudio: v === true }))
|
|
325
|
+
}
|
|
326
|
+
/>
|
|
327
|
+
</div>
|
|
328
|
+
<div className="border-fm-divider-secondary border-t" />
|
|
329
|
+
<div className="flex items-center justify-between gap-4">
|
|
330
|
+
<div>
|
|
331
|
+
<Label htmlFor="uc-offline">Offline Downloads</Label>
|
|
332
|
+
<p className="text-fm-tertiary font-fm-text text-fm-sm leading-fm-sm mt-0.5">
|
|
333
|
+
Save tracks for listening without internet
|
|
334
|
+
</p>
|
|
335
|
+
</div>
|
|
336
|
+
<Checkbox
|
|
337
|
+
id="uc-offline"
|
|
338
|
+
checked={quality.offlineDownloads}
|
|
339
|
+
onCheckedChange={(v) =>
|
|
340
|
+
setQuality((p) => ({ ...p, offlineDownloads: v === true }))
|
|
341
|
+
}
|
|
342
|
+
/>
|
|
343
|
+
</div>
|
|
211
344
|
</div>
|
|
212
345
|
</div>
|
|
213
346
|
</div>
|
|
214
347
|
)
|
|
215
348
|
},
|
|
349
|
+
parameters: {
|
|
350
|
+
layout: "fullscreen",
|
|
351
|
+
docs: {
|
|
352
|
+
description: {
|
|
353
|
+
story:
|
|
354
|
+
"Real-world audio app scenarios: a notification preferences panel with a parent indeterminate 'select all' checkbox, and a playback quality settings form.",
|
|
355
|
+
},
|
|
356
|
+
},
|
|
357
|
+
},
|
|
216
358
|
}
|