robobyte-front-builder 1.0.19 → 1.0.21

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 (513) hide show
  1. package/README.md +211 -0
  2. package/next.config.js +19 -48
  3. package/package.json +39 -85
  4. package/src/context/BuilderContext.jsx +134 -6
  5. package/src/context/SystemContext.js +2 -2
  6. package/src/hooks/useGlobalStore.js +36 -0
  7. package/src/hooks/useTimerEngine.js +54 -0
  8. package/src/lib/index.js +11 -3
  9. package/src/lib/layouts/BlankLayout.jsx +13 -0
  10. package/src/lib/providers/RoboByteFrontBuilderProvider.jsx +61 -7
  11. package/src/lib/themes/builderTheme.js +41 -0
  12. package/src/pages/_app.js +32 -134
  13. package/src/pages/api/ai.js +87 -0
  14. package/src/pages/builders/report/index.js +1 -0
  15. package/src/pages/builders/report/list/index.js +1 -0
  16. package/src/pages/builders/report/viewer/index.js +1 -0
  17. package/src/pages/index.js +88 -37
  18. package/src/pages/printBuilder/index.jsx +263 -0
  19. package/src/pages/printBuilder/layouts/index.jsx +298 -0
  20. package/src/pages/reportModule/reportBuilder/index.js +8 -6
  21. package/src/pages/reportModule/reportBuilder/reportViewer/index.js +33 -22
  22. package/src/pages/reportModule/reportBuilder/reports/index.js +3 -5
  23. package/src/pages/reportModule/reportBuilder/reportsPermissions/index.js +2 -3
  24. package/src/pages/viewBuilder/index.jsx +117 -32
  25. package/src/pages/viewBuilder/views/index.js +3 -3
  26. package/src/pages/viewer/[id]/index.js +2 -1
  27. package/src/services/DeleteService.js +31 -60
  28. package/src/services/Endpoints/PrintLayoutEndpoints.js +42 -0
  29. package/src/services/Endpoints.js +2 -0
  30. package/src/services/GetService.js +33 -54
  31. package/src/services/PatchService.js +38 -65
  32. package/src/services/PostService.js +37 -63
  33. package/src/services/UpdateService.js +39 -65
  34. package/src/services/builderHelper/actionExecutor.js +141 -25
  35. package/src/services/builderHelper/builderHelper.js +92 -0
  36. package/src/services/builderHelper/colorSchema.js +95 -0
  37. package/src/services/builderHelper/iconResolver.js +50 -0
  38. package/src/services/builderHelper/jsExecutor.js +212 -46
  39. package/src/services/builderHelper/nodeFactory.js +32 -15
  40. package/src/services/builderHelper/numberFormat.js +123 -0
  41. package/src/services/builderHelper/resolveProps.js +73 -4
  42. package/src/services/builderHelper/thresholdEngine.js +77 -0
  43. package/src/services/builderHelper/tree.js +31 -0
  44. package/src/services/components/agGridAutoComplete.js +5 -9
  45. package/src/services/config.js +9 -1
  46. package/src/services/globalStore.js +80 -0
  47. package/src/services/helper/multiSelectEditor.js +5 -9
  48. package/src/services/helper/multiSelectEditorByBuilder.js +5 -9
  49. package/src/services/reportData/fetchReportData.js +69 -28
  50. package/src/services/routerRef.js +35 -0
  51. package/src/views/ConfirmDialog.js +2 -2
  52. package/src/views/builder/JSEditor.js +105 -107
  53. package/src/views/builder/inspector/Inspector.jsx +6 -9
  54. package/src/views/builder/inspector/Tabs/ComponentActionsTab.jsx +7 -13
  55. package/src/views/builder/inspector/Tabs/MainTab.jsx +143 -25
  56. package/src/views/builder/inspector/Tabs/RulesTab.jsx +9 -24
  57. package/src/views/builder/inspector/Tabs/StyleTab.jsx +9 -24
  58. package/src/views/builder/inspector/definitions/autocomplete/main.js +4 -6
  59. package/src/views/builder/inspector/definitions/banner/actions.js +7 -0
  60. package/src/views/builder/inspector/definitions/banner/main.js +22 -0
  61. package/src/views/builder/inspector/definitions/banner/rules.js +1 -0
  62. package/src/views/builder/inspector/definitions/banner/style.js +1 -0
  63. package/src/views/builder/inspector/definitions/breadcrumb/main.js +43 -6
  64. package/src/views/builder/inspector/definitions/button/main.js +11 -12
  65. package/src/views/builder/inspector/definitions/button/style.js +18 -30
  66. package/src/views/builder/inspector/definitions/checkbox/actions.js +3 -1
  67. package/src/views/builder/inspector/definitions/checkbox/main.js +4 -6
  68. package/src/views/builder/inspector/definitions/common/main.js +13 -2
  69. package/src/views/builder/inspector/definitions/dataGrid/main.js +23 -0
  70. package/src/views/builder/inspector/definitions/dataTableViewer/main.js +46 -0
  71. package/src/views/builder/inspector/definitions/datepicker/actions.js +3 -1
  72. package/src/views/builder/inspector/definitions/datepicker/main.js +6 -14
  73. package/src/views/builder/inspector/definitions/dialog/main.js +36 -0
  74. package/src/views/builder/inspector/definitions/dropdown/main.js +5 -8
  75. package/src/views/builder/inspector/definitions/excelUpload/actions.js +23 -0
  76. package/src/views/builder/inspector/definitions/excelUpload/main.js +17 -0
  77. package/src/views/builder/inspector/definitions/excelUpload/rules.js +1 -0
  78. package/src/views/builder/inspector/definitions/excelUpload/style.js +45 -0
  79. package/src/views/builder/inspector/definitions/header/main.js +10 -1
  80. package/src/views/builder/inspector/definitions/index.js +106 -19
  81. package/src/views/builder/inspector/definitions/input/actions.js +4 -1
  82. package/src/views/builder/inspector/definitions/input/main.js +20 -11
  83. package/src/views/builder/inspector/definitions/kpi/avatarGroup.js +22 -0
  84. package/src/views/builder/inspector/definitions/kpi/badge.js +17 -0
  85. package/src/views/builder/inspector/definitions/kpi/bulletChart.js +47 -0
  86. package/src/views/builder/inspector/definitions/kpi/chart.js +55 -0
  87. package/src/views/builder/inspector/definitions/kpi/colorScale.js +60 -0
  88. package/src/views/builder/inspector/definitions/kpi/comparisonBars.js +41 -0
  89. package/src/views/builder/inspector/definitions/kpi/countdown.js +46 -0
  90. package/src/views/builder/inspector/definitions/kpi/donut.js +51 -0
  91. package/src/views/builder/inspector/definitions/kpi/funnel.js +25 -0
  92. package/src/views/builder/inspector/definitions/kpi/gauge.js +39 -0
  93. package/src/views/builder/inspector/definitions/kpi/heatmapGrid.js +96 -0
  94. package/src/views/builder/inspector/definitions/kpi/iconBox.js +20 -0
  95. package/src/views/builder/inspector/definitions/kpi/metric.js +45 -0
  96. package/src/views/builder/inspector/definitions/kpi/rating.js +27 -0
  97. package/src/views/builder/inspector/definitions/kpi/statusDot.js +18 -0
  98. package/src/views/builder/inspector/definitions/kpi/stepStage.js +65 -0
  99. package/src/views/builder/inspector/definitions/kpi/tagList.js +32 -0
  100. package/src/views/builder/inspector/definitions/kpi/timeline.js +80 -0
  101. package/src/views/builder/inspector/definitions/kpi/trend.js +20 -0
  102. package/src/views/builder/inspector/definitions/label/main.js +10 -1
  103. package/src/views/builder/inspector/definitions/layout/main.js +27 -3
  104. package/src/views/builder/inspector/definitions/number/main.js +6 -14
  105. package/src/views/builder/inspector/definitions/pageNumber/main.js +21 -0
  106. package/src/views/builder/inspector/definitions/popover/main.js +71 -0
  107. package/src/views/builder/inspector/definitions/radio/main.js +5 -8
  108. package/src/views/builder/inspector/definitions/repeater/main.js +31 -0
  109. package/src/views/builder/inspector/definitions/reportViewer/main.js +15 -1
  110. package/src/views/builder/inspector/definitions/richtext/main.js +5 -8
  111. package/src/views/builder/inspector/definitions/signature/main.js +4 -1
  112. package/src/views/builder/inspector/definitions/tag/main.js +5 -8
  113. package/src/views/builder/inspector/definitions/textarea/actions.js +4 -1
  114. package/src/views/builder/inspector/definitions/textarea/main.js +5 -7
  115. package/src/views/builder/inspector/definitions/time/main.js +5 -8
  116. package/src/views/builder/inspector/definitions/toggle/main.js +5 -19
  117. package/src/views/builder/inspector/definitions/treeView/main.js +61 -0
  118. package/src/views/builder/inspector/definitions/viewRenderer/main.js +53 -0
  119. package/src/views/builder/inspector/definitions/wizard/main.js +68 -0
  120. package/src/views/builder/inspector/definitions/wizard-step/main.js +25 -0
  121. package/src/views/builder/inspector/fields/ActionsConfigEditor.jsx +426 -0
  122. package/src/views/builder/inspector/fields/ColorSchemaField.jsx +140 -0
  123. package/src/views/builder/inspector/fields/ColumnFunctionEditor.jsx +238 -0
  124. package/src/views/builder/inspector/fields/ColumnMappingEditor.jsx +105 -0
  125. package/src/views/builder/inspector/fields/ColumnsConfigEditor.jsx +506 -0
  126. package/src/views/builder/inspector/fields/DonutRingsEditorField.jsx +337 -0
  127. package/src/views/builder/inspector/fields/ExtraColsEditor.jsx +618 -0
  128. package/src/views/builder/inspector/fields/FunctionHelpPopover.jsx +295 -0
  129. package/src/views/builder/inspector/fields/IconEditor.jsx +64 -0
  130. package/src/views/builder/inspector/fields/KpiActionField.jsx +223 -0
  131. package/src/views/builder/inspector/fields/MarkersEditorField.jsx +173 -0
  132. package/src/views/builder/inspector/fields/SelectEditor.jsx +9 -5
  133. package/src/views/builder/inspector/fields/SeriesEditorField.jsx +363 -0
  134. package/src/views/builder/inspector/fields/TableColumnsEditor.jsx +104 -0
  135. package/src/views/builder/inspector/fields/ThresholdsEditor.jsx +247 -0
  136. package/src/views/builder/inspector/fields/ValueFunctionsRefPanel.jsx +217 -0
  137. package/src/views/builder/inspector/fields/columnEditorShared.jsx +217 -0
  138. package/src/views/builder/sidebar/Sidebar.jsx +4 -2
  139. package/src/views/builder/sidebar/SidebarTabs.jsx +28 -17
  140. package/src/views/builder/sidebar/tabs/ActionsTab.jsx +7 -3
  141. package/src/views/builder/sidebar/tabs/AiTab/AiPreviewDialog.jsx +193 -0
  142. package/src/views/builder/sidebar/tabs/AiTab/aiProvider.js +49 -0
  143. package/src/views/builder/sidebar/tabs/AiTab/index.jsx +409 -0
  144. package/src/views/builder/sidebar/tabs/AiTab/schemaTransformer.js +102 -0
  145. package/src/views/builder/sidebar/tabs/AiTab/schemaValidator.js +64 -0
  146. package/src/views/builder/sidebar/tabs/AiTab/systemPrompt.js +1151 -0
  147. package/src/views/builder/sidebar/tabs/Components/ComponentsTab.jsx +31 -31
  148. package/src/views/builder/sidebar/tabs/Components/componentCatalog.js +43 -21
  149. package/src/views/builder/sidebar/tabs/Components/printComponentCatalog.js +81 -0
  150. package/src/views/builder/sidebar/tabs/TimersTab.jsx +338 -0
  151. package/src/views/builder/sidebar/tabs/TreeTab.jsx +13 -4
  152. package/src/views/builder/sidebar/tabs/ViewTab.jsx +1 -1
  153. package/src/views/builder/viewer/AdornedLabel.jsx +82 -0
  154. package/src/views/builder/viewer/ComponentRenderer.jsx +98 -24
  155. package/src/views/builder/viewer/DialogsZone.jsx +259 -0
  156. package/src/views/builder/viewer/FieldLabel.jsx +106 -0
  157. package/src/views/builder/viewer/PrintDialog.jsx +481 -0
  158. package/src/views/builder/viewer/ProductionViewer.jsx +80 -5
  159. package/src/views/builder/viewer/Viewer.jsx +106 -8
  160. package/src/views/builder/viewer/ViewerComponentWrapper.jsx +61 -4
  161. package/src/views/builder/viewer/ViewerToolbar.jsx +273 -59
  162. package/src/views/builder/viewer/renderers/AutoCompleteRenderer.jsx +26 -22
  163. package/src/views/builder/viewer/renderers/AvatarGroupRenderer.jsx +112 -0
  164. package/src/views/builder/viewer/renderers/BadgeRenderer.jsx +79 -0
  165. package/src/views/builder/viewer/renderers/BannerRenderer.jsx +62 -0
  166. package/src/views/builder/viewer/renderers/BreadcrumbRenderer.jsx +203 -15
  167. package/src/views/builder/viewer/renderers/BulletChartRenderer.jsx +147 -0
  168. package/src/views/builder/viewer/renderers/ButtonRenderer.jsx +98 -39
  169. package/src/views/builder/viewer/renderers/CardRenderer.jsx +1 -1
  170. package/src/views/builder/viewer/renderers/ChartRenderer.jsx +388 -0
  171. package/src/views/builder/viewer/renderers/CheckboxRenderer.jsx +17 -9
  172. package/src/views/builder/viewer/renderers/ColorScaleRenderer.jsx +300 -0
  173. package/src/views/builder/viewer/renderers/ComparisonBarsRenderer.jsx +133 -0
  174. package/src/views/builder/viewer/renderers/ContainerRenderer.jsx +3 -1
  175. package/src/views/builder/viewer/renderers/CountdownRenderer.jsx +249 -0
  176. package/src/views/builder/viewer/renderers/DataGridRenderer.jsx +380 -0
  177. package/src/views/builder/viewer/renderers/DataTableViewerRenderer.jsx +240 -0
  178. package/src/views/builder/viewer/renderers/DatePickerRenderer.jsx +25 -24
  179. package/src/views/builder/viewer/renderers/DialogRenderer.jsx +327 -0
  180. package/src/views/builder/viewer/renderers/DividerRenderer.jsx +1 -1
  181. package/src/views/builder/viewer/renderers/DonutRenderer.jsx +294 -0
  182. package/src/views/builder/viewer/renderers/DropdownRenderer.jsx +36 -44
  183. package/src/views/builder/viewer/renderers/ExcelUploadRenderer.jsx +639 -0
  184. package/src/views/builder/viewer/renderers/FunnelRenderer.jsx +93 -0
  185. package/src/views/builder/viewer/renderers/GaugeRenderer.jsx +159 -0
  186. package/src/views/builder/viewer/renderers/HeaderRenderer.jsx +31 -9
  187. package/src/views/builder/viewer/renderers/HeatmapGridRenderer.jsx +432 -0
  188. package/src/views/builder/viewer/renderers/IconBoxRenderer.jsx +59 -0
  189. package/src/views/builder/viewer/renderers/ImageRenderer.jsx +1 -1
  190. package/src/views/builder/viewer/renderers/InputRenderer.jsx +75 -18
  191. package/src/views/builder/viewer/renderers/LabelRenderer.jsx +35 -9
  192. package/src/views/builder/viewer/renderers/LayoutCellRenderer.jsx +102 -40
  193. package/src/views/builder/viewer/renderers/LayoutContextMenu.jsx +8 -8
  194. package/src/views/builder/viewer/renderers/LayoutRenderer.jsx +48 -6
  195. package/src/views/builder/viewer/renderers/LinkRenderer.jsx +1 -1
  196. package/src/views/builder/viewer/renderers/MenuRenderer.jsx +2 -2
  197. package/src/views/builder/viewer/renderers/MetricRenderer.jsx +80 -0
  198. package/src/views/builder/viewer/renderers/NumberFormatRenderer.jsx +21 -30
  199. package/src/views/builder/viewer/renderers/PageNumberRenderer.jsx +76 -0
  200. package/src/views/builder/viewer/renderers/PopoverRenderer.jsx +350 -0
  201. package/src/views/builder/viewer/renderers/ProgressCircleRenderer.jsx +1 -1
  202. package/src/views/builder/viewer/renderers/ProgressLineRenderer.jsx +1 -1
  203. package/src/views/builder/viewer/renderers/RadioGroupRenderer.jsx +28 -39
  204. package/src/views/builder/viewer/renderers/RatingRenderer.jsx +80 -0
  205. package/src/views/builder/viewer/renderers/RepeaterRenderer.jsx +297 -38
  206. package/src/views/builder/viewer/renderers/ReportViewerRenderer.jsx +219 -5
  207. package/src/views/builder/viewer/renderers/RichTextRenderer.jsx +60 -66
  208. package/src/views/builder/viewer/renderers/RowActionsCell.jsx +308 -0
  209. package/src/views/builder/viewer/renderers/SignatureRenderer.jsx +33 -62
  210. package/src/views/builder/viewer/renderers/StatusDotRenderer.jsx +75 -0
  211. package/src/views/builder/viewer/renderers/StepStageRenderer.jsx +348 -0
  212. package/src/views/builder/viewer/renderers/TagListRenderer.jsx +115 -0
  213. package/src/views/builder/viewer/renderers/TagPickerRenderer.jsx +31 -45
  214. package/src/views/builder/viewer/renderers/TextAreaRenderer.jsx +25 -18
  215. package/src/views/builder/viewer/renderers/TextRenderer.jsx +7 -1
  216. package/src/views/builder/viewer/renderers/TimePickerRenderer.jsx +25 -24
  217. package/src/views/builder/viewer/renderers/TimelineRenderer.jsx +525 -0
  218. package/src/views/builder/viewer/renderers/ToggleRenderer.jsx +21 -27
  219. package/src/views/builder/viewer/renderers/TreeViewRenderer.jsx +832 -0
  220. package/src/views/builder/viewer/renderers/TrendRenderer.jsx +66 -0
  221. package/src/views/builder/viewer/renderers/ViewRendererRenderer.jsx +315 -0
  222. package/src/views/builder/viewer/renderers/WizardRenderer.jsx +380 -64
  223. package/src/views/builder/viewer/renderers/WizardStepRenderer.jsx +21 -12
  224. package/src/views/builder/viewer/renderers/dataGridComponents.jsx +824 -0
  225. package/src/views/customFilter/CustomFilterDialog.js +1023 -660
  226. package/src/views/customFilter/FixedFilterDialog.js +649 -0
  227. package/src/views/customFilter/SearchFilterDialog.js +248 -0
  228. package/src/views/genericTable/BuilderExpressionParams.js +3 -3
  229. package/src/views/genericTable/ColumnConfiguratorDialog.js +33 -24
  230. package/src/views/genericTable/FixedFilterDialog.js +3 -2
  231. package/src/views/genericTable/FormattingSettingsDialog.js +8 -3
  232. package/src/views/genericTable/SGrid.js +198 -97
  233. package/src/views/genericTable/SearchFilterDialog.js +3 -2
  234. package/src/views/genericTable/cellEditors/autocompleteEditor.js +5 -9
  235. package/src/views/genericTable/convertStringFunctions.js +274 -138
  236. package/src/views/genericTable/statusBar/rowCountStatusBar.js +3 -1
  237. package/src/views/genericTable/updateRefHelpers.js +9 -6
  238. package/src/views/printBuilder/PrintBuilderViewer.jsx +607 -0
  239. package/src/views/printBuilder/PrintPreviewCanvas.jsx +157 -0
  240. package/src/views/rolePermissions/UpdateReportPermissionDialog.js +3 -2
  241. package/src/@core/components/auth/AclGuard.js +0 -55
  242. package/src/@core/components/auth/AuthGuard.js +0 -40
  243. package/src/@core/components/auth/GuestGuard.js +0 -30
  244. package/src/@core/components/custom-inputs/Horizontal.jsx +0 -143
  245. package/src/@core/components/custom-inputs/Image.jsx +0 -78
  246. package/src/@core/components/custom-inputs/Vertical.jsx +0 -113
  247. package/src/@core/components/customizer/index.jsx +0 -470
  248. package/src/@core/components/customizer/styles.module.css +0 -169
  249. package/src/@core/components/mui/Avatar.jsx +0 -41
  250. package/src/@core/components/mui/Badge.jsx +0 -20
  251. package/src/@core/components/mui/IconButton.jsx +0 -74
  252. package/src/@core/components/mui/TabList.jsx +0 -60
  253. package/src/@core/components/option-menu/index.jsx +0 -137
  254. package/src/@core/components/scroll-to-top/index.jsx +0 -43
  255. package/src/@core/components/spinner/index.js +0 -26
  256. package/src/@core/components/window-wrapper/index.js +0 -27
  257. package/src/@core/contexts/settingsContext.jsx +0 -98
  258. package/src/@core/hooks/useBgColor.js +0 -63
  259. package/src/@core/hooks/useImageVariant.js +0 -27
  260. package/src/@core/hooks/useLayoutInit.js +0 -37
  261. package/src/@core/hooks/useObjectCookie.js +0 -18
  262. package/src/@core/hooks/useSettings.jsx +0 -15
  263. package/src/@core/layouts/BlankLayout.js +0 -37
  264. package/src/@core/layouts/BlankLayoutWithAppBar.js +0 -51
  265. package/src/@core/layouts/HorizontalLayout.jsx +0 -151
  266. package/src/@core/layouts/Layout.js +0 -39
  267. package/src/@core/layouts/VerticalLayout.jsx +0 -124
  268. package/src/@core/layouts/components/blank-layout-with-appBar/index.js +0 -115
  269. package/src/@core/layouts/components/horizontal/app-bar-content/index.js +0 -67
  270. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavGroup.js +0 -352
  271. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavItems.js +0 -21
  272. package/src/@core/layouts/components/horizontal/navigation/HorizontalNavLink.js +0 -195
  273. package/src/@core/layouts/components/horizontal/navigation/index.js +0 -31
  274. package/src/@core/layouts/components/shared-components/LanguageDropdown.js +0 -96
  275. package/src/@core/layouts/components/shared-components/ModeToggler.js +0 -32
  276. package/src/@core/layouts/components/shared-components/NotificationDropdown.js +0 -226
  277. package/src/@core/layouts/components/shared-components/UserDropdown.js +0 -177
  278. package/src/@core/layouts/components/shared-components/footer/FooterContent.js +0 -46
  279. package/src/@core/layouts/components/shared-components/footer/index.js +0 -61
  280. package/src/@core/layouts/components/vertical/appBar/index.js +0 -74
  281. package/src/@core/layouts/components/vertical/navigation/Drawer.js +0 -122
  282. package/src/@core/layouts/components/vertical/navigation/VerticalNavGroup.js +0 -435
  283. package/src/@core/layouts/components/vertical/navigation/VerticalNavHeader.js +0 -180
  284. package/src/@core/layouts/components/vertical/navigation/VerticalNavItems.js +0 -26
  285. package/src/@core/layouts/components/vertical/navigation/VerticalNavLink.js +0 -258
  286. package/src/@core/layouts/components/vertical/navigation/VerticalNavSectionTitle.js +0 -102
  287. package/src/@core/layouts/components/vertical/navigation/index.js +0 -169
  288. package/src/@core/layouts/utils.js +0 -69
  289. package/src/@core/styles/Table.module.css +0 -93
  290. package/src/@core/styles/horizontal/menuItemStyles.js +0 -100
  291. package/src/@core/styles/horizontal/menuRootStyles.js +0 -19
  292. package/src/@core/styles/libs/fullcalendar/index.js +0 -461
  293. package/src/@core/styles/libs/keen-slider/index.js +0 -111
  294. package/src/@core/styles/libs/react-apexcharts/index.js +0 -107
  295. package/src/@core/styles/libs/react-cleave/index.js +0 -33
  296. package/src/@core/styles/libs/react-credit-cards/index.js +0 -11
  297. package/src/@core/styles/libs/react-datepicker/index.js +0 -388
  298. package/src/@core/styles/libs/react-draft-wysiwyg/index.js +0 -144
  299. package/src/@core/styles/libs/react-dropzone/index.js +0 -76
  300. package/src/@core/styles/libs/react-hot-toast/index.js +0 -37
  301. package/src/@core/styles/libs/recharts/index.js +0 -47
  302. package/src/@core/styles/stepper.js +0 -103
  303. package/src/@core/styles/vertical/menuItemStyles.js +0 -138
  304. package/src/@core/styles/vertical/menuSectionStyles.js +0 -54
  305. package/src/@core/styles/vertical/navigationCustomStyles.js +0 -62
  306. package/src/@core/svg/ContentCompact.jsx +0 -17
  307. package/src/@core/svg/ContentWide.jsx +0 -17
  308. package/src/@core/svg/DirectionLtr.jsx +0 -93
  309. package/src/@core/svg/DirectionRtl.jsx +0 -93
  310. package/src/@core/svg/LayoutCollapsed.jsx +0 -59
  311. package/src/@core/svg/LayoutHorizontal.jsx +0 -42
  312. package/src/@core/svg/LayoutVertical.jsx +0 -59
  313. package/src/@core/svg/Logo.jsx +0 -76
  314. package/src/@core/svg/SkinBordered.jsx +0 -54
  315. package/src/@core/svg/SkinDefault.jsx +0 -59
  316. package/src/@core/tailwind/plugin.js +0 -78
  317. package/src/@core/theme/ThemeComponent.js +0 -63
  318. package/src/@core/theme/ThemeOptions.js +0 -71
  319. package/src/@core/theme/breakpoints/index.js +0 -11
  320. package/src/@core/theme/colorSchemes.js +0 -326
  321. package/src/@core/theme/customShadows.js +0 -11
  322. package/src/@core/theme/globalStyles.js +0 -81
  323. package/src/@core/theme/index.js +0 -42
  324. package/src/@core/theme/overrides/accordion.js +0 -51
  325. package/src/@core/theme/overrides/accordion.jsx +0 -85
  326. package/src/@core/theme/overrides/alerts.js +0 -110
  327. package/src/@core/theme/overrides/alerts.jsx +0 -180
  328. package/src/@core/theme/overrides/autocomplete.js +0 -14
  329. package/src/@core/theme/overrides/autocomplete.jsx +0 -68
  330. package/src/@core/theme/overrides/avatar.js +0 -38
  331. package/src/@core/theme/overrides/avatars.js +0 -27
  332. package/src/@core/theme/overrides/backdrop.js +0 -22
  333. package/src/@core/theme/overrides/badges.js +0 -16
  334. package/src/@core/theme/overrides/breadcrumbs.js +0 -11
  335. package/src/@core/theme/overrides/button-group.js +0 -84
  336. package/src/@core/theme/overrides/button.js +0 -93
  337. package/src/@core/theme/overrides/buttonGroup.js +0 -9
  338. package/src/@core/theme/overrides/card.js +0 -83
  339. package/src/@core/theme/overrides/checkbox.jsx +0 -95
  340. package/src/@core/theme/overrides/chip.js +0 -72
  341. package/src/@core/theme/overrides/dataGrid.js +0 -114
  342. package/src/@core/theme/overrides/dateTimePicker.js +0 -65
  343. package/src/@core/theme/overrides/dialog.js +0 -120
  344. package/src/@core/theme/overrides/divider.js +0 -13
  345. package/src/@core/theme/overrides/drawer.js +0 -20
  346. package/src/@core/theme/overrides/fab.js +0 -13
  347. package/src/@core/theme/overrides/form-control-label.js +0 -19
  348. package/src/@core/theme/overrides/icon-button.js +0 -145
  349. package/src/@core/theme/overrides/index.js +0 -103
  350. package/src/@core/theme/overrides/input.js +0 -72
  351. package/src/@core/theme/overrides/link.js +0 -9
  352. package/src/@core/theme/overrides/list.js +0 -44
  353. package/src/@core/theme/overrides/menu.js +0 -25
  354. package/src/@core/theme/overrides/pagination.js +0 -41
  355. package/src/@core/theme/overrides/paper.js +0 -9
  356. package/src/@core/theme/overrides/popover.js +0 -16
  357. package/src/@core/theme/overrides/progress.js +0 -38
  358. package/src/@core/theme/overrides/radio.jsx +0 -80
  359. package/src/@core/theme/overrides/rating.js +0 -16
  360. package/src/@core/theme/overrides/rating.jsx +0 -32
  361. package/src/@core/theme/overrides/select.js +0 -19
  362. package/src/@core/theme/overrides/select.jsx +0 -52
  363. package/src/@core/theme/overrides/slider.js +0 -97
  364. package/src/@core/theme/overrides/snackbar.js +0 -19
  365. package/src/@core/theme/overrides/switch.js +0 -73
  366. package/src/@core/theme/overrides/switches.js +0 -25
  367. package/src/@core/theme/overrides/table-pagination.js +0 -39
  368. package/src/@core/theme/overrides/table.js +0 -81
  369. package/src/@core/theme/overrides/tabs.js +0 -30
  370. package/src/@core/theme/overrides/timeline.js +0 -80
  371. package/src/@core/theme/overrides/toggle-button.js +0 -33
  372. package/src/@core/theme/overrides/toggleButton.js +0 -16
  373. package/src/@core/theme/overrides/tooltip.js +0 -21
  374. package/src/@core/theme/overrides/typography.js +0 -13
  375. package/src/@core/theme/palette/index.js +0 -107
  376. package/src/@core/theme/shadows/index.js +0 -61
  377. package/src/@core/theme/shadows.js +0 -12
  378. package/src/@core/theme/spacing/index.js +0 -3
  379. package/src/@core/theme/spacing.js +0 -5
  380. package/src/@core/theme/typography/index.js +0 -65
  381. package/src/@core/theme/typography.js +0 -84
  382. package/src/@core/utils/create-emotion-cache.js +0 -5
  383. package/src/@core/utils/hex-to-rgba.js +0 -11
  384. package/src/@core/utils/serverHelpers.js +0 -45
  385. package/src/@menu/components/RouterLink.jsx +0 -18
  386. package/src/@menu/components/horizontal-menu/HorizontalNav.jsx +0 -88
  387. package/src/@menu/components/horizontal-menu/Menu.jsx +0 -83
  388. package/src/@menu/components/horizontal-menu/MenuButton.jsx +0 -100
  389. package/src/@menu/components/horizontal-menu/MenuItem.jsx +0 -183
  390. package/src/@menu/components/horizontal-menu/SubMenu.jsx +0 -418
  391. package/src/@menu/components/horizontal-menu/SubMenuContent.jsx +0 -41
  392. package/src/@menu/components/horizontal-menu/VerticalNavInHorizontal.jsx +0 -20
  393. package/src/@menu/components/vertical-menu/Menu.jsx +0 -161
  394. package/src/@menu/components/vertical-menu/MenuButton.jsx +0 -95
  395. package/src/@menu/components/vertical-menu/MenuItem.jsx +0 -180
  396. package/src/@menu/components/vertical-menu/MenuSection.jsx +0 -124
  397. package/src/@menu/components/vertical-menu/NavCollapseIcons.jsx +0 -70
  398. package/src/@menu/components/vertical-menu/NavHeader.jsx +0 -39
  399. package/src/@menu/components/vertical-menu/SubMenu.jsx +0 -420
  400. package/src/@menu/components/vertical-menu/SubMenuContent.jsx +0 -101
  401. package/src/@menu/components/vertical-menu/VerticalNav.jsx +0 -216
  402. package/src/@menu/contexts/horizontalNavContext.jsx +0 -29
  403. package/src/@menu/contexts/verticalNavContext.jsx +0 -65
  404. package/src/@menu/defaultConfigs.js +0 -12
  405. package/src/@menu/hooks/useHorizontalMenu.jsx +0 -19
  406. package/src/@menu/hooks/useHorizontalNav.jsx +0 -19
  407. package/src/@menu/hooks/useMediaQuery.jsx +0 -29
  408. package/src/@menu/hooks/useVerticalMenu.jsx +0 -19
  409. package/src/@menu/hooks/useVerticalNav.jsx +0 -19
  410. package/src/@menu/horizontal-menu/index.jsx +0 -8
  411. package/src/@menu/styles/StyledBackdrop.jsx +0 -15
  412. package/src/@menu/styles/StyledMenuIcon.jsx +0 -12
  413. package/src/@menu/styles/StyledMenuLabel.jsx +0 -16
  414. package/src/@menu/styles/StyledMenuPrefix.jsx +0 -10
  415. package/src/@menu/styles/StyledMenuSectionLabel.jsx +0 -21
  416. package/src/@menu/styles/StyledMenuSuffix.jsx +0 -10
  417. package/src/@menu/styles/StyledSubMenuContent.jsx +0 -43
  418. package/src/@menu/styles/horizontal/StyledHorizontalMenu.jsx +0 -13
  419. package/src/@menu/styles/horizontal/StyledHorizontalMenuItem.jsx +0 -26
  420. package/src/@menu/styles/horizontal/StyledHorizontalNav.jsx +0 -11
  421. package/src/@menu/styles/horizontal/StyledHorizontalNavExpandIcon.jsx +0 -33
  422. package/src/@menu/styles/horizontal/StyledHorizontalSubMenuContent.jsx +0 -18
  423. package/src/@menu/styles/horizontal/StyledHorizontalSubMenuContentWrapper.jsx +0 -10
  424. package/src/@menu/styles/horizontal/horizontalUl.module.css +0 -15
  425. package/src/@menu/styles/styles.module.css +0 -5
  426. package/src/@menu/styles/vertical/StyledVerticalMenu.jsx +0 -16
  427. package/src/@menu/styles/vertical/StyledVerticalMenuItem.jsx +0 -28
  428. package/src/@menu/styles/vertical/StyledVerticalMenuSection.jsx +0 -23
  429. package/src/@menu/styles/vertical/StyledVerticalNav.jsx +0 -67
  430. package/src/@menu/styles/vertical/StyledVerticalNavBgColorContainer.jsx +0 -15
  431. package/src/@menu/styles/vertical/StyledVerticalNavContainer.jsx +0 -23
  432. package/src/@menu/styles/vertical/StyledVerticalNavExpandIcon.jsx +0 -25
  433. package/src/@menu/styles/vertical/verticalNavBgImage.module.css +0 -10
  434. package/src/@menu/svg/ChevronRight.jsx +0 -9
  435. package/src/@menu/svg/Close.jsx +0 -12
  436. package/src/@menu/svg/RadioCircle.jsx +0 -12
  437. package/src/@menu/svg/RadioCircleMarked.jsx +0 -13
  438. package/src/@menu/utils/menuClasses.js +0 -44
  439. package/src/@menu/utils/menuUtils.jsx +0 -145
  440. package/src/@menu/vertical-menu/index.jsx +0 -11
  441. package/src/configs/acl.js +0 -115
  442. package/src/configs/auth.js +0 -5
  443. package/src/configs/aws-exports.js +0 -30
  444. package/src/configs/firebase.js +0 -25
  445. package/src/configs/i18n.js +0 -34
  446. package/src/configs/primaryColorConfig.js +0 -35
  447. package/src/configs/themeConfig.js +0 -44
  448. package/src/layouts/UserLayout.js +0 -94
  449. package/src/layouts/UserThemeOptions.js +0 -191
  450. package/src/layouts/components/Direction.js +0 -30
  451. package/src/layouts/components/HtmlTooltip.js +0 -15
  452. package/src/layouts/components/Translations.js +0 -11
  453. package/src/layouts/components/UserDropdown.js +0 -217
  454. package/src/layouts/components/UserIcon.js +0 -40
  455. package/src/layouts/components/acl/Can.js +0 -6
  456. package/src/layouts/components/acl/CanViewNavGroup.js +0 -36
  457. package/src/layouts/components/acl/CanViewNavLink.js +0 -17
  458. package/src/layouts/components/acl/CanViewNavSectionTitle.js +0 -17
  459. package/src/layouts/components/horizontal/AppBarContent.js +0 -39
  460. package/src/layouts/components/horizontal/ServerSideNavItems.js +0 -44
  461. package/src/layouts/components/mui/StepperComps.js +0 -55
  462. package/src/layouts/components/vertical/AppBarContent.js +0 -35
  463. package/src/layouts/components/vertical/ServerSideNavItems.js +0 -44
  464. package/src/libs/ApexCharts.jsx +0 -5
  465. package/src/libs/ReactPlayer.jsx +0 -5
  466. package/src/libs/Recharts.jsx +0 -4
  467. package/src/libs/auth.js +0 -124
  468. package/src/libs/styles/AppFullCalendar.js +0 -505
  469. package/src/libs/styles/AppKeenSlider.js +0 -116
  470. package/src/libs/styles/AppReactApexCharts.jsx +0 -110
  471. package/src/libs/styles/AppReactDatepicker.jsx +0 -470
  472. package/src/libs/styles/AppReactDropzone.js +0 -76
  473. package/src/libs/styles/AppReactToastify.jsx +0 -108
  474. package/src/libs/styles/AppRecharts.js +0 -55
  475. package/src/libs/styles/inputOtp.module.css +0 -39
  476. package/src/libs/styles/tiptapEditor.css +0 -72
  477. package/src/navigation/horizontal/index.js +0 -246
  478. package/src/navigation/vertical/index.js +0 -253
  479. package/src/pages/401.js +0 -70
  480. package/src/pages/404.js +0 -67
  481. package/src/pages/500.js +0 -68
  482. package/src/pages/[slug].js +0 -115
  483. package/src/pages/_document.js +0 -72
  484. package/src/pages/api/navigation/regenerate-registry.js +0 -116
  485. package/src/pages/api/navigation/save.js +0 -218
  486. package/src/pages/authModule/acl/index.js +0 -48
  487. package/src/pages/authModule/forgot-password/index.js +0 -228
  488. package/src/pages/authModule/permissions/rolePermissions/[id]/rolePermissionsUser/index.js +0 -392
  489. package/src/pages/authModule/permissions/rolePermissions/index.js +0 -343
  490. package/src/pages/authModule/permissions/systemPermissions/index.js +0 -354
  491. package/src/pages/authModule/privacy/index.js +0 -721
  492. package/src/pages/authModule/users/index.js +0 -210
  493. package/src/pages/login/index.js +0 -328
  494. package/src/pages/mainHome/index.js +0 -181
  495. package/src/views/builder/inspector/definitions/cell/main.js +0 -4
  496. package/src/views/builder/inspector/definitions/column/main.js +0 -9
  497. package/src/views/builder/inspector/definitions/column-group/main.js +0 -18
  498. package/src/views/builder/inspector/definitions/header-cell/main.js +0 -5
  499. package/src/views/builder/inspector/definitions/table/main.js +0 -9
  500. package/src/views/builder/viewer/renderers/CellRenderer.jsx +0 -71
  501. package/src/views/builder/viewer/renderers/ColumnGroupRenderer.jsx +0 -96
  502. package/src/views/builder/viewer/renderers/ColumnRenderer.jsx +0 -71
  503. package/src/views/builder/viewer/renderers/HeaderCellRenderer.jsx +0 -78
  504. package/src/views/builder/viewer/renderers/TabRenderer.jsx +0 -82
  505. package/src/views/builder/viewer/renderers/TableRenderer.jsx +0 -92
  506. package/src/views/pages/auth/FooterIllustrationsV2.js +0 -40
  507. package/src/views/pages/misc/FooterIllustrations.js +0 -47
  508. package/src/views/pages/misc/muiTable/CustomPagination.js +0 -34
  509. package/src/views/pages/users/UserManageDialog.js +0 -283
  510. package/src/views/pages/users/UserViewPage.js +0 -199
  511. package/src/views/users/AddUserNameDialog.js +0 -162
  512. package/src/views/users/ContactManage.js +0 -449
  513. package/src/views/users/ResetPasswordDialog.js +0 -242
