@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,130 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { SchemaRenderer, SchemaRendererProvider } from '@object-ui/react';
3
+ import type { BaseSchema } from '@object-ui/types';
4
+ import { createStorybookDataSource } from '@storybook-config/datasource';
5
+
6
+ const meta = {
7
+ title: 'Views/Object Form',
8
+ component: SchemaRenderer,
9
+ parameters: {
10
+ layout: 'centered',
11
+ },
12
+ tags: ['autodocs'],
13
+ argTypes: {
14
+ schema: { table: { disable: true } },
15
+ },
16
+ } satisfies Meta<any>;
17
+
18
+ export default meta;
19
+ type Story = StoryObj<typeof meta>;
20
+
21
+ // Create a DataSource instance that connects to MSW
22
+ const dataSource = createStorybookDataSource();
23
+
24
+ const renderStory = (args: any) => (
25
+ <SchemaRendererProvider dataSource={dataSource}>
26
+ <SchemaRenderer schema={args as unknown as BaseSchema} />
27
+ </SchemaRendererProvider>
28
+ );
29
+
30
+ export const BasicSchema: Story = {
31
+ render: renderStory,
32
+ args: {
33
+ type: 'object-form',
34
+ objectName: 'User',
35
+ customFields: [
36
+ { name: 'firstName', label: 'First Name', type: 'text', required: true },
37
+ { name: 'lastName', label: 'Last Name', type: 'text', required: true },
38
+ { name: 'email', label: 'Email', type: 'email', required: true },
39
+ { name: 'age', label: 'Age', type: 'number' }
40
+ ],
41
+ className: 'w-full max-w-2xl'
42
+ } as any,
43
+ };
44
+
45
+ export const WithSections: Story = {
46
+ render: renderStory,
47
+ args: {
48
+ type: 'object-form',
49
+ objectName: 'Employee',
50
+ sections: [
51
+ {
52
+ title: 'Schema/Plugins/Personal Information',
53
+ fields: [
54
+ { name: 'firstName', label: 'First Name', type: 'text', required: true },
55
+ { name: 'lastName', label: 'Last Name', type: 'text', required: true },
56
+ { name: 'dateOfBirth', label: 'Date of Birth', type: 'date' }
57
+ ]
58
+ },
59
+ {
60
+ title: 'Schema/Plugins/Contact Details',
61
+ fields: [
62
+ { name: 'email', label: 'Email', type: 'email', required: true },
63
+ { name: 'phone', label: 'Phone', type: 'tel' },
64
+ { name: 'address', label: 'Address', type: 'textarea' }
65
+ ]
66
+ }
67
+ ],
68
+ className: 'w-full max-w-2xl'
69
+ } as any,
70
+ };
71
+
72
+ export const ComplexFields: Story = {
73
+ render: renderStory,
74
+ args: {
75
+ type: 'object-form',
76
+ objectName: 'Product',
77
+ customFields: [
78
+ { name: 'name', label: 'Product Name', type: 'text', required: true },
79
+ { name: 'category', label: 'Category', type: 'select', options: ['Electronics', 'Clothing', 'Food'], required: true },
80
+ { name: 'price', label: 'Price', type: 'number', required: true },
81
+ { name: 'inStock', label: 'In Stock', type: 'checkbox' },
82
+ { name: 'description', label: 'Description', type: 'textarea', rows: 4 }
83
+ ],
84
+ className: 'w-full max-w-2xl'
85
+ } as any,
86
+ };
87
+
88
+ /**
89
+ * Contact Form - Uses MSW-backed schema from ObjectStack runtime
90
+ *
91
+ * This story demonstrates integration with the MSW plugin runtime mode.
92
+ * The form schema is fetched from /api/v1/metadata/contact via the ObjectStack kernel.
93
+ */
94
+ export const ContactForm: Story = {
95
+ render: renderStory,
96
+ args: {
97
+ type: 'object-form',
98
+ objectName: 'contact',
99
+ customFields: [
100
+ { name: 'name', label: 'Name', type: 'text', required: true },
101
+ { name: 'email', label: 'Email', type: 'email', required: true },
102
+ { name: 'phone', label: 'Phone', type: 'tel' },
103
+ { name: 'title', label: 'Title', type: 'text' },
104
+ { name: 'company', label: 'Company', type: 'text' },
105
+ { name: 'status', label: 'Status', type: 'select', options: ['Active', 'Lead', 'Customer'] }
106
+ ],
107
+ className: 'w-full max-w-2xl'
108
+ } as any,
109
+ };
110
+
111
+ /**
112
+ * Opportunity Form - Uses MSW-backed schema from ObjectStack runtime
113
+ *
114
+ * This story demonstrates creating/editing opportunity records via MSW runtime.
115
+ */
116
+ export const OpportunityForm: Story = {
117
+ render: renderStory,
118
+ args: {
119
+ type: 'object-form',
120
+ objectName: 'opportunity',
121
+ customFields: [
122
+ { name: 'name', label: 'Opportunity Name', type: 'text', required: true },
123
+ { name: 'amount', label: 'Amount', type: 'number', required: true },
124
+ { name: 'stage', label: 'Stage', type: 'select', options: ['Prospecting', 'Qualification', 'Proposal', 'Negotiation', 'Closed Won', 'Closed Lost'] },
125
+ { name: 'closeDate', label: 'Close Date', type: 'date' },
126
+ { name: 'description', label: 'Description', type: 'textarea', rows: 4 }
127
+ ],
128
+ className: 'w-full max-w-2xl'
129
+ } as any,
130
+ };
@@ -0,0 +1,114 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { SchemaRenderer, SchemaRendererProvider } from '@object-ui/react';
3
+ import type { BaseSchema } from '@object-ui/types';
4
+ import { createStorybookDataSource } from '@storybook-config/datasource';
5
+
6
+ const meta = {
7
+ title: 'Views/Gantt',
8
+ component: SchemaRenderer,
9
+ parameters: {
10
+ layout: 'padded',
11
+ test: {
12
+ timeout: 60000,
13
+ },
14
+ },
15
+ tags: ['autodocs'],
16
+ argTypes: {
17
+ schema: { table: { disable: true } },
18
+ },
19
+ } satisfies Meta<any>;
20
+
21
+ export default meta;
22
+ type Story = StoryObj<typeof meta>;
23
+
24
+ // Create a DataSource instance that connects to MSW
25
+ const dataSource = createStorybookDataSource();
26
+
27
+ const renderStory = (args: any) => (
28
+ <SchemaRendererProvider dataSource={dataSource}>
29
+ <SchemaRenderer schema={args as unknown as BaseSchema} />
30
+ </SchemaRendererProvider>
31
+ );
32
+
33
+ export const ProjectSchedule: Story = {
34
+ render: renderStory,
35
+ args: {
36
+ type: 'object-gantt',
37
+ objectName: 'Task',
38
+ gantt: {
39
+ startDateField: 'startDate',
40
+ endDateField: 'endDate',
41
+ titleField: 'name',
42
+ progressField: 'progress',
43
+ dependenciesField: 'dependencies'
44
+ },
45
+ tasks: [
46
+ {
47
+ id: '1',
48
+ name: 'Project Planning',
49
+ startDate: '2024-01-01',
50
+ endDate: '2024-01-15',
51
+ progress: 100
52
+ },
53
+ {
54
+ id: '2',
55
+ name: 'Design Phase',
56
+ startDate: '2024-01-10',
57
+ endDate: '2024-02-15',
58
+ progress: 75,
59
+ dependencies: ['1']
60
+ },
61
+ {
62
+ id: '3',
63
+ name: 'Development',
64
+ startDate: '2024-02-01',
65
+ endDate: '2024-04-30',
66
+ progress: 30,
67
+ dependencies: ['2']
68
+ },
69
+ {
70
+ id: '4',
71
+ name: 'Testing',
72
+ startDate: '2024-04-15',
73
+ endDate: '2024-05-15',
74
+ progress: 0,
75
+ dependencies: ['3']
76
+ }
77
+ ],
78
+ className: 'w-full'
79
+ } as any,
80
+ };
81
+
82
+ export const SimpleGantt: Story = {
83
+ render: renderStory,
84
+ args: {
85
+ type: 'object-gantt',
86
+ objectName: 'Milestone',
87
+ gantt: {
88
+ startDateField: 'start',
89
+ endDateField: 'end',
90
+ titleField: 'title'
91
+ },
92
+ tasks: [
93
+ {
94
+ id: '1',
95
+ title: 'Schema/Plugins/Q1 Goals',
96
+ start: '2024-01-01',
97
+ end: '2024-03-31'
98
+ },
99
+ {
100
+ id: '2',
101
+ title: 'Schema/Plugins/Q2 Goals',
102
+ start: '2024-04-01',
103
+ end: '2024-06-30'
104
+ },
105
+ {
106
+ id: '3',
107
+ title: 'Schema/Plugins/Q3 Goals',
108
+ start: '2024-07-01',
109
+ end: '2024-09-30'
110
+ }
111
+ ],
112
+ className: 'w-full'
113
+ } as any,
114
+ };
@@ -0,0 +1,157 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { SchemaRenderer, SchemaRendererProvider } from '@object-ui/react';
3
+ import type { BaseSchema } from '@object-ui/types';
4
+ import { createStorybookDataSource } from '@storybook-config/datasource';
5
+
6
+ const meta = {
7
+ title: 'Views/Object Grid',
8
+ component: SchemaRenderer,
9
+ parameters: {
10
+ layout: 'padded',
11
+ },
12
+ tags: ['autodocs'],
13
+ argTypes: {
14
+ schema: { table: { disable: true } },
15
+ },
16
+ } satisfies Meta<any>;
17
+
18
+ export default meta;
19
+ type Story = StoryObj<typeof meta>;
20
+
21
+ // Create a DataSource instance that connects to MSW
22
+ const dataSource = createStorybookDataSource();
23
+
24
+ const renderStory = (args: any) => (
25
+ <SchemaRendererProvider dataSource={dataSource}>
26
+ <SchemaRenderer schema={args as unknown as BaseSchema} />
27
+ </SchemaRendererProvider>
28
+ );
29
+
30
+ export const UserGrid: Story = {
31
+ render: renderStory,
32
+ args: {
33
+ type: 'object-grid',
34
+ objectName: 'User',
35
+ columns: [
36
+ { field: 'id', header: 'ID', width: 80 },
37
+ { field: 'name', header: 'Name', sortable: true, filterable: true },
38
+ { field: 'email', header: 'Email', sortable: true, filterable: true },
39
+ { field: 'role', header: 'Role', sortable: true },
40
+ { field: 'status', header: 'Status', sortable: true }
41
+ ],
42
+ data: [
43
+ { id: 1, name: 'John Doe', email: 'john@example.com', role: 'Admin', status: 'Active' },
44
+ { id: 2, name: 'Jane Smith', email: 'jane@example.com', role: 'User', status: 'Active' },
45
+ { id: 3, name: 'Bob Johnson', email: 'bob@example.com', role: 'User', status: 'Inactive' }
46
+ ],
47
+ pagination: true,
48
+ pageSize: 10,
49
+ className: 'w-full'
50
+ } as any,
51
+ };
52
+
53
+ export const ProductGrid: Story = {
54
+ render: renderStory,
55
+ args: {
56
+ type: 'object-grid',
57
+ objectName: 'Product',
58
+ columns: [
59
+ { field: 'sku', header: 'SKU', width: 120 },
60
+ { field: 'name', header: 'Product Name', sortable: true, filterable: true },
61
+ { field: 'category', header: 'Category', sortable: true, filterable: true },
62
+ { field: 'price', header: 'Price', sortable: true, type: 'currency' },
63
+ { field: 'stock', header: 'In Stock', sortable: true, type: 'number' }
64
+ ],
65
+ data: [
66
+ { sku: 'PROD-001', name: 'Laptop', category: 'Electronics', price: 1299.99, stock: 15 },
67
+ { sku: 'PROD-002', name: 'Mouse', category: 'Electronics', price: 29.99, stock: 120 },
68
+ { sku: 'PROD-003', name: 'Desk Chair', category: 'Furniture', price: 249.99, stock: 8 },
69
+ { sku: 'PROD-004', name: 'Monitor', category: 'Electronics', price: 399.99, stock: 22 }
70
+ ],
71
+ pagination: true,
72
+ pageSize: 5,
73
+ className: 'w-full'
74
+ } as any,
75
+ };
76
+
77
+ export const WithActions: Story = {
78
+ render: renderStory,
79
+ args: {
80
+ type: 'object-grid',
81
+ objectName: 'Order',
82
+ columns: [
83
+ { field: 'orderId', header: 'Order ID', width: 120 },
84
+ { field: 'customer', header: 'Customer', sortable: true },
85
+ { field: 'date', header: 'Order Date', sortable: true, type: 'date' },
86
+ { field: 'total', header: 'Total', sortable: true, type: 'currency' },
87
+ { field: 'status', header: 'Status', sortable: true }
88
+ ],
89
+ actions: [
90
+ { label: 'View', action: 'view' },
91
+ { label: 'Edit', action: 'edit' },
92
+ { label: 'Delete', action: 'delete', variant: 'destructive' }
93
+ ],
94
+ data: [
95
+ { orderId: 'ORD-1001', customer: 'Alice Brown', date: '2024-01-15', total: 159.99, status: 'Completed' },
96
+ { orderId: 'ORD-1002', customer: 'Charlie Davis', date: '2024-01-18', total: 89.50, status: 'Processing' },
97
+ { orderId: 'ORD-1003', customer: 'Eve Wilson', date: '2024-01-20', total: 299.99, status: 'Shipped' }
98
+ ],
99
+ pagination: true,
100
+ pageSize: 10,
101
+ className: 'w-full'
102
+ } as any,
103
+ };
104
+
105
+ /**
106
+ * Contacts Grid - Uses MSW-backed data from ObjectStack runtime
107
+ *
108
+ * This story demonstrates integration with the MSW plugin runtime mode.
109
+ * Data is fetched from /api/v1/data/contact via the ObjectStack kernel.
110
+ */
111
+ export const ContactsGrid: Story = {
112
+ render: renderStory,
113
+ args: {
114
+ type: 'object-grid',
115
+ objectName: 'contact',
116
+ data: {
117
+ provider: 'object',
118
+ object: 'contact',
119
+ },
120
+ columns: [
121
+ { field: 'name', header: 'Name', sortable: true, filterable: true },
122
+ { field: 'email', header: 'Email', sortable: true, filterable: true },
123
+ { field: 'title', header: 'Title', sortable: true },
124
+ { field: 'company', header: 'Company', sortable: true },
125
+ { field: 'status', header: 'Status', sortable: true }
126
+ ],
127
+ pagination: true,
128
+ pageSize: 10,
129
+ className: 'w-full'
130
+ } as any,
131
+ };
132
+
133
+ /**
134
+ * Opportunities Grid - Uses MSW-backed data from ObjectStack runtime
135
+ *
136
+ * This story demonstrates fetching opportunity data from the MSW runtime.
137
+ */
138
+ export const OpportunitiesGrid: Story = {
139
+ render: renderStory,
140
+ args: {
141
+ type: 'object-grid',
142
+ objectName: 'opportunity',
143
+ data: {
144
+ provider: 'object',
145
+ object: 'opportunity',
146
+ },
147
+ columns: [
148
+ { field: 'name', header: 'Name', sortable: true, filterable: true },
149
+ { field: 'amount', header: 'Amount', sortable: true, type: 'currency' },
150
+ { field: 'stage', header: 'Stage', sortable: true },
151
+ { field: 'closeDate', header: 'Close Date', sortable: true, type: 'date' }
152
+ ],
153
+ pagination: true,
154
+ pageSize: 10,
155
+ className: 'w-full'
156
+ } as any,
157
+ };
@@ -0,0 +1,116 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { SchemaRenderer, SchemaRendererProvider } from '@object-ui/react';
3
+ import type { BaseSchema } from '@object-ui/types';
4
+ import { createStorybookDataSource } from '@storybook-config/datasource';
5
+
6
+ const meta = {
7
+ title: 'Views/Map',
8
+ component: SchemaRenderer,
9
+ parameters: {
10
+ layout: 'padded',
11
+ test: {
12
+ timeout: 60000,
13
+ },
14
+ },
15
+ tags: ['autodocs'],
16
+ argTypes: {
17
+ schema: { table: { disable: true } },
18
+ },
19
+ } satisfies Meta<any>;
20
+
21
+ export default meta;
22
+ type Story = StoryObj<typeof meta>;
23
+
24
+ // Create a DataSource instance that connects to MSW
25
+ const dataSource = createStorybookDataSource();
26
+
27
+ const renderStory = (args: any) => (
28
+ <SchemaRendererProvider dataSource={dataSource}>
29
+ <SchemaRenderer schema={args as unknown as BaseSchema} />
30
+ </SchemaRendererProvider>
31
+ );
32
+
33
+ export const StoreLocations: Story = {
34
+ render: renderStory,
35
+ args: {
36
+ type: 'object-map',
37
+ objectName: 'Store',
38
+ map: {
39
+ latitudeField: 'latitude',
40
+ longitudeField: 'longitude',
41
+ titleField: 'name',
42
+ descriptionField: 'address'
43
+ },
44
+ locations: [
45
+ {
46
+ id: '1',
47
+ name: 'Downtown Store',
48
+ address: '123 Main St',
49
+ latitude: 40.7128,
50
+ longitude: -74.0060
51
+ },
52
+ {
53
+ id: '2',
54
+ name: 'Uptown Branch',
55
+ address: '456 Park Ave',
56
+ latitude: 40.7589,
57
+ longitude: -73.9851
58
+ },
59
+ {
60
+ id: '3',
61
+ name: 'Suburban Location',
62
+ address: '789 Oak Rd',
63
+ latitude: 40.6782,
64
+ longitude: -73.9442
65
+ }
66
+ ],
67
+ center: {
68
+ latitude: 40.7128,
69
+ longitude: -74.0060
70
+ },
71
+ zoom: 12,
72
+ className: 'w-full h-[500px]'
73
+ } as any,
74
+ };
75
+
76
+ export const DeliveryRoutes: Story = {
77
+ render: renderStory,
78
+ args: {
79
+ type: 'object-map',
80
+ objectName: 'Delivery',
81
+ map: {
82
+ latitudeField: 'lat',
83
+ longitudeField: 'lng',
84
+ titleField: 'address'
85
+ },
86
+ locations: [
87
+ {
88
+ id: '1',
89
+ address: 'Customer A - 100 First St',
90
+ lat: 37.7749,
91
+ lng: -122.4194,
92
+ status: 'Delivered'
93
+ },
94
+ {
95
+ id: '2',
96
+ address: 'Customer B - 200 Second Ave',
97
+ lat: 37.7849,
98
+ lng: -122.4094,
99
+ status: 'In Transit'
100
+ },
101
+ {
102
+ id: '3',
103
+ address: 'Customer C - 300 Third Blvd',
104
+ lat: 37.7649,
105
+ lng: -122.4294,
106
+ status: 'Pending'
107
+ }
108
+ ],
109
+ center: {
110
+ latitude: 37.7749,
111
+ longitude: -122.4194
112
+ },
113
+ zoom: 13,
114
+ className: 'w-full h-[500px]'
115
+ } as any,
116
+ };
@@ -0,0 +1,118 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { SchemaRenderer, SchemaRendererProvider } from '@object-ui/react';
3
+ import type { BaseSchema } from '@object-ui/types';
4
+ import { createStorybookDataSource } from '@storybook-config/datasource';
5
+
6
+ const meta = {
7
+ title: 'Views/Object View',
8
+ component: SchemaRenderer,
9
+ parameters: {
10
+ layout: 'padded',
11
+ },
12
+ tags: ['autodocs'],
13
+ argTypes: {
14
+ schema: { table: { disable: true } },
15
+ },
16
+ } satisfies Meta<any>;
17
+
18
+ export default meta;
19
+ type Story = StoryObj<typeof meta>;
20
+
21
+ // Create a DataSource instance that connects to MSW
22
+ const dataSource = createStorybookDataSource();
23
+
24
+ const renderStory = (args: any) => (
25
+ <SchemaRendererProvider dataSource={dataSource}>
26
+ <SchemaRenderer schema={args as unknown as BaseSchema} />
27
+ </SchemaRendererProvider>
28
+ );
29
+
30
+ export const UserProfile: Story = {
31
+ render: renderStory,
32
+ args: {
33
+ type: 'object-view',
34
+ objectName: 'User',
35
+ layout: 'card',
36
+ data: {
37
+ id: 1,
38
+ name: 'John Doe',
39
+ email: 'john.doe@example.com',
40
+ role: 'Administrator',
41
+ status: 'Active',
42
+ joinedDate: '2023-01-15',
43
+ department: 'Engineering'
44
+ },
45
+ fields: [
46
+ { name: 'id', label: 'User ID', type: 'text' },
47
+ { name: 'name', label: 'Full Name', type: 'text' },
48
+ { name: 'email', label: 'Email Address', type: 'email' },
49
+ { name: 'role', label: 'Role', type: 'text' },
50
+ { name: 'status', label: 'Status', type: 'badge' },
51
+ { name: 'joinedDate', label: 'Joined Date', type: 'date' },
52
+ { name: 'department', label: 'Department', type: 'text' }
53
+ ],
54
+ className: 'w-full max-w-2xl'
55
+ } as any,
56
+ };
57
+
58
+ export const ProductDetails: Story = {
59
+ render: renderStory,
60
+ args: {
61
+ type: 'object-view',
62
+ objectName: 'Product',
63
+ layout: 'table',
64
+ data: {
65
+ sku: 'PROD-12345',
66
+ name: 'Professional Laptop',
67
+ category: 'Electronics',
68
+ brand: 'TechCorp',
69
+ price: 1299.99,
70
+ stock: 45,
71
+ description: 'High-performance laptop for professionals',
72
+ rating: 4.5,
73
+ reviews: 128
74
+ },
75
+ fields: [
76
+ { name: 'sku', label: 'SKU', type: 'text' },
77
+ { name: 'name', label: 'Product Name', type: 'text' },
78
+ { name: 'category', label: 'Category', type: 'text' },
79
+ { name: 'brand', label: 'Brand', type: 'text' },
80
+ { name: 'price', label: 'Price', type: 'currency' },
81
+ { name: 'stock', label: 'In Stock', type: 'number' },
82
+ { name: 'description', label: 'Description', type: 'textarea' },
83
+ { name: 'rating', label: 'Rating', type: 'number' },
84
+ { name: 'reviews', label: 'Reviews', type: 'number' }
85
+ ],
86
+ className: 'w-full max-w-3xl'
87
+ } as any,
88
+ };
89
+
90
+ export const OrderSummary: Story = {
91
+ render: renderStory,
92
+ args: {
93
+ type: 'object-view',
94
+ objectName: 'Order',
95
+ layout: 'card',
96
+ data: {
97
+ orderId: 'ORD-98765',
98
+ customer: 'Alice Johnson',
99
+ orderDate: '2024-01-20',
100
+ total: 456.78,
101
+ status: 'Processing',
102
+ shippingAddress: '456 Oak Street, San Francisco, CA 94102',
103
+ items: 3,
104
+ trackingNumber: 'TRK123456789'
105
+ },
106
+ fields: [
107
+ { name: 'orderId', label: 'Order ID', type: 'text' },
108
+ { name: 'customer', label: 'Customer Name', type: 'text' },
109
+ { name: 'orderDate', label: 'Order Date', type: 'date' },
110
+ { name: 'total', label: 'Total Amount', type: 'currency' },
111
+ { name: 'status', label: 'Status', type: 'badge' },
112
+ { name: 'shippingAddress', label: 'Shipping Address', type: 'textarea' },
113
+ { name: 'items', label: 'Number of Items', type: 'number' },
114
+ { name: 'trackingNumber', label: 'Tracking Number', type: 'text' }
115
+ ],
116
+ className: 'w-full max-w-2xl'
117
+ } as any,
118
+ };