@elytracms/studio 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/LICENSE +21 -0
- package/README.md +3 -0
- package/convex/assets.ts +107 -0
- package/convex/auth.config.ts +15 -0
- package/convex/auth.ts +50 -0
- package/convex/cliTokens.ts +63 -0
- package/convex/cms.ts +174 -0
- package/convex/content.ts +316 -0
- package/convex/delivery.ts +266 -0
- package/convex/functions.ts +35 -0
- package/convex/graphs.ts +51 -0
- package/convex/guard.ts +67 -0
- package/convex/http.ts +30 -0
- package/convex/members.ts +83 -0
- package/convex/publishing.ts +102 -0
- package/convex/references.ts +168 -0
- package/convex/schema.ts +173 -0
- package/convex/sync.ts +322 -0
- package/convex/tsconfig.json +12 -0
- package/convex/users.ts +23 -0
- package/convex/webhooks.ts +85 -0
- package/dist/components/assets/asset-library.d.ts +14 -0
- package/dist/components/assets/asset-library.js +191 -0
- package/dist/components/assets/asset-library.js.map +1 -0
- package/dist/components/assets/asset-metadata.d.ts +34 -0
- package/dist/components/assets/asset-metadata.js +40 -0
- package/dist/components/assets/asset-metadata.js.map +1 -0
- package/dist/components/assets/asset-search.d.ts +7 -0
- package/dist/components/assets/asset-search.js +12 -0
- package/dist/components/assets/asset-search.js.map +1 -0
- package/dist/components/assets/asset-selection.d.ts +17 -0
- package/dist/components/assets/asset-selection.js +33 -0
- package/dist/components/assets/asset-selection.js.map +1 -0
- package/dist/components/assets/assets-store.d.ts +51 -0
- package/dist/components/assets/assets-store.js +153 -0
- package/dist/components/assets/assets-store.js.map +1 -0
- package/dist/components/auth-context.d.ts +38 -0
- package/dist/components/auth-context.js +88 -0
- package/dist/components/auth-context.js.map +1 -0
- package/dist/components/backend-gate.d.ts +19 -0
- package/dist/components/backend-gate.js +63 -0
- package/dist/components/backend-gate.js.map +1 -0
- package/dist/components/breadcrumb-context.d.ts +39 -0
- package/dist/components/breadcrumb-context.js +38 -0
- package/dist/components/breadcrumb-context.js.map +1 -0
- package/dist/components/builder/blocks-model.d.ts +80 -0
- package/dist/components/builder/blocks-model.js +181 -0
- package/dist/components/builder/blocks-model.js.map +1 -0
- package/dist/components/builder/blocks-panel.d.ts +44 -0
- package/dist/components/builder/blocks-panel.js +147 -0
- package/dist/components/builder/blocks-panel.js.map +1 -0
- package/dist/components/builder/builder-store.d.ts +69 -0
- package/dist/components/builder/builder-store.js +294 -0
- package/dist/components/builder/builder-store.js.map +1 -0
- package/dist/components/builder/canvas-stylesheet.d.ts +4 -0
- package/dist/components/builder/canvas-stylesheet.js +24 -0
- package/dist/components/builder/canvas-stylesheet.js.map +1 -0
- package/dist/components/builder/canvas.d.ts +8 -0
- package/dist/components/builder/canvas.js +723 -0
- package/dist/components/builder/canvas.js.map +1 -0
- package/dist/components/builder/clipboard-actions.d.ts +93 -0
- package/dist/components/builder/clipboard-actions.js +246 -0
- package/dist/components/builder/clipboard-actions.js.map +1 -0
- package/dist/components/builder/composition-field-editor.d.ts +11 -0
- package/dist/components/builder/composition-field-editor.js +150 -0
- package/dist/components/builder/composition-field-editor.js.map +1 -0
- package/dist/components/builder/composition-scope.d.ts +16 -0
- package/dist/components/builder/composition-scope.js +7 -0
- package/dist/components/builder/composition-scope.js.map +1 -0
- package/dist/components/builder/drag-session.d.ts +41 -0
- package/dist/components/builder/drag-session.js +51 -0
- package/dist/components/builder/drag-session.js.map +1 -0
- package/dist/components/builder/fixture-thumbnail.d.ts +18 -0
- package/dist/components/builder/fixture-thumbnail.js +97 -0
- package/dist/components/builder/fixture-thumbnail.js.map +1 -0
- package/dist/components/builder/inline-edit.d.ts +142 -0
- package/dist/components/builder/inline-edit.js +136 -0
- package/dist/components/builder/inline-edit.js.map +1 -0
- package/dist/components/builder/insert-context.d.ts +14 -0
- package/dist/components/builder/insert-context.js +65 -0
- package/dist/components/builder/insert-context.js.map +1 -0
- package/dist/components/builder/insert-menu.d.ts +9 -0
- package/dist/components/builder/insert-menu.js +9 -0
- package/dist/components/builder/insert-menu.js.map +1 -0
- package/dist/components/builder/layout-inspector.d.ts +14 -0
- package/dist/components/builder/layout-inspector.js +84 -0
- package/dist/components/builder/layout-inspector.js.map +1 -0
- package/dist/components/builder/node-factory.d.ts +17 -0
- package/dist/components/builder/node-factory.js +90 -0
- package/dist/components/builder/node-factory.js.map +1 -0
- package/dist/components/builder/page-tree.d.ts +3 -0
- package/dist/components/builder/page-tree.js +207 -0
- package/dist/components/builder/page-tree.js.map +1 -0
- package/dist/components/builder/property-inspector.d.ts +1 -0
- package/dist/components/builder/property-inspector.js +233 -0
- package/dist/components/builder/property-inspector.js.map +1 -0
- package/dist/components/builder/rich-text-toolbar.d.ts +4 -0
- package/dist/components/builder/rich-text-toolbar.js +104 -0
- package/dist/components/builder/rich-text-toolbar.js.map +1 -0
- package/dist/components/builder/spacing-handles.d.ts +22 -0
- package/dist/components/builder/spacing-handles.js +213 -0
- package/dist/components/builder/spacing-handles.js.map +1 -0
- package/dist/components/cms/asset-picker.d.ts +12 -0
- package/dist/components/cms/asset-picker.js +60 -0
- package/dist/components/cms/asset-picker.js.map +1 -0
- package/dist/components/cms/bulk-actions.d.ts +60 -0
- package/dist/components/cms/bulk-actions.js +95 -0
- package/dist/components/cms/bulk-actions.js.map +1 -0
- package/dist/components/cms/bulk-bar.d.ts +23 -0
- package/dist/components/cms/bulk-bar.js +26 -0
- package/dist/components/cms/bulk-bar.js.map +1 -0
- package/dist/components/cms/cell-edit.d.ts +91 -0
- package/dist/components/cms/cell-edit.js +144 -0
- package/dist/components/cms/cell-edit.js.map +1 -0
- package/dist/components/cms/cell.d.ts +29 -0
- package/dist/components/cms/cell.js +127 -0
- package/dist/components/cms/cell.js.map +1 -0
- package/dist/components/cms/cms-index.d.ts +8 -0
- package/dist/components/cms/cms-index.js +23 -0
- package/dist/components/cms/cms-index.js.map +1 -0
- package/dist/components/cms/cms-store.d.ts +188 -0
- package/dist/components/cms/cms-store.js +702 -0
- package/dist/components/cms/cms-store.js.map +1 -0
- package/dist/components/cms/collection-table.d.ts +6 -0
- package/dist/components/cms/collection-table.js +250 -0
- package/dist/components/cms/collection-table.js.map +1 -0
- package/dist/components/cms/collections-sidebar.d.ts +9 -0
- package/dist/components/cms/collections-sidebar.js +25 -0
- package/dist/components/cms/collections-sidebar.js.map +1 -0
- package/dist/components/cms/detail-editor.d.ts +7 -0
- package/dist/components/cms/detail-editor.js +386 -0
- package/dist/components/cms/detail-editor.js.map +1 -0
- package/dist/components/cms/doc-state.d.ts +13 -0
- package/dist/components/cms/doc-state.js +18 -0
- package/dist/components/cms/doc-state.js.map +1 -0
- package/dist/components/cms/document-editor-context.d.ts +48 -0
- package/dist/components/cms/document-editor-context.js +23 -0
- package/dist/components/cms/document-editor-context.js.map +1 -0
- package/dist/components/cms/editable-cell.d.ts +22 -0
- package/dist/components/cms/editable-cell.js +176 -0
- package/dist/components/cms/editable-cell.js.map +1 -0
- package/dist/components/cms/field-control.d.ts +8 -0
- package/dist/components/cms/field-control.js +149 -0
- package/dist/components/cms/field-control.js.map +1 -0
- package/dist/components/cms/filter-builder.d.ts +12 -0
- package/dist/components/cms/filter-builder.js +84 -0
- package/dist/components/cms/filter-builder.js.map +1 -0
- package/dist/components/cms/import-export.d.ts +6 -0
- package/dist/components/cms/import-export.js +33 -0
- package/dist/components/cms/import-export.js.map +1 -0
- package/dist/components/cms/new-page-dialog.d.ts +22 -0
- package/dist/components/cms/new-page-dialog.js +42 -0
- package/dist/components/cms/new-page-dialog.js.map +1 -0
- package/dist/components/cms/reference-confirm.d.ts +25 -0
- package/dist/components/cms/reference-confirm.js +124 -0
- package/dist/components/cms/reference-confirm.js.map +1 -0
- package/dist/components/cms/relation-picker.d.ts +16 -0
- package/dist/components/cms/relation-picker.js +47 -0
- package/dist/components/cms/relation-picker.js.map +1 -0
- package/dist/components/cms/use-cell-edit.d.ts +33 -0
- package/dist/components/cms/use-cell-edit.js +125 -0
- package/dist/components/cms/use-cell-edit.js.map +1 -0
- package/dist/components/cms/versions-model.d.ts +15 -0
- package/dist/components/cms/versions-model.js +23 -0
- package/dist/components/cms/versions-model.js.map +1 -0
- package/dist/components/cms/versions-pane.d.ts +14 -0
- package/dist/components/cms/versions-pane.js +86 -0
- package/dist/components/cms/versions-pane.js.map +1 -0
- package/dist/components/cms/view-bar.d.ts +11 -0
- package/dist/components/cms/view-bar.js +80 -0
- package/dist/components/cms/view-bar.js.map +1 -0
- package/dist/components/collab/collab-context.d.ts +34 -0
- package/dist/components/collab/collab-context.js +52 -0
- package/dist/components/collab/collab-context.js.map +1 -0
- package/dist/components/collab/collab-seed.d.ts +27 -0
- package/dist/components/collab/collab-seed.js +42 -0
- package/dist/components/collab/collab-seed.js.map +1 -0
- package/dist/components/components/component-detail.d.ts +9 -0
- package/dist/components/components/component-detail.js +30 -0
- package/dist/components/components/component-detail.js.map +1 -0
- package/dist/components/components/component-status.d.ts +10 -0
- package/dist/components/components/component-status.js +30 -0
- package/dist/components/components/component-status.js.map +1 -0
- package/dist/components/components/components-index.d.ts +8 -0
- package/dist/components/components/components-index.js +42 -0
- package/dist/components/components/components-index.js.map +1 -0
- package/dist/components/components/field-inspector.d.ts +9 -0
- package/dist/components/components/field-inspector.js +38 -0
- package/dist/components/components/field-inspector.js.map +1 -0
- package/dist/components/components/fixture-runner.d.ts +10 -0
- package/dist/components/components/fixture-runner.js +24 -0
- package/dist/components/components/fixture-runner.js.map +1 -0
- package/dist/components/components/registry-browser.d.ts +4 -0
- package/dist/components/components/registry-browser.js +64 -0
- package/dist/components/components/registry-browser.js.map +1 -0
- package/dist/components/current-user-menu.d.ts +13 -0
- package/dist/components/current-user-menu.js +31 -0
- package/dist/components/current-user-menu.js.map +1 -0
- package/dist/components/dev-login-badge.d.ts +9 -0
- package/dist/components/dev-login-badge.js +18 -0
- package/dist/components/dev-login-badge.js.map +1 -0
- package/dist/components/extensions/extensions-view.d.ts +7 -0
- package/dist/components/extensions/extensions-view.js +126 -0
- package/dist/components/extensions/extensions-view.js.map +1 -0
- package/dist/components/guards.d.ts +27 -0
- package/dist/components/guards.js +46 -0
- package/dist/components/guards.js.map +1 -0
- package/dist/components/inspector/inspector-sidebar.d.ts +26 -0
- package/dist/components/inspector/inspector-sidebar.js +17 -0
- package/dist/components/inspector/inspector-sidebar.js.map +1 -0
- package/dist/components/operation-error.d.ts +17 -0
- package/dist/components/operation-error.js +54 -0
- package/dist/components/operation-error.js.map +1 -0
- package/dist/components/playground-badge.d.ts +10 -0
- package/dist/components/playground-badge.js +19 -0
- package/dist/components/playground-badge.js.map +1 -0
- package/dist/components/project-list.d.ts +15 -0
- package/dist/components/project-list.js +52 -0
- package/dist/components/project-list.js.map +1 -0
- package/dist/components/project-session.d.ts +46 -0
- package/dist/components/project-session.js +107 -0
- package/dist/components/project-session.js.map +1 -0
- package/dist/components/project-switcher.d.ts +11 -0
- package/dist/components/project-switcher.js +44 -0
- package/dist/components/project-switcher.js.map +1 -0
- package/dist/components/references/builder-deep-link.d.ts +12 -0
- package/dist/components/references/builder-deep-link.js +53 -0
- package/dist/components/references/builder-deep-link.js.map +1 -0
- package/dist/components/references/references-panel.d.ts +17 -0
- package/dist/components/references/references-panel.js +66 -0
- package/dist/components/references/references-panel.js.map +1 -0
- package/dist/components/routes/redirect-chain.d.ts +9 -0
- package/dist/components/routes/redirect-chain.js +16 -0
- package/dist/components/routes/redirect-chain.js.map +1 -0
- package/dist/components/routes/redirect-manager.d.ts +13 -0
- package/dist/components/routes/redirect-manager.js +24 -0
- package/dist/components/routes/redirect-manager.js.map +1 -0
- package/dist/components/routes/route-list.d.ts +35 -0
- package/dist/components/routes/route-list.js +69 -0
- package/dist/components/routes/route-list.js.map +1 -0
- package/dist/components/routes/routes-shell.d.ts +14 -0
- package/dist/components/routes/routes-shell.js +68 -0
- package/dist/components/routes/routes-shell.js.map +1 -0
- package/dist/components/section-nav.d.ts +17 -0
- package/dist/components/section-nav.js +33 -0
- package/dist/components/section-nav.js.map +1 -0
- package/dist/components/section-state.d.ts +24 -0
- package/dist/components/section-state.js +78 -0
- package/dist/components/section-state.js.map +1 -0
- package/dist/components/section-surface.d.ts +31 -0
- package/dist/components/section-surface.js +46 -0
- package/dist/components/section-surface.js.map +1 -0
- package/dist/components/sections.d.ts +38 -0
- package/dist/components/sections.js +72 -0
- package/dist/components/sections.js.map +1 -0
- package/dist/components/settings-form.d.ts +10 -0
- package/dist/components/settings-form.js +17 -0
- package/dist/components/settings-form.js.map +1 -0
- package/dist/components/studio-context.d.ts +22 -0
- package/dist/components/studio-context.js +48 -0
- package/dist/components/studio-context.js.map +1 -0
- package/dist/components/studio-project-screen.d.ts +19 -0
- package/dist/components/studio-project-screen.js +195 -0
- package/dist/components/studio-project-screen.js.map +1 -0
- package/dist/components/studio-shell.d.ts +18 -0
- package/dist/components/studio-shell.js +64 -0
- package/dist/components/studio-shell.js.map +1 -0
- package/dist/components/theme-context.d.ts +17 -0
- package/dist/components/theme-context.js +26 -0
- package/dist/components/theme-context.js.map +1 -0
- package/dist/components/workspace-gate.d.ts +12 -0
- package/dist/components/workspace-gate.js +27 -0
- package/dist/components/workspace-gate.js.map +1 -0
- package/dist/components/workspace-projects.d.ts +13 -0
- package/dist/components/workspace-projects.js +18 -0
- package/dist/components/workspace-projects.js.map +1 -0
- package/dist/lib/assets/delete-asset.d.ts +34 -0
- package/dist/lib/assets/delete-asset.js +34 -0
- package/dist/lib/assets/delete-asset.js.map +1 -0
- package/dist/lib/assets/image-dimensions.d.ts +18 -0
- package/dist/lib/assets/image-dimensions.js +26 -0
- package/dist/lib/assets/image-dimensions.js.map +1 -0
- package/dist/lib/assets/index.d.ts +9 -0
- package/dist/lib/assets/index.js +10 -0
- package/dist/lib/assets/index.js.map +1 -0
- package/dist/lib/assets/upload-state.d.ts +53 -0
- package/dist/lib/assets/upload-state.js +59 -0
- package/dist/lib/assets/upload-state.js.map +1 -0
- package/dist/lib/assets/upload.d.ts +56 -0
- package/dist/lib/assets/upload.js +125 -0
- package/dist/lib/assets/upload.js.map +1 -0
- package/dist/lib/auth/auth-adapter.d.ts +57 -0
- package/dist/lib/auth/auth-adapter.js +13 -0
- package/dist/lib/auth/auth-adapter.js.map +1 -0
- package/dist/lib/auth/convex-auth-adapter.d.ts +39 -0
- package/dist/lib/auth/convex-auth-adapter.js +171 -0
- package/dist/lib/auth/convex-auth-adapter.js.map +1 -0
- package/dist/lib/auth/dev-auto-login-adapter.d.ts +25 -0
- package/dist/lib/auth/dev-auto-login-adapter.js +40 -0
- package/dist/lib/auth/dev-auto-login-adapter.js.map +1 -0
- package/dist/lib/auth/index.d.ts +28 -0
- package/dist/lib/auth/index.js +61 -0
- package/dist/lib/auth/index.js.map +1 -0
- package/dist/lib/auth/local-auth-adapter.d.ts +57 -0
- package/dist/lib/auth/local-auth-adapter.js +78 -0
- package/dist/lib/auth/local-auth-adapter.js.map +1 -0
- package/dist/lib/auth/route-guard.d.ts +33 -0
- package/dist/lib/auth/route-guard.js +51 -0
- package/dist/lib/auth/route-guard.js.map +1 -0
- package/dist/lib/auth-errors.d.ts +42 -0
- package/dist/lib/auth-errors.js +74 -0
- package/dist/lib/auth-errors.js.map +1 -0
- package/dist/lib/bindings/section-bindings.d.ts +24 -0
- package/dist/lib/bindings/section-bindings.js +9 -0
- package/dist/lib/bindings/section-bindings.js.map +1 -0
- package/dist/lib/clipboard/index.d.ts +7 -0
- package/dist/lib/clipboard/index.js +8 -0
- package/dist/lib/clipboard/index.js.map +1 -0
- package/dist/lib/clipboard/os-clipboard.d.ts +46 -0
- package/dist/lib/clipboard/os-clipboard.js +105 -0
- package/dist/lib/clipboard/os-clipboard.js.map +1 -0
- package/dist/lib/clipboard/paste-issues.d.ts +34 -0
- package/dist/lib/clipboard/paste-issues.js +67 -0
- package/dist/lib/clipboard/paste-issues.js.map +1 -0
- package/dist/lib/clipboard/paste-target.d.ts +20 -0
- package/dist/lib/clipboard/paste-target.js +28 -0
- package/dist/lib/clipboard/paste-target.js.map +1 -0
- package/dist/lib/cms/published-documents.d.ts +30 -0
- package/dist/lib/cms/published-documents.js +75 -0
- package/dist/lib/cms/published-documents.js.map +1 -0
- package/dist/lib/cms-views/index.d.ts +9 -0
- package/dist/lib/cms-views/index.js +10 -0
- package/dist/lib/cms-views/index.js.map +1 -0
- package/dist/lib/cms-views/selection.d.ts +29 -0
- package/dist/lib/cms-views/selection.js +46 -0
- package/dist/lib/cms-views/selection.js.map +1 -0
- package/dist/lib/cms-views/view-model.d.ts +192 -0
- package/dist/lib/cms-views/view-model.js +353 -0
- package/dist/lib/cms-views/view-model.js.map +1 -0
- package/dist/lib/cms-views/views-store.d.ts +70 -0
- package/dist/lib/cms-views/views-store.js +129 -0
- package/dist/lib/cms-views/views-store.js.map +1 -0
- package/dist/lib/data/collection-content.d.ts +105 -0
- package/dist/lib/data/collection-content.js +196 -0
- package/dist/lib/data/collection-content.js.map +1 -0
- package/dist/lib/data/data-store.d.ts +97 -0
- package/dist/lib/data/data-store.js +205 -0
- package/dist/lib/data/data-store.js.map +1 -0
- package/dist/lib/data/index.d.ts +4 -0
- package/dist/lib/data/index.js +8 -0
- package/dist/lib/data/index.js.map +1 -0
- package/dist/lib/data/providers.d.ts +143 -0
- package/dist/lib/data/providers.js +255 -0
- package/dist/lib/data/providers.js.map +1 -0
- package/dist/lib/data/sample-capture.d.ts +30 -0
- package/dist/lib/data/sample-capture.js +70 -0
- package/dist/lib/data/sample-capture.js.map +1 -0
- package/dist/lib/data/sources-store.d.ts +42 -0
- package/dist/lib/data/sources-store.js +120 -0
- package/dist/lib/data/sources-store.js.map +1 -0
- package/dist/lib/dnd/drop-rules.d.ts +219 -0
- package/dist/lib/dnd/drop-rules.js +257 -0
- package/dist/lib/dnd/drop-rules.js.map +1 -0
- package/dist/lib/dnd/gap-drag.d.ts +66 -0
- package/dist/lib/dnd/gap-drag.js +95 -0
- package/dist/lib/dnd/gap-drag.js.map +1 -0
- package/dist/lib/locale/binding-fallback.d.ts +28 -0
- package/dist/lib/locale/binding-fallback.js +66 -0
- package/dist/lib/locale/binding-fallback.js.map +1 -0
- package/dist/lib/locale/fallback.d.ts +43 -0
- package/dist/lib/locale/fallback.js +52 -0
- package/dist/lib/locale/fallback.js.map +1 -0
- package/dist/lib/locale/index.d.ts +6 -0
- package/dist/lib/locale/index.js +7 -0
- package/dist/lib/locale/index.js.map +1 -0
- package/dist/lib/locale/locale-store.d.ts +40 -0
- package/dist/lib/locale/locale-store.js +61 -0
- package/dist/lib/locale/locale-store.js.map +1 -0
- package/dist/lib/locale/locale-switcher.d.ts +10 -0
- package/dist/lib/locale/locale-switcher.js +24 -0
- package/dist/lib/locale/locale-switcher.js.map +1 -0
- package/dist/lib/locale/route-variant.d.ts +14 -0
- package/dist/lib/locale/route-variant.js +11 -0
- package/dist/lib/locale/route-variant.js.map +1 -0
- package/dist/lib/locale/use-studio-locale.d.ts +10 -0
- package/dist/lib/locale/use-studio-locale.js +8 -0
- package/dist/lib/locale/use-studio-locale.js.map +1 -0
- package/dist/lib/operations/asset-repository.d.ts +15 -0
- package/dist/lib/operations/asset-repository.js +56 -0
- package/dist/lib/operations/asset-repository.js.map +1 -0
- package/dist/lib/operations/cms-persistence.d.ts +35 -0
- package/dist/lib/operations/cms-persistence.js +75 -0
- package/dist/lib/operations/cms-persistence.js.map +1 -0
- package/dist/lib/operations/graph-commands.d.ts +140 -0
- package/dist/lib/operations/graph-commands.js +86 -0
- package/dist/lib/operations/graph-commands.js.map +1 -0
- package/dist/lib/operations/graph-persistence.d.ts +27 -0
- package/dist/lib/operations/graph-persistence.js +35 -0
- package/dist/lib/operations/graph-persistence.js.map +1 -0
- package/dist/lib/operations/index.d.ts +13 -0
- package/dist/lib/operations/index.js +14 -0
- package/dist/lib/operations/index.js.map +1 -0
- package/dist/lib/operations/operations-package.d.ts +6 -0
- package/dist/lib/operations/operations-package.js +7 -0
- package/dist/lib/operations/operations-package.js.map +1 -0
- package/dist/lib/operations/persist-queue.d.ts +16 -0
- package/dist/lib/operations/persist-queue.js +18 -0
- package/dist/lib/operations/persist-queue.js.map +1 -0
- package/dist/lib/operations/session-hydration.d.ts +84 -0
- package/dist/lib/operations/session-hydration.js +112 -0
- package/dist/lib/operations/session-hydration.js.map +1 -0
- package/dist/lib/operations/studio-operations.d.ts +59 -0
- package/dist/lib/operations/studio-operations.js +92 -0
- package/dist/lib/operations/studio-operations.js.map +1 -0
- package/dist/lib/persistence/backend-mode.d.ts +69 -0
- package/dist/lib/persistence/backend-mode.js +120 -0
- package/dist/lib/persistence/backend-mode.js.map +1 -0
- package/dist/lib/persistence/convex-adapter.d.ts +34 -0
- package/dist/lib/persistence/convex-adapter.js +681 -0
- package/dist/lib/persistence/convex-adapter.js.map +1 -0
- package/dist/lib/persistence/convex-blob-storage.d.ts +57 -0
- package/dist/lib/persistence/convex-blob-storage.js +97 -0
- package/dist/lib/persistence/convex-blob-storage.js.map +1 -0
- package/dist/lib/persistence/convex-client.d.ts +19 -0
- package/dist/lib/persistence/convex-client.js +40 -0
- package/dist/lib/persistence/convex-client.js.map +1 -0
- package/dist/lib/persistence/index.d.ts +30 -0
- package/dist/lib/persistence/index.js +60 -0
- package/dist/lib/persistence/index.js.map +1 -0
- package/dist/lib/persona/labels.d.ts +23 -0
- package/dist/lib/persona/labels.js +122 -0
- package/dist/lib/persona/labels.js.map +1 -0
- package/dist/lib/rail.d.ts +11 -0
- package/dist/lib/rail.js +26 -0
- package/dist/lib/rail.js.map +1 -0
- package/dist/lib/references/impact.d.ts +64 -0
- package/dist/lib/references/impact.js +62 -0
- package/dist/lib/references/impact.js.map +1 -0
- package/dist/lib/references/index.d.ts +7 -0
- package/dist/lib/references/index.js +8 -0
- package/dist/lib/references/index.js.map +1 -0
- package/dist/lib/references/reference-model.d.ts +125 -0
- package/dist/lib/references/reference-model.js +242 -0
- package/dist/lib/references/reference-model.js.map +1 -0
- package/dist/lib/references/references-store.d.ts +65 -0
- package/dist/lib/references/references-store.js +221 -0
- package/dist/lib/references/references-store.js.map +1 -0
- package/dist/lib/registry/index.d.ts +65 -0
- package/dist/lib/registry/index.js +114 -0
- package/dist/lib/registry/index.js.map +1 -0
- package/dist/lib/registry/preview.d.ts +15 -0
- package/dist/lib/registry/preview.js +110 -0
- package/dist/lib/registry/preview.js.map +1 -0
- package/dist/lib/registry/project-components.d.ts +16 -0
- package/dist/lib/registry/project-components.js +152 -0
- package/dist/lib/registry/project-components.js.map +1 -0
- package/dist/lib/routing/index.d.ts +10 -0
- package/dist/lib/routing/index.js +11 -0
- package/dist/lib/routing/index.js.map +1 -0
- package/dist/lib/routing/routing-analysis.d.ts +26 -0
- package/dist/lib/routing/routing-analysis.js +37 -0
- package/dist/lib/routing/routing-analysis.js.map +1 -0
- package/dist/lib/routing/routing-store.d.ts +50 -0
- package/dist/lib/routing/routing-store.js +72 -0
- package/dist/lib/routing/routing-store.js.map +1 -0
- package/dist/lib/starters/kit-session.d.ts +5 -0
- package/dist/lib/starters/kit-session.js +17 -0
- package/dist/lib/starters/kit-session.js.map +1 -0
- package/dist/lib/theme.d.ts +21 -0
- package/dist/lib/theme.js +32 -0
- package/dist/lib/theme.js.map +1 -0
- package/dist/lib/utils.d.ts +11 -0
- package/dist/lib/utils.js +28 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/webhooks/config.d.ts +15 -0
- package/dist/lib/webhooks/config.js +64 -0
- package/dist/lib/webhooks/config.js.map +1 -0
- package/dist/lib/webhooks/dispatcher.d.ts +67 -0
- package/dist/lib/webhooks/dispatcher.js +61 -0
- package/dist/lib/webhooks/dispatcher.js.map +1 -0
- package/dist/lib/webhooks/index.d.ts +11 -0
- package/dist/lib/webhooks/index.js +10 -0
- package/dist/lib/webhooks/index.js.map +1 -0
- package/dist/lib/webhooks/signing.d.ts +15 -0
- package/dist/lib/webhooks/signing.js +24 -0
- package/dist/lib/webhooks/signing.js.map +1 -0
- package/dist/lib/webhooks/tags.d.ts +25 -0
- package/dist/lib/webhooks/tags.js +173 -0
- package/dist/lib/webhooks/tags.js.map +1 -0
- package/dist/lib/working-graph.d.ts +82 -0
- package/dist/lib/working-graph.js +113 -0
- package/dist/lib/working-graph.js.map +1 -0
- package/dist/lib/workspace/index.d.ts +109 -0
- package/dist/lib/workspace/index.js +206 -0
- package/dist/lib/workspace/index.js.map +1 -0
- package/dist/lib/workspace/switcher-source.d.ts +39 -0
- package/dist/lib/workspace/switcher-source.js +23 -0
- package/dist/lib/workspace/switcher-source.js.map +1 -0
- package/dist/lib/workspace/workspace-source.d.ts +47 -0
- package/dist/lib/workspace/workspace-source.js +67 -0
- package/dist/lib/workspace/workspace-source.js.map +1 -0
- package/dist/router/index.d.ts +32 -0
- package/dist/router/index.js +32 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/match.d.ts +75 -0
- package/dist/router/match.js +87 -0
- package/dist/router/match.js.map +1 -0
- package/dist/router/search.d.ts +22 -0
- package/dist/router/search.js +16 -0
- package/dist/router/search.js.map +1 -0
- package/dist/ui/avatar.d.ts +17 -0
- package/dist/ui/avatar.js +38 -0
- package/dist/ui/avatar.js.map +1 -0
- package/dist/ui/badge.d.ts +9 -0
- package/dist/ui/badge.js +23 -0
- package/dist/ui/badge.js.map +1 -0
- package/dist/ui/button.d.ts +11 -0
- package/dist/ui/button.js +30 -0
- package/dist/ui/button.js.map +1 -0
- package/dist/ui/card.d.ts +11 -0
- package/dist/ui/card.js +23 -0
- package/dist/ui/card.js.map +1 -0
- package/dist/ui/dialog.d.ts +12 -0
- package/dist/ui/dialog.js +27 -0
- package/dist/ui/dialog.js.map +1 -0
- package/dist/ui/dropdown-menu.d.ts +15 -0
- package/dist/ui/dropdown-menu.js +24 -0
- package/dist/ui/dropdown-menu.js.map +1 -0
- package/dist/ui/field.d.ts +15 -0
- package/dist/ui/field.js +14 -0
- package/dist/ui/field.js.map +1 -0
- package/dist/ui/index.d.ts +14 -0
- package/dist/ui/index.js +15 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/input.d.ts +3 -0
- package/dist/ui/input.js +7 -0
- package/dist/ui/input.js.map +1 -0
- package/dist/ui/inspector.d.ts +18 -0
- package/dist/ui/inspector.js +14 -0
- package/dist/ui/inspector.js.map +1 -0
- package/dist/ui/layout.d.ts +45 -0
- package/dist/ui/layout.js +48 -0
- package/dist/ui/layout.js.map +1 -0
- package/dist/ui/panel.d.ts +12 -0
- package/dist/ui/panel.js +20 -0
- package/dist/ui/panel.js.map +1 -0
- package/dist/ui/separator.d.ts +6 -0
- package/dist/ui/separator.js +7 -0
- package/dist/ui/separator.js.map +1 -0
- package/dist/ui/toolbar.d.ts +9 -0
- package/dist/ui/toolbar.js +16 -0
- package/dist/ui/toolbar.js.map +1 -0
- package/dist/ui/typography.d.ts +50 -0
- package/dist/ui/typography.js +43 -0
- package/dist/ui/typography.js.map +1 -0
- package/package.json +149 -0
- package/src/styles/studio.css +101 -0
- package/src/styles/tokens.css +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions-pane.js","sourceRoot":"","sources":["../../../src/components/cms/versions-pane.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CollectionDef } from '@elytracms/cms-core';
|
|
2
|
+
/**
|
|
3
|
+
* The saved-view bar of the collection table (EC-169): switch between the
|
|
4
|
+
* unnamed "All documents" default and the project's named views, see when the
|
|
5
|
+
* working state diverged ("unsaved changes" with save / save-as / reset), and
|
|
6
|
+
* configure visible/ordered columns. View mutations go through the store's
|
|
7
|
+
* operations-backed actions; deleting a view is view-only by construction.
|
|
8
|
+
*/
|
|
9
|
+
export declare function ViewBar({ collection }: {
|
|
10
|
+
collection: CollectionDef;
|
|
11
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { ArrowDown, ArrowUp, Columns3, RotateCcw, Save, Trash2 } from 'lucide-react';
|
|
4
|
+
import { Badge, Button, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuTrigger, Input, Row, Spacer, Text, } from '@elytracms/studio/ui';
|
|
5
|
+
import { cn } from '@elytracms/studio/lib/utils';
|
|
6
|
+
import { ALL_VIEW_ID, moveColumn, resolveColumns, toggleColumn } from '@elytracms/studio/lib/cms-views';
|
|
7
|
+
import { fieldLabel, useCms } from './cms-store';
|
|
8
|
+
/**
|
|
9
|
+
* The saved-view bar of the collection table (EC-169): switch between the
|
|
10
|
+
* unnamed "All documents" default and the project's named views, see when the
|
|
11
|
+
* working state diverged ("unsaved changes" with save / save-as / reset), and
|
|
12
|
+
* configure visible/ordered columns. View mutations go through the store's
|
|
13
|
+
* operations-backed actions; deleting a view is view-only by construction.
|
|
14
|
+
*/
|
|
15
|
+
export function ViewBar({ collection }) {
|
|
16
|
+
const cms = useCms();
|
|
17
|
+
const collectionId = collection.id;
|
|
18
|
+
const views = cms.viewsOf(collectionId);
|
|
19
|
+
const activeId = cms.activeViewId(collectionId);
|
|
20
|
+
const active = views.find((view) => view.id === activeId) ?? views[0];
|
|
21
|
+
const dirty = cms.isViewDirty(collectionId);
|
|
22
|
+
const [saveAsOpen, setSaveAsOpen] = useState(false);
|
|
23
|
+
const [busy, setBusy] = useState(false);
|
|
24
|
+
async function run(task) {
|
|
25
|
+
setBusy(true);
|
|
26
|
+
try {
|
|
27
|
+
await task();
|
|
28
|
+
}
|
|
29
|
+
finally {
|
|
30
|
+
setBusy(false);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return (_jsxs(Row, { gap: "1", wrap: true, className: "mt-3", "data-testid": "view-bar", children: [views.map((view) => (_jsxs("button", { type: "button", "aria-pressed": view.id === active.id, "data-testid": `view-chip-${view.id}`, onClick: () => cms.setActiveView(collectionId, view.id), className: cn('rounded-full border px-2.5 py-0.5 text-xs transition-colors', view.id === active.id
|
|
34
|
+
? 'border-primary/30 bg-primary/10 text-primary'
|
|
35
|
+
: 'border-border text-muted-foreground hover:bg-muted'), children: [view.name, view.id === active.id && dirty ? ' *' : ''] }, view.id))), active.id !== ALL_VIEW_ID ? (_jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": `Delete view ${active.name}`, "data-testid": "view-delete", disabled: busy, onClick: () => void run(() => cms.deleteView(collectionId, active.id)), title: "Delete this view (documents are never touched)", children: _jsx(Trash2, {}) })) : null, dirty ? (_jsxs(Row, { gap: "1", "data-testid": "view-dirty-actions", children: [_jsx(Badge, { variant: "warning", "data-testid": "view-dirty-badge", children: "Unsaved changes" }), active.id !== ALL_VIEW_ID ? (_jsxs(Button, { variant: "outline", size: "sm", "data-testid": "view-save", disabled: busy, onClick: () => void run(() => cms.saveActiveView(collectionId)), children: [_jsx(Save, {}), " Save"] })) : null, _jsx(Button, { variant: "outline", size: "sm", "data-testid": "view-save-as", disabled: busy, onClick: () => setSaveAsOpen(true), children: "Save as\u2026" }), _jsxs(Button, { variant: "ghost", size: "sm", "data-testid": "view-reset", disabled: busy, onClick: () => cms.resetTableState(collectionId), children: [_jsx(RotateCcw, {}), " Reset"] })] })) : null, _jsx(Spacer, {}), _jsx(ColumnsMenu, { collection: collection }), _jsx(SaveViewAsDialog, { open: saveAsOpen, onOpenChange: setSaveAsOpen, onSave: (name) => run(async () => {
|
|
36
|
+
const ok = await cms.saveViewAs(collectionId, name);
|
|
37
|
+
if (ok)
|
|
38
|
+
setSaveAsOpen(false);
|
|
39
|
+
return ok;
|
|
40
|
+
}) })] }));
|
|
41
|
+
}
|
|
42
|
+
/** Name prompt for "save as" — a named view is created from the working state. */
|
|
43
|
+
function SaveViewAsDialog({ open, onOpenChange, onSave, }) {
|
|
44
|
+
const [name, setName] = useState('');
|
|
45
|
+
function submit(event) {
|
|
46
|
+
event.preventDefault();
|
|
47
|
+
if (name.trim() === '')
|
|
48
|
+
return;
|
|
49
|
+
void onSave(name).then(() => setName(''));
|
|
50
|
+
}
|
|
51
|
+
return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsx(DialogContent, { "data-testid": "save-view-dialog", children: _jsxs("form", { onSubmit: submit, className: "grid gap-4", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Save view" }), _jsx(DialogDescription, { children: "Saves the current filters, sort, and columns as a named view, shared with every editor on this project." })] }), _jsx(Input, { autoFocus: true, value: name, onChange: (event) => setName(event.target.value), placeholder: "View name", "aria-label": "View name", "data-testid": "save-view-name" }), _jsxs(DialogFooter, { children: [_jsx(Button, { type: "button", variant: "outline", onClick: () => onOpenChange(false), children: "Cancel" }), _jsx(Button, { type: "submit", disabled: name.trim() === '', "data-testid": "save-view-confirm", children: "Save view" })] })] }) }) }));
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Visible/ordered column configuration — edits the working view state. Order is
|
|
55
|
+
* a property of all columns (visible or not); a checkbox toggles visibility
|
|
56
|
+
* without moving the column (EC-213). The first visible column is the title/link
|
|
57
|
+
* and can't be hidden (the table always needs a title column).
|
|
58
|
+
*/
|
|
59
|
+
function ColumnsMenu({ collection }) {
|
|
60
|
+
const cms = useCms();
|
|
61
|
+
const collectionId = collection.id;
|
|
62
|
+
const state = cms.tableStateOf(collectionId);
|
|
63
|
+
const columns = resolveColumns(collection, state);
|
|
64
|
+
const titleField = columns.find((column) => column.visible)?.field;
|
|
65
|
+
return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { variant: "outline", size: "sm", "data-testid": "columns-menu", children: [_jsx(Columns3, {}), " Columns"] }) }), _jsxs(DropdownMenuContent, { className: "w-64", children: [_jsx(DropdownMenuLabel, { children: "Columns \u00B7 first visible is the title" }), columns.map((column, index) => {
|
|
66
|
+
const field = collection.fields.find((f) => f.name === column.field);
|
|
67
|
+
if (!field)
|
|
68
|
+
return null;
|
|
69
|
+
const isTitle = column.field === titleField;
|
|
70
|
+
return (_jsxs(DropdownMenuItem, { onSelect: (event) => event.preventDefault(), "data-testid": `column-row-${column.field}`, children: [_jsx("input", { type: "checkbox", className: "size-3.5 accent-primary", checked: column.visible, disabled: isTitle, onChange: () => cms.setTableState(collectionId, (prev) => toggleColumn(collection, prev, column.field)), "aria-label": `Toggle column ${fieldLabel(field)}`, "data-testid": `column-toggle-${column.field}` }), _jsxs(Text, { as: "span", size: "sm", className: "min-w-0 flex-1 truncate", children: [fieldLabel(field), isTitle ? (_jsxs(Text, { as: "span", size: "xs", tone: "subtle", children: [' ', "(title)"] })) : null] }), _jsxs(Row, { gap: "1", children: [_jsx(ColumnMoveButton, { label: `Move column ${fieldLabel(field)} up`, icon: _jsx(ArrowUp, {}), disabled: index <= 0, onMove: () => cms.setTableState(collectionId, (prev) => moveColumn(collection, prev, column.field, -1)) }), _jsx(ColumnMoveButton, { label: `Move column ${fieldLabel(field)} down`, icon: _jsx(ArrowDown, {}), disabled: index >= columns.length - 1, onMove: () => cms.setTableState(collectionId, (prev) => moveColumn(collection, prev, column.field, 1)) })] })] }, column.field));
|
|
71
|
+
})] })] }));
|
|
72
|
+
}
|
|
73
|
+
function ColumnMoveButton({ label, icon, disabled, onMove, }) {
|
|
74
|
+
return (_jsx(Button, { variant: "ghost", size: "icon-sm", className: "size-5 [&_svg]:size-3", "aria-label": label, disabled: disabled, onClick: (event) => {
|
|
75
|
+
event.preventDefault();
|
|
76
|
+
event.stopPropagation();
|
|
77
|
+
onMove();
|
|
78
|
+
}, children: icon }));
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=view-bar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view-bar.js","sourceRoot":"","sources":["../../../src/components/cms/view-bar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import { Collaboration } from '@elytracms/collaboration';
|
|
3
|
+
import type { Actor, PreviewMode } from '@elytracms/collaboration';
|
|
4
|
+
import type { ProjectGraph } from '@elytracms/project-graph';
|
|
5
|
+
import type { HydratedPublish } from '@elytracms/studio/lib/operations';
|
|
6
|
+
/**
|
|
7
|
+
* Per-project collaboration session (Phase 10). Holds one {@link Collaboration} store seeded with
|
|
8
|
+
* an initial version + demo participants, and exposes a `mutate` helper that re-renders consumers
|
|
9
|
+
* after an imperative store change. Non-persistent (session), but in Convex mode the seed REFLECTS
|
|
10
|
+
* the persisted publishing state (EC-177 gap 1): the hydrated `publish` becomes a version + publish
|
|
11
|
+
* event, so the session shows what is actually live instead of "No publishes yet". A Convex backend
|
|
12
|
+
* would supply live, multi-client transport behind the same store shape. Single-environment
|
|
13
|
+
* (EC-179): a deployment IS one environment, so there is no environment selector.
|
|
14
|
+
*/
|
|
15
|
+
export interface CollabStore {
|
|
16
|
+
collab: Collaboration;
|
|
17
|
+
projectId: string;
|
|
18
|
+
me: Actor;
|
|
19
|
+
/** Draft vs published perspective the canvas/preview renders (EC-123). */
|
|
20
|
+
previewMode: PreviewMode;
|
|
21
|
+
setPreviewMode: (mode: PreviewMode) => void;
|
|
22
|
+
/** Run an imperative store mutation, then re-render consumers. */
|
|
23
|
+
mutate: <T>(fn: () => T) => T;
|
|
24
|
+
}
|
|
25
|
+
declare const COLLABORATOR: Actor;
|
|
26
|
+
export declare function CollabProvider({ projectId, graph, publish, children, }: {
|
|
27
|
+
projectId: string;
|
|
28
|
+
graph: ProjectGraph;
|
|
29
|
+
/** The persisted publish to reflect in the session seed (Convex mode, EC-177 gap 1). */
|
|
30
|
+
publish?: HydratedPublish | null;
|
|
31
|
+
children: ReactNode;
|
|
32
|
+
}): import("react").JSX.Element;
|
|
33
|
+
export declare function useCollab(): CollabStore;
|
|
34
|
+
export { COLLABORATOR };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useMemo, useReducer, useRef } from 'react';
|
|
3
|
+
import { Collaboration, createSequentialClock, createSequentialIds } from '@elytracms/collaboration';
|
|
4
|
+
import { serializeProjectGraph } from '@elytracms/project-graph';
|
|
5
|
+
import { seedCollabSession } from './collab-seed';
|
|
6
|
+
const CollabContext = createContext(null);
|
|
7
|
+
const ME = { id: 'u-you', name: 'You' };
|
|
8
|
+
const COLLABORATOR = { id: 'u-grace', name: 'Grace Hopper' };
|
|
9
|
+
export function CollabProvider({ projectId, graph, publish, children, }) {
|
|
10
|
+
const [tick, bump] = useReducer((n) => n + 1, 0);
|
|
11
|
+
const [previewMode, setPreviewModeState] = useReducer((_, next) => next, 'draft');
|
|
12
|
+
const ref = useRef(null);
|
|
13
|
+
if (ref.current === null) {
|
|
14
|
+
const collab = new Collaboration({ clock: createSequentialClock(), ids: createSequentialIds() });
|
|
15
|
+
// Seed: an initial version from the current graph (+ the hydrated persisted
|
|
16
|
+
// publish in Convex mode) and presence for two participants (EC-122/126).
|
|
17
|
+
seedCollabSession(collab, projectId, {
|
|
18
|
+
snapshot: serializeProjectGraph(graph),
|
|
19
|
+
author: ME.name,
|
|
20
|
+
...(publish !== undefined ? { publish } : {}),
|
|
21
|
+
});
|
|
22
|
+
collab.presence.join(projectId, ME);
|
|
23
|
+
collab.presence.join(projectId, COLLABORATOR);
|
|
24
|
+
ref.current = collab;
|
|
25
|
+
}
|
|
26
|
+
const store = useMemo(() => {
|
|
27
|
+
const collab = ref.current;
|
|
28
|
+
return {
|
|
29
|
+
collab,
|
|
30
|
+
projectId,
|
|
31
|
+
me: ME,
|
|
32
|
+
previewMode,
|
|
33
|
+
setPreviewMode: setPreviewModeState,
|
|
34
|
+
mutate: (fn) => {
|
|
35
|
+
const result = fn();
|
|
36
|
+
bump();
|
|
37
|
+
return result;
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
// `tick` (bumped by `mutate`) and `previewMode` are in deps so consumers
|
|
41
|
+
// re-render after an imperative store mutation or a preview change.
|
|
42
|
+
}, [projectId, previewMode, tick]);
|
|
43
|
+
return _jsx(CollabContext.Provider, { value: store, children: children });
|
|
44
|
+
}
|
|
45
|
+
export function useCollab() {
|
|
46
|
+
const store = useContext(CollabContext);
|
|
47
|
+
if (!store)
|
|
48
|
+
throw new Error('useCollab must be used within a <CollabProvider>.');
|
|
49
|
+
return store;
|
|
50
|
+
}
|
|
51
|
+
export { COLLABORATOR };
|
|
52
|
+
//# sourceMappingURL=collab-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collab-context.js","sourceRoot":"","sources":["../../../src/components/collab/collab-context.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAE9E,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAEpG,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAGhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAsBjD,MAAM,aAAa,GAAG,aAAa,CAAqB,IAAI,CAAC,CAAA;AAE7D,MAAM,EAAE,GAAU,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AAC9C,MAAM,YAAY,GAAU,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAA;AAEnE,MAAM,UAAU,cAAc,CAAC,EAC7B,SAAS,EACT,KAAK,EACL,OAAO,EACP,QAAQ,GAOT;IACC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IACxD,MAAM,CAAC,WAAW,EAAE,mBAAmB,CAAC,GAAG,UAAU,CACnD,CAAC,CAAc,EAAE,IAAiB,EAAE,EAAE,CAAC,IAAI,EAC3C,OAAsB,CACvB,CAAA;IAED,MAAM,GAAG,GAAG,MAAM,CAAuB,IAAI,CAAC,CAAA;IAC9C,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,GAAG,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAA;QAChG,4EAA4E;QAC5E,0EAA0E;QAC1E,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE;YACnC,QAAQ,EAAE,qBAAqB,CAAC,KAAK,CAAC;YACtC,MAAM,EAAE,EAAE,CAAC,IAAI;YACf,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CAAC,CAAA;QACF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;QACnC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;QAC7C,GAAG,CAAC,OAAO,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAc,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,GAAG,CAAC,OAAQ,CAAA;QAC3B,OAAO;YACL,MAAM;YACN,SAAS;YACT,EAAE,EAAE,EAAE;YACN,WAAW;YACX,cAAc,EAAE,mBAAmB;YACnC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE;gBACb,MAAM,MAAM,GAAG,EAAE,EAAE,CAAA;gBACnB,IAAI,EAAE,CAAA;gBACN,OAAO,MAAM,CAAA;YACf,CAAC;SACF,CAAA;QACD,yEAAyE;QACzE,oEAAoE;IACtE,CAAC,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAA;IAElC,OAAO,KAAC,aAAa,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA0B,CAAA;AAClF,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,KAAK,GAAG,UAAU,CAAC,aAAa,CAAC,CAAA;IACvC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IAChF,OAAO,KAAK,CAAA;AACd,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,CAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Collaboration } from '@elytracms/collaboration';
|
|
2
|
+
import type { HydratedPublish } from '@elytracms/studio/lib/operations';
|
|
3
|
+
/**
|
|
4
|
+
* Seed a fresh per-project {@link Collaboration} session (EC-177 gap 1).
|
|
5
|
+
*
|
|
6
|
+
* The collaboration store is session state over an in-memory engine, but in
|
|
7
|
+
* Convex mode its starting point must REFLECT the persisted publishing state:
|
|
8
|
+
* when a revision is pinned live the session shows as published (with a
|
|
9
|
+
* matching version + history event), never as "No publishes yet".
|
|
10
|
+
*
|
|
11
|
+
* Order matters: the published-revision snapshot becomes a version FIRST, the
|
|
12
|
+
* working draft ("Initial") is created LAST — `versions.latest()` (what
|
|
13
|
+
* "Publish" pins) must stay the session's working graph. A publish whose
|
|
14
|
+
* pinned snapshot equals the working graph reuses the Initial version, so
|
|
15
|
+
* "live vN" and "current" agree when the latest revision is the one live.
|
|
16
|
+
*
|
|
17
|
+
* Without `publish` (playground mode, kit sessions) this seeds exactly the
|
|
18
|
+
* pre-hydration session: one Initial version, nothing published.
|
|
19
|
+
*/
|
|
20
|
+
export declare function seedCollabSession(collab: Collaboration, projectId: string, options: {
|
|
21
|
+
/** Serialized working graph (the session's draft snapshot). */
|
|
22
|
+
snapshot: string;
|
|
23
|
+
/** Author recorded on the Initial version. */
|
|
24
|
+
author: string;
|
|
25
|
+
/** The persisted publish to reflect (hydrated; absent in playground). */
|
|
26
|
+
publish?: HydratedPublish | null;
|
|
27
|
+
}): void;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seed a fresh per-project {@link Collaboration} session (EC-177 gap 1).
|
|
3
|
+
*
|
|
4
|
+
* The collaboration store is session state over an in-memory engine, but in
|
|
5
|
+
* Convex mode its starting point must REFLECT the persisted publishing state:
|
|
6
|
+
* when a revision is pinned live the session shows as published (with a
|
|
7
|
+
* matching version + history event), never as "No publishes yet".
|
|
8
|
+
*
|
|
9
|
+
* Order matters: the published-revision snapshot becomes a version FIRST, the
|
|
10
|
+
* working draft ("Initial") is created LAST — `versions.latest()` (what
|
|
11
|
+
* "Publish" pins) must stay the session's working graph. A publish whose
|
|
12
|
+
* pinned snapshot equals the working graph reuses the Initial version, so
|
|
13
|
+
* "live vN" and "current" agree when the latest revision is the one live.
|
|
14
|
+
*
|
|
15
|
+
* Without `publish` (playground mode, kit sessions) this seeds exactly the
|
|
16
|
+
* pre-hydration session: one Initial version, nothing published.
|
|
17
|
+
*/
|
|
18
|
+
export function seedCollabSession(collab, projectId, options) {
|
|
19
|
+
const publish = options.publish ?? null;
|
|
20
|
+
// A version for the published snapshot when it differs from the draft.
|
|
21
|
+
let publishedVersionId;
|
|
22
|
+
if (publish && publish.serializedGraph !== options.snapshot) {
|
|
23
|
+
const version = collab.versions.create(projectId, {
|
|
24
|
+
snapshot: publish.serializedGraph,
|
|
25
|
+
label: `Revision ${publish.revision}`,
|
|
26
|
+
message: `Published revision ${publish.revision} (loaded from the backend).`,
|
|
27
|
+
origin: 'import',
|
|
28
|
+
});
|
|
29
|
+
publishedVersionId = version.id;
|
|
30
|
+
}
|
|
31
|
+
const initial = collab.versions.create(projectId, {
|
|
32
|
+
snapshot: options.snapshot,
|
|
33
|
+
label: 'Initial',
|
|
34
|
+
message: 'Project opened.',
|
|
35
|
+
author: options.author,
|
|
36
|
+
origin: 'import',
|
|
37
|
+
});
|
|
38
|
+
if (publish) {
|
|
39
|
+
collab.publishing.publish(projectId, publishedVersionId ?? initial.id);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=collab-seed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collab-seed.js","sourceRoot":"","sources":["../../../src/components/collab/collab-seed.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAqB,EACrB,SAAiB,EACjB,OAOC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAA;IAEvC,uEAAuE;IACvE,IAAI,kBAAsC,CAAA;IAC1C,IAAI,OAAO,IAAI,OAAO,CAAC,eAAe,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE;YAChD,QAAQ,EAAE,OAAO,CAAC,eAAe;YACjC,KAAK,EAAE,YAAY,OAAO,CAAC,QAAQ,EAAE;YACrC,OAAO,EAAE,sBAAsB,OAAO,CAAC,QAAQ,6BAA6B;YAC5E,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAA;QACF,kBAAkB,GAAG,OAAO,CAAC,EAAE,CAAA;IACjC,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE;QAChD,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,iBAAiB;QAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,QAAQ;KACjB,CAAC,CAAA;IAEF,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,kBAAkB,IAAI,OAAO,CAAC,EAAE,CAAC,CAAA;IACxE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The component detail view (EC-223 Stage 6): manifest metadata, the field/slot
|
|
3
|
+
* inspector, the fixture runner, and inbound references. Takes its ids as props
|
|
4
|
+
* — the splat resolver sources `componentId` from the engine route table.
|
|
5
|
+
*/
|
|
6
|
+
export declare function ComponentDetail({ projectId, componentId, }: {
|
|
7
|
+
projectId: string;
|
|
8
|
+
componentId: string;
|
|
9
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { ArrowLeft } from 'lucide-react';
|
|
3
|
+
import { isPrimitive } from '@elytracms/component-registry';
|
|
4
|
+
import { Link, STUDIO_PROJECT_ROUTE, studioPath } from '@elytracms/studio/router';
|
|
5
|
+
import { componentStatus, getStudioRegistry } from '@elytracms/studio/lib/registry';
|
|
6
|
+
import { ComponentStatusBadge, statusDescription, } from '@elytracms/studio/components/components/component-status';
|
|
7
|
+
import { FieldInspector } from '@elytracms/studio/components/components/field-inspector';
|
|
8
|
+
import { FixtureRunner } from '@elytracms/studio/components/components/fixture-runner';
|
|
9
|
+
import { ReferencesPanel } from '@elytracms/studio/components/references/references-panel';
|
|
10
|
+
import { useSetBreadcrumb } from '@elytracms/studio/components/breadcrumb-context';
|
|
11
|
+
import { Badge, Code, Heading, Row, Spacer, Stack, Text } from '@elytracms/studio/ui';
|
|
12
|
+
/**
|
|
13
|
+
* The component detail view (EC-223 Stage 6): manifest metadata, the field/slot
|
|
14
|
+
* inspector, the fixture runner, and inbound references. Takes its ids as props
|
|
15
|
+
* — the splat resolver sources `componentId` from the engine route table.
|
|
16
|
+
*/
|
|
17
|
+
export function ComponentDetail({ projectId, componentId, }) {
|
|
18
|
+
const studio = getStudioRegistry();
|
|
19
|
+
const manifest = studio.registry.getManifest(componentId);
|
|
20
|
+
// EC-214: the component is the active record — name it in the global header
|
|
21
|
+
// breadcrumb (under the Components section crumb).
|
|
22
|
+
useSetBreadcrumb([{ label: manifest?.title ?? manifest?.id ?? componentId }]);
|
|
23
|
+
if (!manifest) {
|
|
24
|
+
return (_jsx("div", { className: "grid h-full place-items-center p-8", children: _jsxs(Stack, { gap: "3", align: "center", className: "max-w-sm text-center", children: [_jsx(Heading, { level: 2, size: "h2", children: "Component not found" }), _jsxs(Text, { tone: "muted", children: ["No component is registered with id ", _jsx(Code, { tone: "muted", children: componentId }), "."] }), _jsx(Link, { to: STUDIO_PROJECT_ROUTE, params: { projectId, _splat: studioPath.components() }, className: "text-sm text-primary hover:underline", children: "Back to components" })] }) }));
|
|
25
|
+
}
|
|
26
|
+
const status = componentStatus(studio, manifest);
|
|
27
|
+
const namespace = isPrimitive(manifest.id) ? 'base.primitives' : 'project';
|
|
28
|
+
return (_jsxs("div", { className: "mx-auto w-full max-w-4xl p-4 sm:p-6", children: [_jsxs(Link, { to: STUDIO_PROJECT_ROUTE, params: { projectId, _splat: studioPath.components() }, className: "mb-3 inline-flex items-center gap-1 text-xs text-muted-foreground transition-colors hover:text-foreground md:hidden", children: [_jsx(ArrowLeft, { className: "size-3.5" }), " All components"] }), _jsxs(Stack, { gap: "6", children: [_jsxs(Stack, { gap: "2", children: [_jsxs(Row, { gap: "2", wrap: true, children: [_jsx(Heading, { size: "display", children: manifest.title ?? manifest.id }), _jsx(Badge, { variant: namespace === 'project' ? 'primary' : 'outline', children: namespace }), manifest.category ? _jsx(Badge, { variant: "outline", children: manifest.category }) : null, _jsx(Spacer, {}), _jsx(ComponentStatusBadge, { status: status })] }), _jsx(Code, { tone: "muted", className: "w-fit", children: manifest.id }), manifest.description ? (_jsx(Text, { tone: "muted", className: "max-w-prose", children: manifest.description })) : null, status !== 'valid' ? (_jsx(Text, { size: "sm", className: status === 'invalid' ? 'text-destructive' : 'text-warning', children: statusDescription(status) })) : null] }), manifest.designTokens && manifest.designTokens.length > 0 ? (_jsxs(Stack, { gap: "1", children: [_jsx(Text, { size: "xs", tone: "muted", mono: true, children: "DESIGN TOKENS" }), _jsx(Row, { gap: "1", wrap: true, children: manifest.designTokens.map((token) => (_jsx(Code, { tone: "muted", children: token }, token))) })] })) : null, _jsx(FixtureRunner, { manifest: manifest }, manifest.id), _jsx(FieldInspector, { manifest: manifest }), _jsx(ReferencesPanel, { projectId: projectId, target: { type: 'component', id: manifest.id } })] })] }));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=component-detail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-detail.js","sourceRoot":"","sources":["../../../src/components/components/component-detail.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ComponentStatus } from '@elytracms/studio/lib/registry';
|
|
2
|
+
/** A small status dot for list rows. */
|
|
3
|
+
export declare function ComponentStatusDot({ status }: {
|
|
4
|
+
status: ComponentStatus;
|
|
5
|
+
}): import("react").JSX.Element;
|
|
6
|
+
/** A status badge with icon for the detail view. */
|
|
7
|
+
export declare function ComponentStatusBadge({ status }: {
|
|
8
|
+
status: ComponentStatus;
|
|
9
|
+
}): import("react").JSX.Element;
|
|
10
|
+
export declare function statusDescription(status: ComponentStatus): string;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { CircleAlert, CircleCheck, TriangleAlert } from 'lucide-react';
|
|
3
|
+
import { Badge } from '@elytracms/studio/ui';
|
|
4
|
+
const STATUS_META = {
|
|
5
|
+
valid: { label: 'valid', variant: 'success', dot: 'bg-success' },
|
|
6
|
+
incompatible: { label: 'incompatible', variant: 'warning', dot: 'bg-warning' },
|
|
7
|
+
invalid: { label: 'invalid', variant: 'error', dot: 'bg-destructive' },
|
|
8
|
+
};
|
|
9
|
+
/** A small status dot for list rows. */
|
|
10
|
+
export function ComponentStatusDot({ status }) {
|
|
11
|
+
const meta = STATUS_META[status];
|
|
12
|
+
return (_jsx("span", { className: `size-1.5 shrink-0 rounded-full ${meta.dot}`, title: meta.label, "aria-label": `Status: ${meta.label}` }));
|
|
13
|
+
}
|
|
14
|
+
/** A status badge with icon for the detail view. */
|
|
15
|
+
export function ComponentStatusBadge({ status }) {
|
|
16
|
+
const meta = STATUS_META[status];
|
|
17
|
+
const Icon = status === 'valid' ? CircleCheck : status === 'incompatible' ? TriangleAlert : CircleAlert;
|
|
18
|
+
return (_jsxs(Badge, { variant: meta.variant, children: [_jsx(Icon, { className: "size-3" }), " ", meta.label] }));
|
|
19
|
+
}
|
|
20
|
+
export function statusDescription(status) {
|
|
21
|
+
switch (status) {
|
|
22
|
+
case 'valid':
|
|
23
|
+
return 'Manifest is registered and an implementation is wired up.';
|
|
24
|
+
case 'incompatible':
|
|
25
|
+
return 'Manifest is registered but no implementation is available — the renderer will show a fallback.';
|
|
26
|
+
case 'invalid':
|
|
27
|
+
return 'The registry reported a structured issue for this component.';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=component-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-status.js","sourceRoot":"","sources":["../../../src/components/components/component-status.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEtE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAE5C,MAAM,WAAW,GAGb;IACF,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE;IAChE,YAAY,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE;IAC9E,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,gBAAgB,EAAE;CACvE,CAAA;AAED,wCAAwC;AACxC,MAAM,UAAU,kBAAkB,CAAC,EAAE,MAAM,EAA+B;IACxE,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;IAChC,OAAO,CACL,eACE,SAAS,EAAE,kCAAkC,IAAI,CAAC,GAAG,EAAE,EACvD,KAAK,EAAE,IAAI,CAAC,KAAK,gBACL,WAAW,IAAI,CAAC,KAAK,EAAE,GACnC,CACH,CAAA;AACH,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,oBAAoB,CAAC,EAAE,MAAM,EAA+B;IAC1E,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;IAChC,MAAM,IAAI,GAAG,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAA;IACvG,OAAO,CACL,MAAC,KAAK,IAAC,OAAO,EAAE,IAAI,CAAC,OAAO,aAC1B,KAAC,IAAI,IAAC,SAAS,EAAC,QAAQ,GAAG,OAAE,IAAI,CAAC,KAAK,IACjC,CACT,CAAA;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAuB;IACvD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,OAAO,2DAA2D,CAAA;QACpE,KAAK,cAAc;YACjB,OAAO,gGAAgG,CAAA;QACzG,KAAK,SAAS;YACZ,OAAO,8DAA8D,CAAA;IACzE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Components section landing view (EC-223 Stage 6): registry health overview
|
|
3
|
+
* + the authoring guide, shown when no component is selected. Takes `projectId`
|
|
4
|
+
* as a prop — the splat resolver sources it from the route, not a route file.
|
|
5
|
+
*/
|
|
6
|
+
export declare function ComponentsIndex({ projectId }: {
|
|
7
|
+
projectId: string;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Blocks, MousePointerClick } from 'lucide-react';
|
|
3
|
+
import { getStudioRegistry, registryHealth } from '@elytracms/studio/lib/registry';
|
|
4
|
+
import { RegistryBrowser } from '@elytracms/studio/components/components/registry-browser';
|
|
5
|
+
import { Badge, Card, Code, Heading, Panel, PanelHeader, Spacer, Stack, Text, } from '@elytracms/studio/ui';
|
|
6
|
+
const REGISTER_EXAMPLE = `// project code registers components + manifests
|
|
7
|
+
import { defineComponent } from '@elytracms/component-registry'
|
|
8
|
+
|
|
9
|
+
export const MarketingHeroManifest = defineComponent({
|
|
10
|
+
id: 'project.MarketingHero', // project.* namespace
|
|
11
|
+
namespace: 'project',
|
|
12
|
+
title: 'Marketing Hero',
|
|
13
|
+
props: {
|
|
14
|
+
heading: { schema: z.string().min(1), bindable: true,
|
|
15
|
+
control: { kind: 'text' }, defaultValue: 'Hello' },
|
|
16
|
+
},
|
|
17
|
+
slots: [],
|
|
18
|
+
fixtures: [{ name: 'Default' }],
|
|
19
|
+
})`;
|
|
20
|
+
/**
|
|
21
|
+
* The Components section landing view (EC-223 Stage 6): registry health overview
|
|
22
|
+
* + the authoring guide, shown when no component is selected. Takes `projectId`
|
|
23
|
+
* as a prop — the splat resolver sources it from the route, not a route file.
|
|
24
|
+
*/
|
|
25
|
+
export function ComponentsIndex({ projectId }) {
|
|
26
|
+
const studio = getStudioRegistry();
|
|
27
|
+
const health = registryHealth(studio);
|
|
28
|
+
const primitives = studio.registry.primitives().length;
|
|
29
|
+
const projects = studio.registry.projectComponents().length;
|
|
30
|
+
return (_jsxs("div", { className: "mx-auto w-full max-w-4xl p-4 sm:p-6", children: [_jsx("div", { className: "mb-6 h-80 overflow-hidden rounded-lg border border-border md:hidden", children: _jsx(RegistryBrowser, { projectId: projectId }) }), _jsxs(Stack, { gap: "6", children: [_jsxs(Stack, { gap: "1", children: [_jsx(Heading, { size: "display", children: "Component registry" }), _jsx(Text, { tone: "muted", children: "Browse the platform primitives and this project's components. Select one to inspect its manifest, fields, and preview fixtures." })] }), _jsxs("div", { className: "grid gap-3 sm:grid-cols-3", children: [_jsx(StatCard, { label: "Components", value: health.total, hint: `${primitives} primitives · ${projects} project` }), _jsx(StatCard, { label: "Valid", value: health.valid, tone: "success" }), _jsx(StatCard, { label: "Need attention", value: health.incompatible + health.invalid, tone: health.incompatible + health.invalid > 0 ? 'warning' : 'muted', hint: `${health.incompatible} incompatible · ${health.invalid} invalid` })] }), _jsxs(Card, { className: "flex items-center gap-3 p-4", children: [_jsx("span", { className: "grid size-9 shrink-0 place-items-center rounded-lg bg-muted text-muted-foreground", children: _jsx(MousePointerClick, { className: "size-4" }) }), _jsx(Text, { size: "sm", tone: "muted", children: "Pick a component from the list to open its detail view \u2014 manifest metadata, the prop & slot inspector, and the visual fixture runner." })] }), _jsxs(Panel, { children: [_jsxs(PanelHeader, { children: [_jsx(Blocks, { className: "size-4 text-muted-foreground" }), _jsx(Text, { size: "sm", weight: "semibold", children: "Registering project components" }), _jsx(Spacer, {}), _jsx(Badge, { variant: "outline", children: "guide" })] }), _jsxs(Stack, { gap: "3", className: "p-4", children: [_jsxs(Text, { size: "sm", tone: "muted", children: ["Project code owns its components. Register a manifest under the", ' ', _jsx(Code, { tone: "primary", children: "project.*" }), " namespace (platform primitives live under", ' ', _jsx(Code, { tone: "muted", children: "base.primitives.*" }), "). The manifest declares prop schemas, defaults, inspector controls, binding permissions, slots, and preview fixtures."] }), _jsx("pre", { className: "overflow-x-auto rounded-lg border border-border bg-muted/40 p-3 font-mono text-xs leading-relaxed text-foreground/90", children: REGISTER_EXAMPLE }), _jsxs(Text, { size: "xs", tone: "subtle", children: ["Full guide: ", _jsx(Code, { tone: "muted", children: "docs/component-authoring.md" })] })] })] })] })] }));
|
|
31
|
+
}
|
|
32
|
+
function StatCard({ label, value, hint, tone = 'default', }) {
|
|
33
|
+
const valueClass = tone === 'success'
|
|
34
|
+
? 'text-success'
|
|
35
|
+
: tone === 'warning'
|
|
36
|
+
? 'text-warning'
|
|
37
|
+
: tone === 'muted'
|
|
38
|
+
? 'text-muted-foreground'
|
|
39
|
+
: 'text-foreground';
|
|
40
|
+
return (_jsxs(Card, { className: "p-4", children: [_jsx(Text, { size: "xs", tone: "muted", mono: true, children: label.toUpperCase() }), _jsx("div", { className: `mt-1 text-2xl font-semibold tracking-tight ${valueClass}`, children: value }), hint ? (_jsx(Text, { size: "xs", tone: "subtle", className: "mt-0.5", children: hint })) : null] }));
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=components-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components-index.js","sourceRoot":"","sources":["../../../src/components/components/components-index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ComponentManifest } from '@elytracms/component-registry';
|
|
2
|
+
/**
|
|
3
|
+
* Inspect a component's props and slots (brief §7.2, §8.3, EC-053): prop field-def
|
|
4
|
+
* type/control (EC-190), default value, and slot rules (required, allowed
|
|
5
|
+
* children). Props are static field-defs; binding metadata retired in EC-190.
|
|
6
|
+
*/
|
|
7
|
+
export declare function FieldInspector({ manifest }: {
|
|
8
|
+
manifest: ComponentManifest;
|
|
9
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { manifestPropFields } from '@elytracms/component-registry';
|
|
3
|
+
import { Badge, Code, Panel, PanelHeader, Row, Spacer, Text } from '@elytracms/studio/ui';
|
|
4
|
+
/**
|
|
5
|
+
* The editor control a prop field-def presents (EC-190): derived from the
|
|
6
|
+
* field `type`, refined by the optional `form.control` hint (textarea / color /
|
|
7
|
+
* json for `text`). Read-only display label for the manifest viewer.
|
|
8
|
+
*/
|
|
9
|
+
function controlType(field) {
|
|
10
|
+
if (field.type === 'text' && field.form?.control)
|
|
11
|
+
return field.form.control;
|
|
12
|
+
return field.type;
|
|
13
|
+
}
|
|
14
|
+
function formatDefault(value) {
|
|
15
|
+
if (value === undefined)
|
|
16
|
+
return '—';
|
|
17
|
+
if (typeof value === 'string')
|
|
18
|
+
return value === '' ? '""' : value;
|
|
19
|
+
return JSON.stringify(value);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Inspect a component's props and slots (brief §7.2, §8.3, EC-053): prop field-def
|
|
23
|
+
* type/control (EC-190), default value, and slot rules (required, allowed
|
|
24
|
+
* children). Props are static field-defs; binding metadata retired in EC-190.
|
|
25
|
+
*/
|
|
26
|
+
export function FieldInspector({ manifest }) {
|
|
27
|
+
const props = manifestPropFields(manifest);
|
|
28
|
+
return (_jsxs("div", { className: "grid gap-4 lg:grid-cols-2", children: [_jsxs(Panel, { children: [_jsxs(PanelHeader, { children: [_jsx(Text, { size: "sm", weight: "semibold", children: "Props" }), _jsx(Spacer, {}), _jsx(Text, { size: "xs", tone: "muted", mono: true, children: props.length })] }), props.length === 0 ? (_jsx(Text, { size: "sm", tone: "subtle", className: "p-4", children: "This component declares no editable props." })) : (_jsx("div", { className: "divide-y divide-border", children: props.map((field) => (_jsx(PropRow, { field: field }, field.name))) }))] }), _jsxs(Panel, { children: [_jsxs(PanelHeader, { children: [_jsx(Text, { size: "sm", weight: "semibold", children: "Slots" }), _jsx(Spacer, {}), _jsx(Text, { size: "xs", tone: "muted", mono: true, children: manifest.slots.length })] }), manifest.slots.length === 0 ? (_jsx(Text, { size: "sm", tone: "subtle", className: "p-4", children: "This component has no slots." })) : (_jsx("div", { className: "divide-y divide-border", children: manifest.slots.map((slot) => (_jsx(SlotRow, { slot: slot }, slot.name))) }))] })] }));
|
|
29
|
+
}
|
|
30
|
+
function PropRow({ field }) {
|
|
31
|
+
const label = field.form?.label;
|
|
32
|
+
const description = field.form?.description;
|
|
33
|
+
return (_jsxs("div", { className: "flex flex-col gap-1.5 p-3", children: [_jsxs(Row, { gap: "2", children: [_jsx(Code, { tone: "primary", children: field.name }), _jsx(Badge, { variant: "outline", children: controlType(field) }), _jsx(Spacer, {}), field.form?.inlineEditable ? _jsx(Badge, { variant: "info", children: "inline" }) : null] }), label || description ? (_jsx(Text, { size: "xs", tone: "muted", children: description ?? label })) : null, _jsxs(Row, { gap: "3", className: "text-xs", children: [_jsx(Text, { size: "xs", tone: "subtle", children: "default" }), _jsx(Code, { tone: "muted", children: formatDefault(field.default) })] })] }));
|
|
34
|
+
}
|
|
35
|
+
function SlotRow({ slot }) {
|
|
36
|
+
return (_jsxs("div", { className: "flex flex-col gap-1 p-3", children: [_jsxs(Row, { gap: "2", children: [_jsx(Code, { tone: "primary", children: slot.name }), slot.required ? _jsx(Badge, { variant: "warning", children: "required" }) : _jsx(Badge, { variant: "outline", children: "optional" }), _jsx(Spacer, {}), slot.label ? (_jsx(Text, { size: "xs", tone: "muted", children: slot.label })) : null] }), slot.allow && slot.allow.length > 0 ? (_jsxs(Row, { gap: "2", className: "text-xs", children: [_jsx(Text, { size: "xs", tone: "subtle", children: "allows" }), _jsx(Row, { gap: "1", wrap: true, children: slot.allow.map((id) => (_jsx(Code, { tone: "muted", children: id }, id))) })] })) : null] }));
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=field-inspector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-inspector.js","sourceRoot":"","sources":["../../../src/components/components/field-inspector.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ComponentManifest } from '@elytracms/component-registry';
|
|
2
|
+
/**
|
|
3
|
+
* Visual fixture runner (brief §7.2, §8.3, §11, EC-054). Renders each of a
|
|
4
|
+
* component's preview states through the runtime renderer + registry — the same
|
|
5
|
+
* render path the Builder and export use — so output is deterministic and
|
|
6
|
+
* agent-verifiable. Incompatible components surface the renderer's fallback.
|
|
7
|
+
*/
|
|
8
|
+
export declare function FixtureRunner({ manifest }: {
|
|
9
|
+
manifest: ComponentManifest;
|
|
10
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo, useState } from 'react';
|
|
3
|
+
import { renderNode } from '@elytracms/runtime-renderer';
|
|
4
|
+
import { getStudioRegistry, previewContext } from '@elytracms/studio/lib/registry';
|
|
5
|
+
import { previewSpecs } from '@elytracms/studio/lib/registry/preview';
|
|
6
|
+
import { Panel, PanelHeader, Row, Spacer, Text } from '@elytracms/studio/ui';
|
|
7
|
+
import { cn } from '@elytracms/studio/lib/utils';
|
|
8
|
+
/**
|
|
9
|
+
* Visual fixture runner (brief §7.2, §8.3, §11, EC-054). Renders each of a
|
|
10
|
+
* component's preview states through the runtime renderer + registry — the same
|
|
11
|
+
* render path the Builder and export use — so output is deterministic and
|
|
12
|
+
* agent-verifiable. Incompatible components surface the renderer's fallback.
|
|
13
|
+
*/
|
|
14
|
+
export function FixtureRunner({ manifest }) {
|
|
15
|
+
const studio = getStudioRegistry();
|
|
16
|
+
const specs = useMemo(() => previewSpecs(manifest), [manifest]);
|
|
17
|
+
const [index, setIndex] = useState(0);
|
|
18
|
+
const ctx = useMemo(() => previewContext(studio), [studio]);
|
|
19
|
+
const active = specs[Math.min(index, specs.length - 1)];
|
|
20
|
+
return (_jsxs(Panel, { children: [_jsxs(PanelHeader, { children: [_jsx(Text, { size: "sm", weight: "semibold", children: "Preview" }), _jsx(Spacer, {}), _jsxs(Text, { size: "xs", tone: "muted", mono: true, children: [specs.length, " ", specs.length === 1 ? 'state' : 'states'] })] }), specs.length > 1 ? (_jsx(Row, { gap: "1", wrap: true, className: "border-b border-border px-3 py-2", role: "group", "aria-label": "Fixture states", children: specs.map((spec, i) => (_jsx("button", { type: "button", "aria-pressed": i === index, onClick: () => setIndex(i), className: cn('rounded-md px-2.5 py-1 text-xs font-medium transition-colors', i === index
|
|
21
|
+
? 'bg-accent text-accent-foreground'
|
|
22
|
+
: 'text-muted-foreground hover:bg-muted hover:text-foreground'), children: spec.name }, spec.name))) })) : null, _jsx("div", { className: "canvas-grid p-6", "data-fixture-state": active?.name, children: _jsx("div", { className: "mx-auto max-w-xl rounded-lg border border-border bg-background p-6 shadow-sm", children: active ? renderNode(active.node, ctx) : null }) })] }));
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=fixture-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixture-runner.js","sourceRoot":"","sources":["../../../src/components/components/fixture-runner.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAExD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AACrE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAC5E,OAAO,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAA;AAEhD;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAAmC;IACzE,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAA;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC/D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACrC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;IAEvD,OAAO,CACL,MAAC,KAAK,eACJ,MAAC,WAAW,eACV,KAAC,IAAI,IAAC,IAAI,EAAC,IAAI,EAAC,MAAM,EAAC,UAAU,wBAE1B,EACP,KAAC,MAAM,KAAG,EACV,MAAC,IAAI,IAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,IAAI,mBAC9B,KAAK,CAAC,MAAM,OAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,IAClD,IACK,EAEb,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAClB,KAAC,GAAG,IAAC,GAAG,EAAC,GAAG,EAAC,IAAI,QAAC,SAAS,EAAC,kCAAkC,EAAC,IAAI,EAAC,OAAO,gBAAY,gBAAgB,YACpG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,iBAEE,IAAI,EAAC,QAAQ,kBACC,CAAC,KAAK,KAAK,EACzB,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAC1B,SAAS,EAAE,EAAE,CACX,8DAA8D,EAC9D,CAAC,KAAK,KAAK;wBACT,CAAC,CAAC,kCAAkC;wBACpC,CAAC,CAAC,4DAA4D,CACjE,YAEA,IAAI,CAAC,IAAI,IAXL,IAAI,CAAC,IAAI,CAYP,CACV,CAAC,GACE,CACP,CAAC,CAAC,CAAC,IAAI,EAER,cAAK,SAAS,EAAC,iBAAiB,wBAAqB,MAAM,EAAE,IAAI,YAC/D,cAAK,SAAS,EAAC,8EAA8E,YAC1F,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GACzC,GACF,IACA,CACT,CAAA;AACH,CAAC"}
|