@shipfox/react-ui 0.2.0 → 0.4.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 (323) hide show
  1. package/.storybook/preview.tsx +1 -1
  2. package/.turbo/turbo-build.log +2 -2
  3. package/.turbo/turbo-check.log +3 -3
  4. package/.turbo/turbo-type.log +1 -1
  5. package/CHANGELOG.md +17 -0
  6. package/dist/components/alert/alert.d.ts +18 -0
  7. package/dist/components/alert/alert.d.ts.map +1 -0
  8. package/dist/components/alert/alert.js +123 -0
  9. package/dist/components/alert/alert.js.map +1 -0
  10. package/dist/components/alert/alert.stories.js +112 -0
  11. package/dist/components/alert/alert.stories.js.map +1 -0
  12. package/dist/components/alert/index.d.ts +2 -0
  13. package/dist/components/alert/index.d.ts.map +1 -0
  14. package/dist/components/alert/index.js +3 -0
  15. package/dist/components/alert/index.js.map +1 -0
  16. package/dist/components/avatar/avatar-group.d.ts +18 -0
  17. package/dist/components/avatar/avatar-group.d.ts.map +1 -0
  18. package/dist/components/avatar/avatar-group.js +132 -0
  19. package/dist/components/avatar/avatar-group.js.map +1 -0
  20. package/dist/components/avatar/avatar.d.ts +24 -0
  21. package/dist/components/avatar/avatar.d.ts.map +1 -0
  22. package/dist/components/avatar/avatar.js +165 -0
  23. package/dist/components/avatar/avatar.js.map +1 -0
  24. package/dist/components/avatar/avatar.stories.js +267 -0
  25. package/dist/components/avatar/avatar.stories.js.map +1 -0
  26. package/dist/components/avatar/index.d.ts +3 -0
  27. package/dist/components/avatar/index.d.ts.map +1 -0
  28. package/dist/components/avatar/index.js +4 -0
  29. package/dist/components/avatar/index.js.map +1 -0
  30. package/dist/components/badge/badge.d.ts +48 -0
  31. package/dist/components/badge/badge.d.ts.map +1 -0
  32. package/dist/components/badge/badge.js +72 -0
  33. package/dist/components/badge/badge.js.map +1 -0
  34. package/dist/components/badge/badge.stories.js +802 -0
  35. package/dist/components/badge/badge.stories.js.map +1 -0
  36. package/dist/components/badge/icon-badge.d.ts +9 -0
  37. package/dist/components/badge/icon-badge.d.ts.map +1 -0
  38. package/dist/components/badge/icon-badge.js +32 -0
  39. package/dist/components/badge/icon-badge.js.map +1 -0
  40. package/dist/components/badge/index.d.ts +5 -0
  41. package/dist/components/badge/index.d.ts.map +1 -0
  42. package/dist/components/badge/index.js +6 -0
  43. package/dist/components/badge/index.js.map +1 -0
  44. package/dist/components/badge/status-badge.d.ts +9 -0
  45. package/dist/components/badge/status-badge.d.ts.map +1 -0
  46. package/dist/components/badge/status-badge.js +29 -0
  47. package/dist/components/badge/status-badge.js.map +1 -0
  48. package/dist/components/badge/user-badge.d.ts +8 -0
  49. package/dist/components/badge/user-badge.d.ts.map +1 -0
  50. package/dist/components/badge/user-badge.js +24 -0
  51. package/dist/components/badge/user-badge.js.map +1 -0
  52. package/dist/components/{button.d.ts → button/button.d.ts} +1 -1
  53. package/dist/components/button/button.d.ts.map +1 -0
  54. package/dist/components/{button.js → button/button.js} +2 -2
  55. package/dist/components/button/button.js.map +1 -0
  56. package/dist/components/{button.stories.js → button/button.stories.js} +1 -1
  57. package/dist/components/button/button.stories.js.map +1 -0
  58. package/dist/components/button/index.d.ts +2 -0
  59. package/dist/components/button/index.d.ts.map +1 -0
  60. package/dist/components/button/index.js +3 -0
  61. package/dist/components/button/index.js.map +1 -0
  62. package/dist/components/checkbox/checkbox-label.d.ts +14 -0
  63. package/dist/components/checkbox/checkbox-label.d.ts.map +1 -0
  64. package/dist/components/checkbox/checkbox-label.js +82 -0
  65. package/dist/components/checkbox/checkbox-label.js.map +1 -0
  66. package/dist/components/checkbox/checkbox-links.d.ts +18 -0
  67. package/dist/components/checkbox/checkbox-links.d.ts.map +1 -0
  68. package/dist/components/checkbox/checkbox-links.js +58 -0
  69. package/dist/components/checkbox/checkbox-links.js.map +1 -0
  70. package/dist/components/checkbox/checkbox.d.ts +9 -0
  71. package/dist/components/checkbox/checkbox.d.ts.map +1 -0
  72. package/dist/components/checkbox/checkbox.js +49 -0
  73. package/dist/components/checkbox/checkbox.js.map +1 -0
  74. package/dist/components/checkbox/checkbox.stories.js +566 -0
  75. package/dist/components/checkbox/checkbox.stories.js.map +1 -0
  76. package/dist/components/checkbox/index.d.ts +4 -0
  77. package/dist/components/checkbox/index.d.ts.map +1 -0
  78. package/dist/components/checkbox/index.js +5 -0
  79. package/dist/components/checkbox/index.js.map +1 -0
  80. package/dist/components/code-block/code-block-footer.d.ts +26 -0
  81. package/dist/components/code-block/code-block-footer.d.ts.map +1 -0
  82. package/dist/components/code-block/code-block-footer.js +86 -0
  83. package/dist/components/code-block/code-block-footer.js.map +1 -0
  84. package/dist/components/code-block/code-block.d.ts +50 -0
  85. package/dist/components/code-block/code-block.d.ts.map +1 -0
  86. package/dist/components/code-block/code-block.js +142 -0
  87. package/dist/components/code-block/code-block.js.map +1 -0
  88. package/dist/components/code-block/code-block.stories.js +341 -0
  89. package/dist/components/code-block/code-block.stories.js.map +1 -0
  90. package/dist/components/code-block/code-content.d.ts +11 -0
  91. package/dist/components/code-block/code-content.d.ts.map +1 -0
  92. package/dist/components/code-block/code-content.js +29 -0
  93. package/dist/components/code-block/code-content.js.map +1 -0
  94. package/dist/components/code-block/code-copy-button.d.ts +11 -0
  95. package/dist/components/code-block/code-copy-button.d.ts.map +1 -0
  96. package/dist/components/code-block/code-copy-button.js +49 -0
  97. package/dist/components/code-block/code-copy-button.js.map +1 -0
  98. package/dist/components/code-block/code-tabs.d.ts +16 -0
  99. package/dist/components/code-block/code-tabs.d.ts.map +1 -0
  100. package/dist/components/code-block/code-tabs.js +98 -0
  101. package/dist/components/code-block/code-tabs.js.map +1 -0
  102. package/dist/components/code-block/index.d.ts +4 -0
  103. package/dist/components/code-block/index.d.ts.map +1 -0
  104. package/dist/components/code-block/index.js +5 -0
  105. package/dist/components/code-block/index.js.map +1 -0
  106. package/dist/components/dynamic-item/dynamic-item.d.ts +13 -0
  107. package/dist/components/dynamic-item/dynamic-item.d.ts.map +1 -0
  108. package/dist/components/dynamic-item/dynamic-item.js +43 -0
  109. package/dist/components/dynamic-item/dynamic-item.js.map +1 -0
  110. package/dist/components/dynamic-item/dynamic-item.stories.js +375 -0
  111. package/dist/components/dynamic-item/dynamic-item.stories.js.map +1 -0
  112. package/dist/components/dynamic-item/index.d.ts +2 -0
  113. package/dist/components/dynamic-item/index.d.ts.map +1 -0
  114. package/dist/components/dynamic-item/index.js +3 -0
  115. package/dist/components/dynamic-item/index.js.map +1 -0
  116. package/dist/components/icon/custom/index.d.ts +3 -0
  117. package/dist/components/icon/custom/index.d.ts.map +1 -1
  118. package/dist/components/icon/custom/index.js +3 -0
  119. package/dist/components/icon/custom/index.js.map +1 -1
  120. package/dist/components/icon/custom/shipfox-logo.d.ts +8 -0
  121. package/dist/components/icon/custom/shipfox-logo.d.ts.map +1 -0
  122. package/dist/components/icon/custom/shipfox-logo.js +22 -0
  123. package/dist/components/icon/custom/shipfox-logo.js.map +1 -0
  124. package/dist/components/icon/custom/slack-logo.d.ts +6 -0
  125. package/dist/components/icon/custom/slack-logo.d.ts.map +1 -0
  126. package/dist/components/icon/custom/slack-logo.js +34 -0
  127. package/dist/components/icon/custom/slack-logo.js.map +1 -0
  128. package/dist/components/icon/custom/stripe-logo.d.ts +8 -0
  129. package/dist/components/icon/custom/stripe-logo.d.ts.map +1 -0
  130. package/dist/components/icon/custom/stripe-logo.js +24 -0
  131. package/dist/components/icon/custom/stripe-logo.js.map +1 -0
  132. package/dist/components/icon/icon.d.ts +13 -1
  133. package/dist/components/icon/icon.d.ts.map +1 -1
  134. package/dist/components/icon/icon.js +15 -3
  135. package/dist/components/icon/icon.js.map +1 -1
  136. package/dist/components/icon/icon.stories.js +6 -3
  137. package/dist/components/icon/icon.stories.js.map +1 -1
  138. package/dist/components/index.d.ts +12 -1
  139. package/dist/components/index.d.ts.map +1 -1
  140. package/dist/components/index.js +13 -2
  141. package/dist/components/index.js.map +1 -1
  142. package/dist/components/inline-tips/index.d.ts +2 -0
  143. package/dist/components/inline-tips/index.d.ts.map +1 -0
  144. package/dist/components/inline-tips/index.js +3 -0
  145. package/dist/components/inline-tips/index.js.map +1 -0
  146. package/dist/components/inline-tips/inline-tips.d.ts +19 -0
  147. package/dist/components/inline-tips/inline-tips.d.ts.map +1 -0
  148. package/dist/components/inline-tips/inline-tips.js +98 -0
  149. package/dist/components/inline-tips/inline-tips.js.map +1 -0
  150. package/dist/components/inline-tips/inline-tips.stories.js +214 -0
  151. package/dist/components/inline-tips/inline-tips.stories.js.map +1 -0
  152. package/dist/components/input/index.d.ts +2 -0
  153. package/dist/components/input/index.d.ts.map +1 -0
  154. package/dist/components/input/index.js +3 -0
  155. package/dist/components/input/index.js.map +1 -0
  156. package/dist/components/input/input.d.ts.map +1 -0
  157. package/dist/components/{input.js → input/input.js} +2 -2
  158. package/dist/components/input/input.js.map +1 -0
  159. package/dist/components/{input.stories.js → input/input.stories.js} +1 -1
  160. package/dist/components/input/input.stories.js.map +1 -0
  161. package/dist/components/item/index.d.ts +2 -0
  162. package/dist/components/item/index.d.ts.map +1 -0
  163. package/dist/components/item/index.js +3 -0
  164. package/dist/components/item/index.js.map +1 -0
  165. package/dist/components/item/item.d.ts +32 -0
  166. package/dist/components/item/item.d.ts.map +1 -0
  167. package/dist/components/item/item.js +120 -0
  168. package/dist/components/item/item.js.map +1 -0
  169. package/dist/components/item/item.stories.js +232 -0
  170. package/dist/components/item/item.stories.js.map +1 -0
  171. package/dist/components/label/index.d.ts +2 -0
  172. package/dist/components/label/index.d.ts.map +1 -0
  173. package/dist/components/label/index.js +3 -0
  174. package/dist/components/label/index.js.map +1 -0
  175. package/dist/components/label/label.d.ts +7 -0
  176. package/dist/components/label/label.d.ts.map +1 -0
  177. package/dist/components/label/label.js +13 -0
  178. package/dist/components/label/label.js.map +1 -0
  179. package/dist/components/label/label.stories.js +105 -0
  180. package/dist/components/label/label.stories.js.map +1 -0
  181. package/dist/components/moving-border/moving-border.d.ts +9 -0
  182. package/dist/components/moving-border/moving-border.d.ts.map +1 -0
  183. package/dist/components/moving-border/moving-border.js +54 -0
  184. package/dist/components/moving-border/moving-border.js.map +1 -0
  185. package/dist/components/textarea/textarea.js +1 -1
  186. package/dist/components/textarea/textarea.js.map +1 -1
  187. package/dist/components/theme/index.d.ts +2 -0
  188. package/dist/components/theme/index.d.ts.map +1 -0
  189. package/dist/components/theme/index.js +3 -0
  190. package/dist/components/theme/index.js.map +1 -0
  191. package/dist/components/{theme-provider.d.ts → theme/theme-provider.d.ts} +1 -1
  192. package/dist/components/theme/theme-provider.d.ts.map +1 -0
  193. package/dist/components/{theme-provider.js → theme/theme-provider.js} +1 -1
  194. package/dist/components/theme/theme-provider.js.map +1 -0
  195. package/dist/components/toast/index.d.ts +3 -0
  196. package/dist/components/toast/index.d.ts.map +1 -0
  197. package/dist/components/toast/index.js +4 -0
  198. package/dist/components/toast/index.js.map +1 -0
  199. package/dist/components/toast/toast-custom.d.ts +19 -0
  200. package/dist/components/toast/toast-custom.d.ts.map +1 -0
  201. package/dist/components/toast/toast-custom.js +134 -0
  202. package/dist/components/toast/toast-custom.js.map +1 -0
  203. package/dist/components/toast/toast.d.ts +5 -0
  204. package/dist/components/toast/toast.d.ts.map +1 -0
  205. package/dist/components/toast/toast.js +40 -0
  206. package/dist/components/toast/toast.js.map +1 -0
  207. package/dist/components/toast/toast.stories.js +326 -0
  208. package/dist/components/toast/toast.stories.js.map +1 -0
  209. package/dist/components/tooltip/index.d.ts +2 -0
  210. package/dist/components/tooltip/index.d.ts.map +1 -0
  211. package/dist/components/tooltip/index.js +3 -0
  212. package/dist/components/tooltip/index.js.map +1 -0
  213. package/dist/components/tooltip/tooltip.d.ts +20 -0
  214. package/dist/components/tooltip/tooltip.d.ts.map +1 -0
  215. package/dist/components/tooltip/tooltip.js +98 -0
  216. package/dist/components/tooltip/tooltip.js.map +1 -0
  217. package/dist/components/tooltip/tooltip.stories.js +560 -0
  218. package/dist/components/tooltip/tooltip.stories.js.map +1 -0
  219. package/dist/hooks/index.d.ts +3 -0
  220. package/dist/hooks/index.d.ts.map +1 -1
  221. package/dist/hooks/index.js +3 -0
  222. package/dist/hooks/index.js.map +1 -1
  223. package/dist/hooks/useResolvedTheme.d.ts +2 -0
  224. package/dist/hooks/useResolvedTheme.d.ts.map +1 -0
  225. package/dist/hooks/useResolvedTheme.js +24 -0
  226. package/dist/hooks/useResolvedTheme.js.map +1 -0
  227. package/dist/hooks/useShikiHighlight.d.ts +28 -0
  228. package/dist/hooks/useShikiHighlight.d.ts.map +1 -0
  229. package/dist/hooks/useShikiHighlight.js +106 -0
  230. package/dist/hooks/useShikiHighlight.js.map +1 -0
  231. package/dist/hooks/useShikiStyleInjection.d.ts +2 -0
  232. package/dist/hooks/useShikiStyleInjection.d.ts.map +1 -0
  233. package/dist/hooks/useShikiStyleInjection.js +34 -0
  234. package/dist/hooks/useShikiStyleInjection.js.map +1 -0
  235. package/dist/utils/avatar.d.ts +3 -0
  236. package/dist/utils/avatar.d.ts.map +1 -0
  237. package/dist/utils/avatar.js +32 -0
  238. package/dist/utils/avatar.js.map +1 -0
  239. package/dist/utils/index.d.ts +1 -0
  240. package/dist/utils/index.d.ts.map +1 -1
  241. package/dist/utils/index.js +1 -0
  242. package/dist/utils/index.js.map +1 -1
  243. package/index.css +130 -7
  244. package/package.json +7 -4
  245. package/src/assets/illustration-1.svg +92 -0
  246. package/src/assets/illustration-2.svg +14 -0
  247. package/src/assets/illustration-gradient.svg +7049 -0
  248. package/src/components/alert/alert.stories.tsx +77 -0
  249. package/src/components/alert/alert.tsx +144 -0
  250. package/src/components/alert/index.ts +1 -0
  251. package/src/components/avatar/avatar-group.tsx +186 -0
  252. package/src/components/avatar/avatar.stories.tsx +179 -0
  253. package/src/components/avatar/avatar.tsx +219 -0
  254. package/src/components/avatar/index.ts +2 -0
  255. package/src/components/badge/badge.stories.tsx +468 -0
  256. package/src/components/badge/badge.tsx +147 -0
  257. package/src/components/badge/icon-badge.tsx +43 -0
  258. package/src/components/badge/index.ts +4 -0
  259. package/src/components/badge/status-badge.tsx +43 -0
  260. package/src/components/badge/user-badge.tsx +34 -0
  261. package/src/components/{button.tsx → button/button.tsx} +1 -1
  262. package/src/components/button/index.ts +1 -0
  263. package/src/components/checkbox/checkbox-label.tsx +125 -0
  264. package/src/components/checkbox/checkbox-links.tsx +90 -0
  265. package/src/components/checkbox/checkbox.stories.tsx +375 -0
  266. package/src/components/checkbox/checkbox.tsx +71 -0
  267. package/src/components/checkbox/index.ts +3 -0
  268. package/src/components/code-block/code-block-footer.tsx +173 -0
  269. package/src/components/code-block/code-block.stories.tsx +323 -0
  270. package/src/components/code-block/code-block.tsx +283 -0
  271. package/src/components/code-block/code-content.tsx +60 -0
  272. package/src/components/code-block/code-copy-button.tsx +73 -0
  273. package/src/components/code-block/code-tabs.tsx +170 -0
  274. package/src/components/code-block/index.ts +3 -0
  275. package/src/components/dynamic-item/dynamic-item.stories.tsx +261 -0
  276. package/src/components/dynamic-item/dynamic-item.tsx +68 -0
  277. package/src/components/dynamic-item/index.ts +1 -0
  278. package/src/components/icon/custom/index.ts +3 -0
  279. package/src/components/icon/custom/shipfox-logo.tsx +20 -0
  280. package/src/components/icon/custom/slack-logo.tsx +35 -0
  281. package/src/components/icon/custom/stripe-logo.tsx +27 -0
  282. package/src/components/icon/icon.stories.tsx +3 -1
  283. package/src/components/icon/icon.tsx +29 -1
  284. package/src/components/index.ts +12 -1
  285. package/src/components/inline-tips/index.ts +1 -0
  286. package/src/components/inline-tips/inline-tips.stories.tsx +126 -0
  287. package/src/components/inline-tips/inline-tips.tsx +132 -0
  288. package/src/components/input/index.ts +1 -0
  289. package/src/components/{input.tsx → input/input.tsx} +1 -1
  290. package/src/components/item/index.ts +1 -0
  291. package/src/components/item/item.stories.tsx +150 -0
  292. package/src/components/item/item.tsx +182 -0
  293. package/src/components/label/index.ts +1 -0
  294. package/src/components/label/label.stories.tsx +67 -0
  295. package/src/components/label/label.tsx +15 -0
  296. package/src/components/moving-border/moving-border.tsx +67 -0
  297. package/src/components/textarea/textarea.tsx +1 -1
  298. package/src/components/theme/index.ts +1 -0
  299. package/src/components/toast/index.ts +2 -0
  300. package/src/components/toast/toast-custom.tsx +154 -0
  301. package/src/components/toast/toast.stories.tsx +369 -0
  302. package/src/components/toast/toast.tsx +41 -0
  303. package/src/components/tooltip/index.ts +1 -0
  304. package/src/components/tooltip/tooltip.stories.tsx +284 -0
  305. package/src/components/tooltip/tooltip.tsx +121 -0
  306. package/src/hooks/index.ts +3 -0
  307. package/src/hooks/useResolvedTheme.ts +34 -0
  308. package/src/hooks/useShikiHighlight.ts +140 -0
  309. package/src/hooks/useShikiStyleInjection.ts +34 -0
  310. package/src/utils/avatar.ts +27 -0
  311. package/src/utils/index.ts +1 -0
  312. package/dist/components/button.d.ts.map +0 -1
  313. package/dist/components/button.js.map +0 -1
  314. package/dist/components/button.stories.js.map +0 -1
  315. package/dist/components/input.d.ts.map +0 -1
  316. package/dist/components/input.js.map +0 -1
  317. package/dist/components/input.stories.js.map +0 -1
  318. package/dist/components/theme-provider.d.ts.map +0 -1
  319. package/dist/components/theme-provider.js.map +0 -1
  320. /package/dist/components/{input.d.ts → input/input.d.ts} +0 -0
  321. /package/src/components/{button.stories.tsx → button/button.stories.tsx} +0 -0
  322. /package/src/components/{input.stories.tsx → input/input.stories.tsx} +0 -0
  323. /package/src/components/{theme-provider.tsx → theme/theme-provider.tsx} +0 -0
