@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":"NativeCanvasViewer.js","sources":["../../../src/features/canvas/NativeCanvasViewer.tsx"],"sourcesContent":["/**\n * Native canvas board — the first genuinely native slice of the canvas\n * surface. Renders a `PersistedCanvasState` board (positioned image/video/audio\n * items on a plane) with pinch-zoom and pan, and lets items be moved and\n * freely resized in place: tap to select, drag the body to move, drag a corner\n * handle to resize (opposite corner anchored, per-axis, MIN_ITEM_SIZE floor).\n *\n * Deliberately NOT a port of the web editors. The board plane is positioned\n * media (`CanvasItem`: x/y/width/height/zIndex) — it needs a transformed view,\n * not a drawing engine, so there is no Konva analogue to replace and no new\n * native dependency: `react-native-gesture-handler`, `react-native-reanimated`\n * and `expo-image` are already in the app. Konva/Skia only enter the picture\n * for the EDITORS (freehand drawing, filters), which stay on the WebView tier.\n *\n * Every gesture runs on the UI thread via reanimated shared values — camera\n * AND item edits — so panning, dragging and resizing stay at frame rate even\n * while the JS thread is busy. React state only hears about an edit once, when\n * the gesture ends (`applyItemFrame` commit), which is also when the host's\n * `onBoardChange` fires; persistence stays the host's concern.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Share, StyleSheet, Text, TextInput, View, useWindowDimensions } from 'react-native';\nimport {\n Gesture,\n GestureDetector,\n GestureHandlerRootView,\n Pressable as GHPressable,\n} from 'react-native-gesture-handler';\nimport Animated, {\n runOnJS,\n useAnimatedReaction,\n useAnimatedStyle,\n useSharedValue,\n type SharedValue,\n} from 'react-native-reanimated';\nimport { Image } from 'expo-image';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { getVideoItemRenderer } from './videoRenderer';\nimport {\n applyItemFrame,\n boardBounds,\n coerceUploadSizedItem,\n paintOrder,\n removeItem,\n resizeFrame,\n spreadStackedItems,\n MAX_ZOOM,\n MIN_ZOOM,\n type CanvasItem,\n type ItemFrame,\n type PersistedCanvasState,\n type ResizeCorner,\n} from './canvasCore';\nimport { CanvasAgentChatPane } from './CanvasAgentChatPane';\nimport type { GenerateLane } from './CanvasGeneratePanel';\nimport type { RunMediaAction } from './videoEditor/mediaActions';\n\nexport type CanvasItemAction =\n | 'edit-image'\n | 'mark-edit'\n | 'edit-video'\n | 'trim-video'\n | 'create-video'\n | 'edit-audio'\n | 'promo-video'\n | 'restyle-video';\n\nexport interface NativeCanvasViewerProps {\n board: PersistedCanvasState;\n /** Tap on an item — the seam where editors (WebView tier) attach later. */\n onItemPress?: (item: CanvasItem) => void;\n /** Fired once per finished drag/resize with the whole updated board.\n * The viewer keeps its own working copy; the host owns persistence. */\n onBoardChange?: (board: PersistedCanvasState) => void;\n /** Show the zoom cluster (- n% +) and the selection toolbar, like the\n * web canvas. Opt-in so screens with their own chrome (the Expo app's\n * zoom indicator) are unchanged. */\n controls?: boolean;\n /** Agent-backed toolbar actions (Edit Image, Create Video). The viewer\n * only raises the intent - what \"edit\" means is the host's business. */\n onItemAction?: (action: CanvasItemAction, item: CanvasItem) => void;\n /** Web compact header: Boards + item count + zoom cluster. */\n onBoardsPress?: () => void;\n /** Open the agent rail as soon as this board mounts (gallery AI Chat). */\n initialAgentOpen?: boolean;\n /** Hide the Generate/Library dock while the agent rail is open (web parity). */\n onAgentOpenChange?: (open: boolean) => void;\n runAction?: RunMediaAction;\n onAgentGenerated?: (\n url: string,\n meta: { prompt: string; aspect: string; mode: GenerateLane; title?: string },\n ) => CanvasItem | void;\n onAgentReplace?: (itemId: string, url: string) => void;\n /** Selected board item — edit dock / generate seed. */\n onSelectionChange?: (item: CanvasItem | null) => void;\n onUseTemplate?: (template: import('./canvasChatTemplates').CanvasPromptTemplate) => void;\n testID?: string;\n}\n\n/** Extra invisible touch padding around each handle. */\nconst HANDLE_SLOP = 12;\nconst SELECTION_COLOR = '#3b82f6';\n\n/** Static glyph tile - the fallback for any media that cannot draw itself\n * (no registered renderer, or a renderer that throws at mount). */\nfunction MediaGlyph({ item }: { item: CanvasItem }) {\n return (\n <View style={[StyleSheet.absoluteFill, styles.mediaTile]} accessibilityLabel={`Canvas ${item.type}`}>\n <Text style={styles.mediaTileGlyph}>{item.type === 'video' ? '▶' : '♪'}</Text>\n {item.generatedAssetName ? (\n <Text numberOfLines={1} style={styles.mediaTileLabel}>\n {item.generatedAssetName}\n </Text>\n ) : null}\n </View>\n );\n}\n\n/**\n * Isolates a registered video renderer's failures to the single item.\n *\n * The renderer is expo-video, delivered by whichever lane registered it. When\n * that lane's remote JS is loaded across the microfrontend boundary onto a\n * host binary whose native ExpoVideo is absent or a different version, mounting\n * VideoView throws at render (\"View config getter ... must be a function\").\n * Without this boundary that throw escapes to the remote's loader boundary and\n * the WHOLE canvas reads \"surface unavailable\". Here it degrades to the glyph\n * tile - the exact fallback used when no renderer is registered at all - so a\n * board with one bad video still opens.\n */\nclass VideoRenderIsland extends React.Component<\n { fallback: React.ReactNode; children: React.ReactNode },\n { failed: boolean }\n> {\n state = { failed: false };\n\n static getDerivedStateFromError() {\n return { failed: true };\n }\n\n componentDidCatch(error: unknown) {\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[NativeCanvasViewer] video renderer failed, using glyph:', error);\n }\n }\n\n render() {\n return this.state.failed ? this.props.fallback : this.props.children;\n }\n}\n\n/** The media content of an item, frame-agnostic — shared by the static and\n * the selected (animated) renderers. */\nfunction ItemContent({ item }: { item: CanvasItem }) {\n if (item.type === 'image') {\n return (\n <Image\n source={{ uri: item.src }}\n style={[StyleSheet.absoluteFill, styles.itemImage]}\n contentFit=\"cover\"\n transition={120}\n accessibilityLabel={item.generatedAssetName ?? 'Canvas image'}\n />\n );\n }\n const VideoRenderer = item.type === 'video' ? getVideoItemRenderer() : null;\n if (VideoRenderer) {\n return (\n <VideoRenderIsland fallback={<MediaGlyph item={item} />}>\n <VideoRenderer item={item} />\n </VideoRenderIsland>\n );\n }\n return <MediaGlyph item={item} />;\n}\n\n/** A non-selected item: static frame, tap to select. */\nfunction StaticItem({ item, onTap }: { item: CanvasItem; onTap: (item: CanvasItem) => void }) {\n const tap = Gesture.Tap()\n .runOnJS(true)\n .blocksExternalGesture()\n .onEnd(() => onTap(item));\n\n return (\n <GestureDetector gesture={tap}>\n <View\n style={{\n position: 'absolute',\n left: item.x,\n top: item.y,\n width: item.width,\n height: item.height,\n zIndex: item.zIndex,\n overflow: 'hidden',\n borderRadius: 8,\n }}\n >\n <ItemContent item={item} />\n </View>\n </GestureDetector>\n );\n}\n\nconst CORNERS: ResizeCorner[] = ['tl', 'tr', 'bl', 'br'];\n\nfunction ItemHoverToolbar({\n item,\n onAction,\n onRemove,\n onChromeTouch,\n}: {\n item: CanvasItem;\n onAction?: NativeCanvasViewerProps['onItemAction'];\n onRemove: () => void;\n onChromeTouch: () => void;\n}) {\n const [moreOpen, setMoreOpen] = useState(false);\n const [promptOpen, setPromptOpen] = useState(false);\n const [prompt, setPrompt] = useState('');\n\n const download = useCallback(() => {\n setMoreOpen(false);\n void Share.share({ url: item.src, message: item.src }).catch(() => undefined);\n }, [item.src]);\n\n // RNGH Pressable is a native button, so Native() actually activates and\n // can block the full-screen empty-plane tap. RN Pressable cannot.\n const stealTouches = useMemo(() => Gesture.Native().blocksExternalGesture(), []);\n\n return (\n <View style={styles.hoverWrap} pointerEvents=\"box-none\">\n <GestureDetector gesture={stealTouches}>\n <View style={styles.hoverCluster} pointerEvents=\"auto\" onTouchStart={onChromeTouch}>\n <View style={styles.hoverBar}>\n {/* Web clips the left of this row on a phone so the 3-dots stay on screen. */}\n <View style={styles.hoverActions}>\n <View style={styles.hoverActionsInner}>\n {item.type === 'image' ? (\n <>\n <GHPressable\n onPress={() => {\n setMoreOpen(false);\n setPromptOpen((v) => !v);\n }}\n style={styles.hoverBtn}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"pencil-outline\" size={20} color=\"#64748b\" />\n <Text style={styles.hoverLabel} numberOfLines={1}>\n Edit Image\n </Text>\n </GHPressable>\n <GHPressable\n onPress={() => {\n setMoreOpen(false);\n setPromptOpen(false);\n onAction?.('edit-image', item);\n }}\n style={styles.hoverBtn}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"content-cut\" size={20} color=\"#64748b\" />\n <Text style={styles.hoverLabel}>Editor</Text>\n </GHPressable>\n <GHPressable\n onPress={() => {\n setMoreOpen(false);\n setPromptOpen(false);\n onAction?.('mark-edit', item);\n }}\n style={styles.hoverBtn}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"marker\" size={20} color=\"#64748b\" />\n <Text style={styles.hoverLabel}>Mark & edit</Text>\n </GHPressable>\n </>\n ) : null}\n {item.type === 'video' ? (\n <GHPressable\n onPress={() => {\n setMoreOpen(false);\n onAction?.('edit-video', item);\n }}\n style={styles.hoverBtn}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"content-cut\" size={20} color=\"#64748b\" />\n <Text style={styles.hoverLabel}>Edit Video</Text>\n </GHPressable>\n ) : null}\n {item.type === 'audio' ? (\n <GHPressable\n onPress={() => {\n setMoreOpen(false);\n onAction?.('edit-audio', item);\n }}\n style={styles.hoverBtn}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"content-cut\" size={20} color=\"#64748b\" />\n <Text style={styles.hoverLabel}>Edit Audio</Text>\n </GHPressable>\n ) : null}\n <View style={styles.hoverDivider} />\n <GHPressable\n onPress={() => {\n setMoreOpen(false);\n onAction?.('create-video', item);\n }}\n style={styles.hoverBtn}\n accessibilityRole=\"button\"\n >\n <View>\n <MaterialCommunityIcons name=\"video-outline\" size={20} color=\"#64748b\" />\n <MaterialCommunityIcons\n name=\"star-four-points\"\n size={8}\n color=\"#94a3b8\"\n style={styles.hoverSparkle}\n />\n </View>\n <Text style={styles.hoverLabel}>Create Video</Text>\n </GHPressable>\n {item.type === 'video' ? (\n <GHPressable\n onPress={() => {\n setMoreOpen(false);\n onAction?.('restyle-video', item);\n }}\n style={styles.hoverBtn}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"auto-fix\" size={20} color=\"#64748b\" />\n <Text style={styles.hoverLabel}>Restyle</Text>\n </GHPressable>\n ) : null}\n {item.type === 'image' || item.type === 'video' ? (\n <GHPressable\n onPress={() => {\n setMoreOpen(false);\n onAction?.('promo-video', item);\n }}\n style={styles.hoverBtn}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"bullhorn-outline\" size={20} color=\"#64748b\" />\n <Text style={styles.hoverLabel}>Promo</Text>\n </GHPressable>\n ) : null}\n {item.type === 'video' ? (\n <>\n <View style={styles.hoverDivider} />\n <GHPressable\n onPress={() => {\n setMoreOpen(false);\n onAction?.('trim-video', item);\n }}\n style={styles.hoverBtn}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons\n name=\"movie-open-outline\"\n size={20}\n color=\"#64748b\"\n />\n <Text style={styles.hoverLabel}>Clips</Text>\n </GHPressable>\n </>\n ) : null}\n <View style={styles.hoverDivider} />\n <GHPressable\n onPress={download}\n style={styles.hoverIconBtn}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Download\"\n >\n <MaterialCommunityIcons name=\"download-outline\" size={20} color=\"#94a3b8\" />\n </GHPressable>\n </View>\n </View>\n <View style={styles.hoverDivider} />\n <View style={styles.moreWrap}>\n <GHPressable\n onPress={() => {\n setPromptOpen(false);\n setMoreOpen((v) => !v);\n }}\n style={styles.hoverIconBtn}\n accessibilityRole=\"button\"\n accessibilityLabel=\"More\"\n >\n <MaterialCommunityIcons name=\"dots-vertical\" size={20} color=\"#94a3b8\" />\n </GHPressable>\n {moreOpen ? (\n <View style={styles.moreMenu}>\n <GHPressable\n onPress={() => {\n setMoreOpen(false);\n onRemove();\n }}\n style={styles.moreRow}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"trash-can-outline\" size={20} color=\"#64748b\" />\n <Text style={styles.moreLabel}>Remove</Text>\n </GHPressable>\n <GHPressable onPress={download} style={styles.moreRow} accessibilityRole=\"button\">\n <MaterialCommunityIcons name=\"download-outline\" size={20} color=\"#64748b\" />\n <Text style={styles.moreLabel}>Download</Text>\n </GHPressable>\n </View>\n ) : null}\n </View>\n </View>\n {promptOpen && item.type === 'image' ? (\n <View style={styles.editPrompt}>\n <TextInput\n value={prompt}\n onChangeText={setPrompt}\n placeholder=\"Describe how to edit this image…\"\n placeholderTextColor=\"#94a3b8\"\n multiline\n style={styles.editPromptInput}\n />\n </View>\n ) : null}\n </View>\n </GestureDetector>\n </View>\n );\n}\n\nfunction DotGrid() {\n return (\n <View pointerEvents=\"none\" style={styles.dots}>\n {Array.from({ length: 40 }).map((_, row) => (\n <View key={row} style={styles.dotRow}>\n {Array.from({ length: 24 }).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\ninterface SelectedItemProps {\n item: CanvasItem;\n /** Camera scale — converts screen-space gesture deltas to board units. */\n cameraScale: SharedValue<number>;\n onCommit: (id: string, frame: ItemFrame) => void;\n onTap?: (item: CanvasItem) => void;\n showToolbar?: boolean;\n onAction?: NativeCanvasViewerProps['onItemAction'];\n onRemove: () => void;\n onChromeTouch: () => void;\n}\n\n/**\n * The selected item: its frame lives in shared values so drags and resizes\n * track the finger on the UI thread; React state is only told on gesture end.\n */\nfunction SelectedItem({\n item,\n cameraScale,\n onCommit,\n onTap,\n showToolbar,\n onAction,\n onRemove,\n onChromeTouch,\n}: SelectedItemProps) {\n const fx = useSharedValue(item.x);\n const fy = useSharedValue(item.y);\n const fw = useSharedValue(item.width);\n const fh = useSharedValue(item.height);\n // Frame snapshot at gesture start, so deltas compose instead of drifting.\n const start = useSharedValue<ItemFrame>({ x: item.x, y: item.y, width: item.width, height: item.height });\n\n // Selecting a different item reuses this component instance.\n useEffect(() => {\n fx.value = item.x;\n fy.value = item.y;\n fw.value = item.width;\n fh.value = item.height;\n // Shared values are stable refs; the item fields are the real inputs.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [item.id, item.x, item.y, item.width, item.height]);\n\n const commit = useCallback(\n (frame: ItemFrame) => {\n onCommit(item.id, frame);\n },\n [item.id, onCommit],\n );\n\n const snapshot = () => {\n 'worklet';\n\n start.value = { x: fx.value, y: fy.value, width: fw.value, height: fh.value };\n };\n\n const finish = () => {\n 'worklet';\n\n runOnJS(commit)({ x: fx.value, y: fy.value, width: fw.value, height: fh.value });\n };\n\n // Drag the body to move. One finger only, so two fingers stay pinch-zoom.\n const drag = Gesture.Pan()\n .maxPointers(1)\n .onStart(snapshot)\n .onUpdate((e) => {\n 'worklet';\n\n const s = cameraScale.value;\n fx.value = start.value.x + e.translationX / s;\n fy.value = start.value.y + e.translationY / s;\n })\n .onEnd(finish);\n\n const tap = Gesture.Tap()\n .runOnJS(true)\n .blocksExternalGesture()\n .onEnd(() => onTap?.(item));\n\n const bodyGesture = item.type === 'video' || item.type === 'audio' ? null : Gesture.Exclusive(tap, drag);\n\n const frameStyle = useAnimatedStyle(() => ({\n position: 'absolute',\n left: fx.value,\n top: fy.value,\n width: fw.value,\n height: fh.value,\n // Editing brings the item above its neighbours for the duration.\n zIndex: 99999,\n }));\n\n const ringStyle = useAnimatedStyle(() => ({\n borderWidth: 2 / cameraScale.value,\n borderRadius: 8 / cameraScale.value,\n }));\n\n // One resize pan per corner, built once per selected item. Not hooks, so\n // building them in a memoised map is safe.\n const cornerGestures = useMemo(\n () =>\n CORNERS.map((corner) =>\n Gesture.Pan()\n .maxPointers(1)\n .onStart(snapshot)\n .onUpdate((e) => {\n 'worklet';\n\n const s = cameraScale.value;\n const next = resizeFrame(start.value, corner, e.translationX / s, e.translationY / s);\n fx.value = next.x;\n fy.value = next.y;\n fw.value = next.width;\n fh.value = next.height;\n })\n .onEnd(finish),\n ),\n // Shared values and worklets are stable; rebuild only when the target changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [item.id],\n );\n\n const handleStyle = styles.webHandle;\n\n const cornerPlacement: Record<ResizeCorner, object> = {\n tl: { left: 0, top: 0 },\n tr: { right: 0, top: 0 },\n bl: { left: 0, bottom: 0 },\n br: { right: 0, bottom: 0 },\n };\n\n const media = (\n <View style={[StyleSheet.absoluteFill, { overflow: 'hidden', borderRadius: 8 }]}>\n <ItemContent item={item} />\n <Animated.View pointerEvents=\"none\" style={[StyleSheet.absoluteFill, styles.selectionRing, ringStyle]} />\n </View>\n );\n\n return (\n <Animated.View style={[frameStyle, styles.selectedOverflow]}>\n {bodyGesture ? <GestureDetector gesture={bodyGesture}>{media}</GestureDetector> : media}\n {(item.type === 'video' || item.type === 'audio') && (\n <GestureDetector gesture={drag}>\n <View style={styles.videoDragBar} accessibilityLabel=\"Drag to move\">\n <View style={styles.videoDragGrip} />\n <View style={styles.videoDragGrip} />\n <View style={styles.videoDragGrip} />\n </View>\n </GestureDetector>\n )}\n {CORNERS.map((corner, i) => (\n <GestureDetector key={corner} gesture={cornerGestures[i]}>\n <View style={[styles.handleAnchor, cornerPlacement[corner]]} hitSlop={HANDLE_SLOP}>\n <View style={handleStyle} />\n </View>\n </GestureDetector>\n ))}\n {showToolbar ? (\n <ItemHoverToolbar item={item} onAction={onAction} onRemove={onRemove} onChromeTouch={onChromeTouch} />\n ) : null}\n </Animated.View>\n );\n}\n\nexport function NativeCanvasViewer({\n board,\n onItemPress,\n onBoardChange,\n controls,\n onItemAction,\n onBoardsPress,\n initialAgentOpen = false,\n onAgentOpenChange,\n runAction,\n onAgentGenerated,\n onAgentReplace,\n onSelectionChange,\n onUseTemplate,\n testID,\n}: NativeCanvasViewerProps) {\n const { width: winW, height: winH } = useWindowDimensions();\n const [viewport, setViewport] = useState({ width: winW, height: winH });\n\n // Working copy of the board's items — edits land here on gesture end.\n // Exactly-stacked items (the default add frame) are fanned into a row for\n // display, or every file after the first would be invisible.\n const [items, setItems] = useState<readonly CanvasItem[]>(() =>\n spreadStackedItems(board.items.map(coerceUploadSizedItem)),\n );\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [agentOpen, setAgentOpen] = useState(initialAgentOpen);\n useEffect(() => {\n onAgentOpenChange?.(agentOpen);\n }, [agentOpen, onAgentOpenChange]);\n useEffect(() => {\n onSelectionChange?.(selectedId ? (items.find((it) => it.id === selectedId) ?? null) : null);\n }, [selectedId, items, onSelectionChange]);\n const boardMediaKey = board.items.map((it) => `${it.id}\\t${it.src}`).join('\\0');\n const prevItemIdsRef = useRef<Set<string>>(new Set(board.items.map((it) => it.id)));\n\n const ordered = useMemo(() => paintOrder(items), [items]);\n\n // Camera: scale + translation, driven on the UI thread.\n const scale = useSharedValue(1);\n const tx = useSharedValue(0);\n const ty = useSharedValue(0);\n // Gesture-start snapshots, so pinch/pan compose instead of fighting.\n const startScale = useSharedValue(1);\n const startTx = useSharedValue(0);\n const startTy = useSharedValue(0);\n\n const applyCamera = (list: readonly CanvasItem[]) => {\n const fit = boardBounds(list);\n if (!fit) {\n scale.value = 1;\n tx.value = 0;\n ty.value = 0;\n return;\n }\n const boardW = Math.max(1, fit.maxX - fit.minX);\n const boardH = Math.max(1, fit.maxY - fit.minY);\n // Web opens at 100% and pans. Fitting a 500px card into a 390px phone\n // was shrinking the in-plane item toolbar to ~69%.\n scale.value = 1;\n tx.value = (viewport.width - boardW) / 2 - fit.minX;\n ty.value = (viewport.height - boardH) / 2 - fit.minY;\n };\n\n useEffect(() => {\n const spread = spreadStackedItems(board.items.map(coerceUploadSizedItem));\n const prevIds = prevItemIdsRef.current;\n const added = spread.filter((it) => !prevIds.has(it.id));\n const removedCount = [...prevIds].filter((id) => !spread.some((s) => s.id === id)).length;\n const appended = added.length > 0 && removedCount === 0 && spread.length > prevIds.size;\n prevItemIdsRef.current = new Set(spread.map((it) => it.id));\n setItems(spread);\n setSelectedId(appended ? added[added.length - 1].id : null);\n applyCamera(spread);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [boardMediaKey]);\n\n useEffect(() => {\n applyCamera(items);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [viewport.width, viewport.height]);\n\n const handleCommit = useCallback(\n (id: string, frame: ItemFrame) => {\n setItems((prev) => {\n const next = applyItemFrame(prev, id, frame);\n const snapshot = { ...board, items: next };\n // Parent setState must not run inside this updater — React treats\n // it as rendering NativeCanvasViewer and throws.\n queueMicrotask(() => onBoardChange?.(snapshot));\n return next;\n });\n },\n [board, onBoardChange],\n );\n\n const handleSelect = useCallback(\n (item: CanvasItem) => {\n setSelectedId(item.id);\n onItemPress?.(item);\n },\n [onItemPress],\n );\n\n // Toolbar buttons sit on the full-screen pan/tap plane. RNGH Pressable\n // plus a brief deselect lock keeps 3-dots from clearing the selection.\n const skipDeselectUntil = useRef(0);\n const armChromeTouch = useCallback(() => {\n skipDeselectUntil.current = Date.now() + 400;\n }, []);\n const handleBackgroundTap = useCallback(\n (absX: number, absY: number) => {\n if (Date.now() < skipDeselectUntil.current) return;\n const item = selectedId ? items.find((it) => it.id === selectedId) : undefined;\n if (item) {\n const s = scale.value;\n const left = item.x * s + tx.value;\n const top = item.y * s + ty.value;\n // Toolbar sits just above the photo; treat that band as chrome.\n if (\n absX >= left &&\n absX <= left + item.width * s &&\n absY >= top - 80 &&\n absY <= top + item.height * s\n ) {\n return;\n }\n }\n setSelectedId(null);\n },\n [items, selectedId],\n );\n\n // Live zoom readout for the controls - rounded on the UI thread so React\n // hears only whole-percent changes, not every gesture frame.\n const [zoomPct, setZoomPct] = useState(100);\n useAnimatedReaction(\n () => Math.round(scale.value * 100),\n (pct, prev) => {\n if (pct !== prev) runOnJS(setZoomPct)(pct);\n },\n );\n\n /** Zoom about the viewport centre - the button twin of the pinch. */\n const zoomBy = useCallback(\n (factor: number) => {\n const next = Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, scale.value * factor));\n const ratio = next / scale.value;\n const cx = viewport.width / 2;\n const cy = viewport.height / 2;\n tx.value = cx - (cx - tx.value) * ratio;\n ty.value = cy - (cy - ty.value) * ratio;\n scale.value = next;\n },\n // Shared values are stable refs.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [viewport.width, viewport.height],\n );\n\n /** Tap the percentage to reset to 100%, matching the web zoom cluster. */\n const fitBoard = useCallback(() => {\n applyCamera(items);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [items, viewport.width, viewport.height]);\n\n const commitItems = useCallback(\n (next: readonly CanvasItem[]) => {\n setItems(next);\n onBoardChange?.({ ...board, items: [...next] });\n },\n [board, onBoardChange],\n );\n\n const pan = Gesture.Pan()\n .minDistance(10)\n .averageTouches(true)\n .onStart(() => {\n startTx.value = tx.value;\n startTy.value = ty.value;\n })\n .onUpdate((e) => {\n tx.value = startTx.value + e.translationX;\n ty.value = startTy.value + e.translationY;\n });\n\n const pinch = Gesture.Pinch()\n .onStart(() => {\n startScale.value = scale.value;\n startTx.value = tx.value;\n startTy.value = ty.value;\n })\n .onUpdate((e) => {\n 'worklet';\n\n const raw = startScale.value * e.scale;\n const next = Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, raw));\n // Zoom about the pinch focal point: keep the board point under the\n // fingers stationary while the scale changes around it.\n const ratio = next / startScale.value;\n tx.value = e.focalX - (e.focalX - startTx.value) * ratio;\n ty.value = e.focalY - (e.focalY - startTy.value) * ratio;\n scale.value = next;\n });\n\n // Tap on empty plane clears the selection; item taps win by being deeper.\n const backgroundTap = Gesture.Tap()\n .runOnJS(true)\n .onEnd((e) => {\n handleBackgroundTap(e.absoluteX, e.absoluteY);\n });\n\n const gesture = Gesture.Simultaneous(pan, pinch, backgroundTap);\n\n const planeStyle = useAnimatedStyle(() => ({\n transform: [{ translateX: tx.value }, { translateY: ty.value }, { scale: scale.value }] as const,\n }));\n\n // Empty boards still render the pan/zoom plane so Canvas Native opens as a\n // canvas, not a placeholder.\n\n return (\n // Self-sufficient gesture root: hosts differ in whether they wrap\n // screens in GestureHandlerRootView (the Expo app's canvas screen\n // does not), and GestureDetector throws without one. Nesting under a\n // host-provided root is safe.\n <GestureHandlerRootView\n style={styles.viewport}\n testID={testID}\n onLayout={(e) => {\n const { width, height } = e.nativeEvent.layout;\n if (width > 0 && height > 0) setViewport({ width, height });\n }}\n >\n {onBoardsPress ? (\n <View style={styles.boardHeader}>\n <GHPressable\n onPress={onBoardsPress}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Boards\"\n style={styles.boardsBtn}\n >\n <MaterialCommunityIcons name=\"view-grid-outline\" size={16} color=\"#64748b\" />\n <Text style={styles.boardsLabel}>Boards</Text>\n </GHPressable>\n <View style={styles.headerRule} />\n <Text style={styles.itemCount}>\n {items.length} {items.length === 1 ? 'item' : 'items'}\n </Text>\n <View style={styles.headerZoom}>\n <GHPressable\n onPress={() => zoomBy(1 / 1.25)}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Zoom out\"\n style={styles.zoomBtn}\n >\n <Text style={styles.zoomBtnGlyph}>−</Text>\n </GHPressable>\n <GHPressable\n onPress={fitBoard}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Fit board\"\n >\n <Text style={styles.zoomPct}>{zoomPct}%</Text>\n </GHPressable>\n <GHPressable\n onPress={() => zoomBy(1.25)}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Zoom in\"\n style={styles.zoomBtn}\n >\n <Text style={styles.zoomBtnGlyph}>+</Text>\n </GHPressable>\n </View>\n <View style={styles.headerRule} />\n <GHPressable\n onPress={() => setAgentOpen(true)}\n style={styles.askAgentBtn}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Ask agent\"\n >\n <MaterialCommunityIcons name=\"creation\" size={16} color=\"#64748b\" />\n </GHPressable>\n </View>\n ) : null}\n <View\n style={styles.canvasPlane}\n onLayout={(e) => {\n const { width, height } = e.nativeEvent.layout;\n if (width > 0 && height > 0) setViewport({ width, height });\n }}\n >\n <DotGrid />\n <GestureDetector gesture={gesture}>\n {/* Full-screen hit target so empty-canvas pan still works; items sit on the 1px plane. */}\n <View style={StyleSheet.absoluteFill} collapsable={false}>\n <Animated.View\n style={[styles.plane, planeStyle, { transformOrigin: '0 0' }]}\n pointerEvents=\"box-none\"\n >\n {ordered.map((item) =>\n item.id === selectedId ? (\n <SelectedItem\n key={item.id}\n item={item}\n cameraScale={scale}\n onCommit={handleCommit}\n onTap={onItemPress}\n showToolbar={controls}\n onAction={onItemAction}\n onRemove={() => {\n commitItems(removeItem(items, item.id));\n setSelectedId(null);\n }}\n onChromeTouch={armChromeTouch}\n />\n ) : (\n <StaticItem key={item.id} item={item} onTap={handleSelect} />\n ),\n )}\n </Animated.View>\n </View>\n </GestureDetector>\n {items.length === 0 ? (\n <View style={styles.emptyHint} pointerEvents=\"none\">\n <Text style={styles.emptyHintTitle}>Your canvas is empty</Text>\n <Text style={styles.emptyHintDetail}>\n Tap Generate below for an image, video, audio, slides, clips or a promo.\n </Text>\n </View>\n ) : null}\n {controls && !onBoardsPress ? (\n <View style={styles.zoomHud} pointerEvents=\"box-none\">\n <GHPressable\n onPress={() => zoomBy(1 / 1.25)}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Zoom out\"\n style={styles.zoomBtn}\n >\n <Text style={styles.zoomBtnGlyph}>−</Text>\n </GHPressable>\n <GHPressable\n onPress={fitBoard}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Fit board\"\n >\n <Text style={styles.zoomPct}>{zoomPct}%</Text>\n </GHPressable>\n <GHPressable\n onPress={() => zoomBy(1.25)}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Zoom in\"\n style={styles.zoomBtn}\n >\n <Text style={styles.zoomBtnGlyph}>+</Text>\n </GHPressable>\n </View>\n ) : null}\n </View>\n <CanvasAgentChatPane\n visible={agentOpen}\n onClose={() => setAgentOpen(false)}\n runAction={runAction}\n boardItems={items}\n selectedItem={items.find((it) => it.id === selectedId) ?? null}\n onGenerated={(url, meta) => onAgentGenerated?.(url, meta)}\n onReplace={(itemId, url) => onAgentReplace?.(itemId, url)}\n onOpenItem={(itemId) => {\n setSelectedId(itemId);\n setAgentOpen(false);\n }}\n onUseTemplate={onUseTemplate}\n />\n </GestureHandlerRootView>\n );\n}\n\n/** Initial zoom for a board, exposed for the screen's zoom indicator. */\nexport function initialZoomFor(_board: PersistedCanvasState, _viewportWidth: number, _viewportHeight: number): number {\n return 1;\n}\n\nconst styles = StyleSheet.create({\n viewport: { flex: 1, overflow: 'hidden', backgroundColor: '#eef1f4' },\n canvasPlane: { flex: 1, overflow: 'hidden' },\n emptyHint: {\n ...StyleSheet.absoluteFillObject,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 32,\n paddingTop: 8,\n paddingBottom: 72,\n },\n emptyHintTitle: { fontSize: 14, fontWeight: '500', color: '#0f172a', marginBottom: 6 },\n emptyHintDetail: { fontSize: 12, color: '#64748b', textAlign: 'center', maxWidth: 280, lineHeight: 17 },\n boardHeader: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n paddingHorizontal: 8,\n paddingVertical: 6,\n backgroundColor: '#ffffff',\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: '#e2e8f0',\n zIndex: 50,\n },\n boardsBtn: { flexDirection: 'row', alignItems: 'center', gap: 6, paddingHorizontal: 6, paddingVertical: 6 },\n boardsLabel: { fontSize: 12, fontWeight: '600', color: '#64748b' },\n headerRule: { width: StyleSheet.hairlineWidth, height: 16, backgroundColor: '#e2e8f0' },\n itemCount: { fontSize: 11, color: '#94a3b8', fontVariant: ['tabular-nums'] },\n headerZoom: { marginLeft: 'auto', flexDirection: 'row', alignItems: 'center', gap: 2, flexShrink: 0 },\n askAgentBtn: {\n alignItems: 'center',\n justifyContent: 'center',\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: '#e2e8f0',\n borderRadius: 8,\n width: 36,\n height: 32,\n flexShrink: 0,\n },\n askAgentLabel: { fontSize: 11, fontWeight: '600', color: '#64748b' },\n plane: { position: 'absolute', left: 0, top: 0, width: 1, height: 1, overflow: 'visible' },\n itemImage: { borderRadius: 8, backgroundColor: '#e2e8f0' },\n zoomHud: {\n position: 'absolute',\n top: 12,\n right: 12,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n paddingHorizontal: 12,\n paddingVertical: 8,\n borderRadius: 14,\n backgroundColor: '#ffffff',\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: '#e2e8f0',\n shadowColor: '#0f172a',\n shadowOpacity: 0.08,\n shadowRadius: 8,\n shadowOffset: { width: 0, height: 2 },\n elevation: 3,\n },\n selectedOverflow: { overflow: 'visible' },\n videoDragBar: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: 22,\n borderTopLeftRadius: 8,\n borderTopRightRadius: 8,\n backgroundColor: 'rgba(15, 23, 42, 0.35)',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 3,\n zIndex: 20,\n },\n videoDragGrip: { width: 3, height: 10, borderRadius: 1.5, backgroundColor: 'rgba(255,255,255,0.75)' },\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 hoverWrap: {\n position: 'absolute',\n left: 0,\n right: 0,\n bottom: '100%',\n alignItems: 'center',\n marginBottom: 4,\n zIndex: 50,\n overflow: 'visible',\n },\n hoverCluster: { alignItems: 'center', zIndex: 50 },\n hoverBar: {\n flexDirection: 'row',\n alignItems: 'center',\n maxWidth: '100%',\n overflow: 'visible',\n paddingHorizontal: 10,\n paddingVertical: 8,\n borderRadius: 14,\n backgroundColor: '#ffffff',\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: 'rgba(15,23,42,0.08)',\n shadowColor: '#0f172a',\n shadowOpacity: 0.12,\n shadowRadius: 16,\n shadowOffset: { width: 0, height: 4 },\n elevation: 6,\n },\n hoverActions: {\n flexShrink: 1,\n flexDirection: 'row',\n justifyContent: 'flex-end',\n overflow: 'hidden',\n },\n hoverActionsInner: { flexDirection: 'row', alignItems: 'center', flexShrink: 0 },\n moreWrap: { position: 'relative', flexShrink: 0, zIndex: 80 },\n editPrompt: {\n marginTop: 8,\n width: 280,\n borderRadius: 16,\n backgroundColor: '#ffffff',\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: 'rgba(15,23,42,0.08)',\n paddingHorizontal: 14,\n paddingVertical: 12,\n shadowColor: '#0f172a',\n shadowOpacity: 0.1,\n shadowRadius: 16,\n shadowOffset: { width: 0, height: 8 },\n elevation: 6,\n },\n editPromptInput: { minHeight: 44, fontSize: 15, color: '#334155', padding: 0 },\n hoverBtn: { flexDirection: 'row', alignItems: 'center', gap: 8, paddingHorizontal: 12, paddingVertical: 9 },\n hoverIconBtn: { paddingHorizontal: 10, paddingVertical: 9 },\n hoverLabel: { fontSize: 15, fontWeight: '600', color: '#334155' },\n hoverDivider: {\n width: StyleSheet.hairlineWidth,\n alignSelf: 'stretch',\n backgroundColor: '#e2e8f0',\n marginVertical: 4,\n marginHorizontal: 2,\n },\n hoverSparkle: { position: 'absolute', top: -3, right: -6 },\n moreMenu: {\n position: 'absolute',\n top: '100%',\n right: 0,\n marginTop: 8,\n zIndex: 90,\n minWidth: 176,\n borderRadius: 10,\n backgroundColor: '#ffffff',\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: 'rgba(15,23,42,0.08)',\n paddingVertical: 4,\n shadowColor: '#0f172a',\n shadowOpacity: 0.12,\n shadowRadius: 12,\n shadowOffset: { width: 0, height: 4 },\n elevation: 6,\n },\n moreRow: { flexDirection: 'row', alignItems: 'center', gap: 8, paddingHorizontal: 12, paddingVertical: 10 },\n moreLabel: { fontSize: 14, color: '#334155' },\n zoomBtn: { paddingHorizontal: 8, paddingVertical: 2 },\n zoomBtnGlyph: { fontSize: 20, color: '#334155', fontWeight: '500' },\n zoomPct: { fontSize: 15, color: '#0f172a', fontVariant: ['tabular-nums'], minWidth: 52, textAlign: 'center' },\n selectionRing: { borderColor: SELECTION_COLOR },\n handleAnchor: {\n position: 'absolute',\n width: 1,\n height: 1,\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 1,\n },\n webHandle: {\n width: 12,\n height: 12,\n marginLeft: -6,\n marginTop: -6,\n borderRadius: 2,\n backgroundColor: '#3b82f6',\n borderWidth: 1,\n borderColor: '#ffffff',\n },\n mediaTile: {\n borderRadius: 8,\n backgroundColor: '#0f172a',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 8,\n },\n mediaTileGlyph: { color: '#f8fafc', fontSize: 28, marginBottom: 4 },\n mediaTileLabel: { color: '#cbd5e1', fontSize: 11, maxWidth: '90%' },\n empty: { flex: 1, alignItems: 'center', justifyContent: 'center', backgroundColor: '#f8fafc' },\n emptyText: { color: '#64748b', fontSize: 14 },\n});\n"],"names":["React","GHPressable","_a"],"mappings":"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"}
1
+ {"version":3,"file":"NativeCanvasViewer.js","sources":["../../../src/features/canvas/NativeCanvasViewer.tsx"],"sourcesContent":["/**\n * Native canvas board — the first genuinely native slice of the canvas\n * surface. Renders a `PersistedCanvasState` board (positioned image/video/audio\n * items on a plane) with pinch-zoom and pan, and lets items be moved and\n * freely resized in place: tap to select, drag the body to move, drag a corner\n * handle to resize (opposite corner anchored, per-axis, MIN_ITEM_SIZE floor).\n *\n * Deliberately NOT a port of the web editors. The board plane is positioned\n * media (`CanvasItem`: x/y/width/height/zIndex) — it needs a transformed view,\n * not a drawing engine, so there is no Konva analogue to replace and no new\n * native dependency: `react-native-gesture-handler`, `react-native-reanimated`\n * and `expo-image` are already in the app. Konva/Skia only enter the picture\n * for the EDITORS (freehand drawing, filters), which stay on the WebView tier.\n *\n * Every gesture runs on the UI thread via reanimated shared values — camera\n * AND item edits — so panning, dragging and resizing stay at frame rate even\n * while the JS thread is busy. React state only hears about an edit once, when\n * the gesture ends (`applyItemFrame` commit), which is also when the host's\n * `onBoardChange` fires; persistence stays the host's concern.\n */\nimport React, { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';\n// Clipboard is deprecated in RN core but still works on 0.79 (chat's MessageActionBar uses it too).\nimport { Alert, Clipboard, Share, StyleSheet, Text, TextInput, View, useWindowDimensions } from 'react-native';\nimport {\n Gesture,\n GestureDetector,\n GestureHandlerRootView,\n Pressable as GHPressable,\n} from 'react-native-gesture-handler';\nimport Animated, {\n runOnJS,\n useAnimatedReaction,\n useAnimatedStyle,\n useSharedValue,\n type SharedValue,\n} from 'react-native-reanimated';\nimport { Image } from 'expo-image';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { getVideoItemRenderer } from './videoRenderer';\nimport {\n applyItemFrame,\n boardBounds,\n coerceUploadSizedItem,\n paintOrder,\n removeItem,\n resizeFrame,\n spreadStackedItems,\n MAX_ZOOM,\n MIN_ZOOM,\n type CanvasItem,\n type ItemFrame,\n type PersistedCanvasState,\n type ResizeCorner,\n} from './canvasCore';\nimport { CanvasAgentChatPane } from './CanvasAgentChatPane';\nimport type { GenerateLane } from './CanvasGeneratePanel';\nimport type { RunMediaAction } from './videoEditor/mediaActions';\nimport { ensureItemShareLink, shareableMediaUrl, type LinksClientOptions } from './linksRpc';\nimport { mediaPhaseLabel, renewMediaUrl, useMediaSource } from './useMediaSource';\n\nexport type CanvasItemAction =\n | 'edit-image'\n | 'mark-edit'\n | 'edit-video'\n | 'trim-video'\n | 'create-video'\n | 'edit-audio'\n | 'promo-video'\n | 'restyle-video';\n\nexport interface NativeCanvasViewerProps {\n board: PersistedCanvasState;\n /** Tap on an item — the seam where editors (WebView tier) attach later. */\n onItemPress?: (item: CanvasItem) => void;\n /** Fired once per finished drag/resize with the whole updated board.\n * The viewer keeps its own working copy; the host owns persistence. */\n onBoardChange?: (board: PersistedCanvasState) => void;\n /** Show the zoom cluster (- n% +) and the selection toolbar, like the\n * web canvas. Opt-in so screens with their own chrome (the Expo app's\n * zoom indicator) are unchanged. */\n controls?: boolean;\n /** Agent-backed toolbar actions (Edit Image, Create Video). The viewer\n * only raises the intent - what \"edit\" means is the host's business. */\n onItemAction?: (action: CanvasItemAction, item: CanvasItem) => void;\n /** Web compact header: Boards + item count + zoom cluster. */\n onBoardsPress?: () => void;\n /** Open the agent rail as soon as this board mounts (gallery AI Chat). */\n initialAgentOpen?: boolean;\n /** Hide the Generate/Library dock while the agent rail is open (web parity). */\n onAgentOpenChange?: (open: boolean) => void;\n runAction?: RunMediaAction;\n onAgentGenerated?: (\n url: string,\n meta: { prompt: string; aspect: string; mode: GenerateLane; title?: string },\n ) => CanvasItem | void;\n onAgentReplace?: (itemId: string, url: string) => void;\n /** Selected board item — edit dock / generate seed. */\n onSelectionChange?: (item: CanvasItem | null) => void;\n onUseTemplate?: (template: import('./canvasChatTemplates').CanvasPromptTemplate) => void;\n /** Session token + index URL for the Links backend. Present -> the item\n * More menu offers \"Create/Copy share link\" (web CanvasPage parity). */\n shareLinks?: LinksClientOptions;\n testID?: string;\n}\n\n/** How a failed tile renews its link - the viewer's connector runner, shared down the tree. */\nconst MediaRenewContext = createContext<((url: string) => Promise<string>) | undefined>(undefined);\n\n/** Extra invisible touch padding around each handle. */\nconst HANDLE_SLOP = 12;\nconst SELECTION_COLOR = '#3b82f6';\n\n/** Static glyph tile - the fallback for any media that cannot draw itself\n * (no registered renderer, or a renderer that throws at mount). */\nfunction MediaGlyph({ item }: { item: CanvasItem }) {\n return (\n <View style={[StyleSheet.absoluteFill, styles.mediaTile]} accessibilityLabel={`Canvas ${item.type}`}>\n <Text style={styles.mediaTileGlyph}>{item.type === 'video' ? '▶' : '♪'}</Text>\n {item.generatedAssetName ? (\n <Text numberOfLines={1} style={styles.mediaTileLabel}>\n {item.generatedAssetName}\n </Text>\n ) : null}\n </View>\n );\n}\n\n/**\n * Isolates a registered video renderer's failures to the single item.\n *\n * The renderer is expo-video, delivered by whichever lane registered it. When\n * that lane's remote JS is loaded across the microfrontend boundary onto a\n * host binary whose native ExpoVideo is absent or a different version, mounting\n * VideoView throws at render (\"View config getter ... must be a function\").\n * Without this boundary that throw escapes to the remote's loader boundary and\n * the WHOLE canvas reads \"surface unavailable\". Here it degrades to the glyph\n * tile - the exact fallback used when no renderer is registered at all - so a\n * board with one bad video still opens.\n */\nclass VideoRenderIsland extends React.Component<\n { fallback: React.ReactNode; children: React.ReactNode },\n { failed: boolean }\n> {\n state = { failed: false };\n\n static getDerivedStateFromError() {\n return { failed: true };\n }\n\n componentDidCatch(error: unknown) {\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[NativeCanvasViewer] video renderer failed, using glyph:', error);\n }\n }\n\n render() {\n return this.state.failed ? this.props.fallback : this.props.children;\n }\n}\n\n/** The media content of an item, frame-agnostic — shared by the static and\n * the selected (animated) renderers. */\nfunction ItemContent({ item }: { item: CanvasItem }) {\n if (item.type === 'image') return <ImageItemContent item={item} />;\n const VideoRenderer = item.type === 'video' ? getVideoItemRenderer() : null;\n if (VideoRenderer) {\n return (\n <VideoRenderIsland fallback={<MediaGlyph item={item} />}>\n <VideoRenderer item={item} />\n </VideoRenderIsland>\n );\n }\n return <MediaGlyph item={item} />;\n}\n\n/**\n * An image tile that survives a dead link (web `useMediaSource`): the first\n * load error renews a presigned link once, then the shared re-check retries\n * in the background; a status chip replaces the broken-image look meanwhile.\n */\nfunction ImageItemContent({ item }: { item: CanvasItem }) {\n const renew = useContext(MediaRenewContext);\n const media = useMediaSource(item.src, 'image', renew);\n const status = mediaPhaseLabel(media.phase);\n return (\n <>\n {media.phase === 'broken' ? (\n <View style={[StyleSheet.absoluteFill, styles.mediaTile]}>\n <MaterialCommunityIcons name=\"image-off-outline\" size={28} color=\"#94a3b8\" />\n </View>\n ) : (\n <Image\n key={media.key}\n source={{ uri: media.src }}\n style={[StyleSheet.absoluteFill, styles.itemImage]}\n contentFit=\"cover\"\n transition={120}\n onError={media.onError}\n accessibilityLabel={item.generatedAssetName ?? 'Canvas image'}\n />\n )}\n {status ? (\n <View style={styles.mediaStatus} pointerEvents=\"none\">\n <Text style={styles.mediaStatusLabel}>{status}</Text>\n </View>\n ) : null}\n </>\n );\n}\n\n/** A non-selected item: static frame, tap to select. */\nfunction StaticItem({ item, onTap }: { item: CanvasItem; onTap: (item: CanvasItem) => void }) {\n const tap = Gesture.Tap()\n .runOnJS(true)\n .blocksExternalGesture()\n .onEnd(() => onTap(item));\n\n return (\n <GestureDetector gesture={tap}>\n <View\n style={{\n position: 'absolute',\n left: item.x,\n top: item.y,\n width: item.width,\n height: item.height,\n zIndex: item.zIndex,\n overflow: 'hidden',\n borderRadius: 8,\n }}\n >\n <ItemContent item={item} />\n </View>\n </GestureDetector>\n );\n}\n\nconst CORNERS: ResizeCorner[] = ['tl', 'tr', 'bl', 'br'];\n\nfunction ItemHoverToolbar({\n item,\n onAction,\n onRemove,\n onShareLink,\n onChromeTouch,\n}: {\n item: CanvasItem;\n onAction?: NativeCanvasViewerProps['onItemAction'];\n onRemove: () => void;\n /** Present only when this item's media can be shared. */\n onShareLink?: () => void;\n onChromeTouch: () => void;\n}) {\n const [moreOpen, setMoreOpen] = useState(false);\n const [promptOpen, setPromptOpen] = useState(false);\n const [prompt, setPrompt] = useState('');\n\n const download = useCallback(() => {\n setMoreOpen(false);\n void Share.share({ url: item.src, message: item.src }).catch(() => undefined);\n }, [item.src]);\n\n // RNGH Pressable is a native button, so Native() actually activates and\n // can block the full-screen empty-plane tap. RN Pressable cannot.\n const stealTouches = useMemo(() => Gesture.Native().blocksExternalGesture(), []);\n\n return (\n <View style={styles.hoverWrap} pointerEvents=\"box-none\">\n <GestureDetector gesture={stealTouches}>\n <View style={styles.hoverCluster} pointerEvents=\"auto\" onTouchStart={onChromeTouch}>\n <View style={styles.hoverBar}>\n {/* Web clips the left of this row on a phone so the 3-dots stay on screen. */}\n <View style={styles.hoverActions}>\n <View style={styles.hoverActionsInner}>\n {item.type === 'image' ? (\n <>\n <GHPressable\n onPress={() => {\n setMoreOpen(false);\n setPromptOpen((v) => !v);\n }}\n style={styles.hoverBtn}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"pencil-outline\" size={20} color=\"#64748b\" />\n <Text style={styles.hoverLabel} numberOfLines={1}>\n Edit Image\n </Text>\n </GHPressable>\n <GHPressable\n onPress={() => {\n setMoreOpen(false);\n setPromptOpen(false);\n onAction?.('edit-image', item);\n }}\n style={styles.hoverBtn}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"content-cut\" size={20} color=\"#64748b\" />\n <Text style={styles.hoverLabel}>Editor</Text>\n </GHPressable>\n <GHPressable\n onPress={() => {\n setMoreOpen(false);\n setPromptOpen(false);\n onAction?.('mark-edit', item);\n }}\n style={styles.hoverBtn}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"marker\" size={20} color=\"#64748b\" />\n <Text style={styles.hoverLabel}>Mark & edit</Text>\n </GHPressable>\n </>\n ) : null}\n {item.type === 'video' ? (\n <GHPressable\n onPress={() => {\n setMoreOpen(false);\n onAction?.('edit-video', item);\n }}\n style={styles.hoverBtn}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"content-cut\" size={20} color=\"#64748b\" />\n <Text style={styles.hoverLabel}>Edit Video</Text>\n </GHPressable>\n ) : null}\n {item.type === 'audio' ? (\n <GHPressable\n onPress={() => {\n setMoreOpen(false);\n onAction?.('edit-audio', item);\n }}\n style={styles.hoverBtn}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"content-cut\" size={20} color=\"#64748b\" />\n <Text style={styles.hoverLabel}>Edit Audio</Text>\n </GHPressable>\n ) : null}\n <View style={styles.hoverDivider} />\n <GHPressable\n onPress={() => {\n setMoreOpen(false);\n onAction?.('create-video', item);\n }}\n style={styles.hoverBtn}\n accessibilityRole=\"button\"\n >\n <View>\n <MaterialCommunityIcons name=\"video-outline\" size={20} color=\"#64748b\" />\n <MaterialCommunityIcons\n name=\"star-four-points\"\n size={8}\n color=\"#94a3b8\"\n style={styles.hoverSparkle}\n />\n </View>\n <Text style={styles.hoverLabel}>Create Video</Text>\n </GHPressable>\n {item.type === 'video' ? (\n <GHPressable\n onPress={() => {\n setMoreOpen(false);\n onAction?.('restyle-video', item);\n }}\n style={styles.hoverBtn}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"auto-fix\" size={20} color=\"#64748b\" />\n <Text style={styles.hoverLabel}>Restyle</Text>\n </GHPressable>\n ) : null}\n {item.type === 'image' || item.type === 'video' ? (\n <GHPressable\n onPress={() => {\n setMoreOpen(false);\n onAction?.('promo-video', item);\n }}\n style={styles.hoverBtn}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"bullhorn-outline\" size={20} color=\"#64748b\" />\n <Text style={styles.hoverLabel}>Promo</Text>\n </GHPressable>\n ) : null}\n {item.type === 'video' ? (\n <>\n <View style={styles.hoverDivider} />\n <GHPressable\n onPress={() => {\n setMoreOpen(false);\n onAction?.('trim-video', item);\n }}\n style={styles.hoverBtn}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons\n name=\"movie-open-outline\"\n size={20}\n color=\"#64748b\"\n />\n <Text style={styles.hoverLabel}>Clips</Text>\n </GHPressable>\n </>\n ) : null}\n <View style={styles.hoverDivider} />\n <GHPressable\n onPress={download}\n style={styles.hoverIconBtn}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Download\"\n >\n <MaterialCommunityIcons name=\"download-outline\" size={20} color=\"#94a3b8\" />\n </GHPressable>\n </View>\n </View>\n <View style={styles.hoverDivider} />\n <View style={styles.moreWrap}>\n <GHPressable\n onPress={() => {\n setPromptOpen(false);\n setMoreOpen((v) => !v);\n }}\n style={styles.hoverIconBtn}\n accessibilityRole=\"button\"\n accessibilityLabel=\"More\"\n >\n <MaterialCommunityIcons name=\"dots-vertical\" size={20} color=\"#94a3b8\" />\n </GHPressable>\n {moreOpen ? (\n <View style={styles.moreMenu}>\n <GHPressable\n onPress={() => {\n setMoreOpen(false);\n onRemove();\n }}\n style={styles.moreRow}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"trash-can-outline\" size={20} color=\"#64748b\" />\n <Text style={styles.moreLabel}>Remove</Text>\n </GHPressable>\n <GHPressable onPress={download} style={styles.moreRow} accessibilityRole=\"button\">\n <MaterialCommunityIcons name=\"download-outline\" size={20} color=\"#64748b\" />\n <Text style={styles.moreLabel}>Download</Text>\n </GHPressable>\n {onShareLink ? (\n <GHPressable\n onPress={() => {\n setMoreOpen(false);\n onShareLink();\n }}\n style={styles.moreRow}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"link-variant\" size={20} color=\"#64748b\" />\n <Text style={styles.moreLabel}>\n {item.share ? 'Copy share link' : 'Create share link'}\n </Text>\n </GHPressable>\n ) : null}\n </View>\n ) : null}\n </View>\n </View>\n {promptOpen && item.type === 'image' ? (\n <View style={styles.editPrompt}>\n <TextInput\n value={prompt}\n onChangeText={setPrompt}\n placeholder=\"Describe how to edit this image…\"\n placeholderTextColor=\"#94a3b8\"\n multiline\n style={styles.editPromptInput}\n />\n </View>\n ) : null}\n </View>\n </GestureDetector>\n </View>\n );\n}\n\nfunction DotGrid() {\n return (\n <View pointerEvents=\"none\" style={styles.dots}>\n {Array.from({ length: 40 }).map((_, row) => (\n <View key={row} style={styles.dotRow}>\n {Array.from({ length: 24 }).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\ninterface SelectedItemProps {\n item: CanvasItem;\n /** Camera scale — converts screen-space gesture deltas to board units. */\n cameraScale: SharedValue<number>;\n onCommit: (id: string, frame: ItemFrame) => void;\n onTap?: (item: CanvasItem) => void;\n showToolbar?: boolean;\n onAction?: NativeCanvasViewerProps['onItemAction'];\n onRemove: () => void;\n onShareLink?: () => void;\n onChromeTouch: () => void;\n}\n\n/**\n * The selected item: its frame lives in shared values so drags and resizes\n * track the finger on the UI thread; React state is only told on gesture end.\n */\nfunction SelectedItem({\n item,\n cameraScale,\n onCommit,\n onTap,\n showToolbar,\n onAction,\n onRemove,\n onShareLink,\n onChromeTouch,\n}: SelectedItemProps) {\n const fx = useSharedValue(item.x);\n const fy = useSharedValue(item.y);\n const fw = useSharedValue(item.width);\n const fh = useSharedValue(item.height);\n // Frame snapshot at gesture start, so deltas compose instead of drifting.\n const start = useSharedValue<ItemFrame>({ x: item.x, y: item.y, width: item.width, height: item.height });\n\n // Selecting a different item reuses this component instance.\n useEffect(() => {\n fx.value = item.x;\n fy.value = item.y;\n fw.value = item.width;\n fh.value = item.height;\n // Shared values are stable refs; the item fields are the real inputs.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [item.id, item.x, item.y, item.width, item.height]);\n\n const commit = useCallback(\n (frame: ItemFrame) => {\n onCommit(item.id, frame);\n },\n [item.id, onCommit],\n );\n\n const snapshot = () => {\n 'worklet';\n\n start.value = { x: fx.value, y: fy.value, width: fw.value, height: fh.value };\n };\n\n const finish = () => {\n 'worklet';\n\n runOnJS(commit)({ x: fx.value, y: fy.value, width: fw.value, height: fh.value });\n };\n\n // Drag the body to move. One finger only, so two fingers stay pinch-zoom.\n const drag = Gesture.Pan()\n .maxPointers(1)\n .onStart(snapshot)\n .onUpdate((e) => {\n 'worklet';\n\n const s = cameraScale.value;\n fx.value = start.value.x + e.translationX / s;\n fy.value = start.value.y + e.translationY / s;\n })\n .onEnd(finish);\n\n const tap = Gesture.Tap()\n .runOnJS(true)\n .blocksExternalGesture()\n .onEnd(() => onTap?.(item));\n\n const bodyGesture = item.type === 'video' || item.type === 'audio' ? null : Gesture.Exclusive(tap, drag);\n\n const frameStyle = useAnimatedStyle(() => ({\n position: 'absolute',\n left: fx.value,\n top: fy.value,\n width: fw.value,\n height: fh.value,\n // Editing brings the item above its neighbours for the duration.\n zIndex: 99999,\n }));\n\n const ringStyle = useAnimatedStyle(() => ({\n borderWidth: 2 / cameraScale.value,\n borderRadius: 8 / cameraScale.value,\n }));\n\n // One resize pan per corner, built once per selected item. Not hooks, so\n // building them in a memoised map is safe.\n const cornerGestures = useMemo(\n () =>\n CORNERS.map((corner) =>\n Gesture.Pan()\n .maxPointers(1)\n .onStart(snapshot)\n .onUpdate((e) => {\n 'worklet';\n\n const s = cameraScale.value;\n const next = resizeFrame(start.value, corner, e.translationX / s, e.translationY / s);\n fx.value = next.x;\n fy.value = next.y;\n fw.value = next.width;\n fh.value = next.height;\n })\n .onEnd(finish),\n ),\n // Shared values and worklets are stable; rebuild only when the target changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [item.id],\n );\n\n const handleStyle = styles.webHandle;\n\n const cornerPlacement: Record<ResizeCorner, object> = {\n tl: { left: 0, top: 0 },\n tr: { right: 0, top: 0 },\n bl: { left: 0, bottom: 0 },\n br: { right: 0, bottom: 0 },\n };\n\n const media = (\n <View style={[StyleSheet.absoluteFill, { overflow: 'hidden', borderRadius: 8 }]}>\n <ItemContent item={item} />\n <Animated.View pointerEvents=\"none\" style={[StyleSheet.absoluteFill, styles.selectionRing, ringStyle]} />\n </View>\n );\n\n return (\n <Animated.View style={[frameStyle, styles.selectedOverflow]}>\n {bodyGesture ? <GestureDetector gesture={bodyGesture}>{media}</GestureDetector> : media}\n {(item.type === 'video' || item.type === 'audio') && (\n <GestureDetector gesture={drag}>\n <View style={styles.videoDragBar} accessibilityLabel=\"Drag to move\">\n <View style={styles.videoDragGrip} />\n <View style={styles.videoDragGrip} />\n <View style={styles.videoDragGrip} />\n </View>\n </GestureDetector>\n )}\n {CORNERS.map((corner, i) => (\n <GestureDetector key={corner} gesture={cornerGestures[i]}>\n <View style={[styles.handleAnchor, cornerPlacement[corner]]} hitSlop={HANDLE_SLOP}>\n <View style={handleStyle} />\n </View>\n </GestureDetector>\n ))}\n {showToolbar ? (\n <ItemHoverToolbar\n item={item}\n onAction={onAction}\n onRemove={onRemove}\n onShareLink={onShareLink}\n onChromeTouch={onChromeTouch}\n />\n ) : null}\n </Animated.View>\n );\n}\n\nexport function NativeCanvasViewer({\n board,\n onItemPress,\n onBoardChange,\n controls,\n onItemAction,\n onBoardsPress,\n initialAgentOpen = false,\n onAgentOpenChange,\n runAction,\n onAgentGenerated,\n onAgentReplace,\n onSelectionChange,\n onUseTemplate,\n shareLinks,\n testID,\n}: NativeCanvasViewerProps) {\n const { width: winW, height: winH } = useWindowDimensions();\n const [viewport, setViewport] = useState({ width: winW, height: winH });\n\n // Working copy of the board's items — edits land here on gesture end.\n // Exactly-stacked items (the default add frame) are fanned into a row for\n // display, or every file after the first would be invisible.\n const [items, setItems] = useState<readonly CanvasItem[]>(() =>\n spreadStackedItems(board.items.map(coerceUploadSizedItem)),\n );\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [agentOpen, setAgentOpen] = useState(initialAgentOpen);\n useEffect(() => {\n onAgentOpenChange?.(agentOpen);\n }, [agentOpen, onAgentOpenChange]);\n useEffect(() => {\n onSelectionChange?.(selectedId ? (items.find((it) => it.id === selectedId) ?? null) : null);\n }, [selectedId, items, onSelectionChange]);\n const boardMediaKey = board.items.map((it) => `${it.id}\\t${it.src}`).join('\\0');\n const prevItemIdsRef = useRef<Set<string>>(new Set(board.items.map((it) => it.id)));\n\n const ordered = useMemo(() => paintOrder(items), [items]);\n\n // Camera: scale + translation, driven on the UI thread.\n const scale = useSharedValue(1);\n const tx = useSharedValue(0);\n const ty = useSharedValue(0);\n // Gesture-start snapshots, so pinch/pan compose instead of fighting.\n const startScale = useSharedValue(1);\n const startTx = useSharedValue(0);\n const startTy = useSharedValue(0);\n\n const applyCamera = (list: readonly CanvasItem[]) => {\n const fit = boardBounds(list);\n if (!fit) {\n scale.value = 1;\n tx.value = 0;\n ty.value = 0;\n return;\n }\n const boardW = Math.max(1, fit.maxX - fit.minX);\n const boardH = Math.max(1, fit.maxY - fit.minY);\n // Web opens at 100% and pans. Fitting a 500px card into a 390px phone\n // was shrinking the in-plane item toolbar to ~69%.\n scale.value = 1;\n tx.value = (viewport.width - boardW) / 2 - fit.minX;\n ty.value = (viewport.height - boardH) / 2 - fit.minY;\n };\n\n useEffect(() => {\n const spread = spreadStackedItems(board.items.map(coerceUploadSizedItem));\n const prevIds = prevItemIdsRef.current;\n const added = spread.filter((it) => !prevIds.has(it.id));\n const removedCount = [...prevIds].filter((id) => !spread.some((s) => s.id === id)).length;\n const appended = added.length > 0 && removedCount === 0 && spread.length > prevIds.size;\n prevItemIdsRef.current = new Set(spread.map((it) => it.id));\n setItems(spread);\n setSelectedId(appended ? added[added.length - 1].id : null);\n applyCamera(spread);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [boardMediaKey]);\n\n useEffect(() => {\n applyCamera(items);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [viewport.width, viewport.height]);\n\n const handleCommit = useCallback(\n (id: string, frame: ItemFrame) => {\n setItems((prev) => {\n const next = applyItemFrame(prev, id, frame);\n const snapshot = { ...board, items: next };\n // Parent setState must not run inside this updater — React treats\n // it as rendering NativeCanvasViewer and throws.\n queueMicrotask(() => onBoardChange?.(snapshot));\n return next;\n });\n },\n [board, onBoardChange],\n );\n\n const handleSelect = useCallback(\n (item: CanvasItem) => {\n setSelectedId(item.id);\n onItemPress?.(item);\n },\n [onItemPress],\n );\n\n // Toolbar buttons sit on the full-screen pan/tap plane. RNGH Pressable\n // plus a brief deselect lock keeps 3-dots from clearing the selection.\n const skipDeselectUntil = useRef(0);\n const armChromeTouch = useCallback(() => {\n skipDeselectUntil.current = Date.now() + 400;\n }, []);\n const handleBackgroundTap = useCallback(\n (absX: number, absY: number) => {\n if (Date.now() < skipDeselectUntil.current) return;\n const item = selectedId ? items.find((it) => it.id === selectedId) : undefined;\n if (item) {\n const s = scale.value;\n const left = item.x * s + tx.value;\n const top = item.y * s + ty.value;\n // Toolbar sits just above the photo; treat that band as chrome.\n if (\n absX >= left &&\n absX <= left + item.width * s &&\n absY >= top - 80 &&\n absY <= top + item.height * s\n ) {\n return;\n }\n }\n setSelectedId(null);\n },\n [items, selectedId],\n );\n\n // Live zoom readout for the controls - rounded on the UI thread so React\n // hears only whole-percent changes, not every gesture frame.\n const [zoomPct, setZoomPct] = useState(100);\n useAnimatedReaction(\n () => Math.round(scale.value * 100),\n (pct, prev) => {\n if (pct !== prev) runOnJS(setZoomPct)(pct);\n },\n );\n\n /** Zoom about the viewport centre - the button twin of the pinch. */\n const zoomBy = useCallback(\n (factor: number) => {\n const next = Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, scale.value * factor));\n const ratio = next / scale.value;\n const cx = viewport.width / 2;\n const cy = viewport.height / 2;\n tx.value = cx - (cx - tx.value) * ratio;\n ty.value = cy - (cy - ty.value) * ratio;\n scale.value = next;\n },\n // Shared values are stable refs.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [viewport.width, viewport.height],\n );\n\n /** Tap the percentage to reset to 100%, matching the web zoom cluster. */\n const fitBoard = useCallback(() => {\n applyCamera(items);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [items, viewport.width, viewport.height]);\n\n const commitItems = useCallback(\n (next: readonly CanvasItem[]) => {\n setItems(next);\n onBoardChange?.({ ...board, items: [...next] });\n },\n [board, onBoardChange],\n );\n\n const renewMedia = useMemo(() => renewMediaUrl(runAction), [runAction]);\n\n // Web CanvasPage `handleShareLink`: re-sign before minting, re-point a link\n // whose destination lapses within a day, store it on `item.share`.\n const sharingRef = useRef(false);\n const handleShareLink = useCallback(\n async (id: string) => {\n const item = items.find((it) => it.id === id);\n if (!item || !shareLinks || sharingRef.current) return;\n sharingRef.current = true;\n let shortUrl: string;\n try {\n const result = await ensureItemShareLink(item, { links: shareLinks, run: runAction });\n shortUrl = result.share.shortUrl;\n if (result.changed) {\n setItems((prev) => {\n const next = prev.map((it) =>\n it.id === id ? { ...it, src: result.src, share: result.share } : it,\n );\n const snapshot = { ...board, items: next };\n queueMicrotask(() => onBoardChange?.(snapshot));\n return next;\n });\n }\n } catch (err) {\n Alert.alert('Could not create share link', err instanceof Error ? err.message : undefined);\n return;\n } finally {\n sharingRef.current = false;\n }\n Clipboard.setString(shortUrl);\n Alert.alert('Share link copied', shortUrl, [\n {\n text: 'Share…',\n onPress: () => void Share.share({ message: shortUrl, url: shortUrl }).catch(() => undefined),\n },\n { text: 'OK', style: 'cancel' },\n ]);\n },\n [items, shareLinks, runAction, board, onBoardChange],\n );\n\n const pan = Gesture.Pan()\n .minDistance(10)\n .averageTouches(true)\n .onStart(() => {\n startTx.value = tx.value;\n startTy.value = ty.value;\n })\n .onUpdate((e) => {\n tx.value = startTx.value + e.translationX;\n ty.value = startTy.value + e.translationY;\n });\n\n const pinch = Gesture.Pinch()\n .onStart(() => {\n startScale.value = scale.value;\n startTx.value = tx.value;\n startTy.value = ty.value;\n })\n .onUpdate((e) => {\n 'worklet';\n\n const raw = startScale.value * e.scale;\n const next = Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, raw));\n // Zoom about the pinch focal point: keep the board point under the\n // fingers stationary while the scale changes around it.\n const ratio = next / startScale.value;\n tx.value = e.focalX - (e.focalX - startTx.value) * ratio;\n ty.value = e.focalY - (e.focalY - startTy.value) * ratio;\n scale.value = next;\n });\n\n // Tap on empty plane clears the selection; item taps win by being deeper.\n const backgroundTap = Gesture.Tap()\n .runOnJS(true)\n .onEnd((e) => {\n handleBackgroundTap(e.absoluteX, e.absoluteY);\n });\n\n const gesture = Gesture.Simultaneous(pan, pinch, backgroundTap);\n\n const planeStyle = useAnimatedStyle(() => ({\n transform: [{ translateX: tx.value }, { translateY: ty.value }, { scale: scale.value }] as const,\n }));\n\n // Empty boards still render the pan/zoom plane so Canvas Native opens as a\n // canvas, not a placeholder.\n\n return (\n // Self-sufficient gesture root: hosts differ in whether they wrap\n // screens in GestureHandlerRootView (the Expo app's canvas screen\n // does not), and GestureDetector throws without one. Nesting under a\n // host-provided root is safe.\n <GestureHandlerRootView\n style={styles.viewport}\n testID={testID}\n onLayout={(e) => {\n const { width, height } = e.nativeEvent.layout;\n if (width > 0 && height > 0) setViewport({ width, height });\n }}\n >\n {onBoardsPress ? (\n <View style={styles.boardHeader}>\n <GHPressable\n onPress={onBoardsPress}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Boards\"\n style={styles.boardsBtn}\n >\n <MaterialCommunityIcons name=\"view-grid-outline\" size={16} color=\"#64748b\" />\n <Text style={styles.boardsLabel}>Boards</Text>\n </GHPressable>\n <View style={styles.headerRule} />\n <Text style={styles.itemCount}>\n {items.length} {items.length === 1 ? 'item' : 'items'}\n </Text>\n <View style={styles.headerZoom}>\n <GHPressable\n onPress={() => zoomBy(1 / 1.25)}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Zoom out\"\n style={styles.zoomBtn}\n >\n <Text style={styles.zoomBtnGlyph}>−</Text>\n </GHPressable>\n <GHPressable\n onPress={fitBoard}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Fit board\"\n >\n <Text style={styles.zoomPct}>{zoomPct}%</Text>\n </GHPressable>\n <GHPressable\n onPress={() => zoomBy(1.25)}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Zoom in\"\n style={styles.zoomBtn}\n >\n <Text style={styles.zoomBtnGlyph}>+</Text>\n </GHPressable>\n </View>\n <View style={styles.headerRule} />\n <GHPressable\n onPress={() => setAgentOpen(true)}\n style={styles.askAgentBtn}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Ask agent\"\n >\n <MaterialCommunityIcons name=\"creation\" size={16} color=\"#64748b\" />\n </GHPressable>\n </View>\n ) : null}\n <View\n style={styles.canvasPlane}\n onLayout={(e) => {\n const { width, height } = e.nativeEvent.layout;\n if (width > 0 && height > 0) setViewport({ width, height });\n }}\n >\n <DotGrid />\n <GestureDetector gesture={gesture}>\n {/* Full-screen hit target so empty-canvas pan still works; items sit on the 1px plane. */}\n <View style={StyleSheet.absoluteFill} collapsable={false}>\n <MediaRenewContext.Provider value={renewMedia}>\n <Animated.View\n style={[styles.plane, planeStyle, { transformOrigin: '0 0' }]}\n pointerEvents=\"box-none\"\n >\n {ordered.map((item) =>\n item.id === selectedId ? (\n <SelectedItem\n key={item.id}\n item={item}\n cameraScale={scale}\n onCommit={handleCommit}\n onTap={onItemPress}\n showToolbar={controls}\n onAction={onItemAction}\n onRemove={() => {\n commitItems(removeItem(items, item.id));\n setSelectedId(null);\n }}\n onShareLink={\n shareLinks && shareableMediaUrl(item.src)\n ? () => void handleShareLink(item.id)\n : undefined\n }\n onChromeTouch={armChromeTouch}\n />\n ) : (\n <StaticItem key={item.id} item={item} onTap={handleSelect} />\n ),\n )}\n </Animated.View>\n </MediaRenewContext.Provider>\n </View>\n </GestureDetector>\n {items.length === 0 ? (\n <View style={styles.emptyHint} pointerEvents=\"none\">\n <Text style={styles.emptyHintTitle}>Your canvas is empty</Text>\n <Text style={styles.emptyHintDetail}>\n Tap Generate below for an image, video, audio, slides, clips or a promo.\n </Text>\n </View>\n ) : null}\n {controls && !onBoardsPress ? (\n <View style={styles.zoomHud} pointerEvents=\"box-none\">\n <GHPressable\n onPress={() => zoomBy(1 / 1.25)}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Zoom out\"\n style={styles.zoomBtn}\n >\n <Text style={styles.zoomBtnGlyph}>−</Text>\n </GHPressable>\n <GHPressable\n onPress={fitBoard}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Fit board\"\n >\n <Text style={styles.zoomPct}>{zoomPct}%</Text>\n </GHPressable>\n <GHPressable\n onPress={() => zoomBy(1.25)}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Zoom in\"\n style={styles.zoomBtn}\n >\n <Text style={styles.zoomBtnGlyph}>+</Text>\n </GHPressable>\n </View>\n ) : null}\n </View>\n <CanvasAgentChatPane\n visible={agentOpen}\n onClose={() => setAgentOpen(false)}\n runAction={runAction}\n boardItems={items}\n selectedItem={items.find((it) => it.id === selectedId) ?? null}\n onGenerated={(url, meta) => onAgentGenerated?.(url, meta)}\n onReplace={(itemId, url) => onAgentReplace?.(itemId, url)}\n onOpenItem={(itemId) => {\n setSelectedId(itemId);\n setAgentOpen(false);\n }}\n onUseTemplate={onUseTemplate}\n />\n </GestureHandlerRootView>\n );\n}\n\n/** Initial zoom for a board, exposed for the screen's zoom indicator. */\nexport function initialZoomFor(_board: PersistedCanvasState, _viewportWidth: number, _viewportHeight: number): number {\n return 1;\n}\n\nconst styles = StyleSheet.create({\n viewport: { flex: 1, overflow: 'hidden', backgroundColor: '#eef1f4' },\n canvasPlane: { flex: 1, overflow: 'hidden' },\n emptyHint: {\n ...StyleSheet.absoluteFillObject,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 32,\n paddingTop: 8,\n paddingBottom: 72,\n },\n emptyHintTitle: { fontSize: 14, fontWeight: '500', color: '#0f172a', marginBottom: 6 },\n emptyHintDetail: { fontSize: 12, color: '#64748b', textAlign: 'center', maxWidth: 280, lineHeight: 17 },\n boardHeader: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n paddingHorizontal: 8,\n paddingVertical: 6,\n backgroundColor: '#ffffff',\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: '#e2e8f0',\n zIndex: 50,\n },\n boardsBtn: { flexDirection: 'row', alignItems: 'center', gap: 6, paddingHorizontal: 6, paddingVertical: 6 },\n boardsLabel: { fontSize: 12, fontWeight: '600', color: '#64748b' },\n headerRule: { width: StyleSheet.hairlineWidth, height: 16, backgroundColor: '#e2e8f0' },\n itemCount: { fontSize: 11, color: '#94a3b8', fontVariant: ['tabular-nums'] },\n headerZoom: { marginLeft: 'auto', flexDirection: 'row', alignItems: 'center', gap: 2, flexShrink: 0 },\n askAgentBtn: {\n alignItems: 'center',\n justifyContent: 'center',\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: '#e2e8f0',\n borderRadius: 8,\n width: 36,\n height: 32,\n flexShrink: 0,\n },\n askAgentLabel: { fontSize: 11, fontWeight: '600', color: '#64748b' },\n plane: { position: 'absolute', left: 0, top: 0, width: 1, height: 1, overflow: 'visible' },\n itemImage: { borderRadius: 8, backgroundColor: '#e2e8f0' },\n mediaStatus: {\n position: 'absolute',\n left: 8,\n bottom: 8,\n paddingHorizontal: 8,\n paddingVertical: 3,\n borderRadius: 6,\n backgroundColor: 'rgba(15,23,42,0.7)',\n },\n mediaStatusLabel: { fontSize: 11, fontWeight: '600', color: '#f8fafc' },\n zoomHud: {\n position: 'absolute',\n top: 12,\n right: 12,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n paddingHorizontal: 12,\n paddingVertical: 8,\n borderRadius: 14,\n backgroundColor: '#ffffff',\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: '#e2e8f0',\n shadowColor: '#0f172a',\n shadowOpacity: 0.08,\n shadowRadius: 8,\n shadowOffset: { width: 0, height: 2 },\n elevation: 3,\n },\n selectedOverflow: { overflow: 'visible' },\n videoDragBar: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: 22,\n borderTopLeftRadius: 8,\n borderTopRightRadius: 8,\n backgroundColor: 'rgba(15, 23, 42, 0.35)',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 3,\n zIndex: 20,\n },\n videoDragGrip: { width: 3, height: 10, borderRadius: 1.5, backgroundColor: 'rgba(255,255,255,0.75)' },\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 hoverWrap: {\n position: 'absolute',\n left: 0,\n right: 0,\n bottom: '100%',\n alignItems: 'center',\n marginBottom: 4,\n zIndex: 50,\n overflow: 'visible',\n },\n hoverCluster: { alignItems: 'center', zIndex: 50 },\n hoverBar: {\n flexDirection: 'row',\n alignItems: 'center',\n maxWidth: '100%',\n overflow: 'visible',\n paddingHorizontal: 10,\n paddingVertical: 8,\n borderRadius: 14,\n backgroundColor: '#ffffff',\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: 'rgba(15,23,42,0.08)',\n shadowColor: '#0f172a',\n shadowOpacity: 0.12,\n shadowRadius: 16,\n shadowOffset: { width: 0, height: 4 },\n elevation: 6,\n },\n hoverActions: {\n flexShrink: 1,\n flexDirection: 'row',\n justifyContent: 'flex-end',\n overflow: 'hidden',\n },\n hoverActionsInner: { flexDirection: 'row', alignItems: 'center', flexShrink: 0 },\n moreWrap: { position: 'relative', flexShrink: 0, zIndex: 80 },\n editPrompt: {\n marginTop: 8,\n width: 280,\n borderRadius: 16,\n backgroundColor: '#ffffff',\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: 'rgba(15,23,42,0.08)',\n paddingHorizontal: 14,\n paddingVertical: 12,\n shadowColor: '#0f172a',\n shadowOpacity: 0.1,\n shadowRadius: 16,\n shadowOffset: { width: 0, height: 8 },\n elevation: 6,\n },\n editPromptInput: { minHeight: 44, fontSize: 15, color: '#334155', padding: 0 },\n hoverBtn: { flexDirection: 'row', alignItems: 'center', gap: 8, paddingHorizontal: 12, paddingVertical: 9 },\n hoverIconBtn: { paddingHorizontal: 10, paddingVertical: 9 },\n hoverLabel: { fontSize: 15, fontWeight: '600', color: '#334155' },\n hoverDivider: {\n width: StyleSheet.hairlineWidth,\n alignSelf: 'stretch',\n backgroundColor: '#e2e8f0',\n marginVertical: 4,\n marginHorizontal: 2,\n },\n hoverSparkle: { position: 'absolute', top: -3, right: -6 },\n moreMenu: {\n position: 'absolute',\n top: '100%',\n right: 0,\n marginTop: 8,\n zIndex: 90,\n minWidth: 176,\n borderRadius: 10,\n backgroundColor: '#ffffff',\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: 'rgba(15,23,42,0.08)',\n paddingVertical: 4,\n shadowColor: '#0f172a',\n shadowOpacity: 0.12,\n shadowRadius: 12,\n shadowOffset: { width: 0, height: 4 },\n elevation: 6,\n },\n moreRow: { flexDirection: 'row', alignItems: 'center', gap: 8, paddingHorizontal: 12, paddingVertical: 10 },\n moreLabel: { fontSize: 14, color: '#334155' },\n zoomBtn: { paddingHorizontal: 8, paddingVertical: 2 },\n zoomBtnGlyph: { fontSize: 20, color: '#334155', fontWeight: '500' },\n zoomPct: { fontSize: 15, color: '#0f172a', fontVariant: ['tabular-nums'], minWidth: 52, textAlign: 'center' },\n selectionRing: { borderColor: SELECTION_COLOR },\n handleAnchor: {\n position: 'absolute',\n width: 1,\n height: 1,\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 1,\n },\n webHandle: {\n width: 12,\n height: 12,\n marginLeft: -6,\n marginTop: -6,\n borderRadius: 2,\n backgroundColor: '#3b82f6',\n borderWidth: 1,\n borderColor: '#ffffff',\n },\n mediaTile: {\n borderRadius: 8,\n backgroundColor: '#0f172a',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 8,\n },\n mediaTileGlyph: { color: '#f8fafc', fontSize: 28, marginBottom: 4 },\n mediaTileLabel: { color: '#cbd5e1', fontSize: 11, maxWidth: '90%' },\n empty: { flex: 1, alignItems: 'center', justifyContent: 'center', backgroundColor: '#f8fafc' },\n emptyText: { color: '#64748b', fontSize: 14 },\n});\n"],"names":["React","GHPressable","_a"],"mappings":";;;;;;;;;;;;;;;;;;;;AAyEA,MAAM,iBAAA,GAAoB,cAA8D,MAAS,CAAA;AAGjG,MAAM,WAAc,GAAA,EAAA;AACpB,MAAM,eAAkB,GAAA,SAAA;AAIxB,SAAS,UAAW,CAAA;AAAA,EAClB;AACF,CAEG,EAAA;AACD,EAAA,uBAAQ,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,UAAW,CAAA,YAAA,EAAc,MAAO,CAAA,SAAS,CAAG,EAAA,kBAAA,EAAoB,CAAU,OAAA,EAAA,IAAA,CAAK,IAAI,CAC9F,CAAA,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,IAAA,EAAA,EAAK,OAAO,MAAO,CAAA,cAAA,EAAiB,eAAK,IAAS,KAAA,OAAA,GAAU,WAAM,QAAI,EAAA,CAAA;AAAA,IACtE,IAAA,CAAK,kBAAqB,mBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,aAAA,EAAe,CAAG,EAAA,KAAA,EAAO,MAAO,CAAA,cAAA,EACxD,QAAK,EAAA,IAAA,CAAA,kBAAA,EACV,CAAU,GAAA;AAAA,GAClB,EAAA,CAAA;AACR;AAcA,MAAM,iBAAA,SAA0BA,eAAM,SAKnC,CAAA;AAAA,EALH,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAME,IAAQ,aAAA,CAAA,IAAA,EAAA,OAAA,EAAA;AAAA,MACN,MAAQ,EAAA;AAAA,KACV,CAAA;AAAA;AAAA,EACA,OAAO,wBAA2B,GAAA;AAChC,IAAO,OAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACV;AAAA;AACF,EACA,kBAAkB,KAAgB,EAAA;AAChC,IAAA,IAAI,OAAS,EAAA;AAEX,MAAQ,OAAA,CAAA,IAAA,CAAK,4DAA4D,KAAK,CAAA;AAAA;AAChF;AACF,EACA,MAAS,GAAA;AACP,IAAA,OAAO,KAAK,KAAM,CAAA,MAAA,GAAS,KAAK,KAAM,CAAA,QAAA,GAAW,KAAK,KAAM,CAAA,QAAA;AAAA;AAEhE;AAIA,SAAS,WAAY,CAAA;AAAA,EACnB;AACF,CAEG,EAAA;AACD,EAAA,IAAI,KAAK,IAAS,KAAA,OAAA,EAAgB,uBAAA,GAAA,CAAC,oBAAiB,IAAY,EAAA,CAAA;AAChE,EAAA,MAAM,aAAgB,GAAA,IAAA,CAAK,IAAS,KAAA,OAAA,GAAU,sBAAyB,GAAA,IAAA;AACvE,EAAA,IAAI,aAAe,EAAA;AACjB,IAAO,uBAAA,GAAA,CAAC,iBAAkB,EAAA,EAAA,QAAA,kBAAW,GAAA,CAAA,UAAA,EAAA,EAAW,MAAY,CAChD,EAAA,QAAA,kBAAA,GAAA,CAAC,aAAc,EAAA,EAAA,IAAA,EAAY,CAC/B,EAAA,CAAA;AAAA;AAEV,EAAO,uBAAA,GAAA,CAAC,cAAW,IAAY,EAAA,CAAA;AACjC;AAOA,SAAS,gBAAiB,CAAA;AAAA,EACxB;AACF,CAEG,EAAA;AA7JH,EAAA,IAAA,EAAA;AA8JE,EAAM,MAAA,KAAA,GAAQ,WAAW,iBAAiB,CAAA;AAC1C,EAAA,MAAM,KAAQ,GAAA,cAAA,CAAe,IAAK,CAAA,GAAA,EAAK,SAAS,KAAK,CAAA;AACrD,EAAM,MAAA,MAAA,GAAS,eAAgB,CAAA,KAAA,CAAM,KAAK,CAAA;AAC1C,EAAA,uBACW,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,IAAM,KAAA,CAAA,KAAA,KAAU,2BAAY,GAAA,CAAA,IAAA,EAAA,EAAK,OAAO,CAAC,UAAA,CAAW,YAAc,EAAA,MAAA,CAAO,SAAS,CAAA,EAC3E,8BAAC,sBAAuB,EAAA,EAAA,IAAA,EAAK,mBAAoB,EAAA,IAAA,EAAM,EAAI,EAAA,KAAA,EAAM,WAAU,CAC/E,EAAA,CAAA,mBAAW,GAAA,CAAA,KAAA,EAAA,EAAsB,MAAQ,EAAA;AAAA,MACnD,KAAK,KAAM,CAAA;AAAA,KACb,EAAG,OAAO,CAAC,UAAA,CAAW,cAAc,MAAO,CAAA,SAAS,GAAG,UAAW,EAAA,OAAA,EAAQ,YAAY,GAAK,EAAA,OAAA,EAAS,MAAM,OAAS,EAAA,kBAAA,EAAA,CAAoB,UAAK,kBAAL,KAAA,IAAA,GAAA,EAAA,GAA2B,cAFhI,EAAA,EAAA,KAAA,CAAM,GAE0I,CAAA;AAAA,IACzK,MAAS,mBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,OAAO,WAAa,EAAA,aAAA,EAAc,MACjD,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,MAAA,CAAO,gBAAmB,EAAA,QAAA,EAAA,MAAA,EAAO,GAClD,CAAU,GAAA;AAAA,GAClB,EAAA,CAAA;AACR;AAGA,SAAS,UAAW,CAAA;AAAA,EAClB,IAAA;AAAA,EACA;AACF,CAGG,EAAA;AACD,EAAA,MAAM,GAAM,GAAA,OAAA,CAAQ,GAAI,EAAA,CAAE,OAAQ,CAAA,IAAI,CAAE,CAAA,qBAAA,EAAwB,CAAA,KAAA,CAAM,MAAM,KAAA,CAAM,IAAI,CAAC,CAAA;AACvF,EAAA,2BAAQ,eAAgB,EAAA,EAAA,OAAA,EAAS,GACvB,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAO,EAAA;AAAA,IACnB,QAAU,EAAA,UAAA;AAAA,IACV,MAAM,IAAK,CAAA,CAAA;AAAA,IACX,KAAK,IAAK,CAAA,CAAA;AAAA,IACV,OAAO,IAAK,CAAA,KAAA;AAAA,IACZ,QAAQ,IAAK,CAAA,MAAA;AAAA,IACb,QAAQ,IAAK,CAAA,MAAA;AAAA,IACb,QAAU,EAAA,QAAA;AAAA,IACV,YAAc,EAAA;AAAA,GAEJ,EAAA,QAAA,kBAAA,GAAA,CAAC,WAAY,EAAA,EAAA,IAAA,EAAY,GAC7B,CACJ,EAAA,CAAA;AACR;AACA,MAAM,OAA0B,GAAA,CAAC,IAAM,EAAA,IAAA,EAAM,MAAM,IAAI,CAAA;AACvD,SAAS,gBAAiB,CAAA;AAAA,EACxB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAOG,EAAA;AACD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,EAAE,CAAA;AACvC,EAAM,MAAA,QAAA,GAAW,YAAY,MAAM;AACjC,IAAA,WAAA,CAAY,KAAK,CAAA;AACjB,IAAA,KAAK,MAAM,KAAM,CAAA;AAAA,MACf,KAAK,IAAK,CAAA,GAAA;AAAA,MACV,SAAS,IAAK,CAAA;AAAA,KACf,CAAA,CAAE,KAAM,CAAA,MAAM,MAAS,CAAA;AAAA,GACvB,EAAA,CAAC,IAAK,CAAA,GAAG,CAAC,CAAA;AAIb,EAAM,MAAA,YAAA,GAAe,QAAQ,MAAM,OAAA,CAAQ,QAAS,CAAA,qBAAA,EAAyB,EAAA,EAAE,CAAA;AAC/E,EAAA,2BAAQ,IAAK,EAAA,EAAA,KAAA,EAAO,OAAO,SAAW,EAAA,aAAA,EAAc,YAC1C,QAAC,kBAAA,GAAA,CAAA,eAAA,EAAA,EAAgB,SAAS,YACtB,EAAA,QAAA,kBAAA,IAAA,CAAC,QAAK,KAAO,EAAA,MAAA,CAAO,cAAc,aAAc,EAAA,MAAA,EAAO,cAAc,aACjE,EAAA,QAAA,EAAA;AAAA,oBAAC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,QAEhB,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,IAAA,EAAA,EAAK,OAAO,MAAO,CAAA,YAAA,EAChB,+BAAC,IAAK,EAAA,EAAA,KAAA,EAAO,OAAO,iBACf,EAAA,QAAA,EAAA;AAAA,QAAK,IAAA,CAAA,IAAA,KAAS,0BACP,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,0BAAC,IAAA,CAAAC,SAAA,EAAA,EAAY,SAAS,MAAM;AAClD,YAAA,WAAA,CAAY,KAAK,CAAA;AACjB,YAAc,aAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAAA,WACpB,EAAA,KAAA,EAAO,MAAO,CAAA,QAAA,EAAU,mBAAkB,QACjB,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,gBAAA,EAAiB,IAAM,EAAA,EAAA,EAAI,OAAM,SAAU,EAAA,CAAA;AAAA,gCACvE,IAAK,EAAA,EAAA,KAAA,EAAO,OAAO,UAAY,EAAA,aAAA,EAAe,GAAG,QAElD,EAAA,YAAA,EAAA;AAAA,WACJ,EAAA,CAAA;AAAA,0BACA,IAAA,CAACA,SAAY,EAAA,EAAA,OAAA,EAAS,MAAM;AAClD,YAAA,WAAA,CAAY,KAAK,CAAA;AACjB,YAAA,aAAA,CAAc,KAAK,CAAA;AACnB,YAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAW,YAAc,EAAA,IAAA,CAAA;AAAA,WACxB,EAAA,KAAA,EAAO,MAAO,CAAA,QAAA,EAAU,mBAAkB,QACjB,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,aAAA,EAAc,IAAM,EAAA,EAAA,EAAI,OAAM,SAAU,EAAA,CAAA;AAAA,4BACpE,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,YAAY,QAAM,EAAA,QAAA,EAAA;AAAA,WAC1C,EAAA,CAAA;AAAA,0BACA,IAAA,CAACA,SAAY,EAAA,EAAA,OAAA,EAAS,MAAM;AAClD,YAAA,WAAA,CAAY,KAAK,CAAA;AACjB,YAAA,aAAA,CAAc,KAAK,CAAA;AACnB,YAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAW,WAAa,EAAA,IAAA,CAAA;AAAA,WACvB,EAAA,KAAA,EAAO,MAAO,CAAA,QAAA,EAAU,mBAAkB,QACjB,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,QAAA,EAAS,IAAM,EAAA,EAAA,EAAI,OAAM,SAAU,EAAA,CAAA;AAAA,4BAC/D,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,YAAY,QAAW,EAAA,aAAA,EAAA;AAAA,WAC/C,EAAA;AAAA,SAAA,EACJ,CAAM,GAAA,IAAA;AAAA,QACT,KAAK,IAAS,KAAA,OAAA,mBAAW,IAAA,CAAAA,SAAA,EAAA,EAAY,SAAS,MAAM;AACrE,UAAA,WAAA,CAAY,KAAK,CAAA;AACjB,UAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAW,YAAc,EAAA,IAAA,CAAA;AAAA,SACxB,EAAA,KAAA,EAAO,MAAO,CAAA,QAAA,EAAU,mBAAkB,QACnB,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,aAAA,EAAc,IAAM,EAAA,EAAA,EAAI,OAAM,SAAU,EAAA,CAAA;AAAA,0BACpE,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,YAAY,QAAU,EAAA,YAAA,EAAA;AAAA,SAAA,EAC9C,CAAiB,GAAA,IAAA;AAAA,QACpB,KAAK,IAAS,KAAA,OAAA,mBAAW,IAAA,CAAAA,SAAA,EAAA,EAAY,SAAS,MAAM;AACrE,UAAA,WAAA,CAAY,KAAK,CAAA;AACjB,UAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAW,YAAc,EAAA,IAAA,CAAA;AAAA,SACxB,EAAA,KAAA,EAAO,MAAO,CAAA,QAAA,EAAU,mBAAkB,QACnB,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,aAAA,EAAc,IAAM,EAAA,EAAA,EAAI,OAAM,SAAU,EAAA,CAAA;AAAA,0BACpE,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,YAAY,QAAU,EAAA,YAAA,EAAA;AAAA,SAAA,EAC9C,CAAiB,GAAA,IAAA;AAAA,wBACpB,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,YAAc,EAAA,CAAA;AAAA,wBAClC,IAAA,CAACA,SAAY,EAAA,EAAA,OAAA,EAAS,MAAM;AAC5C,UAAA,WAAA,CAAY,KAAK,CAAA;AACjB,UAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAW,cAAgB,EAAA,IAAA,CAAA;AAAA,SAC1B,EAAA,KAAA,EAAO,MAAO,CAAA,QAAA,EAAU,mBAAkB,QACvB,EAAA,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,IACG,EAAA,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,eAAA,EAAgB,IAAM,EAAA,EAAA,EAAI,OAAM,SAAU,EAAA,CAAA;AAAA,4BACvE,GAAA,CAAC,sBAAuB,EAAA,EAAA,IAAA,EAAK,kBAAmB,EAAA,IAAA,EAAM,GAAG,KAAM,EAAA,SAAA,EAAU,KAAO,EAAA,MAAA,CAAO,YAAc,EAAA;AAAA,WACzG,EAAA,CAAA;AAAA,0BACC,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,YAAY,QAAY,EAAA,cAAA,EAAA;AAAA,SAChD,EAAA,CAAA;AAAA,QACC,KAAK,IAAS,KAAA,OAAA,mBAAW,IAAA,CAAAA,SAAA,EAAA,EAAY,SAAS,MAAM;AACrE,UAAA,WAAA,CAAY,KAAK,CAAA;AACjB,UAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAW,eAAiB,EAAA,IAAA,CAAA;AAAA,SAC3B,EAAA,KAAA,EAAO,MAAO,CAAA,QAAA,EAAU,mBAAkB,QACnB,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,UAAA,EAAW,IAAM,EAAA,EAAA,EAAI,OAAM,SAAU,EAAA,CAAA;AAAA,0BACjE,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,YAAY,QAAO,EAAA,SAAA,EAAA;AAAA,SAAA,EAC3C,CAAiB,GAAA,IAAA;AAAA,QACpB,IAAA,CAAK,SAAS,OAAW,IAAA,IAAA,CAAK,SAAS,OAAU,mBAAA,IAAA,CAACA,SAAY,EAAA,EAAA,OAAA,EAAS,MAAM;AAC9F,UAAA,WAAA,CAAY,KAAK,CAAA;AACjB,UAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAW,aAAe,EAAA,IAAA,CAAA;AAAA,SACzB,EAAA,KAAA,EAAO,MAAO,CAAA,QAAA,EAAU,mBAAkB,QACnB,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,kBAAA,EAAmB,IAAM,EAAA,EAAA,EAAI,OAAM,SAAU,EAAA,CAAA;AAAA,0BACzE,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,YAAY,QAAK,EAAA,OAAA,EAAA;AAAA,SAAA,EACzC,CAAiB,GAAA,IAAA;AAAA,QACpB,IAAA,CAAK,IAAS,KAAA,OAAA,mBACP,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,0BAAC,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,YAAc,EAAA,CAAA;AAAA,0BAClC,IAAA,CAACA,SAAY,EAAA,EAAA,OAAA,EAAS,MAAM;AAClD,YAAA,WAAA,CAAY,KAAK,CAAA;AACjB,YAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAW,YAAc,EAAA,IAAA,CAAA;AAAA,WACxB,EAAA,KAAA,EAAO,MAAO,CAAA,QAAA,EAAU,mBAAkB,QACjB,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,oBAAA,EAAqB,IAAM,EAAA,EAAA,EAAI,OAAM,SAAU,EAAA,CAAA;AAAA,4BAC3E,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,YAAY,QAAK,EAAA,OAAA,EAAA;AAAA,WACzC,EAAA;AAAA,SAAA,EACJ,CAAM,GAAA,IAAA;AAAA,wBACT,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,YAAc,EAAA,CAAA;AAAA,4BACjCA,SAAY,EAAA,EAAA,OAAA,EAAS,UAAU,KAAO,EAAA,MAAA,CAAO,cAAc,iBAAkB,EAAA,QAAA,EAAS,oBAAmB,UACtG,EAAA,QAAA,kBAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,kBAAA,EAAmB,MAAM,EAAI,EAAA,KAAA,EAAM,WAAU,CAC9E,EAAA;AAAA,OAAA,EACJ,CACJ,EAAA,CAAA;AAAA,sBACC,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,YAAc,EAAA,CAAA;AAAA,sBACjC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,QAChB,EAAA,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAAA,SAAA,EAAA,EAAY,SAAS,MAAM;AAC1C,UAAA,aAAA,CAAc,KAAK,CAAA;AACnB,UAAY,WAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA;AAAA,WAClB,KAAO,EAAA,MAAA,CAAO,YAAc,EAAA,iBAAA,EAAkB,UAAS,kBAAmB,EAAA,MAAA,EACzD,QAAC,kBAAA,GAAA,CAAA,sBAAA,EAAA,EAAuB,MAAK,eAAgB,EAAA,IAAA,EAAM,EAAI,EAAA,KAAA,EAAM,WAAU,CAC3E,EAAA,CAAA;AAAA,QACC,QAAW,mBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,OAAO,QACxB,EAAA,QAAA,EAAA;AAAA,0BAAC,IAAA,CAAAA,SAAA,EAAA,EAAY,SAAS,MAAM;AAChD,YAAA,WAAA,CAAY,KAAK,CAAA;AACjB,YAAS,QAAA,EAAA;AAAA,WACR,EAAA,KAAA,EAAO,MAAO,CAAA,OAAA,EAAS,mBAAkB,QAClB,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,mBAAA,EAAoB,IAAM,EAAA,EAAA,EAAI,OAAM,SAAU,EAAA,CAAA;AAAA,4BAC1E,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,WAAW,QAAM,EAAA,QAAA,EAAA;AAAA,WACzC,EAAA,CAAA;AAAA,0BACA,IAAA,CAACA,aAAY,OAAS,EAAA,QAAA,EAAU,OAAO,MAAO,CAAA,OAAA,EAAS,mBAAkB,QACrE,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,kBAAA,EAAmB,IAAM,EAAA,EAAA,EAAI,OAAM,SAAU,EAAA,CAAA;AAAA,4BACzE,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,WAAW,QAAQ,EAAA,UAAA,EAAA;AAAA,WAC3C,EAAA,CAAA;AAAA,UACC,WAAc,mBAAA,IAAA,CAACA,SAAY,EAAA,EAAA,OAAA,EAAS,MAAM;AAC/D,YAAA,WAAA,CAAY,KAAK,CAAA;AACjB,YAAY,WAAA,EAAA;AAAA,WACX,EAAA,KAAA,EAAO,MAAO,CAAA,OAAA,EAAS,mBAAkB,QACd,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,cAAA,EAAe,IAAM,EAAA,EAAA,EAAI,OAAM,SAAU,EAAA,CAAA;AAAA,4BACtE,GAAA,CAAC,QAAK,KAAO,EAAA,MAAA,CAAO,WACf,QAAK,EAAA,IAAA,CAAA,KAAA,GAAQ,oBAAoB,mBACtC,EAAA;AAAA,WAAA,EACJ,CAAiB,GAAA;AAAA,SAAA,EACzB,CAAU,GAAA;AAAA,OAClB,EAAA;AAAA,KACJ,EAAA,CAAA;AAAA,IACC,UAAA,IAAc,IAAK,CAAA,IAAA,KAAS,OAAU,mBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,MAAA,CAAO,UACnD,EAAA,QAAA,kBAAA,GAAA,CAAC,SAAU,EAAA,EAAA,KAAA,EAAO,QAAQ,YAAc,EAAA,SAAA,EAAW,WAAY,EAAA,uCAAA,EAAmC,oBAAqB,EAAA,SAAA,EAAU,SAAS,EAAA,IAAA,EAAC,KAAO,EAAA,MAAA,CAAO,eAAiB,EAAA,CAAA,EAC9K,CAAU,GAAA;AAAA,GAAA,EAClB,GACJ,CACJ,EAAA,CAAA;AACR;AACA,SAAS,OAAU,GAAA;AACjB,EAAO,uBAAA,GAAA,CAAC,QAAK,aAAc,EAAA,MAAA,EAAO,OAAO,MAAO,CAAA,IAAA,EACrC,gBAAM,IAAK,CAAA;AAAA,IAClB,MAAQ,EAAA;AAAA,GACT,CAAA,CAAE,GAAI,CAAA,CAAC,CAAG,EAAA,GAAA,qBAAS,GAAA,CAAA,IAAA,EAAA,EAAe,KAAO,EAAA,MAAA,CAAO,MAChC,EAAA,QAAA,EAAA,KAAA,CAAM,IAAK,CAAA;AAAA,IACxB,MAAQ,EAAA;AAAA,GACT,EAAE,GAAI,CAAA,CAAC,IAAI,GAAQ,qBAAA,GAAA,CAAC,IAAe,EAAA,EAAA,KAAA,EAAO,MAAO,CAAA,OAAA,EAC5B,8BAAC,IAAK,EAAA,EAAA,KAAA,EAAO,OAAO,GAAK,EAAA,CAAA,EAAA,EADhB,GAEb,CAAO,CAAA,EAAA,EALG,GAMlB,CAAO,CACf,EAAA,CAAA;AACR;AAkBA,SAAS,YAAa,CAAA;AAAA,EACpB,IAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAsB,EAAA;AACpB,EAAM,MAAA,EAAA,GAAK,cAAe,CAAA,IAAA,CAAK,CAAC,CAAA;AAChC,EAAM,MAAA,EAAA,GAAK,cAAe,CAAA,IAAA,CAAK,CAAC,CAAA;AAChC,EAAM,MAAA,EAAA,GAAK,cAAe,CAAA,IAAA,CAAK,KAAK,CAAA;AACpC,EAAM,MAAA,EAAA,GAAK,cAAe,CAAA,IAAA,CAAK,MAAM,CAAA;AAErC,EAAA,MAAM,QAAQ,cAA0B,CAAA;AAAA,IACtC,GAAG,IAAK,CAAA,CAAA;AAAA,IACR,GAAG,IAAK,CAAA,CAAA;AAAA,IACR,OAAO,IAAK,CAAA,KAAA;AAAA,IACZ,QAAQ,IAAK,CAAA;AAAA,GACd,CAAA;AAGD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,EAAA,CAAG,QAAQ,IAAK,CAAA,CAAA;AAChB,IAAA,EAAA,CAAG,QAAQ,IAAK,CAAA,CAAA;AAChB,IAAA,EAAA,CAAG,QAAQ,IAAK,CAAA,KAAA;AAChB,IAAA,EAAA,CAAG,QAAQ,IAAK,CAAA,MAAA;AAAA,GAGf,EAAA,CAAC,IAAK,CAAA,EAAA,EAAI,IAAK,CAAA,CAAA,EAAG,IAAK,CAAA,CAAA,EAAG,IAAK,CAAA,KAAA,EAAO,IAAK,CAAA,MAAM,CAAC,CAAA;AACrD,EAAM,MAAA,MAAA,GAAS,WAAY,CAAA,CAAC,KAAqB,KAAA;AAC/C,IAAS,QAAA,CAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AAAA,GACtB,EAAA,CAAC,IAAK,CAAA,EAAA,EAAI,QAAQ,CAAC,CAAA;AACtB,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,SAAA;AAEA,IAAA,KAAA,CAAM,KAAQ,GAAA;AAAA,MACZ,GAAG,EAAG,CAAA,KAAA;AAAA,MACN,GAAG,EAAG,CAAA,KAAA;AAAA,MACN,OAAO,EAAG,CAAA,KAAA;AAAA,MACV,QAAQ,EAAG,CAAA;AAAA,KACb;AAAA,GACF;AACA,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,SAAA;AAEA,IAAA,OAAA,CAAQ,MAAM,CAAE,CAAA;AAAA,MACd,GAAG,EAAG,CAAA,KAAA;AAAA,MACN,GAAG,EAAG,CAAA,KAAA;AAAA,MACN,OAAO,EAAG,CAAA,KAAA;AAAA,MACV,QAAQ,EAAG,CAAA;AAAA,KACZ,CAAA;AAAA,GACH;AAGA,EAAM,MAAA,IAAA,GAAO,OAAQ,CAAA,GAAA,EAAM,CAAA,WAAA,CAAY,CAAC,CAAA,CAAE,OAAQ,CAAA,QAAQ,CAAE,CAAA,QAAA,CAAS,CAAK,CAAA,KAAA;AACxE,IAAA,SAAA;AAEA,IAAA,MAAM,IAAI,WAAY,CAAA,KAAA;AACtB,IAAA,EAAA,CAAG,KAAQ,GAAA,KAAA,CAAM,KAAM,CAAA,CAAA,GAAI,EAAE,YAAe,GAAA,CAAA;AAC5C,IAAA,EAAA,CAAG,KAAQ,GAAA,KAAA,CAAM,KAAM,CAAA,CAAA,GAAI,EAAE,YAAe,GAAA,CAAA;AAAA,GAC7C,CAAE,CAAA,KAAA,CAAM,MAAM,CAAA;AACf,EAAA,MAAM,GAAM,GAAA,OAAA,CAAQ,GAAI,EAAA,CAAE,OAAQ,CAAA,IAAI,CAAE,CAAA,qBAAA,EAAwB,CAAA,KAAA,CAAM,MAAM,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAQ,IAAK,CAAA,CAAA;AACzF,EAAM,MAAA,WAAA,GAAc,IAAK,CAAA,IAAA,KAAS,OAAW,IAAA,IAAA,CAAK,IAAS,KAAA,OAAA,GAAU,IAAO,GAAA,OAAA,CAAQ,SAAU,CAAA,GAAA,EAAK,IAAI,CAAA;AACvG,EAAM,MAAA,UAAA,GAAa,iBAAiB,OAAO;AAAA,IACzC,QAAU,EAAA,UAAA;AAAA,IACV,MAAM,EAAG,CAAA,KAAA;AAAA,IACT,KAAK,EAAG,CAAA,KAAA;AAAA,IACR,OAAO,EAAG,CAAA,KAAA;AAAA,IACV,QAAQ,EAAG,CAAA,KAAA;AAAA;AAAA,IAEX,MAAQ,EAAA;AAAA,GACR,CAAA,CAAA;AACF,EAAM,MAAA,SAAA,GAAY,iBAAiB,OAAO;AAAA,IACxC,WAAA,EAAa,IAAI,WAAY,CAAA,KAAA;AAAA,IAC7B,YAAA,EAAc,IAAI,WAAY,CAAA;AAAA,GAC9B,CAAA,CAAA;AAIF,EAAA,MAAM,cAAiB,GAAA,OAAA;AAAA,IAAQ,MAAM,OAAA,CAAQ,GAAI,CAAA,CAAA,MAAA,KAAU,QAAQ,GAAI,EAAA,CAAE,WAAY,CAAA,CAAC,CAAE,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAE,SAAS,CAAK,CAAA,KAAA;AACtH,MAAA,SAAA;AAEA,MAAA,MAAM,IAAI,WAAY,CAAA,KAAA;AACtB,MAAM,MAAA,IAAA,GAAO,WAAY,CAAA,KAAA,CAAM,KAAO,EAAA,MAAA,EAAQ,EAAE,YAAe,GAAA,CAAA,EAAG,CAAE,CAAA,YAAA,GAAe,CAAC,CAAA;AACpF,MAAA,EAAA,CAAG,QAAQ,IAAK,CAAA,CAAA;AAChB,MAAA,EAAA,CAAG,QAAQ,IAAK,CAAA,CAAA;AAChB,MAAA,EAAA,CAAG,QAAQ,IAAK,CAAA,KAAA;AAChB,MAAA,EAAA,CAAG,QAAQ,IAAK,CAAA,MAAA;AAAA,KACjB,CAAA,CAAE,KAAM,CAAA,MAAM,CAAC,CAAA;AAAA;AAAA;AAAA,IAGhB,CAAC,KAAK,EAAE;AAAA,GAAC;AACT,EAAA,MAAM,cAAc,MAAO,CAAA,SAAA;AAC3B,EAAA,MAAM,eAAgD,GAAA;AAAA,IACpD,EAAI,EAAA;AAAA,MACF,IAAM,EAAA,CAAA;AAAA,MACN,GAAK,EAAA;AAAA,KACP;AAAA,IACA,EAAI,EAAA;AAAA,MACF,KAAO,EAAA,CAAA;AAAA,MACP,GAAK,EAAA;AAAA,KACP;AAAA,IACA,EAAI,EAAA;AAAA,MACF,IAAM,EAAA,CAAA;AAAA,MACN,MAAQ,EAAA;AAAA,KACV;AAAA,IACA,EAAI,EAAA;AAAA,MACF,KAAO,EAAA,CAAA;AAAA,MACP,MAAQ,EAAA;AAAA;AACV,GACF;AACA,EAAA,MAAM,wBAAS,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,WAAW,YAAc,EAAA;AAAA,IACnD,QAAU,EAAA,QAAA;AAAA,IACV,YAAc,EAAA;AAAA,GACf,CACS,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,eAAY,IAAY,EAAA,CAAA;AAAA,oBACxB,GAAA,CAAA,QAAA,CAAS,IAAT,EAAA,EAAc,aAAc,EAAA,MAAA,EAAO,KAAO,EAAA,CAAC,UAAW,CAAA,YAAA,EAAc,MAAO,CAAA,aAAA,EAAe,SAAS,CAAG,EAAA;AAAA,GAC3G,EAAA,CAAA;AACN,EAAO,uBAAA,IAAA,CAAC,SAAS,IAAT,EAAA,EAAc,OAAO,CAAC,UAAA,EAAY,MAAO,CAAA,gBAAgB,CACtD,EAAA,QAAA,EAAA;AAAA,IAAA,WAAA,mBAAe,GAAA,CAAA,eAAA,EAAA,EAAgB,OAAS,EAAA,WAAA,EAAc,iBAAM,CAAqB,GAAA,KAAA;AAAA,IAAA,CAChF,KAAK,IAAS,KAAA,OAAA,IAAW,IAAK,CAAA,IAAA,KAAS,4BAAa,GAAA,CAAA,eAAA,EAAA,EAAgB,OAAS,EAAA,IAAA,EACvE,+BAAC,IAAK,EAAA,EAAA,KAAA,EAAO,MAAO,CAAA,YAAA,EAAc,oBAAmB,cACjD,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,aAAe,EAAA,CAAA;AAAA,sBAClC,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,aAAe,EAAA,CAAA;AAAA,sBAClC,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,aAAe,EAAA;AAAA,KAAA,EACvC,CACJ,EAAA,CAAA;AAAA,IACH,OAAQ,CAAA,GAAA,CAAI,CAAC,MAAA,EAAQ,CAAM,qBAAA,GAAA,CAAC,eAA6B,EAAA,EAAA,OAAA,EAAS,cAAe,CAAA,CAAC,CAC3E,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,CAAC,MAAO,CAAA,YAAA,EAAc,eAAgB,CAAA,MAAM,CAAC,CAAA,EAAG,OAAS,EAAA,WAAA,EAClE,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,WAAA,EAAa,CAC9B,EAAA,CAAA,EAAA,EAH0C,MAI9C,CAAkB,CAAA;AAAA,IACrB,WAAA,uBAAe,gBAAiB,EAAA,EAAA,IAAA,EAAY,UAAoB,QAAoB,EAAA,WAAA,EAA0B,eAA8B,CAAK,GAAA;AAAA,GACtJ,EAAA,CAAA;AACR;AACO,SAAS,kBAAmB,CAAA;AAAA,EACjC,KAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAmB,GAAA,KAAA;AAAA,EACnB,iBAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAA4B,EAAA;AA1hB5B,EAAA,IAAA,EAAA;AA2hBE,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,IAAA;AAAA,IACP,MAAQ,EAAA;AAAA,MACN,mBAAoB,EAAA;AACxB,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAS,CAAA;AAAA,IACvC,KAAO,EAAA,IAAA;AAAA,IACP,MAAQ,EAAA;AAAA,GACT,CAAA;AAKD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAgC,CAAA,MAAM,kBAAmB,CAAA,KAAA,CAAM,KAAM,CAAA,GAAA,CAAI,qBAAqB,CAAC,CAAC,CAAA;AAC1H,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAwB,IAAI,CAAA;AAChE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,gBAAgB,CAAA;AAC3D,EAAA,SAAA,CAAU,MAAM;AACd,IAAoB,iBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,iBAAA,CAAA,SAAA,CAAA;AAAA,GACnB,EAAA,CAAC,SAAW,EAAA,iBAAiB,CAAC,CAAA;AACjC,EAAA,SAAA,CAAU,MAAM;AA7iBlB,IAAAC,IAAAA,GAAAA;AA8iBI,IAAoB,iBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,iBAAA,CAAA,UAAA,GAAA,CAAaA,GAAA,GAAA,KAAA,CAAM,IAAK,CAAA,CAAA,EAAA,KAAM,EAAG,CAAA,EAAA,KAAO,UAAU,CAAA,KAArC,IAAAA,GAAAA,GAAAA,GAA0C,IAAO,GAAA,IAAA,CAAA;AAAA,GACjF,EAAA,CAAC,UAAY,EAAA,KAAA,EAAO,iBAAiB,CAAC,CAAA;AACzC,EAAA,MAAM,aAAgB,GAAA,KAAA,CAAM,KAAM,CAAA,GAAA,CAAI,QAAM,CAAG,EAAA,EAAA,CAAG,EAAE,CAAA,CAAA,EAAK,EAAG,CAAA,GAAG,CAAE,CAAA,CAAA,CAAE,KAAK,IAAI,CAAA;AAC5E,EAAM,MAAA,cAAA,GAAiB,MAAoB,CAAA,IAAI,GAAI,CAAA,KAAA,CAAM,KAAM,CAAA,GAAA,CAAI,CAAM,EAAA,KAAA,EAAA,CAAG,EAAE,CAAC,CAAC,CAAA;AAChF,EAAM,MAAA,OAAA,GAAU,QAAQ,MAAM,UAAA,CAAW,KAAK,CAAG,EAAA,CAAC,KAAK,CAAC,CAAA;AAGxD,EAAM,MAAA,KAAA,GAAQ,eAAe,CAAC,CAAA;AAC9B,EAAM,MAAA,EAAA,GAAK,eAAe,CAAC,CAAA;AAC3B,EAAM,MAAA,EAAA,GAAK,eAAe,CAAC,CAAA;AAE3B,EAAM,MAAA,UAAA,GAAa,eAAe,CAAC,CAAA;AACnC,EAAM,MAAA,OAAA,GAAU,eAAe,CAAC,CAAA;AAChC,EAAM,MAAA,OAAA,GAAU,eAAe,CAAC,CAAA;AAChC,EAAM,MAAA,WAAA,GAAc,CAAC,IAAgC,KAAA;AACnD,IAAM,MAAA,GAAA,GAAM,YAAY,IAAI,CAAA;AAC5B,IAAA,IAAI,CAAC,GAAK,EAAA;AACR,MAAA,KAAA,CAAM,KAAQ,GAAA,CAAA;AACd,MAAA,EAAA,CAAG,KAAQ,GAAA,CAAA;AACX,MAAA,EAAA,CAAG,KAAQ,GAAA,CAAA;AACX,MAAA;AAAA;AAEF,IAAA,MAAM,SAAS,IAAK,CAAA,GAAA,CAAI,GAAG,GAAI,CAAA,IAAA,GAAO,IAAI,IAAI,CAAA;AAC9C,IAAA,MAAM,SAAS,IAAK,CAAA,GAAA,CAAI,GAAG,GAAI,CAAA,IAAA,GAAO,IAAI,IAAI,CAAA;AAG9C,IAAA,KAAA,CAAM,KAAQ,GAAA,CAAA;AACd,IAAA,EAAA,CAAG,KAAS,GAAA,CAAA,QAAA,CAAS,KAAQ,GAAA,MAAA,IAAU,IAAI,GAAI,CAAA,IAAA;AAC/C,IAAA,EAAA,CAAG,KAAS,GAAA,CAAA,QAAA,CAAS,MAAS,GAAA,MAAA,IAAU,IAAI,GAAI,CAAA,IAAA;AAAA,GAClD;AACA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,SAAS,kBAAmB,CAAA,KAAA,CAAM,KAAM,CAAA,GAAA,CAAI,qBAAqB,CAAC,CAAA;AACxE,IAAA,MAAM,UAAU,cAAe,CAAA,OAAA;AAC/B,IAAM,MAAA,KAAA,GAAQ,OAAO,MAAO,CAAA,CAAA,EAAA,KAAM,CAAC,OAAQ,CAAA,GAAA,CAAI,EAAG,CAAA,EAAE,CAAC,CAAA;AACrD,IAAA,MAAM,YAAe,GAAA,CAAC,GAAG,OAAO,EAAE,MAAO,CAAA,CAAA,EAAA,KAAM,CAAC,MAAA,CAAO,KAAK,CAAK,CAAA,KAAA,CAAA,CAAE,EAAO,KAAA,EAAE,CAAC,CAAE,CAAA,MAAA;AAC/E,IAAM,MAAA,QAAA,GAAW,MAAM,MAAS,GAAA,CAAA,IAAK,iBAAiB,CAAK,IAAA,MAAA,CAAO,SAAS,OAAQ,CAAA,IAAA;AACnF,IAAe,cAAA,CAAA,OAAA,GAAU,IAAI,GAAI,CAAA,MAAA,CAAO,IAAI,CAAM,EAAA,KAAA,EAAA,CAAG,EAAE,CAAC,CAAA;AACxD,IAAA,QAAA,CAAS,MAAM,CAAA;AACf,IAAA,aAAA,CAAc,WAAW,KAAM,CAAA,KAAA,CAAM,SAAS,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAC1D,IAAA,WAAA,CAAY,MAAM,CAAA;AAAA,GAEpB,EAAG,CAAC,aAAa,CAAC,CAAA;AAClB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,WAAA,CAAY,KAAK,CAAA;AAAA,KAEhB,CAAC,QAAA,CAAS,KAAO,EAAA,QAAA,CAAS,MAAM,CAAC,CAAA;AACpC,EAAA,MAAM,YAAe,GAAA,WAAA,CAAY,CAAC,EAAA,EAAY,KAAqB,KAAA;AACjE,IAAA,QAAA,CAAS,CAAQ,IAAA,KAAA;AACf,MAAA,MAAM,IAAO,GAAA,cAAA,CAAe,IAAM,EAAA,EAAA,EAAI,KAAK,CAAA;AAC3C,MAAM,MAAA,QAAA,GAAW,iCACZ,KADY,CAAA,EAAA;AAAA,QAEf,KAAO,EAAA;AAAA,OACT,CAAA;AAGA,MAAe,cAAA,CAAA,MAAM,+CAAgB,QAAS,CAAA,CAAA;AAC9C,MAAO,OAAA,IAAA;AAAA,KACR,CAAA;AAAA,GACA,EAAA,CAAC,KAAO,EAAA,aAAa,CAAC,CAAA;AACzB,EAAM,MAAA,YAAA,GAAe,WAAY,CAAA,CAAC,IAAqB,KAAA;AACrD,IAAA,aAAA,CAAc,KAAK,EAAE,CAAA;AACrB,IAAc,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAA,IAAA,CAAA;AAAA,GAChB,EAAG,CAAC,WAAW,CAAC,CAAA;AAIhB,EAAM,MAAA,iBAAA,GAAoB,OAAO,CAAC,CAAA;AAClC,EAAM,MAAA,cAAA,GAAiB,YAAY,MAAM;AACvC,IAAkB,iBAAA,CAAA,OAAA,GAAU,IAAK,CAAA,GAAA,EAAQ,GAAA,GAAA;AAAA,GAC3C,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,mBAAsB,GAAA,WAAA,CAAY,CAAC,IAAA,EAAc,IAAiB,KAAA;AACtE,IAAA,IAAI,IAAK,CAAA,GAAA,EAAQ,GAAA,iBAAA,CAAkB,OAAS,EAAA;AAC5C,IAAM,MAAA,IAAA,GAAO,aAAa,KAAM,CAAA,IAAA,CAAK,QAAM,EAAG,CAAA,EAAA,KAAO,UAAU,CAAI,GAAA,MAAA;AACnE,IAAA,IAAI,IAAM,EAAA;AACR,MAAA,MAAM,IAAI,KAAM,CAAA,KAAA;AAChB,MAAA,MAAM,IAAO,GAAA,IAAA,CAAK,CAAI,GAAA,CAAA,GAAI,EAAG,CAAA,KAAA;AAC7B,MAAA,MAAM,GAAM,GAAA,IAAA,CAAK,CAAI,GAAA,CAAA,GAAI,EAAG,CAAA,KAAA;AAE5B,MAAA,IAAI,IAAQ,IAAA,IAAA,IAAQ,IAAQ,IAAA,IAAA,GAAO,KAAK,KAAQ,GAAA,CAAA,IAAK,IAAQ,IAAA,GAAA,GAAM,EAAM,IAAA,IAAA,IAAQ,GAAM,GAAA,IAAA,CAAK,SAAS,CAAG,EAAA;AACtG,QAAA;AAAA;AACF;AAEF,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,GACjB,EAAA,CAAC,KAAO,EAAA,UAAU,CAAC,CAAA;AAItB,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,GAAG,CAAA;AAC1C,EAAoB,mBAAA,CAAA,MAAM,KAAK,KAAM,CAAA,KAAA,CAAM,QAAQ,GAAG,CAAA,EAAG,CAAC,GAAA,EAAK,IAAS,KAAA;AACtE,IAAA,IAAI,GAAQ,KAAA,IAAA,EAAc,OAAA,CAAA,UAAU,EAAE,GAAG,CAAA;AAAA,GAC1C,CAAA;AAGD,EAAA,MAAM,MAAS,GAAA,WAAA;AAAA,IAAY,CAAC,MAAmB,KAAA;AAC7C,MAAM,MAAA,IAAA,GAAO,IAAK,CAAA,GAAA,CAAI,QAAU,EAAA,IAAA,CAAK,IAAI,QAAU,EAAA,KAAA,CAAM,KAAQ,GAAA,MAAM,CAAC,CAAA;AACxE,MAAM,MAAA,KAAA,GAAQ,OAAO,KAAM,CAAA,KAAA;AAC3B,MAAM,MAAA,EAAA,GAAK,SAAS,KAAQ,GAAA,CAAA;AAC5B,MAAM,MAAA,EAAA,GAAK,SAAS,MAAS,GAAA,CAAA;AAC7B,MAAA,EAAA,CAAG,KAAQ,GAAA,EAAA,GAAA,CAAM,EAAK,GAAA,EAAA,CAAG,KAAS,IAAA,KAAA;AAClC,MAAA,EAAA,CAAG,KAAQ,GAAA,EAAA,GAAA,CAAM,EAAK,GAAA,EAAA,CAAG,KAAS,IAAA,KAAA;AAClC,MAAA,KAAA,CAAM,KAAQ,GAAA,IAAA;AAAA,KAChB;AAAA;AAAA;AAAA,IAGA,CAAC,QAAA,CAAS,KAAO,EAAA,QAAA,CAAS,MAAM;AAAA,GAAC;AAGjC,EAAM,MAAA,QAAA,GAAW,YAAY,MAAM;AACjC,IAAA,WAAA,CAAY,KAAK,CAAA;AAAA,KAEhB,CAAC,KAAA,EAAO,SAAS,KAAO,EAAA,QAAA,CAAS,MAAM,CAAC,CAAA;AAC3C,EAAM,MAAA,WAAA,GAAc,WAAY,CAAA,CAAC,IAAgC,KAAA;AAC/D,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,aAAA,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAgB,iCACX,KADW,CAAA,EAAA;AAAA,MAEd,KAAA,EAAO,CAAC,GAAG,IAAI;AAAA,KACjB,CAAA,CAAA;AAAA,GACC,EAAA,CAAC,KAAO,EAAA,aAAa,CAAC,CAAA;AACzB,EAAM,MAAA,UAAA,GAAa,QAAQ,MAAM,aAAA,CAAc,SAAS,CAAG,EAAA,CAAC,SAAS,CAAC,CAAA;AAItE,EAAM,MAAA,UAAA,GAAa,OAAO,KAAK,CAAA;AAC/B,EAAM,MAAA,eAAA,GAAkB,WAAY,CAAA,OAAO,EAAe,KAAA;AACxD,IAAA,MAAM,OAAO,KAAM,CAAA,IAAA,CAAK,CAAM,EAAA,KAAA,EAAA,CAAG,OAAO,EAAE,CAAA;AAC1C,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,UAAA,IAAc,WAAW,OAAS,EAAA;AAChD,IAAA,UAAA,CAAW,OAAU,GAAA,IAAA;AACrB,IAAI,IAAA,QAAA;AACJ,IAAI,IAAA;AACF,MAAM,MAAA,MAAA,GAAS,MAAM,mBAAA,CAAoB,IAAM,EAAA;AAAA,QAC7C,KAAO,EAAA,UAAA;AAAA,QACP,GAAK,EAAA;AAAA,OACN,CAAA;AACD,MAAA,QAAA,GAAW,OAAO,KAAM,CAAA,QAAA;AACxB,MAAA,IAAI,OAAO,OAAS,EAAA;AAClB,QAAA,QAAA,CAAS,CAAQ,IAAA,KAAA;AACf,UAAM,MAAA,IAAA,GAAO,KAAK,GAAI,CAAA,CAAA,EAAA,KAAM,GAAG,EAAO,KAAA,EAAA,GAAK,iCACtC,EADsC,CAAA,EAAA;AAAA,YAEzC,KAAK,MAAO,CAAA,GAAA;AAAA,YACZ,OAAO,MAAO,CAAA;AAAA,eACZ,EAAE,CAAA;AACN,UAAM,MAAA,QAAA,GAAW,iCACZ,KADY,CAAA,EAAA;AAAA,YAEf,KAAO,EAAA;AAAA,WACT,CAAA;AACA,UAAe,cAAA,CAAA,MAAM,+CAAgB,QAAS,CAAA,CAAA;AAC9C,UAAO,OAAA,IAAA;AAAA,SACR,CAAA;AAAA;AACH,aACO,GAAK,EAAA;AACZ,MAAA,KAAA,CAAM,MAAM,6BAA+B,EAAA,GAAA,YAAe,KAAQ,GAAA,GAAA,CAAI,UAAU,MAAS,CAAA;AACzF,MAAA;AAAA,KACA,SAAA;AACA,MAAA,UAAA,CAAW,OAAU,GAAA,KAAA;AAAA;AAEvB,IAAA,SAAA,CAAU,UAAU,QAAQ,CAAA;AAC5B,IAAM,KAAA,CAAA,KAAA,CAAM,mBAAqB,EAAA,QAAA,EAAU,CAAC;AAAA,MAC1C,IAAM,EAAA,aAAA;AAAA,MACN,OAAS,EAAA,MAAM,KAAK,KAAA,CAAM,KAAM,CAAA;AAAA,QAC9B,OAAS,EAAA,QAAA;AAAA,QACT,GAAK,EAAA;AAAA,OACN,CAAA,CAAE,KAAM,CAAA,MAAM,MAAS;AAAA,KACvB,EAAA;AAAA,MACD,IAAM,EAAA,IAAA;AAAA,MACN,KAAO,EAAA;AAAA,KACR,CAAC,CAAA;AAAA,KACD,CAAC,KAAA,EAAO,YAAY,SAAW,EAAA,KAAA,EAAO,aAAa,CAAC,CAAA;AACvD,EAAM,MAAA,GAAA,GAAM,OAAQ,CAAA,GAAA,EAAM,CAAA,WAAA,CAAY,EAAE,CAAA,CAAE,cAAe,CAAA,IAAI,CAAE,CAAA,OAAA,CAAQ,MAAM;AAC3E,IAAA,OAAA,CAAQ,QAAQ,EAAG,CAAA,KAAA;AACnB,IAAA,OAAA,CAAQ,QAAQ,EAAG,CAAA,KAAA;AAAA,GACpB,CAAE,CAAA,QAAA,CAAS,CAAK,CAAA,KAAA;AACf,IAAG,EAAA,CAAA,KAAA,GAAQ,OAAQ,CAAA,KAAA,GAAQ,CAAE,CAAA,YAAA;AAC7B,IAAG,EAAA,CAAA,KAAA,GAAQ,OAAQ,CAAA,KAAA,GAAQ,CAAE,CAAA,YAAA;AAAA,GAC9B,CAAA;AACD,EAAA,MAAM,KAAQ,GAAA,OAAA,CAAQ,KAAM,EAAA,CAAE,QAAQ,MAAM;AAC1C,IAAA,UAAA,CAAW,QAAQ,KAAM,CAAA,KAAA;AACzB,IAAA,OAAA,CAAQ,QAAQ,EAAG,CAAA,KAAA;AACnB,IAAA,OAAA,CAAQ,QAAQ,EAAG,CAAA,KAAA;AAAA,GACpB,CAAE,CAAA,QAAA,CAAS,CAAK,CAAA,KAAA;AACf,IAAA,SAAA;AAEA,IAAM,MAAA,GAAA,GAAM,UAAW,CAAA,KAAA,GAAQ,CAAE,CAAA,KAAA;AACjC,IAAM,MAAA,IAAA,GAAO,KAAK,GAAI,CAAA,QAAA,EAAU,KAAK,GAAI,CAAA,QAAA,EAAU,GAAG,CAAC,CAAA;AAGvD,IAAM,MAAA,KAAA,GAAQ,OAAO,UAAW,CAAA,KAAA;AAChC,IAAA,EAAA,CAAG,QAAQ,CAAE,CAAA,MAAA,GAAA,CAAU,CAAE,CAAA,MAAA,GAAS,QAAQ,KAAS,IAAA,KAAA;AACnD,IAAA,EAAA,CAAG,QAAQ,CAAE,CAAA,MAAA,GAAA,CAAU,CAAE,CAAA,MAAA,GAAS,QAAQ,KAAS,IAAA,KAAA;AACnD,IAAA,KAAA,CAAM,KAAQ,GAAA,IAAA;AAAA,GACf,CAAA;AAGD,EAAM,MAAA,aAAA,GAAgB,QAAQ,GAAI,EAAA,CAAE,QAAQ,IAAI,CAAA,CAAE,MAAM,CAAK,CAAA,KAAA;AAC3D,IAAoB,mBAAA,CAAA,CAAA,CAAE,SAAW,EAAA,CAAA,CAAE,SAAS,CAAA;AAAA,GAC7C,CAAA;AACD,EAAA,MAAM,OAAU,GAAA,OAAA,CAAQ,YAAa,CAAA,GAAA,EAAK,OAAO,aAAa,CAAA;AAC9D,EAAM,MAAA,UAAA,GAAa,iBAAiB,OAAO;AAAA,IACzC,WAAW,CAAC;AAAA,MACV,YAAY,EAAG,CAAA;AAAA,KACd,EAAA;AAAA,MACD,YAAY,EAAG,CAAA;AAAA,KACd,EAAA;AAAA,MACD,OAAO,KAAM,CAAA;AAAA,KACd;AAAA,GACD,CAAA,CAAA;AAKF,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAKG,sBAAuB,EAAA,EAAA,KAAA,EAAO,OAAO,QAAU,EAAA,MAAA,EAAgB,UAAU,CAAK,CAAA,KAAA;AAC7E,MAAM,MAAA;AAAA,QACJ,KAAA;AAAA,QACA;AAAA,OACF,GAAI,EAAE,WAAY,CAAA,MAAA;AAClB,MAAA,IAAI,KAAQ,GAAA,CAAA,IAAK,MAAS,GAAA,CAAA,EAAe,WAAA,CAAA;AAAA,QACvC,KAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,KAEM,EAAA,QAAA,EAAA;AAAA,MAAA,aAAA,mBAAiB,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,WAC7B,EAAA,QAAA,EAAA;AAAA,wBAAC,IAAA,CAAAD,SAAA,EAAA,EAAY,SAAS,aAAe,EAAA,iBAAA,EAAkB,UAAS,kBAAmB,EAAA,QAAA,EAAS,KAAO,EAAA,MAAA,CAAO,SACtG,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,mBAAA,EAAoB,IAAM,EAAA,EAAA,EAAI,OAAM,SAAU,EAAA,CAAA;AAAA,0BAC1E,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,aAAa,QAAM,EAAA,QAAA,EAAA;AAAA,SAC3C,EAAA,CAAA;AAAA,wBACC,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,UAAY,EAAA,CAAA;AAAA,wBAC/B,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,SACf,EAAA,QAAA,EAAA;AAAA,UAAM,KAAA,CAAA,MAAA;AAAA,UAAO,GAAA;AAAA,UAAE,KAAA,CAAM,MAAW,KAAA,CAAA,GAAI,MAAS,GAAA;AAAA,SAClD,EAAA,CAAA;AAAA,wBACC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,UAChB,EAAA,QAAA,EAAA;AAAA,0BAAC,GAAA,CAAAA,SAAA,EAAA,EAAY,SAAS,MAAM,MAAA,CAAO,IAAI,IAAI,CAAA,EAAG,OAAS,EAAA,CAAA,EAAG,iBAAkB,EAAA,QAAA,EAAS,oBAAmB,UAAW,EAAA,KAAA,EAAO,OAAO,OAC7H,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,MAAA,CAAO,YAAc,EAAA,QAAA,EAAA,QAAA,EAAC,CACvC,EAAA,CAAA;AAAA,0BACC,GAAA,CAAAA,SAAA,EAAA,EAAY,OAAS,EAAA,QAAA,EAAU,SAAS,CAAG,EAAA,iBAAA,EAAkB,QAAS,EAAA,kBAAA,EAAmB,WACtF,EAAA,QAAA,kBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,OAAO,OAAU,EAAA,QAAA,EAAA;AAAA,YAAA,OAAA;AAAA,YAAQ;AAAA,WAAA,EAAC,CAC3C,EAAA,CAAA;AAAA,0BACA,GAAA,CAACA,aAAY,OAAS,EAAA,MAAM,OAAO,IAAI,CAAA,EAAG,OAAS,EAAA,CAAA,EAAG,iBAAkB,EAAA,QAAA,EAAS,oBAAmB,SAAU,EAAA,KAAA,EAAO,OAAO,OACxH,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,MAAA,CAAO,YAAc,EAAA,QAAA,EAAA,GAAA,EAAC,CACvC,EAAA;AAAA,SACJ,EAAA,CAAA;AAAA,wBACC,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,UAAY,EAAA,CAAA;AAAA,wBAChC,GAAA,CAACA,aAAY,OAAS,EAAA,MAAM,aAAa,IAAI,CAAA,EAAG,KAAO,EAAA,MAAA,CAAO,WAAa,EAAA,iBAAA,EAAkB,UAAS,kBAAmB,EAAA,WAAA,EACrH,8BAAC,sBAAuB,EAAA,EAAA,IAAA,EAAK,YAAW,IAAM,EAAA,EAAA,EAAI,KAAM,EAAA,SAAA,EAAU,CACtE,EAAA;AAAA,OAAA,EACJ,CAAU,GAAA,IAAA;AAAA,2BACb,IAAK,EAAA,EAAA,KAAA,EAAO,MAAO,CAAA,WAAA,EAAa,UAAU,CAAK,CAAA,KAAA;AACpD,QAAM,MAAA;AAAA,UACJ,KAAA;AAAA,UACA;AAAA,SACF,GAAI,EAAE,WAAY,CAAA,MAAA;AAClB,QAAA,IAAI,KAAQ,GAAA,CAAA,IAAK,MAAS,GAAA,CAAA,EAAe,WAAA,CAAA;AAAA,UACvC,KAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,OAEO,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,OAAQ,EAAA,EAAA,CAAA;AAAA,wBACT,GAAA,CAAC,eAAgB,EAAA,EAAA,OAAA,EAEb,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,OAAO,UAAW,CAAA,YAAA,EAAc,WAAa,EAAA,KAAA,EAC/C,QAAC,kBAAA,GAAA,CAAA,iBAAA,CAAkB,UAAlB,EAA2B,KAAA,EAAO,UAC/B,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAS,CAAA,IAAA,EAAT,EAAc,KAAO,EAAA,CAAC,MAAO,CAAA,KAAA,EAAO,UAAY,EAAA;AAAA,UAC7D,eAAiB,EAAA;AAAA,SAClB,CAAG,EAAA,aAAA,EAAc,UACC,EAAA,QAAA,EAAA,OAAA,CAAQ,IAAI,CAAQ,IAAA,KAAA,IAAA,CAAK,EAAO,KAAA,UAAA,mBAAc,GAAA,CAAA,YAAA,EAAA,EAA2B,MAAY,WAAa,EAAA,KAAA,EAAO,QAAU,EAAA,YAAA,EAAc,KAAO,EAAA,WAAA,EAAa,aAAa,QAAU,EAAA,QAAA,EAAU,YAAc,EAAA,QAAA,EAAU,MAAM;AACnO,UAAA,WAAA,CAAY,UAAW,CAAA,KAAA,EAAO,IAAK,CAAA,EAAE,CAAC,CAAA;AACtC,UAAA,aAAA,CAAc,IAAI,CAAA;AAAA,SACjB,EAAA,WAAA,EAAa,UAAc,IAAA,iBAAA,CAAkB,IAAK,CAAA,GAAG,CAAI,GAAA,MAAM,KAAK,eAAA,CAAgB,IAAK,CAAA,EAAE,IAAI,MAAW,EAAA,aAAA,EAAe,cAH3C,EAAA,EAAA,IAAA,CAAK,EAGsD,CAAA,mBAAM,GAAA,CAAA,UAAA,EAAA,EAAyB,IAAY,EAAA,KAAA,EAAO,YAA5B,EAAA,EAAA,IAAA,CAAK,EAAqC,CAAE,CAClM,EAAA,CAAA,EACJ,GACJ,CACJ,EAAA,CAAA;AAAA,QACC,KAAA,CAAM,WAAW,CAAI,mBAAA,IAAA,CAAC,QAAK,KAAO,EAAA,MAAA,CAAO,SAAW,EAAA,aAAA,EAAc,MAC3D,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,MAAO,CAAA,cAAA,EAAgB,QAAoB,EAAA,sBAAA,EAAA,CAAA;AAAA,0BACvD,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,iBAAiB,QAErC,EAAA,0EAAA,EAAA;AAAA,SAAA,EACJ,CAAU,GAAA,IAAA;AAAA,QACb,QAAA,IAAY,CAAC,aAAgB,mBAAA,IAAA,CAAC,QAAK,KAAO,EAAA,MAAA,CAAO,OAAS,EAAA,aAAA,EAAc,UACjE,EAAA,QAAA,EAAA;AAAA,0BAAC,GAAA,CAAAA,SAAA,EAAA,EAAY,SAAS,MAAM,MAAA,CAAO,IAAI,IAAI,CAAA,EAAG,OAAS,EAAA,CAAA,EAAG,iBAAkB,EAAA,QAAA,EAAS,oBAAmB,UAAW,EAAA,KAAA,EAAO,OAAO,OAC7H,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,MAAA,CAAO,YAAc,EAAA,QAAA,EAAA,QAAA,EAAC,CACvC,EAAA,CAAA;AAAA,0BACC,GAAA,CAAAA,SAAA,EAAA,EAAY,OAAS,EAAA,QAAA,EAAU,SAAS,CAAG,EAAA,iBAAA,EAAkB,QAAS,EAAA,kBAAA,EAAmB,WACtF,EAAA,QAAA,kBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,OAAO,OAAU,EAAA,QAAA,EAAA;AAAA,YAAA,OAAA;AAAA,YAAQ;AAAA,WAAA,EAAC,CAC3C,EAAA,CAAA;AAAA,0BACA,GAAA,CAACA,aAAY,OAAS,EAAA,MAAM,OAAO,IAAI,CAAA,EAAG,OAAS,EAAA,CAAA,EAAG,iBAAkB,EAAA,QAAA,EAAS,oBAAmB,SAAU,EAAA,KAAA,EAAO,OAAO,OACxH,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,MAAA,CAAO,YAAc,EAAA,QAAA,EAAA,GAAA,EAAC,CACvC,EAAA;AAAA,SAAA,EACJ,CAAU,GAAA;AAAA,OAClB,EAAA,CAAA;AAAA,0BACC,mBAAoB,EAAA,EAAA,OAAA,EAAS,SAAW,EAAA,OAAA,EAAS,MAAM,YAAa,CAAA,KAAK,CAAG,EAAA,SAAA,EAAsB,YAAY,KAAO,EAAA,YAAA,EAAA,CAAc,EAAM,GAAA,KAAA,CAAA,IAAA,CAAK,QAAM,EAAG,CAAA,EAAA,KAAO,UAAU,CAAA,KAArC,YAA0C,IAAM,EAAA,WAAA,EAAa,CAAC,GAAA,EAAK,SAAS,gBAAmB,IAAA,IAAA,GAAA,MAAA,GAAA,gBAAA,CAAA,GAAA,EAAK,IAAO,CAAA,EAAA,SAAA,EAAW,CAAC,MAAQ,EAAA,GAAA,KAAQ,iDAAiB,MAAQ,EAAA,GAAA,CAAA,EAAM,YAAY,CAAU,MAAA,KAAA;AACpU,QAAA,aAAA,CAAc,MAAM,CAAA;AACpB,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,SACjB,aAA8B,EAAA;AAAA,KAC/B,EAAA;AAAA;AAER;AAGgB,SAAA,cAAA,CAAe,MAA8B,EAAA,cAAA,EAAwB,eAAiC,EAAA;AACpH,EAAO,OAAA,CAAA;AACT;AACA,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,QAAU,EAAA;AAAA,IACR,IAAM,EAAA,CAAA;AAAA,IACN,QAAU,EAAA,QAAA;AAAA,IACV,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,WAAa,EAAA;AAAA,IACX,IAAM,EAAA,CAAA;AAAA,IACN,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,SAAA,EAAW,aACN,CAAA,cAAA,CAAA,EAAA,EAAA,UAAA,CAAW,kBADL,CAAA,EAAA;AAAA,IAET,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,iBAAmB,EAAA,EAAA;AAAA,IACnB,UAAY,EAAA,CAAA;AAAA,IACZ,aAAe,EAAA;AAAA,GACjB,CAAA;AAAA,EACA,cAAgB,EAAA;AAAA,IACd,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,KAAO,EAAA,SAAA;AAAA,IACP,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,eAAiB,EAAA;AAAA,IACf,QAAU,EAAA,EAAA;AAAA,IACV,KAAO,EAAA,SAAA;AAAA,IACP,SAAW,EAAA,QAAA;AAAA,IACX,QAAU,EAAA,GAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,WAAa,EAAA;AAAA,IACX,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,iBAAmB,EAAA,CAAA;AAAA,IACnB,eAAiB,EAAA,CAAA;AAAA,IACjB,eAAiB,EAAA,SAAA;AAAA,IACjB,mBAAmB,UAAW,CAAA,aAAA;AAAA,IAC9B,iBAAmB,EAAA,SAAA;AAAA,IACnB,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,SAAW,EAAA;AAAA,IACT,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,iBAAmB,EAAA,CAAA;AAAA,IACnB,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,WAAa,EAAA;AAAA,IACX,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,KAAO,EAAA;AAAA,GACT;AAAA,EACA,UAAY,EAAA;AAAA,IACV,OAAO,UAAW,CAAA,aAAA;AAAA,IAClB,MAAQ,EAAA,EAAA;AAAA,IACR,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,SAAW,EAAA;AAAA,IACT,QAAU,EAAA,EAAA;AAAA,IACV,KAAO,EAAA,SAAA;AAAA,IACP,WAAA,EAAa,CAAC,cAAc;AAAA,GAC9B;AAAA,EACA,UAAY,EAAA;AAAA,IACV,UAAY,EAAA,MAAA;AAAA,IACZ,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,UAAY,EAAA;AAAA,GACd;AAAA,EACA,WAAa,EAAA;AAAA,IACX,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,aAAa,UAAW,CAAA,aAAA;AAAA,IACxB,WAAa,EAAA,SAAA;AAAA,IACb,YAAc,EAAA,CAAA;AAAA,IACd,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,UAAY,EAAA;AAAA,GACd;AAAA,EACA,aAAe,EAAA;AAAA,IACb,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,KAAO,EAAA;AAAA,GACT;AAAA,EACA,KAAO,EAAA;AAAA,IACL,QAAU,EAAA,UAAA;AAAA,IACV,IAAM,EAAA,CAAA;AAAA,IACN,GAAK,EAAA,CAAA;AAAA,IACL,KAAO,EAAA,CAAA;AAAA,IACP,MAAQ,EAAA,CAAA;AAAA,IACR,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,SAAW,EAAA;AAAA,IACT,YAAc,EAAA,CAAA;AAAA,IACd,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,WAAa,EAAA;AAAA,IACX,QAAU,EAAA,UAAA;AAAA,IACV,IAAM,EAAA,CAAA;AAAA,IACN,MAAQ,EAAA,CAAA;AAAA,IACR,iBAAmB,EAAA,CAAA;AAAA,IACnB,eAAiB,EAAA,CAAA;AAAA,IACjB,YAAc,EAAA,CAAA;AAAA,IACd,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,gBAAkB,EAAA;AAAA,IAChB,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,KAAO,EAAA;AAAA,GACT;AAAA,EACA,OAAS,EAAA;AAAA,IACP,QAAU,EAAA,UAAA;AAAA,IACV,GAAK,EAAA,EAAA;AAAA,IACL,KAAO,EAAA,EAAA;AAAA,IACP,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA,CAAA;AAAA,IACjB,YAAc,EAAA,EAAA;AAAA,IACd,eAAiB,EAAA,SAAA;AAAA,IACjB,aAAa,UAAW,CAAA,aAAA;AAAA,IACxB,WAAa,EAAA,SAAA;AAAA,IACb,WAAa,EAAA,SAAA;AAAA,IACb,aAAe,EAAA,IAAA;AAAA,IACf,YAAc,EAAA,CAAA;AAAA,IACd,YAAc,EAAA;AAAA,MACZ,KAAO,EAAA,CAAA;AAAA,MACP,MAAQ,EAAA;AAAA,KACV;AAAA,IACA,SAAW,EAAA;AAAA,GACb;AAAA,EACA,gBAAkB,EAAA;AAAA,IAChB,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,QAAU,EAAA,UAAA;AAAA,IACV,GAAK,EAAA,CAAA;AAAA,IACL,IAAM,EAAA,CAAA;AAAA,IACN,KAAO,EAAA,CAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,mBAAqB,EAAA,CAAA;AAAA,IACrB,oBAAsB,EAAA,CAAA;AAAA,IACtB,eAAiB,EAAA,wBAAA;AAAA,IACjB,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,GAAK,EAAA,CAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,aAAe,EAAA;AAAA,IACb,KAAO,EAAA,CAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA,GAAA;AAAA,IACd,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,IAAA,EAAM,mBACD,UAAW,CAAA,kBAAA,CAAA;AAAA,EAEhB,MAAQ,EAAA;AAAA,IACN,aAAe,EAAA,KAAA;AAAA,IACf,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,OAAS,EAAA;AAAA,IACP,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA;AAAA,GAClB;AAAA,EACA,GAAK,EAAA;AAAA,IACH,KAAO,EAAA,CAAA;AAAA,IACP,MAAQ,EAAA,CAAA;AAAA,IACR,YAAc,EAAA,CAAA;AAAA,IACd,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,SAAW,EAAA;AAAA,IACT,QAAU,EAAA,UAAA;AAAA,IACV,IAAM,EAAA,CAAA;AAAA,IACN,KAAO,EAAA,CAAA;AAAA,IACP,MAAQ,EAAA,MAAA;AAAA,IACR,UAAY,EAAA,QAAA;AAAA,IACZ,YAAc,EAAA,CAAA;AAAA,IACd,MAAQ,EAAA,EAAA;AAAA,IACR,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,UAAY,EAAA,QAAA;AAAA,IACZ,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,QAAU,EAAA;AAAA,IACR,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,QAAU,EAAA,MAAA;AAAA,IACV,QAAU,EAAA,SAAA;AAAA,IACV,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA,CAAA;AAAA,IACjB,YAAc,EAAA,EAAA;AAAA,IACd,eAAiB,EAAA,SAAA;AAAA,IACjB,aAAa,UAAW,CAAA,aAAA;AAAA,IACxB,WAAa,EAAA,qBAAA;AAAA,IACb,WAAa,EAAA,SAAA;AAAA,IACb,aAAe,EAAA,IAAA;AAAA,IACf,YAAc,EAAA,EAAA;AAAA,IACd,YAAc,EAAA;AAAA,MACZ,KAAO,EAAA,CAAA;AAAA,MACP,MAAQ,EAAA;AAAA,KACV;AAAA,IACA,SAAW,EAAA;AAAA,GACb;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,UAAY,EAAA,CAAA;AAAA,IACZ,aAAe,EAAA,KAAA;AAAA,IACf,cAAgB,EAAA,UAAA;AAAA,IAChB,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,iBAAmB,EAAA;AAAA,IACjB,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,UAAY,EAAA;AAAA,GACd;AAAA,EACA,QAAU,EAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,UAAY,EAAA,CAAA;AAAA,IACZ,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,UAAY,EAAA;AAAA,IACV,SAAW,EAAA,CAAA;AAAA,IACX,KAAO,EAAA,GAAA;AAAA,IACP,YAAc,EAAA,EAAA;AAAA,IACd,eAAiB,EAAA,SAAA;AAAA,IACjB,aAAa,UAAW,CAAA,aAAA;AAAA,IACxB,WAAa,EAAA,qBAAA;AAAA,IACb,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA,EAAA;AAAA,IACjB,WAAa,EAAA,SAAA;AAAA,IACb,aAAe,EAAA,GAAA;AAAA,IACf,YAAc,EAAA,EAAA;AAAA,IACd,YAAc,EAAA;AAAA,MACZ,KAAO,EAAA,CAAA;AAAA,MACP,MAAQ,EAAA;AAAA,KACV;AAAA,IACA,SAAW,EAAA;AAAA,GACb;AAAA,EACA,eAAiB,EAAA;AAAA,IACf,SAAW,EAAA,EAAA;AAAA,IACX,QAAU,EAAA,EAAA;AAAA,IACV,KAAO,EAAA,SAAA;AAAA,IACP,OAAS,EAAA;AAAA,GACX;AAAA,EACA,QAAU,EAAA;AAAA,IACR,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,UAAY,EAAA;AAAA,IACV,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,KAAO,EAAA;AAAA,GACT;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,OAAO,UAAW,CAAA,aAAA;AAAA,IAClB,SAAW,EAAA,SAAA;AAAA,IACX,eAAiB,EAAA,SAAA;AAAA,IACjB,cAAgB,EAAA,CAAA;AAAA,IAChB,gBAAkB,EAAA;AAAA,GACpB;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,QAAU,EAAA,UAAA;AAAA,IACV,GAAK,EAAA,EAAA;AAAA,IACL,KAAO,EAAA;AAAA,GACT;AAAA,EACA,QAAU,EAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,GAAK,EAAA,MAAA;AAAA,IACL,KAAO,EAAA,CAAA;AAAA,IACP,SAAW,EAAA,CAAA;AAAA,IACX,MAAQ,EAAA,EAAA;AAAA,IACR,QAAU,EAAA,GAAA;AAAA,IACV,YAAc,EAAA,EAAA;AAAA,IACd,eAAiB,EAAA,SAAA;AAAA,IACjB,aAAa,UAAW,CAAA,aAAA;AAAA,IACxB,WAAa,EAAA,qBAAA;AAAA,IACb,eAAiB,EAAA,CAAA;AAAA,IACjB,WAAa,EAAA,SAAA;AAAA,IACb,aAAe,EAAA,IAAA;AAAA,IACf,YAAc,EAAA,EAAA;AAAA,IACd,YAAc,EAAA;AAAA,MACZ,KAAO,EAAA,CAAA;AAAA,MACP,MAAQ,EAAA;AAAA,KACV;AAAA,IACA,SAAW,EAAA;AAAA,GACb;AAAA,EACA,OAAS,EAAA;AAAA,IACP,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,SAAW,EAAA;AAAA,IACT,QAAU,EAAA,EAAA;AAAA,IACV,KAAO,EAAA;AAAA,GACT;AAAA,EACA,OAAS,EAAA;AAAA,IACP,iBAAmB,EAAA,CAAA;AAAA,IACnB,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,QAAU,EAAA,EAAA;AAAA,IACV,KAAO,EAAA,SAAA;AAAA,IACP,UAAY,EAAA;AAAA,GACd;AAAA,EACA,OAAS,EAAA;AAAA,IACP,QAAU,EAAA,EAAA;AAAA,IACV,KAAO,EAAA,SAAA;AAAA,IACP,WAAA,EAAa,CAAC,cAAc,CAAA;AAAA,IAC5B,QAAU,EAAA,EAAA;AAAA,IACV,SAAW,EAAA;AAAA,GACb;AAAA,EACA,aAAe,EAAA;AAAA,IACb,WAAa,EAAA;AAAA,GACf;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,QAAU,EAAA,UAAA;AAAA,IACV,KAAO,EAAA,CAAA;AAAA,IACP,MAAQ,EAAA,CAAA;AAAA,IACR,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,SAAW,EAAA;AAAA,IACT,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,UAAY,EAAA,EAAA;AAAA,IACZ,SAAW,EAAA,EAAA;AAAA,IACX,YAAc,EAAA,CAAA;AAAA,IACd,eAAiB,EAAA,SAAA;AAAA,IACjB,WAAa,EAAA,CAAA;AAAA,IACb,WAAa,EAAA;AAAA,GACf;AAAA,EACA,SAAW,EAAA;AAAA,IACT,YAAc,EAAA,CAAA;AAAA,IACd,eAAiB,EAAA,SAAA;AAAA,IACjB,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,OAAS,EAAA;AAAA,GACX;AAAA,EACA,cAAgB,EAAA;AAAA,IACd,KAAO,EAAA,SAAA;AAAA,IACP,QAAU,EAAA,EAAA;AAAA,IACV,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,cAAgB,EAAA;AAAA,IACd,KAAO,EAAA,SAAA;AAAA,IACP,QAAU,EAAA,EAAA;AAAA,IACV,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,KAAO,EAAA;AAAA,IACL,IAAM,EAAA,CAAA;AAAA,IACN,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,SAAW,EAAA;AAAA,IACT,KAAO,EAAA,SAAA;AAAA,IACP,QAAU,EAAA;AAAA;AAEd,CAAC,CAAA"}
@@ -1,4 +1,4 @@
1
- import {jsxs,jsx}from'react/jsx-runtime';import {useState}from'react';import {StyleSheet,View,Pressable,Text,TextInput}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Image}from'expo-image';import {hasPromoContext,readBrandColors}from'./promoVideo.js';export{EMPTY_PROMO_CONTEXT}from'./promoVideo.js';function PromoContextFields({
1
+ import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useState}from'react';import {StyleSheet,View,Pressable,Text,TextInput,ScrollView}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Image}from'expo-image';import {hasPromoContext,readBrandColors,PROMO_QUALITIES,PROMO_NARRATORS,PROMO_DESIGN_MODELS}from'./promoVideo.js';export{EMPTY_PROMO_CONTEXT}from'./promoVideo.js';function PromoContextFields({
2
2
  value,
3
3
  onChange,
4
4
  logoUrl,
@@ -52,6 +52,32 @@ import {jsxs,jsx}from'react/jsx-runtime';import {useState}from'react';import {St
52
52
  ] }) : null
53
53
  ] });
