@turtleclub/ui 0.3.0-beta.9 → 0.3.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 (269) hide show
  1. package/.prettierrc.json +4 -0
  2. package/.turbo/turbo-build.log +152 -39
  3. package/CHANGELOG.md +334 -0
  4. package/dist/index.cjs +170 -28
  5. package/dist/index.cjs.map +1 -1
  6. package/dist/index.js +23743 -4141
  7. package/dist/index.js.map +1 -1
  8. package/dist/styles.css +1 -1
  9. package/dist/types/components/features/data-table.d.ts +9 -0
  10. package/dist/types/components/features/data-table.d.ts.map +1 -0
  11. package/dist/types/components/features/index.d.ts +5 -0
  12. package/dist/types/components/features/index.d.ts.map +1 -0
  13. package/dist/types/components/features/page-heading.d.ts +10 -0
  14. package/dist/types/components/features/page-heading.d.ts.map +1 -0
  15. package/dist/types/components/features/search-bar.d.ts +10 -0
  16. package/dist/types/components/features/search-bar.d.ts.map +1 -0
  17. package/dist/types/components/features/segmented-navigation.d.ts +7 -0
  18. package/dist/types/components/features/segmented-navigation.d.ts.map +1 -0
  19. package/dist/types/components/features/sidebar-layout.d.ts +36 -0
  20. package/dist/types/components/features/sidebar-layout.d.ts.map +1 -0
  21. package/dist/types/components/icons/arrow.d.ts +4 -0
  22. package/dist/types/components/icons/arrow.d.ts.map +1 -0
  23. package/dist/types/components/icons/beta.d.ts +4 -0
  24. package/dist/types/components/icons/beta.d.ts.map +1 -0
  25. package/dist/types/components/icons/dot.d.ts +4 -0
  26. package/dist/types/components/icons/dot.d.ts.map +1 -0
  27. package/dist/types/components/icons/index.d.ts +8 -0
  28. package/dist/types/components/icons/index.d.ts.map +1 -0
  29. package/dist/types/components/icons/issue.d.ts +4 -0
  30. package/dist/types/components/icons/issue.d.ts.map +1 -0
  31. package/dist/types/components/icons/turtle.d.ts +4 -0
  32. package/dist/types/components/icons/turtle.d.ts.map +1 -0
  33. package/dist/types/components/icons/update.d.ts +4 -0
  34. package/dist/types/components/icons/update.d.ts.map +1 -0
  35. package/dist/types/components/icons/warning.d.ts +4 -0
  36. package/dist/types/components/icons/warning.d.ts.map +1 -0
  37. package/dist/types/components/molecules/index.d.ts +0 -1
  38. package/dist/types/components/molecules/index.d.ts.map +1 -1
  39. package/dist/types/components/molecules/opportunity/opportunity-apr.d.ts +6 -2
  40. package/dist/types/components/molecules/opportunity/opportunity-apr.d.ts.map +1 -1
  41. package/dist/types/components/molecules/opportunity/opportunity-disclaimer.d.ts +1 -2
  42. package/dist/types/components/molecules/opportunity/opportunity-disclaimer.d.ts.map +1 -1
  43. package/dist/types/components/molecules/opportunity/opportunity-list/hooks/use-opportunity-filtering.d.ts +2 -1
  44. package/dist/types/components/molecules/opportunity/opportunity-list/hooks/use-opportunity-filtering.d.ts.map +1 -1
  45. package/dist/types/components/molecules/opportunity/opportunity-list/opportunity-list.d.ts.map +1 -1
  46. package/dist/types/components/molecules/opportunity/opportunity-rate-estimator.d.ts +1 -2
  47. package/dist/types/components/molecules/opportunity/opportunity-rate-estimator.d.ts.map +1 -1
  48. package/dist/types/components/molecules/opportunity/opportunity-section.d.ts +3 -0
  49. package/dist/types/components/molecules/opportunity/opportunity-section.d.ts.map +1 -1
  50. package/dist/types/components/molecules/opportunity/opportunity-selector.d.ts +1 -2
  51. package/dist/types/components/molecules/opportunity/opportunity-selector.d.ts.map +1 -1
  52. package/dist/types/components/molecules/opportunity/opportunity-type.d.ts +1 -2
  53. package/dist/types/components/molecules/opportunity/opportunity-type.d.ts.map +1 -1
  54. package/dist/types/components/molecules/route-details.d.ts +1 -1
  55. package/dist/types/components/molecules/route-details.d.ts.map +1 -1
  56. package/dist/types/components/molecules/slippage-selector.d.ts +1 -2
  57. package/dist/types/components/molecules/slippage-selector.d.ts.map +1 -1
  58. package/dist/types/components/molecules/swap-details.d.ts.map +1 -1
  59. package/dist/types/components/molecules/swap-input.d.ts +5 -1
  60. package/dist/types/components/molecules/swap-input.d.ts.map +1 -1
  61. package/dist/types/components/molecules/tabs.d.ts +2 -2
  62. package/dist/types/components/molecules/tabs.d.ts.map +1 -1
  63. package/dist/types/components/molecules/token-selector.d.ts +1 -1
  64. package/dist/types/components/molecules/token-selector.d.ts.map +1 -1
  65. package/dist/types/components/molecules/tx-status.d.ts.map +1 -1
  66. package/dist/types/components/molecules/widget/asset-list/asset-filters.d.ts.map +1 -1
  67. package/dist/types/components/molecules/widget/asset-list/asset-list.d.ts.map +1 -1
  68. package/dist/types/components/molecules/widget/asset-list/hooks/use-asset-grouping.d.ts.map +1 -1
  69. package/dist/types/components/molecules/widget/base-selector.d.ts +1 -1
  70. package/dist/types/components/molecules/widget/base-selector.d.ts.map +1 -1
  71. package/dist/types/components/molecules/widget/campaign-item.d.ts +1 -1
  72. package/dist/types/components/molecules/widget/campaign-item.d.ts.map +1 -1
  73. package/dist/types/components/molecules/widget/index.d.ts +3 -3
  74. package/dist/types/components/molecules/widget/index.d.ts.map +1 -1
  75. package/dist/types/components/molecules/widget/opportunity-item.d.ts +7 -0
  76. package/dist/types/components/molecules/widget/opportunity-item.d.ts.map +1 -1
  77. package/dist/types/components/molecules/widget/widget-item.d.ts +2 -2
  78. package/dist/types/components/molecules/widget/widget-item.d.ts.map +1 -1
  79. package/dist/types/components/molecules/widget/widget-list-items.d.ts +2 -2
  80. package/dist/types/components/molecules/widget/widget-list-items.d.ts.map +1 -1
  81. package/dist/types/components/ui/alert-dialog.d.ts +15 -0
  82. package/dist/types/components/ui/alert-dialog.d.ts.map +1 -0
  83. package/dist/types/components/ui/animated-background/animated-background.d.ts +9 -0
  84. package/dist/types/components/ui/animated-background/animated-background.d.ts.map +1 -0
  85. package/dist/types/components/ui/animated-background/index.d.ts +2 -0
  86. package/dist/types/components/ui/animated-background/index.d.ts.map +1 -0
  87. package/dist/types/components/ui/avatar.d.ts +10 -6
  88. package/dist/types/components/ui/avatar.d.ts.map +1 -1
  89. package/dist/types/components/ui/badge.d.ts +5 -4
  90. package/dist/types/components/ui/badge.d.ts.map +1 -1
  91. package/dist/types/components/ui/banner.d.ts +7 -0
  92. package/dist/types/components/ui/banner.d.ts.map +1 -0
  93. package/dist/types/components/ui/button.d.ts +8 -6
  94. package/dist/types/components/ui/button.d.ts.map +1 -1
  95. package/dist/types/components/ui/card.d.ts +10 -11
  96. package/dist/types/components/ui/card.d.ts.map +1 -1
  97. package/dist/types/components/ui/checkbox.d.ts +5 -0
  98. package/dist/types/components/ui/checkbox.d.ts.map +1 -0
  99. package/dist/types/components/ui/chip.d.ts +1 -1
  100. package/dist/types/components/ui/chip.d.ts.map +1 -1
  101. package/dist/types/components/ui/collapsible.d.ts +7 -0
  102. package/dist/types/components/ui/collapsible.d.ts.map +1 -0
  103. package/dist/types/components/ui/combobox.d.ts +148 -0
  104. package/dist/types/components/ui/combobox.d.ts.map +1 -0
  105. package/dist/types/components/ui/command.d.ts +19 -0
  106. package/dist/types/components/ui/command.d.ts.map +1 -0
  107. package/dist/types/components/ui/dialog.d.ts +10 -10
  108. package/dist/types/components/ui/dialog.d.ts.map +1 -1
  109. package/dist/types/components/ui/dropdown.d.ts +30 -0
  110. package/dist/types/components/ui/dropdown.d.ts.map +1 -0
  111. package/dist/types/components/ui/field.d.ts +26 -0
  112. package/dist/types/components/ui/field.d.ts.map +1 -0
  113. package/dist/types/components/ui/heading.d.ts +12 -0
  114. package/dist/types/components/ui/heading.d.ts.map +1 -0
  115. package/dist/types/components/ui/hover-card.d.ts +7 -7
  116. package/dist/types/components/ui/hover-card.d.ts.map +1 -1
  117. package/dist/types/components/ui/icon-animation.d.ts +1 -1
  118. package/dist/types/components/ui/icon-animation.d.ts.map +1 -1
  119. package/dist/types/components/ui/icon-list.d.ts +3 -0
  120. package/dist/types/components/ui/icon-list.d.ts.map +1 -1
  121. package/dist/types/components/ui/index.d.ts +28 -9
  122. package/dist/types/components/ui/index.d.ts.map +1 -1
  123. package/dist/types/components/ui/info-card.d.ts +4 -4
  124. package/dist/types/components/ui/info-card.d.ts.map +1 -1
  125. package/dist/types/components/ui/input-group.d.ts +17 -0
  126. package/dist/types/components/ui/input-group.d.ts.map +1 -0
  127. package/dist/types/components/ui/input.d.ts +1 -3
  128. package/dist/types/components/ui/input.d.ts.map +1 -1
  129. package/dist/types/components/ui/label-with-icon.d.ts +3 -3
  130. package/dist/types/components/ui/label-with-icon.d.ts.map +1 -1
  131. package/dist/types/components/ui/label.d.ts +1 -1
  132. package/dist/types/components/ui/label.d.ts.map +1 -1
  133. package/dist/types/components/ui/multi-select.d.ts +192 -0
  134. package/dist/types/components/ui/multi-select.d.ts.map +1 -0
  135. package/dist/types/components/ui/navigation-bar.d.ts +2 -2
  136. package/dist/types/components/ui/navigation-bar.d.ts.map +1 -1
  137. package/dist/types/components/ui/navigation-menu.d.ts +15 -0
  138. package/dist/types/components/ui/navigation-menu.d.ts.map +1 -0
  139. package/dist/types/components/ui/opportunity-details-v1.d.ts +1 -1
  140. package/dist/types/components/ui/opportunity-details-v1.d.ts.map +1 -1
  141. package/dist/types/components/ui/popover.d.ts +8 -0
  142. package/dist/types/components/ui/popover.d.ts.map +1 -0
  143. package/dist/types/components/ui/scroll-area.d.ts +2 -2
  144. package/dist/types/components/ui/scroll-area.d.ts.map +1 -1
  145. package/dist/types/components/ui/segment-control.d.ts +19 -0
  146. package/dist/types/components/ui/segment-control.d.ts.map +1 -0
  147. package/dist/types/components/ui/select.d.ts +14 -13
  148. package/dist/types/components/ui/select.d.ts.map +1 -1
  149. package/dist/types/components/ui/separator.d.ts +1 -1
  150. package/dist/types/components/ui/separator.d.ts.map +1 -1
  151. package/dist/types/components/ui/sheet.d.ts +14 -0
  152. package/dist/types/components/ui/sheet.d.ts.map +1 -0
  153. package/dist/types/components/ui/sidebar.d.ts +69 -0
  154. package/dist/types/components/ui/sidebar.d.ts.map +1 -0
  155. package/dist/types/components/ui/skeleton.d.ts +4 -0
  156. package/dist/types/components/ui/skeleton.d.ts.map +1 -0
  157. package/dist/types/components/ui/slider.d.ts +5 -0
  158. package/dist/types/components/ui/slider.d.ts.map +1 -0
  159. package/dist/types/components/ui/sonner.d.ts +1 -2
  160. package/dist/types/components/ui/sonner.d.ts.map +1 -1
  161. package/dist/types/components/ui/switch.d.ts +1 -1
  162. package/dist/types/components/ui/switch.d.ts.map +1 -1
  163. package/dist/types/components/ui/table-shadcn.d.ts +11 -0
  164. package/dist/types/components/ui/table-shadcn.d.ts.map +1 -0
  165. package/dist/types/components/ui/table.d.ts +2 -2
  166. package/dist/types/components/ui/table.d.ts.map +1 -1
  167. package/dist/types/components/ui/textarea.d.ts +4 -0
  168. package/dist/types/components/ui/textarea.d.ts.map +1 -0
  169. package/dist/types/components/ui/toggle-group.d.ts +2 -2
  170. package/dist/types/components/ui/toggle-group.d.ts.map +1 -1
  171. package/dist/types/components/ui/toggle.d.ts +2 -2
  172. package/dist/types/components/ui/toggle.d.ts.map +1 -1
  173. package/dist/types/components/ui/tooltip.d.ts +7 -4
  174. package/dist/types/components/ui/tooltip.d.ts.map +1 -1
  175. package/dist/types/hooks/useIsMobile.d.ts +7 -0
  176. package/dist/types/hooks/useIsMobile.d.ts.map +1 -0
  177. package/dist/types/index.d.ts +2 -0
  178. package/dist/types/index.d.ts.map +1 -1
  179. package/package.json +38 -28
  180. package/src/components/features/data-table.tsx +96 -0
  181. package/src/components/features/index.ts +4 -0
  182. package/src/components/features/page-heading.tsx +22 -0
  183. package/src/components/features/search-bar.tsx +50 -0
  184. package/src/components/features/segmented-navigation.tsx +18 -0
  185. package/src/components/features/sidebar-layout.tsx +190 -0
  186. package/src/components/icons/arrow.tsx +23 -0
  187. package/src/components/icons/beta.tsx +86 -0
  188. package/src/components/icons/dot.tsx +89 -0
  189. package/src/components/icons/index.ts +7 -0
  190. package/src/components/icons/issue.tsx +97 -0
  191. package/src/components/icons/turtle.tsx +143 -0
  192. package/src/components/icons/update.tsx +108 -0
  193. package/src/components/icons/warning.tsx +86 -0
  194. package/src/components/molecules/index.ts +0 -2
  195. package/src/components/molecules/opportunity/opportunity-apr.tsx +97 -16
  196. package/src/components/molecules/opportunity/opportunity-list/hooks/use-opportunity-filtering.ts +4 -3
  197. package/src/components/molecules/opportunity/opportunity-list/hooks/use-opportunity-grouping.ts +1 -1
  198. package/src/components/molecules/opportunity/opportunity-list/opportunity-list.tsx +21 -17
  199. package/src/components/molecules/opportunity/opportunity-rate-estimator.tsx +4 -1
  200. package/src/components/molecules/opportunity/opportunity-section.tsx +19 -17
  201. package/src/components/molecules/opportunity/opportunity-selector.tsx +2 -3
  202. package/src/components/molecules/route-details.tsx +48 -37
  203. package/src/components/molecules/swap-details.tsx +2 -4
  204. package/src/components/molecules/swap-input.tsx +56 -21
  205. package/src/components/molecules/token-selector.tsx +2 -2
  206. package/src/components/molecules/tx-status.tsx +1 -5
  207. package/src/components/molecules/widget/asset-list/asset-filters.tsx +17 -23
  208. package/src/components/molecules/widget/asset-list/asset-list.tsx +23 -19
  209. package/src/components/molecules/widget/asset-list/asset-row.tsx +7 -7
  210. package/src/components/molecules/widget/asset-list/hooks/use-asset-grouping.ts +38 -23
  211. package/src/components/molecules/widget/base-selector.tsx +11 -11
  212. package/src/components/molecules/widget/campaign-item.tsx +2 -2
  213. package/src/components/molecules/widget/index.ts +10 -4
  214. package/src/components/molecules/widget/opportunity-item.tsx +8 -1
  215. package/src/components/molecules/widget/widget-item.tsx +45 -26
  216. package/src/components/molecules/widget/widget-list-items.tsx +6 -5
  217. package/src/components/ui/alert-dialog.tsx +146 -0
  218. package/src/components/ui/animated-background/animated-background.tsx +174 -0
  219. package/src/components/ui/animated-background/index.ts +1 -0
  220. package/src/components/ui/avatar.tsx +16 -3
  221. package/src/components/ui/badge.tsx +18 -8
  222. package/src/components/ui/banner.tsx +78 -0
  223. package/src/components/ui/button.tsx +51 -21
  224. package/src/components/ui/card.tsx +21 -61
  225. package/src/components/ui/checkbox.tsx +29 -0
  226. package/src/components/ui/collapsible.tsx +22 -0
  227. package/src/components/ui/combobox.tsx +617 -0
  228. package/src/components/ui/command.tsx +164 -0
  229. package/src/components/ui/dialog.tsx +5 -9
  230. package/src/components/ui/dropdown.tsx +263 -0
  231. package/src/components/ui/field.tsx +232 -0
  232. package/src/components/ui/heading.tsx +49 -0
  233. package/src/components/ui/hover-card.tsx +10 -10
  234. package/src/components/ui/icon-list.tsx +109 -21
  235. package/src/components/ui/index.ts +29 -10
  236. package/src/components/ui/info-card.tsx +1 -1
  237. package/src/components/ui/input-group.tsx +158 -0
  238. package/src/components/ui/input.tsx +17 -25
  239. package/src/components/ui/label-with-icon.tsx +40 -30
  240. package/src/components/ui/label.tsx +8 -9
  241. package/src/components/ui/multi-select.tsx +1000 -0
  242. package/src/components/ui/navigation-menu.tsx +181 -0
  243. package/src/components/ui/opportunity-details-v1.tsx +2 -2
  244. package/src/components/ui/popover.tsx +42 -0
  245. package/src/components/ui/scroll-area.tsx +11 -11
  246. package/src/components/ui/segment-control.tsx +140 -0
  247. package/src/components/ui/select.tsx +26 -31
  248. package/src/components/ui/sheet.tsx +130 -0
  249. package/src/components/ui/sidebar.tsx +693 -0
  250. package/src/components/ui/skeleton.tsx +14 -0
  251. package/src/components/ui/slider.tsx +58 -0
  252. package/src/components/ui/switch.tsx +8 -11
  253. package/src/components/ui/{table-shad.tsx → table-shadcn.tsx} +25 -39
  254. package/src/components/ui/table.tsx +3 -2
  255. package/src/components/ui/textarea.tsx +22 -0
  256. package/src/components/ui/tooltip.tsx +11 -7
  257. package/src/hooks/useIsMobile.ts +74 -0
  258. package/src/index.ts +2 -0
  259. package/src/styles/globals.css +87 -20
  260. package/src/styles/themes/semantic.css +11 -5
  261. package/src/styles/tokens/colors.css +64 -53
  262. package/src/styles/tokens/radius.css +3 -34
  263. package/tsconfig.json +11 -15
  264. package/vite.config.js +41 -57
  265. package/dist/types/components/molecules/search-bar.d.ts +0 -10
  266. package/dist/types/components/molecules/search-bar.d.ts.map +0 -1
  267. package/dist/types/components/ui/table-shad.d.ts +0 -11
  268. package/dist/types/components/ui/table-shad.d.ts.map +0 -1
  269. package/src/components/molecules/search-bar.tsx +0 -42