@@ -0,0 +1,1151 @@
1
+ import { COMPONENT_SECTIONS } from 'views/builder/sidebar/tabs/Components/componentCatalog'
2
+
3
+ function catalogList() {
4
+ return COMPONENT_SECTIONS
5
+ .map(s => `${s.title}: ${s.items.map(i => i.type).join(', ')}`)
6
+ .join('\n')
7
+ }
8
+
9
+ // ─────────────────────────────────────────────────────────────────────────────
10
+
11
+ const SCHEMA_FORMAT = `
12
+ ## Schema format
13
+
14
+ Every schema you produce must follow this exact shape. No "id" fields. No valueType wrappers. Plain values only.
15
+
16
+ {
17
+ "root": {
18
+ "type": "<component_type>",
19
+ "props": { "propName": <plain value> },
20
+ "children": [ /* child nodes or [] */ ]
21
+ }
22
+ }
23
+
24
+ Hard rules:
25
+ - Props are ALWAYS plain values: strings, numbers, booleans, arrays, objects — never { valueType, value }.
26
+ - Never include "id" fields — they are generated automatically.
27
+ - "children" must always be present. Use [] for leaf components.
28
+ - The root node is ALWAYS type "layout" with cols:1 — never "container".
29
+ - NEVER use the "container" component anywhere in the schema. It is banned.
30
+ - layout children must ONLY be layout-cell. wizard children must ONLY be wizard-step.
31
+ - layout-cell props are split into two groups: "main" (grid position) and "style" (visual styling).
32
+ `.trim()
33
+
34
+ // ─────────────────────────────────────────────────────────────────────────────
35
+
36
+ const FIELDS_REFERENCE = `
37
+ ## INPUT FIELDS
38
+ All field components are leaf nodes — they never have children.
39
+ The "key" prop is the camelCase identifier that stores this field's value in the form data object.
40
+
41
+ ━━━ input ━━━
42
+ A single-line text field. The most common field component.
43
+ Props: label, key (required), placeholder, required(bool), disabled(bool), helperText, fullWidth(bool)
44
+ Example:
45
+ { "type": "input", "props": { "label": "Full Name", "key": "fullName", "placeholder": "Enter your full name", "required": true, "fullWidth": true }, "children": [] }
46
+
47
+ ━━━ textarea ━━━
48
+ Multi-line text input. Use for descriptions, notes, addresses, comments.
49
+ Props: label, key (required), placeholder, required(bool), rows(number, default 4)
50
+ Example:
51
+ { "type": "textarea", "props": { "label": "Description", "key": "description", "placeholder": "Enter a description...", "rows": 5 }, "children": [] }
52
+
53
+ ━━━ number ━━━
54
+ Formatted numeric input with optional prefix/suffix. Use for prices, quantities, percentages.
55
+ Props: label, key (required), placeholder, required(bool), prefix(e.g. "$"), suffix(e.g. "%"), decimalScale(number)
56
+ Example:
57
+ { "type": "number", "props": { "label": "Price", "key": "price", "prefix": "$", "decimalScale": 2, "required": true }, "children": [] }
58
+
59
+ ━━━ dropdown ━━━
60
+ Select one option from a list. Use for status, category, country, type fields.
61
+ Props: label, key (required), required(bool), options: [{ label, value }]
62
+ Example:
63
+ { "type": "dropdown", "props": { "label": "Status", "key": "status", "required": true, "options": [{ "label": "Active", "value": "active" }, { "label": "Inactive", "value": "inactive" }, { "label": "Pending", "value": "pending" }] }, "children": [] }
64
+
65
+ ━━━ autocomplete ━━━
66
+ Searchable dropdown. Use when the list is long or the user may type to filter. Supports multiple selection.
67
+ Props: label, key (required), required(bool), multiple(bool), options: [{ label, value }]
68
+ Example:
69
+ { "type": "autocomplete", "props": { "label": "Tags", "key": "tags", "multiple": true, "options": [{ "label": "Urgent", "value": "urgent" }, { "label": "Review", "value": "review" }] }, "children": [] }
70
+
71
+ ━━━ radio ━━━
72
+ Choose one from a small, visible set of options. Use when options are ≤5 and always visible.
73
+ Props: label, key (required), required(bool), row(bool — display horizontally), options: [{ label, value }]
74
+ Example:
75
+ { "type": "radio", "props": { "label": "Gender", "key": "gender", "row": true, "options": [{ "label": "Male", "value": "male" }, { "label": "Female", "value": "female" }, { "label": "Other", "value": "other" }] }, "children": [] }
76
+
77
+ ━━━ checkbox ━━━
78
+ A single boolean toggle. Use for agreement checkboxes, feature flags, yes/no options.
79
+ Props: label, key (required), required(bool)
80
+ Example:
81
+ { "type": "checkbox", "props": { "label": "I agree to the Terms and Conditions", "key": "agreedToTerms", "required": true }, "children": [] }
82
+
83
+ ━━━ toggle ━━━
84
+ An on/off switch. Use for enable/disable settings, preferences.
85
+ Props: label, key (required)
86
+ Example:
87
+ { "type": "toggle", "props": { "label": "Enable Notifications", "key": "notificationsEnabled" }, "children": [] }
88
+
89
+ ━━━ datepicker ━━━
90
+ Date selection calendar popup. Use for birth dates, deadlines, event dates.
91
+ Props: label, key (required), required(bool), format(e.g. "MM/DD/YYYY")
92
+ Example:
93
+ { "type": "datepicker", "props": { "label": "Date of Birth", "key": "dateOfBirth", "required": true, "format": "MM/DD/YYYY" }, "children": [] }
94
+
95
+ ━━━ time ━━━
96
+ Time picker. Use for scheduling, shift times, meeting times.
97
+ Props: label, key (required), required(bool)
98
+ Example:
99
+ { "type": "time", "props": { "label": "Meeting Time", "key": "meetingTime", "required": true }, "children": [] }
100
+
101
+ ━━━ tag ━━━
102
+ Multi-select chip picker. Use for skills, interests, categories — similar to autocomplete but displayed as chips.
103
+ Props: label, key (required), multiple(bool), options: [{ label, value }]
104
+ Example:
105
+ { "type": "tag", "props": { "label": "Skills", "key": "skills", "multiple": true, "options": [{ "label": "JavaScript", "value": "js" }, { "label": "Python", "value": "py" }, { "label": "React", "value": "react" }] }, "children": [] }
106
+
107
+ ━━━ richtext ━━━
108
+ WYSIWYG rich text editor. Use for formatted content — articles, emails, HTML bodies.
109
+ Props: label, key (required)
110
+ Example:
111
+ { "type": "richtext", "props": { "label": "Article Body", "key": "articleBody" }, "children": [] }
112
+
113
+ ━━━ signature ━━━
114
+ Signature capture pad. Use for approvals, contracts, delivery confirmation.
115
+ Props: label, key (required)
116
+ Example:
117
+ { "type": "signature", "props": { "label": "Customer Signature", "key": "signature" }, "children": [] }
118
+ `.trim()
119
+
120
+ // ─────────────────────────────────────────────────────────────────────────────
121
+
122
+ const DISPLAY_REFERENCE = `
123
+ ## DISPLAY / STATIC COMPONENTS
124
+ Leaf nodes — never have children.
125
+
126
+ ━━━ label ━━━
127
+ Displays a text string. Use for field descriptions, section descriptions, help text, captions.
128
+ Props: text (required), variant(body1|body2|caption|subtitle1|subtitle2|h6), bold(bool), color(hex or named)
129
+ Example:
130
+ { "type": "label", "props": { "text": "Please fill in all required fields before submitting.", "variant": "body2", "color": "#666666" }, "children": [] }
131
+
132
+ ━━━ header ━━━
133
+ Section title or page heading. Use to label sections within a form or page.
134
+ Props: text (required), variant(h4|h5|h6, default h5), align(left|center|right)
135
+ Example:
136
+ { "type": "header", "props": { "text": "Personal Information", "variant": "h6" }, "children": [] }
137
+
138
+ ━━━ button ━━━
139
+ Clickable action button. Use for submit, cancel, save, next, add actions.
140
+ Props: label (required), variant(contained|outlined|text), color(primary|secondary|error|success|warning), size(small|medium|large), fullWidth(bool)
141
+ Example:
142
+ { "type": "button", "props": { "label": "Submit", "variant": "contained", "color": "primary", "fullWidth": true }, "children": [] }
143
+
144
+ ━━━ divider ━━━
145
+ A horizontal line used to separate sections visually.
146
+ Props: (none required)
147
+ Example:
148
+ { "type": "divider", "props": {}, "children": [] }
149
+
150
+ ━━━ banner ━━━
151
+ An alert/notification bar. Use for instructions, warnings, success messages, info notices.
152
+ Props: message (required), severity(info|success|warning|error)
153
+ Example:
154
+ { "type": "banner", "props": { "message": "Your changes will be reviewed within 24 hours.", "severity": "info" }, "children": [] }
155
+
156
+ ━━━ image ━━━
157
+ Displays an image. Use for logos, illustrations, product photos.
158
+ Props: src (required), alt, width, height
159
+ Example:
160
+ { "type": "image", "props": { "src": "/logo.png", "alt": "Company Logo", "width": 120, "height": 40 }, "children": [] }
161
+
162
+ ━━━ link ━━━
163
+ A clickable hyperlink.
164
+ Props: text (required), href (required), target(_blank|_self)
165
+ Example:
166
+ { "type": "link", "props": { "text": "Forgot your password?", "href": "/reset-password", "target": "_self" }, "children": [] }
167
+
168
+ ━━━ progress-line ━━━
169
+ A horizontal progress bar. Use for completion indicators, loading states.
170
+ Props: value(0–100), color
171
+ Example:
172
+ { "type": "progress-line", "props": { "value": 65, "color": "primary" }, "children": [] }
173
+
174
+ ━━━ progress-circle ━━━
175
+ A circular progress indicator. Use in dashboards or cards.
176
+ Props: value(0–100), size(number), color
177
+ Example:
178
+ { "type": "progress-circle", "props": { "value": 78, "size": 80, "color": "success" }, "children": [] }
179
+ `.trim()
180
+
181
+ // ─────────────────────────────────────────────────────────────────────────────
182
+
183
+ const STRUCTURE_REFERENCE = `
184
+ ## STRUCTURE / CONTAINER COMPONENTS
185
+
186
+ ━━━ layout + layout-cell ━━━
187
+ CSS grid. The primary tool for ANY multi-column arrangement. layout children MUST be layout-cell only.
188
+ layout props: cols(number — ALWAYS SET EXPLICITLY), gap(px — ALWAYS SET EXPLICITLY), rowGap(px)
189
+ layout-cell props: (none — it is a single column slot)
190
+
191
+ ⚠️ CRITICAL: Each layout-cell must hold EXACTLY ONE direct child. Multiple children in one cell WILL OVERLAP.
192
+ ⚠️ CRITICAL: Always set cols and gap explicitly — never rely on defaults.
193
+ ⚠️ CRITICAL: All field components inside cells MUST have fullWidth: true.
194
+ ⚠️ CRITICAL: Number of layout-cell nodes MUST equal rows × cols (e.g., 2-col × 3 rows = 6 cells).
195
+
196
+ Example — 3-column row (one component per cell, fullWidth on fields):
197
+ {
198
+ "type": "layout",
199
+ "props": { "cols": 3, "gap": 16 },
200
+ "children": [
201
+ { "type": "layout-cell", "props": {}, "children": [ { "type": "input", "props": { "label": "First Name", "key": "firstName", "fullWidth": true }, "children": [] } ] },
202
+ { "type": "layout-cell", "props": {}, "children": [ { "type": "input", "props": { "label": "Last Name", "key": "lastName", "fullWidth": true }, "children": [] } ] },
203
+ { "type": "layout-cell", "props": {}, "children": [ { "type": "input", "props": { "label": "Email", "key": "email", "fullWidth": true }, "children": [] } ] }
204
+ ]
205
+ }
206
+
207
+ ━━━ container ━━━
208
+ ⛔ BANNED — Do NOT use container anywhere in the schema. It is deprecated and removed from all AI-generated output.
209
+ Instead: use layout with cols:1 for vertical stacks, and apply visual styling via layout-cell style props.
210
+ See the STYLING section for how to add padding, backgrounds, and borders to cells.
211
+
212
+ ━━━ card ━━━
213
+ A Material UI card surface. Use to visually group a section with a title, a subtitle, and elevated background.
214
+ Props: key, title, subtitle, elevation(0–24, default 1), padding
215
+ Example:
216
+ { "type": "card", "props": { "title": "Account Summary", "subtitle": "Last updated today", "elevation": 2 }, "children": [ ... ] }
217
+
218
+ ━━━ wizard + wizard-step ━━━
219
+ A multi-step flow with a stepper header. wizard children MUST be wizard-step only.
220
+ wizard props: orientation(horizontal|vertical), linear(bool, default true), hideNavigation(bool)
221
+ wizard-step props: label (required), optional(bool)
222
+ Example:
223
+ {
224
+ "type": "wizard",
225
+ "props": { "orientation": "horizontal", "linear": true },
226
+ "children": [
227
+ { "type": "wizard-step", "props": { "label": "Personal Info" }, "children": [ ... ] },
228
+ { "type": "wizard-step", "props": { "label": "Address" }, "children": [ ... ] },
229
+ { "type": "wizard-step", "props": { "label": "Review" }, "children": [ ... ] }
230
+ ]
231
+ }
232
+
233
+ ━━━ repeater ━━━
234
+ Renders a list of identical template items. Use for dynamic lists, line items, team members.
235
+ Props: direction(vertical|horizontal|wrap), gap, count(static count), dataKey(form array field name)
236
+ Example:
237
+ { "type": "repeater", "props": { "dataKey": "lineItems", "direction": "vertical", "gap": 8 }, "children": [ ... ] }
238
+
239
+ ━━━ menu ━━━
240
+ Tab navigation. Two modes:
241
+ tabs mode → tabs:[{label}] — each tab is a drop zone for child components (tabbed sections)
242
+ items mode → items:[{title}] — navigation links only (no child drop zones)
243
+ Example (tabs mode):
244
+ {
245
+ "type": "menu",
246
+ "props": { "tabs": [{ "label": "Overview" }, { "label": "Details" }, { "label": "History" }] },
247
+ "children": [ ... ]
248
+ }
249
+
250
+ ━━━ dialog ━━━
251
+ A modal popup. Triggered from action code via openDialog('key'). Must have a unique key prop.
252
+ Props: key (required), title, maxWidth(xs|sm|md|lg|xl), fullWidth(bool)
253
+ Example:
254
+ { "type": "dialog", "props": { "key": "confirmDialog", "title": "Confirm Action", "maxWidth": "sm", "fullWidth": true }, "children": [ ... ] }
255
+ `.trim()
256
+
257
+ // ─────────────────────────────────────────────────────────────────────────────
258
+
259
+ const DATA_REFERENCE = `
260
+ ## DATA COMPONENTS
261
+ Leaf nodes — never have children.
262
+
263
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
264
+ CRITICAL — DECISION TABLE: which data component to use
265
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
266
+
267
+ | Goal | Use | Never use |
268
+ |------|-----|-----------|
269
+ | Show a live list of records from the server (orders, users, products…) | data-grid | reportViewer, data-table-viewer |
270
+ | Display a local array that's already in the form's data (e.g. invoice lines) | data-table-viewer | data-grid |
271
+ | Embed a pre-built report that fetches its own server data | reportViewer | data-grid, data-table-viewer |
272
+ | Capture user input, build a form | input / dropdown / datepicker / etc. | ⛔ NEVER data-grid |
273
+ | Reuse another saved view/sub-form | viewRenderer | — |
274
+
275
+ ⚠️ data-grid is NOT a form component. It does NOT capture user input.
276
+ Never place data-grid inside a form expecting it to collect or edit data.
277
+ If the user asks for a form, use field components (input, dropdown, etc.).
278
+ If the user asks to "see" or "list" records, use data-grid.
279
+
280
+ ⚠️ reportViewer does NOT accept data props — it fetches its own data through
281
+ the report's saved definition. Never pass columns, dataKey, or endpoint to it.
282
+ Only pass reportId. The report knows what to fetch.
283
+
284
+ ⚠️ data-table-viewer renders a local array — it does NOT call any API.
285
+ The data must already exist in the view's form state under the given dataKey.
286
+ Use it for read-only display of in-memory arrays (totals tables, line items, summaries).
287
+
288
+ ━━━ data-grid ━━━
289
+ PURPOSE: Full CRUD data table. Fetches records from a backend endpoint via AG Grid.
290
+ Use when: displaying a server-driven list of entities — orders, users, products, invoices, etc.
291
+ Use when: the page is a "management" or "list" page (browse, search, sort, filter records).
292
+
293
+ Props: label, endpoint(API endpoint ID), serviceId(API service ID), height(px, default 400)
294
+ The endpoint and serviceId are set in the backend — if unknown, use placeholder values and note them.
295
+
296
+ Example — Orders management page:
297
+ { "type": "data-grid", "props": { "label": "Orders", "endpoint": "GetAllOrders", "serviceId": "OrderService", "height": 500 }, "children": [] }
298
+
299
+ DO use data-grid for:
300
+ ✅ "Show me a list of customers"
301
+ ✅ "I need a table of all products"
302
+ ✅ "Build an order management page"
303
+ ✅ Any page titled "…Management", "…List", "…Browser"
304
+
305
+ DO NOT use data-grid for:
306
+ ❌ "Create a form to add a new order" → use input fields
307
+ ❌ "Show totals from a calculation" → use data-table-viewer or KPI components
308
+ ❌ "Display report data" → use reportViewer
309
+
310
+ ━━━ data-table-viewer ━━━
311
+ PURPOSE: Read-only HTML table rendered from a local in-memory data array.
312
+ Use when: you need to display an array that is already in the view's data context.
313
+ Use when: print layouts, invoice line-item tables, summary grids from calculated data.
314
+ Does NOT fetch from any API — data must already be in the form state.
315
+
316
+ Props: dataKey(key in form data holding the rows array), columns:[{label, field}], striped(bool), bordered(bool, default true), fontSize(px)
317
+
318
+ Example — Invoice line items (data comes from form state, not API):
319
+ { "type": "data-table-viewer", "props": { "dataKey": "invoiceLines", "striped": true, "bordered": true, "columns": [{ "label": "Item", "field": "itemName" }, { "label": "Qty", "field": "quantity" }, { "label": "Price", "field": "unitPrice" }, { "label": "Total", "field": "total" }] }, "children": [] }
320
+
321
+ DO use data-table-viewer for:
322
+ ✅ Displaying line items from an in-memory invoice/order object
323
+ ✅ Print layouts that show a summary table
324
+ ✅ Showing a pre-calculated results array
325
+
326
+ DO NOT use data-table-viewer for:
327
+ ❌ Fetching records from a server endpoint → use data-grid
328
+ ❌ Displaying report output → use reportViewer
329
+
330
+ ━━━ reportViewer ━━━
331
+ PURPOSE: Embeds a pre-built, self-contained report that fetches and renders its own data.
332
+ Use when: the user has an existing report (built in the Report Builder) they want shown on a page.
333
+ The report already knows its own data source, query, and column layout — no extra props needed.
334
+
335
+ Props: reportId (required — the ID of the saved report)
336
+ ⚠️ Do NOT add endpoint, dataKey, columns, or any other data props — reportViewer ignores them.
337
+
338
+ Example:
339
+ { "type": "reportViewer", "props": { "reportId": "monthly-sales-report" }, "children": [] }
340
+
341
+ DO use reportViewer for:
342
+ ✅ "Embed the monthly sales report on this page"
343
+ ✅ "Show the revenue by region report below the KPIs"
344
+ ✅ Any reference to a named, pre-existing report
345
+
346
+ DO NOT use reportViewer for:
347
+ ❌ Showing a live record list (use data-grid)
348
+ ❌ Displaying local array data (use data-table-viewer)
349
+ ❌ Building a new data view from scratch
350
+
351
+ ━━━ viewRenderer ━━━
352
+ PURPOSE: Embeds another saved UI Builder view as a reusable sub-panel.
353
+ Props: viewId (required), isolated(bool — true = own data context, false = shares parent data)
354
+ Example:
355
+ { "type": "viewRenderer", "props": { "viewId": "address-form-view", "isolated": false }, "children": [] }
356
+ `.trim()
357
+
358
+ // ─────────────────────────────────────────────────────────────────────────────
359
+
360
+ const KPI_REFERENCE = `
361
+ ## KPI & DATA VISUALIZATION COMPONENTS
362
+ All KPI components are leaf nodes — they never have children.
363
+ Use these in dashboards, summary panels, and reporting pages.
364
+ They are best arranged in a layout grid (cols 2–4).
365
+
366
+ ━━━ kpi-metric ━━━
367
+ Displays a single prominent number with a label and optional unit. The most common KPI card.
368
+ Props: label (required), value (required), unit(e.g. "$" or "%"), precision(decimal places)
369
+ Example:
370
+ { "type": "kpi-metric", "props": { "label": "Total Revenue", "value": 128450, "unit": "$", "precision": 0 }, "children": [] }
371
+
372
+ ━━━ kpi-trend ━━━
373
+ A metric with an up/down trend arrow and change value. Use for period-over-period comparisons.
374
+ Props: label, value, change(number — positive=up, negative=down), changeLabel(e.g. "vs last month")
375
+ Example:
376
+ { "type": "kpi-trend", "props": { "label": "Monthly Sales", "value": 54200, "change": 12.4, "changeLabel": "vs last month" }, "children": [] }
377
+
378
+ ━━━ kpi-badge ━━━
379
+ A small colored badge displaying a label and value. Use for counts, statuses, categories.
380
+ Props: label, value, color(hex or MUI color name)
381
+ Example:
382
+ { "type": "kpi-badge", "props": { "label": "Open Tickets", "value": 23, "color": "#f57c00" }, "children": [] }
383
+
384
+ ━━━ kpi-status-dot ━━━
385
+ A colored dot with a status label. Use for operational status indicators.
386
+ Props: label, color(success|warning|error|info)
387
+ Example:
388
+ { "type": "kpi-status-dot", "props": { "label": "System Operational", "color": "success" }, "children": [] }
389
+
390
+ ━━━ kpi-icon-box ━━━
391
+ An icon inside a colored box with a label. Decorative metric card with visual icon.
392
+ Props: label, icon(Material icon name, e.g. "ShoppingCart"), color(text color), backgroundColor
393
+ Example:
394
+ { "type": "kpi-icon-box", "props": { "label": "New Orders", "icon": "ShoppingCart", "backgroundColor": "#e3f2fd", "color": "#1565c0" }, "children": [] }
395
+
396
+ ━━━ kpi-chart ━━━
397
+ A small inline chart (sparkline-style). Use to show a trend over time in a compact card.
398
+ Props: label, chartType(line|bar|area), dataKey(data array key), xKey(field for x-axis)
399
+ Example:
400
+ { "type": "kpi-chart", "props": { "label": "Revenue Trend", "chartType": "area", "dataKey": "revenueSeries", "xKey": "month" }, "children": [] }
401
+
402
+ ━━━ kpi-gauge ━━━
403
+ A semicircular gauge. Use for performance scores, capacity, health metrics.
404
+ Props: label, value (required), min(default 0), max (required), unit
405
+ Example:
406
+ { "type": "kpi-gauge", "props": { "label": "Server Load", "value": 67, "min": 0, "max": 100, "unit": "%" }, "children": [] }
407
+
408
+ ━━━ kpi-donut ━━━
409
+ A donut/pie chart. Use for distribution breakdowns (e.g. sales by region, orders by status).
410
+ Props: label, dataKey(data array key), nameKey(slice label field), valueKey(slice value field)
411
+ Example:
412
+ { "type": "kpi-donut", "props": { "label": "Sales by Region", "dataKey": "regionSales", "nameKey": "region", "valueKey": "amount" }, "children": [] }
413
+
414
+ ━━━ kpi-funnel ━━━
415
+ A funnel chart. Use for conversion funnels, pipeline stages.
416
+ Props: label, dataKey, nameKey, valueKey
417
+ Example:
418
+ { "type": "kpi-funnel", "props": { "label": "Sales Pipeline", "dataKey": "pipeline", "nameKey": "stage", "valueKey": "count" }, "children": [] }
419
+
420
+ ━━━ kpi-bullet ━━━
421
+ A bullet chart showing actual value vs a target. Use for goal tracking.
422
+ Props: label, value (required), target (required), max (required)
423
+ Example:
424
+ { "type": "kpi-bullet", "props": { "label": "Q4 Target", "value": 87000, "target": 100000, "max": 120000 }, "children": [] }
425
+
426
+ ━━━ kpi-comparison ━━━
427
+ Horizontal comparison bars for side-by-side category comparison.
428
+ Props: label, dataKey(array of {name, value})
429
+ Example:
430
+ { "type": "kpi-comparison", "props": { "label": "Top Products", "dataKey": "productComparison" }, "children": [] }
431
+
432
+ ━━━ kpi-heatmap ━━━
433
+ A grid heatmap. Use for activity calendars, time-of-day patterns, frequency matrices.
434
+ Props: label, dataKey
435
+ Example:
436
+ { "type": "kpi-heatmap", "props": { "label": "Activity Heatmap", "dataKey": "activityGrid" }, "children": [] }
437
+
438
+ ━━━ kpi-timeline ━━━
439
+ A vertical timeline of events. Use for activity feeds, audit logs, order history.
440
+ Props: label, dataKey, dateKey(field for date), labelKey(field for event label)
441
+ Example:
442
+ { "type": "kpi-timeline", "props": { "label": "Recent Activity", "dataKey": "activityLog", "dateKey": "timestamp", "labelKey": "event" }, "children": [] }
443
+
444
+ ━━━ kpi-countdown ━━━
445
+ A live countdown timer to a target date/time.
446
+ Props: label, targetDate(ISO 8601 date string)
447
+ Example:
448
+ { "type": "kpi-countdown", "props": { "label": "Next Release", "targetDate": "2025-12-31T00:00:00Z" }, "children": [] }
449
+
450
+ ━━━ kpi-rating ━━━
451
+ A star rating display. Use for review scores, satisfaction ratings.
452
+ Props: label, value(number), max(default 5), readOnly(bool)
453
+ Example:
454
+ { "type": "kpi-rating", "props": { "label": "Customer Satisfaction", "value": 4.2, "max": 5, "readOnly": true }, "children": [] }
455
+
456
+ ━━━ kpi-avatar-group ━━━
457
+ A group of overlapping user avatars. Use for "assigned to" or "team members" displays.
458
+ Props: label, dataKey(array of user objects), max(max visible avatars)
459
+ Example:
460
+ { "type": "kpi-avatar-group", "props": { "label": "Team", "dataKey": "teamMembers", "max": 4 }, "children": [] }
461
+
462
+ ━━━ kpi-tag-list ━━━
463
+ A list of colored tag chips. Use for labels, categories, skills lists.
464
+ Props: label, dataKey(array of tag strings or objects)
465
+ Example:
466
+ { "type": "kpi-tag-list", "props": { "label": "Active Tags", "dataKey": "activeTags" }, "children": [] }
467
+
468
+ ━━━ kpi-step-stage ━━━
469
+ A horizontal step/stage progress indicator. Use for order status, process stages.
470
+ Props: label, steps:[{label}], activeStep(0-based index)
471
+ Example:
472
+ { "type": "kpi-step-stage", "props": { "label": "Order Status", "activeStep": 2, "steps": [{ "label": "Placed" }, { "label": "Processing" }, { "label": "Shipped" }, { "label": "Delivered" }] }, "children": [] }
473
+
474
+ ━━━ kpi-color-scale ━━━
475
+ A color gradient scale showing where a value falls. Use for risk scores, temperature ranges.
476
+ Props: label, value (required), min (required), max (required)
477
+ Example:
478
+ { "type": "kpi-color-scale", "props": { "label": "Risk Score", "value": 68, "min": 0, "max": 100 }, "children": [] }
479
+ `.trim()
480
+
481
+ // ─────────────────────────────────────────────────────────────────────────────
482
+
483
+ const NESTING_RULES = `
484
+ ## Nesting rules
485
+ - layout → layout-cell ONLY (always auto-generate the layout-cell wrappers)
486
+ - wizard → wizard-step ONLY
487
+ - container, card, layout-cell, wizard-step, repeater, menu, dialog → accept any component as children
488
+ - All field components (input, dropdown, etc.) → leaf — children: []
489
+ - All display components (label, header, button, etc.) → leaf — children: []
490
+ - All data components (data-grid, reportViewer, etc.) → leaf — children: []
491
+ - All kpi-* components → leaf — children: []
492
+ `.trim()
493
+
494
+ // ─────────────────────────────────────────────────────────────────────────────
495
+
496
+ const LAYOUT_PREFERENCE = `
497
+ ## Layout preference — CRITICAL RULES
498
+
499
+ 1. **NEVER use "container".** It is banned. Use layout for everything.
500
+ 2. **The root node is ALWAYS "layout" with cols:1.**
501
+ 3. **All multi-column structure uses nested layout nodes inside layout-cells.**
502
+
503
+ | Situation | Use |
504
+ |-----------|-----|
505
+ | Page root / vertical stack | layout cols:1, gap:16 |
506
+ | Side-by-side fields (2-col) | layout cols:2, gap:16 inside a cell |
507
+ | 3-or-4-col KPI dashboard | layout cols:3/4, gap:16 inside a cell |
508
+ | Full-width section with padding + bg | layout-cell with style props (padding, backgroundColor) |
509
+ | Full-width section with title + elevation | card inside a layout-cell |
510
+ | Multi-step flow | wizard inside a layout-cell |
511
+
512
+ **Page skeleton pattern** (use this as every root):
513
+ {
514
+ "type": "layout",
515
+ "props": { "cols": 1, "gap": 24 },
516
+ "children": [
517
+ { "type": "layout-cell", "props": {}, "style": { "padding": "0 24px" }, "children": [ <page title / banner> ] },
518
+ { "type": "layout-cell", "props": {}, "children": [ <section or nested layout> ] },
519
+ ...
520
+ ]
521
+ }
522
+
523
+ Note: layout-cell style props (padding, backgroundColor, etc.) go in the "style" key, not "props".
524
+ `.trim()
525
+
526
+ // ─────────────────────────────────────────────────────────────────────────────
527
+
528
+ const GRID_RULES = `
529
+ ## GRID LAYOUT RULES — MANDATORY. VIOLATIONS CAUSE OVERLAPPING COMPONENTS.
530
+
531
+ These rules apply to EVERY layout node you produce. No exceptions.
532
+
533
+ ### Rule 1 — Always specify cols AND gap explicitly
534
+ WRONG: { "type": "layout", "props": {}, "children": [...] }
535
+ RIGHT: { "type": "layout", "props": { "cols": 2, "gap": 16 }, "children": [...] }
536
+ Never omit cols. Never omit gap. Do not rely on defaults.
537
+
538
+ ### Rule 2 — One component per cell in multi-column layouts (cols ≥ 2)
539
+ In any layout with cols ≥ 2, each layout-cell must contain exactly ONE direct child.
540
+ Multiple children in one cell of a multi-column layout WILL OVERLAP.
541
+ WRONG (cols:2): layout-cell with [input, datepicker] — they overlap.
542
+ RIGHT (cols:2): two separate layout-cells, each with one component.
543
+
544
+ For a single-column layout (cols:1), cells may hold multiple stacked items — they render as a flex-column.
545
+
546
+ ### Rule 3 — Cell count must equal rows × cols
547
+ For a layout with cols:2 and 3 rows of fields → you need exactly 6 layout-cell nodes.
548
+ For a layout with cols:4 and 1 row of KPIs → you need exactly 4 layout-cell nodes.
549
+ Count carefully: totalCells = numberOfRows × cols.
550
+
551
+ ### Rule 4 — fullWidth:true on fields inside multi-column cells
552
+ Every field component (input, dropdown, datepicker, etc.) inside a cell of a cols ≥ 2 layout MUST have "fullWidth": true.
553
+ Without fullWidth, fields shrink to their natural width and appear to leave gaps.
554
+
555
+ ### layout-cell prop structure
556
+ layout-cell has two distinct prop groups:
557
+ "props": { grid position props: colStart, rowStart, colSpan, rowSpan }
558
+ "style": { visual style props: padding, backgroundColor, border, borderRadius, justifyContent, alignItems, minHeight }
559
+
560
+ CORRECT cell with styling:
561
+ { "type": "layout-cell", "props": {}, "style": { "padding": "16px", "backgroundColor": "#f8f9fa", "borderRadius": "8px" }, "children": [...] }
562
+
563
+ ### Summary checklist — before outputting any layout node:
564
+ ✅ cols is specified (a number, not missing)
565
+ ✅ gap is specified (a number, e.g. 16)
566
+ ✅ Each cell in a cols ≥ 2 layout has exactly ONE direct child
567
+ ✅ Number of layout-cell nodes = rows × cols (for multi-column layouts)
568
+ ✅ All fields inside multi-column cells have fullWidth: true
569
+ ✅ Cell visual styling uses the "style" key, not "props"
570
+ `.trim()
571
+
572
+ // ─────────────────────────────────────────────────────────────────────────────
573
+
574
+ const STYLING_REFERENCE = `
575
+ ## STYLING SYSTEM
576
+
577
+ There are three levels of styling. Apply each at the right level.
578
+
579
+ ─────────────────────────────────────────────
580
+ ### LEVEL 1 — layout-cell style props
581
+ ─────────────────────────────────────────────
582
+ Cell style props go in a separate "style" key on the layout-cell node (NOT inside "props").
583
+ These control the cell's background, padding, borders, and flex-alignment of its children.
584
+
585
+ Available style props:
586
+ padding — CSS shorthand string: "16px", "8px 24px", "12px 16px 8px"
587
+ backgroundColor — hex or CSS color: "#f8f9fa", "#ffffff", "#1a237e"
588
+ border — CSS shorthand: "1px solid #e0e0e0", "2px solid #1976d2"
589
+ borderRadius — "8px", "4px", "12px"
590
+ borderTop/Bottom/Left/Right — individual side borders
591
+ boxShadow — "0 2px 8px rgba(0,0,0,0.1)"
592
+ justifyContent — flex main-axis: "flex-start" | "center" | "flex-end" | "space-between"
593
+ alignItems — flex cross-axis: "stretch" | "center" | "flex-start" | "flex-end"
594
+ minHeight — minimum cell height in pixels (number or "200px")
595
+ gap — spacing between stacked children inside the cell (when holding multiple items)
596
+
597
+ Syntax:
598
+ { "type": "layout-cell", "props": {}, "style": { "padding": "24px", "backgroundColor": "#f8f9fa", "borderRadius": "8px" }, "children": [...] }
599
+
600
+ Common cell patterns:
601
+ Page section with light bg: "style": { "padding": "24px", "backgroundColor": "#f8f9fa", "borderRadius": "8px" }
602
+ Dark header cell: "style": { "padding": "20px 24px", "backgroundColor": "#1a237e" }
603
+ Card-like bordered section: "style": { "padding": "20px", "border": "1px solid #e0e0e0", "borderRadius": "8px", "backgroundColor": "#ffffff" }
604
+ KPI card cell with shadow: "style": { "padding": "16px", "backgroundColor": "#ffffff", "borderRadius": "8px", "boxShadow": "0 2px 8px rgba(0,0,0,0.08)" }
605
+ Centered content cell: "style": { "padding": "32px", "justifyContent": "center", "alignItems": "center" }
606
+ Accent left-border (info panel): "style": { "padding": "12px 16px", "borderLeft": "4px solid #1976d2", "backgroundColor": "#e3f2fd", "borderRadius": "0 8px 8px 0" }
607
+
608
+ ─────────────────────────────────────────────
609
+ ### LEVEL 2 — component-level style props
610
+ ─────────────────────────────────────────────
611
+ These go inside a component's "props" directly.
612
+
613
+ Fields (input, dropdown, datepicker, etc.):
614
+ fullWidth: true — ALWAYS set this inside any multi-column layout cell
615
+ size: "small"|"medium" — compact or standard size
616
+ required: true/false
617
+ disabled: true/false
618
+
619
+ Buttons:
620
+ variant: "contained"|"outlined"|"text"
621
+ color: "primary"|"secondary"|"error"|"success"|"warning"|"info"
622
+ size: "small"|"medium"|"large"
623
+ fullWidth: true
624
+
625
+ Display components:
626
+ header: variant("h4"|"h5"|"h6"), align("left"|"center"|"right")
627
+ label: variant("body1"|"body2"|"caption"|"subtitle1"), bold(bool), color(hex)
628
+ banner: severity("info"|"success"|"warning"|"error")
629
+ divider: (no props needed)
630
+ progress-line: value(0–100), color("primary"|"success"|hex)
631
+ progress-circle: value(0–100), size(px number), color
632
+
633
+ Cards:
634
+ elevation: 0|1|2|4|8 — shadow depth
635
+ padding: "16px" — internal card padding
636
+ title, subtitle
637
+
638
+ ─────────────────────────────────────────────
639
+ ### LEVEL 3 — Color palette reference
640
+ ─────────────────────────────────────────────
641
+ Use MUI semantic tokens when the color should adapt to light/dark theme.
642
+ Use hex codes for fixed brand colors or decorative backgrounds.
643
+
644
+ MUI semantic tokens (always theme-aware):
645
+ "primary" → blue (#1976d2 light / #90caf9 dark)
646
+ "secondary" → purple (#9c27b0 light / #ce93d8 dark)
647
+ "success" → green (#2e7d32 light / #66bb6a dark)
648
+ "warning" → orange (#ed6c02 light / #ffa726 dark)
649
+ "error" → red (#d32f2f light / #f44336 dark)
650
+ "info" → blue (#0288d1 light / #29b6f6 dark)
651
+
652
+ Hex color palette (for backgrounds, decorative elements):
653
+ Whites/Neutrals: "#ffffff", "#f8f9fa", "#f5f5f5", "#eeeeee", "#e0e0e0"
654
+ Dark surfaces: "#212121", "#263238", "#1a237e", "#37474f", "#0d47a1"
655
+ Light tints: "#e3f2fd"(blue), "#f3e5f5"(purple), "#e8f5e9"(green), "#fff8e1"(amber), "#fce4ec"(pink), "#e0f2f1"(teal)
656
+ Text colors: "#212121"(primary), "#757575"(secondary), "#ffffff"(on dark bg), "#90caf9"(on dark bg accent)
657
+
658
+ ─────────────────────────────────────────────
659
+ ### LEVEL 4 — Alignment and spacing patterns
660
+ ─────────────────────────────────────────────
661
+ Use these layout patterns to achieve common alignment goals:
662
+
663
+ Horizontally centered page content:
664
+ Root layout cols:1 → single layout-cell with style: { padding: "0 10%", maxWidth: ... }
665
+
666
+ Right-aligned button row (e.g. Cancel + Submit):
667
+ layout cols:2 gap:8, BOTH cells have style: { alignItems: "flex-end" }
668
+ OR: layout-cell style: { justifyContent: "flex-end", alignItems: "center" }
669
+
670
+ Vertically centered KPI card:
671
+ layout-cell style: { justifyContent: "center", alignItems: "center", minHeight: 120 }
672
+
673
+ Equal-height KPI row:
674
+ Parent layout has gap:16 and each cell has style: { minHeight: 120 }
675
+
676
+ Page with sticky-header feel (dark top bar + white body):
677
+ Cell 1 style: { backgroundColor: "#1a237e", padding: "16px 24px" } → header/title
678
+ Cell 2 style: { backgroundColor: "#ffffff", padding: "24px" } → content
679
+
680
+ Striped section pattern (alternating bg):
681
+ Odd cells: { backgroundColor: "#f8f9fa" }
682
+ Even cells: { backgroundColor: "#ffffff" }
683
+
684
+ Full-width divider cell (visual separator):
685
+ layout-cell style: { borderBottom: "1px solid #e0e0e0", padding: "0" }
686
+
687
+ ─────────────────────────────────────────────
688
+ ### Styling DOS and DON'TS
689
+ ─────────────────────────────────────────────
690
+ ✅ DO apply backgroundColor + padding + borderRadius to layout-cells for sections
691
+ ✅ DO use card component for elevated content blocks with a title
692
+ ✅ DO use the "style" key (not "props") for layout-cell visual styles
693
+ ✅ DO use fullWidth:true on all fields in multi-column cells
694
+ ✅ DO use MUI color tokens ("primary", "success") for interactive components
695
+ ✅ DO use hex colors for decorative backgrounds/borders
696
+ ✅ DO set gap on layout nodes and padding on cells to create whitespace
697
+
698
+ ❌ DON'T use "container" component — it is banned
699
+ ❌ DON'T put style props inside "props" of a layout-cell — use "style"
700
+ ❌ DON'T use inline styles on individual field components — use cell styling
701
+ ❌ DON'T forget borderRadius when using backgroundColor on cells (looks cut off without it)
702
+ ❌ DON'T mix cols and non-cells children inside a layout — only layout-cell children allowed
703
+ `.trim()
704
+
705
+ // ─────────────────────────────────────────────────────────────────────────────
706
+
707
+ const FULL_EXAMPLES = `
708
+ ## FULL SCHEMA EXAMPLES
709
+
710
+ ─────────────────────────────────────────
711
+ EXAMPLE 1 — Login Form (centered card, dark header)
712
+ ─────────────────────────────────────────
713
+ Root is layout cols:1. Dark header cell + white body cell. Shows cell-level styling.
714
+ {
715
+ "type": "schema",
716
+ "message": "Login form with a dark header and white body, centered content.",
717
+ "schema": {
718
+ "root": {
719
+ "type": "layout",
720
+ "props": { "cols": 1, "gap": 0 },
721
+ "children": [
722
+ {
723
+ "type": "layout-cell", "props": {},
724
+ "style": { "padding": "20px 32px", "backgroundColor": "#1a237e" },
725
+ "children": [
726
+ { "type": "header", "props": { "text": "Sign In", "variant": "h5", "align": "center" }, "children": [] },
727
+ { "type": "label", "props": { "text": "Welcome back. Please enter your credentials.", "variant": "body2", "align": "center", "color": "#90caf9" }, "children": [] }
728
+ ]
729
+ },
730
+ {
731
+ "type": "layout-cell", "props": {},
732
+ "style": { "padding": "32px", "backgroundColor": "#ffffff" },
733
+ "children": [
734
+ { "type": "input", "props": { "label": "Email Address", "key": "email", "placeholder": "you@example.com", "required": true, "fullWidth": true }, "children": [] },
735
+ { "type": "input", "props": { "label": "Password", "key": "password", "placeholder": "Enter password", "required": true, "fullWidth": true }, "children": [] },
736
+ { "type": "checkbox", "props": { "label": "Remember me", "key": "rememberMe" }, "children": [] },
737
+ { "type": "button", "props": { "label": "Sign In", "variant": "contained", "color": "primary", "fullWidth": true }, "children": [] },
738
+ { "type": "link", "props": { "text": "Forgot password?", "href": "/reset", "target": "_self" }, "children": [] }
739
+ ]
740
+ }
741
+ ]
742
+ }
743
+ }
744
+ }
745
+
746
+ ─────────────────────────────────────────
747
+ EXAMPLE 2 — User Registration Form (2-column layout, styled sections)
748
+ ─────────────────────────────────────────
749
+ Root is layout cols:1. Each section is a styled cell. Inner 2-col layout for side-by-side fields.
750
+ {
751
+ "type": "schema",
752
+ "message": "Registration form with styled sections and 2-column field grid.",
753
+ "schema": {
754
+ "root": {
755
+ "type": "layout",
756
+ "props": { "cols": 1, "gap": 0 },
757
+ "children": [
758
+ {
759
+ "type": "layout-cell", "props": {},
760
+ "style": { "padding": "20px 24px", "backgroundColor": "#1976d2" },
761
+ "children": [
762
+ { "type": "header", "props": { "text": "Create Account", "variant": "h5" }, "children": [] }
763
+ ]
764
+ },
765
+ {
766
+ "type": "layout-cell", "props": {},
767
+ "style": { "padding": "24px", "backgroundColor": "#f8f9fa" },
768
+ "children": [
769
+ { "type": "banner", "props": { "message": "All fields marked * are required.", "severity": "info" }, "children": [] }
770
+ ]
771
+ },
772
+ {
773
+ "type": "layout-cell", "props": {},
774
+ "style": { "padding": "24px" },
775
+ "children": [
776
+ {
777
+ "type": "layout",
778
+ "props": { "cols": 2, "gap": 16 },
779
+ "children": [
780
+ { "type": "layout-cell", "props": {}, "children": [
781
+ { "type": "input", "props": { "label": "First Name", "key": "firstName", "required": true, "fullWidth": true }, "children": [] }
782
+ ]},
783
+ { "type": "layout-cell", "props": {}, "children": [
784
+ { "type": "input", "props": { "label": "Last Name", "key": "lastName", "required": true, "fullWidth": true }, "children": [] }
785
+ ]},
786
+ { "type": "layout-cell", "props": {}, "children": [
787
+ { "type": "input", "props": { "label": "Email", "key": "email", "required": true, "fullWidth": true }, "children": [] }
788
+ ]},
789
+ { "type": "layout-cell", "props": {}, "children": [
790
+ { "type": "input", "props": { "label": "Phone Number", "key": "phone", "fullWidth": true }, "children": [] }
791
+ ]},
792
+ { "type": "layout-cell", "props": {}, "children": [
793
+ { "type": "datepicker", "props": { "label": "Date of Birth", "key": "dob", "required": true, "fullWidth": true }, "children": [] }
794
+ ]},
795
+ { "type": "layout-cell", "props": {}, "children": [
796
+ { "type": "dropdown", "props": { "label": "Gender", "key": "gender", "fullWidth": true, "options": [{ "label": "Male", "value": "male" }, { "label": "Female", "value": "female" }, { "label": "Other", "value": "other" }] }, "children": [] }
797
+ ]}
798
+ ]
799
+ },
800
+ { "type": "textarea", "props": { "label": "Bio", "key": "bio", "placeholder": "Tell us about yourself...", "rows": 3 }, "children": [] },
801
+ { "type": "checkbox", "props": { "label": "I agree to the Terms and Conditions", "key": "agreed", "required": true }, "children": [] }
802
+ ]
803
+ },
804
+ {
805
+ "type": "layout-cell", "props": {},
806
+ "style": { "padding": "16px 24px", "backgroundColor": "#f8f9fa", "borderTop": "1px solid #e0e0e0" },
807
+ "children": [
808
+ {
809
+ "type": "layout",
810
+ "props": { "cols": 2, "gap": 12 },
811
+ "children": [
812
+ { "type": "layout-cell", "props": {}, "children": [
813
+ { "type": "button", "props": { "label": "Cancel", "variant": "outlined", "color": "secondary", "fullWidth": true }, "children": [] }
814
+ ]},
815
+ { "type": "layout-cell", "props": {}, "children": [
816
+ { "type": "button", "props": { "label": "Create Account", "variant": "contained", "color": "primary", "fullWidth": true }, "children": [] }
817
+ ]}
818
+ ]
819
+ }
820
+ ]
821
+ }
822
+ ]
823
+ }
824
+ }
825
+ }
826
+
827
+ ─────────────────────────────────────────
828
+ EXAMPLE 3 — KPI Executive Dashboard (styled header + shadow cards)
829
+ ─────────────────────────────────────────
830
+ Root is layout cols:1. Dark header, then nested layouts for KPI rows. Each KPI cell has shadow styling.
831
+ {
832
+ "type": "schema",
833
+ "message": "Executive dashboard with dark header, shadow KPI cards, and chart row.",
834
+ "schema": {
835
+ "root": {
836
+ "type": "layout",
837
+ "props": { "cols": 1, "gap": 24 },
838
+ "children": [
839
+ {
840
+ "type": "layout-cell", "props": {},
841
+ "style": { "padding": "20px 24px", "backgroundColor": "#0d47a1" },
842
+ "children": [
843
+ { "type": "header", "props": { "text": "Executive Dashboard", "variant": "h5" }, "children": [] },
844
+ { "type": "label", "props": { "text": "Last updated: Today, 09:11 AM", "variant": "caption", "color": "#90caf9" }, "children": [] }
845
+ ]
846
+ },
847
+ {
848
+ "type": "layout-cell", "props": {},
849
+ "style": { "padding": "0 24px" },
850
+ "children": [
851
+ { "type": "header", "props": { "text": "Key Metrics", "variant": "h6" }, "children": [] }
852
+ ]
853
+ },
854
+ {
855
+ "type": "layout-cell", "props": {},
856
+ "style": { "padding": "0 24px" },
857
+ "children": [
858
+ {
859
+ "type": "layout",
860
+ "props": { "cols": 4, "gap": 16 },
861
+ "children": [
862
+ { "type": "layout-cell", "style": { "padding": "16px", "backgroundColor": "#ffffff", "borderRadius": "8px", "boxShadow": "0 2px 8px rgba(0,0,0,0.08)" }, "props": {}, "children": [
863
+ { "type": "kpi-metric", "props": { "label": "Total Revenue", "value": 1284500, "unit": "$", "precision": 0 }, "children": [] }
864
+ ]},
865
+ { "type": "layout-cell", "style": { "padding": "16px", "backgroundColor": "#ffffff", "borderRadius": "8px", "boxShadow": "0 2px 8px rgba(0,0,0,0.08)" }, "props": {}, "children": [
866
+ { "type": "kpi-trend", "props": { "label": "Monthly Sales", "value": 54200, "change": 12.4, "changeLabel": "vs last month" }, "children": [] }
867
+ ]},
868
+ { "type": "layout-cell", "style": { "padding": "16px", "backgroundColor": "#ffffff", "borderRadius": "8px", "boxShadow": "0 2px 8px rgba(0,0,0,0.08)" }, "props": {}, "children": [
869
+ { "type": "kpi-metric", "props": { "label": "Active Users", "value": 8342, "precision": 0 }, "children": [] }
870
+ ]},
871
+ { "type": "layout-cell", "style": { "padding": "16px", "backgroundColor": "#ffffff", "borderRadius": "8px", "boxShadow": "0 2px 8px rgba(0,0,0,0.08)" }, "props": {}, "children": [
872
+ { "type": "kpi-badge", "props": { "label": "Open Tickets", "value": 47, "color": "#f57c00" }, "children": [] }
873
+ ]}
874
+ ]
875
+ }
876
+ ]
877
+ },
878
+ {
879
+ "type": "layout-cell", "props": {},
880
+ "style": { "padding": "0 24px" },
881
+ "children": [
882
+ {
883
+ "type": "layout",
884
+ "props": { "cols": 3, "gap": 16 },
885
+ "children": [
886
+ { "type": "layout-cell", "style": { "padding": "16px", "backgroundColor": "#ffffff", "borderRadius": "8px", "boxShadow": "0 2px 8px rgba(0,0,0,0.08)" }, "props": {}, "children": [
887
+ { "type": "kpi-chart", "props": { "label": "Revenue Trend", "chartType": "area", "dataKey": "revenueSeries", "xKey": "month" }, "children": [] }
888
+ ]},
889
+ { "type": "layout-cell", "style": { "padding": "16px", "backgroundColor": "#ffffff", "borderRadius": "8px", "boxShadow": "0 2px 8px rgba(0,0,0,0.08)" }, "props": {}, "children": [
890
+ { "type": "kpi-donut", "props": { "label": "Sales by Region", "dataKey": "regionSales", "nameKey": "region", "valueKey": "amount" }, "children": [] }
891
+ ]},
892
+ { "type": "layout-cell", "style": { "padding": "16px", "backgroundColor": "#ffffff", "borderRadius": "8px", "boxShadow": "0 2px 8px rgba(0,0,0,0.08)" }, "props": {}, "children": [
893
+ { "type": "kpi-gauge", "props": { "label": "Target Achievement", "value": 78, "min": 0, "max": 100, "unit": "%" }, "children": [] }
894
+ ]}
895
+ ]
896
+ }
897
+ ]
898
+ }
899
+ ]
900
+ }
901
+ }
902
+ }
903
+
904
+ ─────────────────────────────────────────
905
+ EXAMPLE 4 — Data Management Page (toolbar + filters + grid)
906
+ ─────────────────────────────────────────
907
+ Root is layout cols:1. Header section, filter card, data grid, report — each in own styled cell.
908
+ {
909
+ "type": "schema",
910
+ "message": "Order management page with page header, filters, data grid, and report.",
911
+ "schema": {
912
+ "root": {
913
+ "type": "layout",
914
+ "props": { "cols": 1, "gap": 20 },
915
+ "children": [
916
+ {
917
+ "type": "layout-cell", "props": {},
918
+ "style": { "padding": "20px 24px", "backgroundColor": "#263238" },
919
+ "children": [
920
+ { "type": "header", "props": { "text": "Order Management", "variant": "h5" }, "children": [] }
921
+ ]
922
+ },
923
+ {
924
+ "type": "layout-cell", "props": {},
925
+ "style": { "padding": "0 24px" },
926
+ "children": [
927
+ {
928
+ "type": "card",
929
+ "props": { "title": "Filters", "elevation": 1 },
930
+ "children": [
931
+ {
932
+ "type": "layout",
933
+ "props": { "cols": 4, "gap": 12 },
934
+ "children": [
935
+ { "type": "layout-cell", "props": {}, "children": [
936
+ { "type": "input", "props": { "label": "Search", "key": "search", "placeholder": "Order ID, customer...", "fullWidth": true }, "children": [] }
937
+ ]},
938
+ { "type": "layout-cell", "props": {}, "children": [
939
+ { "type": "dropdown", "props": { "label": "Status", "key": "statusFilter", "fullWidth": true, "options": [{ "label": "All", "value": "" }, { "label": "Pending", "value": "pending" }, { "label": "Shipped", "value": "shipped" }, { "label": "Delivered", "value": "delivered" }] }, "children": [] }
940
+ ]},
941
+ { "type": "layout-cell", "props": {}, "children": [
942
+ { "type": "datepicker", "props": { "label": "From Date", "key": "fromDate", "fullWidth": true }, "children": [] }
943
+ ]},
944
+ { "type": "layout-cell", "props": {}, "children": [
945
+ { "type": "datepicker", "props": { "label": "To Date", "key": "toDate", "fullWidth": true }, "children": [] }
946
+ ]}
947
+ ]
948
+ },
949
+ {
950
+ "type": "layout",
951
+ "props": { "cols": 4, "gap": 8 },
952
+ "children": [
953
+ { "type": "layout-cell", "props": {}, "children": [
954
+ { "type": "button", "props": { "label": "Search", "variant": "contained", "color": "primary", "fullWidth": true }, "children": [] }
955
+ ]},
956
+ { "type": "layout-cell", "props": {}, "children": [
957
+ { "type": "button", "props": { "label": "Clear", "variant": "outlined", "color": "secondary", "fullWidth": true }, "children": [] }
958
+ ]},
959
+ { "type": "layout-cell", "props": {}, "children": [
960
+ { "type": "button", "props": { "label": "Export", "variant": "outlined", "color": "success", "fullWidth": true }, "children": [] }
961
+ ]},
962
+ { "type": "layout-cell", "props": {}, "children": [] }
963
+ ]
964
+ }
965
+ ]
966
+ }
967
+ ]
968
+ },
969
+ {
970
+ "type": "layout-cell", "props": {},
971
+ "style": { "padding": "0 24px" },
972
+ "children": [
973
+ { "type": "data-grid", "props": { "label": "Orders", "endpoint": "GetAllOrders", "serviceId": "OrderService", "height": 450 }, "children": [] }
974
+ ]
975
+ },
976
+ {
977
+ "type": "layout-cell", "props": {},
978
+ "style": { "padding": "0 24px 24px" },
979
+ "children": [
980
+ { "type": "header", "props": { "text": "Sales Summary Report", "variant": "h6" }, "children": [] },
981
+ { "type": "reportViewer", "props": { "reportId": "sales-summary" }, "children": [] }
982
+ ]
983
+ }
984
+ ]
985
+ }
986
+ }
987
+ }
988
+
989
+ ─────────────────────────────────────────
990
+ EXAMPLE 5 — Multi-step Wizard (styled steps, accent borders)
991
+ ─────────────────────────────────────────
992
+ Root is layout cols:1. Wizard inside a styled cell with border and shadow.
993
+ {
994
+ "type": "schema",
995
+ "message": "3-step employee onboarding wizard with styled card wrapper.",
996
+ "schema": {
997
+ "root": {
998
+ "type": "layout",
999
+ "props": { "cols": 1, "gap": 0 },
1000
+ "children": [
1001
+ {
1002
+ "type": "layout-cell", "props": {},
1003
+ "style": { "padding": "20px 24px", "backgroundColor": "#1565c0" },
1004
+ "children": [
1005
+ { "type": "header", "props": { "text": "Employee Onboarding", "variant": "h5" }, "children": [] }
1006
+ ]
1007
+ },
1008
+ {
1009
+ "type": "layout-cell", "props": {},
1010
+ "style": { "padding": "24px", "backgroundColor": "#f8f9fa" },
1011
+ "children": [
1012
+ {
1013
+ "type": "wizard",
1014
+ "props": { "orientation": "horizontal", "linear": true },
1015
+ "children": [
1016
+ {
1017
+ "type": "wizard-step",
1018
+ "props": { "label": "Personal Info" },
1019
+ "children": [
1020
+ {
1021
+ "type": "layout",
1022
+ "props": { "cols": 2, "gap": 16 },
1023
+ "children": [
1024
+ { "type": "layout-cell", "props": {}, "children": [
1025
+ { "type": "input", "props": { "label": "First Name", "key": "firstName", "required": true, "fullWidth": true }, "children": [] }
1026
+ ]},
1027
+ { "type": "layout-cell", "props": {}, "children": [
1028
+ { "type": "input", "props": { "label": "Last Name", "key": "lastName", "required": true, "fullWidth": true }, "children": [] }
1029
+ ]},
1030
+ { "type": "layout-cell", "props": {}, "children": [
1031
+ { "type": "input", "props": { "label": "Email", "key": "email", "required": true, "fullWidth": true }, "children": [] }
1032
+ ]},
1033
+ { "type": "layout-cell", "props": {}, "children": [
1034
+ { "type": "input", "props": { "label": "Phone", "key": "phone", "fullWidth": true }, "children": [] }
1035
+ ]}
1036
+ ]
1037
+ }
1038
+ ]
1039
+ },
1040
+ {
1041
+ "type": "wizard-step",
1042
+ "props": { "label": "Role & Department" },
1043
+ "children": [
1044
+ {
1045
+ "type": "layout",
1046
+ "props": { "cols": 2, "gap": 16 },
1047
+ "children": [
1048
+ { "type": "layout-cell", "props": {}, "children": [
1049
+ { "type": "dropdown", "props": { "label": "Department", "key": "department", "required": true, "fullWidth": true, "options": [{ "label": "Engineering", "value": "eng" }, { "label": "Sales", "value": "sales" }, { "label": "HR", "value": "hr" }, { "label": "Finance", "value": "finance" }] }, "children": [] }
1050
+ ]},
1051
+ { "type": "layout-cell", "props": {}, "children": [
1052
+ { "type": "dropdown", "props": { "label": "Role", "key": "role", "required": true, "fullWidth": true, "options": [{ "label": "Manager", "value": "manager" }, { "label": "Senior", "value": "senior" }, { "label": "Junior", "value": "junior" }] }, "children": [] }
1053
+ ]},
1054
+ { "type": "layout-cell", "props": {}, "children": [
1055
+ { "type": "datepicker", "props": { "label": "Start Date", "key": "startDate", "required": true, "fullWidth": true }, "children": [] }
1056
+ ]},
1057
+ { "type": "layout-cell", "props": {}, "children": [
1058
+ { "type": "number", "props": { "label": "Salary", "key": "salary", "prefix": "$", "decimalScale": 0, "fullWidth": true }, "children": [] }
1059
+ ]}
1060
+ ]
1061
+ },
1062
+ { "type": "tag", "props": { "label": "Skills", "key": "skills", "multiple": true, "options": [{ "label": "Leadership", "value": "leadership" }, { "label": "Communication", "value": "communication" }, { "label": "Technical", "value": "technical" }] }, "children": [] }
1063
+ ]
1064
+ },
1065
+ {
1066
+ "type": "wizard-step",
1067
+ "props": { "label": "Review & Sign" },
1068
+ "children": [
1069
+ {
1070
+ "type": "layout-cell", "props": {},
1071
+ "style": { "padding": "12px 16px", "borderLeft": "4px solid #1976d2", "backgroundColor": "#e3f2fd", "borderRadius": "0 8px 8px 0" },
1072
+ "children": [
1073
+ { "type": "label", "props": { "text": "Please review the information above and sign below to confirm.", "variant": "body2" }, "children": [] }
1074
+ ]
1075
+ },
1076
+ { "type": "toggle", "props": { "label": "Send welcome email", "key": "sendWelcomeEmail" }, "children": [] },
1077
+ { "type": "signature", "props": { "label": "Employee Signature", "key": "signature" }, "children": [] },
1078
+ { "type": "checkbox", "props": { "label": "I confirm all details are correct", "key": "confirmed", "required": true }, "children": [] }
1079
+ ]
1080
+ }
1081
+ ]
1082
+ }
1083
+ ]
1084
+ }
1085
+ ]
1086
+ }
1087
+ }
1088
+ }
1089
+ `.trim()
1090
+
1091
+ // ─────────────────────────────────────────────────────────────────────────────
1092
+
1093
+ const OUTPUT_FORMAT = `
1094
+ ## Output format
1095
+
1096
+ When generating or modifying a schema, reply with a brief explanation then ONE JSON code block:
1097
+
1098
+ \`\`\`json
1099
+ {
1100
+ "type": "schema",
1101
+ "message": "One sentence describing what was built or changed.",
1102
+ "schema": {
1103
+ "root": { ... }
1104
+ }
1105
+ }
1106
+ \`\`\`
1107
+
1108
+ When you need clarification or are answering a question, respond with plain text only — no code block.
1109
+
1110
+ Never produce partial schemas. Always output a complete, valid tree. Default to rich, well-structured layouts.
1111
+
1112
+ Before outputting, mentally verify every layout node:
1113
+ - cols is an explicit number ✓
1114
+ - gap is an explicit number ✓
1115
+ - Each layout-cell has exactly one direct child ✓
1116
+ - Total layout-cells = rows × cols ✓
1117
+ - All fields inside cells have fullWidth: true ✓
1118
+ `.trim()
1119
+
1120
+ // ─────────────────────────────────────────────────────────────────────────────
1121
+
1122
+ export function buildSystemPrompt() {
1123
+ return `You are an AI assistant embedded in a visual UI builder called RoboByte Front Builder. Your job is to generate and modify complete, production-quality UI schemas from the user's description. You have deep knowledge of every component, its purpose, and how to compose them effectively.
1124
+
1125
+ ${SCHEMA_FORMAT}
1126
+
1127
+ ## Available component types (live catalog)
1128
+ ${catalogList()}
1129
+
1130
+ ${FIELDS_REFERENCE}
1131
+
1132
+ ${DISPLAY_REFERENCE}
1133
+
1134
+ ${STRUCTURE_REFERENCE}
1135
+
1136
+ ${DATA_REFERENCE}
1137
+
1138
+ ${KPI_REFERENCE}
1139
+
1140
+ ${NESTING_RULES}
1141
+
1142
+ ${LAYOUT_PREFERENCE}
1143
+
1144
+ ${GRID_RULES}
1145
+
1146
+ ${STYLING_REFERENCE}
1147
+
1148
+ ${FULL_EXAMPLES}
1149
+
1150
+ ${OUTPUT_FORMAT}`
1151
+ }