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,304 @@
|
|
|
1
|
+
import { createFrameCapturer } from "./canvasFrameCapture.js";
|
|
2
|
+
import { c } from "react/compiler-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { QueryObserver, replaceEqualDeep } from "@tanstack/react-query";
|
|
5
|
+
|
|
6
|
+
//#region src/features/canvas/canvasThumbnails.ts
|
|
7
|
+
/**
|
|
8
|
+
* Below this zoom, Canvas Pages show a still image of themselves rather than their live frame,
|
|
9
|
+
* except the selected one. Many live frames in view are what slows the camera down, while from
|
|
10
|
+
* this far, an image looks the same.
|
|
11
|
+
*/
|
|
12
|
+
const CANVAS_THUMBNAIL_MAX_ZOOM = .25;
|
|
13
|
+
/**
|
|
14
|
+
* Whether this browser draws captures faithfully. WebKit draws an SVG image before the images
|
|
15
|
+
* embedded in it have decoded, so its captures miss their images.
|
|
16
|
+
*/
|
|
17
|
+
function canvasThumbnailsSupported() {
|
|
18
|
+
if (typeof navigator === "undefined" || typeof OffscreenCanvas === "undefined") return false;
|
|
19
|
+
const agent = navigator.userAgent;
|
|
20
|
+
return !(/AppleWebKit/.test(agent) && !/Chrome|Chromium|CriOS|Edg\//.test(agent));
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Whether a read's data changed. Loading a page seeds the reads of its layout's blocks again,
|
|
24
|
+
* with equal data but new objects, which mustn't make every Page sharing them stale.
|
|
25
|
+
*/
|
|
26
|
+
function changed(before, after) {
|
|
27
|
+
return before !== after && replaceEqualDeep(before, after) !== before;
|
|
28
|
+
}
|
|
29
|
+
/** The longest a capture waits for fetches to finish. */
|
|
30
|
+
const FETCH_WAIT_MS = 5e3;
|
|
31
|
+
/**
|
|
32
|
+
* Resolves once nothing is fetching, or after `FETCH_WAIT_MS`. Blocks load their own data through
|
|
33
|
+
* the same cache, and a refreshing Page refetches what changed: until those arrive, the frame
|
|
34
|
+
* shows them loading, or out of date.
|
|
35
|
+
*/
|
|
36
|
+
function fetchesDone(queryClient) {
|
|
37
|
+
if (!queryClient.isFetching()) return Promise.resolve();
|
|
38
|
+
return new Promise((resolve) => {
|
|
39
|
+
const done = () => {
|
|
40
|
+
clearTimeout(timer);
|
|
41
|
+
unsubscribe();
|
|
42
|
+
resolve();
|
|
43
|
+
};
|
|
44
|
+
const timer = setTimeout(done, FETCH_WAIT_MS);
|
|
45
|
+
const unsubscribe = queryClient.getQueryCache().subscribe(() => {
|
|
46
|
+
if (!queryClient.isFetching()) done();
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/** Resolves after the frame renders twice more, so what arrived last is on screen. */
|
|
51
|
+
function framesRendered(frame) {
|
|
52
|
+
const view = frame.contentDocument?.defaultView;
|
|
53
|
+
if (!view) return Promise.resolve();
|
|
54
|
+
const next = () => new Promise((resolve) => view.requestAnimationFrame(resolve));
|
|
55
|
+
return next().then(next);
|
|
56
|
+
}
|
|
57
|
+
/** The values a query key names, at any depth. */
|
|
58
|
+
function keyValues(value, values = []) {
|
|
59
|
+
if (typeof value === "string" || typeof value === "number") values.push(String(value));
|
|
60
|
+
else if (Array.isArray(value)) for (const item of value) keyValues(item, values);
|
|
61
|
+
else if (value && typeof value === "object") for (const item of Object.values(value)) keyValues(item, values);
|
|
62
|
+
return values;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* The still images of a Canvas's Pages. A Page's image goes stale once a read it used changes or
|
|
66
|
+
* is invalidated, as realtime does for an agent's edits. Stale images refresh one at a time,
|
|
67
|
+
* while the camera is still, by mounting their Page out of sight.
|
|
68
|
+
*/
|
|
69
|
+
function createCanvasThumbnails(queryClient, capturer = createFrameCapturer()) {
|
|
70
|
+
const entries = /* @__PURE__ */ new Map();
|
|
71
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
72
|
+
const waiting = /* @__PURE__ */ new Set();
|
|
73
|
+
let refreshing = null;
|
|
74
|
+
let moving = false;
|
|
75
|
+
const generations = /* @__PURE__ */ new Map();
|
|
76
|
+
const notify = () => {
|
|
77
|
+
for (const listener of listeners) listener();
|
|
78
|
+
};
|
|
79
|
+
const markStale = (key) => {
|
|
80
|
+
const entry = entries.get(key);
|
|
81
|
+
if (!entry || entry.stale) return;
|
|
82
|
+
entries.set(key, {
|
|
83
|
+
...entry,
|
|
84
|
+
stale: true
|
|
85
|
+
});
|
|
86
|
+
notify();
|
|
87
|
+
};
|
|
88
|
+
const drop = (key) => {
|
|
89
|
+
const entry = entries.get(key);
|
|
90
|
+
if (!entry) return;
|
|
91
|
+
entry.release();
|
|
92
|
+
URL.revokeObjectURL(entry.url);
|
|
93
|
+
entries.delete(key);
|
|
94
|
+
};
|
|
95
|
+
const hold = (query) => {
|
|
96
|
+
return new QueryObserver(queryClient, {
|
|
97
|
+
...query.options,
|
|
98
|
+
queryKey: query.queryKey,
|
|
99
|
+
enabled: false
|
|
100
|
+
}).subscribe(() => {});
|
|
101
|
+
};
|
|
102
|
+
const pump = () => {
|
|
103
|
+
if (refreshing !== null || moving) return;
|
|
104
|
+
const next = waiting.values().next();
|
|
105
|
+
if (next.done) return;
|
|
106
|
+
refreshing = next.value;
|
|
107
|
+
notify();
|
|
108
|
+
};
|
|
109
|
+
const finishRefresh = (key) => {
|
|
110
|
+
waiting.delete(key);
|
|
111
|
+
if (refreshing !== key) return;
|
|
112
|
+
refreshing = null;
|
|
113
|
+
notify();
|
|
114
|
+
pump();
|
|
115
|
+
};
|
|
116
|
+
return {
|
|
117
|
+
subscribe: (listener) => {
|
|
118
|
+
listeners.add(listener);
|
|
119
|
+
return () => void listeners.delete(listener);
|
|
120
|
+
},
|
|
121
|
+
get(key) {
|
|
122
|
+
return entries.get(key) ?? null;
|
|
123
|
+
},
|
|
124
|
+
isRefreshing(key) {
|
|
125
|
+
return refreshing === key;
|
|
126
|
+
},
|
|
127
|
+
connect() {
|
|
128
|
+
const unsubscribe = queryClient.getQueryCache().subscribe((event) => {
|
|
129
|
+
if (event.type !== "updated" && event.type !== "removed") return;
|
|
130
|
+
const { query } = event;
|
|
131
|
+
const invalidated = event.type === "updated" && event.action.type === "invalidate";
|
|
132
|
+
let values = null;
|
|
133
|
+
for (const [key, entry] of entries) {
|
|
134
|
+
if (entry.stale) continue;
|
|
135
|
+
if (entry.reads.has(query)) {
|
|
136
|
+
if (event.type === "removed" || invalidated) markStale(key);
|
|
137
|
+
else if (changed(entry.reads.get(query), query.state.data)) markStale(key);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (!invalidated) continue;
|
|
141
|
+
values ??= new Set(keyValues(query.queryKey));
|
|
142
|
+
for (const value of values) {
|
|
143
|
+
if (!entry.tokens.has(value)) continue;
|
|
144
|
+
markStale(key);
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
return () => {
|
|
150
|
+
unsubscribe();
|
|
151
|
+
for (const key of Array.from(entries.keys())) drop(key);
|
|
152
|
+
waiting.clear();
|
|
153
|
+
refreshing = null;
|
|
154
|
+
notify();
|
|
155
|
+
};
|
|
156
|
+
},
|
|
157
|
+
markAllStale() {
|
|
158
|
+
for (const key of entries.keys()) markStale(key);
|
|
159
|
+
},
|
|
160
|
+
setMoving(next) {
|
|
161
|
+
moving = next;
|
|
162
|
+
if (!moving) pump();
|
|
163
|
+
},
|
|
164
|
+
requestRefresh(key) {
|
|
165
|
+
waiting.add(key);
|
|
166
|
+
pump();
|
|
167
|
+
return () => finishRefresh(key);
|
|
168
|
+
},
|
|
169
|
+
async capture(key, frame, tokens, options) {
|
|
170
|
+
const generation = (generations.get(key) ?? 0) + 1;
|
|
171
|
+
generations.set(key, generation);
|
|
172
|
+
await fetchesDone(queryClient);
|
|
173
|
+
await framesRendered(frame);
|
|
174
|
+
if (generations.get(key) !== generation) return;
|
|
175
|
+
const root = frame.contentDocument?.body;
|
|
176
|
+
const allTokens = new Set(tokens);
|
|
177
|
+
root?.querySelectorAll("[data-camox-viewport-block]").forEach((block) => allTokens.add(block.getAttribute("data-camox-viewport-block") ?? ""));
|
|
178
|
+
allTokens.delete("");
|
|
179
|
+
const reads = /* @__PURE__ */ new Map();
|
|
180
|
+
for (const query of queryClient.getQueryCache().getAll()) if (keyValues(query.queryKey).some((value) => allTokens.has(value))) reads.set(query, query.state.data);
|
|
181
|
+
const captured = await capturer.capture(frame, options);
|
|
182
|
+
if (generations.get(key) !== generation) return;
|
|
183
|
+
const url = URL.createObjectURL(captured.blob);
|
|
184
|
+
if (typeof Image !== "undefined") {
|
|
185
|
+
const image = new Image();
|
|
186
|
+
image.src = url;
|
|
187
|
+
await image.decode().catch(() => {});
|
|
188
|
+
}
|
|
189
|
+
if (generations.get(key) !== generation) {
|
|
190
|
+
URL.revokeObjectURL(url);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
drop(key);
|
|
194
|
+
const holds = Array.from(reads.keys(), hold);
|
|
195
|
+
entries.set(key, {
|
|
196
|
+
url,
|
|
197
|
+
width: captured.width,
|
|
198
|
+
height: captured.height,
|
|
199
|
+
stale: false,
|
|
200
|
+
tokens: allTokens,
|
|
201
|
+
reads,
|
|
202
|
+
release: () => holds.forEach((release) => release())
|
|
203
|
+
});
|
|
204
|
+
finishRefresh(key);
|
|
205
|
+
notify();
|
|
206
|
+
},
|
|
207
|
+
abandon(key) {
|
|
208
|
+
finishRefresh(key);
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
const CanvasThumbnailsContext = React.createContext(null);
|
|
213
|
+
const noThumbnails = () => () => {};
|
|
214
|
+
/** `key`'s image, and whether it's the one refreshing. */
|
|
215
|
+
function useCanvasThumbnail(key) {
|
|
216
|
+
const $ = c(10);
|
|
217
|
+
const thumbnails = React.use(CanvasThumbnailsContext);
|
|
218
|
+
const subscribe = thumbnails?.subscribe ?? noThumbnails;
|
|
219
|
+
let t0;
|
|
220
|
+
if ($[0] !== key || $[1] !== thumbnails) {
|
|
221
|
+
t0 = () => thumbnails?.get(key) ?? null;
|
|
222
|
+
$[0] = key;
|
|
223
|
+
$[1] = thumbnails;
|
|
224
|
+
$[2] = t0;
|
|
225
|
+
} else t0 = $[2];
|
|
226
|
+
const thumbnail = React.useSyncExternalStore(subscribe, t0);
|
|
227
|
+
let t1;
|
|
228
|
+
if ($[3] !== key || $[4] !== thumbnails) {
|
|
229
|
+
t1 = () => thumbnails?.isRefreshing(key) ?? false;
|
|
230
|
+
$[3] = key;
|
|
231
|
+
$[4] = thumbnails;
|
|
232
|
+
$[5] = t1;
|
|
233
|
+
} else t1 = $[5];
|
|
234
|
+
const refreshing = React.useSyncExternalStore(subscribe, t1);
|
|
235
|
+
let t2;
|
|
236
|
+
if ($[6] !== refreshing || $[7] !== thumbnail || $[8] !== thumbnails) {
|
|
237
|
+
t2 = {
|
|
238
|
+
thumbnails,
|
|
239
|
+
thumbnail,
|
|
240
|
+
refreshing
|
|
241
|
+
};
|
|
242
|
+
$[6] = refreshing;
|
|
243
|
+
$[7] = thumbnail;
|
|
244
|
+
$[8] = thumbnails;
|
|
245
|
+
$[9] = t2;
|
|
246
|
+
} else t2 = $[9];
|
|
247
|
+
return t2;
|
|
248
|
+
}
|
|
249
|
+
/** How long a frame's content must stay unchanged before it counts as settled again. */
|
|
250
|
+
const SETTLE_DELAY_MS = 600;
|
|
251
|
+
/** The longest a frame waits for its images to load before it counts as settled anyway. */
|
|
252
|
+
const IMAGE_WAIT_MS = 3e3;
|
|
253
|
+
/**
|
|
254
|
+
* Calls `onSettled` once a frame's content has rendered, with its fonts and images loaded, and
|
|
255
|
+
* again each time its content settles after changing.
|
|
256
|
+
*/
|
|
257
|
+
function useFrameSettled(frame, root, onSettled) {
|
|
258
|
+
const report = React.useEffectEvent((settled) => onSettled?.(settled));
|
|
259
|
+
const enabled = onSettled !== void 0;
|
|
260
|
+
React.useEffect(() => {
|
|
261
|
+
if (!frame || !root || !enabled) return;
|
|
262
|
+
const doc = root.ownerDocument;
|
|
263
|
+
const view = doc.defaultView;
|
|
264
|
+
if (!view) return;
|
|
265
|
+
let run = 0;
|
|
266
|
+
let timer = 0;
|
|
267
|
+
let disposed = false;
|
|
268
|
+
const nextFrame = () => new Promise((resolve) => view.requestAnimationFrame(resolve));
|
|
269
|
+
const settle = async () => {
|
|
270
|
+
const current = ++run;
|
|
271
|
+
await doc.fonts.ready;
|
|
272
|
+
const loading = Array.from(root.querySelectorAll("img")).filter((image) => !image.complete && image.loading !== "lazy");
|
|
273
|
+
await Promise.race([Promise.all(loading.map((image) => image.decode().catch(() => {}))), new Promise((resolve) => view.setTimeout(resolve, IMAGE_WAIT_MS))]);
|
|
274
|
+
await nextFrame();
|
|
275
|
+
await nextFrame();
|
|
276
|
+
if (!disposed && current === run) report(frame);
|
|
277
|
+
};
|
|
278
|
+
const changed = () => {
|
|
279
|
+
run++;
|
|
280
|
+
view.clearTimeout(timer);
|
|
281
|
+
timer = view.setTimeout(() => void settle(), SETTLE_DELAY_MS);
|
|
282
|
+
};
|
|
283
|
+
const observer = new MutationObserver(changed);
|
|
284
|
+
observer.observe(root, {
|
|
285
|
+
subtree: true,
|
|
286
|
+
childList: true,
|
|
287
|
+
characterData: true,
|
|
288
|
+
attributes: true
|
|
289
|
+
});
|
|
290
|
+
settle();
|
|
291
|
+
return () => {
|
|
292
|
+
disposed = true;
|
|
293
|
+
view.clearTimeout(timer);
|
|
294
|
+
observer.disconnect();
|
|
295
|
+
};
|
|
296
|
+
}, [
|
|
297
|
+
frame,
|
|
298
|
+
root,
|
|
299
|
+
enabled
|
|
300
|
+
]);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
//#endregion
|
|
304
|
+
export { CANVAS_THUMBNAIL_MAX_ZOOM, CanvasThumbnailsContext, canvasThumbnailsSupported, createCanvasThumbnails, useCanvasThumbnail, useFrameSettled };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import "./canvasStore.js";
|
|
2
|
+
import { c } from "react/compiler-runtime";
|
|
3
|
+
import { createContext, useContext } from "react";
|
|
4
|
+
import { useSelector } from "@xstate/store-react";
|
|
5
|
+
|
|
6
|
+
//#region src/features/canvas/canvasZoom.ts
|
|
7
|
+
const CanvasWorkspaceContext = createContext(null);
|
|
8
|
+
|
|
9
|
+
//#endregion
|
|
10
|
+
export { CanvasWorkspaceContext };
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { formatShortcut } from "../../../lib/utils.js";
|
|
2
|
+
import "../../preview/components/PageNicknameField.js";
|
|
3
|
+
import { SHOW_WHOLE_CANVAS_SHORTCUT } from "../../preview/previewConstants.js";
|
|
4
|
+
import { c } from "react/compiler-runtime";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { Button } from "@camox/ui/button";
|
|
7
|
+
import { Minimize } from "lucide-react";
|
|
8
|
+
import { toast } from "@camox/ui/toaster";
|
|
9
|
+
import * as Tooltip$1 from "@camox/ui/tooltip";
|
|
10
|
+
import { Skeleton } from "@camox/ui/skeleton";
|
|
11
|
+
|
|
12
|
+
//#region src/features/canvas/sidebar/CanvasInspector.tsx
|
|
13
|
+
/**
|
|
14
|
+
* A page nickname that reads as the header's title, and shows it can be edited on hover.
|
|
15
|
+
* Its border and padding are always there, transparent until hovered or focused, so they
|
|
16
|
+
* never move the text. Saves on Enter or blur; Escape puts the nickname back.
|
|
17
|
+
*/
|
|
18
|
+
function PageNicknameInput(t0) {
|
|
19
|
+
const $ = c(11);
|
|
20
|
+
const { nickname, onRename } = t0;
|
|
21
|
+
let t1;
|
|
22
|
+
if ($[0] !== nickname || $[1] !== onRename) {
|
|
23
|
+
t1 = async (input) => {
|
|
24
|
+
const next = input.value.trim();
|
|
25
|
+
if (next === nickname) return;
|
|
26
|
+
if (!next) {
|
|
27
|
+
toast.error("Page nickname is required");
|
|
28
|
+
input.value = nickname;
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
await onRename(next);
|
|
33
|
+
} catch {
|
|
34
|
+
toast.error("Could not update page");
|
|
35
|
+
input.value = nickname;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
$[0] = nickname;
|
|
39
|
+
$[1] = onRename;
|
|
40
|
+
$[2] = t1;
|
|
41
|
+
} else t1 = $[2];
|
|
42
|
+
const save = t1;
|
|
43
|
+
let t2;
|
|
44
|
+
if ($[3] !== save) {
|
|
45
|
+
t2 = (event) => void save(event.currentTarget);
|
|
46
|
+
$[3] = save;
|
|
47
|
+
$[4] = t2;
|
|
48
|
+
} else t2 = $[4];
|
|
49
|
+
let t3;
|
|
50
|
+
if ($[5] !== nickname) {
|
|
51
|
+
t3 = (event_0) => {
|
|
52
|
+
event_0.stopPropagation();
|
|
53
|
+
if (event_0.key === "Enter") {
|
|
54
|
+
event_0.preventDefault();
|
|
55
|
+
event_0.currentTarget.blur();
|
|
56
|
+
}
|
|
57
|
+
if (event_0.key === "Escape") {
|
|
58
|
+
event_0.currentTarget.value = nickname;
|
|
59
|
+
event_0.currentTarget.blur();
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
$[5] = nickname;
|
|
63
|
+
$[6] = t3;
|
|
64
|
+
} else t3 = $[6];
|
|
65
|
+
let t4;
|
|
66
|
+
if ($[7] !== nickname || $[8] !== t2 || $[9] !== t3) {
|
|
67
|
+
t4 = /* @__PURE__ */ jsx("input", {
|
|
68
|
+
"aria-label": "Page nickname",
|
|
69
|
+
defaultValue: nickname,
|
|
70
|
+
title: nickname,
|
|
71
|
+
maxLength: 80,
|
|
72
|
+
className: "hover:border-input focus-visible:border-ring focus-visible:ring-ring/50 -mx-1.5 h-8 w-full min-w-0 truncate rounded-md border border-transparent bg-transparent px-1.5 text-sm font-medium transition-[color,box-shadow,border-color] outline-none hover:shadow-xs focus-visible:ring-3",
|
|
73
|
+
onBlur: t2,
|
|
74
|
+
onKeyDown: t3
|
|
75
|
+
}, nickname);
|
|
76
|
+
$[7] = nickname;
|
|
77
|
+
$[8] = t2;
|
|
78
|
+
$[9] = t3;
|
|
79
|
+
$[10] = t4;
|
|
80
|
+
} else t4 = $[10];
|
|
81
|
+
return t4;
|
|
82
|
+
}
|
|
83
|
+
const HEADER_CLASS_NAME = "border-border flex min-w-0 items-center gap-2.5 border-b p-2";
|
|
84
|
+
/** The item's name, beside a button that leaves the selection and zooms out to the whole Canvas. */
|
|
85
|
+
function CanvasInspectorHeader(t0) {
|
|
86
|
+
const $ = c(11);
|
|
87
|
+
const { onBack, children } = t0;
|
|
88
|
+
let t1;
|
|
89
|
+
if ($[0] !== onBack) {
|
|
90
|
+
t1 = /* @__PURE__ */ jsx(Button, {
|
|
91
|
+
type: "button",
|
|
92
|
+
variant: "outline",
|
|
93
|
+
size: "icon-sm",
|
|
94
|
+
"aria-label": "Show whole canvas",
|
|
95
|
+
onClick: onBack
|
|
96
|
+
});
|
|
97
|
+
$[0] = onBack;
|
|
98
|
+
$[1] = t1;
|
|
99
|
+
} else t1 = $[1];
|
|
100
|
+
let t2;
|
|
101
|
+
if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
|
|
102
|
+
t2 = /* @__PURE__ */ jsx(Minimize, { className: "text-muted-foreground" });
|
|
103
|
+
$[2] = t2;
|
|
104
|
+
} else t2 = $[2];
|
|
105
|
+
let t3;
|
|
106
|
+
if ($[3] !== t1) {
|
|
107
|
+
t3 = /* @__PURE__ */ jsx(Tooltip$1.TooltipTrigger, {
|
|
108
|
+
render: t1,
|
|
109
|
+
children: t2
|
|
110
|
+
});
|
|
111
|
+
$[3] = t1;
|
|
112
|
+
$[4] = t3;
|
|
113
|
+
} else t3 = $[4];
|
|
114
|
+
let t4;
|
|
115
|
+
if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
|
|
116
|
+
t4 = /* @__PURE__ */ jsxs(Tooltip$1.TooltipContent, {
|
|
117
|
+
side: "bottom",
|
|
118
|
+
children: ["Show whole canvas ", formatShortcut(SHOW_WHOLE_CANVAS_SHORTCUT)]
|
|
119
|
+
});
|
|
120
|
+
$[5] = t4;
|
|
121
|
+
} else t4 = $[5];
|
|
122
|
+
let t5;
|
|
123
|
+
if ($[6] !== t3) {
|
|
124
|
+
t5 = /* @__PURE__ */ jsxs(Tooltip$1.Tooltip, { children: [t3, t4] });
|
|
125
|
+
$[6] = t3;
|
|
126
|
+
$[7] = t5;
|
|
127
|
+
} else t5 = $[7];
|
|
128
|
+
let t6;
|
|
129
|
+
if ($[8] !== children || $[9] !== t5) {
|
|
130
|
+
t6 = /* @__PURE__ */ jsxs("header", {
|
|
131
|
+
className: HEADER_CLASS_NAME,
|
|
132
|
+
children: [t5, children]
|
|
133
|
+
});
|
|
134
|
+
$[8] = children;
|
|
135
|
+
$[9] = t5;
|
|
136
|
+
$[10] = t6;
|
|
137
|
+
} else t6 = $[10];
|
|
138
|
+
return t6;
|
|
139
|
+
}
|
|
140
|
+
/** Stands in for the header while the item loads, in its layout, so nothing shifts. */
|
|
141
|
+
function CanvasInspectorHeaderSkeleton() {
|
|
142
|
+
const $ = c(1);
|
|
143
|
+
let t0;
|
|
144
|
+
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
|
|
145
|
+
t0 = /* @__PURE__ */ jsxs("header", {
|
|
146
|
+
className: HEADER_CLASS_NAME,
|
|
147
|
+
children: [/* @__PURE__ */ jsx(Skeleton, { className: "size-8" }), /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-28" })]
|
|
148
|
+
});
|
|
149
|
+
$[0] = t0;
|
|
150
|
+
} else t0 = $[0];
|
|
151
|
+
return t0;
|
|
152
|
+
}
|
|
153
|
+
function CanvasInspectorTitle(t0) {
|
|
154
|
+
const $ = c(2);
|
|
155
|
+
const { children } = t0;
|
|
156
|
+
let t1;
|
|
157
|
+
if ($[0] !== children) {
|
|
158
|
+
t1 = /* @__PURE__ */ jsx("h2", {
|
|
159
|
+
className: "truncate text-sm font-medium",
|
|
160
|
+
children
|
|
161
|
+
});
|
|
162
|
+
$[0] = children;
|
|
163
|
+
$[1] = t1;
|
|
164
|
+
} else t1 = $[1];
|
|
165
|
+
return t1;
|
|
166
|
+
}
|
|
167
|
+
/** A curated page's nickname as the title, which can be renamed in place. */
|
|
168
|
+
function CanvasInspectorNicknameTitle(t0) {
|
|
169
|
+
const $ = c(3);
|
|
170
|
+
const { nickname, onRename } = t0;
|
|
171
|
+
let t1;
|
|
172
|
+
if ($[0] !== nickname || $[1] !== onRename) {
|
|
173
|
+
t1 = /* @__PURE__ */ jsx("h2", {
|
|
174
|
+
className: "flex min-w-0 flex-1",
|
|
175
|
+
children: /* @__PURE__ */ jsx(PageNicknameInput, {
|
|
176
|
+
nickname,
|
|
177
|
+
onRename
|
|
178
|
+
})
|
|
179
|
+
});
|
|
180
|
+
$[0] = nickname;
|
|
181
|
+
$[1] = onRename;
|
|
182
|
+
$[2] = t1;
|
|
183
|
+
} else t1 = $[2];
|
|
184
|
+
return t1;
|
|
185
|
+
}
|
|
186
|
+
function CanvasInspectorBody(t0) {
|
|
187
|
+
const $ = c(2);
|
|
188
|
+
const { children } = t0;
|
|
189
|
+
let t1;
|
|
190
|
+
if ($[0] !== children) {
|
|
191
|
+
t1 = /* @__PURE__ */ jsx("div", {
|
|
192
|
+
className: "flex min-h-0 flex-1 flex-col",
|
|
193
|
+
children
|
|
194
|
+
});
|
|
195
|
+
$[0] = children;
|
|
196
|
+
$[1] = t1;
|
|
197
|
+
} else t1 = $[1];
|
|
198
|
+
return t1;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
//#endregion
|
|
202
|
+
export { CanvasInspectorBody, CanvasInspectorHeader, CanvasInspectorHeaderSkeleton, CanvasInspectorNicknameTitle, CanvasInspectorTitle };
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { previewStore } from "../../preview/previewStore.js";
|
|
2
|
+
import { canvasPagePath } from "../canvasPages.js";
|
|
3
|
+
import { c } from "react/compiler-runtime";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { Button } from "@camox/ui/button";
|
|
7
|
+
import { Plus } from "lucide-react";
|
|
8
|
+
import { Command as Command$1, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, commandFilter } from "@camox/ui/command";
|
|
9
|
+
|
|
10
|
+
//#region src/features/canvas/sidebar/CanvasNavigator.tsx
|
|
11
|
+
/**
|
|
12
|
+
* The Canvas Navigator, shown while nothing is selected: every Page of the Canvas,
|
|
13
|
+
* in Canvas order, with its path, and a search that takes focus. Picking a Page
|
|
14
|
+
* shows it: the camera goes to it.
|
|
15
|
+
*/
|
|
16
|
+
function CanvasNavigator(t0) {
|
|
17
|
+
const $ = c(17);
|
|
18
|
+
const { pages, selectedKey, onShowPage } = t0;
|
|
19
|
+
const [search, setSearch] = React.useState("");
|
|
20
|
+
let t1;
|
|
21
|
+
if ($[0] !== search) {
|
|
22
|
+
t1 = /* @__PURE__ */ jsx(CommandInput, {
|
|
23
|
+
placeholder: "Search pages…",
|
|
24
|
+
autoFocus: true,
|
|
25
|
+
value: search,
|
|
26
|
+
onValueChange: setSearch
|
|
27
|
+
});
|
|
28
|
+
$[0] = search;
|
|
29
|
+
$[1] = t1;
|
|
30
|
+
} else t1 = $[1];
|
|
31
|
+
let t2;
|
|
32
|
+
if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
|
|
33
|
+
t2 = /* @__PURE__ */ jsx(CommandEmpty, { children: "Nothing found." });
|
|
34
|
+
$[2] = t2;
|
|
35
|
+
} else t2 = $[2];
|
|
36
|
+
const t3 = `Pages (${pages.length})`;
|
|
37
|
+
let t4;
|
|
38
|
+
if ($[3] !== onShowPage || $[4] !== pages || $[5] !== selectedKey) {
|
|
39
|
+
let t5;
|
|
40
|
+
if ($[7] !== onShowPage || $[8] !== selectedKey) {
|
|
41
|
+
t5 = (page) => {
|
|
42
|
+
const selected = page.key === selectedKey;
|
|
43
|
+
const path = canvasPagePath(page);
|
|
44
|
+
return /* @__PURE__ */ jsx(CommandItem, {
|
|
45
|
+
value: page.key,
|
|
46
|
+
keywords: path ? [page.title, path] : [page.title],
|
|
47
|
+
"data-checked": selected,
|
|
48
|
+
"aria-current": selected ? "true" : void 0,
|
|
49
|
+
onSelect: () => onShowPage(page.key),
|
|
50
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
51
|
+
className: "flex min-w-0 flex-col py-0.5",
|
|
52
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
53
|
+
className: "truncate font-medium",
|
|
54
|
+
children: page.title
|
|
55
|
+
}), path && /* @__PURE__ */ jsx("span", {
|
|
56
|
+
className: "text-muted-foreground truncate font-mono text-xs",
|
|
57
|
+
children: path
|
|
58
|
+
})]
|
|
59
|
+
})
|
|
60
|
+
}, page.key);
|
|
61
|
+
};
|
|
62
|
+
$[7] = onShowPage;
|
|
63
|
+
$[8] = selectedKey;
|
|
64
|
+
$[9] = t5;
|
|
65
|
+
} else t5 = $[9];
|
|
66
|
+
t4 = pages.map(t5);
|
|
67
|
+
$[3] = onShowPage;
|
|
68
|
+
$[4] = pages;
|
|
69
|
+
$[5] = selectedKey;
|
|
70
|
+
$[6] = t4;
|
|
71
|
+
} else t4 = $[6];
|
|
72
|
+
let t5;
|
|
73
|
+
if ($[10] === Symbol.for("react.memo_cache_sentinel")) {
|
|
74
|
+
t5 = /* @__PURE__ */ jsx("div", {
|
|
75
|
+
className: "p-1",
|
|
76
|
+
children: /* @__PURE__ */ jsxs(Button, {
|
|
77
|
+
type: "button",
|
|
78
|
+
variant: "secondary",
|
|
79
|
+
className: "w-full",
|
|
80
|
+
onClick: _temp2,
|
|
81
|
+
children: [/* @__PURE__ */ jsx(Plus, {}), "Create page"]
|
|
82
|
+
})
|
|
83
|
+
});
|
|
84
|
+
$[10] = t5;
|
|
85
|
+
} else t5 = $[10];
|
|
86
|
+
let t6;
|
|
87
|
+
if ($[11] !== t3 || $[12] !== t4) {
|
|
88
|
+
t6 = /* @__PURE__ */ jsxs(CommandList, {
|
|
89
|
+
className: "max-h-none flex-1",
|
|
90
|
+
children: [t2, /* @__PURE__ */ jsxs(CommandGroup, {
|
|
91
|
+
heading: t3,
|
|
92
|
+
children: [t4, t5]
|
|
93
|
+
})]
|
|
94
|
+
});
|
|
95
|
+
$[11] = t3;
|
|
96
|
+
$[12] = t4;
|
|
97
|
+
$[13] = t6;
|
|
98
|
+
} else t6 = $[13];
|
|
99
|
+
let t7;
|
|
100
|
+
if ($[14] !== t1 || $[15] !== t6) {
|
|
101
|
+
t7 = /* @__PURE__ */ jsx("div", {
|
|
102
|
+
"data-canvas-navigator": true,
|
|
103
|
+
className: "flex min-h-0 flex-1 flex-col",
|
|
104
|
+
children: /* @__PURE__ */ jsxs(Command$1, {
|
|
105
|
+
className: "rounded-none! bg-transparent",
|
|
106
|
+
filter: _temp,
|
|
107
|
+
children: [t1, t6]
|
|
108
|
+
})
|
|
109
|
+
});
|
|
110
|
+
$[14] = t1;
|
|
111
|
+
$[15] = t6;
|
|
112
|
+
$[16] = t7;
|
|
113
|
+
} else t7 = $[16];
|
|
114
|
+
return t7;
|
|
115
|
+
}
|
|
116
|
+
function _temp2() {
|
|
117
|
+
return previewStore.send({ type: "openCreatePageModal" });
|
|
118
|
+
}
|
|
119
|
+
function _temp(_value, search_0, keywords) {
|
|
120
|
+
return commandFilter(keywords?.join(" ") ?? "", search_0);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
//#endregion
|
|
124
|
+
export { CanvasNavigator };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { CanvasSidebarFrame } from "./CanvasSidebarFrame.js";
|
|
2
|
+
import { CreatePageModal } from "../../preview/components/CreatePageModal.js";
|
|
3
|
+
import { CanvasNavigator } from "./CanvasNavigator.js";
|
|
4
|
+
import { PageInspector } from "./PageInspector.js";
|
|
5
|
+
import { c } from "react/compiler-runtime";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
|
|
8
|
+
//#region src/features/canvas/sidebar/CanvasSidebar.tsx
|
|
9
|
+
/**
|
|
10
|
+
* The sidebar beside the Canvas. Without a selection, it shows the Canvas Navigator;
|
|
11
|
+
* with one, the Canvas Inspector of the selected Page.
|
|
12
|
+
*/
|
|
13
|
+
function CanvasSidebar(t0) {
|
|
14
|
+
const $ = c(11);
|
|
15
|
+
const { page, navigator, onShowWholeCanvas, onRenamePage, owner: t1, pageRecord } = t0;
|
|
16
|
+
const owner = t1 === void 0 ? null : t1;
|
|
17
|
+
const t2 = page?.title ?? "Canvas navigator";
|
|
18
|
+
let t3;
|
|
19
|
+
if ($[0] !== navigator || $[1] !== onRenamePage || $[2] !== onShowWholeCanvas || $[3] !== owner || $[4] !== page || $[5] !== pageRecord) {
|
|
20
|
+
t3 = page ? /* @__PURE__ */ jsx(PageInspector, {
|
|
21
|
+
page,
|
|
22
|
+
owner,
|
|
23
|
+
pageRecord,
|
|
24
|
+
onBack: onShowWholeCanvas,
|
|
25
|
+
onRenamePage
|
|
26
|
+
}) : /* @__PURE__ */ jsx(CanvasNavigator, { ...navigator });
|
|
27
|
+
$[0] = navigator;
|
|
28
|
+
$[1] = onRenamePage;
|
|
29
|
+
$[2] = onShowWholeCanvas;
|
|
30
|
+
$[3] = owner;
|
|
31
|
+
$[4] = page;
|
|
32
|
+
$[5] = pageRecord;
|
|
33
|
+
$[6] = t3;
|
|
34
|
+
} else t3 = $[6];
|
|
35
|
+
let t4;
|
|
36
|
+
if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
|
|
37
|
+
t4 = /* @__PURE__ */ jsx(CreatePageModal, {});
|
|
38
|
+
$[7] = t4;
|
|
39
|
+
} else t4 = $[7];
|
|
40
|
+
let t5;
|
|
41
|
+
if ($[8] !== t2 || $[9] !== t3) {
|
|
42
|
+
t5 = /* @__PURE__ */ jsxs(CanvasSidebarFrame, {
|
|
43
|
+
label: t2,
|
|
44
|
+
children: [t3, t4]
|
|
45
|
+
});
|
|
46
|
+
$[8] = t2;
|
|
47
|
+
$[9] = t3;
|
|
48
|
+
$[10] = t5;
|
|
49
|
+
} else t5 = $[10];
|
|
50
|
+
return t5;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
//#endregion
|
|
54
|
+
export { CanvasSidebar };
|