@@ -0,0 +1,58 @@
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import * as SliderPrimitive from "@radix-ui/react-slider";
5
+
6
+ import { cn } from "@/lib/utils";
7
+
8
+ function Slider({
9
+ className,
10
+ defaultValue,
11
+ value,
12
+ min = 0,
13
+ max = 100,
14
+ ...props
15
+ }: React.ComponentProps<typeof SliderPrimitive.Root>) {
16
+ const _values = React.useMemo(
17
+ () => (Array.isArray(value) ? value : Array.isArray(defaultValue) ? defaultValue : [min, max]),
18
+ [value, defaultValue, min, max]
19
+ );
20
+
21
+ return (
22
+ <SliderPrimitive.Root
23
+ data-slot="slider"
24
+ defaultValue={defaultValue}
25
+ value={value}
26
+ min={min}
27
+ max={max}
28
+ className={cn(
29
+ "relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col",
30
+ className
31
+ )}
32
+ {...props}
33
+ >
34
+ <SliderPrimitive.Track
35
+ data-slot="slider-track"
36
+ className={cn(
37
+ "bg-secondary relative grow overflow-hidden rounded-full data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5"
38
+ )}
39
+ >
40
+ <SliderPrimitive.Range
41
+ data-slot="slider-range"
42
+ className={cn(
43
+ "bg-primary absolute data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full"
44
+ )}
45
+ />
46
+ </SliderPrimitive.Track>
47
+ {Array.from({ length: _values.length }, (_, index) => (
48
+ <SliderPrimitive.Thumb
49
+ data-slot="slider-thumb"
50
+ key={index}
51
+ className="border-border bg-foreground ring-ring/50 block size-4 shrink-0 rounded-full border shadow-sm transition-[color,box-shadow] hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50"
52
+ />
53
+ ))}
54
+ </SliderPrimitive.Root>
55
+ );
56
+ }
57
+
58
+ export { Slider };
@@ -1,17 +1,14 @@
1
- import * as React from "react"
2
- import * as SwitchPrimitive from "@radix-ui/react-switch"
1
+ import * as React from "react";
2
+ import * as SwitchPrimitive from "@radix-ui/react-switch";
3
3
 
