@adminide-stack/yantra-mobile 12.0.121 → 12.0.123-alpha.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.
Files changed (175) hide show
  1. package/lib/features/apps/appArt.js +1 -1
  2. package/lib/features/apps/appArt.js.map +1 -1
  3. package/lib/features/apps/mobileAppCatalog.js +15 -11
  4. package/lib/features/apps/mobileAppCatalog.js.map +1 -1
  5. package/lib/features/canvas/CanvasAgentChatPane.js +82 -20
  6. package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
  7. package/lib/features/canvas/CanvasBoardsGrid.js +291 -100
  8. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
  9. package/lib/features/canvas/CanvasEditToolsPanel.js +105 -12
  10. package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
  11. package/lib/features/canvas/CanvasExperience.js +266 -68
  12. package/lib/features/canvas/CanvasExperience.js.map +1 -1
  13. package/lib/features/canvas/CanvasGeneratePanel.js +204 -66
  14. package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
  15. package/lib/features/canvas/CanvasLibrarySheet.js +31 -13
  16. package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -1
  17. package/lib/features/canvas/CanvasModelPicker.js +176 -0
  18. package/lib/features/canvas/CanvasModelPicker.js.map +1 -0
  19. package/lib/features/canvas/CanvasTasksPanel.js +325 -29
  20. package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
  21. package/lib/features/canvas/CanvasTemplatesPanel.js +5 -4
  22. package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -1
  23. package/lib/features/canvas/CanvasToolDock.js +137 -61
  24. package/lib/features/canvas/CanvasToolDock.js.map +1 -1
  25. package/lib/features/canvas/FrameExtractorExperience.js +33 -2
  26. package/lib/features/canvas/FrameExtractorExperience.js.map +1 -1
  27. package/lib/features/canvas/GeneratorReferenceSlots.js +197 -0
  28. package/lib/features/canvas/GeneratorReferenceSlots.js.map +1 -0
  29. package/lib/features/canvas/NativeCanvasViewer.js +89 -11
  30. package/lib/features/canvas/NativeCanvasViewer.js.map +1 -1
  31. package/lib/features/canvas/PromoContextFields.js +55 -2
  32. package/lib/features/canvas/PromoContextFields.js.map +1 -1
  33. package/lib/features/canvas/SetStudioExperience.js +323 -13
  34. package/lib/features/canvas/SetStudioExperience.js.map +1 -1
  35. package/lib/features/canvas/VideoEditExperience.js +1 -53
  36. package/lib/features/canvas/VideoEditExperience.js.map +1 -1
  37. package/lib/features/canvas/VideoEditorExperience.js +697 -506
  38. package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
  39. package/lib/features/canvas/VideoGeneratorExperience.js +22 -5
  40. package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
  41. package/lib/features/canvas/canvasAgentChat.js +125 -11
  42. package/lib/features/canvas/canvasAgentChat.js.map +1 -1
  43. package/lib/features/canvas/canvasCore.js +117 -12
  44. package/lib/features/canvas/canvasCore.js.map +1 -1
  45. package/lib/features/canvas/canvasEditOps.js +148 -111
  46. package/lib/features/canvas/canvasEditOps.js.map +1 -1
  47. package/lib/features/canvas/canvasTaskSync.js +235 -0
  48. package/lib/features/canvas/canvasTaskSync.js.map +1 -0
  49. package/lib/features/canvas/canvasTasks.js +98 -11
  50. package/lib/features/canvas/canvasTasks.js.map +1 -1
  51. package/lib/features/canvas/createTiles.js +247 -0
  52. package/lib/features/canvas/createTiles.js.map +1 -0
  53. package/lib/features/canvas/deepLinks.js +83 -0
  54. package/lib/features/canvas/deepLinks.js.map +1 -0
  55. package/lib/features/canvas/frameExtract.js +13 -1
  56. package/lib/features/canvas/frameExtract.js.map +1 -1
  57. package/lib/features/canvas/generationModels.js +36 -8
  58. package/lib/features/canvas/generationModels.js.map +1 -1
  59. package/lib/features/canvas/generatorCommands.js +106 -0
  60. package/lib/features/canvas/generatorCommands.js.map +1 -0
  61. package/lib/features/canvas/generatorReferences.js +82 -0
  62. package/lib/features/canvas/generatorReferences.js.map +1 -0
  63. package/lib/features/canvas/homeWork.js +74 -0
  64. package/lib/features/canvas/homeWork.js.map +1 -0
  65. package/lib/features/canvas/linksRpc.js +130 -0
  66. package/lib/features/canvas/linksRpc.js.map +1 -0
  67. package/lib/features/canvas/mediaRecheck.js +176 -0
  68. package/lib/features/canvas/mediaRecheck.js.map +1 -0
  69. package/lib/features/canvas/mediaUrls.js +258 -0
  70. package/lib/features/canvas/mediaUrls.js.map +1 -0
  71. package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
  72. package/lib/features/canvas/promoProjectImport.js +80 -13
  73. package/lib/features/canvas/promoProjectImport.js.map +1 -1
  74. package/lib/features/canvas/promoVideo.js +106 -15
  75. package/lib/features/canvas/promoVideo.js.map +1 -1
  76. package/lib/features/canvas/reframe.js +228 -0
  77. package/lib/features/canvas/reframe.js.map +1 -0
  78. package/lib/features/canvas/serverTasks.js +697 -0
  79. package/lib/features/canvas/serverTasks.js.map +1 -0
  80. package/lib/features/canvas/set/SetViewportWebView.js +207 -28
  81. package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
  82. package/lib/features/canvas/set/agent/prompt.js +66 -0
  83. package/lib/features/canvas/set/agent/prompt.js.map +1 -0
  84. package/lib/features/canvas/set/agent/setOps.js +203 -0
  85. package/lib/features/canvas/set/agent/setOps.js.map +1 -0
  86. package/lib/features/canvas/set/agent/setTurn.js +128 -0
  87. package/lib/features/canvas/set/agent/setTurn.js.map +1 -0
  88. package/lib/features/canvas/set/agent/snapshot.js +43 -0
  89. package/lib/features/canvas/set/agent/snapshot.js.map +1 -0
  90. package/lib/features/canvas/set/agent/tools.js +580 -0
  91. package/lib/features/canvas/set/agent/tools.js.map +1 -0
  92. package/lib/features/canvas/set/setProject.js +43 -4
  93. package/lib/features/canvas/set/setProject.js.map +1 -1
  94. package/lib/features/canvas/set/supplyLibrary.js +397 -0
  95. package/lib/features/canvas/set/supplyLibrary.js.map +1 -0
  96. package/lib/features/canvas/storageLibrary.js +113 -52
  97. package/lib/features/canvas/storageLibrary.js.map +1 -1
  98. package/lib/features/canvas/studioCatalog.js +15 -2
  99. package/lib/features/canvas/studioCatalog.js.map +1 -1
  100. package/lib/features/canvas/studioLooks.js +1 -8
  101. package/lib/features/canvas/studioLooks.js.map +1 -1
  102. package/lib/features/canvas/useBoardMediaRefresh.js +66 -0
  103. package/lib/features/canvas/useBoardMediaRefresh.js.map +1 -0
  104. package/lib/features/canvas/useMediaSource.js +84 -0
  105. package/lib/features/canvas/useMediaSource.js.map +1 -0
  106. package/lib/features/canvas/video3d.js +11 -10
  107. package/lib/features/canvas/video3d.js.map +1 -1
  108. package/lib/features/canvas/videoEditor/BlurBoxOverlay.js +46 -0
  109. package/lib/features/canvas/videoEditor/BlurBoxOverlay.js.map +1 -0
  110. package/lib/features/canvas/videoEditor/ExportTaskCard.js +134 -0
  111. package/lib/features/canvas/videoEditor/ExportTaskCard.js.map +1 -0
  112. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +45 -7
  113. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
  114. package/lib/features/canvas/videoEditor/agent/agentLoop.js +4 -2
  115. package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
  116. package/lib/features/canvas/videoEditor/agent/attachments.js +304 -0
  117. package/lib/features/canvas/videoEditor/agent/attachments.js.map +1 -0
  118. package/lib/features/canvas/videoEditor/agent/brainClient.js +3 -2
  119. package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
  120. package/lib/features/canvas/videoEditor/agent/cutTools.js +207 -7
  121. package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
  122. package/lib/features/canvas/videoEditor/blurBox.js +34 -0
  123. package/lib/features/canvas/videoEditor/blurBox.js.map +1 -0
  124. package/lib/features/canvas/videoEditor/compileTimeline.js +668 -0
  125. package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -0
  126. package/lib/features/canvas/videoEditor/editorModel.js +56 -22
  127. package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
  128. package/lib/features/canvas/videoEditor/exportPipeline.js +77 -0
  129. package/lib/features/canvas/videoEditor/exportPipeline.js.map +1 -0
  130. package/lib/features/canvas/videoEditor/exportRenderer.js +19 -12
  131. package/lib/features/canvas/videoEditor/exportRenderer.js.map +1 -1
  132. package/lib/features/canvas/videoEditor/exportTask.js +216 -0
  133. package/lib/features/canvas/videoEditor/exportTask.js.map +1 -0
  134. package/lib/features/canvas/videoEditor/formWidgets.js +142 -0
  135. package/lib/features/canvas/videoEditor/formWidgets.js.map +1 -0
  136. package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js +195 -0
  137. package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js.map +1 -0
  138. package/lib/features/canvas/videoEditor/produce/produceScenes.js +158 -0
  139. package/lib/features/canvas/videoEditor/produce/produceScenes.js.map +1 -0
  140. package/lib/features/canvas/videoEditor/remoteMediaClient.js +17 -5
  141. package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
  142. package/lib/features/canvas/videoEditor/renderTimeline.js +207 -0
  143. package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -0
  144. package/lib/features/canvas/videoEditor/renewLinks.js +64 -0
  145. package/lib/features/canvas/videoEditor/renewLinks.js.map +1 -0
  146. package/lib/features/canvas/videoEditor/sceneLayers.js +101 -0
  147. package/lib/features/canvas/videoEditor/sceneLayers.js.map +1 -0
  148. package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js +283 -0
  149. package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js.map +1 -0
  150. package/lib/features/canvas/videoEditor/tools/catalog.js +576 -0
  151. package/lib/features/canvas/videoEditor/tools/catalog.js.map +1 -0
  152. package/lib/features/canvas/videoEditor/videoProjectsStore.js +27 -3
  153. package/lib/features/canvas/videoEditor/videoProjectsStore.js.map +1 -1
  154. package/lib/features/webbuilder/WebBuilderExperience.js +29 -1
  155. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  156. package/lib/features/webbuilder/buildFragments.js +8 -4
  157. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  158. package/lib/features/webbuilder/codezenHandoff.js +108 -0
  159. package/lib/features/webbuilder/codezenHandoff.js.map +1 -0
  160. package/lib/features/webbuilder/workflow.js.map +1 -1
  161. package/lib/hooks/useChatApi.js +1 -2
  162. package/lib/hooks/useChatApi.js.map +1 -1
  163. package/lib/screens/CanvasBoard/index.js +12 -1
  164. package/lib/screens/CanvasBoard/index.js.map +1 -1
  165. package/lib/screens/Home/HomeScreen.js.map +1 -1
  166. package/lib/screens/Home/components/HomeSuggestions.js +3 -3
  167. package/lib/screens/Home/components/HomeSuggestions.js.map +1 -1
  168. package/lib/screens/WebBuilder/index.js +4 -2
  169. package/lib/screens/WebBuilder/index.js.map +1 -1
  170. package/lib/screens/WebBuilderNative/index.js +29 -2
  171. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  172. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +30 -6
  173. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  174. package/package.json +4 -4
  175. /package/lib/assets/apps/{paper2poster.webp → poster.webp} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"CanvasToolDock.js","sources":["../../../src/features/canvas/CanvasToolDock.tsx"],"sourcesContent":["/**\n * Phone chrome — native twin of canvas-surface `CanvasTabBar` + `CanvasToolSheet`.\n * The sheet is positioned inside the plane (flex-1), flush to its bottom, so\n * it sits on the tab bar. Keyboard open → tab bar hides, sheet lifts.\n */\nimport React, { useEffect, useState, type ReactNode } from 'react';\nimport { Pressable, StyleSheet, Text, View } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { useKeyboardLiftHeight } from '../../components/KeyboardComposerDock';\nimport { CanvasGeneratePanel, type GenerateLane } from './CanvasGeneratePanel';\nimport { CanvasEditToolsPanel } from './CanvasEditToolsPanel';\nimport { CanvasLibraryPanel } from './CanvasLibrarySheet';\nimport { CanvasLooksPanel } from './CanvasLooksPanel';\nimport { CanvasTasksPanel } from './CanvasTasksPanel';\nimport {\n hydrateCanvasTasks,\n resumePromoTasks,\n runningTaskCount,\n subscribeCanvasTasks,\n type CanvasTask,\n} from './canvasTasks';\nimport type { CanvasItem } from './canvasCore';\nimport type { CanvasBoardSummary } from './surfaceIndex';\nimport type { RunMediaAction } from './videoEditor/mediaActions';\nimport type { StudioLook } from './studioLooks';\nimport { nearestAspect } from './studioLooks';\n\ntype IconName = React.ComponentProps<typeof MaterialCommunityIcons>['name'];\n\nexport type DockGenerateMode = GenerateLane;\nexport type DockStudio =\n | 'video'\n | 'agent'\n | 'influencer'\n | 'docs'\n | 'carousel'\n | 'flyers'\n | 'set3d'\n | 'moodboard'\n | 'frames';\ntype TabId = 'generate' | 'library' | 'upload' | 'studios' | 'more';\ntype SheetId = 'generate' | 'library' | 'studios' | 'more' | 'session' | 'upload' | 'looks' | 'tasks';\nexport type MediaPickSource = 'library' | 'camera' | 'camera-video' | 'camera-photo' | 'file';\n\nconst TABS: ReadonlyArray<{ id: TabId; icon: IconName; label: string }> = [\n { id: 'generate', icon: 'creation', label: 'Generate' },\n { id: 'library', icon: 'image-outline', label: 'Library' },\n { id: 'upload', icon: 'upload-outline', label: 'Upload' },\n { id: 'studios', icon: 'filmstrip', label: 'Studios' },\n { id: 'more', icon: 'dots-horizontal', label: 'More' },\n];\n\nconst UPLOAD_SOURCES: ReadonlyArray<{ id: MediaPickSource; icon: IconName; label: string }> = [\n { id: 'library', icon: 'image-multiple-outline', label: 'Photo Library' },\n { id: 'camera', icon: 'camera-outline', label: 'Take Photo or Video' },\n { id: 'file', icon: 'folder-outline', label: 'Choose File' },\n];\n\nconst STUDIOS: ReadonlyArray<{ id: DockStudio; icon: IconName; label: string }> = [\n { id: 'video', icon: 'movie-open-outline', label: 'Video' },\n { id: 'agent', icon: 'robot-outline', label: 'AI cut' },\n { id: 'influencer', icon: 'account-star-outline', label: 'Influencer' },\n { id: 'docs', icon: 'file-document-outline', label: 'Docs' },\n { id: 'carousel', icon: 'view-carousel-outline', label: 'Carousel' },\n { id: 'flyers', icon: 'printer-outline', label: 'Flyers' },\n { id: 'set3d', icon: 'cube-outline', label: '3D set' },\n { id: 'moodboard', icon: 'palette-outline', label: 'Moodboard' },\n { id: 'frames', icon: 'image-multiple-outline', label: 'Frames' },\n];\n\nexport function CanvasToolDock({\n children,\n busy,\n boards,\n boardId,\n runAction,\n seedItem,\n restyle,\n onUpload,\n onPlace,\n onStudio,\n onSlides,\n onGenerated,\n onPickStorage,\n onPromoDesigned,\n onEditReplaced,\n onEditVideo,\n onRecord,\n dockHidden = false,\n apolloClient,\n token,\n indexUrl,\n}: {\n children: ReactNode;\n busy: boolean;\n boards: CanvasBoardSummary[];\n boardId?: string | null;\n runAction?: RunMediaAction;\n seedItem?: CanvasItem | null;\n restyle?: boolean;\n onUpload: (source: MediaPickSource) => void;\n onPlace: (item: CanvasItem) => void;\n onStudio: (studio: DockStudio) => void;\n onSlides: () => void;\n onGenerated: (url: string, meta: { prompt: string; aspect: string; mode: GenerateLane }) => void;\n onPickStorage?: (kind: 'image' | 'video' | 'audio', url: string, name: string) => void;\n onPromoDesigned?: (designed: import('./promoVideo').DesignedPromo) => void;\n onEditReplaced?: (itemId: string, url: string) => void;\n onEditVideo?: (item: CanvasItem) => void;\n /** Phone Record: open the camera recorder studio (web screen share stays desktop-only). */\n onRecord?: (source?: MediaPickSource) => void;\n dockHidden?: boolean;\n apolloClient?: import('./useStudioCatalogTemplates').StudioCatalogClient | null;\n token?: string | null;\n indexUrl?: string | null;\n}) {\n const insets = useSafeAreaInsets();\n const keyboardHeight = useKeyboardLiftHeight();\n const hideTabs = dockHidden || keyboardHeight > 40;\n const [planeH, setPlaneH] = useState(0);\n const [sheet, setSheet] = useState<SheetId | null>(null);\n const [lookSeed, setLookSeed] = useState<{ prompt: string; aspect?: string } | null>(null);\n const [taskBadge, setTaskBadge] = useState(0);\n useEffect(() => {\n if (dockHidden) setSheet(null);\n }, [dockHidden]);\n useEffect(() => {\n void hydrateCanvasTasks().then(() => setTaskBadge(runningTaskCount()));\n const unsub = subscribeCanvasTasks(() => setTaskBadge(runningTaskCount()));\n return unsub;\n }, []);\n useEffect(() => {\n if (runAction) resumePromoTasks(runAction);\n }, [runAction]);\n const chromeH = 48;\n const usable = Math.max(0, planeH - chromeH);\n const sheetTop = hideTabs\n ? Math.max(8, Math.round(usable * 0.08))\n : planeH > 0\n ? chromeH + Math.round(usable * 0.28)\n : chromeH;\n\n const onTab = (id: TabId) => {\n if (id === 'upload') {\n setSheet((current) => (current === 'upload' ? null : 'upload'));\n return;\n }\n const mapped: SheetId = id;\n setSheet((current) => (current === mapped || (id === 'library' && current === 'library') ? null : mapped));\n };\n\n const title =\n sheet === 'generate'\n ? 'Generate'\n : sheet === 'library'\n ? null\n : sheet === 'session'\n ? null\n : sheet === 'upload'\n ? null\n : sheet === 'studios'\n ? 'Studios'\n : sheet === 'looks'\n ? null\n : sheet === 'tasks'\n ? null\n : 'More';\n\n const recreateLook = (look: StudioLook) => {\n const aspect = nearestAspect(look.aspect, ['16:9', '9:16', '1:1']);\n setLookSeed({ prompt: look.prompt, ...(aspect ? { aspect } : {}) });\n setSheet('generate');\n };\n\n const placeTask = (task: CanvasTask) => {\n const url = task.result?.url;\n if (!url) return;\n onGenerated(url, { prompt: task.brief || task.title, aspect: '16:9', mode: 'promo' });\n setSheet(null);\n };\n\n return (\n <View style={styles.root}>\n <View style={styles.plane} collapsable={false} onLayout={(e) => setPlaneH(e.nativeEvent.layout.height)}>\n {children}\n {sheet === 'upload' ? (\n <>\n <Pressable\n style={[styles.backdrop, { top: chromeH }]}\n onPress={() => setSheet(null)}\n accessibilityLabel=\"Close tools\"\n />\n <View style={styles.uploadMenu}>\n {UPLOAD_SOURCES.map((item) => (\n <Pressable\n key={item.id}\n onPress={() => {\n setSheet(null);\n onUpload(item.id);\n }}\n style={styles.uploadRow}\n accessibilityRole=\"button\"\n >\n <Text style={styles.rowLabel}>{item.label}</Text>\n <MaterialCommunityIcons name={item.icon} size={20} color=\"#64748b\" />\n </Pressable>\n ))}\n </View>\n </>\n ) : sheet ? (\n <>\n <Pressable\n style={[styles.backdrop, { top: chromeH }]}\n onPress={() => setSheet(null)}\n accessibilityLabel=\"Close tools\"\n />\n <View\n style={[\n styles.sheet,\n {\n top: sheetTop,\n bottom: hideTabs ? keyboardHeight : 0,\n },\n ]}\n >\n <View style={styles.handle} />\n {title ? <Text style={styles.sheetTitle}>{title}</Text> : null}\n {sheet === 'generate' ? (\n <>\n {seedItem && (seedItem.type === 'image' || seedItem.type === 'video') ? (\n <CanvasEditToolsPanel\n item={seedItem}\n runAction={runAction}\n onReplaced={(url) => {\n onEditReplaced?.(seedItem.id, url);\n }}\n onEditVideo={() => {\n setSheet(null);\n onEditVideo?.(seedItem);\n }}\n />\n ) : null}\n <CanvasGeneratePanel\n runAction={runAction}\n seedItem={seedItem}\n restyle={restyle}\n lookSeed={lookSeed}\n boardId={boardId}\n onSlides={() => {\n setSheet(null);\n onSlides();\n }}\n onGenerated={(url, meta) => {\n onGenerated(url, meta);\n if (meta.mode !== 'clips') setSheet(null);\n }}\n onPromoDesigned={(designed) => {\n setSheet(null);\n onPromoDesigned?.(designed);\n }}\n onPromoQueued={() => {\n setSheet('tasks');\n }}\n />\n </>\n ) : null}\n {sheet === 'library' || sheet === 'session' ? (\n <CanvasLibraryPanel\n title={sheet === 'session' ? 'Made in this chat' : 'Your library'}\n boards={boards}\n boardId={sheet === 'session' ? boardId : null}\n runAction={runAction}\n onClose={() => setSheet(null)}\n onPlace={(item) => {\n onPlace(item);\n setSheet(null);\n }}\n onPickStorage={(kind, url, name) => {\n onPickStorage?.(kind, url, name);\n setSheet(null);\n }}\n />\n ) : null}\n {sheet === 'studios'\n ? STUDIOS.map((studio) => (\n <Pressable\n key={studio.id}\n onPress={() => {\n setSheet(null);\n onStudio(studio.id);\n }}\n style={styles.row}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name={studio.icon} size={20} color=\"#0f172a\" />\n <Text style={styles.rowLabel}>{studio.label}</Text>\n </Pressable>\n ))\n : null}\n {sheet === 'more' ? (\n <>\n <Pressable\n onPress={() => setSheet('looks')}\n style={styles.row}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"movie-filter-outline\" size={20} color=\"#0f172a\" />\n <Text style={styles.rowLabel}>Looks</Text>\n </Pressable>\n <Pressable\n onPress={() => setSheet('tasks')}\n style={styles.row}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"playlist-check\" size={20} color=\"#0f172a\" />\n <Text style={styles.rowLabel}>Tasks</Text>\n {taskBadge > 0 ? (\n <View style={styles.badge}>\n <Text style={styles.badgeLabel}>{taskBadge}</Text>\n </View>\n ) : null}\n </Pressable>\n <Pressable\n onPress={() => setSheet('session')}\n style={styles.row}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"history\" size={20} color=\"#0f172a\" />\n <Text style={styles.rowLabel}>This chat</Text>\n </Pressable>\n <Pressable\n onPress={() => {\n setSheet(null);\n onRecord?.('camera-video');\n }}\n style={styles.row}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons\n name=\"record-circle-outline\"\n size={20}\n color=\"#0f172a\"\n />\n <Text style={styles.rowLabel}>Record</Text>\n </Pressable>\n </>\n ) : null}\n {sheet === 'looks' ? (\n <CanvasLooksPanel\n runAction={runAction}\n apolloClient={apolloClient}\n token={token}\n indexUrl={indexUrl}\n onRecreate={recreateLook}\n onClose={() => setSheet(null)}\n />\n ) : null}\n {sheet === 'tasks' ? (\n <CanvasTasksPanel onClose={() => setSheet(null)} onPlaceResult={placeTask} />\n ) : null}\n </View>\n </>\n ) : null}\n </View>\n {hideTabs ? null : (\n <View style={[styles.tabBar, { paddingBottom: Math.max(insets.bottom, 8) }]}>\n {TABS.map((tab) => {\n const active =\n sheet === tab.id ||\n (tab.id === 'library' && sheet === 'library') ||\n (tab.id === 'more' &&\n (sheet === 'more' || sheet === 'session' || sheet === 'looks' || sheet === 'tasks'));\n const disabled = tab.id === 'upload' && busy;\n return (\n <Pressable\n key={tab.id}\n onPress={() => onTab(tab.id)}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityLabel={tab.label}\n style={[styles.tab, active && styles.tabOn, disabled && styles.tabMuted]}\n >\n <View>\n <MaterialCommunityIcons\n name={tab.icon}\n size={18}\n color={active ? '#0f172a' : '#64748b'}\n />\n {tab.id === 'more' && taskBadge > 0 ? (\n <View style={styles.tabBadge}>\n <Text style={styles.tabBadgeLabel}>{taskBadge}</Text>\n </View>\n ) : null}\n </View>\n <Text style={[styles.tabLabel, active && styles.tabLabelOn]}>{tab.label}</Text>\n </Pressable>\n );\n })}\n </View>\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n root: { flex: 1 },\n plane: { flex: 1, overflow: 'hidden' },\n backdrop: {\n ...StyleSheet.absoluteFillObject,\n zIndex: 10,\n backgroundColor: 'rgba(15,23,42,0.2)',\n },\n sheet: {\n position: 'absolute',\n left: 0,\n right: 0,\n zIndex: 15,\n flex: 0,\n flexDirection: 'column',\n overflow: 'hidden',\n borderTopLeftRadius: 18,\n borderTopRightRadius: 18,\n backgroundColor: '#ffffff',\n borderTopWidth: StyleSheet.hairlineWidth,\n borderTopColor: '#e2e8f0',\n shadowColor: '#0f172a',\n shadowOpacity: 0.12,\n shadowRadius: 20,\n shadowOffset: { width: 0, height: -4 },\n elevation: 8,\n },\n handle: {\n alignSelf: 'center',\n width: 36,\n height: 4,\n borderRadius: 2,\n backgroundColor: '#e2e8f0',\n marginTop: 8,\n marginBottom: 4,\n },\n sheetTitle: {\n fontSize: 16,\n fontWeight: '700',\n color: '#0f172a',\n paddingHorizontal: 16,\n paddingBottom: 8,\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 12,\n paddingHorizontal: 16,\n paddingVertical: 12,\n },\n rowMuted: { opacity: 0.45 },\n rowLabel: { fontSize: 15, fontWeight: '500', color: '#0f172a' },\n rowLabelMuted: { fontSize: 15, fontWeight: '500', color: '#94a3b8' },\n uploadMenu: {\n position: 'absolute',\n left: 20,\n right: 20,\n bottom: 12,\n zIndex: 16,\n borderRadius: 14,\n backgroundColor: 'rgba(255,255,255,0.96)',\n overflow: 'hidden',\n shadowColor: '#0f172a',\n shadowOpacity: 0.18,\n shadowRadius: 24,\n shadowOffset: { width: 0, height: 8 },\n elevation: 12,\n },\n uploadRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingVertical: 14,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: '#e2e8f0',\n },\n tabBar: {\n flexDirection: 'row',\n borderTopWidth: StyleSheet.hairlineWidth,\n borderTopColor: '#e2e8f0',\n backgroundColor: '#ffffff',\n paddingTop: 6,\n paddingHorizontal: 4,\n zIndex: 20,\n },\n tab: {\n flex: 1,\n alignItems: 'center',\n gap: 2,\n paddingVertical: 4,\n borderRadius: 12,\n },\n tabOn: { backgroundColor: '#f1f5f9' },\n tabMuted: { opacity: 0.45 },\n tabLabel: { fontSize: 9.5, fontWeight: '600', color: '#64748b' },\n tabLabelOn: { color: '#0f172a' },\n badge: {\n marginLeft: 'auto',\n minWidth: 18,\n height: 18,\n borderRadius: 9,\n backgroundColor: '#ea580c',\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 5,\n },\n badgeLabel: { fontSize: 10, fontWeight: '700', color: '#fff7ed' },\n tabBadge: {\n position: 'absolute',\n top: -4,\n right: -8,\n minWidth: 14,\n height: 14,\n borderRadius: 7,\n backgroundColor: '#ea580c',\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 3,\n },\n tabBadgeLabel: { fontSize: 9, fontWeight: '700', color: '#fff7ed' },\n});\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CanvasToolDock.js","sources":["../../../src/features/canvas/CanvasToolDock.tsx"],"sourcesContent":["/**\n * Phone chrome — native twin of canvas-surface `CanvasTabBar` + `CanvasToolSheet`.\n * The sheet is positioned inside the plane (flex-1), flush to its bottom, so\n * it sits on the tab bar. Keyboard open → tab bar hides, sheet lifts.\n */\nimport React, { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { useKeyboardLiftHeight } from '../../components/KeyboardComposerDock';\nimport { CanvasGeneratePanel, type GenerateLane } from './CanvasGeneratePanel';\nimport { CanvasEditToolsPanel } from './CanvasEditToolsPanel';\nimport { CanvasLibraryPanel } from './CanvasLibrarySheet';\nimport { CanvasLooksPanel } from './CanvasLooksPanel';\nimport { CanvasTasksPanel } from './CanvasTasksPanel';\nimport { LIBRARY_PICK, type LibraryPickTarget } from './generatorReferences';\nimport type { StillPickSource } from './GeneratorReferenceSlots';\nimport type { EditTool } from './editTools';\nimport {\n hydrateCanvasTasks,\n resumePromoTasks,\n runningTaskCount,\n subscribeCanvasTasks,\n type CanvasTask,\n} from './canvasTasks';\nimport type { CanvasItem } from './canvasCore';\nimport type { CanvasBoardSummary } from './surfaceIndex';\nimport type { RunMediaAction } from './videoEditor/mediaActions';\nimport type { StudioLook } from './studioLooks';\nimport { nearestAspect } from './studioLooks';\n\ntype IconName = React.ComponentProps<typeof MaterialCommunityIcons>['name'];\n\nexport type DockGenerateMode = GenerateLane;\nexport type DockStudio =\n | 'video'\n | 'agent'\n | 'influencer'\n | 'docs'\n | 'carousel'\n | 'flyers'\n | 'set3d'\n | 'moodboard'\n | 'frames';\ntype TabId = 'generate' | 'library' | 'media' | 'studios' | 'more';\ntype SheetId = 'generate' | 'library' | 'studios' | 'more' | 'media' | 'looks' | 'tasks';\ntype GeneratorTab = 'create' | 'edit';\nexport type MediaPickSource = 'library' | 'camera' | 'camera-video' | 'camera-photo' | 'file';\n\nconst TABS: ReadonlyArray<{ id: TabId; icon: IconName; label: string }> = [\n { id: 'generate', icon: 'creation', label: 'Generate' },\n { id: 'library', icon: 'image-outline', label: 'Library' },\n { id: 'media', icon: 'image-plus', label: 'Media' },\n { id: 'studios', icon: 'filmstrip', label: 'Studios' },\n { id: 'more', icon: 'dots-horizontal', label: 'More' },\n];\n\nconst UPLOAD_SOURCES: ReadonlyArray<{ id: MediaPickSource; icon: IconName; label: string }> = [\n { id: 'library', icon: 'image-multiple-outline', label: 'Photo Library' },\n { id: 'camera', icon: 'camera-outline', label: 'Take Photo or Video' },\n { id: 'file', icon: 'folder-outline', label: 'Choose File' },\n];\n\nconst STUDIOS: ReadonlyArray<{ id: DockStudio; icon: IconName; label: string }> = [\n { id: 'video', icon: 'movie-open-outline', label: 'Video' },\n { id: 'agent', icon: 'robot-outline', label: 'AI cut' },\n { id: 'influencer', icon: 'account-star-outline', label: 'Influencer' },\n { id: 'docs', icon: 'file-document-outline', label: 'Docs' },\n { id: 'carousel', icon: 'view-carousel-outline', label: 'Carousel' },\n { id: 'flyers', icon: 'printer-outline', label: 'Flyers' },\n { id: 'set3d', icon: 'cube-outline', label: '3D set' },\n { id: 'moodboard', icon: 'palette-outline', label: 'Moodboard' },\n { id: 'frames', icon: 'image-multiple-outline', label: 'Frames' },\n];\n\nexport function CanvasToolDock({\n children,\n busy,\n boards,\n boardId,\n runAction,\n seedItem,\n restyle,\n onUpload,\n onPlace,\n onStudio,\n onSlides,\n onGenerated,\n onPickStorage,\n onPromoDesigned,\n onEditReplaced,\n onEditVideo,\n onRecord,\n onPickDeviceStill,\n dockHidden = false,\n apolloClient,\n token,\n indexUrl,\n}: {\n children: ReactNode;\n busy: boolean;\n boards: CanvasBoardSummary[];\n boardId?: string | null;\n runAction?: RunMediaAction;\n seedItem?: CanvasItem | null;\n restyle?: boolean;\n onUpload: (source: MediaPickSource) => void;\n onPlace: (item: CanvasItem) => void;\n onStudio: (studio: DockStudio) => void;\n onSlides: () => void;\n onGenerated: (url: string, meta: { prompt: string; aspect: string; mode: GenerateLane }) => void;\n onPickStorage?: (kind: 'image' | 'video' | 'audio', url: string, name: string) => void;\n onPromoDesigned?: (designed: import('./promoVideo').DesignedPromo) => void;\n onEditReplaced?: (itemId: string, url: string) => void;\n onEditVideo?: (item: CanvasItem) => void;\n /** Phone Record: open the camera recorder studio (web screen share stays desktop-only). */\n onRecord?: (source?: MediaPickSource) => void;\n /** A generator reference slot's \"Device\" source: pick a still and return a hosted URL. */\n onPickDeviceStill?: () => Promise<string | null>;\n dockHidden?: boolean;\n apolloClient?: import('./useStudioCatalogTemplates').StudioCatalogClient | null;\n token?: string | null;\n indexUrl?: string | null;\n}) {\n const insets = useSafeAreaInsets();\n const keyboardHeight = useKeyboardLiftHeight();\n const hideTabs = dockHidden || keyboardHeight > 40;\n const [planeH, setPlaneH] = useState(0);\n const [sheet, setSheet] = useState<SheetId | null>(null);\n const [lookSeed, setLookSeed] = useState<{ prompt: string; aspect?: string } | null>(null);\n const [taskBadge, setTaskBadge] = useState(0);\n const [generatorTab, setGeneratorTab] = useState<GeneratorTab>('create');\n // Web `lastEditTool`: Edit reopens on the tool you used last.\n const lastEditTool = useRef<EditTool | null>(null);\n const [libraryPick, setLibraryPick] = useState<{\n target: LibraryPickTarget;\n resolve: (url: string | null) => void;\n reject: (err: Error) => void;\n } | null>(null);\n useEffect(() => {\n if (sheet !== 'generate' && libraryPick) {\n libraryPick.resolve(null);\n setLibraryPick(null);\n }\n }, [sheet, libraryPick]);\n useEffect(() => {\n if (dockHidden) setSheet(null);\n }, [dockHidden]);\n useEffect(() => {\n void hydrateCanvasTasks().then(() => setTaskBadge(runningTaskCount()));\n const unsub = subscribeCanvasTasks(() => setTaskBadge(runningTaskCount()));\n return unsub;\n }, []);\n useEffect(() => {\n if (runAction) resumePromoTasks(runAction);\n }, [runAction]);\n const chromeH = 48;\n const usable = Math.max(0, planeH - chromeH);\n const sheetTop = hideTabs\n ? Math.max(8, Math.round(usable * 0.08))\n : planeH > 0\n ? chromeH + Math.round(usable * 0.28)\n : chromeH;\n\n const onTab = (id: TabId) => {\n const mapped: SheetId = id;\n setSheet((current) => (current === mapped ? null : mapped));\n };\n\n /** A generator slot asks for a still: the library opens over the sheet in pick mode, or the device picker. */\n const pickStill = (target: LibraryPickTarget, source: StillPickSource): Promise<string | null> => {\n if (source === 'device') {\n return onPickDeviceStill\n ? onPickDeviceStill()\n : Promise.reject(new Error('This host has no device picker'));\n }\n return new Promise((resolve, reject) => setLibraryPick({ target, resolve, reject }));\n };\n const takeFromLibrary = (kind: string, url: string) => {\n const pick = libraryPick;\n setLibraryPick(null);\n if (!pick) return;\n if (kind !== 'image') pick.reject(new Error('That slot takes an image'));\n else pick.resolve(url);\n };\n\n const title =\n sheet === 'generate'\n ? 'Generate'\n : sheet === 'library'\n ? null\n : sheet === 'media'\n ? null\n : sheet === 'studios'\n ? 'Studios'\n : sheet === 'looks'\n ? null\n : sheet === 'tasks'\n ? null\n : 'More';\n\n const recreateLook = (look: StudioLook) => {\n const aspect = nearestAspect(look.aspect, ['16:9', '9:16', '1:1']);\n setLookSeed({ prompt: look.prompt, ...(aspect ? { aspect } : {}) });\n setSheet('generate');\n };\n\n const placeTask = (task: CanvasTask) => {\n const url = task.result?.url;\n if (!url) return;\n onGenerated(url, { prompt: task.brief || task.title, aspect: '16:9', mode: 'promo' });\n setSheet(null);\n };\n\n return (\n <View style={styles.root}>\n <View style={styles.plane} collapsable={false} onLayout={(e) => setPlaneH(e.nativeEvent.layout.height)}>\n {children}\n {sheet ? (\n <>\n <Pressable\n style={[styles.backdrop, { top: chromeH }]}\n onPress={() => setSheet(null)}\n accessibilityLabel=\"Close tools\"\n />\n <View\n style={[\n styles.sheet,\n {\n top: sheetTop,\n bottom: hideTabs ? keyboardHeight : 0,\n },\n ]}\n >\n <View style={styles.handle} />\n {title ? <Text style={styles.sheetTitle}>{title}</Text> : null}\n {sheet === 'generate' ? (\n <>\n <View style={styles.segment} accessibilityLabel=\"Create or edit\">\n {(['create', 'edit'] as const).map((id) => (\n <Pressable\n key={id}\n onPress={() => setGeneratorTab(id)}\n style={[styles.segmentTab, generatorTab === id && styles.segmentTabOn]}\n accessibilityRole=\"tab\"\n accessibilityState={{ selected: generatorTab === id }}\n >\n <Text\n style={[\n styles.segmentLabel,\n generatorTab === id && styles.segmentLabelOn,\n ]}\n >\n {id === 'create' ? 'Create' : 'Edit'}\n </Text>\n </Pressable>\n ))}\n </View>\n {generatorTab === 'edit' ? (\n seedItem && (seedItem.type === 'image' || seedItem.type === 'video') ? (\n <ScrollView keyboardShouldPersistTaps=\"handled\">\n <CanvasEditToolsPanel\n key={seedItem.id}\n item={seedItem}\n runAction={runAction}\n showTitle={false}\n initialTool={lastEditTool.current}\n onToolChange={(tool) => {\n if (tool) lastEditTool.current = tool;\n }}\n onReplaced={(url) => {\n onEditReplaced?.(seedItem.id, url);\n }}\n onEditVideo={() => {\n setSheet(null);\n onEditVideo?.(seedItem);\n }}\n />\n </ScrollView>\n ) : (\n <Text style={styles.hint}>\n Select an image or video on the board to edit.\n </Text>\n )\n ) : null}\n {/* Create stays mounted under Edit and the library picker so its state survives. */}\n <View style={generatorTab === 'create' ? styles.fill : styles.hidden}>\n <CanvasGeneratePanel\n runAction={runAction}\n seedItem={seedItem}\n restyle={restyle}\n lookSeed={lookSeed}\n boardId={boardId}\n pickStill={pickStill}\n onSlides={() => {\n setSheet(null);\n onSlides();\n }}\n onGenerated={(url, meta) => {\n onGenerated(url, meta);\n if (meta.mode !== 'clips') setSheet(null);\n }}\n onPromoDesigned={(designed) => {\n setSheet(null);\n onPromoDesigned?.(designed);\n }}\n onPromoQueued={() => {\n setSheet('tasks');\n }}\n />\n </View>\n {libraryPick ? (\n <View style={styles.pickLayer}>\n <CanvasLibraryPanel\n title={LIBRARY_PICK[libraryPick.target].title}\n boards={boards}\n boardId={null}\n runAction={runAction}\n onClose={() => {\n libraryPick.resolve(null);\n setLibraryPick(null);\n }}\n onPlace={(item) => takeFromLibrary(item.type, item.src)}\n onPickStorage={(kind, url) => takeFromLibrary(kind, url)}\n />\n </View>\n ) : null}\n </>\n ) : null}\n {sheet === 'library' ? (\n <CanvasLibraryPanel\n title=\"Your library\"\n boards={boards}\n boardId={null}\n runAction={runAction}\n onClose={() => setSheet(null)}\n onPlace={(item) => {\n onPlace(item);\n setSheet(null);\n }}\n onPickStorage={(kind, url, name) => {\n onPickStorage?.(kind, url, name);\n setSheet(null);\n }}\n />\n ) : null}\n {sheet === 'media' ? (\n <>\n {/* Web Media panel: upload sources on top, this board's media below. */}\n <View style={styles.uploadStrip}>\n {UPLOAD_SOURCES.map((item) => (\n <Pressable\n key={item.id}\n onPress={() => {\n setSheet(null);\n onUpload(item.id);\n }}\n disabled={busy}\n style={[styles.uploadTile, busy && styles.tabMuted]}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name={item.icon} size={20} color=\"#0f172a\" />\n <Text style={styles.uploadTileLabel} numberOfLines={1}>\n {item.label}\n </Text>\n </Pressable>\n ))}\n </View>\n <CanvasLibraryPanel\n title=\"On this board\"\n boards={boards}\n boardId={boardId}\n runAction={runAction}\n onClose={() => setSheet(null)}\n onPlace={(item) => {\n onPlace(item);\n setSheet(null);\n }}\n onPickStorage={(kind, url, name) => {\n onPickStorage?.(kind, url, name);\n setSheet(null);\n }}\n />\n </>\n ) : null}\n {sheet === 'studios'\n ? STUDIOS.map((studio) => (\n <Pressable\n key={studio.id}\n onPress={() => {\n setSheet(null);\n onStudio(studio.id);\n }}\n style={styles.row}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name={studio.icon} size={20} color=\"#0f172a\" />\n <Text style={styles.rowLabel}>{studio.label}</Text>\n </Pressable>\n ))\n : null}\n {sheet === 'more' ? (\n <>\n <Pressable\n onPress={() => setSheet('looks')}\n style={styles.row}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"movie-filter-outline\" size={20} color=\"#0f172a\" />\n <Text style={styles.rowLabel}>Looks</Text>\n </Pressable>\n <Pressable\n onPress={() => setSheet('tasks')}\n style={styles.row}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"playlist-check\" size={20} color=\"#0f172a\" />\n <Text style={styles.rowLabel}>Tasks</Text>\n {taskBadge > 0 ? (\n <View style={styles.badge}>\n <Text style={styles.badgeLabel}>{taskBadge}</Text>\n </View>\n ) : null}\n </Pressable>\n <Pressable\n onPress={() => {\n setSheet(null);\n onRecord?.('camera-video');\n }}\n style={styles.row}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons\n name=\"record-circle-outline\"\n size={20}\n color=\"#0f172a\"\n />\n <Text style={styles.rowLabel}>Record</Text>\n </Pressable>\n </>\n ) : null}\n {sheet === 'looks' ? (\n <CanvasLooksPanel\n runAction={runAction}\n apolloClient={apolloClient}\n token={token}\n indexUrl={indexUrl}\n onRecreate={recreateLook}\n onClose={() => setSheet(null)}\n />\n ) : null}\n {sheet === 'tasks' ? (\n <CanvasTasksPanel onClose={() => setSheet(null)} onPlaceResult={placeTask} />\n ) : null}\n </View>\n </>\n ) : null}\n </View>\n {hideTabs ? null : (\n <View style={[styles.tabBar, { paddingBottom: Math.max(insets.bottom, 8) }]}>\n {TABS.map((tab) => {\n const active =\n sheet === tab.id ||\n (tab.id === 'more' && (sheet === 'more' || sheet === 'looks' || sheet === 'tasks'));\n const disabled = false;\n return (\n <Pressable\n key={tab.id}\n onPress={() => onTab(tab.id)}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityLabel={tab.label}\n style={[styles.tab, active && styles.tabOn, disabled && styles.tabMuted]}\n >\n <View>\n <MaterialCommunityIcons\n name={tab.icon}\n size={18}\n color={active ? '#0f172a' : '#64748b'}\n />\n {tab.id === 'more' && taskBadge > 0 ? (\n <View style={styles.tabBadge}>\n <Text style={styles.tabBadgeLabel}>{taskBadge}</Text>\n </View>\n ) : null}\n </View>\n <Text style={[styles.tabLabel, active && styles.tabLabelOn]}>{tab.label}</Text>\n </Pressable>\n );\n })}\n </View>\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n root: { flex: 1 },\n fill: { flex: 1 },\n hidden: { display: 'none' },\n hint: { padding: 16, fontSize: 13, color: '#64748b' },\n segment: {\n flexDirection: 'row',\n gap: 2,\n marginHorizontal: 16,\n marginBottom: 10,\n padding: 3,\n borderRadius: 999,\n backgroundColor: '#f1f5f9',\n },\n segmentTab: { flex: 1, alignItems: 'center', paddingVertical: 6, borderRadius: 999 },\n segmentTabOn: {\n backgroundColor: '#ffffff',\n shadowColor: '#0f172a',\n shadowOpacity: 0.08,\n shadowRadius: 4,\n shadowOffset: { width: 0, height: 1 },\n elevation: 1,\n },\n segmentLabel: { fontSize: 13, fontWeight: '600', color: '#64748b' },\n segmentLabelOn: { color: '#0f172a' },\n pickLayer: { ...StyleSheet.absoluteFillObject, zIndex: 5, backgroundColor: '#ffffff' },\n uploadStrip: { flexDirection: 'row', gap: 8, paddingHorizontal: 16, paddingBottom: 8 },\n uploadTile: {\n flex: 1,\n alignItems: 'center',\n gap: 4,\n paddingVertical: 10,\n borderRadius: 12,\n borderWidth: 1,\n borderStyle: 'dashed',\n borderColor: '#cbd5e1',\n },\n uploadTileLabel: { fontSize: 11, fontWeight: '600', color: '#334155' },\n plane: { flex: 1, overflow: 'hidden' },\n backdrop: {\n ...StyleSheet.absoluteFillObject,\n zIndex: 10,\n backgroundColor: 'rgba(15,23,42,0.2)',\n },\n sheet: {\n position: 'absolute',\n left: 0,\n right: 0,\n zIndex: 15,\n flex: 0,\n flexDirection: 'column',\n overflow: 'hidden',\n borderTopLeftRadius: 18,\n borderTopRightRadius: 18,\n backgroundColor: '#ffffff',\n borderTopWidth: StyleSheet.hairlineWidth,\n borderTopColor: '#e2e8f0',\n shadowColor: '#0f172a',\n shadowOpacity: 0.12,\n shadowRadius: 20,\n shadowOffset: { width: 0, height: -4 },\n elevation: 8,\n },\n handle: {\n alignSelf: 'center',\n width: 36,\n height: 4,\n borderRadius: 2,\n backgroundColor: '#e2e8f0',\n marginTop: 8,\n marginBottom: 4,\n },\n sheetTitle: {\n fontSize: 16,\n fontWeight: '700',\n color: '#0f172a',\n paddingHorizontal: 16,\n paddingBottom: 8,\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 12,\n paddingHorizontal: 16,\n paddingVertical: 12,\n },\n rowMuted: { opacity: 0.45 },\n rowLabel: { fontSize: 15, fontWeight: '500', color: '#0f172a' },\n rowLabelMuted: { fontSize: 15, fontWeight: '500', color: '#94a3b8' },\n tabBar: {\n flexDirection: 'row',\n borderTopWidth: StyleSheet.hairlineWidth,\n borderTopColor: '#e2e8f0',\n backgroundColor: '#ffffff',\n paddingTop: 6,\n paddingHorizontal: 4,\n zIndex: 20,\n },\n tab: {\n flex: 1,\n alignItems: 'center',\n gap: 2,\n paddingVertical: 4,\n borderRadius: 12,\n },\n tabOn: { backgroundColor: '#f1f5f9' },\n tabMuted: { opacity: 0.45 },\n tabLabel: { fontSize: 9.5, fontWeight: '600', color: '#64748b' },\n tabLabelOn: { color: '#0f172a' },\n badge: {\n marginLeft: 'auto',\n minWidth: 18,\n height: 18,\n borderRadius: 9,\n backgroundColor: '#ea580c',\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 5,\n },\n badgeLabel: { fontSize: 10, fontWeight: '700', color: '#fff7ed' },\n tabBadge: {\n position: 'absolute',\n top: -4,\n right: -8,\n minWidth: 14,\n height: 14,\n borderRadius: 7,\n backgroundColor: '#ea580c',\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 3,\n },\n tabBadgeLabel: { fontSize: 9, fontWeight: '700', color: '#fff7ed' },\n});\n"],"names":[],"mappings":"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"}
