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,16 +1,9 @@
|
|
|
1
1
|
import React from "react"
|
|
2
|
-
import {
|
|
3
|
-
AlertIcon,
|
|
4
|
-
EditBigIcon,
|
|
5
|
-
EyeOpenIcon,
|
|
6
|
-
FileChartIcon,
|
|
7
|
-
PlusIcon,
|
|
8
|
-
SearchIcon,
|
|
9
|
-
TickCircleIcon,
|
|
10
|
-
TrashIcon,
|
|
11
|
-
} from "@icons/index"
|
|
2
|
+
import { MusicalNoteIcon, TickCircleIcon } from "@icons/index"
|
|
12
3
|
import type { Meta, StoryObj } from "@storybook/react-vite"
|
|
13
4
|
|
|
5
|
+
import { AuralComponentDocsPage } from "src/ui/story-spec/components/component-story-docs-page"
|
|
6
|
+
|
|
14
7
|
import Marquee from "."
|
|
15
8
|
|
|
16
9
|
const meta: Meta<typeof Marquee> = {
|
|
@@ -18,114 +11,29 @@ const meta: Meta<typeof Marquee> = {
|
|
|
18
11
|
component: Marquee,
|
|
19
12
|
parameters: {
|
|
20
13
|
layout: "centered",
|
|
21
|
-
backgrounds: {
|
|
22
|
-
default: "dark",
|
|
23
|
-
values: [
|
|
24
|
-
{ name: "dark", value: "#0a0a0a" },
|
|
25
|
-
{ name: "light", value: "#ffffff" },
|
|
26
|
-
],
|
|
27
|
-
},
|
|
28
14
|
docs: {
|
|
29
15
|
description: {
|
|
30
|
-
component:
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
A smooth, customizable marquee component for creating continuous scrolling content animations. Perfect for displaying logos, announcements, testimonials, or any repeating content.
|
|
34
|
-
|
|
35
|
-
## Features
|
|
36
|
-
|
|
37
|
-
- **Horizontal & Vertical**: Support for both horizontal and vertical scrolling
|
|
38
|
-
- **Pause on Hover**: Optional pause animation when hovering
|
|
39
|
-
- **Reverse Direction**: Ability to reverse the animation direction
|
|
40
|
-
- **Customizable Speed**: Control animation duration via CSS custom properties
|
|
41
|
-
- **Responsive Design**: Adapts to container width and content
|
|
42
|
-
- **Smooth Animation**: Hardware-accelerated CSS animations
|
|
43
|
-
- **Repeat Control**: Configure how many times content repeats
|
|
44
|
-
- **Gap Control**: Customizable spacing between repeated items
|
|
45
|
-
|
|
46
|
-
## Props
|
|
47
|
-
|
|
48
|
-
### Core Props
|
|
49
|
-
- **children**: Content to be animated in the marquee
|
|
50
|
-
- **className**: Additional CSS classes for the container
|
|
51
|
-
- **itemClassName**: CSS classes for individual marquee items
|
|
52
|
-
- **vertical**: Switch between horizontal (default) and vertical scrolling
|
|
53
|
-
- **reverse**: Reverse the animation direction
|
|
54
|
-
- **pauseOnHover**: Pause animation when hovering (default: false)
|
|
55
|
-
- **repeat**: Number of times to repeat the content (default: 4)
|
|
56
|
-
|
|
57
|
-
## Usage Examples
|
|
58
|
-
|
|
59
|
-
### Basic Horizontal Marquee
|
|
60
|
-
\`\`\`tsx
|
|
61
|
-
<Marquee>
|
|
62
|
-
<div>Item 1</div>
|
|
63
|
-
<div>Item 2</div>
|
|
64
|
-
<div>Item 3</div>
|
|
65
|
-
</Marquee>
|
|
66
|
-
\`\`\`
|
|
67
|
-
|
|
68
|
-
### Vertical Marquee
|
|
69
|
-
\`\`\`tsx
|
|
70
|
-
<Marquee vertical>
|
|
71
|
-
<div>Vertical Item 1</div>
|
|
72
|
-
<div>Vertical Item 2</div>
|
|
73
|
-
<div>Vertical Item 3</div>
|
|
74
|
-
</Marquee>
|
|
75
|
-
\`\`\`
|
|
76
|
-
|
|
77
|
-
### With Pause on Hover
|
|
78
|
-
\`\`\`tsx
|
|
79
|
-
<Marquee pauseOnHover>
|
|
80
|
-
<div>Hover to pause</div>
|
|
81
|
-
<div>This content</div>
|
|
82
|
-
</Marquee>
|
|
83
|
-
\`\`\`
|
|
84
|
-
|
|
85
|
-
### Reverse Direction
|
|
86
|
-
\`\`\`tsx
|
|
87
|
-
<Marquee reverse>
|
|
88
|
-
<div>Reversed</div>
|
|
89
|
-
<div>Animation</div>
|
|
90
|
-
</Marquee>
|
|
91
|
-
\`\`\`
|
|
92
|
-
|
|
93
|
-
### Custom Speed
|
|
94
|
-
\`\`\`tsx
|
|
95
|
-
<Marquee
|
|
96
|
-
className="[--duration:20s]"
|
|
97
|
-
style={{ '--duration': '20s' }}
|
|
98
|
-
>
|
|
99
|
-
<div>Faster animation</div>
|
|
100
|
-
</Marquee>
|
|
101
|
-
\`\`\`
|
|
102
|
-
|
|
103
|
-
## Use Cases
|
|
104
|
-
|
|
105
|
-
- **Logo Carousels**: Showcase partner or client logos
|
|
106
|
-
- **News Tickers**: Display breaking news or announcements
|
|
107
|
-
- **Testimonials**: Rotating customer testimonials
|
|
108
|
-
- **Social Media Feeds**: Live social media content
|
|
109
|
-
- **Product Showcases**: Continuous product displays
|
|
110
|
-
- **Stock Tickers**: Financial data displays
|
|
111
|
-
- **Event Announcements**: Scrolling event information
|
|
112
|
-
|
|
113
|
-
## Accessibility
|
|
114
|
-
|
|
115
|
-
- Consider users with motion sensitivity
|
|
116
|
-
- Provide pause controls for accessibility
|
|
117
|
-
- Ensure content is accessible via keyboard navigation
|
|
118
|
-
- Don't rely solely on marquee for critical information
|
|
119
|
-
- Test with screen readers for content accessibility
|
|
120
|
-
|
|
121
|
-
## Performance
|
|
122
|
-
|
|
123
|
-
- Uses CSS transforms for hardware acceleration
|
|
124
|
-
- Minimal JavaScript overhead
|
|
125
|
-
- Efficient DOM structure with repeated elements
|
|
126
|
-
- Smooth 60fps animations on modern browsers
|
|
127
|
-
`,
|
|
16
|
+
component:
|
|
17
|
+
"A smooth, CSS-animated marquee component for continuous horizontal or vertical scrolling content. Supports pause-on-hover, reverse direction, configurable speed, repeat count, and gutter spacing.",
|
|
128
18
|
},
|
|
19
|
+
page: () => (
|
|
20
|
+
<AuralComponentDocsPage
|
|
21
|
+
features={[
|
|
22
|
+
{
|
|
23
|
+
title: "Horizontal & Vertical",
|
|
24
|
+
description: "Direction via prop",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
title: "Pause on Hover",
|
|
28
|
+
description: "Built-in hover pause",
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
title: "Speed & Gutter",
|
|
32
|
+
description: "CSS duration and gap",
|
|
33
|
+
},
|
|
34
|
+
]}
|
|
35
|
+
/>
|
|
36
|
+
),
|
|
129
37
|
},
|
|
130
38
|
},
|
|
131
39
|
tags: ["autodocs"],
|
|
@@ -140,27 +48,19 @@ A smooth, customizable marquee component for creating continuous scrolling conte
|
|
|
140
48
|
},
|
|
141
49
|
pauseOnHover: {
|
|
142
50
|
control: "boolean",
|
|
143
|
-
description: "Pause animation when
|
|
51
|
+
description: "Pause animation when the pointer is over the marquee",
|
|
144
52
|
},
|
|
145
53
|
repeat: {
|
|
146
54
|
control: { type: "number", min: 1, max: 10, step: 1 },
|
|
147
|
-
description: "Number of times to repeat the
|
|
148
|
-
},
|
|
149
|
-
className: {
|
|
150
|
-
control: "text",
|
|
151
|
-
description: "Additional CSS classes for the container",
|
|
152
|
-
},
|
|
153
|
-
itemClassName: {
|
|
154
|
-
control: "text",
|
|
155
|
-
description: "CSS classes for individual marquee items",
|
|
55
|
+
description: "Number of times to repeat the children",
|
|
156
56
|
},
|
|
157
57
|
gutter: {
|
|
158
58
|
control: "text",
|
|
159
|
-
description: "
|
|
59
|
+
description: "Gap between repeated instances (CSS value, default: 1rem)",
|
|
160
60
|
},
|
|
161
61
|
duration: {
|
|
162
62
|
control: "text",
|
|
163
|
-
description: "Animation duration
|
|
63
|
+
description: "Animation cycle duration (CSS time value, default: 40s)",
|
|
164
64
|
},
|
|
165
65
|
},
|
|
166
66
|
}
|
|
@@ -168,521 +68,240 @@ A smooth, customizable marquee component for creating continuous scrolling conte
|
|
|
168
68
|
export default meta
|
|
169
69
|
type Story = StoryObj<typeof Marquee>
|
|
170
70
|
|
|
171
|
-
//
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
export const LogoCarousel: Story = {
|
|
202
|
-
render: () => (
|
|
203
|
-
<div className="w-full max-w-4xl">
|
|
204
|
-
<h3 className="mb-6 text-center text-lg font-medium text-white">
|
|
205
|
-
Our Partners
|
|
206
|
-
</h3>
|
|
207
|
-
<Marquee pauseOnHover={false} duration="30s">
|
|
208
|
-
<div className="flex h-20 w-40 items-center justify-center rounded-lg border border-white/10 bg-white/5 transition-colors hover:bg-white/10">
|
|
209
|
-
<div className="text-center">
|
|
210
|
-
<div className="text-2xl font-bold text-white">ACME</div>
|
|
211
|
-
<div className="text-xs text-white/60">Corporation</div>
|
|
212
|
-
</div>
|
|
213
|
-
</div>
|
|
214
|
-
<div className="flex h-20 w-40 items-center justify-center rounded-lg border border-white/10 bg-white/5 transition-colors hover:bg-white/10">
|
|
215
|
-
<div className="text-center">
|
|
216
|
-
<div className="text-2xl font-bold text-blue-400">TechCorp</div>
|
|
217
|
-
<div className="text-xs text-white/60">Innovation</div>
|
|
218
|
-
</div>
|
|
219
|
-
</div>
|
|
220
|
-
<div className="flex h-20 w-40 items-center justify-center rounded-lg border border-white/10 bg-white/5 transition-colors hover:bg-white/10">
|
|
221
|
-
<div className="text-center">
|
|
222
|
-
<div className="text-2xl font-bold text-green-400">GlobalTech</div>
|
|
223
|
-
<div className="text-xs text-white/60">Solutions</div>
|
|
224
|
-
</div>
|
|
225
|
-
</div>
|
|
226
|
-
<div className="flex h-20 w-40 items-center justify-center rounded-lg border border-white/10 bg-white/5 transition-colors hover:bg-white/10">
|
|
227
|
-
<div className="text-center">
|
|
228
|
-
<div className="text-2xl font-bold text-purple-400">
|
|
229
|
-
InnovateLab
|
|
230
|
-
</div>
|
|
231
|
-
<div className="text-xs text-white/60">Research</div>
|
|
232
|
-
</div>
|
|
233
|
-
</div>
|
|
234
|
-
<div className="flex h-20 w-40 items-center justify-center rounded-lg border border-white/10 bg-white/5 transition-colors hover:bg-white/10">
|
|
235
|
-
<div className="text-center">
|
|
236
|
-
<div className="text-2xl font-bold text-orange-400">FutureTech</div>
|
|
237
|
-
<div className="text-xs text-white/60">Systems</div>
|
|
238
|
-
</div>
|
|
239
|
-
</div>
|
|
240
|
-
</Marquee>
|
|
71
|
+
// ─── shared content helpers ───────────────────────────────────────────────────
|
|
72
|
+
|
|
73
|
+
/** A pill-shaped label card styled with design tokens only */
|
|
74
|
+
function TokenChip({
|
|
75
|
+
label,
|
|
76
|
+
surface,
|
|
77
|
+
}: {
|
|
78
|
+
label: string
|
|
79
|
+
surface:
|
|
80
|
+
| "secondary"
|
|
81
|
+
| "info-sec"
|
|
82
|
+
| "positive-sec"
|
|
83
|
+
| "warning-sec"
|
|
84
|
+
| "negative-sec"
|
|
85
|
+
}) {
|
|
86
|
+
const surfaceClass = {
|
|
87
|
+
secondary: "bg-fm-surface-secondary border-fm-divider-secondary",
|
|
88
|
+
"info-sec": "bg-fm-surface-info-sec border-fm-divider-secondary",
|
|
89
|
+
"positive-sec": "bg-fm-surface-positive-sec border-fm-divider-secondary",
|
|
90
|
+
"warning-sec": "bg-fm-surface-warning-sec border-fm-divider-secondary",
|
|
91
|
+
"negative-sec": "bg-fm-surface-negative-sec border-fm-divider-secondary",
|
|
92
|
+
}[surface]
|
|
93
|
+
|
|
94
|
+
return (
|
|
95
|
+
<div
|
|
96
|
+
className={`flex h-10 items-center rounded-full border px-4 whitespace-nowrap ${surfaceClass}`}
|
|
97
|
+
>
|
|
98
|
+
<span className="text-fm-primary font-fm-text text-fm-sm leading-fm-sm font-medium">
|
|
99
|
+
{label}
|
|
100
|
+
</span>
|
|
241
101
|
</div>
|
|
242
|
-
)
|
|
243
|
-
parameters: {
|
|
244
|
-
docs: {
|
|
245
|
-
description: {
|
|
246
|
-
story:
|
|
247
|
-
"A logo carousel showcasing partner companies with hover pause functionality.",
|
|
248
|
-
},
|
|
249
|
-
},
|
|
250
|
-
},
|
|
102
|
+
)
|
|
251
103
|
}
|
|
252
104
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
<div className="
|
|
257
|
-
<div className="
|
|
258
|
-
<span className="
|
|
259
|
-
|
|
105
|
+
/** Artist avatar card using design tokens */
|
|
106
|
+
function ArtistCard({ initials, name }: { initials: string; name: string }) {
|
|
107
|
+
return (
|
|
108
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary flex w-32 flex-col items-center gap-2 rounded-xl border p-3">
|
|
109
|
+
<div className="border-fm-divider-secondary bg-fm-surface-tertiary flex size-12 items-center justify-center rounded-full border">
|
|
110
|
+
<span className="text-fm-primary font-fm-brand text-fm-md leading-fm-md font-semibold">
|
|
111
|
+
{initials}
|
|
260
112
|
</span>
|
|
261
|
-
<Marquee duration="25s" pauseOnHover>
|
|
262
|
-
<span className="whitespace-nowrap">
|
|
263
|
-
🔴 Breaking: New product launch scheduled for next month
|
|
264
|
-
</span>
|
|
265
|
-
<span className="whitespace-nowrap">
|
|
266
|
-
📈 Stock market reaches new highs as tech sector surges
|
|
267
|
-
</span>
|
|
268
|
-
<span className="whitespace-nowrap">
|
|
269
|
-
🚀 Space mission successfully launches with international crew
|
|
270
|
-
</span>
|
|
271
|
-
<span className="whitespace-nowrap">
|
|
272
|
-
💡 Revolutionary AI breakthrough announced by research team
|
|
273
|
-
</span>
|
|
274
|
-
</Marquee>
|
|
275
113
|
</div>
|
|
114
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm truncate text-center">
|
|
115
|
+
{name}
|
|
116
|
+
</p>
|
|
276
117
|
</div>
|
|
277
|
-
)
|
|
278
|
-
parameters: {
|
|
279
|
-
docs: {
|
|
280
|
-
description: {
|
|
281
|
-
story: "A news ticker with live updates and breaking news format.",
|
|
282
|
-
},
|
|
283
|
-
},
|
|
284
|
-
},
|
|
118
|
+
)
|
|
285
119
|
}
|
|
286
120
|
|
|
287
|
-
//
|
|
288
|
-
export const Testimonials: Story = {
|
|
289
|
-
render: () => (
|
|
290
|
-
<div className="w-full max-w-5xl">
|
|
291
|
-
<h3 className="mb-6 text-center text-lg font-medium text-white">
|
|
292
|
-
What Our Customers Say
|
|
293
|
-
</h3>
|
|
294
|
-
<Marquee pauseOnHover duration="35s">
|
|
295
|
-
<div className="w-80 rounded-lg border border-white/10 bg-white/5 p-6 transition-colors hover:bg-white/10">
|
|
296
|
-
<div className="flex items-start space-x-4">
|
|
297
|
-
<div className="flex h-12 w-12 flex-shrink-0 items-center justify-center rounded-full bg-gradient-to-br from-blue-500 to-purple-600">
|
|
298
|
-
<span className="font-semibold text-white">JD</span>
|
|
299
|
-
</div>
|
|
300
|
-
<div className="space-y-2">
|
|
301
|
-
<p className="text-sm leading-relaxed text-white/80">
|
|
302
|
-
"This product has completely transformed our workflow. The
|
|
303
|
-
intuitive design and powerful features make it indispensable."
|
|
304
|
-
</p>
|
|
305
|
-
<div>
|
|
306
|
-
<div className="text-sm font-medium text-white">John Doe</div>
|
|
307
|
-
<div className="text-xs text-white/60">CEO, TechStart</div>
|
|
308
|
-
</div>
|
|
309
|
-
</div>
|
|
310
|
-
</div>
|
|
311
|
-
</div>
|
|
121
|
+
// ─── 1. Playground ────────────────────────────────────────────────────────────
|
|
312
122
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
</div>
|
|
333
|
-
</div>
|
|
334
|
-
|
|
335
|
-
<div className="w-80 rounded-lg border border-white/10 bg-white/5 p-6 transition-colors hover:bg-white/10">
|
|
336
|
-
<div className="flex items-start space-x-4">
|
|
337
|
-
<div className="flex h-12 w-12 flex-shrink-0 items-center justify-center rounded-full bg-gradient-to-br from-orange-500 to-red-600">
|
|
338
|
-
<span className="font-semibold text-white">MJ</span>
|
|
339
|
-
</div>
|
|
340
|
-
<div className="space-y-2">
|
|
341
|
-
<p className="text-sm leading-relaxed text-white/80">
|
|
342
|
-
"The ROI has been incredible. We've seen a 300% increase in
|
|
343
|
-
productivity since implementation."
|
|
344
|
-
</p>
|
|
345
|
-
<div>
|
|
346
|
-
<div className="text-sm font-medium text-white">
|
|
347
|
-
Mike Johnson
|
|
348
|
-
</div>
|
|
349
|
-
<div className="text-xs text-white/60">CTO, InnovateNow</div>
|
|
350
|
-
</div>
|
|
351
|
-
</div>
|
|
352
|
-
</div>
|
|
353
|
-
</div>
|
|
123
|
+
export const Playground: Story = {
|
|
124
|
+
args: {
|
|
125
|
+
pauseOnHover: true,
|
|
126
|
+
reverse: false,
|
|
127
|
+
vertical: false,
|
|
128
|
+
repeat: 4,
|
|
129
|
+
gutter: "1rem",
|
|
130
|
+
duration: "35s",
|
|
131
|
+
},
|
|
132
|
+
render: (args) => (
|
|
133
|
+
<div className="w-full max-w-2xl space-y-4">
|
|
134
|
+
<Marquee {...args}>
|
|
135
|
+
<TokenChip label="Electronic" surface="secondary" />
|
|
136
|
+
<TokenChip label="Hip-Hop" surface="secondary" />
|
|
137
|
+
<TokenChip label="Jazz" surface="secondary" />
|
|
138
|
+
<TokenChip label="Ambient" surface="secondary" />
|
|
139
|
+
<TokenChip label="R&B" surface="secondary" />
|
|
140
|
+
<TokenChip label="Indie" surface="secondary" />
|
|
141
|
+
<TokenChip label="Soul" surface="secondary" />
|
|
354
142
|
</Marquee>
|
|
143
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary rounded-lg border px-4 py-3">
|
|
144
|
+
<code className="text-fm-secondary text-fm-md leading-fm-md font-(--font-fm-mono)">{`<Marquee duration="${args.duration}" reverse={${args.reverse}} pauseOnHover={${args.pauseOnHover}} vertical={${args.vertical}} repeat={${args.repeat}} gutter="${args.gutter}" />`}</code>
|
|
145
|
+
</div>
|
|
355
146
|
</div>
|
|
356
147
|
),
|
|
357
148
|
parameters: {
|
|
358
149
|
docs: {
|
|
359
150
|
description: {
|
|
360
151
|
story:
|
|
361
|
-
"
|
|
152
|
+
"Controls-driven playground. Use the Storybook sidebar to adjust duration, direction, pause-on-hover, orientation, repeat count, and gutter spacing.",
|
|
362
153
|
},
|
|
363
154
|
},
|
|
364
155
|
},
|
|
365
156
|
}
|
|
366
157
|
|
|
367
|
-
//
|
|
368
|
-
|
|
158
|
+
// ─── 2. Configurations ────────────────────────────────────────────────────────
|
|
159
|
+
|
|
160
|
+
export const Configurations: Story = {
|
|
369
161
|
render: () => (
|
|
370
162
|
<div className="w-full max-w-4xl space-y-8">
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
{/* Horizontal Icons */}
|
|
376
|
-
<div className="space-y-4">
|
|
377
|
-
<h4 className="text-center text-sm font-medium text-white/70">
|
|
378
|
-
Horizontal Scroll
|
|
163
|
+
{/* Horizontal (default) */}
|
|
164
|
+
<div className="space-y-3">
|
|
165
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
166
|
+
Horizontal (default)
|
|
379
167
|
</h4>
|
|
380
|
-
<Marquee
|
|
381
|
-
<
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
<div className="flex w-24 flex-col items-center space-y-2">
|
|
388
|
-
<div className="flex h-16 w-16 items-center justify-center rounded-lg bg-green-500/20">
|
|
389
|
-
<TickCircleIcon className="h-8 w-8 text-green-400" />
|
|
390
|
-
</div>
|
|
391
|
-
<span className="text-xs text-white/70">Complete</span>
|
|
392
|
-
</div>
|
|
393
|
-
<div className="flex w-24 flex-col items-center space-y-2">
|
|
394
|
-
<div className="flex h-16 w-16 items-center justify-center rounded-lg bg-purple-500/20">
|
|
395
|
-
<EditBigIcon className="h-8 w-8 text-purple-400" />
|
|
396
|
-
</div>
|
|
397
|
-
<span className="text-xs text-white/70">Edit</span>
|
|
398
|
-
</div>
|
|
399
|
-
<div className="flex w-24 flex-col items-center space-y-2">
|
|
400
|
-
<div className="flex h-16 w-16 items-center justify-center rounded-lg bg-orange-500/20">
|
|
401
|
-
<FileChartIcon className="h-8 w-8 text-orange-400" />
|
|
402
|
-
</div>
|
|
403
|
-
<span className="text-xs text-white/70">Analytics</span>
|
|
404
|
-
</div>
|
|
405
|
-
<div className="flex w-24 flex-col items-center space-y-2">
|
|
406
|
-
<div className="flex h-16 w-16 items-center justify-center rounded-lg bg-red-500/20">
|
|
407
|
-
<AlertIcon className="h-8 w-8 text-red-400" />
|
|
408
|
-
</div>
|
|
409
|
-
<span className="text-xs text-white/70">Alert</span>
|
|
410
|
-
</div>
|
|
411
|
-
<div className="flex w-24 flex-col items-center space-y-2">
|
|
412
|
-
<div className="flex h-16 w-16 items-center justify-center rounded-lg bg-cyan-500/20">
|
|
413
|
-
<EyeOpenIcon className="h-8 w-8 text-cyan-400" />
|
|
414
|
-
</div>
|
|
415
|
-
<span className="text-xs text-white/70">View</span>
|
|
416
|
-
</div>
|
|
168
|
+
<Marquee duration="35s" pauseOnHover>
|
|
169
|
+
<TokenChip label="Electronic" surface="secondary" />
|
|
170
|
+
<TokenChip label="Hip-Hop" surface="secondary" />
|
|
171
|
+
<TokenChip label="Jazz" surface="secondary" />
|
|
172
|
+
<TokenChip label="Ambient" surface="secondary" />
|
|
173
|
+
<TokenChip label="R&B" surface="secondary" />
|
|
174
|
+
<TokenChip label="Indie" surface="secondary" />
|
|
417
175
|
</Marquee>
|
|
176
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
177
|
+
Hover to pause
|
|
178
|
+
</p>
|
|
418
179
|
</div>
|
|
419
180
|
|
|
420
|
-
{/* Reverse
|
|
421
|
-
<div className="space-y-
|
|
422
|
-
<h4 className="text-
|
|
181
|
+
{/* Reverse direction */}
|
|
182
|
+
<div className="space-y-3">
|
|
183
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
423
184
|
Reverse Direction
|
|
424
185
|
</h4>
|
|
425
|
-
<Marquee
|
|
426
|
-
<
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
<
|
|
431
|
-
|
|
432
|
-
<span className="text-sm text-white">Delete</span>
|
|
433
|
-
</div>
|
|
434
|
-
<div className="flex items-center space-x-3 rounded-lg border border-white/10 bg-white/5 px-4 py-2">
|
|
435
|
-
<EditBigIcon className="h-5 w-5 text-blue-400" />
|
|
436
|
-
<span className="text-sm text-white">Edit</span>
|
|
437
|
-
</div>
|
|
438
|
-
<div className="flex items-center space-x-3 rounded-lg border border-white/10 bg-white/5 px-4 py-2">
|
|
439
|
-
<EyeOpenIcon className="h-5 w-5 text-purple-400" />
|
|
440
|
-
<span className="text-sm text-white">Preview</span>
|
|
441
|
-
</div>
|
|
186
|
+
<Marquee duration="35s" reverse pauseOnHover>
|
|
187
|
+
<TokenChip label="Electronic" surface="info-sec" />
|
|
188
|
+
<TokenChip label="Hip-Hop" surface="info-sec" />
|
|
189
|
+
<TokenChip label="Jazz" surface="info-sec" />
|
|
190
|
+
<TokenChip label="Ambient" surface="info-sec" />
|
|
191
|
+
<TokenChip label="R&B" surface="info-sec" />
|
|
192
|
+
<TokenChip label="Indie" surface="info-sec" />
|
|
442
193
|
</Marquee>
|
|
194
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
195
|
+
Scrolls right-to-left in reverse
|
|
196
|
+
</p>
|
|
443
197
|
</div>
|
|
444
|
-
</div>
|
|
445
|
-
),
|
|
446
|
-
parameters: {
|
|
447
|
-
docs: {
|
|
448
|
-
description: {
|
|
449
|
-
story:
|
|
450
|
-
"Icon showcase with feature icons and action buttons in normal and reverse directions.",
|
|
451
|
-
},
|
|
452
|
-
},
|
|
453
|
-
},
|
|
454
|
-
}
|
|
455
198
|
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
{/* Social Media Feed */}
|
|
461
|
-
<div className="space-y-4">
|
|
462
|
-
<h4 className="text-center text-sm font-medium text-white/70">
|
|
463
|
-
Social Feed
|
|
199
|
+
{/* Pause on hover — compare */}
|
|
200
|
+
<div className="space-y-3">
|
|
201
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
202
|
+
pauseOnHover: off vs. on
|
|
464
203
|
</h4>
|
|
465
|
-
<div className="
|
|
466
|
-
<Marquee
|
|
467
|
-
<
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
</div>
|
|
472
|
-
<div className="space-y-1">
|
|
473
|
-
<div className="text-sm font-medium text-white">
|
|
474
|
-
@alice_dev
|
|
475
|
-
</div>
|
|
476
|
-
<p className="text-sm text-white/70">
|
|
477
|
-
Just shipped a new feature! The team's hard work really paid
|
|
478
|
-
off. 🚀
|
|
479
|
-
</p>
|
|
480
|
-
<div className="text-xs text-white/50">2 minutes ago</div>
|
|
481
|
-
</div>
|
|
482
|
-
</div>
|
|
483
|
-
</div>
|
|
484
|
-
|
|
485
|
-
<div className="rounded-lg border border-white/10 bg-white/5 p-4 transition-colors hover:bg-white/10">
|
|
486
|
-
<div className="flex items-start space-x-3">
|
|
487
|
-
<div className="flex h-10 w-10 items-center justify-center rounded-full bg-gradient-to-br from-green-500 to-teal-600">
|
|
488
|
-
<span className="text-sm font-semibold text-white">@B</span>
|
|
489
|
-
</div>
|
|
490
|
-
<div className="space-y-1">
|
|
491
|
-
<div className="text-sm font-medium text-white">
|
|
492
|
-
@bob_designer
|
|
493
|
-
</div>
|
|
494
|
-
<p className="text-sm text-white/70">
|
|
495
|
-
Working on some exciting new designs. Can't wait to share
|
|
496
|
-
them with everyone! ✨
|
|
497
|
-
</p>
|
|
498
|
-
<div className="text-xs text-white/50">5 minutes ago</div>
|
|
499
|
-
</div>
|
|
500
|
-
</div>
|
|
501
|
-
</div>
|
|
502
|
-
|
|
503
|
-
<div className="rounded-lg border border-white/10 bg-white/5 p-4 transition-colors hover:bg-white/10">
|
|
504
|
-
<div className="flex items-start space-x-3">
|
|
505
|
-
<div className="flex h-10 w-10 items-center justify-center rounded-full bg-gradient-to-br from-orange-500 to-red-600">
|
|
506
|
-
<span className="text-sm font-semibold text-white">@C</span>
|
|
507
|
-
</div>
|
|
508
|
-
<div className="space-y-1">
|
|
509
|
-
<div className="text-sm font-medium text-white">
|
|
510
|
-
@charlie_pm
|
|
511
|
-
</div>
|
|
512
|
-
<p className="text-sm text-white/70">
|
|
513
|
-
Great sprint review today! The team exceeded all
|
|
514
|
-
expectations. 📊
|
|
515
|
-
</p>
|
|
516
|
-
<div className="text-xs text-white/50">8 minutes ago</div>
|
|
517
|
-
</div>
|
|
518
|
-
</div>
|
|
519
|
-
</div>
|
|
204
|
+
<div className="space-y-2">
|
|
205
|
+
<Marquee duration="25s" pauseOnHover={false}>
|
|
206
|
+
<TokenChip label="Always moving" surface="negative-sec" />
|
|
207
|
+
<TokenChip label="No pause" surface="negative-sec" />
|
|
208
|
+
<TokenChip label="Continuous" surface="negative-sec" />
|
|
209
|
+
<TokenChip label="Non-stop" surface="negative-sec" />
|
|
520
210
|
</Marquee>
|
|
211
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
212
|
+
pauseOnHover: false — never pauses
|
|
213
|
+
</p>
|
|
521
214
|
</div>
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
</h4>
|
|
529
|
-
<div className="h-96 w-72">
|
|
530
|
-
<Marquee
|
|
531
|
-
vertical
|
|
532
|
-
reverse
|
|
533
|
-
pauseOnHover
|
|
534
|
-
duration="25s"
|
|
535
|
-
className="h-full"
|
|
536
|
-
>
|
|
537
|
-
<div className="flex items-center space-x-3 rounded-lg border border-blue-500/20 bg-blue-500/10 p-3">
|
|
538
|
-
<AlertIcon className="h-5 w-5 flex-shrink-0 text-blue-400" />
|
|
539
|
-
<div>
|
|
540
|
-
<div className="text-sm text-white">New message received</div>
|
|
541
|
-
<div className="text-xs text-white/60">From John Doe</div>
|
|
542
|
-
</div>
|
|
543
|
-
</div>
|
|
544
|
-
|
|
545
|
-
<div className="flex items-center space-x-3 rounded-lg border border-green-500/20 bg-green-500/10 p-3">
|
|
546
|
-
<TickCircleIcon className="h-5 w-5 flex-shrink-0 text-green-400" />
|
|
547
|
-
<div>
|
|
548
|
-
<div className="text-sm text-white">Task completed</div>
|
|
549
|
-
<div className="text-xs text-white/60">
|
|
550
|
-
Design review finished
|
|
551
|
-
</div>
|
|
552
|
-
</div>
|
|
553
|
-
</div>
|
|
554
|
-
|
|
555
|
-
<div className="flex items-center space-x-3 rounded-lg border border-purple-500/20 bg-purple-500/10 p-3">
|
|
556
|
-
<FileChartIcon className="h-5 w-5 flex-shrink-0 text-purple-400" />
|
|
557
|
-
<div>
|
|
558
|
-
<div className="text-sm text-white">Report generated</div>
|
|
559
|
-
<div className="text-xs text-white/60">
|
|
560
|
-
Monthly analytics ready
|
|
561
|
-
</div>
|
|
562
|
-
</div>
|
|
563
|
-
</div>
|
|
564
|
-
|
|
565
|
-
<div className="flex items-center space-x-3 rounded-lg border border-orange-500/20 bg-orange-500/10 p-3">
|
|
566
|
-
<EditBigIcon className="h-5 w-5 flex-shrink-0 text-orange-400" />
|
|
567
|
-
<div>
|
|
568
|
-
<div className="text-sm text-white">Document updated</div>
|
|
569
|
-
<div className="text-xs text-white/60">
|
|
570
|
-
Project specs modified
|
|
571
|
-
</div>
|
|
572
|
-
</div>
|
|
573
|
-
</div>
|
|
215
|
+
<div className="space-y-2">
|
|
216
|
+
<Marquee duration="25s" pauseOnHover>
|
|
217
|
+
<TokenChip label="Hover me" surface="positive-sec" />
|
|
218
|
+
<TokenChip label="Pauses here" surface="positive-sec" />
|
|
219
|
+
<TokenChip label="Mouse over" surface="positive-sec" />
|
|
220
|
+
<TokenChip label="Try it" surface="positive-sec" />
|
|
574
221
|
</Marquee>
|
|
222
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
223
|
+
pauseOnHover: true — pauses on hover
|
|
224
|
+
</p>
|
|
575
225
|
</div>
|
|
576
226
|
</div>
|
|
577
|
-
</div>
|
|
578
|
-
),
|
|
579
|
-
parameters: {
|
|
580
|
-
docs: {
|
|
581
|
-
description: {
|
|
582
|
-
story:
|
|
583
|
-
"Vertical marquees showing social media feeds and notifications with different directions.",
|
|
584
|
-
},
|
|
585
|
-
},
|
|
586
|
-
},
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
// 7. Speed Variations
|
|
590
|
-
export const SpeedVariations: Story = {
|
|
591
|
-
render: () => (
|
|
592
|
-
<div className="w-full max-w-4xl space-y-8">
|
|
593
|
-
<h3 className="text-center text-lg font-medium text-white">
|
|
594
|
-
Speed Variations
|
|
595
|
-
</h3>
|
|
596
227
|
|
|
597
|
-
|
|
598
|
-
|
|
228
|
+
{/* Speed variations */}
|
|
229
|
+
<div className="space-y-3">
|
|
230
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
231
|
+
Speed Variations
|
|
232
|
+
</h4>
|
|
599
233
|
<div className="space-y-2">
|
|
600
|
-
<h4 className="text-sm font-medium text-white/70">
|
|
601
|
-
Slow Speed (60s)
|
|
602
|
-
</h4>
|
|
603
234
|
<Marquee duration="60s" pauseOnHover>
|
|
604
|
-
<
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
<
|
|
608
|
-
Takes 60 seconds
|
|
609
|
-
</div>
|
|
610
|
-
<div className="rounded-lg bg-purple-500/20 px-6 py-3 text-purple-300">
|
|
611
|
-
To complete cycle
|
|
612
|
-
</div>
|
|
613
|
-
<div className="rounded-lg bg-orange-500/20 px-6 py-3 text-orange-300">
|
|
614
|
-
Very relaxed pace
|
|
615
|
-
</div>
|
|
616
|
-
</Marquee>
|
|
617
|
-
</div>
|
|
618
|
-
|
|
619
|
-
{/* Normal */}
|
|
620
|
-
<div className="space-y-2">
|
|
621
|
-
<h4 className="text-sm font-medium text-white/70">
|
|
622
|
-
Normal Speed (40s - Default)
|
|
623
|
-
</h4>
|
|
624
|
-
<Marquee pauseOnHover>
|
|
625
|
-
<div className="rounded-lg bg-blue-500/20 px-6 py-3 text-blue-300">
|
|
626
|
-
Normal speed content
|
|
627
|
-
</div>
|
|
628
|
-
<div className="rounded-lg bg-green-500/20 px-6 py-3 text-green-300">
|
|
629
|
-
Standard 40 seconds
|
|
630
|
-
</div>
|
|
631
|
-
<div className="rounded-lg bg-purple-500/20 px-6 py-3 text-purple-300">
|
|
632
|
-
Balanced timing
|
|
633
|
-
</div>
|
|
634
|
-
<div className="rounded-lg bg-orange-500/20 px-6 py-3 text-orange-300">
|
|
635
|
-
Good for most cases
|
|
636
|
-
</div>
|
|
235
|
+
<TokenChip label="Slow — 60s" surface="secondary" />
|
|
236
|
+
<TokenChip label="Relaxed pace" surface="secondary" />
|
|
237
|
+
<TokenChip label="Ambient feel" surface="secondary" />
|
|
238
|
+
<TokenChip label="Low energy" surface="secondary" />
|
|
637
239
|
</Marquee>
|
|
240
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
241
|
+
60s — slow
|
|
242
|
+
</p>
|
|
638
243
|
</div>
|
|
639
|
-
|
|
640
|
-
{/* Fast */}
|
|
641
244
|
<div className="space-y-2">
|
|
642
|
-
<
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
<
|
|
647
|
-
Fast moving content
|
|
648
|
-
</div>
|
|
649
|
-
<div className="rounded-lg bg-green-500/20 px-6 py-3 text-green-300">
|
|
650
|
-
Only 20 seconds
|
|
651
|
-
</div>
|
|
652
|
-
<div className="rounded-lg bg-purple-500/20 px-6 py-3 text-purple-300">
|
|
653
|
-
Quick cycling
|
|
654
|
-
</div>
|
|
655
|
-
<div className="rounded-lg bg-orange-500/20 px-6 py-3 text-orange-300">
|
|
656
|
-
High energy
|
|
657
|
-
</div>
|
|
245
|
+
<Marquee duration="30s" pauseOnHover>
|
|
246
|
+
<TokenChip label="Normal — 30s" surface="secondary" />
|
|
247
|
+
<TokenChip label="Default feel" surface="secondary" />
|
|
248
|
+
<TokenChip label="Balanced" surface="secondary" />
|
|
249
|
+
<TokenChip label="Versatile" surface="secondary" />
|
|
658
250
|
</Marquee>
|
|
251
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
252
|
+
30s — normal
|
|
253
|
+
</p>
|
|
659
254
|
</div>
|
|
660
|
-
|
|
661
|
-
{/* Very Fast */}
|
|
662
255
|
<div className="space-y-2">
|
|
663
|
-
<
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
<
|
|
668
|
-
Lightning fast
|
|
669
|
-
</div>
|
|
670
|
-
<div className="rounded-lg bg-green-500/20 px-6 py-3 text-green-300">
|
|
671
|
-
Just 10 seconds
|
|
672
|
-
</div>
|
|
673
|
-
<div className="rounded-lg bg-purple-500/20 px-6 py-3 text-purple-300">
|
|
674
|
-
Rapid movement
|
|
675
|
-
</div>
|
|
676
|
-
<div className="rounded-lg bg-orange-500/20 px-6 py-3 text-orange-300">
|
|
677
|
-
Dynamic feel
|
|
678
|
-
</div>
|
|
256
|
+
<Marquee duration="12s" pauseOnHover>
|
|
257
|
+
<TokenChip label="Fast — 12s" surface="warning-sec" />
|
|
258
|
+
<TokenChip label="High energy" surface="warning-sec" />
|
|
259
|
+
<TokenChip label="Urgent" surface="warning-sec" />
|
|
260
|
+
<TokenChip label="Dynamic" surface="warning-sec" />
|
|
679
261
|
</Marquee>
|
|
262
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
263
|
+
12s — fast
|
|
264
|
+
</p>
|
|
680
265
|
</div>
|
|
681
266
|
</div>
|
|
682
267
|
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
268
|
+
{/* Vertical */}
|
|
269
|
+
<div className="space-y-3">
|
|
270
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
271
|
+
Vertical Orientation
|
|
272
|
+
</h4>
|
|
273
|
+
<div className="flex justify-center">
|
|
274
|
+
<div className="h-48 w-56 overflow-hidden">
|
|
275
|
+
<Marquee vertical duration="18s" pauseOnHover className="h-full">
|
|
276
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary my-1 flex items-center gap-2 rounded-lg border px-3 py-2">
|
|
277
|
+
<MusicalNoteIcon className="text-fm-secondary h-4 w-4 shrink-0" />
|
|
278
|
+
<span className="text-fm-primary font-fm-text text-fm-sm leading-fm-sm">
|
|
279
|
+
Bicep — Glue
|
|
280
|
+
</span>
|
|
281
|
+
</div>
|
|
282
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary my-1 flex items-center gap-2 rounded-lg border px-3 py-2">
|
|
283
|
+
<MusicalNoteIcon className="text-fm-secondary h-4 w-4 shrink-0" />
|
|
284
|
+
<span className="text-fm-primary font-fm-text text-fm-sm leading-fm-sm">
|
|
285
|
+
Four Tet — Baby
|
|
286
|
+
</span>
|
|
287
|
+
</div>
|
|
288
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary my-1 flex items-center gap-2 rounded-lg border px-3 py-2">
|
|
289
|
+
<MusicalNoteIcon className="text-fm-secondary h-4 w-4 shrink-0" />
|
|
290
|
+
<span className="text-fm-primary font-fm-text text-fm-sm leading-fm-sm">
|
|
291
|
+
Floating Points
|
|
292
|
+
</span>
|
|
293
|
+
</div>
|
|
294
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary my-1 flex items-center gap-2 rounded-lg border px-3 py-2">
|
|
295
|
+
<MusicalNoteIcon className="text-fm-secondary h-4 w-4 shrink-0" />
|
|
296
|
+
<span className="text-fm-primary font-fm-text text-fm-sm leading-fm-sm">
|
|
297
|
+
Jon Hopkins
|
|
298
|
+
</span>
|
|
299
|
+
</div>
|
|
300
|
+
</Marquee>
|
|
301
|
+
</div>
|
|
302
|
+
</div>
|
|
303
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm text-center">
|
|
304
|
+
vertical: true — scrolls top to bottom
|
|
686
305
|
</p>
|
|
687
306
|
</div>
|
|
688
307
|
</div>
|
|
@@ -691,128 +310,171 @@ export const SpeedVariations: Story = {
|
|
|
691
310
|
docs: {
|
|
692
311
|
description: {
|
|
693
312
|
story:
|
|
694
|
-
"
|
|
313
|
+
"Comparison of all main configuration axes: horizontal vs. vertical orientation, normal vs. reverse direction, pauseOnHover toggle, and speed variations from 12s (fast) to 60s (slow).",
|
|
695
314
|
},
|
|
696
315
|
},
|
|
697
316
|
},
|
|
698
317
|
}
|
|
699
318
|
|
|
700
|
-
//
|
|
701
|
-
export const InteractiveControls: Story = {
|
|
702
|
-
render: () => {
|
|
703
|
-
const [speed, setSpeed] = React.useState(40)
|
|
704
|
-
const [isPaused, setIsPaused] = React.useState(false)
|
|
705
|
-
const [isReverse, setIsReverse] = React.useState(false)
|
|
706
|
-
const [isVertical, setIsVertical] = React.useState(false)
|
|
319
|
+
// ─── 2. UseCases ──────────────────────────────────────────────────────────────
|
|
707
320
|
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
<div className="text-center text-xs text-white/60">{speed}s</div>
|
|
728
|
-
</div>
|
|
729
|
-
|
|
730
|
-
<div className="space-y-2">
|
|
731
|
-
<label className="text-sm text-white/70">Direction</label>
|
|
732
|
-
<button
|
|
733
|
-
onClick={() => setIsReverse(!isReverse)}
|
|
734
|
-
className={`w-full rounded px-3 py-2 text-sm transition-colors ${
|
|
735
|
-
isReverse
|
|
736
|
-
? "bg-blue-500 text-white"
|
|
737
|
-
: "bg-white/10 text-white/70 hover:bg-white/20"
|
|
738
|
-
}`}
|
|
739
|
-
>
|
|
740
|
-
{isReverse ? "Reverse" : "Normal"}
|
|
741
|
-
</button>
|
|
742
|
-
</div>
|
|
743
|
-
|
|
744
|
-
<div className="space-y-2">
|
|
745
|
-
<label className="text-sm text-white/70">Orientation</label>
|
|
746
|
-
<button
|
|
747
|
-
onClick={() => setIsVertical(!isVertical)}
|
|
748
|
-
className={`w-full rounded px-3 py-2 text-sm transition-colors ${
|
|
749
|
-
isVertical
|
|
750
|
-
? "bg-green-500 text-white"
|
|
751
|
-
: "bg-white/10 text-white/70 hover:bg-white/20"
|
|
752
|
-
}`}
|
|
753
|
-
>
|
|
754
|
-
{isVertical ? "Vertical" : "Horizontal"}
|
|
755
|
-
</button>
|
|
756
|
-
</div>
|
|
321
|
+
export const UseCases: Story = {
|
|
322
|
+
render: () => (
|
|
323
|
+
<div className="mx-auto max-w-3xl space-y-8 p-8">
|
|
324
|
+
{/* Artist avatar / label carousel */}
|
|
325
|
+
<div className="space-y-4">
|
|
326
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
327
|
+
Artist Carousel
|
|
328
|
+
</h4>
|
|
329
|
+
<Marquee duration="40s" pauseOnHover gutter="1rem">
|
|
330
|
+
<ArtistCard initials="BC" name="Bicep" />
|
|
331
|
+
<ArtistCard initials="FT" name="Four Tet" />
|
|
332
|
+
<ArtistCard initials="FP" name="Floating Pts" />
|
|
333
|
+
<ArtistCard initials="JH" name="Jon Hopkins" />
|
|
334
|
+
<ArtistCard initials="RP" name="Röyksopp" />
|
|
335
|
+
<ArtistCard initials="AP" name="Aphex Twin" />
|
|
336
|
+
<ArtistCard initials="BB" name="Bonobo" />
|
|
337
|
+
<ArtistCard initials="OV" name="Overmono" />
|
|
338
|
+
</Marquee>
|
|
339
|
+
</div>
|
|
757
340
|
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
}`}
|
|
767
|
-
>
|
|
768
|
-
{isPaused ? "Paused" : "Playing"}
|
|
769
|
-
</button>
|
|
770
|
-
</div>
|
|
341
|
+
{/* News ticker / announcement strip */}
|
|
342
|
+
<div className="space-y-4">
|
|
343
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
344
|
+
Announcements Ticker
|
|
345
|
+
</h4>
|
|
346
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary flex items-center gap-3 overflow-hidden rounded-lg border px-4 py-2">
|
|
347
|
+
<div className="bg-fm-surface-negative-sec text-fm-primary text-fm-xs leading-fm-xs shrink-0 rounded px-2 py-0.5 font-semibold tracking-widest uppercase">
|
|
348
|
+
Live
|
|
771
349
|
</div>
|
|
350
|
+
<Marquee duration="28s" pauseOnHover className="flex-1">
|
|
351
|
+
<span className="text-fm-primary font-fm-text text-fm-sm leading-fm-sm px-6 whitespace-nowrap">
|
|
352
|
+
Bicep announce headline set at Primavera Sound 2026
|
|
353
|
+
</span>
|
|
354
|
+
<span className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm px-6 whitespace-nowrap">
|
|
355
|
+
·
|
|
356
|
+
</span>
|
|
357
|
+
<span className="text-fm-primary font-fm-text text-fm-sm leading-fm-sm px-6 whitespace-nowrap">
|
|
358
|
+
Four Tet drops surprise EP on Bandcamp — download now
|
|
359
|
+
</span>
|
|
360
|
+
<span className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm px-6 whitespace-nowrap">
|
|
361
|
+
·
|
|
362
|
+
</span>
|
|
363
|
+
<span className="text-fm-primary font-fm-text text-fm-sm leading-fm-sm px-6 whitespace-nowrap">
|
|
364
|
+
PocketFM 3.0 launch: redesigned player and social listening
|
|
365
|
+
</span>
|
|
366
|
+
<span className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm px-6 whitespace-nowrap">
|
|
367
|
+
·
|
|
368
|
+
</span>
|
|
369
|
+
<span className="text-fm-primary font-fm-text text-fm-sm leading-fm-sm px-6 whitespace-nowrap">
|
|
370
|
+
New editorial playlists updated every Friday
|
|
371
|
+
</span>
|
|
372
|
+
</Marquee>
|
|
772
373
|
</div>
|
|
374
|
+
</div>
|
|
773
375
|
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
>
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
376
|
+
{/* Song queue strip */}
|
|
377
|
+
<div className="space-y-4">
|
|
378
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
379
|
+
Now Playing Queue Strip
|
|
380
|
+
</h4>
|
|
381
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary rounded-xl border p-4">
|
|
382
|
+
<p className="text-fm-tertiary font-fm-text text-fm-sm leading-fm-sm mb-3 tracking-widest uppercase">
|
|
383
|
+
Up next
|
|
384
|
+
</p>
|
|
385
|
+
<Marquee duration="50s" pauseOnHover gutter="0.75rem">
|
|
386
|
+
{[
|
|
387
|
+
{ track: "Glue", artist: "Bicep", active: true },
|
|
388
|
+
{ track: "Baby", artist: "Four Tet", active: false },
|
|
389
|
+
{ track: "Nacht 001-iv", artist: "Floating Pts", active: false },
|
|
390
|
+
{ track: "Emerald Rush", artist: "Jon Hopkins", active: false },
|
|
391
|
+
{ track: "Fridge Hum", artist: "Bonobo", active: false },
|
|
392
|
+
{ track: "Kerning", artist: "Overmono", active: false },
|
|
393
|
+
{ track: "Monument", artist: "Röyksopp", active: false },
|
|
394
|
+
{ track: "Alberto Balsam", artist: "Aphex Twin", active: false },
|
|
395
|
+
].map((item) => (
|
|
396
|
+
<div
|
|
397
|
+
key={item.track}
|
|
398
|
+
className={[
|
|
399
|
+
"flex shrink-0 flex-col gap-0.5 rounded-lg border px-3 py-2 transition-colors",
|
|
400
|
+
item.active
|
|
401
|
+
? "border-fm-divider-brand-secondary bg-fm-surface-secondary"
|
|
402
|
+
: "border-fm-divider-secondary bg-fm-surface-secondary",
|
|
403
|
+
].join(" ")}
|
|
404
|
+
>
|
|
405
|
+
<div className="flex items-center gap-2">
|
|
406
|
+
{item.active && (
|
|
407
|
+
<TickCircleIcon className="text-fm-positive h-3 w-3 shrink-0" />
|
|
408
|
+
)}
|
|
409
|
+
<p className="text-fm-primary font-fm-text text-fm-sm leading-fm-sm font-medium whitespace-nowrap">
|
|
410
|
+
{item.track}
|
|
411
|
+
</p>
|
|
412
|
+
</div>
|
|
413
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm whitespace-nowrap">
|
|
414
|
+
{item.artist}
|
|
415
|
+
</p>
|
|
416
|
+
</div>
|
|
417
|
+
))}
|
|
799
418
|
</Marquee>
|
|
800
419
|
</div>
|
|
420
|
+
</div>
|
|
801
421
|
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
422
|
+
{/* Dual-row reverse for status badges */}
|
|
423
|
+
<div className="space-y-4">
|
|
424
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
425
|
+
Genre Tag Cloud (dual-row)
|
|
426
|
+
</h4>
|
|
427
|
+
<div className="space-y-2 overflow-hidden">
|
|
428
|
+
<Marquee duration="45s" pauseOnHover>
|
|
429
|
+
{[
|
|
430
|
+
"Techno",
|
|
431
|
+
"House",
|
|
432
|
+
"Drum & Bass",
|
|
433
|
+
"Jungle",
|
|
434
|
+
"UK Garage",
|
|
435
|
+
"Deep House",
|
|
436
|
+
"Trance",
|
|
437
|
+
"Breaks",
|
|
438
|
+
"Electro",
|
|
439
|
+
].map((g) => (
|
|
440
|
+
<TokenChip key={g} label={g} surface="secondary" />
|
|
441
|
+
))}
|
|
442
|
+
</Marquee>
|
|
443
|
+
<Marquee duration="38s" reverse pauseOnHover>
|
|
444
|
+
{[
|
|
445
|
+
"Neo-Soul",
|
|
446
|
+
"Lo-Fi",
|
|
447
|
+
"Jazz Fusion",
|
|
448
|
+
"Afrobeat",
|
|
449
|
+
"Latin",
|
|
450
|
+
"Bossa Nova",
|
|
451
|
+
"Downtempo",
|
|
452
|
+
"Trip-Hop",
|
|
453
|
+
"Chillout",
|
|
454
|
+
].map((g) => (
|
|
455
|
+
<TokenChip key={g} label={g} surface="info-sec" />
|
|
456
|
+
))}
|
|
457
|
+
</Marquee>
|
|
807
458
|
</div>
|
|
808
459
|
</div>
|
|
809
|
-
|
|
810
|
-
|
|
460
|
+
|
|
461
|
+
{/* Info box */}
|
|
462
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary rounded-lg border p-4">
|
|
463
|
+
<p className="text-fm-secondary font-fm-text text-fm-md leading-fm-xl">
|
|
464
|
+
All marquee examples above use only design system tokens for color,
|
|
465
|
+
spacing, and typography — no hardcoded values. Reduced-motion users
|
|
466
|
+
will see a paused state automatically, as the component respects
|
|
467
|
+
<code className="text-fm-primary mx-1">prefers-reduced-motion</code>.
|
|
468
|
+
</p>
|
|
469
|
+
</div>
|
|
470
|
+
</div>
|
|
471
|
+
),
|
|
811
472
|
parameters: {
|
|
473
|
+
layout: "fullscreen",
|
|
812
474
|
docs: {
|
|
813
475
|
description: {
|
|
814
476
|
story:
|
|
815
|
-
"
|
|
477
|
+
"Real product-shaped examples: an artist avatar carousel, a live announcements ticker, a now-playing queue strip, and a dual-row genre tag cloud. All using design system tokens.",
|
|
816
478
|
},
|
|
817
479
|
},
|
|
818
480
|
},
|