@shipfox/react-ui 0.3.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 (290) hide show
  1. package/.storybook/preview.tsx +1 -1
  2. package/.turbo/turbo-build.log +2 -2
  3. package/.turbo/turbo-check.log +2 -2
  4. package/.turbo/turbo-type.log +1 -1
  5. package/CHANGELOG.md +11 -0
  6. package/dist/components/alert/alert.d.ts +2 -2
  7. package/dist/components/alert/alert.js +3 -3
  8. package/dist/components/alert/alert.js.map +1 -1
  9. package/dist/components/alert/alert.stories.js +2 -2
  10. package/dist/components/alert/alert.stories.js.map +1 -1
  11. package/dist/components/avatar/avatar-group.js +3 -3
  12. package/dist/components/avatar/avatar-group.js.map +1 -1
  13. package/dist/components/avatar/avatar.d.ts +4 -1
  14. package/dist/components/avatar/avatar.d.ts.map +1 -1
  15. package/dist/components/avatar/avatar.js +7 -8
  16. package/dist/components/avatar/avatar.js.map +1 -1
  17. package/dist/components/avatar/avatar.stories.js +15 -3
  18. package/dist/components/avatar/avatar.stories.js.map +1 -1
  19. package/dist/components/badge/badge.d.ts +48 -0
  20. package/dist/components/badge/badge.d.ts.map +1 -0
  21. package/dist/components/badge/badge.js +72 -0
  22. package/dist/components/badge/badge.js.map +1 -0
  23. package/dist/components/badge/badge.stories.js +802 -0
  24. package/dist/components/badge/badge.stories.js.map +1 -0
  25. package/dist/components/badge/icon-badge.d.ts +9 -0
  26. package/dist/components/badge/icon-badge.d.ts.map +1 -0
  27. package/dist/components/badge/icon-badge.js +32 -0
  28. package/dist/components/badge/icon-badge.js.map +1 -0
  29. package/dist/components/badge/index.d.ts +5 -0
  30. package/dist/components/badge/index.d.ts.map +1 -0
  31. package/dist/components/badge/index.js +6 -0
  32. package/dist/components/badge/index.js.map +1 -0
  33. package/dist/components/badge/status-badge.d.ts +9 -0
  34. package/dist/components/badge/status-badge.d.ts.map +1 -0
  35. package/dist/components/badge/status-badge.js +29 -0
  36. package/dist/components/badge/status-badge.js.map +1 -0
  37. package/dist/components/badge/user-badge.d.ts +8 -0
  38. package/dist/components/badge/user-badge.d.ts.map +1 -0
  39. package/dist/components/badge/user-badge.js +24 -0
  40. package/dist/components/badge/user-badge.js.map +1 -0
  41. package/dist/components/{button.d.ts → button/button.d.ts} +1 -1
  42. package/dist/components/button/button.d.ts.map +1 -0
  43. package/dist/components/{button.js → button/button.js} +2 -2
  44. package/dist/components/button/button.js.map +1 -0
  45. package/dist/components/{button.stories.js → button/button.stories.js} +1 -1
  46. package/dist/components/button/button.stories.js.map +1 -0
  47. package/dist/components/button/index.d.ts +2 -0
  48. package/dist/components/button/index.d.ts.map +1 -0
  49. package/dist/components/button/index.js +3 -0
  50. package/dist/components/button/index.js.map +1 -0
  51. package/dist/components/checkbox/checkbox-label.d.ts +14 -0
  52. package/dist/components/checkbox/checkbox-label.d.ts.map +1 -0
  53. package/dist/components/checkbox/checkbox-label.js +82 -0
  54. package/dist/components/checkbox/checkbox-label.js.map +1 -0
  55. package/dist/components/checkbox/checkbox-links.d.ts +18 -0
  56. package/dist/components/checkbox/checkbox-links.d.ts.map +1 -0
  57. package/dist/components/checkbox/checkbox-links.js +58 -0
  58. package/dist/components/checkbox/checkbox-links.js.map +1 -0
  59. package/dist/components/checkbox/checkbox.d.ts +9 -0
  60. package/dist/components/checkbox/checkbox.d.ts.map +1 -0
  61. package/dist/components/checkbox/checkbox.js +49 -0
  62. package/dist/components/checkbox/checkbox.js.map +1 -0
  63. package/dist/components/checkbox/checkbox.stories.js +566 -0
  64. package/dist/components/checkbox/checkbox.stories.js.map +1 -0
  65. package/dist/components/checkbox/index.d.ts +4 -0
  66. package/dist/components/checkbox/index.d.ts.map +1 -0
  67. package/dist/components/checkbox/index.js +5 -0
  68. package/dist/components/checkbox/index.js.map +1 -0
  69. package/dist/components/code-block/code-block-footer.d.ts +26 -0
  70. package/dist/components/code-block/code-block-footer.d.ts.map +1 -0
  71. package/dist/components/code-block/code-block-footer.js +86 -0
  72. package/dist/components/code-block/code-block-footer.js.map +1 -0
  73. package/dist/components/code-block/code-block.d.ts +50 -0
  74. package/dist/components/code-block/code-block.d.ts.map +1 -0
  75. package/dist/components/code-block/code-block.js +142 -0
  76. package/dist/components/code-block/code-block.js.map +1 -0
  77. package/dist/components/code-block/code-block.stories.js +341 -0
  78. package/dist/components/code-block/code-block.stories.js.map +1 -0
  79. package/dist/components/code-block/code-content.d.ts +11 -0
  80. package/dist/components/code-block/code-content.d.ts.map +1 -0
  81. package/dist/components/code-block/code-content.js +29 -0
  82. package/dist/components/code-block/code-content.js.map +1 -0
  83. package/dist/components/code-block/code-copy-button.d.ts +11 -0
  84. package/dist/components/code-block/code-copy-button.d.ts.map +1 -0
  85. package/dist/components/code-block/code-copy-button.js +49 -0
  86. package/dist/components/code-block/code-copy-button.js.map +1 -0
  87. package/dist/components/code-block/code-tabs.d.ts +16 -0
  88. package/dist/components/code-block/code-tabs.d.ts.map +1 -0
  89. package/dist/components/code-block/code-tabs.js +98 -0
  90. package/dist/components/code-block/code-tabs.js.map +1 -0
  91. package/dist/components/code-block/index.d.ts +4 -0
  92. package/dist/components/code-block/index.d.ts.map +1 -0
  93. package/dist/components/code-block/index.js +5 -0
  94. package/dist/components/code-block/index.js.map +1 -0
  95. package/dist/components/dynamic-item/dynamic-item.d.ts +13 -0
  96. package/dist/components/dynamic-item/dynamic-item.d.ts.map +1 -0
  97. package/dist/components/dynamic-item/dynamic-item.js +43 -0
  98. package/dist/components/dynamic-item/dynamic-item.js.map +1 -0
  99. package/dist/components/dynamic-item/dynamic-item.stories.js +375 -0
  100. package/dist/components/dynamic-item/dynamic-item.stories.js.map +1 -0
  101. package/dist/components/dynamic-item/index.d.ts +2 -0
  102. package/dist/components/dynamic-item/index.d.ts.map +1 -0
  103. package/dist/components/dynamic-item/index.js +3 -0
  104. package/dist/components/dynamic-item/index.js.map +1 -0
  105. package/dist/components/icon/custom/index.d.ts +2 -0
  106. package/dist/components/icon/custom/index.d.ts.map +1 -1
  107. package/dist/components/icon/custom/index.js +2 -0
  108. package/dist/components/icon/custom/index.js.map +1 -1
  109. package/dist/components/icon/custom/slack-logo.d.ts +6 -0
  110. package/dist/components/icon/custom/slack-logo.d.ts.map +1 -0
  111. package/dist/components/icon/custom/slack-logo.js +34 -0
  112. package/dist/components/icon/custom/slack-logo.js.map +1 -0
  113. package/dist/components/icon/custom/stripe-logo.d.ts +8 -0
  114. package/dist/components/icon/custom/stripe-logo.d.ts.map +1 -0
  115. package/dist/components/icon/custom/stripe-logo.js +24 -0
  116. package/dist/components/icon/custom/stripe-logo.js.map +1 -0
  117. package/dist/components/icon/icon.d.ts +11 -2
  118. package/dist/components/icon/icon.d.ts.map +1 -1
  119. package/dist/components/icon/icon.js +12 -3
  120. package/dist/components/icon/icon.js.map +1 -1
  121. package/dist/components/icon/icon.stories.js +6 -3
  122. package/dist/components/icon/icon.stories.js.map +1 -1
  123. package/dist/components/index.d.ts +9 -1
  124. package/dist/components/index.d.ts.map +1 -1
  125. package/dist/components/index.js +10 -2
  126. package/dist/components/index.js.map +1 -1
  127. package/dist/components/inline-tips/inline-tips.d.ts +1 -1
  128. package/dist/components/inline-tips/inline-tips.d.ts.map +1 -1
  129. package/dist/components/inline-tips/inline-tips.js +1 -1
  130. package/dist/components/inline-tips/inline-tips.js.map +1 -1
  131. package/dist/components/inline-tips/inline-tips.stories.js +5 -5
  132. package/dist/components/inline-tips/inline-tips.stories.js.map +1 -1
  133. package/dist/components/input/index.d.ts +2 -0
  134. package/dist/components/input/index.d.ts.map +1 -0
  135. package/dist/components/input/index.js +3 -0
  136. package/dist/components/input/index.js.map +1 -0
  137. package/dist/components/input/input.d.ts.map +1 -0
  138. package/dist/components/{input.js → input/input.js} +2 -2
  139. package/dist/components/input/input.js.map +1 -0
  140. package/dist/components/{input.stories.js → input/input.stories.js} +1 -1
  141. package/dist/components/input/input.stories.js.map +1 -0
  142. package/dist/components/item/index.d.ts +2 -0
  143. package/dist/components/item/index.d.ts.map +1 -0
  144. package/dist/components/item/index.js +3 -0
  145. package/dist/components/item/index.js.map +1 -0
  146. package/dist/components/item/item.d.ts +32 -0
  147. package/dist/components/item/item.d.ts.map +1 -0
  148. package/dist/components/item/item.js +120 -0
  149. package/dist/components/item/item.js.map +1 -0
  150. package/dist/components/item/item.stories.js +232 -0
  151. package/dist/components/item/item.stories.js.map +1 -0
  152. package/dist/components/label/index.d.ts +2 -0
  153. package/dist/components/label/index.d.ts.map +1 -0
  154. package/dist/components/label/index.js +3 -0
  155. package/dist/components/label/index.js.map +1 -0
  156. package/dist/components/label/label.d.ts +7 -0
  157. package/dist/components/label/label.d.ts.map +1 -0
  158. package/dist/components/label/label.js +13 -0
  159. package/dist/components/label/label.js.map +1 -0
  160. package/dist/components/label/label.stories.js +105 -0
  161. package/dist/components/label/label.stories.js.map +1 -0
  162. package/dist/components/moving-border/moving-border.d.ts +9 -0
  163. package/dist/components/moving-border/moving-border.d.ts.map +1 -0
  164. package/dist/components/moving-border/moving-border.js +54 -0
  165. package/dist/components/moving-border/moving-border.js.map +1 -0
  166. package/dist/components/textarea/textarea.js +1 -1
  167. package/dist/components/textarea/textarea.js.map +1 -1
  168. package/dist/components/theme/index.d.ts +2 -0
  169. package/dist/components/theme/index.d.ts.map +1 -0
  170. package/dist/components/theme/index.js +3 -0
  171. package/dist/components/theme/index.js.map +1 -0
  172. package/dist/components/{theme-provider.d.ts → theme/theme-provider.d.ts} +1 -1
  173. package/dist/components/theme/theme-provider.d.ts.map +1 -0
  174. package/dist/components/{theme-provider.js → theme/theme-provider.js} +1 -1
  175. package/dist/components/theme/theme-provider.js.map +1 -0
  176. package/dist/components/toast/index.d.ts +3 -0
  177. package/dist/components/toast/index.d.ts.map +1 -0
  178. package/dist/components/toast/index.js +4 -0
  179. package/dist/components/toast/index.js.map +1 -0
  180. package/dist/components/toast/toast-custom.d.ts +19 -0
  181. package/dist/components/toast/toast-custom.d.ts.map +1 -0
  182. package/dist/components/toast/toast-custom.js +134 -0
  183. package/dist/components/toast/toast-custom.js.map +1 -0
  184. package/dist/components/toast/toast.d.ts +5 -0
  185. package/dist/components/toast/toast.d.ts.map +1 -0
  186. package/dist/components/toast/toast.js +40 -0
  187. package/dist/components/toast/toast.js.map +1 -0
  188. package/dist/components/toast/toast.stories.js +326 -0
  189. package/dist/components/toast/toast.stories.js.map +1 -0
  190. package/dist/components/tooltip/index.d.ts +2 -0
  191. package/dist/components/tooltip/index.d.ts.map +1 -0
  192. package/dist/components/tooltip/index.js +3 -0
  193. package/dist/components/tooltip/index.js.map +1 -0
  194. package/dist/components/tooltip/tooltip.d.ts +18 -5
  195. package/dist/components/tooltip/tooltip.d.ts.map +1 -1
  196. package/dist/components/tooltip/tooltip.js +63 -3
  197. package/dist/components/tooltip/tooltip.js.map +1 -1
  198. package/dist/components/tooltip/tooltip.stories.js +560 -0
  199. package/dist/components/tooltip/tooltip.stories.js.map +1 -0
  200. package/dist/hooks/index.d.ts +3 -0
  201. package/dist/hooks/index.d.ts.map +1 -1
  202. package/dist/hooks/index.js +3 -0
  203. package/dist/hooks/index.js.map +1 -1
  204. package/dist/hooks/useResolvedTheme.d.ts +2 -0
  205. package/dist/hooks/useResolvedTheme.d.ts.map +1 -0
  206. package/dist/hooks/useResolvedTheme.js +24 -0
  207. package/dist/hooks/useResolvedTheme.js.map +1 -0
  208. package/dist/hooks/useShikiHighlight.d.ts +28 -0
  209. package/dist/hooks/useShikiHighlight.d.ts.map +1 -0
  210. package/dist/hooks/useShikiHighlight.js +106 -0
  211. package/dist/hooks/useShikiHighlight.js.map +1 -0
  212. package/dist/hooks/useShikiStyleInjection.d.ts +2 -0
  213. package/dist/hooks/useShikiStyleInjection.d.ts.map +1 -0
  214. package/dist/hooks/useShikiStyleInjection.js +34 -0
  215. package/dist/hooks/useShikiStyleInjection.js.map +1 -0
  216. package/index.css +101 -9
  217. package/package.json +6 -3
  218. package/src/assets/illustration-1.svg +92 -0
  219. package/src/assets/illustration-2.svg +14 -0
  220. package/src/assets/illustration-gradient.svg +7049 -0
  221. package/src/components/alert/alert.stories.tsx +2 -2
  222. package/src/components/alert/alert.tsx +3 -3
  223. package/src/components/avatar/avatar-group.tsx +3 -3
  224. package/src/components/avatar/avatar.stories.tsx +9 -2
  225. package/src/components/avatar/avatar.tsx +10 -6
  226. package/src/components/badge/badge.stories.tsx +468 -0
  227. package/src/components/badge/badge.tsx +147 -0
  228. package/src/components/badge/icon-badge.tsx +43 -0
  229. package/src/components/badge/index.ts +4 -0
  230. package/src/components/badge/status-badge.tsx +43 -0
  231. package/src/components/badge/user-badge.tsx +34 -0
  232. package/src/components/{button.tsx → button/button.tsx} +1 -1
  233. package/src/components/button/index.ts +1 -0
  234. package/src/components/checkbox/checkbox-label.tsx +125 -0
  235. package/src/components/checkbox/checkbox-links.tsx +90 -0
  236. package/src/components/checkbox/checkbox.stories.tsx +375 -0
  237. package/src/components/checkbox/checkbox.tsx +71 -0
  238. package/src/components/checkbox/index.ts +3 -0
  239. package/src/components/code-block/code-block-footer.tsx +173 -0
  240. package/src/components/code-block/code-block.stories.tsx +323 -0
  241. package/src/components/code-block/code-block.tsx +283 -0
  242. package/src/components/code-block/code-content.tsx +60 -0
  243. package/src/components/code-block/code-copy-button.tsx +73 -0
  244. package/src/components/code-block/code-tabs.tsx +170 -0
  245. package/src/components/code-block/index.ts +3 -0
  246. package/src/components/dynamic-item/dynamic-item.stories.tsx +261 -0
  247. package/src/components/dynamic-item/dynamic-item.tsx +68 -0
  248. package/src/components/dynamic-item/index.ts +1 -0
  249. package/src/components/icon/custom/index.ts +2 -0
  250. package/src/components/icon/custom/slack-logo.tsx +35 -0
  251. package/src/components/icon/custom/stripe-logo.tsx +27 -0
  252. package/src/components/icon/icon.stories.tsx +3 -1
  253. package/src/components/icon/icon.tsx +19 -1
  254. package/src/components/index.ts +9 -1
  255. package/src/components/inline-tips/inline-tips.stories.tsx +3 -3
  256. package/src/components/inline-tips/inline-tips.tsx +2 -2
  257. package/src/components/input/index.ts +1 -0
  258. package/src/components/{input.tsx → input/input.tsx} +1 -1
  259. package/src/components/item/index.ts +1 -0
  260. package/src/components/item/item.stories.tsx +150 -0
  261. package/src/components/item/item.tsx +182 -0
  262. package/src/components/label/index.ts +1 -0
  263. package/src/components/label/label.stories.tsx +67 -0
  264. package/src/components/label/label.tsx +15 -0
  265. package/src/components/moving-border/moving-border.tsx +67 -0
  266. package/src/components/textarea/textarea.tsx +1 -1
  267. package/src/components/theme/index.ts +1 -0
  268. package/src/components/toast/index.ts +2 -0
  269. package/src/components/toast/toast-custom.tsx +154 -0
  270. package/src/components/toast/toast.stories.tsx +369 -0
  271. package/src/components/toast/toast.tsx +41 -0
  272. package/src/components/tooltip/index.ts +1 -0
  273. package/src/components/tooltip/tooltip.stories.tsx +284 -0
  274. package/src/components/tooltip/tooltip.tsx +79 -10
  275. package/src/hooks/index.ts +3 -0
  276. package/src/hooks/useResolvedTheme.ts +34 -0
  277. package/src/hooks/useShikiHighlight.ts +140 -0
  278. package/src/hooks/useShikiStyleInjection.ts +34 -0
  279. package/dist/components/button.d.ts.map +0 -1
  280. package/dist/components/button.js.map +0 -1
  281. package/dist/components/button.stories.js.map +0 -1
  282. package/dist/components/input.d.ts.map +0 -1
  283. package/dist/components/input.js.map +0 -1
  284. package/dist/components/input.stories.js.map +0 -1
  285. package/dist/components/theme-provider.d.ts.map +0 -1
  286. package/dist/components/theme-provider.js.map +0 -1
  287. /package/dist/components/{input.d.ts → input/input.d.ts} +0 -0
  288. /package/src/components/{button.stories.tsx → button/button.stories.tsx} +0 -0
  289. /package/src/components/{input.stories.tsx → input/input.stories.tsx} +0 -0
  290. /package/src/components/{theme-provider.tsx → theme/theme-provider.tsx} +0 -0
