betterstart-cli 0.0.1
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.
- package/README.md +5 -0
- package/dist/assets/adapters/next/integrations/mailchimp/actions/mailchimp.ts +38 -0
- package/dist/assets/adapters/next/integrations/mailchimp/integration.ts +33 -0
- package/dist/assets/adapters/next/integrations/r2/actions/r2.ts +77 -0
- package/dist/assets/adapters/next/integrations/r2/integration.ts +39 -0
- package/dist/assets/adapters/next/integrations/resend/actions/resend.ts +138 -0
- package/dist/assets/adapters/next/integrations/resend/integration.ts +36 -0
- package/dist/assets/adapters/next/plugins/blog/plugin.ts +17 -0
- package/dist/assets/adapters/next/plugins/blog/schemas/posts.json +169 -0
- package/dist/assets/adapters/next/templates/init/admin-globals.css +677 -0
- package/dist/assets/adapters/next/templates/init/api/auth-route.ts +3 -0
- package/dist/assets/adapters/next/templates/init/api/upload-route.ts +132 -0
- package/dist/assets/adapters/next/templates/init/components/layouts/admin-header.tsx +32 -0
- package/dist/assets/adapters/next/templates/init/components/layouts/admin-nav-link.tsx +23 -0
- package/dist/assets/adapters/next/templates/init/components/layouts/admin-providers.tsx +33 -0
- package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-branding-rsc.tsx +8 -0
- package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-branding-skeleton.tsx +10 -0
- package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-nav-link-skeleton.tsx +11 -0
- package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-nav-link.tsx +12 -0
- package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-user-menu-skeleton.tsx +15 -0
- package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-user-menu.tsx +90 -0
- package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar.tsx +78 -0
- package/dist/assets/adapters/next/templates/init/components/layouts/admin-sign-out.tsx +44 -0
- package/dist/assets/adapters/next/templates/init/components/layouts/content-skeleton.tsx +44 -0
- package/dist/assets/adapters/next/templates/init/components/layouts/sidebar-branding.tsx +41 -0
- package/dist/assets/adapters/next/templates/init/components/shared/data-table/data-table-pagination.tsx +139 -0
- package/dist/assets/adapters/next/templates/init/components/shared/data-table/data-table.tsx +236 -0
- package/dist/assets/adapters/next/templates/init/components/shared/delete-dialog.tsx +67 -0
- package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/copyable-code-block.tsx +104 -0
- package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/dev-mode-code-mirror.tsx +68 -0
- package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/dev-mode-types.ts +75 -0
- package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/lifecycle-hooks-tab.tsx +111 -0
- package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/plain-code-fallback.tsx +11 -0
- package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/snippets-tab.tsx +125 -0
- package/dist/assets/adapters/next/templates/init/components/shared/dev-mode-integrate.tsx +108 -0
- package/dist/assets/adapters/next/templates/init/components/shared/entity-filters-bar.tsx +184 -0
- package/dist/assets/adapters/next/templates/init/components/shared/entity-metadata.tsx +93 -0
- package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-version-item.tsx +55 -0
- package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-version-restore-dialog.tsx +80 -0
- package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-button.tsx +74 -0
- package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-current-row.tsx +48 -0
- package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-drawer.tsx +79 -0
- package/dist/assets/adapters/next/templates/init/components/shared/media/edit-media-dialog-content.tsx +222 -0
- package/dist/assets/adapters/next/templates/init/components/shared/media/edit-media-dialog.tsx +56 -0
- package/dist/assets/adapters/next/templates/init/components/shared/media/media-delete-dialog.tsx +83 -0
- package/dist/assets/adapters/next/templates/init/components/shared/media/media-delete-drawer.tsx +148 -0
- package/dist/assets/adapters/next/templates/init/components/shared/media/media-empty-state.tsx +45 -0
- package/dist/assets/adapters/next/templates/init/components/shared/media/media-filters-bar.tsx +129 -0
- package/dist/assets/adapters/next/templates/init/components/shared/media/media-gallery-dialog.tsx +182 -0
- package/dist/assets/adapters/next/templates/init/components/shared/media/media-grid-item.tsx +56 -0
- package/dist/assets/adapters/next/templates/init/components/shared/media/media-grid-pagination.tsx +114 -0
- package/dist/assets/adapters/next/templates/init/components/shared/media/media-grid.tsx +44 -0
- package/dist/assets/adapters/next/templates/init/components/shared/media/media-preview.tsx +69 -0
- package/dist/assets/adapters/next/templates/init/components/shared/media/media-url-importer.tsx +139 -0
- package/dist/assets/adapters/next/templates/init/components/shared/page-header.tsx +46 -0
- package/dist/assets/adapters/next/templates/init/components/shared/search-input.tsx +88 -0
- package/dist/assets/adapters/next/templates/init/components/shared/sort-indicator.tsx +24 -0
- package/dist/assets/adapters/next/templates/init/components/shared/sort-order-dialog.tsx +242 -0
- package/dist/assets/adapters/next/templates/init/components/shared/sort-order-drag-overlay-item.tsx +15 -0
- package/dist/assets/adapters/next/templates/init/components/shared/sort-order-item.tsx +32 -0
- package/dist/assets/adapters/next/templates/init/components/shared/sort-order-types.ts +9 -0
- package/dist/assets/adapters/next/templates/init/data/navigation.ts +43 -0
- package/dist/assets/adapters/next/templates/init/drizzle.config.ts +36 -0
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-blockquote.ts +251 -0
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-code-block.ts +258 -0
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-color-highlight.ts +347 -0
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-media-insertion.ts +59 -0
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-mobile-toolbar.ts +17 -0
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-slash-menu.ts +116 -0
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-source-mode.tsx +638 -0
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-table-add-controls.ts +174 -0
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor.ts +288 -0
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-heading-dropdown-menu.ts +127 -0
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-heading.ts +269 -0
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-is-breakpoint.ts +32 -0
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-link-popover.ts +278 -0
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-list-dropdown-menu.ts +199 -0
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-list.ts +290 -0
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-mark.ts +199 -0
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-menu-navigation.ts +221 -0
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-tiptap-editor.ts +46 -0
- package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-undo-redo.ts +169 -0
- package/dist/assets/adapters/next/templates/init/hooks/use-admin-theme.tsx +74 -0
- package/dist/assets/adapters/next/templates/init/hooks/use-copy-to-clipboard.ts +48 -0
- package/dist/assets/adapters/next/templates/init/hooks/use-dev-mode-integration.ts +43 -0
- package/dist/assets/adapters/next/templates/init/hooks/use-entity-versions.ts +32 -0
- package/dist/assets/adapters/next/templates/init/hooks/use-failed-image-url.ts +21 -0
- package/dist/assets/adapters/next/templates/init/hooks/use-local-storage.ts +46 -0
- package/dist/assets/adapters/next/templates/init/hooks/use-media-filters-bar.ts +72 -0
- package/dist/assets/adapters/next/templates/init/hooks/use-media.ts +102 -0
- package/dist/assets/adapters/next/templates/init/hooks/use-mobile.ts +19 -0
- package/dist/assets/adapters/next/templates/init/hooks/use-page-boundary-blur-visibility.ts +59 -0
- package/dist/assets/adapters/next/templates/init/hooks/use-page-scroll-threshold.ts +27 -0
- package/dist/assets/adapters/next/templates/init/hooks/use-table-utils.ts +315 -0
- package/dist/assets/adapters/next/templates/init/hooks/use-upload.ts +321 -0
- package/dist/assets/adapters/next/templates/init/hooks/use-users.ts +12 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/auth/auth.ts +58 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/auth/client.ts +12 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/auth/middleware.ts +46 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/email/form-delivery.ts +72 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/email/index.ts +4 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/email/is-email-delivery-configured.ts +5 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/email/none.ts +24 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/email/provider.ts +6 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/email/send-email.ts +6 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/email/send-password-reset-email.ts +10 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/email/types.ts +25 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/entity-versions/get-entity-versions.ts +48 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/entity-versions/index.ts +10 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/entity-versions/internal-create-entity-version.ts +43 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/entity-versions/internal-delete-entity-versions.ts +19 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/entity-versions/types.ts +26 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/forms/get-all-form-settings.ts +21 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/forms/get-form-settings.ts +27 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/forms/index.ts +9 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/forms/test-form-webhook.ts +40 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/forms/types.ts +26 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/forms/upsert-form-settings.ts +40 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/media/create-media.ts +39 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/media/delete-media-bulk.ts +29 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/media/delete-media.ts +22 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/media/get-media-by-id.ts +18 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/media/get-media-by-ids.ts +25 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/media/get-media.ts +71 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/media/index.ts +14 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/media/types.ts +31 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/media/update-media.ts +35 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/profile/index.ts +4 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/profile/invalidate-users-cache.ts +14 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/profile/is-email-configured.ts +7 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/profile/types.ts +4 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/profile/update-email.ts +57 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/storage/index.ts +2 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/storage/local.ts +31 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/storage/provider.ts +6 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/storage/save-upload.ts +11 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/storage/types.ts +18 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/upload/index.ts +9 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/upload/types.ts +17 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/upload/upload-file.ts +11 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/upload/upload-files.ts +92 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/upload/upload-image-from-url.ts +22 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/upload/upload-media-from-url.ts +133 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/users/create-user.ts +55 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/users/delete-user.ts +24 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/users/get-users.ts +49 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/users/index.ts +12 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/users/types.ts +43 -0
- package/dist/assets/adapters/next/templates/init/lib/actions/users/update-user-role.ts +28 -0
- package/dist/assets/adapters/next/templates/init/lib/db/client.ts +13 -0
- package/dist/assets/adapters/next/templates/init/lib/db/core/schema.ts +160 -0
- package/dist/assets/adapters/next/templates/init/lib/db/schema.ts +1 -0
- package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/index.ts +19 -0
- package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/register.local.ts +2 -0
- package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/register.ts +9 -0
- package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/registry.ts +55 -0
- package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/runner.ts +51 -0
- package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/types.ts +39 -0
- package/dist/assets/adapters/next/templates/init/pages/account-layout.tsx +11 -0
- package/dist/assets/adapters/next/templates/init/pages/account-shell-rsc.tsx +30 -0
- package/dist/assets/adapters/next/templates/init/pages/admin-layout.tsx +24 -0
- package/dist/assets/adapters/next/templates/init/pages/auth-gate-rsc.tsx +6 -0
- package/dist/assets/adapters/next/templates/init/pages/authenticated-layout.tsx +18 -0
- package/dist/assets/adapters/next/templates/init/pages/dashboard-page.tsx +121 -0
- package/dist/assets/adapters/next/templates/init/pages/forgot-password-form.tsx +124 -0
- package/dist/assets/adapters/next/templates/init/pages/forgot-password-page-skeleton.tsx +24 -0
- package/dist/assets/adapters/next/templates/init/pages/forgot-password-page.tsx +21 -0
- package/dist/assets/adapters/next/templates/init/pages/login-form.tsx +131 -0
- package/dist/assets/adapters/next/templates/init/pages/login-page-rsc.tsx +14 -0
- package/dist/assets/adapters/next/templates/init/pages/login-page-skeleton.tsx +26 -0
- package/dist/assets/adapters/next/templates/init/pages/login-page.tsx +21 -0
- package/dist/assets/adapters/next/templates/init/pages/media/media-page-content.tsx +273 -0
- package/dist/assets/adapters/next/templates/init/pages/media/media-page-skeleton.tsx +7 -0
- package/dist/assets/adapters/next/templates/init/pages/media/media-page.tsx +11 -0
- package/dist/assets/adapters/next/templates/init/pages/minimal-account-shell.tsx +25 -0
- package/dist/assets/adapters/next/templates/init/pages/profile/profile-form.tsx +281 -0
- package/dist/assets/adapters/next/templates/init/pages/profile/profile-page.tsx +31 -0
- package/dist/assets/adapters/next/templates/init/pages/reset-password-form.tsx +161 -0
- package/dist/assets/adapters/next/templates/init/pages/reset-password-page-skeleton.tsx +26 -0
- package/dist/assets/adapters/next/templates/init/pages/reset-password-page.tsx +21 -0
- package/dist/assets/adapters/next/templates/init/pages/users/columns.tsx +170 -0
- package/dist/assets/adapters/next/templates/init/pages/users/create-user-dialog.tsx +221 -0
- package/dist/assets/adapters/next/templates/init/pages/users/delete-user-dialog.tsx +172 -0
- package/dist/assets/adapters/next/templates/init/pages/users/edit-role-dialog.tsx +91 -0
- package/dist/assets/adapters/next/templates/init/pages/users/users-page-content.tsx +25 -0
- package/dist/assets/adapters/next/templates/init/pages/users/users-page-skeleton.tsx +7 -0
- package/dist/assets/adapters/next/templates/init/pages/users/users-page.tsx +11 -0
- package/dist/assets/adapters/next/templates/init/pages/users/users-table.tsx +221 -0
- package/dist/assets/adapters/next/templates/init/types/auth.ts +71 -0
- package/dist/assets/adapters/next/templates/init/types/index.ts +108 -0
- package/dist/assets/adapters/next/templates/init/types/navigation.ts +11 -0
- package/dist/assets/adapters/next/templates/init/types/table-meta.ts +14 -0
- package/dist/assets/adapters/next/templates/init/utils/auth/roles.ts +17 -0
- package/dist/assets/adapters/next/templates/init/utils/date/date.ts +90 -0
- package/dist/assets/adapters/next/templates/init/utils/dev-mode/code-block-height.ts +9 -0
- package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-rich-extensions.ts +824 -0
- package/dist/assets/adapters/next/templates/init/utils/editor/content-editor.ts +316 -0
- package/dist/assets/adapters/next/templates/init/utils/editor/editor-view.ts +19 -0
- package/dist/assets/adapters/next/templates/init/utils/editor/markdown.ts +542 -0
- package/dist/assets/adapters/next/templates/init/utils/editor/node-attrs.ts +25 -0
- package/dist/assets/adapters/next/templates/init/utils/editor/slash-commands.ts +148 -0
- package/dist/assets/adapters/next/templates/init/utils/editor/source-media.ts +11 -0
- package/dist/assets/adapters/next/templates/init/utils/editor/table-add-controls.ts +91 -0
- package/dist/assets/adapters/next/templates/init/utils/editor/table-bubble.ts +172 -0
- package/dist/assets/adapters/next/templates/init/utils/editor/table-input.ts +5 -0
- package/dist/assets/adapters/next/templates/init/utils/editor/task-item.ts +19 -0
- package/dist/assets/adapters/next/templates/init/utils/editor/tiptap.ts +991 -0
- package/dist/assets/adapters/next/templates/init/utils/email/form-delivery.ts +104 -0
- package/dist/assets/adapters/next/templates/init/utils/media/fallback.ts +37 -0
- package/dist/assets/adapters/next/templates/init/utils/media/media.ts +91 -0
- package/dist/assets/adapters/next/templates/init/utils/media/query.ts +96 -0
- package/dist/assets/adapters/next/templates/init/utils/navigation/order.ts +6 -0
- package/dist/assets/adapters/next/templates/init/utils/navigation/sidebar.ts +26 -0
- package/dist/assets/adapters/next/templates/init/utils/page/boundary.ts +32 -0
- package/dist/assets/adapters/next/templates/init/utils/seo/seo.ts +90 -0
- package/dist/assets/adapters/next/templates/init/utils/shared/cn.ts +6 -0
- package/dist/assets/adapters/next/templates/init/utils/storage/local.ts +9 -0
- package/dist/assets/adapters/next/templates/init/utils/table/table.ts +10 -0
- package/dist/assets/adapters/next/templates/init/utils/text/text.ts +4 -0
- package/dist/assets/adapters/next/templates/init/utils/theme/system.ts +6 -0
- package/dist/assets/adapters/next/templates/init/utils/upload/remote.ts +55 -0
- package/dist/assets/adapters/next/templates/init/utils/upload/upload.ts +26 -0
- package/dist/assets/adapters/next/templates/init/utils/user/user.ts +11 -0
- package/dist/assets/adapters/next/templates/init/utils/validation/validation.ts +114 -0
- package/dist/assets/adapters/next/templates/init/utils/webhook/webhook.ts +28 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/editor-toolbar.tsx +25 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/horizontal-rule-button.tsx +22 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/index.tsx +142 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/main-toolbar-content.tsx +118 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/math-bubble-menu.tsx +80 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/math-button.tsx +22 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/math-editor-controls.tsx +117 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/math-popover-button.tsx +59 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/math-popover.tsx +6 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/media-gallery-block.tsx +31 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/mobile-toolbar-content.tsx +56 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/mode-toggle-button.tsx +29 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/remove-table-part-icon.tsx +17 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/selection-bubble-menu.tsx +105 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/slash-command-menu.tsx +65 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/source-mode-dropdown-button.tsx +52 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/source-mode.tsx +360 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/table-add-controls.tsx +46 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/table-bubble-menu.tsx +290 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/table-button.tsx +116 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-extension/node-background-extension.ts +138 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/horizontal-rule-node/horizontal-rule-node-extension.ts +10 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/media-gallery-placeholder-node/index.tsx +1 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/media-gallery-placeholder-node/media-gallery-placeholder-node-extension.ts +117 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/media-gallery-placeholder-node/media-gallery-placeholder-node.tsx +63 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/removable-image-node/index.tsx +1 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/removable-image-node/removable-image-node-extension.ts +11 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/removable-image-node/removable-image-node.tsx +168 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/task-item-node/task-item-node-extension.tsx +142 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/blockquote-button/blockquote-button.tsx +114 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/blockquote-button/index.tsx +1 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/code-block-button/code-block-button.tsx +112 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/code-block-button/index.tsx +1 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-button/color-highlight-button.tsx +185 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-button/index.tsx +1 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/color-highlight-popover-button.tsx +40 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/color-highlight-popover-content.tsx +130 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/color-highlight-popover.tsx +98 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/highlight-color-button.tsx +75 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/highlight-colors.ts +24 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/index.tsx +1 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/source-color-highlight-popover.tsx +65 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/control-options.ts +27 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu-item.tsx +35 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu.tsx +119 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/heading-dropdown-menu/index.tsx +1 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/index.tsx +1 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/link-button.tsx +39 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/link-content.tsx +13 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/link-control-popover.tsx +90 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/link-main.tsx +96 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/link-popover.tsx +121 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/list-dropdown-menu/index.tsx +1 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/list-dropdown-menu/list-dropdown-menu-item.tsx +44 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/list-dropdown-menu/list-dropdown-menu.tsx +115 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/mark-button/index.tsx +1 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/mark-button/mark-button.tsx +117 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/undo-redo-button/index.tsx +1 -0
- package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/undo-redo-button/undo-redo-button.tsx +115 -0
- package/dist/assets/shared-assets/react-admin/custom/date-picker.tsx +70 -0
- package/dist/assets/shared-assets/react-admin/custom/date-range-picker.tsx +216 -0
- package/dist/assets/shared-assets/react-admin/custom/dynamic-list-field.tsx +111 -0
- package/dist/assets/shared-assets/react-admin/custom/gallery-field.tsx +124 -0
- package/dist/assets/shared-assets/react-admin/custom/gallery-thumbnail.tsx +39 -0
- package/dist/assets/shared-assets/react-admin/custom/icon-picker.tsx +377 -0
- package/dist/assets/shared-assets/react-admin/custom/icons-column-skeleton.tsx +16 -0
- package/dist/assets/shared-assets/react-admin/custom/icons-data.ts +8 -0
- package/dist/assets/shared-assets/react-admin/custom/logo.tsx +115 -0
- package/dist/assets/shared-assets/react-admin/custom/media-gallery-field.tsx +182 -0
- package/dist/assets/shared-assets/react-admin/custom/page-skeleton.tsx +11 -0
- package/dist/assets/shared-assets/react-admin/custom/placeholder-card.tsx +34 -0
- package/dist/assets/shared-assets/react-admin/custom/placeholder.tsx +25 -0
- package/dist/assets/shared-assets/react-admin/custom/progressive-blur.tsx +62 -0
- package/dist/assets/shared-assets/react-admin/custom/sortable-gallery-item.tsx +68 -0
- package/dist/assets/shared-assets/react-admin/custom/upload-dropzone.tsx +107 -0
- package/dist/assets/shared-assets/react-admin/dependencies.ts +73 -0
- package/dist/assets/shared-assets/react-admin/schema.json +1670 -0
- package/dist/assets/shared-assets/react-admin/ui/accordion.tsx +86 -0
- package/dist/assets/shared-assets/react-admin/ui/alert-dialog.tsx +178 -0
- package/dist/assets/shared-assets/react-admin/ui/alert.tsx +72 -0
- package/dist/assets/shared-assets/react-admin/ui/aspect-ratio.tsx +9 -0
- package/dist/assets/shared-assets/react-admin/ui/avatar.tsx +95 -0
- package/dist/assets/shared-assets/react-admin/ui/badge.tsx +48 -0
- package/dist/assets/shared-assets/react-admin/ui/breadcrumb.tsx +99 -0
- package/dist/assets/shared-assets/react-admin/ui/button-group.tsx +76 -0
- package/dist/assets/shared-assets/react-admin/ui/button.tsx +66 -0
- package/dist/assets/shared-assets/react-admin/ui/calendar.tsx +184 -0
- package/dist/assets/shared-assets/react-admin/ui/card.tsx +94 -0
- package/dist/assets/shared-assets/react-admin/ui/carousel.tsx +239 -0
- package/dist/assets/shared-assets/react-admin/ui/chart.tsx +336 -0
- package/dist/assets/shared-assets/react-admin/ui/checkbox.tsx +28 -0
- package/dist/assets/shared-assets/react-admin/ui/collapsible.tsx +21 -0
- package/dist/assets/shared-assets/react-admin/ui/combobox.tsx +272 -0
- package/dist/assets/shared-assets/react-admin/ui/command.tsx +180 -0
- package/dist/assets/shared-assets/react-admin/ui/context-menu.tsx +243 -0
- package/dist/assets/shared-assets/react-admin/ui/dialog.tsx +141 -0
- package/dist/assets/shared-assets/react-admin/ui/direction.tsx +20 -0
- package/dist/assets/shared-assets/react-admin/ui/drawer.tsx +119 -0
- package/dist/assets/shared-assets/react-admin/ui/dropdown-menu.tsx +253 -0
- package/dist/assets/shared-assets/react-admin/ui/empty.tsx +93 -0
- package/dist/assets/shared-assets/react-admin/ui/field.tsx +234 -0
- package/dist/assets/shared-assets/react-admin/ui/form.tsx +172 -0
- package/dist/assets/shared-assets/react-admin/ui/hover-card.tsx +37 -0
- package/dist/assets/shared-assets/react-admin/ui/input-group.tsx +134 -0
- package/dist/assets/shared-assets/react-admin/ui/input-otp.tsx +85 -0
- package/dist/assets/shared-assets/react-admin/ui/input.tsx +18 -0
- package/dist/assets/shared-assets/react-admin/ui/item.tsx +180 -0
- package/dist/assets/shared-assets/react-admin/ui/kbd.tsx +26 -0
- package/dist/assets/shared-assets/react-admin/ui/label.tsx +20 -0
- package/dist/assets/shared-assets/react-admin/ui/menubar.tsx +259 -0
- package/dist/assets/shared-assets/react-admin/ui/native-select.tsx +54 -0
- package/dist/assets/shared-assets/react-admin/ui/navigation-menu.tsx +159 -0
- package/dist/assets/shared-assets/react-admin/ui/pagination.tsx +111 -0
- package/dist/assets/shared-assets/react-admin/ui/popover.tsx +75 -0
- package/dist/assets/shared-assets/react-admin/ui/progress.tsx +30 -0
- package/dist/assets/shared-assets/react-admin/ui/radio-group.tsx +43 -0
- package/dist/assets/shared-assets/react-admin/ui/resizable.tsx +41 -0
- package/dist/assets/shared-assets/react-admin/ui/scroll-area.tsx +54 -0
- package/dist/assets/shared-assets/react-admin/ui/select.tsx +183 -0
- package/dist/assets/shared-assets/react-admin/ui/separator.tsx +27 -0
- package/dist/assets/shared-assets/react-admin/ui/sheet.tsx +129 -0
- package/dist/assets/shared-assets/react-admin/ui/sidebar.tsx +688 -0
- package/dist/assets/shared-assets/react-admin/ui/skeleton.tsx +13 -0
- package/dist/assets/shared-assets/react-admin/ui/slider.tsx +53 -0
- package/dist/assets/shared-assets/react-admin/ui/sonner.tsx +45 -0
- package/dist/assets/shared-assets/react-admin/ui/spinner.tsx +15 -0
- package/dist/assets/shared-assets/react-admin/ui/switch.tsx +32 -0
- package/dist/assets/shared-assets/react-admin/ui/table.tsx +101 -0
- package/dist/assets/shared-assets/react-admin/ui/tabs.tsx +79 -0
- package/dist/assets/shared-assets/react-admin/ui/textarea.tsx +17 -0
- package/dist/assets/shared-assets/react-admin/ui/toggle-group.tsx +85 -0
- package/dist/assets/shared-assets/react-admin/ui/toggle.tsx +45 -0
- package/dist/assets/shared-assets/react-admin/ui/tooltip.tsx +51 -0
- package/dist/chunk-MUZQCVQA.js +306 -0
- package/dist/chunk-MUZQCVQA.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +23437 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +90 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/template-reader-YKWE2C7O.js +13 -0
- package/dist/template-reader-YKWE2C7O.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,1670 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://betterstart.dev/schemas/schema.json",
|
|
4
|
+
"title": "BetterStart Schema Definition",
|
|
5
|
+
"description": "JSON Schema for validating custom schema files (courses.json, testimonials.json, instructors.json, events.json, etc.)",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["name", "label"],
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"$schema": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "JSON Schema reference (typically './schema.json')"
|
|
13
|
+
},
|
|
14
|
+
"name": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"description": "Unique identifier for the schema (e.g., 'courses', 'site-settings')",
|
|
17
|
+
"pattern": "^[a-z][a-zA-Z0-9-]*$"
|
|
18
|
+
},
|
|
19
|
+
"label": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"description": "Human-readable display name for the schema"
|
|
22
|
+
},
|
|
23
|
+
"description": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"description": "Brief description of what this schema represents"
|
|
26
|
+
},
|
|
27
|
+
"icon": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"description": "Icon name from the icon library (e.g., 'BookOpen', 'Package')"
|
|
30
|
+
},
|
|
31
|
+
"type": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"description": "Schema type: 'entity' for CRUD list (default), 'single' for singleton record (site settings, about page), or 'form' for public submission forms",
|
|
34
|
+
"enum": ["entity", "single", "form"]
|
|
35
|
+
},
|
|
36
|
+
"fields": {
|
|
37
|
+
"type": "array",
|
|
38
|
+
"description": "Array of field definitions",
|
|
39
|
+
"items": {
|
|
40
|
+
"$ref": "#/$defs/field"
|
|
41
|
+
},
|
|
42
|
+
"minItems": 1
|
|
43
|
+
},
|
|
44
|
+
"columns": {
|
|
45
|
+
"type": "array",
|
|
46
|
+
"description": "Table column definitions for list views",
|
|
47
|
+
"items": {
|
|
48
|
+
"$ref": "#/$defs/column"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"actions": {
|
|
52
|
+
"$ref": "#/$defs/actions"
|
|
53
|
+
},
|
|
54
|
+
"search": {
|
|
55
|
+
"$ref": "#/$defs/search"
|
|
56
|
+
},
|
|
57
|
+
"filters": {
|
|
58
|
+
"$ref": "#/$defs/filters"
|
|
59
|
+
},
|
|
60
|
+
"autoSlugify": {
|
|
61
|
+
"$ref": "#/$defs/autoSlugify"
|
|
62
|
+
},
|
|
63
|
+
"navGroup": {
|
|
64
|
+
"type": "object",
|
|
65
|
+
"description": "Sidebar navigation group. Items sharing the same group label appear together.",
|
|
66
|
+
"additionalProperties": false,
|
|
67
|
+
"properties": {
|
|
68
|
+
"label": {
|
|
69
|
+
"type": "string",
|
|
70
|
+
"description": "Group label displayed in the sidebar"
|
|
71
|
+
},
|
|
72
|
+
"icon": {
|
|
73
|
+
"type": "string",
|
|
74
|
+
"description": "Lucide icon name for the group header"
|
|
75
|
+
},
|
|
76
|
+
"position": {
|
|
77
|
+
"type": "integer",
|
|
78
|
+
"description": "Sort order for this group (lower = first, unset = end)",
|
|
79
|
+
"minimum": 0
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
"required": ["label", "icon"]
|
|
83
|
+
},
|
|
84
|
+
"navPosition": {
|
|
85
|
+
"type": "integer",
|
|
86
|
+
"description": "Sort order within navigation group (lower = first, unset = end)",
|
|
87
|
+
"minimum": 0
|
|
88
|
+
},
|
|
89
|
+
"metadata": {
|
|
90
|
+
"type": "boolean",
|
|
91
|
+
"description": "Show the metadata widget (updated/created timestamps, entity ID, and version history button) at the top of entity edit pages. Defaults to true for 'entity'; ignored for 'single'.",
|
|
92
|
+
"default": true
|
|
93
|
+
},
|
|
94
|
+
"slot": {
|
|
95
|
+
"$ref": "#/$defs/slotLayout",
|
|
96
|
+
"description": "Entity edit-page layout. main.fields render in the primary column; sidebar.fields render in the fixed right sidebar."
|
|
97
|
+
},
|
|
98
|
+
"submitButtonText": {
|
|
99
|
+
"type": "string",
|
|
100
|
+
"description": "Form-only: text shown on the public form submit button. Defaults to 'Submit'."
|
|
101
|
+
},
|
|
102
|
+
"successMessage": {
|
|
103
|
+
"type": "string",
|
|
104
|
+
"description": "Form-only: confirmation message shown after a successful submission (ignored when redirectUrl is set)."
|
|
105
|
+
},
|
|
106
|
+
"redirectUrl": {
|
|
107
|
+
"type": "string",
|
|
108
|
+
"description": "Form-only: navigate the browser to this URL after a successful submission instead of showing the success message."
|
|
109
|
+
},
|
|
110
|
+
"notificationEmail": {
|
|
111
|
+
"type": "string",
|
|
112
|
+
"description": "Form-only: schema-level notification recipient. Used as a fallback when no admin form settings notificationEmails list is configured.",
|
|
113
|
+
"format": "email"
|
|
114
|
+
},
|
|
115
|
+
"mailchimp": {
|
|
116
|
+
"description": "Form-only: enable Mailchimp audience subscription on submit. Pass true to use the email field automatically, or { emailField: '<name>' } to specify a different source.",
|
|
117
|
+
"oneOf": [
|
|
118
|
+
{ "type": "boolean" },
|
|
119
|
+
{
|
|
120
|
+
"type": "object",
|
|
121
|
+
"additionalProperties": false,
|
|
122
|
+
"properties": {
|
|
123
|
+
"emailField": { "type": "string" }
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
]
|
|
127
|
+
},
|
|
128
|
+
"steps": {
|
|
129
|
+
"type": "array",
|
|
130
|
+
"description": "Form-only: declare multi-step forms. Each step groups its own fields shown sequentially.",
|
|
131
|
+
"items": {
|
|
132
|
+
"type": "object",
|
|
133
|
+
"additionalProperties": false,
|
|
134
|
+
"required": ["name", "label", "fields"],
|
|
135
|
+
"properties": {
|
|
136
|
+
"name": {
|
|
137
|
+
"type": "string",
|
|
138
|
+
"pattern": "^[a-zA-Z][a-zA-Z0-9]*$"
|
|
139
|
+
},
|
|
140
|
+
"label": { "type": "string" },
|
|
141
|
+
"description": { "type": "string" },
|
|
142
|
+
"fields": {
|
|
143
|
+
"type": "array",
|
|
144
|
+
"minItems": 1,
|
|
145
|
+
"items": { "$ref": "#/$defs/field" }
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
"minItems": 1
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
"$defs": {
|
|
153
|
+
"field": {
|
|
154
|
+
"type": "object",
|
|
155
|
+
"description": "A field definition",
|
|
156
|
+
"oneOf": [
|
|
157
|
+
{
|
|
158
|
+
"$ref": "#/$defs/uuidField"
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"$ref": "#/$defs/stringField"
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"$ref": "#/$defs/textField"
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"$ref": "#/$defs/markdownField"
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
"$ref": "#/$defs/richtextField"
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"$ref": "#/$defs/imageField"
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"$ref": "#/$defs/dateField"
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"$ref": "#/$defs/booleanField"
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"$ref": "#/$defs/timestampField"
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
"$ref": "#/$defs/numberField"
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"$ref": "#/$defs/decimalField"
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"$ref": "#/$defs/selectField"
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
"$ref": "#/$defs/listField"
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"$ref": "#/$defs/groupField"
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"$ref": "#/$defs/sectionField"
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
"$ref": "#/$defs/tabsField"
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
"$ref": "#/$defs/relationshipField"
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
"$ref": "#/$defs/separatorField"
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"$ref": "#/$defs/videoField"
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"$ref": "#/$defs/mediaField"
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
"$ref": "#/$defs/galleryField"
|
|
219
|
+
}
|
|
220
|
+
]
|
|
221
|
+
},
|
|
222
|
+
"baseFieldProperties": {
|
|
223
|
+
"type": "object",
|
|
224
|
+
"properties": {
|
|
225
|
+
"name": {
|
|
226
|
+
"type": "string",
|
|
227
|
+
"description": "Field identifier (camelCase)",
|
|
228
|
+
"pattern": "^[a-zA-Z][a-zA-Z0-9]*$"
|
|
229
|
+
},
|
|
230
|
+
"label": {
|
|
231
|
+
"type": "string",
|
|
232
|
+
"description": "Human-readable field label"
|
|
233
|
+
},
|
|
234
|
+
"required": {
|
|
235
|
+
"type": "boolean",
|
|
236
|
+
"description": "Whether this field is required",
|
|
237
|
+
"default": false
|
|
238
|
+
},
|
|
239
|
+
"hint": {
|
|
240
|
+
"type": "string",
|
|
241
|
+
"description": "Helper text displayed below the field"
|
|
242
|
+
},
|
|
243
|
+
"showWhen": {
|
|
244
|
+
"$ref": "#/$defs/showWhenCondition"
|
|
245
|
+
},
|
|
246
|
+
"dependsOn": {
|
|
247
|
+
"$ref": "#/$defs/dependsOnCondition"
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
"dependsOnCondition": {
|
|
252
|
+
"type": "object",
|
|
253
|
+
"description": "For cascading fields - specifies which sibling field(s) this field depends on",
|
|
254
|
+
"additionalProperties": false,
|
|
255
|
+
"properties": {
|
|
256
|
+
"repo": {
|
|
257
|
+
"type": "string",
|
|
258
|
+
"description": "Name of the repo field for branch/directory selectors"
|
|
259
|
+
},
|
|
260
|
+
"branch": {
|
|
261
|
+
"type": "string",
|
|
262
|
+
"description": "Name of the branch field for directory selectors"
|
|
263
|
+
},
|
|
264
|
+
"directory": {
|
|
265
|
+
"type": "string",
|
|
266
|
+
"description": "Name of the directory field for chapters loader"
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
"showWhenCondition": {
|
|
271
|
+
"type": "object",
|
|
272
|
+
"description": "Conditional visibility based on sibling field value",
|
|
273
|
+
"required": ["field", "value"],
|
|
274
|
+
"additionalProperties": false,
|
|
275
|
+
"properties": {
|
|
276
|
+
"field": {
|
|
277
|
+
"type": "string",
|
|
278
|
+
"description": "Name of the sibling field to watch"
|
|
279
|
+
},
|
|
280
|
+
"value": {
|
|
281
|
+
"oneOf": [
|
|
282
|
+
{
|
|
283
|
+
"type": "boolean"
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
"type": "string"
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
"type": "number"
|
|
290
|
+
}
|
|
291
|
+
],
|
|
292
|
+
"description": "Value that makes this field visible"
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
},
|
|
296
|
+
"defaultValueFrom": {
|
|
297
|
+
"type": "string",
|
|
298
|
+
"description": "Name of another field in the same schema to copy into this field when this field has no initial value and has not been edited away from the copied default."
|
|
299
|
+
},
|
|
300
|
+
"uuidField": {
|
|
301
|
+
"type": "object",
|
|
302
|
+
"description": "UUID primary key field",
|
|
303
|
+
"required": ["name", "type"],
|
|
304
|
+
"additionalProperties": false,
|
|
305
|
+
"properties": {
|
|
306
|
+
"name": {
|
|
307
|
+
"type": "string"
|
|
308
|
+
},
|
|
309
|
+
"type": {
|
|
310
|
+
"const": "uuid"
|
|
311
|
+
},
|
|
312
|
+
"primaryKey": {
|
|
313
|
+
"type": "boolean",
|
|
314
|
+
"description": "Whether this is the primary key",
|
|
315
|
+
"default": true
|
|
316
|
+
},
|
|
317
|
+
"height": {
|
|
318
|
+
"enum": ["auto", "fill"],
|
|
319
|
+
"default": "auto",
|
|
320
|
+
"description": "Generated field height behavior: auto size or fill remaining flexible space."
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
},
|
|
324
|
+
"stringField": {
|
|
325
|
+
"type": "object",
|
|
326
|
+
"description": "Single-line text input field",
|
|
327
|
+
"required": ["name", "type"],
|
|
328
|
+
"additionalProperties": false,
|
|
329
|
+
"properties": {
|
|
330
|
+
"name": {
|
|
331
|
+
"type": "string"
|
|
332
|
+
},
|
|
333
|
+
"type": {
|
|
334
|
+
"const": "string"
|
|
335
|
+
},
|
|
336
|
+
"label": {
|
|
337
|
+
"type": "string"
|
|
338
|
+
},
|
|
339
|
+
"required": {
|
|
340
|
+
"type": "boolean"
|
|
341
|
+
},
|
|
342
|
+
"length": {
|
|
343
|
+
"type": "integer",
|
|
344
|
+
"description": "Maximum character length",
|
|
345
|
+
"minimum": 1,
|
|
346
|
+
"maximum": 65535
|
|
347
|
+
},
|
|
348
|
+
"hint": {
|
|
349
|
+
"type": "string"
|
|
350
|
+
},
|
|
351
|
+
"placeholder": {
|
|
352
|
+
"type": "string",
|
|
353
|
+
"description": "Placeholder text displayed in the input field"
|
|
354
|
+
},
|
|
355
|
+
"default": {
|
|
356
|
+
"type": "string"
|
|
357
|
+
},
|
|
358
|
+
"defaultValueFrom": {
|
|
359
|
+
"$ref": "#/$defs/defaultValueFrom"
|
|
360
|
+
},
|
|
361
|
+
"hasIcon": {
|
|
362
|
+
"type": "boolean",
|
|
363
|
+
"description": "Whether this field has an associated icon picker"
|
|
364
|
+
},
|
|
365
|
+
"hidden": {
|
|
366
|
+
"type": "boolean",
|
|
367
|
+
"description": "Whether this field is hidden from the form UI but still exists in the database"
|
|
368
|
+
},
|
|
369
|
+
"showWhen": {
|
|
370
|
+
"$ref": "#/$defs/showWhenCondition"
|
|
371
|
+
},
|
|
372
|
+
"height": {
|
|
373
|
+
"enum": ["auto", "fill"],
|
|
374
|
+
"default": "auto",
|
|
375
|
+
"description": "Generated field height behavior: auto size or fill remaining flexible space."
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
},
|
|
379
|
+
"textField": {
|
|
380
|
+
"type": "object",
|
|
381
|
+
"description": "Multi-line text area field",
|
|
382
|
+
"required": ["name", "type"],
|
|
383
|
+
"additionalProperties": false,
|
|
384
|
+
"properties": {
|
|
385
|
+
"name": {
|
|
386
|
+
"type": "string"
|
|
387
|
+
},
|
|
388
|
+
"type": {
|
|
389
|
+
"const": "text"
|
|
390
|
+
},
|
|
391
|
+
"label": {
|
|
392
|
+
"type": "string"
|
|
393
|
+
},
|
|
394
|
+
"required": {
|
|
395
|
+
"type": "boolean"
|
|
396
|
+
},
|
|
397
|
+
"length": {
|
|
398
|
+
"type": "integer",
|
|
399
|
+
"description": "Maximum character length",
|
|
400
|
+
"minimum": 1
|
|
401
|
+
},
|
|
402
|
+
"hint": {
|
|
403
|
+
"type": "string"
|
|
404
|
+
},
|
|
405
|
+
"placeholder": {
|
|
406
|
+
"type": "string",
|
|
407
|
+
"description": "Placeholder text displayed in the text area"
|
|
408
|
+
},
|
|
409
|
+
"default": {
|
|
410
|
+
"type": "string"
|
|
411
|
+
},
|
|
412
|
+
"defaultValueFrom": {
|
|
413
|
+
"$ref": "#/$defs/defaultValueFrom"
|
|
414
|
+
},
|
|
415
|
+
"hidden": {
|
|
416
|
+
"type": "boolean",
|
|
417
|
+
"description": "Whether this field is hidden from the form UI but still exists in the database"
|
|
418
|
+
},
|
|
419
|
+
"showWhen": {
|
|
420
|
+
"$ref": "#/$defs/showWhenCondition"
|
|
421
|
+
},
|
|
422
|
+
"height": {
|
|
423
|
+
"enum": ["auto", "fill"],
|
|
424
|
+
"default": "auto",
|
|
425
|
+
"description": "Generated field height behavior: auto size or fill remaining flexible space."
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
},
|
|
429
|
+
"markdownField": {
|
|
430
|
+
"type": "object",
|
|
431
|
+
"description": "Rich text editor with markdown support",
|
|
432
|
+
"required": ["name", "type"],
|
|
433
|
+
"additionalProperties": false,
|
|
434
|
+
"properties": {
|
|
435
|
+
"name": {
|
|
436
|
+
"type": "string"
|
|
437
|
+
},
|
|
438
|
+
"type": {
|
|
439
|
+
"const": "markdown"
|
|
440
|
+
},
|
|
441
|
+
"label": {
|
|
442
|
+
"type": "string"
|
|
443
|
+
},
|
|
444
|
+
"required": {
|
|
445
|
+
"type": "boolean"
|
|
446
|
+
},
|
|
447
|
+
"hint": {
|
|
448
|
+
"type": "string"
|
|
449
|
+
},
|
|
450
|
+
"placeholder": {
|
|
451
|
+
"type": "string",
|
|
452
|
+
"description": "Placeholder text displayed in the markdown editor"
|
|
453
|
+
},
|
|
454
|
+
"output": {
|
|
455
|
+
"type": "string",
|
|
456
|
+
"description": "Output format — 'html' adds a pre-rendered HTML column alongside the markdown source",
|
|
457
|
+
"enum": ["html", "markdown"]
|
|
458
|
+
},
|
|
459
|
+
"defaultValueFrom": {
|
|
460
|
+
"$ref": "#/$defs/defaultValueFrom"
|
|
461
|
+
},
|
|
462
|
+
"hidden": {
|
|
463
|
+
"type": "boolean",
|
|
464
|
+
"description": "Whether this field is hidden from the form UI but still exists in the database"
|
|
465
|
+
},
|
|
466
|
+
"showWhen": {
|
|
467
|
+
"$ref": "#/$defs/showWhenCondition"
|
|
468
|
+
},
|
|
469
|
+
"height": {
|
|
470
|
+
"enum": ["auto", "fill"],
|
|
471
|
+
"default": "auto",
|
|
472
|
+
"description": "Generated field height behavior: auto size or fill remaining flexible space."
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
},
|
|
476
|
+
"richtextField": {
|
|
477
|
+
"type": "object",
|
|
478
|
+
"description": "WYSIWYG rich text editor with markdown storage",
|
|
479
|
+
"required": ["name", "type"],
|
|
480
|
+
"additionalProperties": false,
|
|
481
|
+
"properties": {
|
|
482
|
+
"name": {
|
|
483
|
+
"type": "string"
|
|
484
|
+
},
|
|
485
|
+
"type": {
|
|
486
|
+
"const": "richtext"
|
|
487
|
+
},
|
|
488
|
+
"label": {
|
|
489
|
+
"type": "string"
|
|
490
|
+
},
|
|
491
|
+
"required": {
|
|
492
|
+
"type": "boolean"
|
|
493
|
+
},
|
|
494
|
+
"hint": {
|
|
495
|
+
"type": "string"
|
|
496
|
+
},
|
|
497
|
+
"placeholder": {
|
|
498
|
+
"type": "string",
|
|
499
|
+
"description": "Placeholder text displayed in the rich text editor"
|
|
500
|
+
},
|
|
501
|
+
"output": {
|
|
502
|
+
"type": "string",
|
|
503
|
+
"description": "Output format — 'html' adds a pre-rendered HTML column alongside the markdown source",
|
|
504
|
+
"enum": ["html", "markdown"]
|
|
505
|
+
},
|
|
506
|
+
"defaultValueFrom": {
|
|
507
|
+
"$ref": "#/$defs/defaultValueFrom"
|
|
508
|
+
},
|
|
509
|
+
"hidden": {
|
|
510
|
+
"type": "boolean",
|
|
511
|
+
"description": "Whether this field is hidden from the form UI but still exists in the database"
|
|
512
|
+
},
|
|
513
|
+
"showWhen": {
|
|
514
|
+
"$ref": "#/$defs/showWhenCondition"
|
|
515
|
+
},
|
|
516
|
+
"height": {
|
|
517
|
+
"enum": ["auto", "fill"],
|
|
518
|
+
"default": "auto",
|
|
519
|
+
"description": "Generated field height behavior: auto size or fill remaining flexible space."
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
},
|
|
523
|
+
"imageField": {
|
|
524
|
+
"type": "object",
|
|
525
|
+
"description": "Image upload field",
|
|
526
|
+
"required": ["name", "type"],
|
|
527
|
+
"additionalProperties": false,
|
|
528
|
+
"properties": {
|
|
529
|
+
"name": {
|
|
530
|
+
"type": "string"
|
|
531
|
+
},
|
|
532
|
+
"type": {
|
|
533
|
+
"const": "image"
|
|
534
|
+
},
|
|
535
|
+
"label": {
|
|
536
|
+
"type": "string"
|
|
537
|
+
},
|
|
538
|
+
"required": {
|
|
539
|
+
"type": "boolean"
|
|
540
|
+
},
|
|
541
|
+
"length": {
|
|
542
|
+
"type": "integer",
|
|
543
|
+
"description": "Maximum URL length"
|
|
544
|
+
},
|
|
545
|
+
"hint": {
|
|
546
|
+
"type": "string"
|
|
547
|
+
},
|
|
548
|
+
"defaultValueFrom": {
|
|
549
|
+
"$ref": "#/$defs/defaultValueFrom"
|
|
550
|
+
},
|
|
551
|
+
"hidden": {
|
|
552
|
+
"type": "boolean",
|
|
553
|
+
"description": "Whether this field is hidden from the form UI but still exists in the database"
|
|
554
|
+
},
|
|
555
|
+
"height": {
|
|
556
|
+
"enum": ["auto", "fill"],
|
|
557
|
+
"default": "auto",
|
|
558
|
+
"description": "Generated field height behavior: auto size or fill remaining flexible space."
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
},
|
|
562
|
+
"dateField": {
|
|
563
|
+
"type": "object",
|
|
564
|
+
"description": "Date picker field",
|
|
565
|
+
"required": ["name", "type"],
|
|
566
|
+
"additionalProperties": false,
|
|
567
|
+
"properties": {
|
|
568
|
+
"name": {
|
|
569
|
+
"type": "string"
|
|
570
|
+
},
|
|
571
|
+
"type": {
|
|
572
|
+
"const": "date"
|
|
573
|
+
},
|
|
574
|
+
"label": {
|
|
575
|
+
"type": "string"
|
|
576
|
+
},
|
|
577
|
+
"required": {
|
|
578
|
+
"type": "boolean"
|
|
579
|
+
},
|
|
580
|
+
"default": {
|
|
581
|
+
"type": "string"
|
|
582
|
+
},
|
|
583
|
+
"defaultValueFrom": {
|
|
584
|
+
"$ref": "#/$defs/defaultValueFrom"
|
|
585
|
+
},
|
|
586
|
+
"hint": {
|
|
587
|
+
"type": "string"
|
|
588
|
+
},
|
|
589
|
+
"hidden": {
|
|
590
|
+
"type": "boolean",
|
|
591
|
+
"description": "Whether this field is hidden from the form UI but still exists in the database"
|
|
592
|
+
},
|
|
593
|
+
"height": {
|
|
594
|
+
"enum": ["auto", "fill"],
|
|
595
|
+
"default": "auto",
|
|
596
|
+
"description": "Generated field height behavior: auto size or fill remaining flexible space."
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
},
|
|
600
|
+
"booleanField": {
|
|
601
|
+
"type": "object",
|
|
602
|
+
"description": "Toggle/checkbox field",
|
|
603
|
+
"required": ["name", "type"],
|
|
604
|
+
"additionalProperties": false,
|
|
605
|
+
"properties": {
|
|
606
|
+
"name": {
|
|
607
|
+
"type": "string"
|
|
608
|
+
},
|
|
609
|
+
"type": {
|
|
610
|
+
"const": "boolean"
|
|
611
|
+
},
|
|
612
|
+
"label": {
|
|
613
|
+
"type": "string"
|
|
614
|
+
},
|
|
615
|
+
"required": {
|
|
616
|
+
"type": "boolean"
|
|
617
|
+
},
|
|
618
|
+
"default": {
|
|
619
|
+
"type": "boolean"
|
|
620
|
+
},
|
|
621
|
+
"defaultValueFrom": {
|
|
622
|
+
"$ref": "#/$defs/defaultValueFrom"
|
|
623
|
+
},
|
|
624
|
+
"hint": {
|
|
625
|
+
"type": "string"
|
|
626
|
+
},
|
|
627
|
+
"hidden": {
|
|
628
|
+
"type": "boolean",
|
|
629
|
+
"description": "Whether this field is hidden from the form UI but still exists in the database"
|
|
630
|
+
},
|
|
631
|
+
"height": {
|
|
632
|
+
"enum": ["auto", "fill"],
|
|
633
|
+
"default": "auto",
|
|
634
|
+
"description": "Generated field height behavior: auto size or fill remaining flexible space."
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
},
|
|
638
|
+
"timestampField": {
|
|
639
|
+
"type": "object",
|
|
640
|
+
"description": "Timestamp field (typically auto-generated)",
|
|
641
|
+
"required": ["name", "type"],
|
|
642
|
+
"additionalProperties": false,
|
|
643
|
+
"properties": {
|
|
644
|
+
"name": {
|
|
645
|
+
"type": "string"
|
|
646
|
+
},
|
|
647
|
+
"type": {
|
|
648
|
+
"const": "timestamp"
|
|
649
|
+
},
|
|
650
|
+
"label": {
|
|
651
|
+
"type": "string"
|
|
652
|
+
},
|
|
653
|
+
"required": {
|
|
654
|
+
"type": "boolean"
|
|
655
|
+
},
|
|
656
|
+
"defaultValueFrom": {
|
|
657
|
+
"$ref": "#/$defs/defaultValueFrom"
|
|
658
|
+
},
|
|
659
|
+
"hidden": {
|
|
660
|
+
"type": "boolean",
|
|
661
|
+
"description": "Whether this field is hidden from the form UI but still exists in the database"
|
|
662
|
+
},
|
|
663
|
+
"height": {
|
|
664
|
+
"enum": ["auto", "fill"],
|
|
665
|
+
"default": "auto",
|
|
666
|
+
"description": "Generated field height behavior: auto size or fill remaining flexible space."
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
},
|
|
670
|
+
"numberField": {
|
|
671
|
+
"type": "object",
|
|
672
|
+
"description": "Integer number input field",
|
|
673
|
+
"required": ["name", "type"],
|
|
674
|
+
"additionalProperties": false,
|
|
675
|
+
"properties": {
|
|
676
|
+
"name": {
|
|
677
|
+
"type": "string"
|
|
678
|
+
},
|
|
679
|
+
"type": {
|
|
680
|
+
"const": "number"
|
|
681
|
+
},
|
|
682
|
+
"label": {
|
|
683
|
+
"type": "string"
|
|
684
|
+
},
|
|
685
|
+
"required": {
|
|
686
|
+
"type": "boolean"
|
|
687
|
+
},
|
|
688
|
+
"default": {
|
|
689
|
+
"type": "integer"
|
|
690
|
+
},
|
|
691
|
+
"defaultValueFrom": {
|
|
692
|
+
"$ref": "#/$defs/defaultValueFrom"
|
|
693
|
+
},
|
|
694
|
+
"hint": {
|
|
695
|
+
"type": "string"
|
|
696
|
+
},
|
|
697
|
+
"placeholder": {
|
|
698
|
+
"type": "string",
|
|
699
|
+
"description": "Placeholder text displayed in the number input"
|
|
700
|
+
},
|
|
701
|
+
"min": {
|
|
702
|
+
"type": "integer"
|
|
703
|
+
},
|
|
704
|
+
"max": {
|
|
705
|
+
"type": "integer"
|
|
706
|
+
},
|
|
707
|
+
"hidden": {
|
|
708
|
+
"type": "boolean",
|
|
709
|
+
"description": "Whether this field is hidden from the form UI but still exists in the database"
|
|
710
|
+
},
|
|
711
|
+
"height": {
|
|
712
|
+
"enum": ["auto", "fill"],
|
|
713
|
+
"default": "auto",
|
|
714
|
+
"description": "Generated field height behavior: auto size or fill remaining flexible space."
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
},
|
|
718
|
+
"decimalField": {
|
|
719
|
+
"type": "object",
|
|
720
|
+
"description": "Decimal number field (for prices, percentages, etc.)",
|
|
721
|
+
"required": ["name", "type"],
|
|
722
|
+
"additionalProperties": false,
|
|
723
|
+
"properties": {
|
|
724
|
+
"name": {
|
|
725
|
+
"type": "string"
|
|
726
|
+
},
|
|
727
|
+
"type": {
|
|
728
|
+
"const": "decimal"
|
|
729
|
+
},
|
|
730
|
+
"label": {
|
|
731
|
+
"type": "string"
|
|
732
|
+
},
|
|
733
|
+
"required": {
|
|
734
|
+
"type": "boolean"
|
|
735
|
+
},
|
|
736
|
+
"format": {
|
|
737
|
+
"type": "string",
|
|
738
|
+
"description": "Display format",
|
|
739
|
+
"enum": ["currency", "percentage", "plain"]
|
|
740
|
+
},
|
|
741
|
+
"precision": {
|
|
742
|
+
"type": "integer",
|
|
743
|
+
"description": "Total number of digits",
|
|
744
|
+
"minimum": 1,
|
|
745
|
+
"maximum": 65
|
|
746
|
+
},
|
|
747
|
+
"scale": {
|
|
748
|
+
"type": "integer",
|
|
749
|
+
"description": "Number of decimal places",
|
|
750
|
+
"minimum": 0,
|
|
751
|
+
"maximum": 30
|
|
752
|
+
},
|
|
753
|
+
"hint": {
|
|
754
|
+
"type": "string"
|
|
755
|
+
},
|
|
756
|
+
"placeholder": {
|
|
757
|
+
"type": "string",
|
|
758
|
+
"description": "Placeholder text displayed in the decimal input"
|
|
759
|
+
},
|
|
760
|
+
"default": {
|
|
761
|
+
"type": "number"
|
|
762
|
+
},
|
|
763
|
+
"defaultValueFrom": {
|
|
764
|
+
"$ref": "#/$defs/defaultValueFrom"
|
|
765
|
+
},
|
|
766
|
+
"hidden": {
|
|
767
|
+
"type": "boolean",
|
|
768
|
+
"description": "Whether this field is hidden from the form UI but still exists in the database"
|
|
769
|
+
},
|
|
770
|
+
"height": {
|
|
771
|
+
"enum": ["auto", "fill"],
|
|
772
|
+
"default": "auto",
|
|
773
|
+
"description": "Generated field height behavior: auto size or fill remaining flexible space."
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
},
|
|
777
|
+
"selectField": {
|
|
778
|
+
"type": "object",
|
|
779
|
+
"description": "Dropdown select field",
|
|
780
|
+
"required": ["name", "type"],
|
|
781
|
+
"additionalProperties": false,
|
|
782
|
+
"properties": {
|
|
783
|
+
"name": {
|
|
784
|
+
"type": "string"
|
|
785
|
+
},
|
|
786
|
+
"type": {
|
|
787
|
+
"const": "select"
|
|
788
|
+
},
|
|
789
|
+
"label": {
|
|
790
|
+
"type": "string"
|
|
791
|
+
},
|
|
792
|
+
"required": {
|
|
793
|
+
"type": "boolean"
|
|
794
|
+
},
|
|
795
|
+
"hint": {
|
|
796
|
+
"type": "string"
|
|
797
|
+
},
|
|
798
|
+
"placeholder": {
|
|
799
|
+
"type": "string",
|
|
800
|
+
"description": "Placeholder text displayed in the select trigger"
|
|
801
|
+
},
|
|
802
|
+
"options": {
|
|
803
|
+
"type": "array",
|
|
804
|
+
"description": "Available options for the select",
|
|
805
|
+
"items": {
|
|
806
|
+
"type": "object",
|
|
807
|
+
"required": ["label", "value"],
|
|
808
|
+
"additionalProperties": false,
|
|
809
|
+
"properties": {
|
|
810
|
+
"label": {
|
|
811
|
+
"type": "string",
|
|
812
|
+
"description": "Display label"
|
|
813
|
+
},
|
|
814
|
+
"value": {
|
|
815
|
+
"type": "string",
|
|
816
|
+
"description": "Value stored in database"
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
},
|
|
820
|
+
"minItems": 1
|
|
821
|
+
},
|
|
822
|
+
"default": {
|
|
823
|
+
"oneOf": [
|
|
824
|
+
{
|
|
825
|
+
"type": "string"
|
|
826
|
+
},
|
|
827
|
+
{
|
|
828
|
+
"type": "array",
|
|
829
|
+
"items": {
|
|
830
|
+
"type": "string"
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
]
|
|
834
|
+
},
|
|
835
|
+
"defaultValueFrom": {
|
|
836
|
+
"$ref": "#/$defs/defaultValueFrom"
|
|
837
|
+
},
|
|
838
|
+
"creatable": {
|
|
839
|
+
"type": "boolean",
|
|
840
|
+
"description": "Allow admins to create field-scoped options from the generated form"
|
|
841
|
+
},
|
|
842
|
+
"multiple": {
|
|
843
|
+
"type": "boolean",
|
|
844
|
+
"description": "Allow multiple selected option values"
|
|
845
|
+
},
|
|
846
|
+
"previewLimit": {
|
|
847
|
+
"type": "integer",
|
|
848
|
+
"minimum": 1,
|
|
849
|
+
"description": "Number of selected labels shown before collapsing the rest into a count badge"
|
|
850
|
+
},
|
|
851
|
+
"hidden": {
|
|
852
|
+
"type": "boolean",
|
|
853
|
+
"description": "Whether this field is hidden from the form UI but still exists in the database"
|
|
854
|
+
},
|
|
855
|
+
"height": {
|
|
856
|
+
"enum": ["auto", "fill"],
|
|
857
|
+
"default": "auto",
|
|
858
|
+
"description": "Generated field height behavior: auto size or fill remaining flexible space."
|
|
859
|
+
}
|
|
860
|
+
},
|
|
861
|
+
"allOf": [
|
|
862
|
+
{
|
|
863
|
+
"if": {
|
|
864
|
+
"properties": {
|
|
865
|
+
"multiple": {
|
|
866
|
+
"const": true
|
|
867
|
+
}
|
|
868
|
+
},
|
|
869
|
+
"required": ["multiple"]
|
|
870
|
+
},
|
|
871
|
+
"else": {
|
|
872
|
+
"properties": {
|
|
873
|
+
"default": {
|
|
874
|
+
"type": "string"
|
|
875
|
+
}
|
|
876
|
+
},
|
|
877
|
+
"not": {
|
|
878
|
+
"required": ["previewLimit"]
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
]
|
|
883
|
+
},
|
|
884
|
+
"listField": {
|
|
885
|
+
"type": "object",
|
|
886
|
+
"description": "Repeatable list of items with nested fields",
|
|
887
|
+
"required": ["name", "type"],
|
|
888
|
+
"additionalProperties": false,
|
|
889
|
+
"properties": {
|
|
890
|
+
"name": {
|
|
891
|
+
"type": "string"
|
|
892
|
+
},
|
|
893
|
+
"type": {
|
|
894
|
+
"const": "list"
|
|
895
|
+
},
|
|
896
|
+
"label": {
|
|
897
|
+
"type": "string"
|
|
898
|
+
},
|
|
899
|
+
"required": {
|
|
900
|
+
"type": "boolean"
|
|
901
|
+
},
|
|
902
|
+
"maxItems": {
|
|
903
|
+
"type": "integer",
|
|
904
|
+
"description": "Maximum number of items allowed",
|
|
905
|
+
"minimum": 1
|
|
906
|
+
},
|
|
907
|
+
"length": {
|
|
908
|
+
"type": "integer",
|
|
909
|
+
"description": "Maximum length for simple list items"
|
|
910
|
+
},
|
|
911
|
+
"hint": {
|
|
912
|
+
"type": "string"
|
|
913
|
+
},
|
|
914
|
+
"hidden": {
|
|
915
|
+
"type": "boolean",
|
|
916
|
+
"description": "Whether this field is hidden from the form UI but still exists in the database"
|
|
917
|
+
},
|
|
918
|
+
"showWhen": {
|
|
919
|
+
"$ref": "#/$defs/showWhenCondition"
|
|
920
|
+
},
|
|
921
|
+
"fields": {
|
|
922
|
+
"type": "array",
|
|
923
|
+
"description": "Nested field definitions for complex list items",
|
|
924
|
+
"items": {
|
|
925
|
+
"$ref": "#/$defs/field"
|
|
926
|
+
}
|
|
927
|
+
},
|
|
928
|
+
"items": {
|
|
929
|
+
"description": "Single field definition for simple list items",
|
|
930
|
+
"$ref": "#/$defs/simpleListItem"
|
|
931
|
+
},
|
|
932
|
+
"height": {
|
|
933
|
+
"enum": ["auto", "fill"],
|
|
934
|
+
"default": "auto",
|
|
935
|
+
"description": "Generated field height behavior: auto size or fill remaining flexible space."
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
},
|
|
939
|
+
"simpleListItem": {
|
|
940
|
+
"type": "object",
|
|
941
|
+
"description": "Simple list item definition",
|
|
942
|
+
"required": ["name", "type"],
|
|
943
|
+
"additionalProperties": false,
|
|
944
|
+
"properties": {
|
|
945
|
+
"name": {
|
|
946
|
+
"type": "string"
|
|
947
|
+
},
|
|
948
|
+
"type": {
|
|
949
|
+
"type": "string"
|
|
950
|
+
},
|
|
951
|
+
"label": {
|
|
952
|
+
"type": "string"
|
|
953
|
+
},
|
|
954
|
+
"required": {
|
|
955
|
+
"type": "boolean"
|
|
956
|
+
},
|
|
957
|
+
"length": {
|
|
958
|
+
"type": "integer"
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
},
|
|
962
|
+
"groupField": {
|
|
963
|
+
"type": "object",
|
|
964
|
+
"description": "Group of fields displayed together",
|
|
965
|
+
"required": ["name", "type", "fields"],
|
|
966
|
+
"additionalProperties": false,
|
|
967
|
+
"properties": {
|
|
968
|
+
"name": {
|
|
969
|
+
"type": "string"
|
|
970
|
+
},
|
|
971
|
+
"type": {
|
|
972
|
+
"const": "group"
|
|
973
|
+
},
|
|
974
|
+
"label": {
|
|
975
|
+
"type": "string"
|
|
976
|
+
},
|
|
977
|
+
"columns": {
|
|
978
|
+
"type": "integer",
|
|
979
|
+
"description": "Number of columns for layout",
|
|
980
|
+
"minimum": 1,
|
|
981
|
+
"maximum": 4
|
|
982
|
+
},
|
|
983
|
+
"fields": {
|
|
984
|
+
"type": "array",
|
|
985
|
+
"description": "Nested field definitions",
|
|
986
|
+
"items": {
|
|
987
|
+
"$ref": "#/$defs/field"
|
|
988
|
+
},
|
|
989
|
+
"minItems": 1
|
|
990
|
+
},
|
|
991
|
+
"height": {
|
|
992
|
+
"enum": ["auto", "fill"],
|
|
993
|
+
"default": "auto",
|
|
994
|
+
"description": "Generated field height behavior: auto size or fill remaining flexible space."
|
|
995
|
+
}
|
|
996
|
+
}
|
|
997
|
+
},
|
|
998
|
+
"tabsField": {
|
|
999
|
+
"type": "object",
|
|
1000
|
+
"description": "Tabbed interface for organizing fields",
|
|
1001
|
+
"required": ["name", "type", "tabs"],
|
|
1002
|
+
"additionalProperties": false,
|
|
1003
|
+
"properties": {
|
|
1004
|
+
"name": {
|
|
1005
|
+
"type": "string"
|
|
1006
|
+
},
|
|
1007
|
+
"type": {
|
|
1008
|
+
"const": "tabs"
|
|
1009
|
+
},
|
|
1010
|
+
"tabs": {
|
|
1011
|
+
"type": "array",
|
|
1012
|
+
"description": "Tab definitions",
|
|
1013
|
+
"items": {
|
|
1014
|
+
"$ref": "#/$defs/tab"
|
|
1015
|
+
},
|
|
1016
|
+
"minItems": 1
|
|
1017
|
+
},
|
|
1018
|
+
"height": {
|
|
1019
|
+
"enum": ["auto", "fill"],
|
|
1020
|
+
"default": "auto",
|
|
1021
|
+
"description": "Generated field height behavior: auto size or fill remaining flexible space."
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
1024
|
+
},
|
|
1025
|
+
"relationshipField": {
|
|
1026
|
+
"type": "object",
|
|
1027
|
+
"description": "Relationship field linking to another schema/entity",
|
|
1028
|
+
"required": ["name", "type", "relationship"],
|
|
1029
|
+
"additionalProperties": false,
|
|
1030
|
+
"properties": {
|
|
1031
|
+
"name": {
|
|
1032
|
+
"type": "string"
|
|
1033
|
+
},
|
|
1034
|
+
"type": {
|
|
1035
|
+
"const": "relationship"
|
|
1036
|
+
},
|
|
1037
|
+
"relationship": {
|
|
1038
|
+
"type": "string",
|
|
1039
|
+
"description": "Name of the related schema/entity (e.g., 'instructors', 'courses')"
|
|
1040
|
+
},
|
|
1041
|
+
"label": {
|
|
1042
|
+
"type": "string"
|
|
1043
|
+
},
|
|
1044
|
+
"required": {
|
|
1045
|
+
"type": "boolean"
|
|
1046
|
+
},
|
|
1047
|
+
"hint": {
|
|
1048
|
+
"type": "string"
|
|
1049
|
+
},
|
|
1050
|
+
"defaultValueFrom": {
|
|
1051
|
+
"$ref": "#/$defs/defaultValueFrom"
|
|
1052
|
+
},
|
|
1053
|
+
"multiple": {
|
|
1054
|
+
"type": "boolean",
|
|
1055
|
+
"description": "Whether multiple items can be selected",
|
|
1056
|
+
"default": false
|
|
1057
|
+
},
|
|
1058
|
+
"hidden": {
|
|
1059
|
+
"type": "boolean",
|
|
1060
|
+
"description": "Whether this field is hidden from the form UI but still exists in the database"
|
|
1061
|
+
},
|
|
1062
|
+
"showWhen": {
|
|
1063
|
+
"$ref": "#/$defs/showWhenCondition"
|
|
1064
|
+
},
|
|
1065
|
+
"height": {
|
|
1066
|
+
"enum": ["auto", "fill"],
|
|
1067
|
+
"default": "auto",
|
|
1068
|
+
"description": "Generated field height behavior: auto size or fill remaining flexible space."
|
|
1069
|
+
}
|
|
1070
|
+
}
|
|
1071
|
+
},
|
|
1072
|
+
"separatorField": {
|
|
1073
|
+
"type": "object",
|
|
1074
|
+
"description": "Visual separator between form fields",
|
|
1075
|
+
"required": ["type"],
|
|
1076
|
+
"additionalProperties": false,
|
|
1077
|
+
"properties": {
|
|
1078
|
+
"name": {
|
|
1079
|
+
"type": "string"
|
|
1080
|
+
},
|
|
1081
|
+
"type": {
|
|
1082
|
+
"const": "separator"
|
|
1083
|
+
},
|
|
1084
|
+
"label": {
|
|
1085
|
+
"type": "string",
|
|
1086
|
+
"description": "Optional label to display with the separator"
|
|
1087
|
+
},
|
|
1088
|
+
"height": {
|
|
1089
|
+
"enum": ["auto", "fill"],
|
|
1090
|
+
"default": "auto",
|
|
1091
|
+
"description": "Generated field height behavior: auto size or fill remaining flexible space."
|
|
1092
|
+
}
|
|
1093
|
+
}
|
|
1094
|
+
},
|
|
1095
|
+
"videoField": {
|
|
1096
|
+
"type": "object",
|
|
1097
|
+
"description": "Video upload field",
|
|
1098
|
+
"required": ["name", "type"],
|
|
1099
|
+
"additionalProperties": false,
|
|
1100
|
+
"properties": {
|
|
1101
|
+
"name": {
|
|
1102
|
+
"type": "string"
|
|
1103
|
+
},
|
|
1104
|
+
"type": {
|
|
1105
|
+
"const": "video"
|
|
1106
|
+
},
|
|
1107
|
+
"label": {
|
|
1108
|
+
"type": "string"
|
|
1109
|
+
},
|
|
1110
|
+
"required": {
|
|
1111
|
+
"type": "boolean"
|
|
1112
|
+
},
|
|
1113
|
+
"hint": {
|
|
1114
|
+
"type": "string"
|
|
1115
|
+
},
|
|
1116
|
+
"defaultValueFrom": {
|
|
1117
|
+
"$ref": "#/$defs/defaultValueFrom"
|
|
1118
|
+
},
|
|
1119
|
+
"maxSizeInMB": {
|
|
1120
|
+
"type": "integer",
|
|
1121
|
+
"description": "Maximum file size in megabytes"
|
|
1122
|
+
},
|
|
1123
|
+
"hidden": {
|
|
1124
|
+
"type": "boolean",
|
|
1125
|
+
"description": "Whether this field is hidden from the form UI but still exists in the database"
|
|
1126
|
+
},
|
|
1127
|
+
"height": {
|
|
1128
|
+
"enum": ["auto", "fill"],
|
|
1129
|
+
"default": "auto",
|
|
1130
|
+
"description": "Generated field height behavior: auto size or fill remaining flexible space."
|
|
1131
|
+
}
|
|
1132
|
+
}
|
|
1133
|
+
},
|
|
1134
|
+
"mediaField": {
|
|
1135
|
+
"type": "object",
|
|
1136
|
+
"description": "Media upload field supporting both images and videos",
|
|
1137
|
+
"required": ["name", "type"],
|
|
1138
|
+
"additionalProperties": false,
|
|
1139
|
+
"properties": {
|
|
1140
|
+
"name": {
|
|
1141
|
+
"type": "string"
|
|
1142
|
+
},
|
|
1143
|
+
"type": {
|
|
1144
|
+
"const": "media"
|
|
1145
|
+
},
|
|
1146
|
+
"label": {
|
|
1147
|
+
"type": "string"
|
|
1148
|
+
},
|
|
1149
|
+
"required": {
|
|
1150
|
+
"type": "boolean"
|
|
1151
|
+
},
|
|
1152
|
+
"hint": {
|
|
1153
|
+
"type": "string"
|
|
1154
|
+
},
|
|
1155
|
+
"defaultValueFrom": {
|
|
1156
|
+
"$ref": "#/$defs/defaultValueFrom"
|
|
1157
|
+
},
|
|
1158
|
+
"maxSizeInMB": {
|
|
1159
|
+
"type": "integer",
|
|
1160
|
+
"description": "Maximum file size in megabytes"
|
|
1161
|
+
},
|
|
1162
|
+
"hidden": {
|
|
1163
|
+
"type": "boolean",
|
|
1164
|
+
"description": "Whether this field is hidden from the form UI but still exists in the database"
|
|
1165
|
+
},
|
|
1166
|
+
"height": {
|
|
1167
|
+
"enum": ["auto", "fill"],
|
|
1168
|
+
"default": "auto",
|
|
1169
|
+
"description": "Generated field height behavior: auto size or fill remaining flexible space."
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
},
|
|
1173
|
+
"galleryField": {
|
|
1174
|
+
"type": "object",
|
|
1175
|
+
"description": "Multi-select media gallery field storing an array of media IDs with drag-to-reorder",
|
|
1176
|
+
"required": ["name", "type"],
|
|
1177
|
+
"additionalProperties": false,
|
|
1178
|
+
"properties": {
|
|
1179
|
+
"name": {
|
|
1180
|
+
"type": "string"
|
|
1181
|
+
},
|
|
1182
|
+
"type": {
|
|
1183
|
+
"const": "gallery"
|
|
1184
|
+
},
|
|
1185
|
+
"label": {
|
|
1186
|
+
"type": "string"
|
|
1187
|
+
},
|
|
1188
|
+
"required": {
|
|
1189
|
+
"type": "boolean"
|
|
1190
|
+
},
|
|
1191
|
+
"hint": {
|
|
1192
|
+
"type": "string"
|
|
1193
|
+
},
|
|
1194
|
+
"defaultValueFrom": {
|
|
1195
|
+
"$ref": "#/$defs/defaultValueFrom"
|
|
1196
|
+
},
|
|
1197
|
+
"maxItems": {
|
|
1198
|
+
"type": "integer",
|
|
1199
|
+
"minimum": 1,
|
|
1200
|
+
"description": "Maximum number of media items"
|
|
1201
|
+
},
|
|
1202
|
+
"hidden": {
|
|
1203
|
+
"type": "boolean",
|
|
1204
|
+
"description": "Whether this field is hidden from the form UI but still exists in the database"
|
|
1205
|
+
},
|
|
1206
|
+
"height": {
|
|
1207
|
+
"enum": ["auto", "fill"],
|
|
1208
|
+
"default": "auto",
|
|
1209
|
+
"description": "Generated field height behavior: auto size or fill remaining flexible space."
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
},
|
|
1213
|
+
"tab": {
|
|
1214
|
+
"type": "object",
|
|
1215
|
+
"description": "A single tab containing fields",
|
|
1216
|
+
"required": ["name", "label"],
|
|
1217
|
+
"additionalProperties": false,
|
|
1218
|
+
"properties": {
|
|
1219
|
+
"name": {
|
|
1220
|
+
"type": "string",
|
|
1221
|
+
"description": "Tab identifier"
|
|
1222
|
+
},
|
|
1223
|
+
"label": {
|
|
1224
|
+
"type": "string",
|
|
1225
|
+
"description": "Tab display label"
|
|
1226
|
+
},
|
|
1227
|
+
"fields": {
|
|
1228
|
+
"type": "array",
|
|
1229
|
+
"description": "Fields within this tab",
|
|
1230
|
+
"items": {
|
|
1231
|
+
"$ref": "#/$defs/field"
|
|
1232
|
+
},
|
|
1233
|
+
"minItems": 1
|
|
1234
|
+
},
|
|
1235
|
+
"slot": {
|
|
1236
|
+
"$ref": "#/$defs/slotLayout",
|
|
1237
|
+
"description": "Tab-scoped main/sidebar layout. Sidebar fields render only while this tab is active."
|
|
1238
|
+
}
|
|
1239
|
+
},
|
|
1240
|
+
"oneOf": [
|
|
1241
|
+
{
|
|
1242
|
+
"required": ["fields"],
|
|
1243
|
+
"not": {
|
|
1244
|
+
"required": ["slot"]
|
|
1245
|
+
}
|
|
1246
|
+
},
|
|
1247
|
+
{
|
|
1248
|
+
"required": ["slot"],
|
|
1249
|
+
"not": {
|
|
1250
|
+
"required": ["fields"]
|
|
1251
|
+
}
|
|
1252
|
+
}
|
|
1253
|
+
]
|
|
1254
|
+
},
|
|
1255
|
+
"column": {
|
|
1256
|
+
"type": "object",
|
|
1257
|
+
"description": "Table column definition for list views",
|
|
1258
|
+
"required": ["accessorKey", "header"],
|
|
1259
|
+
"additionalProperties": false,
|
|
1260
|
+
"properties": {
|
|
1261
|
+
"accessorKey": {
|
|
1262
|
+
"type": "string",
|
|
1263
|
+
"description": "Field name to access data from"
|
|
1264
|
+
},
|
|
1265
|
+
"header": {
|
|
1266
|
+
"type": "string",
|
|
1267
|
+
"description": "Column header text"
|
|
1268
|
+
},
|
|
1269
|
+
"type": {
|
|
1270
|
+
"type": "string",
|
|
1271
|
+
"description": "Column display type",
|
|
1272
|
+
"enum": ["image", "avatar", "text", "badge", "date", "email", "number", "link"]
|
|
1273
|
+
},
|
|
1274
|
+
"sortable": {
|
|
1275
|
+
"type": "boolean",
|
|
1276
|
+
"description": "Whether the column is sortable",
|
|
1277
|
+
"default": false
|
|
1278
|
+
},
|
|
1279
|
+
"size": {
|
|
1280
|
+
"type": "string",
|
|
1281
|
+
"description": "Default table column width preset",
|
|
1282
|
+
"enum": ["sm", "default", "lg", "xl"],
|
|
1283
|
+
"default": "default"
|
|
1284
|
+
},
|
|
1285
|
+
"format": {
|
|
1286
|
+
"type": "string",
|
|
1287
|
+
"description": "Display format (e.g., 'currency' for numbers)",
|
|
1288
|
+
"enum": ["currency", "percentage"]
|
|
1289
|
+
},
|
|
1290
|
+
"align": {
|
|
1291
|
+
"type": "string",
|
|
1292
|
+
"description": "Column text alignment",
|
|
1293
|
+
"enum": ["left", "center", "right"],
|
|
1294
|
+
"default": "left"
|
|
1295
|
+
}
|
|
1296
|
+
}
|
|
1297
|
+
},
|
|
1298
|
+
"actions": {
|
|
1299
|
+
"type": "object",
|
|
1300
|
+
"description": "CRUD action configuration",
|
|
1301
|
+
"additionalProperties": false,
|
|
1302
|
+
"properties": {
|
|
1303
|
+
"draft": {
|
|
1304
|
+
"type": "boolean",
|
|
1305
|
+
"description": "Enable draft/publish workflow",
|
|
1306
|
+
"default": false
|
|
1307
|
+
},
|
|
1308
|
+
"create": {
|
|
1309
|
+
"type": "boolean",
|
|
1310
|
+
"description": "Enable create action",
|
|
1311
|
+
"default": true
|
|
1312
|
+
},
|
|
1313
|
+
"edit": {
|
|
1314
|
+
"type": "boolean",
|
|
1315
|
+
"description": "Enable edit action",
|
|
1316
|
+
"default": true
|
|
1317
|
+
},
|
|
1318
|
+
"delete": {
|
|
1319
|
+
"type": "boolean",
|
|
1320
|
+
"description": "Enable delete action",
|
|
1321
|
+
"default": true
|
|
1322
|
+
},
|
|
1323
|
+
"export": {
|
|
1324
|
+
"type": "boolean",
|
|
1325
|
+
"description": "Form-only: surface a CSV export action for submissions.",
|
|
1326
|
+
"default": false
|
|
1327
|
+
}
|
|
1328
|
+
}
|
|
1329
|
+
},
|
|
1330
|
+
"search": {
|
|
1331
|
+
"type": "object",
|
|
1332
|
+
"description": "Backend search configuration for admin tables",
|
|
1333
|
+
"additionalProperties": false,
|
|
1334
|
+
"required": ["fields"],
|
|
1335
|
+
"properties": {
|
|
1336
|
+
"fields": {
|
|
1337
|
+
"type": "array",
|
|
1338
|
+
"description": "Array of field names to search across (should be text-type columns like string, text, varchar)",
|
|
1339
|
+
"items": {
|
|
1340
|
+
"type": "string",
|
|
1341
|
+
"description": "Field name to include in search"
|
|
1342
|
+
},
|
|
1343
|
+
"minItems": 1
|
|
1344
|
+
}
|
|
1345
|
+
}
|
|
1346
|
+
},
|
|
1347
|
+
"filters": {
|
|
1348
|
+
"type": "array",
|
|
1349
|
+
"description": "Filter configuration for admin tables",
|
|
1350
|
+
"items": {
|
|
1351
|
+
"$ref": "#/$defs/filter"
|
|
1352
|
+
}
|
|
1353
|
+
},
|
|
1354
|
+
"filter": {
|
|
1355
|
+
"type": "object",
|
|
1356
|
+
"description": "Filter definition for admin tables",
|
|
1357
|
+
"required": ["field", "label"],
|
|
1358
|
+
"additionalProperties": false,
|
|
1359
|
+
"properties": {
|
|
1360
|
+
"key": {
|
|
1361
|
+
"type": "string",
|
|
1362
|
+
"description": "Optional query param key for this filter. Defaults to the field name."
|
|
1363
|
+
},
|
|
1364
|
+
"field": {
|
|
1365
|
+
"type": "string",
|
|
1366
|
+
"description": "Field name to filter by"
|
|
1367
|
+
},
|
|
1368
|
+
"label": {
|
|
1369
|
+
"type": "string",
|
|
1370
|
+
"description": "Label for the filter dropdown"
|
|
1371
|
+
},
|
|
1372
|
+
"type": {
|
|
1373
|
+
"type": "string",
|
|
1374
|
+
"description": "Filter type",
|
|
1375
|
+
"enum": ["select", "boolean"],
|
|
1376
|
+
"default": "select"
|
|
1377
|
+
},
|
|
1378
|
+
"source": {
|
|
1379
|
+
"type": "string",
|
|
1380
|
+
"description": "Where select filter options come from",
|
|
1381
|
+
"enum": ["distinct", "static"]
|
|
1382
|
+
},
|
|
1383
|
+
"options": {
|
|
1384
|
+
"type": "array",
|
|
1385
|
+
"description": "Static options for select filters",
|
|
1386
|
+
"items": {
|
|
1387
|
+
"type": "object",
|
|
1388
|
+
"required": ["label", "value"],
|
|
1389
|
+
"additionalProperties": false,
|
|
1390
|
+
"properties": {
|
|
1391
|
+
"label": {
|
|
1392
|
+
"type": "string",
|
|
1393
|
+
"description": "Option label shown in the filter UI"
|
|
1394
|
+
},
|
|
1395
|
+
"value": {
|
|
1396
|
+
"type": "string",
|
|
1397
|
+
"description": "Option value sent to the backend filter"
|
|
1398
|
+
}
|
|
1399
|
+
}
|
|
1400
|
+
}
|
|
1401
|
+
}
|
|
1402
|
+
}
|
|
1403
|
+
},
|
|
1404
|
+
"autoSlugify": {
|
|
1405
|
+
"type": "object",
|
|
1406
|
+
"description": "Auto-slugification configuration for generating URL-friendly slugs from fields",
|
|
1407
|
+
"additionalProperties": false,
|
|
1408
|
+
"properties": {
|
|
1409
|
+
"enabled": {
|
|
1410
|
+
"type": "boolean",
|
|
1411
|
+
"description": "Enable automatic slug generation",
|
|
1412
|
+
"default": true
|
|
1413
|
+
},
|
|
1414
|
+
"sourceField": {
|
|
1415
|
+
"type": "string",
|
|
1416
|
+
"description": "Field to use as source for slug generation (e.g., 'name', 'title')"
|
|
1417
|
+
},
|
|
1418
|
+
"targetField": {
|
|
1419
|
+
"type": "string",
|
|
1420
|
+
"description": "Field to store the generated slug (typically 'slug')"
|
|
1421
|
+
}
|
|
1422
|
+
}
|
|
1423
|
+
},
|
|
1424
|
+
"slotLayout": {
|
|
1425
|
+
"type": "object",
|
|
1426
|
+
"description": "Main/sidebar layout groups for an entity edit form or tab panel.",
|
|
1427
|
+
"additionalProperties": false,
|
|
1428
|
+
"properties": {
|
|
1429
|
+
"main": {
|
|
1430
|
+
"$ref": "#/$defs/slotArea"
|
|
1431
|
+
},
|
|
1432
|
+
"sidebar": {
|
|
1433
|
+
"$ref": "#/$defs/slotArea"
|
|
1434
|
+
}
|
|
1435
|
+
},
|
|
1436
|
+
"anyOf": [
|
|
1437
|
+
{
|
|
1438
|
+
"required": ["main"]
|
|
1439
|
+
},
|
|
1440
|
+
{
|
|
1441
|
+
"required": ["sidebar"]
|
|
1442
|
+
}
|
|
1443
|
+
]
|
|
1444
|
+
},
|
|
1445
|
+
"slotArea": {
|
|
1446
|
+
"type": "object",
|
|
1447
|
+
"description": "A named layout area containing generated form fields.",
|
|
1448
|
+
"required": ["fields"],
|
|
1449
|
+
"additionalProperties": false,
|
|
1450
|
+
"properties": {
|
|
1451
|
+
"fields": {
|
|
1452
|
+
"type": "array",
|
|
1453
|
+
"description": "Fields rendered in this layout area.",
|
|
1454
|
+
"items": {
|
|
1455
|
+
"$ref": "#/$defs/field"
|
|
1456
|
+
},
|
|
1457
|
+
"minItems": 1
|
|
1458
|
+
}
|
|
1459
|
+
}
|
|
1460
|
+
},
|
|
1461
|
+
"fieldArrayWithCreatableSelect": {
|
|
1462
|
+
"type": "array",
|
|
1463
|
+
"contains": {
|
|
1464
|
+
"$ref": "#/$defs/fieldWithCreatableSelect"
|
|
1465
|
+
}
|
|
1466
|
+
},
|
|
1467
|
+
"fieldWithCreatableSelect": {
|
|
1468
|
+
"type": "object",
|
|
1469
|
+
"anyOf": [
|
|
1470
|
+
{
|
|
1471
|
+
"properties": {
|
|
1472
|
+
"type": {
|
|
1473
|
+
"const": "select"
|
|
1474
|
+
},
|
|
1475
|
+
"creatable": {
|
|
1476
|
+
"const": true
|
|
1477
|
+
}
|
|
1478
|
+
},
|
|
1479
|
+
"required": ["type", "creatable"]
|
|
1480
|
+
},
|
|
1481
|
+
{
|
|
1482
|
+
"properties": {
|
|
1483
|
+
"fields": {
|
|
1484
|
+
"$ref": "#/$defs/fieldArrayWithCreatableSelect"
|
|
1485
|
+
}
|
|
1486
|
+
},
|
|
1487
|
+
"required": ["fields"]
|
|
1488
|
+
},
|
|
1489
|
+
{
|
|
1490
|
+
"properties": {
|
|
1491
|
+
"tabs": {
|
|
1492
|
+
"type": "array",
|
|
1493
|
+
"contains": {
|
|
1494
|
+
"$ref": "#/$defs/tabWithCreatableSelect"
|
|
1495
|
+
}
|
|
1496
|
+
}
|
|
1497
|
+
},
|
|
1498
|
+
"required": ["tabs"]
|
|
1499
|
+
}
|
|
1500
|
+
]
|
|
1501
|
+
},
|
|
1502
|
+
"tabWithCreatableSelect": {
|
|
1503
|
+
"type": "object",
|
|
1504
|
+
"anyOf": [
|
|
1505
|
+
{
|
|
1506
|
+
"properties": {
|
|
1507
|
+
"fields": {
|
|
1508
|
+
"$ref": "#/$defs/fieldArrayWithCreatableSelect"
|
|
1509
|
+
}
|
|
1510
|
+
},
|
|
1511
|
+
"required": ["fields"]
|
|
1512
|
+
},
|
|
1513
|
+
{
|
|
1514
|
+
"properties": {
|
|
1515
|
+
"slot": {
|
|
1516
|
+
"$ref": "#/$defs/slotLayoutWithCreatableSelect"
|
|
1517
|
+
}
|
|
1518
|
+
},
|
|
1519
|
+
"required": ["slot"]
|
|
1520
|
+
}
|
|
1521
|
+
]
|
|
1522
|
+
},
|
|
1523
|
+
"slotLayoutWithCreatableSelect": {
|
|
1524
|
+
"type": "object",
|
|
1525
|
+
"anyOf": [
|
|
1526
|
+
{
|
|
1527
|
+
"properties": {
|
|
1528
|
+
"main": {
|
|
1529
|
+
"properties": {
|
|
1530
|
+
"fields": {
|
|
1531
|
+
"$ref": "#/$defs/fieldArrayWithCreatableSelect"
|
|
1532
|
+
}
|
|
1533
|
+
},
|
|
1534
|
+
"required": ["fields"]
|
|
1535
|
+
}
|
|
1536
|
+
},
|
|
1537
|
+
"required": ["main"]
|
|
1538
|
+
},
|
|
1539
|
+
{
|
|
1540
|
+
"properties": {
|
|
1541
|
+
"sidebar": {
|
|
1542
|
+
"properties": {
|
|
1543
|
+
"fields": {
|
|
1544
|
+
"$ref": "#/$defs/fieldArrayWithCreatableSelect"
|
|
1545
|
+
}
|
|
1546
|
+
},
|
|
1547
|
+
"required": ["fields"]
|
|
1548
|
+
}
|
|
1549
|
+
},
|
|
1550
|
+
"required": ["sidebar"]
|
|
1551
|
+
}
|
|
1552
|
+
]
|
|
1553
|
+
},
|
|
1554
|
+
"sectionHeading": {
|
|
1555
|
+
"type": "object",
|
|
1556
|
+
"description": "Optional card heading rendered for sidebar section cards.",
|
|
1557
|
+
"required": ["title"],
|
|
1558
|
+
"additionalProperties": false,
|
|
1559
|
+
"properties": {
|
|
1560
|
+
"title": {
|
|
1561
|
+
"type": "string",
|
|
1562
|
+
"description": "Heading text rendered in the section card header."
|
|
1563
|
+
},
|
|
1564
|
+
"icon": {
|
|
1565
|
+
"type": "string",
|
|
1566
|
+
"description": "Lucide icon name rendered before the heading title, for example bolt or globe."
|
|
1567
|
+
}
|
|
1568
|
+
}
|
|
1569
|
+
},
|
|
1570
|
+
"sectionField": {
|
|
1571
|
+
"type": "object",
|
|
1572
|
+
"description": "Section of fields displayed together. Top-level sidebar sections render as separate cards.",
|
|
1573
|
+
"required": ["name", "type", "fields"],
|
|
1574
|
+
"additionalProperties": false,
|
|
1575
|
+
"properties": {
|
|
1576
|
+
"name": {
|
|
1577
|
+
"type": "string"
|
|
1578
|
+
},
|
|
1579
|
+
"type": {
|
|
1580
|
+
"const": "section"
|
|
1581
|
+
},
|
|
1582
|
+
"label": {
|
|
1583
|
+
"type": "string"
|
|
1584
|
+
},
|
|
1585
|
+
"description": {
|
|
1586
|
+
"type": "string"
|
|
1587
|
+
},
|
|
1588
|
+
"hint": {
|
|
1589
|
+
"type": "string"
|
|
1590
|
+
},
|
|
1591
|
+
"heading": {
|
|
1592
|
+
"$ref": "#/$defs/sectionHeading"
|
|
1593
|
+
},
|
|
1594
|
+
"columns": {
|
|
1595
|
+
"type": "integer",
|
|
1596
|
+
"description": "Number of columns for layout",
|
|
1597
|
+
"minimum": 1,
|
|
1598
|
+
"maximum": 4
|
|
1599
|
+
},
|
|
1600
|
+
"fields": {
|
|
1601
|
+
"type": "array",
|
|
1602
|
+
"description": "Nested field definitions",
|
|
1603
|
+
"items": {
|
|
1604
|
+
"$ref": "#/$defs/field"
|
|
1605
|
+
},
|
|
1606
|
+
"minItems": 1
|
|
1607
|
+
},
|
|
1608
|
+
"height": {
|
|
1609
|
+
"enum": ["auto", "fill"],
|
|
1610
|
+
"default": "auto",
|
|
1611
|
+
"description": "Generated field height behavior: auto size or fill remaining flexible space."
|
|
1612
|
+
}
|
|
1613
|
+
}
|
|
1614
|
+
}
|
|
1615
|
+
},
|
|
1616
|
+
"oneOf": [
|
|
1617
|
+
{
|
|
1618
|
+
"required": ["fields"],
|
|
1619
|
+
"not": {
|
|
1620
|
+
"anyOf": [{ "required": ["slot"] }, { "required": ["steps"] }]
|
|
1621
|
+
}
|
|
1622
|
+
},
|
|
1623
|
+
{
|
|
1624
|
+
"required": ["slot"],
|
|
1625
|
+
"not": {
|
|
1626
|
+
"anyOf": [{ "required": ["fields"] }, { "required": ["steps"] }]
|
|
1627
|
+
}
|
|
1628
|
+
},
|
|
1629
|
+
{
|
|
1630
|
+
"required": ["steps"],
|
|
1631
|
+
"not": {
|
|
1632
|
+
"anyOf": [{ "required": ["fields"] }, { "required": ["slot"] }]
|
|
1633
|
+
}
|
|
1634
|
+
}
|
|
1635
|
+
],
|
|
1636
|
+
"allOf": [
|
|
1637
|
+
{
|
|
1638
|
+
"if": {
|
|
1639
|
+
"properties": {
|
|
1640
|
+
"type": {
|
|
1641
|
+
"enum": ["single", "form"]
|
|
1642
|
+
}
|
|
1643
|
+
},
|
|
1644
|
+
"required": ["type"]
|
|
1645
|
+
},
|
|
1646
|
+
"then": {
|
|
1647
|
+
"not": {
|
|
1648
|
+
"anyOf": [
|
|
1649
|
+
{
|
|
1650
|
+
"properties": {
|
|
1651
|
+
"fields": {
|
|
1652
|
+
"$ref": "#/$defs/fieldArrayWithCreatableSelect"
|
|
1653
|
+
}
|
|
1654
|
+
},
|
|
1655
|
+
"required": ["fields"]
|
|
1656
|
+
},
|
|
1657
|
+
{
|
|
1658
|
+
"properties": {
|
|
1659
|
+
"slot": {
|
|
1660
|
+
"$ref": "#/$defs/slotLayoutWithCreatableSelect"
|
|
1661
|
+
}
|
|
1662
|
+
},
|
|
1663
|
+
"required": ["slot"]
|
|
1664
|
+
}
|
|
1665
|
+
]
|
|
1666
|
+
}
|
|
1667
|
+
}
|
|
1668
|
+
}
|
|
1669
|
+
]
|
|
1670
|
+
}
|