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,181 @@
1
+ import * as React from "react"
2
+ import { AudioBarIcon } from "@icons/audio-bar-icon"
3
+ import { cn } from "@lib/utils"
4
+ import * as SeparatorPrimitive from "@radix-ui/react-separator"
5
+ import { cva } from "class-variance-authority"
6
+
7
+ const dividerVariants = cva("flex-auto", {
8
+ variants: {
9
+ variant: {
10
+ primary: "bg-fm-divider-secondary",
11
+ secondary: "bg-fm-divider-tertiary",
12
+ stylised: "bg-fm-divider-primary",
13
+ dashed: "border-fm-divider-primary border-dashed bg-transparent",
14
+ },
15
+ size: {
16
+ half_default: "",
17
+ full_default: "",
18
+ full_medium: "",
19
+ full_large: "",
20
+ },
21
+ orientation: {
22
+ horizontal: "mx-auto",
23
+ vertical: "my-auto",
24
+ },
25
+ },
26
+ compoundVariants: [
27
+ // Horizontal orientation variants
28
+ {
29
+ orientation: "horizontal",
30
+ size: "half_default",
31
+ className: "h-0.25 w-1/2",
32
+ },
33
+ {
34
+ orientation: "horizontal",
35
+ size: "full_default",
36
+ className: "h-0.25 w-full",
37
+ },
38
+ {
39
+ orientation: "horizontal",
40
+ size: "full_medium",
41
+ className: "h-1 w-full",
42
+ },
43
+ {
44
+ orientation: "horizontal",
45
+ size: "full_large",
46
+ className: "h-2 w-full",
47
+ },
48
+ // Vertical orientation variants
49
+ {
50
+ orientation: "vertical",
51
+ size: "half_default",
52
+ className: "h-1/2 w-0.25",
53
+ },
54
+ {
55
+ orientation: "vertical",
56
+ size: "full_default",
57
+ className: "h-full w-0.25",
58
+ },
59
+ {
60
+ orientation: "vertical",
61
+ size: "full_medium",
62
+ className: "h-full w-1",
63
+ },
64
+ {
65
+ orientation: "vertical",
66
+ size: "full_large",
67
+ className: "h-full w-2",
68
+ },
69
+ // Dashed variant specific styles
70
+ {
71
+ variant: "dashed",
72
+ orientation: "horizontal",
73
+ size: "half_default",
74
+ className: "w-1/2 border-t",
75
+ },
76
+ {
77
+ variant: "dashed",
78
+ orientation: "horizontal",
79
+ size: "full_default",
80
+ className: "w-full border-t",
81
+ },
82
+ {
83
+ variant: "dashed",
84
+ orientation: "horizontal",
85
+ size: "full_medium",
86
+ className: "w-full border-t-2",
87
+ },
88
+ {
89
+ variant: "dashed",
90
+ orientation: "horizontal",
91
+ size: "full_large",
92
+ className: "w-full border-t-4",
93
+ },
94
+ {
95
+ variant: "dashed",
96
+ orientation: "vertical",
97
+ size: "half_default",
98
+ className: "h-1/2 border-l",
99
+ },
100
+ {
101
+ variant: "dashed",
102
+ orientation: "vertical",
103
+ size: "full_default",
104
+ className: "h-full border-l",
105
+ },
106
+ {
107
+ variant: "dashed",
108
+ orientation: "vertical",
109
+ size: "full_medium",
110
+ className: "h-full border-l-2",
111
+ },
112
+ {
113
+ variant: "dashed",
114
+ orientation: "vertical",
115
+ size: "full_large",
116
+ className: "h-full border-l-4",
117
+ },
118
+ ],
119
+ defaultVariants: {
120
+ variant: "primary",
121
+ size: "full_default",
122
+ orientation: "horizontal",
123
+ },
124
+ })
125
+
126
+ export interface DividerProps
127
+ extends React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root> {
128
+ variant?: "primary" | "secondary" | "stylised" | "dashed"
129
+ size?: "half_default" | "full_default" | "full_medium" | "full_large"
130
+ wrapperClassName?: string
131
+ }
132
+
133
+ const Divider = React.forwardRef<
134
+ React.ElementRef<typeof SeparatorPrimitive.Root>,
135
+ DividerProps
136
+ >(
137
+ (
138
+ {
139
+ className,
140
+ orientation = "horizontal",
141
+ decorative = true,
142
+ variant,
143
+ size,
144
+ wrapperClassName,
145
+ ...props
146
+ },
147
+ ref
148
+ ) => {
149
+ return (
150
+ <div
151
+ className={cn(
152
+ {
153
+ "flex items-center justify-center": variant === "stylised",
154
+ },
155
+ wrapperClassName
156
+ )}
157
+ >
158
+ <SeparatorPrimitive.Root
159
+ ref={ref}
160
+ decorative={decorative}
161
+ orientation={orientation}
162
+ className={cn(
163
+ dividerVariants({
164
+ variant,
165
+ size,
166
+ orientation,
167
+ }),
168
+ className
169
+ )}
170
+ {...props}
171
+ />
172
+ {variant === "stylised" && (
173
+ <AudioBarIcon width={52} height={12} className="relative top-0.25" />
174
+ )}
175
+ </div>
176
+ )
177
+ }
178
+ )
179
+ Divider.displayName = SeparatorPrimitive.Root.displayName
180
+
181
+ export { Divider }
@@ -0,0 +1,12 @@
1
+ export const meta = {
2
+ dependencies: {
3
+ "@radix-ui/react-separator": "^1.1.7",
4
+ },
5
+ devDependencies: {},
6
+ internalDependencies: ["audio-bar-icon"],
7
+ tokens: [
8
+ "--color-fm-divider-primary",
9
+ "--color-fm-divider-secondary",
10
+ "--color-fm-divider-tertiary",
11
+ ],
12
+ }
@@ -0,0 +1,352 @@
1
+ import React from "react"
2
+ import type { Meta, StoryObj } from "@storybook/react"
3
+
4
+ import DotLoader from "."
5
+
6
+ const meta: Meta<typeof DotLoader> = {
7
+ title: "Components/UI/DotLoader",
8
+ component: DotLoader,
9
+ parameters: {
10
+ layout: "centered",
11
+ docs: {
12
+ description: {
13
+ component: `
14
+ # DotLoader
15
+
16
+ A customizable animated dot loader component with three dots that pulse in sequence, built with accessibility in mind.
17
+
18
+ ## Features
19
+ - Smooth pulsing animation with CSS custom properties
20
+ - Customizable colors for normal and active states
21
+ - Optional text label with flexible content support
22
+ - Comprehensive accessibility features (ARIA attributes, screen reader support)
23
+ - Flexible styling with custom classes
24
+ - Dark theme optimized
25
+ - Screen reader announcements with configurable messages
26
+
27
+ ## Accessibility Features
28
+ - \`role="status"\` for proper semantic meaning
29
+ - \`aria-live="polite"\` for non-intrusive screen reader announcements
30
+ - \`aria-busy="true"\` to indicate loading state
31
+ - Hidden descriptive text for screen readers
32
+ - Configurable ARIA labels and loading messages
33
+ - Decorative elements properly hidden from assistive technology
34
+
35
+ ## Usage
36
+ \`\`\`tsx
37
+ import DotLoader from '@/ui/components/dot-loader'
38
+
39
+ // Basic usage
40
+ <DotLoader />
41
+
42
+ // With text
43
+ <DotLoader text="Loading..." />
44
+
45
+ // Custom colors and accessibility
46
+ <DotLoader
47
+ color="var(--color-blue-500)"
48
+ activeDotColor="var(--color-blue-300)"
49
+ text="Processing..."
50
+ ariaLabel="Processing user data"
51
+ loadingMessage="User data is being processed, please wait"
52
+ />
53
+
54
+ // Silent loading (no screen reader announcements)
55
+ <DotLoader
56
+ text="Background sync"
57
+ announceToScreenReader={false}
58
+ />
59
+ \`\`\`
60
+ `,
61
+ },
62
+ },
63
+ backgrounds: {
64
+ default: "dark",
65
+ values: [
66
+ { name: "dark", value: "#1a1a1a" },
67
+ { name: "light", value: "#ffffff" },
68
+ ],
69
+ },
70
+ },
71
+ argTypes: {
72
+ text: {
73
+ control: "text",
74
+ description:
75
+ "Optional text to display below the loader (supports React nodes)",
76
+ },
77
+ color: {
78
+ control: "color",
79
+ description: "Color of the inactive dots",
80
+ },
81
+ activeDotColor: {
82
+ control: "color",
83
+ description: "Color of the active/pulsing dot",
84
+ },
85
+ className: {
86
+ control: "text",
87
+ description: "Additional CSS classes for the root element",
88
+ },
89
+ classes: {
90
+ control: "object",
91
+ description:
92
+ "Object containing custom classes for different parts (root, dot, text)",
93
+ },
94
+ ariaLabel: {
95
+ control: "text",
96
+ description: "Accessible label for screen readers",
97
+ },
98
+ announceToScreenReader: {
99
+ control: "boolean",
100
+ description: "Whether to announce loading state to screen readers",
101
+ },
102
+ loadingMessage: {
103
+ control: "text",
104
+ description: "Custom loading message for screen readers",
105
+ },
106
+ },
107
+ tags: ["autodocs"],
108
+ }
109
+
110
+ export default meta
111
+ type Story = StoryObj<typeof meta>
112
+
113
+ // Default story
114
+ export const Default: Story = {
115
+ args: {},
116
+ }
117
+
118
+ // With text
119
+ export const WithText: Story = {
120
+ args: {
121
+ text: "Loading...",
122
+ },
123
+ }
124
+
125
+ // Custom colors
126
+ export const CustomColors: Story = {
127
+ args: {
128
+ text: "Processing...",
129
+ color: "#64748b",
130
+ activeDotColor: "#3b82f6",
131
+ },
132
+ }
133
+
134
+ // Brand colors
135
+ export const BrandColors: Story = {
136
+ args: {
137
+ text: "Please wait",
138
+ color: "var(--color-fm-secondary-800)",
139
+ activeDotColor: "var(--color-fm-secondary-500)",
140
+ },
141
+ }
142
+
143
+ // Accessibility focused story
144
+ export const AccessibilityFeatures: Story = {
145
+ args: {
146
+ text: "Loading user profile",
147
+ ariaLabel: "Loading user profile data",
148
+ loadingMessage: "User profile data is being loaded, please wait",
149
+ announceToScreenReader: true,
150
+ },
151
+ parameters: {
152
+ docs: {
153
+ description: {
154
+ story:
155
+ "Demonstrates accessibility features with custom ARIA labels and screen reader messages.",
156
+ },
157
+ },
158
+ },
159
+ }
160
+
161
+ // Silent loading (no screen reader announcements)
162
+ export const SilentLoading: Story = {
163
+ args: {
164
+ text: "Background sync",
165
+ announceToScreenReader: false,
166
+ ariaLabel: "Background synchronization",
167
+ },
168
+ parameters: {
169
+ docs: {
170
+ description: {
171
+ story:
172
+ "Example of a loader that doesn't announce to screen readers, useful for background processes.",
173
+ },
174
+ },
175
+ },
176
+ }
177
+
178
+ // Large with custom styling
179
+ export const CustomStyling: Story = {
180
+ args: {
181
+ text: "Loading your content...",
182
+ className: "p-8",
183
+ classes: {
184
+ root: "bg-slate-800 rounded-lg p-6",
185
+ dot: "scale-150",
186
+ text: "text-slate-300 text-lg font-semibold",
187
+ },
188
+ ariaLabel: "Loading content",
189
+ loadingMessage: "Content is being loaded with custom styling",
190
+ },
191
+ }
192
+
193
+ // Different color variations
194
+ export const ColorVariations: Story = {
195
+ render: () => (
196
+ <div className="flex flex-col gap-8">
197
+ <div className="text-center">
198
+ <h3 className="mb-4 text-lg text-white">Default Theme</h3>
199
+ <DotLoader text="Loading..." ariaLabel="Loading default content" />
200
+ </div>
201
+
202
+ <div className="text-center">
203
+ <h3 className="mb-4 text-lg text-white">Blue Theme</h3>
204
+ <DotLoader
205
+ text="Processing..."
206
+ color="#1e293b"
207
+ activeDotColor="#3b82f6"
208
+ ariaLabel="Processing data"
209
+ loadingMessage="Data processing in progress"
210
+ />
211
+ </div>
212
+
213
+ <div className="text-center">
214
+ <h3 className="mb-4 text-lg text-white">Green Theme</h3>
215
+ <DotLoader
216
+ text="Uploading..."
217
+ color="#1f2937"
218
+ activeDotColor="#10b981"
219
+ ariaLabel="Uploading files"
220
+ loadingMessage="Files are being uploaded"
221
+ />
222
+ </div>
223
+
224
+ <div className="text-center">
225
+ <h3 className="mb-4 text-lg text-white">Red Theme</h3>
226
+ <DotLoader
227
+ text="Deleting..."
228
+ color="#1f2937"
229
+ activeDotColor="#ef4444"
230
+ ariaLabel="Deleting items"
231
+ loadingMessage="Items are being deleted"
232
+ />
233
+ </div>
234
+ </div>
235
+ ),
236
+ parameters: {
237
+ docs: {
238
+ description: {
239
+ story:
240
+ "Examples of different color combinations for various use cases, each with appropriate accessibility labels.",
241
+ },
242
+ },
243
+ },
244
+ }
245
+
246
+ // Loading states simulation
247
+ export const LoadingStates: Story = {
248
+ render: () => (
249
+ <div className="grid grid-cols-2 gap-8">
250
+ <div className="rounded-lg bg-slate-800 p-6 text-center">
251
+ <h4 className="mb-4 text-sm text-white">File Upload</h4>
252
+ <DotLoader
253
+ text="Uploading files..."
254
+ color="#374151"
255
+ activeDotColor="#06b6d4"
256
+ ariaLabel="File upload in progress"
257
+ loadingMessage="Files are being uploaded to the server"
258
+ />
259
+ </div>
260
+
261
+ <div className="rounded-lg bg-slate-800 p-6 text-center">
262
+ <h4 className="mb-4 text-sm text-white">Data Processing</h4>
263
+ <DotLoader
264
+ text="Processing data..."
265
+ color="#374151"
266
+ activeDotColor="#8b5cf6"
267
+ ariaLabel="Data processing"
268
+ loadingMessage="Your data is being processed"
269
+ />
270
+ </div>
271
+
272
+ <div className="rounded-lg bg-slate-800 p-6 text-center">
273
+ <h4 className="mb-4 text-sm text-white">Authentication</h4>
274
+ <DotLoader
275
+ text="Signing in..."
276
+ color="#374151"
277
+ activeDotColor="#f59e0b"
278
+ ariaLabel="Authentication in progress"
279
+ loadingMessage="Please wait while we sign you in"
280
+ />
281
+ </div>
282
+
283
+ <div className="rounded-lg bg-slate-800 p-6 text-center">
284
+ <h4 className="mb-4 text-sm text-white">Content Loading</h4>
285
+ <DotLoader
286
+ text="Loading content..."
287
+ color="#374151"
288
+ activeDotColor="#10b981"
289
+ ariaLabel="Content loading"
290
+ loadingMessage="Page content is being loaded"
291
+ />
292
+ </div>
293
+ </div>
294
+ ),
295
+ parameters: {
296
+ docs: {
297
+ description: {
298
+ story:
299
+ "Real-world examples of how the loader might be used in different contexts with appropriate accessibility descriptions.",
300
+ },
301
+ },
302
+ },
303
+ }
304
+
305
+ // Complex content example
306
+ export const ComplexContent: Story = {
307
+ args: {
308
+ text: (
309
+ <div className="flex items-center gap-2">
310
+ <span>Loading</span>
311
+ <span className="font-bold text-blue-400">premium</span>
312
+ <span>content...</span>
313
+ </div>
314
+ ),
315
+ ariaLabel: "Loading premium content",
316
+ loadingMessage: "Premium content is being loaded for your account",
317
+ },
318
+ parameters: {
319
+ docs: {
320
+ description: {
321
+ story:
322
+ "Example with complex React node content while maintaining accessibility.",
323
+ },
324
+ },
325
+ },
326
+ }
327
+
328
+ // Playground story for interactive testing
329
+ export const Playground: Story = {
330
+ args: {
331
+ text: "Loading...",
332
+ color: "#64748b",
333
+ activeDotColor: "#3b82f6",
334
+ className: "",
335
+ classes: {
336
+ root: "",
337
+ dot: "",
338
+ text: "",
339
+ },
340
+ ariaLabel: "Loading",
341
+ announceToScreenReader: true,
342
+ loadingMessage: "Content is loading, please wait",
343
+ },
344
+ parameters: {
345
+ docs: {
346
+ description: {
347
+ story:
348
+ "Interactive playground to test all component props including accessibility features.",
349
+ },
350
+ },
351
+ },
352
+ }
@@ -0,0 +1,78 @@
1
+ import React from "react"
2
+ import { cn } from "@lib/utils"
3
+
4
+ interface DotLoaderProps {
5
+ text?: React.ReactNode
6
+ classes?: {
7
+ root?: string
8
+ dot?: string
9
+ text?: string
10
+ }
11
+ className?: string
12
+ color?: string
13
+ activeDotColor?: string
14
+ /** Accessible label for screen readers */
15
+ ariaLabel?: string
16
+ /** Whether to announce loading state to screen readers */
17
+ announceToScreenReader?: boolean
18
+ /** Custom loading message for screen readers */
19
+ loadingMessage?: string
20
+ }
21
+
22
+ const DotLoader = ({
23
+ text,
24
+ classes,
25
+ className,
26
+ color = "var(--color-fm-secondary-800)",
27
+ activeDotColor = "var(--color-fm-secondary-500)",
28
+ ariaLabel = "Loading",
29
+ announceToScreenReader = true,
30
+ loadingMessage = "Content is loading, please wait",
31
+ }: DotLoaderProps) => {
32
+ return (
33
+ <div
34
+ className={cn("flex flex-col items-center", classes?.root, className)}
35
+ role="status"
36
+ aria-label={ariaLabel}
37
+ aria-live={announceToScreenReader ? "polite" : undefined}
38
+ aria-busy="true"
39
+ style={{ color: activeDotColor } as React.CSSProperties}
40
+ >
41
+ <span
42
+ className={cn(
43
+ "animate-fm-shadowPulse relative mx-auto my-4 box-border block size-4 rounded-full",
44
+ classes?.dot
45
+ )}
46
+ style={
47
+ {
48
+ backgroundColor: color,
49
+ boxShadow: `-24px 0 ${color}, 24px 0 ${color}`,
50
+ "--dot-color": color,
51
+ "--active-dot-color": activeDotColor,
52
+ } as React.CSSProperties & {
53
+ "--dot-color": string
54
+ "--active-dot-color": string
55
+ }
56
+ }
57
+ aria-hidden="true"
58
+ />
59
+
60
+ {/* Screen reader text */}
61
+ <span className="sr-only">{loadingMessage}</span>
62
+
63
+ {text && (
64
+ <span
65
+ className={cn(
66
+ "text-fm-sm font-fm-brand leading-fm-sm mt-2",
67
+ classes?.text
68
+ )}
69
+ aria-hidden={announceToScreenReader ? "true" : undefined}
70
+ >
71
+ {text}
72
+ </span>
73
+ )}
74
+ </div>
75
+ )
76
+ }
77
+
78
+ export default DotLoader
@@ -0,0 +1,14 @@
1
+ export const meta = {
2
+ dependencies: {},
3
+ devDependencies: {},
4
+ internalDependencies: [],
5
+ tokens: [
6
+ "--color-fm-secondary-800",
7
+ "--color-fm-secondary-500",
8
+ "--color-fm-divider-tertiary",
9
+ "--animate-fm-shadowPulse",
10
+ "--text-fm-sm",
11
+ "--font-fm-brand",
12
+ "--leading-fm-sm",
13
+ ],
14
+ }