@adminide-stack/yantra-mobile 12.0.121 → 12.0.123

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 +3 -3
  175. /package/lib/assets/apps/{paper2poster.webp → poster.webp} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"CanvasBoardsGrid.js","sources":["../../../src/features/canvas/CanvasBoardsGrid.tsx"],"sourcesContent":["/**\n * Board grid — native twin of canvas-surface `CanvasBoards`.\n * Screen one: empty card with + New canvas, or a 2-up grid of tiles.\n * Renders 10 boards at a time; scrolling to the bottom appends the next 10.\n */\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { FlatList, Pressable, ScrollView, StyleSheet, Text, useWindowDimensions, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Image } from 'expo-image';\nimport type { CanvasBoardSummary } from './surfaceIndex';\nimport type { DesignKind } from '../design/designCore';\nimport type { DesignDocSummary } from '../design/designIndex';\nimport { isUnsetBoardTitle } from './canvasCore';\nimport { CANVAS_BOARD_PAGE_SIZE } from './canvasBoardsCatalog';\nimport type { StudioLook } from './studioLooks';\n\nconst MINUTE = 60_000;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst GUTTER = 16;\nconst TILE_RADIUS = 12;\n\nfunction relativeTime(ts: number): string {\n const diff = Date.now() - ts;\n if (diff < HOUR) return `${Math.max(1, Math.round(diff / MINUTE))}m ago`;\n if (diff < DAY) return `${Math.round(diff / HOUR)}h ago`;\n if (diff < 30 * DAY) return `${Math.round(diff / DAY)}d ago`;\n return new Date(ts).toLocaleDateString();\n}\n\ntype GridItem =\n | { kind: 'new'; id: string }\n | { kind: 'board'; id: string; board: CanvasBoardSummary; preview?: CanvasBoardSummary['board']['items'][number] };\n\nexport function CanvasBoardsGrid({\n boards,\n onOpen,\n onNewCanvas,\n designs = [],\n onOpenDesign,\n onNewDesign,\n onAskAgent,\n onComposeGenerate,\n featuredLooks = [],\n onRecreateLook,\n}: {\n boards: CanvasBoardSummary[];\n onOpen: (channelId: string) => void;\n onNewCanvas: () => void;\n designs?: DesignDocSummary[];\n onOpenDesign?: (channelId: string) => void;\n onNewDesign?: (kind: DesignKind) => void;\n onAskAgent?: () => void;\n /** Home composer chips → open generate with a seeded prompt (web CanvasHome). */\n onComposeGenerate?: (seed: { mode: 'image' | 'video'; prompt: string }) => void;\n /** Web Featured Looks rail on home. */\n featuredLooks?: StudioLook[];\n onRecreateLook?: (look: StudioLook) => void;\n}) {\n const { width } = useWindowDimensions();\n const tileWidth = Math.max(140, (width - GUTTER * 3) / 2);\n const [visible, setVisible] = useState(CANVAS_BOARD_PAGE_SIZE);\n\n useEffect(() => {\n setVisible(CANVAS_BOARD_PAGE_SIZE);\n }, [boards]);\n\n const tiles = useMemo<GridItem[]>(() => {\n const shown = boards.slice(0, visible);\n return [\n { kind: 'new', id: '__new__' },\n ...shown.map((board) => ({\n kind: 'board' as const,\n id: board.channelId,\n board,\n preview: board.board.items.find((it) => it.type === 'image' || it.type === 'video'),\n })),\n ];\n }, [boards, visible]);\n\n const rows = useMemo(() => {\n const chunked: GridItem[][] = [];\n for (let i = 0; i < tiles.length; i += 2) {\n chunked.push(tiles.slice(i, i + 2));\n }\n return chunked;\n }, [tiles]);\n\n const loadMore = useCallback(() => {\n setVisible((count) => {\n if (count >= boards.length) return count;\n return Math.min(count + CANVAS_BOARD_PAGE_SIZE, boards.length);\n });\n }, [boards.length]);\n\n const studioStrip =\n onNewDesign || onAskAgent || onComposeGenerate || featuredLooks.length > 0 ? (\n <View style={styles.studioStrip}>\n {onComposeGenerate ? (\n <View style={styles.composerBlock}>\n <Text style={styles.studioLabel}>Start creating</Text>\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.studioRow}\n >\n {(\n [\n ['video', 'Featured look', 'Cinematic product hero, soft rim light, 9:16'],\n ['image', 'Character', 'Portrait of a friendly guide character, clean studio'],\n ['video', 'Camera', 'Handheld tracking shot through a neon alley at night'],\n ['video', 'Film setup', 'Anamorphic film still, shallow DOF, golden hour'],\n ] as const\n ).map(([mode, label, prompt]) => (\n <Pressable\n key={label}\n onPress={() => onComposeGenerate({ mode, prompt })}\n style={styles.studioChip}\n accessibilityRole=\"button\"\n >\n <Text style={styles.studioChipLabel}>{label}</Text>\n </Pressable>\n ))}\n </ScrollView>\n </View>\n ) : null}\n {featuredLooks.length > 0 && onRecreateLook ? (\n <View style={styles.composerBlock}>\n <Text style={styles.studioLabel}>Looks</Text>\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.studioRow}\n >\n {featuredLooks.map((look) => (\n <Pressable\n key={look.id}\n onPress={() => onRecreateLook(look)}\n style={styles.lookChip}\n accessibilityRole=\"button\"\n accessibilityLabel={`Recreate ${look.name}`}\n >\n {look.cover ? (\n <Image\n source={{ uri: look.cover }}\n style={styles.lookCover}\n contentFit=\"cover\"\n />\n ) : (\n <View style={[styles.lookCover, styles.lookCoverFallback]}>\n <MaterialCommunityIcons\n name=\"movie-open-outline\"\n size={18}\n color=\"#94a3b8\"\n />\n </View>\n )}\n <Text style={styles.lookName} numberOfLines={2}>\n {look.name}\n </Text>\n </Pressable>\n ))}\n </ScrollView>\n </View>\n ) : null}\n <View style={styles.studioHead}>\n <Text style={styles.studioLabel}>Design studio</Text>\n {onAskAgent ? (\n <Pressable\n onPress={onAskAgent}\n style={styles.askAgentBtn}\n accessibilityRole=\"button\"\n accessibilityLabel=\"AI Chat\"\n >\n <MaterialCommunityIcons name=\"creation\" size={14} color=\"#64748b\" />\n <Text style={styles.askAgentLabel}>AI Chat</Text>\n </Pressable>\n ) : null}\n </View>\n {onNewDesign ? (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.studioRow}\n >\n {(\n [\n ['design', 'shape-square-plus', 'Design'],\n ['tshirt', 'tshirt-crew-outline', 'T-shirt'],\n ['postcard', 'email-outline', 'Postcard'],\n ] as const\n ).map(([kind, icon, label]) => (\n <Pressable\n key={kind}\n onPress={() => onNewDesign(kind)}\n style={styles.studioChip}\n accessibilityRole=\"button\"\n accessibilityLabel={`New ${label}`}\n >\n <MaterialCommunityIcons name={icon} size={16} color=\"#0f172a\" />\n <Text style={styles.studioChipLabel}>{label}</Text>\n </Pressable>\n ))}\n {designs.map((design) => (\n <Pressable\n key={design.channelId}\n onPress={() => onOpenDesign?.(design.channelId)}\n style={[styles.studioChip, styles.studioChipSaved]}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons\n name={\n design.doc.kind === 'tshirt'\n ? 'tshirt-crew-outline'\n : design.doc.kind === 'postcard'\n ? 'email-outline'\n : 'shape-square-plus'\n }\n size={16}\n color=\"#f8fafc\"\n />\n <Text style={[styles.studioChipLabel, styles.studioChipLabelSaved]} numberOfLines={1}>\n {design.title || 'Design'}\n </Text>\n </Pressable>\n ))}\n </ScrollView>\n ) : null}\n </View>\n ) : null;\n\n const renderTile = (item: GridItem) => {\n if (item.kind === 'new') {\n return (\n <Pressable\n onPress={onNewCanvas}\n style={[styles.tile, styles.tileDashed, { width: tileWidth }]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"New canvas\"\n >\n <View style={styles.thumb}>\n <MaterialCommunityIcons name=\"plus\" size={28} color=\"#64748b\" />\n <Text style={styles.dashHint}>Start a blank canvas</Text>\n </View>\n <View style={styles.meta}>\n <Text style={styles.metaTitle}>New canvas</Text>\n </View>\n </Pressable>\n );\n }\n const { board, preview } = item;\n const title = !isUnsetBoardTitle(board.title)\n ? board.title\n : board.board.items.find((it) => it.generatedAssetName)?.generatedAssetName || 'Untitled';\n return (\n <Pressable\n onPress={() => onOpen(board.channelId)}\n style={[styles.tile, { width: tileWidth }]}\n accessibilityRole=\"button\"\n >\n <View style={styles.thumb}>\n {preview?.type === 'image' ? (\n <Image source={{ uri: preview.src }} style={styles.thumbImage} contentFit=\"cover\" />\n ) : preview?.type === 'video' ? (\n <View style={styles.thumbVideo}>\n <MaterialCommunityIcons name=\"play\" size={28} color=\"#f8fafc\" />\n </View>\n ) : (\n <MaterialCommunityIcons name=\"image-outline\" size={28} color=\"#94a3b8\" />\n )}\n </View>\n <View style={styles.meta}>\n <Text style={styles.metaTitle} numberOfLines={1}>\n {title}\n </Text>\n <Text style={styles.metaSub}>\n {board.itemCount} item{board.itemCount === 1 ? '' : 's'} · {relativeTime(board.savedAt)}\n </Text>\n </View>\n </Pressable>\n );\n };\n\n return (\n <View style={styles.plane}>\n <DotGrid />\n {boards.length === 0 ? (\n <View style={styles.emptyWrap}>\n {studioStrip}\n <View style={styles.emptyCard}>\n <Text style={styles.emptyTitle}>Your canvases will appear here</Text>\n <Text style={styles.emptyDetail}>\n Every chat gets its own canvas. Generate an image, video, or audio and it lands on this\n board — come back here to reach the ones from your other chats.\n </Text>\n <Pressable onPress={onNewCanvas} style={styles.emptyCta} accessibilityRole=\"button\">\n <MaterialCommunityIcons name=\"plus\" size={16} color=\"#f8fafc\" />\n <Text style={styles.emptyCtaLabel}>New canvas</Text>\n </Pressable>\n </View>\n </View>\n ) : (\n <FlatList\n data={rows}\n keyExtractor={(pair) => pair.map((item) => item.id).join(':')}\n contentContainerStyle={styles.gridList}\n showsVerticalScrollIndicator={false}\n onEndReached={loadMore}\n onEndReachedThreshold={0.4}\n ListHeaderComponent={studioStrip ? <View style={styles.studioInGrid}>{studioStrip}</View> : null}\n renderItem={({ item: pair }) => (\n <View style={styles.row}>\n {pair.map((entry) => (\n <View key={entry.id}>{renderTile(entry)}</View>\n ))}\n {pair.length < 2 ? <View style={{ width: tileWidth }} /> : null}\n </View>\n )}\n />\n )}\n </View>\n );\n}\n\nfunction DotGrid() {\n return (\n <View pointerEvents=\"none\" style={styles.dots}>\n {Array.from({ length: 18 }).map((_, row) => (\n <View key={row} style={styles.dotRow}>\n {Array.from({ length: 16 }).map((__, col) => (\n <View key={col} style={styles.dotCell}>\n <View style={styles.dot} />\n </View>\n ))}\n </View>\n ))}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n plane: { flex: 1, backgroundColor: '#eef1f4', overflow: 'hidden' },\n dots: { ...StyleSheet.absoluteFillObject },\n dotRow: { flexDirection: 'row', height: 22 },\n dotCell: { width: 22, height: 22, alignItems: 'center', justifyContent: 'center' },\n dot: { width: 2, height: 2, borderRadius: 1, backgroundColor: 'rgba(15,23,42,0.14)' },\n emptyWrap: { flex: 1, alignItems: 'center', justifyContent: 'center', padding: 24 },\n emptyCard: {\n width: '100%',\n maxWidth: 420,\n borderRadius: 16,\n borderWidth: 1,\n borderColor: 'rgba(15,23,42,0.08)',\n backgroundColor: 'rgba(255,255,255,0.96)',\n paddingHorizontal: 28,\n paddingVertical: 36,\n alignItems: 'center',\n shadowColor: '#0f172a',\n shadowOpacity: 0.06,\n shadowRadius: 16,\n shadowOffset: { width: 0, height: 8 },\n elevation: 2,\n },\n emptyTitle: { fontSize: 20, fontWeight: '600', color: '#0f172a', textAlign: 'center' },\n emptyDetail: { marginTop: 8, fontSize: 14, lineHeight: 20, color: '#64748b', textAlign: 'center' },\n emptyCta: {\n marginTop: 22,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n backgroundColor: '#0f172a',\n paddingHorizontal: 20,\n paddingVertical: 11,\n borderRadius: 999,\n },\n emptyCtaLabel: { color: '#f8fafc', fontSize: 14, fontWeight: '600' },\n gridList: { padding: GUTTER, paddingBottom: 32 },\n row: { flexDirection: 'row', gap: GUTTER, marginBottom: GUTTER },\n tile: {\n borderRadius: TILE_RADIUS,\n overflow: 'hidden',\n backgroundColor: '#ffffff',\n borderWidth: 1,\n borderColor: 'rgba(15,23,42,0.08)',\n shadowColor: '#0f172a',\n shadowOpacity: 0.05,\n shadowRadius: 8,\n shadowOffset: { width: 0, height: 2 },\n elevation: 1,\n },\n tileDashed: { borderStyle: 'dashed', backgroundColor: 'rgba(255,255,255,0.7)' },\n thumb: {\n height: 140,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#f1f5f9',\n overflow: 'hidden',\n gap: 8,\n },\n thumbImage: { ...StyleSheet.absoluteFillObject },\n thumbVideo: {\n ...StyleSheet.absoluteFillObject,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#0f172a',\n },\n dashHint: { fontSize: 12, color: '#64748b' },\n studioStrip: { alignSelf: 'stretch', marginBottom: 16 },\n composerBlock: { marginBottom: 12, gap: 8 },\n lookChip: {\n width: 112,\n borderRadius: 12,\n overflow: 'hidden',\n backgroundColor: '#ffffff',\n borderWidth: 1,\n borderColor: 'rgba(15,23,42,0.08)',\n },\n lookCover: { width: '100%', height: 72, backgroundColor: '#f1f5f9' },\n lookCoverFallback: { alignItems: 'center', justifyContent: 'center' },\n lookName: {\n paddingHorizontal: 8,\n paddingVertical: 8,\n fontSize: 11,\n fontWeight: '600',\n color: '#0f172a',\n },\n studioInGrid: { width: '100%' },\n studioHead: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n marginBottom: 8,\n },\n studioLabel: {\n fontSize: 11,\n fontWeight: '600',\n letterSpacing: 0.6,\n textTransform: 'uppercase',\n color: '#64748b',\n flexShrink: 1,\n },\n askAgentBtn: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: '#e2e8f0',\n borderRadius: 8,\n paddingHorizontal: 8,\n paddingVertical: 6,\n backgroundColor: '#ffffff',\n flexShrink: 0,\n },\n askAgentLabel: { fontSize: 11, fontWeight: '600', color: '#64748b' },\n studioRow: { flexDirection: 'row', gap: 8, paddingBottom: 4 },\n studioChip: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n backgroundColor: '#ffffff',\n borderWidth: 1,\n borderColor: 'rgba(15,23,42,0.1)',\n borderRadius: 999,\n paddingHorizontal: 14,\n paddingVertical: 9,\n },\n studioChipSaved: { backgroundColor: '#0f172a', borderColor: '#0f172a' },\n studioChipLabel: { fontSize: 13, fontWeight: '600', color: '#0f172a', maxWidth: 140 },\n studioChipLabelSaved: { color: '#f8fafc' },\n meta: {\n borderTopWidth: StyleSheet.hairlineWidth,\n borderTopColor: 'rgba(15,23,42,0.08)',\n paddingHorizontal: 12,\n paddingVertical: 10,\n },\n metaTitle: { fontSize: 14, fontWeight: '600', color: '#0f172a' },\n metaSub: {\n marginTop: 2,\n fontSize: 10,\n fontWeight: '600',\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n color: '#94a3b8',\n },\n});\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CanvasBoardsGrid.js","sources":["../../../src/features/canvas/CanvasBoardsGrid.tsx"],"sourcesContent":["/**\n * Board grid — native twin of canvas-surface screen one (`CreateStrip` + `YourWork`).\n * Create: grouped rows of tools (Generate with AI / Edit & produce / Design & write).\n * Your work: boards and designs merged newest first, with All / Canvases /\n * Designs / Docs chips once more than one kind exists, as a 2-up grid.\n * Renders 10 tiles at a time; scrolling to the bottom appends the next 10.\n */\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { FlatList, Pressable, ScrollView, StyleSheet, Text, useWindowDimensions, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Image } from 'expo-image';\nimport type { CanvasBoardSummary } from './surfaceIndex';\nimport type { DesignDocSummary } from '../design/designIndex';\nimport type { DesignLayer, PersistedDesignDoc } from '../design/designCore';\nimport { isUnsetBoardTitle, type CanvasItem } from './canvasCore';\nimport { CANVAS_BOARD_PAGE_SIZE } from './canvasBoardsCatalog';\nimport type { StudioLook } from './studioLooks';\nimport type { CreateAction, visibleCreateGroups } from './createTiles';\nimport {\n WORK_FILTERS,\n availableFilters,\n boardCover,\n designNoun,\n matchesFilter,\n mergeWork,\n pageCount,\n videoCoverFrame,\n type WorkFilter,\n type WorkItem,\n} from './homeWork';\nimport { resultUrl, type RunMediaAction } from './videoEditor/mediaActions';\nimport { unwrapProxyUrl } from './videoEditor/remoteMediaClient';\n\ntype IconName = React.ComponentProps<typeof MaterialCommunityIcons>['name'];\n\nconst MINUTE = 60_000;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst GUTTER = 16;\nconst TILE_RADIUS = 12;\nconst THUMB_HEIGHT = 140;\n\nfunction relativeTime(ts: number): string {\n const diff = Date.now() - ts;\n if (diff < HOUR) return `${Math.max(1, Math.round(diff / MINUTE))}m ago`;\n if (diff < DAY) return `${Math.round(diff / HOUR)}h ago`;\n if (diff < 30 * DAY) return `${Math.round(diff / DAY)}d ago`;\n return new Date(ts).toLocaleDateString();\n}\n\ntype GridItem = { kind: 'new'; id: string } | { kind: 'work'; id: string; work: WorkItem };\n\nexport function CanvasBoardsGrid({\n boards,\n onOpen,\n onNewCanvas,\n designs = [],\n onOpenDesign,\n onAskAgent,\n createGroups = [],\n onCreate,\n featuredLooks = [],\n onRecreateLook,\n runAction,\n}: {\n boards: CanvasBoardSummary[];\n onOpen: (channelId: string) => void;\n onNewCanvas: () => void;\n designs?: DesignDocSummary[];\n onOpenDesign?: (channelId: string) => void;\n onAskAgent?: () => void;\n /** Screen one's Create rows (web CreateStrip), already narrowed to what this host runs. */\n createGroups?: ReturnType<typeof visibleCreateGroups>;\n onCreate?: (action: CreateAction, tileId: string) => void;\n /** Web Featured Looks rail on home. */\n featuredLooks?: StudioLook[];\n onRecreateLook?: (look: StudioLook) => void;\n /** Connector runner - fetches a real frame for a video-only board's cover. */\n runAction?: RunMediaAction;\n}) {\n const { width } = useWindowDimensions();\n const tileWidth = Math.max(140, (width - GUTTER * 3) / 2);\n const [visible, setVisible] = useState(CANVAS_BOARD_PAGE_SIZE);\n const [filter, setFilter] = useState<WorkFilter>('all');\n\n const work = useMemo(() => mergeWork(boards, designs), [boards, designs]);\n const filters = useMemo(() => availableFilters(work), [work]);\n // A chosen kind that is gone (its last design deleted) falls back to everything.\n const active = filters.includes(filter) ? filter : 'all';\n const shown = useMemo(() => work.filter((item) => matchesFilter(item, active)), [work, active]);\n\n useEffect(() => {\n setVisible(CANVAS_BOARD_PAGE_SIZE);\n }, [boards, designs, active]);\n\n const tiles = useMemo<GridItem[]>(\n () => [\n { kind: 'new', id: '__new__' },\n ...shown\n .slice(0, visible)\n .map((entry) => ({ kind: 'work' as const, id: `${entry.type}:${entry.id}`, work: entry })),\n ],\n [shown, visible],\n );\n\n const rows = useMemo(() => {\n const chunked: GridItem[][] = [];\n for (let i = 0; i < tiles.length; i += 2) {\n chunked.push(tiles.slice(i, i + 2));\n }\n return chunked;\n }, [tiles]);\n\n const loadMore = useCallback(() => {\n setVisible((count) => {\n if (count >= shown.length) return count;\n return Math.min(count + CANVAS_BOARD_PAGE_SIZE, shown.length);\n });\n }, [shown.length]);\n\n const header = (\n <View style={styles.header}>\n {onCreate && createGroups.length > 0 ? (\n <View style={styles.createBlock}>\n <View style={styles.createHead}>\n <View style={styles.flexShrink}>\n <Text style={styles.createTitle}>Create</Text>\n <Text style={styles.createSub}>Generate, edit, or start a blank design.</Text>\n </View>\n {onAskAgent ? (\n <Pressable\n onPress={onAskAgent}\n style={styles.askAgentBtn}\n accessibilityRole=\"button\"\n accessibilityLabel=\"AI Chat\"\n >\n <MaterialCommunityIcons name=\"creation\" size={14} color=\"#64748b\" />\n <Text style={styles.askAgentLabel}>AI Chat</Text>\n </Pressable>\n ) : null}\n </View>\n {createGroups.map((group) => (\n <View key={group.id} style={styles.group}>\n <Text\n style={[\n styles.groupTitle,\n { color: group.accent.fg, borderBottomColor: group.accent.bg },\n ]}\n >\n {group.title}\n </Text>\n <View style={styles.groupTiles}>\n {group.tiles.map((tile) => (\n <Pressable\n key={tile.id}\n onPress={() => onCreate(tile.action, tile.id)}\n style={[styles.createTile, { width: tileWidth }]}\n accessibilityRole=\"button\"\n accessibilityLabel={`${tile.label}: ${tile.hint}`}\n testID={`create-tile-${tile.id}`}\n >\n <View style={[styles.createIcon, { backgroundColor: group.accent.bg }]}>\n <MaterialCommunityIcons\n name={tile.icon as IconName}\n size={18}\n color={group.accent.fg}\n />\n </View>\n <View style={styles.flexShrink}>\n <Text style={styles.createLabel} numberOfLines={1}>\n {tile.label}\n </Text>\n <Text style={styles.createHint} numberOfLines={2}>\n {tile.hint}\n </Text>\n </View>\n </Pressable>\n ))}\n </View>\n </View>\n ))}\n </View>\n ) : null}\n {featuredLooks.length > 0 && onRecreateLook ? (\n <View style={styles.composerBlock}>\n <Text style={styles.studioLabel}>Looks</Text>\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.studioRow}\n >\n {featuredLooks.map((look) => (\n <Pressable\n key={look.id}\n onPress={() => onRecreateLook(look)}\n style={styles.lookChip}\n accessibilityRole=\"button\"\n accessibilityLabel={`Recreate ${look.name}`}\n >\n {look.cover ? (\n <Image source={{ uri: look.cover }} style={styles.lookCover} contentFit=\"cover\" />\n ) : (\n <View style={[styles.lookCover, styles.lookCoverFallback]}>\n <MaterialCommunityIcons name=\"movie-open-outline\" size={18} color=\"#94a3b8\" />\n </View>\n )}\n <Text style={styles.lookName} numberOfLines={2}>\n {look.name}\n </Text>\n </Pressable>\n ))}\n </ScrollView>\n </View>\n ) : null}\n <View style={styles.workHead}>\n <Text style={styles.workTitle}>Your work</Text>\n {filters.length > 0 ? (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.studioRow}\n >\n {WORK_FILTERS.filter((f) => filters.includes(f.id)).map((f) => {\n const on = f.id === active;\n return (\n <Pressable\n key={f.id}\n onPress={() => setFilter(f.id)}\n style={[styles.filterChip, on && styles.filterChipOn]}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: on }}\n >\n <Text style={[styles.filterLabel, on && styles.filterLabelOn]}>{f.label}</Text>\n </Pressable>\n );\n })}\n </ScrollView>\n ) : null}\n </View>\n </View>\n );\n\n const renderTile = (item: GridItem) => {\n if (item.kind === 'new') {\n return (\n <Pressable\n onPress={onNewCanvas}\n style={[styles.tile, styles.tileDashed, { width: tileWidth }]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"New canvas\"\n >\n <View style={styles.thumb}>\n <MaterialCommunityIcons name=\"plus\" size={28} color=\"#64748b\" />\n <Text style={styles.dashHint}>Start a blank canvas</Text>\n </View>\n <View style={styles.meta}>\n <Text style={styles.metaTitle}>New canvas</Text>\n </View>\n </Pressable>\n );\n }\n const { work: entry } = item;\n if (entry.type === 'design') {\n const { design } = entry;\n const noun = designNoun(design.doc);\n const title = design.title?.trim() || `Untitled ${noun.toLowerCase()}`;\n const meta = [noun, pageCount(design.doc), relativeTime(design.savedAt)].filter(Boolean).join(' · ');\n return (\n <Pressable\n onPress={() => onOpenDesign?.(design.channelId)}\n style={[styles.tile, { width: tileWidth }]}\n accessibilityRole=\"button\"\n accessibilityLabel={`Open ${noun.toLowerCase()} ${title}`}\n >\n <View style={styles.thumb}>\n <DesignThumb doc={design.doc} maxWidth={tileWidth - 24} />\n </View>\n <View style={styles.meta}>\n <Text style={styles.metaTitle} numberOfLines={1}>\n {title}\n </Text>\n <Text style={styles.metaSub} numberOfLines={1}>\n {meta}\n </Text>\n </View>\n </Pressable>\n );\n }\n const { board } = entry;\n const cover = boardCover(board.board.items);\n const title = !isUnsetBoardTitle(board.title)\n ? board.title\n : board.board.items.find((it) => it.generatedAssetName)?.generatedAssetName || 'Untitled';\n return (\n <Pressable\n onPress={() => onOpen(board.channelId)}\n style={[styles.tile, { width: tileWidth }]}\n accessibilityRole=\"button\"\n >\n <View style={styles.thumb}>\n {cover ? (\n <BoardCover key={cover.src} item={cover} runAction={runAction} />\n ) : (\n <MaterialCommunityIcons name=\"image-outline\" size={28} color=\"#94a3b8\" />\n )}\n </View>\n <View style={styles.meta}>\n <Text style={styles.metaTitle} numberOfLines={1}>\n {title}\n </Text>\n <Text style={styles.metaSub}>\n Canvas · {board.itemCount} item{board.itemCount === 1 ? '' : 's'} ·{' '}\n {relativeTime(board.savedAt)}\n </Text>\n </View>\n </Pressable>\n );\n };\n\n return (\n <View style={styles.plane}>\n <DotGrid />\n {work.length === 0 ? (\n <ScrollView contentContainerStyle={styles.emptyWrap} showsVerticalScrollIndicator={false}>\n {header}\n <View style={styles.emptyCard}>\n <Text style={styles.emptyTitle}>Your canvases will appear here</Text>\n <Text style={styles.emptyDetail}>\n Every chat gets its own canvas. Generate an image, video, or audio and it lands on this\n board — come back here to reach the ones from your other chats.\n </Text>\n <Pressable onPress={onNewCanvas} style={styles.emptyCta} accessibilityRole=\"button\">\n <MaterialCommunityIcons name=\"plus\" size={16} color=\"#f8fafc\" />\n <Text style={styles.emptyCtaLabel}>New canvas</Text>\n </Pressable>\n </View>\n </ScrollView>\n ) : (\n <FlatList\n data={rows}\n keyExtractor={(pair) => pair.map((item) => item.id).join(':')}\n contentContainerStyle={styles.gridList}\n showsVerticalScrollIndicator={false}\n onEndReached={loadMore}\n onEndReachedThreshold={0.4}\n ListHeaderComponent={header}\n renderItem={({ item: pair }) => (\n <View style={styles.row}>\n {pair.map((entry) => (\n <View key={entry.id}>{renderTile(entry)}</View>\n ))}\n {pair.length < 2 ? <View style={{ width: tileWidth }} /> : null}\n </View>\n )}\n />\n )}\n </View>\n );\n}\n\n/**\n * A board's cover: the image itself, or for a video-only board a real frame\n * fetched once per clip (connector THUMBNAIL, cached in memory). A load or\n * frame failure shows a quiet glyph instead of a dark box.\n */\nfunction BoardCover({ item, runAction }: { item: CanvasItem; runAction?: RunMediaAction }) {\n const [failed, setFailed] = useState(false);\n const [frame, setFrame] = useState<string | null | undefined>(item.type === 'video' ? undefined : item.src);\n\n useEffect(() => {\n if (item.type !== 'video') return undefined;\n if (!runAction) {\n setFrame(null);\n return undefined;\n }\n let live = true;\n void videoCoverFrame(unwrapProxyUrl(item.src), runAction, (result) =>\n resultUrl(result, 'YANTRA_VIDEO_EDIT_THUMBNAIL'),\n ).then((url) => {\n if (live) setFrame(url);\n });\n return () => {\n live = false;\n };\n }, [item.src, item.type, runAction]);\n\n const isVideo = item.type === 'video';\n if (failed || frame === null) {\n return (\n <MaterialCommunityIcons name={isVideo ? 'movie-outline' : 'image-off-outline'} size={28} color=\"#94a3b8\" />\n );\n }\n return (\n <>\n {frame ? (\n <Image\n source={{ uri: frame }}\n style={styles.thumbImage}\n contentFit=\"cover\"\n onError={() => setFailed(true)}\n />\n ) : null}\n {isVideo ? (\n <View style={styles.playBadge} pointerEvents=\"none\">\n <MaterialCommunityIcons name=\"play\" size={18} color=\"#f8fafc\" />\n </View>\n ) : null}\n </>\n );\n}\n\n/** A design's first page, scaled into the tile: fill, shapes, images and text as laid out. */\nfunction DesignThumb({ doc, maxWidth }: { doc: PersistedDesignDoc; maxWidth: number }) {\n const page = doc.pages[0];\n if (!page || !(page.width > 0) || !(page.height > 0)) {\n return <MaterialCommunityIcons name=\"shape-outline\" size={28} color=\"#94a3b8\" />;\n }\n const maxH = THUMB_HEIGHT - 24;\n const scale = Math.min(maxWidth / page.width, maxH / page.height);\n const layers = [...page.layers].sort((a, b) => a.zIndex - b.zIndex);\n return (\n <View\n style={[\n styles.designPage,\n {\n width: page.width * scale,\n height: page.height * scale,\n backgroundColor: page.background || '#ffffff',\n },\n ]}\n pointerEvents=\"none\"\n >\n {layers.map((layer) => (\n <DesignThumbLayer key={layer.id} layer={layer} scale={scale} />\n ))}\n </View>\n );\n}\n\nfunction DesignThumbLayer({ layer, scale }: { layer: DesignLayer; scale: number }) {\n const box = {\n position: 'absolute' as const,\n left: layer.x * scale,\n top: layer.y * scale,\n width: layer.width * scale,\n height: layer.height * scale,\n opacity: layer.opacity,\n };\n if (layer.type === 'image') {\n return <Image source={{ uri: layer.src }} style={box} contentFit=\"cover\" />;\n }\n if (layer.type === 'shape') {\n return <View style={[box, { backgroundColor: layer.fill, borderRadius: layer.cornerRadius * scale }]} />;\n }\n return (\n <Text\n style={[\n box,\n {\n color: layer.color,\n fontSize: Math.max(4, layer.fontSize * scale),\n lineHeight: Math.max(5, layer.fontSize * scale * 1.15),\n fontWeight: layer.bold ? '700' : '400',\n textAlign: layer.align,\n },\n ]}\n numberOfLines={3}\n >\n {layer.text}\n </Text>\n );\n}\n\nfunction DotGrid() {\n return (\n <View pointerEvents=\"none\" style={styles.dots}>\n {Array.from({ length: 18 }).map((_, row) => (\n <View key={row} style={styles.dotRow}>\n {Array.from({ length: 16 }).map((__, col) => (\n <View key={col} style={styles.dotCell}>\n <View style={styles.dot} />\n </View>\n ))}\n </View>\n ))}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n plane: { flex: 1, backgroundColor: '#eef1f4', overflow: 'hidden' },\n dots: { ...StyleSheet.absoluteFillObject },\n dotRow: { flexDirection: 'row', height: 22 },\n dotCell: { width: 22, height: 22, alignItems: 'center', justifyContent: 'center' },\n dot: { width: 2, height: 2, borderRadius: 1, backgroundColor: 'rgba(15,23,42,0.14)' },\n emptyWrap: { flexGrow: 1, alignItems: 'center', padding: GUTTER, paddingBottom: 32 },\n emptyCard: {\n width: '100%',\n maxWidth: 420,\n borderRadius: 16,\n borderWidth: 1,\n borderColor: 'rgba(15,23,42,0.08)',\n backgroundColor: 'rgba(255,255,255,0.96)',\n paddingHorizontal: 28,\n paddingVertical: 36,\n alignItems: 'center',\n shadowColor: '#0f172a',\n shadowOpacity: 0.06,\n shadowRadius: 16,\n shadowOffset: { width: 0, height: 8 },\n elevation: 2,\n },\n emptyTitle: { fontSize: 20, fontWeight: '600', color: '#0f172a', textAlign: 'center' },\n emptyDetail: { marginTop: 8, fontSize: 14, lineHeight: 20, color: '#64748b', textAlign: 'center' },\n emptyCta: {\n marginTop: 22,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n backgroundColor: '#0f172a',\n paddingHorizontal: 20,\n paddingVertical: 11,\n borderRadius: 999,\n },\n emptyCtaLabel: { color: '#f8fafc', fontSize: 14, fontWeight: '600' },\n gridList: { padding: GUTTER, paddingBottom: 32 },\n row: { flexDirection: 'row', gap: GUTTER, marginBottom: GUTTER },\n tile: {\n borderRadius: TILE_RADIUS,\n overflow: 'hidden',\n backgroundColor: '#ffffff',\n borderWidth: 1,\n borderColor: 'rgba(15,23,42,0.08)',\n shadowColor: '#0f172a',\n shadowOpacity: 0.05,\n shadowRadius: 8,\n shadowOffset: { width: 0, height: 2 },\n elevation: 1,\n },\n tileDashed: { borderStyle: 'dashed', backgroundColor: 'rgba(255,255,255,0.7)' },\n thumb: {\n height: THUMB_HEIGHT,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#f1f5f9',\n overflow: 'hidden',\n gap: 8,\n },\n thumbImage: { ...StyleSheet.absoluteFillObject },\n playBadge: {\n position: 'absolute',\n right: 8,\n bottom: 8,\n width: 28,\n height: 28,\n borderRadius: 14,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(15,23,42,0.55)',\n },\n designPage: {\n overflow: 'hidden',\n borderRadius: 2,\n shadowColor: '#0f172a',\n shadowOpacity: 0.12,\n shadowRadius: 4,\n shadowOffset: { width: 0, height: 1 },\n elevation: 1,\n },\n dashHint: { fontSize: 12, color: '#64748b' },\n header: { alignSelf: 'stretch', width: '100%', marginBottom: 4 },\n createBlock: { marginBottom: 16 },\n createHead: {\n flexDirection: 'row',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 12,\n marginBottom: 12,\n },\n createTitle: { fontSize: 22, fontWeight: '600', color: '#0f172a' },\n createSub: { marginTop: 2, fontSize: 13, color: '#64748b' },\n flexShrink: { flexShrink: 1 },\n group: { marginBottom: 14 },\n groupTitle: {\n fontSize: 16,\n fontWeight: '600',\n paddingBottom: 6,\n marginBottom: 8,\n borderBottomWidth: 1,\n },\n groupTiles: { flexDirection: 'row', flexWrap: 'wrap', columnGap: GUTTER, rowGap: 4 },\n createTile: {\n flexDirection: 'row',\n alignItems: 'flex-start',\n gap: 10,\n minHeight: 48,\n paddingVertical: 6,\n },\n createIcon: { width: 36, height: 36, borderRadius: 10, alignItems: 'center', justifyContent: 'center' },\n createLabel: { fontSize: 14, fontWeight: '600', color: '#0f172a' },\n createHint: { marginTop: 1, fontSize: 11, lineHeight: 14, color: '#64748b' },\n composerBlock: { marginBottom: 16, gap: 8 },\n lookChip: {\n width: 112,\n borderRadius: 12,\n overflow: 'hidden',\n backgroundColor: '#ffffff',\n borderWidth: 1,\n borderColor: 'rgba(15,23,42,0.08)',\n },\n lookCover: { width: '100%', height: 72, backgroundColor: '#f1f5f9' },\n lookCoverFallback: { alignItems: 'center', justifyContent: 'center' },\n lookName: {\n paddingHorizontal: 8,\n paddingVertical: 8,\n fontSize: 11,\n fontWeight: '600',\n color: '#0f172a',\n },\n workHead: { gap: 8, marginBottom: 12 },\n workTitle: { fontSize: 18, fontWeight: '600', color: '#0f172a' },\n filterChip: {\n backgroundColor: '#ffffff',\n borderWidth: 1,\n borderColor: 'rgba(15,23,42,0.1)',\n borderRadius: 999,\n paddingHorizontal: 14,\n paddingVertical: 7,\n },\n filterChipOn: { backgroundColor: '#0f172a', borderColor: '#0f172a' },\n filterLabel: { fontSize: 13, fontWeight: '600', color: '#0f172a' },\n filterLabelOn: { color: '#f8fafc' },\n studioLabel: {\n fontSize: 11,\n fontWeight: '600',\n letterSpacing: 0.6,\n textTransform: 'uppercase',\n color: '#64748b',\n flexShrink: 1,\n },\n askAgentBtn: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: '#e2e8f0',\n borderRadius: 8,\n paddingHorizontal: 8,\n paddingVertical: 6,\n backgroundColor: '#ffffff',\n flexShrink: 0,\n },\n askAgentLabel: { fontSize: 11, fontWeight: '600', color: '#64748b' },\n studioRow: { flexDirection: 'row', gap: 8, paddingBottom: 4 },\n meta: {\n borderTopWidth: StyleSheet.hairlineWidth,\n borderTopColor: 'rgba(15,23,42,0.08)',\n paddingHorizontal: 12,\n paddingVertical: 10,\n },\n metaTitle: { fontSize: 14, fontWeight: '600', color: '#0f172a' },\n metaSub: {\n marginTop: 2,\n fontSize: 10,\n fontWeight: '600',\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n color: '#94a3b8',\n },\n});\n"],"names":["title"],"mappings":"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"}