4
- import { cn } from "@/lib/utils"
4
+ import { cn } from "@/lib/utils";
5
5
 
6
- function Switch({
7
- className,
8
- ...props
9
- }: React.ComponentProps<typeof SwitchPrimitive.Root>) {
6
+ function Switch({ className, ...props }: React.ComponentProps<typeof SwitchPrimitive.Root>) {
10
7
  return (
11
8
  <SwitchPrimitive.Root
12
9
  data-slot="switch"
13
10
  className={cn(
14
- "peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50",
11
+ "peer group data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 border-border inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50",
15
12
  className
16
13
  )}
17
14
  {...props}
@@ -19,11 +16,11 @@ function Switch({
19
16
  <SwitchPrimitive.Thumb
20
17
  data-slot="switch-thumb"
21
18
  className={cn(
22
- "bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0"
19
+ "bg-muted-foreground dark:group-data-[state=unchecked]:bg-foreground dark:group-data-[state=checked]:bg-primary pointer-events-none block size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0"
23
20
  )}
24
21
  />
25
22
  </SwitchPrimitive.Root>
26
- )
23
+ );
27
24
  }
28
25
 
29
- export { Switch }
26
+ export { Switch };
@@ -1,53 +1,40 @@
1
- import * as React from "react"
1
+ "use client";
2
2
 
3
- import { cn } from "@/lib/utils"
3
+ import * as React from "react";
4
+ import { cn } from "@/lib/utils";
4
5
 
5
6
  function Table({ className, ...props }: React.ComponentProps<"table">) {
6
7
  return (
7
- <div
8
- data-slot="table-container"
9
- className="relative w-full overflow-x-auto"
10
- >
8
+ <div data-slot="table-container" className="relative w-full overflow-x-auto">
11
9
  <table
12
10
  data-slot="table"
13
- className={cn("w-full caption-bottom text-sm", className)}
11
+ className={cn(
12
+ "w-full caption-bottom text-sm",
13
+ "border-separate border-spacing-y-2",
14
+ className
15
+ )}
14
16
  {...props}
15
17
  />
16
18
  </div>
17
- )
19
+ );
18
20
  }
19
21
 
20
22
  function TableHeader({ className, ...props }: React.ComponentProps<"thead">) {
21
- return (
22
- <thead
23
- data-slot="table-header"
24
- className={cn("[&_tr]:border-b", className)}
25
- {...props}
26
- />
27
- )
23
+ return <thead data-slot="table-header" className={cn(className)} {...props} />;
28
24
  }
29
25
 
30
26
  function TableBody({ className, ...props }: React.ComponentProps<"tbody">) {
31
- return (
32
- <tbody
33
- data-slot="table-body"
34
- className={cn("[&_tr:last-child]:border-0", className)}
35
- {...props}
36
- />
37
- )
27
+ return <tbody data-slot="table-body" className={cn("", className)} {...props} />;
38
28
  }
39
29
 
40
30
  function TableFooter({ className, ...props }: React.ComponentProps<"tfoot">) {
41
31
  return (
42
32
  <tfoot
43
33
  data-slot="table-footer"
44
- className={cn(
45
- "bg-muted/50 border-t font-medium [&>tr]:last:border-b-0",
46
- className
47
- )}
34
+ className={cn("border-t font-medium [&>tr]:last:border-b-0", className)}
48
35
  {...props}
49
36
  />
50
- )
37
+ );
51
38
  }