54
54
  }
55
+ function PromoProductionFields({
56
+ quality,
57
+ onQuality,
58
+ narrator,
59
+ onNarrator,
60
+ useCases,
61
+ onUseCases,
62
+ designModel,
63
+ onDesignModel
64
+ }) {
65
+ const qualityInfo = PROMO_QUALITIES.find((q) => q.id === quality);
66
+ return /* @__PURE__ */ jsxs(View, { style: styles.root, children: [
67
+ /* @__PURE__ */ jsx(Text, { style: styles.label, children: "Quality" }),
68
+ /* @__PURE__ */ jsx(View, { style: styles.pills, children: PROMO_QUALITIES.map((q) => /* @__PURE__ */ jsx(Pressable, { onPress: () => onQuality(q.id), style: [styles.pill, quality === q.id && styles.pillOn], accessibilityRole: "button", accessibilityState: {
69
+ selected: quality === q.id
70
+ }, children: /* @__PURE__ */ jsx(Text, { style: styles.pillLabel, children: q.name }) }, q.id)) }),
71
+ qualityInfo ? /* @__PURE__ */ jsx(Text, { style: styles.foldHint, children: qualityInfo.description }) : null,
72
+ /* @__PURE__ */ jsx(Text, { style: styles.label, children: "Narrator" }),
73
+ /* @__PURE__ */ jsx(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, contentContainerStyle: styles.pills, children: PROMO_NARRATORS.map((n) => /* @__PURE__ */ jsx(Pressable, { onPress: () => onNarrator(n.id), style: [styles.pill, narrator === n.id && styles.pillOn], children: /* @__PURE__ */ jsx(Text, { style: styles.pillLabel, children: n.name }) }, n.id || "cast")) }),
74
+ /* @__PURE__ */ jsx(TextInput, { value: useCases, onChangeText: onUseCases, placeholder: "Product moments to show \u2014 one per line, in order", placeholderTextColor: "#94a3b8", multiline: true, style: [styles.input, styles.multiline] }),
75
+ onDesignModel ? /* @__PURE__ */ jsxs(Fragment, { children: [
76
+ /* @__PURE__ */ jsx(Text, { style: styles.label, children: "Design model" }),
77
+ /* @__PURE__ */ jsx(View, { style: styles.pills, children: PROMO_DESIGN_MODELS.map((m) => /* @__PURE__ */ jsx(Pressable, { onPress: () => onDesignModel(m.id), style: [styles.pill, (designModel != null ? designModel : "") === m.id && styles.pillOn], accessibilityHint: m.description, children: /* @__PURE__ */ jsx(Text, { style: styles.pillLabel, children: m.name }) }, m.id || "default")) })
78
+ ] }) : null
79
+ ] });
80
+ }
55
81
  const styles = StyleSheet.create({
56
82
  root: {
57
83
  gap: 8
@@ -140,6 +166,33 @@ const styles = StyleSheet.create({
140
166
  flexDirection: "row",
141
167
  gap: 6
142
168
  },
169
+ label: {
170
+ fontSize: 11,
171
+ color: "#64748b",
172
+ fontWeight: "600"
173
+ },
174
+ pills: {
175
+ flexDirection: "row",
176
+ flexWrap: "wrap",
177
+ gap: 8
178
+ },
179
+ pill: {
180
+ paddingHorizontal: 10,
181
+ paddingVertical: 7,
182
+ borderRadius: 999,
183
+ borderWidth: 1,
184
+ borderColor: "#e2e8f0",
185
+ backgroundColor: "#ffffff"
186
+ },
187
+ pillOn: {
188
+ backgroundColor: "#fde8d8",
189
+ borderColor: "#fde8d8"
190
+ },
191
+ pillLabel: {
192
+ fontSize: 12,
193
+ fontWeight: "600",
194
+ color: "#334155"
195
+ },
143
196
  swatch: {
144
197
  width: 18,
145
198
  height: 18,
@@ -147,4 +200,4 @@ const styles = StyleSheet.create({
147
200
  borderWidth: StyleSheet.hairlineWidth,
148
201
  borderColor: "#e2e8f0"
149
202
  }
150
- });export{PromoContextFields};//# sourceMappingURL=PromoContextFields.js.map
203
+ });export{PromoContextFields,PromoProductionFields};//# sourceMappingURL=PromoContextFields.js.map