aural-ui 3.0.7 → 4.0.1
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 +271 -242
- package/dist/components/avatar/Avatar.stories.tsx +84 -70
- package/dist/components/button/Button.stories.tsx +7 -7
- package/dist/components/button/index.tsx +7 -7
- package/dist/components/card/Card.stories.tsx +3 -3
- package/dist/components/char-count/CharCount.stories.tsx +9 -9
- package/dist/components/circular-loader/CircularLoader.stories.tsx +109 -93
- package/dist/components/collapsible/Collapsible.stories.tsx +1 -1
- package/dist/components/command/Command.stories.tsx +52 -38
- package/dist/components/dialog/Dialog.stories.tsx +89 -84
- package/dist/components/divider/Divider.stories.tsx +86 -60
- package/dist/components/dot-loader/DotLoader.stories.tsx +12 -12
- package/dist/components/drawer/Drawer.stories.tsx +74 -44
- package/dist/components/drawer/index.tsx +3 -3
- package/dist/components/dropdown/Dropdown.stories.tsx +42 -32
- package/dist/components/helper-text/HelperText.stories.tsx +2 -2
- package/dist/components/hover-card/HoverCard.stories.tsx +211 -178
- package/dist/components/input/Input.stories.tsx +2 -2
- package/dist/components/label/Label.stories.tsx +10 -10
- package/dist/components/list/List.stories.tsx +58 -44
- package/dist/components/marquee/Marquee.stories.tsx +131 -113
- package/dist/components/otp-inputs/OtpInputs.stories.tsx +47 -35
- package/dist/components/overlay/Overlay.stories.tsx +98 -92
- package/dist/components/overlay/index.tsx +4 -4
- package/dist/components/popover/Popover.stories.tsx +132 -106
- package/dist/components/radio/Radio.stories.tsx +2 -2
- package/dist/components/resizable/Resizable.stories.tsx +186 -138
- package/dist/components/scroll-area/ScrollArea.stories.tsx +174 -120
- package/dist/components/search/Search.stories.tsx +81 -59
- package/dist/components/select/Select.stories.tsx +3 -1
- package/dist/components/sheet/Sheet.stories.tsx +68 -54
- package/dist/components/slider/Slider.stories.tsx +71 -47
- package/dist/components/stepper/Stepper.stories.tsx +16 -16
- package/dist/components/switch/Switch.stories.tsx +12 -12
- package/dist/components/table/Table.stories.tsx +8 -6
- package/dist/components/tabs/Tabs.stories.tsx +324 -268
- package/dist/components/textarea/TextArea.stories.tsx +1 -1
- package/dist/components/thumbnail-tags/ThumbnailTags.stories.tsx +16 -10
- package/dist/components/toast/Toast.stories.tsx +51 -45
- package/dist/components/toggle/Toggle.stories.tsx +111 -89
- package/dist/components/tooltip/Tooltip.stories.tsx +160 -144
- package/dist/icons/Icons.stories.tsx +2 -2
- package/dist/icons/ai-avatar-icon/AiAvatarIcon.stories.tsx +287 -237
- package/dist/icons/alert-icon/AlertIcon.stories.tsx +290 -248
- package/dist/icons/all-icons.tsx +97 -81
- package/dist/icons/angle-down-icon/AngleDownIcon.stories.tsx +312 -270
- package/dist/icons/apple-logo-icon/AppleLogoIcon.stories.tsx +294 -244
- package/dist/icons/arrow-box-left-icon/ArrowBoxLeftIcon.stories.tsx +309 -279
- package/dist/icons/arrow-corner-up-left-icon/ArrowCornerUpLeftIcon.stories.tsx +294 -258
- package/dist/icons/arrow-corner-up-right-icon/ArrowCornerUpRightIcon.stories.tsx +289 -255
- package/dist/icons/arrow-left-icon/ArrowLeftIcon.stories.tsx +288 -256
- package/dist/icons/arrow-right-icon/ArrowRightIcon.stories.tsx +322 -288
- package/dist/icons/arrow-right-up-icon/ArrowRightUpIcon.stories.tsx +340 -296
- package/dist/icons/art-board-icon/ArtBoardIcon.stories.tsx +197 -177
- package/dist/icons/audio-bar-icon/AudioBarIcon.stories.tsx +390 -328
- package/dist/icons/backward-ten-seconds-icon/BackwardTenSecondsIcon.stories.tsx +313 -277
- package/dist/icons/bubble-check-icon/BubbleCheckIcon.stories.tsx +367 -309
- package/dist/icons/bubble-crossed-icon/BubbleCrossedIcon.stories.tsx +356 -308
- package/dist/icons/bubble-sparkle-icon/BubbleSparkleIcon.stories.tsx +280 -234
- package/dist/icons/camera-icon/CameraIcon.stories.tsx +370 -326
- package/dist/icons/capital-a-letter-icon/CapitalALetterIcon.stories.tsx +300 -256
- package/dist/icons/chevron-double-left-icon/ChevronDoubleLeftIcon.stories.tsx +298 -262
- package/dist/icons/chevron-double-right-icon/ChevronDoubleRightIcon.stories.tsx +294 -260
- package/dist/icons/chevron-down-icon/ChevronDownIcon.stories.tsx +291 -259
- package/dist/icons/chevron-left-icon/ChevronLeftIcon.stories.tsx +286 -256
- package/dist/icons/chevron-right-icon/ChevronRightIcon.stories.tsx +282 -256
- package/dist/icons/chevron-up-icon/ChevronUpIcon.stories.tsx +292 -256
- package/dist/icons/circle-tick-icon/CircleTickIcon.stories.tsx +338 -290
- package/dist/icons/circular-play-icon/CircularPlayIcon.stories.tsx +167 -148
- package/dist/icons/coin-icon/CoinIcon.stories.tsx +342 -296
- package/dist/icons/coin-toons-icon/CoinToonsIcon.stories.tsx +342 -296
- package/dist/icons/column-wide-add-icon/ColumnWideAddIcon.stories.tsx +280 -238
- package/dist/icons/command-icon/CommandIcon.stories.tsx +328 -280
- package/dist/icons/copy-icon/CopyIcon.stories.tsx +294 -256
- package/dist/icons/cross-circle-icon/CrossCircleIcon.stories.tsx +285 -235
- package/dist/icons/cross-icon/CrossIcon.stories.tsx +308 -266
- package/dist/icons/download-icon/DownloadIcon.stories.tsx +271 -231
- package/dist/icons/edit-big-icon/EditBigIcon.stories.tsx +330 -278
- package/dist/icons/email-icon/EmailIcon.stories.tsx +303 -257
- package/dist/icons/expand-icon/ExpandIcon.stories.tsx +324 -286
- package/dist/icons/eye-close-icon/EyeCloseIcon.stories.tsx +317 -271
- package/dist/icons/eye-open-icon/EyeOpenIcon.stories.tsx +320 -272
- package/dist/icons/feature-shine-icon/FeatureShineIcon.stories.tsx +322 -280
- package/dist/icons/file-chart-icon/FileChartIcon.stories.tsx +315 -277
- package/dist/icons/file-text-icon/FileTextIcon.stories.tsx +199 -177
- package/dist/icons/filter-bar-row-icon/FilterBarRowIcon.stories.tsx +304 -264
- package/dist/icons/forward-ten-seconds-icon/ForwardTenSecondsIcon.stories.tsx +311 -277
- package/dist/icons/git-branch-icon/GitBranchIcon.stories.tsx +327 -287
- package/dist/icons/git-fork-icon/GitForkIcon.stories.tsx +314 -278
- package/dist/icons/globe-icon/GlobeIcon.stories.tsx +113 -98
- package/dist/icons/google-logo-icon/GoogleLogoIcon.stories.tsx +274 -226
- package/dist/icons/grip-vertical-icon/GripVerticalIcon.stories.tsx +349 -303
- package/dist/icons/head-icon/HeadIcon.stories.tsx +286 -246
- package/dist/icons/heart-icon/HeartIcon.stories.tsx +312 -268
- package/dist/icons/image-avatar-sparkle-icon/ImageAvatarSparkleIcon.stories.tsx +246 -210
- package/dist/icons/image-icon/ImageIcon.stories.tsx +330 -284
- package/dist/icons/import-folder-icon/ImportFolderIcon.stories.tsx +326 -282
- package/dist/icons/import-left-arrow-folder-icon/ImportLeftArrowFolderIcon.stories.tsx +330 -294
- package/dist/icons/indian-flag-icon/IndianFlagIcon.stories.tsx +288 -234
- package/dist/icons/instagram-icon/InstagramIcon.stories.tsx +386 -330
- package/dist/icons/layout-column-icon/LayoutColumnIcon.stories.tsx +305 -263
- package/dist/icons/layout-left-icon/LayoutLeftIcon.stories.tsx +295 -259
- package/dist/icons/layout-right-icon/LayoutRightIcon.stories.tsx +296 -256
- package/dist/icons/light-bulb-simple-icon/LightBulbSimpleIcon.stories.tsx +322 -282
- package/dist/icons/linked-in-icon/LinkedInIcon.stories.tsx +399 -359
- package/dist/icons/magic-book-icon/MagicBookIcon.stories.tsx +314 -272
- package/dist/icons/magic-edit-icon/MagicEditIcon.stories.tsx +238 -206
- package/dist/icons/maintenance-icon/MaintenanceIcon.stories.tsx +322 -276
- package/dist/icons/message-icon/MessageIcon.stories.tsx +192 -170
- package/dist/icons/minimize-icon/MinimizeIcon.stories.tsx +348 -304
- package/dist/icons/moon-icon/MoonIcon.stories.tsx +191 -167
- package/dist/icons/move-horizontal-icon/MoveHorizontalIcon.stories.tsx +380 -326
- package/dist/icons/move-vertical-icon/MoveVerticalIcon.stories.tsx +345 -291
- package/dist/icons/musical-note-icon/MusicalNoteIcon.stories.tsx +310 -266
- package/dist/icons/notepad-icon/NotepadIcon.stories.tsx +311 -271
- package/dist/icons/notes-icon/NotesIcon.stories.tsx +311 -271
- package/dist/icons/page-search-icon/PageSearchIcon.stories.tsx +309 -271
- package/dist/icons/page-text-icon/PageTextIcon.stories.tsx +248 -210
- package/dist/icons/paint-roll-icon/PaintRollIcon.stories.tsx +310 -262
- package/dist/icons/paper-plane-icon/PaperPlaneIcon.stories.tsx +274 -236
- package/dist/icons/pause-icon/PauseIcon.stories.tsx +324 -280
- package/dist/icons/pencil-icon/PencilIcon.stories.tsx +323 -281
- package/dist/icons/phone-icon/PhoneIcon.stories.tsx +288 -240
- package/dist/icons/plus-icon/PlusIcon.stories.tsx +315 -273
- package/dist/icons/pocket-studio-icon/PocketStudioIcon.stories.tsx +278 -234
- package/dist/icons/scroll-down-icon/ScrollDownIcon.stories.tsx +161 -151
- package/dist/icons/search-icon/SearchIcon.stories.tsx +324 -284
- package/dist/icons/setting-icon/SettingIcon.stories.tsx +306 -264
- package/dist/icons/share-icon/ShareIcon.stories.tsx +314 -272
- package/dist/icons/shield-icon/ShieldIcon.stories.tsx +281 -235
- package/dist/icons/site-logo-icon/SiteLogoIcon.stories.tsx +309 -250
- package/dist/icons/skip-backward-icon/SkipBackwardIcon.stories.tsx +317 -279
- package/dist/icons/skip-forward-icon/SkipForwardIcon.stories.tsx +315 -279
- package/dist/icons/sparkles-soft-icon/SparklesSoftIcon.stories.tsx +299 -253
- package/dist/icons/spinner-gradient-icon/SpinnerGradientIcon.stories.tsx +185 -169
- package/dist/icons/spinner-gradient-icon/index.tsx +6 -1
- package/dist/icons/spinner-solid-icon/SpinnerSolidIcon.stories.tsx +192 -168
- package/dist/icons/spinner-solid-icon/index.tsx +6 -1
- package/dist/icons/spinner-solid-neutral-icon/SpinnerSolidINeutralcon.stories.tsx +212 -178
- package/dist/icons/spinner-solid-neutral-icon/index.tsx +1 -1
- package/dist/icons/star-icon/StarIcon.stories.tsx +290 -244
- package/dist/icons/store-coin-icon/StoreCoinIcon.stories.tsx +286 -234
- package/dist/icons/suggestion-icon/SuggestionIcon.stories.tsx +272 -230
- package/dist/icons/sun-icon/SunIcon.stories.tsx +262 -226
- package/dist/icons/text-color-icon/TextColorIcon.stories.tsx +321 -279
- package/dist/icons/text-indicator-icon/TextIndicatorIcon.stories.tsx +332 -282
- package/dist/icons/threads-icon/ThreadsIcon.stories.tsx +394 -342
- package/dist/icons/tick-circle-icon/TickCircleIcon.stories.tsx +338 -290
- package/dist/icons/tick-icon/TickIcon.stories.tsx +364 -315
- package/dist/icons/trash-icon/TrashIcon.stories.tsx +293 -253
- package/dist/icons/twitter-x-icon/TwitterXIcon.stories.tsx +396 -338
- package/dist/icons/upload-icon/UploadIcon.stories.tsx +291 -247
- package/dist/icons/vertical-menu-icon/VerticalMenuIcon.stories.tsx +309 -271
- package/dist/icons/video-play-list-icon/VideoPlaylistIcon.stories.tsx +336 -290
- package/dist/icons/voice-playing-icon/VoicePlayingIcon.stories.tsx +382 -334
- package/dist/icons/volume-full-icon/VolumeFullIcon.stories.tsx +349 -305
- package/dist/icons/volume-half-icon/VolumeHalfIcon.stories.tsx +327 -295
- package/dist/icons/volume-off-icon/VolumeOffIcon.stories.tsx +336 -296
- package/dist/icons/warning-icon/WarningIcon.stories.tsx +314 -274
- package/dist/icons/youtube-icon/YoutubeIcon.stories.tsx +311 -261
- 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
|
@@ -179,10 +179,10 @@ export const Basic: Story = {
|
|
|
179
179
|
</HoverCardTrigger>
|
|
180
180
|
<HoverCardContent>
|
|
181
181
|
<div className="space-y-2">
|
|
182
|
-
<h4 className="text-sm font-semibold
|
|
182
|
+
<h4 className="text-fm-primary text-sm font-semibold">
|
|
183
183
|
Quick Information
|
|
184
184
|
</h4>
|
|
185
|
-
<p className="text-
|
|
185
|
+
<p className="text-fm-secondary text-sm">
|
|
186
186
|
This is a basic hover card that provides additional context when
|
|
187
187
|
you hover over the trigger element.
|
|
188
188
|
</p>
|
|
@@ -205,38 +205,40 @@ export const Basic: Story = {
|
|
|
205
205
|
export const UserProfiles: Story = {
|
|
206
206
|
render: () => (
|
|
207
207
|
<div className="space-y-8 p-8">
|
|
208
|
-
<h3 className="text-center text-lg font-medium
|
|
208
|
+
<h3 className="text-fm-primary text-center text-lg font-medium">
|
|
209
209
|
User Profile Cards
|
|
210
210
|
</h3>
|
|
211
211
|
|
|
212
212
|
<div className="grid grid-cols-1 gap-6 lg:grid-cols-2">
|
|
213
213
|
{/* Basic Profile */}
|
|
214
214
|
<div className="space-y-4">
|
|
215
|
-
<h4 className="text-sm font-medium
|
|
215
|
+
<h4 className="text-fm-secondary text-sm font-medium">
|
|
216
|
+
Basic Profile
|
|
217
|
+
</h4>
|
|
216
218
|
<div className="text-center">
|
|
217
219
|
<HoverCard>
|
|
218
220
|
<HoverCardTrigger asChild>
|
|
219
|
-
<Button variant="text" className="text-
|
|
221
|
+
<Button variant="text" className="text-fm-info">
|
|
220
222
|
@johndoe
|
|
221
223
|
</Button>
|
|
222
224
|
</HoverCardTrigger>
|
|
223
225
|
<HoverCardContent className="w-80">
|
|
224
226
|
<div className="flex space-x-4">
|
|
225
227
|
<div className="flex h-12 w-12 items-center justify-center rounded-full bg-gradient-to-br from-blue-500 to-purple-600">
|
|
226
|
-
<span className="font-semibold
|
|
228
|
+
<span className="text-fm-primary font-semibold">JD</span>
|
|
227
229
|
</div>
|
|
228
230
|
<div className="flex-1 space-y-1">
|
|
229
|
-
<h4 className="text-sm font-semibold
|
|
231
|
+
<h4 className="text-fm-primary text-sm font-semibold">
|
|
230
232
|
John Doe
|
|
231
233
|
</h4>
|
|
232
|
-
<p className="text-
|
|
234
|
+
<p className="text-fm-secondary text-sm">
|
|
233
235
|
Senior Software Engineer
|
|
234
236
|
</p>
|
|
235
|
-
<p className="text-
|
|
237
|
+
<p className="text-fm-tertiary text-xs">
|
|
236
238
|
Building amazing user experiences with React and
|
|
237
239
|
TypeScript
|
|
238
240
|
</p>
|
|
239
|
-
<div className="flex items-center gap-4 pt-2 text-xs
|
|
241
|
+
<div className="text-fm-secondary flex items-center gap-4 pt-2 text-xs">
|
|
240
242
|
<span>👥 1.2k followers</span>
|
|
241
243
|
<span>📍 San Francisco</span>
|
|
242
244
|
</div>
|
|
@@ -249,13 +251,13 @@ export const UserProfiles: Story = {
|
|
|
249
251
|
|
|
250
252
|
{/* Detailed Profile */}
|
|
251
253
|
<div className="space-y-4">
|
|
252
|
-
<h4 className="text-sm font-medium
|
|
254
|
+
<h4 className="text-fm-secondary text-sm font-medium">
|
|
253
255
|
Detailed Profile
|
|
254
256
|
</h4>
|
|
255
257
|
<div className="text-center">
|
|
256
258
|
<HoverCard>
|
|
257
259
|
<HoverCardTrigger asChild>
|
|
258
|
-
<Button variant="text" className="text-
|
|
260
|
+
<Button variant="text" className="text-fm-positive">
|
|
259
261
|
@sarahsmith
|
|
260
262
|
</Button>
|
|
261
263
|
</HoverCardTrigger>
|
|
@@ -263,47 +265,47 @@ export const UserProfiles: Story = {
|
|
|
263
265
|
<div className="space-y-3">
|
|
264
266
|
<div className="flex space-x-4">
|
|
265
267
|
<div className="flex h-16 w-16 items-center justify-center rounded-full bg-gradient-to-br from-green-500 to-teal-600">
|
|
266
|
-
<span className="text-lg font-semibold
|
|
268
|
+
<span className="text-fm-primary text-lg font-semibold">
|
|
267
269
|
SS
|
|
268
270
|
</span>
|
|
269
271
|
</div>
|
|
270
272
|
<div className="flex-1 space-y-1">
|
|
271
|
-
<h4 className="text-base font-semibold
|
|
273
|
+
<h4 className="text-fm-primary text-base font-semibold">
|
|
272
274
|
Sarah Smith
|
|
273
275
|
</h4>
|
|
274
|
-
<p className="text-
|
|
276
|
+
<p className="text-fm-secondary text-sm">
|
|
275
277
|
UX Designer & Product Manager
|
|
276
278
|
</p>
|
|
277
|
-
<div className="flex items-center gap-2 text-xs
|
|
279
|
+
<div className="text-fm-secondary flex items-center gap-2 text-xs">
|
|
278
280
|
<TickCircleIcon className="h-3 w-3" />
|
|
279
281
|
<span>Verified Account</span>
|
|
280
282
|
</div>
|
|
281
283
|
</div>
|
|
282
284
|
</div>
|
|
283
285
|
|
|
284
|
-
<p className="text-
|
|
286
|
+
<p className="text-fm-secondary text-sm">
|
|
285
287
|
Passionate about creating intuitive digital experiences.
|
|
286
288
|
Currently working on design systems and user research.
|
|
287
289
|
</p>
|
|
288
290
|
|
|
289
291
|
<div className="grid grid-cols-3 gap-4 pt-2 text-center">
|
|
290
292
|
<div>
|
|
291
|
-
<div className="text-lg font-semibold
|
|
293
|
+
<div className="text-fm-primary text-lg font-semibold">
|
|
292
294
|
248
|
|
293
295
|
</div>
|
|
294
|
-
<div className="text-
|
|
296
|
+
<div className="text-fm-secondary text-xs">Posts</div>
|
|
295
297
|
</div>
|
|
296
298
|
<div>
|
|
297
|
-
<div className="text-lg font-semibold
|
|
299
|
+
<div className="text-fm-primary text-lg font-semibold">
|
|
298
300
|
2.8k
|
|
299
301
|
</div>
|
|
300
|
-
<div className="text-
|
|
302
|
+
<div className="text-fm-secondary text-xs">Followers</div>
|
|
301
303
|
</div>
|
|
302
304
|
<div>
|
|
303
|
-
<div className="text-lg font-semibold
|
|
305
|
+
<div className="text-fm-primary text-lg font-semibold">
|
|
304
306
|
892
|
|
305
307
|
</div>
|
|
306
|
-
<div className="text-
|
|
308
|
+
<div className="text-fm-secondary text-xs">Following</div>
|
|
307
309
|
</div>
|
|
308
310
|
</div>
|
|
309
311
|
|
|
@@ -337,34 +339,40 @@ export const UserProfiles: Story = {
|
|
|
337
339
|
export const ProductPreviews: Story = {
|
|
338
340
|
render: () => (
|
|
339
341
|
<div className="space-y-8 p-8">
|
|
340
|
-
<h3 className="text-center text-lg font-medium
|
|
342
|
+
<h3 className="text-fm-primary text-center text-lg font-medium">
|
|
341
343
|
Product Previews
|
|
342
344
|
</h3>
|
|
343
345
|
|
|
344
346
|
<div className="grid grid-cols-1 gap-8 lg:grid-cols-3">
|
|
345
347
|
{/* Simple Product */}
|
|
346
348
|
<div className="space-y-4">
|
|
347
|
-
<h4 className="text-sm font-medium
|
|
349
|
+
<h4 className="text-fm-secondary text-sm font-medium">
|
|
350
|
+
Simple Product
|
|
351
|
+
</h4>
|
|
348
352
|
<div className="text-center">
|
|
349
353
|
<HoverCard>
|
|
350
354
|
<HoverCardTrigger asChild>
|
|
351
|
-
<div className="cursor-pointer rounded-lg border
|
|
355
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary hover:bg-fm-surface-frosted/15 hover:border-fm-divider-contrast cursor-pointer rounded-lg border p-4 transition-colors">
|
|
352
356
|
<div className="mx-auto mb-2 flex h-20 w-20 items-center justify-center rounded-lg bg-gradient-to-br from-purple-500 to-pink-600">
|
|
353
|
-
<FileChartIcon className="h-8 w-8
|
|
357
|
+
<FileChartIcon className="text-fm-primary h-8 w-8" />
|
|
354
358
|
</div>
|
|
355
|
-
<p className="text-
|
|
359
|
+
<p className="text-fm-primary text-sm">Analytics Pro</p>
|
|
356
360
|
</div>
|
|
357
361
|
</HoverCardTrigger>
|
|
358
362
|
<HoverCardContent>
|
|
359
363
|
<div className="space-y-3">
|
|
360
364
|
<div>
|
|
361
|
-
<h4 className="font-semibold
|
|
362
|
-
|
|
365
|
+
<h4 className="text-fm-primary font-semibold">
|
|
366
|
+
Analytics Pro
|
|
367
|
+
</h4>
|
|
368
|
+
<p className="text-fm-secondary text-sm">
|
|
363
369
|
Advanced analytics dashboard with real-time insights
|
|
364
370
|
</p>
|
|
365
371
|
</div>
|
|
366
372
|
<div className="flex items-center justify-between">
|
|
367
|
-
<span className="text-lg font-bold
|
|
373
|
+
<span className="text-fm-primary text-lg font-bold">
|
|
374
|
+
$29/mo
|
|
375
|
+
</span>
|
|
368
376
|
<Button size="sm">
|
|
369
377
|
<PlusIcon className="mr-1 h-3 w-3" />
|
|
370
378
|
Add
|
|
@@ -378,30 +386,30 @@ export const ProductPreviews: Story = {
|
|
|
378
386
|
|
|
379
387
|
{/* Detailed Product */}
|
|
380
388
|
<div className="space-y-4">
|
|
381
|
-
<h4 className="text-sm font-medium
|
|
389
|
+
<h4 className="text-fm-secondary text-sm font-medium">
|
|
382
390
|
Detailed Product
|
|
383
391
|
</h4>
|
|
384
392
|
<div className="text-center">
|
|
385
393
|
<HoverCard>
|
|
386
394
|
<HoverCardTrigger asChild>
|
|
387
|
-
<div className="cursor-pointer rounded-lg border
|
|
395
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary hover:bg-fm-surface-frosted/15 hover:border-fm-divider-contrast cursor-pointer rounded-lg border p-4 transition-colors">
|
|
388
396
|
<div className="mx-auto mb-2 flex h-20 w-20 items-center justify-center rounded-lg bg-gradient-to-br from-blue-500 to-cyan-600">
|
|
389
|
-
<SearchIcon className="h-8 w-8
|
|
397
|
+
<SearchIcon className="text-fm-primary h-8 w-8" />
|
|
390
398
|
</div>
|
|
391
|
-
<p className="text-
|
|
399
|
+
<p className="text-fm-primary text-sm">Search Engine</p>
|
|
392
400
|
</div>
|
|
393
401
|
</HoverCardTrigger>
|
|
394
402
|
<HoverCardContent className="w-80">
|
|
395
403
|
<div className="space-y-4">
|
|
396
404
|
<div className="flex space-x-3">
|
|
397
405
|
<div className="flex h-16 w-16 flex-shrink-0 items-center justify-center rounded-lg bg-gradient-to-br from-blue-500 to-cyan-600">
|
|
398
|
-
<SearchIcon className="h-8 w-8
|
|
406
|
+
<SearchIcon className="text-fm-primary h-8 w-8" />
|
|
399
407
|
</div>
|
|
400
408
|
<div className="space-y-1">
|
|
401
|
-
<h4 className="font-semibold
|
|
409
|
+
<h4 className="text-fm-primary font-semibold">
|
|
402
410
|
Advanced Search Engine
|
|
403
411
|
</h4>
|
|
404
|
-
<p className="text-
|
|
412
|
+
<p className="text-fm-secondary text-sm">
|
|
405
413
|
AI-powered search with natural language processing
|
|
406
414
|
</p>
|
|
407
415
|
<div className="flex items-center gap-2">
|
|
@@ -409,13 +417,13 @@ export const ProductPreviews: Story = {
|
|
|
409
417
|
{[1, 2, 3, 4, 5].map((star) => (
|
|
410
418
|
<span
|
|
411
419
|
key={star}
|
|
412
|
-
className="text-
|
|
420
|
+
className="text-fm-warning text-xs"
|
|
413
421
|
>
|
|
414
422
|
★
|
|
415
423
|
</span>
|
|
416
424
|
))}
|
|
417
425
|
</div>
|
|
418
|
-
<span className="text-
|
|
426
|
+
<span className="text-fm-secondary text-xs">
|
|
419
427
|
(124 reviews)
|
|
420
428
|
</span>
|
|
421
429
|
</div>
|
|
@@ -424,9 +432,9 @@ export const ProductPreviews: Story = {
|
|
|
424
432
|
|
|
425
433
|
<div className="space-y-2">
|
|
426
434
|
<div className="flex justify-between text-sm">
|
|
427
|
-
<span className="text-
|
|
435
|
+
<span className="text-fm-secondary">Features:</span>
|
|
428
436
|
</div>
|
|
429
|
-
<ul className="space-y-1 text-xs
|
|
437
|
+
<ul className="text-fm-secondary space-y-1 text-xs">
|
|
430
438
|
<li>• Real-time search suggestions</li>
|
|
431
439
|
<li>• Advanced filtering options</li>
|
|
432
440
|
<li>• Analytics and insights</li>
|
|
@@ -434,12 +442,12 @@ export const ProductPreviews: Story = {
|
|
|
434
442
|
</ul>
|
|
435
443
|
</div>
|
|
436
444
|
|
|
437
|
-
<div className="flex items-center justify-between border-t
|
|
445
|
+
<div className="border-fm-divider-secondary flex items-center justify-between border-t pt-2">
|
|
438
446
|
<div>
|
|
439
|
-
<span className="text-
|
|
447
|
+
<span className="text-fm-secondary text-xs line-through">
|
|
440
448
|
$99/mo
|
|
441
449
|
</span>
|
|
442
|
-
<span className="ml-2 text-lg font-bold
|
|
450
|
+
<span className="text-fm-primary ml-2 text-lg font-bold">
|
|
443
451
|
$79/mo
|
|
444
452
|
</span>
|
|
445
453
|
</div>
|
|
@@ -453,33 +461,37 @@ export const ProductPreviews: Story = {
|
|
|
453
461
|
|
|
454
462
|
{/* Feature Product */}
|
|
455
463
|
<div className="space-y-4">
|
|
456
|
-
<h4 className="text-sm font-medium
|
|
464
|
+
<h4 className="text-fm-secondary text-sm font-medium">
|
|
465
|
+
Feature Product
|
|
466
|
+
</h4>
|
|
457
467
|
<div className="text-center">
|
|
458
468
|
<HoverCard>
|
|
459
469
|
<HoverCardTrigger asChild>
|
|
460
|
-
<div className="cursor-pointer rounded-lg border
|
|
470
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary hover:bg-fm-surface-frosted/15 hover:border-fm-divider-contrast cursor-pointer rounded-lg border p-4 transition-colors">
|
|
461
471
|
<div className="mx-auto mb-2 flex h-20 w-20 items-center justify-center rounded-lg bg-gradient-to-br from-orange-500 to-red-600">
|
|
462
|
-
<EditBigIcon className="h-8 w-8
|
|
472
|
+
<EditBigIcon className="text-fm-primary h-8 w-8" />
|
|
463
473
|
</div>
|
|
464
|
-
<p className="text-
|
|
474
|
+
<p className="text-fm-primary text-sm">Editor Pro</p>
|
|
465
475
|
</div>
|
|
466
476
|
</HoverCardTrigger>
|
|
467
477
|
<HoverCardContent className="w-72">
|
|
468
478
|
<div className="space-y-3">
|
|
469
479
|
<div className="flex items-start space-x-3">
|
|
470
480
|
<div className="flex h-12 w-12 items-center justify-center rounded-lg bg-gradient-to-br from-orange-500 to-red-600">
|
|
471
|
-
<EditBigIcon className="h-6 w-6
|
|
481
|
+
<EditBigIcon className="text-fm-primary h-6 w-6" />
|
|
472
482
|
</div>
|
|
473
483
|
<div>
|
|
474
|
-
<h4 className="font-semibold
|
|
475
|
-
|
|
484
|
+
<h4 className="text-fm-primary font-semibold">
|
|
485
|
+
Editor Pro
|
|
486
|
+
</h4>
|
|
487
|
+
<p className="text-fm-secondary text-sm">
|
|
476
488
|
Professional code editor
|
|
477
489
|
</p>
|
|
478
490
|
<div className="mt-1 flex items-center gap-1">
|
|
479
491
|
<span className="rounded bg-orange-500/20 px-2 py-0.5 text-xs text-orange-300">
|
|
480
492
|
Popular
|
|
481
493
|
</span>
|
|
482
|
-
<span className="
|
|
494
|
+
<span className="bg-fm-surface-positive/20 text-fm-positive rounded px-2 py-0.5 text-xs">
|
|
483
495
|
New
|
|
484
496
|
</span>
|
|
485
497
|
</div>
|
|
@@ -488,17 +500,19 @@ export const ProductPreviews: Story = {
|
|
|
488
500
|
|
|
489
501
|
<div className="grid grid-cols-2 gap-3 text-xs">
|
|
490
502
|
<div className="space-y-1">
|
|
491
|
-
<div className="text-
|
|
492
|
-
<div className="text-
|
|
503
|
+
<div className="text-fm-secondary">Languages:</div>
|
|
504
|
+
<div className="text-fm-secondary">20+ supported</div>
|
|
493
505
|
</div>
|
|
494
506
|
<div className="space-y-1">
|
|
495
|
-
<div className="text-
|
|
496
|
-
<div className="text-
|
|
507
|
+
<div className="text-fm-secondary">Themes:</div>
|
|
508
|
+
<div className="text-fm-secondary">50+ themes</div>
|
|
497
509
|
</div>
|
|
498
510
|
</div>
|
|
499
511
|
|
|
500
512
|
<div className="flex items-center justify-between">
|
|
501
|
-
<span className="text-lg font-bold
|
|
513
|
+
<span className="text-fm-primary text-lg font-bold">
|
|
514
|
+
Free
|
|
515
|
+
</span>
|
|
502
516
|
<Button size="sm" variant="outline">
|
|
503
517
|
Download
|
|
504
518
|
</Button>
|
|
@@ -525,38 +539,38 @@ export const ProductPreviews: Story = {
|
|
|
525
539
|
export const DocumentationLinks: Story = {
|
|
526
540
|
render: () => (
|
|
527
541
|
<div className="space-y-8 p-8">
|
|
528
|
-
<h3 className="text-center text-lg font-medium
|
|
542
|
+
<h3 className="text-fm-primary text-center text-lg font-medium">
|
|
529
543
|
Documentation Links
|
|
530
544
|
</h3>
|
|
531
545
|
|
|
532
546
|
<div className="space-y-6">
|
|
533
547
|
{/* API Documentation */}
|
|
534
548
|
<div className="space-y-4">
|
|
535
|
-
<h4 className="text-sm font-medium
|
|
549
|
+
<h4 className="text-fm-secondary text-sm font-medium">
|
|
536
550
|
API Documentation
|
|
537
551
|
</h4>
|
|
538
552
|
<div className="space-y-2">
|
|
539
|
-
<p className="text-
|
|
553
|
+
<p className="text-fm-secondary text-sm">
|
|
540
554
|
Learn more about our{" "}
|
|
541
555
|
<HoverCard>
|
|
542
556
|
<HoverCardTrigger asChild>
|
|
543
557
|
<Button
|
|
544
558
|
variant="text"
|
|
545
|
-
className="h-auto p-0 font-normal
|
|
559
|
+
className="text-fm-info h-auto p-0 font-normal"
|
|
546
560
|
>
|
|
547
561
|
REST API
|
|
548
562
|
</Button>
|
|
549
563
|
</HoverCardTrigger>
|
|
550
564
|
<HoverCardContent>
|
|
551
565
|
<div className="space-y-2">
|
|
552
|
-
<h4 className="text-sm font-semibold
|
|
566
|
+
<h4 className="text-fm-primary text-sm font-semibold">
|
|
553
567
|
REST API
|
|
554
568
|
</h4>
|
|
555
|
-
<p className="text-
|
|
569
|
+
<p className="text-fm-secondary text-sm">
|
|
556
570
|
Our REST API provides programmatic access to all platform
|
|
557
571
|
features.
|
|
558
572
|
</p>
|
|
559
|
-
<div className="space-y-1 text-xs
|
|
573
|
+
<div className="text-fm-secondary space-y-1 text-xs">
|
|
560
574
|
<div>• Rate limit: 1000 requests/hour</div>
|
|
561
575
|
<div>• Authentication: API Key required</div>
|
|
562
576
|
<div>• Response format: JSON</div>
|
|
@@ -572,20 +586,20 @@ export const DocumentationLinks: Story = {
|
|
|
572
586
|
<HoverCardTrigger asChild>
|
|
573
587
|
<Button
|
|
574
588
|
variant="text"
|
|
575
|
-
className="h-auto p-0 font-normal
|
|
589
|
+
className="text-fm-info h-auto p-0 font-normal"
|
|
576
590
|
>
|
|
577
591
|
GraphQL endpoint
|
|
578
592
|
</Button>
|
|
579
593
|
</HoverCardTrigger>
|
|
580
594
|
<HoverCardContent>
|
|
581
595
|
<div className="space-y-2">
|
|
582
|
-
<h4 className="text-sm font-semibold
|
|
596
|
+
<h4 className="text-fm-primary text-sm font-semibold">
|
|
583
597
|
GraphQL API
|
|
584
598
|
</h4>
|
|
585
|
-
<p className="text-
|
|
599
|
+
<p className="text-fm-secondary text-sm">
|
|
586
600
|
Query exactly the data you need with our GraphQL API.
|
|
587
601
|
</p>
|
|
588
|
-
<div className="space-y-1 text-xs
|
|
602
|
+
<div className="text-fm-secondary space-y-1 text-xs">
|
|
589
603
|
<div>• Single endpoint for all queries</div>
|
|
590
604
|
<div>• Type-safe schema</div>
|
|
591
605
|
<div>• Real-time subscriptions</div>
|
|
@@ -608,13 +622,13 @@ export const DocumentationLinks: Story = {
|
|
|
608
622
|
|
|
609
623
|
{/* Configuration Options */}
|
|
610
624
|
<div className="space-y-4">
|
|
611
|
-
<h4 className="text-sm font-medium
|
|
625
|
+
<h4 className="text-fm-secondary text-sm font-medium">
|
|
612
626
|
Configuration Options
|
|
613
627
|
</h4>
|
|
614
|
-
<div className="rounded-lg border
|
|
628
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary rounded-lg border p-4">
|
|
615
629
|
<div className="space-y-3 text-sm">
|
|
616
630
|
<div className="flex items-center justify-between">
|
|
617
|
-
<span className="text-
|
|
631
|
+
<span className="text-fm-primary">Enable notifications</span>
|
|
618
632
|
<HoverCard>
|
|
619
633
|
<HoverCardTrigger asChild>
|
|
620
634
|
<Button variant="outline" size="sm" className="h-6 w-6 p-0">
|
|
@@ -623,18 +637,18 @@ export const DocumentationLinks: Story = {
|
|
|
623
637
|
</HoverCardTrigger>
|
|
624
638
|
<HoverCardContent className="w-72">
|
|
625
639
|
<div className="space-y-2">
|
|
626
|
-
<h4 className="text-sm font-semibold
|
|
640
|
+
<h4 className="text-fm-primary text-sm font-semibold">
|
|
627
641
|
Notification Settings
|
|
628
642
|
</h4>
|
|
629
|
-
<p className="text-
|
|
643
|
+
<p className="text-fm-secondary text-sm">
|
|
630
644
|
Control when and how you receive notifications from the
|
|
631
645
|
platform.
|
|
632
646
|
</p>
|
|
633
647
|
<div className="space-y-2">
|
|
634
|
-
<div className="text-
|
|
648
|
+
<div className="text-fm-secondary text-xs">
|
|
635
649
|
Available notification types:
|
|
636
650
|
</div>
|
|
637
|
-
<ul className="ml-2 space-y-1 text-xs
|
|
651
|
+
<ul className="text-fm-secondary ml-2 space-y-1 text-xs">
|
|
638
652
|
<li>• Email notifications</li>
|
|
639
653
|
<li>• Push notifications</li>
|
|
640
654
|
<li>• In-app notifications</li>
|
|
@@ -647,7 +661,7 @@ export const DocumentationLinks: Story = {
|
|
|
647
661
|
</div>
|
|
648
662
|
|
|
649
663
|
<div className="flex items-center justify-between">
|
|
650
|
-
<span className="text-
|
|
664
|
+
<span className="text-fm-primary">Auto-save frequency</span>
|
|
651
665
|
<HoverCard>
|
|
652
666
|
<HoverCardTrigger asChild>
|
|
653
667
|
<Button variant="outline" size="sm" className="h-6 w-6 p-0">
|
|
@@ -656,13 +670,13 @@ export const DocumentationLinks: Story = {
|
|
|
656
670
|
</HoverCardTrigger>
|
|
657
671
|
<HoverCardContent>
|
|
658
672
|
<div className="space-y-2">
|
|
659
|
-
<h4 className="text-sm font-semibold
|
|
673
|
+
<h4 className="text-fm-primary text-sm font-semibold">
|
|
660
674
|
Auto-save Settings
|
|
661
675
|
</h4>
|
|
662
|
-
<p className="text-
|
|
676
|
+
<p className="text-fm-secondary text-sm">
|
|
663
677
|
Automatically save your work at regular intervals.
|
|
664
678
|
</p>
|
|
665
|
-
<div className="space-y-1 text-xs
|
|
679
|
+
<div className="text-fm-secondary space-y-1 text-xs">
|
|
666
680
|
<div>• Every 30 seconds (recommended)</div>
|
|
667
681
|
<div>• Every 1 minute</div>
|
|
668
682
|
<div>• Every 5 minutes</div>
|
|
@@ -710,14 +724,16 @@ export const InteractiveElements: Story = {
|
|
|
710
724
|
|
|
711
725
|
return (
|
|
712
726
|
<div className="space-y-8 p-8">
|
|
713
|
-
<h3 className="text-center text-lg font-medium
|
|
727
|
+
<h3 className="text-fm-primary text-center text-lg font-medium">
|
|
714
728
|
Interactive Elements
|
|
715
729
|
</h3>
|
|
716
730
|
|
|
717
731
|
<div className="grid grid-cols-1 gap-8 lg:grid-cols-2">
|
|
718
732
|
{/* Team Members */}
|
|
719
733
|
<div className="space-y-4">
|
|
720
|
-
<h4 className="text-sm font-medium
|
|
734
|
+
<h4 className="text-fm-secondary text-sm font-medium">
|
|
735
|
+
Team Members
|
|
736
|
+
</h4>
|
|
721
737
|
<div className="space-y-2">
|
|
722
738
|
{users.map((user) => (
|
|
723
739
|
<HoverCard key={user.id}>
|
|
@@ -725,8 +741,8 @@ export const InteractiveElements: Story = {
|
|
|
725
741
|
<div
|
|
726
742
|
className={`flex cursor-pointer items-center space-x-3 rounded-lg border p-3 transition-colors ${
|
|
727
743
|
selectedUser === user.id
|
|
728
|
-
? "border-
|
|
729
|
-
: "border-
|
|
744
|
+
? "border-fm-divider-secondary bg-fm-surface-info-sec"
|
|
745
|
+
: "border-fm-divider-secondary bg-fm-surface-secondary hover:bg-fm-surface-frosted/15 hover:border-fm-divider-contrast"
|
|
730
746
|
}`}
|
|
731
747
|
onClick={() =>
|
|
732
748
|
setSelectedUser(
|
|
@@ -737,13 +753,13 @@ export const InteractiveElements: Story = {
|
|
|
737
753
|
<div
|
|
738
754
|
className={`flex h-8 w-8 items-center justify-center rounded-full ${
|
|
739
755
|
user.status === "online"
|
|
740
|
-
? "bg-
|
|
756
|
+
? "bg-fm-surface-positive"
|
|
741
757
|
: user.status === "away"
|
|
742
|
-
? "bg-
|
|
743
|
-
: "bg-
|
|
758
|
+
? "bg-fm-surface-warning"
|
|
759
|
+
: "bg-fm-surface-secondary"
|
|
744
760
|
}`}
|
|
745
761
|
>
|
|
746
|
-
<span className="text-xs font-semibold
|
|
762
|
+
<span className="text-fm-primary text-xs font-semibold">
|
|
747
763
|
{user.name
|
|
748
764
|
.split(" ")
|
|
749
765
|
.map((n) => n[0])
|
|
@@ -751,18 +767,20 @@ export const InteractiveElements: Story = {
|
|
|
751
767
|
</span>
|
|
752
768
|
</div>
|
|
753
769
|
<div className="flex-1">
|
|
754
|
-
<div className="text-sm font-medium
|
|
770
|
+
<div className="text-fm-primary text-sm font-medium">
|
|
755
771
|
{user.name}
|
|
756
772
|
</div>
|
|
757
|
-
<div className="text-
|
|
773
|
+
<div className="text-fm-secondary text-xs">
|
|
774
|
+
{user.role}
|
|
775
|
+
</div>
|
|
758
776
|
</div>
|
|
759
777
|
<div
|
|
760
778
|
className={`h-2 w-2 rounded-full ${
|
|
761
779
|
user.status === "online"
|
|
762
|
-
? "bg-
|
|
780
|
+
? "bg-fm-surface-positive"
|
|
763
781
|
: user.status === "away"
|
|
764
|
-
? "bg-
|
|
765
|
-
: "bg-
|
|
782
|
+
? "bg-fm-surface-warning"
|
|
783
|
+
: "bg-fm-surface-secondary"
|
|
766
784
|
}`}
|
|
767
785
|
/>
|
|
768
786
|
</div>
|
|
@@ -773,13 +791,13 @@ export const InteractiveElements: Story = {
|
|
|
773
791
|
<div
|
|
774
792
|
className={`flex h-16 w-16 items-center justify-center rounded-full ${
|
|
775
793
|
user.status === "online"
|
|
776
|
-
? "bg-
|
|
794
|
+
? "bg-fm-surface-positive"
|
|
777
795
|
: user.status === "away"
|
|
778
|
-
? "bg-
|
|
779
|
-
: "bg-
|
|
796
|
+
? "bg-fm-surface-warning"
|
|
797
|
+
: "bg-fm-surface-secondary"
|
|
780
798
|
}`}
|
|
781
799
|
>
|
|
782
|
-
<span className="font-semibold
|
|
800
|
+
<span className="text-fm-primary font-semibold">
|
|
783
801
|
{user.name
|
|
784
802
|
.split(" ")
|
|
785
803
|
.map((n) => n[0])
|
|
@@ -787,28 +805,30 @@ export const InteractiveElements: Story = {
|
|
|
787
805
|
</span>
|
|
788
806
|
</div>
|
|
789
807
|
<div className="space-y-1">
|
|
790
|
-
<h4 className="text-sm font-semibold
|
|
808
|
+
<h4 className="text-fm-primary text-sm font-semibold">
|
|
791
809
|
{user.name}
|
|
792
810
|
</h4>
|
|
793
|
-
<p className="text-
|
|
811
|
+
<p className="text-fm-secondary text-sm">
|
|
812
|
+
{user.role}
|
|
813
|
+
</p>
|
|
794
814
|
<div className="flex items-center gap-2 text-xs">
|
|
795
815
|
<div
|
|
796
816
|
className={`h-2 w-2 rounded-full ${
|
|
797
817
|
user.status === "online"
|
|
798
|
-
? "bg-
|
|
818
|
+
? "bg-fm-surface-positive"
|
|
799
819
|
: user.status === "away"
|
|
800
|
-
? "bg-
|
|
801
|
-
: "bg-
|
|
820
|
+
? "bg-fm-surface-warning"
|
|
821
|
+
: "bg-fm-surface-secondary"
|
|
802
822
|
}`}
|
|
803
823
|
/>
|
|
804
|
-
<span className="text-
|
|
824
|
+
<span className="text-fm-secondary capitalize">
|
|
805
825
|
{user.status}
|
|
806
826
|
</span>
|
|
807
827
|
</div>
|
|
808
828
|
</div>
|
|
809
829
|
</div>
|
|
810
830
|
|
|
811
|
-
<div className="text-
|
|
831
|
+
<div className="text-fm-secondary text-sm">
|
|
812
832
|
{user.status === "online"
|
|
813
833
|
? "Available for collaboration"
|
|
814
834
|
: user.status === "away"
|
|
@@ -833,7 +853,7 @@ export const InteractiveElements: Story = {
|
|
|
833
853
|
|
|
834
854
|
{/* Product Analytics */}
|
|
835
855
|
<div className="space-y-4">
|
|
836
|
-
<h4 className="text-sm font-medium
|
|
856
|
+
<h4 className="text-fm-secondary text-sm font-medium">
|
|
837
857
|
Product Analytics
|
|
838
858
|
</h4>
|
|
839
859
|
<div className="space-y-2">
|
|
@@ -844,25 +864,25 @@ export const InteractiveElements: Story = {
|
|
|
844
864
|
className={`cursor-pointer rounded-lg border p-3 transition-colors ${
|
|
845
865
|
hoveredProduct === product.id
|
|
846
866
|
? "border-purple-500 bg-purple-500/10"
|
|
847
|
-
: "border-
|
|
867
|
+
: "border-fm-divider-secondary bg-fm-surface-secondary hover:bg-fm-surface-frosted/15 hover:border-fm-divider-contrast"
|
|
848
868
|
}`}
|
|
849
869
|
onMouseEnter={() => setHoveredProduct(product.id)}
|
|
850
870
|
onMouseLeave={() => setHoveredProduct(null)}
|
|
851
871
|
>
|
|
852
872
|
<div className="flex items-center justify-between">
|
|
853
873
|
<div>
|
|
854
|
-
<div className="text-sm font-medium
|
|
874
|
+
<div className="text-fm-primary text-sm font-medium">
|
|
855
875
|
{product.name}
|
|
856
876
|
</div>
|
|
857
|
-
<div className="text-
|
|
877
|
+
<div className="text-fm-secondary text-xs">
|
|
858
878
|
{product.sales} sales
|
|
859
879
|
</div>
|
|
860
880
|
</div>
|
|
861
881
|
<div className="text-right">
|
|
862
|
-
<div className="text-sm font-semibold
|
|
882
|
+
<div className="text-fm-primary text-sm font-semibold">
|
|
863
883
|
{product.price}
|
|
864
884
|
</div>
|
|
865
|
-
<div className="text-
|
|
885
|
+
<div className="text-fm-positive text-xs">↗ +12%</div>
|
|
866
886
|
</div>
|
|
867
887
|
</div>
|
|
868
888
|
</div>
|
|
@@ -871,58 +891,66 @@ export const InteractiveElements: Story = {
|
|
|
871
891
|
<div className="space-y-4">
|
|
872
892
|
<div className="flex items-start justify-between">
|
|
873
893
|
<div>
|
|
874
|
-
<h4 className="font-semibold
|
|
894
|
+
<h4 className="text-fm-primary font-semibold">
|
|
875
895
|
{product.name}
|
|
876
896
|
</h4>
|
|
877
|
-
<p className="text-
|
|
897
|
+
<p className="text-fm-secondary text-sm">
|
|
878
898
|
Detailed product analytics
|
|
879
899
|
</p>
|
|
880
900
|
</div>
|
|
881
|
-
<span className="text-lg font-bold
|
|
901
|
+
<span className="text-fm-primary text-lg font-bold">
|
|
882
902
|
{product.price}
|
|
883
903
|
</span>
|
|
884
904
|
</div>
|
|
885
905
|
|
|
886
906
|
<div className="grid grid-cols-2 gap-4">
|
|
887
907
|
<div className="space-y-1">
|
|
888
|
-
<div className="text-
|
|
908
|
+
<div className="text-fm-secondary text-xs">
|
|
889
909
|
Total Sales
|
|
890
910
|
</div>
|
|
891
|
-
<div className="text-lg font-semibold
|
|
911
|
+
<div className="text-fm-primary text-lg font-semibold">
|
|
892
912
|
{product.sales}
|
|
893
913
|
</div>
|
|
894
|
-
<div className="text-
|
|
914
|
+
<div className="text-fm-positive text-xs">
|
|
895
915
|
+12% vs last month
|
|
896
916
|
</div>
|
|
897
917
|
</div>
|
|
898
918
|
<div className="space-y-1">
|
|
899
|
-
<div className="text-
|
|
900
|
-
|
|
919
|
+
<div className="text-fm-secondary text-xs">
|
|
920
|
+
Revenue
|
|
921
|
+
</div>
|
|
922
|
+
<div className="text-fm-primary text-lg font-semibold">
|
|
901
923
|
$
|
|
902
924
|
{(
|
|
903
925
|
parseInt(product.price.slice(1)) * product.sales
|
|
904
926
|
).toLocaleString()}
|
|
905
927
|
</div>
|
|
906
|
-
<div className="text-
|
|
928
|
+
<div className="text-fm-positive text-xs">
|
|
907
929
|
+8% vs last month
|
|
908
930
|
</div>
|
|
909
931
|
</div>
|
|
910
932
|
</div>
|
|
911
933
|
|
|
912
934
|
<div className="space-y-2">
|
|
913
|
-
<div className="text-
|
|
935
|
+
<div className="text-fm-secondary text-xs">
|
|
936
|
+
Top Markets
|
|
937
|
+
</div>
|
|
914
938
|
<div className="space-y-1">
|
|
915
939
|
<div className="flex justify-between text-xs">
|
|
916
|
-
<span className="text-
|
|
917
|
-
|
|
940
|
+
<span className="text-fm-secondary">
|
|
941
|
+
North America
|
|
942
|
+
</span>
|
|
943
|
+
<span className="text-fm-primary">45%</span>
|
|
918
944
|
</div>
|
|
919
945
|
<div className="flex justify-between text-xs">
|
|
920
|
-
<span className="text-
|
|
921
|
-
<span className="text-
|
|
946
|
+
<span className="text-fm-secondary">Europe</span>
|
|
947
|
+
<span className="text-fm-primary">32%</span>
|
|
922
948
|
</div>
|
|
923
949
|
<div className="flex justify-between text-xs">
|
|
924
|
-
<span className="text-
|
|
925
|
-
|
|
950
|
+
<span className="text-fm-secondary">
|
|
951
|
+
Asia Pacific
|
|
952
|
+
</span>
|
|
953
|
+
<span className="text-fm-primary">23%</span>
|
|
926
954
|
</div>
|
|
927
955
|
</div>
|
|
928
956
|
</div>
|
|
@@ -955,20 +983,20 @@ export const InteractiveElements: Story = {
|
|
|
955
983
|
export const PositioningAndTiming: Story = {
|
|
956
984
|
render: () => (
|
|
957
985
|
<div className="space-y-8 p-8">
|
|
958
|
-
<h3 className="text-center text-lg font-medium
|
|
986
|
+
<h3 className="text-fm-primary text-center text-lg font-medium">
|
|
959
987
|
Positioning & Timing
|
|
960
988
|
</h3>
|
|
961
989
|
|
|
962
990
|
<div className="space-y-8">
|
|
963
991
|
{/* Positioning */}
|
|
964
992
|
<div className="space-y-4">
|
|
965
|
-
<h4 className="text-center text-sm font-medium
|
|
993
|
+
<h4 className="text-fm-secondary text-center text-sm font-medium">
|
|
966
994
|
Different Positions
|
|
967
995
|
</h4>
|
|
968
996
|
<div className="grid grid-cols-2 place-items-center gap-8 lg:grid-cols-4">
|
|
969
997
|
{/* Top */}
|
|
970
998
|
<div className="flex flex-col items-center gap-4">
|
|
971
|
-
<span className="text-
|
|
999
|
+
<span className="text-fm-secondary text-sm">Top</span>
|
|
972
1000
|
<HoverCard>
|
|
973
1001
|
<HoverCardTrigger asChild>
|
|
974
1002
|
<Button variant="outline" size="sm">
|
|
@@ -977,10 +1005,10 @@ export const PositioningAndTiming: Story = {
|
|
|
977
1005
|
</HoverCardTrigger>
|
|
978
1006
|
<HoverCardContent side="top">
|
|
979
1007
|
<div className="space-y-2">
|
|
980
|
-
<h4 className="text-sm font-semibold
|
|
1008
|
+
<h4 className="text-fm-primary text-sm font-semibold">
|
|
981
1009
|
Top Position
|
|
982
1010
|
</h4>
|
|
983
|
-
<p className="text-
|
|
1011
|
+
<p className="text-fm-secondary text-sm">
|
|
984
1012
|
Card positioned above the trigger
|
|
985
1013
|
</p>
|
|
986
1014
|
</div>
|
|
@@ -990,7 +1018,7 @@ export const PositioningAndTiming: Story = {
|
|
|
990
1018
|
|
|
991
1019
|
{/* Right */}
|
|
992
1020
|
<div className="flex flex-col items-center gap-4">
|
|
993
|
-
<span className="text-
|
|
1021
|
+
<span className="text-fm-secondary text-sm">Right</span>
|
|
994
1022
|
<HoverCard>
|
|
995
1023
|
<HoverCardTrigger asChild>
|
|
996
1024
|
<Button variant="outline" size="sm">
|
|
@@ -999,10 +1027,10 @@ export const PositioningAndTiming: Story = {
|
|
|
999
1027
|
</HoverCardTrigger>
|
|
1000
1028
|
<HoverCardContent side="right">
|
|
1001
1029
|
<div className="space-y-2">
|
|
1002
|
-
<h4 className="text-sm font-semibold
|
|
1030
|
+
<h4 className="text-fm-primary text-sm font-semibold">
|
|
1003
1031
|
Right Position
|
|
1004
1032
|
</h4>
|
|
1005
|
-
<p className="text-
|
|
1033
|
+
<p className="text-fm-secondary text-sm">
|
|
1006
1034
|
Card positioned to the right
|
|
1007
1035
|
</p>
|
|
1008
1036
|
</div>
|
|
@@ -1012,7 +1040,7 @@ export const PositioningAndTiming: Story = {
|
|
|
1012
1040
|
|
|
1013
1041
|
{/* Bottom */}
|
|
1014
1042
|
<div className="flex flex-col items-center gap-4">
|
|
1015
|
-
<span className="text-
|
|
1043
|
+
<span className="text-fm-secondary text-sm">Bottom</span>
|
|
1016
1044
|
<HoverCard>
|
|
1017
1045
|
<HoverCardTrigger asChild>
|
|
1018
1046
|
<Button variant="outline" size="sm">
|
|
@@ -1021,10 +1049,10 @@ export const PositioningAndTiming: Story = {
|
|
|
1021
1049
|
</HoverCardTrigger>
|
|
1022
1050
|
<HoverCardContent side="bottom">
|
|
1023
1051
|
<div className="space-y-2">
|
|
1024
|
-
<h4 className="text-sm font-semibold
|
|
1052
|
+
<h4 className="text-fm-primary text-sm font-semibold">
|
|
1025
1053
|
Bottom Position
|
|
1026
1054
|
</h4>
|
|
1027
|
-
<p className="text-
|
|
1055
|
+
<p className="text-fm-secondary text-sm">
|
|
1028
1056
|
Card positioned below the trigger
|
|
1029
1057
|
</p>
|
|
1030
1058
|
</div>
|
|
@@ -1034,7 +1062,7 @@ export const PositioningAndTiming: Story = {
|
|
|
1034
1062
|
|
|
1035
1063
|
{/* Left */}
|
|
1036
1064
|
<div className="flex flex-col items-center gap-4">
|
|
1037
|
-
<span className="text-
|
|
1065
|
+
<span className="text-fm-secondary text-sm">Left</span>
|
|
1038
1066
|
<HoverCard>
|
|
1039
1067
|
<HoverCardTrigger asChild>
|
|
1040
1068
|
<Button variant="outline" size="sm">
|
|
@@ -1043,10 +1071,10 @@ export const PositioningAndTiming: Story = {
|
|
|
1043
1071
|
</HoverCardTrigger>
|
|
1044
1072
|
<HoverCardContent side="left">
|
|
1045
1073
|
<div className="space-y-2">
|
|
1046
|
-
<h4 className="text-sm font-semibold
|
|
1074
|
+
<h4 className="text-fm-primary text-sm font-semibold">
|
|
1047
1075
|
Left Position
|
|
1048
1076
|
</h4>
|
|
1049
|
-
<p className="text-
|
|
1077
|
+
<p className="text-fm-secondary text-sm">
|
|
1050
1078
|
Card positioned to the left
|
|
1051
1079
|
</p>
|
|
1052
1080
|
</div>
|
|
@@ -1058,7 +1086,7 @@ export const PositioningAndTiming: Story = {
|
|
|
1058
1086
|
|
|
1059
1087
|
{/* Timing */}
|
|
1060
1088
|
<div className="space-y-4">
|
|
1061
|
-
<h4 className="text-center text-sm font-medium
|
|
1089
|
+
<h4 className="text-fm-secondary text-center text-sm font-medium">
|
|
1062
1090
|
Different Delays
|
|
1063
1091
|
</h4>
|
|
1064
1092
|
<div className="flex justify-center gap-4">
|
|
@@ -1070,8 +1098,10 @@ export const PositioningAndTiming: Story = {
|
|
|
1070
1098
|
</HoverCardTrigger>
|
|
1071
1099
|
<HoverCardContent>
|
|
1072
1100
|
<div className="space-y-2">
|
|
1073
|
-
<h4 className="text-sm font-semibold
|
|
1074
|
-
|
|
1101
|
+
<h4 className="text-fm-primary text-sm font-semibold">
|
|
1102
|
+
No Delay
|
|
1103
|
+
</h4>
|
|
1104
|
+
<p className="text-fm-secondary text-sm">
|
|
1075
1105
|
Appears immediately on hover
|
|
1076
1106
|
</p>
|
|
1077
1107
|
</div>
|
|
@@ -1086,10 +1116,10 @@ export const PositioningAndTiming: Story = {
|
|
|
1086
1116
|
</HoverCardTrigger>
|
|
1087
1117
|
<HoverCardContent>
|
|
1088
1118
|
<div className="space-y-2">
|
|
1089
|
-
<h4 className="text-sm font-semibold
|
|
1119
|
+
<h4 className="text-fm-primary text-sm font-semibold">
|
|
1090
1120
|
Medium Delay
|
|
1091
1121
|
</h4>
|
|
1092
|
-
<p className="text-
|
|
1122
|
+
<p className="text-fm-secondary text-sm">
|
|
1093
1123
|
500ms delay before appearing
|
|
1094
1124
|
</p>
|
|
1095
1125
|
</div>
|
|
@@ -1104,10 +1134,10 @@ export const PositioningAndTiming: Story = {
|
|
|
1104
1134
|
</HoverCardTrigger>
|
|
1105
1135
|
<HoverCardContent>
|
|
1106
1136
|
<div className="space-y-2">
|
|
1107
|
-
<h4 className="text-sm font-semibold
|
|
1137
|
+
<h4 className="text-fm-primary text-sm font-semibold">
|
|
1108
1138
|
Long Delay
|
|
1109
1139
|
</h4>
|
|
1110
|
-
<p className="text-
|
|
1140
|
+
<p className="text-fm-secondary text-sm">
|
|
1111
1141
|
1000ms delay before appearing
|
|
1112
1142
|
</p>
|
|
1113
1143
|
</div>
|
|
@@ -1118,7 +1148,7 @@ export const PositioningAndTiming: Story = {
|
|
|
1118
1148
|
|
|
1119
1149
|
{/* Size Variations */}
|
|
1120
1150
|
<div className="space-y-4">
|
|
1121
|
-
<h4 className="text-center text-sm font-medium
|
|
1151
|
+
<h4 className="text-fm-secondary text-center text-sm font-medium">
|
|
1122
1152
|
Different Sizes
|
|
1123
1153
|
</h4>
|
|
1124
1154
|
<div className="flex justify-center gap-4">
|
|
@@ -1130,10 +1160,12 @@ export const PositioningAndTiming: Story = {
|
|
|
1130
1160
|
</HoverCardTrigger>
|
|
1131
1161
|
<HoverCardContent className="w-48">
|
|
1132
1162
|
<div className="space-y-2">
|
|
1133
|
-
<h4 className="text-sm font-semibold
|
|
1163
|
+
<h4 className="text-fm-primary text-sm font-semibold">
|
|
1134
1164
|
Small Card
|
|
1135
1165
|
</h4>
|
|
1136
|
-
<p className="text-
|
|
1166
|
+
<p className="text-fm-secondary text-sm">
|
|
1167
|
+
Compact information
|
|
1168
|
+
</p>
|
|
1137
1169
|
</div>
|
|
1138
1170
|
</HoverCardContent>
|
|
1139
1171
|
</HoverCard>
|
|
@@ -1146,10 +1178,10 @@ export const PositioningAndTiming: Story = {
|
|
|
1146
1178
|
</HoverCardTrigger>
|
|
1147
1179
|
<HoverCardContent className="w-80">
|
|
1148
1180
|
<div className="space-y-2">
|
|
1149
|
-
<h4 className="text-sm font-semibold
|
|
1181
|
+
<h4 className="text-fm-primary text-sm font-semibold">
|
|
1150
1182
|
Medium Card
|
|
1151
1183
|
</h4>
|
|
1152
|
-
<p className="text-
|
|
1184
|
+
<p className="text-fm-secondary text-sm">
|
|
1153
1185
|
Medium-sized card with more detailed information and
|
|
1154
1186
|
multiple lines of text.
|
|
1155
1187
|
</p>
|
|
@@ -1165,15 +1197,15 @@ export const PositioningAndTiming: Story = {
|
|
|
1165
1197
|
</HoverCardTrigger>
|
|
1166
1198
|
<HoverCardContent className="w-96">
|
|
1167
1199
|
<div className="space-y-3">
|
|
1168
|
-
<h4 className="text-sm font-semibold
|
|
1200
|
+
<h4 className="text-fm-primary text-sm font-semibold">
|
|
1169
1201
|
Large Card
|
|
1170
1202
|
</h4>
|
|
1171
|
-
<p className="text-
|
|
1203
|
+
<p className="text-fm-secondary text-sm">
|
|
1172
1204
|
Large card with extensive information, multiple sections,
|
|
1173
1205
|
and complex layouts. Perfect for detailed previews and
|
|
1174
1206
|
comprehensive information displays.
|
|
1175
1207
|
</p>
|
|
1176
|
-
<div className="border-
|
|
1208
|
+
<div className="border-fm-divider-secondary border-t pt-2">
|
|
1177
1209
|
<Button size="sm" className="w-full">
|
|
1178
1210
|
Learn More
|
|
1179
1211
|
</Button>
|
|
@@ -1200,27 +1232,28 @@ export const PositioningAndTiming: Story = {
|
|
|
1200
1232
|
export const AccessibilityDemo: Story = {
|
|
1201
1233
|
render: () => (
|
|
1202
1234
|
<div className="space-y-8 p-8">
|
|
1203
|
-
<h3 className="text-center text-lg font-medium
|
|
1235
|
+
<h3 className="text-fm-primary text-center text-lg font-medium">
|
|
1204
1236
|
Accessibility Features
|
|
1205
1237
|
</h3>
|
|
1206
1238
|
|
|
1207
1239
|
<div className="space-y-6">
|
|
1208
|
-
<div className="
|
|
1209
|
-
<h4 className="mb-2 text-sm font-medium
|
|
1240
|
+
<div className="border-fm-divider-secondary bg-fm-surface-info-sec rounded-lg border p-4">
|
|
1241
|
+
<h4 className="text-fm-info mb-2 text-sm font-medium">
|
|
1210
1242
|
Keyboard Navigation
|
|
1211
1243
|
</h4>
|
|
1212
|
-
<p className="mb-2 text-xs
|
|
1244
|
+
<p className="text-fm-info-sec mb-2 text-xs">
|
|
1213
1245
|
Try these keyboard interactions:
|
|
1214
1246
|
</p>
|
|
1215
|
-
<ul className="space-y-1 text-xs
|
|
1247
|
+
<ul className="text-fm-info-sec space-y-1 text-xs">
|
|
1216
1248
|
<li>
|
|
1217
|
-
• <kbd className="
|
|
1218
|
-
hover card triggers
|
|
1249
|
+
• <kbd className="bg-fm-surface-secondary rounded px-1">Tab</kbd>{" "}
|
|
1250
|
+
to focus hover card triggers
|
|
1219
1251
|
</li>
|
|
1220
1252
|
<li>• Hover card appears automatically on focus</li>
|
|
1221
1253
|
<li>
|
|
1222
|
-
•
|
|
1223
|
-
|
|
1254
|
+
•{" "}
|
|
1255
|
+
<kbd className="bg-fm-surface-secondary rounded px-1">Escape</kbd>{" "}
|
|
1256
|
+
to dismiss hover card
|
|
1224
1257
|
</li>
|
|
1225
1258
|
<li>• Content is announced by screen readers</li>
|
|
1226
1259
|
</ul>
|
|
@@ -1228,7 +1261,7 @@ export const AccessibilityDemo: Story = {
|
|
|
1228
1261
|
|
|
1229
1262
|
{/* Keyboard Accessible Examples */}
|
|
1230
1263
|
<div className="space-y-4">
|
|
1231
|
-
<h4 className="text-sm font-medium
|
|
1264
|
+
<h4 className="text-fm-secondary text-sm font-medium">
|
|
1232
1265
|
Keyboard Accessible Hover Cards
|
|
1233
1266
|
</h4>
|
|
1234
1267
|
<div className="flex flex-wrap gap-4">
|
|
@@ -1238,10 +1271,10 @@ export const AccessibilityDemo: Story = {
|
|
|
1238
1271
|
</HoverCardTrigger>
|
|
1239
1272
|
<HoverCardContent>
|
|
1240
1273
|
<div className="space-y-2">
|
|
1241
|
-
<h4 className="text-sm font-semibold
|
|
1274
|
+
<h4 className="text-fm-primary text-sm font-semibold">
|
|
1242
1275
|
Keyboard Accessible
|
|
1243
1276
|
</h4>
|
|
1244
|
-
<p className="text-
|
|
1277
|
+
<p className="text-fm-secondary text-sm">
|
|
1245
1278
|
This hover card appears on both hover and keyboard focus.
|
|
1246
1279
|
</p>
|
|
1247
1280
|
</div>
|
|
@@ -1252,7 +1285,7 @@ export const AccessibilityDemo: Story = {
|
|
|
1252
1285
|
<HoverCardTrigger asChild>
|
|
1253
1286
|
<a
|
|
1254
1287
|
href="#"
|
|
1255
|
-
className="inline-flex items-center gap-2 rounded px-3 py-2 text-sm
|
|
1288
|
+
className="text-fm-info inline-flex items-center gap-2 rounded px-3 py-2 text-sm hover:text-blue-300 focus:ring-2 focus:ring-blue-500 focus:outline-none"
|
|
1256
1289
|
onClick={(e) => e.preventDefault()}
|
|
1257
1290
|
>
|
|
1258
1291
|
<AlertIcon className="h-4 w-4" />
|
|
@@ -1261,10 +1294,10 @@ export const AccessibilityDemo: Story = {
|
|
|
1261
1294
|
</HoverCardTrigger>
|
|
1262
1295
|
<HoverCardContent>
|
|
1263
1296
|
<div className="space-y-2">
|
|
1264
|
-
<h4 className="text-sm font-semibold
|
|
1297
|
+
<h4 className="text-fm-primary text-sm font-semibold">
|
|
1265
1298
|
Documentation
|
|
1266
1299
|
</h4>
|
|
1267
|
-
<p className="text-
|
|
1300
|
+
<p className="text-fm-secondary text-sm">
|
|
1268
1301
|
Comprehensive guides and API reference for developers.
|
|
1269
1302
|
</p>
|
|
1270
1303
|
<Button size="sm" className="w-full">
|
|
@@ -1276,22 +1309,22 @@ export const AccessibilityDemo: Story = {
|
|
|
1276
1309
|
|
|
1277
1310
|
<HoverCard>
|
|
1278
1311
|
<HoverCardTrigger asChild>
|
|
1279
|
-
<button className="inline-flex items-center gap-2 rounded border
|
|
1312
|
+
<button className="border-fm-divider-secondary bg-fm-surface-secondary text-fm-primary hover:bg-fm-surface-frosted/15 hover:border-fm-divider-contrast inline-flex items-center gap-2 rounded border px-3 py-2 text-sm focus:ring-2 focus:ring-purple-500 focus:outline-none">
|
|
1280
1313
|
<TickCircleIcon className="h-4 w-4" />
|
|
1281
1314
|
Status Check
|
|
1282
1315
|
</button>
|
|
1283
1316
|
</HoverCardTrigger>
|
|
1284
1317
|
<HoverCardContent>
|
|
1285
1318
|
<div className="space-y-2">
|
|
1286
|
-
<h4 className="text-sm font-semibold
|
|
1319
|
+
<h4 className="text-fm-primary text-sm font-semibold">
|
|
1287
1320
|
System Status
|
|
1288
1321
|
</h4>
|
|
1289
|
-
<div className="space-y-1 text-sm
|
|
1322
|
+
<div className="text-fm-secondary space-y-1 text-sm">
|
|
1290
1323
|
<div className="flex items-center gap-2">
|
|
1291
|
-
<div className="h-2 w-2 rounded-full
|
|
1324
|
+
<div className="bg-fm-surface-positive h-2 w-2 rounded-full"></div>
|
|
1292
1325
|
<span>All systems operational</span>
|
|
1293
1326
|
</div>
|
|
1294
|
-
<div className="text-
|
|
1327
|
+
<div className="text-fm-secondary text-xs">
|
|
1295
1328
|
Last updated: 2 minutes ago
|
|
1296
1329
|
</div>
|
|
1297
1330
|
</div>
|
|
@@ -1301,11 +1334,11 @@ export const AccessibilityDemo: Story = {
|
|
|
1301
1334
|
</div>
|
|
1302
1335
|
</div>
|
|
1303
1336
|
|
|
1304
|
-
<div className="
|
|
1305
|
-
<h4 className="mb-2 text-sm font-medium
|
|
1337
|
+
<div className="border-fm-divider-warning bg-fm-surface-warning-sec rounded-lg border p-4">
|
|
1338
|
+
<h4 className="text-fm-warning mb-2 text-sm font-medium">
|
|
1306
1339
|
Best Practices
|
|
1307
1340
|
</h4>
|
|
1308
|
-
<ul className="space-y-1 text-xs
|
|
1341
|
+
<ul className="text-fm-warning space-y-1 text-xs">
|
|
1309
1342
|
<li>• Ensure hover cards work with keyboard navigation</li>
|
|
1310
1343
|
<li>• Don't put critical information only in hover cards</li>
|
|
1311
1344
|
<li>• Keep content concise and scannable</li>
|