@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
@@ -1,9 +1,16 @@
1
1
  import {
2
2
  type RemixiconComponentType,
3
+ RiCheckLine,
3
4
  RiCloseLine,
5
+ RiFileCopyLine,
6
+ RiGithubFill,
4
7
  RiGoogleFill,
8
+ RiHomeSmileFill,
5
9
  RiImageAddFill,
10
+ RiInformationFill,
6
11
  RiMicrosoftFill,
12
+ RiMoneyDollarCircleLine,
13
+ RiSubtractLine,
7
14
  } from '@remixicon/react';
8
15
  import type {ComponentProps} from 'react';
9
16
  import {
@@ -16,7 +23,9 @@ import {
16
23
  InfoTooltipFillIcon,
17
24
  ResizeIcon,
18
25
  ShipfoxLogo,
26
+ SlackLogo,
19
27
  SpinnerIcon,
28
+ StripeLogo,
20
29
  ThunderIcon,
21
30
  XCircleSolidIcon,
22
31
  } from './custom';
@@ -37,7 +46,16 @@ const iconsMap = {
37
46
  componentLine: ComponentLineIcon,
38
47
  imageAdd: RiImageAddFill,
39
48
  close: RiCloseLine,
40
- shipfoxLogo: ShipfoxLogo,
49
+ shipfox: ShipfoxLogo,
50
+ slack: SlackLogo,
51
+ stripe: StripeLogo,
52
+ github: RiGithubFill,
53
+ check: RiCheckLine,
54
+ subtractLine: RiSubtractLine,
55
+ info: RiInformationFill,
56
+ money: RiMoneyDollarCircleLine,
57
+ homeSmile: RiHomeSmileFill,
58
+ copy: RiFileCopyLine,
41
59
  } as const satisfies Record<string, RemixiconComponentType>;
42
60
 
43
61
  export type IconName = keyof typeof iconsMap;
@@ -1,8 +1,16 @@
1
1
  export * from './alert';
2
2
  export * from './avatar';
3
+ export * from './badge';
3
4
  export * from './button';
5
+ export * from './checkbox';
6
+ export * from './code-block';
7
+ export * from './dynamic-item';
4
8
  export * from './icon';
5
9
  export * from './inline-tips';
10
+ export * from './input';
11
+ export * from './item';
12
+ export * from './label';
6
13
  export * from './textarea';
7
- export * from './theme-provider';
14
+ export * from './theme';
15
+ export * from './toast';
8
16
  export * from './typography';
@@ -16,7 +16,7 @@ const meta = {
16
16
  argTypes: {
17
17
  type: {
18
18
  control: 'select',
19
- options: ['default', 'info', 'success', 'destructive'],
19
+ options: ['default', 'info', 'success', 'error'],
20
20
  },
21
21
  variant: {
22
22
  control: 'select',
@@ -33,7 +33,7 @@ export default meta;
33
33
 
34
34
  type Story = StoryObj<typeof meta>;
35
35
 
36
- const types = ['default', 'info', 'success', 'destructive'] as const;
36
+ const types = ['default', 'info', 'success', 'error'] as const;
37
37
  const variants = ['primary', 'secondary'] as const;
38
38
 
39
39
  export const Default: Story = {
@@ -80,7 +80,7 @@ export const DesignMock: Story = {
80
80
  default: {title: 'Title', description: 'Description'},
81
81
  info: {title: 'Title', description: 'Description'},
82
82
  success: {title: 'Title', description: 'Description'},
83
- destructive: {title: "Don't's", description: 'Title'},
83
+ error: {title: 'Title', description: 'Description'},
84
84
  };
85
85
 
86
86
  return (
@@ -21,7 +21,7 @@ const inlineTipsLineVariants = cva('w-4 self-stretch my-4 rounded-full', {
21
21
  default: 'bg-tag-neutral-icon',
22
22
  info: 'bg-tag-warning-icon',
23
23
  success: 'bg-tag-success-icon',
24
- destructive: 'bg-tag-error-icon',
24
+ error: 'bg-tag-error-icon',
25
25
  },
26
26
  },
27
27
  defaultVariants: {
@@ -31,7 +31,7 @@ const inlineTipsLineVariants = cva('w-4 self-stretch my-4 rounded-full', {
31
31
 
32
32
  type InlineTipsProps = ComponentProps<'div'> &
33
33
  VariantProps<typeof inlineTipsBaseVariants> & {
34
- type?: 'default' | 'info' | 'success' | 'destructive';
34
+ type?: 'default' | 'info' | 'success' | 'error';
35
35
  };
36
36
 
37
37
  function InlineTips({className, variant, type = 'default', children, ...props}: InlineTipsProps) {
@@ -0,0 +1 @@
1
+ export * from './input';
@@ -27,7 +27,7 @@ export function Input({className, type, variant, size, ...props}: InputProps) {
27
27
  type={type}
28
28
  data-slot="input"
29
29
  className={cn(
30
- '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',
30
+ 'placeholder:text-foreground-neutral-muted w-full min-w-0 rounded-6 px-8 text-sm leading-20 text-foreground-neutral-base shadow-button-neutral transition-[color,box-shadow] outline-none',
31
31
  'hover:bg-background-field-hover',
32
32
  'selection:bg-background-accent-neutral-soft selection:text-foreground-neutral-on-inverted',
33
33
  'file:text-foreground-neutral-base file:inline-flex file:font-medium',
@@ -0,0 +1 @@
1
+ export * from './item';
@@ -0,0 +1,150 @@
1
+ import type {Meta, StoryObj} from '@storybook/react';
2
+ import {Button} from 'components/button/button';
3
+ import {Icon} from 'components/icon/icon';
4
+ import {Input} from 'components/input/input';
5
+ import {Label} from 'components/label/label';
6
+ import {
7
+ Item,
8
+ ItemActions,
9
+ ItemContent,
10
+ ItemDescription,
11
+ ItemFooter,
12
+ ItemGroup,
13
+ ItemHeader,
14
+ ItemSeparator,
15
+ ItemTitle,
16
+ } from './item';
17
+
18
+ const meta = {
19
+ title: 'Components/Item',
20
+ component: Item,
21
+ tags: ['autodocs'],
22
+ argTypes: {
23
+ variant: {
24
+ control: 'select',
25
+ options: ['default', 'neutral'],
26
+ },
27
+ size: {
28
+ control: 'select',
29
+ options: ['default', 'sm'],
30
+ },
31
+ },
32
+ args: {
33
+ variant: 'default',
34
+ size: 'default',
35
+ },
36
+ } satisfies Meta<typeof Item>;
37
+
38
+ export default meta;
39
+ type Story = StoryObj<typeof meta>;
40
+
41
+ export const Default: Story = {
42
+ args: {
43
+ variant: 'default',
44
+ },
45
+ render: (args) => (
46
+ <Item {...args} className="px-12 py-12">
47
+ <ItemContent>
48
+ <ItemTitle>Basic Item</ItemTitle>
49
+ <ItemDescription>A simple item with title and description.</ItemDescription>
50
+ </ItemContent>
51
+ <ItemActions className="pt-8">
52
+ <Button variant="secondary" size="sm">
53
+ Action
54
+ </Button>
55
+ </ItemActions>
56
+ </Item>
57
+ ),
58
+ };
59
+
60
+ export const Variants: Story = {
61
+ args: {},
62
+ render: () => (
63
+ <ItemGroup className="flex w-full max-w-md flex-col gap-12">
64
+ <Item variant="default" className="px-12 py-12">
65
+ <ItemContent>
66
+ <ItemTitle>Default Variant</ItemTitle>
67
+ <ItemDescription>Standard styling with subtle background and borders.</ItemDescription>
68
+ </ItemContent>
69
+ <ItemActions className="pt-8">
70
+ <Button variant="secondary" size="sm">
71
+ Action
72
+ </Button>
73
+ </ItemActions>
74
+ </Item>
75
+ <Item variant="neutral" className="px-12 py-12">
76
+ <ItemContent>
77
+ <ItemTitle>Neutral Variant</ItemTitle>
78
+ <ItemDescription>Neutral style with subtle background and borders.</ItemDescription>
79
+ </ItemContent>
80
+ <ItemActions className="pt-8">
81
+ <Button variant="primary" size="sm">
82
+ Action
83
+ </Button>
84
+ </ItemActions>
85
+ </Item>
86
+ </ItemGroup>
87
+ ),
88
+ };
89
+
90
+ export const ImportPastJobsModal: Story = {
91
+ args: {},
92
+ render: () => (
93
+ <div className="flex w-full max-w-lg flex-col">
94
+ <Item variant="neutral">
95
+ <ItemHeader className="justify-between px-24 py-16">
96
+ <ItemTitle className="text-lg font-medium text-foreground-neutral-base">
97
+ Import past jobs from Github
98
+ </ItemTitle>
99
+ <div className="flex items-center gap-8">
100
+ <kbd className="flex items-center justify-center rounded-8 border border-border-neutral-base shadow-button-neutral bg-background-field-base text-xs text-foreground-neutral-subtle px-4">
101
+ esc
102
+ </kbd>
103
+ <Button
104
+ variant="transparent"
105
+ size="xs"
106
+ className="rounded-4 p-2 cursor-pointer bg-transparent border-none text-foreground-neutral-muted hover:text-foreground-neutral-base hover:bg-background-components-hover transition-colors duration-150 outline-none focus-visible:ring-2 focus-visible:ring-background-accent-blue-base focus-visible:ring-offset-2 w-24 h-24"
107
+ >
108
+ <Icon name="close" />
109
+ </Button>
110
+ </div>
111
+ </ItemHeader>
112
+ <ItemSeparator />
113
+ <ItemContent className="px-24 py-16">
114
+ <ItemDescription className="mb-16 text-sm text-foreground-neutral-subtle">
115
+ Backfill your CI history by importing past runs from your Github repo. We'll handle the
116
+ rest by creating a background task to import the data for you.
117
+ </ItemDescription>
118
+ <div className="flex flex-col gap-20">
119
+ <div className="flex flex-col gap-8">
120
+ <Label htmlFor="repo-owner">Repository owner</Label>
121
+ <Input id="repo-owner" type="text" defaultValue="apache" />
122
+ </div>
123
+ <div className="flex flex-col gap-8">
124
+ <Label htmlFor="repo-name">Repository name</Label>
125
+ <Input id="repo-name" type="text" defaultValue="kafka" />
126
+ </div>
127
+ <div className="flex flex-col gap-8">
128
+ <Label htmlFor="start-date">Start date</Label>
129
+ <Input
130
+ id="start-date"
131
+ type="datetime-local"
132
+ defaultValue="September 5th, 2025"
133
+ className="pl-32"
134
+ />
135
+ </div>
136
+ </div>
137
+ </ItemContent>
138
+ <ItemSeparator />
139
+ <ItemFooter className="justify-end gap-8 px-24 py-16">
140
+ <Button variant="transparent" size="sm">
141
+ Cancel
142
+ </Button>
143
+ <Button variant="primary" size="sm">
144
+ Import
145
+ </Button>
146
+ </ItemFooter>
147
+ </Item>
148
+ </div>
149
+ ),
150
+ };
@@ -0,0 +1,182 @@
1
+ import {Slot} from '@radix-ui/react-slot';
2
+ import {cva, type VariantProps} from 'class-variance-authority';
3
+ import type {ComponentProps} from 'react';
4
+ import {cn} from 'utils/cn';
5
+
6
+ export const itemVariants = cva('transition-all duration-150 rounded-8', {
7
+ variants: {
8
+ variant: {
9
+ default:
10
+ 'bg-background-components-base text-foreground-neutral-base border border-border-neutral-base shadow-button-neutral',
11
+ neutral:
12
+ 'bg-background-neutral-base text-foreground-neutral-base border border-border-neutral-base shadow-button-neutral',
13
+ },
14
+ size: {
15
+ default: '',
16
+ sm: '',
17
+ },
18
+ },
19
+ defaultVariants: {
20
+ variant: 'default',
21
+ size: 'default',
22
+ },
23
+ });
24
+
25
+ export type ItemProps = ComponentProps<'div'> &
26
+ VariantProps<typeof itemVariants> & {
27
+ asChild?: boolean;
28
+ };
29
+
30
+ export function Item({className, variant, size, asChild = false, children, ...props}: ItemProps) {
31
+ const Comp = asChild ? Slot : 'div';
32
+
33
+ return (
34
+ <Comp data-slot="item" className={cn(itemVariants({variant, size}), className)} {...props}>
35
+ {children}
36
+ </Comp>
37
+ );
38
+ }
39
+
40
+ // ItemGroup
41
+ export type ItemGroupProps = ComponentProps<'div'>;
42
+
43
+ export function ItemGroup({className, children, ...props}: ItemGroupProps) {
44
+ return (
45
+ <div data-slot="item-group" className={cn('flex flex-col', className)} {...props}>
46
+ {children}
47
+ </div>
48
+ );
49
+ }
50
+
51
+ // ItemActions
52
+ export type ItemActionsProps = ComponentProps<'div'>;
53
+
54
+ export function ItemActions({className, children, ...props}: ItemActionsProps) {
55
+ return (
56
+ <div
57
+ data-slot="item-actions"
58
+ className={cn('flex shrink-0 items-center gap-8', className)}
59
+ {...props}
60
+ >
61
+ {children}
62
+ </div>
63
+ );
64
+ }
65
+
66
+ // ItemContent
67
+ export type ItemContentProps = ComponentProps<'div'>;
68
+
69
+ export function ItemContent({className, children, ...props}: ItemContentProps) {
70
+ return (
71
+ <div
72
+ data-slot="item-content"
73
+ className={cn('flex min-w-0 flex-1 flex-col gap-4', className)}
74
+ {...props}
75
+ >
76
+ {children}
77
+ </div>
78
+ );
79
+ }
80
+
81
+ // ItemDescription
82
+ export type ItemDescriptionProps = ComponentProps<'p'>;
83
+
84
+ export function ItemDescription({className, children, ...props}: ItemDescriptionProps) {
85
+ return (
86
+ <p
87
+ data-slot="item-description"
88
+ className={cn(
89
+ 'text-xs leading-20 text-foreground-neutral-subtle max-w-250 sm:max-w-fit line-clamp-3',
90
+ className,
91
+ )}
92
+ {...props}
93
+ >
94
+ {children}
95
+ </p>
96
+ );
97
+ }
98
+
99
+ // ItemFooter
100
+ export type ItemFooterProps = ComponentProps<'div'>;
101
+
102
+ export function ItemFooter({className, children, ...props}: ItemFooterProps) {
103
+ return (
104
+ <div
105
+ data-slot="item-footer"
106
+ className={cn('flex shrink-0 items-center gap-8 px-12 py-8', className)}
107
+ {...props}
108
+ >
109
+ {children}
110
+ </div>
111
+ );
112
+ }
113
+
114
+ // ItemHeader
115
+ export type ItemHeaderProps = ComponentProps<'div'>;
116
+
117
+ export function ItemHeader({className, children, ...props}: ItemHeaderProps) {
118
+ return (
119
+ <div
120
+ data-slot="item-header"
121
+ className={cn('flex shrink-0 items-center gap-8 px-12 py-8', className)}
122
+ {...props}
123
+ >
124
+ {children}
125
+ </div>
126
+ );
127
+ }
128
+
129
+ // ItemMedia
130
+ export const itemMediaVariants = cva('flex shrink-0 items-center justify-center', {
131
+ variants: {
132
+ variant: {
133
+ default: '',
134
+ icon: 'text-foreground-neutral-base',
135
+ image: '',
136
+ },
137
+ },
138
+ defaultVariants: {
139
+ variant: 'default',
140
+ },
141
+ });
142
+
143
+ export type ItemMediaProps = ComponentProps<'div'> & VariantProps<typeof itemMediaVariants>;
144
+
145
+ export function ItemMedia({className, variant, children, ...props}: ItemMediaProps) {
146
+ return (
147
+ <div data-slot="item-media" className={cn(itemMediaVariants({variant}), className)} {...props}>
148
+ {children}
149
+ </div>
150
+ );
151
+ }
152
+
153
+ // ItemTitle
154
+ export type ItemTitleProps = ComponentProps<'h3'>;
155
+
156
+ export function ItemTitle({className, children, ...props}: ItemTitleProps) {
157
+ return (
158
+ <h3
159
+ data-slot="item-title"
160
+ className={cn(
161
+ 'text-sm font-medium leading-20 text-foreground-neutral-base truncate',
162
+ className,
163
+ )}
164
+ {...props}
165
+ >
166
+ {children}
167
+ </h3>
168
+ );
169
+ }
170
+
171
+ // ItemSeparator
172
+ export type ItemSeparatorProps = ComponentProps<'div'>;
173
+
174
+ export function ItemSeparator({className, ...props}: ItemSeparatorProps) {
175
+ return (
176
+ <div
177
+ data-slot="item-separator"
178
+ className={cn('h-px bg-border-neutral-base', className)}
179
+ {...props}
180
+ />
181
+ );
182
+ }
@@ -0,0 +1 @@
1
+ export * from './label';
@@ -0,0 +1,67 @@
1
+ import type {Meta, StoryObj} from '@storybook/react';
2
+ import {Checkbox} from 'components/checkbox';
3
+ import {Input} from 'components/input/input';
4
+ import {Textarea} from 'components/textarea';
5
+ import {Label} from './label';
6
+
7
+ const meta = {
8
+ title: 'Components/Label',
9
+ component: Label,
10
+ tags: ['autodocs'],
11
+ argTypes: {
12
+ htmlFor: {control: 'text'},
13
+ },
14
+ } satisfies Meta<typeof Label>;
15
+
16
+ export default meta;
17
+
18
+ type Story = StoryObj<typeof meta>;
19
+
20
+ export const Default: Story = {
21
+ render: () => (
22
+ <div className="flex flex-col gap-8">
23
+ <Label htmlFor="email">Email</Label>
24
+ <Input id="email" type="email" placeholder="Enter your email" />
25
+ </div>
26
+ ),
27
+ };
28
+
29
+ export const WithCheckbox: Story = {
30
+ render: () => (
31
+ <div className="flex items-center gap-8">
32
+ <Checkbox id="terms" />
33
+ <Label htmlFor="terms">Accept terms and conditions</Label>
34
+ </div>
35
+ ),
36
+ };
37
+
38
+ export const WithTextarea: Story = {
39
+ render: () => (
40
+ <div className="flex flex-col gap-8">
41
+ <Label htmlFor="message">Message</Label>
42
+ <Textarea id="message" placeholder="Enter your message" />
43
+ </div>
44
+ ),
45
+ };
46
+
47
+ export const Required: Story = {
48
+ render: () => (
49
+ <div className="flex flex-col gap-8">
50
+ <Label htmlFor="required-field">
51
+ Required Field <span className="text-foreground-highlight-error">*</span>
52
+ </Label>
53
+ <Input id="required-field" type="text" placeholder="This field is required" />
54
+ </div>
55
+ ),
56
+ };
57
+
58
+ export const Disabled: Story = {
59
+ render: () => (
60
+ <div className="flex flex-col gap-8">
61
+ <Label htmlFor="disabled-field" className="opacity-50">
62
+ Disabled Field
63
+ </Label>
64
+ <Input id="disabled-field" type="text" placeholder="Disabled input" disabled />
65
+ </div>
66
+ ),
67
+ };
@@ -0,0 +1,15 @@
1
+ import * as LabelPrimitive from '@radix-ui/react-label';
2
+ import {cva, type VariantProps} from 'class-variance-authority';
3
+ import type {ComponentProps} from 'react';
4
+ import {cn} from 'utils/cn';
5
+
6
+ export const labelVariants = cva(
7
+ 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',
8
+ );
9
+
10
+ export type LabelProps = ComponentProps<typeof LabelPrimitive.Root> &
11
+ VariantProps<typeof labelVariants>;
12
+
13
+ export function Label({className, ...props}: LabelProps) {
14
+ return <LabelPrimitive.Root className={cn(labelVariants(), className)} {...props} />;
15
+ }
@@ -0,0 +1,67 @@
1
+ import {
2
+ motion,
3
+ useAnimationFrame,
4
+ useMotionTemplate,
5
+ useMotionValue,
6
+ useTransform,
7
+ } from 'framer-motion';
8
+ import type {ComponentProps} from 'react';
9
+ import {useRef} from 'react';
10
+
11
+ export type MovingBorderProps = {
12
+ children: React.ReactNode;
13
+ duration?: number;
14
+ rx?: string;
15
+ ry?: string;
16
+ } & ComponentProps<'svg'>;
17
+
18
+ export function MovingBorder({
19
+ children,
20
+ duration = 3000,
21
+ rx,
22
+ ry,
23
+ ...otherProps
24
+ }: MovingBorderProps) {
25
+ const pathRef = useRef<SVGRectElement | null>(null);
26
+ const progress = useMotionValue<number>(0);
27
+
28
+ useAnimationFrame((time: number) => {
29
+ const length = pathRef.current?.getTotalLength();
30
+ if (length) {
31
+ const pxPerMillisecond = length / duration;
32
+ progress.set((time * pxPerMillisecond) % length);
33
+ }
34
+ });
35
+
36
+ const x = useTransform(progress, (val: number) => pathRef.current?.getPointAtLength(val)?.x ?? 0);
37
+ const y = useTransform(progress, (val: number) => pathRef.current?.getPointAtLength(val)?.y ?? 0);
38
+
39
+ const transform = useMotionTemplate`translateX(${x}px) translateY(${y}px) translateX(-50%) translateY(-50%)`;
40
+
41
+ return (
42
+ <>
43
+ <svg
44
+ xmlns="http://www.w3.org/2000/svg"
45
+ preserveAspectRatio="none"
46
+ className="absolute h-full w-full"
47
+ width="100%"
48
+ height="100%"
49
+ {...otherProps}
50
+ >
51
+ <title>Moving Border</title>
52
+ <rect fill="none" width="100%" height="100%" rx={rx} ry={ry} ref={pathRef} />
53
+ </svg>
54
+ <motion.div
55
+ style={{
56
+ position: 'absolute',
57
+ top: 0,
58
+ left: 0,
59
+ display: 'inline-block',
60
+ transform,
61
+ }}
62
+ >
63
+ {children}
64
+ </motion.div>
65
+ </>
66
+ );
67
+ }
@@ -27,7 +27,7 @@ export function Textarea({className, variant, size, ...props}: TextareaProps) {
27
27
  <textarea
28
28
  data-slot="textarea"
29
29
  className={cn(
30
- 'textarea-resize-custom placeholder:text-foreground-neutral-muted w-full min-w-0 rounded-6 px-8 pr-24 text-sm leading-20 text-foreground-neutral-base shadow-border-base transition-[color,box-shadow] outline-none',
30
+ 'textarea-resize-custom placeholder:text-foreground-neutral-muted w-full min-w-0 rounded-6 px-8 pr-24 text-sm leading-20 text-foreground-neutral-base shadow-button-neutral transition-[color,box-shadow] outline-none',
31
31
  'hover:bg-background-field-hover',
32
32
  'selection:bg-background-accent-neutral-soft selection:text-foreground-neutral-on-inverted',
33
33
  'disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-background-neutral-disabled disabled:shadow-none disabled:text-foreground-neutral-disabled',
@@ -0,0 +1 @@
1
+ export * from './theme-provider';
@@ -0,0 +1,2 @@
1
+ export {Toaster, type ToasterProps, toast} from './toast';
2
+ export {ToastCustom, type ToastCustomProps} from './toast-custom';