@@ -1,25 +1,50 @@
1
- import {jsx,jsxs}from'react/jsx-runtime';import {useMemo,useState}from'react';import {StyleSheet,Text,View,ScrollView,Pressable,TextInput,ActivityIndicator,Image}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {friendlyMediaError}from'./videoEditor/mediaActions.js';import {REFRAME_RATIOS,UPSCALE_TARGETS,reframePlan,runReframe,runRemoveBackground,upscalePlan,runUpscale,runMatchLook,runLipSync,runExtendVideo}from'./canvasEditOps.js';import {editToolsForItem,EDIT_TOOL_META}from'./editTools.js';function CanvasEditToolsPanel({
1
+ import {jsx,jsxs}from'react/jsx-runtime';import {useMemo,useState}from'react';import {StyleSheet,Text,View,ScrollView,Pressable,TextInput,ActivityIndicator,Image}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {friendlyMediaError}from'./videoEditor/mediaActions.js';import {removeBackgroundDefaults,KEY_COLOR_CHOICES,normalizeHex,UPSCALE_TARGETS,runReframeChoice,runRemoveBackground,upscalePlan,runUpscale,runMatchLook,runTrackedLipSync,runExtendVideo}from'./canvasEditOps.js';import {editToolsForItem,EDIT_TOOL_META}from'./editTools.js';import {REFRAME_FORMATS,REFRAME_BARS,stillReframeNote,formatName,describeReframe}from'./reframe.js';const FOCUS_STOPS = [0, 0.5, 1];
2
+ const SIMILARITY_STEPS = [0.05, 0.1, 0.12, 0.2, 0.3];
3
+ const BLEND_STEPS = [0, 0.04, 0.08, 0.15, 0.25];
4
+ const pct = (v) => `${Math.round(v * 100)}%`;
5
+ function CanvasEditToolsPanel({
2
6
  item,
3
7
  runAction,
4
8
  videoToVideo = true,
5
9
  onReplaced,
6
- onEditVideo
10
+ onEditVideo,
11
+ initialTool = null,
12
+ onToolChange,
13
+ showTitle = true
7
14
  }) {
15
+ var _a, _b;
8
16
  const kind = item.type === "video" ? "video" : item.type === "image" ? "image" : null;
9
17
  const tools = useMemo(() => kind ? editToolsForItem(kind, {
10
18
  videoToVideo
11
19
  }) : [], [kind, videoToVideo]);
12
- const [tool, setTool] = useState(null);
20
+ const [tool, setToolState] = useState(() => initialTool && tools.includes(initialTool) ? initialTool : null);
21
+ const setTool = (next) => {
22
+ setToolState(next);
23
+ onToolChange == null ? void 0 : onToolChange(next);
24
+ };
13
25
  const [busy, setBusy] = useState(false);
14
26
  const [notice, setNotice] = useState(null);
15
- const [ratio, setRatio] = useState("9:16");
27
+ const [receipt, setReceipt] = useState(null);
28
+ const [formatId, setFormatId] = useState(REFRAME_FORMATS[0].id);
16
29
  const [fit, setFit] = useState("crop");
30
+ const [bars, setBars] = useState("match");
31
+ const [focus, setFocus] = useState(0.5);
32
+ const [keyChoice, setKeyChoice] = useState(kind === "video" ? "green" : "auto");
33
+ const [customHex, setCustomHex] = useState("");
34
+ const [similarity, setSimilarity] = useState(removeBackgroundDefaults(kind === "video" ? "video" : "image").similarity);
35
+ const [blend, setBlend] = useState(removeBackgroundDefaults(kind === "video" ? "video" : "image").blend);
17
36
  const [upscaleTarget, setUpscaleTarget] = useState("1080p");
18
37
  const [lipText, setLipText] = useState("");
19
38
  const [extendPrompt, setExtendPrompt] = useState("");
20
39
  if (!kind || tools.length === 0) {
21
40
  return /* @__PURE__ */ jsx(Text, { style: styles.hint, children: "Select an image or video on the board to edit." });
22
41
  }
42
+ const reframeFormat = (_a = REFRAME_FORMATS.find((f) => f.id === formatId)) != null ? _a : REFRAME_FORMATS[0];
43
+ const fits = kind === "video" ? ["crop", "fit", "stack"] : ["crop", "fit"];
44
+ const pendingStillNote = kind === "image" ? stillReframeNote({
45
+ fit,
46
+ bars
47
+ }) : null;
23
48
  const measure = () => new Promise((resolve, reject) => {
24
49
  if (kind === "image") {
25
50
  Image.getSize(item.src, (width, height) => resolve({
@@ -41,15 +66,29 @@ import {jsx,jsxs}from'react/jsx-runtime';import {useMemo,useState}from'react';im
41
66
  }
42
67
  setBusy(true);
43
68
  setNotice(null);
69
+ setReceipt(null);
44
70
  try {
45
71
  let url = "";
72
+ let note = null;
46
73
  if (tool === "reframe") {
47
74
  const dims = await measure();
48
- const plan = reframePlan(dims, ratio, fit);
49
- if (!plan) throw new Error("Could not plan that reframe");
50
- url = await runReframe(runAction, kind, item.src, plan);
75
+ const choice = {
76
+ format: reframeFormat,
77
+ fit,
78
+ bars,
79
+ focus
80
+ };
81
+ const out = await runReframeChoice(runAction, kind, item.src, choice, dims);
82
+ url = out.url;
83
+ note = out.note ? `${formatName(reframeFormat)}: ${out.note}` : `${formatName(reframeFormat)}: ${describeReframe(choice, dims)}.`;
51
84
  } else if (tool === "remove-background") {
52
- url = await runRemoveBackground(runAction, kind, item.src);
85
+ if (keyChoice === "custom" && !normalizeHex(customHex)) throw new Error("Type a hex colour like #00ff00");
86
+ url = await runRemoveBackground(runAction, kind, item.src, {
87
+ key: keyChoice,
88
+ customHex,
89
+ similarity,
90
+ blend
91
+ });
53
92
  } else if (tool === "upscale") {
54
93
  const dims = await measure();
55
94
  const out = upscalePlan(dims, upscaleTarget);
@@ -59,13 +98,14 @@ import {jsx,jsxs}from'react/jsx-runtime';import {useMemo,useState}from'react';im
59
98
  url = await runMatchLook(runAction, kind, item.src);
60
99
  } else if (tool === "lip-sync") {
61
100
  if (!lipText.trim()) throw new Error("Type a line for the mouth to follow");
62
- url = await runLipSync(runAction, item.src, {
101
+ url = await runTrackedLipSync(runAction, item.src, {
63
102
  text: lipText
64
103
  });
65
104
  } else if (tool === "extend-video") {
66
105
  url = await runExtendVideo(runAction, item.src, extendPrompt);
67
106
  }
68
107
  if (url) onReplaced(url);
108
+ setReceipt(note);
69
109
  setTool(null);
70
110
  } catch (err) {
71
111
  setNotice(friendlyMediaError(err, "edit"));
@@ -74,7 +114,7 @@ import {jsx,jsxs}from'react/jsx-runtime';import {useMemo,useState}from'react';im
74
114
  }
75
115
  };
76
116
  return /* @__PURE__ */ jsxs(View, { style: styles.root, children: [
77
- /* @__PURE__ */ jsx(Text, { style: styles.title, children: "Edit selected" }),
117
+ showTitle ? /* @__PURE__ */ jsx(Text, { style: styles.title, children: "Edit selected" }) : null,
78
118
  /* @__PURE__ */ jsx(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, contentContainerStyle: styles.chips, children: tools.map((id) => {
79
119
  const meta = EDIT_TOOL_META[id];
80
120
  const on = tool === id;
@@ -85,13 +125,46 @@ import {jsx,jsxs}from'react/jsx-runtime';import {useMemo,useState}from'react';im
85
125
  }) }),
86
126
  tool ? /* @__PURE__ */ jsx(Text, { style: styles.blurb, children: EDIT_TOOL_META[tool].blurb }) : null,
87
127
  tool === "reframe" ? /* @__PURE__ */ jsxs(View, { style: styles.opts, children: [
88
- /* @__PURE__ */ jsx(View, { style: styles.chips, children: REFRAME_RATIOS.map((r) => /* @__PURE__ */ jsx(Pressable, { onPress: () => setRatio(r), style: [styles.chip, ratio === r && styles.chipOn], children: /* @__PURE__ */ jsx(Text, { style: styles.chipLabel, children: r }) }, r)) }),
89
- /* @__PURE__ */ jsx(View, { style: styles.chips, children: ["crop", "fit"].map((f) => /* @__PURE__ */ jsx(Pressable, { onPress: () => setFit(f), style: [styles.chip, fit === f && styles.chipOn], children: /* @__PURE__ */ jsx(Text, { style: styles.chipLabel, children: f === "crop" ? "Crop" : "Fit" }) }, f)) })
128
+ /* @__PURE__ */ jsx(View, { style: styles.chips, children: REFRAME_FORMATS.map((f) => /* @__PURE__ */ jsx(Pressable, { onPress: () => setFormatId(f.id), style: [styles.chip, formatId === f.id && styles.chipOn], accessibilityLabel: `${f.label}, ${f.uses}`, children: /* @__PURE__ */ jsx(Text, { style: styles.chipLabel, children: f.size ? f.label : `${f.label} ${f.ratio}` }) }, f.id)) }),
129
+ /* @__PURE__ */ jsxs(Text, { style: styles.blurb, children: [
130
+ reframeFormat.uses,
131
+ reframeFormat.size ? ` \xB7 ${reframeFormat.size.width}x${reframeFormat.size.height}` : ""
132
+ ] }),
133
+ /* @__PURE__ */ jsx(View, { style: styles.chips, children: fits.map((f) => /* @__PURE__ */ jsx(Pressable, { onPress: () => setFit(f), style: [styles.chip, fit === f && styles.chipOn], children: /* @__PURE__ */ jsx(Text, { style: styles.chipLabel, children: f === "crop" ? "Crop" : f === "fit" ? "Fit" : "Stack" }) }, f)) }),
134
+ fit === "fit" ? /* @__PURE__ */ jsx(View, { style: styles.chips, children: REFRAME_BARS.map((b) => /* @__PURE__ */ jsx(Pressable, { onPress: () => setBars(b.id), style: [styles.chip, bars === b.id && styles.chipOn], accessibilityHint: b.title, children: /* @__PURE__ */ jsx(Text, { style: styles.chipLabel, children: b.label }) }, b.id)) }) : null,
135
+ fit === "crop" ? /* @__PURE__ */ jsx(View, { style: styles.chips, children: FOCUS_STOPS.map((f) => /* @__PURE__ */ jsx(Pressable, { onPress: () => setFocus(f), style: [styles.chip, focus === f && styles.chipOn], children: /* @__PURE__ */ jsx(Text, { style: styles.chipLabel, children: f === 0 ? "Start" : f === 1 ? "End" : "Centre" }) }, f)) }) : null,
136
+ pendingStillNote ? /* @__PURE__ */ jsx(Text, { style: styles.blurb, children: pendingStillNote }) : null
137
+ ] }) : null,
138
+ tool === "remove-background" ? /* @__PURE__ */ jsxs(View, { style: styles.opts, children: [
139
+ /* @__PURE__ */ jsx(View, { style: styles.chips, children: KEY_COLOR_CHOICES.filter((c) => kind === "image" || c.id !== "auto").map((c) => /* @__PURE__ */ jsxs(Pressable, { onPress: () => setKeyChoice(c.id), style: [styles.chip, keyChoice === c.id && styles.chipOn], children: [
140
+ c.hex ? /* @__PURE__ */ jsx(View, { style: [styles.swatch, {
141
+ backgroundColor: c.hex
142
+ }] }) : null,
143
+ /* @__PURE__ */ jsx(Text, { style: styles.chipLabel, children: c.label })
144
+ ] }, c.id)) }),
145
+ keyChoice === "custom" ? /* @__PURE__ */ jsxs(View, { style: styles.hexRow, children: [
146
+ /* @__PURE__ */ jsx(View, { style: [styles.swatch, styles.swatchLg, {
147
+ backgroundColor: (_b = normalizeHex(customHex)) != null ? _b : "#ffffff"
148
+ }] }),
149
+ /* @__PURE__ */ jsx(TextInput, { value: customHex, onChangeText: setCustomHex, placeholder: "#00ff00", placeholderTextColor: "#94a3b8", autoCapitalize: "none", autoCorrect: false, style: [styles.field, styles.hexField] })
150
+ ] }) : null,
151
+ /* @__PURE__ */ jsxs(Text, { style: styles.blurb, children: [
152
+ "Tolerance \xB7 ",
153
+ pct(similarity)
154
+ ] }),
155
+ /* @__PURE__ */ jsx(View, { style: styles.chips, children: SIMILARITY_STEPS.map((v) => /* @__PURE__ */ jsx(Pressable, { onPress: () => setSimilarity(v), style: [styles.chip, similarity === v && styles.chipOn], children: /* @__PURE__ */ jsx(Text, { style: styles.chipLabel, children: pct(v) }) }, v)) }),
156
+ /* @__PURE__ */ jsxs(Text, { style: styles.blurb, children: [
157
+ "Edge softness \xB7 ",
158
+ pct(blend)
159
+ ] }),
160
+ /* @__PURE__ */ jsx(View, { style: styles.chips, children: BLEND_STEPS.map((v) => /* @__PURE__ */ jsx(Pressable, { onPress: () => setBlend(v), style: [styles.chip, blend === v && styles.chipOn], children: /* @__PURE__ */ jsx(Text, { style: styles.chipLabel, children: pct(v) }) }, v)) }),
161
+ /* @__PURE__ */ jsx(Text, { style: styles.blurb, children: kind === "image" ? "The result is a PNG with transparency where the background was." : "MP4 carries no transparency, so the keyed area turns black." })
90
162
  ] }) : null,
91
163
  tool === "upscale" ? /* @__PURE__ */ jsx(View, { style: styles.chips, children: UPSCALE_TARGETS.map((t) => /* @__PURE__ */ jsx(Pressable, { onPress: () => setUpscaleTarget(t.id), style: [styles.chip, upscaleTarget === t.id && styles.chipOn], children: /* @__PURE__ */ jsx(Text, { style: styles.chipLabel, children: t.label }) }, t.id)) }) : null,
92
164
  tool === "lip-sync" ? /* @__PURE__ */ jsx(TextInput, { value: lipText, onChangeText: setLipText, placeholder: "Line to speak\u2026", placeholderTextColor: "#94a3b8", style: styles.field }) : null,
93
165
  tool === "extend-video" ? /* @__PURE__ */ jsx(TextInput, { value: extendPrompt, onChangeText: setExtendPrompt, placeholder: "What should happen next? (optional)", placeholderTextColor: "#94a3b8", style: styles.field }) : null,
94
166
  notice ? /* @__PURE__ */ jsx(Text, { style: styles.notice, children: notice }) : null,
167
+ receipt ? /* @__PURE__ */ jsx(Text, { style: styles.blurb, children: receipt }) : null,
95
168
  tool ? /* @__PURE__ */ jsx(Pressable, { onPress: () => void run(), disabled: busy || !runAction, style: [styles.cta, (busy || !runAction) && styles.ctaOff], children: busy ? /* @__PURE__ */ jsx(ActivityIndicator, { color: "#fff7ed" }) : /* @__PURE__ */ jsx(Text, { style: styles.ctaLabel, children: tool === "edit-video" ? "Open editor" : "Apply" }) }) : null
96
169
  ] });
97
170
  }
@@ -161,6 +234,26 @@ const styles = StyleSheet.create({
161
234
  fontSize: 12,
162
235
  color: "#b91c1c"
163
236
  },
237
+ swatch: {
238
+ width: 12,
239
+ height: 12,
240
+ borderRadius: 3,
241
+ borderWidth: StyleSheet.hairlineWidth,
242
+ borderColor: "#cbd5e1"
243
+ },
244
+ swatchLg: {
245
+ width: 32,
246
+ height: 32,
247
+ borderRadius: 8
248
+ },
249
+ hexRow: {
250
+ flexDirection: "row",
251
+ alignItems: "center",
252
+ gap: 8
253
+ },
254
+ hexField: {
255
+ flex: 1
256
+ },
164
257
  cta: {
165
258
  alignSelf: "flex-start",
166
259
  paddingHorizontal: 16,
@@ -1 +1 @@
1
- {"version":3,"file":"CanvasEditToolsPanel.js","sources":["../../../src/features/canvas/CanvasEditToolsPanel.tsx"],"sourcesContent":["/**\n * Edit tools sheet — native twin of canvas-surface EditToolPanel.\n * Runs on the selected board item and writes the result back in place.\n */\nimport React, { useMemo, useState } from 'react';\nimport {\n ActivityIndicator,\n Image as RNImage,\n Pressable,\n ScrollView,\n StyleSheet,\n Text,\n TextInput,\n View,\n} from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport type { CanvasItem } from './canvasCore';\nimport { friendlyMediaError, type RunMediaAction } from './videoEditor/mediaActions';\nimport {\n REFRAME_RATIOS,\n runExtendVideo,\n runLipSync,\n runMatchLook,\n runReframe,\n runRemoveBackground,\n runUpscale,\n reframePlan,\n upscalePlan,\n UPSCALE_TARGETS,\n type Dims,\n type ReframeFit,\n type UpscaleTarget,\n} from './canvasEditOps';\nimport { EDIT_TOOL_META, editToolsForItem, type EditTool } from './editTools';\n\nexport function CanvasEditToolsPanel({\n item,\n runAction,\n videoToVideo = true,\n onReplaced,\n onEditVideo,\n}: {\n item: CanvasItem;\n runAction?: RunMediaAction;\n videoToVideo?: boolean;\n onReplaced: (url: string) => void;\n onEditVideo?: () => void;\n}) {\n const kind = item.type === 'video' ? 'video' : item.type === 'image' ? 'image' : null;\n const tools = useMemo(() => (kind ? editToolsForItem(kind, { videoToVideo }) : []), [kind, videoToVideo]);\n const [tool, setTool] = useState<EditTool | null>(null);\n const [busy, setBusy] = useState(false);\n const [notice, setNotice] = useState<string | null>(null);\n const [ratio, setRatio] = useState<(typeof REFRAME_RATIOS)[number]>('9:16');\n const [fit, setFit] = useState<ReframeFit>('crop');\n const [upscaleTarget, setUpscaleTarget] = useState<UpscaleTarget>('1080p');\n const [lipText, setLipText] = useState('');\n const [extendPrompt, setExtendPrompt] = useState('');\n\n if (!kind || tools.length === 0) {\n return <Text style={styles.hint}>Select an image or video on the board to edit.</Text>;\n }\n\n const measure = (): Promise<Dims> =>\n new Promise((resolve, reject) => {\n if (kind === 'image') {\n RNImage.getSize(\n item.src,\n (width, height) => resolve({ width, height }),\n () => reject(new Error('Could not read image size')),\n );\n return;\n }\n // Video: assume 16:9 HD when we cannot probe on device.\n resolve({ width: 1920, height: 1080 });\n });\n\n const run = async () => {\n if (!runAction || !tool || busy) return;\n if (tool === 'edit-video') {\n onEditVideo?.();\n return;\n }\n setBusy(true);\n setNotice(null);\n try {\n let url = '';\n if (tool === 'reframe') {\n const dims = await measure();\n const plan = reframePlan(dims, ratio, fit);\n if (!plan) throw new Error('Could not plan that reframe');\n url = await runReframe(runAction, kind, item.src, plan);\n } else if (tool === 'remove-background') {\n url = await runRemoveBackground(runAction, kind, item.src);\n } else if (tool === 'upscale') {\n const dims = await measure();\n const out = upscalePlan(dims, upscaleTarget);\n if (!out) throw new Error('Already at or above that size');\n url = await runUpscale(runAction, kind, item.src, out);\n } else if (tool === 'match-look') {\n url = await runMatchLook(runAction, kind, item.src);\n } else if (tool === 'lip-sync') {\n if (!lipText.trim()) throw new Error('Type a line for the mouth to follow');\n url = await runLipSync(runAction, item.src, { text: lipText });\n } else if (tool === 'extend-video') {\n url = await runExtendVideo(runAction, item.src, extendPrompt);\n }\n if (url) onReplaced(url);\n setTool(null);\n } catch (err: unknown) {\n setNotice(friendlyMediaError(err, 'edit'));\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <View style={styles.root}>\n <Text style={styles.title}>Edit selected</Text>\n <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.chips}>\n {tools.map((id) => {\n const meta = EDIT_TOOL_META[id];\n const on = tool === id;\n return (\n <Pressable\n key={id}\n onPress={() => setTool(on ? null : id)}\n style={[styles.chip, on && styles.chipOn]}\n >\n <MaterialCommunityIcons\n name={meta.icon as React.ComponentProps<typeof MaterialCommunityIcons>['name']}\n size={14}\n color={on ? '#9a3412' : '#64748b'}\n />\n <Text style={[styles.chipLabel, on && styles.chipLabelOn]}>{meta.label}</Text>\n </Pressable>\n );\n })}\n </ScrollView>\n {tool ? <Text style={styles.blurb}>{EDIT_TOOL_META[tool].blurb}</Text> : null}\n\n {tool === 'reframe' ? (\n <View style={styles.opts}>\n <View style={styles.chips}>\n {REFRAME_RATIOS.map((r) => (\n <Pressable\n key={r}\n onPress={() => setRatio(r)}\n style={[styles.chip, ratio === r && styles.chipOn]}\n >\n <Text style={styles.chipLabel}>{r}</Text>\n </Pressable>\n ))}\n </View>\n <View style={styles.chips}>\n {(['crop', 'fit'] as const).map((f) => (\n <Pressable\n key={f}\n onPress={() => setFit(f)}\n style={[styles.chip, fit === f && styles.chipOn]}\n >\n <Text style={styles.chipLabel}>{f === 'crop' ? 'Crop' : 'Fit'}</Text>\n </Pressable>\n ))}\n </View>\n </View>\n ) : null}\n\n {tool === 'upscale' ? (\n <View style={styles.chips}>\n {UPSCALE_TARGETS.map((t) => (\n <Pressable\n key={t.id}\n onPress={() => setUpscaleTarget(t.id)}\n style={[styles.chip, upscaleTarget === t.id && styles.chipOn]}\n >\n <Text style={styles.chipLabel}>{t.label}</Text>\n </Pressable>\n ))}\n </View>\n ) : null}\n\n {tool === 'lip-sync' ? (\n <TextInput\n value={lipText}\n onChangeText={setLipText}\n placeholder=\"Line to speak…\"\n placeholderTextColor=\"#94a3b8\"\n style={styles.field}\n />\n ) : null}\n\n {tool === 'extend-video' ? (\n <TextInput\n value={extendPrompt}\n onChangeText={setExtendPrompt}\n placeholder=\"What should happen next? (optional)\"\n placeholderTextColor=\"#94a3b8\"\n style={styles.field}\n />\n ) : null}\n\n {notice ? <Text style={styles.notice}>{notice}</Text> : null}\n\n {tool ? (\n <Pressable\n onPress={() => void run()}\n disabled={busy || !runAction}\n style={[styles.cta, (busy || !runAction) && styles.ctaOff]}\n >\n {busy ? (\n <ActivityIndicator color=\"#fff7ed\" />\n ) : (\n <Text style={styles.ctaLabel}>{tool === 'edit-video' ? 'Open editor' : 'Apply'}</Text>\n )}\n </Pressable>\n ) : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n root: { paddingHorizontal: 16, paddingBottom: 12, gap: 10 },\n title: { fontSize: 13, fontWeight: '700', color: '#0f172a' },\n hint: { padding: 16, fontSize: 13, color: '#64748b' },\n chips: { flexDirection: 'row', flexWrap: 'wrap', gap: 8 },\n chip: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n paddingHorizontal: 10,\n paddingVertical: 7,\n borderRadius: 999,\n borderWidth: 1,\n borderColor: '#e2e8f0',\n backgroundColor: '#fff',\n },\n chipOn: { backgroundColor: '#fde8d8', borderColor: '#fde8d8' },\n chipLabel: { fontSize: 12, fontWeight: '600', color: '#334155' },\n chipLabelOn: { color: '#9a3412' },\n blurb: { fontSize: 12, color: '#64748b', lineHeight: 16 },\n opts: { gap: 8 },\n field: {\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: '#e2e8f0',\n borderRadius: 10,\n paddingHorizontal: 12,\n paddingVertical: 10,\n fontSize: 13,\n color: '#0f172a',\n backgroundColor: '#fff',\n },\n notice: { fontSize: 12, color: '#b91c1c' },\n cta: {\n alignSelf: 'flex-start',\n paddingHorizontal: 16,\n paddingVertical: 10,\n borderRadius: 12,\n backgroundColor: '#ea580c',\n },\n ctaOff: { opacity: 0.45 },\n ctaLabel: { color: '#fff7ed', fontSize: 13, fontWeight: '700' },\n});\n"],"names":["RNImage"],"mappings":"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"}
1
+ {"version":3,"file":"CanvasEditToolsPanel.js","sources":["../../../src/features/canvas/CanvasEditToolsPanel.tsx"],"sourcesContent":["/**\n * Edit tools sheet — native twin of canvas-surface EditToolPanel.\n * Runs on the selected board item and writes the result back in place.\n */\nimport React, { useMemo, useState } from 'react';\nimport {\n ActivityIndicator,\n Image as RNImage,\n Pressable,\n ScrollView,\n StyleSheet,\n Text,\n TextInput,\n View,\n} from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport type { CanvasItem } from './canvasCore';\nimport { friendlyMediaError, type RunMediaAction } from './videoEditor/mediaActions';\nimport {\n KEY_COLOR_CHOICES,\n normalizeHex,\n removeBackgroundDefaults,\n runExtendVideo,\n runTrackedLipSync,\n runMatchLook,\n runReframeChoice,\n runRemoveBackground,\n runUpscale,\n upscalePlan,\n UPSCALE_TARGETS,\n type Dims,\n type KeyColorChoice,\n type UpscaleTarget,\n} from './canvasEditOps';\nimport { EDIT_TOOL_META, editToolsForItem, type EditTool } from './editTools';\nimport {\n REFRAME_BARS,\n REFRAME_FORMATS,\n describeReframe,\n formatName,\n stillReframeNote,\n type ReframeBars,\n type ReframeFit,\n} from './reframe';\n\nconst FOCUS_STOPS = [0, 0.5, 1] as const;\nconst SIMILARITY_STEPS = [0.05, 0.1, 0.12, 0.2, 0.3] as const;\nconst BLEND_STEPS = [0, 0.04, 0.08, 0.15, 0.25] as const;\nconst pct = (v: number) => `${Math.round(v * 100)}%`;\n\nexport function CanvasEditToolsPanel({\n item,\n runAction,\n videoToVideo = true,\n onReplaced,\n onEditVideo,\n initialTool = null,\n onToolChange,\n showTitle = true,\n}: {\n item: CanvasItem;\n runAction?: RunMediaAction;\n videoToVideo?: boolean;\n onReplaced: (url: string) => void;\n onEditVideo?: () => void;\n /** The tool to open on (the dock remembers the last one, like web `lastEditTool`). */\n initialTool?: EditTool | null;\n onToolChange?: (tool: EditTool | null) => void;\n showTitle?: boolean;\n}) {\n const kind = item.type === 'video' ? 'video' : item.type === 'image' ? 'image' : null;\n const tools = useMemo(() => (kind ? editToolsForItem(kind, { videoToVideo }) : []), [kind, videoToVideo]);\n const [tool, setToolState] = useState<EditTool | null>(() =>\n initialTool && tools.includes(initialTool) ? initialTool : null,\n );\n const setTool = (next: EditTool | null) => {\n setToolState(next);\n onToolChange?.(next);\n };\n const [busy, setBusy] = useState(false);\n const [notice, setNotice] = useState<string | null>(null);\n const [receipt, setReceipt] = useState<string | null>(null);\n const [formatId, setFormatId] = useState(REFRAME_FORMATS[0].id);\n const [fit, setFit] = useState<ReframeFit>('crop');\n const [bars, setBars] = useState<ReframeBars>('match');\n const [focus, setFocus] = useState(0.5);\n const [keyChoice, setKeyChoice] = useState<KeyColorChoice>(kind === 'video' ? 'green' : 'auto');\n const [customHex, setCustomHex] = useState('');\n const [similarity, setSimilarity] = useState(\n removeBackgroundDefaults(kind === 'video' ? 'video' : 'image').similarity,\n );\n const [blend, setBlend] = useState(removeBackgroundDefaults(kind === 'video' ? 'video' : 'image').blend);\n const [upscaleTarget, setUpscaleTarget] = useState<UpscaleTarget>('1080p');\n const [lipText, setLipText] = useState('');\n const [extendPrompt, setExtendPrompt] = useState('');\n\n if (!kind || tools.length === 0) {\n return <Text style={styles.hint}>Select an image or video on the board to edit.</Text>;\n }\n const reframeFormat = REFRAME_FORMATS.find((f) => f.id === formatId) ?? REFRAME_FORMATS[0];\n const fits: ReframeFit[] = kind === 'video' ? ['crop', 'fit', 'stack'] : ['crop', 'fit'];\n const pendingStillNote = kind === 'image' ? stillReframeNote({ fit, bars }) : null;\n\n const measure = (): Promise<Dims> =>\n new Promise((resolve, reject) => {\n if (kind === 'image') {\n RNImage.getSize(\n item.src,\n (width, height) => resolve({ width, height }),\n () => reject(new Error('Could not read image size')),\n );\n return;\n }\n // Video: assume 16:9 HD when we cannot probe on device.\n resolve({ width: 1920, height: 1080 });\n });\n\n const run = async () => {\n if (!runAction || !tool || busy) return;\n if (tool === 'edit-video') {\n onEditVideo?.();\n return;\n }\n setBusy(true);\n setNotice(null);\n setReceipt(null);\n try {\n let url = '';\n let note: string | null = null;\n if (tool === 'reframe') {\n const dims = await measure();\n const choice = { format: reframeFormat, fit, bars, focus };\n const out = await runReframeChoice(runAction, kind, item.src, choice, dims);\n url = out.url;\n note = out.note\n ? `${formatName(reframeFormat)}: ${out.note}`\n : `${formatName(reframeFormat)}: ${describeReframe(choice, dims)}.`;\n } else if (tool === 'remove-background') {\n if (keyChoice === 'custom' && !normalizeHex(customHex))\n throw new Error('Type a hex colour like #00ff00');\n url = await runRemoveBackground(runAction, kind, item.src, {\n key: keyChoice,\n customHex,\n similarity,\n blend,\n });\n } else if (tool === 'upscale') {\n const dims = await measure();\n const out = upscalePlan(dims, upscaleTarget);\n if (!out) throw new Error('Already at or above that size');\n url = await runUpscale(runAction, kind, item.src, out);\n } else if (tool === 'match-look') {\n url = await runMatchLook(runAction, kind, item.src);\n } else if (tool === 'lip-sync') {\n if (!lipText.trim()) throw new Error('Type a line for the mouth to follow');\n url = await runTrackedLipSync(runAction, item.src, { text: lipText });\n } else if (tool === 'extend-video') {\n url = await runExtendVideo(runAction, item.src, extendPrompt);\n }\n if (url) onReplaced(url);\n setReceipt(note);\n setTool(null);\n } catch (err: unknown) {\n setNotice(friendlyMediaError(err, 'edit'));\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <View style={styles.root}>\n {showTitle ? <Text style={styles.title}>Edit selected</Text> : null}\n <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.chips}>\n {tools.map((id) => {\n const meta = EDIT_TOOL_META[id];\n const on = tool === id;\n return (\n <Pressable\n key={id}\n onPress={() => setTool(on ? null : id)}\n style={[styles.chip, on && styles.chipOn]}\n >\n <MaterialCommunityIcons\n name={meta.icon as React.ComponentProps<typeof MaterialCommunityIcons>['name']}\n size={14}\n color={on ? '#9a3412' : '#64748b'}\n />\n <Text style={[styles.chipLabel, on && styles.chipLabelOn]}>{meta.label}</Text>\n </Pressable>\n );\n })}\n </ScrollView>\n {tool ? <Text style={styles.blurb}>{EDIT_TOOL_META[tool].blurb}</Text> : null}\n\n {tool === 'reframe' ? (\n <View style={styles.opts}>\n <View style={styles.chips}>\n {REFRAME_FORMATS.map((f) => (\n <Pressable\n key={f.id}\n onPress={() => setFormatId(f.id)}\n style={[styles.chip, formatId === f.id && styles.chipOn]}\n accessibilityLabel={`${f.label}, ${f.uses}`}\n >\n <Text style={styles.chipLabel}>{f.size ? f.label : `${f.label} ${f.ratio}`}</Text>\n </Pressable>\n ))}\n </View>\n <Text style={styles.blurb}>\n {reframeFormat.uses}\n {reframeFormat.size ? ` · ${reframeFormat.size.width}x${reframeFormat.size.height}` : ''}\n </Text>\n <View style={styles.chips}>\n {fits.map((f) => (\n <Pressable\n key={f}\n onPress={() => setFit(f)}\n style={[styles.chip, fit === f && styles.chipOn]}\n >\n <Text style={styles.chipLabel}>\n {f === 'crop' ? 'Crop' : f === 'fit' ? 'Fit' : 'Stack'}\n </Text>\n </Pressable>\n ))}\n </View>\n {fit === 'fit' ? (\n <View style={styles.chips}>\n {REFRAME_BARS.map((b) => (\n <Pressable\n key={b.id}\n onPress={() => setBars(b.id)}\n style={[styles.chip, bars === b.id && styles.chipOn]}\n accessibilityHint={b.title}\n >\n <Text style={styles.chipLabel}>{b.label}</Text>\n </Pressable>\n ))}\n </View>\n ) : null}\n {fit === 'crop' ? (\n <View style={styles.chips}>\n {FOCUS_STOPS.map((f) => (\n <Pressable\n key={f}\n onPress={() => setFocus(f)}\n style={[styles.chip, focus === f && styles.chipOn]}\n >\n <Text style={styles.chipLabel}>\n {f === 0 ? 'Start' : f === 1 ? 'End' : 'Centre'}\n </Text>\n </Pressable>\n ))}\n </View>\n ) : null}\n {pendingStillNote ? <Text style={styles.blurb}>{pendingStillNote}</Text> : null}\n </View>\n ) : null}\n\n {tool === 'remove-background' ? (\n <View style={styles.opts}>\n <View style={styles.chips}>\n {KEY_COLOR_CHOICES.filter((c) => kind === 'image' || c.id !== 'auto').map((c) => (\n <Pressable\n key={c.id}\n onPress={() => setKeyChoice(c.id)}\n style={[styles.chip, keyChoice === c.id && styles.chipOn]}\n >\n {c.hex ? <View style={[styles.swatch, { backgroundColor: c.hex }]} /> : null}\n <Text style={styles.chipLabel}>{c.label}</Text>\n </Pressable>\n ))}\n </View>\n {keyChoice === 'custom' ? (\n <View style={styles.hexRow}>\n <View\n style={[\n styles.swatch,\n styles.swatchLg,\n { backgroundColor: normalizeHex(customHex) ?? '#ffffff' },\n ]}\n />\n <TextInput\n value={customHex}\n onChangeText={setCustomHex}\n placeholder=\"#00ff00\"\n placeholderTextColor=\"#94a3b8\"\n autoCapitalize=\"none\"\n autoCorrect={false}\n style={[styles.field, styles.hexField]}\n />\n </View>\n ) : null}\n <Text style={styles.blurb}>Tolerance · {pct(similarity)}</Text>\n <View style={styles.chips}>\n {SIMILARITY_STEPS.map((v) => (\n <Pressable\n key={v}\n onPress={() => setSimilarity(v)}\n style={[styles.chip, similarity === v && styles.chipOn]}\n >\n <Text style={styles.chipLabel}>{pct(v)}</Text>\n </Pressable>\n ))}\n </View>\n <Text style={styles.blurb}>Edge softness · {pct(blend)}</Text>\n <View style={styles.chips}>\n {BLEND_STEPS.map((v) => (\n <Pressable\n key={v}\n onPress={() => setBlend(v)}\n style={[styles.chip, blend === v && styles.chipOn]}\n >\n <Text style={styles.chipLabel}>{pct(v)}</Text>\n </Pressable>\n ))}\n </View>\n <Text style={styles.blurb}>\n {kind === 'image'\n ? 'The result is a PNG with transparency where the background was.'\n : 'MP4 carries no transparency, so the keyed area turns black.'}\n </Text>\n </View>\n ) : null}\n\n {tool === 'upscale' ? (\n <View style={styles.chips}>\n {UPSCALE_TARGETS.map((t) => (\n <Pressable\n key={t.id}\n onPress={() => setUpscaleTarget(t.id)}\n style={[styles.chip, upscaleTarget === t.id && styles.chipOn]}\n >\n <Text style={styles.chipLabel}>{t.label}</Text>\n </Pressable>\n ))}\n </View>\n ) : null}\n\n {tool === 'lip-sync' ? (\n <TextInput\n value={lipText}\n onChangeText={setLipText}\n placeholder=\"Line to speak…\"\n placeholderTextColor=\"#94a3b8\"\n style={styles.field}\n />\n ) : null}\n\n {tool === 'extend-video' ? (\n <TextInput\n value={extendPrompt}\n onChangeText={setExtendPrompt}\n placeholder=\"What should happen next? (optional)\"\n placeholderTextColor=\"#94a3b8\"\n style={styles.field}\n />\n ) : null}\n\n {notice ? <Text style={styles.notice}>{notice}</Text> : null}\n {receipt ? <Text style={styles.blurb}>{receipt}</Text> : null}\n\n {tool ? (\n <Pressable\n onPress={() => void run()}\n disabled={busy || !runAction}\n style={[styles.cta, (busy || !runAction) && styles.ctaOff]}\n >\n {busy ? (\n <ActivityIndicator color=\"#fff7ed\" />\n ) : (\n <Text style={styles.ctaLabel}>{tool === 'edit-video' ? 'Open editor' : 'Apply'}</Text>\n )}\n </Pressable>\n ) : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n root: { paddingHorizontal: 16, paddingBottom: 12, gap: 10 },\n title: { fontSize: 13, fontWeight: '700', color: '#0f172a' },\n hint: { padding: 16, fontSize: 13, color: '#64748b' },\n chips: { flexDirection: 'row', flexWrap: 'wrap', gap: 8 },\n chip: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n paddingHorizontal: 10,\n paddingVertical: 7,\n borderRadius: 999,\n borderWidth: 1,\n borderColor: '#e2e8f0',\n backgroundColor: '#fff',\n },\n chipOn: { backgroundColor: '#fde8d8', borderColor: '#fde8d8' },\n chipLabel: { fontSize: 12, fontWeight: '600', color: '#334155' },\n chipLabelOn: { color: '#9a3412' },\n blurb: { fontSize: 12, color: '#64748b', lineHeight: 16 },\n opts: { gap: 8 },\n field: {\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: '#e2e8f0',\n borderRadius: 10,\n paddingHorizontal: 12,\n paddingVertical: 10,\n fontSize: 13,\n color: '#0f172a',\n backgroundColor: '#fff',\n },\n notice: { fontSize: 12, color: '#b91c1c' },\n swatch: { width: 12, height: 12, borderRadius: 3, borderWidth: StyleSheet.hairlineWidth, borderColor: '#cbd5e1' },\n swatchLg: { width: 32, height: 32, borderRadius: 8 },\n hexRow: { flexDirection: 'row', alignItems: 'center', gap: 8 },\n hexField: { flex: 1 },\n cta: {\n alignSelf: 'flex-start',\n paddingHorizontal: 16,\n paddingVertical: 10,\n borderRadius: 12,\n backgroundColor: '#ea580c',\n },\n ctaOff: { opacity: 0.45 },\n ctaLabel: { color: '#fff7ed', fontSize: 13, fontWeight: '700' },\n});\n"],"names":["RNImage"],"mappings":"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"}