@object-ui/components 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 (295) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/LICENSE +21 -0
  3. package/README.md +170 -0
  4. package/dist/index.css +1 -0
  5. package/dist/index.d.ts +2 -0
  6. package/dist/index.js +46186 -0
  7. package/dist/index.umd.cjs +92 -0
  8. package/dist/src/hooks/use-mobile.d.ts +1 -0
  9. package/dist/src/index.d.ts +2 -0
  10. package/dist/src/index.test.d.ts +1 -0
  11. package/dist/src/lib/utils.d.ts +4 -0
  12. package/dist/src/new-components.test.d.ts +1 -0
  13. package/dist/src/renderers/basic/div.d.ts +1 -0
  14. package/dist/src/renderers/basic/html.d.ts +1 -0
  15. package/dist/src/renderers/basic/icon.d.ts +1 -0
  16. package/dist/src/renderers/basic/image.d.ts +1 -0
  17. package/dist/src/renderers/basic/index.d.ts +0 -0
  18. package/dist/src/renderers/basic/separator.d.ts +1 -0
  19. package/dist/src/renderers/basic/span.d.ts +1 -0
  20. package/dist/src/renderers/basic/text.d.ts +1 -0
  21. package/dist/src/renderers/complex/__tests__/data-table.test.d.ts +0 -0
  22. package/dist/src/renderers/complex/calendar-view.d.ts +1 -0
  23. package/dist/src/renderers/complex/carousel.d.ts +1 -0
  24. package/dist/src/renderers/complex/chatbot.d.ts +1 -0
  25. package/dist/src/renderers/complex/chatbot.test.d.ts +1 -0
  26. package/dist/src/renderers/complex/data-table.d.ts +1 -0
  27. package/dist/src/renderers/complex/filter-builder.d.ts +1 -0
  28. package/dist/src/renderers/complex/index.d.ts +0 -0
  29. package/dist/src/renderers/complex/resizable.d.ts +1 -0
  30. package/dist/src/renderers/complex/scroll-area.d.ts +1 -0
  31. package/dist/src/renderers/complex/table.d.ts +1 -0
  32. package/dist/src/renderers/complex/timeline.d.ts +1 -0
  33. package/dist/src/renderers/data-display/alert.d.ts +1 -0
  34. package/dist/src/renderers/data-display/avatar.d.ts +1 -0
  35. package/dist/src/renderers/data-display/badge.d.ts +1 -0
  36. package/dist/src/renderers/data-display/index.d.ts +0 -0
  37. package/dist/src/renderers/data-display/list.d.ts +1 -0
  38. package/dist/src/renderers/data-display/statistic.d.ts +1 -0
  39. package/dist/src/renderers/data-display/tree-view.d.ts +1 -0
  40. package/dist/src/renderers/disclosure/accordion.d.ts +1 -0
  41. package/dist/src/renderers/disclosure/collapsible.d.ts +1 -0
  42. package/dist/src/renderers/disclosure/index.d.ts +0 -0
  43. package/dist/src/renderers/feedback/index.d.ts +0 -0
  44. package/dist/src/renderers/feedback/loading.d.ts +1 -0
  45. package/dist/src/renderers/feedback/progress.d.ts +1 -0
  46. package/dist/src/renderers/feedback/skeleton.d.ts +1 -0
  47. package/dist/src/renderers/feedback/toaster.d.ts +1 -0
  48. package/dist/src/renderers/form/button.d.ts +1 -0
  49. package/dist/src/renderers/form/calendar.d.ts +1 -0
  50. package/dist/src/renderers/form/checkbox.d.ts +1 -0
  51. package/dist/src/renderers/form/date-picker.d.ts +1 -0
  52. package/dist/src/renderers/form/file-upload.d.ts +1 -0
  53. package/dist/src/renderers/form/form.d.ts +1 -0
  54. package/dist/src/renderers/form/index.d.ts +0 -0
  55. package/dist/src/renderers/form/input-otp.d.ts +1 -0
  56. package/dist/src/renderers/form/input.d.ts +1 -0
  57. package/dist/src/renderers/form/label.d.ts +1 -0
  58. package/dist/src/renderers/form/radio-group.d.ts +1 -0
  59. package/dist/src/renderers/form/select.d.ts +1 -0
  60. package/dist/src/renderers/form/slider.d.ts +1 -0
  61. package/dist/src/renderers/form/switch.d.ts +1 -0
  62. package/dist/src/renderers/form/textarea.d.ts +1 -0
  63. package/dist/src/renderers/form/toggle.d.ts +1 -0
  64. package/dist/src/renderers/index.d.ts +0 -0
  65. package/dist/src/renderers/layout/card.d.ts +1 -0
  66. package/dist/src/renderers/layout/container.d.ts +1 -0
  67. package/dist/src/renderers/layout/flex.d.ts +1 -0
  68. package/dist/src/renderers/layout/grid.d.ts +1 -0
  69. package/dist/src/renderers/layout/index.d.ts +0 -0
  70. package/dist/src/renderers/layout/page.d.ts +7 -0
  71. package/dist/src/renderers/layout/semantic.d.ts +1 -0
  72. package/dist/src/renderers/layout/stack.d.ts +1 -0
  73. package/dist/src/renderers/layout/tabs.d.ts +1 -0
  74. package/dist/src/renderers/navigation/header-bar.d.ts +1 -0
  75. package/dist/src/renderers/navigation/index.d.ts +0 -0
  76. package/dist/src/renderers/navigation/sidebar.d.ts +1 -0
  77. package/dist/src/renderers/overlay/alert-dialog.d.ts +1 -0
  78. package/dist/src/renderers/overlay/context-menu.d.ts +1 -0
  79. package/dist/src/renderers/overlay/dialog.d.ts +1 -0
  80. package/dist/src/renderers/overlay/drawer.d.ts +1 -0
  81. package/dist/src/renderers/overlay/dropdown-menu.d.ts +1 -0
  82. package/dist/src/renderers/overlay/hover-card.d.ts +1 -0
  83. package/dist/src/renderers/overlay/index.d.ts +0 -0
  84. package/dist/src/renderers/overlay/popover.d.ts +1 -0
  85. package/dist/src/renderers/overlay/sheet.d.ts +1 -0
  86. package/dist/src/renderers/overlay/tooltip.d.ts +1 -0
  87. package/dist/src/ui/accordion.d.ts +7 -0
  88. package/dist/src/ui/alert-dialog.d.ts +14 -0
  89. package/dist/src/ui/alert.d.ts +9 -0
  90. package/dist/src/ui/aspect-ratio.d.ts +3 -0
  91. package/dist/src/ui/avatar.d.ts +6 -0
  92. package/dist/src/ui/badge.d.ts +9 -0
  93. package/dist/src/ui/breadcrumb.d.ts +11 -0
  94. package/dist/src/ui/button-group.d.ts +11 -0
  95. package/dist/src/ui/button.d.ts +13 -0
  96. package/dist/src/ui/calendar-view.d.ts +21 -0
  97. package/dist/src/ui/calendar.d.ts +8 -0
  98. package/dist/src/ui/card.d.ts +9 -0
  99. package/dist/src/ui/carousel.d.ts +19 -0
  100. package/dist/src/ui/chatbot.d.ts +36 -0
  101. package/dist/src/ui/checkbox.d.ts +4 -0
  102. package/dist/src/ui/collapsible.d.ts +5 -0
  103. package/dist/src/ui/command.d.ts +18 -0
  104. package/dist/src/ui/context-menu.d.ts +25 -0
  105. package/dist/src/ui/dialog.d.ts +15 -0
  106. package/dist/src/ui/drawer.d.ts +13 -0
  107. package/dist/src/ui/dropdown-menu.d.ts +25 -0
  108. package/dist/src/ui/empty.d.ts +11 -0
  109. package/dist/src/ui/field.d.ts +24 -0
  110. package/dist/src/ui/filter-builder.d.ts +31 -0
  111. package/dist/src/ui/form.d.ts +24 -0
  112. package/dist/src/ui/hover-card.d.ts +6 -0
  113. package/dist/src/ui/index.d.ts +56 -0
  114. package/dist/src/ui/input-group.d.ts +16 -0
  115. package/dist/src/ui/input-otp.d.ts +11 -0
  116. package/dist/src/ui/input.d.ts +3 -0
  117. package/dist/src/ui/item.d.ts +23 -0
  118. package/dist/src/ui/kbd.d.ts +3 -0
  119. package/dist/src/ui/label.d.ts +4 -0
  120. package/dist/src/ui/menubar.d.ts +26 -0
  121. package/dist/src/ui/navigation-menu.d.ts +14 -0
  122. package/dist/src/ui/pagination.d.ts +13 -0
  123. package/dist/src/ui/popover.d.ts +7 -0
  124. package/dist/src/ui/progress.d.ts +4 -0
  125. package/dist/src/ui/radio-group.d.ts +5 -0
  126. package/dist/src/ui/resizable.d.ts +10 -0
  127. package/dist/src/ui/scroll-area.d.ts +5 -0
  128. package/dist/src/ui/select.d.ts +15 -0
  129. package/dist/src/ui/separator.d.ts +4 -0
  130. package/dist/src/ui/sheet.d.ts +13 -0
  131. package/dist/src/ui/sidebar.d.ts +69 -0
  132. package/dist/src/ui/skeleton.d.ts +2 -0
  133. package/dist/src/ui/slider.d.ts +4 -0
  134. package/dist/src/ui/sonner.d.ts +3 -0
  135. package/dist/src/ui/spinner.d.ts +3 -0
  136. package/dist/src/ui/switch.d.ts +4 -0
  137. package/dist/src/ui/table.d.ts +10 -0
  138. package/dist/src/ui/tabs.d.ts +7 -0
  139. package/dist/src/ui/textarea.d.ts +3 -0
  140. package/dist/src/ui/timeline.d.ts +25 -0
  141. package/dist/src/ui/toggle-group.d.ts +9 -0
  142. package/dist/src/ui/toggle.d.ts +9 -0
  143. package/dist/src/ui/tooltip.d.ts +7 -0
  144. package/docs/FilterBuilder.md +268 -0
  145. package/metadata/Chart.component.yml +30 -0
  146. package/metadata/FilterBuilder.component.yml +39 -0
  147. package/metadata/GridLayout.component.yml +27 -0
  148. package/metadata/Menu.component.yml +31 -0
  149. package/metadata/ObjectForm.component.yml +34 -0
  150. package/metadata/ObjectTable.component.yml +41 -0
  151. package/metadata/Page.component.yml +24 -0
  152. package/package.json +87 -0
  153. package/postcss.config.js +6 -0
  154. package/src/hooks/use-mobile.tsx +19 -0
  155. package/src/index.css +76 -0
  156. package/src/index.test.ts +7 -0
  157. package/src/index.ts +10 -0
  158. package/src/lib/utils.tsx +27 -0
  159. package/src/new-components.test.ts +74 -0
  160. package/src/renderers/basic/div.tsx +41 -0
  161. package/src/renderers/basic/html.tsx +34 -0
  162. package/src/renderers/basic/icon.tsx +25 -0
  163. package/src/renderers/basic/image.tsx +37 -0
  164. package/src/renderers/basic/index.ts +7 -0
  165. package/src/renderers/basic/separator.tsx +48 -0
  166. package/src/renderers/basic/span.tsx +44 -0
  167. package/src/renderers/basic/text.tsx +42 -0
  168. package/src/renderers/complex/README-KANBAN.md +208 -0
  169. package/src/renderers/complex/TIMELINE.md +353 -0
  170. package/src/renderers/complex/__tests__/data-table.test.ts +52 -0
  171. package/src/renderers/complex/calendar-view.tsx +219 -0
  172. package/src/renderers/complex/carousel.tsx +60 -0
  173. package/src/renderers/complex/chatbot.test.ts +44 -0
  174. package/src/renderers/complex/chatbot.tsx +185 -0
  175. package/src/renderers/complex/data-table.tsx +650 -0
  176. package/src/renderers/complex/filter-builder.tsx +68 -0
  177. package/src/renderers/complex/index.ts +10 -0
  178. package/src/renderers/complex/resizable.tsx +54 -0
  179. package/src/renderers/complex/scroll-area.tsx +32 -0
  180. package/src/renderers/complex/table.tsx +86 -0
  181. package/src/renderers/complex/timeline.tsx +466 -0
  182. package/src/renderers/data-display/alert.tsx +37 -0
  183. package/src/renderers/data-display/avatar.tsx +29 -0
  184. package/src/renderers/data-display/badge.tsx +46 -0
  185. package/src/renderers/data-display/index.ts +6 -0
  186. package/src/renderers/data-display/list.tsx +95 -0
  187. package/src/renderers/data-display/statistic.tsx +98 -0
  188. package/src/renderers/data-display/tree-view.tsx +180 -0
  189. package/src/renderers/disclosure/accordion.tsx +60 -0
  190. package/src/renderers/disclosure/collapsible.tsx +44 -0
  191. package/src/renderers/disclosure/index.ts +2 -0
  192. package/src/renderers/feedback/index.ts +4 -0
  193. package/src/renderers/feedback/loading.tsx +69 -0
  194. package/src/renderers/feedback/progress.tsx +20 -0
  195. package/src/renderers/feedback/skeleton.tsx +22 -0
  196. package/src/renderers/feedback/toaster.tsx +26 -0
  197. package/src/renderers/form/button.tsx +61 -0
  198. package/src/renderers/form/calendar.tsx +25 -0
  199. package/src/renderers/form/checkbox.tsx +41 -0
  200. package/src/renderers/form/date-picker.tsx +75 -0
  201. package/src/renderers/form/file-upload.tsx +175 -0
  202. package/src/renderers/form/form.tsx +417 -0
  203. package/src/renderers/form/index.ts +16 -0
  204. package/src/renderers/form/input-otp.tsx +31 -0
  205. package/src/renderers/form/input.tsx +79 -0
  206. package/src/renderers/form/label.tsx +36 -0
  207. package/src/renderers/form/radio-group.tsx +54 -0
  208. package/src/renderers/form/select.tsx +66 -0
  209. package/src/renderers/form/slider.tsx +45 -0
  210. package/src/renderers/form/switch.tsx +39 -0
  211. package/src/renderers/form/textarea.tsx +45 -0
  212. package/src/renderers/form/toggle.tsx +76 -0
  213. package/src/renderers/index.ts +9 -0
  214. package/src/renderers/layout/card.tsx +69 -0
  215. package/src/renderers/layout/container.tsx +113 -0
  216. package/src/renderers/layout/flex.tsx +123 -0
  217. package/src/renderers/layout/grid.tsx +155 -0
  218. package/src/renderers/layout/index.ts +10 -0
  219. package/src/renderers/layout/page.tsx +82 -0
  220. package/src/renderers/layout/semantic.tsx +39 -0
  221. package/src/renderers/layout/stack.tsx +123 -0
  222. package/src/renderers/layout/tabs.tsx +63 -0
  223. package/src/renderers/navigation/header-bar.tsx +50 -0
  224. package/src/renderers/navigation/index.ts +2 -0
  225. package/src/renderers/navigation/sidebar.tsx +189 -0
  226. package/src/renderers/overlay/alert-dialog.tsx +63 -0
  227. package/src/renderers/overlay/context-menu.tsx +91 -0
  228. package/src/renderers/overlay/dialog.tsx +68 -0
  229. package/src/renderers/overlay/drawer.tsx +68 -0
  230. package/src/renderers/overlay/dropdown-menu.tsx +90 -0
  231. package/src/renderers/overlay/hover-card.tsx +46 -0
  232. package/src/renderers/overlay/index.ts +9 -0
  233. package/src/renderers/overlay/popover.tsx +47 -0
  234. package/src/renderers/overlay/sheet.tsx +68 -0
  235. package/src/renderers/overlay/tooltip.tsx +58 -0
  236. package/src/ui/accordion.tsx +64 -0
  237. package/src/ui/alert-dialog.tsx +155 -0
  238. package/src/ui/alert.tsx +78 -0
  239. package/src/ui/aspect-ratio.tsx +11 -0
  240. package/src/ui/avatar.tsx +51 -0
  241. package/src/ui/badge.tsx +46 -0
  242. package/src/ui/breadcrumb.tsx +109 -0
  243. package/src/ui/button-group.tsx +83 -0
  244. package/src/ui/button.tsx +65 -0
  245. package/src/ui/calendar-view.tsx +503 -0
  246. package/src/ui/calendar.tsx +237 -0
  247. package/src/ui/card.tsx +138 -0
  248. package/src/ui/carousel.tsx +239 -0
  249. package/src/ui/chatbot.tsx +240 -0
  250. package/src/ui/checkbox.tsx +32 -0
  251. package/src/ui/collapsible.tsx +31 -0
  252. package/src/ui/command.tsx +182 -0
  253. package/src/ui/context-menu.tsx +247 -0
  254. package/src/ui/dialog.tsx +141 -0
  255. package/src/ui/drawer.tsx +135 -0
  256. package/src/ui/dropdown-menu.tsx +254 -0
  257. package/src/ui/empty.tsx +104 -0
  258. package/src/ui/field.tsx +246 -0
  259. package/src/ui/filter-builder.tsx +359 -0
  260. package/src/ui/form.tsx +167 -0
  261. package/src/ui/hover-card.tsx +44 -0
  262. package/src/ui/index.ts +56 -0
  263. package/src/ui/input-group.tsx +170 -0
  264. package/src/ui/input-otp.tsx +81 -0
  265. package/src/ui/input.tsx +24 -0
  266. package/src/ui/item.tsx +193 -0
  267. package/src/ui/kbd.tsx +28 -0
  268. package/src/ui/label.tsx +24 -0
  269. package/src/ui/menubar.tsx +274 -0
  270. package/src/ui/navigation-menu.tsx +168 -0
  271. package/src/ui/pagination.tsx +127 -0
  272. package/src/ui/popover.tsx +48 -0
  273. package/src/ui/progress.tsx +41 -0
  274. package/src/ui/radio-group.tsx +45 -0
  275. package/src/ui/resizable.tsx +55 -0
  276. package/src/ui/scroll-area.tsx +58 -0
  277. package/src/ui/select.tsx +188 -0
  278. package/src/ui/separator.tsx +31 -0
  279. package/src/ui/sheet.tsx +137 -0
  280. package/src/ui/sidebar.tsx +726 -0
  281. package/src/ui/skeleton.tsx +20 -0
  282. package/src/ui/slider.tsx +63 -0
  283. package/src/ui/sonner.tsx +43 -0
  284. package/src/ui/spinner.tsx +38 -0
  285. package/src/ui/switch.tsx +31 -0
  286. package/src/ui/table.tsx +120 -0
  287. package/src/ui/tabs.tsx +86 -0
  288. package/src/ui/textarea.tsx +18 -0
  289. package/src/ui/timeline.tsx +266 -0
  290. package/src/ui/toggle-group.tsx +87 -0
  291. package/src/ui/toggle.tsx +50 -0
  292. package/src/ui/tooltip.tsx +61 -0
  293. package/tailwind.config.js +75 -0
  294. package/tsconfig.json +18 -0
  295. package/vite.config.ts +44 -0