@@ -0,0 +1,284 @@
1
+ import type {Meta, StoryObj} from '@storybook/react';
2
+ import {Code} from 'components/typography';
3
+ import {Button} from '../button';
4
+ import {Tooltip, TooltipContent, type TooltipContentProps, TooltipTrigger} from './tooltip';
5
+
6
+ type TooltipStoryArgs = {
7
+ defaultOpen?: boolean;
8
+ delayDuration?: number;
9
+ variant?: TooltipContentProps['variant'];
10
+ size?: TooltipContentProps['size'];
11
+ side?: TooltipContentProps['side'];
12
+ align?: TooltipContentProps['align'];
13
+ sideOffset?: TooltipContentProps['sideOffset'];
14
+ animated?: TooltipContentProps['animated'];
15
+ };
16
+
17
+ const meta = {
18
+ title: 'Components/Tooltip',
19
+ component: Tooltip,
20
+ tags: ['autodocs'],
21
+ argTypes: {
22
+ defaultOpen: {control: 'boolean'},
23
+ delayDuration: {control: 'number'},
24
+ variant: {
25
+ control: 'select',
26
+ options: ['default', 'inverted', 'muted'],
27
+ },
28
+ size: {
29
+ control: 'select',
30
+ options: ['sm', 'md', 'lg'],
31
+ },
32
+ side: {
33
+ control: 'select',
34
+ options: ['top', 'bottom', 'left', 'right'],
35
+ },
36
+ align: {
37
+ control: 'select',
38
+ options: ['start', 'center', 'end'],
39
+ },
40
+ sideOffset: {control: 'number'},
41
+ animated: {control: 'boolean'},
42
+ },
43
+ args: {
44
+ defaultOpen: false,
45
+ delayDuration: 0,
46
+ variant: 'default',
47
+ size: 'md',
48
+ side: 'top',
49
+ align: 'center',
50
+ sideOffset: 8,
51
+ animated: true,
52
+ },
53
+ } satisfies Meta<TooltipStoryArgs>;
54
+
55
+ export default meta;
56
+ type Story = StoryObj<typeof meta>;
57
+
58
+ export const Default: Story = {
59
+ args: {
60
+ defaultOpen: false,
61
+ },
62
+
63
+ render: (args: TooltipStoryArgs) => {
64
+ const {defaultOpen, delayDuration, variant, size, side, align, sideOffset, animated} = args;
65
+ return (
66
+ <div className="flex items-center justify-center p-64">
67
+ <Tooltip defaultOpen={defaultOpen} delayDuration={delayDuration}>
68
+ <TooltipTrigger asChild>
69
+ <Button>Hover me</Button>
70
+ </TooltipTrigger>
71
+ <TooltipContent
72
+ variant={variant}
73
+ size={size}
74
+ side={side}
75
+ align={align}
76
+ sideOffset={sideOffset}
77
+ animated={animated}
78
+ >
79
+ Tooltip Text
80
+ </TooltipContent>
81
+ </Tooltip>
82
+ </div>
83
+ );
84
+ },
85
+ };
86
+
87
+ export const Types: Story = {
88
+ render: () => (
89
+ <div className="flex flex-col gap-64 p-64">
90
+ <Code variant="label" className="text-foreground-neutral-subtle">
91
+ TYPES
92
+ </Code>
93
+ <div className="flex flex-col gap-32">
94
+ {/* Text Type */}
95
+ <div className="flex flex-col gap-16">
96
+ <Code variant="label" className="text-foreground-neutral-subtle">
97
+ Type=Text
98
+ </Code>
99
+ <div className="flex gap-16">
100
+ <Tooltip>
101
+ <TooltipTrigger asChild>
102
+ <Button variant="primary">Tooltip Text</Button>
103
+ </TooltipTrigger>
104
+ <TooltipContent variant="inverted">Tooltip Text</TooltipContent>
105
+ </Tooltip>
106
+ <Tooltip>
107
+ <TooltipTrigger asChild>
108
+ <Button variant="secondary">Tooltip Text</Button>
109
+ </TooltipTrigger>
110
+ <TooltipContent>Tooltip Text</TooltipContent>
111
+ </Tooltip>
112
+ </div>
113
+ </div>
114
+
115
+ {/* Shortcut Type */}
116
+ <div className="flex flex-col gap-16">
117
+ <Code variant="label" className="text-foreground-neutral-subtle">
118
+ Type=Shortcut
119
+ </Code>
120
+ <div className="flex gap-16">
121
+ <Tooltip>
122
+ <TooltipTrigger asChild>
123
+ <Button variant="primary">Tooltip Text</Button>
124
+ </TooltipTrigger>
125
+ <TooltipContent variant="inverted">
126
+ <div className="flex items-center gap-6">
127
+ <span>Tooltip Text</span>
128
+ <div className="flex items-center gap-4">
129
+ <kbd className="flex h-16 w-16 items-center justify-center rounded-4 border border-border-neutral-base bg-background-field-base text-sm text-foreground-neutral-subtle">
130
+
131
+ </kbd>
132
+ <kbd className="flex h-16 w-16 items-center justify-center rounded-4 border border-border-neutral-base bg-background-field-base text-sm text-foreground-neutral-subtle">
133
+ /
134
+ </kbd>
135
+ </div>
136
+ </div>
137
+ </TooltipContent>
138
+ </Tooltip>
139
+ <Tooltip>
140
+ <TooltipTrigger asChild>
141
+ <Button variant="secondary">Tooltip Text</Button>
142
+ </TooltipTrigger>
143
+ <TooltipContent>
144
+ <div className="flex items-center gap-6">
145
+ <span>Tooltip Text</span>
146
+ <div className="flex items-center gap-4">
147
+ <kbd className="flex h-16 w-16 items-center justify-center rounded-4 border border-border-neutral-base bg-background-field-base text-xs text-foreground-neutral-subtle">
148
+
149
+ </kbd>
150
+ <kbd className="flex h-16 w-16 items-center justify-center rounded-4 border border-border-neutral-base bg-background-field-base text-xs text-foreground-neutral-subtle">
151
+ /
152
+ </kbd>
153
+ </div>
154
+ </div>
155
+ </TooltipContent>
156
+ </Tooltip>
157
+ </div>
158
+ </div>
159
+
160
+ {/* Graph Type */}
161
+ <div className="flex flex-col gap-16">
162
+ <Code variant="label" className="text-foreground-neutral-subtle">
163
+ Type=Graph
164
+ </Code>
165
+ <div className="flex gap-16">
166
+ <Tooltip>
167
+ <TooltipTrigger asChild>
168
+ <Button variant="primary">Hover for graph data</Button>
169
+ </TooltipTrigger>
170
+ <TooltipContent variant="inverted" className="w-160">
171
+ <div className="flex flex-col gap-4">
172
+ <div className="text-xs text-foreground-neutral-subtle">Jul 22, 2025</div>
173
+ <div className="flex flex-col gap-4">
174
+ <div className="flex items-center justify-between gap-12">
175
+ <div className="flex flex-1 items-center gap-4">
176
+ <div className="size-6 rounded-full bg-purple-500" />
177
+ <span className="text-xs">Data A</span>
178
+ </div>
179
+ <span className="text-xs">$6.14</span>
180
+ </div>
181
+ <div className="flex items-center justify-between gap-12">
182
+ <div className="flex flex-1 items-center gap-4">
183
+ <div className="size-6 rounded-full bg-green-500" />
184
+ <span className="text-xs">Data B</span>
185
+ </div>
186
+ <span className="text-xs">$4.37</span>
187
+ </div>
188
+ <div className="flex items-center justify-between gap-12">
189
+ <div className="flex flex-1 items-center gap-4">
190
+ <div className="size-6 rounded-full bg-orange-500" />
191
+ <span className="text-xs">Data C</span>
192
+ </div>
193
+ <span className="text-xs">$12.88</span>
194
+ </div>
195
+ <div className="flex items-center justify-between gap-12">
196
+ <div className="flex flex-1 items-center gap-4">
197
+ <div className="size-6 rounded-full bg-blue-500" />
198
+ <span className="text-xs">Data D</span>
199
+ </div>
200
+ <span className="text-xs">$2.91</span>
201
+ </div>
202
+ </div>
203
+ </div>
204
+ </TooltipContent>
205
+ </Tooltip>
206
+ <Tooltip>
207
+ <TooltipTrigger asChild>
208
+ <Button variant="secondary">Hover for graph data</Button>
209
+ </TooltipTrigger>
210
+ <TooltipContent className="w-160">
211
+ <div className="flex flex-col gap-4">
212
+ <div className="text-xs text-foreground-neutral-subtle">Jul 22, 2025</div>
213
+ <div className="flex flex-col gap-4">
214
+ <div className="flex items-center justify-between gap-12">
215
+ <div className="flex flex-1 items-center gap-4">
216
+ <div className="size-6 rounded-full bg-purple-500" />
217
+ <span className="text-xs">Data A</span>
218
+ </div>
219
+ <span className="text-xs">$6.14</span>
220
+ </div>
221
+ <div className="flex items-center justify-between gap-12">
222
+ <div className="flex flex-1 items-center gap-4">
223
+ <div className="size-6 rounded-full bg-green-500" />
224
+ <span className="text-xs">Data B</span>
225
+ </div>
226
+ <span className="text-xs">$4.37</span>
227
+ </div>
228
+ <div className="flex items-center justify-between gap-12">
229
+ <div className="flex flex-1 items-center gap-4">
230
+ <div className="size-6 rounded-full bg-orange-500" />
231
+ <span className="text-xs">Data C</span>
232
+ </div>
233
+ <span className="text-xs">$12.88</span>
234
+ </div>
235
+ <div className="flex items-center justify-between gap-12">
236
+ <div className="flex flex-1 items-center gap-4">
237
+ <div className="size-6 rounded-full bg-blue-500" />
238
+ <span className="text-xs">Data D</span>
239
+ </div>
240
+ <span className="text-xs">$2.91</span>
241
+ </div>
242
+ </div>
243
+ </div>
244
+ </TooltipContent>
245
+ </Tooltip>
246
+ </div>
247
+ </div>
248
+
249
+ {/* Breadcrumbs Type */}
250
+ <div className="flex flex-col gap-16">
251
+ <Code variant="label" className="text-foreground-neutral-subtle">
252
+ Type=Breadcrumbs
253
+ </Code>
254
+ <div className="flex gap-16">
255
+ <Tooltip>
256
+ <TooltipTrigger asChild>
257
+ <Button variant="primary">Breadcrumb</Button>
258
+ </TooltipTrigger>
259
+ <TooltipContent variant="inverted">
260
+ <div className="flex items-center gap-6">
261
+ <span>Breadcrumb</span>
262
+ <span className="text-foreground-neutral-muted">/</span>
263
+ <span>Breadcrumb</span>
264
+ </div>
265
+ </TooltipContent>
266
+ </Tooltip>
267
+ <Tooltip>
268
+ <TooltipTrigger asChild>
269
+ <Button variant="secondary">Breadcrumb</Button>
270
+ </TooltipTrigger>
271
+ <TooltipContent>
272
+ <div className="flex items-center gap-6">
273
+ <span>Breadcrumb</span>
274
+ <span className="text-foreground-neutral-muted">/</span>
275
+ <span>Breadcrumb</span>
276
+ </div>
277
+ </TooltipContent>
278
+ </Tooltip>
279
+ </div>
280
+ </div>
281
+ </div>
282
+ </div>
283
+ ),
284
+ };
@@ -1,10 +1,35 @@
1
1
  import * as TooltipPrimitive from '@radix-ui/react-tooltip';
