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,229 @@
|
|
|
1
|
+
//#region src/features/canvas/canvasCamera.ts
|
|
2
|
+
/** Require 80% horizontal visibility; stable input order breaks center-distance ties. */
|
|
3
|
+
function findCanvasSnapTarget(camera, viewport, targets) {
|
|
4
|
+
let closest;
|
|
5
|
+
let distance = Infinity;
|
|
6
|
+
for (const target of targets) {
|
|
7
|
+
const left = camera.x + target.left * camera.scale;
|
|
8
|
+
const right = left + target.width * camera.scale;
|
|
9
|
+
if (Math.max(0, Math.min(right, viewport.width) - Math.max(left, 0)) + 1e-8 < (right - left) * .8) continue;
|
|
10
|
+
const nextDistance = Math.abs((left + right - viewport.width) / 2);
|
|
11
|
+
if (nextDistance >= distance) continue;
|
|
12
|
+
closest = target;
|
|
13
|
+
distance = nextDistance;
|
|
14
|
+
}
|
|
15
|
+
return closest;
|
|
16
|
+
}
|
|
17
|
+
const CANVAS_PADDING = 64;
|
|
18
|
+
/** Screen-space inset of a Page snapped to fit the viewport's width. */
|
|
19
|
+
const CANVAS_PAGE_FIT_PADDING = 24;
|
|
20
|
+
const MAX_CANVAS_ZOOM = 2;
|
|
21
|
+
/**
|
|
22
|
+
* Below this, Pages are too small to read while every frame comes near the
|
|
23
|
+
* camera, so painting and panning slow down with the size of the site.
|
|
24
|
+
*/
|
|
25
|
+
const MIN_CANVAS_ZOOM = .1;
|
|
26
|
+
/** Log-scale zoom per pixel of Ctrl/⌘ + wheel, including trackpad pinches. */
|
|
27
|
+
const CANVAS_WHEEL_ZOOM_RATE = .01056;
|
|
28
|
+
/** Relative (log-scale) bands make the detent feel the same at every page width. */
|
|
29
|
+
const ZOOM_SNAP_CAPTURE = .14;
|
|
30
|
+
const ZOOM_SNAP_RELEASE = .18;
|
|
31
|
+
/** Fractions of viewport width: acquire near center, then hold a wider detent. */
|
|
32
|
+
const PAN_SNAP_CAPTURE = .12;
|
|
33
|
+
const PAN_SNAP_RELEASE = .18;
|
|
34
|
+
function isCanvasPageScale(scale, pageScale) {
|
|
35
|
+
return pageScale !== void 0 && Math.abs(Math.log(scale / pageScale)) < 1e-8;
|
|
36
|
+
}
|
|
37
|
+
/** Snapped to a target: at its page fit, centered on it. */
|
|
38
|
+
function isCanvasCameraSnapped(camera, viewport, target) {
|
|
39
|
+
const fit = fitCanvasPage(viewport, target);
|
|
40
|
+
return isCanvasPageScale(camera.scale, fit.scale) && Math.abs(camera.x - fit.x) < .5;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The most zoomed-in view: the page fit, where the camera snaps to its targets.
|
|
44
|
+
* Without targets, the zoom ceiling is MAX_CANVAS_ZOOM.
|
|
45
|
+
*/
|
|
46
|
+
function canvasMaximumScale(viewport, targets, minimumScale) {
|
|
47
|
+
if (!targets.length) return 2;
|
|
48
|
+
const width = Math.min(...targets.map((target) => target.width));
|
|
49
|
+
return Math.max(minimumScale, fitCanvasPage(viewport, {
|
|
50
|
+
left: 0,
|
|
51
|
+
width
|
|
52
|
+
}).scale);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* intendedScale is accumulated independently of the displayed scale, so gentle
|
|
56
|
+
* input can escape the detent. Large steps outside the band pass straight through.
|
|
57
|
+
* The page fit is also the zoom ceiling, so only zooming out leaves the detent.
|
|
58
|
+
*/
|
|
59
|
+
function snapCanvasZoom(scale, intendedScale, pageScale) {
|
|
60
|
+
if (pageScale === void 0) return intendedScale;
|
|
61
|
+
const band = isCanvasPageScale(scale, pageScale) ? ZOOM_SNAP_RELEASE : ZOOM_SNAP_CAPTURE;
|
|
62
|
+
return Math.abs(Math.log(intendedScale / pageScale)) <= band ? pageScale : intendedScale;
|
|
63
|
+
}
|
|
64
|
+
/** At most, the camera stretches this far past a zoom limit (log scale). */
|
|
65
|
+
const ZOOM_STRETCH = Math.log(1.2);
|
|
66
|
+
/** How much the first input past a limit still zooms, as in iOS overscroll. */
|
|
67
|
+
const ZOOM_STRETCH_RESISTANCE = .55;
|
|
68
|
+
/**
|
|
69
|
+
* Past a zoom limit, intent stretches the view with growing resistance and
|
|
70
|
+
* never beyond ZOOM_STRETCH. Within the limits it is the intended scale.
|
|
71
|
+
*/
|
|
72
|
+
function stretchCanvasZoom(intendedScale, minimumScale, maximumScale) {
|
|
73
|
+
const limit = Math.min(maximumScale, Math.max(minimumScale, intendedScale));
|
|
74
|
+
const overshoot = Math.log(intendedScale / limit);
|
|
75
|
+
const distance = Math.abs(overshoot) * ZOOM_STRETCH_RESISTANCE;
|
|
76
|
+
return limit * Math.exp(Math.sign(overshoot) * (ZOOM_STRETCH * distance / (ZOOM_STRETCH + distance)));
|
|
77
|
+
}
|
|
78
|
+
/** The intended scale that stretches to a displayed scale: the inverse of stretchCanvasZoom. */
|
|
79
|
+
function unstretchCanvasZoom(scale, minimumScale, maximumScale) {
|
|
80
|
+
const limit = Math.min(maximumScale, Math.max(minimumScale, scale));
|
|
81
|
+
const stretch = Math.min(Math.abs(Math.log(scale / limit)), ZOOM_STRETCH * (1 - 1e-9));
|
|
82
|
+
const overshoot = ZOOM_STRETCH * stretch / ((ZOOM_STRETCH - stretch) * ZOOM_STRETCH_RESISTANCE);
|
|
83
|
+
return limit * Math.exp(Math.sign(Math.log(scale / limit)) * overshoot);
|
|
84
|
+
}
|
|
85
|
+
const RAIL_EVIDENCE_MS = 80;
|
|
86
|
+
const RAIL_INTENT_PX = 16;
|
|
87
|
+
const RAIL_CAPTURE_RATIO = .65;
|
|
88
|
+
const RAIL_RELEASE_RATIO = .9;
|
|
89
|
+
/**
|
|
90
|
+
* Small startup deltas are evidence, not a permanent rejection of vertical intent.
|
|
91
|
+
* Sum magnitudes in a short window so sign-changing jitter cannot cancel out.
|
|
92
|
+
* Once deliberate two-axis intent wins, never reacquire on its momentum tail.
|
|
93
|
+
*/
|
|
94
|
+
function canvasVerticalRail(delta, time, previous) {
|
|
95
|
+
if (previous?.mode === "free") return previous;
|
|
96
|
+
const mode = previous?.mode ?? "pending";
|
|
97
|
+
const x = Math.abs(delta.x);
|
|
98
|
+
const y = Math.abs(delta.y);
|
|
99
|
+
if (mode === "vertical" && x <= y * RAIL_RELEASE_RATIO) return {
|
|
100
|
+
mode,
|
|
101
|
+
samples: []
|
|
102
|
+
};
|
|
103
|
+
const samples = [...(previous?.samples ?? []).filter((sample) => time - sample.time < RAIL_EVIDENCE_MS), {
|
|
104
|
+
x,
|
|
105
|
+
y,
|
|
106
|
+
time
|
|
107
|
+
}];
|
|
108
|
+
const evidence = samples.reduce((sum, sample) => ({
|
|
109
|
+
x: sum.x + sample.x,
|
|
110
|
+
y: sum.y + sample.y
|
|
111
|
+
}), {
|
|
112
|
+
x: 0,
|
|
113
|
+
y: 0
|
|
114
|
+
});
|
|
115
|
+
if (Math.max(evidence.x, evidence.y) < RAIL_INTENT_PX) return {
|
|
116
|
+
mode,
|
|
117
|
+
samples
|
|
118
|
+
};
|
|
119
|
+
if (mode === "vertical") return {
|
|
120
|
+
mode: "free",
|
|
121
|
+
samples: []
|
|
122
|
+
};
|
|
123
|
+
return {
|
|
124
|
+
mode: evidence.x <= evidence.y * RAIL_CAPTURE_RATIO ? "vertical" : "free",
|
|
125
|
+
samples: []
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/** Start at the selected page's top, fitting its width rather than the whole site. */
|
|
129
|
+
function fitCanvasPage(viewport, page) {
|
|
130
|
+
const padding = Math.min(24, viewport.width / 4);
|
|
131
|
+
const scale = Math.max(Number.EPSILON, Math.min(2, (viewport.width - padding * 2) / Math.max(1, page.width)));
|
|
132
|
+
return {
|
|
133
|
+
x: (viewport.width - page.width * scale) / 2 - page.left * scale,
|
|
134
|
+
y: Math.min(76, viewport.height / 3),
|
|
135
|
+
scale
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/** Place the same document reading point at the canvas viewport's top edge. */
|
|
139
|
+
function placeCanvasPageAnchor(viewport, page, documentY, scale, frameOffsetY = 0) {
|
|
140
|
+
return {
|
|
141
|
+
x: viewport.width / 2 - (page.left + page.width / 2) * scale,
|
|
142
|
+
y: documentY > 0 ? -(documentY + frameOffsetY) * scale : fitCanvasPage(viewport, page).y,
|
|
143
|
+
scale
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/** Reserve readable padding and unscaled page headers in the fitted overview. */
|
|
147
|
+
function canvasInsets(viewport) {
|
|
148
|
+
return {
|
|
149
|
+
x: Math.min(64, viewport.width / 4),
|
|
150
|
+
top: Math.min(116, viewport.height / 3),
|
|
151
|
+
bottom: Math.min(64, viewport.height / 4)
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function zoomCanvasAt(camera, point, scale, minimumScale = Number.EPSILON, maximumScale = 2) {
|
|
155
|
+
const nextScale = Math.min(maximumScale, Math.max(minimumScale, scale));
|
|
156
|
+
if (nextScale === camera.scale) return camera;
|
|
157
|
+
const ratio = nextScale / camera.scale;
|
|
158
|
+
return {
|
|
159
|
+
x: point.x - (point.x - camera.x) * ratio,
|
|
160
|
+
y: point.y - (point.y - camera.y) * ratio,
|
|
161
|
+
scale: nextScale
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
function fitCanvas(viewport, content) {
|
|
165
|
+
const padding = canvasInsets(viewport);
|
|
166
|
+
const scale = Math.max(Number.EPSILON, Math.min(1, (viewport.width - padding.x * 2) / Math.max(1, content.width), (viewport.height - padding.top - padding.bottom) / Math.max(1, content.height)));
|
|
167
|
+
return {
|
|
168
|
+
x: (viewport.width - content.width * scale) / 2,
|
|
169
|
+
y: (viewport.height + padding.top - padding.bottom - content.height * scale) / 2,
|
|
170
|
+
scale
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
/** The zoom floor: the complete overview, unless the site is too large to fit above MIN_CANVAS_ZOOM. */
|
|
174
|
+
function canvasMinimumScale(viewport, content) {
|
|
175
|
+
return Math.max(MIN_CANVAS_ZOOM, fitCanvas(viewport, content).scale);
|
|
176
|
+
}
|
|
177
|
+
/** The most zoomed-out view: the complete overview, or its start at the zoom floor. */
|
|
178
|
+
function canvasOverview(viewport, content) {
|
|
179
|
+
const fit = fitCanvas(viewport, content);
|
|
180
|
+
if (fit.scale >= .1) return fit;
|
|
181
|
+
const padding = canvasInsets(viewport);
|
|
182
|
+
return constrainCanvasCamera({
|
|
183
|
+
x: padding.x,
|
|
184
|
+
y: padding.top,
|
|
185
|
+
scale: MIN_CANVAS_ZOOM
|
|
186
|
+
}, viewport, content);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* How much of the viewport may be empty canvas beside the content, per side.
|
|
190
|
+
* At half, the content's edges can pan up to the viewport's center and no
|
|
191
|
+
* further, so it never leaves the view at any zoom.
|
|
192
|
+
*/
|
|
193
|
+
const CANVAS_OVERSCROLL = .5;
|
|
194
|
+
/**
|
|
195
|
+
* The limit is in screen space, not world space: zooming out leaves as much
|
|
196
|
+
* empty canvas around the content as zooming in, so it never pulls the view.
|
|
197
|
+
* Content smaller than the empty canvas may also sit anywhere fully in view.
|
|
198
|
+
*/
|
|
199
|
+
function constrainAxis(position, viewport, size, scale) {
|
|
200
|
+
const length = size * scale;
|
|
201
|
+
const gap = viewport * CANVAS_OVERSCROLL;
|
|
202
|
+
return Math.min(Math.max(gap, viewport - length), Math.max(Math.min(viewport - gap - length, 0), position));
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Keep the zoom between its limits, and the content in view with bounded empty
|
|
206
|
+
* canvas around it. A stretched camera may zoom up to ZOOM_STRETCH past them.
|
|
207
|
+
*/
|
|
208
|
+
function constrainCanvasCamera(camera, viewport, content, maximumScale = 2, stretched = false) {
|
|
209
|
+
const minimumScale = canvasMinimumScale(viewport, content);
|
|
210
|
+
const stretch = stretched ? Math.exp(ZOOM_STRETCH) : 1;
|
|
211
|
+
const next = zoomCanvasAt(camera, {
|
|
212
|
+
x: viewport.width / 2,
|
|
213
|
+
y: viewport.height / 2
|
|
214
|
+
}, camera.scale, minimumScale / stretch, Math.max(minimumScale, maximumScale) * stretch);
|
|
215
|
+
return {
|
|
216
|
+
x: constrainAxis(next.x, viewport.width, content.width, next.scale),
|
|
217
|
+
y: constrainAxis(next.y, viewport.height, content.height, next.scale),
|
|
218
|
+
scale: next.scale
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/** Wheel deltas can be pixels, lines, or pages depending on the input device. */
|
|
222
|
+
function canvasWheelDelta(delta, mode, viewportSize) {
|
|
223
|
+
if (mode === 1) return delta * 16;
|
|
224
|
+
if (mode === 2) return delta * viewportSize;
|
|
225
|
+
return delta;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
//#endregion
|
|
229
|
+
export { CANVAS_OVERSCROLL, CANVAS_WHEEL_ZOOM_RATE, MIN_CANVAS_ZOOM, PAN_SNAP_CAPTURE, PAN_SNAP_RELEASE, ZOOM_SNAP_CAPTURE, ZOOM_SNAP_RELEASE, ZOOM_STRETCH, canvasInsets, canvasMaximumScale, canvasMinimumScale, canvasOverview, canvasVerticalRail, canvasWheelDelta, constrainCanvasCamera, findCanvasSnapTarget, fitCanvas, fitCanvasPage, isCanvasCameraSnapped, isCanvasPageScale, placeCanvasPageAnchor, snapCanvasZoom, stretchCanvasZoom, unstretchCanvasZoom, zoomCanvasAt };
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { canvasMinimumScale, constrainCanvasCamera } from "./canvasCamera.js";
|
|
2
|
+
|
|
3
|
+
//#region src/features/canvas/canvasFlight.ts
|
|
4
|
+
const MIN_DURATION = 1e3;
|
|
5
|
+
const MAX_DURATION = 2500;
|
|
6
|
+
const ROUTE_VIEW_FRACTION = .5;
|
|
7
|
+
function easeInOut(progress) {
|
|
8
|
+
if (progress <= .5) return progress ** 3 * (20 + progress * (-45 + progress * (36 - 10 * progress)));
|
|
9
|
+
const remaining = 1 - progress;
|
|
10
|
+
return 1 - remaining ** 4 * (15 + remaining * (-24 + 10 * remaining));
|
|
11
|
+
}
|
|
12
|
+
/** Symmetric: speeds up and slows down alike, unlike a flight's long landing. */
|
|
13
|
+
function easeInOutCubic(progress) {
|
|
14
|
+
return progress < .5 ? 4 * progress ** 3 : 1 - (2 - 2 * progress) ** 3 / 2;
|
|
15
|
+
}
|
|
16
|
+
function interpolate(start, end, progress) {
|
|
17
|
+
return start * (1 - progress) + end * progress;
|
|
18
|
+
}
|
|
19
|
+
function bezier(start, control, end, progress) {
|
|
20
|
+
return interpolate(interpolate(start, control, progress), interpolate(control, end, progress), progress);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* One quadratic Bezier in world-center/inverse-scale space, with one ease-in-out
|
|
24
|
+
* clock for all coordinates. Inverse scale acts like camera altitude: distant
|
|
25
|
+
* trips arc up and back down continuously, without zoom/travel phases or a
|
|
26
|
+
* cruising plateau. Nearby trips use a straight path.
|
|
27
|
+
*
|
|
28
|
+
* Valid cameras form a convex volume in these coordinates. Constraining the
|
|
29
|
+
* control point (not just each frame) keeps the whole curve in bounds without
|
|
30
|
+
* clipping its motion into hard corners. Callers supply constrained endpoints.
|
|
31
|
+
*/
|
|
32
|
+
/** A pan takes longer the further it goes, in viewport heights, but stays brief. */
|
|
33
|
+
const PAN_MIN_DURATION = 450;
|
|
34
|
+
const PAN_MAX_DURATION = 900;
|
|
35
|
+
const PAN_DURATION_PER_LOG_VIEWPORT = 300;
|
|
36
|
+
/**
|
|
37
|
+
* A straight, eased pan at a constant zoom, such as one that brings a selected
|
|
38
|
+
* block into view. Unlike a flight, it never zooms out on the way.
|
|
39
|
+
*/
|
|
40
|
+
function createCanvasPan(start, end, viewport) {
|
|
41
|
+
const distance = Math.hypot((end.x - start.x) / Math.max(1, viewport.width), (end.y - start.y) / Math.max(1, viewport.height));
|
|
42
|
+
if (!distance && start.scale === end.scale) return {
|
|
43
|
+
duration: 0,
|
|
44
|
+
at: () => ({ ...start })
|
|
45
|
+
};
|
|
46
|
+
return {
|
|
47
|
+
duration: Math.min(PAN_MAX_DURATION, PAN_MIN_DURATION + PAN_DURATION_PER_LOG_VIEWPORT * Math.log1p(distance)),
|
|
48
|
+
at(progress) {
|
|
49
|
+
if (progress <= 0) return { ...start };
|
|
50
|
+
if (progress >= 1) return { ...end };
|
|
51
|
+
const motion = easeInOutCubic(progress);
|
|
52
|
+
return {
|
|
53
|
+
x: interpolate(start.x, end.x, motion),
|
|
54
|
+
y: interpolate(start.y, end.y, motion),
|
|
55
|
+
scale: interpolate(start.scale, end.scale, motion)
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function createCanvasFlight(start, end, viewport, content) {
|
|
61
|
+
if (start.x === end.x && start.y === end.y && start.scale === end.scale) return {
|
|
62
|
+
duration: 0,
|
|
63
|
+
at: () => ({ ...start })
|
|
64
|
+
};
|
|
65
|
+
const center = (camera) => ({
|
|
66
|
+
x: (viewport.width / 2 - camera.x) / camera.scale,
|
|
67
|
+
y: (viewport.height / 2 - camera.y) / camera.scale,
|
|
68
|
+
altitude: 1 / camera.scale
|
|
69
|
+
});
|
|
70
|
+
const from = center(start);
|
|
71
|
+
const to = center(end);
|
|
72
|
+
const dx = Math.abs(to.x - from.x);
|
|
73
|
+
const dy = Math.abs(to.y - from.y);
|
|
74
|
+
const endpointScale = Math.min(start.scale, end.scale);
|
|
75
|
+
const routeScale = Math.min(dx > 0 ? Math.max(1, viewport.width) * ROUTE_VIEW_FRACTION / dx : Infinity, dy > 0 ? Math.max(1, viewport.height) * ROUTE_VIEW_FRACTION / dy : Infinity);
|
|
76
|
+
const travelScale = Math.max(canvasMinimumScale(viewport, content), Math.min(endpointScale, routeScale));
|
|
77
|
+
const retreat = travelScale < endpointScale;
|
|
78
|
+
const startLog = Math.log(start.scale);
|
|
79
|
+
const endLog = Math.log(end.scale);
|
|
80
|
+
const controlScale = retreat ? travelScale : 2 / (from.altitude + to.altitude);
|
|
81
|
+
const control = center(constrainCanvasCamera({
|
|
82
|
+
x: viewport.width / 2 - interpolate(from.x, to.x, .5) * controlScale,
|
|
83
|
+
y: viewport.height / 2 - interpolate(from.y, to.y, .5) * controlScale,
|
|
84
|
+
scale: controlScale
|
|
85
|
+
}, viewport, content));
|
|
86
|
+
const distance = Math.hypot(dx * endpointScale / Math.max(1, viewport.width), dy * endpointScale / Math.max(1, viewport.height));
|
|
87
|
+
return {
|
|
88
|
+
duration: Math.min(MAX_DURATION, MIN_DURATION + 375 * (Math.log1p(distance) + Math.abs(startLog - endLog))),
|
|
89
|
+
at(progress) {
|
|
90
|
+
if (progress <= 0) return { ...start };
|
|
91
|
+
if (progress >= 1) return { ...end };
|
|
92
|
+
const motion = easeInOut(progress);
|
|
93
|
+
const scale = 1 / bezier(from.altitude, control.altitude, to.altitude, motion);
|
|
94
|
+
return constrainCanvasCamera({
|
|
95
|
+
x: viewport.width / 2 - bezier(from.x, control.x, to.x, motion) * scale,
|
|
96
|
+
y: viewport.height / 2 - bezier(from.y, control.y, to.y, motion) * scale,
|
|
97
|
+
scale
|
|
98
|
+
}, viewport, content);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
//#endregion
|
|
104
|
+
export { createCanvasFlight, createCanvasPan };
|