@@ -0,0 +1,165 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import * as AvatarPrimitive from '@radix-ui/react-avatar';
3
+ import { cva } from 'class-variance-authority';
4
+ import { getInitial, getPlaceholderImageUrl } from '../../utils/index.js';
5
+ import { cn } from '../../utils/cn.js';
6
+ import { Icon } from '../icon/icon.js';
7
+ export const avatarVariants = cva('relative flex shrink-0 overflow-hidden bg-background-button-neutral-default text-foreground-neutral-base ring-1 ring-border-neutral-base-component ring-offset-1 ring-offset-background-neutral-base shadow-button-neutral', {
8
+ variants: {
9
+ radius: {
10
+ full: 'rounded-full',
11
+ rounded: 'rounded-6'
12
+ },
13
+ size: {
14
+ '3xs': 'size-[18px]',
15
+ '2xs': 'size-[20px]',
16
+ xs: 'size-[24px]',
17
+ sm: 'size-[28px]',
18
+ md: 'size-[32px]',
19
+ lg: 'size-[36px]',
20
+ xl: 'size-[40px]',
21
+ '2xl': 'size-[80px]',
22
+ '3xl': 'size-[120px]'
23
+ }
24
+ },
25
+ defaultVariants: {
26
+ radius: 'full',
27
+ size: 'md'
28
+ }
29
+ });
30
+ const avatarInnerVariants = cva('flex h-full w-full items-center justify-center', {
31
+ variants: {
32
+ size: {
33
+ '3xs': 'text-[10px] leading-[10px]',
34
+ '2xs': 'text-[11px] leading-[11px]',
35
+ xs: 'text-xs leading-4',
36
+ sm: 'text-xs leading-5',
37
+ md: 'text-sm leading-5',
38
+ lg: 'text-sm leading-5',
39
+ xl: 'text-base leading-6',
40
+ '2xl': 'text-2xl leading-8',
41
+ '3xl': 'text-4xl leading-[56px]'
42
+ }
43
+ },
44
+ defaultVariants: {
45
+ size: 'md'
46
+ }
47
+ });
48
+ const UPLOAD_ICON_SIZE_MAP = {
49
+ '3xs': 'size-[10px]',
50
+ '2xs': 'size-[12px]',
51
+ xs: 'size-[14px]',
52
+ sm: 'size-[16px]',
53
+ md: 'size-[18px]',
54
+ lg: 'size-[20px]',
55
+ xl: 'size-[24px]',
56
+ '2xl': 'size-[40px]',
57
+ '3xl': 'size-[60px]'
58
+ };
59
+ function AvatarRoot({ className, radius, size, ...props }) {
60
+ return /*#__PURE__*/ _jsx(AvatarPrimitive.Root, {
61
+ "data-slot": "avatar",
62
+ className: cn(avatarVariants({
63
+ radius,
64
+ size
65
+ }), className),
66
+ ...props
67
+ });
68
+ }
69
+ function AvatarImage({ className, ...props }) {
70
+ return /*#__PURE__*/ _jsx(AvatarPrimitive.Image, {
71
+ "data-slot": "avatar-image",
72
+ className: cn('aspect-square size-full', className),
73
+ ...props
74
+ });
75
+ }
76
+ function AvatarFallback({ className, ...props }) {
77
+ return /*#__PURE__*/ _jsx(AvatarPrimitive.Fallback, {
78
+ "data-slot": "avatar-name",
79
+ className: cn('flex size-full items-center justify-center', className),
80
+ ...props
81
+ });
82
+ }
83
+ export function Avatar({ className, radius, size = 'md', content = 'letters', src, alt, fallback, animateOnHover = false, logoName = 'shipfox', logoClassName, ...props }) {
84
+ const innerClassName = 'flex h-full w-full items-center justify-center rounded-inherit relative bg-background-neutral-base dark:bg-background-components-base text-foreground-neutral-subtle';
85
+ const renderContent = ()=>{
86
+ if (content === 'image') {
87
+ const imageSrc = src || getPlaceholderImageUrl(fallback);
88
+ return /*#__PURE__*/ _jsxs(_Fragment, {
89
+ children: [
90
+ /*#__PURE__*/ _jsx(AvatarImage, {
91
+ src: imageSrc,
92
+ alt: alt || 'Avatar image',
93
+ className: "object-scale-down rounded-inherit"
94
+ }),
95
+ /*#__PURE__*/ _jsx(AvatarFallback, {
96
+ className: innerClassName,
97
+ children: /*#__PURE__*/ _jsx("div", {
98
+ className: cn('absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2', avatarInnerVariants({
99
+ size
100
+ })),
101
+ children: /*#__PURE__*/ _jsx("span", {
102
+ className: "font-medium",
103
+ children: getInitial(fallback)
104
+ })
105
+ })
106
+ })
107
+ ]
108
+ });
109
+ }
110
+ if (content === 'logo') {
111
+ return /*#__PURE__*/ _jsx(AvatarFallback, {
112
+ className: cn(innerClassName, logoClassName ?? 'p-[15%]'),
113
+ children: /*#__PURE__*/ _jsx(Icon, {
114
+ name: logoName,
115
+ className: "h-full w-full"
116
+ })
117
+ });
118
+ }
119
+ if (content === 'logoPlaceholder') {
120
+ return /*#__PURE__*/ _jsx(AvatarFallback, {
121
+ className: cn(innerClassName, logoClassName ?? 'p-[15%]'),
122
+ children: /*#__PURE__*/ _jsx(Icon, {
123
+ name: logoName,
124
+ color: "var(--foreground-neutral-subtle, #a1a1aa)",
125
+ className: "h-full w-full opacity-50"
126
+ })
127
+ });
128
+ }
129
+ if (content === 'letters') {
130
+ return /*#__PURE__*/ _jsx(AvatarFallback, {
131
+ className: innerClassName,
132
+ children: /*#__PURE__*/ _jsx("div", {
133
+ className: cn('absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2', avatarInnerVariants({
134
+ size
135
+ })),
136
+ children: /*#__PURE__*/ _jsx("span", {
137
+ className: "font-medium",
138
+ children: getInitial(fallback)
139
+ })
140
+ })
141
+ });
142
+ }
143
+ if (content === 'upload') {
144
+ const iconSizeClass = UPLOAD_ICON_SIZE_MAP[size];
145
+ return /*#__PURE__*/ _jsx(AvatarFallback, {
146
+ className: innerClassName,
147
+ children: /*#__PURE__*/ _jsx(Icon, {
148
+ name: "imageAdd",
149
+ className: cn('text-foreground-neutral-subtle', iconSizeClass)
150
+ })
151
+ });
152
+ }
153
+ return null;
154
+ };
155
+ return /*#__PURE__*/ _jsx(AvatarRoot, {
156
+ className: cn(animateOnHover ? 'hover:-translate-y-8 transition-transform duration-300 ease-out' : '', className),
157
+ radius: radius,
158
+ size: size,
159
+ ...props,
160
+ children: renderContent()
161
+ });
162
+ }
163
+ export { AvatarRoot, AvatarImage, AvatarFallback };
164
+
165
+ //# sourceMappingURL=avatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/avatar/avatar.tsx"],"sourcesContent":["import * as AvatarPrimitive from '@radix-ui/react-avatar';\nimport {cva, type VariantProps} from 'class-variance-authority';\nimport type {ComponentProps, ReactNode} from 'react';\nimport {getInitial, getPlaceholderImageUrl} from 'utils';\nimport {cn} from 'utils/cn';\nimport {Icon, type IconName} from '../icon/icon';\n\nexport const avatarVariants = cva(\n 'relative flex shrink-0 overflow-hidden bg-background-button-neutral-default text-foreground-neutral-base ring-1 ring-border-neutral-base-component ring-offset-1 ring-offset-background-neutral-base shadow-button-neutral',\n {\n variants: {\n radius: {\n full: 'rounded-full',\n rounded: 'rounded-6',\n },\n size: {\n '3xs': 'size-[18px]',\n '2xs': 'size-[20px]',\n xs: 'size-[24px]',\n sm: 'size-[28px]',\n md: 'size-[32px]',\n lg: 'size-[36px]',\n xl: 'size-[40px]',\n '2xl': 'size-[80px]',\n '3xl': 'size-[120px]',\n },\n },\n defaultVariants: {\n radius: 'full',\n size: 'md',\n },\n },\n);\n\nconst avatarInnerVariants = cva('flex h-full w-full items-center justify-center', {\n variants: {\n size: {\n '3xs': 'text-[10px] leading-[10px]',\n '2xs': 'text-[11px] leading-[11px]',\n xs: 'text-xs leading-4',\n sm: 'text-xs leading-5',\n md: 'text-sm leading-5',\n lg: 'text-sm leading-5',\n xl: 'text-base leading-6',\n '2xl': 'text-2xl leading-8',\n '3xl': 'text-4xl leading-[56px]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\nexport type AvatarContent = 'letters' | 'logo' | 'logoPlaceholder' | 'image' | 'upload';\n\nconst UPLOAD_ICON_SIZE_MAP: Record<\n NonNullable<VariantProps<typeof avatarVariants>['size']>,\n string\n> = {\n '3xs': 'size-[10px]',\n '2xs': 'size-[12px]',\n xs: 'size-[14px]',\n sm: 'size-[16px]',\n md: 'size-[18px]',\n lg: 'size-[20px]',\n xl: 'size-[24px]',\n '2xl': 'size-[40px]',\n '3xl': 'size-[60px]',\n} as const;\n\nfunction AvatarRoot({\n className,\n radius,\n size,\n ...props\n}: ComponentProps<typeof AvatarPrimitive.Root> & VariantProps<typeof avatarVariants>) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn(avatarVariants({radius, size}), className)}\n {...props}\n />\n );\n}\n\nfunction AvatarImage({className, ...props}: ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn('aspect-square size-full', className)}\n {...props}\n />\n );\n}\n\nfunction AvatarFallback({className, ...props}: ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-name\"\n className={cn('flex size-full items-center justify-center', className)}\n {...props}\n />\n );\n}\n\nexport type AvatarProps = ComponentProps<typeof AvatarPrimitive.Root> &\n VariantProps<typeof avatarVariants> & {\n content?: AvatarContent;\n src?: string;\n alt?: string;\n fallback?: string;\n animateOnHover?: boolean;\n logoName?: IconName;\n logoClassName?: string;\n };\n\nexport function Avatar({\n className,\n radius,\n size = 'md',\n content = 'letters',\n src,\n alt,\n fallback,\n animateOnHover = false,\n logoName = 'shipfox',\n logoClassName,\n ...props\n}: AvatarProps) {\n const innerClassName =\n 'flex h-full w-full items-center justify-center rounded-inherit relative bg-background-neutral-base dark:bg-background-components-base text-foreground-neutral-subtle';\n\n const renderContent = (): ReactNode => {\n if (content === 'image') {\n const imageSrc = src || getPlaceholderImageUrl(fallback);\n return (\n <>\n <AvatarImage\n src={imageSrc}\n alt={alt || 'Avatar image'}\n className=\"object-scale-down rounded-inherit\"\n />\n <AvatarFallback className={innerClassName}>\n <div\n className={cn(\n 'absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2',\n avatarInnerVariants({size}),\n )}\n >\n <span className=\"font-medium\">{getInitial(fallback)}</span>\n </div>\n </AvatarFallback>\n </>\n );\n }\n\n if (content === 'logo') {\n return (\n <AvatarFallback className={cn(innerClassName, logoClassName ?? 'p-[15%]')}>\n <Icon name={logoName} className=\"h-full w-full\" />\n </AvatarFallback>\n );\n }\n\n if (content === 'logoPlaceholder') {\n return (\n <AvatarFallback className={cn(innerClassName, logoClassName ?? 'p-[15%]')}>\n <Icon\n name={logoName}\n color=\"var(--foreground-neutral-subtle, #a1a1aa)\"\n className=\"h-full w-full opacity-50\"\n />\n </AvatarFallback>\n );\n }\n\n if (content === 'letters') {\n return (\n <AvatarFallback className={innerClassName}>\n <div\n className={cn(\n 'absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2',\n avatarInnerVariants({size}),\n )}\n >\n <span className=\"font-medium\">{getInitial(fallback)}</span>\n </div>\n </AvatarFallback>\n );\n }\n\n if (content === 'upload') {\n const iconSizeClass = UPLOAD_ICON_SIZE_MAP[size as keyof typeof UPLOAD_ICON_SIZE_MAP];\n return (\n <AvatarFallback className={innerClassName}>\n <Icon name=\"imageAdd\" className={cn('text-foreground-neutral-subtle', iconSizeClass)} />\n </AvatarFallback>\n );\n }\n\n return null;\n };\n\n return (\n <AvatarRoot\n className={cn(\n animateOnHover ? 'hover:-translate-y-8 transition-transform duration-300 ease-out' : '',\n className,\n )}\n radius={radius}\n size={size}\n {...props}\n >\n {renderContent()}\n </AvatarRoot>\n );\n}\n\nexport {AvatarRoot, AvatarImage, AvatarFallback};\n"],"names":["AvatarPrimitive","cva","getInitial","getPlaceholderImageUrl","cn","Icon","avatarVariants","variants","radius","full","rounded","size","xs","sm","md","lg","xl","defaultVariants","avatarInnerVariants","UPLOAD_ICON_SIZE_MAP","AvatarRoot","className","props","Root","data-slot","AvatarImage","Image","AvatarFallback","Fallback","Avatar","content","src","alt","fallback","animateOnHover","logoName","logoClassName","innerClassName","renderContent","imageSrc","div","span","name","color","iconSizeClass"],"mappings":"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"}
@@ -0,0 +1,267 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Code } from '../../components/typography/index.js';
3
+ import { Avatar } from './avatar.js';
4
+ import { AvatarGroup, AvatarGroupTooltip } from './avatar-group.js';
5
+ const contentOptions = [
6
+ 'letters',
7
+ 'logo',
8
+ 'logoPlaceholder',
9
+ 'image',
10
+ 'upload'
11
+ ];
12
+ const radiusOptions = [
13
+ 'full',
14
+ 'rounded'
15
+ ];
16
+ const sizeOptions = [
17
+ '3xs',
18
+ '2xs',
19
+ 'xs',
20
+ 'sm',
21
+ 'md',
22
+ 'lg',
23
+ 'xl',
24
+ '2xl',
25
+ '3xl'
26
+ ];
27
+ const logoNameOptions = [
28
+ 'shipfox',
29
+ 'slack',
30
+ 'stripe',
31
+ 'github'
32
+ ];
33
+ const meta = {
34
+ title: 'Components/Avatar',
35
+ component: Avatar,
36
+ tags: [
37
+ 'autodocs'
38
+ ],
39
+ argTypes: {
40
+ content: {
41
+ control: 'select',
42
+ options: contentOptions
43
+ },
44
+ radius: {
45
+ control: 'select',
46
+ options: radiusOptions
47
+ },
48
+ size: {
49
+ control: 'select',
50
+ options: sizeOptions
51
+ },
52
+ fallback: {
53
+ control: 'text'
54
+ },
55
+ src: {
56
+ control: 'text'
57
+ },
58
+ alt: {
59
+ control: 'text'
60
+ },
61
+ logoName: {
62
+ control: 'select',
63
+ options: logoNameOptions,
64
+ description: 'Logo icon name to display when content is "logo" or "logoPlaceholder"'
65
+ }
66
+ },
67
+ args: {
68
+ content: 'letters',
69
+ radius: 'full',
70
+ size: 'md',
71
+ fallback: 'John Doe',
72
+ logoName: 'shipfox'
73
+ }
74
+ };
75
+ export default meta;
76
+ export const Default = {
77
+ args: {
78
+ content: 'logo',
79
+ fallback: 'Shipfox'
80
+ },
81
+ render: (args)=>/*#__PURE__*/ _jsx("div", {
82
+ className: "flex flex-wrap items-end gap-16",
83
+ children: sizeOptions.map((size)=>/*#__PURE__*/ _jsxs("div", {
84
+ className: "flex flex-col items-center gap-8",
85
+ children: [
86
+ /*#__PURE__*/ _jsx(Avatar, {
87
+ ...args,
88
+ size: size
89
+ }),
90
+ /*#__PURE__*/ _jsx(Code, {
91
+ variant: "label",
92
+ className: "text-foreground-neutral-base",
93
+ children: size
94
+ })
95
+ ]
96
+ }, size))
97
+ })
98
+ };
99
+ // AvatarGroup Stories
100
+ const avatarGroupMeta = {
101
+ title: 'Components/AvatarGroup',
102
+ component: AvatarGroup,
103
+ tags: [
104
+ 'autodocs'
105
+ ],
106
+ argTypes: {
107
+ size: {
108
+ control: 'select',
109
+ options: sizeOptions
110
+ },
111
+ maxVisible: {
112
+ control: 'number'
113
+ }
114
+ },
115
+ args: {
116
+ size: 'md',
117
+ children: []
118
+ }
119
+ };
120
+ export const AvatarGroupDefault = {
121
+ args: {
122
+ children: []
123
+ },
124
+ render: ()=>{
125
+ const avatars = [
126
+ {
127
+ name: 'John Doe',
128
+ content: 'image'
129
+ },
130
+ {
131
+ name: 'Jane Smith',
132
+ content: 'image'
133
+ },
134
+ {
135
+ name: 'Bob Johnson',
136
+ content: 'image'
137
+ },
138
+ {
139
+ name: 'Alice Brown',
140
+ content: 'image'
141
+ }
142
+ ];
143
+ return /*#__PURE__*/ _jsx("div", {
144
+ className: "flex flex-col gap-16",
145
+ children: /*#__PURE__*/ _jsxs("div", {
146
+ className: "flex flex-col gap-8",
147
+ children: [
148
+ /*#__PURE__*/ _jsx(Code, {
149
+ variant: "label",
150
+ className: "text-foreground-neutral-base",
151
+ children: "Default (without tooltips)"
152
+ }),
153
+ /*#__PURE__*/ _jsx(AvatarGroup, {
154
+ size: "md",
155
+ children: avatars.map((avatar)=>/*#__PURE__*/ _jsx(Avatar, {
156
+ content: avatar.content,
157
+ fallback: avatar.name
158
+ }, avatar.name))
159
+ })
160
+ ]
161
+ })
162
+ });
163
+ }
164
+ };
165
+ export const AvatarGroupWithTooltips = {
166
+ args: {
167
+ children: []
168
+ },
169
+ render: ()=>{
170
+ const avatars = [
171
+ {
172
+ name: 'John Doe',
173
+ content: 'image'
174
+ },
175
+ {
176
+ name: 'Jane Smith',
177
+ content: 'image'
178
+ },
179
+ {
180
+ name: 'Bob Johnson',
181
+ content: 'image'
182
+ },
183
+ {
184
+ name: 'Alice Brown',
185
+ content: 'image'
186
+ },
187
+ {
188
+ name: 'Carlos Vega',
189
+ content: 'image'
190
+ },
191
+ {
192
+ name: 'Linda Tran',
193
+ content: 'image'
194
+ }
195
+ ];
196
+ return /*#__PURE__*/ _jsxs("div", {
197
+ className: "flex flex-col gap-16",
198
+ children: [
199
+ /*#__PURE__*/ _jsxs("div", {
200
+ className: "flex flex-col gap-8",
201
+ children: [
202
+ /*#__PURE__*/ _jsx(Code, {
203
+ variant: "label",
204
+ className: "text-foreground-neutral-base",
205
+ children: "With Tooltips"
206
+ }),
207
+ /*#__PURE__*/ _jsx(AvatarGroup, {
208
+ size: "md",
209
+ children: avatars.map((avatar)=>/*#__PURE__*/ _jsx(Avatar, {
210
+ content: avatar.content,
211
+ fallback: avatar.name,
212
+ children: /*#__PURE__*/ _jsx(AvatarGroupTooltip, {
213
+ children: avatar.name
214
+ })
215
+ }, avatar.name))
216
+ })
217
+ ]
218
+ }),
219
+ /*#__PURE__*/ _jsxs("div", {
220
+ className: "flex flex-col gap-8",
221
+ children: [
222
+ /*#__PURE__*/ _jsx(Code, {
223
+ variant: "label",
224
+ className: "text-foreground-neutral-base",
225
+ children: "With Tooltips (maxVisible: 4)"
226
+ }),
227
+ /*#__PURE__*/ _jsx(AvatarGroup, {
228
+ size: "md",
229
+ maxVisible: 4,
230
+ children: avatars.map((avatar)=>/*#__PURE__*/ _jsx(Avatar, {
231
+ content: avatar.content,
232
+ fallback: avatar.name,
233
+ children: /*#__PURE__*/ _jsx(AvatarGroupTooltip, {
234
+ children: avatar.name
235
+ })
236
+ }, avatar.name))
237
+ })
238
+ ]
239
+ }),
240
+ /*#__PURE__*/ _jsxs("div", {
241
+ className: "flex flex-col gap-8",
242
+ children: [
243
+ /*#__PURE__*/ _jsx(Code, {
244
+ variant: "label",
245
+ className: "text-foreground-neutral-base",
246
+ children: "With Tooltips and Hover Animation"
247
+ }),
248
+ /*#__PURE__*/ _jsx(AvatarGroup, {
249
+ size: "md",
250
+ maxVisible: 4,
251
+ animateOnHover: true,
252
+ children: avatars.map((avatar)=>/*#__PURE__*/ _jsx(Avatar, {
253
+ content: avatar.content,
254
+ fallback: avatar.name,
255
+ children: /*#__PURE__*/ _jsx(AvatarGroupTooltip, {
256
+ children: avatar.name
257
+ })
258
+ }, avatar.name))
259
+ })
260
+ ]
261
+ })
262
+ ]
263
+ });
264
+ }
265
+ };
266
+
267
+ //# sourceMappingURL=avatar.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/avatar/avatar.stories.tsx"],"sourcesContent":["import type {Meta, StoryObj} from '@storybook/react';\nimport {Code} from 'components/typography';\nimport {Avatar} from './avatar';\nimport {AvatarGroup, AvatarGroupTooltip} from './avatar-group';\n\nconst contentOptions = ['letters', 'logo', 'logoPlaceholder', 'image', 'upload'] as const;\nconst radiusOptions = ['full', 'rounded'] as const;\nconst sizeOptions = ['3xs', '2xs', 'xs', 'sm', 'md', 'lg', 'xl', '2xl', '3xl'] as const;\nconst logoNameOptions = ['shipfox', 'slack', 'stripe', 'github'] as const;\n\nconst meta = {\n title: 'Components/Avatar',\n component: Avatar,\n tags: ['autodocs'],\n argTypes: {\n content: {\n control: 'select',\n options: contentOptions,\n },\n radius: {\n control: 'select',\n options: radiusOptions,\n },\n size: {\n control: 'select',\n options: sizeOptions,\n },\n fallback: {\n control: 'text',\n },\n src: {\n control: 'text',\n },\n alt: {\n control: 'text',\n },\n logoName: {\n control: 'select',\n options: logoNameOptions,\n description: 'Logo icon name to display when content is \"logo\" or \"logoPlaceholder\"',\n },\n },\n args: {\n content: 'letters',\n radius: 'full',\n size: 'md',\n fallback: 'John Doe',\n logoName: 'shipfox',\n },\n} satisfies Meta<typeof Avatar>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Default: Story = {\n args: {\n content: 'logo',\n fallback: 'Shipfox',\n },\n\n render: (args) => (\n <div className=\"flex flex-wrap items-end gap-16\">\n {sizeOptions.map((size) => (\n <div key={size} className=\"flex flex-col items-center gap-8\">\n <Avatar {...args} size={size} />\n <Code variant=\"label\" className=\"text-foreground-neutral-base\">\n {size}\n </Code>\n </div>\n ))}\n </div>\n ),\n};\n\n// AvatarGroup Stories\nconst avatarGroupMeta = {\n title: 'Components/AvatarGroup',\n component: AvatarGroup,\n tags: ['autodocs'],\n argTypes: {\n size: {\n control: 'select',\n options: sizeOptions,\n },\n maxVisible: {\n control: 'number',\n },\n },\n args: {\n size: 'md',\n children: [],\n },\n} satisfies Meta<typeof AvatarGroup>;\n\nexport const AvatarGroupDefault: StoryObj<typeof avatarGroupMeta> = {\n args: {\n children: [],\n },\n render: () => {\n const avatars = [\n {name: 'John Doe', content: 'image'},\n {name: 'Jane Smith', content: 'image'},\n {name: 'Bob Johnson', content: 'image'},\n {name: 'Alice Brown', content: 'image'},\n ] as const;\n\n return (\n <div className=\"flex flex-col gap-16\">\n <div className=\"flex flex-col gap-8\">\n <Code variant=\"label\" className=\"text-foreground-neutral-base\">\n Default (without tooltips)\n </Code>\n <AvatarGroup size=\"md\">\n {avatars.map((avatar) => (\n <Avatar key={avatar.name} content={avatar.content} fallback={avatar.name} />\n ))}\n </AvatarGroup>\n </div>\n </div>\n );\n },\n};\n\nexport const AvatarGroupWithTooltips: StoryObj<typeof avatarGroupMeta> = {\n args: {\n children: [],\n },\n render: () => {\n const avatars = [\n {name: 'John Doe', content: 'image'},\n {name: 'Jane Smith', content: 'image'},\n {name: 'Bob Johnson', content: 'image'},\n {name: 'Alice Brown', content: 'image'},\n {name: 'Carlos Vega', content: 'image'},\n {name: 'Linda Tran', content: 'image'},\n ] as const;\n\n return (\n <div className=\"flex flex-col gap-16\">\n <div className=\"flex flex-col gap-8\">\n <Code variant=\"label\" className=\"text-foreground-neutral-base\">\n With Tooltips\n </Code>\n <AvatarGroup size=\"md\">\n {avatars.map((avatar) => (\n <Avatar key={avatar.name} content={avatar.content} fallback={avatar.name}>\n <AvatarGroupTooltip>{avatar.name}</AvatarGroupTooltip>\n </Avatar>\n ))}\n </AvatarGroup>\n </div>\n <div className=\"flex flex-col gap-8\">\n <Code variant=\"label\" className=\"text-foreground-neutral-base\">\n With Tooltips (maxVisible: 4)\n </Code>\n <AvatarGroup size=\"md\" maxVisible={4}>\n {avatars.map((avatar) => (\n <Avatar key={avatar.name} content={avatar.content} fallback={avatar.name}>\n <AvatarGroupTooltip>{avatar.name}</AvatarGroupTooltip>\n </Avatar>\n ))}\n </AvatarGroup>\n </div>\n <div className=\"flex flex-col gap-8\">\n <Code variant=\"label\" className=\"text-foreground-neutral-base\">\n With Tooltips and Hover Animation\n </Code>\n <AvatarGroup size=\"md\" maxVisible={4} animateOnHover>\n {avatars.map((avatar) => (\n <Avatar key={avatar.name} content={avatar.content} fallback={avatar.name}>\n <AvatarGroupTooltip>{avatar.name}</AvatarGroupTooltip>\n </Avatar>\n ))}\n </AvatarGroup>\n </div>\n </div>\n );\n },\n};\n"],"names":["Code","Avatar","AvatarGroup","AvatarGroupTooltip","contentOptions","radiusOptions","sizeOptions","logoNameOptions","meta","title","component","tags","argTypes","content","control","options","radius","size","fallback","src","alt","logoName","description","args","Default","render","div","className","map","variant","avatarGroupMeta","maxVisible","children","AvatarGroupDefault","avatars","name","avatar","AvatarGroupWithTooltips","animateOnHover"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './avatar';
2
+ export * from './avatar-group';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './avatar.js';
2
+ export * from './avatar-group.js';
3
+
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/avatar/index.ts"],"sourcesContent":["export * from './avatar';\nexport * from './avatar-group';\n"],"names":[],"mappings":"AAAA,cAAc,WAAW;AACzB,cAAc,iBAAiB"}
@@ -0,0 +1,48 @@
1
+ import { type VariantProps } from 'class-variance-authority';
2
+ import { type IconName } from '../../components/icon';
3
+ import type { ComponentProps } from 'react';
4
+ export declare const badgeVariants: (props?: ({
5
+ variant?: "info" | "success" | "warning" | "error" | "neutral" | "feature" | null | undefined;
6
+ size?: "2xs" | "xs" | null | undefined;
7
+ radius?: "default" | "rounded" | null | undefined;
8
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
9
+ export type BadgeVariant = VariantProps<typeof badgeVariants>['variant'];
10
+ type BaseBadgeProps = ComponentProps<'span'> & VariantProps<typeof badgeVariants> & {
11
+ asChild?: boolean;
12
+ };
13
+ type BadgePropsWithLeftClick = BaseBadgeProps & {
14
+ iconLeft: IconName;
15
+ onIconLeftClick: (e: React.MouseEvent<HTMLButtonElement>) => void;
16
+ iconLeftAriaLabel: string;
17
+ iconRight?: IconName;
18
+ onIconRightClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;
19
+ iconRightAriaLabel?: string;
20
+ };
21
+ type BadgePropsWithRightClick = BaseBadgeProps & {
22
+ iconRight: IconName;
23
+ onIconRightClick: (e: React.MouseEvent<HTMLButtonElement>) => void;
24
+ iconRightAriaLabel: string;
25
+ iconLeft?: IconName;
26
+ onIconLeftClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;
27
+ iconLeftAriaLabel?: string;
28
+ };
29
+ type BadgePropsWithBothClicks = BaseBadgeProps & {
30
+ iconLeft: IconName;
31
+ onIconLeftClick: (e: React.MouseEvent<HTMLButtonElement>) => void;
32
+ iconLeftAriaLabel: string;
33
+ iconRight: IconName;
34
+ onIconRightClick: (e: React.MouseEvent<HTMLButtonElement>) => void;
35
+ iconRightAriaLabel: string;
36
+ };
37
+ type BadgePropsWithoutClicks = BaseBadgeProps & {
38
+ iconLeft?: IconName;
39
+ iconRight?: IconName;
40
+ onIconLeftClick?: never;
41
+ onIconRightClick?: never;
42
+ iconLeftAriaLabel?: never;
43
+ iconRightAriaLabel?: never;
44
+ };
45
+ export type BadgeProps = BadgePropsWithLeftClick | BadgePropsWithRightClick | BadgePropsWithBothClicks | BadgePropsWithoutClicks;
46
+ export declare function Badge({ className, variant, size, radius, asChild, children, iconLeft, iconRight, onIconLeftClick, onIconRightClick, iconLeftAriaLabel, iconRightAriaLabel, ...props }: BadgeProps): import("react/jsx-runtime").JSX.Element;
47
+ export {};
48
+ //# sourceMappingURL=badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../../src/components/badge/badge.tsx"],"names":[],"mappings":"AACA,OAAO,EAAM,KAAK,YAAY,EAAC,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAO,KAAK,QAAQ,EAAC,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,OAAO,CAAC;AAG1C,eAAO,MAAM,aAAa;;;;8EAgCzB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC;AAEzE,KAAK,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,GAC1C,YAAY,CAAC,OAAO,aAAa,CAAC,GAAG;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEJ,KAAK,uBAAuB,GAAG,cAAc,GAAG;IAC9C,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAClE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB,gBAAgB,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACpE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,KAAK,wBAAwB,GAAG,cAAc,GAAG;IAC/C,SAAS,EAAE,QAAQ,CAAC;IACpB,gBAAgB,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACnE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACnE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,KAAK,wBAAwB,GAAG,cAAc,GAAG;IAC/C,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAClE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,QAAQ,CAAC;IACpB,gBAAgB,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACnE,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,KAAK,uBAAuB,GAAG,cAAc,GAAG;IAC9C,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB,eAAe,CAAC,EAAE,KAAK,CAAC;IACxB,gBAAgB,CAAC,EAAE,KAAK,CAAC;IACzB,iBAAiB,CAAC,EAAE,KAAK,CAAC;IAC1B,kBAAkB,CAAC,EAAE,KAAK,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,UAAU,GAClB,uBAAuB,GACvB,wBAAwB,GACxB,wBAAwB,GACxB,uBAAuB,CAAC;AAE5B,wBAAgB,KAAK,CAAC,EACpB,SAAS,EACT,OAAO,EACP,IAAI,EACJ,MAAM,EACN,OAAe,EACf,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,GAAG,KAAK,EACT,EAAE,UAAU,2CA2CZ"}
@@ -0,0 +1,72 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Slot } from '@radix-ui/react-slot';
3
+ import { cva } from 'class-variance-authority';
4
+ import { Icon } from '../../components/icon/index.js';
5
+ import { cn } from '../../utils/cn.js';
6
+ export const badgeVariants = cva('inline-flex select-none items-center justify-center font-medium transition-colors shrink-0 leading-20', {
7
+ variants: {
8
+ variant: {
9
+ neutral: 'bg-tag-neutral-bg text-tag-neutral-text border border-tag-neutral-border hover:bg-tag-neutral-bg-hover',
10
+ info: 'bg-tag-blue-bg text-tag-blue-text border border-tag-blue-border hover:bg-tag-blue-bg-hover',
11
+ feature: 'bg-tag-purple-bg text-tag-purple-text border border-tag-purple-border hover:bg-tag-purple-bg-hover',
12
+ success: 'bg-tag-success-bg text-tag-success-text border border-tag-success-border hover:bg-tag-success-bg-hover',
13
+ warning: 'bg-tag-warning-bg text-tag-warning-text border border-tag-warning-border hover:bg-tag-warning-bg-hover',
14
+ error: 'bg-tag-error-bg text-tag-error-text border border-tag-error-border hover:bg-tag-error-bg-hover'
15
+ },
16
+ size: {
17
+ '2xs': 'h-20 px-6 text-xs gap-4',
18
+ xs: 'h-24 px-8 text-xs gap-6'
19
+ },
20
+ radius: {
21
+ default: 'rounded-6',
22
+ rounded: 'rounded-full'
23
+ }
24
+ },
25
+ defaultVariants: {
26
+ variant: 'neutral',
27
+ size: '2xs',
28
+ radius: 'default'
29
+ }
30
+ });
31
+ export function Badge({ className, variant, size, radius, asChild = false, children, iconLeft, iconRight, onIconLeftClick, onIconRightClick, iconLeftAriaLabel, iconRightAriaLabel, ...props }) {
32
+ const Comp = asChild ? Slot : 'span';
33
+ const renderIcon = (iconName, position, onClick, ariaLabel)=>{
34
+ const isInteractive = Boolean(onClick);
35
+ if (isInteractive) {
36
+ if (!ariaLabel) {
37
+ // biome-ignore lint/suspicious/noConsole: Development warning for accessibility
38
+ console.warn(`Badge: Missing aria-label for interactive ${position} icon. Please provide icon${position === 'left' ? 'Left' : 'Right'}AriaLabel prop.`);
39
+ return null;
40
+ }
41
+ return /*#__PURE__*/ _jsx("button", {
42
+ type: "button",
43
+ onClick: onClick,
44
+ className: "inline-flex items-center justify-center transition-colors shrink-0 hover:opacity-70 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-blue-500",
45
+ "aria-label": ariaLabel,
46
+ children: /*#__PURE__*/ _jsx(Icon, {
47
+ name: iconName,
48
+ className: "size-12"
49
+ })
50
+ });
51
+ }
52
+ return /*#__PURE__*/ _jsx(Icon, {
53
+ name: iconName,
54
+ className: "size-12"
55
+ });
56
+ };
57
+ return /*#__PURE__*/ _jsxs(Comp, {
58
+ className: cn(badgeVariants({
59
+ variant,
60
+ size,
61
+ radius
62
+ }), className),
63
+ ...props,
64
+ children: [
65
+ iconLeft && renderIcon(iconLeft, 'left', onIconLeftClick, iconLeftAriaLabel),
66
+ children,
67
+ iconRight && renderIcon(iconRight, 'right', onIconRightClick, iconRightAriaLabel)
68
+ ]
69
+ });
70
+ }
71
+
72
+ //# sourceMappingURL=badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/badge/badge.tsx"],"sourcesContent":["import {Slot} from '@radix-ui/react-slot';\nimport {cva, type VariantProps} from 'class-variance-authority';\nimport {Icon, type IconName} from 'components/icon';\nimport type {ComponentProps} from 'react';\nimport {cn} from 'utils/cn';\n\nexport const badgeVariants = cva(\n 'inline-flex select-none items-center justify-center font-medium transition-colors shrink-0 leading-20',\n {\n variants: {\n variant: {\n neutral:\n 'bg-tag-neutral-bg text-tag-neutral-text border border-tag-neutral-border hover:bg-tag-neutral-bg-hover',\n info: 'bg-tag-blue-bg text-tag-blue-text border border-tag-blue-border hover:bg-tag-blue-bg-hover',\n feature:\n 'bg-tag-purple-bg text-tag-purple-text border border-tag-purple-border hover:bg-tag-purple-bg-hover',\n success:\n 'bg-tag-success-bg text-tag-success-text border border-tag-success-border hover:bg-tag-success-bg-hover',\n warning:\n 'bg-tag-warning-bg text-tag-warning-text border border-tag-warning-border hover:bg-tag-warning-bg-hover',\n error:\n 'bg-tag-error-bg text-tag-error-text border border-tag-error-border hover:bg-tag-error-bg-hover',\n },\n size: {\n '2xs': 'h-20 px-6 text-xs gap-4',\n xs: 'h-24 px-8 text-xs gap-6',\n },\n radius: {\n default: 'rounded-6',\n rounded: 'rounded-full',\n },\n },\n defaultVariants: {\n variant: 'neutral',\n size: '2xs',\n radius: 'default',\n },\n },\n);\n\nexport type BadgeVariant = VariantProps<typeof badgeVariants>['variant'];\n\ntype BaseBadgeProps = ComponentProps<'span'> &\n VariantProps<typeof badgeVariants> & {\n asChild?: boolean;\n };\n\ntype BadgePropsWithLeftClick = BaseBadgeProps & {\n iconLeft: IconName;\n onIconLeftClick: (e: React.MouseEvent<HTMLButtonElement>) => void;\n iconLeftAriaLabel: string;\n iconRight?: IconName;\n onIconRightClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n iconRightAriaLabel?: string;\n};\n\ntype BadgePropsWithRightClick = BaseBadgeProps & {\n iconRight: IconName;\n onIconRightClick: (e: React.MouseEvent<HTMLButtonElement>) => void;\n iconRightAriaLabel: string;\n iconLeft?: IconName;\n onIconLeftClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n iconLeftAriaLabel?: string;\n};\n\ntype BadgePropsWithBothClicks = BaseBadgeProps & {\n iconLeft: IconName;\n onIconLeftClick: (e: React.MouseEvent<HTMLButtonElement>) => void;\n iconLeftAriaLabel: string;\n iconRight: IconName;\n onIconRightClick: (e: React.MouseEvent<HTMLButtonElement>) => void;\n iconRightAriaLabel: string;\n};\n\ntype BadgePropsWithoutClicks = BaseBadgeProps & {\n iconLeft?: IconName;\n iconRight?: IconName;\n onIconLeftClick?: never;\n onIconRightClick?: never;\n iconLeftAriaLabel?: never;\n iconRightAriaLabel?: never;\n};\n\nexport type BadgeProps =\n | BadgePropsWithLeftClick\n | BadgePropsWithRightClick\n | BadgePropsWithBothClicks\n | BadgePropsWithoutClicks;\n\nexport function Badge({\n className,\n variant,\n size,\n radius,\n asChild = false,\n children,\n iconLeft,\n iconRight,\n onIconLeftClick,\n onIconRightClick,\n iconLeftAriaLabel,\n iconRightAriaLabel,\n ...props\n}: BadgeProps) {\n const Comp = asChild ? Slot : 'span';\n\n const renderIcon = (\n iconName: IconName,\n position: 'left' | 'right',\n onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void,\n ariaLabel?: string,\n ) => {\n const isInteractive = Boolean(onClick);\n\n if (isInteractive) {\n if (!ariaLabel) {\n // biome-ignore lint/suspicious/noConsole: Development warning for accessibility\n console.warn(\n `Badge: Missing aria-label for interactive ${position} icon. Please provide icon${position === 'left' ? 'Left' : 'Right'}AriaLabel prop.`,\n );\n\n return null;\n }\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"inline-flex items-center justify-center transition-colors shrink-0 hover:opacity-70 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-blue-500\"\n aria-label={ariaLabel}\n >\n <Icon name={iconName} className=\"size-12\" />\n </button>\n );\n }\n\n return <Icon name={iconName} className=\"size-12\" />;\n };\n\n return (\n <Comp className={cn(badgeVariants({variant, size, radius}), className)} {...props}>\n {iconLeft && renderIcon(iconLeft, 'left', onIconLeftClick, iconLeftAriaLabel)}\n {children}\n {iconRight && renderIcon(iconRight, 'right', onIconRightClick, iconRightAriaLabel)}\n </Comp>\n );\n}\n"],"names":["Slot","cva","Icon","cn","badgeVariants","variants","variant","neutral","info","feature","success","warning","error","size","xs","radius","default","rounded","defaultVariants","Badge","className","asChild","children","iconLeft","iconRight","onIconLeftClick","onIconRightClick","iconLeftAriaLabel","iconRightAriaLabel","props","Comp","renderIcon","iconName","position","onClick","ariaLabel","isInteractive","Boolean","console","warn","button","type","aria-label","name"],"mappings":";AAAA,SAAQA,IAAI,QAAO,uBAAuB;AAC1C,SAAQC,GAAG,QAA0B,2BAA2B;AAChE,SAAQC,IAAI,QAAsB,kBAAkB;AAEpD,SAAQC,EAAE,QAAO,WAAW;AAE5B,OAAO,MAAMC,gBAAgBH,IAC3B,yGACA;IACEI,UAAU;QACRC,SAAS;YACPC,SACE;YACFC,MAAM;YACNC,SACE;YACFC,SACE;YACFC,SACE;YACFC,OACE;QACJ;QACAC,MAAM;YACJ,OAAO;YACPC,IAAI;QACN;QACAC,QAAQ;YACNC,SAAS;YACTC,SAAS;QACX;IACF;IACAC,iBAAiB;QACfZ,SAAS;QACTO,MAAM;QACNE,QAAQ;IACV;AACF,GACA;AAmDF,OAAO,SAASI,MAAM,EACpBC,SAAS,EACTd,OAAO,EACPO,IAAI,EACJE,MAAM,EACNM,UAAU,KAAK,EACfC,QAAQ,EACRC,QAAQ,EACRC,SAAS,EACTC,eAAe,EACfC,gBAAgB,EAChBC,iBAAiB,EACjBC,kBAAkB,EAClB,GAAGC,OACQ;IACX,MAAMC,OAAOT,UAAUrB,OAAO;IAE9B,MAAM+B,aAAa,CACjBC,UACAC,UACAC,SACAC;QAEA,MAAMC,gBAAgBC,QAAQH;QAE9B,IAAIE,eAAe;YACjB,IAAI,CAACD,WAAW;gBACd,gFAAgF;gBAChFG,QAAQC,IAAI,CACV,CAAC,0CAA0C,EAAEN,SAAS,0BAA0B,EAAEA,aAAa,SAAS,SAAS,QAAQ,eAAe,CAAC;gBAG3I,OAAO;YACT;YAEA,qBACE,KAACO;gBACCC,MAAK;gBACLP,SAASA;gBACTd,WAAU;gBACVsB,cAAYP;0BAEZ,cAAA,KAACjC;oBAAKyC,MAAMX;oBAAUZ,WAAU;;;QAGtC;QAEA,qBAAO,KAAClB;YAAKyC,MAAMX;YAAUZ,WAAU;;IACzC;IAEA,qBACE,MAACU;QAAKV,WAAWjB,GAAGC,cAAc;YAACE;YAASO;YAAME;QAAM,IAAIK;QAAa,GAAGS,KAAK;;YAC9EN,YAAYQ,WAAWR,UAAU,QAAQE,iBAAiBE;YAC1DL;YACAE,aAAaO,WAAWP,WAAW,SAASE,kBAAkBE;;;AAGrE"}