2
+ import {cva, type VariantProps} from 'class-variance-authority';
3
+ import {motion, type Transition} from 'framer-motion';
4
+ import type {ComponentProps} from 'react';
2
5
  import {cn} from 'utils/cn';
3
6
 
7
+ const tooltipContentVariants = cva(
8
+ 'rounded-8 px-8 py-4 text-xs font-medium leading-20 z-50 w-fit text-balance shadow-tooltip',
9
+ {
10
+ variants: {
11
+ variant: {
12
+ default: 'bg-background-components-base text-foreground-neutral-base',
13
+ inverted: 'bg-background-button-inverted-default text-foreground-contrast-primary',
14
+ muted: 'bg-background-neutral-subtle text-foreground-neutral-muted',
15
+ },
16
+ size: {
17
+ sm: 'px-6 py-2 text-xs',
18
+ md: 'px-8 py-4 text-xs',
19
+ lg: 'px-10 py-6 text-sm',
20
+ },
21
+ },
22
+ defaultVariants: {
23
+ variant: 'default',
24
+ size: 'md',
25
+ },
26
+ },
27
+ );
28
+
4
29
  function TooltipProvider({
5
30
  delayDuration = 0,
6
31
  ...props
7
- }: React.ComponentProps<typeof TooltipPrimitive.Provider>) {
32
+ }: ComponentProps<typeof TooltipPrimitive.Provider>) {
8
33
  return (
9
34
  <TooltipPrimitive.Provider
10
35
  data-slot="tooltip-provider"
@@ -14,7 +39,7 @@ function TooltipProvider({
14
39
  );
15
40
  }
16
41
 
17
- function Tooltip({...props}: React.ComponentProps<typeof TooltipPrimitive.Root>) {
42
+ function Tooltip({...props}: ComponentProps<typeof TooltipPrimitive.Root>) {
18
43
  return (
19
44
  <TooltipProvider>
20
45
  <TooltipPrimitive.Root data-slot="tooltip" {...props} />
@@ -22,25 +47,61 @@ function Tooltip({...props}: React.ComponentProps<typeof TooltipPrimitive.Root>)
22
47
  );
23
48
  }
24
49
 
25
- function TooltipTrigger({...props}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {
50
+ function TooltipTrigger({...props}: ComponentProps<typeof TooltipPrimitive.Trigger>) {
26
51
  return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />;
27
52
  }
28
53
 
54
+ const defaultTransition: Transition = {
55
+ type: 'spring',
56
+ stiffness: 300,
57
+ damping: 17,
58
+ };
59
+
60
+ type TooltipContentProps = ComponentProps<typeof TooltipPrimitive.Content> &
61
+ VariantProps<typeof tooltipContentVariants> & {
62
+ animated?: boolean;
63
+ transition?: Transition;
64
+ };
65
+
29
66
  function TooltipContent({
30
67
  className,
31
- sideOffset = 0,
68
+ sideOffset = 8,
32
69
  children,
70
+ variant,
71
+ size,
72
+ animated = true,
73
+ transition = defaultTransition,
33
74
  ...props
34
- }: React.ComponentProps<typeof TooltipPrimitive.Content>) {
75
+ }: TooltipContentProps) {
76
+ if (animated) {
77
+ return (
78
+ <TooltipPrimitive.Portal>
79
+ <TooltipPrimitive.Content
80
+ data-slot="tooltip-content"
81
+ sideOffset={sideOffset}
82
+ asChild
83
+ {...props}
84
+ >
85
+ <motion.div
86
+ className={cn(tooltipContentVariants({variant, size, className}))}
87
+ initial={{opacity: 0, scale: 0.95}}
88
+ animate={{opacity: 1, scale: 1}}
89
+ exit={{opacity: 0, scale: 0.95}}
90
+ transition={transition}
91
+ >
92
+ {children}
93
+ </motion.div>
94
+ </TooltipPrimitive.Content>
95
+ </TooltipPrimitive.Portal>
96
+ );
97
+ }
98
+
35
99
  return (
36
100
  <TooltipPrimitive.Portal>
37
101
  <TooltipPrimitive.Content
38
102
  data-slot="tooltip-content"
39
103
  sideOffset={sideOffset}
40
- className={cn(
41
- 'rounded-8 bg-background-components-base text-foreground-neutral-base px-8 py-4 text-xs font-medium leading-20 shadow-button-neutral animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md text-balance',
42
- className,
43
- )}
104
+ className={cn(tooltipContentVariants({variant, size, className}))}
44
105
  {...props}
45
106
  >
46
107
  {children}
@@ -49,4 +110,12 @@ function TooltipContent({
49
110
  );
50
111
  }
51
112
 
52
- export {Tooltip, TooltipTrigger, TooltipContent, TooltipProvider};
113
+ export {
114
+ Tooltip,
115
+ TooltipTrigger,
116
+ TooltipContent,
117
+ TooltipProvider,
118
+ tooltipContentVariants,
119
+ defaultTransition,
120
+ };
121
+ export type {TooltipContentProps};
@@ -1,2 +1,5 @@
1
1
  export * from './useCopyToClipboard';
2
+ export * from './useResolvedTheme';
3
+ export * from './useShikiHighlight';
4
+ export * from './useShikiStyleInjection';
2
5
  export * from './useTheme';
@@ -0,0 +1,34 @@
1
+ import {useSyncExternalStore} from 'react';
2
+ import {useTheme} from './useTheme';
3
+
4
+ export function useResolvedTheme(): 'light' | 'dark' {
5
+ const {theme} = useTheme();
6
+
7
+ const systemTheme = useSyncExternalStore<'light' | 'dark'>(
8
+ (callback) => {
9
+ if (typeof window === 'undefined' || theme !== 'system') {
10
+ return () => {
11
+ // No-op unsubscribe
12
+ };
13
+ }
14
+ const mql = window.matchMedia('(prefers-color-scheme: dark)');
15
+ mql.addEventListener('change', callback);
16
+ return () => {
17
+ mql.removeEventListener('change', callback);
18
+ };
19
+ },
20
+ (): 'light' | 'dark' =>
21
+ typeof window !== 'undefined' && theme === 'system'
22
+ ? window.matchMedia('(prefers-color-scheme: dark)').matches
23
+ ? 'dark'
24
+ : 'light'
25
+ : 'light',
26
+ (): 'light' | 'dark' => 'light', // Server snapshot
27
+ );
28
+
29
+ if (theme === 'system') {
30
+ return systemTheme;
31
+ }
32
+ // TypeScript should narrow theme to 'light' | 'dark' here
33
+ return theme as 'light' | 'dark';
34
+ }
@@ -0,0 +1,140 @@
1
+ import {useEffect, useState} from 'react';
2
+
3
+ type ShikiThemes = {
4
+ light: string;
5
+ dark: string;
6
+ };
7
+
8
+ type UseShikiHighlightOptions = {
9
+ code: string;
10
+ lang: string;
11
+ themes: ShikiThemes;
12
+ resolvedTheme: 'light' | 'dark';
13
+ syntaxHighlighting: boolean;
14
+ };
15
+
16
+ export function useShikiHighlight({
17
+ code,
18
+ lang,
19
+ themes,
20
+ resolvedTheme,
21
+ syntaxHighlighting,
22
+ }: UseShikiHighlightOptions): {highlightedCode: string; isLoading: boolean} {
23
+ const [highlightedCode, setHighlightedCode] = useState<string>('');
24
+ const [isLoading, setIsLoading] = useState(syntaxHighlighting);
25
+
26
+ useEffect(() => {
27
+ if (!syntaxHighlighting) {
28
+ setIsLoading(false);
29
+ return;
30
+ }
31
+
32
+ setIsLoading(true);
33
+ let cancelled = false;
34
+
35
+ const loadHighlightedCode = async () => {
36
+ try {
37
+ const {codeToHtml} = await import('shiki');
38
+
39
+ const html = await codeToHtml(code, {
40
+ lang,
41
+ themes: {
42
+ light: themes.light,
43
+ dark: themes.dark,
44
+ },
45
+ defaultColor: resolvedTheme === 'dark' ? 'dark' : 'light',
46
+ });
47
+
48
+ if (!cancelled) {
49
+ setHighlightedCode(html);
50
+ setIsLoading(false);
51
+ }
52
+ } catch {
53
+ if (!cancelled) {
54
+ setIsLoading(false);
55
+ }
56
+ }
57
+ };
58
+
59
+ loadHighlightedCode();
60
+
61
+ return () => {
62
+ cancelled = true;
63
+ };
64
+ }, [code, lang, themes.light, themes.dark, resolvedTheme, syntaxHighlighting]);
65
+
66
+ return {highlightedCode, isLoading};
67
+ }
68
+
69
+ type UseShikiHighlightMultipleOptions = {
70
+ codes: Record<string, string>;
71
+ lang: string;
72
+ themes: ShikiThemes;
73
+ resolvedTheme: 'light' | 'dark';
74
+ syntaxHighlighting: boolean;
75
+ };
76
+
77
+ export function useShikiHighlightMultiple({
78
+ codes,
79
+ lang,
80
+ themes,
81
+ resolvedTheme,
82
+ syntaxHighlighting,
83
+ }: UseShikiHighlightMultipleOptions): {
84
+ highlightedCodes: Record<string, string>;
85
+ isLoading: boolean;
86
+ } {
87
+ const [highlightedCodes, setHighlightedCodes] = useState<Record<string, string>>({});
88
+ const [isLoading, setIsLoading] = useState(syntaxHighlighting);
89
+
90
+ useEffect(() => {
91
+ if (!syntaxHighlighting) {
92
+ setIsLoading(false);
93
+ return;
94
+ }
95
+
96
+ setIsLoading(true);
97
+ let cancelled = false;
98
+
99
+ const loadHighlightedCode = async () => {
100
+ try {
101
+ const {codeToHtml} = await import('shiki');
102
+ const newHighlightedCodes: Record<string, string> = {};
103
+
104
+ for (const [command, val] of Object.entries(codes)) {
105
+ if (cancelled) {
106
+ return;
107
+ }
108
+
109
+ const highlighted = await codeToHtml(val, {
110
+ lang,
111
+ themes: {
112
+ light: themes.light,
113
+ dark: themes.dark,
114
+ },
115
+ defaultColor: resolvedTheme === 'dark' ? 'dark' : 'light',
116
+ });
117
+
118
+ newHighlightedCodes[command] = highlighted;
119
+ }
120
+
121
+ if (!cancelled) {
122
+ setHighlightedCodes(newHighlightedCodes);
123
+ setIsLoading(false);
124
+ }
125
+ } catch {
126
+ if (!cancelled) {
127
+ setIsLoading(false);
128
+ }
129
+ }
130
+ };
131
+
132
+ loadHighlightedCode();
133
+
134
+ return () => {
135
+ cancelled = true;
136
+ };
137
+ }, [resolvedTheme, lang, themes.light, themes.dark, codes, syntaxHighlighting]);
138
+
139
+ return {highlightedCodes, isLoading};
140
+ }
@@ -0,0 +1,34 @@
1
+ import {useEffect} from 'react';
2
+
3
+ export function useShikiStyleInjection(syntaxHighlighting: boolean): void {
4
+ useEffect(() => {
5
+ if (!syntaxHighlighting) {
6
+ return;
7
+ }
8
+
9
+ const styleId = 'shiki-override-styles';
10
+ if (document.getElementById(styleId)) {
11
+ return;
12
+ }
13
+
14
+ const style = document.createElement('style');
15
+ style.id = styleId;
16
+ style.textContent = `
17
+ .shiki-override pre,
18
+ .shiki-override code,
19
+ .shiki-override pre *,
20
+ .shiki-override code * {
21
+ background: transparent !important;
22
+ font-family: "Commit Mono", monospace !important;
23
+ }
24
+ `;
25
+ document.head.appendChild(style);
26
+
27
+ return () => {
28
+ const existingStyle = document.getElementById(styleId);
29
+ if (existingStyle) {
30
+ existingStyle.remove();
31
+ }
32
+ };
33
+ }, [syntaxHighlighting]);
34
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../src/components/button.tsx"],"names":[],"mappings":"AACA,OAAO,EAAM,KAAK,YAAY,EAAC,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAO,KAAK,QAAQ,EAAC,MAAM,aAAa,CAAC;AAEhD,eAAO,MAAM,cAAc;;;8EA8B1B,CAAC;AAEF,wBAAgB,MAAM,CAAC,EACrB,SAAS,EACT,OAAO,EACP,IAAI,EACJ,OAAe,EACf,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,QAAQ,CAAC,GACzB,YAAY,CAAC,OAAO,cAAc,CAAC,GAAG;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,SAAS,CAAC,EAAE,QAAQ,CAAC;CACtB,2CAUF"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/button.tsx"],"sourcesContent":["import {Slot} from '@radix-ui/react-slot';\nimport {cva, type VariantProps} from 'class-variance-authority';\nimport type {ComponentProps} from 'react';\nimport {cn} from 'utils/cn';\nimport {Icon, type IconName} from './icon/icon';\n\nexport const buttonVariants = cva(\n 'rounded-6 inline-flex items-center justify-center whitespace-nowrap transition-colors disabled:pointer-events-none shrink-0 outline-none',\n {\n variants: {\n variant: {\n primary:\n 'bg-background-button-inverted-default text-foreground-contrast-primary shadow-button-inverted hover:bg-background-button-inverted-hover active:bg-background-button-inverted-pressed focus-visible:shadow-button-inverted-focus disabled:bg-background-neutral-disabled disabled:text-foreground-neutral-disabled disabled:shadow-none',\n secondary:\n 'bg-background-button-neutral-default text-foreground-neutral-base shadow-button-neutral hover:bg-background-button-neutral-hover active:bg-background-button-neutral-pressed disabled:bg-background-neutral-disabled focus-visible:shadow-button-neutral-focus disabled:text-foreground-neutral-disabled disabled:shadow-none',\n danger:\n 'bg-background-button-danger-default text-foreground-neutral-on-color shadow-button-danger hover:bg-background-button-danger-hover active:bg-background-button-danger-pressed focus-visible:shadow-button-danger-focus disabled:bg-background-neutral-disabled disabled:text-foreground-neutral-disabled disabled:shadow-none',\n transparent:\n 'bg-background-button-transparent-default text-foreground-neutral-base hover:bg-background-button-transparent-hover active:bg-background-button-transparent-pressed focus-visible:shadow-button-neutral-focus disabled:text-foreground-neutral-disabled',\n transparentMuted:\n 'bg-background-button-transparent-default text-foreground-neutral-muted hover:bg-background-button-transparent-hover active:bg-background-button-transparent-pressed focus-visible:shadow-button-neutral-focus disabled:text-foreground-neutral-disabled',\n },\n size: {\n '2xs': 'px-6 text-xs gap-4',\n xs: 'px-6 py-2 text-xs gap-4',\n sm: 'px-8 py-4 text-sm gap-6',\n md: 'px-10 py-6 text-md gap-8',\n lg: 'px-12 py-8 text-lg gap-8',\n xl: 'px-12 py-10 text-xl gap-10',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n },\n },\n);\n\nexport function Button({\n className,\n variant,\n size,\n asChild = false,\n children,\n iconLeft,\n iconRight,\n ...props\n}: ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n iconLeft?: IconName;\n iconRight?: IconName;\n }) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp data-slot=\"button\" className={cn(buttonVariants({variant, size, className}))} {...props}>\n {iconLeft && <Icon name={iconLeft} />}\n {children}\n {iconRight && <Icon name={iconRight} />}\n </Comp>\n );\n}\n"],"names":["Slot","cva","cn","Icon","buttonVariants","variants","variant","primary","secondary","danger","transparent","transparentMuted","size","xs","sm","md","lg","xl","defaultVariants","Button","className","asChild","children","iconLeft","iconRight","props","Comp","data-slot","name"],"mappings":";AAAA,SAAQA,IAAI,QAAO,uBAAuB;AAC1C,SAAQC,GAAG,QAA0B,2BAA2B;AAEhE,SAAQC,EAAE,QAAO,WAAW;AAC5B,SAAQC,IAAI,QAAsB,cAAc;AAEhD,OAAO,MAAMC,iBAAiBH,IAC5B,4IACA;IACEI,UAAU;QACRC,SAAS;YACPC,SACE;YACFC,WACE;YACFC,QACE;YACFC,aACE;YACFC,kBACE;QACJ;QACAC,MAAM;YACJ,OAAO;YACPC,IAAI;YACJC,IAAI;YACJC,IAAI;YACJC,IAAI;YACJC,IAAI;QACN;IACF;IACAC,iBAAiB;QACfZ,SAAS;QACTM,MAAM;IACR;AACF,GACA;AAEF,OAAO,SAASO,OAAO,EACrBC,SAAS,EACTd,OAAO,EACPM,IAAI,EACJS,UAAU,KAAK,EACfC,QAAQ,EACRC,QAAQ,EACRC,SAAS,EACT,GAAGC,OAMF;IACD,MAAMC,OAAOL,UAAUrB,OAAO;IAE9B,qBACE,MAAC0B;QAAKC,aAAU;QAASP,WAAWlB,GAAGE,eAAe;YAACE;YAASM;YAAMQ;QAAS;QAAM,GAAGK,KAAK;;YAC1FF,0BAAY,KAACpB;gBAAKyB,MAAML;;YACxBD;YACAE,2BAAa,KAACrB;gBAAKyB,MAAMJ;;;;AAGhC"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/button.stories.tsx"],"sourcesContent":["import type {Meta, StoryObj} from '@storybook/react';\nimport {Code} from 'components/typography';\nimport {Button} from './button';\n\nconst variantOptions = [\n 'primary',\n 'secondary',\n 'danger',\n 'transparent',\n 'transparentMuted',\n] as const;\nconst sizeOptions = ['2xs', 'xs', 'sm', 'md', 'lg', 'xl'] as const;\n\nconst meta = {\n title: 'Components/Button',\n component: Button,\n tags: ['autodocs'],\n argTypes: {\n variant: {\n control: 'select',\n options: variantOptions,\n },\n size: {\n control: 'select',\n options: sizeOptions,\n },\n asChild: {control: 'boolean'},\n },\n args: {\n children: 'Click me',\n variant: 'primary',\n size: 'md',\n },\n} satisfies Meta<typeof Button>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Default: Story = {};\n\nexport const Variants: Story = {\n render: (args) => (\n <div className=\"flex flex-col gap-32\">\n {sizeOptions.map((size) => (\n <table key={size} className=\"w-fit border-separate border-spacing-x-32 border-spacing-y-16\">\n <thead>\n <tr>\n <th>{size}</th>\n <th>Default</th>\n <th>Hover</th>\n <th>Active</th>\n <th>Focus</th>\n <th>Disabled</th>\n </tr>\n </thead>\n <tbody>\n {variantOptions.map((variant) => (\n <tr key={variant}>\n <td>\n <Code variant=\"label\" className=\"text-foreground-neutral-subtle\">\n {variant}\n </Code>\n </td>\n <td>\n <Button {...args} variant={variant} size={size}>\n Click me\n </Button>\n </td>\n <td>\n <Button {...args} variant={variant} className=\"hover\" size={size}>\n Click me\n </Button>\n </td>\n <td>\n <Button {...args} variant={variant} className=\"active\" size={size}>\n Click me\n </Button>\n </td>\n <td>\n <Button {...args} variant={variant} className=\"focus\" size={size}>\n Click me\n </Button>\n </td>\n <td>\n <Button {...args} variant={variant} disabled size={size}>\n Click me\n </Button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n ))}\n </div>\n ),\n};\n\nVariants.parameters = {\n pseudo: {\n hover: '.hover',\n active: '.active',\n focusVisible: '.focus',\n },\n};\n\nexport const Icons: Story = {\n render: (args) => (\n <div className=\"flex flex-col gap-16\">\n <div>\n <Button {...args} iconLeft=\"google\">\n Click me\n </Button>\n </div>\n <div>\n <Button {...args} iconRight=\"microsoft\">\n Click me\n </Button>\n </div>\n <div>\n <Button {...args} iconLeft=\"google\" iconRight=\"microsoft\">\n Click me\n </Button>\n </div>\n </div>\n ),\n};\n"],"names":["Code","Button","variantOptions","sizeOptions","meta","title","component","tags","argTypes","variant","control","options","size","asChild","args","children","Default","Variants","render","div","className","map","table","thead","tr","th","tbody","td","disabled","parameters","pseudo","hover","active","focusVisible","Icons","iconLeft","iconRight"],"mappings":";AACA,SAAQA,IAAI,QAAO,wBAAwB;AAC3C,SAAQC,MAAM,QAAO,WAAW;AAEhC,MAAMC,iBAAiB;IACrB;IACA;IACA;IACA;IACA;CACD;AACD,MAAMC,cAAc;IAAC;IAAO;IAAM;IAAM;IAAM;IAAM;CAAK;AAEzD,MAAMC,OAAO;IACXC,OAAO;IACPC,WAAWL;IACXM,MAAM;QAAC;KAAW;IAClBC,UAAU;QACRC,SAAS;YACPC,SAAS;YACTC,SAAST;QACX;QACAU,MAAM;YACJF,SAAS;YACTC,SAASR;QACX;QACAU,SAAS;YAACH,SAAS;QAAS;IAC9B;IACAI,MAAM;QACJC,UAAU;QACVN,SAAS;QACTG,MAAM;IACR;AACF;AAEA,eAAeR,KAAK;AAGpB,OAAO,MAAMY,UAAiB,CAAC,EAAE;AAEjC,OAAO,MAAMC,WAAkB;IAC7BC,QAAQ,CAACJ,qBACP,KAACK;YAAIC,WAAU;sBACZjB,YAAYkB,GAAG,CAAC,CAACT,qBAChB,MAACU;oBAAiBF,WAAU;;sCAC1B,KAACG;sCACC,cAAA,MAACC;;kDACC,KAACC;kDAAIb;;kDACL,KAACa;kDAAG;;kDACJ,KAACA;kDAAG;;kDACJ,KAACA;kDAAG;;kDACJ,KAACA;kDAAG;;kDACJ,KAACA;kDAAG;;;;;sCAGR,KAACC;sCACExB,eAAemB,GAAG,CAAC,CAACZ,wBACnB,MAACe;;sDACC,KAACG;sDACC,cAAA,KAAC3B;gDAAKS,SAAQ;gDAAQW,WAAU;0DAC7BX;;;sDAGL,KAACkB;sDACC,cAAA,KAAC1B;gDAAQ,GAAGa,IAAI;gDAAEL,SAASA;gDAASG,MAAMA;0DAAM;;;sDAIlD,KAACe;sDACC,cAAA,KAAC1B;gDAAQ,GAAGa,IAAI;gDAAEL,SAASA;gDAASW,WAAU;gDAAQR,MAAMA;0DAAM;;;sDAIpE,KAACe;sDACC,cAAA,KAAC1B;gDAAQ,GAAGa,IAAI;gDAAEL,SAASA;gDAASW,WAAU;gDAASR,MAAMA;0DAAM;;;sDAIrE,KAACe;sDACC,cAAA,KAAC1B;gDAAQ,GAAGa,IAAI;gDAAEL,SAASA;gDAASW,WAAU;gDAAQR,MAAMA;0DAAM;;;sDAIpE,KAACe;sDACC,cAAA,KAAC1B;gDAAQ,GAAGa,IAAI;gDAAEL,SAASA;gDAASmB,QAAQ;gDAAChB,MAAMA;0DAAM;;;;mCA3BpDH;;;mBAbHG;;AAmDpB,EAAE;AAEFK,SAASY,UAAU,GAAG;IACpBC,QAAQ;QACNC,OAAO;QACPC,QAAQ;QACRC,cAAc;IAChB;AACF;AAEA,OAAO,MAAMC,QAAe;IAC1BhB,QAAQ,CAACJ,qBACP,MAACK;YAAIC,WAAU;;8BACb,KAACD;8BACC,cAAA,KAAClB;wBAAQ,GAAGa,IAAI;wBAAEqB,UAAS;kCAAS;;;8BAItC,KAAChB;8BACC,cAAA,KAAClB;wBAAQ,GAAGa,IAAI;wBAAEsB,WAAU;kCAAY;;;8BAI1C,KAACjB;8BACC,cAAA,KAAClB;wBAAQ,GAAGa,IAAI;wBAAEqB,UAAS;wBAASC,WAAU;kCAAY;;;;;AAMlE,EAAE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/components/input.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAM,KAAK,YAAY,EAAC,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,OAAO,CAAC;AAG1C,eAAO,MAAM,aAAa;;;8EAexB,CAAC;AAEH,KAAK,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC;AAE7F,wBAAgB,KAAK,CAAC,EAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,EAAC,EAAE,UAAU,2CAmB3E"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/input.tsx"],"sourcesContent":["import {cva, type VariantProps} from 'class-variance-authority';\nimport type {ComponentProps} from 'react';\nimport {cn} from 'utils/cn';\n\nexport const inputVariants = cva('', {\n variants: {\n variant: {\n base: 'bg-background-field-base',\n component: 'bg-background-field-component',\n },\n size: {\n base: 'py-6',\n small: 'py-4',\n },\n },\n defaultVariants: {\n variant: 'base',\n size: 'base',\n },\n});\n\ntype InputProps = Omit<ComponentProps<'input'>, 'size'> & VariantProps<typeof inputVariants>;\n\nexport function Input({className, type, variant, size, ...props}: InputProps) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n 'placeholder:text-foreground-neutral-muted w-full min-w-0 rounded-6 px-8 text-sm leading-20 text-foreground-neutral-base shadow-border-base transition-[color,box-shadow] outline-none',\n 'hover:bg-background-field-hover',\n 'selection:bg-background-accent-neutral-soft selection:text-foreground-neutral-on-inverted',\n 'file:text-foreground-neutral-base file:inline-flex file:font-medium',\n 'disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-background-neutral-disabled disabled:shadow-none disabled:text-foreground-neutral-disabled',\n 'focus-visible:shadow-border-interactive-with-active',\n 'aria-invalid:shadow-border-error',\n inputVariants({variant, size}),\n className,\n )}\n {...props}\n />\n );\n}\n"],"names":["cva","cn","inputVariants","variants","variant","base","component","size","small","defaultVariants","Input","className","type","props","input","data-slot"],"mappings":";AAAA,SAAQA,GAAG,QAA0B,2BAA2B;AAEhE,SAAQC,EAAE,QAAO,WAAW;AAE5B,OAAO,MAAMC,gBAAgBF,IAAI,IAAI;IACnCG,UAAU;QACRC,SAAS;YACPC,MAAM;YACNC,WAAW;QACb;QACAC,MAAM;YACJF,MAAM;YACNG,OAAO;QACT;IACF;IACAC,iBAAiB;QACfL,SAAS;QACTG,MAAM;IACR;AACF,GAAG;AAIH,OAAO,SAASG,MAAM,EAACC,SAAS,EAAEC,IAAI,EAAER,OAAO,EAAEG,IAAI,EAAE,GAAGM,OAAkB;IAC1E,qBACE,KAACC;QACCF,MAAMA;QACNG,aAAU;QACVJ,WAAWV,GACT,yLACA,mCACA,6FACA,uEACA,mKACA,uDACA,oCACAC,cAAc;YAACE;YAASG;QAAI,IAC5BI;QAED,GAAGE,KAAK;;AAGf"}