@@ -1,11 +1,12 @@
1
- import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useMemo,useState,useCallback}from'react';import {StyleSheet,useWindowDimensions,View,Pressable,Text,FlatList,ActivityIndicator,Image}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {useSafeAreaInsets}from'react-native-safe-area-context';import {extractFramesViaRpc}from'./frameExtract.js';import {friendlyMediaError}from'./videoEditor/mediaActions.js';import {unwrapProxyUrl}from'./videoEditor/remoteMediaClient.js';const SPREAD_COUNTS = [6, 12, 24];
1
+ import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useMemo,useState,useCallback}from'react';import {StyleSheet,useWindowDimensions,View,Pressable,Text,FlatList,ActivityIndicator,Image,Share}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {useSafeAreaInsets}from'react-native-safe-area-context';import {extractFramesViaRpc,frameShareContent}from'./frameExtract.js';import {friendlyMediaError}from'./videoEditor/mediaActions.js';import {unwrapProxyUrl}from'./videoEditor/remoteMediaClient.js';const SPREAD_COUNTS = [6, 12, 24];
2
2
  const INTERVALS = [0.5, 1, 2, 5];
3
3
  function FrameExtractorExperience({
4
4
  boardItems,
5
5
  seedVideo,
6
6
  runAction,
7
7
  onClose,
8
- onPlace
8
+ onPlace,
9
+ onSaveFrames
9
10
  }) {
10
11
  var _a;
11
12
  const insets = useSafeAreaInsets();
@@ -57,6 +58,28 @@ function FrameExtractorExperience({
57
58
  if (urls.length === 0) return;
58
59
  onPlace(urls);
59
60
  };
61
+ const [saving, setSaving] = useState(false);
62
+ const [saved, setSaved] = useState(null);
63
+ const share = () => {
64
+ const urls = frames.filter((_, i) => chosen.has(i));
65
+ if (urls.length === 0) return;
66
+ const content = frameShareContent(urls, (source == null ? void 0 : source.generatedAssetName) || "video");
67
+ void Share.share(content.url ? {
68
+ url: content.url,
69
+ message: content.message
70
+ } : {
71
+ message: content.message
72
+ }, {
73
+ subject: content.title
74
+ }).catch(() => void 0);
75
+ };
76
+ const save = () => {
77
+ const urls = frames.filter((_, i) => chosen.has(i));
78
+ if (!onSaveFrames || urls.length === 0 || saving) return;
79
+ setSaving(true);
80
+ setSaved(null);
81
+ onSaveFrames(urls).then(() => setSaved(`Saved ${urls.length} to Photos`)).catch((err) => setError(friendlyMediaError(err, "save to Photos"))).finally(() => setSaving(false));
82
+ };
60
83
  return /* @__PURE__ */ jsxs(View, { style: [styles.root, {
61
84
  paddingTop: insets.top + 8,
62
85
  paddingBottom: insets.bottom + 12
@@ -80,6 +103,14 @@ function FrameExtractorExperience({
80
103
  /* @__PURE__ */ jsx(Text, { style: styles.extractLabel, children: "Extract frames" })
81
104
  ] }) }),
82
105
  error ? /* @__PURE__ */ jsx(Text, { style: styles.error, children: error }) : null,
106
+ frames.length > 0 ? /* @__PURE__ */ jsxs(View, { style: styles.modeRow, children: [
107
+ /* @__PURE__ */ jsx(Pressable, { onPress: share, disabled: chosen.size === 0, style: [styles.chip, chosen.size === 0 && styles.extractOff], accessibilityRole: "button", accessibilityLabel: "Share chosen frames", children: /* @__PURE__ */ jsxs(Text, { style: styles.chipLabel, children: [
108
+ "Share ",
109
+ chosen.size || ""
110
+ ] }) }),
111
+ onSaveFrames ? /* @__PURE__ */ jsx(Pressable, { onPress: save, disabled: chosen.size === 0 || saving, style: [styles.chip, (chosen.size === 0 || saving) && styles.extractOff], accessibilityRole: "button", accessibilityLabel: "Save chosen frames to Photos", children: /* @__PURE__ */ jsx(Text, { style: styles.chipLabel, children: saving ? "Saving\u2026" : "Save to Photos" }) }) : null,
112
+ saved ? /* @__PURE__ */ jsx(Text, { style: styles.hint, children: saved }) : null
113
+ ] }) : null,
83
114
  /* @__PURE__ */ jsx(FlatList, { data: frames, keyExtractor: (url, i) => `${i}-${url.slice(-24)}`, numColumns: 3, contentContainerStyle: styles.grid, ListEmptyComponent: !busy ? /* @__PURE__ */ jsx(Text, { style: styles.hint, children: "Extracted stills land here \u2014 pick which to keep." }) : null, renderItem: ({
84
115
  item,
85
116
  index
@@ -1 +1 @@
1
- {"version":3,"file":"FrameExtractorExperience.js","sources":["../../../src/features/canvas/FrameExtractorExperience.tsx"],"sourcesContent":["/**\n * Native twin of canvas-surface FrameExtractor.\n * Spread / interval → EXTRACT_FRAMES connector → pick stills onto the board.\n */\nimport React, { useCallback, useMemo, useState } from 'react';\nimport {\n ActivityIndicator,\n FlatList,\n Image,\n Pressable,\n StyleSheet,\n Text,\n View,\n useWindowDimensions,\n} from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport type { CanvasItem } from './canvasCore';\nimport { extractFramesViaRpc } from './frameExtract';\nimport { friendlyMediaError, type RunMediaAction } from './videoEditor/mediaActions';\nimport { unwrapProxyUrl } from './videoEditor/remoteMediaClient';\n\nconst SPREAD_COUNTS = [6, 12, 24] as const;\nconst INTERVALS = [0.5, 1, 2, 5] as const;\n\ntype Mode = 'spread' | 'interval';\n\nexport function FrameExtractorExperience({\n boardItems,\n seedVideo,\n runAction,\n onClose,\n onPlace,\n}: {\n boardItems: CanvasItem[];\n seedVideo?: CanvasItem | null;\n runAction?: RunMediaAction;\n onClose: () => void;\n onPlace: (urls: string[]) => void;\n}) {\n const insets = useSafeAreaInsets();\n const { width } = useWindowDimensions();\n const tile = Math.max(100, Math.floor((width - 48) / 3));\n const videos = useMemo(() => boardItems.filter((item) => item.type === 'video'), [boardItems]);\n const [source, setSource] = useState<CanvasItem | null>(\n seedVideo?.type === 'video' ? seedVideo : (videos[0] ?? null),\n );\n const [mode, setMode] = useState<Mode>('spread');\n const [count, setCount] = useState<(typeof SPREAD_COUNTS)[number]>(12);\n const [interval, setIntervalSec] = useState<(typeof INTERVALS)[number]>(1);\n const [frames, setFrames] = useState<string[]>([]);\n const [chosen, setChosen] = useState<Set<number>>(new Set());\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const extract = useCallback(async () => {\n if (!runAction || !source) {\n setError(source ? 'Frame extract needs a live connector.' : 'Pick a video on the board first.');\n return;\n }\n setBusy(true);\n setError(null);\n setFrames([]);\n setChosen(new Set());\n try {\n const urls = await extractFramesViaRpc(runAction, unwrapProxyUrl(source.src), {\n fps: mode === 'interval' ? 1 / interval : Math.max(0.1, count / 30),\n maxFrames: mode === 'spread' ? count : Math.min(48, Math.ceil(30 / interval)),\n });\n setFrames(urls);\n setChosen(new Set(urls.map((_, i) => i)));\n } catch (err: unknown) {\n setError(friendlyMediaError(err, 'frame extract'));\n } finally {\n setBusy(false);\n }\n }, [count, interval, mode, runAction, source]);\n\n const toggle = (index: number) => {\n setChosen((prev) => {\n const next = new Set(prev);\n if (next.has(index)) next.delete(index);\n else next.add(index);\n return next;\n });\n };\n\n const place = () => {\n const urls = frames.filter((_, i) => chosen.has(i));\n if (urls.length === 0) return;\n onPlace(urls);\n };\n\n return (\n <View style={[styles.root, { paddingTop: insets.top + 8, paddingBottom: insets.bottom + 12 }]}>\n <View style={styles.head}>\n <Pressable onPress={onClose} hitSlop={10} accessibilityLabel=\"Close frames\">\n <MaterialCommunityIcons name=\"close\" size={22} color=\"#e2e8f0\" />\n </Pressable>\n <Text style={styles.title}>Frames</Text>\n <Pressable\n onPress={place}\n disabled={chosen.size === 0}\n style={[styles.placeBtn, chosen.size === 0 && styles.placeBtnOff]}\n accessibilityRole=\"button\"\n >\n <Text style={styles.placeLabel}>Place {chosen.size || ''}</Text>\n </Pressable>\n </View>\n\n <Text style={styles.section}>Source clip</Text>\n {videos.length === 0 ? (\n <Text style={styles.hint}>Add a video to the board, then open Frames again.</Text>\n ) : (\n <FlatList\n horizontal\n data={videos}\n keyExtractor={(item) => item.id}\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.sourceRow}\n renderItem={({ item }) => (\n <Pressable\n onPress={() => setSource(item)}\n style={[styles.sourceCard, source?.id === item.id && styles.sourceOn]}\n >\n <Text style={styles.sourceLabel} numberOfLines={1}>\n {item.generatedAssetName || 'Video'}\n </Text>\n </Pressable>\n )}\n />\n )}\n\n <View style={styles.modeRow}>\n {(['spread', 'interval'] as const).map((id) => (\n <Pressable key={id} onPress={() => setMode(id)} style={[styles.chip, mode === id && styles.chipOn]}>\n <Text style={[styles.chipLabel, mode === id && styles.chipLabelOn]}>\n {id === 'spread' ? 'Spread' : 'Interval'}\n </Text>\n </Pressable>\n ))}\n </View>\n <View style={styles.modeRow}>\n {(mode === 'spread' ? SPREAD_COUNTS : INTERVALS).map((value) => (\n <Pressable\n key={value}\n onPress={() =>\n mode === 'spread'\n ? setCount(value as typeof count)\n : setIntervalSec(value as typeof interval)\n }\n style={[styles.chip, (mode === 'spread' ? count : interval) === value && styles.chipOn]}\n >\n <Text\n style={[\n styles.chipLabel,\n (mode === 'spread' ? count : interval) === value && styles.chipLabelOn,\n ]}\n >\n {mode === 'spread' ? `${value}` : `${value}s`}\n </Text>\n </Pressable>\n ))}\n </View>\n\n <Pressable\n onPress={() => void extract()}\n disabled={busy || !source}\n style={[styles.extractBtn, (busy || !source) && styles.extractOff]}\n >\n {busy ? (\n <ActivityIndicator color=\"#0f172a\" />\n ) : (\n <>\n <MaterialCommunityIcons name=\"content-cut\" size={18} color=\"#0f172a\" />\n <Text style={styles.extractLabel}>Extract frames</Text>\n </>\n )}\n </Pressable>\n {error ? <Text style={styles.error}>{error}</Text> : null}\n\n <FlatList\n data={frames}\n keyExtractor={(url, i) => `${i}-${url.slice(-24)}`}\n numColumns={3}\n contentContainerStyle={styles.grid}\n ListEmptyComponent={\n !busy ? <Text style={styles.hint}>Extracted stills land here — pick which to keep.</Text> : null\n }\n renderItem={({ item, index }) => {\n const on = chosen.has(index);\n return (\n <Pressable onPress={() => toggle(index)} style={[styles.tile, { width: tile, height: tile }]}>\n <Image source={{ uri: item }} style={styles.thumb} />\n <View style={[styles.check, on && styles.checkOn]}>\n <MaterialCommunityIcons\n name={on ? 'check' : 'circle-outline'}\n size={16}\n color={on ? '#0f172a' : '#94a3b8'}\n />\n </View>\n </Pressable>\n );\n }}\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n root: { flex: 1, backgroundColor: '#0B0B0E' },\n head: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n marginBottom: 12,\n },\n title: { fontSize: 17, fontWeight: '700', color: '#F7F7FA' },\n placeBtn: {\n paddingHorizontal: 12,\n paddingVertical: 7,\n borderRadius: 9,\n backgroundColor: '#8B7CFF',\n },\n placeBtnOff: { opacity: 0.35 },\n placeLabel: { fontSize: 13, fontWeight: '700', color: '#0A0A0C' },\n section: { color: '#9A9AA5', fontSize: 11, paddingHorizontal: 16, marginBottom: 6 },\n hint: { color: '#7A7A88', fontSize: 13, paddingHorizontal: 16, paddingVertical: 12 },\n sourceRow: { paddingHorizontal: 12, gap: 8, paddingBottom: 10 },\n sourceCard: {\n maxWidth: 160,\n paddingHorizontal: 12,\n paddingVertical: 10,\n borderRadius: 10,\n backgroundColor: '#1F1F24',\n marginHorizontal: 4,\n },\n sourceOn: { backgroundColor: '#8B7CFF' },\n sourceLabel: { color: '#F7F7FA', fontSize: 12, fontWeight: '600' },\n modeRow: { flexDirection: 'row', flexWrap: 'wrap', gap: 8, paddingHorizontal: 16, paddingBottom: 8 },\n chip: {\n paddingHorizontal: 12,\n paddingVertical: 7,\n borderRadius: 9,\n backgroundColor: '#1F1F24',\n },\n chipOn: { backgroundColor: '#8B7CFF' },\n chipLabel: { color: '#F7F7FA', fontSize: 12.5, fontWeight: '500' },\n chipLabelOn: { color: '#0A0A0C' },\n extractBtn: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n marginHorizontal: 16,\n marginBottom: 8,\n paddingVertical: 12,\n borderRadius: 12,\n backgroundColor: '#F7F7FA',\n },\n extractOff: { opacity: 0.4 },\n extractLabel: { fontSize: 14, fontWeight: '700', color: '#0f172a' },\n error: { color: '#FECACA', fontSize: 12, paddingHorizontal: 16, marginBottom: 8 },\n grid: { paddingHorizontal: 12, paddingBottom: 24, gap: 8 },\n tile: {\n margin: 4,\n borderRadius: 10,\n overflow: 'hidden',\n backgroundColor: '#1F1F24',\n },\n thumb: { width: '100%', height: '100%' },\n check: {\n position: 'absolute',\n top: 6,\n right: 6,\n width: 24,\n height: 24,\n borderRadius: 12,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(15,23,42,0.55)',\n },\n checkOn: { backgroundColor: '#F7F7FA' },\n});\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FrameExtractorExperience.js","sources":["../../../src/features/canvas/FrameExtractorExperience.tsx"],"sourcesContent":["/**\n * Native twin of canvas-surface FrameExtractor.\n * Spread / interval → EXTRACT_FRAMES connector → pick stills onto the board.\n */\nimport React, { useCallback, useMemo, useState } from 'react';\nimport {\n ActivityIndicator,\n FlatList,\n Image,\n Pressable,\n Share,\n StyleSheet,\n Text,\n View,\n useWindowDimensions,\n} from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport type { CanvasItem } from './canvasCore';\nimport { extractFramesViaRpc, frameShareContent } from './frameExtract';\nimport { friendlyMediaError, type RunMediaAction } from './videoEditor/mediaActions';\nimport { unwrapProxyUrl } from './videoEditor/remoteMediaClient';\n\nconst SPREAD_COUNTS = [6, 12, 24] as const;\nconst INTERVALS = [0.5, 1, 2, 5] as const;\n\ntype Mode = 'spread' | 'interval';\n\nexport function FrameExtractorExperience({\n boardItems,\n seedVideo,\n runAction,\n onClose,\n onPlace,\n onSaveFrames,\n}: {\n boardItems: CanvasItem[];\n seedVideo?: CanvasItem | null;\n runAction?: RunMediaAction;\n onClose: () => void;\n onPlace: (urls: string[]) => void;\n /**\n * Host seam: save the chosen stills to Photos (needs a native media\n * library module the remote cannot ship). Absent = only Share is offered.\n */\n onSaveFrames?: (urls: string[]) => Promise<void>;\n}) {\n const insets = useSafeAreaInsets();\n const { width } = useWindowDimensions();\n const tile = Math.max(100, Math.floor((width - 48) / 3));\n const videos = useMemo(() => boardItems.filter((item) => item.type === 'video'), [boardItems]);\n const [source, setSource] = useState<CanvasItem | null>(\n seedVideo?.type === 'video' ? seedVideo : (videos[0] ?? null),\n );\n const [mode, setMode] = useState<Mode>('spread');\n const [count, setCount] = useState<(typeof SPREAD_COUNTS)[number]>(12);\n const [interval, setIntervalSec] = useState<(typeof INTERVALS)[number]>(1);\n const [frames, setFrames] = useState<string[]>([]);\n const [chosen, setChosen] = useState<Set<number>>(new Set());\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const extract = useCallback(async () => {\n if (!runAction || !source) {\n setError(source ? 'Frame extract needs a live connector.' : 'Pick a video on the board first.');\n return;\n }\n setBusy(true);\n setError(null);\n setFrames([]);\n setChosen(new Set());\n try {\n const urls = await extractFramesViaRpc(runAction, unwrapProxyUrl(source.src), {\n fps: mode === 'interval' ? 1 / interval : Math.max(0.1, count / 30),\n maxFrames: mode === 'spread' ? count : Math.min(48, Math.ceil(30 / interval)),\n });\n setFrames(urls);\n setChosen(new Set(urls.map((_, i) => i)));\n } catch (err: unknown) {\n setError(friendlyMediaError(err, 'frame extract'));\n } finally {\n setBusy(false);\n }\n }, [count, interval, mode, runAction, source]);\n\n const toggle = (index: number) => {\n setChosen((prev) => {\n const next = new Set(prev);\n if (next.has(index)) next.delete(index);\n else next.add(index);\n return next;\n });\n };\n\n const place = () => {\n const urls = frames.filter((_, i) => chosen.has(i));\n if (urls.length === 0) return;\n onPlace(urls);\n };\n\n const [saving, setSaving] = useState(false);\n const [saved, setSaved] = useState<string | null>(null);\n const share = () => {\n const urls = frames.filter((_, i) => chosen.has(i));\n if (urls.length === 0) return;\n const content = frameShareContent(urls, source?.generatedAssetName || 'video');\n void Share.share(content.url ? { url: content.url, message: content.message } : { message: content.message }, {\n subject: content.title,\n }).catch(() => undefined);\n };\n const save = () => {\n const urls = frames.filter((_, i) => chosen.has(i));\n if (!onSaveFrames || urls.length === 0 || saving) return;\n setSaving(true);\n setSaved(null);\n onSaveFrames(urls)\n .then(() => setSaved(`Saved ${urls.length} to Photos`))\n .catch((err: unknown) => setError(friendlyMediaError(err, 'save to Photos')))\n .finally(() => setSaving(false));\n };\n\n return (\n <View style={[styles.root, { paddingTop: insets.top + 8, paddingBottom: insets.bottom + 12 }]}>\n <View style={styles.head}>\n <Pressable onPress={onClose} hitSlop={10} accessibilityLabel=\"Close frames\">\n <MaterialCommunityIcons name=\"close\" size={22} color=\"#e2e8f0\" />\n </Pressable>\n <Text style={styles.title}>Frames</Text>\n <Pressable\n onPress={place}\n disabled={chosen.size === 0}\n style={[styles.placeBtn, chosen.size === 0 && styles.placeBtnOff]}\n accessibilityRole=\"button\"\n >\n <Text style={styles.placeLabel}>Place {chosen.size || ''}</Text>\n </Pressable>\n </View>\n\n <Text style={styles.section}>Source clip</Text>\n {videos.length === 0 ? (\n <Text style={styles.hint}>Add a video to the board, then open Frames again.</Text>\n ) : (\n <FlatList\n horizontal\n data={videos}\n keyExtractor={(item) => item.id}\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.sourceRow}\n renderItem={({ item }) => (\n <Pressable\n onPress={() => setSource(item)}\n style={[styles.sourceCard, source?.id === item.id && styles.sourceOn]}\n >\n <Text style={styles.sourceLabel} numberOfLines={1}>\n {item.generatedAssetName || 'Video'}\n </Text>\n </Pressable>\n )}\n />\n )}\n\n <View style={styles.modeRow}>\n {(['spread', 'interval'] as const).map((id) => (\n <Pressable key={id} onPress={() => setMode(id)} style={[styles.chip, mode === id && styles.chipOn]}>\n <Text style={[styles.chipLabel, mode === id && styles.chipLabelOn]}>\n {id === 'spread' ? 'Spread' : 'Interval'}\n </Text>\n </Pressable>\n ))}\n </View>\n <View style={styles.modeRow}>\n {(mode === 'spread' ? SPREAD_COUNTS : INTERVALS).map((value) => (\n <Pressable\n key={value}\n onPress={() =>\n mode === 'spread'\n ? setCount(value as typeof count)\n : setIntervalSec(value as typeof interval)\n }\n style={[styles.chip, (mode === 'spread' ? count : interval) === value && styles.chipOn]}\n >\n <Text\n style={[\n styles.chipLabel,\n (mode === 'spread' ? count : interval) === value && styles.chipLabelOn,\n ]}\n >\n {mode === 'spread' ? `${value}` : `${value}s`}\n </Text>\n </Pressable>\n ))}\n </View>\n\n <Pressable\n onPress={() => void extract()}\n disabled={busy || !source}\n style={[styles.extractBtn, (busy || !source) && styles.extractOff]}\n >\n {busy ? (\n <ActivityIndicator color=\"#0f172a\" />\n ) : (\n <>\n <MaterialCommunityIcons name=\"content-cut\" size={18} color=\"#0f172a\" />\n <Text style={styles.extractLabel}>Extract frames</Text>\n </>\n )}\n </Pressable>\n {error ? <Text style={styles.error}>{error}</Text> : null}\n {frames.length > 0 ? (\n <View style={styles.modeRow}>\n <Pressable\n onPress={share}\n disabled={chosen.size === 0}\n style={[styles.chip, chosen.size === 0 && styles.extractOff]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Share chosen frames\"\n >\n <Text style={styles.chipLabel}>Share {chosen.size || ''}</Text>\n </Pressable>\n {onSaveFrames ? (\n <Pressable\n onPress={save}\n disabled={chosen.size === 0 || saving}\n style={[styles.chip, (chosen.size === 0 || saving) && styles.extractOff]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Save chosen frames to Photos\"\n >\n <Text style={styles.chipLabel}>{saving ? 'Saving…' : 'Save to Photos'}</Text>\n </Pressable>\n ) : null}\n {saved ? <Text style={styles.hint}>{saved}</Text> : null}\n </View>\n ) : null}\n\n <FlatList\n data={frames}\n keyExtractor={(url, i) => `${i}-${url.slice(-24)}`}\n numColumns={3}\n contentContainerStyle={styles.grid}\n ListEmptyComponent={\n !busy ? <Text style={styles.hint}>Extracted stills land here — pick which to keep.</Text> : null\n }\n renderItem={({ item, index }) => {\n const on = chosen.has(index);\n return (\n <Pressable onPress={() => toggle(index)} style={[styles.tile, { width: tile, height: tile }]}>\n <Image source={{ uri: item }} style={styles.thumb} />\n <View style={[styles.check, on && styles.checkOn]}>\n <MaterialCommunityIcons\n name={on ? 'check' : 'circle-outline'}\n size={16}\n color={on ? '#0f172a' : '#94a3b8'}\n />\n </View>\n </Pressable>\n );\n }}\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n root: { flex: 1, backgroundColor: '#0B0B0E' },\n head: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n marginBottom: 12,\n },\n title: { fontSize: 17, fontWeight: '700', color: '#F7F7FA' },\n placeBtn: {\n paddingHorizontal: 12,\n paddingVertical: 7,\n borderRadius: 9,\n backgroundColor: '#8B7CFF',\n },\n placeBtnOff: { opacity: 0.35 },\n placeLabel: { fontSize: 13, fontWeight: '700', color: '#0A0A0C' },\n section: { color: '#9A9AA5', fontSize: 11, paddingHorizontal: 16, marginBottom: 6 },\n hint: { color: '#7A7A88', fontSize: 13, paddingHorizontal: 16, paddingVertical: 12 },\n sourceRow: { paddingHorizontal: 12, gap: 8, paddingBottom: 10 },\n sourceCard: {\n maxWidth: 160,\n paddingHorizontal: 12,\n paddingVertical: 10,\n borderRadius: 10,\n backgroundColor: '#1F1F24',\n marginHorizontal: 4,\n },\n sourceOn: { backgroundColor: '#8B7CFF' },\n sourceLabel: { color: '#F7F7FA', fontSize: 12, fontWeight: '600' },\n modeRow: { flexDirection: 'row', flexWrap: 'wrap', gap: 8, paddingHorizontal: 16, paddingBottom: 8 },\n chip: {\n paddingHorizontal: 12,\n paddingVertical: 7,\n borderRadius: 9,\n backgroundColor: '#1F1F24',\n },\n chipOn: { backgroundColor: '#8B7CFF' },\n chipLabel: { color: '#F7F7FA', fontSize: 12.5, fontWeight: '500' },\n chipLabelOn: { color: '#0A0A0C' },\n extractBtn: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n marginHorizontal: 16,\n marginBottom: 8,\n paddingVertical: 12,\n borderRadius: 12,\n backgroundColor: '#F7F7FA',\n },\n extractOff: { opacity: 0.4 },\n extractLabel: { fontSize: 14, fontWeight: '700', color: '#0f172a' },\n error: { color: '#FECACA', fontSize: 12, paddingHorizontal: 16, marginBottom: 8 },\n grid: { paddingHorizontal: 12, paddingBottom: 24, gap: 8 },\n tile: {\n margin: 4,\n borderRadius: 10,\n overflow: 'hidden',\n backgroundColor: '#1F1F24',\n },\n thumb: { width: '100%', height: '100%' },\n check: {\n position: 'absolute',\n top: 6,\n right: 6,\n width: 24,\n height: 24,\n borderRadius: 12,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(15,23,42,0.55)',\n },\n checkOn: { backgroundColor: '#F7F7FA' },\n});\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,197 @@
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {StyleSheet,View,Text,ScrollView,Image,Pressable}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {STILL_ROLE_HINTS,STILL_ROLE_LABELS}from'./generatorReferences.js';const ROLES = ["source", "reference"];
2
+ function StillRoleSwitch({
3
+ value,
4
+ onChange
5
+ }) {
6
+ return /* @__PURE__ */ jsx(View, { style: styles.roleRow, accessibilityLabel: "What the attached image is for", children: ROLES.map((role) => /* @__PURE__ */ jsx(Pressable, { onPress: () => onChange(role), style: [styles.rolePill, value === role && styles.rolePillOn], accessibilityRole: "button", accessibilityState: {
7
+ selected: value === role
8
+ }, accessibilityHint: STILL_ROLE_HINTS[role], children: /* @__PURE__ */ jsx(Text, { style: [styles.roleLabel, value === role && styles.roleLabelOn], children: STILL_ROLE_LABELS[role] }) }, role)) });
9
+ }
10
+ function FrameSlot({
11
+ label,
12
+ dot,
13
+ url,
14
+ busy,
15
+ onPick,
16
+ onClear
17
+ }) {
18
+ const head = /* @__PURE__ */ jsxs(View, { style: styles.slotHead, children: [
19
+ /* @__PURE__ */ jsx(View, { style: [styles.dot, {
20
+ backgroundColor: dot
21
+ }] }),
22
+ /* @__PURE__ */ jsx(Text, { style: styles.slotLabel, children: label })
23
+ ] });
24
+ if (url) {
25
+ return /* @__PURE__ */ jsxs(View, { style: styles.slot, children: [
26
+ /* @__PURE__ */ jsx(Image, { source: {
27
+ uri: url
28
+ }, style: styles.slotImage }),
29
+ /* @__PURE__ */ jsx(View, { style: styles.slotBadge, children: head }),
30
+ /* @__PURE__ */ jsx(Pressable, { onPress: onClear, style: styles.clear, hitSlop: 6, accessibilityLabel: `Remove the ${label.toLowerCase()}`, children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "close", size: 12, color: "#475569" }) })
31
+ ] });
32
+ }
33
+ return /* @__PURE__ */ jsxs(View, { style: [styles.slot, styles.slotEmpty], children: [
34
+ head,
35
+ /* @__PURE__ */ jsx(SlotSources, { busy, onPick })
36
+ ] });
37
+ }
38
+ function SlotSources({
39
+ busy,
40
+ onPick
41
+ }) {
42
+ if (busy) return /* @__PURE__ */ jsx(Text, { style: styles.muted, children: "Adding\u2026" });
43
+ if (!onPick) return /* @__PURE__ */ jsx(Text, { style: styles.muted, children: "Select an image on the board" });
44
+ return /* @__PURE__ */ jsxs(View, { style: styles.sources, children: [
45
+ /* @__PURE__ */ jsxs(Pressable, { onPress: () => onPick("library"), style: styles.source, accessibilityRole: "button", children: [
46
+ /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "image-multiple-outline", size: 14, color: "#475569" }),
47
+ /* @__PURE__ */ jsx(Text, { style: styles.sourceLabel, children: "Library" })
48
+ ] }),
49
+ /* @__PURE__ */ jsxs(Pressable, { onPress: () => onPick("device"), style: styles.source, accessibilityRole: "button", children: [
50
+ /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "cellphone-arrow-down", size: 14, color: "#475569" }),
51
+ /* @__PURE__ */ jsx(Text, { style: styles.sourceLabel, children: "Device" })
52
+ ] })
53
+ ] });
54
+ }
55
+ function ReferenceStrip({
56
+ label,
57
+ hint,
58
+ urls,
59
+ cap,
60
+ busy,
61
+ onPick,
62
+ onRemove
63
+ }) {
64
+ if (cap <= 0) return null;
65
+ return /* @__PURE__ */ jsxs(View, { style: styles.strip, children: [
66
+ /* @__PURE__ */ jsxs(Text, { style: styles.slotLabel, children: [
67
+ label,
68
+ " \xB7 ",
69
+ urls.length,
70
+ "/",
71
+ cap
72
+ ] }),
73
+ hint && urls.length === 0 ? /* @__PURE__ */ jsx(Text, { style: styles.muted, children: hint }) : null,
74
+ /* @__PURE__ */ jsxs(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, contentContainerStyle: styles.stripRow, children: [
75
+ urls.map((url) => /* @__PURE__ */ jsxs(View, { style: styles.tile, children: [
76
+ /* @__PURE__ */ jsx(Image, { source: {
77
+ uri: url
78
+ }, style: styles.tileImage }),
79
+ /* @__PURE__ */ jsx(Pressable, { onPress: () => onRemove(url), style: styles.clear, hitSlop: 6, accessibilityLabel: "Remove this reference", children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "close", size: 12, color: "#475569" }) })
80
+ ] }, url)),
81
+ urls.length < cap ? /* @__PURE__ */ jsx(View, { style: [styles.tile, styles.slotEmpty], children: /* @__PURE__ */ jsx(SlotSources, { busy, onPick }) }) : null
82
+ ] })
83
+ ] });
84
+ }
85
+ const styles = StyleSheet.create({
86
+ roleRow: {
87
+ flexDirection: "row",
88
+ gap: 4,
89
+ alignSelf: "flex-start"
90
+ },
91
+ rolePill: {
92
+ paddingHorizontal: 12,
93
+ paddingVertical: 5,
94
+ borderRadius: 999
95
+ },
96
+ rolePillOn: {
97
+ backgroundColor: "#fde8d8"
98
+ },
99
+ roleLabel: {
100
+ fontSize: 12,
101
+ fontWeight: "600",
102
+ color: "#64748b"
103
+ },
104
+ roleLabelOn: {
105
+ color: "#9a3412"
106
+ },
107
+ slot: {
108
+ flex: 1,
109
+ minWidth: 0,
110
+ height: 112,
111
+ borderRadius: 12,
112
+ borderWidth: 1,
113
+ borderColor: "#e2e8f0",
114
+ overflow: "hidden"
115
+ },
116
+ slotEmpty: {
117
+ borderStyle: "dashed",
118
+ padding: 8,
119
+ gap: 6,
120
+ justifyContent: "space-between"
121
+ },
122
+ slotImage: {
123
+ width: "100%",
124
+ height: "100%"
125
+ },
126
+ slotBadge: {
127
+ position: "absolute",
128
+ left: 4,
129
+ top: 4,
130
+ borderRadius: 6,
131
+ paddingHorizontal: 6,
132
+ paddingVertical: 2,
133
+ backgroundColor: "rgba(255,255,255,0.88)"
134
+ },
135
+ slotHead: {
136
+ flexDirection: "row",
137
+ alignItems: "center",
138
+ gap: 6
139
+ },
140
+ dot: {
141
+ width: 6,
142
+ height: 6,
143
+ borderRadius: 3
144
+ },
145
+ slotLabel: {
146
+ fontSize: 12,
147
+ fontWeight: "600",
148
+ color: "#334155"
149
+ },
150
+ clear: {
151
+ position: "absolute",
152
+ right: 0,
153
+ top: 0,
154
+ padding: 3,
155
+ borderBottomLeftRadius: 8,
156
+ backgroundColor: "rgba(255,255,255,0.88)"
157
+ },
158
+ sources: {
159
+ gap: 4
160
+ },
161
+ source: {
162
+ flexDirection: "row",
163
+ alignItems: "center",
164
+ justifyContent: "center",
165
+ gap: 4,
166
+ borderRadius: 8,
167
+ paddingVertical: 4,
168
+ backgroundColor: "#f1f5f9"
169
+ },
170
+ sourceLabel: {
171
+ fontSize: 11,
172
+ fontWeight: "600",
173
+ color: "#475569"
174
+ },
175
+ muted: {
176
+ fontSize: 11,
177
+ color: "#94a3b8"
178
+ },
179
+ strip: {
180
+ gap: 6
181
+ },
182
+ stripRow: {
183
+ gap: 8
184
+ },
185
+ tile: {
186
+ width: 88,
187
+ height: 88,
188
+ borderRadius: 10,
189
+ borderWidth: 1,
190
+ borderColor: "#e2e8f0",
191
+ overflow: "hidden"
192
+ },
193
+ tileImage: {
194
+ width: "100%",
195
+ height: "100%"
196
+ }
197
+ });export{FrameSlot,ReferenceStrip,StillRoleSwitch};//# sourceMappingURL=GeneratorReferenceSlots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeneratorReferenceSlots.js","sources":["../../../src/features/canvas/GeneratorReferenceSlots.tsx"],"sourcesContent":["/**\n * Generator reference slots — native twin of canvas-surface `frameSlot` and\n * `StillRoleSwitch`. A slot shows its still (with remove) or offers Library /\n * Device; the host decides how each source is picked.\n */\nimport React from 'react';\nimport { Image, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { STILL_ROLE_HINTS, STILL_ROLE_LABELS, type StillRole } from './generatorReferences';\n\nexport type StillPickSource = 'library' | 'device';\n\nconst ROLES: readonly StillRole[] = ['source', 'reference'];\n\nexport function StillRoleSwitch({ value, onChange }: { value: StillRole; onChange: (role: StillRole) => void }) {\n return (\n <View style={styles.roleRow} accessibilityLabel=\"What the attached image is for\">\n {ROLES.map((role) => (\n <Pressable\n key={role}\n onPress={() => onChange(role)}\n style={[styles.rolePill, value === role && styles.rolePillOn]}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: value === role }}\n accessibilityHint={STILL_ROLE_HINTS[role]}\n >\n <Text style={[styles.roleLabel, value === role && styles.roleLabelOn]}>\n {STILL_ROLE_LABELS[role]}\n </Text>\n </Pressable>\n ))}\n </View>\n );\n}\n\n/** One named slot: First frame / Last frame. */\nexport function FrameSlot({\n label,\n dot,\n url,\n busy,\n onPick,\n onClear,\n}: {\n label: string;\n dot: string;\n url: string | null;\n busy?: boolean;\n onPick?: (source: StillPickSource) => void;\n onClear: () => void;\n}) {\n const head = (\n <View style={styles.slotHead}>\n <View style={[styles.dot, { backgroundColor: dot }]} />\n <Text style={styles.slotLabel}>{label}</Text>\n </View>\n );\n if (url) {\n return (\n <View style={styles.slot}>\n <Image source={{ uri: url }} style={styles.slotImage} />\n <View style={styles.slotBadge}>{head}</View>\n <Pressable\n onPress={onClear}\n style={styles.clear}\n hitSlop={6}\n accessibilityLabel={`Remove the ${label.toLowerCase()}`}\n >\n <MaterialCommunityIcons name=\"close\" size={12} color=\"#475569\" />\n </Pressable>\n </View>\n );\n }\n return (\n <View style={[styles.slot, styles.slotEmpty]}>\n {head}\n <SlotSources busy={busy} onPick={onPick} />\n </View>\n );\n}\n\nfunction SlotSources({ busy, onPick }: { busy?: boolean; onPick?: (source: StillPickSource) => void }) {\n if (busy) return <Text style={styles.muted}>Adding…</Text>;\n if (!onPick) return <Text style={styles.muted}>Select an image on the board</Text>;\n return (\n <View style={styles.sources}>\n <Pressable onPress={() => onPick('library')} style={styles.source} accessibilityRole=\"button\">\n <MaterialCommunityIcons name=\"image-multiple-outline\" size={14} color=\"#475569\" />\n <Text style={styles.sourceLabel}>Library</Text>\n </Pressable>\n <Pressable onPress={() => onPick('device')} style={styles.source} accessibilityRole=\"button\">\n <MaterialCommunityIcons name=\"cellphone-arrow-down\" size={14} color=\"#475569\" />\n <Text style={styles.sourceLabel}>Device</Text>\n </Pressable>\n </View>\n );\n}\n\n/** A capped strip of stills (Other references / image references / promo references). */\nexport function ReferenceStrip({\n label,\n hint,\n urls,\n cap,\n busy,\n onPick,\n onRemove,\n}: {\n label: string;\n hint?: string;\n urls: readonly string[];\n cap: number;\n busy?: boolean;\n onPick?: (source: StillPickSource) => void;\n onRemove: (url: string) => void;\n}) {\n if (cap <= 0) return null;\n return (\n <View style={styles.strip}>\n <Text style={styles.slotLabel}>\n {label} · {urls.length}/{cap}\n </Text>\n {hint && urls.length === 0 ? <Text style={styles.muted}>{hint}</Text> : null}\n <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.stripRow}>\n {urls.map((url) => (\n <View key={url} style={styles.tile}>\n <Image source={{ uri: url }} style={styles.tileImage} />\n <Pressable\n onPress={() => onRemove(url)}\n style={styles.clear}\n hitSlop={6}\n accessibilityLabel=\"Remove this reference\"\n >\n <MaterialCommunityIcons name=\"close\" size={12} color=\"#475569\" />\n </Pressable>\n </View>\n ))}\n {urls.length < cap ? (\n <View style={[styles.tile, styles.slotEmpty]}>\n <SlotSources busy={busy} onPick={onPick} />\n </View>\n ) : null}\n </ScrollView>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n roleRow: { flexDirection: 'row', gap: 4, alignSelf: 'flex-start' },\n rolePill: { paddingHorizontal: 12, paddingVertical: 5, borderRadius: 999 },\n rolePillOn: { backgroundColor: '#fde8d8' },\n roleLabel: { fontSize: 12, fontWeight: '600', color: '#64748b' },\n roleLabelOn: { color: '#9a3412' },\n slot: {\n flex: 1,\n minWidth: 0,\n height: 112,\n borderRadius: 12,\n borderWidth: 1,\n borderColor: '#e2e8f0',\n overflow: 'hidden',\n },\n slotEmpty: { borderStyle: 'dashed', padding: 8, gap: 6, justifyContent: 'space-between' },\n slotImage: { width: '100%', height: '100%' },\n slotBadge: {\n position: 'absolute',\n left: 4,\n top: 4,\n borderRadius: 6,\n paddingHorizontal: 6,\n paddingVertical: 2,\n backgroundColor: 'rgba(255,255,255,0.88)',\n },\n slotHead: { flexDirection: 'row', alignItems: 'center', gap: 6 },\n dot: { width: 6, height: 6, borderRadius: 3 },\n slotLabel: { fontSize: 12, fontWeight: '600', color: '#334155' },\n clear: {\n position: 'absolute',\n right: 0,\n top: 0,\n padding: 3,\n borderBottomLeftRadius: 8,\n backgroundColor: 'rgba(255,255,255,0.88)',\n },\n sources: { gap: 4 },\n source: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 4,\n borderRadius: 8,\n paddingVertical: 4,\n backgroundColor: '#f1f5f9',\n },\n sourceLabel: { fontSize: 11, fontWeight: '600', color: '#475569' },\n muted: { fontSize: 11, color: '#94a3b8' },\n strip: { gap: 6 },\n stripRow: { gap: 8 },\n tile: { width: 88, height: 88, borderRadius: 10, borderWidth: 1, borderColor: '#e2e8f0', overflow: 'hidden' },\n tileImage: { width: '100%', height: '100%' },\n});\n"],"names":[],"mappings":"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"}