camox 0.44.0 → 0.46.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/dist/components/AuthGate.js +0 -6
- package/dist/components/DeviceSelector.js +96 -0
- package/dist/components/PlatformLabel.js +20 -24
- package/dist/core/components/lexical/HighlightNode.js +1 -1
- package/dist/core/components/lexical/InlineContentEditable.js +15 -19
- package/dist/core/components/lexical/InlineLexicalEditor.js +54 -74
- package/dist/core/components/lexical/InlineStylesPlugin.js +53 -53
- package/dist/core/components/lexical/MaxLengthPlugin.js +59 -0
- package/dist/core/components/lexical/SelectionBroadcaster.js +53 -54
- package/dist/core/components/lexical/SidebarLexicalEditor.js +322 -229
- package/dist/core/components/lexical/SummaryToggleGuard.js +42 -0
- package/dist/core/components/lexical/TextLinkPopover.js +169 -180
- package/dist/core/createApp.d.ts +241 -312
- package/dist/core/createApp.js +123 -29
- package/dist/core/createBlock.d.ts +5 -5
- package/dist/core/createBlock.js +385 -152
- package/dist/core/createCollection.d.ts +55 -0
- package/dist/core/createCollection.js +93 -0
- package/dist/core/createLayout.d.ts +197 -61
- package/dist/core/createLayout.js +114 -56
- package/dist/core/defineDocument.d.ts +3 -5
- package/dist/core/derivedRoutes.js +49 -1
- package/dist/core/dom.d.ts +13 -4
- package/dist/core/dom.js +44 -1
- package/dist/core/editing/BlockEditingRuntime.d.ts +16 -0
- package/dist/core/editing/BlockEditingRuntime.js +6 -15
- package/dist/core/editing/CompleteBlockEditingRuntime.js +28 -23
- package/dist/core/editing/createEditableBlock.d.ts +754 -633
- package/dist/core/editing/createEditableBlock.js +2113 -1066
- package/dist/core/editing/referenceWrites.js +51 -0
- package/dist/core/editing/useLatestRecord.js +90 -0
- package/dist/core/hooks/useArtifactHost.js +139 -0
- package/dist/core/hooks/useFieldSelection.js +43 -18
- package/dist/core/hooks/useIsEditable.js +12 -10
- package/dist/core/hooks/useOverlayMessage.js +15 -19
- package/dist/core/lib/artifact.d.ts +21 -0
- package/dist/core/lib/artifact.js +154 -0
- package/dist/core/lib/artifactColors.js +123 -0
- package/dist/core/lib/artifactData.d.ts +1 -0
- package/dist/core/lib/artifactData.js +131 -0
- package/dist/core/lib/artifactHost.js +205 -0
- package/dist/core/lib/artifactRuntime.js +36 -0
- package/dist/core/lib/artifactTheme.js +57 -0
- package/dist/core/lib/contentType.d.ts +302 -106
- package/dist/core/lib/contentType.js +201 -173
- package/dist/core/lib/fieldTypes.js +3 -0
- package/dist/core/lib/iconTypes.d.ts +3 -3
- package/dist/core/lib/icons.d.ts +4 -4
- package/dist/core/lib/icons.js +40 -44
- package/dist/core/lib/imagePlaceholder.js +177 -0
- package/dist/core/lib/imageTransform.js +1 -1
- package/dist/core/lib/lexicalReact.d.ts +3 -1
- package/dist/core/lib/lexicalState.js +1 -1
- package/dist/core/lib/previewPaused.js +9 -0
- package/dist/core/lib/recordScope.js +316 -0
- package/dist/core/lib/reference.d.ts +81 -0
- package/dist/core/lib/reference.js +29 -0
- package/dist/core/lib/textLinks.js +7 -5
- package/dist/core/lib/textStyles.d.ts +5 -7
- package/dist/core/lib/textStyles.js +2 -2
- package/dist/core/notFound.d.ts +7 -0
- package/dist/core/notFound.js +11 -0
- package/dist/core/pageDestinations.js +6 -3
- package/dist/core/recordItem.js +34 -0
- package/dist/core/requestContext.d.ts +26 -0
- package/dist/core/requestContext.js +20 -0
- package/dist/features/canvas/CamoxCanvas.js +1401 -0
- package/dist/features/canvas/CanvasLoadingScreen.js +35 -0
- package/dist/features/canvas/CanvasOverlays.js +254 -0
- package/dist/features/canvas/CanvasPageEdge.js +87 -0
- package/dist/features/canvas/CanvasPageFrame.js +333 -0
- package/dist/features/canvas/CanvasPageHeader.js +125 -0
- package/dist/features/canvas/CanvasPreviewPageSlot.js +123 -0
- package/dist/features/canvas/DerivedPagePathInput.js +238 -0
- package/dist/features/canvas/canvasCamera.js +229 -0
- package/dist/features/canvas/canvasFlight.js +104 -0
- package/dist/features/canvas/canvasFrameCapture.js +364 -0
- package/dist/features/canvas/canvasFrameDocument.js +302 -0
- package/dist/features/canvas/canvasFrameMode.js +53 -0
- package/dist/features/canvas/canvasInsertionSeams.js +44 -0
- package/dist/features/canvas/canvasItems.js +30 -0
- package/dist/features/canvas/canvasOverlayGeometry.js +240 -0
- package/dist/features/canvas/canvasPages.js +79 -0
- package/dist/features/canvas/canvasScreenSpace.js +26 -0
- package/dist/features/canvas/canvasSelection.js +18 -0
- package/dist/features/canvas/canvasStore.js +60 -0
- package/dist/features/canvas/canvasThumbnails.js +304 -0
- package/dist/features/canvas/canvasZoom.js +10 -0
- package/dist/features/canvas/sidebar/CanvasInspector.js +202 -0
- package/dist/features/canvas/sidebar/CanvasNavigator.js +124 -0
- package/dist/features/canvas/sidebar/CanvasSidebar.js +54 -0
- package/dist/features/canvas/sidebar/CanvasSidebarFrame.js +48 -0
- package/dist/features/canvas/sidebar/CanvasSidebarSkeleton.js +39 -0
- package/dist/features/canvas/sidebar/CuratedPageInspector.js +69 -0
- package/dist/features/canvas/sidebar/DerivedPageInspector.js +37 -0
- package/dist/features/canvas/sidebar/LayoutPageBlocks.js +78 -0
- package/dist/features/canvas/sidebar/LayoutPageOverview.js +71 -0
- package/dist/features/canvas/sidebar/PageInspector.js +157 -0
- package/dist/features/canvas/sidebar/PageInspectorSkeleton.js +90 -0
- package/dist/features/canvas/sidebar/PageOverview.js +27 -0
- package/dist/features/canvas/sidebar/SingletonPageInspector.js +31 -0
- package/dist/features/canvas/useCanvasCamera.js +783 -0
- package/dist/features/canvas/useCanvasFrame.js +148 -0
- package/dist/features/canvas/useCanvasFrameInput.js +97 -0
- package/dist/features/canvas/useCanvasNearness.js +57 -0
- package/dist/features/canvas/useDiscoveredPreviewPaths.js +62 -0
- package/dist/features/content/CamoxContent.d.ts +2 -5
- package/dist/features/content/CamoxContent.js +174 -271
- package/dist/features/content/CollectionItemSheetContext.js +106 -0
- package/dist/features/content/ContentAssets.js +315 -0
- package/dist/features/content/ContentCollection.js +663 -0
- package/dist/features/content/collection-form.js +58 -0
- package/dist/features/content/components/AssetCard.js +80 -84
- package/dist/features/content/components/AssetCardSkeleton.js +4 -8
- package/dist/features/content/components/ContentSidebar.js +129 -18
- package/dist/features/content/components/ContentSidebarGroup.js +37 -0
- package/dist/features/content/components/DeleteCollectionItemButton.js +202 -0
- package/dist/features/content/components/MissingFromLocale.js +282 -0
- package/dist/features/content/components/UploadDropZone.js +27 -31
- package/dist/features/content/components/UploadProgressDrawer.js +90 -98
- package/dist/features/navigation/navigation.d.ts +66 -20
- package/dist/features/navigation/navigation.js +257 -90
- package/dist/features/og/defaultFonts.js +8 -8
- package/dist/features/og/geist-variable-ttf-base64.js +1 -1
- package/dist/features/og/imageResponse.d.ts +8 -0
- package/dist/features/og/imageResponse.js +26 -0
- package/dist/features/page/CuratedPageContent.js +167 -0
- package/dist/features/page/DerivedPageContent.js +26 -30
- package/dist/features/page/SharedLayoutContent.js +25 -27
- package/dist/features/preview/CamoxPreview.d.ts +23 -61
- package/dist/features/preview/CamoxPreview.js +816 -537
- package/dist/features/preview/EditablePageContent.js +1 -1
- package/dist/features/preview/EditablePageExperience.js +16 -22
- package/dist/features/preview/components/AddBlockSheet.js +273 -0
- package/dist/features/preview/components/AssetFieldEditor.js +173 -154
- package/dist/features/preview/components/AssetLightbox.js +181 -134
- package/dist/features/preview/components/AssetPickerModal.js +153 -170
- package/dist/features/preview/components/BlockActionsPopover.js +150 -149
- package/dist/features/preview/components/BlockErrorBoundary.js +8 -12
- package/dist/features/preview/components/BlockThumbnail.js +172 -98
- package/dist/features/preview/components/CanvasPreview.js +243 -0
- package/dist/features/preview/components/CreatePageModal.js +128 -137
- package/dist/features/preview/components/DebouncedFieldEditor.js +29 -33
- package/dist/features/preview/components/DerivedLayoutDialog.js +21 -19
- package/dist/features/preview/components/DrillRow.js +150 -0
- package/dist/features/preview/components/FieldOverlayStyles.js +11 -8
- package/dist/features/preview/components/FieldToolbar.js +160 -110
- package/dist/features/preview/components/Frame.js +108 -20
- package/dist/features/preview/components/IconFieldEditor.js +62 -66
- package/dist/features/preview/components/ItemFieldsEditor.js +231 -205
- package/dist/features/preview/components/LinkFieldEditor.js +135 -139
- package/dist/features/preview/components/Metadata.js +22 -30
- package/dist/features/preview/components/MobilePreviewDrawer.js +89 -108
- package/dist/features/preview/components/MultipleAssetFieldEditor.js +334 -246
- package/dist/features/preview/components/OverlayTracker.js +9 -41
- package/dist/features/preview/components/Overlays.js +81 -69
- package/dist/features/preview/components/PageInfo.js +1748 -0
- package/dist/features/preview/components/PageInfoSkeleton.js +51 -0
- package/dist/features/preview/components/PageLocationFieldset.js +112 -116
- package/dist/features/preview/components/PageNavigatorHeader.js +24 -0
- package/dist/features/preview/components/PageNicknameField.js +22 -26
- package/dist/features/preview/components/PagePicker.js +128 -130
- package/dist/features/preview/components/PageTree.js +525 -532
- package/dist/features/preview/components/PreviewActivation.js +28 -32
- package/dist/features/preview/components/PreviewPanel.js +620 -319
- package/dist/features/preview/components/PreviewToolbar.js +105 -333
- package/dist/features/preview/components/RecordCard.js +80 -0
- package/dist/features/preview/components/RecordCombobox.js +178 -0
- package/dist/features/preview/components/ReferenceFieldEditor.js +149 -0
- package/dist/features/preview/components/ReferenceListFieldEditor.js +432 -0
- package/dist/features/preview/components/RemovedBlockPlaceholder.js +95 -0
- package/dist/features/preview/components/RepeatableItemsList.js +125 -138
- package/dist/features/preview/components/SelectionEditor.js +993 -0
- package/dist/features/preview/components/ShikiMarkdown.js +14 -18
- package/dist/features/preview/components/SidebarSection.js +52 -64
- package/dist/features/preview/components/StudioEditingFallback.js +56 -0
- package/dist/features/preview/components/UnlinkAssetButton.js +104 -107
- package/dist/features/preview/components/blockGridNavigation.js +15 -0
- package/dist/features/preview/components/contentFieldSchema.js +8 -0
- package/dist/features/preview/components/useFieldWriter.js +200 -0
- package/dist/features/preview/components/useRecordView.js +383 -0
- package/dist/features/preview/components/useRepeatableItemActions.js +35 -37
- package/dist/features/preview/components/useUpdateBlockPosition.js +37 -37
- package/dist/features/preview/editingFrame.js +197 -0
- package/dist/features/preview/overlayHighlights.js +17 -44
- package/dist/features/preview/overlayMessages.js +72 -1
- package/dist/features/preview/pageRecord.js +189 -0
- package/dist/features/preview/previewConstants.js +6 -2
- package/dist/features/preview/previewPageFrame.js +95 -0
- package/dist/features/preview/previewPreparation.js +7 -0
- package/dist/features/preview/previewSelection.js +32 -63
- package/dist/features/preview/previewStore.js +225 -123
- package/dist/features/preview/referencePickerFocus.js +29 -0
- package/dist/features/preview/repeatableItemTargets.js +56 -0
- package/dist/features/preview/selectionReveal.js +21 -0
- package/dist/features/preview/usePreviewViewportActions.js +114 -0
- package/dist/features/preview/viewportContinuity.js +109 -0
- package/dist/features/provider/AuthenticatedCamoxProvider.js +69 -44
- package/dist/features/provider/CamoxProvider.d.ts +3 -6
- package/dist/features/provider/CamoxProvider.js +38 -50
- package/dist/features/provider/CoreCamoxProvider.js +69 -50
- package/dist/features/provider/LocalhostPreviewProvider.js +78 -114
- package/dist/features/provider/PreviewSignInPage.js +54 -0
- package/dist/features/provider/components/CamoxAppContext.js +11 -11
- package/dist/features/provider/components/CommandPalette.js +75 -82
- package/dist/features/provider/useAdminShortcuts.js +7 -11
- package/dist/features/routes/pageRuntime.d.ts +44 -4
- package/dist/features/routes/pageRuntime.js +244 -137
- package/dist/features/runtime/RuntimeChrome.js +117 -115
- package/dist/features/runtime/alternates.js +64 -0
- package/dist/features/runtime/analytics.d.ts +7 -0
- package/dist/features/runtime/analytics.js +66 -0
- package/dist/features/runtime/artifactSources.js +87 -0
- package/dist/features/runtime/editingFallback.js +20 -0
- package/dist/features/runtime/linkPrefetch.js +97 -0
- package/dist/features/runtime/livePages.js +62 -0
- package/dist/features/runtime/llmsTxt.js +40 -0
- package/dist/features/runtime/loopbackFetch.js +18 -0
- package/dist/features/runtime/navigationAccessibility.js +51 -0
- package/dist/features/runtime/navigationTarget.js +23 -2
- package/dist/features/runtime/pageApp.js +229 -158
- package/dist/features/runtime/pageBlockTypes.js +20 -0
- package/dist/features/runtime/pageClient.d.ts +2 -4
- package/dist/features/runtime/pageClient.js +18 -3
- package/dist/features/runtime/pageNavigation.js +254 -32
- package/dist/features/runtime/pageServer.d.ts +2 -4
- package/dist/features/runtime/pageServer.js +6 -2
- package/dist/features/runtime/pageViewport.js +7 -0
- package/dist/features/runtime/runtime.d.ts +54 -24
- package/dist/features/runtime/runtime.js +766 -191
- package/dist/features/runtime/runtimeChromeLoader.js +58 -0
- package/dist/features/runtime/runtimeRoutes.d.ts +19 -0
- package/dist/features/runtime/runtimeRoutes.js +25 -0
- package/dist/features/runtime/scrollRestoration.js +133 -0
- package/dist/features/runtime/studioApp.d.ts +4 -3
- package/dist/features/runtime/studioApp.js +5 -9
- package/dist/features/runtime/studioClient.d.ts +2 -4
- package/dist/features/runtime/studioClient.js +12 -3
- package/dist/features/runtime/studioServer.d.ts +2 -4
- package/dist/features/runtime/studioServer.js +6 -1
- package/dist/features/runtime/worker.d.ts +6 -0
- package/dist/features/runtime/worker.js +23 -0
- package/dist/features/runtime/workerRequest.js +44 -0
- package/dist/features/studio/CamoxStudio.d.ts +2 -6
- package/dist/features/studio/CamoxStudio.js +34 -49
- package/dist/features/studio/FollowAgentProvider.js +327 -0
- package/dist/features/studio/components/ChatSidebar.js +356 -0
- package/dist/features/studio/components/DraftsControl.js +676 -0
- package/dist/features/studio/components/FaviconDialog.js +318 -0
- package/dist/features/studio/components/LocalePicker.js +785 -0
- package/dist/features/studio/components/Navbar.js +123 -103
- package/dist/features/studio/components/ProjectMenu.js +239 -260
- package/dist/features/studio/components/RenameDraftDialog.js +206 -0
- package/dist/features/studio/components/ReviewDraftSheet.js +1472 -0
- package/dist/features/studio/components/ThreadComposer.js +157 -0
- package/dist/features/studio/components/ThreadMarkdown.js +113 -0
- package/dist/features/studio/components/ThreadMessages.js +270 -0
- package/dist/features/studio/components/UserButton.js +34 -23
- package/dist/features/studio/draftLabel.js +33 -0
- package/dist/features/studio/draftNotice.js +13 -0
- package/dist/features/studio/followAgent.js +241 -0
- package/dist/features/studio/followAgentContext.js +7 -0
- package/dist/features/studio/localeOptions.js +118 -0
- package/dist/features/studio/localeSwitch.js +19 -0
- package/dist/features/studio/routes.js +26 -1
- package/dist/features/studio/studioStore.js +64 -1
- package/dist/features/studio/useTheme.js +24 -27
- package/dist/features/vite/artifactRuntimeMinification.js +36 -0
- package/dist/features/vite/blockBoilerplate.js +6 -5
- package/dist/features/vite/blockChunks.js +31 -0
- package/dist/features/vite/bundlerLogs.js +17 -0
- package/dist/features/vite/definitionsSync.js +158 -226
- package/dist/features/vite/devAuthentication.js +4 -16
- package/dist/features/vite/devSignIn.js +87 -0
- package/dist/features/vite/iconGeneration.js +1 -1
- package/dist/features/vite/layoutGeneration.js +11 -1
- package/dist/features/vite/publishSeededContent.js +30 -0
- package/dist/features/vite/routeGeneration.js +6 -7
- package/dist/features/vite/runtimeDev.js +80 -99
- package/dist/features/vite/vite.d.ts +51 -31
- package/dist/features/vite/vite.js +224 -127
- package/dist/features/vite/workerBuild.js +39 -0
- package/dist/hooks/use-debounced-field.js +116 -47
- package/dist/hooks/use-file-upload.js +114 -67
- package/dist/hooks/use-marquee-selection.js +32 -36
- package/dist/hooks/use-page-destinations.js +69 -37
- package/dist/lib/api-client-server.d.ts +5 -0
- package/dist/lib/api-client-server.js +10 -4
- package/dist/lib/api-client.d.ts +6 -0
- package/dist/lib/api-client.js +51 -16
- package/dist/lib/api-socket.js +17 -0
- package/dist/lib/auth-page-styles.js +39 -0
- package/dist/lib/auth.js +129 -61
- package/dist/lib/collection-cache.js +23 -0
- package/dist/lib/draft-scope.d.ts +4 -0
- package/dist/lib/draft-scope.js +222 -0
- package/dist/lib/html.js +12 -0
- package/dist/lib/link-pages.js +154 -0
- package/dist/lib/locale-path.d.ts +22 -0
- package/dist/lib/locale-path.js +57 -0
- package/dist/lib/normalized-data.js +252 -152
- package/dist/lib/preview-handoff.js +2 -2
- package/dist/lib/queries.d.ts +11 -0
- package/dist/lib/queries.js +70 -141
- package/dist/lib/studio-reads.d.ts +14 -0
- package/dist/lib/studio-reads.js +554 -0
- package/dist/lib/use-project-room.js +50 -50
- package/dist/lib/use-thread.js +310 -0
- package/dist/lib/utils.js +25 -29
- package/dist/lib/view-locale-context.js +22 -0
- package/dist/lib/view-locale.js +46 -0
- package/dist/package.js +5 -0
- package/dist/studio-overlays.css +41 -151
- package/dist/studio.css +2 -2
- package/package.json +70 -73
- package/skills/camox/SKILL.md +16 -11
- package/skills/camox/references/artifacts.md +179 -0
- package/skills/camox/references/block-definitions.md +75 -59
- package/skills/camox/references/cli-common.md +9 -11
- package/skills/camox/references/cli-content.md +92 -69
- package/skills/camox/references/cli-publishing.md +26 -0
- package/skills/camox/references/dom-integrations.md +27 -0
- package/skills/camox/references/field-styling.md +4 -4
- package/skills/camox/references/layout-definitions.md +16 -14
- package/skills/camox/references/localization.md +56 -0
- package/skills/camox/references/routed-layouts.md +133 -15
- package/skills/camox-expand/SKILL.md +70 -0
- package/skills/camox-expand/references/jobs.md +39 -0
- package/skills/camoxify/SKILL.md +29 -7
- package/dist/core/components/AddBlockControlBar.js +0 -78
- package/dist/core/hooks/useRequireDraftSource.js +0 -23
- package/dist/features/metadata/sitemap.d.ts +0 -8
- package/dist/features/metadata/sitemap.js +0 -17
- package/dist/features/og/imageResponse.node.d.ts +0 -12
- package/dist/features/og/imageResponse.node.js +0 -49
- package/dist/features/og/imageResponse.workerd.d.ts +0 -12
- package/dist/features/og/imageResponse.workerd.js +0 -40
- package/dist/features/page/PublishedPageContent.js +0 -205
- package/dist/features/page/PublishedPageExperience.js +0 -23
- package/dist/features/preview/DerivedPreview.js +0 -134
- package/dist/features/preview/commentsEnabled.js +0 -8
- package/dist/features/preview/components/AddBlockSidebar.js +0 -381
- package/dist/features/preview/components/AttachedComments.js +0 -331
- package/dist/features/preview/components/CommentHeader.js +0 -122
- package/dist/features/preview/components/CommentSidebar.js +0 -29
- package/dist/features/preview/components/CommentTargetQuote.js +0 -167
- package/dist/features/preview/components/DerivedLayoutSidebar.d.ts +0 -5
- package/dist/features/preview/components/DerivedLayoutSidebar.js +0 -179
- package/dist/features/preview/components/DerivedPageInfoSidebar.js +0 -69
- package/dist/features/preview/components/LeftSidebar.js +0 -68
- package/dist/features/preview/components/PageEditorSidebar.js +0 -563
- package/dist/features/preview/components/PageInfoSidebar.js +0 -1551
- package/dist/features/preview/components/PageNavigatorSidebar.js +0 -78
- package/dist/features/preview/components/PageStatusBadge.js +0 -97
- package/dist/features/preview/components/PeekedBlock.js +0 -217
- package/dist/features/preview/components/PreviewComments.js +0 -56
- package/dist/features/preview/components/PreviewToolbarSpacer.js +0 -43
- package/dist/features/preview/components/PublicationRow.js +0 -422
- package/dist/features/preview/components/PublishDialog.js +0 -194
- package/dist/features/preview/components/RightSidebar.js +0 -59
- package/dist/features/preview/components/SendFeedbackDialog.js +0 -83
- package/dist/features/preview/previewCommentsStore.js +0 -135
- package/dist/features/preview/publication.js +0 -81
- package/dist/features/preview/usePageComments.js +0 -39
- package/dist/features/runtime/SharedChromeContext.js +0 -7
- package/dist/features/studio/components/EnvironmentMenu.js +0 -425
- package/dist/features/vite/appGeneration.js +0 -89
- package/dist/lib/view-queries.js +0 -28
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/Matches.d.ts +0 -114
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/RouterProvider.d.ts +0 -25
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/config.d.ts +0 -1
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/defer.d.ts +0 -1
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/fileRoute.d.ts +0 -20
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/global.d.ts +0 -8
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/hash-scroll.d.ts +0 -1
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/index.d.ts +0 -18
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/link.d.ts +0 -161
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/load-matches.d.ts +0 -6
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/location.d.ts +0 -54
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/lru-cache.d.ts +0 -8
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/manifest.d.ts +0 -32
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/new-process-route-tree.d.ts +0 -115
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/not-found.d.ts +0 -1
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/redirect.d.ts +0 -49
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/rewrite.d.ts +0 -1
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/root.d.ts +0 -6
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/route.d.ts +0 -343
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/routeInfo.d.ts +0 -48
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/router.d.ts +0 -695
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/scroll-restoration.d.ts +0 -1
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchMiddleware.d.ts +0 -1
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchParams.d.ts +0 -5
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/RawStream.d.ts +0 -38
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/seroval-plugins.d.ts +0 -1
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/transformer.d.ts +0 -65
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/stores.d.ts +0 -69
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/structuralSharing.d.ts +0 -1
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/typePrimitives.d.ts +0 -1
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderData.d.ts +0 -1
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderDeps.d.ts +0 -1
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useNavigate.d.ts +0 -10
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useParams.d.ts +0 -1
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useRouteContext.d.ts +0 -1
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useSearch.d.ts +0 -1
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/utils.d.ts +0 -28
- package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/validators.d.ts +0 -49
- package/skills/camox/references/cli-environments.md +0 -37
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { LayoutRequestContext } from "./requestContext.js";
|
|
2
|
+
import { LayoutCollectionItemResult, LayoutRoutesResult, RecordPages } from "./createLayout.js";
|
|
3
|
+
import { CollectionFieldBuilder, StringField } from "./lib/contentType.js";
|
|
4
|
+
import { SystemOrderKey } from "@camox/api-contract";
|
|
5
|
+
import { Static, TObject, TSchema } from "@sinclair/typebox";
|
|
6
|
+
//#region src/core/createCollection.d.ts
|
|
7
|
+
/** Record metadata names, reserved so query `orderBy` keys stay unambiguous. */
|
|
8
|
+
type ReservedFieldNames = { [K in SystemOrderKey]?: never; };
|
|
9
|
+
type TextKey<T extends Record<string, TSchema>> = { [K in keyof T & string]: T[K] extends {
|
|
10
|
+
fieldType: "String";
|
|
11
|
+
} ? K : never; }[keyof T & string];
|
|
12
|
+
/**
|
|
13
|
+
* A definition only: record authoring and querying are not public SDK APIs.
|
|
14
|
+
* `label` is checked against `content`'s return type: typing it against `T` directly would fix
|
|
15
|
+
* `T` before the `content` callback is inferred.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createCollection<const T extends Record<string, TSchema> & ReservedFieldNames, const L extends string>(options: {
|
|
18
|
+
id: string;
|
|
19
|
+
title: string;
|
|
20
|
+
description: string;
|
|
21
|
+
content: (field: CollectionFieldBuilder) => T & Record<NoInfer<L>, StringField>;
|
|
22
|
+
label: L;
|
|
23
|
+
}): Collection<T>;
|
|
24
|
+
/** The pages of a derived layout, one per record, found by the record's `by` field. */
|
|
25
|
+
export interface CollectionPages<T extends Record<string, TSchema>, Param extends string> {
|
|
26
|
+
loader: (input: {
|
|
27
|
+
params: { [K in Param]: string; };
|
|
28
|
+
context: LayoutRequestContext;
|
|
29
|
+
}) => Promise<LayoutCollectionItemResult<Static<TObject<T>>, string, T>>;
|
|
30
|
+
routes: (input: {
|
|
31
|
+
context: LayoutRequestContext;
|
|
32
|
+
}) => Promise<LayoutRoutesResult<{ [K in Param]: string; }>>;
|
|
33
|
+
/** Synced to the API, which checks no two records share the value pages are found by. */
|
|
34
|
+
recordPages: RecordPages;
|
|
35
|
+
}
|
|
36
|
+
/** The default erases the schema for heterogeneous app registries. */
|
|
37
|
+
export type Collection<T extends Record<string, TSchema> = any> = {
|
|
38
|
+
/**
|
|
39
|
+
* A record page's `loader` and `routes`, to spread into a derived layout whose route has
|
|
40
|
+
* `param`. Each page renders the record whose String field `by` equals the param.
|
|
41
|
+
*/
|
|
42
|
+
pages: <const Param extends string>(options: {
|
|
43
|
+
by: TextKey<T>;
|
|
44
|
+
param: Param;
|
|
45
|
+
}) => CollectionPages<T, Param>;
|
|
46
|
+
_internal: {
|
|
47
|
+
id: string;
|
|
48
|
+
title: string;
|
|
49
|
+
description: string;
|
|
50
|
+
label: TextKey<T>;
|
|
51
|
+
contentSchema: TObject<T>;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
//#endregion
|
|
55
|
+
export type { CollectionFieldBuilder };
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { collectionFieldBuilder } from "./lib/contentType.js";
|
|
2
|
+
import { notFound } from "./notFound.js";
|
|
3
|
+
import { getRecordLookup } from "./requestContext.js";
|
|
4
|
+
import { SYSTEM_ORDER_KEYS } from "@camox/api-contract";
|
|
5
|
+
import { Type } from "@sinclair/typebox";
|
|
6
|
+
|
|
7
|
+
//#region src/core/createCollection.ts
|
|
8
|
+
/**
|
|
9
|
+
* A definition only: record authoring and querying are not public SDK APIs.
|
|
10
|
+
* `label` is checked against `content`'s return type: typing it against `T` directly would fix
|
|
11
|
+
* `T` before the `content` callback is inferred.
|
|
12
|
+
*/
|
|
13
|
+
function createCollection(options) {
|
|
14
|
+
if (!options.id.trim()) throw new Error("Collection id is required");
|
|
15
|
+
const content = options.content(collectionFieldBuilder);
|
|
16
|
+
for (const key of SYSTEM_ORDER_KEYS) if (Object.hasOwn(content, key)) throw new Error(`Collection "${options.id}" field "${key}": reserved field name`);
|
|
17
|
+
const supported = /* @__PURE__ */ new Set([
|
|
18
|
+
"String",
|
|
19
|
+
"Boolean",
|
|
20
|
+
"Enum",
|
|
21
|
+
"Embed",
|
|
22
|
+
"Image",
|
|
23
|
+
"File",
|
|
24
|
+
"ImageList",
|
|
25
|
+
"FileList",
|
|
26
|
+
"Reference",
|
|
27
|
+
"ReferenceList"
|
|
28
|
+
]);
|
|
29
|
+
for (const [key, field] of Object.entries(content)) if (!supported.has(field.fieldType)) throw new Error(`Collection "${options.id}" field "${key}": ${String(field.fieldType)} storage is not supported yet`);
|
|
30
|
+
if (content[options.label]?.fieldType !== "String") throw new Error("Collection label must name a String field");
|
|
31
|
+
const id = options.id;
|
|
32
|
+
return {
|
|
33
|
+
pages({ by, param }) {
|
|
34
|
+
const ambiguousValue = (ids, value) => /* @__PURE__ */ new Error(`Collection "${id}": records ${ids.join(", ")} all have ${by} "${value}"`);
|
|
35
|
+
return {
|
|
36
|
+
async loader({ params, context }) {
|
|
37
|
+
const value = params[param];
|
|
38
|
+
if (!value || value.includes("/")) throw notFound();
|
|
39
|
+
const records = await getRecordLookup(context).findByField({
|
|
40
|
+
collectionId: id,
|
|
41
|
+
field: by,
|
|
42
|
+
value
|
|
43
|
+
});
|
|
44
|
+
if (records.length > 1) throw ambiguousValue(records.map((record) => record.id), value);
|
|
45
|
+
const [record] = records;
|
|
46
|
+
if (!record) throw notFound();
|
|
47
|
+
return {
|
|
48
|
+
kind: "collection-item",
|
|
49
|
+
collectionId: id,
|
|
50
|
+
data: {
|
|
51
|
+
id: record.id,
|
|
52
|
+
content: record.content,
|
|
53
|
+
...record.references && { references: record.references },
|
|
54
|
+
...record.updatedAt != null && { updatedAt: record.updatedAt }
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
async routes({ context }) {
|
|
59
|
+
const records = await getRecordLookup(context).listPageValues({
|
|
60
|
+
collectionId: id,
|
|
61
|
+
field: by
|
|
62
|
+
});
|
|
63
|
+
const idsByValue = /* @__PURE__ */ new Map();
|
|
64
|
+
for (const record of records) idsByValue.set(record.value, [...idsByValue.get(record.value) ?? [], record.id]);
|
|
65
|
+
for (const [value, ids] of idsByValue) if (ids.length > 1) throw ambiguousValue(ids, value);
|
|
66
|
+
return { data: records.map((record) => ({
|
|
67
|
+
params: { [param]: record.value },
|
|
68
|
+
target: {
|
|
69
|
+
kind: "collection-item",
|
|
70
|
+
collectionId: id,
|
|
71
|
+
id: record.id,
|
|
72
|
+
label: record.label
|
|
73
|
+
}
|
|
74
|
+
})) };
|
|
75
|
+
},
|
|
76
|
+
recordPages: {
|
|
77
|
+
collectionId: id,
|
|
78
|
+
field: by
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
},
|
|
82
|
+
_internal: {
|
|
83
|
+
id,
|
|
84
|
+
title: options.title,
|
|
85
|
+
description: options.description,
|
|
86
|
+
label: options.label,
|
|
87
|
+
contentSchema: Type.Object(content, { additionalProperties: false })
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
//#endregion
|
|
93
|
+
export { createCollection };
|
|
@@ -1,14 +1,17 @@
|
|
|
1
|
+
import { ReferenceScope } from "./lib/reference.js";
|
|
2
|
+
import { CollectionRecordId, LayoutRequestContext, LoadedRecord } from "./requestContext.js";
|
|
3
|
+
import { notFound } from "./notFound.js";
|
|
4
|
+
import { ContentProxy } from "./lib/contentType.js";
|
|
1
5
|
import * as React from "react";
|
|
2
|
-
import
|
|
3
|
-
|
|
6
|
+
import { TSchema } from "@sinclair/typebox";
|
|
4
7
|
//#region src/core/createLayout.d.ts
|
|
5
|
-
interface OgImageParams {
|
|
8
|
+
export interface OgImageParams {
|
|
6
9
|
title: string;
|
|
7
10
|
description: string;
|
|
8
11
|
projectName: string;
|
|
9
12
|
}
|
|
10
|
-
interface LayoutBlockData {
|
|
11
|
-
_id:
|
|
13
|
+
export interface LayoutBlockData {
|
|
14
|
+
_id: string;
|
|
12
15
|
type: string;
|
|
13
16
|
content: Record<string, unknown>;
|
|
14
17
|
settings?: Record<string, unknown>;
|
|
@@ -47,54 +50,181 @@ interface LayoutBlock<TLayoutOnly extends boolean = boolean> {
|
|
|
47
50
|
* `Type 'X' is not assignable to type '❌ Camox: ...'`
|
|
48
51
|
* instead of the unreadable structural diff on the full Block shape.
|
|
49
52
|
*/
|
|
50
|
-
type ValidateLayoutOnlyBlocks<T extends readonly LayoutBlock[]> = { [K in keyof T]: T[K] extends LayoutBlock<true> ? T[K] : "❌ Camox: blocks in `blocks.before` and `blocks.after` must be defined with `layoutOnly: true`. Add `layoutOnly: true` to this block's `createBlock` options." };
|
|
51
|
-
|
|
52
|
-
|
|
53
|
+
type ValidateLayoutOnlyBlocks<T extends readonly LayoutBlock[]> = { [K in keyof T]: T[K] extends LayoutBlock<true> ? T[K] : "❌ Camox: blocks in `blocks.before` and `blocks.after` must be defined with `layoutOnly: true`. Add `layoutOnly: true` to this block's `createBlock` options."; };
|
|
54
|
+
/**
|
|
55
|
+
* A block module, imported only when Camox seeds the initial page. A static import would put
|
|
56
|
+
* the block in every visitor's bundle, since layouts load on every page.
|
|
57
|
+
*/
|
|
58
|
+
type InitialBlockImport = () => Promise<{
|
|
59
|
+
block: LayoutBlock;
|
|
60
|
+
}>;
|
|
61
|
+
declare const INITIAL_LAYOUT_ONLY_ERROR = "❌ Camox: blocks in `blocks.initial` must NOT be `layoutOnly: true` — `initial` is for page-content blocks. Remove `layoutOnly: true` from this block's `createBlock` options.";
|
|
62
|
+
type ValidatePageContentBlocks<T extends readonly InitialBlockImport[]> = { [K in keyof T]: Awaited<ReturnType<T[K]>>["block"] extends LayoutBlock<true> ? typeof INITIAL_LAYOUT_ONLY_ERROR : T[K]; };
|
|
63
|
+
/** Successful ordinary loader result. Data must be JSON-serializable. */
|
|
64
|
+
export interface LayoutLoaderResult<Data = unknown> {
|
|
65
|
+
kind: "data";
|
|
66
|
+
data: Data;
|
|
67
|
+
}
|
|
68
|
+
declare const collectionFields: unique symbol;
|
|
69
|
+
/**
|
|
70
|
+
* A loader result rendering one collection record, as `collection.pages()` returns it. Wrappers
|
|
71
|
+
* keep the page bound to its record by returning it unchanged.
|
|
72
|
+
*/
|
|
73
|
+
export interface LayoutCollectionItemResult<Content = Record<string, unknown>, CollectionId extends string = string, Fields extends Record<string, TSchema> = any> {
|
|
74
|
+
kind: "collection-item";
|
|
75
|
+
collectionId: CollectionId;
|
|
76
|
+
data: LoadedRecord<Content>;
|
|
77
|
+
/**
|
|
78
|
+
* Type only, never set: the collection's fields, which type `layout.Item`. Invariant, so that
|
|
79
|
+
* records of two collections never merge into one.
|
|
80
|
+
*/
|
|
81
|
+
readonly [collectionFields]?: (fields: Fields) => Fields;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* What `loader` receives: the page's params, the request context to pass through, and the
|
|
85
|
+
* page's locale.
|
|
86
|
+
*/
|
|
87
|
+
export interface LayoutLoaderContext<Params = Record<string, string>> {
|
|
88
|
+
params: Params;
|
|
89
|
+
context: LayoutRequestContext;
|
|
90
|
+
/**
|
|
91
|
+
* The tag of the locale the page renders in, such as `de`, to fetch localized data with when
|
|
92
|
+
* its source has it. Camox renders the data as returned and never translates it.
|
|
93
|
+
*/
|
|
94
|
+
locale: string;
|
|
95
|
+
}
|
|
96
|
+
/** What `routes` receives: the request context to pass through. */
|
|
97
|
+
export interface LayoutRoutesContext {
|
|
98
|
+
context: LayoutRequestContext;
|
|
99
|
+
}
|
|
100
|
+
/** Every successful loader result, before `useData` unwraps it. */
|
|
101
|
+
export type AnyLayoutLoaderResult = LayoutLoaderResult | LayoutCollectionItemResult;
|
|
102
|
+
type LoaderReturn = AnyLayoutLoaderResult | PromiseLike<AnyLayoutLoaderResult>;
|
|
103
|
+
/** The record a discovered page renders, independent of its current params. */
|
|
104
|
+
export interface LayoutRouteTarget extends CollectionRecordId {
|
|
105
|
+
kind: "collection-item";
|
|
106
|
+
/** The record's Label, which names its page where pages are listed (llms.txt). */
|
|
107
|
+
label?: string;
|
|
108
|
+
}
|
|
109
|
+
/** Route discovery result: the params of each page a derived layout can render. */
|
|
110
|
+
export interface LayoutRoutesResult<Params = Record<string, string>> {
|
|
111
|
+
data: ReadonlyArray<{
|
|
112
|
+
params: Params;
|
|
113
|
+
target?: LayoutRouteTarget;
|
|
114
|
+
}>;
|
|
115
|
+
}
|
|
116
|
+
type RoutesReturn<Params> = LayoutRoutesResult<Params> | PromiseLike<LayoutRoutesResult<Params>>;
|
|
117
|
+
type LoaderData<Result extends LoaderReturn> = [Result] extends [never] ? undefined : Awaited<Result>["data"];
|
|
118
|
+
type ResultFields<R> = R extends LayoutCollectionItemResult<any, any, infer F> ? F : never;
|
|
119
|
+
type IsUnion<T, U = T> = T extends unknown ? ([U] extends [T] ? false : true) : never;
|
|
120
|
+
type IsAny<T> = 0 extends 1 & T ? true : false;
|
|
121
|
+
/**
|
|
122
|
+
* The fields of the one collection whose records every loader result renders. `never` for
|
|
123
|
+
* external data, mixed results, several collections, or an envelope typed without its fields.
|
|
124
|
+
*/
|
|
125
|
+
type RecordFields<Result> = [Awaited<Result>] extends [never] ? never : [Awaited<Result>] extends [LayoutCollectionItemResult<any, any, any>] ? true extends IsUnion<ResultFields<Awaited<Result>>> ? never : IsAny<ResultFields<Awaited<Result>>> extends true ? never : ResultFields<Awaited<Result>> : never;
|
|
126
|
+
type StringFieldKeys<F> = { [K in keyof F & string]: F[K] extends {
|
|
127
|
+
fieldType: "String";
|
|
128
|
+
} ? K : never; }[keyof F & string];
|
|
129
|
+
/** Record pages' meta callbacks also get the record's String fields as plain text. */
|
|
130
|
+
type MetaItem<F> = [F] extends [never] ? {} : {
|
|
131
|
+
item: { [K in StringFieldKeys<F>]: string; };
|
|
132
|
+
};
|
|
133
|
+
/** Record pages' `toMarkdown` also gets `item`, the reference-list Markdown builder. */
|
|
134
|
+
type MarkdownItem<F> = [F] extends [never] ? {} : F extends Record<string, TSchema> ? {
|
|
135
|
+
item: ContentProxy<F>;
|
|
136
|
+
} : {};
|
|
137
|
+
/** `layout.Item` exists only on layouts whose loader renders records of one collection. */
|
|
138
|
+
type ItemScope<F> = [F] extends [never] ? {} : F extends Record<string, TSchema> ? {
|
|
139
|
+
/** The page's record, read-only, with typed fields and the records it links. */
|
|
140
|
+
Item: (props: {
|
|
141
|
+
children: (item: ReferenceScope<F>) => React.ReactNode;
|
|
142
|
+
}) => React.ReactNode;
|
|
143
|
+
} : {};
|
|
144
|
+
/** What a page's metadata callbacks know about it. Curated pages have no loader data or params. */
|
|
145
|
+
export interface PageMetaContext<Data = unknown, Params = Record<string, string>> {
|
|
146
|
+
projectName: string;
|
|
147
|
+
pageFullPath: string;
|
|
148
|
+
data: Data;
|
|
149
|
+
params: Params;
|
|
150
|
+
}
|
|
151
|
+
/** On singleton and derived pages, `pageMetaTitle` is the layout's `title`. */
|
|
152
|
+
type BuildMetaTitle<Data, Params, F = never> = (params: PageMetaContext<Data, Params> & {
|
|
153
|
+
pageMetaTitle: string;
|
|
154
|
+
} & MetaItem<F>) => string;
|
|
155
|
+
/** Without it, curated pages use the editor's description and other pages have none. */
|
|
156
|
+
type BuildMetaDescription<Data, Params, F = never> = (params: PageMetaContext<Data, Params> & {
|
|
157
|
+
pageMetaDescription: string | undefined;
|
|
158
|
+
} & MetaItem<F>) => string | undefined;
|
|
159
|
+
/** The Markdown Representation of a code-owned page, between its layout blocks. */
|
|
160
|
+
type LayoutToMarkdown<Data, Params, F = never> = (context: {
|
|
161
|
+
data: Data;
|
|
162
|
+
params: Params;
|
|
163
|
+
} & MarkdownItem<F>) => readonly string[];
|
|
164
|
+
/** The collection a layout's record pages render, and the field each record is found by. */
|
|
165
|
+
export type RecordPages = {
|
|
166
|
+
collectionId: string;
|
|
167
|
+
field: string;
|
|
168
|
+
};
|
|
169
|
+
interface CreateLayoutOptions<TBefore extends readonly LayoutBlock[], TAfter extends readonly LayoutBlock[], TInitial extends readonly InitialBlockImport[], Result extends LoaderReturn = LoaderReturn> {
|
|
53
170
|
id: string;
|
|
54
171
|
kind?: "curated" | "derived" | "singleton";
|
|
55
|
-
loader?: (context:
|
|
56
|
-
|
|
57
|
-
|
|
172
|
+
loader?: (context: LayoutLoaderContext) => Result;
|
|
173
|
+
/** Lists the pages of a derived layout, for the sitemap and the Canvas. */
|
|
174
|
+
routes?: (context: LayoutRoutesContext) => RoutesReturn<Record<string, string>>;
|
|
175
|
+
/** A derived layout's record pages, set by spreading `collection.pages(...)`. */
|
|
176
|
+
recordPages?: RecordPages;
|
|
58
177
|
title: string;
|
|
59
178
|
description: string;
|
|
60
179
|
blocks: {
|
|
61
180
|
before: ValidateLayoutOnlyBlocks<TBefore>;
|
|
62
|
-
after: ValidateLayoutOnlyBlocks<TAfter>;
|
|
181
|
+
after: ValidateLayoutOnlyBlocks<TAfter>;
|
|
182
|
+
/**
|
|
183
|
+
* Ordered list of blocks to create on the initial page when a project is first set up, as
|
|
184
|
+
* imports of their modules: `[() => import("../blocks/hero")]`.
|
|
185
|
+
*/
|
|
63
186
|
initial?: ValidatePageContentBlocks<TInitial>;
|
|
64
187
|
};
|
|
65
188
|
component: React.ComponentType<{
|
|
66
189
|
children: React.ReactNode;
|
|
67
190
|
}>;
|
|
68
|
-
buildMetaTitle:
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}) => string;
|
|
191
|
+
buildMetaTitle: BuildMetaTitle<LoaderData<Result>, Record<string, string>, RecordFields<Result>>;
|
|
192
|
+
buildMetaDescription?: BuildMetaDescription<LoaderData<Result>, Record<string, string>, RecordFields<Result>>;
|
|
193
|
+
/** Singleton and derived layouts only. */
|
|
194
|
+
toMarkdown?: LayoutToMarkdown<LoaderData<Result>, Record<string, string>, RecordFields<Result>>;
|
|
73
195
|
buildOgImage?: (params: OgImageParams) => React.ReactElement;
|
|
74
196
|
}
|
|
75
|
-
declare function createLayoutDefinition<const TBefore extends readonly LayoutBlock[], const TAfter extends readonly LayoutBlock[], const TInitial extends readonly
|
|
197
|
+
declare function createLayoutDefinition<const TBefore extends readonly LayoutBlock[], const TAfter extends readonly LayoutBlock[], const TInitial extends readonly InitialBlockImport[] = []>(options: CreateLayoutOptions<TBefore, TAfter, TInitial>): {
|
|
76
198
|
BeforeBlocks: {
|
|
77
|
-
():
|
|
199
|
+
(): React.JSX.Element;
|
|
78
200
|
displayName: string;
|
|
79
201
|
};
|
|
80
202
|
AfterBlocks: {
|
|
81
|
-
():
|
|
203
|
+
(): React.JSX.Element;
|
|
204
|
+
displayName: string;
|
|
205
|
+
};
|
|
206
|
+
Item: {
|
|
207
|
+
({ children }: {
|
|
208
|
+
children: (item: any) => React.ReactNode;
|
|
209
|
+
}): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | React.JSX.Element | null | undefined;
|
|
82
210
|
displayName: string;
|
|
83
211
|
};
|
|
84
212
|
useData(): unknown;
|
|
85
213
|
_internal: {
|
|
86
214
|
id: string;
|
|
87
215
|
kind: "curated" | "derived" | "singleton";
|
|
88
|
-
loader: ((context:
|
|
89
|
-
|
|
90
|
-
|
|
216
|
+
loader: ((context: LayoutLoaderContext) => LoaderReturn) | undefined;
|
|
217
|
+
routes: ((context: LayoutRoutesContext) => RoutesReturn<Record<string, string>>) | undefined;
|
|
218
|
+
recordPages: RecordPages | undefined;
|
|
91
219
|
title: string;
|
|
92
220
|
description: string;
|
|
93
|
-
buildMetaTitle:
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
221
|
+
buildMetaTitle: BuildMetaTitle<unknown, unknown>;
|
|
222
|
+
buildMetaDescription: BuildMetaDescription<unknown, unknown> | undefined;
|
|
223
|
+
toMarkdown: ((context: {
|
|
224
|
+
data: unknown;
|
|
225
|
+
params: unknown;
|
|
226
|
+
item?: unknown;
|
|
227
|
+
}) => readonly string[]) | undefined;
|
|
98
228
|
buildOgImage: ((params: OgImageParams) => Promise<Response>) | undefined;
|
|
99
229
|
blockDefinitions: ({
|
|
100
230
|
type: string;
|
|
@@ -107,7 +237,7 @@ declare function createLayoutDefinition<const TBefore extends readonly LayoutBlo
|
|
|
107
237
|
content: Record<string, unknown>;
|
|
108
238
|
position: string;
|
|
109
239
|
}[];
|
|
110
|
-
|
|
240
|
+
slot: "before";
|
|
111
241
|
} | {
|
|
112
242
|
type: string;
|
|
113
243
|
content: Record<string, unknown>;
|
|
@@ -119,9 +249,9 @@ declare function createLayoutDefinition<const TBefore extends readonly LayoutBlo
|
|
|
119
249
|
content: Record<string, unknown>;
|
|
120
250
|
position: string;
|
|
121
251
|
}[];
|
|
122
|
-
|
|
252
|
+
slot: "after";
|
|
123
253
|
})[];
|
|
124
|
-
|
|
254
|
+
loadInitialBlockBundles: (() => Promise<{
|
|
125
255
|
type: string;
|
|
126
256
|
content: Record<string, unknown>;
|
|
127
257
|
settings: Record<string, unknown>;
|
|
@@ -132,30 +262,39 @@ declare function createLayoutDefinition<const TBefore extends readonly LayoutBlo
|
|
|
132
262
|
content: Record<string, unknown>;
|
|
133
263
|
position: string;
|
|
134
264
|
}[];
|
|
135
|
-
}[] | undefined;
|
|
265
|
+
}[]>) | undefined;
|
|
136
266
|
component: React.ComponentType<{
|
|
137
267
|
children: React.ReactNode;
|
|
138
268
|
}>;
|
|
139
|
-
Provider: ({
|
|
140
|
-
layoutBlocks,
|
|
141
|
-
children,
|
|
142
|
-
data
|
|
143
|
-
}: {
|
|
269
|
+
Provider: ({ layoutBlocks, children, result }: {
|
|
144
270
|
layoutBlocks: Record<string, LayoutBlockData>;
|
|
145
271
|
children: React.ReactNode;
|
|
146
|
-
|
|
147
|
-
}) =>
|
|
272
|
+
result?: AnyLayoutLoaderResult;
|
|
273
|
+
}) => React.JSX.Element;
|
|
148
274
|
};
|
|
149
275
|
};
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
type
|
|
276
|
+
/** Any layout. `Item` is typed per layout, and only exists on record layouts' types. */
|
|
277
|
+
export type Layout = Omit<ReturnType<typeof createLayoutDefinition>, "Item">;
|
|
278
|
+
/** A layout typed by its loader: `useData` returns the loaded data, `Item` renders its record. */
|
|
279
|
+
type LayoutFor<Result extends LoaderReturn> = Omit<Layout, "useData" | "Item"> & {
|
|
280
|
+
useData: () => LoaderData<Result>;
|
|
281
|
+
} & ItemScope<RecordFields<Result>>;
|
|
282
|
+
export interface LayoutFileRoutes {}
|
|
283
|
+
type Params<Id extends string> = Id extends `${infer Head}.${infer Tail}` ? Params<Head> & Params<Tail> : Id extends `$${infer Name}` ? { [K in Name]: string; } : {};
|
|
284
|
+
type RouteParams<Id extends string> = Id extends keyof LayoutFileRoutes ? LayoutFileRoutes[Id] extends {
|
|
285
|
+
params: infer P;
|
|
286
|
+
} ? P : Params<Id> : Params<Id>;
|
|
287
|
+
type FileOptions<Id extends string, Result extends LoaderReturn, B extends readonly LayoutBlock[], A extends readonly LayoutBlock[], I extends readonly InitialBlockImport[]> = Omit<CreateLayoutOptions<B, A, I>, "id" | "kind" | "loader" | "routes" | "recordPages" | "component" | "buildMetaTitle" | "buildMetaDescription" | "toMarkdown"> & ({
|
|
154
288
|
kind: "curated";
|
|
155
289
|
component: React.ComponentType<{
|
|
156
290
|
children: React.ReactNode;
|
|
157
291
|
}>;
|
|
158
292
|
loader?: never;
|
|
293
|
+
routes?: never;
|
|
294
|
+
recordPages?: never;
|
|
295
|
+
toMarkdown?: never;
|
|
296
|
+
buildMetaTitle: BuildMetaTitle<undefined, Record<string, never>>;
|
|
297
|
+
buildMetaDescription?: BuildMetaDescription<undefined, Record<string, never>>;
|
|
159
298
|
} | {
|
|
160
299
|
kind: "singleton";
|
|
161
300
|
blocks: {
|
|
@@ -163,12 +302,15 @@ type FileOptions<Id extends string, Data, B extends readonly LayoutBlock[], A ex
|
|
|
163
302
|
after: ValidateLayoutOnlyBlocks<A>;
|
|
164
303
|
initial?: never;
|
|
165
304
|
};
|
|
166
|
-
loader?: (context:
|
|
167
|
-
|
|
168
|
-
|
|
305
|
+
loader?: (context: LayoutLoaderContext<Record<string, never>>) => Result;
|
|
306
|
+
routes?: never;
|
|
307
|
+
recordPages?: never;
|
|
308
|
+
toMarkdown?: LayoutToMarkdown<LoaderData<Result>, Record<string, never>, RecordFields<Result>>;
|
|
169
309
|
component: React.ComponentType<{
|
|
170
310
|
children?: never;
|
|
171
311
|
}>;
|
|
312
|
+
buildMetaTitle: BuildMetaTitle<LoaderData<Result>, Record<string, never>, RecordFields<Result>>;
|
|
313
|
+
buildMetaDescription?: BuildMetaDescription<LoaderData<Result>, Record<string, never>, RecordFields<Result>>;
|
|
172
314
|
} | {
|
|
173
315
|
kind: "derived";
|
|
174
316
|
blocks: {
|
|
@@ -176,23 +318,17 @@ type FileOptions<Id extends string, Data, B extends readonly LayoutBlock[], A ex
|
|
|
176
318
|
after: ValidateLayoutOnlyBlocks<A>;
|
|
177
319
|
initial?: never;
|
|
178
320
|
};
|
|
179
|
-
loader: (context:
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
}) => Data;
|
|
321
|
+
loader: (context: LayoutLoaderContext<RouteParams<Id>>) => Result;
|
|
322
|
+
routes?: (context: LayoutRoutesContext) => RoutesReturn<RouteParams<Id>>;
|
|
323
|
+
recordPages?: RecordPages;
|
|
324
|
+
toMarkdown?: LayoutToMarkdown<LoaderData<Result>, RouteParams<Id>, RecordFields<Result>>;
|
|
184
325
|
component: React.ComponentType<{
|
|
185
326
|
children?: never;
|
|
186
327
|
}>;
|
|
328
|
+
buildMetaTitle: BuildMetaTitle<LoaderData<Result>, RouteParams<Id>, RecordFields<Result>>;
|
|
329
|
+
buildMetaDescription?: BuildMetaDescription<LoaderData<Result>, RouteParams<Id>, RecordFields<Result>>;
|
|
187
330
|
});
|
|
188
|
-
declare function createLayout<const
|
|
189
|
-
|
|
190
|
-
};
|
|
191
|
-
declare function createLayout<const B extends readonly LayoutBlock[], const A extends readonly LayoutBlock[], const I extends readonly LayoutBlock[] = []>(options: CreateLayoutOptions<B, A, I>): Layout;
|
|
192
|
-
/** Signal a missing derived page; other loader failures remain server errors. */
|
|
193
|
-
declare function notFound(): Error & {
|
|
194
|
-
status: number;
|
|
195
|
-
code: string;
|
|
196
|
-
};
|
|
331
|
+
export declare function createLayout<const B extends readonly LayoutBlock[], const A extends readonly LayoutBlock[], const I extends readonly InitialBlockImport[] = [], Result extends LoaderReturn = never>(options: CreateLayoutOptions<B, A, I, Result>): LayoutFor<Result>;
|
|
332
|
+
export declare function createLayout<const Id extends string>(id: Id): <Result extends LoaderReturn = never, const B extends readonly LayoutBlock[] = [], const A extends readonly LayoutBlock[] = [], const I extends readonly InitialBlockImport[] = []>(options: FileOptions<Id, Result, B, A, I>) => LayoutFor<Result>;
|
|
197
333
|
//#endregion
|
|
198
|
-
export {
|
|
334
|
+
export { type LayoutRequestContext, notFound };
|