52
39
 
53
40
  function TableRow({ className, ...props }: React.ComponentProps<"tr">) {
@@ -55,12 +42,12 @@ function TableRow({ className, ...props }: React.ComponentProps<"tr">) {
55
42
  <tr
56
43
  data-slot="table-row"
57
44
  className={cn(
58
- "hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors",
45
+ 'hover:[&>[data-slot="table-cell"]]:bg-neutral-alpha-5 data-[state=selected]:bg-neutral-alpha-10 transition-colors',
59
46
  className
60
47
  )}
61
48
  {...props}
62
49
  />
63
- )
50
+ );
64
51
  }
65
52
 
66
53
  function TableHead({ className, ...props }: React.ComponentProps<"th">) {
@@ -69,37 +56,36 @@ function TableHead({ className, ...props }: React.ComponentProps<"th">) {
69
56
  data-slot="table-head"
70
57
  className={cn(
71
58
  "text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",
59
+ "text-xs",
72
60
  className
73
61
  )}
74
62
  {...props}
75
63
  />
76
- )
64
+ );
77
65
  }
78
66
 
79
- function TableCell({ className, ...props }: React.ComponentProps<"td">) {
67
+ function ShadTableCell({ className, ...props }: React.ComponentProps<"td">) {
80
68
  return (
81
69
  <td
82
70
  data-slot="table-cell"
83
71
  className={cn(
84
72
  "p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",
73
+ "first:rounded-l-full first:pl-4 last:rounded-r-full last:pr-4 bg-neutral-alpha-2",
85
74
  className
86
75
  )}
87
76
  {...props}
88
77
  />
89
- )
78
+ );
90
79
  }
