@adminide-stack/yantra-mobile 12.0.129-alpha.0 → 12.0.129-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/compute.js +57 -1
- package/lib/compute.js.map +1 -1
- package/lib/features/agent-chat/NativeAgentChat.js +3 -2
- package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
- package/lib/features/apps/AppsCatalog.js +10 -0
- package/lib/features/apps/AppsCatalog.js.map +1 -1
- package/lib/features/apps/mobileAppCatalog.js +11 -0
- package/lib/features/apps/mobileAppCatalog.js.map +1 -1
- package/lib/features/canvas/AudioEditorExperience.js +448 -105
- package/lib/features/canvas/AudioEditorExperience.js.map +1 -1
- package/lib/features/canvas/CanvasAgentChatPane.js +33 -14
- package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
- package/lib/features/canvas/CanvasBoardsGrid.js +493 -41
- package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
- package/lib/features/canvas/CanvasChatResultCard.js.map +1 -1
- package/lib/features/canvas/CanvasEditToolsPanel.js +37 -1
- package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
- package/lib/features/canvas/CanvasExperience.js +237 -22
- package/lib/features/canvas/CanvasExperience.js.map +1 -1
- package/lib/features/canvas/CanvasGeneratePanel.js +119 -26
- package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
- package/lib/features/canvas/CanvasLooksPanel.js +17 -6
- package/lib/features/canvas/CanvasLooksPanel.js.map +1 -1
- package/lib/features/canvas/CanvasTasksPanel.js +18 -1
- package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
- package/lib/features/canvas/DesignCategoryGallery.js +423 -0
- package/lib/features/canvas/DesignCategoryGallery.js.map +1 -0
- package/lib/features/canvas/ImageEditorExperience.js +763 -187
- package/lib/features/canvas/ImageEditorExperience.js.map +1 -1
- package/lib/features/canvas/SetStudioExperience.js +199 -11
- package/lib/features/canvas/SetStudioExperience.js.map +1 -1
- package/lib/features/canvas/VideoEditorExperience.js +59 -40
- package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
- package/lib/features/canvas/VideoGeneratorExperience.js +134 -34
- package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
- package/lib/features/canvas/aiEdit.js +4 -2
- package/lib/features/canvas/aiEdit.js.map +1 -1
- package/lib/features/canvas/audioEditor/AudioWaveform.js +96 -0
- package/lib/features/canvas/audioEditor/AudioWaveform.js.map +1 -0
- package/lib/features/canvas/audioEditor/audioPeaks.js +93 -0
- package/lib/features/canvas/audioEditor/audioPeaks.js.map +1 -0
- package/lib/features/canvas/canvasTaskSync.js +34 -7
- package/lib/features/canvas/canvasTaskSync.js.map +1 -1
- package/lib/features/canvas/canvasTasks.js +23 -3
- package/lib/features/canvas/canvasTasks.js.map +1 -1
- package/lib/features/canvas/canvasTheme.js +10 -24
- package/lib/features/canvas/canvasTheme.js.map +1 -1
- package/lib/features/canvas/canvasUi.js +1 -1
- package/lib/features/canvas/canvasUi.js.map +1 -1
- package/lib/features/canvas/createTiles.js +17 -9
- package/lib/features/canvas/createTiles.js.map +1 -1
- package/lib/features/canvas/deepLinks.js +35 -5
- package/lib/features/canvas/deepLinks.js.map +1 -1
- package/lib/features/canvas/designCatalog.js +165 -0
- package/lib/features/canvas/designCatalog.js.map +1 -0
- package/lib/features/canvas/designCategories.js +262 -0
- package/lib/features/canvas/designCategories.js.map +1 -0
- package/lib/features/canvas/editorControls.js +406 -0
- package/lib/features/canvas/editorControls.js.map +1 -0
- package/lib/features/canvas/generationModels.js +5 -3
- package/lib/features/canvas/generationModels.js.map +1 -1
- package/lib/features/canvas/generationTasks.js +162 -0
- package/lib/features/canvas/generationTasks.js.map +1 -0
- package/lib/features/canvas/generator/BottomSheet.js +167 -0
- package/lib/features/canvas/generator/BottomSheet.js.map +1 -0
- package/lib/features/canvas/generator/BusinessCardChatCard.js +155 -0
- package/lib/features/canvas/generator/BusinessCardChatCard.js.map +1 -0
- package/lib/features/canvas/generator/DirectorSheet.js +163 -0
- package/lib/features/canvas/generator/DirectorSheet.js.map +1 -0
- package/lib/features/canvas/generator/ReframePreview.js +122 -0
- package/lib/features/canvas/generator/ReframePreview.js.map +1 -0
- package/lib/features/canvas/generator/RunLogCard.js +119 -0
- package/lib/features/canvas/generator/RunLogCard.js.map +1 -0
- package/lib/features/canvas/generator/ShotPanel.js +261 -0
- package/lib/features/canvas/generator/ShotPanel.js.map +1 -0
- package/lib/features/canvas/generator/businessCardWidget.js +117 -0
- package/lib/features/canvas/generator/businessCardWidget.js.map +1 -0
- package/lib/features/canvas/generator/cameraVocabulary.js +142 -0
- package/lib/features/canvas/generator/cameraVocabulary.js.map +1 -0
- package/lib/features/canvas/generator/cinematicVocabulary.js +416 -0
- package/lib/features/canvas/generator/cinematicVocabulary.js.map +1 -0
- package/lib/features/canvas/generator/direction.js +41 -0
- package/lib/features/canvas/generator/direction.js.map +1 -0
- package/lib/features/canvas/generator/reframeGeometry.js +108 -0
- package/lib/features/canvas/generator/reframeGeometry.js.map +1 -0
- package/lib/features/canvas/generator/runLog.js +71 -0
- package/lib/features/canvas/generator/runLog.js.map +1 -0
- package/lib/features/canvas/generator/shot.js +133 -0
- package/lib/features/canvas/generator/shot.js.map +1 -0
- package/lib/features/canvas/generator/useShotSpec.js +87 -0
- package/lib/features/canvas/generator/useShotSpec.js.map +1 -0
- package/lib/features/canvas/home/HeroComposer.js +214 -0
- package/lib/features/canvas/home/HeroComposer.js.map +1 -0
- package/lib/features/canvas/home/HeroMonitor.js +225 -0
- package/lib/features/canvas/home/HeroMonitor.js.map +1 -0
- package/lib/features/canvas/home/LookDetail.js +185 -0
- package/lib/features/canvas/home/LookDetail.js.map +1 -0
- package/lib/features/canvas/home/LoopingVideo.js +37 -0
- package/lib/features/canvas/home/LoopingVideo.js.map +1 -0
- package/lib/features/canvas/home/TemplatesGallery.js +253 -0
- package/lib/features/canvas/home/TemplatesGallery.js.map +1 -0
- package/lib/features/canvas/home/heroShots.js +100 -0
- package/lib/features/canvas/home/heroShots.js.map +1 -0
- package/lib/features/canvas/homeWork.js +62 -3
- package/lib/features/canvas/homeWork.js.map +1 -1
- package/lib/features/canvas/imageEditor/ImageMarkup.js +195 -0
- package/lib/features/canvas/imageEditor/ImageMarkup.js.map +1 -0
- package/lib/features/canvas/imageEditor/imageEditOps.js +367 -0
- package/lib/features/canvas/imageEditor/imageEditOps.js.map +1 -0
- package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
- package/lib/features/canvas/rankedCatalogSearch.js +375 -0
- package/lib/features/canvas/rankedCatalogSearch.js.map +1 -0
- package/lib/features/canvas/recorder/CameraRecorderExperience.js +68 -20
- package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -1
- package/lib/features/canvas/recorder/RecordingReview.js +272 -0
- package/lib/features/canvas/recorder/RecordingReview.js.map +1 -0
- package/lib/features/canvas/recorder/RecordingsList.js +179 -0
- package/lib/features/canvas/recorder/RecordingsList.js.map +1 -0
- package/lib/features/canvas/recorder/recorderOps.js +99 -0
- package/lib/features/canvas/recorder/recorderOps.js.map +1 -0
- package/lib/features/canvas/seedanceShowcase.js +314 -0
- package/lib/features/canvas/seedanceShowcase.js.map +1 -0
- package/lib/features/canvas/serverTasks.js +149 -15
- package/lib/features/canvas/serverTasks.js.map +1 -1
- package/lib/features/canvas/sessionRenewal.js +114 -0
- package/lib/features/canvas/sessionRenewal.js.map +1 -0
- package/lib/features/canvas/set/SetViewportWebView.js +34 -1
- package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
- package/lib/features/canvas/set/agent/setTurn.js +4 -2
- package/lib/features/canvas/set/agent/setTurn.js.map +1 -1
- package/lib/features/canvas/set/setPresets.js +85 -0
- package/lib/features/canvas/set/setPresets.js.map +1 -0
- package/lib/features/canvas/set/setProject.js +4 -1
- package/lib/features/canvas/set/setProject.js.map +1 -1
- package/lib/features/canvas/studioCatalog.js +59 -4
- package/lib/features/canvas/studioCatalog.js.map +1 -1
- package/lib/features/canvas/studioLooks.js +31 -4
- package/lib/features/canvas/studioLooks.js.map +1 -1
- package/lib/features/canvas/surfaceIndex.js +1 -14
- package/lib/features/canvas/surfaceIndex.js.map +1 -1
- package/lib/features/canvas/templateSearch.js +489 -0
- package/lib/features/canvas/templateSearch.js.map +1 -0
- package/lib/features/canvas/useCanvasSession.js +28 -6
- package/lib/features/canvas/useCanvasSession.js.map +1 -1
- package/lib/features/canvas/useStudioCatalogTemplates.js +41 -5
- package/lib/features/canvas/useStudioCatalogTemplates.js.map +1 -1
- package/lib/features/canvas/videoEditor/EditorPanels.js +531 -0
- package/lib/features/canvas/videoEditor/EditorPanels.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +48 -4
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/agentLoop.js +2 -0
- package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/brainClient.js +97 -27
- package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/cutTools.js +707 -3
- package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
- package/lib/features/canvas/videoEditor/audioServices.js +165 -0
- package/lib/features/canvas/videoEditor/audioServices.js.map +1 -0
- package/lib/features/canvas/videoEditor/captions.js +144 -0
- package/lib/features/canvas/videoEditor/captions.js.map +1 -0
- package/lib/features/canvas/videoEditor/compileTimeline.js +24 -16
- package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -1
- package/lib/features/canvas/videoEditor/editorModel.js +12 -2
- package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
- package/lib/features/canvas/videoEditor/exportTask.js +89 -7
- package/lib/features/canvas/videoEditor/exportTask.js.map +1 -1
- package/lib/features/canvas/videoEditor/layers.js +117 -0
- package/lib/features/canvas/videoEditor/layers.js.map +1 -0
- package/lib/features/canvas/videoEditor/remoteMediaClient.js +45 -18
- package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
- package/lib/features/canvas/videoEditor/renderTimeline.js +18 -6
- package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -1
- package/lib/features/canvas/videoEditor/revoice.js +138 -0
- package/lib/features/canvas/videoEditor/revoice.js.map +1 -0
- package/lib/features/canvas/videoEditor/storageUpload.js +34 -0
- package/lib/features/canvas/videoEditor/storageUpload.js.map +1 -0
- package/lib/features/canvas/videoEditor/textMotion.js +109 -0
- package/lib/features/canvas/videoEditor/textMotion.js.map +1 -0
- package/lib/features/canvas/videoEditor/transitions.js +31 -0
- package/lib/features/canvas/videoEditor/transitions.js.map +1 -0
- package/lib/features/chat/TemplatesChatCards.js +8 -3
- package/lib/features/chat/TemplatesChatCards.js.map +1 -1
- package/lib/features/design/DesignEditorExperience.js +674 -644
- package/lib/features/design/DesignEditorExperience.js.map +1 -1
- package/lib/features/design/DesignExperience.js +285 -538
- package/lib/features/design/DesignExperience.js.map +1 -1
- package/lib/features/design/designCore.js +2 -212
- package/lib/features/design/designCore.js.map +1 -1
- package/lib/features/design/designIndex.js +1 -50
- package/lib/features/design/designIndex.js.map +1 -1
- package/lib/features/design/doc/aiDesign.js +247 -0
- package/lib/features/design/doc/aiDesign.js.map +1 -0
- package/lib/features/design/doc/artifacts.js +280 -0
- package/lib/features/design/doc/artifacts.js.map +1 -0
- package/lib/features/design/doc/chart.js +98 -0
- package/lib/features/design/doc/chart.js.map +1 -0
- package/lib/features/design/doc/crop.js +104 -0
- package/lib/features/design/doc/crop.js.map +1 -0
- package/lib/features/design/doc/curve.js +49 -0
- package/lib/features/design/doc/curve.js.map +1 -0
- package/lib/features/design/doc/docOps.js +397 -0
- package/lib/features/design/doc/docOps.js.map +1 -0
- package/lib/features/design/doc/findReplace.js +112 -0
- package/lib/features/design/doc/findReplace.js.map +1 -0
- package/lib/features/design/doc/fonts.js +79 -0
- package/lib/features/design/doc/fonts.js.map +1 -0
- package/lib/features/design/doc/frames.js +17 -0
- package/lib/features/design/doc/frames.js.map +1 -0
- package/lib/features/design/doc/geometry.js +133 -0
- package/lib/features/design/doc/geometry.js.map +1 -0
- package/lib/features/design/doc/imageAdjust.js +203 -0
- package/lib/features/design/doc/imageAdjust.js.map +1 -0
- package/lib/features/design/doc/legacyDoc.js +107 -0
- package/lib/features/design/doc/legacyDoc.js.map +1 -0
- package/lib/features/design/doc/newDoc.js +335 -0
- package/lib/features/design/doc/newDoc.js.map +1 -0
- package/lib/features/design/doc/pageRange.js +17 -0
- package/lib/features/design/doc/pageRange.js.map +1 -0
- package/lib/features/design/doc/pathScale.js +68 -0
- package/lib/features/design/doc/pathScale.js.map +1 -0
- package/lib/features/design/doc/qr.js +62 -0
- package/lib/features/design/doc/qr.js.map +1 -0
- package/lib/features/design/doc/shapes.js +366 -0
- package/lib/features/design/doc/shapes.js.map +1 -0
- package/lib/features/design/doc/sizes.js +230 -0
- package/lib/features/design/doc/sizes.js.map +1 -0
- package/lib/features/design/doc/textEffects.js +134 -0
- package/lib/features/design/doc/textEffects.js.map +1 -0
- package/lib/features/design/doc/textLayout.js +182 -0
- package/lib/features/design/doc/textLayout.js.map +1 -0
- package/lib/features/design/doc/types.js +30 -0
- package/lib/features/design/doc/types.js.map +1 -0
- package/lib/features/design/editor/AiPanel.js +194 -0
- package/lib/features/design/editor/AiPanel.js.map +1 -0
- package/lib/features/design/editor/ChartDataPanel.js +182 -0
- package/lib/features/design/editor/ChartDataPanel.js.map +1 -0
- package/lib/features/design/editor/CropOverlay.js +199 -0
- package/lib/features/design/editor/CropOverlay.js.map +1 -0
- package/lib/features/design/editor/DesignCanvas.js +363 -0
- package/lib/features/design/editor/DesignCanvas.js.map +1 -0
- package/lib/features/design/editor/ExportSheet.js +123 -0
- package/lib/features/design/editor/ExportSheet.js.map +1 -0
- package/lib/features/design/editor/FindReplacePanel.js +93 -0
- package/lib/features/design/editor/FindReplacePanel.js.map +1 -0
- package/lib/features/design/editor/ImageTools.js +188 -0
- package/lib/features/design/editor/ImageTools.js.map +1 -0
- package/lib/features/design/editor/LayerTools.js +485 -0
- package/lib/features/design/editor/LayerTools.js.map +1 -0
- package/lib/features/design/editor/PageStrip.js +203 -0
- package/lib/features/design/editor/PageStrip.js.map +1 -0
- package/lib/features/design/editor/Slideshow.js +97 -0
- package/lib/features/design/editor/Slideshow.js.map +1 -0
- package/lib/features/design/editor/ToolPanels.js +695 -0
- package/lib/features/design/editor/ToolPanels.js.map +1 -0
- package/lib/features/design/editor/controls.js +630 -0
- package/lib/features/design/editor/controls.js.map +1 -0
- package/lib/features/design/editor/useDesignSave.js +91 -0
- package/lib/features/design/editor/useDesignSave.js.map +1 -0
- package/lib/features/design/export/exportDesign.js +170 -0
- package/lib/features/design/export/exportDesign.js.map +1 -0
- package/lib/features/design/export/pdf.js +143 -0
- package/lib/features/design/export/pdf.js.map +1 -0
- package/lib/features/design/home/DesignHome.js +688 -0
- package/lib/features/design/home/DesignHome.js.map +1 -0
- package/lib/features/design/home/studioHome.js +61 -0
- package/lib/features/design/home/studioHome.js.map +1 -0
- package/lib/features/design/pickDesignImage.js +60 -0
- package/lib/features/design/pickDesignImage.js.map +1 -0
- package/lib/features/design/render/DesignPageView.js +69 -0
- package/lib/features/design/render/DesignPageView.js.map +1 -0
- package/lib/features/design/render/PageCapture.js +288 -0
- package/lib/features/design/render/PageCapture.js.map +1 -0
- package/lib/features/design/render/TextMeasure.js +115 -0
- package/lib/features/design/render/TextMeasure.js.map +1 -0
- package/lib/features/design/render/fontRegistry.js +110 -0
- package/lib/features/design/render/fontRegistry.js.map +1 -0
- package/lib/features/design/render/layers.js +392 -0
- package/lib/features/design/render/layers.js.map +1 -0
- package/lib/features/design/render/svg.js +35 -0
- package/lib/features/design/render/svg.js.map +1 -0
- package/lib/features/design/render/svgParts.js +435 -0
- package/lib/features/design/render/svgParts.js.map +1 -0
- package/lib/features/design/surface/BoardScreen.js +529 -0
- package/lib/features/design/surface/BoardScreen.js.map +1 -0
- package/lib/features/design/surface/CompareView.js +138 -0
- package/lib/features/design/surface/CompareView.js.map +1 -0
- package/lib/features/design/surface/CreationScreen.js +294 -0
- package/lib/features/design/surface/CreationScreen.js.map +1 -0
- package/lib/features/design/surface/DesignAgentChatPane.js +444 -0
- package/lib/features/design/surface/DesignAgentChatPane.js.map +1 -0
- package/lib/features/design/surface/DesignBoards.js +441 -0
- package/lib/features/design/surface/DesignBoards.js.map +1 -0
- package/lib/features/design/surface/DesignPreview.js +159 -0
- package/lib/features/design/surface/DesignPreview.js.map +1 -0
- package/lib/features/design/surface/DesignSurfaceExperience.js +80 -0
- package/lib/features/design/surface/DesignSurfaceExperience.js.map +1 -0
- package/lib/features/design/surface/FullScreenPreview.js +59 -0
- package/lib/features/design/surface/FullScreenPreview.js.map +1 -0
- package/lib/features/design/surface/NewSystemDialog.js +122 -0
- package/lib/features/design/surface/NewSystemDialog.js.map +1 -0
- package/lib/features/design/surface/PickerSheet.js +175 -0
- package/lib/features/design/surface/PickerSheet.js.map +1 -0
- package/lib/features/design/surface/TemplatesGallery.js +156 -0
- package/lib/features/design/surface/TemplatesGallery.js.map +1 -0
- package/lib/features/design/surface/WetPaint.js +140 -0
- package/lib/features/design/surface/WetPaint.js.map +1 -0
- package/lib/features/design/surface/agentTurn.js +229 -0
- package/lib/features/design/surface/agentTurn.js.map +1 -0
- package/lib/features/design/surface/designBoard.js +218 -0
- package/lib/features/design/surface/designBoard.js.map +1 -0
- package/lib/features/design/surface/designChannel.js +186 -0
- package/lib/features/design/surface/designChannel.js.map +1 -0
- package/lib/features/design/surface/designChat.js +141 -0
- package/lib/features/design/surface/designChat.js.map +1 -0
- package/lib/features/design/surface/designConnector.js +266 -0
- package/lib/features/design/surface/designConnector.js.map +1 -0
- package/lib/features/design/surface/designDocument.js +40 -0
- package/lib/features/design/surface/designDocument.js.map +1 -0
- package/lib/features/design/surface/designExport.js +55 -0
- package/lib/features/design/surface/designExport.js.map +1 -0
- package/lib/features/design/surface/designLinks.js +64 -0
- package/lib/features/design/surface/designLinks.js.map +1 -0
- package/lib/features/design/surface/designPalette.js +24 -0
- package/lib/features/design/surface/designPalette.js.map +1 -0
- package/lib/features/design/surface/designRun.js +161 -0
- package/lib/features/design/surface/designRun.js.map +1 -0
- package/lib/features/design/surface/designTheme.js +119 -0
- package/lib/features/design/surface/designTheme.js.map +1 -0
- package/lib/features/design/surface/execStream.js +206 -0
- package/lib/features/design/surface/execStream.js.map +1 -0
- package/lib/features/design/surface/metaball.js +48 -0
- package/lib/features/design/surface/metaball.js.map +1 -0
- package/lib/features/design/surface/pickReferenceFiles.js +35 -0
- package/lib/features/design/surface/pickReferenceFiles.js.map +1 -0
- package/lib/features/design/surface/useDesignSurface.js +379 -0
- package/lib/features/design/surface/useDesignSurface.js.map +1 -0
- package/lib/features/docs/DocBlockRow.js +336 -0
- package/lib/features/docs/DocBlockRow.js.map +1 -0
- package/lib/features/docs/DocsEditorExperience.js +949 -0
- package/lib/features/docs/DocsEditorExperience.js.map +1 -0
- package/lib/features/docs/DocsToolbar.js +247 -0
- package/lib/features/docs/DocsToolbar.js.map +1 -0
- package/lib/features/docs/blocks.js +560 -0
- package/lib/features/docs/blocks.js.map +1 -0
- package/lib/features/docs/docArtifacts.js +129 -0
- package/lib/features/docs/docArtifacts.js.map +1 -0
- package/lib/features/docs/docEdits.js +201 -0
- package/lib/features/docs/docEdits.js.map +1 -0
- package/lib/features/docs/docExport.js +235 -0
- package/lib/features/docs/docExport.js.map +1 -0
- package/lib/features/docs/docShare.js +62 -0
- package/lib/features/docs/docShare.js.map +1 -0
- package/lib/features/links/openInApp.js +38 -2
- package/lib/features/links/openInApp.js.map +1 -1
- package/lib/routes.json +54 -0
- package/lib/screens/DesignNative/index.js +35 -0
- package/lib/screens/DesignNative/index.js.map +1 -0
- package/package.json +3 -3
- package/lib/features/design/exportDesign.js +0 -133
- package/lib/features/design/exportDesign.js.map +0 -1
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
import {parseTemplateQuery,templateSearchReads,rankTemplates,scoreTemplate,templateSearchText,titleFromRowName,NON_WORD}from'./templateSearch.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
const CATALOG_PUBLISHED_STATUS = "published";
|
|
21
|
+
const WIDE_READ_LIMIT = 96;
|
|
22
|
+
const NARROW_READ_LIMIT = 40;
|
|
23
|
+
const POPULAR_OFFSET = 1e9;
|
|
24
|
+
const THIN_READ_ROWS = 24;
|
|
25
|
+
const MAX_ROWS_PER_READ = 48;
|
|
26
|
+
const NAME_WORDS_KEPT = 6;
|
|
27
|
+
const FULL_FIELDS = "id name description category tags formData";
|
|
28
|
+
const LIGHT_FIELDS = "id name description category tags";
|
|
29
|
+
const submissionsQuery = (fields) => `query TemplateCatalog($filter: FormTemplateSubmissionFilter) {
|
|
30
|
+
formTemplateSubmissions(filter: $filter) { nodes { ${fields} } }
|
|
31
|
+
}`;
|
|
32
|
+
function catalogSearchSlug(query) {
|
|
33
|
+
const words = (query != null ? query : "").split(NON_WORD).filter(Boolean);
|
|
34
|
+
return words.length ? words.join("-") : void 0;
|
|
35
|
+
}
|
|
36
|
+
const errorText = (errors) => (errors != null ? errors : []).map((e) => e == null ? void 0 : e.message).filter(Boolean).join("; ") || "Template catalog read failed";
|
|
37
|
+
async function readCatalogRows({
|
|
38
|
+
group,
|
|
39
|
+
query,
|
|
40
|
+
limit,
|
|
41
|
+
offset,
|
|
42
|
+
templateId,
|
|
43
|
+
fields = "full"
|
|
44
|
+
}, read) {
|
|
45
|
+
var _a, _b, _c, _d;
|
|
46
|
+
const search = catalogSearchSlug(query);
|
|
47
|
+
const json = await read({
|
|
48
|
+
filter: __spreadProps(__spreadValues(__spreadValues({
|
|
49
|
+
group,
|
|
50
|
+
status: CATALOG_PUBLISHED_STATUS
|
|
51
|
+
}, templateId ? {
|
|
52
|
+
templateId
|
|
53
|
+
} : {}), search ? {
|
|
54
|
+
search
|
|
55
|
+
} : {}), {
|
|
56
|
+
limit,
|
|
57
|
+
offset
|
|
58
|
+
})
|
|
59
|
+
}, submissionsQuery(fields === "light" ? LIGHT_FIELDS : FULL_FIELDS));
|
|
60
|
+
if (((_a = json.errors) == null ? void 0 : _a.length) && !((_b = json.data) == null ? void 0 : _b.formTemplateSubmissions)) throw new Error(errorText(json.errors));
|
|
61
|
+
const nodes = (_d = (_c = json.data) == null ? void 0 : _c.formTemplateSubmissions) == null ? void 0 : _d.nodes;
|
|
62
|
+
return Array.isArray(nodes) ? nodes : null;
|
|
63
|
+
}
|
|
64
|
+
const isPublished = (row) => !row.status || row.status === CATALOG_PUBLISHED_STATUS;
|
|
65
|
+
async function readCatalogRowsByRef(refs, read) {
|
|
66
|
+
var _a, _b;
|
|
67
|
+
const found = /* @__PURE__ */ new Map();
|
|
68
|
+
const wanted = refs.slice(0, MAX_ROWS_PER_READ);
|
|
69
|
+
if (wanted.length === 0) return found;
|
|
70
|
+
const keep = (ref, row, checked) => {
|
|
71
|
+
if (!row || row.name !== ref.name) return;
|
|
72
|
+
if (checked || row.group === ref.group && isPublished(row)) found.set(ref.name, row);
|
|
73
|
+
};
|
|
74
|
+
const vars = wanted.map((_, i) => `$r${i}: ID!`).join(", ");
|
|
75
|
+
const fields = wanted.map((_, i) => `r${i}: formTemplateSubmission(id: $r${i}) { ${FULL_FIELDS} group status }`).join("\n ");
|
|
76
|
+
let byId;
|
|
77
|
+
try {
|
|
78
|
+
byId = await read(Object.fromEntries(wanted.map((ref, i) => [`r${i}`, ref.id])), `query TemplateRows(${vars}) {
|
|
79
|
+
${fields}
|
|
80
|
+
}`);
|
|
81
|
+
} catch (error) {
|
|
82
|
+
byId = {
|
|
83
|
+
errors: [{
|
|
84
|
+
message: error instanceof Error ? error.message : String(error)
|
|
85
|
+
}]
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
const answered = wanted.some((_, i) => {
|
|
89
|
+
var _a2;
|
|
90
|
+
return (_a2 = byId.data) == null ? void 0 : _a2[`r${i}`];
|
|
91
|
+
});
|
|
92
|
+
if (answered || !((_a = byId.errors) == null ? void 0 : _a.length)) {
|
|
93
|
+
wanted.forEach((ref, i) => {
|
|
94
|
+
var _a2;
|
|
95
|
+
return keep(ref, (_a2 = byId.data) == null ? void 0 : _a2[`r${i}`], false);
|
|
96
|
+
});
|
|
97
|
+
return found;
|
|
98
|
+
}
|
|
99
|
+
const filters = wanted.map((ref) => __spreadProps(__spreadValues({
|
|
100
|
+
group: ref.group,
|
|
101
|
+
status: CATALOG_PUBLISHED_STATUS
|
|
102
|
+
}, ref.templateId ? {
|
|
103
|
+
templateId: ref.templateId
|
|
104
|
+
} : {}), {
|
|
105
|
+
search: catalogSearchSlug(ref.name),
|
|
106
|
+
limit: 3,
|
|
107
|
+
offset: 0
|
|
108
|
+
}));
|
|
109
|
+
const byName = await read(Object.fromEntries(filters.map((f, i) => [`f${i}`, f])), `query TemplateRowsByName(${wanted.map((_, i) => `$f${i}: FormTemplateSubmissionFilter`).join(", ")}) {
|
|
110
|
+
${wanted.map((_, i) => `r${i}: formTemplateSubmissions(filter: $f${i}) { nodes { ${FULL_FIELDS} } }`).join("\n ")}
|
|
111
|
+
}`);
|
|
112
|
+
if (((_b = byName.errors) == null ? void 0 : _b.length) && !byName.data) throw new Error(errorText(byName.errors));
|
|
113
|
+
wanted.forEach((ref, i) => {
|
|
114
|
+
var _a2, _b2;
|
|
115
|
+
const nodes = (_b2 = (_a2 = byName.data) == null ? void 0 : _a2[`r${i}`]) == null ? void 0 : _b2.nodes;
|
|
116
|
+
keep(ref, nodes == null ? void 0 : nodes.find((n) => (n == null ? void 0 : n.name) === ref.name), true);
|
|
117
|
+
});
|
|
118
|
+
return found;
|
|
119
|
+
}
|
|
120
|
+
const MATCH_ORDER = {
|
|
121
|
+
exact: 0,
|
|
122
|
+
close: 1,
|
|
123
|
+
popular: 2
|
|
124
|
+
};
|
|
125
|
+
async function runReads(reads, groups, templateIdOf, read) {
|
|
126
|
+
const jobs = reads.flatMap((r) => groups.map((group) => ({
|
|
127
|
+
read: r,
|
|
128
|
+
group
|
|
129
|
+
})));
|
|
130
|
+
const settled = await Promise.all(jobs.map(({
|
|
131
|
+
read: r,
|
|
132
|
+
group
|
|
133
|
+
}) => readCatalogRows({
|
|
134
|
+
group,
|
|
135
|
+
query: r.words.join(" "),
|
|
136
|
+
limit: r.wide ? WIDE_READ_LIMIT : NARROW_READ_LIMIT,
|
|
137
|
+
offset: 0,
|
|
138
|
+
templateId: templateIdOf(group),
|
|
139
|
+
fields: "light"
|
|
140
|
+
}, read).then((rows) => ({
|
|
141
|
+
ok: true,
|
|
142
|
+
rows
|
|
143
|
+
}), (reason) => ({
|
|
144
|
+
ok: false,
|
|
145
|
+
reason
|
|
146
|
+
}))));
|
|
147
|
+
const failures = [];
|
|
148
|
+
const results = settled.map((s, i) => {
|
|
149
|
+
if ("reason" in s) failures.push(s.reason);
|
|
150
|
+
return __spreadProps(__spreadValues({}, jobs[i]), {
|
|
151
|
+
rows: s.ok ? s.rows : null
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
return {
|
|
155
|
+
results,
|
|
156
|
+
failures
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
async function gather(query, groups, templateIdOf, read) {
|
|
160
|
+
var _a, _b;
|
|
161
|
+
const reads = templateSearchReads(query);
|
|
162
|
+
const first = await runReads(reads.filter((r) => r.stage === 1), groups, templateIdOf, read);
|
|
163
|
+
const found = /* @__PURE__ */ new Map();
|
|
164
|
+
for (const {
|
|
165
|
+
read: r,
|
|
166
|
+
rows: rows2
|
|
167
|
+
} of first.results) {
|
|
168
|
+
if (r.concept) found.set(r.concept, ((_a = found.get(r.concept)) != null ? _a : 0) + ((_b = rows2 == null ? void 0 : rows2.length) != null ? _b : 0));
|
|
169
|
+
}
|
|
170
|
+
const second = await runReads(reads.filter((r) => {
|
|
171
|
+
var _a2, _b2;
|
|
172
|
+
return r.stage === 2 && ((_b2 = found.get((_a2 = r.concept) != null ? _a2 : "")) != null ? _b2 : 0) < THIN_READ_ROWS;
|
|
173
|
+
}), groups, templateIdOf, read);
|
|
174
|
+
const results = [...first.results, ...second.results];
|
|
175
|
+
const failures = [...first.failures, ...second.failures];
|
|
176
|
+
if (failures.length > 0 && failures.length === results.length) throw failures[0];
|
|
177
|
+
const rows = /* @__PURE__ */ new Map();
|
|
178
|
+
results.forEach(({
|
|
179
|
+
read: r,
|
|
180
|
+
group,
|
|
181
|
+
rows: hits
|
|
182
|
+
}) => {
|
|
183
|
+
if (!hits) return;
|
|
184
|
+
for (const row of hits) {
|
|
185
|
+
const name = typeof (row == null ? void 0 : row.name) === "string" ? row.name : "";
|
|
186
|
+
const id = typeof (row == null ? void 0 : row.id) === "string" ? row.id : "";
|
|
187
|
+
if (!name || !id) continue;
|
|
188
|
+
let entry = rows.get(name);
|
|
189
|
+
if (!entry) {
|
|
190
|
+
entry = {
|
|
191
|
+
row,
|
|
192
|
+
group,
|
|
193
|
+
foundBy: /* @__PURE__ */ new Set()
|
|
194
|
+
};
|
|
195
|
+
rows.set(name, entry);
|
|
196
|
+
}
|
|
197
|
+
const hit = entry;
|
|
198
|
+
r.terms.forEach((t) => hit.foundBy.add(t));
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
const ranked = rankTemplates(query, [...rows.values()], ({
|
|
202
|
+
row,
|
|
203
|
+
group
|
|
204
|
+
}) => {
|
|
205
|
+
const title = titleFromRowName(row.name, group);
|
|
206
|
+
return templateSearchText({
|
|
207
|
+
title,
|
|
208
|
+
tags: row.tags,
|
|
209
|
+
category: row.category,
|
|
210
|
+
description: row.description
|
|
211
|
+
}, title.split(" ").length < NAME_WORDS_KEPT);
|
|
212
|
+
}, (entry) => entry.foundBy);
|
|
213
|
+
return ranked.map(({
|
|
214
|
+
item,
|
|
215
|
+
match,
|
|
216
|
+
score
|
|
217
|
+
}) => {
|
|
218
|
+
const templateId = templateIdOf(item.group);
|
|
219
|
+
return __spreadProps(__spreadValues({
|
|
220
|
+
id: item.row.id,
|
|
221
|
+
name: item.row.name,
|
|
222
|
+
group: item.group
|
|
223
|
+
}, templateId ? {
|
|
224
|
+
templateId
|
|
225
|
+
} : {}), {
|
|
226
|
+
match,
|
|
227
|
+
score
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
const MAX_SESSIONS = 6;
|
|
232
|
+
const sessions = /* @__PURE__ */ new Map();
|
|
233
|
+
function record(value) {
|
|
234
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
235
|
+
}
|
|
236
|
+
function formDataOf(row) {
|
|
237
|
+
if (typeof row.formData === "string") {
|
|
238
|
+
try {
|
|
239
|
+
return record(JSON.parse(row.formData));
|
|
240
|
+
} catch (e) {
|
|
241
|
+
return {};
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return record(row.formData);
|
|
245
|
+
}
|
|
246
|
+
const text = (v) => typeof v === "string" ? v : "";
|
|
247
|
+
function catalogRowSearchFields(row, group) {
|
|
248
|
+
const details = record(formDataOf(row).generationDetails);
|
|
249
|
+
const name = text(row.name);
|
|
250
|
+
return {
|
|
251
|
+
title: text(details.title) || (name ? titleFromRowName(name, group) : ""),
|
|
252
|
+
summary: text(details.summary) || text(row.description),
|
|
253
|
+
tags: Array.isArray(row.tags) ? row.tags.filter((t) => typeof t === "string") : [],
|
|
254
|
+
category: text(row.category)
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
async function rankedCatalogSearch(params) {
|
|
258
|
+
var _a, _b, _c, _d, _e, _f;
|
|
259
|
+
const groups = typeof params.group === "string" ? [params.group] : [...params.group];
|
|
260
|
+
const templateIdOf = (_a = params.templateIdOf) != null ? _a : (() => void 0);
|
|
261
|
+
const fieldsOf = (_b = params.fieldsOf) != null ? _b : catalogRowSearchFields;
|
|
262
|
+
const accept = (_c = params.accept) != null ? _c : (() => true);
|
|
263
|
+
const offset = Math.max(0, (_d = params.offset) != null ? _d : 0);
|
|
264
|
+
const query = parseTemplateQuery(params.query, {
|
|
265
|
+
categoryWords: (_e = params.categoryWords) != null ? _e : []
|
|
266
|
+
});
|
|
267
|
+
const popular = (_f = params.popular) != null ? _f : (async (from) => {
|
|
268
|
+
var _a2;
|
|
269
|
+
const rows = (_a2 = await readCatalogRows({
|
|
270
|
+
group: groups[0],
|
|
271
|
+
limit: params.limit,
|
|
272
|
+
offset: from,
|
|
273
|
+
templateId: templateIdOf(groups[0])
|
|
274
|
+
}, params.read)) != null ? _a2 : [];
|
|
275
|
+
return {
|
|
276
|
+
rows,
|
|
277
|
+
next: rows.length >= params.limit ? from + params.limit : null
|
|
278
|
+
};
|
|
279
|
+
});
|
|
280
|
+
const popularPage = async (from, names, shifted) => {
|
|
281
|
+
const page = await popular(from);
|
|
282
|
+
return {
|
|
283
|
+
rows: page.rows.filter((row) => !names.has(text(row == null ? void 0 : row.name)) && accept(row, groups[0])).map((row) => ({
|
|
284
|
+
row,
|
|
285
|
+
group: groups[0],
|
|
286
|
+
match: "popular"
|
|
287
|
+
})),
|
|
288
|
+
next: page.next === null ? null : shifted ? POPULAR_OFFSET + page.next : page.next,
|
|
289
|
+
query
|
|
290
|
+
};
|
|
291
|
+
};
|
|
292
|
+
if (query.empty) return popularPage(offset >= POPULAR_OFFSET ? offset - POPULAR_OFFSET : offset, /* @__PURE__ */ new Set(), false);
|
|
293
|
+
const key = JSON.stringify([groups, groups.map(templateIdOf), query.subjects, query.styles]);
|
|
294
|
+
let session = sessions.get(key);
|
|
295
|
+
if (!session) {
|
|
296
|
+
const created = gather(query, groups, templateIdOf, params.read).then((candidates) => ({
|
|
297
|
+
candidates,
|
|
298
|
+
names: new Set(candidates.map((c) => c.name)),
|
|
299
|
+
floorAt: /* @__PURE__ */ new Map()
|
|
300
|
+
}));
|
|
301
|
+
created.catch(() => sessions.delete(key));
|
|
302
|
+
sessions.set(key, created);
|
|
303
|
+
while (sessions.size > MAX_SESSIONS) {
|
|
304
|
+
const oldest = sessions.keys().next().value;
|
|
305
|
+
if (oldest === void 0) break;
|
|
306
|
+
sessions.delete(oldest);
|
|
307
|
+
}
|
|
308
|
+
session = created;
|
|
309
|
+
}
|
|
310
|
+
const s = await session;
|
|
311
|
+
if (offset < POPULAR_OFFSET && offset < s.candidates.length) {
|
|
312
|
+
return matchesPage(query, s, offset, params.limit, params.read, fieldsOf, accept);
|
|
313
|
+
}
|
|
314
|
+
return popularPage(offset >= POPULAR_OFFSET ? offset - POPULAR_OFFSET : 0, s.names, true);
|
|
315
|
+
}
|
|
316
|
+
async function matchesPage(query, session, offset, limit, read, fieldsOf, accept) {
|
|
317
|
+
var _a;
|
|
318
|
+
const slice = session.candidates.slice(offset, offset + limit);
|
|
319
|
+
const rows = await readCatalogRowsByRef(slice, read);
|
|
320
|
+
const listed = [];
|
|
321
|
+
slice.forEach((candidate, order) => {
|
|
322
|
+
var _a2;
|
|
323
|
+
const row = rows.get(candidate.name);
|
|
324
|
+
if (!row || !accept(row, candidate.group)) return;
|
|
325
|
+
const whole = scoreTemplate(query, templateSearchText(fieldsOf(row, candidate.group)));
|
|
326
|
+
const match = (_a2 = whole.match) != null ? _a2 : candidate.match;
|
|
327
|
+
const score = whole.match ? whole.score : candidate.score;
|
|
328
|
+
listed.push({
|
|
329
|
+
item: {
|
|
330
|
+
row,
|
|
331
|
+
group: candidate.group,
|
|
332
|
+
match
|
|
333
|
+
},
|
|
334
|
+
score,
|
|
335
|
+
order
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
listed.sort((a, b) => b.score - a.score || a.order - b.order);
|
|
339
|
+
let floor = (_a = session.floorAt.get(offset)) != null ? _a : "exact";
|
|
340
|
+
const items = listed.map(({
|
|
341
|
+
item
|
|
342
|
+
}) => {
|
|
343
|
+
if (MATCH_ORDER[item.match] < MATCH_ORDER[floor]) return __spreadProps(__spreadValues({}, item), {
|
|
344
|
+
match: floor
|
|
345
|
+
});
|
|
346
|
+
floor = item.match;
|
|
347
|
+
return item;
|
|
348
|
+
});
|
|
349
|
+
const end = offset + slice.length;
|
|
350
|
+
session.floorAt.set(end, floor);
|
|
351
|
+
return {
|
|
352
|
+
rows: items,
|
|
353
|
+
next: end < session.candidates.length ? end : POPULAR_OFFSET,
|
|
354
|
+
query
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
function fetchCatalogRead(endpoint, token) {
|
|
358
|
+
return async (variables, query) => {
|
|
359
|
+
var _a;
|
|
360
|
+
const res = await fetch(endpoint, {
|
|
361
|
+
method: "POST",
|
|
362
|
+
headers: __spreadValues({
|
|
363
|
+
"content-type": "application/json"
|
|
364
|
+
}, token ? {
|
|
365
|
+
authorization: `Bearer ${token}`
|
|
366
|
+
} : {}),
|
|
367
|
+
body: JSON.stringify({
|
|
368
|
+
query,
|
|
369
|
+
variables
|
|
370
|
+
})
|
|
371
|
+
});
|
|
372
|
+
if (!res.ok) throw new Error(`Template catalog read failed (${res.status})`);
|
|
373
|
+
return (_a = await res.json().catch(() => ({}))) != null ? _a : {};
|
|
374
|
+
};
|
|
375
|
+
}export{CATALOG_PUBLISHED_STATUS,MAX_ROWS_PER_READ,NARROW_READ_LIMIT,POPULAR_OFFSET,THIN_READ_ROWS,WIDE_READ_LIMIT,catalogRowSearchFields,fetchCatalogRead,rankedCatalogSearch,readCatalogRows,readCatalogRowsByRef};//# sourceMappingURL=rankedCatalogSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rankedCatalogSearch.js","sources":["../../../src/features/canvas/rankedCatalogSearch.ts"],"sourcesContent":["/**\n * A searched template catalog, a page at a time: the matches best first, then\n * the category's own templates, so a search never comes back empty while the\n * category has any. Native port of surface-kit `templateCatalogs/\n * rankedCatalogSearch` + `catalogRead` (kit 0.43).\n *\n * The backend `formTemplateSubmissions` search keeps only rows that hold every\n * word, unranked (\"clean modern fancy\" found 0). So a search here is:\n *\n * 1. Gather: a handful of LIGHT reads (id name description category tags) -\n * every word together, each subject word, near words (./templateSearch\n * `templateSearchReads`).\n * 2. Rank the candidates on the whole query (`rankTemplates`).\n * 3. Read whole only the rows a page shows, in ONE aliased\n * `formTemplateSubmission(id:)` request, and order the page again on them.\n * 4. After the matches, the category's own unsearched rows follow as `popular`.\n *\n * Transport-agnostic: `read(variables, query)` performs one GraphQL POST and\n * returns its `{ data, errors }` - Apollo (`apolloCatalogRead` in\n * ./studioCatalog) or plain fetch (`fetchCatalogRead` below).\n */\nimport {\n NON_WORD,\n parseTemplateQuery,\n rankTemplates,\n scoreTemplate,\n templateSearchReads,\n templateSearchText,\n titleFromRowName,\n type TemplateMatch,\n type TemplateQuery,\n type TemplateSearchFields,\n type TemplateSearchRead,\n} from './templateSearch';\n\nexport type CatalogRow = Record<string, any>;\n\n/** One GraphQL answer, as any transport returns it. */\nexport interface CatalogGraphqlAnswer {\n data?: Record<string, any> | null;\n errors?: ReadonlyArray<{ message?: string } | null> | null;\n}\n\n/** Performs one GraphQL POST of `query` with `variables`. May throw on a failed request. */\nexport type CatalogGraphqlRead = (variables: Record<string, unknown>, query: string) => Promise<CatalogGraphqlAnswer>;\n\n/** The row status a public catalog lists. */\nexport const CATALOG_PUBLISHED_STATUS = 'published';\n\n/** Light rows a primary read gathers, and a near-word read. */\nexport const WIDE_READ_LIMIT = 96;\nexport const NARROW_READ_LIMIT = 40;\n/** Offsets at or past this are the category's own pages: `POPULAR_OFFSET + <that page's offset>`. */\nexport const POPULAR_OFFSET = 1_000_000_000;\n/** A word whose own read found fewer rows than this has its near words read too. */\nexport const THIN_READ_ROWS = 24;\n/** Rows read whole in one request, at most this many. */\nexport const MAX_ROWS_PER_READ = 48;\n/** A row name past this many words may be a title cut short. */\nconst NAME_WORDS_KEPT = 6;\n\nconst FULL_FIELDS = 'id name description category tags formData';\nconst LIGHT_FIELDS = 'id name description category tags';\n\nconst submissionsQuery = (fields: string) => `query TemplateCatalog($filter: FormTemplateSubmissionFilter) {\n formTemplateSubmissions(filter: $filter) { nodes { ${fields} } }\n}`;\n\n/** Search words joined the way the backend's slugged row names join them (\"real-estate\"). */\nfunction catalogSearchSlug(query: string | undefined): string | undefined {\n const words = (query ?? '').split(NON_WORD).filter(Boolean);\n return words.length ? words.join('-') : undefined;\n}\n\nconst errorText = (errors: CatalogGraphqlAnswer['errors']) =>\n (errors ?? [])\n .map((e) => e?.message)\n .filter(Boolean)\n .join('; ') || 'Template catalog read failed';\n\ninterface RowsQuery {\n group: string;\n query?: string;\n limit: number;\n offset: number;\n templateId?: string;\n fields?: 'full' | 'light';\n}\n\n/** One page of a group's published rows. Throws on a failed read; null when the answer has no list. */\nexport async function readCatalogRows(\n { group, query, limit, offset, templateId, fields = 'full' }: RowsQuery,\n read: CatalogGraphqlRead,\n): Promise<CatalogRow[] | null> {\n const search = catalogSearchSlug(query);\n const json = await read(\n {\n filter: {\n group,\n status: CATALOG_PUBLISHED_STATUS,\n ...(templateId ? { templateId } : {}),\n ...(search ? { search } : {}),\n limit,\n offset,\n },\n },\n submissionsQuery(fields === 'light' ? LIGHT_FIELDS : FULL_FIELDS),\n );\n if (json.errors?.length && !json.data?.formTemplateSubmissions) throw new Error(errorText(json.errors));\n const nodes = json.data?.formTemplateSubmissions?.nodes;\n return Array.isArray(nodes) ? nodes : null;\n}\n\n/** A row a search found, to read whole. */\nexport interface CatalogRowRef {\n id: string;\n name: string;\n group: string;\n templateId?: string;\n}\n\nconst isPublished = (row: CatalogRow) => !row.status || row.status === CATALOG_PUBLISHED_STATUS;\n\n/**\n * Whole rows for refs a light search found, in one request (`formTemplateSubmission`\n * aliased once per row), keyed by row name. Only rows still published and in their\n * group come back. Should the read by id fail, each row is looked up by name instead.\n */\nexport async function readCatalogRowsByRef(\n refs: readonly CatalogRowRef[],\n read: CatalogGraphqlRead,\n): Promise<Map<string, CatalogRow>> {\n const found = new Map<string, CatalogRow>();\n const wanted = refs.slice(0, MAX_ROWS_PER_READ);\n if (wanted.length === 0) return found;\n const keep = (ref: CatalogRowRef, row: CatalogRow | null | undefined, checked: boolean) => {\n if (!row || row.name !== ref.name) return;\n if (checked || (row.group === ref.group && isPublished(row))) found.set(ref.name, row);\n };\n const vars = wanted.map((_, i) => `$r${i}: ID!`).join(', ');\n const fields = wanted\n .map((_, i) => `r${i}: formTemplateSubmission(id: $r${i}) { ${FULL_FIELDS} group status }`)\n .join('\\n ');\n let byId: CatalogGraphqlAnswer;\n try {\n byId = await read(\n Object.fromEntries(wanted.map((ref, i) => [`r${i}`, ref.id])),\n `query TemplateRows(${vars}) {\\n ${fields}\\n}`,\n );\n } catch (error) {\n byId = { errors: [{ message: error instanceof Error ? error.message : String(error) }] };\n }\n const answered = wanted.some((_, i) => byId.data?.[`r${i}`]);\n if (answered || !byId.errors?.length) {\n wanted.forEach((ref, i) => keep(ref, byId.data?.[`r${i}`], false));\n return found;\n }\n const filters = wanted.map((ref) => ({\n group: ref.group,\n status: CATALOG_PUBLISHED_STATUS,\n ...(ref.templateId ? { templateId: ref.templateId } : {}),\n search: catalogSearchSlug(ref.name),\n limit: 3,\n offset: 0,\n }));\n const byName = await read(\n Object.fromEntries(filters.map((f, i) => [`f${i}`, f])),\n `query TemplateRowsByName(${wanted.map((_, i) => `$f${i}: FormTemplateSubmissionFilter`).join(', ')}) {\\n ${wanted\n .map((_, i) => `r${i}: formTemplateSubmissions(filter: $f${i}) { nodes { ${FULL_FIELDS} } }`)\n .join('\\n ')}\\n}`,\n );\n if (byName.errors?.length && !byName.data) throw new Error(errorText(byName.errors));\n wanted.forEach((ref, i) => {\n const nodes = byName.data?.[`r${i}`]?.nodes as CatalogRow[] | undefined;\n keep(\n ref,\n nodes?.find((n) => n?.name === ref.name),\n true,\n );\n });\n return found;\n}\n\n// ─── Gather and rank ────────────────────────────────────────────────────────\n\ninterface Candidate extends CatalogRowRef {\n match: Exclude<TemplateMatch, 'popular'>;\n score: number;\n}\n\ninterface Session {\n candidates: Candidate[];\n names: Set<string>;\n floorAt: Map<number, TemplateMatch>;\n}\n\nconst MATCH_ORDER: Record<TemplateMatch, number> = { exact: 0, close: 1, popular: 2 };\n\ntype ReadResult = { read: TemplateSearchRead; group: string; rows: CatalogRow[] | null };\n\nasync function runReads(\n reads: readonly TemplateSearchRead[],\n groups: readonly string[],\n templateIdOf: (group: string) => string | undefined,\n read: CatalogGraphqlRead,\n): Promise<{ results: ReadResult[]; failures: unknown[] }> {\n const jobs = reads.flatMap((r) => groups.map((group) => ({ read: r, group })));\n const settled = await Promise.all(\n jobs.map(({ read: r, group }) =>\n readCatalogRows(\n {\n group,\n query: r.words.join(' '),\n limit: r.wide ? WIDE_READ_LIMIT : NARROW_READ_LIMIT,\n offset: 0,\n templateId: templateIdOf(group),\n fields: 'light',\n },\n read,\n ).then(\n (rows) => ({ ok: true as const, rows }),\n (reason: unknown) => ({ ok: false as const, reason }),\n ),\n ),\n );\n const failures: unknown[] = [];\n const results = settled.map((s, i) => {\n if ('reason' in s) failures.push(s.reason);\n return { ...jobs[i], rows: s.ok ? s.rows : null };\n });\n return { results, failures };\n}\n\n/** Gather and rank one query's candidates. Throws only when every read failed. */\nasync function gather(\n query: TemplateQuery,\n groups: readonly string[],\n templateIdOf: (group: string) => string | undefined,\n read: CatalogGraphqlRead,\n): Promise<Candidate[]> {\n const reads = templateSearchReads(query);\n const first = await runReads(\n reads.filter((r) => r.stage === 1),\n groups,\n templateIdOf,\n read,\n );\n const found = new Map<string, number>();\n for (const { read: r, rows } of first.results) {\n if (r.concept) found.set(r.concept, (found.get(r.concept) ?? 0) + (rows?.length ?? 0));\n }\n const second = await runReads(\n reads.filter((r) => r.stage === 2 && (found.get(r.concept ?? '') ?? 0) < THIN_READ_ROWS),\n groups,\n templateIdOf,\n read,\n );\n const results = [...first.results, ...second.results];\n const failures = [...first.failures, ...second.failures];\n if (failures.length > 0 && failures.length === results.length) throw failures[0];\n\n const rows = new Map<string, { row: CatalogRow; group: string; foundBy: Set<string> }>();\n results.forEach(({ read: r, group, rows: hits }) => {\n if (!hits) return;\n for (const row of hits) {\n const name = typeof row?.name === 'string' ? row.name : '';\n const id = typeof row?.id === 'string' ? row.id : '';\n if (!name || !id) continue;\n let entry = rows.get(name);\n if (!entry) {\n entry = { row, group, foundBy: new Set() };\n rows.set(name, entry);\n }\n const hit = entry;\n r.terms.forEach((t) => hit.foundBy.add(t));\n }\n });\n const ranked = rankTemplates(\n query,\n [...rows.values()],\n ({ row, group }) => {\n const title = titleFromRowName(row.name, group);\n return templateSearchText(\n { title, tags: row.tags, category: row.category, description: row.description },\n title.split(' ').length < NAME_WORDS_KEPT,\n );\n },\n (entry) => entry.foundBy,\n );\n return ranked.map(({ item, match, score }) => {\n const templateId = templateIdOf(item.group);\n return {\n id: item.row.id,\n name: item.row.name,\n group: item.group,\n ...(templateId ? { templateId } : {}),\n match,\n score,\n };\n });\n}\n\n// ─── The search ─────────────────────────────────────────────────────────────\n\n/** A row a searched page lists, and how it fits the search. */\nexport interface RankedCatalogRow {\n row: CatalogRow;\n group: string;\n match: TemplateMatch;\n}\n\nexport interface RankedCatalogPage {\n rows: RankedCatalogRow[];\n /** Where the next page starts (pass back as `offset`), or null at the end. */\n next: number | null;\n /** The query as read. */\n query: TemplateQuery;\n}\n\nexport interface RankedCatalogSearchParams {\n /** The publish group (`video-studio`, `canvas-flyer`), or several read as one catalog. */\n group: string | readonly string[];\n /** What was typed. */\n query: string;\n /** Rows per page. */\n limit: number;\n /** 0 for the first page; then the `next` a page returned. */\n offset?: number;\n /** One GraphQL POST. */\n read: CatalogGraphqlRead;\n /** The marketplace record a group's listing reads, when it lists only one. */\n templateIdOf?: (group: string) => string | undefined;\n /** Words that name the category (\"video\", \"flyer\"): a search inside it says nothing by them. */\n categoryWords?: readonly string[];\n /** What a whole row is searched by; defaults to its generationDetails title/summary, tags, category. */\n fieldsOf?: (row: CatalogRow, group: string) => TemplateSearchFields;\n /** False for a row the page cannot offer. */\n accept?: (row: CatalogRow, group: string) => boolean;\n /** A page of the category's own rows (no search); defaults to an unsearched read of the first group. */\n popular?: (offset: number) => Promise<{ rows: CatalogRow[]; next: number | null }>;\n}\n\nconst MAX_SESSIONS = 6;\nconst sessions = new Map<string, Promise<Session>>();\n\n/** Forget remembered searches (tests; a sign-out). */\nexport function clearRankedCatalogSearchCache(): void {\n sessions.clear();\n}\n\nfunction record(value: unknown): Record<string, any> {\n return value && typeof value === 'object' && !Array.isArray(value) ? (value as Record<string, any>) : {};\n}\n\nfunction formDataOf(row: CatalogRow): Record<string, any> {\n if (typeof row.formData === 'string') {\n try {\n return record(JSON.parse(row.formData));\n } catch {\n return {};\n }\n }\n return record(row.formData);\n}\n\nconst text = (v: unknown) => (typeof v === 'string' ? v : '');\n\n/** What a whole row is searched by: its title and summary as the publish lane wrote them. */\nexport function catalogRowSearchFields(row: CatalogRow, group: string): TemplateSearchFields {\n const details = record(formDataOf(row).generationDetails);\n const name = text(row.name);\n return {\n title: text(details.title) || (name ? titleFromRowName(name, group) : ''),\n summary: text(details.summary) || text(row.description),\n tags: Array.isArray(row.tags) ? row.tags.filter((t: unknown): t is string => typeof t === 'string') : [],\n category: text(row.category),\n };\n}\n\n/**\n * One page of a ranked catalog search. A query of nothing but filler or the\n * category's own name reads as the category's own rows (`popular`).\n */\nexport async function rankedCatalogSearch(params: RankedCatalogSearchParams): Promise<RankedCatalogPage> {\n const groups = typeof params.group === 'string' ? [params.group] : [...params.group];\n const templateIdOf = params.templateIdOf ?? (() => undefined);\n const fieldsOf = params.fieldsOf ?? catalogRowSearchFields;\n const accept = params.accept ?? (() => true);\n const offset = Math.max(0, params.offset ?? 0);\n const query = parseTemplateQuery(params.query, { categoryWords: params.categoryWords ?? [] });\n const popular =\n params.popular ??\n (async (from: number) => {\n const rows =\n (await readCatalogRows(\n { group: groups[0], limit: params.limit, offset: from, templateId: templateIdOf(groups[0]) },\n params.read,\n )) ?? [];\n return { rows, next: rows.length >= params.limit ? from + params.limit : null };\n });\n\n const popularPage = async (from: number, names: ReadonlySet<string>, shifted: boolean) => {\n const page = await popular(from);\n return {\n rows: page.rows\n .filter((row) => !names.has(text(row?.name)) && accept(row, groups[0]))\n .map((row) => ({ row, group: groups[0], match: 'popular' as const })),\n next: page.next === null ? null : shifted ? POPULAR_OFFSET + page.next : page.next,\n query,\n };\n };\n\n if (query.empty) return popularPage(offset >= POPULAR_OFFSET ? offset - POPULAR_OFFSET : offset, new Set(), false);\n\n const key = JSON.stringify([groups, groups.map(templateIdOf), query.subjects, query.styles]);\n let session = sessions.get(key);\n if (!session) {\n const created: Promise<Session> = gather(query, groups, templateIdOf, params.read).then((candidates) => ({\n candidates,\n names: new Set(candidates.map((c) => c.name)),\n floorAt: new Map<number, TemplateMatch>(),\n }));\n // A failed gather is not remembered: the next read tries again.\n created.catch(() => sessions.delete(key));\n sessions.set(key, created);\n while (sessions.size > MAX_SESSIONS) {\n const oldest = sessions.keys().next().value;\n if (oldest === undefined) break;\n sessions.delete(oldest);\n }\n session = created;\n }\n const s = await session;\n if (offset < POPULAR_OFFSET && offset < s.candidates.length) {\n return matchesPage(query, s, offset, params.limit, params.read, fieldsOf, accept);\n }\n return popularPage(offset >= POPULAR_OFFSET ? offset - POPULAR_OFFSET : 0, s.names, true);\n}\n\nasync function matchesPage(\n query: TemplateQuery,\n session: Session,\n offset: number,\n limit: number,\n read: CatalogGraphqlRead,\n fieldsOf: (row: CatalogRow, group: string) => TemplateSearchFields,\n accept: (row: CatalogRow, group: string) => boolean,\n): Promise<RankedCatalogPage> {\n const slice = session.candidates.slice(offset, offset + limit);\n const rows = await readCatalogRowsByRef(slice, read);\n const listed: Array<{ item: RankedCatalogRow; score: number; order: number }> = [];\n slice.forEach((candidate, order) => {\n const row = rows.get(candidate.name);\n if (!row || !accept(row, candidate.group)) return;\n const whole = scoreTemplate(query, templateSearchText(fieldsOf(row, candidate.group)));\n const match = whole.match ?? candidate.match;\n const score = whole.match ? whole.score : candidate.score;\n listed.push({ item: { row, group: candidate.group, match }, score, order });\n });\n listed.sort((a, b) => b.score - a.score || a.order - b.order);\n let floor: TemplateMatch = session.floorAt.get(offset) ?? 'exact';\n const items = listed.map(({ item }) => {\n if (MATCH_ORDER[item.match] < MATCH_ORDER[floor]) return { ...item, match: floor };\n floor = item.match;\n return item;\n });\n const end = offset + slice.length;\n session.floorAt.set(end, floor);\n return { rows: items, next: end < session.candidates.length ? end : POPULAR_OFFSET, query };\n}\n\n/** A `CatalogGraphqlRead` over plain fetch (anonymous unless a bearer is given). */\nexport function fetchCatalogRead(endpoint: string, token?: string | null): CatalogGraphqlRead {\n return async (variables, query) => {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n ...(token ? { authorization: `Bearer ${token}` } : {}),\n },\n body: JSON.stringify({ query, variables }),\n });\n if (!res.ok) throw new Error(`Template catalog read failed (${res.status})`);\n return ((await res.json().catch(() => ({}))) ?? {}) as CatalogGraphqlAnswer;\n };\n}\n"],"names":["_a","_b","rows"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useState}from'react';import {View,Text,ActivityIndicator,StyleSheet}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {useSafeAreaInsets}from'react-native-safe-area-context';import {friendlyMediaError}from'../videoEditor/mediaActions.js';import {useCanvasTheme,themedStyles}from'../canvasTheme.js';import {Pressable,pressedStyle,RADIUS,SPACE,HIT,TYPE}from'../canvasUi.js';var __defProp = Object.defineProperty;
|
|
1
|
+
import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useState}from'react';import {View,Text,ActivityIndicator,StyleSheet}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {useSafeAreaInsets}from'react-native-safe-area-context';import {friendlyMediaError}from'../videoEditor/mediaActions.js';import {useCanvasTheme,themedStyles}from'../canvasTheme.js';import {Pressable,pressedStyle,Segmented,RADIUS,SPACE,HIT,TYPE}from'../canvasUi.js';import {RecordingReview}from'./RecordingReview.js';import {RecordingsList}from'./RecordingsList.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -17,16 +17,33 @@ var __spreadValues = (a, b) => {
|
|
|
17
17
|
return a;
|
|
18
18
|
};
|
|
19
19
|
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
let placedSeq = 0;
|
|
21
|
+
function boardItem(type, src, name) {
|
|
22
|
+
return {
|
|
23
|
+
id: `rec-${Date.now().toString(36)}-${placedSeq++}`,
|
|
24
|
+
type,
|
|
25
|
+
src,
|
|
26
|
+
x: 0,
|
|
27
|
+
y: 0,
|
|
28
|
+
width: type === "audio" ? 320 : 640,
|
|
29
|
+
height: type === "audio" ? 80 : 360,
|
|
30
|
+
zIndex: 1,
|
|
31
|
+
generatedAssetName: name
|
|
32
|
+
};
|
|
33
|
+
}
|
|
20
34
|
function CameraRecorderExperience({
|
|
21
35
|
onClose,
|
|
22
36
|
onPick,
|
|
23
|
-
onPlaced
|
|
37
|
+
onPlaced,
|
|
38
|
+
runAction
|
|
24
39
|
}) {
|
|
25
40
|
const theme = useCanvasTheme();
|
|
26
41
|
const styles = makeStyles(theme);
|
|
27
42
|
const insets = useSafeAreaInsets();
|
|
28
43
|
const [busy, setBusy] = useState(false);
|
|
29
44
|
const [error, setError] = useState(null);
|
|
45
|
+
const [mode, setMode] = useState("record");
|
|
46
|
+
const [take, setTake] = useState(null);
|
|
30
47
|
const capture = async (source) => {
|
|
31
48
|
setBusy(true);
|
|
32
49
|
setError(null);
|
|
@@ -36,6 +53,14 @@ function CameraRecorderExperience({
|
|
|
36
53
|
setError("No recording captured.");
|
|
37
54
|
return;
|
|
38
55
|
}
|
|
56
|
+
const video = items.find((item) => item.type === "video");
|
|
57
|
+
if (source === "camera-video" && video) {
|
|
58
|
+
setTake({
|
|
59
|
+
url: video.src,
|
|
60
|
+
name: video.generatedAssetName || "Recording.mp4"
|
|
61
|
+
});
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
39
64
|
onPlaced(items);
|
|
40
65
|
onClose();
|
|
41
66
|
} catch (err) {
|
|
@@ -52,26 +77,46 @@ function CameraRecorderExperience({
|
|
|
52
77
|
/* @__PURE__ */ jsx(Pressable, { onPress: onClose, hitSlop: 10, style: ({
|
|
53
78
|
pressed
|
|
54
79
|
}) => [styles.close, pressedStyle(pressed)], children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "close", size: 22, color: theme.edInk }) }),
|
|
55
|
-
/* @__PURE__ */ jsx(Text, { style: styles.title, children: "Record" }),
|
|
80
|
+
/* @__PURE__ */ jsx(Text, { style: styles.title, children: take ? "Review" : "Record" }),
|
|
56
81
|
/* @__PURE__ */ jsx(View, { style: styles.close })
|
|
57
82
|
] }),
|
|
58
|
-
/* @__PURE__ */
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
83
|
+
take ? /* @__PURE__ */ jsx(RecordingReview, { url: take.url, name: take.name, runAction, onPlace: (kind, url, name) => {
|
|
84
|
+
onPlaced([boardItem(kind, url, name)]);
|
|
85
|
+
if (kind === "video") onClose();
|
|
86
|
+
}, onDiscard: () => setTake(null), onRecordAnother: () => {
|
|
87
|
+
setTake(null);
|
|
88
|
+
void capture("camera-video");
|
|
89
|
+
} }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
90
|
+
/* @__PURE__ */ jsx(Segmented, { options: [{
|
|
91
|
+
id: "record",
|
|
92
|
+
label: "Record"
|
|
93
|
+
}, {
|
|
94
|
+
id: "library",
|
|
95
|
+
label: "My recordings"
|
|
96
|
+
}], value: mode, onChange: setMode, style: styles.modes }),
|
|
97
|
+
mode === "library" ? /* @__PURE__ */ jsx(RecordingsList, { runAction, onPlace: (row) => {
|
|
98
|
+
onPlaced([boardItem("video", row.url, row.title)]);
|
|
99
|
+
onClose();
|
|
100
|
+
} }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
101
|
+
/* @__PURE__ */ jsxs(View, { style: styles.stage, children: [
|
|
102
|
+
/* @__PURE__ */ jsx(View, { style: styles.stageWell, children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "record-circle-outline", size: 40, color: "#f7f7fa" }) }),
|
|
103
|
+
/* @__PURE__ */ jsx(Text, { style: styles.fine, children: "Capture camera video or a still for the board. Screen recording stays on desktop web." })
|
|
104
|
+
] }),
|
|
105
|
+
error ? /* @__PURE__ */ jsx(Text, { style: styles.error, children: error }) : null,
|
|
106
|
+
/* @__PURE__ */ jsxs(View, { style: styles.actions, children: [
|
|
107
|
+
/* @__PURE__ */ jsx(Pressable, { onPress: () => void capture("camera-video"), disabled: busy, style: ({
|
|
108
|
+
pressed
|
|
109
|
+
}) => [styles.cta, busy && styles.ctaOff, pressedStyle(pressed && !busy)], children: busy ? /* @__PURE__ */ jsx(ActivityIndicator, { color: theme.primaryForeground }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
110
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "video-outline", size: 20, color: theme.primaryForeground }),
|
|
111
|
+
/* @__PURE__ */ jsx(Text, { style: styles.ctaLabel, children: "Record video" })
|
|
112
|
+
] }) }),
|
|
113
|
+
/* @__PURE__ */ jsxs(Pressable, { onPress: () => void capture("camera-photo"), disabled: busy, style: ({
|
|
114
|
+
pressed
|
|
115
|
+
}) => [styles.secondary, busy && styles.ctaOff, pressedStyle(pressed && !busy)], children: [
|
|
116
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "camera-outline", size: 20, color: theme.edInk }),
|
|
117
|
+
/* @__PURE__ */ jsx(Text, { style: styles.secondaryLabel, children: "Take photo" })
|
|
118
|
+
] })
|
|
119
|
+
] })
|
|
75
120
|
] })
|
|
76
121
|
] })
|
|
77
122
|
] });
|
|
@@ -100,6 +145,9 @@ const makeStyles = themedStyles((theme) => StyleSheet.create({
|
|
|
100
145
|
title: __spreadProps(__spreadValues({}, TYPE.title), {
|
|
101
146
|
color: theme.edInk
|
|
102
147
|
}),
|
|
148
|
+
modes: {
|
|
149
|
+
marginBottom: SPACE.md
|
|
150
|
+
},
|
|
103
151
|
stage: {
|
|
104
152
|
flex: 1,
|
|
105
153
|
borderRadius: RADIUS.xl,
|