canopycms 0.0.68-int.98 → 0.1.0
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/CHANGELOG.md +2131 -0
- package/README.md +47 -63
- package/dist/ai/generate.d.ts +5 -0
- package/dist/ai/generate.js +244 -115
- package/dist/ai/index.d.ts +1 -1
- package/dist/ai/json-to-markdown.d.ts +21 -1
- package/dist/ai/json-to-markdown.js +120 -57
- package/dist/ai/references.d.ts +72 -0
- package/dist/ai/references.js +223 -0
- package/dist/ai/resolve-branch.js +9 -2
- package/dist/ai/to-plain-text.d.ts +17 -8
- package/dist/ai/to-plain-text.js +18 -15
- package/dist/ai/types.d.ts +84 -3
- package/dist/api/admin-branch-health.d.ts +24 -1
- package/dist/api/admin-branch-health.js +52 -20
- package/dist/api/admin.d.ts +23 -5
- package/dist/api/admin.js +36 -1
- package/dist/api/assets.js +88 -78
- package/dist/api/branch-create-window.d.ts +12 -0
- package/dist/api/branch-create-window.js +13 -0
- package/dist/api/branch-merge.d.ts +1 -1
- package/dist/api/branch-merge.js +1 -1
- package/dist/api/branch-review.d.ts +3 -3
- package/dist/api/branch-review.js +16 -7
- package/dist/api/branch-status.d.ts +16 -6
- package/dist/api/branch-status.js +57 -12
- package/dist/api/branch-withdraw.d.ts +2 -2
- package/dist/api/branch-withdraw.js +8 -3
- package/dist/api/branch.d.ts +25 -12
- package/dist/api/branch.js +164 -103
- package/dist/api/client.d.ts +78 -58
- package/dist/api/client.js +150 -117
- package/dist/api/comments.d.ts +12 -3
- package/dist/api/comments.js +118 -9
- package/dist/api/content.d.ts +9 -9
- package/dist/api/content.js +131 -22
- package/dist/api/entries-constants.d.ts +14 -3
- package/dist/api/entries-constants.js +14 -3
- package/dist/api/entries.d.ts +40 -2
- package/dist/api/entries.js +102 -6
- package/dist/api/github-sync.d.ts +19 -0
- package/dist/api/github-sync.js +50 -3
- package/dist/api/groups.d.ts +4 -4
- package/dist/api/groups.js +2 -1
- package/dist/api/guards.js +23 -3
- package/dist/api/index.d.ts +3 -1
- package/dist/api/index.js +1 -0
- package/dist/api/permissions.d.ts +21 -2
- package/dist/api/permissions.js +50 -3
- package/dist/api/request-deadline.d.ts +59 -0
- package/dist/api/request-deadline.js +73 -0
- package/dist/api/resolve-references.js +8 -7
- package/dist/api/route-builder.d.ts +14 -0
- package/dist/api/route-builder.js +14 -1
- package/dist/api/schema.d.ts +11 -9
- package/dist/api/schema.js +2 -0
- package/dist/api/settings-helpers.d.ts +5 -1
- package/dist/api/settings-helpers.js +10 -2
- package/dist/api/types.d.ts +18 -0
- package/dist/api/users-constants.d.ts +6 -0
- package/dist/api/users-constants.js +6 -0
- package/dist/assets/asset-url.d.ts +28 -16
- package/dist/assets/asset-url.js +51 -25
- package/dist/assets/finalize.js +3 -0
- package/dist/assets/index.d.ts +1 -1
- package/dist/assets/materialize.d.ts +153 -0
- package/dist/assets/materialize.js +402 -0
- package/dist/assets/store-local.d.ts +19 -5
- package/dist/assets/store-local.js +69 -10
- package/dist/assets/store-s3.d.ts +38 -7
- package/dist/assets/store-s3.js +128 -22
- package/dist/assets/transform-directives.d.ts +52 -13
- package/dist/assets/transform-directives.js +87 -27
- package/dist/assets/transform.d.ts +3 -3
- package/dist/assets/transform.js +13 -8
- package/dist/assets/types.d.ts +31 -4
- package/dist/auth/cache.d.ts +1 -1
- package/dist/auth/cache.js +1 -1
- package/dist/auth/caching-auth-plugin.d.ts +2 -0
- package/dist/auth/caching-auth-plugin.js +12 -2
- package/dist/auth/file-based-auth-cache.d.ts +8 -0
- package/dist/auth/file-based-auth-cache.js +18 -8
- package/dist/auth/person-name.d.ts +5 -0
- package/dist/auth/person-name.js +8 -0
- package/dist/auth/plugin.d.ts +10 -1
- package/dist/auth/types.d.ts +2 -0
- package/dist/auth/user-metadata-lookup.d.ts +21 -0
- package/dist/auth/user-metadata-lookup.js +116 -0
- package/dist/authorization/branch.d.ts +1 -1
- package/dist/authorization/branch.js +12 -13
- package/dist/authorization/groups/schema.d.ts +4 -4
- package/dist/authorization/helpers.d.ts +8 -0
- package/dist/authorization/helpers.js +8 -0
- package/dist/authorization/index.d.ts +1 -1
- package/dist/authorization/index.js +1 -1
- package/dist/authorization/protected-branch.d.ts +5 -4
- package/dist/authorization/protected-branch.js +7 -5
- package/dist/branch-health.d.ts +35 -8
- package/dist/branch-health.js +54 -18
- package/dist/branch-metadata-error.d.ts +27 -0
- package/dist/branch-metadata-error.js +23 -0
- package/dist/branch-metadata-file.d.ts +205 -24
- package/dist/branch-metadata-file.js +126 -25
- package/dist/branch-metadata.d.ts +45 -6
- package/dist/branch-metadata.js +142 -50
- package/dist/branch-provisioning.d.ts +167 -0
- package/dist/branch-provisioning.js +501 -0
- package/dist/branch-registry.d.ts +8 -0
- package/dist/branch-registry.js +61 -9
- package/dist/branch-schema-cache.d.ts +29 -12
- package/dist/branch-schema-cache.js +64 -21
- package/dist/branch-sparse.d.ts +23 -0
- package/dist/branch-sparse.js +118 -0
- package/dist/branch-workspace.d.ts +42 -3
- package/dist/branch-workspace.js +239 -100
- package/dist/build/asset-refs.d.ts +94 -0
- package/dist/build/asset-refs.js +267 -0
- package/dist/build/generate-ai-content.js +5 -0
- package/dist/build/inline-flight.d.ts +37 -0
- package/dist/build/inline-flight.js +142 -0
- package/dist/cli/asset-refs.d.ts +52 -0
- package/dist/cli/asset-refs.js +194 -0
- package/dist/cli/cli.d.ts +15 -1
- package/dist/cli/cli.js +8543 -3193
- package/dist/cli/configured-asset-store.d.ts +12 -0
- package/dist/cli/configured-asset-store.js +46 -0
- package/dist/cli/generate-ai-content.js +4244 -1072
- package/dist/cli/init.js +217 -126
- package/dist/cli/project-detect.d.ts +2 -0
- package/dist/cli/project-detect.js +2 -0
- package/dist/cli/template-files/Dockerfile.cms.template +13 -5
- package/dist/cli/template-files/cms-stack.ts.template +16 -13
- package/dist/client.d.ts +1 -2
- package/dist/client.js +1 -2
- package/dist/comment-store.d.ts +25 -0
- package/dist/comment-store.js +43 -8
- package/dist/config/flatten.js +2 -0
- package/dist/config/helpers.js +2 -2
- package/dist/config/index.d.ts +1 -1
- package/dist/config/schemas/config.d.ts +12 -29
- package/dist/config/schemas/config.js +9 -12
- package/dist/config/schemas/field.d.ts +3 -0
- package/dist/config/schemas/field.js +58 -4
- package/dist/config/schemas/media.d.ts +4 -13
- package/dist/config/schemas/media.js +5 -8
- package/dist/config/schemas/url.d.ts +2 -20
- package/dist/config/schemas/url.js +2 -25
- package/dist/config/types.d.ts +116 -22
- package/dist/config/types.js +3 -9
- package/dist/config/validation.d.ts +25 -4
- package/dist/config/validation.js +116 -3
- package/dist/content-id-index.js +2 -2
- package/dist/content-index-generation.d.ts +1 -1
- package/dist/content-index-generation.js +1 -1
- package/dist/content-listing.d.ts +10 -1
- package/dist/content-listing.js +22 -5
- package/dist/content-reader.d.ts +9 -0
- package/dist/content-reader.js +16 -11
- package/dist/content-store.d.ts +75 -12
- package/dist/content-store.js +249 -86
- package/dist/content-tree.js +2 -2
- package/dist/context.js +5 -2
- package/dist/dangling-reference-log.d.ts +17 -0
- package/dist/dangling-reference-log.js +29 -0
- package/dist/dev-content-watcher.d.ts +1 -1
- package/dist/dev-content-watcher.js +1 -1
- package/dist/editor/BranchManager.d.ts +23 -7
- package/dist/editor/BranchManager.js +119 -54
- package/dist/editor/CanopyEditor.d.ts +1 -1
- package/dist/editor/CanopyEditor.js +1 -2
- package/dist/editor/CommentsPanel.d.ts +14 -0
- package/dist/editor/CommentsPanel.js +68 -43
- package/dist/editor/Editor.d.ts +11 -5
- package/dist/editor/Editor.js +891 -218
- package/dist/editor/EditorAuthGate.d.ts +7 -1
- package/dist/editor/EditorAuthGate.js +41 -9
- package/dist/editor/EntryNavigator.d.ts +22 -0
- package/dist/editor/EntryNavigator.js +353 -105
- package/dist/editor/FormHeader.d.ts +25 -0
- package/dist/editor/FormHeader.js +82 -0
- package/dist/editor/FormRenderer.d.ts +27 -3
- package/dist/editor/FormRenderer.js +171 -76
- package/dist/editor/PreviewFrame.d.ts +40 -0
- package/dist/editor/PreviewFrame.js +215 -0
- package/dist/editor/PreviewPane.d.ts +47 -0
- package/dist/editor/PreviewPane.js +147 -0
- package/dist/editor/PreviewToolbarTools.d.ts +22 -0
- package/dist/editor/PreviewToolbarTools.js +73 -0
- package/dist/editor/admin/SystemHealthPanel.d.ts +2 -1
- package/dist/editor/admin/SystemHealthPanel.js +163 -33
- package/dist/editor/admin/useSystemHealth.d.ts +18 -0
- package/dist/editor/admin/useSystemHealth.js +70 -1
- package/dist/editor/branch-status.d.ts +17 -0
- package/dist/editor/branch-status.js +29 -0
- package/dist/editor/canopy-path.d.ts +9 -6
- package/dist/editor/canopy-path.js +8 -11
- package/dist/editor/client-reference-resolver.d.ts +43 -16
- package/dist/editor/client-reference-resolver.js +155 -64
- package/dist/editor/comments/BranchComments.d.ts +1 -1
- package/dist/editor/comments/BranchComments.js +2 -2
- package/dist/editor/comments/CloseRefusedNotice.d.ts +4 -0
- package/dist/editor/comments/CloseRefusedNotice.js +7 -0
- package/dist/editor/comments/CommentThreadsPopover.d.ts +47 -0
- package/dist/editor/comments/CommentThreadsPopover.js +274 -0
- package/dist/editor/comments/CommentWriteAlert.d.ts +11 -0
- package/dist/editor/comments/CommentWriteAlert.js +13 -0
- package/dist/editor/comments/EntryComments.d.ts +10 -4
- package/dist/editor/comments/EntryComments.js +14 -17
- package/dist/editor/comments/FieldWrapper.d.ts +18 -4
- package/dist/editor/comments/FieldWrapper.js +62 -28
- package/dist/editor/comments/InlineCommentThread.d.ts +9 -2
- package/dist/editor/comments/InlineCommentThread.js +11 -47
- package/dist/editor/comments/ThreadCarousel.d.ts +1 -1
- package/dist/editor/comments/ThreadCarousel.js +18 -21
- package/dist/editor/comments/ThreadReplyControls.d.ts +28 -0
- package/dist/editor/comments/ThreadReplyControls.js +92 -0
- package/dist/editor/comments/field-comment-context.d.ts +14 -0
- package/dist/editor/comments/field-comment-context.js +14 -0
- package/dist/editor/comments/form-comments.d.ts +48 -0
- package/dist/editor/comments/form-comments.js +178 -0
- package/dist/editor/comments/item-anchor-copy.d.ts +6 -0
- package/dist/editor/comments/item-anchor-copy.js +6 -0
- package/dist/editor/comments/move-focus-if-unmoved.d.ts +6 -0
- package/dist/editor/comments/move-focus-if-unmoved.js +11 -0
- package/dist/editor/comments/popover-placement.d.ts +18 -0
- package/dist/editor/comments/popover-placement.js +58 -0
- package/dist/editor/comments/use-tracked-writes.d.ts +16 -0
- package/dist/editor/comments/use-tracked-writes.js +53 -0
- package/dist/editor/components/BranchAccessList.d.ts +15 -0
- package/dist/editor/components/BranchAccessList.js +52 -0
- package/dist/editor/components/BranchLockBanner.d.ts +22 -0
- package/dist/editor/components/BranchLockBanner.js +39 -0
- package/dist/editor/components/BranchPill.d.ts +32 -0
- package/dist/editor/components/BranchPill.js +33 -0
- package/dist/editor/components/BranchesDrawer.d.ts +11 -0
- package/dist/editor/components/BranchesDrawer.js +5 -0
- package/dist/editor/components/ConfirmDeleteModal.d.ts +6 -1
- package/dist/editor/components/ConfirmDeleteModal.js +3 -2
- package/dist/editor/components/DestructiveMenuItem.d.ts +7 -0
- package/dist/editor/components/DestructiveMenuItem.js +8 -0
- package/dist/editor/components/EditorCrashScreen.d.ts +17 -0
- package/dist/editor/components/EditorCrashScreen.js +22 -0
- package/dist/editor/components/EditorErrorBoundary.d.ts +38 -0
- package/dist/editor/components/EditorErrorBoundary.js +40 -0
- package/dist/editor/components/EditorHeader.d.ts +56 -106
- package/dist/editor/components/EditorHeader.js +130 -131
- package/dist/editor/components/EditorRail.d.ts +49 -0
- package/dist/editor/components/EditorRail.js +65 -0
- package/dist/editor/components/EntryBreadcrumb.d.ts +33 -0
- package/dist/editor/components/EntryBreadcrumb.js +56 -0
- package/dist/editor/components/EntryCreateModal.d.ts +12 -7
- package/dist/editor/components/EntryCreateModal.js +51 -57
- package/dist/editor/components/NoEditPermissionNotice.d.ts +6 -5
- package/dist/editor/components/NoEditPermissionNotice.js +5 -4
- package/dist/editor/components/QuickOpenPalette.d.ts +22 -0
- package/dist/editor/components/QuickOpenPalette.js +66 -0
- package/dist/editor/components/ReadOnlyDraftNotice.d.ts +11 -0
- package/dist/editor/components/ReadOnlyDraftNotice.js +12 -0
- package/dist/editor/components/ReasonedMenuItem.d.ts +15 -0
- package/dist/editor/components/ReasonedMenuItem.js +15 -0
- package/dist/editor/components/ReferencedByList.d.ts +11 -0
- package/dist/editor/components/ReferencedByList.js +28 -0
- package/dist/editor/components/RelativeTime.d.ts +10 -0
- package/dist/editor/components/RelativeTime.js +10 -0
- package/dist/editor/components/RenameEntryModal.d.ts +9 -1
- package/dist/editor/components/RenameEntryModal.js +19 -31
- package/dist/editor/components/RetryToastMessage.d.ts +9 -0
- package/dist/editor/components/RetryToastMessage.js +6 -0
- package/dist/editor/components/SaveAllResult.d.ts +25 -0
- package/dist/editor/components/SaveAllResult.js +86 -0
- package/dist/editor/components/SaveSplitButton.d.ts +30 -0
- package/dist/editor/components/SaveSplitButton.js +108 -0
- package/dist/editor/components/StagedChangesDrawer.d.ts +39 -0
- package/dist/editor/components/StagedChangesDrawer.js +92 -0
- package/dist/editor/components/UnavailableEntryNotice.d.ts +6 -0
- package/dist/editor/components/UnavailableEntryNotice.js +9 -0
- package/dist/editor/components/UnavailableTypeMessage.d.ts +6 -0
- package/dist/editor/components/UnavailableTypeMessage.js +9 -0
- package/dist/editor/components/UndoToastMessage.d.ts +18 -0
- package/dist/editor/components/UndoToastMessage.js +10 -0
- package/dist/editor/components/UserBadge.d.ts +2 -5
- package/dist/editor/components/UserBadge.js +62 -33
- package/dist/editor/components/ValidationSummary.d.ts +14 -0
- package/dist/editor/components/ValidationSummary.js +24 -0
- package/dist/editor/components/index.d.ts +2 -2
- package/dist/editor/components/index.js +2 -2
- package/dist/editor/context/ApiClientContext.d.ts +8 -2
- package/dist/editor/context/ApiClientContext.js +19 -8
- package/dist/editor/context/AssetContext.d.ts +13 -35
- package/dist/editor/context/AssetContext.js +12 -31
- package/dist/editor/context/EditorStateContext.d.ts +4 -4
- package/dist/editor/context/EditorStateContext.js +4 -4
- package/dist/editor/context/SWRProvider.d.ts +3 -3
- package/dist/editor/context/SiteMdxAllowContext.d.ts +4 -0
- package/dist/editor/context/SiteMdxAllowContext.js +7 -0
- package/dist/editor/context/index.d.ts +2 -1
- package/dist/editor/context/index.js +2 -1
- package/dist/editor/contrast.d.ts +19 -0
- package/dist/editor/contrast.js +41 -0
- package/dist/editor/copy.d.ts +18 -0
- package/dist/editor/copy.js +18 -0
- package/dist/editor/editor-config.js +16 -0
- package/dist/editor/editor-utils.d.ts +34 -8
- package/dist/editor/editor-utils.js +42 -20
- package/dist/editor/entry-search.d.ts +20 -0
- package/dist/editor/entry-search.js +34 -0
- package/dist/editor/field-breadcrumb.d.ts +12 -0
- package/dist/editor/field-breadcrumb.js +85 -0
- package/dist/editor/field-props.d.ts +86 -0
- package/dist/editor/field-props.js +27 -0
- package/dist/editor/field-target.d.ts +30 -0
- package/dist/editor/field-target.js +77 -0
- package/dist/editor/fields/BlockField.d.ts +12 -0
- package/dist/editor/fields/BlockField.js +89 -73
- package/dist/editor/fields/CodeField.d.ts +2 -0
- package/dist/editor/fields/CodeField.js +6 -2
- package/dist/editor/fields/DateTimeField.d.ts +4 -29
- package/dist/editor/fields/DateTimeField.js +79 -41
- package/dist/editor/fields/ExpandAllButton.d.ts +6 -0
- package/dist/editor/fields/ExpandAllButton.js +4 -0
- package/dist/editor/fields/FieldCrashFallback.d.ts +17 -0
- package/dist/editor/fields/FieldCrashFallback.js +30 -0
- package/dist/editor/fields/FieldLabel.d.ts +37 -0
- package/dist/editor/fields/FieldLabel.js +19 -0
- package/dist/editor/fields/ImageField.d.ts +4 -0
- package/dist/editor/fields/ImageField.js +29 -14
- package/dist/editor/fields/InlineGroupField.js +4 -3
- package/dist/editor/fields/ItemList.d.ts +42 -0
- package/dist/editor/fields/ItemList.js +130 -0
- package/dist/editor/fields/MarkdownField.d.ts +32 -0
- package/dist/editor/fields/MarkdownField.js +223 -46
- package/dist/editor/fields/MdxImageDialog.js +1 -1
- package/dist/editor/fields/NumberField.d.ts +2 -0
- package/dist/editor/fields/NumberField.js +8 -5
- package/dist/editor/fields/NumberListField.d.ts +2 -0
- package/dist/editor/fields/NumberListField.js +19 -16
- package/dist/editor/fields/ObjectField.d.ts +2 -7
- package/dist/editor/fields/ObjectField.js +15 -5
- package/dist/editor/fields/ObjectListField.d.ts +29 -0
- package/dist/editor/fields/ObjectListField.js +57 -0
- package/dist/editor/fields/ReferenceField.d.ts +2 -0
- package/dist/editor/fields/ReferenceField.js +34 -9
- package/dist/editor/fields/SelectField.d.ts +2 -0
- package/dist/editor/fields/SelectField.js +11 -2
- package/dist/editor/fields/StringListField.d.ts +4 -1
- package/dist/editor/fields/StringListField.js +22 -8
- package/dist/editor/fields/TextField.d.ts +2 -0
- package/dist/editor/fields/TextField.js +6 -2
- package/dist/editor/fields/ToggleField.d.ts +2 -0
- package/dist/editor/fields/ToggleField.js +8 -3
- package/dist/editor/fields/entry-link/InsertEntryLink.d.ts +1 -1
- package/dist/editor/fields/entry-link/InsertEntryLink.js +1 -1
- package/dist/editor/fields/form-expansion.d.ts +9 -0
- package/dist/editor/fields/form-expansion.js +2 -0
- package/dist/editor/fields/item-expansion.d.ts +15 -0
- package/dist/editor/fields/item-expansion.js +60 -0
- package/dist/editor/fields/list-item-keys.d.ts +8 -0
- package/dist/editor/fields/list-item-keys.js +50 -0
- package/dist/editor/fields/list-item-title.d.ts +20 -0
- package/dist/editor/fields/list-item-title.js +85 -0
- package/dist/editor/fields/markdown-export-options.d.ts +2 -0
- package/dist/editor/fields/markdown-export-options.js +8 -0
- package/dist/editor/fields/markdown-fidelity-visitors.d.ts +11 -0
- package/dist/editor/fields/markdown-fidelity-visitors.js +160 -0
- package/dist/editor/fields/mdx-jsx-support.d.ts +5 -1
- package/dist/editor/fields/mdx-jsx-support.js +157 -69
- package/dist/editor/fields/rich-text-failures.d.ts +5 -0
- package/dist/editor/fields/rich-text-failures.js +26 -0
- package/dist/editor/fields/toolbar-wrap.d.ts +7 -0
- package/dist/editor/fields/toolbar-wrap.js +35 -0
- package/dist/editor/form-outline.d.ts +13 -0
- package/dist/editor/form-outline.js +70 -0
- package/dist/editor/group-manager/GroupCard.d.ts +4 -1
- package/dist/editor/group-manager/GroupCard.js +12 -3
- package/dist/editor/group-manager/GroupForm.js +1 -1
- package/dist/editor/group-manager/InternalGroupsTab.d.ts +2 -1
- package/dist/editor/group-manager/InternalGroupsTab.js +4 -4
- package/dist/editor/group-manager/MemberList.d.ts +2 -1
- package/dist/editor/group-manager/MemberList.js +15 -4
- package/dist/editor/group-manager/hooks/useGroupState.d.ts +5 -0
- package/dist/editor/group-manager/hooks/useGroupState.js +30 -7
- package/dist/editor/group-manager/index.js +34 -5
- package/dist/editor/group-manager/types.d.ts +5 -2
- package/dist/editor/hooks/create-branch-request.d.ts +20 -0
- package/dist/editor/hooks/create-branch-request.js +54 -0
- package/dist/editor/hooks/save-all.d.ts +68 -0
- package/dist/editor/hooks/save-all.js +61 -0
- package/dist/editor/hooks/useBranchActions.d.ts +11 -1
- package/dist/editor/hooks/useBranchActions.js +42 -19
- package/dist/editor/hooks/useBranchManager.d.ts +21 -0
- package/dist/editor/hooks/useBranchManager.js +321 -125
- package/dist/editor/hooks/useBranchesData.d.ts +8 -4
- package/dist/editor/hooks/useBranchesData.js +9 -5
- package/dist/editor/hooks/useCommentSystem.d.ts +14 -2
- package/dist/editor/hooks/useCommentSystem.js +79 -55
- package/dist/editor/hooks/useCommentsData.d.ts +11 -7
- package/dist/editor/hooks/useCommentsData.js +20 -19
- package/dist/editor/hooks/useDraftManager.d.ts +77 -3
- package/dist/editor/hooks/useDraftManager.js +887 -94
- package/dist/editor/hooks/useEditorLayout.d.ts +53 -7
- package/dist/editor/hooks/useEditorLayout.js +98 -20
- package/dist/editor/hooks/useEntriesData.d.ts +2 -1
- package/dist/editor/hooks/useEntriesData.js +18 -4
- package/dist/editor/hooks/useEntryManager.d.ts +41 -2
- package/dist/editor/hooks/useEntryManager.js +227 -41
- package/dist/editor/hooks/useGroupManager.js +13 -16
- package/dist/editor/hooks/usePermissionManager.js +14 -6
- package/dist/editor/hooks/usePreviewMarks.d.ts +21 -0
- package/dist/editor/hooks/usePreviewMarks.js +33 -0
- package/dist/editor/hooks/useReferenceResolution.d.ts +10 -3
- package/dist/editor/hooks/useReferenceResolution.js +34 -177
- package/dist/editor/hooks/useSchemaManager.d.ts +25 -6
- package/dist/editor/hooks/useSchemaManager.js +97 -39
- package/dist/editor/hooks/useUserMetadata.d.ts +14 -4
- package/dist/editor/hooks/useUserMetadata.js +76 -47
- package/dist/editor/hooks/user-metadata-batcher.d.ts +8 -0
- package/dist/editor/hooks/user-metadata-batcher.js +33 -0
- package/dist/editor/media/AssetCard.d.ts +6 -7
- package/dist/editor/media/AssetCard.js +24 -31
- package/dist/editor/media/AssetListRow.d.ts +16 -0
- package/dist/editor/media/AssetListRow.js +41 -0
- package/dist/editor/media/CropStep.js +6 -1
- package/dist/editor/media/MediaLibrary.d.ts +4 -3
- package/dist/editor/media/MediaLibrary.js +11 -4
- package/dist/editor/media/MediaLibraryBody.d.ts +3 -3
- package/dist/editor/media/MediaLibraryBody.js +195 -80
- package/dist/editor/media/MediaLibrarySkeleton.d.ts +6 -0
- package/dist/editor/media/MediaLibrarySkeleton.js +14 -0
- package/dist/editor/media/crop-math.d.ts +3 -4
- package/dist/editor/media/crop-math.js +11 -22
- package/dist/editor/media/editor-image-src.d.ts +8 -0
- package/dist/editor/media/editor-image-src.js +10 -0
- package/dist/editor/media/format-bytes.d.ts +2 -0
- package/dist/editor/media/format-bytes.js +23 -0
- package/dist/editor/media/media-library-prefs.d.ts +23 -0
- package/dist/editor/media/media-library-prefs.js +49 -0
- package/dist/editor/media/media-library-view.d.ts +34 -0
- package/dist/editor/media/media-library-view.js +40 -0
- package/dist/editor/media/useAssetLibrary.d.ts +30 -0
- package/dist/editor/media/useAssetLibrary.js +126 -0
- package/dist/editor/media/useStableAssetOrder.d.ts +11 -0
- package/dist/editor/media/useStableAssetOrder.js +37 -0
- package/dist/editor/media/useThumbnailFailure.d.ts +6 -0
- package/dist/editor/media/useThumbnailFailure.js +16 -0
- package/dist/editor/permission-manager/GroupSelector.js +2 -2
- package/dist/editor/permission-manager/PermissionEditor.d.ts +1 -1
- package/dist/editor/permission-manager/PermissionEditor.js +15 -4
- package/dist/editor/permission-manager/PermissionLevelBadge.js +1 -1
- package/dist/editor/permission-manager/PermissionTree.d.ts +1 -1
- package/dist/editor/permission-manager/UserSelector.d.ts +1 -1
- package/dist/editor/permission-manager/UserSelector.js +3 -3
- package/dist/editor/permission-manager/index.js +12 -3
- package/dist/editor/permission-manager/types.d.ts +5 -2
- package/dist/editor/platform.d.ts +3 -0
- package/dist/editor/platform.js +9 -0
- package/dist/editor/preview-asset-base.d.ts +9 -0
- package/dist/editor/preview-asset-base.js +17 -0
- package/dist/editor/preview-bridge.d.ts +51 -27
- package/dist/editor/preview-bridge.js +103 -144
- package/dist/editor/preview-marks.d.ts +15 -0
- package/dist/editor/preview-marks.js +74 -0
- package/dist/editor/preview-path.d.ts +12 -0
- package/dist/editor/preview-path.js +45 -1
- package/dist/editor/preview-scale.d.ts +27 -0
- package/dist/editor/preview-scale.js +34 -0
- package/dist/editor/raw-asset-base.d.ts +5 -0
- package/dist/editor/raw-asset-base.js +14 -0
- package/dist/editor/relative-time.d.ts +4 -4
- package/dist/editor/relative-time.js +16 -8
- package/dist/editor/schema-editor/CollectionEditor.d.ts +20 -3
- package/dist/editor/schema-editor/CollectionEditor.js +361 -62
- package/dist/editor/schema-editor/EntryTypeEditor.d.ts +5 -1
- package/dist/editor/schema-editor/EntryTypeEditor.js +11 -6
- package/dist/editor/schema-editor/collection-draft.d.ts +22 -0
- package/dist/editor/schema-editor/collection-draft.js +40 -0
- package/dist/editor/schema-editor/index.d.ts +1 -1
- package/dist/editor/schema-label.d.ts +10 -0
- package/dist/editor/schema-label.js +17 -0
- package/dist/editor/settings-conflict.d.ts +5 -0
- package/dist/editor/settings-conflict.js +8 -0
- package/dist/editor/shell/ActivityRail.d.ts +37 -0
- package/dist/editor/shell/ActivityRail.js +91 -0
- package/dist/editor/shell/EditorShell.d.ts +17 -0
- package/dist/editor/shell/EditorShell.js +31 -0
- package/dist/editor/shell/PaneLayout.d.ts +28 -0
- package/dist/editor/shell/PaneLayout.js +116 -0
- package/dist/editor/shell/SidePanelHost.d.ts +35 -0
- package/dist/editor/shell/SidePanelHost.js +184 -0
- package/dist/editor/shell/TopBar.d.ts +12 -0
- package/dist/editor/shell/TopBar.js +14 -0
- package/dist/editor/shell/host-chrome.d.ts +16 -0
- package/dist/editor/shell/host-chrome.js +69 -0
- package/dist/editor/slug.d.ts +16 -0
- package/dist/editor/slug.js +43 -0
- package/dist/editor/theme.d.ts +2 -1
- package/dist/editor/theme.js +314 -13
- package/dist/editor/unanswered.d.ts +17 -0
- package/dist/editor/unanswered.js +26 -0
- package/dist/editor/unavailable-entry-type.d.ts +20 -0
- package/dist/editor/unavailable-entry-type.js +28 -0
- package/dist/editor/undo-removal.d.ts +57 -0
- package/dist/editor/undo-removal.js +163 -0
- package/dist/editor/user-display.d.ts +4 -0
- package/dist/editor/user-display.js +5 -0
- package/dist/editor/utils/confirm-modal.d.ts +8 -0
- package/dist/editor/utils/confirm-modal.js +12 -0
- package/dist/editor/utils/editor-errors.d.ts +19 -0
- package/dist/editor/utils/editor-errors.js +32 -0
- package/dist/editor/utils/focus-return.d.ts +56 -0
- package/dist/editor/utils/focus-return.js +106 -0
- package/dist/entry-link-resolver.d.ts +11 -1
- package/dist/entry-link-resolver.js +65 -5
- package/dist/entry-schema-registry.d.ts +3 -3
- package/dist/entry-schema-registry.js +7 -4
- package/dist/entry-schema.d.ts +49 -3
- package/dist/entry-schema.js +18 -0
- package/dist/git-manager.d.ts +172 -10
- package/dist/git-manager.js +449 -107
- package/dist/github-service.d.ts +39 -2
- package/dist/github-service.js +101 -7
- package/dist/http/handler.js +74 -9
- package/dist/http/types.d.ts +2 -0
- package/dist/http/worker-not-ready.d.ts +9 -4
- package/dist/http/worker-not-ready.js +59 -6
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/item-keys.d.ts +46 -0
- package/dist/item-keys.js +235 -0
- package/dist/operating-mode/editor-mode-check.d.ts +15 -0
- package/dist/operating-mode/editor-mode-check.js +24 -0
- package/dist/operating-mode/mode-env.d.ts +13 -14
- package/dist/operating-mode/mode-env.js +13 -14
- package/dist/operating-mode/types.d.ts +2 -2
- package/dist/paths/branch.d.ts +0 -1
- package/dist/paths/branch.js +1 -8
- package/dist/paths/index.d.ts +1 -1
- package/dist/paths/index.js +1 -1
- package/dist/paths/validation.js +0 -2
- package/dist/preview.d.ts +8 -0
- package/dist/preview.js +7 -0
- package/dist/reference-resolver.js +1 -0
- package/dist/resolve-canopy-user.d.ts +1 -1
- package/dist/resolve-canopy-user.js +1 -1
- package/dist/schema/meta-loader.d.ts +18 -8
- package/dist/schema/meta-loader.js +42 -9
- package/dist/schema/registry-fingerprint.d.ts +14 -0
- package/dist/schema/registry-fingerprint.js +63 -0
- package/dist/schema/resolver.d.ts +7 -4
- package/dist/schema/resolver.js +7 -6
- package/dist/schema/schema-store.d.ts +7 -10
- package/dist/schema/schema-store.js +13 -11
- package/dist/schema/schema-unavailable-error.d.ts +11 -0
- package/dist/schema/schema-unavailable-error.js +15 -0
- package/dist/schema/types.d.ts +22 -0
- package/dist/schema-registry-record.d.ts +35 -0
- package/dist/schema-registry-record.js +134 -0
- package/dist/server.d.ts +79 -9
- package/dist/server.js +62 -8
- package/dist/services.d.ts +33 -5
- package/dist/services.js +155 -37
- package/dist/settings-workspace.d.ts +23 -3
- package/dist/settings-workspace.js +159 -45
- package/dist/stamp-on-publish.d.ts +36 -0
- package/dist/stamp-on-publish.js +71 -0
- package/dist/static/index.d.ts +58 -5
- package/dist/static/index.js +133 -3
- package/dist/static/seo.d.ts +5 -5
- package/dist/static/seo.js +5 -5
- package/dist/submission-attribution.d.ts +8 -0
- package/dist/submission-attribution.js +22 -0
- package/dist/system-users.d.ts +12 -0
- package/dist/system-users.js +12 -0
- package/dist/task-queue/cms-task-queue.d.ts +1 -1
- package/dist/task-queue/cms-task-queue.js +1 -1
- package/dist/task-queue/index.d.ts +1 -1
- package/dist/task-queue/index.js +1 -1
- package/dist/task-queue/task-queue.d.ts +6 -0
- package/dist/task-queue/task-queue.js +29 -0
- package/dist/task-queue/worker-status.d.ts +35 -9
- package/dist/task-queue/worker-status.js +84 -17
- package/dist/types.d.ts +90 -9
- package/dist/url-collision.js +3 -3
- package/dist/url-exclusivity-fixtures.d.ts +8 -1
- package/dist/url-exclusivity-fixtures.js +11 -1
- package/dist/user.js +2 -1
- package/dist/utils/atomic-write.js +2 -1
- package/dist/utils/base-branch.d.ts +13 -0
- package/dist/utils/base-branch.js +23 -0
- package/dist/utils/content-serialize.d.ts +15 -7
- package/dist/utils/content-serialize.js +353 -51
- package/dist/utils/content-write-lock.d.ts +6 -1
- package/dist/utils/content-write-lock.js +21 -6
- package/dist/utils/debug.d.ts +1 -1
- package/dist/utils/debug.js +5 -3
- package/dist/utils/error.js +13 -2
- package/dist/utils/escape-text.d.ts +7 -0
- package/dist/utils/escape-text.js +27 -0
- package/dist/utils/fs.d.ts +12 -4
- package/dist/utils/fs.js +18 -5
- package/dist/utils/git.d.ts +21 -1
- package/dist/utils/git.js +63 -8
- package/dist/utils/json-source-splice.d.ts +14 -0
- package/dist/utils/json-source-splice.js +120 -0
- package/dist/utils/markdown-body-splice.d.ts +39 -0
- package/dist/utils/markdown-body-splice.js +421 -0
- package/dist/utils/occ-json-write.js +18 -12
- package/dist/utils/provision-log.d.ts +25 -0
- package/dist/utils/provision-log.js +49 -0
- package/dist/utils/provisioning-lock.d.ts +32 -1
- package/dist/utils/provisioning-lock.js +78 -32
- package/dist/utils/sanitize-href.d.ts +9 -23
- package/dist/utils/sanitize-href.js +14 -28
- package/dist/utils/title-field.d.ts +10 -0
- package/dist/utils/title-field.js +47 -0
- package/dist/utils/yaml-source-splice.d.ts +58 -0
- package/dist/utils/yaml-source-splice.js +515 -0
- package/dist/validation/block-structural-keys.d.ts +1 -1
- package/dist/validation/block-structural-keys.js +1 -1
- package/dist/validation/deletion-checker.d.ts +21 -29
- package/dist/validation/deletion-checker.js +41 -117
- package/dist/validation/entry-validator.d.ts +6 -10
- package/dist/validation/entry-validator.js +19 -26
- package/dist/validation/field-traversal.d.ts +22 -0
- package/dist/validation/field-traversal.js +39 -8
- package/dist/validation/markdown-safety.d.ts +68 -0
- package/dist/validation/markdown-safety.js +596 -0
- package/dist/validation/mdx-allowlist.d.ts +55 -0
- package/dist/validation/mdx-allowlist.js +183 -0
- package/dist/validation/reference-validator.d.ts +2 -0
- package/dist/validation/reference-validator.js +3 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/worker/branch-policy.d.ts +124 -0
- package/dist/worker/branch-policy.js +243 -0
- package/dist/worker/bundle-header.d.ts +117 -0
- package/dist/worker/bundle-header.js +253 -0
- package/dist/worker/cms-worker.d.ts +236 -142
- package/dist/worker/cms-worker.js +772 -285
- package/dist/worker/gateway-egress.d.ts +43 -0
- package/dist/worker/gateway-egress.js +209 -0
- package/dist/worker/gateway-instance.d.ts +42 -0
- package/dist/worker/gateway-instance.js +129 -0
- package/dist/worker/git-process.d.ts +81 -0
- package/dist/worker/git-process.js +234 -0
- package/dist/worker/git-sync.d.ts +34 -17
- package/dist/worker/git-sync.js +394 -131
- package/dist/worker/github-auth.d.ts +9 -9
- package/dist/worker/github-auth.js +13 -15
- package/dist/worker/github-gateway-http.d.ts +62 -0
- package/dist/worker/github-gateway-http.js +977 -0
- package/dist/worker/github-gateway-wire.d.ts +590 -0
- package/dist/worker/github-gateway-wire.js +488 -0
- package/dist/worker/github-gateway.d.ts +238 -0
- package/dist/worker/github-gateway.js +726 -0
- package/dist/worker/github-mirror-upkeep.d.ts +75 -0
- package/dist/worker/github-mirror-upkeep.js +266 -0
- package/dist/worker/github-mirror.d.ts +364 -0
- package/dist/worker/github-mirror.js +1030 -0
- package/dist/worker/github-transfer.d.ts +56 -0
- package/dist/worker/github-transfer.js +444 -0
- package/dist/worker/history-rewrite.d.ts +4 -5
- package/dist/worker/history-rewrite.js +12 -17
- package/dist/worker/provisioned-workspace.d.ts +5 -5
- package/dist/worker/provisioned-workspace.js +5 -5
- package/dist/worker/rebase.d.ts +1 -1
- package/dist/worker/rebase.js +58 -54
- package/dist/worker/remote-git-maintenance.d.ts +3 -0
- package/dist/worker/remote-git-maintenance.js +12 -0
- package/dist/worker/schema-gate.d.ts +49 -0
- package/dist/worker/schema-gate.js +226 -0
- package/dist/worker/self-checks.d.ts +107 -0
- package/dist/worker/self-checks.js +358 -0
- package/dist/worker/shared-repo-git.d.ts +96 -0
- package/dist/worker/shared-repo-git.js +459 -0
- package/dist/worker/sparse-cone.d.ts +20 -0
- package/dist/worker/sparse-cone.js +136 -0
- package/dist/worker/stale-mirror.d.ts +82 -0
- package/dist/worker/stale-mirror.js +130 -0
- package/dist/worker/task-runner.d.ts +5 -3
- package/dist/worker/task-runner.js +287 -186
- package/dist/worker/worker-context.d.ts +36 -37
- package/package.json +35 -7
- package/dist/editor/EditorPanes.d.ts +0 -10
- package/dist/editor/EditorPanes.js +0 -98
- package/dist/editor/components/EditorFooter.d.ts +0 -11
- package/dist/editor/components/EditorFooter.js +0 -9
- package/dist/editor/components/EditorSidebar.d.ts +0 -67
- package/dist/editor/components/EditorSidebar.js +0 -22
|
@@ -1,13 +1,59 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type PaneArrangement } from '../shell/PaneLayout.js';
|
|
2
|
+
/** @internal The preview toolbar's width choice; see `preview-scale.ts`. */
|
|
3
|
+
export type PreviewWidth = 'fit' | 'desktop' | 'tablet' | 'mobile';
|
|
4
|
+
export declare const CONTENT_PANEL_WIDTH_MIN = 240;
|
|
5
|
+
export declare const CONTENT_PANEL_WIDTH_MAX = 400;
|
|
6
|
+
/** The persisted layout preferences: one JSON object under one storage key. */
|
|
7
|
+
interface EditorLayoutPrefs {
|
|
8
|
+
/** Unset until the user picks one, so it follows `defaultLayout`; JSON drops it while unset. */
|
|
9
|
+
layout?: PaneArrangement;
|
|
10
|
+
highlightEnabled: boolean;
|
|
11
|
+
sideSplitPercent: number;
|
|
12
|
+
stackedSplitPercent: number;
|
|
13
|
+
previewWidth: PreviewWidth;
|
|
14
|
+
contentPanelOpen: boolean;
|
|
15
|
+
contentPanelWidth: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* @internal Exported for tests. Module-level so its identity is stable: Mantine memoises its
|
|
19
|
+
* storage reader on the default value.
|
|
20
|
+
*/
|
|
21
|
+
export declare const DEFAULT_EDITOR_LAYOUT_PREFS: EditorLayoutPrefs;
|
|
22
|
+
/** One key per deployment prefix, so two editors on one origin keep separate preferences. */
|
|
23
|
+
export declare const editorLayoutStorageKey: (basePath?: string) => string;
|
|
24
|
+
/**
|
|
25
|
+
* @internal Exported for tests. Reads stored preferences, validating each field on its own: an invalid or missing field takes
|
|
26
|
+
* its default and the valid ones are kept. Mantine does not guard `deserialize`, so this never
|
|
27
|
+
* throws, whatever is under the key.
|
|
28
|
+
*/
|
|
29
|
+
export declare function parseEditorLayoutPrefs(raw: string | undefined): EditorLayoutPrefs;
|
|
30
|
+
export interface UseEditorLayoutOptions {
|
|
31
|
+
/** Where the preferences persist; defaults to `editorLayoutStorageKey()`. */
|
|
32
|
+
storageKey?: string;
|
|
33
|
+
/** The layout until the user picks one; defaults to side by side. */
|
|
34
|
+
defaultLayout?: PaneArrangement;
|
|
35
|
+
}
|
|
2
36
|
export interface UseEditorLayoutReturn {
|
|
3
|
-
|
|
4
|
-
|
|
37
|
+
/** The stored preferences have been read; until then every value is its default. */
|
|
38
|
+
loaded: boolean;
|
|
39
|
+
layout: PaneArrangement;
|
|
40
|
+
setLayout: (layout: PaneArrangement) => void;
|
|
5
41
|
highlightEnabled: boolean;
|
|
6
42
|
setHighlightEnabled: (enabled: boolean) => void;
|
|
7
|
-
|
|
8
|
-
|
|
43
|
+
sideSplitPercent: number;
|
|
44
|
+
stackedSplitPercent: number;
|
|
45
|
+
/** Stores the clamped primary-pane size for one layout; a non-finite percent is ignored. */
|
|
46
|
+
setSplitPercent: (layout: PaneArrangement, percent: number) => void;
|
|
47
|
+
previewWidth: PreviewWidth;
|
|
48
|
+
setPreviewWidth: (width: PreviewWidth) => void;
|
|
49
|
+
contentPanelOpen: boolean;
|
|
50
|
+
setContentPanelOpen: (open: boolean) => void;
|
|
51
|
+
contentPanelWidth: number;
|
|
52
|
+
setContentPanelWidth: (width: number) => void;
|
|
9
53
|
}
|
|
10
54
|
/**
|
|
11
|
-
*
|
|
55
|
+
* Editor layout preferences, persisted to localStorage (read after mount, so SSR renders the
|
|
56
|
+
* defaults; a throwing storage keeps them in memory).
|
|
12
57
|
*/
|
|
13
|
-
export declare function useEditorLayout(): UseEditorLayoutReturn;
|
|
58
|
+
export declare function useEditorLayout(options?: UseEditorLayoutOptions): UseEditorLayoutReturn;
|
|
59
|
+
export {};
|
|
@@ -1,28 +1,106 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
import { useLocalStorage, useMounted } from '@mantine/hooks';
|
|
3
|
+
import { DEFAULT_SIDE_SPLIT_PERCENT, DEFAULT_STACKED_SPLIT_PERCENT, SPLIT_PERCENT_MAX, SPLIT_PERCENT_MIN, } from '../shell/PaneLayout.js';
|
|
4
|
+
import { isPlainRecord } from '../../validation/field-traversal.js';
|
|
5
|
+
const PREVIEW_WIDTHS = ['fit', 'desktop', 'tablet', 'mobile'];
|
|
6
|
+
const PANE_LAYOUTS = ['side', 'stacked'];
|
|
7
|
+
export const CONTENT_PANEL_WIDTH_MIN = 240;
|
|
8
|
+
export const CONTENT_PANEL_WIDTH_MAX = 400;
|
|
2
9
|
/**
|
|
3
|
-
*
|
|
10
|
+
* @internal Exported for tests. Module-level so its identity is stable: Mantine memoises its
|
|
11
|
+
* storage reader on the default value.
|
|
4
12
|
*/
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
13
|
+
export const DEFAULT_EDITOR_LAYOUT_PREFS = {
|
|
14
|
+
highlightEnabled: false,
|
|
15
|
+
sideSplitPercent: DEFAULT_SIDE_SPLIT_PERCENT,
|
|
16
|
+
stackedSplitPercent: DEFAULT_STACKED_SPLIT_PERCENT,
|
|
17
|
+
previewWidth: 'fit',
|
|
18
|
+
contentPanelOpen: false,
|
|
19
|
+
contentPanelWidth: 280,
|
|
20
|
+
};
|
|
21
|
+
/** One key per deployment prefix, so two editors on one origin keep separate preferences. */
|
|
22
|
+
export const editorLayoutStorageKey = (basePath) => `canopycms:editor-layout:${basePath || '/'}`;
|
|
23
|
+
const clamp = (value, min, max) => Math.min(max, Math.max(min, value));
|
|
24
|
+
const clampSplitPercent = (percent) => clamp(percent, SPLIT_PERCENT_MIN, SPLIT_PERCENT_MAX);
|
|
25
|
+
const clampContentPanelWidth = (width) => clamp(width, CONTENT_PANEL_WIDTH_MIN, CONTENT_PANEL_WIDTH_MAX);
|
|
26
|
+
const oneOf = (options, value, fallback) => options.find((option) => option === value) ?? fallback;
|
|
27
|
+
const boolOr = (value, fallback) => typeof value === 'boolean' ? value : fallback;
|
|
28
|
+
const numberOr = (value, fallback, normalise) => typeof value === 'number' && Number.isFinite(value) ? normalise(value) : fallback;
|
|
29
|
+
/**
|
|
30
|
+
* @internal Exported for tests. Reads stored preferences, validating each field on its own: an invalid or missing field takes
|
|
31
|
+
* its default and the valid ones are kept. Mantine does not guard `deserialize`, so this never
|
|
32
|
+
* throws, whatever is under the key.
|
|
33
|
+
*/
|
|
34
|
+
export function parseEditorLayoutPrefs(raw) {
|
|
35
|
+
const defaults = DEFAULT_EDITOR_LAYOUT_PREFS;
|
|
36
|
+
if (!raw)
|
|
37
|
+
return defaults;
|
|
38
|
+
let parsed;
|
|
39
|
+
try {
|
|
40
|
+
parsed = JSON.parse(raw);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return defaults;
|
|
44
|
+
}
|
|
45
|
+
if (!isPlainRecord(parsed))
|
|
46
|
+
return defaults;
|
|
47
|
+
return {
|
|
48
|
+
layout: PANE_LAYOUTS.find((layout) => layout === parsed.layout),
|
|
49
|
+
highlightEnabled: boolOr(parsed.highlightEnabled, defaults.highlightEnabled),
|
|
50
|
+
sideSplitPercent: numberOr(parsed.sideSplitPercent, defaults.sideSplitPercent, clampSplitPercent),
|
|
51
|
+
stackedSplitPercent: numberOr(parsed.stackedSplitPercent, defaults.stackedSplitPercent, clampSplitPercent),
|
|
52
|
+
previewWidth: oneOf(PREVIEW_WIDTHS, parsed.previewWidth, defaults.previewWidth),
|
|
53
|
+
contentPanelOpen: boolOr(parsed.contentPanelOpen, defaults.contentPanelOpen),
|
|
54
|
+
contentPanelWidth: numberOr(parsed.contentPanelWidth, defaults.contentPanelWidth, clampContentPanelWidth),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Editor layout preferences, persisted to localStorage (read after mount, so SSR renders the
|
|
59
|
+
* defaults; a throwing storage keeps them in memory).
|
|
60
|
+
*/
|
|
61
|
+
export function useEditorLayout(options) {
|
|
62
|
+
const [prefs, setPrefs] = useLocalStorage({
|
|
63
|
+
key: options?.storageKey ?? editorLayoutStorageKey(),
|
|
64
|
+
defaultValue: DEFAULT_EDITOR_LAYOUT_PREFS,
|
|
65
|
+
deserialize: parseEditorLayoutPrefs,
|
|
66
|
+
// Each tab keeps its own layout; a change elsewhere reaches only tabs opened later.
|
|
67
|
+
sync: false,
|
|
68
|
+
});
|
|
69
|
+
// Mounted in the same effect pass as the storage read above, and after it, so the render that
|
|
70
|
+
// first sees `loaded` also sees the stored values.
|
|
71
|
+
const loaded = useMounted();
|
|
72
|
+
const setLayout = useCallback((layout) => setPrefs((prev) => ({ ...prev, layout })), [setPrefs]);
|
|
73
|
+
const setHighlightEnabled = useCallback((highlightEnabled) => setPrefs((prev) => ({ ...prev, highlightEnabled })), [setPrefs]);
|
|
74
|
+
const setSplitPercent = useCallback((layout, percent) => {
|
|
75
|
+
if (!Number.isFinite(percent))
|
|
76
|
+
return;
|
|
77
|
+
const clamped = clampSplitPercent(percent);
|
|
78
|
+
setPrefs((prev) => layout === 'side'
|
|
79
|
+
? { ...prev, sideSplitPercent: clamped }
|
|
80
|
+
: { ...prev, stackedSplitPercent: clamped });
|
|
81
|
+
}, [setPrefs]);
|
|
82
|
+
const setPreviewWidth = useCallback((previewWidth) => setPrefs((prev) => ({ ...prev, previewWidth })), [setPrefs]);
|
|
83
|
+
const setContentPanelOpen = useCallback((contentPanelOpen) => setPrefs((prev) => ({ ...prev, contentPanelOpen })), [setPrefs]);
|
|
84
|
+
const setContentPanelWidth = useCallback((width) => {
|
|
85
|
+
if (!Number.isFinite(width))
|
|
12
86
|
return;
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const observer = new ResizeObserver(updateHeight);
|
|
17
|
-
observer.observe(node);
|
|
18
|
-
return () => observer.disconnect();
|
|
19
|
-
}, []);
|
|
87
|
+
const contentPanelWidth = clampContentPanelWidth(width);
|
|
88
|
+
setPrefs((prev) => ({ ...prev, contentPanelWidth }));
|
|
89
|
+
}, [setPrefs]);
|
|
20
90
|
return {
|
|
21
|
-
|
|
91
|
+
loaded,
|
|
92
|
+
layout: prefs.layout ?? options?.defaultLayout ?? 'side',
|
|
22
93
|
setLayout,
|
|
23
|
-
highlightEnabled,
|
|
94
|
+
highlightEnabled: prefs.highlightEnabled,
|
|
24
95
|
setHighlightEnabled,
|
|
25
|
-
|
|
26
|
-
|
|
96
|
+
sideSplitPercent: prefs.sideSplitPercent,
|
|
97
|
+
stackedSplitPercent: prefs.stackedSplitPercent,
|
|
98
|
+
setSplitPercent,
|
|
99
|
+
previewWidth: prefs.previewWidth,
|
|
100
|
+
setPreviewWidth,
|
|
101
|
+
contentPanelOpen: prefs.contentPanelOpen,
|
|
102
|
+
setContentPanelOpen,
|
|
103
|
+
contentPanelWidth: prefs.contentPanelWidth,
|
|
104
|
+
setContentPanelWidth,
|
|
27
105
|
};
|
|
28
106
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CollectionItem } from '../../api/entries.js';
|
|
1
|
+
import type { CollectionAccess, CollectionItem } from '../../api/entries.js';
|
|
2
2
|
import type { ApiClient } from '../context/index.js';
|
|
3
3
|
import type { EditorEntry, EditorCollection } from '../Editor.js';
|
|
4
4
|
/** Cache key for a branch's combined schema + entries data. */
|
|
@@ -25,6 +25,7 @@ export declare function listAllEntries(apiClient: {
|
|
|
25
25
|
}, branch: string): Promise<{
|
|
26
26
|
entries: CollectionItem[];
|
|
27
27
|
truncated: boolean;
|
|
28
|
+
collectionAccess: CollectionAccess[];
|
|
28
29
|
}>;
|
|
29
30
|
/**
|
|
30
31
|
* Fetch a branch's schema and full entry list, and build the EditorEntry/
|
|
@@ -32,6 +32,7 @@ export const entriesKey = (branch) => `canopy:entries:${branch}`;
|
|
|
32
32
|
*/
|
|
33
33
|
export async function listAllEntries(apiClient, branch) {
|
|
34
34
|
const byPath = new Map();
|
|
35
|
+
let collectionAccess = [];
|
|
35
36
|
let cursor;
|
|
36
37
|
for (let page = 0; page < MAX_ENTRY_PAGES; page++) {
|
|
37
38
|
const result = await apiClient.entries.list({
|
|
@@ -44,12 +45,25 @@ export async function listAllEntries(apiClient, branch) {
|
|
|
44
45
|
const data = result.data;
|
|
45
46
|
for (const entry of data.entries)
|
|
46
47
|
byPath.set(entry.logicalPath, entry);
|
|
48
|
+
collectionAccess = data.collectionAccess ?? collectionAccess;
|
|
47
49
|
if (!data.pagination?.hasMore || !data.pagination.cursor) {
|
|
48
|
-
return { entries: [...byPath.values()], truncated: false };
|
|
50
|
+
return { entries: [...byPath.values()], truncated: false, collectionAccess };
|
|
49
51
|
}
|
|
50
52
|
cursor = data.pagination.cursor;
|
|
51
53
|
}
|
|
52
|
-
return { entries: [...byPath.values()], truncated: true };
|
|
54
|
+
return { entries: [...byPath.values()], truncated: true, collectionAccess };
|
|
55
|
+
}
|
|
56
|
+
/** Marks each collection the listing says this user may not add an entry to. */
|
|
57
|
+
function withAddAccess(collections, access) {
|
|
58
|
+
if (access.length === 0)
|
|
59
|
+
return collections;
|
|
60
|
+
const canAdd = new Map(access.map((a) => [a.logicalPath, a.canAddEntry]));
|
|
61
|
+
const mark = (c) => ({
|
|
62
|
+
...c,
|
|
63
|
+
...(canAdd.get(c.path) === false && { canAddEntry: false }),
|
|
64
|
+
...(c.children && { children: c.children.map(mark) }),
|
|
65
|
+
});
|
|
66
|
+
return collections.map(mark);
|
|
53
67
|
}
|
|
54
68
|
/**
|
|
55
69
|
* Fetch a branch's schema and full entry list, and build the EditorEntry/
|
|
@@ -68,9 +82,9 @@ export async function fetchEntriesAndSchema(apiClient, branch, params) {
|
|
|
68
82
|
// Build editor collections from hydrated flatSchema
|
|
69
83
|
// Dynamic import: lazy-load heavier editor config; only needed after API data arrives
|
|
70
84
|
const { buildEditorCollections } = await import('../editor-config.js');
|
|
71
|
-
const collections = buildEditorCollections(hydratedFlatSchema);
|
|
72
85
|
// Fetch ALL entries, following the pagination cursor
|
|
73
|
-
const { entries: allEntries, truncated } = await listAllEntries(apiClient, branch);
|
|
86
|
+
const { entries: allEntries, truncated, collectionAccess, } = await listAllEntries(apiClient, branch);
|
|
87
|
+
const collections = withAddAccess(buildEditorCollections(hydratedFlatSchema), collectionAccess);
|
|
74
88
|
if (truncated) {
|
|
75
89
|
console.warn(`Entry list truncated at ${MAX_ENTRY_PAGES * ENTRIES_PAGE_LIMIT} entries for branch "${branch}"`);
|
|
76
90
|
notifications.show({
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ApiErrorCode } from '../../api/types.js';
|
|
1
2
|
import type { EditorEntry, EditorCollection } from '../Editor.js';
|
|
2
3
|
import type { LogicalPath } from '../../paths/types.js';
|
|
3
4
|
import type { FormValue } from '../FormRenderer.js';
|
|
@@ -12,8 +13,20 @@ export { listAllEntries } from './useEntriesData.js';
|
|
|
12
13
|
*/
|
|
13
14
|
export declare class SaveApiError extends Error {
|
|
14
15
|
readonly status: number;
|
|
16
|
+
/** The server's (or saveEntry's own) explanation, if any; `message` falls back to the status. */
|
|
17
|
+
readonly serverMessage?: string | undefined;
|
|
15
18
|
readonly fieldErrors?: EntryFieldError[] | undefined;
|
|
16
|
-
|
|
19
|
+
readonly code?: ApiErrorCode | undefined;
|
|
20
|
+
constructor(status: number,
|
|
21
|
+
/** The server's (or saveEntry's own) explanation, if any; `message` falls back to the status. */
|
|
22
|
+
serverMessage?: string | undefined, fieldErrors?: EntryFieldError[] | undefined, code?: ApiErrorCode | undefined);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Thrown by a read for editing when the API answers `SCHEMA_UNAVAILABLE`: the entry's type
|
|
26
|
+
* names a schema the running code lacks, so the entry cannot be opened until that changes.
|
|
27
|
+
*/
|
|
28
|
+
export declare class EntrySchemaUnavailableError extends Error {
|
|
29
|
+
constructor(serverMessage?: string);
|
|
17
30
|
}
|
|
18
31
|
export interface UseEntryManagerOptions {
|
|
19
32
|
initialEntries: EditorEntry[];
|
|
@@ -26,6 +39,8 @@ export interface UseEntryManagerOptions {
|
|
|
26
39
|
export interface UseEntryManagerReturn {
|
|
27
40
|
selectedPath: string;
|
|
28
41
|
setSelectedPath: (path: string) => void;
|
|
42
|
+
/** Leaves no entry open, as after deleting the open one, instead of opening the first. */
|
|
43
|
+
closeEntry: () => void;
|
|
29
44
|
entries: EditorEntry[];
|
|
30
45
|
setEntries: (entries: EditorEntry[]) => void;
|
|
31
46
|
collections: EditorCollection[];
|
|
@@ -39,12 +54,21 @@ export interface UseEntryManagerReturn {
|
|
|
39
54
|
availableSchemas: string[];
|
|
40
55
|
/** True while the first entry load for the current branch is in flight (initial load, per branch). */
|
|
41
56
|
entriesInitializing: boolean;
|
|
57
|
+
/** The branch's last entries fetch failed; its "Could not load content" toast offers Retry. */
|
|
58
|
+
entriesLoadFailed: boolean;
|
|
42
59
|
navigatorOpen: boolean;
|
|
43
60
|
setNavigatorOpen: (open: boolean) => void;
|
|
44
61
|
refreshEntries: (branch?: string) => Promise<EditorEntry[]>;
|
|
62
|
+
/** `refreshEntries`, resolving to the collections it read too. */
|
|
63
|
+
refreshContent: (branch?: string) => Promise<{
|
|
64
|
+
entries: EditorEntry[];
|
|
65
|
+
collections: EditorCollection[];
|
|
66
|
+
}>;
|
|
45
67
|
handleCreateEntry: (collectionPath: LogicalPath, entryTypeName?: string) => Promise<void>;
|
|
46
68
|
renameEntry: (path: string, newSlug: string) => Promise<void>;
|
|
47
69
|
loadEntry: (entry: EditorEntry) => Promise<FormValue>;
|
|
70
|
+
/** Reads an entry's server value without recording the OCC token that `loadEntry` records. */
|
|
71
|
+
readEntryValue: (entry: EditorEntry) => Promise<FormValue>;
|
|
48
72
|
saveEntry: (entry: EditorEntry, value: FormValue) => Promise<FormValue>;
|
|
49
73
|
/**
|
|
50
74
|
* The OCC version token currently held for `contentId` ON THE BRANCH BEING
|
|
@@ -60,6 +84,20 @@ export interface UseEntryManagerReturn {
|
|
|
60
84
|
* server's conflict check and revert whoever wrote that newer version).
|
|
61
85
|
*/
|
|
62
86
|
getEntryVersion: (contentId: string) => number | undefined;
|
|
87
|
+
/** Holds `version` as the token for `contentId`, for a change the server made itself. */
|
|
88
|
+
adoptEntryVersion: (contentId: string, version: number) => void;
|
|
89
|
+
/**
|
|
90
|
+
* Opens an entry a save reported gone (`ENTRY_GONE`) at its new path, found by content ID,
|
|
91
|
+
* which a rename keeps. Undefined if deleted; the list is then not refreshed, which would close
|
|
92
|
+
* the form holding its unsaved changes.
|
|
93
|
+
*/
|
|
94
|
+
followMovedEntry: (entry: EditorEntry) => Promise<EditorEntry | undefined>;
|
|
95
|
+
/**
|
|
96
|
+
* Creates `entry` again at its path from `value` (`expectedVersion: null`, so refused if the
|
|
97
|
+
* path is taken) and opens the new entry. An unanswered create counts as created when the list
|
|
98
|
+
* then shows it. Undefined when the list does not show it yet, or the branch changed.
|
|
99
|
+
*/
|
|
100
|
+
recreateEntry: (entry: EditorEntry, value: FormValue) => Promise<EditorEntry | undefined>;
|
|
63
101
|
collectionByPath: Map<LogicalPath, EditorCollection>;
|
|
64
102
|
createModalOpen: boolean;
|
|
65
103
|
createModalCollection: EditorCollection | null;
|
|
@@ -72,7 +110,8 @@ export interface UseEntryManagerReturn {
|
|
|
72
110
|
* server's authoritative 409 guard.
|
|
73
111
|
*/
|
|
74
112
|
createModalExistingSlugs: Set<string>;
|
|
75
|
-
|
|
113
|
+
/** `title` is written to the entry type's `titleField`, so the new entry opens already titled. */
|
|
114
|
+
handleCreateModalSubmit: (slug: string, entryTypeName: string, title?: string) => Promise<void>;
|
|
76
115
|
closeCreateModal: () => void;
|
|
77
116
|
}
|
|
78
117
|
/**
|