@object-ui/components 0.3.1 → 0.5.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 (299) hide show
  1. package/.turbo/turbo-build.log +47 -0
  2. package/README.md +13 -0
  3. package/dist/index.css +1 -1
  4. package/dist/index.js +34610 -24854
  5. package/dist/index.umd.cjs +53 -32
  6. package/dist/src/SchemaRenderer.d.ts +3 -0
  7. package/dist/src/{ui → custom}/button-group.d.ts +1 -1
  8. package/dist/src/custom/field.d.ts +19 -0
  9. package/dist/src/custom/index.d.ts +12 -0
  10. package/dist/src/custom/input-group.d.ts +14 -0
  11. package/dist/src/{ui → custom}/item.d.ts +1 -1
  12. package/dist/src/custom/native-select.d.ts +12 -0
  13. package/dist/src/custom/sort-builder.d.ts +22 -0
  14. package/dist/src/index.d.ts +1 -0
  15. package/dist/src/renderers/data-display/table.d.ts +1 -1
  16. package/dist/src/renderers/layout/page.d.ts +1 -1
  17. package/dist/src/renderers/placeholders.d.ts +1 -1
  18. package/dist/src/ui/accordion.d.ts +4 -4
  19. package/dist/src/ui/alert-dialog.d.ts +17 -11
  20. package/dist/src/ui/alert.d.ts +4 -5
  21. package/dist/src/ui/aspect-ratio.d.ts +1 -1
  22. package/dist/src/ui/avatar.d.ts +3 -3
  23. package/dist/src/ui/badge.d.ts +3 -3
  24. package/dist/src/ui/breadcrumb.d.ts +16 -8
  25. package/dist/src/ui/calendar.d.ts +7 -7
  26. package/dist/src/ui/card.d.ts +7 -8
  27. package/dist/src/ui/carousel.d.ts +5 -6
  28. package/dist/src/ui/chart.d.ts +62 -0
  29. package/dist/src/ui/checkbox.d.ts +1 -1
  30. package/dist/src/ui/collapsible.d.ts +3 -3
  31. package/dist/src/ui/command.d.ts +78 -16
  32. package/dist/src/ui/context-menu.d.ts +14 -12
  33. package/dist/src/ui/dialog.d.ts +17 -13
  34. package/dist/src/ui/drawer.d.ts +19 -10
  35. package/dist/src/ui/dropdown-menu.d.ts +20 -18
  36. package/dist/src/ui/form.d.ts +6 -7
  37. package/dist/src/ui/hover-card.d.ts +3 -3
  38. package/dist/src/ui/index.d.ts +2 -8
  39. package/dist/src/ui/input-otp.d.ts +30 -7
  40. package/dist/src/ui/label.d.ts +2 -1
  41. package/dist/src/ui/menubar.d.ts +19 -17
  42. package/dist/src/ui/navigation-menu.d.ts +9 -11
  43. package/dist/src/ui/pagination.d.ts +25 -10
  44. package/dist/src/ui/popover.d.ts +4 -5
  45. package/dist/src/ui/progress.d.ts +1 -1
  46. package/dist/src/ui/radio-group.d.ts +2 -2
  47. package/dist/src/ui/resizable.d.ts +5 -8
  48. package/dist/src/ui/scroll-area.d.ts +2 -2
  49. package/dist/src/ui/select.d.ts +11 -13
  50. package/dist/src/ui/sheet.d.ts +23 -11
  51. package/dist/src/ui/sidebar.d.ts +27 -29
  52. package/dist/src/ui/skeleton.d.ts +1 -1
  53. package/dist/src/ui/slider.d.ts +1 -1
  54. package/dist/src/ui/sonner.d.ts +2 -1
  55. package/dist/src/ui/switch.d.ts +2 -2
  56. package/dist/src/ui/tabs.d.ts +1 -1
  57. package/dist/src/ui/textarea.d.ts +1 -1
  58. package/dist/src/ui/toast.d.ts +22 -0
  59. package/dist/src/ui/toggle-group.d.ts +8 -3
  60. package/dist/src/ui/toggle.d.ts +4 -1
  61. package/dist/src/ui/tooltip.d.ts +4 -4
  62. package/dist/src/ui/typography.d.ts +21 -0
  63. package/package.json +17 -7
  64. package/shadcn-components.json +52 -47
  65. package/src/SchemaRenderer.tsx +28 -0
  66. package/src/__tests__/PageRendererRegions.test.tsx +59 -0
  67. package/src/__tests__/Registry.test.ts +21 -0
  68. package/src/__tests__/basic-renderers.test.tsx +1 -1
  69. package/src/__tests__/complex-disclosure-renderers.test.tsx +3 -2
  70. package/src/__tests__/feedback-overlay-renderers.test.tsx +1 -1
  71. package/src/__tests__/form-renderers.test.tsx +1 -1
  72. package/src/__tests__/layout-data-renderers.test.tsx +1 -1
  73. package/src/{ui → custom}/button-group.tsx +1 -1
  74. package/src/{ui → custom}/combobox.tsx +3 -3
  75. package/src/{ui → custom}/date-picker.tsx +3 -3
  76. package/src/custom/field.tsx +81 -0
  77. package/src/{ui → custom}/filter-builder.tsx +3 -3
  78. package/src/custom/index.ts +12 -0
  79. package/src/custom/input-group.tsx +53 -0
  80. package/src/{ui → custom}/item.tsx +1 -1
  81. package/src/custom/native-select.tsx +33 -0
  82. package/src/custom/sort-builder.tsx +129 -0
  83. package/src/index.css +20 -1
  84. package/src/index.ts +1 -0
  85. package/src/renderers/basic/button-group.tsx +1 -0
  86. package/src/renderers/basic/div.tsx +12 -1
  87. package/src/renderers/basic/html.tsx +1 -0
  88. package/src/renderers/basic/icon.tsx +1 -0
  89. package/src/renderers/basic/image.tsx +1 -0
  90. package/src/renderers/basic/navigation-menu.tsx +1 -0
  91. package/src/renderers/basic/pagination.tsx +31 -4
  92. package/src/renderers/basic/separator.tsx +1 -0
  93. package/src/renderers/basic/span.tsx +12 -1
  94. package/src/renderers/basic/text.tsx +4 -2
  95. package/src/renderers/complex/carousel.tsx +1 -0
  96. package/src/renderers/complex/data-table.tsx +134 -95
  97. package/src/renderers/complex/filter-builder.tsx +2 -1
  98. package/src/renderers/complex/resizable.tsx +2 -1
  99. package/src/renderers/complex/scroll-area.tsx +25 -7
  100. package/src/renderers/complex/table.tsx +1 -0
  101. package/src/renderers/data-display/alert.tsx +1 -0
  102. package/src/renderers/data-display/avatar.tsx +1 -0
  103. package/src/renderers/data-display/badge.tsx +1 -0
  104. package/src/renderers/data-display/breadcrumb.tsx +1 -0
  105. package/src/renderers/data-display/kbd.tsx +1 -0
  106. package/src/renderers/data-display/list.tsx +21 -49
  107. package/src/renderers/data-display/statistic.tsx +21 -5
  108. package/src/renderers/data-display/table.tsx +21 -11
  109. package/src/renderers/data-display/tree-view.tsx +7 -1
  110. package/src/renderers/disclosure/accordion.tsx +1 -0
  111. package/src/renderers/disclosure/collapsible.tsx +1 -0
  112. package/src/renderers/disclosure/toggle-group.tsx +2 -0
  113. package/src/renderers/feedback/empty.tsx +1 -0
  114. package/src/renderers/feedback/loading.tsx +2 -1
  115. package/src/renderers/feedback/progress.tsx +1 -0
  116. package/src/renderers/feedback/skeleton.tsx +1 -0
  117. package/src/renderers/feedback/sonner.tsx +1 -0
  118. package/src/renderers/feedback/spinner.tsx +1 -0
  119. package/src/renderers/feedback/toast.tsx +1 -0
  120. package/src/renderers/feedback/toaster.tsx +1 -0
  121. package/src/renderers/form/button.tsx +35 -1
  122. package/src/renderers/form/calendar.tsx +1 -0
  123. package/src/renderers/form/checkbox.tsx +38 -16
  124. package/src/renderers/form/combobox.tsx +2 -1
  125. package/src/renderers/form/command.tsx +1 -0
  126. package/src/renderers/form/date-picker.tsx +1 -0
  127. package/src/renderers/form/file-upload.tsx +1 -0
  128. package/src/renderers/form/form.tsx +92 -15
  129. package/src/renderers/form/input-otp.tsx +1 -0
  130. package/src/renderers/form/input.tsx +3 -0
  131. package/src/renderers/form/label.tsx +1 -0
  132. package/src/renderers/form/radio-group.tsx +1 -0
  133. package/src/renderers/form/select.tsx +35 -15
  134. package/src/renderers/form/slider.tsx +1 -0
  135. package/src/renderers/form/switch.tsx +1 -0
  136. package/src/renderers/form/textarea.tsx +50 -27
  137. package/src/renderers/form/toggle.tsx +3 -45
  138. package/src/renderers/layout/aspect-ratio.tsx +2 -1
  139. package/src/renderers/layout/card.tsx +10 -2
  140. package/src/renderers/layout/container.tsx +1 -0
  141. package/src/renderers/layout/flex.tsx +1 -0
  142. package/src/renderers/layout/grid.tsx +23 -8
  143. package/src/renderers/layout/page.tsx +35 -23
  144. package/src/renderers/layout/semantic.tsx +1 -0
  145. package/src/renderers/layout/stack.tsx +2 -1
  146. package/src/renderers/layout/tabs.tsx +43 -17
  147. package/src/renderers/navigation/header-bar.tsx +1 -0
  148. package/src/renderers/navigation/sidebar.tsx +5 -0
  149. package/src/renderers/overlay/alert-dialog.tsx +1 -0
  150. package/src/renderers/overlay/context-menu.tsx +1 -0
  151. package/src/renderers/overlay/dialog.tsx +1 -0
  152. package/src/renderers/overlay/drawer.tsx +1 -0
  153. package/src/renderers/overlay/dropdown-menu.tsx +1 -0
  154. package/src/renderers/overlay/hover-card.tsx +1 -0
  155. package/src/renderers/overlay/menubar.tsx +1 -0
  156. package/src/renderers/overlay/popover.tsx +1 -0
  157. package/src/renderers/overlay/sheet.tsx +1 -0
  158. package/src/renderers/overlay/tooltip.tsx +1 -0
  159. package/src/renderers/placeholders.tsx +2 -2
  160. package/src/stories/CRMApp.stories.tsx +706 -0
  161. package/src/stories/Guide.mdx +55 -0
  162. package/src/stories/Introduction.mdx +34 -0
  163. package/src/stories/MockedData.stories.tsx +71 -0
  164. package/src/stories/assets/accessibility.png +0 -0
  165. package/src/stories/assets/accessibility.svg +1 -0
  166. package/src/stories/assets/addon-library.png +0 -0
  167. package/src/stories/assets/assets.png +0 -0
  168. package/src/stories/assets/avif-test-image.avif +0 -0
  169. package/src/stories/assets/context.png +0 -0
  170. package/src/stories/assets/discord.svg +1 -0
  171. package/src/stories/assets/docs.png +0 -0
  172. package/src/stories/assets/figma-plugin.png +0 -0
  173. package/src/stories/assets/github.svg +1 -0
  174. package/src/stories/assets/share.png +0 -0
  175. package/src/stories/assets/styling.png +0 -0
  176. package/src/stories/assets/testing.png +0 -0
  177. package/src/stories/assets/theming.png +0 -0
  178. package/src/stories/assets/tutorials.svg +1 -0
  179. package/src/stories/assets/youtube.svg +1 -0
  180. package/src/stories/button.css +30 -0
  181. package/src/stories/header.css +32 -0
  182. package/src/stories/page.css +68 -0
  183. package/src/stories-json/accordion.stories.tsx +43 -0
  184. package/src/stories-json/aggrid.stories.tsx +103 -0
  185. package/src/stories-json/alert.stories.tsx +39 -0
  186. package/src/stories-json/aspect-ratio.stories.tsx +34 -0
  187. package/src/stories-json/avatar.stories.tsx +38 -0
  188. package/src/stories-json/badge.stories.tsx +53 -0
  189. package/src/stories-json/breadcrumb.stories.tsx +30 -0
  190. package/src/stories-json/button-group.stories.tsx +43 -0
  191. package/src/stories-json/button.stories.tsx +73 -0
  192. package/src/stories-json/calendar.stories.tsx +85 -0
  193. package/src/stories-json/card.stories.tsx +48 -0
  194. package/src/stories-json/carousel.stories.tsx +33 -0
  195. package/src/stories-json/charts.stories.tsx +195 -0
  196. package/src/stories-json/chatbot.stories.tsx +248 -0
  197. package/src/stories-json/code-editor.stories.tsx +92 -0
  198. package/src/stories-json/collapsible.stories.tsx +40 -0
  199. package/src/stories-json/controls.stories.tsx +36 -0
  200. package/src/stories-json/dashboard.stories.tsx +318 -0
  201. package/src/stories-json/data-table.stories.tsx +60 -0
  202. package/src/stories-json/data_display_extras.stories.tsx +102 -0
  203. package/src/stories-json/date-picker.stories.tsx +28 -0
  204. package/src/stories-json/detail-view.stories.tsx +258 -0
  205. package/src/stories-json/dialog.stories.tsx +43 -0
  206. package/src/stories-json/feedback_extras.stories.tsx +40 -0
  207. package/src/stories-json/feedback_others.stories.tsx +46 -0
  208. package/src/stories-json/form_advanced.stories.tsx +117 -0
  209. package/src/stories-json/form_extras.stories.tsx +123 -0
  210. package/src/stories-json/grid.stories.tsx +56 -0
  211. package/src/stories-json/icon.stories.tsx +36 -0
  212. package/src/stories-json/input.stories.tsx +52 -0
  213. package/src/stories-json/kanban.stories.tsx +295 -0
  214. package/src/stories-json/layout_extended.stories.tsx +76 -0
  215. package/src/stories-json/layout_flex.stories.tsx +107 -0
  216. package/src/stories-json/list-view.stories.tsx +97 -0
  217. package/src/stories-json/markdown.stories.tsx +129 -0
  218. package/src/stories-json/menus.stories.tsx +63 -0
  219. package/src/stories-json/metric-card.stories.tsx +143 -0
  220. package/src/stories-json/navigation-menu.stories.tsx +37 -0
  221. package/src/stories-json/object-aggrid.stories.tsx +252 -0
  222. package/src/stories-json/object-form.stories.tsx +130 -0
  223. package/src/stories-json/object-gantt.stories.tsx +114 -0
  224. package/src/stories-json/object-grid.stories.tsx +157 -0
  225. package/src/stories-json/object-map.stories.tsx +116 -0
  226. package/src/stories-json/object-view.stories.tsx +118 -0
  227. package/src/stories-json/overlay_extras.stories.tsx +113 -0
  228. package/src/stories-json/overlay_others.stories.tsx +76 -0
  229. package/src/stories-json/page.stories.tsx +55 -0
  230. package/src/stories-json/reports.stories.tsx +163 -0
  231. package/src/stories-json/resizable.stories.tsx +44 -0
  232. package/src/stories-json/select.stories.tsx +34 -0
  233. package/src/stories-json/separator.stories.tsx +41 -0
  234. package/src/stories-json/sidebar.stories.tsx +147 -0
  235. package/src/stories-json/statistic.stories.tsx +44 -0
  236. package/src/stories-json/tabs.stories.tsx +51 -0
  237. package/src/stories-json/timeline.stories.tsx +188 -0
  238. package/src/stories-json/typography.stories.tsx +45 -0
  239. package/src/ui/accordion.tsx +47 -53
  240. package/src/ui/alert-dialog.tsx +103 -117
  241. package/src/ui/alert.tsx +35 -36
  242. package/src/ui/aspect-ratio.tsx +1 -5
  243. package/src/ui/avatar.tsx +41 -42
  244. package/src/ui/badge.tsx +6 -15
  245. package/src/ui/breadcrumb.tsx +81 -75
  246. package/src/ui/button.tsx +10 -11
  247. package/src/ui/calendar.tsx +178 -51
  248. package/src/ui/card.tsx +51 -110
  249. package/src/ui/carousel.tsx +136 -113
  250. package/src/ui/chart.tsx +367 -0
  251. package/src/ui/checkbox.tsx +20 -22
  252. package/src/ui/collapsible.tsx +5 -25
  253. package/src/ui/command.tsx +106 -135
  254. package/src/ui/context-menu.tsx +69 -116
  255. package/src/ui/dialog.tsx +94 -113
  256. package/src/ui/drawer.tsx +82 -99
  257. package/src/ui/dropdown-menu.tsx +134 -188
  258. package/src/ui/form.tsx +51 -40
  259. package/src/ui/hover-card.tsx +18 -33
  260. package/src/ui/index.ts +2 -8
  261. package/src/ui/input-otp.tsx +42 -52
  262. package/src/ui/input.tsx +13 -15
  263. package/src/ui/label.tsx +17 -15
  264. package/src/ui/menubar.tsx +188 -206
  265. package/src/ui/navigation-menu.tsx +96 -136
  266. package/src/ui/pagination.tsx +86 -96
  267. package/src/ui/popover.tsx +24 -41
  268. package/src/ui/progress.tsx +21 -22
  269. package/src/ui/radio-group.tsx +19 -20
  270. package/src/ui/resizable.tsx +32 -42
  271. package/src/ui/scroll-area.tsx +38 -48
  272. package/src/ui/select.tsx +129 -157
  273. package/src/ui/separator.tsx +2 -2
  274. package/src/ui/sheet.tsx +110 -107
  275. package/src/ui/sidebar.tsx +442 -408
  276. package/src/ui/skeleton.tsx +6 -11
  277. package/src/ui/slider.tsx +19 -54
  278. package/src/ui/sonner.tsx +19 -1
  279. package/src/ui/switch.tsx +19 -21
  280. package/src/ui/tabs.tsx +6 -37
  281. package/src/ui/textarea.tsx +8 -4
  282. package/src/ui/toast.tsx +137 -0
  283. package/src/ui/toggle-group.tsx +28 -37
  284. package/src/ui/toggle.tsx +19 -19
  285. package/src/ui/tooltip.tsx +21 -52
  286. package/src/ui/typography.tsx +85 -0
  287. package/tsconfig.json +1 -1
  288. package/vite.config.ts +9 -1
  289. package/vitest.config.ts +5 -0
  290. package/ISSUES_FOUND.md +0 -128
  291. /package/dist/src/{ui → custom}/combobox.d.ts +0 -0
  292. /package/dist/src/{ui → custom}/date-picker.d.ts +0 -0
  293. /package/dist/src/{ui → custom}/empty.d.ts +0 -0
  294. /package/dist/src/{ui → custom}/filter-builder.d.ts +0 -0
  295. /package/dist/src/{ui → custom}/kbd.d.ts +0 -0
  296. /package/dist/src/{ui → custom}/spinner.d.ts +0 -0
  297. /package/src/{ui → custom}/empty.tsx +0 -0
  298. /package/src/{ui → custom}/kbd.tsx +0 -0
  299. /package/src/{ui → custom}/spinner.tsx +0 -0
