@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,233 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { EyeOff } from 'lucide-react';
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import { conditionOperatorSchema, staticProp } from '@elytracms/project-graph';
|
|
5
|
+
import { pathFromToken } from '@elytracms/data-binding';
|
|
6
|
+
import { manifestSlots } from '@elytracms/component-registry';
|
|
7
|
+
import { fieldValueValidator } from '@elytracms/cms-core';
|
|
8
|
+
import { getStudioRegistry } from '@elytracms/studio/lib/registry';
|
|
9
|
+
import { useData } from '@elytracms/studio/lib/data';
|
|
10
|
+
import { Badge, Button, Code, Field, Input, InspectorSection, PanelHeader, Row, Select, Spacer, Stack, Text, } from '@elytracms/studio/ui';
|
|
11
|
+
import { humanizeName } from '@elytracms/studio/lib/utils';
|
|
12
|
+
import { componentDisplayName, conditionOperatorLabel } from '@elytracms/studio/lib/persona/labels';
|
|
13
|
+
import { FieldControl } from '../cms/field-control';
|
|
14
|
+
import { useBuilder } from './builder-store';
|
|
15
|
+
import { LayoutSection, layoutManagedPropNames } from './layout-inspector';
|
|
16
|
+
export function PropertyInspector() {
|
|
17
|
+
const builder = useBuilder();
|
|
18
|
+
const studio = getStudioRegistry();
|
|
19
|
+
const node = builder.selectedNode;
|
|
20
|
+
if (!node) {
|
|
21
|
+
return (_jsx("div", { className: "grid h-full place-items-center p-6 text-center", children: _jsx(Text, { size: "sm", tone: "muted", children: "Select a node in the tree or canvas to edit its properties." }) }));
|
|
22
|
+
}
|
|
23
|
+
const manifest = studio.registry.getManifest(node.componentId);
|
|
24
|
+
return (_jsxs("div", { className: "flex h-full min-h-0 flex-col", children: [_jsxs(PanelHeader, { children: [_jsx(Text, { size: "sm", weight: "semibold", children: "Inspector" }), _jsx(Spacer, {}), _jsx(Code, { tone: "muted", title: node.componentId, children: componentDisplayName(node.componentId, manifest) })] }), _jsx("div", { className: "min-h-0 flex-1 overflow-auto", children: _jsx(SettingsTab, { node: node, manifest: manifest }) })] }));
|
|
25
|
+
}
|
|
26
|
+
/** The full property surface: node identity, static props, condition, slots. */
|
|
27
|
+
function SettingsTab({ node, manifest, }) {
|
|
28
|
+
// Container layout props render in the dedicated Layout section (EC-162),
|
|
29
|
+
// not as a second set of generic controls.
|
|
30
|
+
const layoutManaged = new Set(layoutManagedPropNames(node));
|
|
31
|
+
// EC-190: `blocks` props are slots (named child regions), edited via the page
|
|
32
|
+
// tree / composition surface, not as a scalar control — so they show in the
|
|
33
|
+
// Slots section, not Props.
|
|
34
|
+
const props = manifest
|
|
35
|
+
? Object.entries(manifest.props).filter(([name, spec]) => !layoutManaged.has(name) && spec.type !== 'blocks')
|
|
36
|
+
: [];
|
|
37
|
+
const slots = manifest ? manifestSlots(manifest) : [];
|
|
38
|
+
return (_jsxs(_Fragment, { children: [_jsx(LayoutSection, { node: node }), !manifest ? (_jsxs("div", { className: "p-3", children: [_jsx(Badge, { variant: "error", children: "unknown component" }), _jsx(Text, { size: "xs", tone: "muted", className: "mt-2", children: "No manifest is registered for this component, so its props can't be edited." })] })) : (_jsx(InspectorSection, { title: "Props", children: props.length === 0 ? (_jsx(Text, { size: "xs", tone: "subtle", children: "No editable props." })) : (_jsx(Stack, { gap: "4", children: props.map(([name, spec]) => (
|
|
39
|
+
// Key by node id so per-node local control state never leaks
|
|
40
|
+
// across a selection change to a same-named prop.
|
|
41
|
+
_jsx(PropField, { node: node, name: name, spec: spec }, `${node.id}:${name}`))) })) })), _jsx(InspectorSection, { title: "Condition", children: _jsx(ConditionEditor, { node: node }) }), slots.length > 0 ? (_jsxs(InspectorSection, { title: "Slots", children: [_jsx(Stack, { gap: "1", children: slots.map((slot) => {
|
|
42
|
+
const count = node.slots?.[slot.name]?.length ?? 0;
|
|
43
|
+
const missing = slot.required && count === 0;
|
|
44
|
+
return (_jsxs(Row, { gap: "2", children: [_jsx(Text, { size: "xs", title: slot.name, children: humanizeName(slot.name) }), slot.required ? (_jsx(Badge, { variant: missing ? 'error' : 'outline', children: "required" })) : null, _jsx(Spacer, {}), _jsx(Text, { size: "xs", tone: "subtle", mono: true, children: count })] }, slot.name));
|
|
45
|
+
}) }), _jsx(Text, { size: "xs", tone: "subtle", className: "mt-2", children: "Add or reorder slot children from the page tree." })] })) : null] }));
|
|
46
|
+
}
|
|
47
|
+
function PropField({ node, name, spec }) {
|
|
48
|
+
const value = node.props?.[name];
|
|
49
|
+
return (_jsx(Field, { label: spec.form?.label ?? name, htmlFor: `prop-${node.id}-${name}`, children: _jsx(StaticControl, { node: node, name: name, spec: spec, value: value }) }));
|
|
50
|
+
}
|
|
51
|
+
function controlKind(spec) {
|
|
52
|
+
switch (spec.type) {
|
|
53
|
+
case 'boolean':
|
|
54
|
+
return 'boolean';
|
|
55
|
+
case 'number':
|
|
56
|
+
return 'number';
|
|
57
|
+
case 'select':
|
|
58
|
+
return 'select';
|
|
59
|
+
case 'richText':
|
|
60
|
+
return 'richtext';
|
|
61
|
+
// EC-195: an `asset`-typed prop (e.g. the Image `src`) picks from the asset
|
|
62
|
+
// library — never a raw asset id typed into a text box (the EC-192 persona).
|
|
63
|
+
case 'asset':
|
|
64
|
+
return 'asset';
|
|
65
|
+
// EC-253: an `object`/repeater prop reuses the CMS repeater control below.
|
|
66
|
+
case 'object':
|
|
67
|
+
return 'object';
|
|
68
|
+
// EC-262: a `relation`-typed prop (e.g. a ProductGrid's `category`) reuses the
|
|
69
|
+
// CMS relation picker — never a text box that stringifies the ref to "[object Object]".
|
|
70
|
+
case 'relation':
|
|
71
|
+
return 'relation';
|
|
72
|
+
case 'text': {
|
|
73
|
+
const c = spec.form?.control;
|
|
74
|
+
if (c === 'textarea')
|
|
75
|
+
return 'textarea';
|
|
76
|
+
if (c === 'color')
|
|
77
|
+
return 'color';
|
|
78
|
+
if (c === 'json')
|
|
79
|
+
return 'json';
|
|
80
|
+
return 'text';
|
|
81
|
+
}
|
|
82
|
+
default:
|
|
83
|
+
return 'text';
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function StaticControl({ node, name, spec, value, }) {
|
|
87
|
+
const builder = useBuilder();
|
|
88
|
+
const current = value?.kind === 'static' ? value.value : spec.default;
|
|
89
|
+
const id = `prop-${node.id}-${name}`;
|
|
90
|
+
const coalesceKey = `${node.id}:${name}`;
|
|
91
|
+
function set(v) {
|
|
92
|
+
builder.dispatch({ type: 'setProp', id: node.id, name, value: staticProp(v), coalesceKey });
|
|
93
|
+
}
|
|
94
|
+
function clear() {
|
|
95
|
+
builder.dispatch({ type: 'removeProp', id: node.id, name });
|
|
96
|
+
}
|
|
97
|
+
// EC-190: validate with the prop's field-def value validator (was `spec.schema.safeParse`).
|
|
98
|
+
const valid = current === undefined || fieldValueValidator({ ...spec, name })(current);
|
|
99
|
+
// EC-190: derive the editor control from the field `type` + optional `form.control`.
|
|
100
|
+
const kind = controlKind(spec);
|
|
101
|
+
// Select options live on the `select` field-def (was `spec.control.options`).
|
|
102
|
+
const options = spec.type === 'select' ? spec.options : [];
|
|
103
|
+
let control;
|
|
104
|
+
if (kind === 'boolean') {
|
|
105
|
+
control = (_jsxs("label", { className: "flex h-8 items-center gap-2 text-sm", children: [_jsx("input", { id: id, type: "checkbox", checked: current === true, onChange: (e) => set(e.target.checked), className: "size-4 accent-primary" }), _jsx(Text, { size: "sm", tone: "muted", children: current === true ? 'true' : 'false' })] }));
|
|
106
|
+
}
|
|
107
|
+
else if (kind === 'select') {
|
|
108
|
+
control = (_jsx(Select, { id: id, value: String(current ?? ''), onChange: (e) => {
|
|
109
|
+
// EC-190: select option values are strings (field-def `options`).
|
|
110
|
+
const opt = options.find((o) => o.value === e.target.value);
|
|
111
|
+
set(opt ? opt.value : e.target.value);
|
|
112
|
+
}, children: options.map((opt) => (_jsx("option", { value: opt.value, children: opt.label ?? opt.value }, opt.value))) }));
|
|
113
|
+
}
|
|
114
|
+
else if (kind === 'number') {
|
|
115
|
+
control = _jsx(NumberControl, { id: id, current: current, onSet: set, onClear: clear });
|
|
116
|
+
}
|
|
117
|
+
else if (kind === 'json') {
|
|
118
|
+
control = _jsx(JsonControl, { id: id, current: current, onSet: set });
|
|
119
|
+
}
|
|
120
|
+
else if (kind === 'color') {
|
|
121
|
+
control = (_jsxs(Row, { gap: "2", children: [_jsx("input", { id: id, type: "color", value: typeof current === 'string' && /^#[0-9a-f]{6}$/i.test(current) ? current : '#000000', onChange: (e) => set(e.target.value), className: "h-8 w-10 shrink-0 rounded-md border border-input bg-background" }), _jsx(Input, { value: typeof current === 'string' ? current : '', onChange: (e) => set(e.target.value) })] }));
|
|
122
|
+
}
|
|
123
|
+
else if (kind === 'textarea' || kind === 'richtext') {
|
|
124
|
+
control = (_jsx("textarea", { id: id, rows: 2, value: typeof current === 'string' ? current : '', onChange: (e) => set(e.target.value), className: "flex w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-sm text-foreground shadow-sm focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/40 outline-none" }));
|
|
125
|
+
}
|
|
126
|
+
else if (kind === 'asset' || kind === 'object' || kind === 'relation') {
|
|
127
|
+
// EC-195/EC-253/EC-262: reuse the CMS field control. `asset` = library picker +
|
|
128
|
+
// preview; `object` = the nested/repeater form; `relation` = the document picker
|
|
129
|
+
// (resolves the ref to its title, instead of stringifying it to "[object Object]").
|
|
130
|
+
// All edit a structured static prop value through the same shared control documents use.
|
|
131
|
+
control = (_jsx(FieldControl, { id: id, field: { ...spec, name }, value: current, onChange: (v) => (v === undefined || v === null ? clear() : set(v)), readOnly: false }));
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
control = (_jsx(Input, { id: id, value: typeof current === 'string' ? current : String(current ?? ''), onChange: (e) => set(e.target.value) }));
|
|
135
|
+
}
|
|
136
|
+
return (_jsxs(Stack, { gap: "1", children: [control, !valid ? (_jsx(Text, { size: "xs", className: "text-destructive", children: "Value doesn't match the prop schema \u2014 the canvas falls back to the default." })) : null] }));
|
|
137
|
+
}
|
|
138
|
+
/** Number input with a local buffer: commits only finite values, never NaN; empty clears the prop. */
|
|
139
|
+
function NumberControl({ id, current, onSet, onClear, }) {
|
|
140
|
+
const [raw, setRaw] = useState(typeof current === 'number' ? String(current) : '');
|
|
141
|
+
useEffect(() => {
|
|
142
|
+
setRaw(typeof current === 'number' ? String(current) : '');
|
|
143
|
+
}, [current]);
|
|
144
|
+
return (_jsx(Input, { id: id, type: "number", value: raw, onChange: (e) => {
|
|
145
|
+
const v = e.target.value;
|
|
146
|
+
setRaw(v);
|
|
147
|
+
if (v.trim() === '') {
|
|
148
|
+
onClear();
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const n = Number(v);
|
|
152
|
+
if (Number.isFinite(n))
|
|
153
|
+
onSet(n);
|
|
154
|
+
} }));
|
|
155
|
+
}
|
|
156
|
+
/** JSON textarea with a local buffer: commits only when the text parses; flags parse errors. */
|
|
157
|
+
function JsonControl({ id, current, onSet, }) {
|
|
158
|
+
const [raw, setRaw] = useState(() => JSON.stringify(current ?? null));
|
|
159
|
+
const [error, setError] = useState(null);
|
|
160
|
+
useEffect(() => {
|
|
161
|
+
setRaw(JSON.stringify(current ?? null));
|
|
162
|
+
setError(null);
|
|
163
|
+
}, [current]);
|
|
164
|
+
return (_jsxs(Stack, { gap: "1", children: [_jsx("textarea", { id: id, rows: 3, value: raw, onChange: (e) => {
|
|
165
|
+
const v = e.target.value;
|
|
166
|
+
setRaw(v);
|
|
167
|
+
try {
|
|
168
|
+
onSet(JSON.parse(v));
|
|
169
|
+
setError(null);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
setError('Invalid JSON');
|
|
173
|
+
}
|
|
174
|
+
}, className: "flex w-full rounded-md border border-input bg-background px-2.5 py-1.5 font-mono text-xs text-foreground shadow-sm focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/40 outline-none" }), error ? (_jsx(Text, { size: "xs", className: "text-destructive", children: error })) : null] }));
|
|
175
|
+
}
|
|
176
|
+
/** Plain-language label for a stored data path ("item 1 → title") — no raw syntax. */
|
|
177
|
+
function friendlyPathLabel(token) {
|
|
178
|
+
const path = pathFromToken(token);
|
|
179
|
+
if (path === undefined)
|
|
180
|
+
return 'this data';
|
|
181
|
+
if (path.length === 0)
|
|
182
|
+
return 'Everything';
|
|
183
|
+
return path
|
|
184
|
+
.map((seg) => (/^\d+$/.test(seg) ? `entry ${Number(seg) + 1}` : humanizeName(seg)))
|
|
185
|
+
.join(' → ');
|
|
186
|
+
}
|
|
187
|
+
/** Edit a node's render condition (EC-088): source field + operator + comparison value. */
|
|
188
|
+
function ConditionEditor({ node }) {
|
|
189
|
+
const builder = useBuilder();
|
|
190
|
+
const data = useData();
|
|
191
|
+
const condition = node.condition;
|
|
192
|
+
const firstSource = data.sources[0];
|
|
193
|
+
if (!condition) {
|
|
194
|
+
return (_jsxs(Stack, { gap: "2", children: [_jsx(Text, { size: "xs", tone: "subtle", children: "This node always renders. Add a condition to gate it on a data value." }), _jsxs(Button, { size: "sm", variant: "outline", className: "w-fit", disabled: !firstSource, onClick: () => firstSource &&
|
|
195
|
+
builder.dispatch({
|
|
196
|
+
type: 'setCondition',
|
|
197
|
+
id: node.id,
|
|
198
|
+
condition: {
|
|
199
|
+
source: { sourceId: firstSource.id, token: '/', mode: 'value' },
|
|
200
|
+
operator: 'truthy',
|
|
201
|
+
},
|
|
202
|
+
}), children: [_jsx(EyeOff, {}), " Add condition"] })] }));
|
|
203
|
+
}
|
|
204
|
+
const updateCondition = (patch) => builder.dispatch({ type: 'setCondition', id: node.id, condition: { ...condition, ...patch } });
|
|
205
|
+
const updateSource = (patch) => updateCondition({ source: { ...condition.source, ...patch } });
|
|
206
|
+
const tokens = data.tokensOf(condition.source.sourceId);
|
|
207
|
+
const source = data.getSource(condition.source.sourceId);
|
|
208
|
+
const needsValue = !['truthy', 'exists'].includes(condition.operator);
|
|
209
|
+
const result = data.resolveCondition(condition);
|
|
210
|
+
const pass = result.kind === 'condition' ? result.pass : false;
|
|
211
|
+
const issue = result.kind === 'issue' ? result.issue : null;
|
|
212
|
+
return (_jsxs(Stack, { gap: "2", children: [_jsx(Field, { label: "Source", htmlFor: `cond-src-${node.id}`, children: _jsxs(Select, { id: `cond-src-${node.id}`, value: condition.source.sourceId, onChange: (e) => updateSource({ sourceId: e.target.value, token: '/' }), children: [data.sources.map((s) => (_jsx("option", { value: s.id, children: s.label }, s.id))), !source ? (_jsx("option", { value: condition.source.sourceId, title: condition.source.sourceId, children: "Missing data source" })) : null] }) }), _jsxs(Row, { gap: "2", children: [_jsx(Field, { label: "Field", htmlFor: `cond-token-${node.id}`, className: "min-w-0 flex-1", children: _jsxs(Select, { id: `cond-token-${node.id}`, value: condition.source.token, onChange: (e) => updateSource({ token: e.target.value }), children: [tokens.map((t) => (_jsx("option", { value: t, children: friendlyPathLabel(t) }, t))), !tokens.includes(condition.source.token) ? (_jsx("option", { value: condition.source.token, children: friendlyPathLabel(condition.source.token) })) : null] }) }), _jsx(Field, { label: "Operator", htmlFor: `cond-op-${node.id}`, className: "w-28", children: _jsx(Select, { id: `cond-op-${node.id}`, value: condition.operator, onChange: (e) => updateCondition({ operator: e.target.value }), children: conditionOperatorSchema.options.map((op) => (_jsx("option", { value: op, title: op, children: conditionOperatorLabel(op) }, op))) }) })] }), needsValue ? (_jsx(Field, { label: "Compare to", htmlFor: `cond-val-${node.id}`, children: _jsx(Input, { id: `cond-val-${node.id}`, value: condition.value === undefined ? '' : String(condition.value), onChange: (e) => updateCondition({ value: coerceScalar(e.target.value) }), placeholder: "value", className: "font-mono text-xs" }) })) : null, _jsxs(Row, { gap: "2", children: [issue ? (_jsx(Badge, { variant: "error", children: "broken" })) : pass ? (_jsx(Badge, { variant: "success", children: "renders" })) : (_jsxs(Badge, { variant: "warning", children: [_jsx(EyeOff, { className: "size-3" }), " hidden"] })), _jsx(Text, { size: "xs", tone: "muted", className: "min-w-0 flex-1 truncate", children: issue
|
|
213
|
+
? issue.message
|
|
214
|
+
: pass
|
|
215
|
+
? 'Condition passes — node renders.'
|
|
216
|
+
: 'Condition fails — node is hidden on the canvas.' }), _jsx(Spacer, {}), _jsx(Button, { size: "sm", variant: "ghost", className: "text-destructive hover:text-destructive", onClick: () => builder.dispatch({ type: 'setCondition', id: node.id, condition: undefined }), children: "Remove" })] })] }));
|
|
217
|
+
}
|
|
218
|
+
/** Parse a comparison-value string into a number/boolean/null when it looks like one. */
|
|
219
|
+
function coerceScalar(raw) {
|
|
220
|
+
if (raw === '')
|
|
221
|
+
return '';
|
|
222
|
+
if (raw === 'true')
|
|
223
|
+
return true;
|
|
224
|
+
if (raw === 'false')
|
|
225
|
+
return false;
|
|
226
|
+
if (raw === 'null')
|
|
227
|
+
return null;
|
|
228
|
+
const n = Number(raw);
|
|
229
|
+
if (raw.trim() !== '' && Number.isFinite(n))
|
|
230
|
+
return n;
|
|
231
|
+
return raw;
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=property-inspector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"property-inspector.js","sourceRoot":"","sources":["../../../src/components/builder/property-inspector.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { createPortal } from 'react-dom';
|
|
4
|
+
const TOOLBAR_OFFSET_PX = 8;
|
|
5
|
+
function selectionState(doc, host) {
|
|
6
|
+
const selection = doc.getSelection();
|
|
7
|
+
if (!selection || selection.rangeCount === 0 || selection.isCollapsed)
|
|
8
|
+
return null;
|
|
9
|
+
if (!host.contains(selection.anchorNode) || !host.contains(selection.focusNode))
|
|
10
|
+
return null;
|
|
11
|
+
const rect = selection.getRangeAt(0).getBoundingClientRect();
|
|
12
|
+
if (rect.width === 0 && rect.height === 0)
|
|
13
|
+
return null;
|
|
14
|
+
const anchor = selection.anchorNode;
|
|
15
|
+
const anchorElement = anchor instanceof Element ? anchor : anchor?.parentElement;
|
|
16
|
+
const link = anchorElement?.closest('a') ?? null;
|
|
17
|
+
return {
|
|
18
|
+
left: rect.left + rect.width / 2,
|
|
19
|
+
top: rect.top,
|
|
20
|
+
bold: doc.queryCommandState('bold'),
|
|
21
|
+
italic: doc.queryCommandState('italic'),
|
|
22
|
+
linkHref: link?.getAttribute('href') ?? null,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export function RichTextToolbar({ doc, host }) {
|
|
26
|
+
const [state, setState] = useState(null);
|
|
27
|
+
const [linkOpen, setLinkOpen] = useState(false);
|
|
28
|
+
const [linkDraft, setLinkDraft] = useState('');
|
|
29
|
+
const savedRangeRef = useRef(null);
|
|
30
|
+
const refresh = useCallback(() => {
|
|
31
|
+
setState(selectionState(doc, host));
|
|
32
|
+
}, [doc, host]);
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
refresh();
|
|
35
|
+
doc.addEventListener('selectionchange', refresh);
|
|
36
|
+
return () => doc.removeEventListener('selectionchange', refresh);
|
|
37
|
+
}, [doc, refresh]);
|
|
38
|
+
// Close a stale link editor when the selection leaves the host entirely.
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
if (!state && !linkOpen)
|
|
41
|
+
setLinkDraft('');
|
|
42
|
+
}, [state, linkOpen]);
|
|
43
|
+
const exec = useCallback((command, value) => {
|
|
44
|
+
doc.execCommand(command, false, value);
|
|
45
|
+
refresh();
|
|
46
|
+
}, [doc, refresh]);
|
|
47
|
+
const openLinkEditor = useCallback(() => {
|
|
48
|
+
const selection = doc.getSelection();
|
|
49
|
+
if (selection && selection.rangeCount > 0) {
|
|
50
|
+
savedRangeRef.current = selection.getRangeAt(0).cloneRange();
|
|
51
|
+
}
|
|
52
|
+
setLinkDraft(state?.linkHref ?? '');
|
|
53
|
+
setLinkOpen(true);
|
|
54
|
+
}, [doc, state]);
|
|
55
|
+
const applyLink = useCallback((href) => {
|
|
56
|
+
const selection = doc.getSelection();
|
|
57
|
+
const saved = savedRangeRef.current;
|
|
58
|
+
if (saved && selection) {
|
|
59
|
+
selection.removeAllRanges();
|
|
60
|
+
selection.addRange(saved);
|
|
61
|
+
}
|
|
62
|
+
const trimmed = href.trim();
|
|
63
|
+
if (trimmed.length > 0)
|
|
64
|
+
exec('createLink', trimmed);
|
|
65
|
+
else
|
|
66
|
+
exec('unlink');
|
|
67
|
+
setLinkOpen(false);
|
|
68
|
+
savedRangeRef.current = null;
|
|
69
|
+
host.focus({ preventScroll: true });
|
|
70
|
+
}, [doc, exec, host]);
|
|
71
|
+
const closeLinkEditor = useCallback(() => {
|
|
72
|
+
setLinkOpen(false);
|
|
73
|
+
savedRangeRef.current = null;
|
|
74
|
+
host.focus({ preventScroll: true });
|
|
75
|
+
}, [host]);
|
|
76
|
+
if (!state && !linkOpen)
|
|
77
|
+
return null;
|
|
78
|
+
const left = state?.left ?? savedRangeRef.current?.getBoundingClientRect().left ?? 0;
|
|
79
|
+
const top = state?.top ?? savedRangeRef.current?.getBoundingClientRect().top ?? 0;
|
|
80
|
+
return createPortal(_jsx("div", { "data-ec-rt-toolbar": "", role: "toolbar", "aria-label": "Text formatting", className: "ec-rt-toolbar", style: {
|
|
81
|
+
position: 'fixed',
|
|
82
|
+
left: Math.max(8, left),
|
|
83
|
+
top: Math.max(8, top - TOOLBAR_OFFSET_PX),
|
|
84
|
+
transform: 'translate(-50%, -100%)',
|
|
85
|
+
zIndex: 50,
|
|
86
|
+
}, onMouseDown: (e) => {
|
|
87
|
+
// Keep the host's selection/focus — except for the link input.
|
|
88
|
+
if (!e.target.closest('input'))
|
|
89
|
+
e.preventDefault();
|
|
90
|
+
}, children: linkOpen ? (_jsxs("form", { className: "ec-rt-toolbar-row", onSubmit: (e) => {
|
|
91
|
+
e.preventDefault();
|
|
92
|
+
applyLink(linkDraft);
|
|
93
|
+
}, children: [_jsx("input", { autoFocus: true, type: "text", value: linkDraft, placeholder: "https://\u2026 (empty removes)", "aria-label": "Link URL", onChange: (e) => setLinkDraft(e.target.value), onKeyDown: (e) => {
|
|
94
|
+
if (e.key === 'Escape') {
|
|
95
|
+
e.preventDefault();
|
|
96
|
+
e.stopPropagation();
|
|
97
|
+
closeLinkEditor();
|
|
98
|
+
}
|
|
99
|
+
}, className: "ec-rt-toolbar-input" }), _jsx("button", { type: "submit", className: "ec-rt-toolbar-btn", "aria-label": "Apply link", children: "Set" })] })) : (_jsxs("div", { className: "ec-rt-toolbar-row", children: [_jsx(MarkButton, { label: "Bold", active: state?.bold ?? false, onClick: () => exec('bold'), children: "B" }), _jsx(MarkButton, { label: "Italic", active: state?.italic ?? false, onClick: () => exec('italic'), children: "I" }), _jsx(MarkButton, { label: "Link", active: state !== null && state.linkHref !== null, onClick: openLinkEditor, children: "Link" }), state !== null && state.linkHref !== null ? (_jsx(MarkButton, { label: "Remove link", active: false, onClick: () => exec('unlink'), children: "Unlink" })) : null] })) }), doc.body);
|
|
100
|
+
}
|
|
101
|
+
function MarkButton({ label, active, onClick, children, }) {
|
|
102
|
+
return (_jsx("button", { type: "button", "aria-label": label, "aria-pressed": active, title: label, onClick: onClick, className: "ec-rt-toolbar-btn", "data-active": active || undefined, children: children }));
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=rich-text-toolbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rich-text-toolbar.js","sourceRoot":"","sources":["../../../src/components/builder/rich-text-toolbar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ComponentNode } from '@elytracms/project-graph';
|
|
2
|
+
import type { GapStep } from '@elytracms/studio/lib/dnd/gap-drag';
|
|
3
|
+
/**
|
|
4
|
+
* Tokenized spacing handles (EC-163, vision §3.1 / AD-10): when a Stack/Grid
|
|
5
|
+
* container is selected on the canvas, draggable gap handles appear between
|
|
6
|
+
* its children, axis-aware via the shared `containerFlowAxis`. Dragging snaps
|
|
7
|
+
* through the EC-161 spacing-token scale (`lib/dnd/gap-drag` — pure math, no
|
|
8
|
+
* pixel value can escape it) with a live plain-language label (the layout
|
|
9
|
+
* inspector's vocabulary). The drag previews imperatively on the rendered
|
|
10
|
+
* element; releasing commits exactly ONE builder dispatch — `setProp` with the
|
|
11
|
+
* token, or `removeProp` for "no gap", the identical values the inspector's
|
|
12
|
+
* gap select writes — so one undo restores, and the graph stays the single
|
|
13
|
+
* source of truth. Esc mid-drag cancels: preview reverts, nothing dispatches.
|
|
14
|
+
*/
|
|
15
|
+
/** Plain-language label for a gap step — the inspector's vocabulary. */
|
|
16
|
+
export declare function gapStepLabel(step: GapStep): string;
|
|
17
|
+
/** True when the node is a container with at least two children to space. */
|
|
18
|
+
export declare function hasSpacingHandles(node: ComponentNode | null): node is ComponentNode;
|
|
19
|
+
export declare function SpacingHandles({ doc, node }: {
|
|
20
|
+
doc: Document;
|
|
21
|
+
node: ComponentNode;
|
|
22
|
+
}): import("react").ReactPortal;
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
|
|
3
|
+
import { createPortal } from 'react-dom';
|
|
4
|
+
import { DEFAULT_SLOT, isLayoutContainerNode, staticProp } from '@elytracms/project-graph';
|
|
5
|
+
import { containerFlowAxis } from '@elytracms/studio/lib/dnd/drop-rules';
|
|
6
|
+
import { containerGapStep, gapHandleSpots, gapStepCss, gapStepFromDrag, } from '@elytracms/studio/lib/dnd/gap-drag';
|
|
7
|
+
import { useBuilder } from './builder-store';
|
|
8
|
+
import { GAP_LABELS, GAP_NONE_LABEL } from './layout-inspector';
|
|
9
|
+
/**
|
|
10
|
+
* Tokenized spacing handles (EC-163, vision §3.1 / AD-10): when a Stack/Grid
|
|
11
|
+
* container is selected on the canvas, draggable gap handles appear between
|
|
12
|
+
* its children, axis-aware via the shared `containerFlowAxis`. Dragging snaps
|
|
13
|
+
* through the EC-161 spacing-token scale (`lib/dnd/gap-drag` — pure math, no
|
|
14
|
+
* pixel value can escape it) with a live plain-language label (the layout
|
|
15
|
+
* inspector's vocabulary). The drag previews imperatively on the rendered
|
|
16
|
+
* element; releasing commits exactly ONE builder dispatch — `setProp` with the
|
|
17
|
+
* token, or `removeProp` for "no gap", the identical values the inspector's
|
|
18
|
+
* gap select writes — so one undo restores, and the graph stays the single
|
|
19
|
+
* source of truth. Esc mid-drag cancels: preview reverts, nothing dispatches.
|
|
20
|
+
*/
|
|
21
|
+
/** Plain-language label for a gap step — the inspector's vocabulary. */
|
|
22
|
+
export function gapStepLabel(step) {
|
|
23
|
+
return step === null ? GAP_NONE_LABEL : GAP_LABELS[step];
|
|
24
|
+
}
|
|
25
|
+
/** The container's rendered element (the Stack/Grid div carrying the gap style). */
|
|
26
|
+
function containerElementFor(doc, nodeId) {
|
|
27
|
+
const wrapper = doc.querySelector(`[data-ec-node-id="${nodeId}"]`);
|
|
28
|
+
return wrapper?.querySelector(':scope > [data-ec-primitive]') ?? null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Measure the handle spots between the container's rendered children. The
|
|
32
|
+
* graph-level flow axis (`containerFlowAxis`) is tried first; when the
|
|
33
|
+
* rendered layout disagrees — a stacking Grid below the mobile breakpoint
|
|
34
|
+
* lays its "columns" out vertically — the cross axis is measured instead, so
|
|
35
|
+
* handles always sit in the gaps the editor actually sees.
|
|
36
|
+
*/
|
|
37
|
+
function measureSpots(doc, nodeId, flowAxis) {
|
|
38
|
+
const container = containerElementFor(doc, nodeId);
|
|
39
|
+
const win = doc.defaultView;
|
|
40
|
+
if (!container || !win)
|
|
41
|
+
return { spots: [], axis: flowAxis };
|
|
42
|
+
const children = Array.from(container.querySelectorAll(':scope > [data-ec-node-id]'));
|
|
43
|
+
if (children.length < 2)
|
|
44
|
+
return { spots: [], axis: flowAxis };
|
|
45
|
+
const rects = children.map((el) => {
|
|
46
|
+
const r = el.getBoundingClientRect();
|
|
47
|
+
return { left: r.left + win.scrollX, top: r.top + win.scrollY, width: r.width, height: r.height };
|
|
48
|
+
});
|
|
49
|
+
const along = gapHandleSpots(rects, flowAxis);
|
|
50
|
+
if (along.length > 0)
|
|
51
|
+
return { spots: along, axis: flowAxis };
|
|
52
|
+
const cross = flowAxis === 'horizontal' ? 'vertical' : 'horizontal';
|
|
53
|
+
const across = gapHandleSpots(rects, cross);
|
|
54
|
+
return across.length > 0 ? { spots: across, axis: cross } : { spots: [], axis: flowAxis };
|
|
55
|
+
}
|
|
56
|
+
/** True when the node is a container with at least two children to space. */
|
|
57
|
+
export function hasSpacingHandles(node) {
|
|
58
|
+
return (node !== null &&
|
|
59
|
+
isLayoutContainerNode(node) &&
|
|
60
|
+
(node.slots?.[DEFAULT_SLOT]?.length ?? 0) >= 2);
|
|
61
|
+
}
|
|
62
|
+
const HANDLE_THICKNESS = 14;
|
|
63
|
+
const HANDLE_BAR = 4;
|
|
64
|
+
const HANDLE_MAX_LENGTH = 48;
|
|
65
|
+
export function SpacingHandles({ doc, node }) {
|
|
66
|
+
const builder = useBuilder();
|
|
67
|
+
const { dispatch } = builder;
|
|
68
|
+
const flowAxis = containerFlowAxis(node);
|
|
69
|
+
const [measured, setMeasured] = useState({ spots: [], axis: flowAxis });
|
|
70
|
+
const [drag, setDrag] = useState(null);
|
|
71
|
+
const dragRef = useRef(null);
|
|
72
|
+
// The container's pre-drag inline gap, restored on cancel/commit (the graph
|
|
73
|
+
// re-render owns the committed value; the preview is imperative-only).
|
|
74
|
+
const inlineGapRef = useRef('');
|
|
75
|
+
// Re-measure when the graph, selection, drag preview, or iframe size change.
|
|
76
|
+
useLayoutEffect(() => {
|
|
77
|
+
const measure = () => setMeasured(measureSpots(doc, node.id, flowAxis));
|
|
78
|
+
measure();
|
|
79
|
+
const win = doc.defaultView;
|
|
80
|
+
win?.addEventListener('resize', measure);
|
|
81
|
+
return () => win?.removeEventListener('resize', measure);
|
|
82
|
+
}, [doc, node, flowAxis, builder.present, builder.viewport, drag?.step]);
|
|
83
|
+
const { spots, axis } = measured;
|
|
84
|
+
const applyPreview = useCallback((step) => {
|
|
85
|
+
const container = containerElementFor(doc, node.id);
|
|
86
|
+
if (container)
|
|
87
|
+
container.style.gap = gapStepCss(step);
|
|
88
|
+
}, [doc, node.id]);
|
|
89
|
+
const finish = useCallback((mode) => {
|
|
90
|
+
const active = dragRef.current;
|
|
91
|
+
if (!active)
|
|
92
|
+
return;
|
|
93
|
+
dragRef.current = null;
|
|
94
|
+
setDrag(null);
|
|
95
|
+
// Drop the imperative preview; the rendered graph value takes over.
|
|
96
|
+
const container = containerElementFor(doc, node.id);
|
|
97
|
+
if (container)
|
|
98
|
+
container.style.gap = inlineGapRef.current;
|
|
99
|
+
if (mode === 'commit' && active.step !== active.startStep) {
|
|
100
|
+
// Exactly one dispatch — one operations command, one undo step — and
|
|
101
|
+
// the identical prop value the inspector's gap select produces.
|
|
102
|
+
if (active.step === null) {
|
|
103
|
+
dispatch({ type: 'removeProp', id: node.id, name: 'gap' });
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
dispatch({ type: 'setProp', id: node.id, name: 'gap', value: staticProp(active.step) });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}, [doc, node.id, dispatch]);
|
|
110
|
+
// Esc cancels mid-drag — listen on both documents (focus may sit either side
|
|
111
|
+
// of the iframe boundary while the pointer is captured).
|
|
112
|
+
useEffect(() => {
|
|
113
|
+
if (!drag)
|
|
114
|
+
return;
|
|
115
|
+
const onKeyDown = (e) => {
|
|
116
|
+
if (e.key === 'Escape') {
|
|
117
|
+
e.preventDefault();
|
|
118
|
+
e.stopPropagation();
|
|
119
|
+
finish('cancel');
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
doc.addEventListener('keydown', onKeyDown, true);
|
|
123
|
+
document.addEventListener('keydown', onKeyDown, true);
|
|
124
|
+
return () => {
|
|
125
|
+
doc.removeEventListener('keydown', onKeyDown, true);
|
|
126
|
+
document.removeEventListener('keydown', onKeyDown, true);
|
|
127
|
+
};
|
|
128
|
+
}, [drag, doc, finish]);
|
|
129
|
+
// Cleanup on unmount/selection change mid-drag: revert, never dispatch.
|
|
130
|
+
useEffect(() => () => finish('cancel'), [finish]);
|
|
131
|
+
const onPointerDown = (spot) => (e) => {
|
|
132
|
+
if (e.button !== 0)
|
|
133
|
+
return;
|
|
134
|
+
e.preventDefault();
|
|
135
|
+
e.stopPropagation();
|
|
136
|
+
const startStep = containerGapStep(node);
|
|
137
|
+
const container = containerElementFor(doc, node.id);
|
|
138
|
+
inlineGapRef.current = container?.style.gap ?? '';
|
|
139
|
+
try {
|
|
140
|
+
e.currentTarget.setPointerCapture(e.pointerId);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// Synthetic pointer events (tests, automation) have no active pointer
|
|
144
|
+
// to capture; move/up still arrive via the handle's own listeners.
|
|
145
|
+
}
|
|
146
|
+
const next = {
|
|
147
|
+
index: spot.index,
|
|
148
|
+
startStep,
|
|
149
|
+
step: startStep,
|
|
150
|
+
startCoord: axis === 'horizontal' ? e.clientX : e.clientY,
|
|
151
|
+
labelX: spot.x,
|
|
152
|
+
labelY: spot.y,
|
|
153
|
+
};
|
|
154
|
+
dragRef.current = next;
|
|
155
|
+
setDrag(next);
|
|
156
|
+
};
|
|
157
|
+
const onPointerMove = (e) => {
|
|
158
|
+
const active = dragRef.current;
|
|
159
|
+
if (!active)
|
|
160
|
+
return;
|
|
161
|
+
const win = doc.defaultView;
|
|
162
|
+
const coord = axis === 'horizontal' ? e.clientX : e.clientY;
|
|
163
|
+
const step = gapStepFromDrag(active.startStep, coord - active.startCoord);
|
|
164
|
+
const next = {
|
|
165
|
+
...active,
|
|
166
|
+
step,
|
|
167
|
+
labelX: e.clientX + (win?.scrollX ?? 0),
|
|
168
|
+
labelY: e.clientY + (win?.scrollY ?? 0),
|
|
169
|
+
};
|
|
170
|
+
dragRef.current = next;
|
|
171
|
+
setDrag(next);
|
|
172
|
+
applyPreview(step);
|
|
173
|
+
};
|
|
174
|
+
const horizontal = axis === 'horizontal';
|
|
175
|
+
return createPortal(_jsxs("div", { "data-ec-spacing-handles": "", children: [spots.map((spot) => {
|
|
176
|
+
const length = Math.min(spot.crossLength, HANDLE_MAX_LENGTH);
|
|
177
|
+
const active = drag?.index === spot.index;
|
|
178
|
+
return (_jsx("div", { "data-ec-gap-handle": spot.index, role: "separator", "aria-label": `Gap after child ${spot.index + 1}`, "aria-orientation": horizontal ? 'vertical' : 'horizontal', onPointerDown: onPointerDown(spot), onPointerMove: onPointerMove, onPointerUp: () => finish('commit'), onPointerCancel: () => finish('cancel'), style: {
|
|
179
|
+
position: 'absolute',
|
|
180
|
+
left: spot.x - (horizontal ? HANDLE_THICKNESS / 2 : length / 2),
|
|
181
|
+
top: spot.y - (horizontal ? length / 2 : HANDLE_THICKNESS / 2),
|
|
182
|
+
width: horizontal ? HANDLE_THICKNESS : length,
|
|
183
|
+
height: horizontal ? length : HANDLE_THICKNESS,
|
|
184
|
+
display: 'flex',
|
|
185
|
+
alignItems: 'center',
|
|
186
|
+
justifyContent: 'center',
|
|
187
|
+
cursor: horizontal ? 'col-resize' : 'row-resize',
|
|
188
|
+
zIndex: 40,
|
|
189
|
+
touchAction: 'none',
|
|
190
|
+
}, children: _jsx("div", { style: {
|
|
191
|
+
width: horizontal ? HANDLE_BAR : '100%',
|
|
192
|
+
height: horizontal ? '100%' : HANDLE_BAR,
|
|
193
|
+
borderRadius: 999,
|
|
194
|
+
backgroundColor: active ? '#5b8cff' : 'rgba(91, 140, 255, 0.65)',
|
|
195
|
+
boxShadow: '0 0 0 1px rgba(8, 12, 24, 0.55)',
|
|
196
|
+
} }) }, spot.index));
|
|
197
|
+
}), drag ? (_jsx("div", { "data-ec-gap-label": "", style: {
|
|
198
|
+
position: 'absolute',
|
|
199
|
+
left: drag.labelX + 12,
|
|
200
|
+
top: drag.labelY + 12,
|
|
201
|
+
zIndex: 50,
|
|
202
|
+
pointerEvents: 'none',
|
|
203
|
+
padding: '2px 8px',
|
|
204
|
+
borderRadius: 6,
|
|
205
|
+
fontSize: 11,
|
|
206
|
+
fontWeight: 600,
|
|
207
|
+
whiteSpace: 'nowrap',
|
|
208
|
+
color: '#fff',
|
|
209
|
+
backgroundColor: '#5b8cff',
|
|
210
|
+
boxShadow: '0 2px 8px rgba(8, 12, 24, 0.4)',
|
|
211
|
+
}, children: gapStepLabel(drag.step) })) : null] }), doc.body);
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=spacing-handles.js.map
|