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,42 @@
1
+ import * as React from "react"
2
+ import { cn } from "@lib/utils"
3
+ import * as HoverCardPrimitive from "@radix-ui/react-hover-card"
4
+
5
+ function HoverCard({
6
+ ...props
7
+ }: React.ComponentProps<typeof HoverCardPrimitive.Root>) {
8
+ return <HoverCardPrimitive.Root data-slot="hover-card" {...props} />
9
+ }
10
+
11
+ function HoverCardTrigger({
12
+ ...props
13
+ }: React.ComponentProps<typeof HoverCardPrimitive.Trigger>) {
14
+ return (
15
+ <HoverCardPrimitive.Trigger data-slot="hover-card-trigger" {...props} />
16
+ )
17
+ }
18
+
19
+ function HoverCardContent({
20
+ className,
21
+ align = "center",
22
+ sideOffset = 4,
23
+ ...props
24
+ }: React.ComponentProps<typeof HoverCardPrimitive.Content>) {
25
+ return (
26
+ <HoverCardPrimitive.Portal data-slot="hover-card-portal">
27
+ <HoverCardPrimitive.Content
28
+ data-slot="hover-card-content"
29
+ align={align}
30
+ sideOffset={sideOffset}
31
+ className={cn(
32
+ "bg-fm-surface-frosted/20 text-fm-primary z-50 w-64 origin-(--radix-hover-card-content-transform-origin) rounded-md p-4 shadow-md outline-hidden backdrop-blur-lg",
33
+ "popover-content",
34
+ className
35
+ )}
36
+ {...props}
37
+ />
38
+ </HoverCardPrimitive.Portal>
39
+ )
40
+ }
41
+
42
+ export { HoverCard, HoverCardTrigger, HoverCardContent }
@@ -0,0 +1,12 @@
1
+ export const meta = {
2
+ dependencies: {
3
+ "@radix-ui/react-hover-card": "^1.1.14",
4
+ },
5
+ devDependencies: {},
6
+ internalDependencies: [],
7
+ tokens: [
8
+ "--color-fm-surface-frosted",
9
+ "--color-fm-primary",
10
+ ".popover-content",
11
+ ],
12
+ }
@@ -0,0 +1,252 @@
1
+ import React from "react"
2
+ import { CrossIcon } from "@icons/cross-icon"
3
+ import { FeatureShineIcon } from "@icons/feature-shine-icon"
4
+ import { SearchIcon } from "@icons/search-icon"
5
+ import { type Meta, type StoryObj } from "@storybook/react"
6
+
7
+ import { IconButton } from "."
8
+
9
+ const meta: Meta<typeof IconButton> = {
10
+ title: "Components/UI/IconButton",
11
+ component: IconButton,
12
+ parameters: {
13
+ layout: "centered",
14
+ backgrounds: {
15
+ default: "dark",
16
+ },
17
+ },
18
+ tags: ["autodocs"],
19
+ args: {
20
+ icon: <SearchIcon />,
21
+ label: "Search",
22
+ },
23
+ argTypes: {
24
+ variant: {
25
+ control: "select",
26
+ options: ["background", "ghost", "outlined"],
27
+ },
28
+ size: {
29
+ control: "select",
30
+ options: ["small", "medium", "large"],
31
+ },
32
+ shape: {
33
+ control: "select",
34
+ options: ["circle", "square"],
35
+ },
36
+ disabled: {
37
+ control: "boolean",
38
+ },
39
+ },
40
+ }
41
+
42
+ export default meta
43
+ type Story = StoryObj<typeof IconButton>
44
+
45
+ export const Default: Story = {
46
+ args: {
47
+ label: "Search",
48
+ icon: <SearchIcon />,
49
+ },
50
+ }
51
+
52
+ export const WithBackground: Story = {
53
+ args: {
54
+ label: "Search",
55
+ icon: <SearchIcon />,
56
+ variant: "background",
57
+ },
58
+ render: (args) => (
59
+ <div className="bg-fm-neutral-0 flex flex-col space-y-6 rounded p-8">
60
+ <h2 className="text-fm-yellow-500 text-sm font-bold">WITH BACKGROUND</h2>
61
+
62
+ <div className="flex flex-col space-y-4">
63
+ <div>
64
+ <h3 className="text-fm-primary mb-2">SMALL</h3>
65
+ <div className="flex space-x-4">
66
+ <IconButton {...args} size="small" label="Default" />
67
+ <IconButton {...args} size="small" disabled label="Disabled" />
68
+ </div>
69
+ </div>
70
+
71
+ <div>
72
+ <h3 className="text-fm-primary mb-2">MEDIUM</h3>
73
+ <div className="flex space-x-4">
74
+ <IconButton {...args} size="medium" label="Default" />
75
+ <IconButton {...args} size="medium" disabled label="Disabled" />
76
+ </div>
77
+ </div>
78
+
79
+ <div>
80
+ <h3 className="text-fm-primary mb-2">LARGE</h3>
81
+ <div className="flex space-x-4">
82
+ <IconButton {...args} size="large" label="Default" />
83
+ <IconButton {...args} size="large" disabled label="Disabled" />
84
+ </div>
85
+ </div>
86
+ </div>
87
+ </div>
88
+ ),
89
+ }
90
+
91
+ export const WithoutBackground: Story = {
92
+ args: {
93
+ label: "Search",
94
+ icon: <SearchIcon />,
95
+ variant: "ghost",
96
+ },
97
+ render: (args) => (
98
+ <div className="bg-fm-neutral-0 flex flex-col space-y-6 rounded p-8">
99
+ <h2 className="text-fm-yellow-500 text-sm font-bold">
100
+ WITHOUT BACKGROUND
101
+ </h2>
102
+
103
+ <div className="flex flex-col space-y-4">
104
+ <div>
105
+ <h3 className="text-fm-primary mb-2">SMALL</h3>
106
+ <div className="flex space-x-4">
107
+ <IconButton {...args} size="small" label="Default" />
108
+ <IconButton {...args} size="small" disabled label="Disabled" />
109
+ </div>
110
+ </div>
111
+
112
+ <div>
113
+ <h3 className="text-fm-primary mb-2">MEDIUM</h3>
114
+ <div className="flex space-x-4">
115
+ <IconButton {...args} size="medium" label="Default" />
116
+ <IconButton {...args} size="medium" disabled label="Disabled" />
117
+ </div>
118
+ </div>
119
+
120
+ <div>
121
+ <h3 className="text-fm-primary mb-2">LARGE</h3>
122
+ <div className="flex space-x-4">
123
+ <IconButton {...args} size="large" label="Default" />
124
+ <IconButton {...args} size="large" disabled label="Disabled" />
125
+ </div>
126
+ </div>
127
+ </div>
128
+ </div>
129
+ ),
130
+ }
131
+
132
+ export const Outlined: Story = {
133
+ args: {
134
+ label: "Search",
135
+ icon: <SearchIcon />,
136
+ variant: "outlined",
137
+ },
138
+ render: (args) => (
139
+ <div className="bg-fm-neutral-0 flex flex-col space-y-6 rounded p-8">
140
+ <h2 className="text-fm-yellow-500 text-sm font-bold">OUTLINED</h2>
141
+
142
+ <div className="flex flex-col space-y-4">
143
+ <div>
144
+ <h3 className="text-fm-primary mb-2">SMALL</h3>
145
+ <div className="flex space-x-4">
146
+ <IconButton {...args} size="small" label="Default" />
147
+ <IconButton {...args} size="small" disabled label="Disabled" />
148
+ </div>
149
+ </div>
150
+
151
+ <div>
152
+ <h3 className="text-fm-primary mb-2">MEDIUM</h3>
153
+ <div className="flex space-x-4">
154
+ <IconButton {...args} size="medium" label="Default" />
155
+ <IconButton {...args} size="medium" disabled label="Disabled" />
156
+ </div>
157
+ </div>
158
+
159
+ <div>
160
+ <h3 className="text-fm-primary mb-2">LARGE</h3>
161
+ <div className="flex space-x-4">
162
+ <IconButton {...args} size="large" label="Default" />
163
+ <IconButton {...args} size="large" disabled label="Disabled" />
164
+ </div>
165
+ </div>
166
+ </div>
167
+ </div>
168
+ ),
169
+ }
170
+
171
+ export const DifferentIcons: Story = {
172
+ render: () => (
173
+ <div className="bg-fm-neutral-0 flex flex-col space-y-6 rounded p-8">
174
+ <h2 className="text-fm-yellow-500 text-sm font-bold">ICON VARIATIONS</h2>
175
+
176
+ <div className="flex space-x-4">
177
+ <IconButton variant="background" icon={<SearchIcon />} label="Search" />
178
+ <IconButton variant="background" icon={<CrossIcon />} label="Close" />
179
+ <IconButton
180
+ variant="background"
181
+ icon={<FeatureShineIcon />}
182
+ label="Add"
183
+ />
184
+ </div>
185
+ </div>
186
+ ),
187
+ }
188
+
189
+ export const Shapes: Story = {
190
+ render: () => (
191
+ <div className="bg-fm-neutral-0 flex flex-col space-y-6 rounded p-8">
192
+ <h2 className="text-fm-yellow-500 text-sm font-bold">SHAPES</h2>
193
+
194
+ <div className="flex flex-col space-y-4">
195
+ <div>
196
+ <h3 className="text-fm-primary mb-2">CIRCLE</h3>
197
+ <div className="flex space-x-4">
198
+ <IconButton
199
+ variant="background"
200
+ icon={<SearchIcon />}
201
+ label="Search"
202
+ shape="circle"
203
+ />
204
+ </div>
205
+ </div>
206
+
207
+ <div>
208
+ <h3 className="text-fm-primary mb-2">SQUARE</h3>
209
+ <div className="flex space-x-4">
210
+ <IconButton
211
+ variant="background"
212
+ icon={<SearchIcon />}
213
+ label="Search"
214
+ shape="square"
215
+ />
216
+ </div>
217
+ </div>
218
+ </div>
219
+ </div>
220
+ ),
221
+ }
222
+
223
+ export const Interactive: Story = {
224
+ render: () => (
225
+ <div className="bg-fm-neutral-0 flex flex-col space-y-6 rounded p-8">
226
+ <h2 className="text-fm-yellow-500 text-sm font-bold">
227
+ INTERACTIVE EXAMPLES
228
+ </h2>
229
+
230
+ <div className="flex space-x-4">
231
+ <IconButton
232
+ variant="background"
233
+ icon={<SearchIcon />}
234
+ label="Search"
235
+ onClick={() => alert("Search clicked")}
236
+ />
237
+ <IconButton
238
+ variant="ghost"
239
+ icon={<CrossIcon />}
240
+ label="Close"
241
+ onClick={() => alert("Close clicked")}
242
+ />
243
+ <IconButton
244
+ variant="outlined"
245
+ icon={<FeatureShineIcon />}
246
+ label="Add"
247
+ onClick={() => alert("Add clicked")}
248
+ />
249
+ </div>
250
+ </div>
251
+ ),
252
+ }
@@ -0,0 +1,130 @@
1
+ import React, { forwardRef } from "react"
2
+ import { cn } from "@lib/utils"
3
+ import { AccessibleIcon } from "@radix-ui/react-accessible-icon"
4
+ import { cva, type VariantProps } from "class-variance-authority"
5
+
6
+ // Define variants with class-variance-authority
7
+ const iconButtonVariants = cva(
8
+ // Base styles for all icon buttons
9
+ "inline-flex items-center justify-center transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-fm-primary focus-visible:ring-offset-fm-neutral-0",
10
+ {
11
+ variants: {
12
+ variant: {
13
+ // With background variants
14
+ background:
15
+ "bg-fm-button-fill-secondary hover:bg-fm-neutral-300 disabled:bg-fm-surface-secondary",
16
+ // Without background variants
17
+ ghost:
18
+ "bg-transparent hover:bg-fm-button-shadow-secondary disabled:bg-transparent",
19
+ // Outlined variants
20
+ outlined:
21
+ "border border-solid border-fm-divider-primary hover:border-fm-button-stroke disabled:border-fm-divider-tertiary",
22
+ },
23
+ size: {
24
+ small: "size-8", // 32px
25
+ medium: "size-11", // 44px
26
+ large: "size-14", // 56px
27
+ },
28
+ shape: {
29
+ square: "rounded-fm-s",
30
+ circle: "rounded-full",
31
+ },
32
+ disabled: {
33
+ true: "cursor-not-allowed",
34
+ false: "cursor-pointer",
35
+ },
36
+ },
37
+ defaultVariants: {
38
+ variant: "background",
39
+ size: "medium",
40
+ shape: "circle",
41
+ disabled: false,
42
+ },
43
+ }
44
+ )
45
+
46
+ // Determine the icon size based on button size
47
+ export const getIconSize = (size: "small" | "large" | "medium") => {
48
+ switch (size) {
49
+ case "small":
50
+ return 16
51
+ case "large":
52
+ return 32
53
+ case "medium":
54
+ return 20
55
+ default:
56
+ return 20
57
+ }
58
+ }
59
+
60
+ export interface IconButtonProps
61
+ extends React.ButtonHTMLAttributes<HTMLButtonElement>,
62
+ Omit<VariantProps<typeof iconButtonVariants>, "disabled"> {
63
+ icon: React.ReactNode | SVGSVGElement
64
+ label: string // Accessible label for the button
65
+ className?: string
66
+ }
67
+
68
+ const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(
69
+ (
70
+ {
71
+ className,
72
+ variant,
73
+ size,
74
+ shape,
75
+ disabled = false,
76
+ icon,
77
+ label,
78
+ type = "button",
79
+ children,
80
+ ...props
81
+ },
82
+ ref
83
+ ) => {
84
+ const iconSize = getIconSize(size ?? "medium")
85
+
86
+ return (
87
+ <button
88
+ type={type}
89
+ disabled={disabled}
90
+ className={cn(
91
+ iconButtonVariants({
92
+ variant,
93
+ size,
94
+ shape,
95
+ disabled,
96
+ className,
97
+ })
98
+ )}
99
+ ref={ref}
100
+ aria-label={label}
101
+ {...props}
102
+ >
103
+ {React.isValidElement(children) && children}
104
+ {React.isValidElement(icon) && (
105
+ <AccessibleIcon label={label}>
106
+ {/* Clone the icon with the size props if it's an SVG */}
107
+
108
+ {React.cloneElement(icon, {
109
+ width:
110
+ (icon.props as React.SVGProps<SVGSVGElement>).width || iconSize,
111
+ height:
112
+ (icon.props as React.SVGProps<SVGSVGElement>).height ||
113
+ iconSize,
114
+ className: cn(
115
+ "text-fm-icon-active",
116
+ disabled && "text-fm-icon-inactive",
117
+ (icon.props as React.SVGProps<SVGSVGElement>).className
118
+ ),
119
+ ...(icon.props as React.SVGProps<SVGSVGElement>),
120
+ })}
121
+ </AccessibleIcon>
122
+ )}
123
+ </button>
124
+ )
125
+ }
126
+ )
127
+
128
+ IconButton.displayName = "IconButton"
129
+
130
+ export { IconButton, iconButtonVariants }
@@ -0,0 +1,20 @@
1
+ export const meta = {
2
+ dependencies: {
3
+ "@radix-ui/react-accessible-icon": "^1.1.7",
4
+ },
5
+ devDependencies: {},
6
+ internalDependencies: [],
7
+ tokens: [
8
+ "--color-fm-button-fill-secondary",
9
+ "--color-fm-button-shadow-secondary",
10
+ "--color-fm-button-stroke",
11
+ "--color-fm-divider-primary",
12
+ "--color-fm-divider-tertiary",
13
+ "--color-fm-icon-active",
14
+ "--color-fm-icon-inactive",
15
+ "--color-fm-neutral-0",
16
+ "--color-fm-neutral-300",
17
+ "--color-fm-primary",
18
+ "--color-fm-surface-secondary",
19
+ ],
20
+ }
@@ -0,0 +1,100 @@
1
+ import React from "react"
2
+ import type { Meta, StoryObj } from "@storybook/react"
3
+
4
+ import { Else, If, IfElse } from "."
5
+
6
+ const meta = {
7
+ title: "Components/Logical/IfElse",
8
+ component: IfElse,
9
+ parameters: {
10
+ layout: "centered",
11
+ },
12
+ tags: ["autodocs"],
13
+ } satisfies Meta<typeof IfElse>
14
+
15
+ export default meta
16
+ type Story = StoryObj<typeof meta>
17
+
18
+ // Basic example with condition true
19
+ export const ConditionTrue: Story = {
20
+ args: {
21
+ condition: true,
22
+ if: (
23
+ <div style={{ padding: "10px", color: "green" }}>Condition is true</div>
24
+ ),
25
+ else: (
26
+ <div style={{ padding: "10px", color: "red" }}>Condition is false</div>
27
+ ),
28
+ },
29
+ }
30
+
31
+ // Basic example with condition false
32
+ export const ConditionFalse: Story = {
33
+ args: {
34
+ condition: false,
35
+ if: (
36
+ <div style={{ padding: "10px", color: "green" }}>Condition is true</div>
37
+ ),
38
+ else: (
39
+ <div style={{ padding: "10px", color: "red" }}>Condition is false</div>
40
+ ),
41
+ },
42
+ }
43
+
44
+ // Using child components approach
45
+ export const WithChildComponents: Story = {
46
+ args: {
47
+ condition: true,
48
+ },
49
+ render: () => (
50
+ <IfElse condition={true}>
51
+ <If>
52
+ <div
53
+ style={{
54
+ padding: "10px",
55
+ backgroundColor: "#e6f7ff",
56
+ borderRadius: "4px",
57
+ }}
58
+ >
59
+ <h3>Welcome, User!</h3>
60
+ <p>You are logged in.</p>
61
+ </div>
62
+ </If>
63
+ <Else>
64
+ <div
65
+ style={{
66
+ padding: "10px",
67
+ backgroundColor: "#fff1f0",
68
+ borderRadius: "4px",
69
+ }}
70
+ >
71
+ <h3>Hello, Guest!</h3>
72
+ <p>Please log in to continue.</p>
73
+ </div>
74
+ </Else>
75
+ </IfElse>
76
+ ),
77
+ }
78
+
79
+ // Standalone If component
80
+ export const StandaloneIf: Story = {
81
+ args: {
82
+ condition: true,
83
+ },
84
+ render: () => (
85
+ <div>
86
+ <If condition={true}>
87
+ <div
88
+ style={{
89
+ padding: "10px",
90
+ backgroundColor: "#f6ffed",
91
+ borderRadius: "4px",
92
+ }}
93
+ >
94
+ This content is shown because the condition is true.
95
+ </div>
96
+ </If>
97
+ <div style={{ marginTop: "10px" }}>This content is always shown.</div>
98
+ </div>
99
+ ),
100
+ }
@@ -0,0 +1,56 @@
1
+ import React from "react"
2
+
3
+ interface IfElseContextProps {
4
+ condition: boolean
5
+ }
6
+
7
+ interface IfElseProps extends IfElseContextProps {
8
+ children?: React.ReactNode
9
+ else?: React.ReactNode
10
+ if?: React.ReactNode
11
+ }
12
+
13
+ const IfElseContext = React.createContext<IfElseContextProps>({
14
+ condition: false,
15
+ })
16
+
17
+ export function IfElse({
18
+ condition,
19
+ children,
20
+ else: ElseComponent = null,
21
+ if: IfComponent = null,
22
+ }: IfElseProps): React.ReactNode {
23
+ if (!!ElseComponent || !!IfComponent) {
24
+ if (condition) {
25
+ return IfComponent as React.ReactNode
26
+ }
27
+ return ElseComponent as React.ReactNode
28
+ }
29
+ return (
30
+ <IfElseContext.Provider value={{ condition }}>
31
+ {children}
32
+ </IfElseContext.Provider>
33
+ )
34
+ }
35
+
36
+ export function If({
37
+ children,
38
+ condition: propCondition,
39
+ }: {
40
+ children: React.ReactNode
41
+ condition?: boolean
42
+ }) {
43
+ const context = React.useContext(IfElseContext)
44
+
45
+ if (!context) {
46
+ return propCondition ? children : null
47
+ }
48
+
49
+ const condition = propCondition ?? context.condition
50
+ return condition ? children : null
51
+ }
52
+
53
+ export function Else({ children }: { children: React.ReactNode }) {
54
+ const { condition } = React.useContext(IfElseContext)
55
+ return condition ? null : children
56
+ }
@@ -0,0 +1,6 @@
1
+ export const meta = {
2
+ dependencies: {},
3
+ devDependencies: {},
4
+ internalDependencies: [],
5
+ tokens: [],
6
+ }
@@ -0,0 +1,70 @@
1
+ // Export all components from a single entry point
2
+ export * from "./aspect-ratio"
3
+ export * from "./avatar"
4
+ export * from "./badge"
5
+ export * from "./banner"
6
+ export * from "./button"
7
+ export * from "./card"
8
+ export * from "./char-count"
9
+ export * from "./checkbox"
10
+ export * from "./chip"
11
+ export * from "./collapsible"
12
+ export * from "./command"
13
+ export * from "./dialog"
14
+ export * from "./divider"
15
+ export * from "./dropdown"
16
+ export * from "./form"
17
+ export * from "./helper-text"
18
+ export * from "./hover-card"
19
+ export * from "./icon-button"
20
+ export * from "./if-else"
21
+ export * from "./label"
22
+ export * from "./list"
23
+ export * from "./marquee"
24
+ export * from "./overlay"
25
+ export * from "./pagination"
26
+ export * from "./popover"
27
+ export * from "./radio"
28
+ export * from "./resizable"
29
+ export * from "./scroll-area"
30
+ export * from "./search"
31
+ export * from "./select"
32
+ export * from "./sheet"
33
+ export * from "./skelton"
34
+ export * from "./slider"
35
+ export * from "./stepper"
36
+ export * from "./switch"
37
+ export * from "./switch-case"
38
+ export * from "./table"
39
+ export * from "./tabs"
40
+ export * from "./tag"
41
+ export * from "./toast"
42
+ export * from "./toggle"
43
+ export * from "./tooltip"
44
+ export * from "./typography"
45
+
46
+ // Export input and textarea with their specific exports to avoid conflicts
47
+ export { default as Input } from "./input"
48
+ export type { InputProps, InputVariant, InputComponent } from "./input"
49
+ export {
50
+ InputRoot,
51
+ InputLabel,
52
+ InputWrapper,
53
+ StartIcon,
54
+ EndIcon,
55
+ PasswordToggle,
56
+ InputBase,
57
+ } from "./input"
58
+
59
+ export { default as TextArea } from "./textarea"
60
+ export type {
61
+ TextAreaProps,
62
+ TextAreaVariant,
63
+ TextAreaComponent,
64
+ } from "./textarea"
65
+ export {
66
+ TextAreaRoot,
67
+ TextAreaLabel,
68
+ TextAreaWrapper,
69
+ TextAreaBase,
70
+ } from "./textarea"