aural-ui 2.0.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.
Files changed (308) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +456 -0
  3. package/dist/components/aspect-ratio/AspectRatio.stories.tsx +1327 -0
  4. package/dist/components/aspect-ratio/index.tsx +10 -0
  5. package/dist/components/aspect-ratio/meta.ts +8 -0
  6. package/dist/components/avatar/Avatar.stories.tsx +645 -0
  7. package/dist/components/avatar/index.tsx +50 -0
  8. package/dist/components/avatar/meta.ts +8 -0
  9. package/dist/components/badge/Badge.stories.tsx +169 -0
  10. package/dist/components/badge/index.tsx +28 -0
  11. package/dist/components/badge/meta.ts +6 -0
  12. package/dist/components/banner/Banner.stories.tsx +475 -0
  13. package/dist/components/banner/index.tsx +256 -0
  14. package/dist/components/banner/meta.ts +36 -0
  15. package/dist/components/button/Button.stories.tsx +74 -0
  16. package/dist/components/button/index.tsx +158 -0
  17. package/dist/components/button/meta.ts +33 -0
  18. package/dist/components/card/Card.stories.tsx +377 -0
  19. package/dist/components/card/index.tsx +85 -0
  20. package/dist/components/card/meta.ts +14 -0
  21. package/dist/components/char-count/CharCount.stories.tsx +334 -0
  22. package/dist/components/char-count/index.tsx +51 -0
  23. package/dist/components/char-count/meta.ts +13 -0
  24. package/dist/components/checkbox/Checkbox.stories.tsx +209 -0
  25. package/dist/components/checkbox/index.tsx +34 -0
  26. package/dist/components/checkbox/meta.ts +19 -0
  27. package/dist/components/chip/Chip.stories.tsx +207 -0
  28. package/dist/components/chip/index.tsx +92 -0
  29. package/dist/components/chip/meta.ts +17 -0
  30. package/dist/components/circular-loader/CircularLoader.stories.tsx +741 -0
  31. package/dist/components/circular-loader/index.tsx +138 -0
  32. package/dist/components/circular-loader/meta.ts +11 -0
  33. package/dist/components/collapsible/Collapsible.stories.tsx +319 -0
  34. package/dist/components/collapsible/index.tsx +158 -0
  35. package/dist/components/collapsible/meta.ts +22 -0
  36. package/dist/components/command/Command.stories.tsx +996 -0
  37. package/dist/components/command/index.tsx +324 -0
  38. package/dist/components/command/meta.ts +18 -0
  39. package/dist/components/dialog/Dialog.stories.tsx +963 -0
  40. package/dist/components/dialog/index.tsx +250 -0
  41. package/dist/components/dialog/meta.ts +28 -0
  42. package/dist/components/divider/Divider.stories.tsx +633 -0
  43. package/dist/components/divider/index.tsx +181 -0
  44. package/dist/components/divider/meta.ts +12 -0
  45. package/dist/components/dot-loader/DotLoader.stories.tsx +352 -0
  46. package/dist/components/dot-loader/index.tsx +78 -0
  47. package/dist/components/dot-loader/meta.ts +14 -0
  48. package/dist/components/dropdown/Dropdown.stories.tsx +1210 -0
  49. package/dist/components/dropdown/index.tsx +479 -0
  50. package/dist/components/dropdown/meta.ts +21 -0
  51. package/dist/components/form/Form.stories.tsx +320 -0
  52. package/dist/components/form/index.tsx +183 -0
  53. package/dist/components/form/meta.ts +11 -0
  54. package/dist/components/helper-text/HelperText.stories.tsx +254 -0
  55. package/dist/components/helper-text/index.tsx +102 -0
  56. package/dist/components/helper-text/meta.ts +18 -0
  57. package/dist/components/hover-card/HoverCard.stories.tsx +1328 -0
  58. package/dist/components/hover-card/index.tsx +42 -0
  59. package/dist/components/hover-card/meta.ts +12 -0
  60. package/dist/components/icon-button/IconButton.stories.tsx +252 -0
  61. package/dist/components/icon-button/index.tsx +130 -0
  62. package/dist/components/icon-button/meta.ts +20 -0
  63. package/dist/components/if-else/if-else.stories.tsx +100 -0
  64. package/dist/components/if-else/index.tsx +56 -0
  65. package/dist/components/if-else/meta.ts +6 -0
  66. package/dist/components/index.ts +70 -0
  67. package/dist/components/input/Input.stories.tsx +431 -0
  68. package/dist/components/input/index.tsx +487 -0
  69. package/dist/components/input/meta.ts +28 -0
  70. package/dist/components/label/Label.stories.tsx +200 -0
  71. package/dist/components/label/index.tsx +43 -0
  72. package/dist/components/label/meta.ts +14 -0
  73. package/dist/components/list/List.stories.tsx +963 -0
  74. package/dist/components/list/index.tsx +567 -0
  75. package/dist/components/list/meta.ts +24 -0
  76. package/dist/components/marquee/Marquee.stories.tsx +819 -0
  77. package/dist/components/marquee/index.tsx +107 -0
  78. package/dist/components/marquee/meta.ts +6 -0
  79. package/dist/components/overlay/Overlay.stories.tsx +954 -0
  80. package/dist/components/overlay/index.tsx +58 -0
  81. package/dist/components/overlay/meta.ts +10 -0
  82. package/dist/components/pagination/Pagination.stories.tsx +354 -0
  83. package/dist/components/pagination/index.tsx +455 -0
  84. package/dist/components/pagination/meta.ts +29 -0
  85. package/dist/components/popover/Popover.stories.tsx +1037 -0
  86. package/dist/components/popover/index.tsx +67 -0
  87. package/dist/components/popover/meta.ts +12 -0
  88. package/dist/components/radio/Radio.stories.tsx +146 -0
  89. package/dist/components/radio/index.tsx +41 -0
  90. package/dist/components/radio/meta.ts +19 -0
  91. package/dist/components/resizable/Resizable.stories.tsx +866 -0
  92. package/dist/components/resizable/index.tsx +55 -0
  93. package/dist/components/resizable/meta.ts +12 -0
  94. package/dist/components/scroll-area/ScrollArea.stories.tsx +1104 -0
  95. package/dist/components/scroll-area/index.tsx +55 -0
  96. package/dist/components/scroll-area/meta.ts +8 -0
  97. package/dist/components/search/Search.stories.tsx +678 -0
  98. package/dist/components/search/index.tsx +141 -0
  99. package/dist/components/search/meta.ts +6 -0
  100. package/dist/components/select/Select.stories.tsx +962 -0
  101. package/dist/components/select/index.tsx +512 -0
  102. package/dist/components/select/meta.ts +40 -0
  103. package/dist/components/sheet/Sheet.stories.tsx +1060 -0
  104. package/dist/components/sheet/index.tsx +440 -0
  105. package/dist/components/sheet/meta.ts +38 -0
  106. package/dist/components/skelton/Skelton.stories.tsx +859 -0
  107. package/dist/components/skelton/index.tsx +17 -0
  108. package/dist/components/skelton/meta.ts +6 -0
  109. package/dist/components/slider/Slider.stories.tsx +876 -0
  110. package/dist/components/slider/index.tsx +156 -0
  111. package/dist/components/slider/meta.ts +29 -0
  112. package/dist/components/stepper/Stepper.stories.tsx +639 -0
  113. package/dist/components/stepper/index.tsx +650 -0
  114. package/dist/components/stepper/meta.ts +19 -0
  115. package/dist/components/switch/Switch.stories.tsx +85 -0
  116. package/dist/components/switch/index.tsx +37 -0
  117. package/dist/components/switch/meta.ts +24 -0
  118. package/dist/components/switch-case/SwitchCase.stories.tsx +209 -0
  119. package/dist/components/switch-case/index.tsx +89 -0
  120. package/dist/components/switch-case/meta.ts +6 -0
  121. package/dist/components/table/Table.stories.tsx +1095 -0
  122. package/dist/components/table/index.tsx +113 -0
  123. package/dist/components/table/meta.ts +20 -0
  124. package/dist/components/tabs/Tabs.stories.tsx +1379 -0
  125. package/dist/components/tabs/index.tsx +186 -0
  126. package/dist/components/tabs/meta.ts +25 -0
  127. package/dist/components/tag/Tag.stories.tsx +625 -0
  128. package/dist/components/tag/index.tsx +320 -0
  129. package/dist/components/tag/meta.ts +52 -0
  130. package/dist/components/textarea/TextArea.stories.tsx +723 -0
  131. package/dist/components/textarea/index.tsx +480 -0
  132. package/dist/components/textarea/meta.ts +23 -0
  133. package/dist/components/toast/Toast.stories.tsx +1427 -0
  134. package/dist/components/toast/index.tsx +26 -0
  135. package/dist/components/toast/meta.ts +19 -0
  136. package/dist/components/toggle/Toggle.stories.tsx +1093 -0
  137. package/dist/components/toggle/index.tsx +44 -0
  138. package/dist/components/toggle/meta.ts +19 -0
  139. package/dist/components/tooltip/Tooltip.stories.tsx +1548 -0
  140. package/dist/components/tooltip/index.tsx +304 -0
  141. package/dist/components/tooltip/meta.ts +21 -0
  142. package/dist/components/typography/Typography.stories.tsx +197 -0
  143. package/dist/components/typography/index.tsx +184 -0
  144. package/dist/components/typography/meta.ts +38 -0
  145. package/dist/fonts/LabGrotesque-Regular.ttf +0 -0
  146. package/dist/fonts/LabGrotesqueTRIAL-Bold.otf +0 -0
  147. package/dist/fonts/LabGrotesqueTRIAL-Light.otf +0 -0
  148. package/dist/fonts/LabGrotesqueTRIAL-Medium.otf +0 -0
  149. package/dist/fonts/LabGrotesqueTRIAL-Regular.otf +0 -0
  150. package/dist/fonts/PPSupplySans-Regular (1).otf +0 -0
  151. package/dist/fonts/PPSupplySans-Regular.otf +0 -0
  152. package/dist/fonts/PPSupplySans-Ultralight.otf +0 -0
  153. package/dist/hooks/index.ts +3 -0
  154. package/dist/hooks/use-previous/UsePrevious.stories.tsx +997 -0
  155. package/dist/hooks/use-previous/index.ts +15 -0
  156. package/dist/hooks/use-previous/meta.ts +6 -0
  157. package/dist/hooks/use-standalone-pagination/UseStandalonePagination.stories.tsx +983 -0
  158. package/dist/hooks/use-standalone-pagination/index.ts +146 -0
  159. package/dist/hooks/use-standalone-pagination/meta.ts +6 -0
  160. package/dist/icons/Icons.stories.tsx +29 -0
  161. package/dist/icons/alert-icon/AlertIcon.stories.tsx +991 -0
  162. package/dist/icons/alert-icon/index.tsx +48 -0
  163. package/dist/icons/alert-icon/meta.ts +8 -0
  164. package/dist/icons/all-icons.tsx +738 -0
  165. package/dist/icons/angle-down-icon/AngleDownIcon.stories.tsx +1031 -0
  166. package/dist/icons/angle-down-icon/index.tsx +25 -0
  167. package/dist/icons/angle-down-icon/meta.ts +8 -0
  168. package/dist/icons/arrow-box-left-icon/ArrowBoxLeftIcon.stories.tsx +1080 -0
  169. package/dist/icons/arrow-box-left-icon/index.tsx +24 -0
  170. package/dist/icons/arrow-box-left-icon/meta.ts +8 -0
  171. package/dist/icons/arrow-right-icon/ArrowRightIcon.stories.tsx +1151 -0
  172. package/dist/icons/arrow-right-icon/index.tsx +26 -0
  173. package/dist/icons/arrow-right-icon/meta.ts +8 -0
  174. package/dist/icons/arrow-right-up-icon/ArrowRightUpIcon.stories.tsx +1273 -0
  175. package/dist/icons/arrow-right-up-icon/index.tsx +24 -0
  176. package/dist/icons/arrow-right-up-icon/meta.ts +8 -0
  177. package/dist/icons/art-board-icon/ArtBoardIcon.stories.tsx +670 -0
  178. package/dist/icons/art-board-icon/index.tsx +24 -0
  179. package/dist/icons/art-board-icon/meta.ts +7 -0
  180. package/dist/icons/audio-bar-icon/AudioBarIcon.stories.tsx +1244 -0
  181. package/dist/icons/audio-bar-icon/index.tsx +19 -0
  182. package/dist/icons/audio-bar-icon/meta.ts +8 -0
  183. package/dist/icons/bubble-check-icon/BubbleCheckIcon.stories.tsx +1239 -0
  184. package/dist/icons/bubble-check-icon/index.tsx +24 -0
  185. package/dist/icons/bubble-check-icon/meta.ts +8 -0
  186. package/dist/icons/bubble-crossed-icon/BubbleCrossedIcon.stories.tsx +1228 -0
  187. package/dist/icons/bubble-crossed-icon/index.tsx +24 -0
  188. package/dist/icons/bubble-crossed-icon/meta.ts +8 -0
  189. package/dist/icons/bubble-sparkle-icon/BubbleSparkleIcon.stories.tsx +912 -0
  190. package/dist/icons/bubble-sparkle-icon/index.tsx +26 -0
  191. package/dist/icons/bubble-sparkle-icon/meta.ts +8 -0
  192. package/dist/icons/chevron-double-left-icon/ChevronDoubleLeftIcon.stories.tsx +1021 -0
  193. package/dist/icons/chevron-double-left-icon/index.tsx +34 -0
  194. package/dist/icons/chevron-double-left-icon/meta.ts +8 -0
  195. package/dist/icons/chevron-double-right-icon/ChevronDoubleRightIcon.stories.tsx +1021 -0
  196. package/dist/icons/chevron-double-right-icon/index.tsx +34 -0
  197. package/dist/icons/chevron-double-right-icon/meta.ts +8 -0
  198. package/dist/icons/chevron-down-icon/ChevronDownIcon.stories.tsx +1001 -0
  199. package/dist/icons/chevron-down-icon/index.tsx +27 -0
  200. package/dist/icons/chevron-down-icon/meta.ts +8 -0
  201. package/dist/icons/chevron-left-icon/ChevronLeftIcon.stories.tsx +1029 -0
  202. package/dist/icons/chevron-left-icon/index.tsx +27 -0
  203. package/dist/icons/chevron-left-icon/meta.ts +8 -0
  204. package/dist/icons/chevron-right-icon/ChevronRightIcon.stories.tsx +1021 -0
  205. package/dist/icons/chevron-right-icon/index.tsx +27 -0
  206. package/dist/icons/chevron-right-icon/meta.ts +8 -0
  207. package/dist/icons/chevron-up-icon/ChevronUpIcon.stories.tsx +1036 -0
  208. package/dist/icons/chevron-up-icon/index.tsx +27 -0
  209. package/dist/icons/chevron-up-icon/meta.ts +8 -0
  210. package/dist/icons/command-icon/CommandIcon.stories.tsx +1098 -0
  211. package/dist/icons/command-icon/index.tsx +24 -0
  212. package/dist/icons/command-icon/meta.ts +8 -0
  213. package/dist/icons/cross-circle-icon/CrossCircleIcon.stories.tsx +1061 -0
  214. package/dist/icons/cross-circle-icon/index.tsx +23 -0
  215. package/dist/icons/cross-circle-icon/meta.ts +8 -0
  216. package/dist/icons/cross-icon/CrossIcon.stories.tsx +1027 -0
  217. package/dist/icons/cross-icon/index.tsx +24 -0
  218. package/dist/icons/cross-icon/meta.ts +8 -0
  219. package/dist/icons/edit-big-icon/EditBigIcon.stories.tsx +1092 -0
  220. package/dist/icons/edit-big-icon/index.tsx +22 -0
  221. package/dist/icons/edit-big-icon/meta.ts +8 -0
  222. package/dist/icons/eye-close-icon/EyeCloseIcon.stories.tsx +1090 -0
  223. package/dist/icons/eye-close-icon/index.tsx +26 -0
  224. package/dist/icons/eye-close-icon/meta.ts +8 -0
  225. package/dist/icons/eye-open-icon/EyeOpenIcon.stories.tsx +1098 -0
  226. package/dist/icons/eye-open-icon/index.tsx +24 -0
  227. package/dist/icons/eye-open-icon/meta.ts +8 -0
  228. package/dist/icons/feature-shine-icon/FeatureShineIcon.stories.tsx +1071 -0
  229. package/dist/icons/feature-shine-icon/index.tsx +29 -0
  230. package/dist/icons/feature-shine-icon/meta.ts +8 -0
  231. package/dist/icons/file-chart-icon/FileChartIcon.stories.tsx +1115 -0
  232. package/dist/icons/file-chart-icon/index.tsx +24 -0
  233. package/dist/icons/file-chart-icon/meta.ts +8 -0
  234. package/dist/icons/file-text-icon/FileTextIcon.stories.tsx +668 -0
  235. package/dist/icons/file-text-icon/index.tsx +24 -0
  236. package/dist/icons/file-text-icon/meta.ts +8 -0
  237. package/dist/icons/grip-vertical-icon/GripVerticalIcon.stories.tsx +1239 -0
  238. package/dist/icons/grip-vertical-icon/index.tsx +28 -0
  239. package/dist/icons/grip-vertical-icon/meta.ts +8 -0
  240. package/dist/icons/image-icon/ImageIcon.stories.tsx +1181 -0
  241. package/dist/icons/image-icon/index.tsx +24 -0
  242. package/dist/icons/image-icon/meta.ts +8 -0
  243. package/dist/icons/import-folder-icon/ImportFolderIcon.stories.tsx +1248 -0
  244. package/dist/icons/import-folder-icon/index.tsx +22 -0
  245. package/dist/icons/import-folder-icon/meta.ts +8 -0
  246. package/dist/icons/index.ts +46 -0
  247. package/dist/icons/light-bulb-simple-icon/LightBulbSimpleIcon.stories.tsx +1272 -0
  248. package/dist/icons/light-bulb-simple-icon/index.tsx +24 -0
  249. package/dist/icons/light-bulb-simple-icon/meta.ts +8 -0
  250. package/dist/icons/magic-book-icon/MagicBookIcon.stories.tsx +1245 -0
  251. package/dist/icons/magic-book-icon/index.tsx +32 -0
  252. package/dist/icons/magic-book-icon/meta.ts +8 -0
  253. package/dist/icons/maintenance-icon/MaintenanceIcon.stories.tsx +1251 -0
  254. package/dist/icons/maintenance-icon/index.tsx +23 -0
  255. package/dist/icons/maintenance-icon/meta.ts +8 -0
  256. package/dist/icons/message-icon/MessageIcon.stories.tsx +595 -0
  257. package/dist/icons/message-icon/index.tsx +30 -0
  258. package/dist/icons/message-icon/meta.ts +8 -0
  259. package/dist/icons/move-horizontal-icon/MoveHorizontalIcon.stories.tsx +1245 -0
  260. package/dist/icons/move-horizontal-icon/index.tsx +23 -0
  261. package/dist/icons/move-horizontal-icon/meta.ts +8 -0
  262. package/dist/icons/move-vertical-icon/MoveVerticalIcon.stories.tsx +1196 -0
  263. package/dist/icons/move-vertical-icon/index.tsx +23 -0
  264. package/dist/icons/move-vertical-icon/meta.ts +8 -0
  265. package/dist/icons/page-search-icon/PageSearchIcon.stories.tsx +1167 -0
  266. package/dist/icons/page-search-icon/index.tsx +21 -0
  267. package/dist/icons/page-search-icon/meta.ts +8 -0
  268. package/dist/icons/pencil-icon/PencilIcon.stories.tsx +1131 -0
  269. package/dist/icons/pencil-icon/index.tsx +21 -0
  270. package/dist/icons/pencil-icon/meta.ts +8 -0
  271. package/dist/icons/plus-icon/PlusIcon.stories.tsx +1151 -0
  272. package/dist/icons/plus-icon/index.tsx +24 -0
  273. package/dist/icons/plus-icon/meta.ts +8 -0
  274. package/dist/icons/search-icon/SearchIcon.stories.tsx +1181 -0
  275. package/dist/icons/search-icon/index.tsx +24 -0
  276. package/dist/icons/search-icon/meta.ts +8 -0
  277. package/dist/icons/site-logo-icon/SiteLogoIcon.stories.tsx +1167 -0
  278. package/dist/icons/site-logo-icon/index.tsx +79 -0
  279. package/dist/icons/site-logo-icon/meta.ts +8 -0
  280. package/dist/icons/spinner-gradient-icon/SpinnerGradientIcon.stories.tsx +637 -0
  281. package/dist/icons/spinner-gradient-icon/index.tsx +53 -0
  282. package/dist/icons/spinner-gradient-icon/meta.ts +8 -0
  283. package/dist/icons/spinner-solid-icon/SpinnerSolidIcon.stories.tsx +644 -0
  284. package/dist/icons/spinner-solid-icon/index.tsx +59 -0
  285. package/dist/icons/spinner-solid-icon/meta.ts +8 -0
  286. package/dist/icons/spinner-solid-neutral-icon/SpinnerSolidINeutralcon.stories.tsx +736 -0
  287. package/dist/icons/spinner-solid-neutral-icon/index.tsx +53 -0
  288. package/dist/icons/spinner-solid-neutral-icon/meta.ts +8 -0
  289. package/dist/icons/tick-circle-icon/TickCircleIcon.stories.tsx +1204 -0
  290. package/dist/icons/tick-circle-icon/index.tsx +23 -0
  291. package/dist/icons/tick-circle-icon/meta.ts +8 -0
  292. package/dist/icons/tick-icon/TickIcon.stories.tsx +1340 -0
  293. package/dist/icons/tick-icon/index.tsx +24 -0
  294. package/dist/icons/tick-icon/meta.ts +8 -0
  295. package/dist/icons/trash-icon/TrashIcon.stories.tsx +996 -0
  296. package/dist/icons/trash-icon/index.tsx +24 -0
  297. package/dist/icons/trash-icon/meta.ts +8 -0
  298. package/dist/icons/upload-icon/UploadIcon.stories.tsx +947 -0
  299. package/dist/icons/upload-icon/index.tsx +24 -0
  300. package/dist/icons/upload-icon/meta.ts +8 -0
  301. package/dist/icons/vertical-menu-icon/VerticalMenuIcon.stories.tsx +1045 -0
  302. package/dist/icons/vertical-menu-icon/index.tsx +27 -0
  303. package/dist/icons/vertical-menu-icon/meta.ts +8 -0
  304. package/dist/index.d.ts +6 -0
  305. package/dist/index.js +206 -0
  306. package/dist/lib/utils.ts +6 -0
  307. package/dist/styles/aural-theme.css +1008 -0
  308. package/package.json +142 -0