91
80
 
92
- function TableCaption({
93
- className,
94
- ...props
95
- }: React.ComponentProps<"caption">) {
81
+ function TableCaption({ className, ...props }: React.ComponentProps<"caption">) {
96
82
  return (
97
83
  <caption
98
84
  data-slot="table-caption"
99
85
  className={cn("text-muted-foreground mt-4 text-sm", className)}
100
86
  {...props}
101
87
  />
102
- )
88
+ );
103
89
  }
104
90
 
105
91
  export {
@@ -109,6 +95,6 @@ export {
109
95
  TableFooter,
110
96
  TableHead,
111
97
  TableRow,
112
- TableCell,
98
+ ShadTableCell,
113
99
  TableCaption,
114
- }
100
+ };
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+
2
3
  import React, { useState } from "react";
3
4
  import { cn } from "@/lib/utils";
4
5
 
@@ -69,7 +70,7 @@ export function ManagedTable<T>({
69
70
  <th
70
71
  key={column.name}
71
72
  className={cn(
72
- "px-3 py-1 text-left text-xs font-normal text-muted-foreground h-6",
73
+ "text-muted-foreground h-6 px-3 py-1 text-left text-xs font-normal",
73
74
  column.comparator && "cursor-pointer select-none"
74
75
  )}
75
76
  onClick={() => column.comparator && handleSort(column.name)}
@@ -102,7 +103,7 @@ interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {
102
103
 
103
104
  export function TableCell({ children, className, ...props }: TableCellProps) {
104
105
  return (
105
- <td className={cn("p-2 align-middle text-foreground", className)} {...props}>
106
+ <td className={cn("text-foreground p-2 align-middle", className)} {...props}>
106
107
  {children}
107
108
  </td>
108
109
  );
@@ -0,0 +1,22 @@
1
+ import * as React from "react";
2
+
3
+ import { cn } from "@/lib/utils";
4
+
5
+ function Textarea({ className, ...props }: React.ComponentProps<"textarea">) {
6
+ return (
7
+ <textarea
8
+ data-slot="control"
9
+ className={cn(
10
+ "bg-neutral-alpha-2 placeholder:text-muted-foreground flex field-sizing-content min-h-16 w-full rounded-lg border border-none px-4 py-2.5 text-base md:text-sm",
11
+ "focus-visible:border-ring focus-visible:ring-ring/50 transition-[color,box-shadow] outline-none focus-visible:ring-2",
12
+ "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
13
+ "disabled:cursor-not-allowed disabled:opacity-50",
14
+ "caret-primary shadow",
15
+ className
16
+ )}
17
+ {...props}
18
+ />
19
+ );
20
+ }
21
+
22
+ export { Textarea };
@@ -30,25 +30,29 @@ function TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimiti
30
30
 
31
31
  function TooltipContent({
32
32
  className,
33
- sideOffset = 0,
33
+ sideOffset = 2,
34
+ gradient,
34
35
  children,
36
+ container = document.querySelector(".turtle-widget-root") ?? document.body,
35
37
  ...props
36
- }: React.ComponentProps<typeof TooltipPrimitive.Content>) {
38
+ }: React.ComponentProps<typeof TooltipPrimitive.Content> & {
39
+ gradient?: "primary" | "white";
40
+ container?: HTMLElement;
41
+ }) {
37
42
  return (
38
- <TooltipPrimitive.Portal
39
- container={document.querySelectorAll(".turtle-widget-root")[0] ?? undefined}
40
- >
43
+ <TooltipPrimitive.Portal container={container}>
41
44
  <TooltipPrimitive.Content
42
45
  data-slot="tooltip-content"
43
46
  sideOffset={sideOffset}
44
47
  className={cn(
45
- "bg-primary text-primary-foreground 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 px-3 py-1.5 text-xs text-balance",
48
+ "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 bg-neutral-alpha-10 border-border z-50 origin-(--radix-tooltip-content-transform-origin) rounded-lg border p-2 backdrop-blur-lg transition-all",
49
+ gradient === "primary" && "border-gradient-primary",
50
+ gradient === "white" && "border-gradient-white",
46
51
  className
47
52
  )}
48
53
  {...props}
49
54
  >
50
55
  {children}
51
- <TooltipPrimitive.Arrow className="bg-primary fill-primary z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]" />
52
56
  </TooltipPrimitive.Content>
53
57
  </TooltipPrimitive.Portal>
54
58
  );
@@ -0,0 +1,74 @@
1
+ "use client";
2
+
3
+ import { useState, useEffect } from "react";
4
+
5
+ interface UseIsMobileReturn {
6
+ isMobile: boolean;
7
+ isLoading: boolean;
8
+ }
9
+
10
+ export const useIsMobile = (): UseIsMobileReturn => {
11
+ const [isMobile, setIsMobile] = useState(false);
12
+ const [isLoading, setIsLoading] = useState(true);
13
+
14
+ useEffect(() => {
15
+ const checkIsMobile = () => {
16
+ // Check using media query
17
+ const mediaQuery = window.matchMedia("(max-width: 768px)");
18
+
19
+ // Check using user agent (additional detection)
20
+ const userAgent = navigator.userAgent.toLowerCase();
21
+ const mobileKeywords = [
22
+ "android",
23
+ "webos",
24
+ "iphone",
25
+ "ipad",
26
+ "ipod",
27
+ "blackberry",
28
+ "windows phone",
29
+ "mobile",
30
+ ];
31
+
32
+ const isMobileUA = mobileKeywords.some((keyword) => userAgent.includes(keyword));
33
+
34
+ // Combine both checks - prioritize media query but consider user agent
35
+ const isMobileDevice = mediaQuery.matches || (isMobileUA && window.innerWidth <= 768);
36
+
37
+ setIsMobile(isMobileDevice);
38
+ setIsLoading(false);
39
+ };
40
+
41
+ // Initial check
42
+ checkIsMobile();
43
+
44
+ // Listen for media query changes
45
+ const mediaQuery = window.matchMedia("(max-width: 768px)");
46
+ const handleChange = () => checkIsMobile();
47
+
48
+ if (mediaQuery.addEventListener) {
49
+ mediaQuery.addEventListener("change", handleChange);
50
+ } else {
51
+ // Fallback for older browsers
52
+ mediaQuery.addListener(handleChange);
53
+ }
54
+
55
+ // Listen for window resize
56
+ window.addEventListener("resize", checkIsMobile);
57
+
58
+ return () => {
59
+ if (mediaQuery.removeEventListener) {
60
+ mediaQuery.removeEventListener("change", handleChange);
61
+ } else {
62
+ mediaQuery.removeListener(handleChange);
63
+ }
64
+ window.removeEventListener("resize", checkIsMobile);
65
+ };
66
+ }, []);
67
+
68
+ return {
69
+ isMobile,
70
+ isLoading,
71
+ };
72
+ };
73
+
74
+ export default useIsMobile;
package/src/index.ts CHANGED
@@ -2,6 +2,8 @@
2
2
  // Re-export components
3
3
  export * from "./components/ui";
4
4
  export * from "./components/molecules";
5
+ export * from "./components/icons";
6
+ export * from "./components/features";
5
7
 
6
8
  // Re-export utilities
7
9
  export * from "./lib/utils";
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Turtle Design System - Global Styles
3
- *
3
+ *
4
4
  * This is the main entry point for the Turtle Design System.
5
5
  * It imports our complete token-based theming architecture and
6
6
  * provides base styles for all components.
@@ -17,16 +17,21 @@
17
17
  @custom-variant dark (&:is(.dark *));
18
18
 
19
19
  /* ===== TAILWIND THEME INTEGRATION ===== */
20
- /*
20
+ /*
21
21
  * This section maps our semantic variables to Tailwind's color system
22
22
  * so we can use classes like bg-background, text-foreground, etc.
23
23
  */
24
- @theme inline {
24
+ @theme static {
25
+ --default-font-family: "DM Sans", sans-serif;
26
+
25
27
  /* Border radius mapping */
26
- --radius-sm: calc(var(--radius) - 4px);
27
- --radius-md: calc(var(--radius) - 2px);
28
+ --radius-xs: calc(var(--radius) - 16px);
29
+ --radius-sm: calc(var(--radius) - 8px);
30
+ --radius-md: calc(var(--radius) - 4px);
28
31
  --radius-lg: var(--radius);
29
32
  --radius-xl: calc(var(--radius) + 4px);
33
+ --radius-2xl: calc(var(--radius) + 8px);
34
+ --radius-full: calc(infinity * 1px);
30
35
  --radius-turtle: var(--radius-turtle);
31
36
  --radius-info-card: var(--radius-info-card);
32
37
 
@@ -47,32 +52,94 @@
47
52
  --color-accent-foreground: var(--accent-foreground);
48
53
  --color-destructive: var(--destructive);
49
54
  --color-destructive-foreground: var(--destructive-foreground);
55
+
50
56
  --color-border: var(--border);
51
57
  --color-input: var(--input);
52
58
  --color-ring: var(--ring);
59
+
60
+ --color-sidebar: var(--sidebar);
61
+ --color-sidebar-foreground: var(--sidebar-foreground);
62
+ --color-sidebar-primary: var(--primary);
63
+ --color-sidebar-primary-foreground: var(--primary-foreground);
64
+ --color-sidebar-accent: var(--accent);
65
+ --color-sidebar-accent-foreground: var(--accent-foreground);
66
+ --color-sidebar-border: var(--border);
67
+ --color-sidebar-ring: var(--ring);
68
+
69
+ --color-neutral-alpha-2: var(--color-neutral-alpha-2);
70
+ --color-neutral-alpha-5: var(--color-neutral-alpha-5);
71
+ --color-neutral-alpha-10: var(--color-neutral-alpha-10);
72
+ --color-neutral-alpha-20: var(--color-neutral-alpha-20);
73
+ --color-neutral-alpha-30: var(--color-neutral-alpha-30);
74
+ --color-neutral-alpha-50: var(--color-neutral-alpha-50);
75
+
76
+ --color-primary-alpha-10: var(--color-brand-green-alpha-10);
77
+ --color-primary-alpha-20: var(--color-brand-green-alpha-20);
78
+ --color-primary-alpha-30: var(--color-brand-green-alpha-30);
79
+ --color-primary-alpha-50: var(--color-brand-green-alpha-50);
80
+
53
81
  --color-chart-1: var(--chart-1);
54
82
  --color-chart-2: var(--chart-2);
55
83
  --color-chart-3: var(--chart-3);
56
84
  --color-chart-4: var(--chart-4);
57
85
  --color-chart-5: var(--chart-5);
86
+
87
+ --border-gradient-white: linear-gradient(
88
+ 175deg,
89
+ var(--color-neutral-alpha-50) 0%,
90
+ var(--color-neutral-alpha-5) 40%,
91
+ var(--color-neutral-alpha-2) 62%,
92
+ var(--color-neutral-alpha-20) 100%
93
+ )
94
+ border-box;
95
+ --border-gradient-soft: linear-gradient(
96
+ 165deg,
97
+ var(--color-neutral-alpha-20) 0%,
98
+ var(--color-neutral-alpha-2) 40%,
99
+ var(--color-neutral-alpha-2) 62%,
100
+ var(--color-neutral-alpha-5) 100%
101
+ )
102
+ border-box;
103
+ --border-gradient-primary: linear-gradient(
104
+ 175deg,
105
+ var(--color-primary-alpha-50) 0%,
106
+ var(--color-primary-alpha-20) 40%,
107
+ var(--color-primary-alpha-10) 62%,
108
+ var(--color-primary-alpha-30) 100%
109
+ )
110
+ border-box;
111
+ --border-gradient-accent: linear-gradient(
112
+ to bottom,
113
+ var(--color-primary) 0%,
114
+ var(--color-primary-alpha-50) 30%,
115
+ var(--color-primary-alpha-20) 70%,
116
+ var(--color-primary-alpha-10) 100%
117
+ )
118
+ border-box;
58
119
  }
59
120
 
60
- /* ===== BASE STYLES ===== */
61
- @layer base {
62
- /* Universal border and outline styles */
63
- * {
64
- @apply border-border outline-ring/50;
65
- }
121
+ @utility border-gradient-* {
122
+ @apply relative border border-transparent;
66
123
 
67
- /* HTML and body setup */
68
- html,
69
- body {
70
- @apply size-full font-sans antialiased;
124
+ &::before {
125
+ content: "";
126
+ @apply pointer-events-none absolute -inset-px border border-transparent;
127
+ border-radius: inherit; /* match rounded-* from parent */
128
+ background: --value(--border-gradient-*); /* gradient from utility */
129
+ -webkit-mask:
130
+ linear-gradient(#fff 0 0) padding-box,
131
+ linear-gradient(#fff 0 0) border-box;
132
+ -webkit-mask-composite: xor;
133
+ mask:
134
+ linear-gradient(#fff 0 0) padding-box,
135
+ linear-gradient(#fff 0 0) border-box;
136
+ mask-composite: exclude;
71
137
  }
138
+ }
72
139
 
73
- /* Body styling with semantic variables */
74
- body {
75
- @apply bg-background text-foreground;
140
+ @layer base {
141
+ * {
142
+ @apply selection:text-primary-foreground selection:bg-primary;
76
143
  }
77
144
  }
78
145
 
@@ -89,11 +156,11 @@
89
156
  }
90
157
 
91
158
  .managed-table thead tr th {
92
- @apply text-xs py-1 px-3 text-muted-foreground h-6 font-normal;
159
+ @apply text-muted-foreground h-6 px-3 py-1 text-xs font-normal;
93
160
  }
94
161
 
95
162
  .managed-table tbody tr > td {
96
- @apply font-normal h-[38px] lg:py-1 bg-muted/5;
163
+ @apply bg-muted/5 h-[38px] font-normal lg:py-1;
97
164
  }
98
165
 
99
166
  .managed-table tbody tr > td:first-child {
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * Turtle Design System - Semantic Theme Variables
3
- *
3
+ *
4
4
  * This file maps our core design tokens to the semantic variables
5
5
  * expected by shadcn/ui components. This is the bridge between our
6
6
  * brand identity and the component API.
7
- *
7
+ *
8
8
  * All shadcn/ui components use these semantic variables, making them
9
9
  * fully themeable while maintaining our brand consistency.
10
10
  */
@@ -33,11 +33,11 @@
33
33
  --primary-foreground: var(--color-brand-black); /* #141514 - Black text on green */
34
34
 
35
35
  /* Secondary colors */
36
- --secondary: var(--color-neutral-alpha-10); /* #F9F9F91A - Light overlay on dark */
36
+ --secondary: var(--color-neutral-base-800); /* #262626 - Light overlay on dark */
37
37
  --secondary-foreground: var(--color-brand-white); /* #F9F9F9 - Light text */
38
38
 
39
39
  /* Muted colors */
40
- --muted: var(--color-neutral-alpha-2); /* #F9F9F905 - Subtle overlay */
40
+ --muted: var(--color-neutral-base-850); /* #191A19 - Subtle overlay */
41
41
  --muted-foreground: var(--color-neutral-alpha-50); /* #FFFFFF80 - Muted text */
42
42
 
43
43
  /* Accent colors */
@@ -53,8 +53,11 @@
53
53
  --input: var(--color-neutral-alpha-2); /* #F9F9F905 - Subtle input background */
54
54
  --ring: var(--color-brand-green); /* #73F36C - Focus ring */
55
55
 
56
+ --sidebar: var(--color-neutral-base-850);
57
+ --sidebar-foreground: var(--color-brand-white);
58
+
56
59
  /* ===== SEMANTIC SPACING MAPPING ===== */
57
- --radius: var(--radius-default); /* 10px - Default border radius */
60
+ --radius: var(--radius-turtle); /* 16px - Default border radius */
58
61
 
59
62
  /* ===== CHART COLORS (FOR DATA VISUALIZATION) ===== */
60
63
  --chart-1: var(--color-brand-green); /* Primary chart color */
@@ -104,4 +107,7 @@
104
107
  --border: var(--color-neutral-alpha-dark-10); /* #1415141A - Dark borders on light */
105
108
  --input: var(--color-neutral-alpha-2); /* #F9F9F905 - Subtle input background */
106
109
  --ring: var(--color-brand-green); /* #73F36C - Same focus ring */
110
+
111
+ --sidebar: var(--color-neutral-base-850);
112
+ --sidebar-foreground: var(--color-brand-white);
107
113
  }