@@ -0,0 +1,258 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { SchemaRenderer } from '../SchemaRenderer';
3
+ import type { BaseSchema } from '@object-ui/types';
4
+
5
+ const meta = {
6
+ title: 'Views/DetailView',
7
+ component: SchemaRenderer,
8
+ parameters: {
9
+ layout: 'padded',
10
+ },
11
+ tags: ['autodocs'],
12
+ argTypes: {
13
+ schema: { table: { disable: true } },
14
+ },
15
+ } satisfies Meta<any>;
16
+
17
+ export default meta;
18
+ type Story = StoryObj<typeof meta>;
19
+
20
+ const renderStory = (args: any) => <SchemaRenderer schema={args as unknown as BaseSchema} />;
21
+
22
+ export const ContactDetail: Story = {
23
+ render: renderStory,
24
+ args: {
25
+ type: 'detail-view',
26
+ title: 'Contact Details',
27
+ data: {
28
+ name: 'John Doe',
29
+ email: 'john.doe@example.com',
30
+ phone: '+1 (555) 123-4567',
31
+ company: 'Acme Corporation',
32
+ title: 'Senior Developer',
33
+ department: 'Engineering',
34
+ },
35
+ fields: [
36
+ { name: 'name', label: 'Full Name' },
37
+ { name: 'email', label: 'Email' },
38
+ { name: 'phone', label: 'Phone' },
39
+ { name: 'company', label: 'Company' },
40
+ { name: 'title', label: 'Job Title' },
41
+ { name: 'department', label: 'Department' },
42
+ ],
43
+ showBack: true,
44
+ showEdit: true,
45
+ showDelete: true,
46
+ } as any,
47
+ };
48
+
49
+ export const WithSections: Story = {
50
+ render: renderStory,
51
+ args: {
52
+ type: 'detail-view',
53
+ title: 'Account: Acme Corporation',
54
+ data: {
55
+ name: 'Acme Corporation',
56
+ industry: 'Technology',
57
+ website: 'https://acme.com',
58
+ employees: '500-1000',
59
+ revenue: '$50M - $100M',
60
+ street: '123 Main Street',
61
+ city: 'San Francisco',
62
+ state: 'CA',
63
+ zipcode: '94102',
64
+ country: 'USA',
65
+ description: 'Leading technology solutions provider',
66
+ },
67
+ sections: [
68
+ {
69
+ title: 'Basic Information',
70
+ icon: '📋',
71
+ fields: [
72
+ { name: 'name', label: 'Account Name' },
73
+ { name: 'industry', label: 'Industry' },
74
+ { name: 'website', label: 'Website' },
75
+ { name: 'employees', label: 'Employees' },
76
+ { name: 'revenue', label: 'Annual Revenue' },
77
+ ],
78
+ columns: 2,
79
+ },
80
+ {
81
+ title: 'Address',
82
+ icon: '📍',
83
+ collapsible: true,
84
+ defaultCollapsed: false,
85
+ fields: [
86
+ { name: 'street', label: 'Street' },
87
+ { name: 'city', label: 'City' },
88
+ { name: 'state', label: 'State' },
89
+ { name: 'zipcode', label: 'Zip Code' },
90
+ { name: 'country', label: 'Country' },
91
+ ],
92
+ columns: 2,
93
+ },
94
+ {
95
+ title: 'Additional Information',
96
+ collapsible: true,
97
+ defaultCollapsed: true,
98
+ fields: [
99
+ { name: 'description', label: 'Description' },
100
+ ],
101
+ columns: 1,
102
+ },
103
+ ],
104
+ showBack: true,
105
+ showEdit: true,
106
+ showDelete: true,
107
+ } as any,
108
+ };
109
+
110
+ export const WithTabs: Story = {
111
+ render: renderStory,
112
+ args: {
113
+ type: 'detail-view',
114
+ title: 'Opportunity: Q1 Enterprise Deal',
115
+ data: {
116
+ name: 'Q1 Enterprise Deal',
117
+ amount: '$250,000',
118
+ stage: 'Proposal',
119
+ probability: '75%',
120
+ close_date: '2024-03-31',
121
+ },
122
+ fields: [
123
+ { name: 'name', label: 'Opportunity Name' },
124
+ { name: 'amount', label: 'Amount' },
125
+ { name: 'stage', label: 'Stage' },
126
+ { name: 'probability', label: 'Probability' },
127
+ { name: 'close_date', label: 'Close Date' },
128
+ ],
129
+ tabs: [
130
+ {
131
+ key: 'details',
132
+ label: 'Details',
133
+ icon: '📄',
134
+ content: {
135
+ type: 'box',
136
+ children: [
137
+ {
138
+ type: 'text',
139
+ text: 'Detailed opportunity information goes here...',
140
+ },
141
+ ],
142
+ },
143
+ },
144
+ {
145
+ key: 'activity',
146
+ label: 'Activity',
147
+ icon: '📊',
148
+ badge: '12',
149
+ content: {
150
+ type: 'box',
151
+ children: [
152
+ {
153
+ type: 'text',
154
+ text: 'Activity timeline and history...',
155
+ },
156
+ ],
157
+ },
158
+ },
159
+ {
160
+ key: 'notes',
161
+ label: 'Notes',
162
+ icon: '📝',
163
+ content: {
164
+ type: 'box',
165
+ children: [
166
+ {
167
+ type: 'text',
168
+ text: 'Internal notes and comments...',
169
+ },
170
+ ],
171
+ },
172
+ },
173
+ ],
174
+ showBack: true,
175
+ showEdit: true,
176
+ showDelete: true,
177
+ } as any,
178
+ };
179
+
180
+ export const WithRelatedLists: Story = {
181
+ render: renderStory,
182
+ args: {
183
+ type: 'detail-view',
184
+ title: 'Account: Acme Corporation',
185
+ objectName: 'accounts',
186
+ resourceId: '12345',
187
+ data: {
188
+ name: 'Acme Corporation',
189
+ industry: 'Technology',
190
+ },
191
+ fields: [
192
+ { name: 'name', label: 'Account Name' },
193
+ { name: 'industry', label: 'Industry' },
194
+ ],
195
+ related: [
196
+ {
197
+ title: 'Contacts',
198
+ type: 'table',
199
+ data: [
200
+ {
201
+ id: '1',
202
+ name: 'John Doe',
203
+ email: 'john@acme.com',
204
+ phone: '+1 555-0001',
205
+ title: 'CEO',
206
+ },
207
+ {
208
+ id: '2',
209
+ name: 'Jane Smith',
210
+ email: 'jane@acme.com',
211
+ phone: '+1 555-0002',
212
+ title: 'CTO',
213
+ },
214
+ ],
215
+ columns: ['name', 'email', 'phone', 'title'],
216
+ },
217
+ {
218
+ title: 'Opportunities',
219
+ type: 'table',
220
+ data: [
221
+ {
222
+ id: '1',
223
+ name: 'Q1 Deal',
224
+ amount: '$250,000',
225
+ stage: 'Proposal',
226
+ close_date: '2024-03-31',
227
+ },
228
+ {
229
+ id: '2',
230
+ name: 'Q2 Expansion',
231
+ amount: '$100,000',
232
+ stage: 'Prospecting',
233
+ close_date: '2024-06-30',
234
+ },
235
+ ],
236
+ columns: ['name', 'amount', 'stage', 'close_date'],
237
+ },
238
+ ],
239
+ showBack: true,
240
+ showEdit: true,
241
+ showDelete: true,
242
+ } as any,
243
+ };
244
+
245
+ export const LoadingState: Story = {
246
+ render: renderStory,
247
+ args: {
248
+ type: 'detail-view',
249
+ title: 'Loading...',
250
+ loading: true,
251
+ fields: [
252
+ { name: 'name', label: 'Name' },
253
+ { name: 'email', label: 'Email' },
254
+ { name: 'phone', label: 'Phone' },
255
+ ],
256
+ showBack: true,
257
+ } as any,
258
+ };
@@ -0,0 +1,43 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { SchemaRenderer } from '../SchemaRenderer';
3
+ import type { BaseSchema } from '@object-ui/types';
4
+
5
+ const meta = {
6
+ title: 'Components/Dialog',
7
+ component: SchemaRenderer,
8
+ parameters: { layout: 'centered' },
9
+ tags: ['autodocs'],
10
+ argTypes: {
11
+ schema: { table: { disable: true } }
12
+ }
13
+ } satisfies Meta<typeof SchemaRenderer>;
14
+
15
+ export default meta;
16
+ type Story = StoryObj<typeof meta>;
17
+
18
+ const renderStory = (args: any) => <SchemaRenderer schema={args as unknown as BaseSchema} />;
19
+
20
+ export const Default: Story = {
21
+ render: renderStory,
22
+ args: {
23
+ type: 'dialog',
24
+ title: 'Schema/Feedback/Edit profile',
25
+ description: 'Make changes to your profile here. Click save when you\'re done.',
26
+ trigger: [
27
+ { type: 'button', props: { variant: 'outline' }, children: [{type:'text', content: 'Edit Profile'}] }
28
+ ],
29
+ content: [
30
+ {
31
+ type: 'div',
32
+ className: 'grid gap-4 py-4',
33
+ children: [
34
+ { type: 'input', label: 'Name', defaultValue: 'Pedro Duarte', wrapperClass: 'grid grid-cols-4 items-center gap-4' },
35
+ { type: 'input', label: 'Username', defaultValue: '@peduarte', wrapperClass: 'grid grid-cols-4 items-center gap-4' }
36
+ ]
37
+ }
38
+ ],
39
+ footer: [
40
+ { type: 'button', children: [{type: 'text', content: 'Save changes'}] }
41
+ ]
42
+ } as any,
43
+ };
@@ -0,0 +1,40 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { SchemaRenderer } from '../SchemaRenderer';
3
+
4
+ const meta: Meta = {
5
+ title: 'Components/Feedback Extras',
6
+ component: SchemaRenderer,
7
+ tags: ['autodocs'],
8
+ };
9
+
10
+ export default meta;
11
+ type Story = StoryObj<typeof meta>;
12
+
13
+ export const Spinner: Story = {
14
+ args: {
15
+ type: 'spinner',
16
+ size: 'lg',
17
+ className: 'text-primary'
18
+ } as any,
19
+ render: (args) => <SchemaRenderer schema={args} />
20
+ };
21
+
22
+ export const Empty: Story = {
23
+ args: {
24
+ type: 'empty',
25
+ description: 'No Data Found',
26
+ children: [
27
+ { type: 'button', content: 'Create Item', variant: 'default', size: 'sm' }
28
+ ]
29
+ } as any,
30
+ render: (args) => <SchemaRenderer schema={args} />
31
+ };
32
+
33
+ export const Loading: Story = {
34
+ args: {
35
+ type: 'loading',
36
+ text: 'Loading your experience...',
37
+ className: 'h-[200px]'
38
+ } as any,
39
+ render: (args) => <SchemaRenderer schema={args} />
40
+ };
@@ -0,0 +1,46 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { SchemaRenderer } from '../SchemaRenderer';
3
+ import type { BaseSchema } from '@object-ui/types';
4
+
5
+ const meta = {
6
+ title: 'Components/Feedback Others',
7
+ component: SchemaRenderer,
8
+ parameters: { layout: 'centered' },
9
+ tags: ['autodocs'],
10
+ argTypes: {
11
+ schema: { table: { disable: true } }
12
+ }
13
+ } satisfies Meta<typeof SchemaRenderer>;
14
+
15
+ export default meta;
16
+ type Story = StoryObj<typeof meta>;
17
+
18
+ const renderStory = (args: any) => <SchemaRenderer schema={args as unknown as BaseSchema} />;
19
+
20
+ export const Progress: Story = {
21
+ render: renderStory,
22
+ args: {
23
+ type: 'progress',
24
+ value: 60,
25
+ className: 'w-[300px]'
26
+ } as any,
27
+ };
28
+
29
+ export const Skeleton: Story = {
30
+ render: renderStory,
31
+ args: {
32
+ type: 'div',
33
+ className: 'flex items-center space-x-4',
34
+ children: [
35
+ { type: 'skeleton', className: 'h-12 w-12 rounded-full' },
36
+ {
37
+ type: 'div',
38
+ className: 'space-y-2',
39
+ children: [
40
+ { type: 'skeleton', className: 'h-4 w-[250px]' },
41
+ { type: 'skeleton', className: 'h-4 w-[200px]' },
42
+ ]
43
+ }
44
+ ]
45
+ } as any,
46
+ };
@@ -0,0 +1,117 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { SchemaRenderer } from '../SchemaRenderer';
3
+ import type { BaseSchema } from '@object-ui/types';
4
+
5
+ const meta = {
6
+ title: 'Components/Form Advanced',
7
+ component: SchemaRenderer,
8
+ parameters: { layout: 'centered' },
9
+ tags: ['autodocs'],
10
+ argTypes: {
11
+ schema: { table: { disable: true } }
12
+ }
13
+ } satisfies Meta<typeof SchemaRenderer>;
14
+
15
+ export default meta;
16
+ type Story = StoryObj<typeof meta>;
17
+
18
+ const renderStory = (args: any) => <SchemaRenderer schema={args as unknown as BaseSchema} />;
19
+
20
+ export const RadioGroup: Story = {
21
+ render: renderStory,
22
+ args: {
23
+ type: 'radio-group',
24
+ defaultValue: 'option-one',
25
+ id: 'r1',
26
+ options: [
27
+ { label: 'Option One', value: 'option-one' },
28
+ { label: 'Option Two', value: 'option-two' },
29
+ { label: 'Option Three', value: 'option-three' }
30
+ ]
31
+ } as any,
32
+ };
33
+
34
+ export const Slider: Story = {
35
+ render: renderStory,
36
+ args: {
37
+ type: 'slider',
38
+ defaultValue: [33],
39
+ max: 100,
40
+ step: 1,
41
+ className: 'w-[300px]'
42
+ } as any,
43
+ };
44
+
45
+ export const InputOTP: Story = {
46
+ render: renderStory,
47
+ args: {
48
+ type: 'input-otp',
49
+ maxLength: 6,
50
+ value: "123"
51
+ } as any,
52
+ };
53
+
54
+ export const Combobox: Story = {
55
+ render: renderStory,
56
+ args: {
57
+ type: 'combobox',
58
+ placeholder: 'Select framework...',
59
+ className: 'w-[300px]',
60
+ options: [
61
+ { label: 'Next.js', value: 'next.js' },
62
+ { label: 'SvelteKit', value: 'sveltekit' },
63
+ { label: 'Nuxt.js', value: 'nuxt.js' },
64
+ { label: 'Remix', value: 'remix' },
65
+ { label: 'Astro', value: 'astro' }
66
+ ]
67
+ } as any,
68
+ };
69
+
70
+ export const Command: Story = {
71
+ render: renderStory,
72
+ args: {
73
+ type: 'command',
74
+ placeholder: 'Search documentation...',
75
+ className: 'rounded-lg border shadow-md w-[450px]',
76
+ groups: [
77
+ {
78
+ heading: 'Suggestions',
79
+ items: [
80
+ { value: 'cal', label: 'Calendar' },
81
+ { value: 'em', label: 'Search Emoji' },
82
+ { value: 'calc', label: 'Calculator' }
83
+ ]
84
+ },
85
+ {
86
+ heading: 'Settings',
87
+ items: [
88
+ { value: 'prof', label: 'Profile' },
89
+ { value: 'bill', label: 'Billing' },
90
+ { value: 'set', label: 'Settings' }
91
+ ]
92
+ }
93
+ ]
94
+ } as any,
95
+ };
96
+
97
+ export const FilterBuilder: Story = {
98
+ render: renderStory,
99
+ args: {
100
+ type: 'filter-builder',
101
+ name: 'user_filters',
102
+ label: 'User Filters',
103
+ fields: [
104
+ { value: 'name', label: 'Name', type: 'text' },
105
+ { value: 'email', label: 'Email', type: 'text' },
106
+ { value: 'age', label: 'Age', type: 'number' },
107
+ { value: 'status', label: 'Status', type: 'select', options: ['active', 'inactive'] }
108
+ ],
109
+ value: {
110
+ id: 'root',
111
+ logic: 'and',
112
+ conditions: [
113
+ { field: 'age', operator: 'gt', value: 18 }
114
+ ]
115
+ }
116
+ } as any,
117
+ };
@@ -0,0 +1,123 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { SchemaRenderer } from '../SchemaRenderer';
3
+
4
+ const meta: Meta = {
5
+ title: 'Components/Form Extras',
6
+ component: SchemaRenderer,
7
+ tags: ['autodocs'],
8
+ argTypes: {
9
+ // Schema properties
10
+ }
11
+ };
12
+
13
+ export default meta;
14
+ type Story = StoryObj<typeof meta>;
15
+
16
+ export const Toggle: Story = {
17
+ args: {
18
+ type: 'toggle',
19
+ ariaLabel: 'Toggle italic',
20
+ variant: 'outline',
21
+ children: [
22
+ { type: 'icon', name: 'italic', className: 'h-4 w-4' }
23
+ ]
24
+ },
25
+ render: (args) => <SchemaRenderer schema={args} />
26
+ };
27
+
28
+ export const ToggleGroup: Story = {
29
+ args: {
30
+ type: 'toggle-group',
31
+ selectionType: 'multiple',
32
+ variant: 'outline',
33
+ items: [
34
+ { value: 'bold', label: 'Bold', icon: <SchemaRenderer schema={{ type: 'icon', name: 'bold', className: 'h-4 w-4' }} /> },
35
+ { value: 'italic', label: 'Italic', icon: <SchemaRenderer schema={{ type: 'icon', name: 'italic', className: 'h-4 w-4' }} /> },
36
+ { value: 'underline', label: 'Underline', icon: <SchemaRenderer schema={{ type: 'icon', name: 'underline', className: 'h-4 w-4' }} /> }
37
+ ]
38
+ },
39
+ // Note: SchemaRenderer in icon prop might not work if items expects pure objects.
40
+ // Let's check implementation. The implementation just renders {item.icon || item.label}.
41
+ // It expects item.icon to be a ReactNode. We can't pass ReactNode in JSON.
42
+ // Wait, if I am passing generic args, I can. But if this is strict JSON, I can't.
43
+ // The renderer maps `items.map(...)`.
44
+ // Let's try passing text first.
45
+ };
46
+
47
+ export const ToggleGroupText: Story = {
48
+ args: {
49
+ type: 'toggle-group',
50
+ selectionType: 'single',
51
+ variant: 'outline',
52
+ items: [
53
+ { value: 'left', label: 'Left' },
54
+ { value: 'center', label: 'Center' },
55
+ { value: 'right', label: 'Right' }
56
+ ]
57
+ },
58
+ render: (args) => <SchemaRenderer schema={args} />
59
+ };
60
+
61
+ export const FileUpload: Story = {
62
+ args: {
63
+ type: 'file-upload',
64
+ id: 'documents-upload',
65
+ label: 'Upload Documents',
66
+ buttonText: 'Drop files here',
67
+ multiple: true,
68
+ accept: 'image/*'
69
+ },
70
+ render: (args) => <SchemaRenderer schema={args} />
71
+ };
72
+
73
+ export const Calendar: Story = {
74
+ args: {
75
+ type: 'calendar',
76
+ mode: 'single',
77
+ className: 'rounded-md border shadow'
78
+ },
79
+ render: (args) => <SchemaRenderer schema={args} />
80
+ };
81
+
82
+ export const FormConfigured: Story = {
83
+ args: {
84
+ type: 'form',
85
+ label: 'User Registration',
86
+ submitLabel: 'Create Account',
87
+ columns: 2,
88
+ fields: [
89
+ { name: 'firstName', label: 'First Name', required: true, placeholder: 'John' },
90
+ { name: 'lastName', label: 'Last Name', required: true, placeholder: 'Doe' },
91
+ { name: 'email', label: 'Email Address', inputType: 'email', required: true, className: 'col-span-2' },
92
+ { name: 'role', label: 'Role', type: 'select', options: [{label: 'Admin', value: 'admin'}, {label: 'User', value: 'user'}], defaultValue: 'user' },
93
+ { name: 'notifications', label: 'Receive Notifications', type: 'checkbox', className: 'flex flex-row items-center space-x-3 space-y-0 p-4' }
94
+ ]
95
+ },
96
+ render: (args) => <SchemaRenderer schema={args} />
97
+ };
98
+
99
+ export const FormComposed: Story = {
100
+ args: {
101
+ type: 'form',
102
+ submitLabel: 'Sign In',
103
+ children: [
104
+ {
105
+ type: 'div',
106
+ className: 'space-y-2',
107
+ children: [
108
+ { type: 'label', content: 'Username' },
109
+ { type: 'input', placeholder: 'user@example.com' }
110
+ ]
111
+ },
112
+ {
113
+ type: 'div',
114
+ className: 'space-y-2',
115
+ children: [
116
+ { type: 'label', content: 'Password' },
117
+ { type: 'input', inputType: 'password' }
118
+ ]
119
+ }
120
+ ]
121
+ },
122
+ render: (args) => <SchemaRenderer schema={args} />
123
+ };
@@ -0,0 +1,56 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { SchemaRenderer } from '../SchemaRenderer';
3
+ import type { BaseSchema } from '@object-ui/types';
4
+
5
+ const meta = {
6
+ title: 'Components/Grid',
7
+ component: SchemaRenderer,
8
+ parameters: { layout: 'padded' },
9
+ tags: ['autodocs'],
10
+ argTypes: {
11
+ schema: { table: { disable: true } }
12
+ }
13
+ } satisfies Meta<typeof SchemaRenderer>;
14
+
15
+ export default meta;
16
+ type Story = StoryObj<typeof meta>;
17
+
18
+ const renderStory = (args: any) => <SchemaRenderer schema={args as unknown as BaseSchema} />;
19
+
20
+ export const Grid: Story = {
21
+ render: renderStory,
22
+ args: {
23
+ type: 'grid',
24
+ props: {
25
+ cols: 2,
26
+ gap: 4
27
+ },
28
+ children: [
29
+ { type: 'card', className: 'p-4 bg-gray-100', children: [{type:'text', content: 'Column 1'}] },
30
+ { type: 'card', className: 'p-4 bg-gray-100', children: [{type:'text', content: 'Column 2'}] },
31
+ { type: 'card', className: 'p-4 bg-gray-100', children: [{type:'text', content: 'Column 3'}] },
32
+ { type: 'card', className: 'p-4 bg-gray-100', children: [{type:'text', content: 'Column 4'}] }
33
+ ]
34
+ } as any,
35
+ };
36
+
37
+ export const Responsive: Story = {
38
+ render: renderStory,
39
+ args: {
40
+ type: 'grid',
41
+ props: {
42
+ cols: {
43
+ base: 1,
44
+ md: 2,
45
+ lg: 4
46
+ },
47
+ gap: 4
48
+ },
49
+ children: [
50
+ { type: 'card', className: 'p-4 bg-red-100', children: [{type:'text', content: '1'}] },
51
+ { type: 'card', className: 'p-4 bg-blue-100', children: [{type:'text', content: '2'}] },
52
+ { type: 'card', className: 'p-4 bg-green-100', children: [{type:'text', content: '3'}] },
53
+ { type: 'card', className: 'p-4 bg-yellow-100', children: [{type:'text', content: '4'}] }
54
+ ]
55
+ } as any,
56
+ };