@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,64 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Link, STUDIO_PROJECT_ROUTE, studioPath } from '@elytracms/studio/router';
|
|
3
|
+
import { Search, Sparkles } from 'lucide-react';
|
|
4
|
+
import { useMemo, useState } from 'react';
|
|
5
|
+
import { isPrimitive } from '@elytracms/component-registry';
|
|
6
|
+
import { componentDrafts, componentStatus, getStudioRegistry, } from '@elytracms/studio/lib/registry';
|
|
7
|
+
import { Badge, Code, Input, Row, Spacer, Stack, Text } from '@elytracms/studio/ui';
|
|
8
|
+
import { cn } from '@elytracms/studio/lib/utils';
|
|
9
|
+
import { ComponentStatusDot } from './component-status';
|
|
10
|
+
export function RegistryBrowser({ projectId, activeComponentId, }) {
|
|
11
|
+
const studio = getStudioRegistry();
|
|
12
|
+
const [query, setQuery] = useState('');
|
|
13
|
+
const [namespace, setNamespace] = useState('all');
|
|
14
|
+
const [category, setCategory] = useState(null);
|
|
15
|
+
const primitiveCount = studio.registry.primitives().length;
|
|
16
|
+
const projectCount = studio.registry.projectComponents().length;
|
|
17
|
+
// Switching namespace clears any category that doesn't exist in the new one.
|
|
18
|
+
function selectNamespace(ns) {
|
|
19
|
+
setNamespace(ns);
|
|
20
|
+
setCategory(null);
|
|
21
|
+
}
|
|
22
|
+
// Categories are scoped to the active namespace so every chip can yield results.
|
|
23
|
+
const categories = useMemo(() => {
|
|
24
|
+
const set = new Set();
|
|
25
|
+
for (const m of studio.registry.list({ namespace: namespace === 'all' ? undefined : namespace })) {
|
|
26
|
+
if (m.category)
|
|
27
|
+
set.add(m.category);
|
|
28
|
+
}
|
|
29
|
+
return [...set].sort();
|
|
30
|
+
}, [studio, namespace]);
|
|
31
|
+
const results = useMemo(() => studio.registry.list({
|
|
32
|
+
query: query.trim() || undefined,
|
|
33
|
+
namespace: namespace === 'all' ? undefined : namespace,
|
|
34
|
+
category: category ?? undefined,
|
|
35
|
+
}), [studio, query, namespace, category]);
|
|
36
|
+
const primitives = results.filter((m) => isPrimitive(m.id));
|
|
37
|
+
const projects = results.filter((m) => !isPrimitive(m.id));
|
|
38
|
+
return (_jsxs("div", { className: "flex h-full min-h-0 flex-col", children: [_jsxs("div", { className: "shrink-0 space-y-2 border-b border-border p-3", children: [_jsxs("div", { className: "relative", children: [_jsx(Search, { className: "pointer-events-none absolute left-2.5 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }), _jsx(Input, { value: query, onChange: (e) => setQuery(e.target.value), placeholder: "Search components\u2026", className: "pl-8", "aria-label": "Search components" })] }), _jsxs(Row, { gap: "1", className: "rounded-md bg-muted/50 p-0.5", role: "group", "aria-label": "Filter by namespace", children: [_jsx(NamespaceTab, { label: "All", count: primitiveCount + projectCount, active: namespace === 'all', onClick: () => selectNamespace('all') }), _jsx(NamespaceTab, { label: "Primitives", count: primitiveCount, active: namespace === 'base.primitives', onClick: () => selectNamespace('base.primitives') }), _jsx(NamespaceTab, { label: "Project", count: projectCount, active: namespace === 'project', onClick: () => selectNamespace('project') })] }), categories.length > 0 ? (_jsxs(Row, { gap: "1", wrap: true, children: [_jsx(CategoryChip, { label: "All", active: category === null, onClick: () => setCategory(null) }), categories.map((c) => (_jsx(CategoryChip, { label: c, active: category === c, onClick: () => setCategory(c) }, c)))] })) : null] }), _jsxs("div", { className: "min-h-0 flex-1 overflow-auto p-2", children: [results.length === 0 ? (_jsx(Text, { size: "sm", tone: "muted", className: "p-3", children: query.trim()
|
|
39
|
+
? `No components match “${query}”.`
|
|
40
|
+
: 'No components match the selected filters.' })) : (_jsxs(Stack, { gap: "3", children: [(namespace === 'all' || namespace === 'base.primitives') && primitives.length > 0 ? (_jsx(GroupedList, { heading: "base.primitives.*", count: primitives.length, manifests: primitives, projectId: projectId, activeComponentId: activeComponentId })) : null, (namespace === 'all' || namespace === 'project') && projects.length > 0 ? (_jsx(GroupedList, { heading: "project.*", count: projects.length, manifests: projects, projectId: projectId, activeComponentId: activeComponentId })) : null] })), namespace !== 'base.primitives' && !query && !category ? (_jsx(DraftSection, {})) : null] })] }));
|
|
41
|
+
}
|
|
42
|
+
function NamespaceTab({ label, count, active, onClick, }) {
|
|
43
|
+
return (_jsxs("button", { type: "button", "aria-pressed": active, onClick: onClick, className: cn('flex flex-1 items-center justify-center gap-1.5 rounded-[5px] px-2 py-1 text-xs font-medium transition-colors', active ? 'bg-background text-foreground shadow-sm' : 'text-muted-foreground hover:text-foreground'), children: [label, _jsx("span", { className: "font-mono text-[0.65rem] text-muted-foreground", children: count })] }));
|
|
44
|
+
}
|
|
45
|
+
function CategoryChip({ label, active, onClick }) {
|
|
46
|
+
return (_jsx("button", { type: "button", onClick: onClick, className: cn('rounded-full border px-2 py-0.5 text-xs capitalize transition-colors', active
|
|
47
|
+
? 'border-primary/30 bg-primary/10 text-primary'
|
|
48
|
+
: 'border-border text-muted-foreground hover:bg-muted'), children: label }));
|
|
49
|
+
}
|
|
50
|
+
function GroupedList({ heading, count, manifests, projectId, activeComponentId, }) {
|
|
51
|
+
const studio = getStudioRegistry();
|
|
52
|
+
return (_jsxs(Stack, { gap: "1", children: [_jsxs(Row, { gap: "2", className: "px-2", children: [_jsx(Code, { tone: "muted", children: heading }), _jsx(Spacer, {}), _jsx(Text, { size: "xs", tone: "subtle", mono: true, children: count })] }), _jsx(Stack, { gap: "px", children: manifests.map((m) => {
|
|
53
|
+
const status = componentStatus(studio, m);
|
|
54
|
+
const active = m.id === activeComponentId;
|
|
55
|
+
return (_jsxs(Link, { to: STUDIO_PROJECT_ROUTE, params: { projectId, _splat: studioPath.component(m.id) }, "aria-current": active ? 'page' : undefined, className: cn('flex items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors', active ? 'bg-accent text-accent-foreground' : 'text-muted-foreground hover:bg-muted hover:text-foreground'), children: [_jsx(ComponentStatusDot, { status: status }), _jsx("span", { className: "min-w-0 flex-1 truncate font-medium text-foreground", children: m.title ?? m.id }), m.category ? (_jsx("span", { className: "shrink-0 text-[0.7rem] capitalize text-muted-foreground", children: m.category })) : null] }, m.id));
|
|
56
|
+
}) })] }));
|
|
57
|
+
}
|
|
58
|
+
/** Read-only AI-draft hook points (EC-058). Inspectable, not opaque. */
|
|
59
|
+
function DraftSection() {
|
|
60
|
+
if (componentDrafts.length === 0)
|
|
61
|
+
return null;
|
|
62
|
+
return (_jsxs(Stack, { gap: "1", className: "mt-4", children: [_jsxs(Row, { gap: "2", className: "px-2", children: [_jsx(Code, { tone: "muted", children: "drafts" }), _jsx(Spacer, {}), _jsxs(Badge, { variant: "outline", children: [_jsx(Sparkles, { className: "size-3" }), " AI \u00B7 Phase 8"] })] }), _jsx(Stack, { gap: "1", children: componentDrafts.map((draft) => (_jsxs("div", { className: "rounded-md border border-dashed border-border px-2.5 py-2", children: [_jsxs(Row, { gap: "2", children: [_jsx(Text, { size: "sm", weight: "medium", children: draft.title }), _jsx(Spacer, {}), _jsx(Code, { tone: "muted", children: draft.manifestPreview.id })] }), _jsx(Text, { size: "xs", tone: "subtle", className: "mt-0.5", children: draft.prompt })] }, draft.id))) })] }));
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=registry-browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-browser.js","sourceRoot":"","sources":["../../../src/components/components/registry-browser.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ProjectRole } from '@elytracms/persistence';
|
|
2
|
+
/**
|
|
3
|
+
* Current-user affordance in the shell header (EC-150): who is signed in,
|
|
4
|
+
* their role on the active project (badge), theme switch, and sign-out. Role
|
|
5
|
+
* display is informational — actual enforcement happens at the operations
|
|
6
|
+
* chokepoint and server-side, never in the UI.
|
|
7
|
+
*/
|
|
8
|
+
export declare function CurrentUserMenu({ projectId }: {
|
|
9
|
+
projectId: string | null;
|
|
10
|
+
}): import("react").JSX.Element | null;
|
|
11
|
+
export declare function RoleBadge({ role }: {
|
|
12
|
+
role: ProjectRole;
|
|
13
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { LogOut, Moon, Settings, Sun } from 'lucide-react';
|
|
3
|
+
import { Avatar, Badge, Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, Row, Spacer, Stack, Text, } from '@elytracms/studio/ui';
|
|
4
|
+
import { useAuth, useProjectRole } from './auth-context';
|
|
5
|
+
import { useTheme } from './theme-context';
|
|
6
|
+
/**
|
|
7
|
+
* Current-user affordance in the shell header (EC-150): who is signed in,
|
|
8
|
+
* their role on the active project (badge), theme switch, and sign-out. Role
|
|
9
|
+
* display is informational — actual enforcement happens at the operations
|
|
10
|
+
* chokepoint and server-side, never in the UI.
|
|
11
|
+
*/
|
|
12
|
+
export function CurrentUserMenu({ projectId }) {
|
|
13
|
+
const auth = useAuth();
|
|
14
|
+
const role = useProjectRole(projectId);
|
|
15
|
+
const { theme, setTheme } = useTheme();
|
|
16
|
+
const user = auth.session?.user;
|
|
17
|
+
if (!user)
|
|
18
|
+
return null;
|
|
19
|
+
// Show one identity line — the name if set, otherwise the email (never both).
|
|
20
|
+
const displayName = user.name ?? user.email;
|
|
21
|
+
const isDark = theme === 'dark';
|
|
22
|
+
return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon-sm", className: "rounded-full", "aria-label": "Account menu", children: _jsx(Avatar, { label: displayName, size: "sm" }) }) }), _jsxs(DropdownMenuContent, { align: "end", className: "min-w-60", children: [_jsxs(Row, { gap: "2", className: "px-2 py-2", children: [_jsx(Avatar, { label: displayName, size: "md" }), _jsxs(Stack, { gap: "1", className: "min-w-0 flex-1", children: [_jsx(Text, { size: "sm", weight: "medium", className: "truncate leading-tight", children: displayName }), role ? (_jsx(Row, { children: _jsx(RoleBadge, { role: role }) })) : null] })] }), _jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuItem, { onSelect: (event) => {
|
|
23
|
+
event.preventDefault();
|
|
24
|
+
setTheme(isDark ? 'light' : 'dark');
|
|
25
|
+
}, children: [isDark ? _jsx(Sun, {}) : _jsx(Moon, {}), isDark ? 'Light mode' : 'Dark mode'] }), _jsxs(DropdownMenuItem, { disabled: true, children: [_jsx(Settings, {}), "Account settings", _jsx(Spacer, {}), _jsx(Badge, { variant: "outline", children: "Soon" })] }), _jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuItem, { variant: "destructive", onSelect: () => void auth.signOut(), children: [_jsx(LogOut, {}), "Sign out"] })] })] }));
|
|
26
|
+
}
|
|
27
|
+
export function RoleBadge({ role }) {
|
|
28
|
+
const variant = role === 'admin' ? 'primary' : role === 'editor' ? 'info' : 'outline';
|
|
29
|
+
return _jsx(Badge, { variant: variant, children: role });
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=current-user-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"current-user-menu.js","sourceRoot":"","sources":["../../src/components/current-user-menu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Tooltip/accessible description — the studio signed in automatically. */
|
|
2
|
+
export declare const DEV_LOGIN_BADGE_HINT = "Dev auto-login: the studio signed in automatically from VITE_ELYTRA_DEV_LOGIN (dev builds only). Unset it to test the real sign-in flow.";
|
|
3
|
+
/**
|
|
4
|
+
* Marker for the dev-only unattended auth (see `resolveDevAutoLogin`). When the
|
|
5
|
+
* studio auto-signs-in from `VITE_ELYTRA_DEV_LOGIN` in a dev build, this badge
|
|
6
|
+
* is visible in the shell header so an auto-authenticated session is never
|
|
7
|
+
* silent; in production builds and without the flag it renders nothing.
|
|
8
|
+
*/
|
|
9
|
+
export declare function DevLoginBadge(): import("react").JSX.Element | null;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { KeyRound } from 'lucide-react';
|
|
3
|
+
import { Badge } from '@elytracms/studio/ui';
|
|
4
|
+
import { isDevAutoLoginActive } from '@elytracms/studio/lib/persistence';
|
|
5
|
+
/** Tooltip/accessible description — the studio signed in automatically. */
|
|
6
|
+
export const DEV_LOGIN_BADGE_HINT = 'Dev auto-login: the studio signed in automatically from VITE_ELYTRA_DEV_LOGIN (dev builds only). Unset it to test the real sign-in flow.';
|
|
7
|
+
/**
|
|
8
|
+
* Marker for the dev-only unattended auth (see `resolveDevAutoLogin`). When the
|
|
9
|
+
* studio auto-signs-in from `VITE_ELYTRA_DEV_LOGIN` in a dev build, this badge
|
|
10
|
+
* is visible in the shell header so an auto-authenticated session is never
|
|
11
|
+
* silent; in production builds and without the flag it renders nothing.
|
|
12
|
+
*/
|
|
13
|
+
export function DevLoginBadge() {
|
|
14
|
+
if (!isDevAutoLoginActive())
|
|
15
|
+
return null;
|
|
16
|
+
return (_jsxs(Badge, { variant: "warning", title: DEV_LOGIN_BADGE_HINT, "data-testid": "dev-login-badge", children: [_jsx(KeyRound, { "aria-hidden": true }), "Dev login"] }));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=dev-login-badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-login-badge.js","sourceRoot":"","sources":["../../src/components/dev-login-badge.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAA;AAExE,2EAA2E;AAC3E,MAAM,CAAC,MAAM,oBAAoB,GAC/B,0IAA0I,CAAA;AAE5I;;;;;GAKG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,oBAAoB,EAAE;QAAE,OAAO,IAAI,CAAA;IACxC,OAAO,CACL,MAAC,KAAK,IAAC,OAAO,EAAC,SAAS,EAAC,KAAK,EAAE,oBAAoB,iBAAc,iBAAiB,aACjF,KAAC,QAAQ,0BAAe,iBAElB,CACT,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Extensions surface (Phase 11, EC-130–137). A live, agent-inspectable view over the
|
|
3
|
+
* extensibility layer: browse a public + private marketplace, install plugins into a host, and
|
|
4
|
+
* inspect what each surface contributes (components, field types, data sources, asset storage,
|
|
5
|
+
* export targets, hooks). All state is deterministic — driven by `@elytracms/plugins` fixtures.
|
|
6
|
+
*/
|
|
7
|
+
export declare function ExtensionsView(): import("react").JSX.Element;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo, useReducer, useState } from 'react';
|
|
3
|
+
import { Boxes, Check, Database, Download, HardDrive, Lock, Package, Puzzle, Search, Share2, LayoutTemplate, Type, Webhook, } from 'lucide-react';
|
|
4
|
+
import { BUILTIN_FIELD_TYPES, BUILTIN_SOURCE_KINDS, HOOK_POINTS, MarketplaceClient, PluginHost, privateMarketplace, publicMarketplace, } from '@elytracms/plugins';
|
|
5
|
+
import { Badge, Button, Code, Heading, Input, Row, Spacer, Stack, Text } from '@elytracms/studio/ui';
|
|
6
|
+
import { cn } from '@elytracms/studio/lib/utils';
|
|
7
|
+
/**
|
|
8
|
+
* The Extensions surface (Phase 11, EC-130–137). A live, agent-inspectable view over the
|
|
9
|
+
* extensibility layer: browse a public + private marketplace, install plugins into a host, and
|
|
10
|
+
* inspect what each surface contributes (components, field types, data sources, asset storage,
|
|
11
|
+
* export targets, hooks). All state is deterministic — driven by `@elytracms/plugins` fixtures.
|
|
12
|
+
*/
|
|
13
|
+
export function ExtensionsView() {
|
|
14
|
+
// One host for the session; PluginHost mutates in place, so a bump reducer drives re-render.
|
|
15
|
+
const [host] = useState(() => new PluginHost());
|
|
16
|
+
const [, bump] = useReducer((n) => n + 1, 0);
|
|
17
|
+
const [tab, setTab] = useState('marketplace');
|
|
18
|
+
const [token, setToken] = useState('');
|
|
19
|
+
const [query, setQuery] = useState('');
|
|
20
|
+
const [results, setResults] = useState({});
|
|
21
|
+
const client = useMemo(() => new MarketplaceClient([publicMarketplace, privateMarketplace], token.trim() ? { 'acme-private': token.trim() } : {}), [token]);
|
|
22
|
+
const hits = client.search(query.trim() ? { query: query.trim() } : {});
|
|
23
|
+
const privateUnlocked = client.accessibleRegistries().some((r) => r.id === 'acme-private');
|
|
24
|
+
const installedCount = host.list().length;
|
|
25
|
+
function install(listing) {
|
|
26
|
+
const result = client.install(host, listing.id);
|
|
27
|
+
setResults((prev) => ({ ...prev, [listing.id]: result }));
|
|
28
|
+
bump();
|
|
29
|
+
}
|
|
30
|
+
return (_jsxs("div", { className: "flex h-full min-h-0 flex-col", children: [_jsx(ExtensionsHeader, { tab: tab, onTab: setTab, installedCount: installedCount, marketCount: hits.length }), _jsx("div", { className: "min-h-0 flex-1 overflow-auto px-4 py-5 sm:px-6", children: _jsx("div", { className: "mx-auto w-full max-w-5xl", children: tab === 'marketplace' ? (_jsx(MarketplaceTab, { hits: hits, query: query, onQuery: setQuery, token: token, onToken: setToken, privateUnlocked: privateUnlocked, isInstalled: (l) => host.isInstalled(l.plugin.id), onInstall: install, results: results })) : tab === 'installed' ? (_jsx(InstalledTab, { installed: host.list() })) : (_jsx(RegisteredTab, { host: host })) }) })] }));
|
|
31
|
+
}
|
|
32
|
+
// --- Header + tabs ----------------------------------------------------------
|
|
33
|
+
function ExtensionsHeader({ tab, onTab, installedCount, marketCount, }) {
|
|
34
|
+
const tabs = [
|
|
35
|
+
{ id: 'marketplace', label: 'Marketplace', count: marketCount },
|
|
36
|
+
{ id: 'installed', label: 'Installed', count: installedCount },
|
|
37
|
+
{ id: 'registered', label: 'Registered' },
|
|
38
|
+
];
|
|
39
|
+
return (_jsx("div", { className: "shrink-0 border-b border-border bg-gradient-to-b from-primary/[0.04] to-transparent px-4 py-3 sm:px-6", children: _jsxs(Row, { gap: "3", children: [_jsx("span", { className: "grid size-8 shrink-0 place-items-center rounded-lg bg-primary/15 text-primary", children: _jsx(Puzzle, { className: "size-4" }) }), _jsxs(Stack, { gap: "none", className: "min-w-0", children: [_jsx(Text, { size: "sm", weight: "semibold", children: "Extensibility" }), _jsx(Text, { size: "xs", tone: "subtle", children: "Components \u00B7 field types \u00B7 data sources \u00B7 asset storage \u00B7 export targets \u00B7 templates \u00B7 hooks" })] }), _jsx(Spacer, {}), _jsx(Row, { gap: "1", className: "rounded-md bg-muted/50 p-0.5", children: tabs.map((t) => (_jsxs("button", { type: "button", "aria-pressed": tab === t.id, onClick: () => onTab(t.id), className: cn('flex items-center gap-1.5 rounded-[5px] px-3 py-1 text-sm font-medium transition-colors', tab === t.id ? 'bg-background text-foreground shadow-sm' : 'text-muted-foreground hover:text-foreground'), children: [t.label, t.count !== undefined ? (_jsx("span", { className: "rounded-full bg-muted px-1.5 text-[0.7rem] font-semibold tabular-nums text-muted-foreground", children: t.count })) : null] }, t.id))) })] }) }));
|
|
40
|
+
}
|
|
41
|
+
// --- Marketplace ------------------------------------------------------------
|
|
42
|
+
function MarketplaceTab({ hits, query, onQuery, token, onToken, privateUnlocked, isInstalled, onInstall, results, }) {
|
|
43
|
+
return (_jsxs(Stack, { gap: "6", children: [_jsxs(Row, { gap: "3", wrap: true, children: [_jsxs("div", { className: "relative min-w-0 flex-1", children: [_jsx(Search, { className: "pointer-events-none absolute left-2.5 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }), _jsx(Input, { value: query, onChange: (e) => onQuery(e.target.value), placeholder: "Search extensions\u2026", className: "pl-8", "aria-label": "Search extensions" })] }), _jsxs(Row, { gap: "2", className: "shrink-0", children: [_jsx(Lock, { className: cn('size-3.5', privateUnlocked ? 'text-success' : 'text-muted-foreground') }), _jsx(Input, { value: token, onChange: (e) => onToken(e.target.value), placeholder: "Private registry token", "aria-label": "Private registry token", className: "w-52" }), privateUnlocked ? _jsx(Badge, { variant: "success", children: "unlocked" }) : null] })] }), !privateUnlocked ? (_jsxs(Text, { size: "xs", tone: "subtle", children: ["A private registry is available. Enter its access token (hint: ", _jsx(Code, { tone: "muted", children: "acme-internal-token" }), ") to reveal private listings."] })) : null, hits.length === 0 ? (_jsx(EmptyHint, { icon: _jsx(Search, { className: "size-5" }), title: "No extensions match", body: "Try a different search term." })) : (_jsx("div", { className: "grid gap-3 sm:grid-cols-2", children: hits.map(({ registryId, listing }) => (_jsx(ListingCard, { listing: listing, registryId: registryId, installed: isInstalled(listing), result: results[listing.id], onInstall: () => onInstall(listing) }, listing.id))) }))] }));
|
|
44
|
+
}
|
|
45
|
+
function ListingCard({ listing, registryId, installed, result, onInstall, }) {
|
|
46
|
+
const failed = result && !result.ok;
|
|
47
|
+
return (_jsxs("div", { className: "flex flex-col rounded-xl border border-border bg-card/60 p-4 transition-colors hover:border-primary/40", children: [_jsxs(Row, { gap: "2", children: [_jsx("span", { className: "grid size-9 shrink-0 place-items-center rounded-lg bg-muted text-foreground/80", children: _jsx(KindIcon, { kind: listing.kind }) }), _jsxs(Stack, { gap: "none", className: "min-w-0", children: [_jsx(Text, { size: "sm", weight: "semibold", className: "truncate", children: listing.name }), _jsxs(Row, { gap: "1", className: "text-muted-foreground", children: [_jsx(KindBadge, { kind: listing.kind }), _jsxs(Code, { tone: "muted", children: ["v", listing.version] })] })] }), _jsx(Spacer, {}), registryId === 'acme-private' ? (_jsxs(Badge, { variant: "outline", children: [_jsx(Lock, { className: "size-3" }), " private"] })) : null] }), _jsx(Text, { size: "xs", tone: "muted", className: "mt-3 line-clamp-3 min-h-0 flex-1", children: listing.description ?? 'No description provided.' }), listing.tags && listing.tags.length > 0 ? (_jsx(Row, { gap: "1", wrap: true, className: "mt-3", children: listing.tags.map((tag) => (_jsx("span", { className: "rounded-full bg-muted/70 px-2 py-0.5 text-[0.7rem] text-muted-foreground", children: tag }, tag))) })) : null, _jsxs(Row, { gap: "2", className: "mt-4", children: [_jsx(Text, { size: "xs", tone: "subtle", className: "truncate", children: listing.author ?? 'Unknown author' }), _jsx(Spacer, {}), installed ? (_jsxs(Button, { size: "sm", variant: "ghost", disabled: true, children: [_jsx(Check, {}), " Installed"] })) : (_jsxs(Button, { size: "sm", variant: failed ? 'destructive' : 'default', onClick: onInstall, children: [_jsx(Download, {}), " ", failed ? 'Retry' : 'Install'] }))] }), failed ? (_jsx(Text, { size: "xs", className: "mt-2 text-destructive", children: result?.blocked === 'access-denied'
|
|
48
|
+
? 'Access denied — a valid token is required.'
|
|
49
|
+
: result?.issues[0]?.message ?? 'Installation failed.' })) : null] }));
|
|
50
|
+
}
|
|
51
|
+
// --- Installed --------------------------------------------------------------
|
|
52
|
+
function InstalledTab({ installed }) {
|
|
53
|
+
if (installed.length === 0) {
|
|
54
|
+
return (_jsx(EmptyHint, { icon: _jsx(Boxes, { className: "size-5" }), title: "Nothing installed yet", body: "Install an extension from the marketplace to see what it contributes here." }));
|
|
55
|
+
}
|
|
56
|
+
return (_jsx(Stack, { gap: "3", children: installed.map((plugin) => (_jsxs("div", { className: "rounded-xl border border-border bg-card/60 p-4", children: [_jsxs(Row, { gap: "2", children: [_jsx(Package, { className: "size-4 text-primary" }), _jsx(Text, { size: "sm", weight: "semibold", children: plugin.name }), _jsxs(Code, { tone: "muted", children: ["v", plugin.version] }), _jsx(Spacer, {}), _jsx(Text, { size: "xs", tone: "subtle", children: plugin.author ?? '' })] }), plugin.description ? (_jsx(Text, { size: "xs", tone: "muted", className: "mt-2", children: plugin.description })) : null, _jsxs(Row, { gap: "2", wrap: true, className: "mt-3", children: [_jsx(ContributionChip, { icon: _jsx(Boxes, {}), label: "components", count: plugin.contributes.components }), _jsx(ContributionChip, { icon: _jsx(Type, {}), label: "field types", count: plugin.contributes.fieldTypes }), _jsx(ContributionChip, { icon: _jsx(Database, {}), label: "data sources", count: plugin.contributes.dataSources }), _jsx(ContributionChip, { icon: _jsx(HardDrive, {}), label: "asset storage", count: plugin.contributes.assetStorage }), _jsx(ContributionChip, { icon: _jsx(Share2, {}), label: "export targets", count: plugin.contributes.exportTargets }), _jsx(ContributionChip, { icon: _jsx(LayoutTemplate, {}), label: "templates", count: plugin.contributes.templates }), _jsx(ContributionChip, { icon: _jsx(Webhook, {}), label: "hooks", count: plugin.contributes.hooks })] })] }, plugin.id))) }));
|
|
57
|
+
}
|
|
58
|
+
function ContributionChip({ icon, label, count }) {
|
|
59
|
+
if (count === 0)
|
|
60
|
+
return null;
|
|
61
|
+
return (_jsxs("span", { className: "inline-flex items-center gap-1.5 rounded-md border border-border/60 bg-muted/40 px-2 py-1 text-xs text-muted-foreground", children: [_jsx("span", { className: "grid size-3.5 place-items-center text-primary [&_svg]:size-3.5", children: icon }), _jsx("span", { className: "font-semibold tabular-nums text-foreground", children: count }), label] }));
|
|
62
|
+
}
|
|
63
|
+
// --- Registered (inspect) ---------------------------------------------------
|
|
64
|
+
function RegisteredTab({ host }) {
|
|
65
|
+
const hookPoints = host.hooks.points();
|
|
66
|
+
return (_jsxs(Stack, { gap: "6", children: [_jsx(Text, { size: "xs", tone: "subtle", children: "Live registries on the plugin host. Built-in capabilities are always present; installing an extension adds to them." }), _jsx(InspectGroup, { icon: _jsx(Boxes, {}), title: "Components", sub: "base.primitives.* + project + vendor packages", children: _jsx(ChipRow, { items: host.components.projectComponents().map((m) => m.id), empty: "No project components registered." }) }), _jsx(InspectGroup, { icon: _jsx(Type, {}), title: "Field types", children: _jsx(ChipRow, { items: [...BUILTIN_FIELD_TYPES], tone: "builtin", suffix: host.fieldTypes.list().map((f) => f.kind) }) }), _jsx(InspectGroup, { icon: _jsx(Database, {}), title: "Data source kinds", children: _jsx(ChipRow, { items: [...BUILTIN_SOURCE_KINDS], tone: "builtin", suffix: host.dataSources.list().map((a) => a.kind) }) }), _jsx(InspectGroup, { icon: _jsx(HardDrive, {}), title: "Asset storage backends", children: _jsx(ChipRow, { items: host.assetStorage.list().map((a) => `${a.kind} · ${a.title}`), empty: "No storage adapters installed." }) }), _jsx(InspectGroup, { icon: _jsx(Share2, {}), title: "Export targets", children: _jsx(ChipRow, { items: ['next-app-router · reference'], tone: "builtin", suffix: host.exportTargets.list().map((t) => `${t.id} · ${t.title}`) }) }), _jsx(InspectGroup, { icon: _jsx(Webhook, {}), title: "Hook points", children: _jsx(ChipRow, { items: [...HOOK_POINTS], tone: "builtin", suffix: hookPoints.flatMap((p) => host.hooks.list(p).map((t) => `${p}${t.plugin ? ` ← ${t.plugin}` : ''}`)) }) })] }));
|
|
67
|
+
}
|
|
68
|
+
function InspectGroup({ icon, title, sub, children, }) {
|
|
69
|
+
return (_jsxs(Stack, { gap: "2", children: [_jsxs(Row, { gap: "2", children: [_jsx("span", { className: "grid size-5 place-items-center text-primary [&_svg]:size-4", children: icon }), _jsx(Text, { size: "sm", weight: "semibold", children: title }), sub ? (_jsx(Text, { size: "xs", tone: "subtle", children: sub })) : null] }), children] }));
|
|
70
|
+
}
|
|
71
|
+
function ChipRow({ items, suffix, tone, empty, }) {
|
|
72
|
+
const all = [...items.map((v) => ({ v, builtin: tone === 'builtin' })), ...(suffix ?? []).map((v) => ({ v, builtin: false }))];
|
|
73
|
+
if (all.length === 0) {
|
|
74
|
+
return (_jsx(Text, { size: "xs", tone: "subtle", children: empty ?? 'None.' }));
|
|
75
|
+
}
|
|
76
|
+
return (_jsx(Row, { gap: "1", wrap: true, children: all.map(({ v, builtin }) => (_jsx("span", { className: cn('rounded-md border px-2 py-0.5 font-mono text-xs', builtin
|
|
77
|
+
? 'border-border/60 bg-muted/40 text-muted-foreground'
|
|
78
|
+
: 'border-primary/30 bg-primary/10 text-primary'), children: v }, v))) }));
|
|
79
|
+
}
|
|
80
|
+
// --- Shared bits -------------------------------------------------------------
|
|
81
|
+
function EmptyHint({ icon, title, body }) {
|
|
82
|
+
return (_jsxs(Stack, { gap: "2", align: "center", className: "rounded-xl border border-dashed border-border/70 px-6 py-16 text-center", children: [_jsx("span", { className: "grid size-10 place-items-center rounded-full bg-muted text-muted-foreground", children: icon }), _jsx(Heading, { level: 3, size: "h4", children: title }), _jsx(Text, { size: "sm", tone: "muted", className: "max-w-sm", children: body })] }));
|
|
83
|
+
}
|
|
84
|
+
const KIND_LABEL = {
|
|
85
|
+
plugin: 'plugin',
|
|
86
|
+
'component-package': 'components',
|
|
87
|
+
'field-type': 'field type',
|
|
88
|
+
'data-source': 'data source',
|
|
89
|
+
'asset-storage': 'asset storage',
|
|
90
|
+
'export-target': 'export target',
|
|
91
|
+
template: 'template',
|
|
92
|
+
};
|
|
93
|
+
function KindBadge({ kind }) {
|
|
94
|
+
const variant = kind === 'plugin'
|
|
95
|
+
? 'primary'
|
|
96
|
+
: kind === 'field-type'
|
|
97
|
+
? 'success'
|
|
98
|
+
: kind === 'data-source'
|
|
99
|
+
? 'warning'
|
|
100
|
+
: kind === 'template'
|
|
101
|
+
? 'info'
|
|
102
|
+
: 'outline';
|
|
103
|
+
return _jsx(Badge, { variant: variant, children: KIND_LABEL[kind] });
|
|
104
|
+
}
|
|
105
|
+
function KindIcon({ kind }) {
|
|
106
|
+
const className = 'size-4';
|
|
107
|
+
switch (kind) {
|
|
108
|
+
case 'plugin':
|
|
109
|
+
return _jsx(Puzzle, { className: className });
|
|
110
|
+
case 'component-package':
|
|
111
|
+
return _jsx(Boxes, { className: className });
|
|
112
|
+
case 'field-type':
|
|
113
|
+
return _jsx(Type, { className: className });
|
|
114
|
+
case 'data-source':
|
|
115
|
+
return _jsx(Database, { className: className });
|
|
116
|
+
case 'asset-storage':
|
|
117
|
+
return _jsx(HardDrive, { className: className });
|
|
118
|
+
case 'export-target':
|
|
119
|
+
return _jsx(Share2, { className: className });
|
|
120
|
+
case 'template':
|
|
121
|
+
return _jsx(LayoutTemplate, { className: className });
|
|
122
|
+
default:
|
|
123
|
+
return _jsx(Package, { className: className });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=extensions-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensions-view.js","sourceRoot":"","sources":["../../../src/components/extensions/extensions-view.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface UnsavedChangesGuardProps {
|
|
2
|
+
/** Block navigation while true (i.e. the surface has unsaved edits). */
|
|
3
|
+
when: boolean;
|
|
4
|
+
/**
|
|
5
|
+
* Save handler. Resolve `true` to allow the pending navigation, `false` to
|
|
6
|
+
* keep the user on the page (e.g. validation failed). Defaults to allowing.
|
|
7
|
+
*/
|
|
8
|
+
onSave?: () => boolean | Promise<boolean>;
|
|
9
|
+
title?: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
saveLabel?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Reusable route-transition + unsaved-change guard (brief §8.1, §8.7). Blocks
|
|
15
|
+
* in-app navigation (and the browser unload) while `when` is true, then offers
|
|
16
|
+
* save / discard / cancel. Used by Settings now; reusable in the Builder later.
|
|
17
|
+
*/
|
|
18
|
+
export declare function UnsavedChangesGuard({ when, onSave, title, description, saveLabel, }: UnsavedChangesGuardProps): import("react").JSX.Element;
|
|
19
|
+
/**
|
|
20
|
+
* Lower-level hook for surfaces that want to render their own guard UI.
|
|
21
|
+
* Returns the blocked status plus proceed/reset resolvers.
|
|
22
|
+
*/
|
|
23
|
+
export declare function useUnsavedChangesGuard(when: boolean): {
|
|
24
|
+
blocked: boolean;
|
|
25
|
+
proceed: (() => void) | undefined;
|
|
26
|
+
reset: (() => void) | undefined;
|
|
27
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useBlocker } from '@elytracms/studio/router';
|
|
3
|
+
import { TriangleAlert } from 'lucide-react';
|
|
4
|
+
import { useState } from 'react';
|
|
5
|
+
import { Button, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, Row, } from '@elytracms/studio/ui';
|
|
6
|
+
/**
|
|
7
|
+
* Reusable route-transition + unsaved-change guard (brief §8.1, §8.7). Blocks
|
|
8
|
+
* in-app navigation (and the browser unload) while `when` is true, then offers
|
|
9
|
+
* save / discard / cancel. Used by Settings now; reusable in the Builder later.
|
|
10
|
+
*/
|
|
11
|
+
export function UnsavedChangesGuard({ when, onSave, title = 'Unsaved changes', description = 'You have unsaved changes. Save them before leaving, or discard them.', saveLabel = 'Save changes', }) {
|
|
12
|
+
const { status, proceed, reset } = useBlocker({
|
|
13
|
+
shouldBlockFn: () => when,
|
|
14
|
+
enableBeforeUnload: () => when,
|
|
15
|
+
withResolver: true,
|
|
16
|
+
});
|
|
17
|
+
const [saving, setSaving] = useState(false);
|
|
18
|
+
const blocked = status === 'blocked';
|
|
19
|
+
async function handleSave() {
|
|
20
|
+
setSaving(true);
|
|
21
|
+
try {
|
|
22
|
+
const ok = (await onSave?.()) ?? true;
|
|
23
|
+
if (ok)
|
|
24
|
+
proceed?.();
|
|
25
|
+
else
|
|
26
|
+
reset?.();
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
setSaving(false);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return (_jsx(Dialog, { open: blocked, onOpenChange: (open) => (!open ? reset?.() : undefined), children: _jsxs(DialogContent, { className: "max-w-md", children: [_jsxs(DialogHeader, { children: [_jsxs(Row, { gap: "2", children: [_jsx("span", { className: "grid size-8 place-items-center rounded-lg border border-warning/30 bg-warning/10 text-warning", children: _jsx(TriangleAlert, { className: "size-4" }) }), _jsx(DialogTitle, { children: title })] }), _jsx(DialogDescription, { className: "pt-1", children: description })] }), _jsxs(DialogFooter, { className: "flex-col-reverse gap-2 sm:flex-row sm:justify-between", children: [_jsx(Button, { variant: "ghost", onClick: () => reset?.(), disabled: saving, children: "Cancel" }), _jsxs(Row, { gap: "2", justify: "end", children: [_jsx(Button, { variant: "outline", onClick: () => proceed?.(), disabled: saving, children: "Discard" }), _jsx(Button, { onClick: handleSave, disabled: saving, children: saving ? 'Saving…' : saveLabel })] })] })] }) }));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Lower-level hook for surfaces that want to render their own guard UI.
|
|
36
|
+
* Returns the blocked status plus proceed/reset resolvers.
|
|
37
|
+
*/
|
|
38
|
+
export function useUnsavedChangesGuard(when) {
|
|
39
|
+
const { status, proceed, reset } = useBlocker({
|
|
40
|
+
shouldBlockFn: () => when,
|
|
41
|
+
enableBeforeUnload: () => when,
|
|
42
|
+
withResolver: true,
|
|
43
|
+
});
|
|
44
|
+
return { blocked: status === 'blocked', proceed, reset };
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=guards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guards.js","sourceRoot":"","sources":["../../src/components/guards.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* EC-224 — the shared, view-supplied inspector sidebar.
|
|
4
|
+
*
|
|
5
|
+
* A generic tabbed frame: it renders whatever {@link InspectorPane}s it is given
|
|
6
|
+
* and owns nothing domain-specific. The OWNER composes the pane list — by
|
|
7
|
+
* convention `panes = [...view.suppliedPanes, versionsPane]`, so a view (the
|
|
8
|
+
* canvas) contributes its context pane (`Properties`) and the frame-owner (the
|
|
9
|
+
* document editor) appends the document-level `Versions` pane. A future rich
|
|
10
|
+
* field editor contributes its own pane the same way, without touching this
|
|
11
|
+
* frame (AD-12 — the canvas is itself just a field editor).
|
|
12
|
+
*
|
|
13
|
+
* Each pane's `render` runs where the frame is mounted, so a pane that needs a
|
|
14
|
+
* scoped context (e.g. the canvas `BuilderProvider` behind `PropertyInspector`)
|
|
15
|
+
* must be supplied by a view that mounts the frame inside that provider.
|
|
16
|
+
*/
|
|
17
|
+
export interface InspectorPane {
|
|
18
|
+
id: string;
|
|
19
|
+
label: string;
|
|
20
|
+
icon?: ReactNode;
|
|
21
|
+
render: () => ReactNode;
|
|
22
|
+
}
|
|
23
|
+
export declare function InspectorSidebar({ panes, className, }: {
|
|
24
|
+
panes: readonly InspectorPane[];
|
|
25
|
+
className?: string;
|
|
26
|
+
}): import("react").JSX.Element | null;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Row, Text } from '@elytracms/studio/ui';
|
|
4
|
+
import { cn } from '@elytracms/studio/lib/utils';
|
|
5
|
+
export function InspectorSidebar({ panes, className, }) {
|
|
6
|
+
const [activeId, setActiveId] = useState(() => panes[0]?.id);
|
|
7
|
+
// Derive the active pane defensively so a changed pane list (switching views)
|
|
8
|
+
// can never render a stale/absent tab — fall back to the first pane.
|
|
9
|
+
const active = panes.find((pane) => pane.id === activeId) ?? panes[0];
|
|
10
|
+
if (!active)
|
|
11
|
+
return null;
|
|
12
|
+
return (_jsxs("div", { className: cn('flex h-full min-h-0 flex-col bg-card', className), children: [_jsx(Row, { gap: "1", className: "shrink-0 border-b border-border p-1.5", children: panes.map((pane) => (_jsx(PaneTab, { pane: pane, active: pane.id === active.id, onClick: () => setActiveId(pane.id) }, pane.id))) }), _jsx("div", { className: "min-h-0 flex-1 overflow-auto", children: active.render() })] }));
|
|
13
|
+
}
|
|
14
|
+
function PaneTab({ pane, active, onClick, }) {
|
|
15
|
+
return (_jsxs("button", { type: "button", "aria-pressed": active, onClick: onClick, className: cn('inline-flex items-center gap-1.5 rounded-md px-2.5 py-1 transition-colors', active ? 'bg-accent text-accent-foreground' : 'text-muted-foreground hover:bg-muted'), children: [pane.icon, _jsx(Text, { as: "span", size: "xs", weight: "medium", className: "leading-none", children: pane.label })] }));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=inspector-sidebar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspector-sidebar.js","sourceRoot":"","sources":["../../../src/components/inspector/inspector-sidebar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAA;AAwBhD,MAAM,UAAU,gBAAgB,CAAC,EAC/B,KAAK,EACL,SAAS,GAIV;IACC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAqB,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAChF,8EAA8E;IAC9E,qEAAqE;IACrE,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAA;IACrE,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAExB,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,sCAAsC,EAAE,SAAS,CAAC,aACnE,KAAC,GAAG,IAAC,GAAG,EAAC,GAAG,EAAC,SAAS,EAAC,uCAAuC,YAC3D,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,KAAC,OAAO,IAEN,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,EAC7B,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,IAH9B,IAAI,CAAC,EAAE,CAIZ,CACH,CAAC,GACE,EACN,cAAK,SAAS,EAAC,8BAA8B,YAAE,MAAM,CAAC,MAAM,EAAE,GAAO,IACjE,CACP,CAAA;AACH,CAAC;AAED,SAAS,OAAO,CAAC,EACf,IAAI,EACJ,MAAM,EACN,OAAO,GAKR;IACC,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,kBACC,MAAM,EACpB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,EAAE,CACX,2EAA2E,EAC3E,MAAM,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,sCAAsC,CACrF,aAEA,IAAI,CAAC,IAAI,EACV,KAAC,IAAI,IAAC,EAAE,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,MAAM,EAAC,QAAQ,EAAC,SAAS,EAAC,cAAc,YAC/D,IAAI,CAAC,KAAK,GACN,IACA,CACV,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { OperationError } from '@elytracms/studio/lib/operations';
|
|
2
|
+
/**
|
|
3
|
+
* Shared error surface for failed/denied operations (EC-141). Every studio
|
|
4
|
+
* surface renders rejected commands through this banner so a structured
|
|
5
|
+
* `OperationError` — including its validation issues — is always *visible*,
|
|
6
|
+
* never a silent failure.
|
|
7
|
+
*
|
|
8
|
+
* Session expiry (EC-177 gap 9) is special-cased: the backend's raw
|
|
9
|
+
* unauthenticated blob is recognized at the lib chokepoint
|
|
10
|
+
* (`isSessionExpiredError`) and rendered as plain language with a
|
|
11
|
+
* "Sign in again" action instead of the verbatim transport message.
|
|
12
|
+
*/
|
|
13
|
+
export declare function OperationErrorBanner({ error, onDismiss, className, }: {
|
|
14
|
+
error: OperationError;
|
|
15
|
+
onDismiss?: () => void;
|
|
16
|
+
className?: string;
|
|
17
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { CircleAlert, LogIn, X } from 'lucide-react';
|
|
3
|
+
import { SESSION_EXPIRED_MESSAGE, SIGN_IN_AGAIN_LABEL, isSessionExpiredError, signInHref, } from '@elytracms/studio/lib/auth-errors';
|
|
4
|
+
import { Badge, Button, Row, Stack, Text } from '@elytracms/studio/ui';
|
|
5
|
+
import { operationErrorLabel } from '@elytracms/studio/lib/persona/labels';
|
|
6
|
+
import { useOptionalAuth } from './auth-context';
|
|
7
|
+
/**
|
|
8
|
+
* Shared error surface for failed/denied operations (EC-141). Every studio
|
|
9
|
+
* surface renders rejected commands through this banner so a structured
|
|
10
|
+
* `OperationError` — including its validation issues — is always *visible*,
|
|
11
|
+
* never a silent failure.
|
|
12
|
+
*
|
|
13
|
+
* Session expiry (EC-177 gap 9) is special-cased: the backend's raw
|
|
14
|
+
* unauthenticated blob is recognized at the lib chokepoint
|
|
15
|
+
* (`isSessionExpiredError`) and rendered as plain language with a
|
|
16
|
+
* "Sign in again" action instead of the verbatim transport message.
|
|
17
|
+
*/
|
|
18
|
+
export function OperationErrorBanner({ error, onDismiss, className, }) {
|
|
19
|
+
if (isSessionExpiredError(error)) {
|
|
20
|
+
return _jsx(SessionExpiredBanner, { onDismiss: onDismiss, className: className });
|
|
21
|
+
}
|
|
22
|
+
return (_jsx("div", { role: "alert", className: 'rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 ' + (className ?? ''), children: _jsxs(Row, { gap: "2", align: "start", children: [_jsx(CircleAlert, { className: "mt-0.5 size-4 shrink-0 text-destructive" }), _jsxs(Stack, { gap: "1", className: "min-w-0 flex-1", children: [_jsxs(Row, { gap: "2", align: "center", children: [_jsx(Badge, { variant: "error", title: error.code, "data-code": error.code, children: operationErrorLabel(error.code) }), _jsx(Text, { size: "sm", className: "text-destructive", children: error.message })] }), error.code === 'validation' && error.issues.length > 0 ? (_jsx(Stack, { gap: "none", children: error.issues.map((issue, i) => (_jsx(Text, { size: "xs", tone: "muted",
|
|
23
|
+
// The raw graph path (`pages.0.root.slots…`) is structural
|
|
24
|
+
// machine addressing — kept inspectable on hover, never shown
|
|
25
|
+
// as visible copy to a non-technical editor (EC-192).
|
|
26
|
+
title: issue.path && issue.path.length > 0 ? issue.path.join('.') : undefined, children: issue.message }, `${issue.code}-${i}`))) })) : null] }), onDismiss ? (_jsx(Button, { size: "icon-sm", variant: "ghost", "aria-label": "Dismiss error", onClick: onDismiss, className: "shrink-0", children: _jsx(X, {}) })) : null] }) }));
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The session-expired rendering of the banner: plain-language copy plus a
|
|
30
|
+
* "Sign in again" action that clears the stale session and routes to the
|
|
31
|
+
* sign-in screen, preserving the current location so a successful sign-in
|
|
32
|
+
* returns the editor to this exact screen.
|
|
33
|
+
*/
|
|
34
|
+
function SessionExpiredBanner({ onDismiss, className, }) {
|
|
35
|
+
const auth = useOptionalAuth();
|
|
36
|
+
async function handleSignInAgain() {
|
|
37
|
+
if (typeof window === 'undefined')
|
|
38
|
+
return;
|
|
39
|
+
const href = signInHref(window.location);
|
|
40
|
+
// Clear the stale (expired) session first: the route guard sends
|
|
41
|
+
// "signed-in" sessions away from /sign-in, so navigating with the dead
|
|
42
|
+
// session still bound would bounce straight back.
|
|
43
|
+
try {
|
|
44
|
+
await auth?.signOut();
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Even a failed sign-out must not strand the editor — proceed to the
|
|
48
|
+
// sign-in screen; the backend session is invalid either way.
|
|
49
|
+
}
|
|
50
|
+
window.location.assign(href);
|
|
51
|
+
}
|
|
52
|
+
return (_jsx("div", { role: "alert", className: 'rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 ' + (className ?? ''), children: _jsxs(Row, { gap: "2", align: "start", children: [_jsx(CircleAlert, { className: "mt-0.5 size-4 shrink-0 text-destructive" }), _jsx(Stack, { gap: "1", className: "min-w-0 flex-1", children: _jsxs(Row, { gap: "2", align: "center", children: [_jsx(Badge, { variant: "error", children: "signed out" }), _jsx(Text, { size: "sm", className: "text-destructive", children: SESSION_EXPIRED_MESSAGE })] }) }), _jsxs(Button, { size: "sm", variant: "outline", onClick: () => void handleSignInAgain(), className: "shrink-0", children: [_jsx(LogIn, {}), " ", SIGN_IN_AGAIN_LABEL] }), onDismiss ? (_jsx(Button, { size: "icon-sm", variant: "ghost", "aria-label": "Dismiss error", onClick: onDismiss, className: "shrink-0", children: _jsx(X, {}) })) : null] }) }));
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=operation-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-error.js","sourceRoot":"","sources":["../../src/components/operation-error.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Tooltip/accessible description — playground data is local and ephemeral. */
|
|
2
|
+
export declare const PLAYGROUND_BADGE_HINT = "Playground mode: data lives in memory on this device and resets on reload. Nothing is saved to a backend.";
|
|
3
|
+
/**
|
|
4
|
+
* EC-153: the explicit playground-mode marker. When the studio runs on the
|
|
5
|
+
* seeded in-memory adapter (`VITE_ELYTRA_MODE=playground`) this badge is
|
|
6
|
+
* always visible in the shell header; in Convex mode it renders nothing.
|
|
7
|
+
* Deterministic: mode is resolved from build-time env, identical on SSR and
|
|
8
|
+
* client.
|
|
9
|
+
*/
|
|
10
|
+
export declare function PlaygroundBadge(): import("react").JSX.Element | null;
|