aural-ui 3.0.7 → 4.1.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/dist/components/aspect-ratio/AspectRatio.stories.tsx +290 -1199
- package/dist/components/avatar/Avatar.stories.tsx +235 -237
- 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/button/index.tsx +7 -7
- 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 -620
- 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 +533 -856
- package/dist/components/dialog/Dialog.stories.tsx +505 -949
- package/dist/components/divider/Divider.stories.tsx +265 -502
- package/dist/components/dot-loader/DotLoader.stories.tsx +256 -257
- package/dist/components/drawer/Drawer.stories.tsx +659 -993
- package/dist/components/drawer/index.tsx +3 -3
- package/dist/components/dropdown/Dropdown.stories.tsx +643 -1018
- 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 -1221
- 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 +485 -822
- package/dist/components/marquee/Marquee.stories.tsx +356 -694
- package/dist/components/otp-inputs/OtpInputs.stories.tsx +352 -410
- package/dist/components/overlay/Overlay.stories.tsx +452 -818
- package/dist/components/overlay/index.tsx +4 -4
- package/dist/components/pagination/Pagination.stories.tsx +721 -210
- package/dist/components/popover/Popover.stories.tsx +484 -873
- package/dist/components/radio/Radio.stories.tsx +432 -124
- package/dist/components/resizable/Resizable.stories.tsx +496 -752
- package/dist/components/scroll-area/ScrollArea.stories.tsx +384 -1006
- package/dist/components/search/Search.stories.tsx +314 -575
- package/dist/components/select/Select.stories.tsx +684 -787
- package/dist/components/sheet/Sheet.stories.tsx +671 -936
- package/dist/components/skelton/Skelton.stories.tsx +230 -764
- package/dist/components/slider/Slider.stories.tsx +384 -737
- 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 -914
- package/dist/components/tabs/Tabs.stories.tsx +459 -1400
- 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 -148
- package/dist/components/toast/Toast.stories.tsx +452 -1333
- package/dist/components/toggle/Toggle.stories.tsx +488 -909
- package/dist/components/tooltip/Tooltip.stories.tsx +344 -1372
- 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 +226 -1013
- package/dist/icons/alert-icon/AlertIcon.stories.tsx +109 -929
- package/dist/icons/all-icons.tsx +124 -87
- package/dist/icons/angle-down-icon/AngleDownIcon.stories.tsx +140 -971
- package/dist/icons/apple-logo-icon/AppleLogoIcon.stories.tsx +148 -888
- package/dist/icons/arrow-box-left-icon/ArrowBoxLeftIcon.stories.tsx +135 -1019
- package/dist/icons/arrow-corner-up-left-icon/ArrowCornerUpLeftIcon.stories.tsx +137 -953
- package/dist/icons/arrow-corner-up-right-icon/ArrowCornerUpRightIcon.stories.tsx +138 -997
- package/dist/icons/arrow-left-icon/ArrowLeftIcon.stories.tsx +136 -942
- package/dist/icons/arrow-right-icon/ArrowRightIcon.stories.tsx +148 -1092
- package/dist/icons/arrow-right-up-icon/ArrowRightUpIcon.stories.tsx +146 -1211
- package/dist/icons/art-board-icon/ArtBoardIcon.stories.tsx +126 -615
- package/dist/icons/audio-bar-icon/AudioBarIcon.stories.tsx +144 -1164
- package/dist/icons/backward-ten-seconds-icon/BackwardTenSecondsIcon.stories.tsx +167 -985
- package/dist/icons/bubble-check-icon/BubbleCheckIcon.stories.tsx +122 -1179
- package/dist/icons/bubble-crossed-icon/BubbleCrossedIcon.stories.tsx +124 -1168
- package/dist/icons/bubble-sparkle-icon/BubbleSparkleIcon.stories.tsx +119 -850
- package/dist/icons/camera-icon/CameraIcon.stories.tsx +112 -1213
- package/dist/icons/capital-a-letter-icon/CapitalALetterIcon.stories.tsx +117 -934
- package/dist/icons/chevron-double-left-icon/ChevronDoubleLeftIcon.stories.tsx +160 -961
- package/dist/icons/chevron-double-right-icon/ChevronDoubleRightIcon.stories.tsx +163 -961
- package/dist/icons/chevron-down-icon/ChevronDownIcon.stories.tsx +144 -942
- package/dist/icons/chevron-left-icon/ChevronLeftIcon.stories.tsx +129 -966
- package/dist/icons/chevron-right-icon/ChevronRightIcon.stories.tsx +147 -964
- package/dist/icons/chevron-up-icon/ChevronUpIcon.stories.tsx +145 -975
- package/dist/icons/circle-tick-icon/CircleTickIcon.stories.tsx +150 -1142
- package/dist/icons/circular-play-icon/CircularPlayIcon.stories.tsx +114 -461
- package/dist/icons/coin-icon/CoinIcon.stories.tsx +124 -1322
- package/dist/icons/coin-toons-icon/CoinToonsIcon.stories.tsx +117 -1318
- package/dist/icons/column-wide-add-icon/ColumnWideAddIcon.stories.tsx +114 -903
- package/dist/icons/command-icon/CommandIcon.stories.tsx +127 -1042
- package/dist/icons/copy-icon/CopyIcon.stories.tsx +123 -962
- package/dist/icons/cross-circle-icon/CrossCircleIcon.stories.tsx +147 -999
- package/dist/icons/cross-icon/CrossIcon.stories.tsx +139 -960
- package/dist/icons/download-icon/DownloadIcon.stories.tsx +126 -820
- package/dist/icons/edit-big-icon/EditBigIcon.stories.tsx +124 -1031
- package/dist/icons/email-icon/EmailIcon.stories.tsx +115 -936
- package/dist/icons/expand-icon/ExpandIcon.stories.tsx +112 -1111
- package/dist/icons/eye-close-icon/EyeCloseIcon.stories.tsx +144 -1025
- package/dist/icons/eye-open-icon/EyeOpenIcon.stories.tsx +143 -1036
- package/dist/icons/feature-shine-icon/FeatureShineIcon.stories.tsx +127 -1011
- package/dist/icons/file-chart-icon/FileChartIcon.stories.tsx +126 -1056
- package/dist/icons/file-text-icon/FileTextIcon.stories.tsx +125 -614
- package/dist/icons/filter-bar-row-icon/FilterBarRowIcon.stories.tsx +119 -1050
- package/dist/icons/forward-ten-seconds-icon/ForwardTenSecondsIcon.stories.tsx +169 -989
- package/dist/icons/git-branch-icon/GitBranchIcon.stories.tsx +115 -1145
- package/dist/icons/git-fork-icon/GitForkIcon.stories.tsx +115 -1122
- package/dist/icons/globe-icon/GlobeIcon.stories.tsx +130 -313
- package/dist/icons/google-logo-icon/GoogleLogoIcon.stories.tsx +145 -940
- package/dist/icons/grip-vertical-icon/GripVerticalIcon.stories.tsx +119 -1174
- package/dist/icons/head-icon/HeadIcon.stories.tsx +111 -916
- package/dist/icons/heart-icon/HeartIcon.stories.tsx +120 -1019
- package/dist/icons/image-avatar-sparkle-icon/ImageAvatarSparkleIcon.stories.tsx +119 -683
- package/dist/icons/image-icon/ImageIcon.stories.tsx +105 -1121
- package/dist/icons/import-folder-icon/ImportFolderIcon.stories.tsx +111 -1192
- package/dist/icons/import-left-arrow-folder-icon/ImportLeftArrowFolderIcon.stories.tsx +136 -1256
- package/dist/icons/indian-flag-icon/IndianFlagIcon.stories.tsx +159 -962
- package/dist/icons/instagram-icon/InstagramIcon.stories.tsx +161 -1385
- package/dist/icons/layout-column-icon/LayoutColumnIcon.stories.tsx +124 -972
- package/dist/icons/layout-left-icon/LayoutLeftIcon.stories.tsx +119 -948
- package/dist/icons/layout-right-icon/LayoutRightIcon.stories.tsx +119 -942
- package/dist/icons/light-bulb-simple-icon/LightBulbSimpleIcon.stories.tsx +108 -1215
- package/dist/icons/linked-in-icon/LinkedInIcon.stories.tsx +154 -1517
- package/dist/icons/magic-book-icon/MagicBookIcon.stories.tsx +110 -1188
- package/dist/icons/magic-edit-icon/MagicEditIcon.stories.tsx +119 -678
- package/dist/icons/maintenance-icon/MaintenanceIcon.stories.tsx +123 -1184
- package/dist/icons/message-icon/MessageIcon.stories.tsx +114 -538
- package/dist/icons/minimize-icon/MinimizeIcon.stories.tsx +116 -1158
- package/dist/icons/moon-icon/MoonIcon.stories.tsx +120 -536
- package/dist/icons/move-horizontal-icon/MoveHorizontalIcon.stories.tsx +109 -1184
- package/dist/icons/move-vertical-icon/MoveVerticalIcon.stories.tsx +115 -1134
- package/dist/icons/musical-note-icon/MusicalNoteIcon.stories.tsx +119 -971
- package/dist/icons/notepad-icon/NotepadIcon.stories.tsx +111 -1100
- package/dist/icons/notes-icon/NotesIcon.stories.tsx +119 -1101
- package/dist/icons/page-search-icon/PageSearchIcon.stories.tsx +109 -1111
- package/dist/icons/page-text-icon/PageTextIcon.stories.tsx +122 -684
- package/dist/icons/paint-roll-icon/PaintRollIcon.stories.tsx +113 -954
- package/dist/icons/paper-plane-icon/PaperPlaneIcon.stories.tsx +112 -877
- package/dist/icons/pause-icon/PauseIcon.stories.tsx +113 -1000
- package/dist/icons/pencil-icon/PencilIcon.stories.tsx +115 -1070
- package/dist/icons/phone-icon/PhoneIcon.stories.tsx +115 -978
- package/dist/icons/plus-icon/PlusIcon.stories.tsx +106 -1093
- package/dist/icons/pocket-studio-icon/PocketStudioIcon.stories.tsx +107 -829
- package/dist/icons/scroll-down-icon/ScrollDownIcon.stories.tsx +102 -469
- package/dist/icons/search-icon/SearchIcon.stories.tsx +111 -1124
- package/dist/icons/setting-icon/SettingIcon.stories.tsx +107 -970
- package/dist/icons/share-icon/ShareIcon.stories.tsx +120 -1025
- package/dist/icons/shield-icon/ShieldIcon.stories.tsx +117 -931
- package/dist/icons/site-logo-icon/SiteLogoIcon.stories.tsx +137 -1104
- package/dist/icons/skip-backward-icon/SkipBackwardIcon.stories.tsx +172 -982
- package/dist/icons/skip-forward-icon/SkipForwardIcon.stories.tsx +164 -983
- package/dist/icons/sparkles-soft-icon/SparklesSoftIcon.stories.tsx +105 -958
- package/dist/icons/spinner-gradient-icon/SpinnerGradientIcon.stories.tsx +158 -580
- package/dist/icons/spinner-gradient-icon/index.tsx +6 -1
- package/dist/icons/spinner-solid-icon/SpinnerSolidIcon.stories.tsx +158 -587
- package/dist/icons/spinner-solid-icon/index.tsx +6 -1
- package/dist/icons/spinner-solid-neutral-icon/SpinnerSolidINeutralcon.stories.tsx +146 -682
- package/dist/icons/spinner-solid-neutral-icon/index.tsx +1 -1
- package/dist/icons/star-icon/StarIcon.stories.tsx +124 -904
- package/dist/icons/store-coin-icon/StoreCoinIcon.stories.tsx +112 -964
- package/dist/icons/suggestion-icon/SuggestionIcon.stories.tsx +116 -852
- package/dist/icons/sun-icon/SunIcon.stories.tsx +120 -831
- package/dist/icons/text-color-icon/TextColorIcon.stories.tsx +116 -950
- package/dist/icons/text-indicator-icon/TextIndicatorIcon.stories.tsx +123 -980
- package/dist/icons/threads-icon/ThreadsIcon.stories.tsx +156 -1427
- package/dist/icons/tick-circle-icon/TickCircleIcon.stories.tsx +146 -1142
- package/dist/icons/tick-icon/TickIcon.stories.tsx +145 -1276
- package/dist/icons/trash-icon/TrashIcon.stories.tsx +108 -933
- package/dist/icons/twitter-x-icon/TwitterXIcon.stories.tsx +157 -1402
- package/dist/icons/upload-icon/UploadIcon.stories.tsx +115 -889
- package/dist/icons/vertical-menu-icon/VerticalMenuIcon.stories.tsx +118 -984
- package/dist/icons/video-play-list-icon/VideoPlaylistIcon.stories.tsx +125 -1049
- package/dist/icons/voice-playing-icon/VoicePlayingIcon.stories.tsx +123 -1356
- package/dist/icons/volume-full-icon/VolumeFullIcon.stories.tsx +110 -1171
- package/dist/icons/volume-half-icon/VolumeHalfIcon.stories.tsx +112 -1093
- package/dist/icons/volume-off-icon/VolumeOffIcon.stories.tsx +115 -1087
- package/dist/icons/warning-icon/WarningIcon.stories.tsx +122 -1046
- package/dist/icons/youtube-icon/YoutubeIcon.stories.tsx +161 -936
- package/dist/index.cjs +84 -84
- package/dist/index.js +84 -84
- package/dist/styles/aural-all-theme.css +1222 -0
- package/dist/styles/{aural-theme.css → aural-dark-theme.css} +15 -3
- package/dist/styles/aural-light-theme.css +1047 -0
- package/package.json +1 -1
|
@@ -1,9 +1,14 @@
|
|
|
1
|
-
import React from "react"
|
|
1
|
+
import React, { useState } from "react"
|
|
2
2
|
import { AngleDownIcon } from "@icons/angle-down-icon"
|
|
3
3
|
import { CrossCircleIcon } from "@icons/cross-circle-icon"
|
|
4
4
|
import { FeatureShineIcon } from "@icons/feature-shine-icon"
|
|
5
|
+
import { MusicalNoteIcon } from "@icons/musical-note-icon"
|
|
6
|
+
import { SearchIcon } from "@icons/search-icon"
|
|
7
|
+
import { StarIcon } from "@icons/star-icon"
|
|
5
8
|
import type { Meta, StoryObj } from "@storybook/react-vite"
|
|
6
9
|
|
|
10
|
+
import { AuralComponentDocsPage } from "src/ui/story-spec/components/component-story-docs-page"
|
|
11
|
+
|
|
7
12
|
import { Chip } from "."
|
|
8
13
|
|
|
9
14
|
const meta: Meta<typeof Chip> = {
|
|
@@ -12,206 +17,395 @@ const meta: Meta<typeof Chip> = {
|
|
|
12
17
|
tags: ["autodocs"],
|
|
13
18
|
parameters: {
|
|
14
19
|
layout: "centered",
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
docs: {
|
|
21
|
+
description: {
|
|
22
|
+
component:
|
|
23
|
+
"A compact filter chip for selecting and toggling categories, tags, or attributes. Supports selected state with contrasting surface, and optional left and/or right icons.",
|
|
24
|
+
},
|
|
25
|
+
page: () => (
|
|
26
|
+
<AuralComponentDocsPage
|
|
27
|
+
features={[
|
|
28
|
+
{
|
|
29
|
+
title: "Selected State",
|
|
30
|
+
description: "Contrasting active surface",
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
title: "Icon Slots",
|
|
34
|
+
description: "Left, right, or both",
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
title: "Single & Multi-select",
|
|
38
|
+
description: "Works both ways",
|
|
39
|
+
},
|
|
40
|
+
]}
|
|
41
|
+
/>
|
|
42
|
+
),
|
|
21
43
|
},
|
|
22
44
|
},
|
|
23
45
|
argTypes: {
|
|
24
46
|
selected: {
|
|
25
47
|
control: "boolean",
|
|
26
|
-
description: "Whether the chip is selected",
|
|
27
|
-
},
|
|
28
|
-
leftIcon: {
|
|
29
|
-
control: "boolean",
|
|
30
|
-
description: "Icon to display on the left side of the chip",
|
|
48
|
+
description: "Whether the chip is in the selected/active state",
|
|
31
49
|
},
|
|
32
|
-
rightIcon: {
|
|
33
|
-
control: "boolean",
|
|
34
|
-
description: "Icon to display on the right side of the chip",
|
|
35
|
-
},
|
|
36
|
-
onSelect: { action: "selected" },
|
|
37
50
|
children: {
|
|
38
51
|
control: "text",
|
|
39
|
-
description: "
|
|
52
|
+
description: "Label text displayed inside the chip",
|
|
40
53
|
},
|
|
54
|
+
onSelect: { action: "selected" },
|
|
41
55
|
},
|
|
42
56
|
}
|
|
43
57
|
|
|
44
58
|
export default meta
|
|
45
59
|
type Story = StoryObj<typeof Chip>
|
|
46
60
|
|
|
47
|
-
|
|
48
|
-
args: {
|
|
49
|
-
children: "CHIPS",
|
|
50
|
-
},
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export const WithLeftIcon: Story = {
|
|
54
|
-
args: {
|
|
55
|
-
children: "CHIPS",
|
|
56
|
-
leftIcon: true,
|
|
57
|
-
},
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export const WithRightIcon: Story = {
|
|
61
|
-
args: {
|
|
62
|
-
children: "CHIPS",
|
|
63
|
-
rightIcon: true,
|
|
64
|
-
},
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export const WithBothIcons: Story = {
|
|
68
|
-
args: {
|
|
69
|
-
children: "CHIPS",
|
|
70
|
-
leftIcon: true,
|
|
71
|
-
rightIcon: true,
|
|
72
|
-
},
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export const Selected: Story = {
|
|
76
|
-
args: {
|
|
77
|
-
children: "CHIPS",
|
|
78
|
-
selected: true,
|
|
79
|
-
},
|
|
80
|
-
}
|
|
61
|
+
// ─── 1. Playground ────────────────────────────────────────────────────────────
|
|
81
62
|
|
|
82
|
-
export const
|
|
63
|
+
export const Playground: Story = {
|
|
83
64
|
args: {
|
|
84
|
-
children: "
|
|
85
|
-
selected:
|
|
86
|
-
leftIcon: true,
|
|
65
|
+
children: "Genre",
|
|
66
|
+
selected: false,
|
|
87
67
|
},
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
68
|
+
render: (args) => (
|
|
69
|
+
<div className="w-full max-w-sm space-y-4">
|
|
70
|
+
<div className="flex justify-center">
|
|
71
|
+
<Chip {...args} />
|
|
72
|
+
</div>
|
|
73
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary rounded-lg border px-4 py-3">
|
|
74
|
+
<code className="text-fm-secondary text-fm-md leading-fm-md font-(--font-fm-mono)">{`<Chip selected={${args.selected}}>${args.children}</Chip>`}</code>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
),
|
|
78
|
+
parameters: {
|
|
79
|
+
docs: {
|
|
80
|
+
description: {
|
|
81
|
+
story:
|
|
82
|
+
"Toggle the selected state and edit the label using the controls panel in the sidebar.",
|
|
83
|
+
},
|
|
84
|
+
},
|
|
94
85
|
},
|
|
95
86
|
}
|
|
96
87
|
|
|
97
|
-
|
|
98
|
-
args: {
|
|
99
|
-
children: "CHIPS",
|
|
100
|
-
rightIcon: true,
|
|
101
|
-
},
|
|
102
|
-
}
|
|
88
|
+
// ─── 2. All Variants ──────────────────────────────────────────────────────────
|
|
103
89
|
|
|
104
|
-
export const
|
|
90
|
+
export const AllVariants: Story = {
|
|
105
91
|
render: () => (
|
|
106
|
-
<
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
<
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
COLORED ICONS
|
|
158
|
-
</Chip>
|
|
159
|
-
<Chip
|
|
160
|
-
leftIcon={true}
|
|
161
|
-
rightIcon={
|
|
162
|
-
<AngleDownIcon color="currentColor" width={16} height={16} />
|
|
163
|
-
}
|
|
164
|
-
>
|
|
165
|
-
DEFAULT & CUSTOM
|
|
166
|
-
</Chip>
|
|
167
|
-
</div>
|
|
168
|
-
</div>
|
|
169
|
-
)
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
export const ChipVariants = () => {
|
|
173
|
-
return (
|
|
174
|
-
<div className="bg-fm-neutral-0 text-fm-neutral-1100 p-fm-5xl font-fm-text">
|
|
175
|
-
<h2 className="text-fm-yellow-500 text-fm-sm mb-fm-4xl">VARIANTS</h2>
|
|
176
|
-
|
|
177
|
-
<h1 className="text-fm-5xl mb-fm-4xl">Chips</h1>
|
|
178
|
-
|
|
179
|
-
<p className="text-fm-lg leading-fm-xl text-fm-neutral-600 mb-fm-7xl max-w-[80%]">
|
|
180
|
-
Chips are compact UI elements representing inputs, attributes, or
|
|
181
|
-
actions. They display information, make selections, filter content, or
|
|
182
|
-
trigger actions. Ensure chips are clear, consistent, accessible, and
|
|
183
|
-
provide visual feedback.
|
|
184
|
-
</p>
|
|
185
|
-
|
|
186
|
-
<div className="gap-fm-8xl flex flex-wrap">
|
|
187
|
-
<div className="gap-fm-4xl flex flex-col">
|
|
188
|
-
<h3 className="text-fm-neutral-600 text-fm-sm">DEFAULT</h3>
|
|
189
|
-
<div className="gap-fm-2xl flex">
|
|
190
|
-
<Chip leftIcon={true}>CHIPS</Chip>
|
|
191
|
-
<Chip>CHIPS</Chip>
|
|
92
|
+
<div className="space-y-8">
|
|
93
|
+
{/* Unselected row */}
|
|
94
|
+
<div className="space-y-4">
|
|
95
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
96
|
+
Unselected
|
|
97
|
+
</h4>
|
|
98
|
+
<div className="flex flex-wrap gap-4">
|
|
99
|
+
<div className="space-y-2 text-center">
|
|
100
|
+
<Chip>No Icon</Chip>
|
|
101
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
102
|
+
Text only
|
|
103
|
+
</p>
|
|
104
|
+
</div>
|
|
105
|
+
<div className="space-y-2 text-center">
|
|
106
|
+
<Chip
|
|
107
|
+
leftIcon={
|
|
108
|
+
<FeatureShineIcon width={14} height={14} color="currentColor" />
|
|
109
|
+
}
|
|
110
|
+
>
|
|
111
|
+
Left Icon
|
|
112
|
+
</Chip>
|
|
113
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
114
|
+
Left icon
|
|
115
|
+
</p>
|
|
116
|
+
</div>
|
|
117
|
+
<div className="space-y-2 text-center">
|
|
118
|
+
<Chip
|
|
119
|
+
rightIcon={
|
|
120
|
+
<AngleDownIcon width={14} height={14} color="currentColor" />
|
|
121
|
+
}
|
|
122
|
+
>
|
|
123
|
+
Right Icon
|
|
124
|
+
</Chip>
|
|
125
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
126
|
+
Right icon
|
|
127
|
+
</p>
|
|
128
|
+
</div>
|
|
129
|
+
<div className="space-y-2 text-center">
|
|
130
|
+
<Chip
|
|
131
|
+
leftIcon={
|
|
132
|
+
<FeatureShineIcon width={14} height={14} color="currentColor" />
|
|
133
|
+
}
|
|
134
|
+
rightIcon={
|
|
135
|
+
<AngleDownIcon width={14} height={14} color="currentColor" />
|
|
136
|
+
}
|
|
137
|
+
>
|
|
138
|
+
Both Icons
|
|
139
|
+
</Chip>
|
|
140
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
141
|
+
Both icons
|
|
142
|
+
</p>
|
|
192
143
|
</div>
|
|
193
144
|
</div>
|
|
145
|
+
</div>
|
|
194
146
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
147
|
+
{/* Selected row */}
|
|
148
|
+
<div className="space-y-4">
|
|
149
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
150
|
+
Selected
|
|
151
|
+
</h4>
|
|
152
|
+
<div className="flex flex-wrap gap-4">
|
|
153
|
+
<div className="space-y-2 text-center">
|
|
154
|
+
<Chip selected>No Icon</Chip>
|
|
155
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
156
|
+
Text only
|
|
157
|
+
</p>
|
|
158
|
+
</div>
|
|
159
|
+
<div className="space-y-2 text-center">
|
|
160
|
+
<Chip
|
|
161
|
+
selected
|
|
162
|
+
leftIcon={
|
|
163
|
+
<FeatureShineIcon width={14} height={14} color="currentColor" />
|
|
164
|
+
}
|
|
165
|
+
>
|
|
166
|
+
Left Icon
|
|
200
167
|
</Chip>
|
|
201
|
-
<
|
|
168
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
169
|
+
Left icon
|
|
170
|
+
</p>
|
|
171
|
+
</div>
|
|
172
|
+
<div className="space-y-2 text-center">
|
|
173
|
+
<Chip
|
|
174
|
+
selected
|
|
175
|
+
rightIcon={
|
|
176
|
+
<CrossCircleIcon width={14} height={14} color="currentColor" />
|
|
177
|
+
}
|
|
178
|
+
>
|
|
179
|
+
Right Icon
|
|
180
|
+
</Chip>
|
|
181
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
182
|
+
Right icon
|
|
183
|
+
</p>
|
|
184
|
+
</div>
|
|
185
|
+
<div className="space-y-2 text-center">
|
|
186
|
+
<Chip
|
|
187
|
+
selected
|
|
188
|
+
leftIcon={
|
|
189
|
+
<FeatureShineIcon width={14} height={14} color="currentColor" />
|
|
190
|
+
}
|
|
191
|
+
rightIcon={
|
|
192
|
+
<CrossCircleIcon width={14} height={14} color="currentColor" />
|
|
193
|
+
}
|
|
194
|
+
>
|
|
195
|
+
Both Icons
|
|
196
|
+
</Chip>
|
|
197
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
198
|
+
Both icons
|
|
199
|
+
</p>
|
|
202
200
|
</div>
|
|
203
201
|
</div>
|
|
202
|
+
</div>
|
|
204
203
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
204
|
+
{/* With meaningful icons */}
|
|
205
|
+
<div className="space-y-4">
|
|
206
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
207
|
+
With contextual icons
|
|
208
|
+
</h4>
|
|
209
|
+
<div className="flex flex-wrap gap-4">
|
|
210
|
+
<div className="space-y-2 text-center">
|
|
211
|
+
<Chip
|
|
212
|
+
leftIcon={
|
|
213
|
+
<SearchIcon width={14} height={14} color="currentColor" />
|
|
214
|
+
}
|
|
215
|
+
>
|
|
216
|
+
Search
|
|
217
|
+
</Chip>
|
|
218
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
219
|
+
Search
|
|
220
|
+
</p>
|
|
221
|
+
</div>
|
|
222
|
+
<div className="space-y-2 text-center">
|
|
223
|
+
<Chip
|
|
224
|
+
selected
|
|
225
|
+
leftIcon={
|
|
226
|
+
<StarIcon width={14} height={14} color="currentColor" />
|
|
227
|
+
}
|
|
228
|
+
>
|
|
229
|
+
Featured
|
|
230
|
+
</Chip>
|
|
231
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
232
|
+
Featured (selected)
|
|
233
|
+
</p>
|
|
234
|
+
</div>
|
|
235
|
+
<div className="space-y-2 text-center">
|
|
236
|
+
<Chip
|
|
237
|
+
leftIcon={
|
|
238
|
+
<MusicalNoteIcon width={14} height={14} color="currentColor" />
|
|
239
|
+
}
|
|
240
|
+
rightIcon={
|
|
241
|
+
<AngleDownIcon width={14} height={14} color="currentColor" />
|
|
242
|
+
}
|
|
243
|
+
>
|
|
244
|
+
Genre
|
|
245
|
+
</Chip>
|
|
246
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
247
|
+
With expand
|
|
248
|
+
</p>
|
|
249
|
+
</div>
|
|
250
|
+
<div className="space-y-2 text-center">
|
|
251
|
+
<Chip
|
|
252
|
+
selected
|
|
253
|
+
leftIcon={
|
|
254
|
+
<MusicalNoteIcon width={14} height={14} color="currentColor" />
|
|
255
|
+
}
|
|
256
|
+
rightIcon={
|
|
257
|
+
<CrossCircleIcon width={14} height={14} color="currentColor" />
|
|
258
|
+
}
|
|
259
|
+
>
|
|
260
|
+
Pop
|
|
210
261
|
</Chip>
|
|
211
|
-
<
|
|
262
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
263
|
+
Active filter
|
|
264
|
+
</p>
|
|
212
265
|
</div>
|
|
213
266
|
</div>
|
|
214
267
|
</div>
|
|
215
268
|
</div>
|
|
216
|
-
)
|
|
269
|
+
),
|
|
270
|
+
parameters: {
|
|
271
|
+
docs: {
|
|
272
|
+
description: {
|
|
273
|
+
story:
|
|
274
|
+
"Full visual matrix: selected × unselected crossed with no-icon, left-icon, right-icon, and both-icon configurations.",
|
|
275
|
+
},
|
|
276
|
+
},
|
|
277
|
+
},
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// ─── 3. Interactive ───────────────────────────────────────────────────────────
|
|
281
|
+
|
|
282
|
+
export const Interactive: Story = {
|
|
283
|
+
render: () => {
|
|
284
|
+
const genres = [
|
|
285
|
+
"All",
|
|
286
|
+
"Pop",
|
|
287
|
+
"Rock",
|
|
288
|
+
"Hip-Hop",
|
|
289
|
+
"Jazz",
|
|
290
|
+
"Classical",
|
|
291
|
+
"Electronic",
|
|
292
|
+
"R&B",
|
|
293
|
+
]
|
|
294
|
+
const moods = ["Energetic", "Chill", "Focus", "Workout", "Sleep", "Happy"]
|
|
295
|
+
|
|
296
|
+
const [selectedGenre, setSelectedGenre] = useState<string>("All")
|
|
297
|
+
const [selectedMoods, setSelectedMoods] = useState<Set<string>>(new Set())
|
|
298
|
+
|
|
299
|
+
const toggleMood = (mood: string) => {
|
|
300
|
+
setSelectedMoods((prev) => {
|
|
301
|
+
const next = new Set(prev)
|
|
302
|
+
if (next.has(mood)) {
|
|
303
|
+
next.delete(mood)
|
|
304
|
+
} else {
|
|
305
|
+
next.add(mood)
|
|
306
|
+
}
|
|
307
|
+
return next
|
|
308
|
+
})
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
return (
|
|
312
|
+
<div className="w-full p-8">
|
|
313
|
+
<div className="mx-auto max-w-3xl space-y-6">
|
|
314
|
+
<div className="grid grid-cols-1 gap-6 lg:grid-cols-3">
|
|
315
|
+
{/* Controls panel */}
|
|
316
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary space-y-5 rounded-xl border p-5">
|
|
317
|
+
<p className="text-fm-primary font-fm-brand text-fm-sm leading-fm-sm font-semibold tracking-widest uppercase">
|
|
318
|
+
Selection Mode
|
|
319
|
+
</p>
|
|
320
|
+
<div className="space-y-3">
|
|
321
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
322
|
+
Genre uses <strong>single-select</strong>. Mood uses{" "}
|
|
323
|
+
<strong>multi-select</strong>.
|
|
324
|
+
</p>
|
|
325
|
+
</div>
|
|
326
|
+
<div className="border-fm-divider-secondary border-t pt-4" />
|
|
327
|
+
<div className="space-y-2">
|
|
328
|
+
<p className="text-fm-secondary font-fm-text text-fm-xs leading-fm-xs tracking-wider uppercase">
|
|
329
|
+
Selected genre
|
|
330
|
+
</p>
|
|
331
|
+
<p className="text-fm-primary font-fm-brand text-fm-md leading-fm-md font-semibold">
|
|
332
|
+
{selectedGenre}
|
|
333
|
+
</p>
|
|
334
|
+
</div>
|
|
335
|
+
<div className="space-y-2">
|
|
336
|
+
<p className="text-fm-secondary font-fm-text text-fm-xs leading-fm-xs tracking-wider uppercase">
|
|
337
|
+
Active moods
|
|
338
|
+
</p>
|
|
339
|
+
<p className="text-fm-primary font-fm-brand text-fm-md leading-fm-md font-semibold">
|
|
340
|
+
{selectedMoods.size === 0
|
|
341
|
+
? "None"
|
|
342
|
+
: Array.from(selectedMoods).join(", ")}
|
|
343
|
+
</p>
|
|
344
|
+
</div>
|
|
345
|
+
</div>
|
|
346
|
+
|
|
347
|
+
{/* Preview stage */}
|
|
348
|
+
<div className="flex flex-col gap-6 lg:col-span-2">
|
|
349
|
+
<div className="space-y-4">
|
|
350
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
351
|
+
Genre — single select
|
|
352
|
+
</h4>
|
|
353
|
+
<div className="flex flex-wrap gap-3">
|
|
354
|
+
{genres.map((genre) => (
|
|
355
|
+
<Chip
|
|
356
|
+
key={genre}
|
|
357
|
+
selected={selectedGenre === genre}
|
|
358
|
+
onSelect={() => setSelectedGenre(genre)}
|
|
359
|
+
>
|
|
360
|
+
{genre}
|
|
361
|
+
</Chip>
|
|
362
|
+
))}
|
|
363
|
+
</div>
|
|
364
|
+
</div>
|
|
365
|
+
|
|
366
|
+
<div className="space-y-4">
|
|
367
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
368
|
+
Mood — multi-select
|
|
369
|
+
</h4>
|
|
370
|
+
<div className="flex flex-wrap gap-3">
|
|
371
|
+
{moods.map((mood) => (
|
|
372
|
+
<Chip
|
|
373
|
+
key={mood}
|
|
374
|
+
selected={selectedMoods.has(mood)}
|
|
375
|
+
onSelect={() => toggleMood(mood)}
|
|
376
|
+
leftIcon={
|
|
377
|
+
selectedMoods.has(mood) ? (
|
|
378
|
+
<CrossCircleIcon
|
|
379
|
+
width={14}
|
|
380
|
+
height={14}
|
|
381
|
+
color="currentColor"
|
|
382
|
+
/>
|
|
383
|
+
) : undefined
|
|
384
|
+
}
|
|
385
|
+
>
|
|
386
|
+
{mood}
|
|
387
|
+
</Chip>
|
|
388
|
+
))}
|
|
389
|
+
</div>
|
|
390
|
+
</div>
|
|
391
|
+
|
|
392
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary rounded-lg border px-4 py-3">
|
|
393
|
+
<code className="text-fm-secondary text-fm-md leading-fm-md font-(--font-fm-mono)">
|
|
394
|
+
{`<Chip selected={${selectedMoods.size > 0}} onSelect={toggleMood}>`}
|
|
395
|
+
</code>
|
|
396
|
+
</div>
|
|
397
|
+
</div>
|
|
398
|
+
</div>
|
|
399
|
+
</div>
|
|
400
|
+
</div>
|
|
401
|
+
)
|
|
402
|
+
},
|
|
403
|
+
parameters: {
|
|
404
|
+
docs: {
|
|
405
|
+
description: {
|
|
406
|
+
story:
|
|
407
|
+
"Live chip selection demo. The genre group demonstrates single-select radio behavior; the mood group demonstrates multi-select toggle behavior with a dismiss icon on active chips.",
|
|
408
|
+
},
|
|
409
|
+
},
|
|
410
|
+
},
|
|
217
411
|
}
|