@object-ui/components 0.3.0 → 0.3.1

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 (317) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/ISSUES_FOUND.md +128 -0
  3. package/README.md +19 -1
  4. package/README_SHADCN_SYNC.md +281 -0
  5. package/TESTING.md +335 -0
  6. package/dist/index.css +1 -1
  7. package/dist/index.js +30981 -30027
  8. package/dist/index.umd.cjs +30 -39
  9. package/dist/src/hooks/use-mobile.d.ts +7 -0
  10. package/dist/src/index.d.ts +4 -1
  11. package/dist/src/renderers/basic/button-group.d.ts +8 -0
  12. package/dist/src/renderers/basic/div.d.ts +7 -0
  13. package/dist/src/renderers/basic/html.d.ts +7 -0
  14. package/dist/src/renderers/basic/icon.d.ts +7 -0
  15. package/dist/src/renderers/basic/image.d.ts +7 -0
  16. package/dist/src/renderers/basic/navigation-menu.d.ts +8 -0
  17. package/dist/src/renderers/basic/pagination.d.ts +8 -0
  18. package/dist/src/renderers/basic/separator.d.ts +7 -0
  19. package/dist/src/renderers/basic/span.d.ts +7 -0
  20. package/dist/src/renderers/basic/text.d.ts +7 -0
  21. package/dist/src/renderers/complex/carousel.d.ts +7 -0
  22. package/dist/src/renderers/complex/data-table.d.ts +7 -0
  23. package/dist/src/renderers/complex/filter-builder.d.ts +7 -0
  24. package/dist/src/renderers/complex/resizable.d.ts +7 -0
  25. package/dist/src/renderers/complex/scroll-area.d.ts +7 -0
  26. package/dist/src/renderers/complex/table.d.ts +7 -0
  27. package/dist/src/renderers/data-display/alert.d.ts +7 -0
  28. package/dist/src/renderers/data-display/avatar.d.ts +7 -0
  29. package/dist/src/renderers/data-display/badge.d.ts +7 -0
  30. package/dist/src/renderers/data-display/breadcrumb.d.ts +8 -0
  31. package/dist/src/renderers/data-display/kbd.d.ts +8 -0
  32. package/dist/src/renderers/data-display/list.d.ts +7 -0
  33. package/dist/src/renderers/data-display/statistic.d.ts +7 -0
  34. package/dist/src/renderers/data-display/table.d.ts +8 -0
  35. package/dist/src/renderers/data-display/tree-view.d.ts +7 -0
  36. package/dist/src/renderers/disclosure/accordion.d.ts +7 -0
  37. package/dist/src/renderers/disclosure/collapsible.d.ts +7 -0
  38. package/dist/src/renderers/disclosure/toggle-group.d.ts +8 -0
  39. package/dist/src/renderers/feedback/empty.d.ts +8 -0
  40. package/dist/src/renderers/feedback/loading.d.ts +7 -0
  41. package/dist/src/renderers/feedback/progress.d.ts +7 -0
  42. package/dist/src/renderers/feedback/skeleton.d.ts +7 -0
  43. package/dist/src/renderers/feedback/sonner.d.ts +8 -0
  44. package/dist/src/renderers/feedback/spinner.d.ts +8 -0
  45. package/dist/src/renderers/feedback/toast.d.ts +8 -0
  46. package/dist/src/renderers/feedback/toaster.d.ts +7 -0
  47. package/dist/src/renderers/form/button.d.ts +7 -0
  48. package/dist/src/renderers/form/calendar.d.ts +7 -0
  49. package/dist/src/renderers/form/checkbox.d.ts +7 -0
  50. package/dist/src/renderers/form/combobox.d.ts +8 -0
  51. package/dist/src/renderers/form/command.d.ts +8 -0
  52. package/dist/src/renderers/form/date-picker.d.ts +7 -0
  53. package/dist/src/renderers/form/file-upload.d.ts +7 -0
  54. package/dist/src/renderers/form/form.d.ts +7 -0
  55. package/dist/src/renderers/form/input-otp.d.ts +7 -0
  56. package/dist/src/renderers/form/input.d.ts +7 -0
  57. package/dist/src/renderers/form/label.d.ts +7 -0
  58. package/dist/src/renderers/form/radio-group.d.ts +7 -0
  59. package/dist/src/renderers/form/select.d.ts +7 -0
  60. package/dist/src/renderers/form/slider.d.ts +7 -0
  61. package/dist/src/renderers/form/switch.d.ts +7 -0
  62. package/dist/src/renderers/form/textarea.d.ts +7 -0
  63. package/dist/src/renderers/form/toggle.d.ts +7 -0
  64. package/dist/src/renderers/layout/aspect-ratio.d.ts +8 -0
  65. package/dist/src/renderers/layout/card.d.ts +7 -0
  66. package/dist/src/renderers/layout/container.d.ts +7 -0
  67. package/dist/src/renderers/layout/flex.d.ts +7 -0
  68. package/dist/src/renderers/layout/grid.d.ts +7 -0
  69. package/dist/src/renderers/layout/semantic.d.ts +7 -0
  70. package/dist/src/renderers/layout/stack.d.ts +7 -0
  71. package/dist/src/renderers/layout/tabs.d.ts +7 -0
  72. package/dist/src/renderers/navigation/header-bar.d.ts +7 -0
  73. package/dist/src/renderers/navigation/sidebar.d.ts +7 -0
  74. package/dist/src/renderers/overlay/alert-dialog.d.ts +7 -0
  75. package/dist/src/renderers/overlay/context-menu.d.ts +7 -0
  76. package/dist/src/renderers/overlay/dialog.d.ts +7 -0
  77. package/dist/src/renderers/overlay/drawer.d.ts +7 -0
  78. package/dist/src/renderers/overlay/dropdown-menu.d.ts +7 -0
  79. package/dist/src/renderers/overlay/hover-card.d.ts +7 -0
  80. package/dist/src/renderers/overlay/menubar.d.ts +8 -0
  81. package/dist/src/renderers/overlay/popover.d.ts +7 -0
  82. package/dist/src/renderers/overlay/sheet.d.ts +7 -0
  83. package/dist/src/renderers/overlay/tooltip.d.ts +7 -0
  84. package/dist/src/renderers/placeholders.d.ts +9 -0
  85. package/dist/src/ui/accordion.d.ts +7 -0
  86. package/dist/src/ui/alert-dialog.d.ts +7 -0
  87. package/dist/src/ui/alert.d.ts +7 -0
  88. package/dist/src/ui/aspect-ratio.d.ts +7 -0
  89. package/dist/src/ui/avatar.d.ts +7 -0
  90. package/dist/src/ui/badge.d.ts +7 -0
  91. package/dist/src/ui/breadcrumb.d.ts +7 -0
  92. package/dist/src/ui/button.d.ts +10 -5
  93. package/dist/src/ui/calendar.d.ts +14 -7
  94. package/dist/src/ui/card.d.ts +7 -0
  95. package/dist/src/ui/carousel.d.ts +7 -0
  96. package/dist/src/ui/checkbox.d.ts +7 -0
  97. package/dist/src/ui/collapsible.d.ts +7 -0
  98. package/dist/src/ui/combobox.d.ts +22 -0
  99. package/dist/src/ui/command.d.ts +7 -0
  100. package/dist/src/ui/context-menu.d.ts +7 -0
  101. package/dist/src/ui/date-picker.d.ts +15 -0
  102. package/dist/src/ui/dialog.d.ts +7 -0
  103. package/dist/src/ui/drawer.d.ts +7 -0
  104. package/dist/src/ui/dropdown-menu.d.ts +7 -0
  105. package/dist/src/ui/filter-builder.d.ts +7 -0
  106. package/dist/src/ui/form.d.ts +7 -0
  107. package/dist/src/ui/hover-card.d.ts +7 -0
  108. package/dist/src/ui/index.d.ts +10 -5
  109. package/dist/src/ui/input-otp.d.ts +7 -0
  110. package/dist/src/ui/input.d.ts +7 -0
  111. package/dist/src/ui/item.d.ts +7 -0
  112. package/dist/src/ui/kbd.d.ts +7 -0
  113. package/dist/src/ui/label.d.ts +7 -0
  114. package/dist/src/ui/menubar.d.ts +7 -0
  115. package/dist/src/ui/navigation-menu.d.ts +7 -0
  116. package/dist/src/ui/pagination.d.ts +7 -0
  117. package/dist/src/ui/popover.d.ts +7 -0
  118. package/dist/src/ui/progress.d.ts +7 -0
  119. package/dist/src/ui/radio-group.d.ts +7 -0
  120. package/dist/src/ui/resizable.d.ts +7 -0
  121. package/dist/src/ui/scroll-area.d.ts +7 -0
  122. package/dist/src/ui/select.d.ts +9 -2
  123. package/dist/src/ui/separator.d.ts +7 -0
  124. package/dist/src/ui/sheet.d.ts +7 -0
  125. package/dist/src/ui/sidebar.d.ts +14 -9
  126. package/dist/src/ui/skeleton.d.ts +7 -0
  127. package/dist/src/ui/slider.d.ts +7 -0
  128. package/dist/src/ui/spinner.d.ts +7 -0
  129. package/dist/src/ui/switch.d.ts +7 -0
  130. package/dist/src/ui/table.d.ts +15 -8
  131. package/dist/src/ui/tabs.d.ts +7 -0
  132. package/dist/src/ui/textarea.d.ts +7 -0
  133. package/dist/src/ui/toggle-group.d.ts +8 -3
  134. package/dist/src/ui/toggle.d.ts +7 -0
  135. package/dist/src/ui/tooltip.d.ts +7 -0
  136. package/metadata/ObjectGrid.component.yml +72 -0
  137. package/package.json +23 -11
  138. package/postcss.config.js +9 -1
  139. package/shadcn-components.json +310 -0
  140. package/src/__tests__/README.md +124 -0
  141. package/src/__tests__/basic-renderers.test.tsx +255 -0
  142. package/src/__tests__/complex-disclosure-renderers.test.tsx +301 -0
  143. package/src/__tests__/feedback-overlay-renderers.test.tsx +349 -0
  144. package/src/__tests__/form-renderers.test.tsx +364 -0
  145. package/src/__tests__/layout-data-renderers.test.tsx +340 -0
  146. package/src/__tests__/test-utils.tsx +190 -0
  147. package/src/hooks/use-mobile.tsx +8 -0
  148. package/src/index.css +86 -54
  149. package/src/index.test.ts +8 -0
  150. package/src/index.ts +21 -1
  151. package/src/lib/utils.tsx +8 -0
  152. package/src/new-components.test.ts +8 -9
  153. package/src/renderers/basic/button-group.tsx +78 -0
  154. package/src/renderers/basic/div.tsx +9 -1
  155. package/src/renderers/basic/html.tsx +8 -0
  156. package/src/renderers/basic/icon.tsx +66 -3
  157. package/src/renderers/basic/image.tsx +12 -1
  158. package/src/renderers/basic/index.ts +11 -0
  159. package/src/renderers/basic/navigation-menu.tsx +80 -0
  160. package/src/renderers/basic/pagination.tsx +82 -0
  161. package/src/renderers/basic/separator.tsx +9 -1
  162. package/src/renderers/basic/span.tsx +9 -1
  163. package/src/renderers/basic/text.tsx +8 -0
  164. package/src/renderers/complex/__tests__/data-table.test.ts +8 -0
  165. package/src/renderers/complex/carousel.tsx +11 -3
  166. package/src/renderers/complex/data-table.tsx +19 -4
  167. package/src/renderers/complex/filter-builder.tsx +8 -0
  168. package/src/renderers/complex/index.ts +9 -3
  169. package/src/renderers/complex/resizable.tsx +8 -0
  170. package/src/renderers/complex/scroll-area.tsx +8 -0
  171. package/src/renderers/complex/table.tsx +10 -2
  172. package/src/renderers/data-display/alert.tsx +8 -0
  173. package/src/renderers/data-display/avatar.tsx +8 -0
  174. package/src/renderers/data-display/badge.tsx +8 -0
  175. package/src/renderers/data-display/breadcrumb.tsx +59 -0
  176. package/src/renderers/data-display/index.ts +12 -0
  177. package/src/renderers/data-display/kbd.tsx +49 -0
  178. package/src/renderers/data-display/list.tsx +8 -0
  179. package/src/renderers/data-display/statistic.tsx +24 -43
  180. package/src/renderers/data-display/table.tsx +68 -0
  181. package/src/renderers/data-display/tree-view.tsx +26 -37
  182. package/src/renderers/disclosure/accordion.tsx +8 -0
  183. package/src/renderers/disclosure/collapsible.tsx +8 -0
  184. package/src/renderers/disclosure/index.ts +9 -0
  185. package/src/renderers/disclosure/toggle-group.tsx +77 -0
  186. package/src/renderers/feedback/empty.tsx +48 -0
  187. package/src/renderers/feedback/index.ts +12 -0
  188. package/src/renderers/feedback/loading.tsx +8 -0
  189. package/src/renderers/feedback/progress.tsx +8 -0
  190. package/src/renderers/feedback/skeleton.tsx +8 -0
  191. package/src/renderers/feedback/sonner.tsx +55 -0
  192. package/src/renderers/feedback/spinner.tsx +54 -0
  193. package/src/renderers/feedback/toast.tsx +58 -0
  194. package/src/renderers/feedback/toaster.tsx +13 -17
  195. package/src/renderers/form/button.tsx +8 -0
  196. package/src/renderers/form/calendar.tsx +8 -0
  197. package/src/renderers/form/checkbox.tsx +8 -0
  198. package/src/renderers/form/combobox.tsx +47 -0
  199. package/src/renderers/form/command.tsx +57 -0
  200. package/src/renderers/form/date-picker.tsx +10 -2
  201. package/src/renderers/form/file-upload.tsx +10 -2
  202. package/src/renderers/form/form.tsx +12 -3
  203. package/src/renderers/form/index.ts +10 -0
  204. package/src/renderers/form/input-otp.tsx +34 -15
  205. package/src/renderers/form/input.tsx +89 -50
  206. package/src/renderers/form/label.tsx +8 -0
  207. package/src/renderers/form/radio-group.tsx +8 -0
  208. package/src/renderers/form/select.tsx +8 -0
  209. package/src/renderers/form/slider.tsx +16 -1
  210. package/src/renderers/form/switch.tsx +8 -0
  211. package/src/renderers/form/textarea.tsx +8 -0
  212. package/src/renderers/form/toggle.tsx +8 -0
  213. package/src/renderers/index.ts +8 -0
  214. package/src/renderers/layout/aspect-ratio.tsx +50 -0
  215. package/src/renderers/layout/card.tsx +8 -0
  216. package/src/renderers/layout/container.tsx +20 -12
  217. package/src/renderers/layout/flex.tsx +16 -8
  218. package/src/renderers/layout/grid.tsx +8 -0
  219. package/src/renderers/layout/index.ts +9 -0
  220. package/src/renderers/layout/page.tsx +9 -1
  221. package/src/renderers/layout/semantic.tsx +8 -0
  222. package/src/renderers/layout/stack.tsx +16 -8
  223. package/src/renderers/layout/tabs.tsx +8 -0
  224. package/src/renderers/navigation/header-bar.tsx +9 -1
  225. package/src/renderers/navigation/index.ts +8 -0
  226. package/src/renderers/navigation/sidebar.tsx +8 -0
  227. package/src/renderers/overlay/alert-dialog.tsx +8 -0
  228. package/src/renderers/overlay/context-menu.tsx +9 -1
  229. package/src/renderers/overlay/dialog.tsx +8 -0
  230. package/src/renderers/overlay/drawer.tsx +8 -0
  231. package/src/renderers/overlay/dropdown-menu.tsx +8 -0
  232. package/src/renderers/overlay/hover-card.tsx +8 -0
  233. package/src/renderers/overlay/index.ts +9 -0
  234. package/src/renderers/overlay/menubar.tsx +75 -0
  235. package/src/renderers/overlay/popover.tsx +8 -0
  236. package/src/renderers/overlay/sheet.tsx +8 -0
  237. package/src/renderers/overlay/tooltip.tsx +8 -0
  238. package/src/renderers/placeholders.tsx +107 -0
  239. package/src/ui/accordion.tsx +8 -0
  240. package/src/ui/alert-dialog.tsx +8 -0
  241. package/src/ui/alert.tsx +14 -24
  242. package/src/ui/aspect-ratio.tsx +8 -0
  243. package/src/ui/avatar.tsx +8 -0
  244. package/src/ui/badge.tsx +13 -6
  245. package/src/ui/breadcrumb.tsx +8 -0
  246. package/src/ui/button-group.tsx +8 -0
  247. package/src/ui/button.tsx +38 -36
  248. package/src/ui/calendar.tsx +57 -200
  249. package/src/ui/card.tsx +8 -0
  250. package/src/ui/carousel.tsx +8 -0
  251. package/src/ui/checkbox.tsx +8 -0
  252. package/src/ui/collapsible.tsx +8 -0
  253. package/src/ui/combobox.tsx +104 -0
  254. package/src/ui/command.tsx +8 -0
  255. package/src/ui/context-menu.tsx +8 -0
  256. package/src/ui/date-picker.tsx +61 -0
  257. package/src/ui/dialog.tsx +8 -0
  258. package/src/ui/drawer.tsx +8 -0
  259. package/src/ui/dropdown-menu.tsx +8 -0
  260. package/src/ui/empty.tsx +8 -0
  261. package/src/ui/filter-builder.tsx +8 -0
  262. package/src/ui/form.tsx +8 -0
  263. package/src/ui/hover-card.tsx +8 -0
  264. package/src/ui/index.ts +11 -5
  265. package/src/ui/input-otp.tsx +20 -12
  266. package/src/ui/input.tsx +8 -0
  267. package/src/ui/item.tsx +8 -0
  268. package/src/ui/kbd.tsx +8 -0
  269. package/src/ui/label.tsx +8 -0
  270. package/src/ui/menubar.tsx +8 -0
  271. package/src/ui/navigation-menu.tsx +8 -0
  272. package/src/ui/pagination.tsx +8 -0
  273. package/src/ui/popover.tsx +9 -1
  274. package/src/ui/progress.tsx +11 -15
  275. package/src/ui/radio-group.tsx +8 -0
  276. package/src/ui/resizable.tsx +8 -0
  277. package/src/ui/scroll-area.tsx +9 -1
  278. package/src/ui/select.tsx +17 -9
  279. package/src/ui/separator.tsx +8 -0
  280. package/src/ui/sheet.tsx +8 -0
  281. package/src/ui/sidebar.tsx +34 -15
  282. package/src/ui/skeleton.tsx +8 -0
  283. package/src/ui/slider.tsx +8 -0
  284. package/src/ui/sonner.tsx +12 -20
  285. package/src/ui/spinner.tsx +11 -23
  286. package/src/ui/switch.tsx +8 -0
  287. package/src/ui/table.tsx +102 -97
  288. package/src/ui/tabs.tsx +8 -0
  289. package/src/ui/textarea.tsx +8 -0
  290. package/src/ui/toggle-group.tsx +12 -21
  291. package/src/ui/toggle.tsx +15 -12
  292. package/src/ui/tooltip.tsx +8 -0
  293. package/tsconfig.json +2 -1
  294. package/vite.config.ts +11 -1
  295. package/dist/src/index.test.d.ts +0 -1
  296. package/dist/src/new-components.test.d.ts +0 -1
  297. package/dist/src/renderers/complex/__tests__/data-table.test.d.ts +0 -0
  298. package/dist/src/renderers/complex/calendar-view.d.ts +0 -1
  299. package/dist/src/renderers/complex/chatbot.d.ts +0 -1
  300. package/dist/src/renderers/complex/chatbot.test.d.ts +0 -1
  301. package/dist/src/renderers/complex/timeline.d.ts +0 -1
  302. package/dist/src/ui/calendar-view.d.ts +0 -21
  303. package/dist/src/ui/chatbot.d.ts +0 -36
  304. package/dist/src/ui/field.d.ts +0 -24
  305. package/dist/src/ui/input-group.d.ts +0 -16
  306. package/dist/src/ui/timeline.d.ts +0 -25
  307. package/metadata/ObjectTable.component.yml +0 -41
  308. package/src/renderers/complex/calendar-view.tsx +0 -219
  309. package/src/renderers/complex/chatbot.test.ts +0 -44
  310. package/src/renderers/complex/chatbot.tsx +0 -185
  311. package/src/renderers/complex/timeline.tsx +0 -466
  312. package/src/ui/calendar-view.tsx +0 -503
  313. package/src/ui/chatbot.tsx +0 -240
  314. package/src/ui/field.tsx +0 -246
  315. package/src/ui/input-group.tsx +0 -170
  316. package/src/ui/timeline.tsx +0 -266
  317. package/tailwind.config.js +0 -75
