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,107 +1,394 @@
|
|
|
1
|
-
import React from "react"
|
|
1
|
+
import React, { useState } from "react"
|
|
2
2
|
import type { Meta, StoryObj } from "@storybook/react-vite"
|
|
3
3
|
|
|
4
|
+
import { AuralComponentDocsPage } from "src/ui/story-spec/components/component-story-docs-page"
|
|
5
|
+
|
|
4
6
|
import { Else, If, IfElse } from "."
|
|
5
7
|
|
|
6
|
-
const meta = {
|
|
8
|
+
const meta: Meta<typeof IfElse> = {
|
|
7
9
|
title: "Components/Logical/IfElse",
|
|
8
10
|
component: IfElse,
|
|
9
11
|
parameters: {
|
|
10
12
|
layout: "centered",
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
docs: {
|
|
14
|
+
description: {
|
|
15
|
+
component:
|
|
16
|
+
"A utility component for declarative conditional rendering. Accepts a `condition` boolean and renders either the `if` branch or the `else` branch. Supports both a props-based API (`if` / `else` props) and a compound children API using the `<If>` and `<Else>` sub-components.",
|
|
17
|
+
},
|
|
18
|
+
page: () => (
|
|
19
|
+
<AuralComponentDocsPage
|
|
20
|
+
features={[
|
|
21
|
+
{
|
|
22
|
+
title: "Props API",
|
|
23
|
+
description: "if and else prop slots",
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
title: "Compound Children",
|
|
27
|
+
description: "If and Else sub-components",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
title: "Zero Output",
|
|
31
|
+
description: "No DOM node rendered",
|
|
32
|
+
},
|
|
33
|
+
]}
|
|
34
|
+
/>
|
|
35
|
+
),
|
|
17
36
|
},
|
|
18
37
|
},
|
|
19
38
|
tags: ["autodocs"],
|
|
20
|
-
}
|
|
39
|
+
}
|
|
21
40
|
|
|
22
41
|
export default meta
|
|
23
42
|
type Story = StoryObj<typeof meta>
|
|
24
43
|
|
|
25
|
-
//
|
|
26
|
-
export const ConditionTrue: Story = {
|
|
27
|
-
args: {
|
|
28
|
-
condition: true,
|
|
29
|
-
if: (
|
|
30
|
-
<div style={{ padding: "10px", color: "green" }}>Condition is true</div>
|
|
31
|
-
),
|
|
32
|
-
else: (
|
|
33
|
-
<div style={{ padding: "10px", color: "red" }}>Condition is false</div>
|
|
34
|
-
),
|
|
35
|
-
},
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// Basic example with condition false
|
|
39
|
-
export const ConditionFalse: Story = {
|
|
40
|
-
args: {
|
|
41
|
-
condition: false,
|
|
42
|
-
if: (
|
|
43
|
-
<div style={{ padding: "10px", color: "green" }}>Condition is true</div>
|
|
44
|
-
),
|
|
45
|
-
else: (
|
|
46
|
-
<div style={{ padding: "10px", color: "red" }}>Condition is false</div>
|
|
47
|
-
),
|
|
48
|
-
},
|
|
49
|
-
}
|
|
44
|
+
// ─── 1. Configurations ────────────────────────────────────────────────────────
|
|
50
45
|
|
|
51
|
-
|
|
52
|
-
export const WithChildComponents: Story = {
|
|
53
|
-
args: {
|
|
54
|
-
condition: true,
|
|
55
|
-
},
|
|
46
|
+
export const Configurations: Story = {
|
|
56
47
|
render: () => (
|
|
57
|
-
<
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
48
|
+
<div className="space-y-8">
|
|
49
|
+
{/* Props API — condition true */}
|
|
50
|
+
<div className="space-y-4">
|
|
51
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
52
|
+
Props API — condition true
|
|
53
|
+
</h4>
|
|
54
|
+
<div className="flex flex-wrap gap-4">
|
|
55
|
+
<div className="space-y-2 text-center">
|
|
56
|
+
<IfElse
|
|
57
|
+
condition={true}
|
|
58
|
+
if={
|
|
59
|
+
<div className="bg-fm-surface-positive-sec rounded-lg px-4 py-3">
|
|
60
|
+
<p className="text-fm-positive-sec font-fm-text text-fm-md leading-fm-md font-medium">
|
|
61
|
+
Condition is true — if branch renders
|
|
62
|
+
</p>
|
|
63
|
+
</div>
|
|
64
|
+
}
|
|
65
|
+
else={
|
|
66
|
+
<div className="bg-fm-surface-negative-sec rounded-lg px-4 py-3">
|
|
67
|
+
<p className="text-fm-negative-sec font-fm-text text-fm-md leading-fm-md font-medium">
|
|
68
|
+
Condition is false — else branch renders
|
|
69
|
+
</p>
|
|
70
|
+
</div>
|
|
71
|
+
}
|
|
72
|
+
/>
|
|
73
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
74
|
+
condition={true} → if prop
|
|
75
|
+
</p>
|
|
76
|
+
</div>
|
|
68
77
|
</div>
|
|
69
|
-
</
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
{/* Props API — condition false */}
|
|
81
|
+
<div className="space-y-4">
|
|
82
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
83
|
+
Props API — condition false
|
|
84
|
+
</h4>
|
|
85
|
+
<div className="flex flex-wrap gap-4">
|
|
86
|
+
<div className="space-y-2 text-center">
|
|
87
|
+
<IfElse
|
|
88
|
+
condition={false}
|
|
89
|
+
if={
|
|
90
|
+
<div className="bg-fm-surface-positive-sec rounded-lg px-4 py-3">
|
|
91
|
+
<p className="text-fm-positive-sec font-fm-text text-fm-md leading-fm-md font-medium">
|
|
92
|
+
Condition is true — if branch renders
|
|
93
|
+
</p>
|
|
94
|
+
</div>
|
|
95
|
+
}
|
|
96
|
+
else={
|
|
97
|
+
<div className="bg-fm-surface-negative-sec rounded-lg px-4 py-3">
|
|
98
|
+
<p className="text-fm-negative-sec font-fm-text text-fm-md leading-fm-md font-medium">
|
|
99
|
+
Condition is false — else branch renders
|
|
100
|
+
</p>
|
|
101
|
+
</div>
|
|
102
|
+
}
|
|
103
|
+
/>
|
|
104
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
105
|
+
condition={false} → else prop
|
|
106
|
+
</p>
|
|
107
|
+
</div>
|
|
80
108
|
</div>
|
|
81
|
-
</
|
|
82
|
-
</IfElse>
|
|
83
|
-
),
|
|
84
|
-
}
|
|
109
|
+
</div>
|
|
85
110
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
111
|
+
{/* Compound children API — If + Else sub-components */}
|
|
112
|
+
<div className="space-y-4">
|
|
113
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
114
|
+
Compound children API — <If> + <Else>
|
|
115
|
+
</h4>
|
|
116
|
+
<div className="flex flex-wrap gap-6">
|
|
117
|
+
<div className="space-y-2 text-center">
|
|
118
|
+
<IfElse condition={true}>
|
|
119
|
+
<If>
|
|
120
|
+
<div className="bg-fm-surface-positive-sec rounded-lg px-4 py-3">
|
|
121
|
+
<p className="text-fm-positive-sec font-fm-text text-fm-md leading-fm-md font-medium">
|
|
122
|
+
<If> renders when condition is true
|
|
123
|
+
</p>
|
|
124
|
+
</div>
|
|
125
|
+
</If>
|
|
126
|
+
<Else>
|
|
127
|
+
<div className="bg-fm-surface-negative-sec rounded-lg px-4 py-3">
|
|
128
|
+
<p className="text-fm-negative-sec font-fm-text text-fm-md leading-fm-md font-medium">
|
|
129
|
+
<Else> renders when condition is false
|
|
130
|
+
</p>
|
|
131
|
+
</div>
|
|
132
|
+
</Else>
|
|
133
|
+
</IfElse>
|
|
134
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
135
|
+
condition={true} → <If> visible
|
|
136
|
+
</p>
|
|
137
|
+
</div>
|
|
138
|
+
|
|
139
|
+
<div className="space-y-2 text-center">
|
|
140
|
+
<IfElse condition={false}>
|
|
141
|
+
<If>
|
|
142
|
+
<div className="bg-fm-surface-positive-sec rounded-lg px-4 py-3">
|
|
143
|
+
<p className="text-fm-positive-sec font-fm-text text-fm-md leading-fm-md font-medium">
|
|
144
|
+
<If> renders when condition is true
|
|
145
|
+
</p>
|
|
146
|
+
</div>
|
|
147
|
+
</If>
|
|
148
|
+
<Else>
|
|
149
|
+
<div className="bg-fm-surface-negative-sec rounded-lg px-4 py-3">
|
|
150
|
+
<p className="text-fm-negative-sec font-fm-text text-fm-md leading-fm-md font-medium">
|
|
151
|
+
<Else> renders when condition is false
|
|
152
|
+
</p>
|
|
153
|
+
</div>
|
|
154
|
+
</Else>
|
|
155
|
+
</IfElse>
|
|
156
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
157
|
+
condition={false} → <Else> visible
|
|
158
|
+
</p>
|
|
159
|
+
</div>
|
|
102
160
|
</div>
|
|
103
|
-
</
|
|
104
|
-
|
|
161
|
+
</div>
|
|
162
|
+
|
|
163
|
+
{/* Standalone If — no Else */}
|
|
164
|
+
<div className="space-y-4">
|
|
165
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
166
|
+
Standalone <If> — no else branch
|
|
167
|
+
</h4>
|
|
168
|
+
<div className="flex flex-wrap gap-6">
|
|
169
|
+
<div className="space-y-2 text-center">
|
|
170
|
+
<div className="space-y-3">
|
|
171
|
+
<If condition={true}>
|
|
172
|
+
<div className="bg-fm-surface-info-sec rounded-lg px-4 py-3">
|
|
173
|
+
<p className="text-fm-info-sec font-fm-text text-fm-md leading-fm-md">
|
|
174
|
+
Shown — condition is true
|
|
175
|
+
</p>
|
|
176
|
+
</div>
|
|
177
|
+
</If>
|
|
178
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary rounded-lg border px-4 py-3">
|
|
179
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
180
|
+
This content always renders
|
|
181
|
+
</p>
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
185
|
+
condition={true} → content visible
|
|
186
|
+
</p>
|
|
187
|
+
</div>
|
|
188
|
+
|
|
189
|
+
<div className="space-y-2 text-center">
|
|
190
|
+
<div className="space-y-3">
|
|
191
|
+
<If condition={false}>
|
|
192
|
+
<div className="bg-fm-surface-info-sec rounded-lg px-4 py-3">
|
|
193
|
+
<p className="text-fm-info-sec font-fm-text text-fm-md leading-fm-md">
|
|
194
|
+
Shown — condition is true
|
|
195
|
+
</p>
|
|
196
|
+
</div>
|
|
197
|
+
</If>
|
|
198
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary rounded-lg border px-4 py-3">
|
|
199
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
200
|
+
This content always renders
|
|
201
|
+
</p>
|
|
202
|
+
</div>
|
|
203
|
+
</div>
|
|
204
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
205
|
+
condition={false} → content hidden
|
|
206
|
+
</p>
|
|
207
|
+
</div>
|
|
208
|
+
</div>
|
|
209
|
+
</div>
|
|
210
|
+
|
|
211
|
+
{/* Code reference */}
|
|
212
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary rounded-lg border px-4 py-3">
|
|
213
|
+
<code className="text-fm-secondary text-fm-md leading-fm-md font-(--font-fm-mono) whitespace-pre">{`// Props API
|
|
214
|
+
<IfElse condition={isLoggedIn} if={<Dashboard />} else={<Login />} />
|
|
215
|
+
|
|
216
|
+
// Compound children API
|
|
217
|
+
<IfElse condition={isLoggedIn}>
|
|
218
|
+
<If><Dashboard /></If>
|
|
219
|
+
<Else><Login /></Else>
|
|
220
|
+
</IfElse>
|
|
221
|
+
|
|
222
|
+
// Standalone If (no Else)
|
|
223
|
+
<If condition={hasPremium}><PremiumBanner /></If>`}</code>
|
|
224
|
+
</div>
|
|
105
225
|
</div>
|
|
106
226
|
),
|
|
227
|
+
parameters: {
|
|
228
|
+
docs: {
|
|
229
|
+
description: {
|
|
230
|
+
story:
|
|
231
|
+
"All three configuration modes: the props API (`if`/`else` props), the compound children API (`<If>` + `<Else>` sub-components), and a standalone `<If>` with no else branch. Each mode is shown with both truthy and falsy conditions.",
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// ─── 2. Use Cases ─────────────────────────────────────────────────────────────
|
|
238
|
+
|
|
239
|
+
export const UseCases: Story = {
|
|
240
|
+
render: () => {
|
|
241
|
+
const [isLoggedIn, setIsLoggedIn] = useState(false)
|
|
242
|
+
const [isPremium, setIsPremium] = useState(false)
|
|
243
|
+
const [hasError, setHasError] = useState(false)
|
|
244
|
+
|
|
245
|
+
return (
|
|
246
|
+
<div className="mx-auto max-w-3xl space-y-8 p-8">
|
|
247
|
+
{/* Auth gate */}
|
|
248
|
+
<div className="space-y-4">
|
|
249
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
250
|
+
Authentication gate
|
|
251
|
+
</h4>
|
|
252
|
+
<div className="mx-auto max-w-md space-y-3">
|
|
253
|
+
<button
|
|
254
|
+
onClick={() => setIsLoggedIn((v) => !v)}
|
|
255
|
+
className="border-fm-divider-primary bg-fm-surface-secondary text-fm-primary font-fm-text text-fm-sm leading-fm-sm cursor-pointer rounded-lg border px-4 py-2 transition-opacity hover:opacity-80"
|
|
256
|
+
>
|
|
257
|
+
Toggle login — currently: {isLoggedIn ? "Logged in" : "Guest"}
|
|
258
|
+
</button>
|
|
259
|
+
<IfElse
|
|
260
|
+
condition={isLoggedIn}
|
|
261
|
+
if={
|
|
262
|
+
<div className="bg-fm-surface-positive-sec rounded-xl p-4">
|
|
263
|
+
<p className="text-fm-positive-sec font-fm-brand text-fm-md leading-fm-md font-semibold">
|
|
264
|
+
Welcome back!
|
|
265
|
+
</p>
|
|
266
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm mt-1">
|
|
267
|
+
Your dashboard is ready. All your tracks and analytics are
|
|
268
|
+
available.
|
|
269
|
+
</p>
|
|
270
|
+
</div>
|
|
271
|
+
}
|
|
272
|
+
else={
|
|
273
|
+
<div className="bg-fm-surface-info-sec rounded-xl p-4">
|
|
274
|
+
<p className="text-fm-info-sec font-fm-brand text-fm-md leading-fm-md font-semibold">
|
|
275
|
+
Sign in to continue
|
|
276
|
+
</p>
|
|
277
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm mt-1">
|
|
278
|
+
Create an account or log in to access your music library.
|
|
279
|
+
</p>
|
|
280
|
+
</div>
|
|
281
|
+
}
|
|
282
|
+
/>
|
|
283
|
+
</div>
|
|
284
|
+
</div>
|
|
285
|
+
|
|
286
|
+
{/* Premium content gate */}
|
|
287
|
+
<div className="space-y-4">
|
|
288
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
289
|
+
Premium content gate
|
|
290
|
+
</h4>
|
|
291
|
+
<div className="mx-auto max-w-md space-y-3">
|
|
292
|
+
<button
|
|
293
|
+
onClick={() => setIsPremium((v) => !v)}
|
|
294
|
+
className="border-fm-divider-primary bg-fm-surface-secondary text-fm-primary font-fm-text text-fm-sm leading-fm-sm cursor-pointer rounded-lg border px-4 py-2 transition-opacity hover:opacity-80"
|
|
295
|
+
>
|
|
296
|
+
Toggle premium — currently: {isPremium ? "Premium" : "Free"}
|
|
297
|
+
</button>
|
|
298
|
+
<IfElse condition={isPremium}>
|
|
299
|
+
<If>
|
|
300
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary rounded-xl border p-4">
|
|
301
|
+
<p className="text-fm-primary font-fm-brand text-fm-md leading-fm-md font-semibold">
|
|
302
|
+
Spatial Audio — Premium
|
|
303
|
+
</p>
|
|
304
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm mt-1">
|
|
305
|
+
Enjoy immersive 360° sound. Lossless quality enabled.
|
|
306
|
+
</p>
|
|
307
|
+
</div>
|
|
308
|
+
</If>
|
|
309
|
+
<Else>
|
|
310
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary rounded-xl border p-4">
|
|
311
|
+
<p className="text-fm-secondary font-fm-brand text-fm-md leading-fm-md font-semibold">
|
|
312
|
+
Spatial Audio — Premium feature
|
|
313
|
+
</p>
|
|
314
|
+
<p className="text-fm-tertiary font-fm-text text-fm-sm leading-fm-sm mt-1">
|
|
315
|
+
Upgrade to Premium to unlock immersive Spatial Audio.
|
|
316
|
+
</p>
|
|
317
|
+
</div>
|
|
318
|
+
</Else>
|
|
319
|
+
</IfElse>
|
|
320
|
+
</div>
|
|
321
|
+
</div>
|
|
322
|
+
|
|
323
|
+
{/* Error / success state */}
|
|
324
|
+
<div className="space-y-4">
|
|
325
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
326
|
+
Error / success state
|
|
327
|
+
</h4>
|
|
328
|
+
<div className="mx-auto max-w-md space-y-3">
|
|
329
|
+
<button
|
|
330
|
+
onClick={() => setHasError((v) => !v)}
|
|
331
|
+
className="border-fm-divider-primary bg-fm-surface-secondary text-fm-primary font-fm-text text-fm-sm leading-fm-sm cursor-pointer rounded-lg border px-4 py-2 transition-opacity hover:opacity-80"
|
|
332
|
+
>
|
|
333
|
+
Toggle error — currently: {hasError ? "Error" : "Success"}
|
|
334
|
+
</button>
|
|
335
|
+
<IfElse
|
|
336
|
+
condition={hasError}
|
|
337
|
+
if={
|
|
338
|
+
<div className="bg-fm-surface-negative-sec rounded-xl p-4">
|
|
339
|
+
<p className="text-fm-negative-sec font-fm-brand text-fm-md leading-fm-md font-semibold">
|
|
340
|
+
Upload failed
|
|
341
|
+
</p>
|
|
342
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm mt-1">
|
|
343
|
+
Something went wrong. Please check your file and try again.
|
|
344
|
+
</p>
|
|
345
|
+
</div>
|
|
346
|
+
}
|
|
347
|
+
else={
|
|
348
|
+
<div className="bg-fm-surface-positive-sec rounded-xl p-4">
|
|
349
|
+
<p className="text-fm-positive-sec font-fm-brand text-fm-md leading-fm-md font-semibold">
|
|
350
|
+
Track uploaded successfully
|
|
351
|
+
</p>
|
|
352
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm mt-1">
|
|
353
|
+
Your track is now processing and will be live shortly.
|
|
354
|
+
</p>
|
|
355
|
+
</div>
|
|
356
|
+
}
|
|
357
|
+
/>
|
|
358
|
+
</div>
|
|
359
|
+
</div>
|
|
360
|
+
|
|
361
|
+
{/* Conditional inline content */}
|
|
362
|
+
<div className="space-y-4">
|
|
363
|
+
<h4 className="text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
364
|
+
Standalone <If> — conditional inline notice
|
|
365
|
+
</h4>
|
|
366
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary mx-auto max-w-md space-y-3 rounded-xl border p-4">
|
|
367
|
+
<p className="text-fm-primary font-fm-text text-fm-md leading-fm-md font-medium">
|
|
368
|
+
Midnight Dreams
|
|
369
|
+
</p>
|
|
370
|
+
<p className="text-fm-secondary font-fm-text text-fm-sm leading-fm-sm">
|
|
371
|
+
Duration: 3:42 · 320 kbps
|
|
372
|
+
</p>
|
|
373
|
+
<If condition={isPremium}>
|
|
374
|
+
<div className="bg-fm-surface-info-sec rounded-lg px-3 py-2">
|
|
375
|
+
<p className="text-fm-info-sec font-fm-text text-fm-sm leading-fm-sm">
|
|
376
|
+
Lossless quality available — playing at 24-bit / 96 kHz
|
|
377
|
+
</p>
|
|
378
|
+
</div>
|
|
379
|
+
</If>
|
|
380
|
+
</div>
|
|
381
|
+
</div>
|
|
382
|
+
</div>
|
|
383
|
+
)
|
|
384
|
+
},
|
|
385
|
+
parameters: {
|
|
386
|
+
layout: "fullscreen",
|
|
387
|
+
docs: {
|
|
388
|
+
description: {
|
|
389
|
+
story:
|
|
390
|
+
"Real-world scenarios: authentication gates, premium content paywalls, error/success feedback, and conditional inline notices. Toggle the buttons to see each branch in action.",
|
|
391
|
+
},
|
|
392
|
+
},
|
|
393
|
+
},
|
|
107
394
|
}
|