@@ -0,0 +1,85 @@
1
+ import React from "react"
2
+ import { Button } from "@components/button"
3
+ import Label from "@components/label"
4
+ import type { Meta, StoryObj } from "@storybook/react"
5
+
6
+ import { Switch } from "."
7
+
8
+ const meta: Meta<typeof Switch> = {
9
+ title: "Components/UI/Switch",
10
+ component: Switch,
11
+ parameters: {
12
+ layout: "centered",
13
+ },
14
+ tags: ["autodocs"],
15
+ argTypes: {
16
+ checked: {
17
+ control: { type: "boolean" },
18
+ description: "Whether the switch is checked or not",
19
+ },
20
+ disabled: {
21
+ control: { type: "boolean" },
22
+ description: "Whether the switch is disabled or not",
23
+ },
24
+ },
25
+ }
26
+
27
+ export default meta
28
+ type Story = StoryObj<typeof Switch>
29
+
30
+ export const Default: Story = {
31
+ args: {
32
+ checked: false,
33
+ },
34
+ }
35
+
36
+ export const Checked: Story = {
37
+ args: {
38
+ checked: true,
39
+ },
40
+ }
41
+
42
+ export const Disabled: Story = {
43
+ args: {
44
+ disabled: true,
45
+ },
46
+ }
47
+
48
+ export const DisabledAndChecked: Story = {
49
+ args: {
50
+ disabled: true,
51
+ checked: true,
52
+ },
53
+ }
54
+
55
+ export const WithLabel: Story = {
56
+ render: () => (
57
+ <div className="flex items-center space-x-2">
58
+ <Switch id="switch-with-label" value="Toggle me" />
59
+ <Label htmlFor="switch-with-label">Toggle me</Label>
60
+ </div>
61
+ ),
62
+ }
63
+
64
+ export const WithForm: Story = {
65
+ render: () => (
66
+ <form
67
+ onSubmit={(e) => {
68
+ e.preventDefault()
69
+ // Handle form submission
70
+ }}
71
+ >
72
+ <div className="grid gap-4">
73
+ <div className="flex items-center space-x-2">
74
+ <Switch id="notifications" />
75
+ <Label htmlFor="notifications">Enable notifications</Label>
76
+ </div>
77
+ <div className="flex items-center space-x-2">
78
+ <Switch id="newsletter" defaultChecked />
79
+ <Label htmlFor="newsletter">Subscribe to newsletter</Label>
80
+ </div>
81
+ <Button>Submit</Button>
82
+ </div>
83
+ </form>
84
+ ),
85
+ }
@@ -0,0 +1,37 @@
1
+ import * as React from "react"
2
+ import { cn } from "@lib/utils"
3
+ import * as SwitchPrimitives from "@radix-ui/react-switch"
4
+
5
+ const Switch = React.forwardRef<
6
+ React.ElementRef<typeof SwitchPrimitives.Root>,
7
+ React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>
8
+ >(({ className, ...props }, ref) => (
9
+ <SwitchPrimitives.Root
10
+ className={cn(
11
+ "data-[state=checked]:not-[:disabled]:border-fm-divider-positive data-[state=checked]:not-[:disabled]:bg-fm-green-50 data-[state=unchecked]:not-[:disabled]:border-fm-divider-primary data-[state=unchecked]:not-[:disabled]:bg-fm-surface-primary data-[state=unchecked]:disabled:border-fm-divider-tertiary data-[state=unchecked]:disabled:bg-fm-surface-secondary data-[state=checked]:disabled:border-fm-green-100 data-[state=checked]:disabled:bg-fm-green-50 focus-visible:ring-fm-primary focus-visible:ring-offset-fm-green-50 hover:bg-fm-surface-secondary data-[state=unchecked]:not-[:disabled]:hover:bg-fm-surface-secondary h-8 w-14 rounded-full border border-solid transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
12
+ "data-[state=unchecked]:not-[:disabled]:hover:border-fm-divider-primary relative disabled:cursor-not-allowed",
13
+ className
14
+ )}
15
+ {...props}
16
+ ref={ref}
17
+ >
18
+ <span
19
+ className="font-fm-brand text-fm-positive data-[disabled=true]:text-fm-positive-tert absolute top-1/2 left-2 -translate-y-1/2 [font-size:var(--text-fm-sm)]"
20
+ data-state={props.checked ? "checked" : "unchecked"}
21
+ data-disabled={props.disabled || undefined}
22
+ >
23
+ ON
24
+ </span>
25
+ <span
26
+ className="font-fm-brand text-fm-tertiary absolute top-1/2 right-1.5 -translate-y-1/2 [font-size:var(--text-fm-sm)]"
27
+ data-state={props.checked ? "checked" : "unchecked"}
28
+ data-disabled={props.disabled || undefined}
29
+ >
30
+ OFF
31
+ </span>
32
+ <SwitchPrimitives.Thumb className="bg-fm-icon-active data-[disabled]:bg-fm-icon-inactive pointer-events-none z-10 block size-6 rounded-full shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-7 data-[state=unchecked]:translate-x-1" />
33
+ </SwitchPrimitives.Root>
34
+ ))
35
+ Switch.displayName = SwitchPrimitives.Root.displayName
36
+
37
+ export { Switch }
@@ -0,0 +1,24 @@
1
+ export const meta = {
2
+ dependencies: {
3
+ "@radix-ui/react-switch": "^1.2.5",
4
+ },
5
+ devDependencies: {},
6
+ internalDependencies: [],
7
+ tokens: [
8
+ "--color-fm-divider-positive",
9
+ "--color-fm-divider-primary",
10
+ "--color-fm-divider-tertiary",
11
+ "--color-fm-green-50",
12
+ "--color-fm-green-100",
13
+ "--color-fm-icon-active",
14
+ "--color-fm-icon-inactive",
15
+ "--color-fm-positive",
16
+ "--color-fm-positive-tert",
17
+ "--color-fm-primary",
18
+ "--color-fm-surface-primary",
19
+ "--color-fm-surface-secondary",
20
+ "--color-fm-tertiary",
21
+ "--font-fm-brand",
22
+ "--text-fm-sm",
23
+ ],
24
+ }
@@ -0,0 +1,209 @@
1
+ import React, { useState } from "react"
2
+ import type { Meta, StoryObj } from "@storybook/react"
3
+
4
+ import { Case, Default, SwitchCase } from "."
5
+
6
+ const meta = {
7
+ title: "Components/Logical/SwitchCase",
8
+ component: SwitchCase,
9
+ parameters: {
10
+ layout: "centered",
11
+ },
12
+ tags: ["autodocs"],
13
+ } satisfies Meta<typeof SwitchCase>
14
+
15
+ export default meta
16
+ type Story = StoryObj<typeof meta>
17
+
18
+ // Basic example with a static case
19
+ export const BasicExample: Story = {
20
+ args: {
21
+ value: "success",
22
+ children: [
23
+ <Case key="loading" value="loading">
24
+ Loading...
25
+ </Case>,
26
+ <Case key="error" value="error">
27
+ An error occurred!
28
+ </Case>,
29
+ <Case key="success" value="success">
30
+ Data loaded successfully!
31
+ </Case>,
32
+ ],
33
+ },
34
+ }
35
+
36
+ // Example with default prop
37
+ export const WithDefaultProp: Story = {
38
+ args: {
39
+ value: "other",
40
+ default: <div style={{ color: "gray" }}>Unknown value selected</div>,
41
+ children: [
42
+ <Case key="one" value="one">
43
+ Option One
44
+ </Case>,
45
+ <Case key="two" value="two">
46
+ Option Two
47
+ </Case>,
48
+ <Case key="three" value="three">
49
+ Option Three
50
+ </Case>,
51
+ ],
52
+ },
53
+ }
54
+
55
+ // Interactive examples using decorators for state
56
+ export const StatusExample: React.FC = () => {
57
+ const [status, setStatus] = useState<
58
+ "loading" | "success" | "error" | "idle"
59
+ >("idle")
60
+
61
+ return (
62
+ <div style={{ width: "300px" }}>
63
+ <div
64
+ style={{
65
+ marginBottom: "20px",
66
+ display: "flex",
67
+ gap: "10px",
68
+ flexWrap: "wrap",
69
+ }}
70
+ >
71
+ <button
72
+ onClick={() => setStatus("loading")}
73
+ style={{ padding: "5px 10px" }}
74
+ >
75
+ Loading
76
+ </button>
77
+ <button
78
+ onClick={() => setStatus("success")}
79
+ style={{ padding: "5px 10px" }}
80
+ >
81
+ Success
82
+ </button>
83
+ <button
84
+ onClick={() => setStatus("error")}
85
+ style={{ padding: "5px 10px" }}
86
+ >
87
+ Error
88
+ </button>
89
+ <button
90
+ onClick={() => setStatus("idle")}
91
+ style={{ padding: "5px 10px" }}
92
+ >
93
+ Idle
94
+ </button>
95
+ </div>
96
+ <div
97
+ style={{
98
+ padding: "20px",
99
+ border: "1px solid #eee",
100
+ borderRadius: "8px",
101
+ }}
102
+ >
103
+ <div>
104
+ Current status: <strong>{status}</strong>
105
+ </div>
106
+ <div style={{ marginTop: "10px" }}>
107
+ <SwitchCase value={status}>
108
+ <Case value="loading">
109
+ <div style={{ color: "blue" }}>
110
+ Loading your data, please wait...
111
+ </div>
112
+ </Case>
113
+ <Case value="success">
114
+ <div style={{ color: "green" }}>
115
+ Your data was loaded successfully!
116
+ </div>
117
+ </Case>
118
+ <Case value="error">
119
+ <div style={{ color: "red" }}>
120
+ An error occurred while loading your data.
121
+ </div>
122
+ </Case>
123
+ <Case value="idle">
124
+ <div style={{ color: "gray" }}>
125
+ Waiting for you to take an action.
126
+ </div>
127
+ </Case>
128
+ </SwitchCase>
129
+ </div>
130
+ </div>
131
+ </div>
132
+ )
133
+ }
134
+
135
+ // Example with Default component
136
+ export const WithDefaultComponent: React.FC = () => {
137
+ const [fruit, setFruit] = useState<"apple" | "banana" | "orange" | "other">(
138
+ "other"
139
+ )
140
+
141
+ return (
142
+ <div style={{ width: "300px" }}>
143
+ <div
144
+ style={{
145
+ marginBottom: "20px",
146
+ display: "flex",
147
+ gap: "10px",
148
+ flexWrap: "wrap",
149
+ }}
150
+ >
151
+ <button
152
+ onClick={() => setFruit("apple")}
153
+ style={{ padding: "5px 10px" }}
154
+ >
155
+ Apple
156
+ </button>
157
+ <button
158
+ onClick={() => setFruit("banana")}
159
+ style={{ padding: "5px 10px" }}
160
+ >
161
+ Banana
162
+ </button>
163
+ <button
164
+ onClick={() => setFruit("orange")}
165
+ style={{ padding: "5px 10px" }}
166
+ >
167
+ Orange
168
+ </button>
169
+ <button
170
+ onClick={() => setFruit("other")}
171
+ style={{ padding: "5px 10px" }}
172
+ >
173
+ Other
174
+ </button>
175
+ </div>
176
+ <div
177
+ style={{
178
+ padding: "20px",
179
+ border: "1px solid #eee",
180
+ borderRadius: "8px",
181
+ }}
182
+ >
183
+ <div>
184
+ Selected fruit: <strong>{fruit}</strong>
185
+ </div>
186
+ <div style={{ marginTop: "10px" }}>
187
+ <SwitchCase value={fruit}>
188
+ <Case value="apple">
189
+ <div style={{ color: "red" }}>🍎 Apples are red and crunchy.</div>
190
+ </Case>
191
+ <Case value="banana">
192
+ <div style={{ color: "#FFD700" }}>
193
+ 🍌 Bananas are yellow and soft.
194
+ </div>
195
+ </Case>
196
+ <Case value="orange">
197
+ <div style={{ color: "orange" }}>
198
+ 🍊 Oranges are orange and juicy.
199
+ </div>
200
+ </Case>
201
+ <Default>
202
+ <div style={{ color: "purple" }}>Unknown fruit selected.</div>
203
+ </Default>
204
+ </SwitchCase>
205
+ </div>
206
+ </div>
207
+ </div>
208
+ )
209
+ }
@@ -0,0 +1,89 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* eslint-disable @typescript-eslint/no-unused-vars */
3
+ import React, { createContext, ReactNode, useContext } from "react"
4
+
5
+ // Create a simple context to check if Case/Default are within a SwitchCase
6
+ const SwitchCaseContext = createContext<boolean>(false)
7
+ interface DefaultProps {
8
+ children: ReactNode
9
+ }
10
+ interface CaseProps extends DefaultProps {
11
+ value: any
12
+ }
13
+ interface SwitchCaseProps extends CaseProps {
14
+ default?: ReactNode
15
+ }
16
+
17
+ export function SwitchCase({
18
+ value,
19
+ children,
20
+ default: defaultContent,
21
+ }: SwitchCaseProps) {
22
+ // Track if any Case has matched
23
+ let hasMatch = false
24
+ let renderedContent: React.ReactNode = null
25
+ let hasDefaultComponent = false
26
+
27
+ // Process children to find matches and default components
28
+ React.Children.forEach(children, (child) => {
29
+ if (!React.isValidElement(child)) return
30
+
31
+ // Handle Case components
32
+ if (child.type === Case) {
33
+ if (
34
+ React.isValidElement<CaseProps>(child) &&
35
+ child.props.value === value &&
36
+ !hasMatch
37
+ ) {
38
+ hasMatch = true
39
+ renderedContent = (child.props as { children: ReactNode }).children
40
+ }
41
+ }
42
+ // Check for Default component
43
+ else if (child.type === Default) {
44
+ hasDefaultComponent = true
45
+ }
46
+ })
47
+
48
+ // If no match found, look for a Default component
49
+ if (!hasMatch && hasDefaultComponent) {
50
+ React.Children.forEach(children, (child) => {
51
+ if (React.isValidElement(child) && child.type === Default) {
52
+ renderedContent = (child.props as { children: ReactNode }).children
53
+ }
54
+ })
55
+ }
56
+
57
+ // If no match and no Default component, use the defaultContent
58
+ if (!hasMatch && !hasDefaultComponent && defaultContent) {
59
+ renderedContent = defaultContent
60
+ }
61
+
62
+ return (
63
+ <SwitchCaseContext.Provider value={true}>
64
+ {renderedContent}
65
+ </SwitchCaseContext.Provider>
66
+ )
67
+ }
68
+
69
+ export function Case({ value, children }: CaseProps) {
70
+ const insideSwitchCase = useContext(SwitchCaseContext)
71
+
72
+ if (!insideSwitchCase) {
73
+ throw new Error("Case must be used within a SwitchCase component")
74
+ }
75
+
76
+ // This component doesn't render directly - it's processed by SwitchCase
77
+ return null
78
+ }
79
+
80
+ export function Default({ children }: DefaultProps) {
81
+ const insideSwitchCase = useContext(SwitchCaseContext)
82
+
83
+ if (!insideSwitchCase) {
84
+ throw new Error("Default must be used within a SwitchCase component")
85
+ }
86
+
87
+ // This component doesn't render directly - it's processed by SwitchCase
88
+ return null
89
+ }
@@ -0,0 +1,6 @@
1
+ export const meta = {
2
+ dependencies: {},
3
+ devDependencies: {},
4
+ internalDependencies: [],
5
+ tokens: [],
6
+ }