@@ -1,3 +1,11 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
1
9
  import { ComponentRegistry } from '@object-ui/core';
2
10
  import type { StatisticSchema } from '@object-ui/types';
3
11
  import { cn } from '../../lib/utils';
@@ -6,66 +14,39 @@ import { TrendingUp, TrendingDown, Minus } from 'lucide-react';
6
14
  const StatisticRenderer = ({ schema }: { schema: StatisticSchema }) => {
7
15
  return (
8
16
  <div className={cn(
9
- "group relative flex flex-col p-5 rounded-xl transition-all duration-300 overflow-hidden",
10
- "bg-slate-950/40 border border-slate-800/60 backdrop-blur-sm",
11
- "hover:bg-slate-900/60 hover:border-cyan-500/50 hover:shadow-[0_0_30px_-10px_rgba(6,182,212,0.3)]",
17
+ "group relative flex flex-col p-4 sm:p-5 md:p-6 rounded-xl border bg-card text-card-foreground shadow-sm",
12
18
  schema.className
13
19
  )}>
14
- {/* Decorative scanner line */}
15
- <div className="absolute top-0 left-0 w-full h-[1px] bg-linear-to-r from-transparent via-cyan-500/50 to-transparent -translate-x-full group-hover:animate-[shimmer_1.5s_infinite]" />
16
- <div className="absolute inset-0 bg-[url('https://grainy-gradients.vercel.app/noise.svg')] opacity-5 pointer-events-none" />
17
-
18
20
  {/* Label */}
19
21
  {schema.label && (
20
22
  <div className="flex items-center gap-2 mb-2">
21
- <div className="w-1 h-3 bg-cyan-500 rounded-full shadow-[0_0_8px_cyan]" />
22
- <p className="text-[10px] font-mono font-bold uppercase tracking-[0.2em] text-cyan-600/80 group-hover:text-cyan-400 transition-colors">
23
+ <p className="text-sm font-medium text-muted-foreground">
23
24
  {schema.label}
24
25
  </p>
25
26
  </div>
26
27
  )}
27
28
 
28
29
  {/* Value Area */}
29
- <div className="flex items-baseline gap-3 my-1 relative z-10">
30
- <h3 className={cn(
31
- "text-4xl font-black tracking-tight text-white transition-all duration-300",
32
- "drop-shadow-[0_0_10px_rgba(255,255,255,0.3)]",
33
- "group-hover:scale-110 group-hover:text-cyan-100 group-hover:drop-shadow-[0_0_15px_rgba(6,182,212,0.6)] group-hover:-translate-y-1"
34
- )}>
30
+ <div className="flex items-baseline gap-2">
31
+ <h3 className="text-2xl font-bold tracking-tight">
35
32
  {schema.value}
36
33
  </h3>
34
+ </div>
37
35
 
38
- {/* Trend Indicator */}
39
- {schema.trend && (
40
- <div className={cn(
41
- "flex items-center px-2 py-0.5 rounded-full text-[10px] font-bold border backdrop-blur-md transition-all",
42
- schema.trend === 'up' && "text-emerald-400 border-emerald-500/30 bg-emerald-950/30 shadow-[0_0_10px_-4px_rgba(52,211,153,0.5)]",
43
- schema.trend === 'down' && "text-rose-400 border-rose-500/30 bg-rose-950/30 shadow-[0_0_10px_-4px_rgba(251,113,133,0.5)]",
44
- schema.trend === 'neutral' && "text-amber-400 border-amber-500/30 bg-amber-950/30 shadow-[0_0_10px_-4px_rgba(251,191,36,0.5)]",
45
- "group-hover:scale-105"
46
- )}>
47
- {schema.trend === 'up' && <TrendingUp className="mr-1 h-3 w-3" />}
48
- {schema.trend === 'down' && <TrendingDown className="mr-1 h-3 w-3" />}
36
+ {/* Footer / Trend */}
37
+ {(schema.trend || schema.description) && (
38
+ <div className="mt-1 flex items-center text-xs text-muted-foreground">
39
+ {schema.trend === 'up' && <TrendingUp className="mr-1 h-3 w-3 text-emerald-500" />}
40
+ {schema.trend === 'down' && <TrendingDown className="mr-1 h-3 w-3 text-rose-500" />}
49
41
  {schema.trend === 'neutral' && <Minus className="mr-1 h-3 w-3" />}
50
- {schema.description && <span className="max-w-[100px] truncate">{schema.description}</span>}
42
+ <span className={cn(
43
+ schema.trend === 'up' && "text-emerald-500 font-medium",
44
+ schema.trend === 'down' && "text-rose-500 font-medium",
45
+ )}>
46
+ {schema.description}
47
+ </span>
51
48
  </div>
52
- )}
53
- </div>
54
-
55
- {/* Footer / Description Text if needed below (optional, mostly handled by trend pill now, but keeping separate if text is long) */}
56
- {schema.description && !schema.trend && (
57
- <p className="text-xs text-slate-500 font-mono mt-1 group-hover:text-slate-400 transition-colors">
58
- {schema.description}
59
- </p>
60
49
  )}
61
-
62
- {/* Decorative accent corners */}
63
- <div className="absolute right-0 bottom-0 w-8 h-8 opacity-20 group-hover:opacity-100 transition-opacity">
64
- <svg viewBox="0 0 24 24" fill="none" className="w-full h-full text-cyan-500" stroke="currentColor" strokeWidth="1">
65
- <path d="M22 22L12 22L22 12Z" fill="currentColor" fillOpacity="0.2" />
66
- <path d="M22 17L22 22L17 22" strokeLinecap="round" strokeLinejoin="round" />
67
- </svg>
68
- </div>
69
50
  </div>
70
51
  );
71
52
  };
@@ -0,0 +1,68 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
9
+ import React from 'react';
10
+ import { ComponentRegistry } from '@object-ui/core';
11
+ import { useDataScope } from '@object-ui/react';
12
+ import {
13
+ Table,
14
+ TableBody,
15
+ TableCell,
16
+ TableHead,
17
+ TableHeader,
18
+ TableRow
19
+ } from '../../ui/table';
20
+ import { cn } from '../../lib/utils';
21
+
22
+ export const SimpleTableRenderer = ({ schema, className, ..._props }: any) => {
23
+ const data = useDataScope(schema.bind);
24
+ const columns = schema.props?.columns || [];
25
+
26
+ // If we have data but it's not an array, show error.
27
+ // If data is undefined, we might just be loading or empty.
28
+ if (data && !Array.isArray(data)) {
29
+ return <div className="text-red-500 p-2 border border-red-200 bg-red-50 rounded text-sm">Table data must be an array</div>;
30
+ }
31
+
32
+ const displayData = Array.isArray(data) ? data : [];
33
+
34
+ return (
35
+ <div className={cn("rounded-md border", className)}>
36
+ <Table>
37
+ <TableHeader>
38
+ <TableRow>
39
+ {columns.map((col: any) => (
40
+ <TableHead key={col.key}>{col.label}</TableHead>
41
+ ))}
42
+ </TableRow>
43
+ </TableHeader>
44
+ <TableBody>
45
+ {displayData.length === 0 ? (
46
+ <TableRow>
47
+ <TableCell colSpan={columns.length} className="h-24 text-center">
48
+ No results.
49
+ </TableCell>
50
+ </TableRow>
51
+ ) : (
52
+ displayData.map((row: any, i: number) => (
53
+ <TableRow key={row.id || i}>
54
+ {columns.map((col: any) => (
55
+ <TableCell key={col.key}>
56
+ {row[col.key]}
57
+ </TableCell>
58
+ ))}
59
+ </TableRow>
60
+ ))
61
+ )}
62
+ </TableBody>
63
+ </Table>
64
+ </div>
65
+ );
66
+ };
67
+
68
+ ComponentRegistry.register('table', SimpleTableRenderer);
@@ -1,3 +1,11 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
1
9
  import { ComponentRegistry } from '@object-ui/core';
2
10
  import type { TreeViewSchema, TreeNode } from '@object-ui/types';
3
11
  import { ChevronRight, ChevronDown, Folder, File, FolderOpen, CircuitBoard } from 'lucide-react';
@@ -6,12 +14,10 @@ import { cn } from '../../lib/utils';
6
14
 
7
15
  const TreeNodeComponent = ({
8
16
  node,
9
- onNodeClick,
10
- isChild = false
17
+ onNodeClick
11
18
  }: {
12
19
  node: TreeNode;
13
20
  onNodeClick?: (node: TreeNode) => void;
14
- isChild?: boolean;
15
21
  }) => {
16
22
  const [isOpen, setIsOpen] = useState(false);
17
23
  const hasChildren = node.children && node.children.length > 0;
@@ -29,68 +35,56 @@ const TreeNodeComponent = ({
29
35
 
30
36
  return (
31
37
  <div className="relative">
32
- {/* Connecting line for siblings (visual aid, tricky to do perfectly without depth context, so we focus on the left border of the container) */}
33
-
34
38
  <div
35
39
  className={cn(
36
- 'group flex items-center py-1.5 px-2 rounded-sm cursor-pointer transition-all duration-200 border border-transparent',
37
- 'hover:bg-cyan-950/30 hover:border-cyan-500/20 hover:shadow-[inset_0_0_10px_-5px_cyan]',
38
- isOpen && hasChildren && 'bg-slate-900/40' // Active parent state
40
+ 'group flex items-center py-1.5 px-2 rounded-sm cursor-pointer transition-colors',
41
+ 'hover:bg-accent hover:text-accent-foreground',
42
+ isOpen && hasChildren && 'bg-accent/50'
39
43
  )}
40
44
  onClick={handleClick}
41
45
  >
42
- {/* Indentation adjustment triggered by parent's padding/margin, not calculated prop here to allow CSS lines */}
43
-
44
46
  {hasChildren ? (
45
47
  <button
46
48
  onClick={handleToggle}
47
- className="mr-2 p-0.5 h-5 w-5 flex items-center justify-center rounded-sm hover:bg-cyan-500/20 text-cyan-600 transition-colors"
49
+ className="mr-2 p-0.5 h-5 w-5 flex items-center justify-center rounded-sm hover:bg-muted text-muted-foreground transition-colors"
48
50
  >
49
51
  {isOpen ? (
50
- <ChevronDown className="h-4 w-4 drop-shadow-[0_0_5px_cyan]" />
52
+ <ChevronDown className="h-4 w-4" />
51
53
  ) : (
52
54
  <ChevronRight className="h-4 w-4" />
53
55
  )}
54
56
  </button>
55
57
  ) : (
56
58
  <span className="mr-2 w-5 flex justify-center">
57
- <div className="w-1 h-1 rounded-full bg-slate-700/50 group-hover:bg-cyan-500/50" />
59
+ <div className="w-1 h-1 rounded-full bg-muted-foreground/50" />
58
60
  </span>
59
61
  )}
60
62
 
61
63
  {node.icon === 'folder' || hasChildren ? (
62
64
  isOpen ?
63
- <FolderOpen className="h-4 w-4 mr-2 text-cyan-400 drop-shadow-[0_0_5px_rgba(6,182,212,0.5)]" /> :
64
- <Folder className="h-4 w-4 mr-2 text-cyan-600 group-hover:text-cyan-400 transition-colors" />
65
+ <FolderOpen className="h-4 w-4 mr-2 text-primary" /> :
66
+ <Folder className="h-4 w-4 mr-2 text-muted-foreground group-hover:text-primary transition-colors" />
65
67
  ) : (
66
- <File className="h-4 w-4 mr-2 text-slate-500 group-hover:text-cyan-200 transition-colors" />
68
+ <File className="h-4 w-4 mr-2 text-muted-foreground group-hover:text-primary transition-colors" />
67
69
  )}
68
70
 
69
71
  <span className={cn(
70
- "text-sm font-mono tracking-wide transition-colors",
71
- isOpen ? "text-cyan-100 font-bold shadow-cyan-500/20" : "text-slate-400 group-hover:text-cyan-300"
72
+ "text-sm transition-colors",
73
+ isOpen ? "font-medium text-foreground" : "text-muted-foreground group-hover:text-foreground"
72
74
  )}>
73
75
  {node.label}
74
76
  </span>
75
77
  </div>
76
78
 
77
- {/* Children Container with Circuit Line */}
78
79
  {hasChildren && isOpen && (
79
- <div className="relative ml-[11px] pl-3 border-l border-cyan-800/40 animate-in slide-in-from-left-2 fade-in duration-200">
80
- {/* Decorative little bulb at the junction */}
81
- <div className="absolute top-0 -left-[1px] -translate-x-1/2 w-1.5 h-1.5 bg-cyan-700/50 rounded-full" />
82
-
80
+ <div className="relative ml-[11px] pl-3 border-l border-border animate-in slide-in-from-left-2 fade-in duration-200">
83
81
  {node.children!.map((child) => (
84
82
  <TreeNodeComponent
85
83
  key={child.id}
86
84
  node={child}
87
85
  onNodeClick={onNodeClick}
88
- isChild={true}
89
86
  />
90
87
  ))}
91
-
92
- {/* Decorative end cap */}
93
- <div className="absolute bottom-0 -left-[1px] -translate-x-1/2 w-1 h-1 bg-cyan-800/50 rounded-full" />
94
88
  </div>
95
89
  )}
96
90
  </div>
@@ -107,23 +101,18 @@ ComponentRegistry.register('tree-view',
107
101
 
108
102
  return (
109
103
  <div className={cn(
110
- 'relative border border-border/60 rounded-lg p-3 bg-card/40 backdrop-blur-md overflow-hidden',
111
- 'shadow-lg shadow-primary/5',
104
+ 'relative border rounded-lg p-3 bg-card text-card-foreground',
112
105
  className
113
106
  )}
114
107
  {...props}
115
108
  >
116
- {/* Background Grid */}
117
- <div className="absolute inset-0 bg-[linear-gradient(to_right,hsl(var(--border)/0.1)_1px,transparent_1px),linear-gradient(to_bottom,hsl(var(--border)/0.1)_1px,transparent_1px)] bg-[size:24px_24px] pointer-events-none" />
118
-
119
109
  {schema.title && (
120
- <div className="flex items-center gap-2 mb-3 pb-2 border-b border-primary/20 relative z-10">
121
- <CircuitBoard className="w-4 h-4 text-primary" />
122
- <h3 className="text-xs font-bold font-mono uppercase tracking-widest text-primary">{schema.title}</h3>
110
+ <div className="flex items-center gap-2 mb-3 pb-2 border-b">
111
+ <h3 className="text-sm font-semibold">{schema.title}</h3>
123
112
  </div>
124
113
  )}
125
- <div className="space-y-1 relative z-10">
126
- {schema.nodes?.map((node: TreeNode) => (
114
+ <div className="space-y-1">
115
+ {(schema.nodes || schema.data)?.map((node: TreeNode) => (
127
116
  <TreeNodeComponent
128
117
  key={node.id}
129
118
  node={node}
@@ -1,3 +1,11 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
1
9
  import { ComponentRegistry } from '@object-ui/core';
2
10
  import type { AccordionSchema } from '@object-ui/types';
3
11
  import {
@@ -1,3 +1,11 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
1
9
  import { ComponentRegistry } from '@object-ui/core';
2
10
  import type { CollapsibleSchema } from '@object-ui/types';
3
11
  import {
@@ -1,2 +1,11 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
1
9
  import './accordion';
2
10
  import './collapsible';
11
+ import './toggle-group';
@@ -0,0 +1,77 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
9
+ import { ComponentRegistry } from '@object-ui/core';
10
+ import type { ToggleGroupSchema } from '@object-ui/types';
11
+ import { ToggleGroup, ToggleGroupItem } from '../../ui/toggle-group';
12
+
13
+ ComponentRegistry.register('toggle-group',
14
+ ({ schema, ...props }: { schema: ToggleGroupSchema; [key: string]: any }) => {
15
+ const {
16
+ 'data-obj-id': dataObjId,
17
+ 'data-obj-type': dataObjType,
18
+ style,
19
+ ...toggleGroupProps
20
+ } = props;
21
+
22
+ return (
23
+ <ToggleGroup
24
+ type={(schema.selectionType || 'single') as any}
25
+ variant={schema.variant}
26
+ size={schema.size}
27
+ value={schema.value as any}
28
+ className={schema.className}
29
+ {...toggleGroupProps}
30
+ {...{ 'data-obj-id': dataObjId, 'data-obj-type': dataObjType, style }}
31
+ >
32
+ {schema.items?.map((item, idx) => (
33
+ <ToggleGroupItem key={idx} value={item.value} aria-label={item.label}>
34
+ {item.label}
35
+ </ToggleGroupItem>
36
+ ))}
37
+ </ToggleGroup>
38
+ );
39
+ },
40
+ {
41
+ label: 'Toggle Group',
42
+ inputs: [
43
+ {
44
+ name: 'selectionType',
45
+ type: 'enum',
46
+ enum: ['single', 'multiple'],
47
+ defaultValue: 'single',
48
+ label: 'Selection Type'
49
+ },
50
+ {
51
+ name: 'variant',
52
+ type: 'enum',
53
+ enum: ['default', 'outline'],
54
+ defaultValue: 'default',
55
+ label: 'Variant'
56
+ },
57
+ {
58
+ name: 'size',
59
+ type: 'enum',
60
+ enum: ['default', 'sm', 'lg'],
61
+ defaultValue: 'default',
62
+ label: 'Size'
63
+ },
64
+ { name: 'className', type: 'string', label: 'CSS Class' }
65
+ ],
66
+ defaultProps: {
67
+ selectionType: 'single',
68
+ variant: 'default',
69
+ size: 'default',
70
+ items: [
71
+ { value: 'bold', label: 'Bold' },
72
+ { value: 'italic', label: 'Italic' },
73
+ { value: 'underline', label: 'Underline' }
74
+ ]
75
+ }
76
+ }
77
+ );
@@ -0,0 +1,48 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
9
+ import { ComponentRegistry } from '@object-ui/core';
10
+ import type { EmptySchema } from '@object-ui/types';
11
+ import { InboxIcon } from 'lucide-react';
12
+ import { cn } from '../../lib/utils';
13
+
14
+ ComponentRegistry.register('empty',
15
+ ({ schema, ...props }: { schema: EmptySchema; [key: string]: any }) => {
16
+ const {
17
+ 'data-obj-id': dataObjId,
18
+ 'data-obj-type': dataObjType,
19
+ style,
20
+ ...emptyProps
21
+ } = props;
22
+
23
+ return (
24
+ <div
25
+ className={cn('flex flex-col items-center justify-center p-8 text-center', schema.className)}
26
+ {...emptyProps}
27
+ {...{ 'data-obj-id': dataObjId, 'data-obj-type': dataObjType, style }}
28
+ >
29
+ <InboxIcon className="h-12 w-12 text-muted-foreground mb-4" />
30
+ <h3 className="text-lg font-semibold">{schema.title || 'No data'}</h3>
31
+ {schema.description && (
32
+ <p className="text-sm text-muted-foreground mt-2">{schema.description}</p>
33
+ )}
34
+ </div>
35
+ );
36
+ },
37
+ {
38
+ label: 'Empty',
39
+ inputs: [
40
+ { name: 'title', type: 'string', label: 'Title', defaultValue: 'No data' },
41
+ { name: 'description', type: 'string', label: 'Description' },
42
+ { name: 'className', type: 'string', label: 'CSS Class' }
43
+ ],
44
+ defaultProps: {
45
+ title: 'No data'
46
+ }
47
+ }
48
+ );
@@ -1,4 +1,16 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
1
9
  import './progress';
2
10
  import './skeleton';
3
11
  import './toaster';
4
12
  import './loading';
13
+ import './toast';
14
+ import './spinner';
15
+ import './empty';
16
+ import './sonner';
@@ -1,3 +1,11 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
1
9
  import { ComponentRegistry } from '@object-ui/core';
2
10
  import type { LoadingSchema } from '@object-ui/types';
3
11
  import { Spinner } from '../../ui';
@@ -1,3 +1,11 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
1
9
  import { ComponentRegistry } from '@object-ui/core';
2
10
  import type { ProgressSchema } from '@object-ui/types';
3
11
  import { Progress } from '../../ui';
@@ -1,3 +1,11 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
1
9
  import { ComponentRegistry } from '@object-ui/core';
2
10
  import type { SkeletonSchema } from '@object-ui/types';
3
11
  import { Skeleton } from '../../ui';
@@ -0,0 +1,55 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
9
+ import { ComponentRegistry } from '@object-ui/core';
10
+ import type { SonnerSchema } from '@object-ui/types';
11
+ import { toast } from 'sonner';
12
+ import { Button } from '../../ui';
13
+
14
+ ComponentRegistry.register('sonner',
15
+ ({ schema, ...props }: { schema: SonnerSchema; [key: string]: any }) => {
16
+ const showToast = () => {
17
+ const toastFn = schema.variant === 'success' ? toast.success :
18
+ schema.variant === 'error' ? toast.error :
19
+ schema.variant === 'warning' ? toast.warning :
20
+ schema.variant === 'info' ? toast.info :
21
+ toast;
22
+
23
+ toastFn(schema.message || schema.title || 'Notification', {
24
+ description: schema.description,
25
+ });
26
+ };
27
+
28
+ return (
29
+ <Button onClick={showToast} variant={schema.buttonVariant} className={schema.className} {...props}>
30
+ {schema.buttonLabel || 'Show Toast'}
31
+ </Button>
32
+ );
33
+ },
34
+ {
35
+ label: 'Sonner Toast',
36
+ inputs: [
37
+ { name: 'message', type: 'string', label: 'Message' },
38
+ { name: 'description', type: 'string', label: 'Description' },
39
+ {
40
+ name: 'variant',
41
+ type: 'enum',
42
+ enum: ['default', 'success', 'error', 'warning', 'info'],
43
+ defaultValue: 'default',
44
+ label: 'Variant'
45
+ },
46
+ { name: 'buttonLabel', type: 'string', label: 'Button Label' },
47
+ { name: 'className', type: 'string', label: 'CSS Class' }
48
+ ],
49
+ defaultProps: {
50
+ message: 'Notification',
51
+ buttonLabel: 'Show Toast',
52
+ variant: 'default'
53
+ }
54
+ }
55
+ );
@@ -0,0 +1,54 @@
1
+ /**
2
+ * ObjectUI
3
+ * Copyright (c) 2024-present ObjectStack Inc.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
9
+ import { ComponentRegistry } from '@object-ui/core';
10
+ import type { SpinnerSchema } from '@object-ui/types';
11
+ import { Loader2 } from 'lucide-react';
12
+ import { cn } from '../../lib/utils';
13
+
14
+ ComponentRegistry.register('spinner',
15
+ ({ schema, ...props }: { schema: SpinnerSchema; [key: string]: any }) => {
16
+ const {
17
+ 'data-obj-id': dataObjId,
18
+ 'data-obj-type': dataObjType,
19
+ style,
20
+ ...spinnerProps
21
+ } = props;
22
+
23
+ const sizeClasses = {
24
+ sm: 'h-4 w-4',
25
+ md: 'h-6 w-6',
26
+ lg: 'h-8 w-8',
27
+ xl: 'h-12 w-12'
28
+ };
29
+
30
+ return (
31
+ <Loader2
32
+ className={cn('animate-spin', sizeClasses[schema.size || 'md'], schema.className)}
33
+ {...spinnerProps}
34
+ {...{ 'data-obj-id': dataObjId, 'data-obj-type': dataObjType, style }}
35
+ />
36
+ );
37
+ },
38
+ {
39
+ label: 'Spinner',
40
+ inputs: [
41
+ {
42
+ name: 'size',
43
+ type: 'enum',
44
+ enum: ['sm', 'md', 'lg', 'xl'],
45
+ defaultValue: 'md',
46
+ label: 'Size'
47
+ },
48
+ { name: 'className', type: 'string', label: 'CSS Class' }
49
+ ],
50
+ defaultProps: {
51
+ size: 'md'
52
+ }
53
+ }
54
+ );