@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,189 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { SidebarSchema } from '@object-ui/types';
3
+ import { renderChildren } from '../../lib/utils';
4
+ import {
5
+ SidebarProvider,
6
+ Sidebar,
7
+ SidebarHeader,
8
+ SidebarContent,
9
+ SidebarGroup,
10
+ SidebarGroupLabel,
11
+ SidebarGroupContent,
12
+ SidebarMenu,
13
+ SidebarMenuItem,
14
+ SidebarMenuButton,
15
+ SidebarFooter,
16
+ SidebarTrigger,
17
+ SidebarInset
18
+ } from '../../ui';
19
+
20
+ ComponentRegistry.register('sidebar-provider',
21
+ ({ schema, ...props }) => (
22
+ <SidebarProvider {...props}>{renderChildren(schema.body)}</SidebarProvider>
23
+ ),
24
+ {
25
+ label: 'Sidebar Provider',
26
+ inputs: [
27
+ { name: 'defaultOpen', type: 'boolean', label: 'Default Open', defaultValue: true }
28
+ ],
29
+ defaultProps: {
30
+ defaultOpen: true
31
+ },
32
+ defaultChildren: [
33
+ { type: 'sidebar' },
34
+ { type: 'sidebar-inset' }
35
+ ]
36
+ }
37
+ );
38
+
39
+ ComponentRegistry.register('sidebar',
40
+ ({ schema, ...props }: { schema: SidebarSchema; [key: string]: any }) => (
41
+ <Sidebar {...props}>{renderChildren(schema.body)}</Sidebar>
42
+ ),
43
+ {
44
+ label: 'Sidebar',
45
+ inputs: [
46
+ { name: 'collapsible', type: 'enum', enum: ['offcanvas', 'icon', 'none'], defaultValue: 'icon', label: 'Collapsible' },
47
+ { name: 'side', type: 'enum', enum: ['left', 'right'], defaultValue: 'left', label: 'Side' },
48
+ { name: 'variant', type: 'enum', enum: ['sidebar', 'floating', 'inset'], defaultValue: 'sidebar', label: 'Variant' }
49
+ ],
50
+ defaultProps: {
51
+ collapsible: 'icon',
52
+ side: 'left',
53
+ variant: 'sidebar'
54
+ },
55
+ defaultChildren: [
56
+ { type: 'sidebar-header' },
57
+ { type: 'sidebar-content' },
58
+ { type: 'sidebar-footer' }
59
+ ]
60
+ }
61
+ );
62
+
63
+ ComponentRegistry.register('sidebar-header',
64
+ ({ schema, ...props }) => (
65
+ <SidebarHeader {...props}>{renderChildren(schema.body)}</SidebarHeader>
66
+ ),
67
+ {
68
+ label: 'Sidebar Header',
69
+ defaultChildren: [
70
+ { type: 'text', content: 'Sidebar Header' }
71
+ ]
72
+ }
73
+ );
74
+
75
+ ComponentRegistry.register('sidebar-content',
76
+ ({ schema, ...props }) => (
77
+ <SidebarContent {...props}>{renderChildren(schema.body)}</SidebarContent>
78
+ ),
79
+ {
80
+ label: 'Sidebar Content',
81
+ defaultChildren: [
82
+ { type: 'sidebar-group' }
83
+ ]
84
+ }
85
+ );
86
+
87
+ ComponentRegistry.register('sidebar-group',
88
+ ({ schema, ...props }) => (
89
+ <SidebarGroup {...props}>
90
+ {schema.label && <SidebarGroupLabel>{schema.label}</SidebarGroupLabel>}
91
+ <SidebarGroupContent>
92
+ {renderChildren(schema.body)}
93
+ </SidebarGroupContent>
94
+ </SidebarGroup>
95
+ ),
96
+ {
97
+ label: 'Sidebar Group',
98
+ inputs: [
99
+ { name: 'label', type: 'string', label: 'Label' }
100
+ ],
101
+ defaultProps: {
102
+ label: 'Menu'
103
+ },
104
+ defaultChildren: [
105
+ { type: 'sidebar-menu' }
106
+ ]
107
+ }
108
+ );
109
+
110
+ ComponentRegistry.register('sidebar-menu',
111
+ ({ schema, ...props }) => (
112
+ <SidebarMenu {...props}>{renderChildren(schema.body)}</SidebarMenu>
113
+ ),
114
+ {
115
+ label: 'Sidebar Menu',
116
+ defaultChildren: [
117
+ { type: 'sidebar-menu-item' },
118
+ { type: 'sidebar-menu-item' }
119
+ ]
120
+ }
121
+ );
122
+
123
+ ComponentRegistry.register('sidebar-menu-item',
124
+ ({ schema, ...props }) => (
125
+ <SidebarMenuItem {...props}>{renderChildren(schema.body)}</SidebarMenuItem>
126
+ ),
127
+ {
128
+ label: 'Sidebar Menu Item',
129
+ defaultChildren: [
130
+ { type: 'sidebar-menu-button' }
131
+ ]
132
+ }
133
+ );
134
+
135
+ ComponentRegistry.register('sidebar-menu-button',
136
+ ({ schema, ...props }) => (
137
+ <SidebarMenuButton isActive={schema.active} {...props}>
138
+ {renderChildren(schema.body)}
139
+ </SidebarMenuButton>
140
+ ),
141
+ {
142
+ label: 'Sidebar Menu Button',
143
+ inputs: [
144
+ { name: 'active', type: 'boolean', label: 'Active', defaultValue: false },
145
+ { name: 'size', type: 'enum', enum: ['default', 'sm', 'lg'], defaultValue: 'default', label: 'Size' },
146
+ { name: 'tooltip', type: 'string', label: 'Tooltip' }
147
+ ],
148
+ defaultProps: {
149
+ size: 'default'
150
+ },
151
+ defaultChildren: [
152
+ { type: 'text', content: 'Menu Item' }
153
+ ]
154
+ }
155
+ );
156
+
157
+ ComponentRegistry.register('sidebar-footer',
158
+ ({ schema, ...props }) => (
159
+ <SidebarFooter {...props}>{renderChildren(schema.body)}</SidebarFooter>
160
+ ),
161
+ {
162
+ label: 'Sidebar Footer',
163
+ defaultChildren: [
164
+ { type: 'text', content: 'Footer' }
165
+ ]
166
+ }
167
+ );
168
+
169
+ ComponentRegistry.register('sidebar-inset',
170
+ ({ schema, ...props }) => (
171
+ <SidebarInset {...props}>{renderChildren(schema.body)}</SidebarInset>
172
+ ),
173
+ {
174
+ label: 'Sidebar Inset',
175
+ defaultChildren: [
176
+ { type: 'div', className: 'p-4', body: [{ type: 'text', content: 'Main content area' }] }
177
+ ]
178
+ }
179
+ );
180
+
181
+ ComponentRegistry.register('sidebar-trigger',
182
+ ({ className, ...props }) => (
183
+ <SidebarTrigger className={className} {...props} />
184
+ ),
185
+ {
186
+ label: 'Sidebar Trigger',
187
+ inputs: [{ name: 'className', type: 'string', label: 'CSS Class' }]
188
+ }
189
+ );
@@ -0,0 +1,63 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { AlertDialogSchema } from '@object-ui/types';
3
+ import {
4
+ AlertDialog,
5
+ AlertDialogTrigger,
6
+ AlertDialogContent,
7
+ AlertDialogHeader,
8
+ AlertDialogFooter,
9
+ AlertDialogTitle,
10
+ AlertDialogDescription,
11
+ AlertDialogAction,
12
+ AlertDialogCancel
13
+ } from '../../ui';
14
+ import { renderChildren } from '../../lib/utils';
15
+
16
+ ComponentRegistry.register('alert-dialog',
17
+ ({ schema, className, ...props }: { schema: AlertDialogSchema; className?: string; [key: string]: any }) => (
18
+ <AlertDialog defaultOpen={schema.defaultOpen} {...props}>
19
+ <AlertDialogTrigger asChild>
20
+ {renderChildren(schema.trigger)}
21
+ </AlertDialogTrigger>
22
+ <AlertDialogContent className={className}>
23
+ <AlertDialogHeader>
24
+ {schema.title && <AlertDialogTitle>{schema.title}</AlertDialogTitle>}
25
+ {schema.description && <AlertDialogDescription>{schema.description}</AlertDialogDescription>}
26
+ </AlertDialogHeader>
27
+ {renderChildren(schema.content)}
28
+ <AlertDialogFooter>
29
+ {schema.cancelText && <AlertDialogCancel>{schema.cancelText}</AlertDialogCancel>}
30
+ {schema.actionText && <AlertDialogAction onClick={schema.onAction}>{schema.actionText}</AlertDialogAction>}
31
+ </AlertDialogFooter>
32
+ </AlertDialogContent>
33
+ </AlertDialog>
34
+ ),
35
+ {
36
+ label: 'Alert Dialog',
37
+ inputs: [
38
+ { name: 'title', type: 'string', label: 'Title' },
39
+ { name: 'description', type: 'string', label: 'Description' },
40
+ { name: 'cancelText', type: 'string', label: 'Cancel Text', defaultValue: 'Cancel' },
41
+ { name: 'actionText', type: 'string', label: 'Action Text', defaultValue: 'Continue' },
42
+ { name: 'defaultOpen', type: 'boolean', label: 'Default Open' },
43
+ {
44
+ name: 'trigger',
45
+ type: 'slot',
46
+ label: 'Trigger'
47
+ },
48
+ {
49
+ name: 'content',
50
+ type: 'slot',
51
+ label: 'Content/Body'
52
+ },
53
+ { name: 'className', type: 'string', label: 'Content CSS Class' }
54
+ ],
55
+ defaultProps: {
56
+ title: 'Are you sure?',
57
+ description: 'This action cannot be undone.',
58
+ cancelText: 'Cancel',
59
+ actionText: 'Continue',
60
+ trigger: [{ type: 'button', label: 'Open Alert', variant: 'destructive' }]
61
+ }
62
+ }
63
+ );
@@ -0,0 +1,91 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { ContextMenuSchema } from '@object-ui/types';
3
+ import {
4
+ ContextMenu,
5
+ ContextMenuTrigger,
6
+ ContextMenuContent,
7
+ ContextMenuItem,
8
+ ContextMenuLabel,
9
+ ContextMenuSeparator,
10
+ ContextMenuSub,
11
+ ContextMenuSubTrigger,
12
+ ContextMenuSubContent,
13
+ ContextMenuShortcut
14
+ } from '../../ui';
15
+ import { renderChildren } from '../../lib/utils';
16
+
17
+ // Reuse helper for recursive menu items if I could share it, but for now duplicate concise logic
18
+ const renderContextMenuItems = (items: any[]) => {
19
+ if (!items) return null;
20
+ return items.map((item: any, i: number) => {
21
+ if (item.type === 'separator') return <ContextMenuSeparator key={i} />;
22
+ if (item.type === 'label') return <ContextMenuLabel key={i}>{item.label}</ContextMenuLabel>;
23
+ if (item.children) {
24
+ return (
25
+ <ContextMenuSub key={i}>
26
+ <ContextMenuSubTrigger inset={item.inset}>
27
+ {item.label}
28
+ </ContextMenuSubTrigger>
29
+ <ContextMenuSubContent>
30
+ {renderContextMenuItems(item.children)}
31
+ </ContextMenuSubContent>
32
+ </ContextMenuSub>
33
+ )
34
+ }
35
+
36
+ return (
37
+ <ContextMenuItem key={i} disabled={item.disabled} inset={item.inset} onSelect={item.onSelect}>
38
+ {item.label}
39
+ {item.shortcut && <ContextMenuShortcut>{item.shortcut}</ContextMenuShortcut>}
40
+ </ContextMenuItem>
41
+ );
42
+ });
43
+ };
44
+
45
+ ComponentRegistry.register('context-menu',
46
+ ({ schema, className, ...props }: { schema: ContextMenuSchema; className?: string; [key: string]: any }) => {
47
+ // Determine classes
48
+ const triggerClass = schema.triggerClassName || className || (schema.className as string) || "h-[150px] w-[300px] border border-dashed text-sm flex items-center justify-center";
49
+ const contentClass = schema.contentClassName;
50
+
51
+ return (
52
+ <ContextMenu modal={schema.modal} {...props}>
53
+ <ContextMenuTrigger asChild>
54
+ {/* Usually a Right Click area */}
55
+ <div className={triggerClass}>
56
+ {renderChildren(schema.trigger || { type: 'text', value: "Right click here" })}
57
+ </div>
58
+ </ContextMenuTrigger>
59
+ <ContextMenuContent className={contentClass}>
60
+ {renderContextMenuItems(schema.items)}
61
+ </ContextMenuContent>
62
+ </ContextMenu>
63
+ )},
64
+ {
65
+ label: 'Context Menu',
66
+ inputs: [
67
+ {
68
+ name: 'trigger',
69
+ type: 'slot',
70
+ label: 'Trigger Area',
71
+ },
72
+ { name: 'triggerClassName', type: 'string', label: 'Trigger Area Class' },
73
+ {
74
+ name: 'items',
75
+ type: 'array',
76
+ label: 'Items',
77
+ description: 'Recursive structure: { type?: "separator"|"label", label, shortcut, children }'
78
+ },
79
+ { name: 'className', type: 'string', label: 'Content CSS Class' }
80
+ ],
81
+ defaultProps: {
82
+ items: [
83
+ { label: 'Action 1' },
84
+ { label: 'Action 2' },
85
+ { type: 'separator' },
86
+ { label: 'Action 3' }
87
+ ],
88
+ trigger: [{ type: 'text', content: 'Right click here' }]
89
+ }
90
+ }
91
+ );
@@ -0,0 +1,68 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { DialogSchema } from '@object-ui/types';
3
+ import {
4
+ Dialog,
5
+ DialogTrigger,
6
+ DialogContent,
7
+ DialogHeader,
8
+ DialogFooter,
9
+ DialogTitle,
10
+ DialogDescription
11
+ } from '../../ui';
12
+ import { renderChildren } from '../../lib/utils';
13
+
14
+ ComponentRegistry.register('dialog',
15
+ ({ schema, className, ...props }: { schema: DialogSchema; className?: string; [key: string]: any }) => (
16
+ <Dialog modal={schema.modal} defaultOpen={schema.defaultOpen} {...props}>
17
+ <DialogTrigger asChild>
18
+ {renderChildren(schema.trigger)}
19
+ </DialogTrigger>
20
+ <DialogContent className={className}>
21
+ <DialogHeader>
22
+ {schema.title && <DialogTitle>{schema.title}</DialogTitle>}
23
+ {schema.description && <DialogDescription>{schema.description}</DialogDescription>}
24
+ </DialogHeader>
25
+ {renderChildren(schema.content)}
26
+ {schema.footer && (
27
+ <DialogFooter>
28
+ {renderChildren(schema.footer)}
29
+ </DialogFooter>
30
+ )}
31
+ </DialogContent>
32
+ </Dialog>
33
+ ),
34
+ {
35
+ label: 'Dialog',
36
+ inputs: [
37
+ { name: 'title', type: 'string', label: 'Title' },
38
+ { name: 'description', type: 'string', label: 'Description' },
39
+ { name: 'modal', type: 'boolean', label: 'Modal', defaultValue: true },
40
+ { name: 'defaultOpen', type: 'boolean', label: 'Default Open' },
41
+ {
42
+ name: 'trigger',
43
+ type: 'slot',
44
+ label: 'Trigger',
45
+ description: 'Element that opens the dialog'
46
+ },
47
+ {
48
+ name: 'content',
49
+ type: 'slot',
50
+ label: 'Content',
51
+ description: 'Main content of the dialog'
52
+ },
53
+ {
54
+ name: 'footer',
55
+ type: 'slot',
56
+ label: 'Footer'
57
+ },
58
+ { name: 'className', type: 'string', label: 'Content CSS Class' }
59
+ ],
60
+ defaultProps: {
61
+ title: 'Dialog Title',
62
+ description: 'Dialog description goes here',
63
+ modal: true,
64
+ trigger: [{ type: 'button', label: 'Open Dialog' }],
65
+ content: [{ type: 'text', content: 'Dialog content goes here' }]
66
+ }
67
+ }
68
+ );
@@ -0,0 +1,68 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { DrawerSchema } from '@object-ui/types';
3
+ import {
4
+ Drawer,
5
+ DrawerTrigger,
6
+ DrawerContent,
7
+ DrawerHeader,
8
+ DrawerFooter,
9
+ DrawerTitle,
10
+ DrawerDescription,
11
+ DrawerClose
12
+ } from '../../ui';
13
+ import { renderChildren } from '../../lib/utils';
14
+
15
+ ComponentRegistry.register('drawer',
16
+ ({ schema, className, ...props }: { schema: DrawerSchema; className?: string; [key: string]: any }) => (
17
+ <Drawer shouldScaleBackground={schema.shouldScaleBackground} defaultOpen={schema.defaultOpen} {...props}>
18
+ <DrawerTrigger asChild>
19
+ {renderChildren(schema.trigger)}
20
+ </DrawerTrigger>
21
+ <DrawerContent className={className}>
22
+ <DrawerHeader>
23
+ {schema.title && <DrawerTitle>{schema.title}</DrawerTitle>}
24
+ {schema.description && <DrawerDescription>{schema.description}</DrawerDescription>}
25
+ </DrawerHeader>
26
+ {renderChildren(schema.content)}
27
+ {schema.footer && (
28
+ <DrawerFooter>
29
+ {renderChildren(schema.footer)}
30
+ {schema.showClose && <DrawerClose asChild><button>Close</button></DrawerClose>}
31
+ </DrawerFooter>
32
+ )}
33
+ </DrawerContent>
34
+ </Drawer>
35
+ ),
36
+ {
37
+ label: 'Drawer',
38
+ inputs: [
39
+ { name: 'title', type: 'string', label: 'Title' },
40
+ { name: 'description', type: 'string', label: 'Description' },
41
+ { name: 'shouldScaleBackground', type: 'boolean', label: 'Scale Background' },
42
+ { name: 'defaultOpen', type: 'boolean', label: 'Default Open' },
43
+ { name: 'showClose', type: 'boolean', label: 'Show Close Button in Footer' },
44
+ {
45
+ name: 'trigger',
46
+ type: 'slot',
47
+ label: 'Trigger'
48
+ },
49
+ {
50
+ name: 'content',
51
+ type: 'slot',
52
+ label: 'Content'
53
+ },
54
+ {
55
+ name: 'footer',
56
+ type: 'slot',
57
+ label: 'Footer'
58
+ },
59
+ { name: 'className', type: 'string', label: 'Content CSS Class' }
60
+ ],
61
+ defaultProps: {
62
+ title: 'Drawer Title',
63
+ description: 'Drawer description',
64
+ trigger: [{ type: 'button', label: 'Open Drawer' }],
65
+ content: [{ type: 'text', content: 'Drawer content goes here' }]
66
+ }
67
+ }
68
+ );
@@ -0,0 +1,90 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { DropdownMenuSchema } from '@object-ui/types';
3
+ import {
4
+ DropdownMenu,
5
+ DropdownMenuTrigger,
6
+ DropdownMenuContent,
7
+ DropdownMenuItem,
8
+ DropdownMenuLabel,
9
+ DropdownMenuSeparator,
10
+ DropdownMenuSub,
11
+ DropdownMenuSubTrigger,
12
+ DropdownMenuSubContent
13
+ } from '../../ui';
14
+ import { renderChildren } from '../../lib/utils';
15
+
16
+ // Helper for recursive menu items
17
+ const renderMenuItems = (items: any[]) => {
18
+ if (!items) return null;
19
+ return items.map((item: any, i: number) => {
20
+ if (item.type === 'separator') return <DropdownMenuSeparator key={i} />;
21
+ if (item.type === 'label') return <DropdownMenuLabel key={i}>{item.label}</DropdownMenuLabel>;
22
+ if (item.children) {
23
+ return (
24
+ <DropdownMenuSub key={i}>
25
+ <DropdownMenuSubTrigger inset={item.inset}>
26
+ {item.icon && <span className="mr-2">{item.icon}</span>}
27
+ {item.label}
28
+ </DropdownMenuSubTrigger>
29
+ <DropdownMenuSubContent>
30
+ {renderMenuItems(item.children)}
31
+ </DropdownMenuSubContent>
32
+ </DropdownMenuSub>
33
+ )
34
+ }
35
+
36
+ return (
37
+ <DropdownMenuItem key={i} disabled={item.disabled} inset={item.inset} onSelect={item.onSelect}>
38
+ {item.icon && <span className="mr-2">{item.icon}</span>}
39
+ {item.label}
40
+ {item.shortcut && <span className="ml-auto text-xs tracking-widest opacity-60">{item.shortcut}</span>}
41
+ </DropdownMenuItem>
42
+ );
43
+ });
44
+ };
45
+
46
+ ComponentRegistry.register('dropdown-menu',
47
+ ({ schema, className, ...props }: { schema: DropdownMenuSchema; className?: string; [key: string]: any }) => (
48
+ <DropdownMenu modal={schema.modal} defaultOpen={schema.defaultOpen} {...props}>
49
+ <DropdownMenuTrigger asChild>
50
+ {renderChildren(schema.trigger)}
51
+ </DropdownMenuTrigger>
52
+ <DropdownMenuContent align={schema.align} side={schema.side} className={className}>
53
+ {schema.label && <DropdownMenuLabel>{schema.label}</DropdownMenuLabel>}
54
+ {schema.label && <DropdownMenuSeparator />}
55
+ {renderMenuItems(schema.items)}
56
+ </DropdownMenuContent>
57
+ </DropdownMenu>
58
+ ),
59
+ {
60
+ label: 'Dropdown Menu',
61
+ inputs: [
62
+ { name: 'label', type: 'string', label: 'Menu Label' },
63
+ { name: 'side', type: 'enum', enum: ['top', 'right', 'bottom', 'left'], label: 'Side' },
64
+ { name: 'align', type: 'enum', enum: ['start', 'center', 'end'], label: 'Align' },
65
+ {
66
+ name: 'trigger',
67
+ type: 'slot',
68
+ label: 'Trigger'
69
+ },
70
+ {
71
+ name: 'items',
72
+ type: 'array',
73
+ label: 'Items',
74
+ description: 'Recursive structure: { type?: "separator"|"label", label, icon, shortcut, disabled, children: [] }'
75
+ },
76
+ { name: 'className', type: 'string', label: 'Content CSS Class' }
77
+ ],
78
+ defaultProps: {
79
+ trigger: [{ type: 'button', label: 'Menu', variant: 'outline' }],
80
+ items: [
81
+ { label: 'Item 1' },
82
+ { label: 'Item 2' },
83
+ { type: 'separator' },
84
+ { label: 'Item 3' }
85
+ ],
86
+ align: 'start',
87
+ side: 'bottom'
88
+ }
89
+ }
90
+ );
@@ -0,0 +1,46 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { HoverCardSchema } from '@object-ui/types';
3
+ import {
4
+ HoverCard,
5
+ HoverCardTrigger,
6
+ HoverCardContent
7
+ } from '../../ui';
8
+ import { renderChildren } from '../../lib/utils';
9
+
10
+ ComponentRegistry.register('hover-card',
11
+ ({ schema, className, ...props }: { schema: HoverCardSchema; className?: string; [key: string]: any }) => (
12
+ <HoverCard openDelay={schema.openDelay} closeDelay={schema.closeDelay} {...props}>
13
+ <HoverCardTrigger asChild>
14
+ {renderChildren(schema.trigger)}
15
+ </HoverCardTrigger>
16
+ <HoverCardContent align={schema.align} side={schema.side} className={className}>
17
+ {renderChildren(schema.content)}
18
+ </HoverCardContent>
19
+ </HoverCard>
20
+ ),
21
+ {
22
+ label: 'Hover Card',
23
+ inputs: [
24
+ { name: 'openDelay', type: 'number', label: 'Open Delay' },
25
+ { name: 'closeDelay', type: 'number', label: 'Close Delay' },
26
+ { name: 'side', type: 'enum', enum: ['top', 'right', 'bottom', 'left'], label: 'Side' },
27
+ { name: 'align', type: 'enum', enum: ['start', 'center', 'end'], label: 'Align' },
28
+ {
29
+ name: 'trigger',
30
+ type: 'slot',
31
+ label: 'Trigger'
32
+ },
33
+ {
34
+ name: 'content',
35
+ type: 'slot',
36
+ label: 'Content'
37
+ },
38
+ { name: 'className', type: 'string', label: 'Content CSS Class' }
39
+ ],
40
+ defaultProps: {
41
+ trigger: [{ type: 'button', label: 'Hover me', variant: 'link' }],
42
+ content: [{ type: 'text', content: 'Hover card content appears on hover' }],
43
+ side: 'top'
44
+ }
45
+ }
46
+ );
@@ -0,0 +1,9 @@
1
+ import './dialog';
2
+ import './sheet';
3
+ import './popover';
4
+ import './tooltip';
5
+ import './alert-dialog';
6
+ import './drawer';
7
+ import './hover-card';
8
+ import './dropdown-menu';
9
+ import './context-menu';
@@ -0,0 +1,47 @@
1
+ import { ComponentRegistry } from '@object-ui/core';
2
+ import type { PopoverSchema } from '@object-ui/types';
3
+ import {
4
+ Popover,
5
+ PopoverTrigger,
6
+ PopoverContent
7
+ } from '../../ui';
8
+ import { renderChildren } from '../../lib/utils';
9
+
10
+ ComponentRegistry.register('popover',
11
+ ({ schema, className, ...props }: { schema: PopoverSchema; className?: string; [key: string]: any }) => (
12
+ <Popover modal={schema.modal} defaultOpen={schema.defaultOpen} {...props}>
13
+ <PopoverTrigger asChild>
14
+ {renderChildren(schema.trigger)}
15
+ </PopoverTrigger>
16
+ <PopoverContent align={schema.align} side={schema.side} className={className}>
17
+ {renderChildren(schema.content)}
18
+ </PopoverContent>
19
+ </Popover>
20
+ ),
21
+ {
22
+ label: 'Popover',
23
+ inputs: [
24
+ { name: 'modal', type: 'boolean', label: 'Modal' },
25
+ { name: 'defaultOpen', type: 'boolean', label: 'Default Open' },
26
+ { name: 'align', type: 'enum', enum: ['start', 'center', 'end'], label: 'Align' },
27
+ { name: 'side', type: 'enum', enum: ['top', 'right', 'bottom', 'left'], label: 'Side' },
28
+ {
29
+ name: 'trigger',
30
+ type: 'slot',
31
+ label: 'Trigger',
32
+ },
33
+ {
34
+ name: 'content',
35
+ type: 'slot',
36
+ label: 'Content',
37
+ },
38
+ { name: 'className', type: 'string', label: 'Content CSS Class' }
39
+ ],
40
+ defaultProps: {
41
+ trigger: [{ type: 'button', label: 'Open Popover', variant: 'outline' }],
42
+ content: [{ type: 'text', content: 'Popover content goes here' }],
43
+ align: 'center',
44
+ side: 'bottom'
45
+ }
46
+ }
47
+ );