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,6 +1,8 @@
|
|
|
1
1
|
import React from "react"
|
|
2
2
|
import type { Meta, StoryObj } from "@storybook/react-vite"
|
|
3
3
|
|
|
4
|
+
import { AuralComponentDocsPage } from "src/ui/story-spec/components/component-story-docs-page"
|
|
5
|
+
|
|
4
6
|
import { Banner } from "."
|
|
5
7
|
|
|
6
8
|
const meta: Meta<typeof Banner> = {
|
|
@@ -8,12 +10,29 @@ const meta: Meta<typeof Banner> = {
|
|
|
8
10
|
component: Banner,
|
|
9
11
|
parameters: {
|
|
10
12
|
layout: "centered",
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
docs: {
|
|
14
|
+
description: {
|
|
15
|
+
component:
|
|
16
|
+
"A full-width notification strip for surfacing contextual feedback — positive, negative, warning, or info — in filled or outlined appearance. Supports optional icons, interactive click behaviour, and heading-only layouts.",
|
|
17
|
+
},
|
|
18
|
+
page: () => (
|
|
19
|
+
<AuralComponentDocsPage
|
|
20
|
+
features={[
|
|
21
|
+
{
|
|
22
|
+
title: "4 Semantic Variants",
|
|
23
|
+
description: "Positive to negative",
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
title: "Filled & Outlined",
|
|
27
|
+
description: "Two appearance styles",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
title: "Interactive Support",
|
|
31
|
+
description: "onClick for CTAs",
|
|
32
|
+
},
|
|
33
|
+
]}
|
|
34
|
+
/>
|
|
35
|
+
),
|
|
17
36
|
},
|
|
18
37
|
},
|
|
19
38
|
tags: ["autodocs"],
|
|
@@ -54,84 +73,18 @@ const meta: Meta<typeof Banner> = {
|
|
|
54
73
|
export default meta
|
|
55
74
|
type Story = StoryObj<typeof Banner>
|
|
56
75
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
rightIcon: true,
|
|
65
|
-
},
|
|
76
|
+
// Filled-variant overrides: the component uses vivid surface tokens (green/blue/yellow-500)
|
|
77
|
+
// which fail contrast in light mode. Override with -sec surfaces paired with their text tokens.
|
|
78
|
+
const filledClassOverride: Record<string, string> = {
|
|
79
|
+
positive: "bg-fm-surface-positive-sec text-fm-positive-sec",
|
|
80
|
+
info: "bg-fm-surface-info-sec text-fm-info-sec",
|
|
81
|
+
warning: "bg-fm-yellow-200 text-fm-yellow-900",
|
|
82
|
+
negative: "", // red-1000 text on red-400 bg reads well in both themes
|
|
66
83
|
}
|
|
67
84
|
|
|
68
|
-
|
|
69
|
-
args: {
|
|
70
|
-
heading: "Heading",
|
|
71
|
-
paragraph: "Paragraph",
|
|
72
|
-
variant: "positive",
|
|
73
|
-
appearance: "filled",
|
|
74
|
-
leftIcon: true,
|
|
75
|
-
rightIcon: true,
|
|
76
|
-
},
|
|
77
|
-
}
|
|
85
|
+
// ─── 1. Playground ────────────────────────────────────────────────────────────
|
|
78
86
|
|
|
79
|
-
export const
|
|
80
|
-
args: {
|
|
81
|
-
heading: "Heading",
|
|
82
|
-
paragraph: "Paragraph",
|
|
83
|
-
variant: "positive",
|
|
84
|
-
appearance: "outlined",
|
|
85
|
-
leftIcon: true,
|
|
86
|
-
rightIcon: true,
|
|
87
|
-
},
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
export const Negative: Story = {
|
|
91
|
-
args: {
|
|
92
|
-
heading: "Heading",
|
|
93
|
-
paragraph: "Paragraph",
|
|
94
|
-
variant: "negative",
|
|
95
|
-
appearance: "filled",
|
|
96
|
-
leftIcon: true,
|
|
97
|
-
rightIcon: true,
|
|
98
|
-
},
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
export const NegativeOutlined: Story = {
|
|
102
|
-
args: {
|
|
103
|
-
heading: "Heading",
|
|
104
|
-
paragraph: "Paragraph",
|
|
105
|
-
variant: "negative",
|
|
106
|
-
appearance: "outlined",
|
|
107
|
-
leftIcon: true,
|
|
108
|
-
rightIcon: true,
|
|
109
|
-
},
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export const Warning: Story = {
|
|
113
|
-
args: {
|
|
114
|
-
heading: "Heading",
|
|
115
|
-
paragraph: "Paragraph",
|
|
116
|
-
variant: "warning",
|
|
117
|
-
appearance: "filled",
|
|
118
|
-
leftIcon: true,
|
|
119
|
-
rightIcon: true,
|
|
120
|
-
},
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
export const WarningOutlined: Story = {
|
|
124
|
-
args: {
|
|
125
|
-
heading: "Heading",
|
|
126
|
-
paragraph: "Paragraph",
|
|
127
|
-
variant: "warning",
|
|
128
|
-
appearance: "outlined",
|
|
129
|
-
leftIcon: true,
|
|
130
|
-
rightIcon: true,
|
|
131
|
-
},
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
export const Info: Story = {
|
|
87
|
+
export const Playground: Story = {
|
|
135
88
|
args: {
|
|
136
89
|
heading: "Heading",
|
|
137
90
|
paragraph: "Paragraph",
|
|
@@ -140,343 +93,444 @@ export const Info: Story = {
|
|
|
140
93
|
leftIcon: true,
|
|
141
94
|
rightIcon: true,
|
|
142
95
|
},
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
96
|
+
render: (args) => {
|
|
97
|
+
const override =
|
|
98
|
+
args.appearance === "filled"
|
|
99
|
+
? filledClassOverride[args.variant ?? "info"]
|
|
100
|
+
: ""
|
|
101
|
+
return (
|
|
102
|
+
<div className="w-full max-w-2xl space-y-4">
|
|
103
|
+
<Banner {...args} className={override} />
|
|
104
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary rounded-lg border px-4 py-3">
|
|
105
|
+
<code className="text-fm-secondary text-fm-md leading-fm-md font-(--font-fm-mono)">{`<Banner variant="${args.variant}" appearance="${args.appearance}" heading="${args.heading}" leftIcon={${args.leftIcon}} rightIcon={${args.rightIcon}} />`}</code>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
)
|
|
153
109
|
},
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
appearance: "filled",
|
|
162
|
-
leftIcon: false,
|
|
110
|
+
parameters: {
|
|
111
|
+
docs: {
|
|
112
|
+
description: {
|
|
113
|
+
story:
|
|
114
|
+
"Adjust variant, appearance, heading, paragraph, and icon visibility using the controls panel in the sidebar.",
|
|
115
|
+
},
|
|
116
|
+
},
|
|
163
117
|
},
|
|
164
118
|
}
|
|
165
119
|
|
|
166
|
-
|
|
167
|
-
args: {
|
|
168
|
-
heading: "Heading",
|
|
169
|
-
paragraph: "Paragraph",
|
|
170
|
-
variant: "info",
|
|
171
|
-
appearance: "filled",
|
|
172
|
-
rightIcon: false,
|
|
173
|
-
},
|
|
174
|
-
}
|
|
120
|
+
// ─── 2. All Variants ──────────────────────────────────────────────────────────
|
|
175
121
|
|
|
176
|
-
export const
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
122
|
+
export const AllVariants: Story = {
|
|
123
|
+
render: () => (
|
|
124
|
+
<div className="space-y-8">
|
|
125
|
+
<div className="space-y-4">
|
|
126
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
127
|
+
Filled
|
|
128
|
+
</h4>
|
|
129
|
+
<div className="flex w-full max-w-2xl flex-col gap-3">
|
|
130
|
+
<div className="space-y-2">
|
|
131
|
+
<Banner
|
|
132
|
+
variant="positive"
|
|
133
|
+
appearance="filled"
|
|
134
|
+
heading="Heading"
|
|
135
|
+
paragraph="Paragraph"
|
|
136
|
+
leftIcon
|
|
137
|
+
rightIcon
|
|
138
|
+
className="bg-fm-surface-positive-sec text-fm-positive-sec"
|
|
139
|
+
/>
|
|
140
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm text-center">
|
|
141
|
+
Positive
|
|
142
|
+
</p>
|
|
143
|
+
</div>
|
|
144
|
+
<div className="space-y-2">
|
|
145
|
+
<Banner
|
|
146
|
+
variant="negative"
|
|
147
|
+
appearance="filled"
|
|
148
|
+
heading="Heading"
|
|
149
|
+
paragraph="Paragraph"
|
|
150
|
+
leftIcon
|
|
151
|
+
rightIcon
|
|
152
|
+
/>
|
|
153
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm text-center">
|
|
154
|
+
Negative
|
|
155
|
+
</p>
|
|
156
|
+
</div>
|
|
157
|
+
<div className="space-y-2">
|
|
158
|
+
<Banner
|
|
159
|
+
variant="warning"
|
|
160
|
+
appearance="filled"
|
|
161
|
+
heading="Heading"
|
|
162
|
+
paragraph="Paragraph"
|
|
163
|
+
leftIcon
|
|
164
|
+
rightIcon
|
|
165
|
+
className="bg-fm-yellow-200 text-fm-yellow-900"
|
|
166
|
+
/>
|
|
167
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm text-center">
|
|
168
|
+
Warning
|
|
169
|
+
</p>
|
|
170
|
+
</div>
|
|
171
|
+
<div className="space-y-2">
|
|
172
|
+
<Banner
|
|
173
|
+
variant="info"
|
|
174
|
+
appearance="filled"
|
|
175
|
+
heading="Heading"
|
|
176
|
+
paragraph="Paragraph"
|
|
177
|
+
leftIcon
|
|
178
|
+
rightIcon
|
|
179
|
+
className="bg-fm-surface-info-sec text-fm-info-sec"
|
|
180
|
+
/>
|
|
181
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm text-center">
|
|
182
|
+
Info
|
|
183
|
+
</p>
|
|
184
|
+
</div>
|
|
185
|
+
</div>
|
|
186
|
+
</div>
|
|
185
187
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
188
|
+
<div className="space-y-4">
|
|
189
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
190
|
+
Outlined
|
|
191
|
+
</h4>
|
|
192
|
+
<div className="flex w-full max-w-2xl flex-col gap-3">
|
|
193
|
+
<div className="space-y-2">
|
|
194
|
+
<Banner
|
|
195
|
+
variant="positive"
|
|
196
|
+
appearance="outlined"
|
|
197
|
+
heading="Heading"
|
|
198
|
+
paragraph="Paragraph"
|
|
199
|
+
leftIcon
|
|
200
|
+
rightIcon
|
|
201
|
+
/>
|
|
202
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm text-center">
|
|
203
|
+
Positive
|
|
204
|
+
</p>
|
|
205
|
+
</div>
|
|
206
|
+
<div className="space-y-2">
|
|
207
|
+
<Banner
|
|
208
|
+
variant="negative"
|
|
209
|
+
appearance="outlined"
|
|
210
|
+
heading="Heading"
|
|
211
|
+
paragraph="Paragraph"
|
|
212
|
+
leftIcon
|
|
213
|
+
rightIcon
|
|
214
|
+
/>
|
|
215
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm text-center">
|
|
216
|
+
Negative
|
|
217
|
+
</p>
|
|
218
|
+
</div>
|
|
219
|
+
<div className="space-y-2">
|
|
220
|
+
<Banner
|
|
221
|
+
variant="warning"
|
|
222
|
+
appearance="outlined"
|
|
223
|
+
heading="Heading"
|
|
224
|
+
paragraph="Paragraph"
|
|
225
|
+
leftIcon
|
|
226
|
+
rightIcon
|
|
227
|
+
/>
|
|
228
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm text-center">
|
|
229
|
+
Warning
|
|
230
|
+
</p>
|
|
231
|
+
</div>
|
|
232
|
+
<div className="space-y-2">
|
|
233
|
+
<Banner
|
|
234
|
+
variant="info"
|
|
235
|
+
appearance="outlined"
|
|
236
|
+
heading="Heading"
|
|
237
|
+
paragraph="Paragraph"
|
|
238
|
+
leftIcon
|
|
239
|
+
rightIcon
|
|
240
|
+
/>
|
|
241
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm text-center">
|
|
242
|
+
Info
|
|
243
|
+
</p>
|
|
244
|
+
</div>
|
|
245
|
+
</div>
|
|
246
|
+
</div>
|
|
247
|
+
</div>
|
|
248
|
+
),
|
|
249
|
+
parameters: {
|
|
250
|
+
docs: {
|
|
251
|
+
description: {
|
|
252
|
+
story:
|
|
253
|
+
"All four variants (positive, negative, warning, info) in both filled and outlined appearances.",
|
|
254
|
+
},
|
|
255
|
+
},
|
|
193
256
|
},
|
|
194
257
|
}
|
|
195
258
|
|
|
196
|
-
|
|
197
|
-
args: {
|
|
198
|
-
heading: "Heading",
|
|
199
|
-
paragraph: "Paragraph",
|
|
200
|
-
variant: "info",
|
|
201
|
-
appearance: "filled",
|
|
202
|
-
leftIcon: true,
|
|
203
|
-
rightIcon: true,
|
|
204
|
-
},
|
|
205
|
-
}
|
|
259
|
+
// ─── 3. Configurations ────────────────────────────────────────────────────────
|
|
206
260
|
|
|
207
|
-
export const
|
|
261
|
+
export const Configurations: Story = {
|
|
208
262
|
render: () => (
|
|
209
|
-
<
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
263
|
+
<div className="space-y-8">
|
|
264
|
+
<div className="space-y-4">
|
|
265
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
266
|
+
Icon Placement
|
|
267
|
+
</h4>
|
|
268
|
+
<div className="flex w-full max-w-2xl flex-col gap-3">
|
|
269
|
+
<div className="space-y-2">
|
|
270
|
+
<Banner
|
|
271
|
+
variant="info"
|
|
272
|
+
appearance="outlined"
|
|
273
|
+
heading="Both Icons"
|
|
274
|
+
paragraph="Left feature icon and right arrow icon"
|
|
275
|
+
leftIcon
|
|
276
|
+
rightIcon
|
|
277
|
+
/>
|
|
278
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm text-center">
|
|
279
|
+
Both icons
|
|
280
|
+
</p>
|
|
281
|
+
</div>
|
|
282
|
+
<div className="space-y-2">
|
|
283
|
+
<Banner
|
|
284
|
+
variant="info"
|
|
285
|
+
appearance="outlined"
|
|
286
|
+
heading="Left Icon Only"
|
|
287
|
+
paragraph="Feature icon on the left, no right arrow"
|
|
288
|
+
leftIcon
|
|
289
|
+
rightIcon={false}
|
|
290
|
+
/>
|
|
291
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm text-center">
|
|
292
|
+
Left icon only
|
|
293
|
+
</p>
|
|
294
|
+
</div>
|
|
295
|
+
<div className="space-y-2">
|
|
296
|
+
<Banner
|
|
297
|
+
variant="info"
|
|
298
|
+
appearance="outlined"
|
|
299
|
+
heading="Right Icon Only"
|
|
300
|
+
paragraph="No left icon, arrow on the right"
|
|
301
|
+
leftIcon={false}
|
|
302
|
+
rightIcon
|
|
303
|
+
/>
|
|
304
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm text-center">
|
|
305
|
+
Right icon only
|
|
306
|
+
</p>
|
|
307
|
+
</div>
|
|
308
|
+
<div className="space-y-2">
|
|
309
|
+
<Banner
|
|
310
|
+
variant="info"
|
|
311
|
+
appearance="outlined"
|
|
312
|
+
heading="No Icons"
|
|
313
|
+
paragraph="Clean layout with no icons on either side"
|
|
314
|
+
leftIcon={false}
|
|
315
|
+
rightIcon={false}
|
|
316
|
+
/>
|
|
317
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm text-center">
|
|
318
|
+
No icons
|
|
319
|
+
</p>
|
|
320
|
+
</div>
|
|
321
|
+
</div>
|
|
322
|
+
</div>
|
|
219
323
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
<
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
324
|
+
<div className="space-y-4">
|
|
325
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
326
|
+
Content Layout
|
|
327
|
+
</h4>
|
|
328
|
+
<div className="flex w-full max-w-2xl flex-col gap-3">
|
|
329
|
+
<div className="space-y-2">
|
|
330
|
+
<Banner
|
|
331
|
+
variant="positive"
|
|
332
|
+
appearance="outlined"
|
|
333
|
+
heading="Heading and Paragraph"
|
|
334
|
+
paragraph="Both heading and supporting paragraph shown together"
|
|
335
|
+
leftIcon
|
|
336
|
+
rightIcon
|
|
337
|
+
/>
|
|
338
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm text-center">
|
|
339
|
+
Heading + paragraph
|
|
340
|
+
</p>
|
|
341
|
+
</div>
|
|
342
|
+
<div className="space-y-2">
|
|
343
|
+
<Banner
|
|
344
|
+
variant="positive"
|
|
345
|
+
appearance="outlined"
|
|
346
|
+
heading="Heading Only"
|
|
347
|
+
leftIcon
|
|
348
|
+
/>
|
|
349
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm text-center">
|
|
350
|
+
Heading only
|
|
351
|
+
</p>
|
|
352
|
+
</div>
|
|
231
353
|
</div>
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
appearance="filled"
|
|
235
|
-
leftIcon={true}
|
|
236
|
-
/>
|
|
354
|
+
</div>
|
|
355
|
+
</div>
|
|
237
356
|
),
|
|
357
|
+
parameters: {
|
|
358
|
+
docs: {
|
|
359
|
+
description: {
|
|
360
|
+
story:
|
|
361
|
+
"Icon placement configurations (both, left-only, right-only, none) and content layout variations (heading + paragraph vs heading only).",
|
|
362
|
+
},
|
|
363
|
+
},
|
|
364
|
+
},
|
|
238
365
|
}
|
|
239
366
|
|
|
240
|
-
|
|
241
|
-
return (
|
|
242
|
-
<div className="flex w-full max-w-2xl flex-col gap-4">
|
|
243
|
-
<h2 className="text-fm-primary text-xl font-bold uppercase">POSITIVE</h2>
|
|
244
|
-
<Banner
|
|
245
|
-
variant="positive"
|
|
246
|
-
appearance="filled"
|
|
247
|
-
heading="Heading"
|
|
248
|
-
paragraph="Paragraph"
|
|
249
|
-
leftIcon={true}
|
|
250
|
-
rightIcon={true}
|
|
251
|
-
/>
|
|
252
|
-
<Banner
|
|
253
|
-
variant="positive"
|
|
254
|
-
appearance="outlined"
|
|
255
|
-
heading="Heading"
|
|
256
|
-
paragraph="Paragraph"
|
|
257
|
-
leftIcon={true}
|
|
258
|
-
rightIcon={true}
|
|
259
|
-
/>
|
|
260
|
-
|
|
261
|
-
<h2 className="text-fm-primary mt-4 text-xl font-bold uppercase">
|
|
262
|
-
NEGATIVE
|
|
263
|
-
</h2>
|
|
264
|
-
<Banner
|
|
265
|
-
variant="negative"
|
|
266
|
-
appearance="filled"
|
|
267
|
-
heading="Heading"
|
|
268
|
-
paragraph="Paragraph"
|
|
269
|
-
leftIcon={true}
|
|
270
|
-
rightIcon={true}
|
|
271
|
-
/>
|
|
272
|
-
<Banner
|
|
273
|
-
variant="negative"
|
|
274
|
-
appearance="outlined"
|
|
275
|
-
heading="Heading"
|
|
276
|
-
paragraph="Paragraph"
|
|
277
|
-
leftIcon={true}
|
|
278
|
-
rightIcon={true}
|
|
279
|
-
/>
|
|
280
|
-
|
|
281
|
-
<h2 className="text-fm-primary mt-4 text-xl font-bold uppercase">INFO</h2>
|
|
282
|
-
<Banner
|
|
283
|
-
variant="info"
|
|
284
|
-
appearance="filled"
|
|
285
|
-
heading="Heading"
|
|
286
|
-
paragraph="Paragraph"
|
|
287
|
-
leftIcon={true}
|
|
288
|
-
rightIcon={true}
|
|
289
|
-
/>
|
|
290
|
-
<Banner
|
|
291
|
-
variant="info"
|
|
292
|
-
appearance="outlined"
|
|
293
|
-
heading="Heading"
|
|
294
|
-
paragraph="Paragraph"
|
|
295
|
-
leftIcon={true}
|
|
296
|
-
rightIcon={true}
|
|
297
|
-
/>
|
|
367
|
+
// ─── 4. Interactive ───────────────────────────────────────────────────────────
|
|
298
368
|
|
|
299
|
-
|
|
300
|
-
WARNING
|
|
301
|
-
</h2>
|
|
302
|
-
<Banner
|
|
303
|
-
variant="warning"
|
|
304
|
-
appearance="filled"
|
|
305
|
-
heading="Heading"
|
|
306
|
-
paragraph="Paragraph"
|
|
307
|
-
leftIcon={true}
|
|
308
|
-
rightIcon={true}
|
|
309
|
-
/>
|
|
310
|
-
<Banner
|
|
311
|
-
variant="warning"
|
|
312
|
-
appearance="outlined"
|
|
313
|
-
heading="Heading"
|
|
314
|
-
paragraph="Paragraph"
|
|
315
|
-
leftIcon={true}
|
|
316
|
-
rightIcon={true}
|
|
317
|
-
/>
|
|
369
|
+
type BannerVariant = "positive" | "negative" | "warning" | "info"
|
|
318
370
|
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
variant="positive"
|
|
324
|
-
appearance="filled"
|
|
325
|
-
heading="Click me"
|
|
326
|
-
paragraph="This banner is clickable"
|
|
327
|
-
leftIcon={true}
|
|
328
|
-
rightIcon={true}
|
|
329
|
-
onClick={() => alert("Banner clicked!")}
|
|
330
|
-
/>
|
|
331
|
-
|
|
332
|
-
<h2 className="text-fm-primary mt-8 text-xl font-bold uppercase">
|
|
333
|
-
CUSTOM ICON EXAMPLES
|
|
334
|
-
</h2>
|
|
335
|
-
<Banner
|
|
336
|
-
variant="info"
|
|
337
|
-
appearance="filled"
|
|
338
|
-
heading="Custom left icon"
|
|
339
|
-
paragraph="This banner has a custom left icon"
|
|
340
|
-
leftIcon={<span className="mr-4 text-xl">🔔</span>}
|
|
341
|
-
rightIcon={true}
|
|
342
|
-
/>
|
|
343
|
-
<Banner
|
|
344
|
-
variant="warning"
|
|
345
|
-
appearance="outlined"
|
|
346
|
-
heading="Custom right icon"
|
|
347
|
-
paragraph="This banner has a custom right icon"
|
|
348
|
-
leftIcon={true}
|
|
349
|
-
rightIcon={<span className="ml-4 text-xl">👉</span>}
|
|
350
|
-
/>
|
|
351
|
-
</div>
|
|
371
|
+
const InteractiveStory = () => {
|
|
372
|
+
const [variant, setVariant] = React.useState<BannerVariant>("positive")
|
|
373
|
+
const [appearance, setAppearance] = React.useState<"filled" | "outlined">(
|
|
374
|
+
"outlined"
|
|
352
375
|
)
|
|
353
|
-
|
|
376
|
+
const [triggered, setTriggered] = React.useState(false)
|
|
354
377
|
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
<div className="flex w-full max-w-2xl flex-col gap-4">
|
|
358
|
-
<h2 className="text-fm-primary text-xl font-bold uppercase">
|
|
359
|
-
WITH ICONS
|
|
360
|
-
</h2>
|
|
361
|
-
<Banner
|
|
362
|
-
variant="info"
|
|
363
|
-
appearance="filled"
|
|
364
|
-
heading="Both icons"
|
|
365
|
-
paragraph="This banner has both left and right icons"
|
|
366
|
-
leftIcon={true}
|
|
367
|
-
rightIcon={true}
|
|
368
|
-
/>
|
|
369
|
-
<Banner
|
|
370
|
-
variant="info"
|
|
371
|
-
appearance="filled"
|
|
372
|
-
heading="Left icon only"
|
|
373
|
-
paragraph="This banner has only a left icon"
|
|
374
|
-
leftIcon={true}
|
|
375
|
-
rightIcon={false}
|
|
376
|
-
/>
|
|
377
|
-
<Banner
|
|
378
|
-
variant="info"
|
|
379
|
-
appearance="filled"
|
|
380
|
-
heading="Right icon only"
|
|
381
|
-
paragraph="This banner has only a right icon"
|
|
382
|
-
leftIcon={false}
|
|
383
|
-
rightIcon={true}
|
|
384
|
-
/>
|
|
385
|
-
<Banner
|
|
386
|
-
variant="info"
|
|
387
|
-
appearance="filled"
|
|
388
|
-
heading="No icons"
|
|
389
|
-
paragraph="This banner has no icons"
|
|
390
|
-
leftIcon={false}
|
|
391
|
-
rightIcon={false}
|
|
392
|
-
/>
|
|
393
|
-
</div>
|
|
394
|
-
)
|
|
395
|
-
}
|
|
378
|
+
const variants: BannerVariant[] = ["positive", "negative", "warning", "info"]
|
|
379
|
+
const override = appearance === "filled" ? filledClassOverride[variant] : ""
|
|
396
380
|
|
|
397
|
-
export const ContentVariants = () => {
|
|
398
381
|
return (
|
|
399
|
-
<div className="
|
|
400
|
-
<
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
</
|
|
382
|
+
<div className="w-full p-8">
|
|
383
|
+
<div className="mx-auto max-w-3xl space-y-6">
|
|
384
|
+
<div className="grid grid-cols-1 gap-6 lg:grid-cols-3">
|
|
385
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary space-y-5 rounded-xl border p-5">
|
|
386
|
+
<p className="text-fm-primary font-fm-brand text-fm-sm leading-fm-sm font-semibold tracking-widest uppercase">
|
|
387
|
+
Variant
|
|
388
|
+
</p>
|
|
389
|
+
<div className="flex flex-col gap-2">
|
|
390
|
+
{variants.map((v) => (
|
|
391
|
+
<button
|
|
392
|
+
key={v}
|
|
393
|
+
onClick={() => {
|
|
394
|
+
setVariant(v)
|
|
395
|
+
setTriggered(false)
|
|
396
|
+
}}
|
|
397
|
+
className={`font-fm-text text-fm-sm leading-fm-sm rounded-lg px-3 py-2 text-left capitalize transition-colors outline-none ${
|
|
398
|
+
variant === v
|
|
399
|
+
? "bg-fm-surface-contrast text-fm-contrast"
|
|
400
|
+
: "bg-fm-surface-primary text-fm-secondary hover:text-fm-primary"
|
|
401
|
+
}`}
|
|
402
|
+
>
|
|
403
|
+
{v}
|
|
404
|
+
</button>
|
|
405
|
+
))}
|
|
406
|
+
</div>
|
|
407
|
+
<div className="border-fm-divider-secondary border-t pt-4" />
|
|
408
|
+
<p className="text-fm-primary font-fm-brand text-fm-sm leading-fm-sm font-semibold tracking-widest uppercase">
|
|
409
|
+
Appearance
|
|
410
|
+
</p>
|
|
411
|
+
<div className="flex flex-col gap-2">
|
|
412
|
+
{(["filled", "outlined"] as const).map((a) => (
|
|
413
|
+
<button
|
|
414
|
+
key={a}
|
|
415
|
+
onClick={() => setAppearance(a)}
|
|
416
|
+
className={`font-fm-text text-fm-sm leading-fm-sm rounded-lg px-3 py-2 text-left capitalize transition-colors outline-none ${
|
|
417
|
+
appearance === a
|
|
418
|
+
? "bg-fm-surface-contrast text-fm-contrast"
|
|
419
|
+
: "bg-fm-surface-primary text-fm-secondary hover:text-fm-primary"
|
|
420
|
+
}`}
|
|
421
|
+
>
|
|
422
|
+
{a}
|
|
423
|
+
</button>
|
|
424
|
+
))}
|
|
425
|
+
</div>
|
|
424
426
|
</div>
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
427
|
+
|
|
428
|
+
<div className="flex flex-col gap-3 lg:col-span-2">
|
|
429
|
+
<Banner
|
|
430
|
+
variant={variant}
|
|
431
|
+
appearance={appearance}
|
|
432
|
+
heading={triggered ? "Banner clicked!" : "Click this banner"}
|
|
433
|
+
paragraph={
|
|
434
|
+
triggered
|
|
435
|
+
? "Action triggered successfully"
|
|
436
|
+
: "This banner is interactive — try clicking it"
|
|
437
|
+
}
|
|
438
|
+
leftIcon
|
|
439
|
+
rightIcon
|
|
440
|
+
onClick={() => setTriggered((prev) => !prev)}
|
|
441
|
+
className={override}
|
|
442
|
+
/>
|
|
443
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary rounded-lg border px-4 py-3">
|
|
444
|
+
<code className="text-fm-secondary text-fm-md leading-fm-md font-(--font-fm-mono)">{`<Banner variant="${variant}" appearance="${appearance}" onClick={handler} />`}</code>
|
|
445
|
+
</div>
|
|
439
446
|
</div>
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
/>
|
|
447
|
+
</div>
|
|
448
|
+
</div>
|
|
443
449
|
</div>
|
|
444
450
|
)
|
|
445
451
|
}
|
|
446
452
|
|
|
447
|
-
export const
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
453
|
+
export const Interactive: Story = {
|
|
454
|
+
render: () => <InteractiveStory />,
|
|
455
|
+
parameters: {
|
|
456
|
+
layout: "fullscreen",
|
|
457
|
+
docs: {
|
|
458
|
+
description: {
|
|
459
|
+
story:
|
|
460
|
+
"Clickable banner with an onClick handler. Select a variant and appearance to preview interactive behaviour.",
|
|
461
|
+
},
|
|
462
|
+
},
|
|
463
|
+
},
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
// ─── 5. Use Cases ─────────────────────────────────────────────────────────────
|
|
467
|
+
|
|
468
|
+
export const UseCases: Story = {
|
|
469
|
+
render: () => (
|
|
470
|
+
<div className="mx-auto max-w-3xl space-y-8 p-8">
|
|
471
|
+
<div className="space-y-4">
|
|
472
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
473
|
+
Upload & Processing Feedback
|
|
474
|
+
</h4>
|
|
475
|
+
<div className="mx-auto max-w-2xl space-y-3">
|
|
476
|
+
<Banner
|
|
477
|
+
variant="positive"
|
|
478
|
+
appearance="outlined"
|
|
479
|
+
heading="Track uploaded successfully"
|
|
480
|
+
paragraph="Your track is now being processed and will be live shortly"
|
|
481
|
+
leftIcon
|
|
482
|
+
rightIcon
|
|
483
|
+
/>
|
|
484
|
+
<Banner
|
|
485
|
+
variant="warning"
|
|
486
|
+
appearance="outlined"
|
|
487
|
+
heading="Audio quality is low"
|
|
488
|
+
paragraph="Consider re-uploading at 320 kbps or higher for best results"
|
|
489
|
+
leftIcon
|
|
490
|
+
rightIcon
|
|
491
|
+
/>
|
|
492
|
+
<Banner
|
|
493
|
+
variant="negative"
|
|
494
|
+
appearance="outlined"
|
|
495
|
+
heading="Upload failed"
|
|
496
|
+
paragraph="File format not supported. Please use MP3, WAV, or FLAC"
|
|
497
|
+
leftIcon
|
|
498
|
+
rightIcon
|
|
499
|
+
/>
|
|
500
|
+
</div>
|
|
501
|
+
</div>
|
|
502
|
+
|
|
503
|
+
<div className="space-y-4">
|
|
504
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
505
|
+
Account & Subscription
|
|
506
|
+
</h4>
|
|
507
|
+
<div className="mx-auto max-w-2xl space-y-3">
|
|
508
|
+
<Banner
|
|
509
|
+
variant="info"
|
|
510
|
+
appearance="outlined"
|
|
511
|
+
heading="Your trial ends in 3 days"
|
|
512
|
+
paragraph="Upgrade to keep access to all features"
|
|
513
|
+
leftIcon
|
|
514
|
+
rightIcon
|
|
515
|
+
/>
|
|
516
|
+
<Banner
|
|
517
|
+
variant="positive"
|
|
518
|
+
appearance="outlined"
|
|
519
|
+
heading="Subscription renewed"
|
|
520
|
+
paragraph="Your Pro plan has been renewed for another 12 months"
|
|
521
|
+
leftIcon
|
|
522
|
+
/>
|
|
523
|
+
</div>
|
|
524
|
+
</div>
|
|
480
525
|
</div>
|
|
481
|
-
)
|
|
526
|
+
),
|
|
527
|
+
parameters: {
|
|
528
|
+
layout: "fullscreen",
|
|
529
|
+
docs: {
|
|
530
|
+
description: {
|
|
531
|
+
story:
|
|
532
|
+
"Real-world usage: upload and processing status feedback, and account subscription notification banners.",
|
|
533
|
+
},
|
|
534
|
+
},
|
|
535
|
+
},
|
|
482
536
|
}
|