@@ -0,0 +1,353 @@
1
+ # Timeline Component
2
+
3
+ A comprehensive, feature-rich timeline component for Object UI that supports three distinct variants: vertical, horizontal, and Gantt-style (Airtable-like) timelines.
4
+
5
+ ## Features
6
+
7
+ - 🎯 **Three Variants**: Vertical, Horizontal, and Gantt/Airtable-style timelines
8
+ - 🎨 **Color Variants**: Support for default, success, warning, danger, and info colors
9
+ - 📅 **Date Formatting**: Configurable date formats (short, long, ISO)
10
+ - ⏱️ **Time Scales**: Gantt view supports day, week, and month scales
11
+ - 🔄 **Interactive**: Click handlers for timeline items
12
+ - 🎭 **Icon Support**: Add custom icons or emojis to timeline markers
13
+ - 📊 **Multi-track**: Gantt view supports multiple rows/tracks
14
+ - 🔢 **Auto-calculated**: Automatic date range calculation for Gantt view
15
+ - 💅 **Tailwind CSS**: Fully styled with Tailwind, customizable with className
16
+
17
+ ## Installation
18
+
19
+ The timeline component is included in `@object-ui/components`.
20
+
21
+ ```bash
22
+ npm install @object-ui/components @object-ui/react @object-ui/core
23
+ ```
24
+
25
+ ## Usage
26
+
27
+ ### Vertical Timeline
28
+
29
+ Perfect for showing project milestones, history, or chronological events.
30
+
31
+ ```json
32
+ {
33
+ "type": "timeline",
34
+ "variant": "vertical",
35
+ "dateFormat": "long",
36
+ "items": [
37
+ {
38
+ "time": "2024-01-15",
39
+ "title": "Project Kickoff",
40
+ "description": "Initial meeting with stakeholders and project planning",
41
+ "variant": "success",
42
+ "icon": "🚀"
43
+ },
44
+ {
45
+ "time": "2024-02-01",
46
+ "title": "Design Phase Complete",
47
+ "description": "UI/UX designs approved and ready for development",
48
+ "variant": "info",
49
+ "icon": "🎨"
50
+ },
51
+ {
52
+ "time": "2024-03-15",
53
+ "title": "Beta Release",
54
+ "description": "Internal testing phase begins",
55
+ "variant": "warning",
56
+ "icon": "⚡"
57
+ },
58
+ {
59
+ "time": "2024-04-01",
60
+ "title": "Official Launch",
61
+ "description": "Product goes live to all users",
62
+ "variant": "success",
63
+ "icon": "🎉"
64
+ }
65
+ ]
66
+ }
67
+ ```
68
+
69
+ ### Horizontal Timeline
70
+
71
+ Ideal for roadmaps, quarterly plans, or linear progressions.
72
+
73
+ ```json
74
+ {
75
+ "type": "timeline",
76
+ "variant": "horizontal",
77
+ "dateFormat": "short",
78
+ "items": [
79
+ {
80
+ "time": "2024-01-01",
81
+ "title": "Q1 2024",
82
+ "description": "Planning & Design",
83
+ "variant": "success"
84
+ },
85
+ {
86
+ "time": "2024-04-01",
87
+ "title": "Q2 2024",
88
+ "description": "Development",
89
+ "variant": "info"
90
+ },
91
+ {
92
+ "time": "2024-07-01",
93
+ "title": "Q3 2024",
94
+ "description": "Testing & QA",
95
+ "variant": "warning"
96
+ },
97
+ {
98
+ "time": "2024-10-01",
99
+ "title": "Q4 2024",
100
+ "description": "Launch & Scale",
101
+ "variant": "success"
102
+ }
103
+ ]
104
+ }
105
+ ```
106
+
107
+ ### Gantt Timeline (Airtable Style)
108
+
109
+ Perfect for project management, resource planning, and multi-track timelines.
110
+
111
+ ```json
112
+ {
113
+ "type": "timeline",
114
+ "variant": "gantt",
115
+ "dateFormat": "short",
116
+ "timeScale": "month",
117
+ "rowLabel": "Project Tasks",
118
+ "items": [
119
+ {
120
+ "label": "Backend Development",
121
+ "items": [
122
+ {
123
+ "title": "API Design",
124
+ "startDate": "2024-01-01",
125
+ "endDate": "2024-01-31",
126
+ "variant": "success"
127
+ },
128
+ {
129
+ "title": "Database Schema",
130
+ "startDate": "2024-01-15",
131
+ "endDate": "2024-02-15",
132
+ "variant": "info"
133
+ },
134
+ {
135
+ "title": "API Implementation",
136
+ "startDate": "2024-02-01",
137
+ "endDate": "2024-03-31",
138
+ "variant": "default"
139
+ }
140
+ ]
141
+ },
142
+ {
143
+ "label": "Frontend Development",
144
+ "items": [
145
+ {
146
+ "title": "UI Design",
147
+ "startDate": "2024-01-15",
148
+ "endDate": "2024-02-15",
149
+ "variant": "warning"
150
+ },
151
+ {
152
+ "title": "Component Library",
153
+ "startDate": "2024-02-01",
154
+ "endDate": "2024-03-15",
155
+ "variant": "info"
156
+ },
157
+ {
158
+ "title": "Integration",
159
+ "startDate": "2024-03-01",
160
+ "endDate": "2024-04-15",
161
+ "variant": "default"
162
+ }
163
+ ]
164
+ },
165
+ {
166
+ "label": "Testing & QA",
167
+ "items": [
168
+ {
169
+ "title": "Unit Tests",
170
+ "startDate": "2024-02-15",
171
+ "endDate": "2024-03-15",
172
+ "variant": "success"
173
+ },
174
+ {
175
+ "title": "Integration Tests",
176
+ "startDate": "2024-03-01",
177
+ "endDate": "2024-04-01",
178
+ "variant": "info"
179
+ },
180
+ {
181
+ "title": "User Acceptance Testing",
182
+ "startDate": "2024-04-01",
183
+ "endDate": "2024-04-30",
184
+ "variant": "danger"
185
+ }
186
+ ]
187
+ }
188
+ ]
189
+ }
190
+ ```
191
+
192
+ ## Props
193
+
194
+ ### Common Props
195
+
196
+ | Prop | Type | Default | Description |
197
+ |------|------|---------|-------------|
198
+ | `variant` | `'vertical' \| 'horizontal' \| 'gantt'` | `'vertical'` | Timeline variant to render |
199
+ | `dateFormat` | `'short' \| 'long' \| 'iso'` | `'short'` | Date formatting style |
200
+ | `items` | `TimelineItem[]` | `[]` | Array of timeline items (structure varies by variant) |
201
+ | `className` | `string` | - | Additional CSS classes |
202
+
203
+ ### Vertical/Horizontal Item Props
204
+
205
+ | Prop | Type | Description |
206
+ |------|------|-------------|
207
+ | `time` | `string` | ISO date string (e.g., "2024-01-15") |
208
+ | `title` | `string` | Item title |
209
+ | `description` | `string` | Item description |
210
+ | `variant` | `'default' \| 'success' \| 'warning' \| 'danger' \| 'info'` | Color variant |
211
+ | `icon` | `string` | Icon or emoji to display in marker |
212
+ | `content` | `SchemaNode` | Custom content schema |
213
+ | `className` | `string` | Additional CSS classes |
214
+
215
+ ### Gantt-Specific Props
216
+
217
+ | Prop | Type | Default | Description |
218
+ |------|------|---------|-------------|
219
+ | `timeScale` | `'day' \| 'week' \| 'month'` | `'month'` | Time scale for the timeline header |
220
+ | `rowLabel` | `string` | `'Items'` | Label for the row header column |
221
+ | `minDate` | `string` | Auto-calculated | Override minimum date (YYYY-MM-DD) |
222
+ | `maxDate` | `string` | Auto-calculated | Override maximum date (YYYY-MM-DD) |
223
+
224
+ ### Gantt Item Structure
225
+
226
+ ```typescript
227
+ {
228
+ label: string; // Row label
229
+ items: Array<{
230
+ title: string; // Bar label
231
+ startDate: string; // ISO date string
232
+ endDate: string; // ISO date string
233
+ variant?: string; // Color variant
234
+ }>;
235
+ }
236
+ ```
237
+
238
+ ## Color Variants
239
+
240
+ The timeline component supports 5 color variants:
241
+
242
+ - `default` - Blue (default color)
243
+ - `success` - Green
244
+ - `warning` - Yellow/Orange
245
+ - `danger` - Red
246
+ - `info` - Purple
247
+
248
+ Each variant applies to markers (vertical/horizontal) or bars (Gantt).
249
+
250
+ ## Date Formats
251
+
252
+ - `short` - MM/DD/YYYY (e.g., "1/15/2024")
253
+ - `long` - Month DD, YYYY (e.g., "January 15, 2024")
254
+ - `iso` - YYYY-MM-DD (e.g., "2024-01-15")
255
+
256
+ ## Time Scales (Gantt Only)
257
+
258
+ - `day` - Daily granularity
259
+ - `week` - Weekly granularity
260
+ - `month` - Monthly granularity (default)
261
+
262
+ ## Advanced Usage
263
+
264
+ ### Custom Styling
265
+
266
+ Use Tailwind CSS classes for custom styling:
267
+
268
+ ```json
269
+ {
270
+ "type": "timeline",
271
+ "variant": "vertical",
272
+ "className": "max-w-3xl mx-auto",
273
+ "items": [
274
+ {
275
+ "time": "2024-01-15",
276
+ "title": "Custom Styled Item",
277
+ "className": "bg-blue-50 p-4 rounded-lg",
278
+ "variant": "info"
279
+ }
280
+ ]
281
+ }
282
+ ```
283
+
284
+ ### With Custom Content
285
+
286
+ You can add custom content schemas to vertical/horizontal timeline items:
287
+
288
+ ```json
289
+ {
290
+ "type": "timeline",
291
+ "variant": "vertical",
292
+ "items": [
293
+ {
294
+ "time": "2024-01-15",
295
+ "title": "Custom Content",
296
+ "content": [
297
+ {
298
+ "type": "button",
299
+ "label": "View Details",
300
+ "className": "mt-2"
301
+ }
302
+ ]
303
+ }
304
+ ]
305
+ }
306
+ ```
307
+
308
+ ### Interactive Items
309
+
310
+ Handle item clicks in Gantt view:
311
+
312
+ ```typescript
313
+ // In React component
314
+ <SchemaRenderer
315
+ schema={{
316
+ type: 'timeline',
317
+ variant: 'gantt',
318
+ onItemClick: (item, row, rowIndex, itemIndex) => {
319
+ console.log('Clicked:', item.title, 'in row:', row.label);
320
+ },
321
+ items: [...]
322
+ }}
323
+ />
324
+ ```
325
+
326
+ ## UI Components
327
+
328
+ The timeline component is built using these base UI components:
329
+
330
+ ### Vertical/Horizontal
331
+ - `Timeline` - Container
332
+ - `TimelineItem` - Individual item
333
+ - `TimelineMarker` - Marker/dot
334
+ - `TimelineContent` - Content wrapper
335
+ - `TimelineTitle` - Title heading
336
+ - `TimelineTime` - Time display
337
+ - `TimelineDescription` - Description text
338
+
339
+ ### Gantt
340
+ - `TimelineGantt` - Container
341
+ - `TimelineGanttHeader` - Header with time scale
342
+ - `TimelineGanttRow` - Individual row
343
+ - `TimelineGanttLabel` - Row label
344
+ - `TimelineGanttBar` - Task bar
345
+ - `TimelineGanttBarContent` - Bar content/text
346
+
347
+ ## Examples
348
+
349
+ See the [prototype app](../../examples/prototype/src/App.tsx) for comprehensive examples of all three timeline variants in action.
350
+
351
+ ## License
352
+
353
+ MIT
@@ -0,0 +1,52 @@
1
+ import { describe, it, expect, beforeAll } from 'vitest';
2
+ import { ComponentRegistry } from '@object-ui/core';
3
+
4
+ // Import the component to ensure it's registered
5
+ import '../data-table';
6
+
7
+ describe('Data Table Component', () => {
8
+ it('should register data-table component', () => {
9
+ expect(ComponentRegistry.has('data-table')).toBe(true);
10
+ });
11
+
12
+ it('should have correct component metadata', () => {
13
+ const config = ComponentRegistry.getConfig('data-table');
14
+ expect(config).toBeDefined();
15
+ expect(config?.label).toBe('Data Table');
16
+ expect(config?.inputs).toBeDefined();
17
+ expect(config?.defaultProps).toBeDefined();
18
+ });
19
+
20
+ it('should have required inputs defined', () => {
21
+ const config = ComponentRegistry.getConfig('data-table');
22
+ const inputNames = config?.inputs?.map(input => input.name) || [];
23
+
24
+ expect(inputNames).toContain('columns');
25
+ expect(inputNames).toContain('data');
26
+ expect(inputNames).toContain('pagination');
27
+ expect(inputNames).toContain('searchable');
28
+ expect(inputNames).toContain('selectable');
29
+ expect(inputNames).toContain('sortable');
30
+ expect(inputNames).toContain('exportable');
31
+ expect(inputNames).toContain('rowActions');
32
+ });
33
+
34
+ it('should have default props with sample data', () => {
35
+ const config = ComponentRegistry.getConfig('data-table');
36
+ expect(config?.defaultProps).toBeDefined();
37
+ expect(config?.defaultProps?.columns).toBeDefined();
38
+ expect(Array.isArray(config?.defaultProps?.columns)).toBe(true);
39
+ expect(config?.defaultProps?.data).toBeDefined();
40
+ expect(Array.isArray(config?.defaultProps?.data)).toBe(true);
41
+ });
42
+
43
+ it('should have correct default feature flags', () => {
44
+ const config = ComponentRegistry.getConfig('data-table');
45
+ expect(config?.defaultProps?.pagination).toBe(true);
46
+ expect(config?.defaultProps?.searchable).toBe(true);
47
+ expect(config?.defaultProps?.selectable).toBe(true);
48
+ expect(config?.defaultProps?.sortable).toBe(true);
49
+ expect(config?.defaultProps?.exportable).toBe(true);
50
+ expect(config?.defaultProps?.rowActions).toBe(true);
51
+ });
52
+ });
@@ -0,0 +1,219 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { CalendarViewSchema, CalendarEvent } from '@object-ui/types';
3
+ import { CalendarView } from '../../ui';
4
+ import React from 'react';
5
+
6
+ // Calendar View Renderer - Airtable-style calendar for displaying records as events
7
+ ComponentRegistry.register('calendar-view',
8
+ ({ schema, className, onAction, ...props }: { schema: CalendarViewSchema; className?: string; onAction?: (action: any) => void; [key: string]: any }) => {
9
+ // Transform schema data to CalendarEvent format
10
+ const events = React.useMemo(() => {
11
+ if (!schema.data || !Array.isArray(schema.data)) return [];
12
+
13
+ return schema.data.map((record: any, index: number) => {
14
+ /** Field name to use for event title display */
15
+ const titleField = schema.titleField || 'title';
16
+ /** Field name containing the event start date/time */
17
+ const startField = schema.startDateField || 'start';
18
+ /** Field name containing the event end date/time (optional) */
19
+ const endField = schema.endDateField || 'end';
20
+ /** Field name to determine event color or color category */
21
+ const colorField = schema.colorField || 'color';
22
+ /** Field name indicating if event is all-day */
23
+ const allDayField = schema.allDayField || 'allDay';
24
+
25
+ const title = record[titleField] || 'Untitled';
26
+ const start = record[startField] ? new Date(record[startField]) : new Date();
27
+ const end = record[endField] ? new Date(record[endField]) : undefined;
28
+ const allDay = record[allDayField] !== undefined ? record[allDayField] : false;
29
+
30
+ // Handle color mapping
31
+ let color = record[colorField];
32
+ if (color && schema.colorMapping && schema.colorMapping[color]) {
33
+ color = schema.colorMapping[color];
34
+ }
35
+
36
+ return {
37
+ id: String(record.id || record._id || index),
38
+ title,
39
+ start,
40
+ end,
41
+ allDay,
42
+ color,
43
+ data: record,
44
+ };
45
+ });
46
+ }, [schema.data, schema.titleField, schema.startDateField, schema.endDateField, schema.colorField, schema.allDayField, schema.colorMapping]);
47
+
48
+ const handleEventClick = React.useCallback((event: any) => {
49
+ if (onAction) {
50
+ onAction({
51
+ type: 'event_click',
52
+ payload: { event: event.data, eventId: event.id }
53
+ });
54
+ }
55
+ if (schema.onEventClick) {
56
+ schema.onEventClick(event.data);
57
+ }
58
+ }, [onAction, schema]);
59
+
60
+ const handleDateClick = React.useCallback((date: Date) => {
61
+ if (onAction) {
62
+ onAction({
63
+ type: 'date_click',
64
+ payload: { date }
65
+ });
66
+ }
67
+ if (schema.onDateClick) {
68
+ schema.onDateClick(date);
69
+ }
70
+ }, [onAction, schema]);
71
+
72
+ const handleViewChange = React.useCallback((view: "month" | "week" | "day") => {
73
+ if (onAction) {
74
+ onAction({
75
+ type: 'view_change',
76
+ payload: { view }
77
+ });
78
+ }
79
+ if (schema.onViewChange) {
80
+ schema.onViewChange(view);
81
+ }
82
+ }, [onAction, schema]);
83
+
84
+ const handleNavigate = React.useCallback((date: Date) => {
85
+ if (onAction) {
86
+ onAction({
87
+ type: 'navigate',
88
+ payload: { date }
89
+ });
90
+ }
91
+ if (schema.onNavigate) {
92
+ schema.onNavigate(date);
93
+ }
94
+ }, [onAction, schema]);
95
+
96
+ return (
97
+ <CalendarView
98
+ events={events as any[]}
99
+ view={(schema.view as any) || 'month'}
100
+ currentDate={schema.currentDate ? new Date(schema.currentDate) : undefined}
101
+ onEventClick={handleEventClick}
102
+ onDateClick={schema.allowCreate || schema.onDateClick ? handleDateClick : undefined}
103
+ onViewChange={handleViewChange}
104
+ onNavigate={handleNavigate}
105
+ className={className}
106
+ {...props}
107
+ />
108
+ );
109
+ },
110
+ {
111
+ label: 'Calendar View',
112
+ inputs: [
113
+ {
114
+ name: 'data',
115
+ type: 'array',
116
+ label: 'Data',
117
+ description: 'Array of record objects to display as events'
118
+ },
119
+ {
120
+ name: 'titleField',
121
+ type: 'string',
122
+ label: 'Title Field',
123
+ defaultValue: 'title',
124
+ description: 'Field name to use for event title'
125
+ },
126
+ {
127
+ name: 'startDateField',
128
+ type: 'string',
129
+ label: 'Start Date Field',
130
+ defaultValue: 'start',
131
+ description: 'Field name for event start date'
132
+ },
133
+ {
134
+ name: 'endDateField',
135
+ type: 'string',
136
+ label: 'End Date Field',
137
+ defaultValue: 'end',
138
+ description: 'Field name for event end date (optional)'
139
+ },
140
+ {
141
+ name: 'allDayField',
142
+ type: 'string',
143
+ label: 'All Day Field',
144
+ defaultValue: 'allDay',
145
+ description: 'Field name for all-day flag'
146
+ },
147
+ {
148
+ name: 'colorField',
149
+ type: 'string',
150
+ label: 'Color Field',
151
+ defaultValue: 'color',
152
+ description: 'Field name for event color'
153
+ },
154
+ {
155
+ name: 'colorMapping',
156
+ type: 'object',
157
+ label: 'Color Mapping',
158
+ description: 'Map field values to colors (e.g., {meeting: "blue", deadline: "red"})'
159
+ },
160
+ {
161
+ name: 'view',
162
+ type: 'enum',
163
+ enum: ['month', 'week', 'day'],
164
+ defaultValue: 'month',
165
+ label: 'View Mode',
166
+ description: 'Calendar view mode (month, week, or day)'
167
+ },
168
+ {
169
+ name: 'currentDate',
170
+ type: 'string',
171
+ label: 'Current Date',
172
+ description: 'ISO date string for initial calendar date'
173
+ },
174
+ {
175
+ name: 'allowCreate',
176
+ type: 'boolean',
177
+ label: 'Allow Create',
178
+ defaultValue: false,
179
+ description: 'Allow creating events by clicking on dates'
180
+ },
181
+ { name: 'className', type: 'string', label: 'CSS Class' }
182
+ ],
183
+ defaultProps: {
184
+ view: 'month',
185
+ titleField: 'title',
186
+ startDateField: 'start',
187
+ endDateField: 'end',
188
+ allDayField: 'allDay',
189
+ colorField: 'color',
190
+ allowCreate: false,
191
+ data: [
192
+ {
193
+ id: 1,
194
+ title: 'Team Meeting',
195
+ start: new Date(new Date().setHours(10, 0, 0, 0)).toISOString(),
196
+ end: new Date(new Date().setHours(11, 0, 0, 0)).toISOString(),
197
+ color: '#3b82f6',
198
+ allDay: false
199
+ },
200
+ {
201
+ id: 2,
202
+ title: 'Project Deadline',
203
+ start: new Date(new Date().setDate(new Date().getDate() + 3)).toISOString(),
204
+ color: '#ef4444',
205
+ allDay: true
206
+ },
207
+ {
208
+ id: 3,
209
+ title: 'Conference',
210
+ start: new Date(new Date().setDate(new Date().getDate() + 7)).toISOString(),
211
+ end: new Date(new Date().setDate(new Date().getDate() + 9)).toISOString(),
212
+ color: '#10b981',
213
+ allDay: true
214
+ }
215
+ ],
216
+ className: 'h-[600px] border rounded-lg'
217
+ }
218
+ }
219
+ );
@@ -0,0 +1,60 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { CarouselSchema } from '@object-ui/types';
3
+ import {
4
+ Carousel,
5
+ CarouselContent,
6
+ CarouselItem,
7
+ CarouselPrevious,
8
+ CarouselNext
9
+ } from '../../ui';
10
+ import { renderChildren } from '../../lib/utils';
11
+
12
+ ComponentRegistry.register('carousel',
13
+ ({ schema, className, ...props }: { schema: CarouselSchema; className?: string; [key: string]: any }) => (
14
+ <Carousel
15
+ opts={schema.opts}
16
+ orientation={schema.orientation || 'horizontal'}
17
+ className={className}
18
+ {...props}
19
+ >
20
+ <CarouselContent>
21
+ {schema.items?.map((item: any, index: number) => (
22
+ <CarouselItem key={index} className={schema.itemClassName}>
23
+ {renderChildren(item)}
24
+ </CarouselItem>
25
+ ))}
26
+ </CarouselContent>
27
+ {schema.showArrows && (
28
+ <>
29
+ <CarouselPrevious />
30
+ <CarouselNext />
31
+ </>
32
+ )}
33
+ </Carousel>
34
+ ),
35
+ {
36
+ label: 'Carousel',
37
+ inputs: [
38
+ { name: 'orientation', type: 'enum', enum: ['horizontal', 'vertical'], defaultValue: 'horizontal', label: 'Orientation' },
39
+ { name: 'showArrows', type: 'boolean', label: 'Show Arrows', defaultValue: true },
40
+ {
41
+ name: 'items',
42
+ type: 'array',
43
+ label: 'Items',
44
+ description: 'Array of content schemas'
45
+ },
46
+ { name: 'itemClassName', type: 'string', label: 'Item CSS Class' },
47
+ { name: 'className', type: 'string', label: 'Container CSS Class' }
48
+ ],
49
+ defaultProps: {
50
+ orientation: 'horizontal',
51
+ showArrows: true,
52
+ items: [
53
+ [{ type: 'div', className: 'p-8 border rounded bg-slate-50', body: [{ type: 'text', content: 'Slide 1' }] }],
54
+ [{ type: 'div', className: 'p-8 border rounded bg-slate-50', body: [{ type: 'text', content: 'Slide 2' }] }],
55
+ [{ type: 'div', className: 'p-8 border rounded bg-slate-50', body: [{ type: 'text', content: 'Slide 3' }] }]
56
+ ],
57
+ className: 'w-full max-w-xs'
58
+ }
59
+ }
60
+ );