@adminide-stack/yantra-mobile 12.0.131 → 12.0.132

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 (149) hide show
  1. package/lib/components/CustomDrawer.js +2 -2
  2. package/lib/components/CustomDrawer.js.map +1 -1
  3. package/lib/features/apps/AppsCatalog.js +7 -1
  4. package/lib/features/apps/AppsCatalog.js.map +1 -1
  5. package/lib/features/apps/nativeSurfaceTwin.js +35 -0
  6. package/lib/features/apps/nativeSurfaceTwin.js.map +1 -0
  7. package/lib/features/canvas/CanvasBoardsGrid.js +49 -49
  8. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
  9. package/lib/features/canvas/CanvasExperience.js +69 -28
  10. package/lib/features/canvas/CanvasExperience.js.map +1 -1
  11. package/lib/features/canvas/audioEditor/AudioWaveform.js +1 -1
  12. package/lib/features/canvas/designCatalog.js +63 -39
  13. package/lib/features/canvas/designCatalog.js.map +1 -1
  14. package/lib/features/canvas/designCategories.js +56 -0
  15. package/lib/features/canvas/designCategories.js.map +1 -1
  16. package/lib/features/canvas/generator/DirectorSheet.js +3 -2
  17. package/lib/features/canvas/generator/DirectorSheet.js.map +1 -1
  18. package/lib/features/canvas/home/HeroComposer.js +165 -76
  19. package/lib/features/canvas/home/HeroComposer.js.map +1 -1
  20. package/lib/features/canvas/home/HeroMonitor.js +75 -46
  21. package/lib/features/canvas/home/HeroMonitor.js.map +1 -1
  22. package/lib/features/canvas/home/TemplatesGallery.js +273 -138
  23. package/lib/features/canvas/home/TemplatesGallery.js.map +1 -1
  24. package/lib/features/canvas/home/templatesGallerySources.js +221 -0
  25. package/lib/features/canvas/home/templatesGallerySources.js.map +1 -0
  26. package/lib/features/canvas/homeWork.js +12 -11
  27. package/lib/features/canvas/homeWork.js.map +1 -1
  28. package/lib/features/canvas/lazyEditors.js +51 -0
  29. package/lib/features/canvas/lazyEditors.js.map +1 -0
  30. package/lib/features/canvas/rankedCatalogSearch.js +33 -23
  31. package/lib/features/canvas/rankedCatalogSearch.js.map +1 -1
  32. package/lib/features/canvas/set/SetViewportWebView.js +1 -1
  33. package/lib/features/canvas/set/agent/tools.js +1 -1
  34. package/lib/features/canvas/studioCatalog.js +2 -2
  35. package/lib/features/canvas/studioCatalog.js.map +1 -1
  36. package/lib/features/canvas/templateSearch.js +8 -1
  37. package/lib/features/canvas/templateSearch.js.map +1 -1
  38. package/lib/features/canvas/videoEditor/BlurBoxOverlay.js +1 -1
  39. package/lib/features/design/DesignEditorExperience.js +103 -29
  40. package/lib/features/design/DesignEditorExperience.js.map +1 -1
  41. package/lib/features/design/DesignExperience.js +4 -3
  42. package/lib/features/design/DesignExperience.js.map +1 -1
  43. package/lib/features/design/doc/aiDesign.js +1 -1
  44. package/lib/features/design/doc/aiDesign.js.map +1 -1
  45. package/lib/features/design/doc/artifacts.js +40 -13
  46. package/lib/features/design/doc/artifacts.js.map +1 -1
  47. package/lib/features/design/doc/chart.js +387 -13
  48. package/lib/features/design/doc/chart.js.map +1 -1
  49. package/lib/features/design/doc/copyStyle.js +47 -0
  50. package/lib/features/design/doc/copyStyle.js.map +1 -0
  51. package/lib/features/design/doc/docOps.js +22 -4
  52. package/lib/features/design/doc/docOps.js.map +1 -1
  53. package/lib/features/design/doc/geometry.js +32 -18
  54. package/lib/features/design/doc/geometry.js.map +1 -1
  55. package/lib/features/design/doc/newDoc.js +5 -1
  56. package/lib/features/design/doc/newDoc.js.map +1 -1
  57. package/lib/features/design/doc/resize.js +101 -0
  58. package/lib/features/design/doc/resize.js.map +1 -0
  59. package/lib/features/design/doc/sizes.js +15 -2
  60. package/lib/features/design/doc/sizes.js.map +1 -1
  61. package/lib/features/design/editor/ChartDataPanel.js +49 -9
  62. package/lib/features/design/editor/ChartDataPanel.js.map +1 -1
  63. package/lib/features/design/editor/CropOverlay.js +1 -1
  64. package/lib/features/design/editor/DesignCanvas.js +14 -13
  65. package/lib/features/design/editor/DesignCanvas.js.map +1 -1
  66. package/lib/features/design/editor/ExportSheet.js +8 -4
  67. package/lib/features/design/editor/ExportSheet.js.map +1 -1
  68. package/lib/features/design/editor/LayerTools.js +37 -5
  69. package/lib/features/design/editor/LayerTools.js.map +1 -1
  70. package/lib/features/design/editor/Slideshow.js +30 -5
  71. package/lib/features/design/editor/Slideshow.js.map +1 -1
  72. package/lib/features/design/editor/useDesignSave.js +21 -36
  73. package/lib/features/design/editor/useDesignSave.js.map +1 -1
  74. package/lib/features/design/export/exportDesign.js +3 -1
  75. package/lib/features/design/export/exportDesign.js.map +1 -1
  76. package/lib/features/design/home/DesignHome.js +7 -2
  77. package/lib/features/design/home/DesignHome.js.map +1 -1
  78. package/lib/features/design/render/DesignPageView.js +1 -1
  79. package/lib/features/design/render/DesignPageView.js.map +1 -1
  80. package/lib/features/design/render/PageCapture.js +11 -10
  81. package/lib/features/design/render/PageCapture.js.map +1 -1
  82. package/lib/features/design/render/fontRegistry.js +27 -3
  83. package/lib/features/design/render/fontRegistry.js.map +1 -1
  84. package/lib/features/design/render/svgParts.js +27 -74
  85. package/lib/features/design/render/svgParts.js.map +1 -1
  86. package/lib/features/devices/brands/qnScale.js +7 -2
  87. package/lib/features/devices/brands/qnScale.js.map +1 -1
  88. package/lib/features/devices/brands/uuids.js +2 -1
  89. package/lib/features/devices/brands/uuids.js.map +1 -1
  90. package/lib/features/devices/devices.js +2 -1
  91. package/lib/features/devices/devices.js.map +1 -1
  92. package/lib/features/docs/DocBlockRow.js +1 -1
  93. package/lib/features/docs/docArtifacts.js +2 -2
  94. package/lib/features/docs/docArtifacts.js.map +1 -1
  95. package/lib/features/health/healthSync.js +3 -1
  96. package/lib/features/health/healthSync.js.map +1 -1
  97. package/lib/features/health/nativeHealth.js +8 -0
  98. package/lib/features/health/nativeHealth.js.map +1 -0
  99. package/lib/features/links/openInApp.js +11 -1
  100. package/lib/features/links/openInApp.js.map +1 -1
  101. package/lib/features/webbuilder/WebBuilderExperience.js +135 -28
  102. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  103. package/lib/features/webbuilder/buildFragments.js +14 -6
  104. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  105. package/lib/features/webbuilder/components/PreviewFrame.js +28 -3
  106. package/lib/features/webbuilder/components/PreviewFrame.js.map +1 -1
  107. package/lib/features/webbuilder/components/PreviewScreen.js +1 -1
  108. package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
  109. package/lib/features/webbuilder/components/ProjectChat.js +24 -5
  110. package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
  111. package/lib/features/webbuilder/components/ProjectsScreen.js +18 -2
  112. package/lib/features/webbuilder/components/ProjectsScreen.js.map +1 -1
  113. package/lib/features/webbuilder/components/ui.js +20 -6
  114. package/lib/features/webbuilder/components/ui.js.map +1 -1
  115. package/lib/features/webbuilder/exportCode.js +52 -0
  116. package/lib/features/webbuilder/exportCode.js.map +1 -0
  117. package/lib/features/webbuilder/siteAddress.js +71 -0
  118. package/lib/features/webbuilder/siteAddress.js.map +1 -0
  119. package/lib/features/webbuilder/widgetBlocks.js +30 -0
  120. package/lib/features/webbuilder/widgetBlocks.js.map +1 -0
  121. package/lib/screens/Chat/index.js +5 -6
  122. package/lib/screens/Chat/index.js.map +1 -1
  123. package/lib/screens/ChatHistory/index.js +3 -2
  124. package/lib/screens/ChatHistory/index.js.map +1 -1
  125. package/lib/screens/Home/HomeScreen.js +20 -4
  126. package/lib/screens/Home/HomeScreen.js.map +1 -1
  127. package/lib/screens/Home/components/WebBuilderCodePrewarm.js +18 -0
  128. package/lib/screens/Home/components/WebBuilderCodePrewarm.js.map +1 -0
  129. package/lib/screens/WebBuilderNative/index.js +1 -1
  130. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  131. package/lib/screens/WebBuilderNative/keepAlive.js +112 -0
  132. package/lib/screens/WebBuilderNative/keepAlive.js.map +1 -0
  133. package/lib/screens/WebBuilderNative/runningBuilds.js +40 -0
  134. package/lib/screens/WebBuilderNative/runningBuilds.js.map +1 -0
  135. package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js +57 -0
  136. package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js.map +1 -0
  137. package/lib/screens/WebBuilderNative/useWebBuilderGallery.js +73 -14
  138. package/lib/screens/WebBuilderNative/useWebBuilderGallery.js.map +1 -1
  139. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +143 -34
  140. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  141. package/lib/screens/WebBuilderNative/useWebBuilderJobs.js +17 -5
  142. package/lib/screens/WebBuilderNative/useWebBuilderJobs.js.map +1 -1
  143. package/lib/screens/WebBuilderNative/versionUndo.js +144 -0
  144. package/lib/screens/WebBuilderNative/versionUndo.js.map +1 -0
  145. package/lib/screens/WebBuilderNative/webbuilderSnapshotKey.js +1 -0
  146. package/lib/screens/WebBuilderNative/webbuilderSnapshotKey.js.map +1 -0
  147. package/lib/screens/WebBuilderNative/webbuilderTransport.js +90 -6
  148. package/lib/screens/WebBuilderNative/webbuilderTransport.js.map +1 -1
  149. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"TemplatesGallery.js","sources":["../../../../src/features/canvas/home/TemplatesGallery.tsx"],"sourcesContent":["/**\n * Home \"See all\" - one templates gallery with source chips, native twin of\n * canvas-surface `templatesGallerySources.ts`: Video (the studio catalog's\n * video lane, seeds the generator), Presentations and Flyers (the design\n * catalog, open in the design studio). Home no longer guesses a category\n * from the rail's first row; the person picks the source.\n */\nimport React, { useEffect, useMemo, useState } from 'react';\nimport {\n ActivityIndicator,\n FlatList,\n ScrollView,\n StyleSheet,\n Text,\n TextInput,\n useWindowDimensions,\n View,\n} from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Image } from 'expo-image';\nimport type { RunMediaAction } from '../videoEditor/mediaActions';\nimport { loadCanvasTemplateLane, mapDesignCorpus, type CanvasPromptTemplate } from '../canvasChatTemplates';\nimport { DESIGN_PROMPT_TEMPLATES } from '../designPromptTemplates';\nimport { DesignCategoryGallery, type LoadDesignCatalog } from '../DesignCategoryGallery';\nimport type { DesignCatalogCard } from '../designCatalog';\nimport { designCategoryFor, type BlankSize } from '../designCategories';\nimport { useCanvasTheme, themedStyles, type CanvasPalette } from '../canvasTheme';\nimport { IconButton, Pressable, RADIUS, SPACE, TYPE, pressedStyle } from '../canvasUi';\n\nexport type HomeGallerySource = 'video' | 'slides' | 'flyers';\n\nexport const HOME_GALLERY_SOURCES: ReadonlyArray<{ id: HomeGallerySource; label: string; category?: string }> = [\n { id: 'video', label: 'Video' },\n { id: 'slides', label: 'Presentations', category: 'presentation' },\n { id: 'flyers', label: 'Flyers', category: 'flyer' },\n];\n\nconst GUTTER = SPACE.lg;\nconst SEARCH_DEBOUNCE_MS = 350;\n\nexport function TemplatesGallery({\n initialSource = 'video',\n runAction,\n loadDesignCatalog,\n onClose,\n onUseVideoTemplate,\n onBlank,\n onOpenTemplate,\n}: {\n initialSource?: HomeGallerySource;\n runAction?: RunMediaAction;\n loadDesignCatalog?: LoadDesignCatalog;\n onClose: () => void;\n /** A video template: a fresh canvas with the generator seeded from it. */\n onUseVideoTemplate: (template: CanvasPromptTemplate) => void;\n onBlank: (size: BlankSize) => void;\n onOpenTemplate?: (card: DesignCatalogCard) => void;\n}) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n const [source, setSource] = useState<HomeGallerySource>(initialSource);\n const entry = HOME_GALLERY_SOURCES.find((s) => s.id === source);\n const category = entry?.category ? designCategoryFor(entry.category) : null;\n\n const chips = (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n style={styles.chipScroll}\n contentContainerStyle={styles.chips}\n >\n {HOME_GALLERY_SOURCES.map((s) => {\n const on = s.id === source;\n return (\n <Pressable\n key={s.id}\n onPress={() => setSource(s.id)}\n style={({ pressed }) => [styles.chip, on && styles.chipOn, pressedStyle(pressed)]}\n accessibilityRole=\"tab\"\n accessibilityState={{ selected: on }}\n testID={`gallery-source-${s.id}`}\n >\n <Text style={[styles.chipLabel, on && styles.chipLabelOn]}>{s.label}</Text>\n </Pressable>\n );\n })}\n </ScrollView>\n );\n\n if (category) {\n return (\n <View style={styles.root}>\n {chips}\n <View style={styles.fill}>\n <DesignCategoryGallery\n key={category.id}\n category={category}\n load={loadDesignCatalog}\n onClose={onClose}\n onBlank={onBlank}\n onOpenTemplate={onOpenTemplate}\n />\n </View>\n </View>\n );\n }\n\n return (\n <View style={styles.root}>\n <View style={styles.head}>\n <Text style={styles.title} accessibilityRole=\"header\">\n Templates\n </Text>\n <IconButton icon=\"close\" label=\"Close templates\" tone=\"filled\" size={36} onPress={onClose} />\n </View>\n {chips}\n <VideoTemplates runAction={runAction} onUse={onUseVideoTemplate} />\n </View>\n );\n}\n\nfunction VideoTemplates({\n runAction,\n onUse,\n}: {\n runAction?: RunMediaAction;\n onUse: (template: CanvasPromptTemplate) => void;\n}) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n const { width } = useWindowDimensions();\n const column = (width - GUTTER * 2 - SPACE.md) / 2;\n const corpus = useMemo(() => mapDesignCorpus('video', DESIGN_PROMPT_TEMPLATES), []);\n const [query, setQuery] = useState('');\n const [search, setSearch] = useState('');\n const [rows, setRows] = useState<CanvasPromptTemplate[]>([]);\n const [status, setStatus] = useState<'loading' | 'ready' | 'failed'>('loading');\n const [read, setRead] = useState(0);\n\n useEffect(() => {\n const timer = setTimeout(() => setSearch(query.trim()), SEARCH_DEBOUNCE_MS);\n return () => clearTimeout(timer);\n }, [query]);\n\n useEffect(() => {\n let live = true;\n setStatus('loading');\n loadCanvasTemplateLane('video', search || undefined, runAction, corpus)\n .then((list) => {\n if (!live) return;\n setRows(list);\n setStatus('ready');\n })\n .catch(() => {\n if (live) setStatus('failed');\n });\n return () => {\n live = false;\n };\n }, [search, runAction, corpus, read]);\n\n return (\n <View style={styles.fill}>\n <View style={styles.search}>\n <MaterialCommunityIcons name=\"magnify\" size={18} color={theme.mutedForeground} />\n <TextInput\n value={query}\n onChangeText={setQuery}\n placeholder=\"Search video templates\"\n placeholderTextColor={theme.mutedForeground}\n style={styles.searchInput}\n autoCorrect={false}\n returnKeyType=\"search\"\n />\n </View>\n {status === 'loading' && rows.length === 0 ? (\n <ActivityIndicator style={styles.status} color={theme.mutedForeground} />\n ) : status === 'failed' ? (\n <View style={styles.statusRow}>\n <Text style={styles.hint}>Templates couldn't load.</Text>\n <Pressable\n onPress={() => setRead((n) => n + 1)}\n style={({ pressed }) => [styles.retry, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"refresh\" size={16} color={theme.foreground} />\n <Text style={styles.chipLabel}>Retry</Text>\n </Pressable>\n </View>\n ) : (\n <FlatList\n data={rows}\n keyExtractor={(t) => t.id}\n numColumns={2}\n columnWrapperStyle={styles.row}\n contentContainerStyle={styles.list}\n keyboardShouldPersistTaps=\"handled\"\n ListEmptyComponent={\n <Text style={styles.hint}>\n {search ? `No templates match \"${search}\".` : 'No templates here yet.'}\n </Text>\n }\n renderItem={({ item }) => (\n <Pressable\n onPress={() => onUse(item)}\n style={({ pressed }) => [{ width: column }, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n accessibilityLabel={`Use template ${item.title}`}\n >\n <View style={styles.cover}>\n {item.cover ? (\n <Image\n source={{ uri: item.cover }}\n style={StyleSheet.absoluteFill}\n contentFit=\"cover\"\n />\n ) : (\n <MaterialCommunityIcons\n name=\"movie-open-outline\"\n size={22}\n color={theme.mutedForeground}\n />\n )}\n {item.aspect ? (\n <View style={styles.aspect}>\n <Text style={styles.aspectLabel}>{item.aspect}</Text>\n </View>\n ) : null}\n </View>\n <Text style={styles.cardTitle} numberOfLines={2}>\n {item.title}\n </Text>\n </Pressable>\n )}\n />\n )}\n </View>\n );\n}\n\nconst makeStyles = themedStyles((theme: CanvasPalette) =>\n StyleSheet.create({\n root: { flex: 1, backgroundColor: theme.background },\n fill: { flex: 1 },\n head: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: GUTTER,\n paddingTop: SPACE.md,\n paddingBottom: SPACE.sm,\n },\n title: { ...TYPE.heading, color: theme.foreground },\n // flexGrow 0: a horizontal ScrollView otherwise swells into any spare height.\n chipScroll: { flexGrow: 0 },\n chips: { paddingHorizontal: GUTTER, paddingVertical: SPACE.sm, gap: SPACE.sm },\n chip: {\n minHeight: 36,\n justifyContent: 'center',\n paddingHorizontal: SPACE.md + 2,\n borderRadius: RADIUS.pill,\n backgroundColor: theme.card,\n },\n chipOn: { backgroundColor: theme.foreground },\n chipLabel: { ...TYPE.label, color: theme.foreground },\n chipLabelOn: { color: theme.background },\n search: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: SPACE.sm,\n marginHorizontal: GUTTER,\n marginBottom: SPACE.md,\n paddingHorizontal: SPACE.md,\n minHeight: 44,\n borderRadius: RADIUS.md,\n backgroundColor: theme.card,\n },\n searchInput: { ...TYPE.body, flex: 1, color: theme.foreground, paddingVertical: SPACE.sm },\n status: { marginTop: SPACE.xl },\n statusRow: { flexDirection: 'row', alignItems: 'center', gap: SPACE.md, paddingHorizontal: GUTTER },\n hint: { ...TYPE.body, fontSize: 14, color: theme.mutedForeground, paddingHorizontal: GUTTER },\n retry: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: SPACE.xs + 2,\n minHeight: 36,\n paddingHorizontal: SPACE.md,\n borderRadius: RADIUS.pill,\n backgroundColor: theme.card,\n },\n list: { paddingHorizontal: GUTTER, paddingBottom: SPACE.xxl },\n row: { gap: SPACE.md, marginBottom: SPACE.lg },\n cover: {\n width: '100%',\n aspectRatio: 16 / 9,\n borderRadius: RADIUS.md,\n overflow: 'hidden',\n backgroundColor: theme.card,\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: SPACE.xs + 2,\n },\n aspect: {\n position: 'absolute',\n right: SPACE.xs + 2,\n bottom: SPACE.xs + 2,\n paddingHorizontal: SPACE.xs + 2,\n paddingVertical: 2,\n borderRadius: 6,\n backgroundColor: 'rgba(10,10,10,0.55)',\n },\n aspectLabel: { fontSize: 11, fontWeight: '600', color: '#fafafa' },\n cardTitle: { ...TYPE.label, color: theme.foreground },\n }),\n);\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TemplatesGallery.js","sources":["../../../../src/features/canvas/home/TemplatesGallery.tsx"],"sourcesContent":["/**\n * Home \"See all\" - the full templates gallery, native twin of surface-kit\n * `chat/TemplatesGallery` fed by canvas-surface `templatesGallerySources.ts`.\n *\n * Header \"Templates\" with the count shown so far (`46+` while more wait),\n * \"Pick a template, then make it yours\", close\n * Chips every source in web's order (./templatesGallerySources)\n * Search per source (\"Search flyers...\"), sent to the source's own search\n * Grid two columns of covers at the source's shape, the title on a dark\n * band over the image, 24 a page, more on scroll\n *\n * Every pick stays native: a design template opens in the design studio, a\n * video look opens its detail (Recreate seeds the video generator), an image\n * or audio prompt seeds that generator.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { FlatList, ScrollView, StyleSheet, Text, TextInput, useWindowDimensions, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Image } from 'expo-image';\nimport type { RunMediaAction } from '../videoEditor/mediaActions';\nimport {\n CANVAS_AUDIO_TEMPLATES,\n loadCanvasTemplateLane,\n mapDesignCorpus,\n type CanvasPromptTemplate,\n} from '../canvasChatTemplates';\nimport { DESIGN_PROMPT_TEMPLATES } from '../designPromptTemplates';\nimport type { LoadDesignCatalog } from '../DesignCategoryGallery';\nimport type { DesignCatalogCard } from '../designCatalog';\nimport { listStudioLooks, type ListStudioLooksOptions, type StudioLook } from '../studioLooks';\nimport { useCanvasTheme, themedStyles, type CanvasPalette } from '../canvasTheme';\nimport { IconButton, Pressable, RADIUS, SPACE, Skeleton, TYPE, pressedStyle } from '../canvasUi';\nimport { LookDetail } from './LookDetail';\nimport {\n TEMPLATES_GALLERY_SOURCES,\n appendGalleryTemplates,\n createGalleryReader,\n galleryCountLabel,\n galleryEmptyText,\n gallerySourceInfo,\n readGalleryPage,\n searchPlaceholder,\n type CanvasGallerySource,\n type GalleryTemplate,\n} from './templatesGallerySources';\n\nexport type { CanvasGallerySource } from './templatesGallerySources';\n/** Back-compat name for the source a gallery opens on. */\nexport type HomeGallerySource = CanvasGallerySource;\n\nconst GUTTER = SPACE.lg;\nconst SEARCH_DEBOUNCE_MS = 250;\n\nfunction corpusFor(lane: 'image' | 'audio' | 'video'): CanvasPromptTemplate[] {\n return lane === 'audio' ? CANVAS_AUDIO_TEMPLATES : mapDesignCorpus(lane, DESIGN_PROMPT_TEMPLATES);\n}\n\nexport function TemplatesGallery({\n initialSource = 'video',\n runAction,\n loadDesignCatalog,\n looksOptions,\n onClose,\n onOpenTemplate,\n onRecreateLook,\n onUsePrompt,\n}: {\n initialSource?: CanvasGallerySource;\n runAction?: RunMediaAction;\n loadDesignCatalog?: LoadDesignCatalog;\n /** The studio catalog's transports (Apollo client, bearer, index URL). */\n looksOptions?: ListStudioLooksOptions;\n onClose: () => void;\n /** A design template: the native design studio. */\n onOpenTemplate?: (card: DesignCatalogCard) => void;\n /** A video look's Recreate: the video generator, seeded. */\n onRecreateLook: (look: StudioLook) => void;\n /** An image or audio prompt: that generator, seeded. */\n onUsePrompt: (mode: 'image' | 'audio', prompt: string) => void;\n}) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n const { width } = useWindowDimensions();\n const column = (width - GUTTER * 2 - SPACE.md) / 2;\n\n const [source, setSource] = useState<CanvasGallerySource>(initialSource);\n const info = gallerySourceInfo(source);\n const [query, setQuery] = useState('');\n const [search, setSearch] = useState('');\n const [items, setItems] = useState<GalleryTemplate[]>([]);\n const [next, setNext] = useState<number | null>(null);\n const [status, setStatus] = useState<'loading' | 'ready' | 'failed'>('loading');\n const [loadingMore, setLoadingMore] = useState(false);\n const [moreFailed, setMoreFailed] = useState(false);\n const [read, setRead] = useState(0);\n const [lookIndex, setLookIndex] = useState(-1);\n /** Every fresh read takes a number; a page landing under an older one is dropped. */\n const readSeq = useRef(0);\n const list = useRef<FlatList<GalleryTemplate>>(null);\n\n // The reads are fixed for the gallery's life: a re-render must not drop the lane cache.\n const optsRef = useRef({ runAction, loadDesignCatalog, looksOptions });\n optsRef.current = { runAction, loadDesignCatalog, looksOptions };\n const readPage = useMemo(\n () =>\n createGalleryReader({\n loadDesign: (group, opts) => {\n const load = optsRef.current.loadDesignCatalog;\n return load ? load(group, opts) : Promise.resolve({ cards: [], hasMore: false, fetched: 0 });\n },\n listLooks: (params) =>\n listStudioLooks(optsRef.current.runAction, params, optsRef.current.looksOptions ?? {}),\n loadLane: (lane, q) => loadCanvasTemplateLane(lane, q, optsRef.current.runAction, corpusFor(lane)),\n }),\n [],\n );\n\n useEffect(() => {\n const timer = setTimeout(() => setSearch(query.trim()), SEARCH_DEBOUNCE_MS);\n return () => clearTimeout(timer);\n }, [query]);\n\n useEffect(() => {\n const seq = ++readSeq.current;\n setStatus('loading');\n setMoreFailed(false);\n setLoadingMore(false);\n readGalleryPage(readPage, source, search || undefined, 0)\n .then((page) => {\n if (seq !== readSeq.current) return;\n setItems(appendGalleryTemplates([], page.items));\n setNext(page.next);\n setStatus('ready');\n list.current?.scrollToOffset({ offset: 0, animated: false });\n })\n .catch(() => {\n if (seq !== readSeq.current) return;\n setItems([]);\n setNext(null);\n setStatus('failed');\n });\n }, [readPage, source, search, read]);\n\n const loadMore = useCallback(\n (retry = false) => {\n if (status !== 'ready' || next === null || loadingMore || (moreFailed && !retry)) return;\n setMoreFailed(false);\n const seq = readSeq.current;\n setLoadingMore(true);\n readGalleryPage(readPage, source, search || undefined, next)\n .then((page) => {\n if (seq !== readSeq.current) return;\n setItems((shown) => appendGalleryTemplates(shown, page.items));\n setNext(page.next);\n })\n .catch(() => {\n if (seq === readSeq.current) setMoreFailed(true);\n })\n .finally(() => {\n if (seq === readSeq.current) setLoadingMore(false);\n });\n },\n [readPage, source, search, status, next, loadingMore, moreFailed],\n );\n\n const looks = useMemo(() => items.map((t) => t.look).filter((l): l is StudioLook => Boolean(l)), [items]);\n\n const pick = (t: GalleryTemplate) => {\n if (t.design) {\n onOpenTemplate?.(t.design);\n return;\n }\n if (t.look) {\n setLookIndex(looks.findIndex((l) => l.id === t.look?.id));\n return;\n }\n if ((t.source === 'image' || t.source === 'audio') && t.prompt) onUsePrompt(t.source, t.prompt);\n };\n\n const chooseSource = (id: CanvasGallerySource) => {\n if (id === source) return;\n readSeq.current += 1;\n setSource(id);\n setQuery('');\n setSearch('');\n setItems([]);\n setNext(null);\n setStatus('loading');\n };\n\n const count = status === 'ready' ? galleryCountLabel(items.length, next !== null) : '';\n const coverHeight = Math.min(column * 1.5, column / info.coverAspect);\n\n const placeholders = (n: number) => (\n <View style={styles.skeletonGrid}>\n {Array.from({ length: n }, (_, i) => (\n <Skeleton key={i} style={{ width: column, height: coverHeight }} radius={RADIUS.md} />\n ))}\n </View>\n );\n\n const empty =\n status === 'loading' ? (\n placeholders(6)\n ) : status === 'failed' ? (\n <View style={styles.message}>\n <Text style={styles.messageText}>Templates couldn't load.</Text>\n <Pressable\n onPress={() => setRead((n) => n + 1)}\n style={({ pressed }) => [styles.retry, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"refresh\" size={16} color={theme.foreground} />\n <Text style={styles.retryLabel}>Retry</Text>\n </Pressable>\n </View>\n ) : (\n <View style={styles.message}>\n <Text style={styles.messageText}>{galleryEmptyText(info.label, search)}</Text>\n </View>\n );\n\n const footer =\n next === null || items.length === 0 ? null : moreFailed ? (\n <View style={styles.message}>\n <Text style={styles.messageText}>More templates couldn't load.</Text>\n <Pressable\n onPress={() => loadMore(true)}\n style={({ pressed }) => [styles.retry, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"refresh\" size={16} color={theme.foreground} />\n <Text style={styles.retryLabel}>Try again</Text>\n </Pressable>\n </View>\n ) : (\n placeholders(2)\n );\n\n return (\n <View style={styles.root}>\n <View style={styles.head}>\n <View style={styles.headText}>\n <View style={styles.titleRow}>\n <Text style={styles.title} accessibilityRole=\"header\" numberOfLines={1}>\n Templates\n </Text>\n {count ? <Text style={styles.count}>{count}</Text> : null}\n </View>\n <Text style={styles.subtitle}>Pick a template, then make it yours</Text>\n </View>\n <IconButton icon=\"close\" label=\"Close templates\" tone=\"filled\" size={36} onPress={onClose} />\n </View>\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n style={styles.chipScroll}\n contentContainerStyle={styles.chips}\n >\n {TEMPLATES_GALLERY_SOURCES.map((s) => {\n const on = s.id === source;\n return (\n <Pressable\n key={s.id}\n onPress={() => chooseSource(s.id)}\n style={({ pressed }) => [styles.chip, on && styles.chipOn, pressedStyle(pressed)]}\n accessibilityRole=\"tab\"\n accessibilityState={{ selected: on }}\n testID={`gallery-source-${s.id}`}\n >\n <Text style={[styles.chipLabel, on && styles.chipLabelOn]}>{s.label}</Text>\n </Pressable>\n );\n })}\n </ScrollView>\n <View style={styles.searchBox}>\n <MaterialCommunityIcons name=\"magnify\" size={20} color={theme.mutedForeground} />\n <TextInput\n value={query}\n onChangeText={setQuery}\n placeholder={searchPlaceholder(info.label)}\n placeholderTextColor={theme.mutedForeground}\n style={styles.searchInput}\n autoCorrect={false}\n returnKeyType=\"search\"\n accessibilityLabel=\"Search templates\"\n />\n {query ? <IconButton icon=\"close\" label=\"Clear search\" onPress={() => setQuery('')} size={32} /> : null}\n </View>\n <FlatList\n ref={list}\n key={`grid:${source}`}\n data={items}\n keyExtractor={(t) => t.id}\n numColumns={2}\n columnWrapperStyle={styles.columns}\n contentContainerStyle={styles.list}\n style={[styles.fill, status === 'loading' && items.length > 0 && styles.stale]}\n showsVerticalScrollIndicator={false}\n keyboardShouldPersistTaps=\"handled\"\n keyboardDismissMode=\"on-drag\"\n ListEmptyComponent={empty}\n ListFooterComponent={footer}\n onEndReached={() => loadMore()}\n onEndReachedThreshold={0.6}\n renderItem={({ item }) => (\n <TemplateCover\n template={item}\n width={column}\n height={coverHeight}\n fit={item.design ? 'contain' : 'cover'}\n onPress={() => pick(item)}\n />\n )}\n />\n <LookDetail\n looks={looks}\n index={lookIndex}\n onIndexChange={setLookIndex}\n onRecreate={(look) => {\n setLookIndex(-1);\n onRecreateLook(look);\n }}\n onClose={() => setLookIndex(-1)}\n />\n </View>\n );\n}\n\n/** Web's cover card: the image at the source's shape, the title on a dark band at its foot. */\nfunction TemplateCover({\n template,\n width,\n height,\n fit,\n onPress,\n}: {\n template: GalleryTemplate;\n width: number;\n height: number;\n fit: 'contain' | 'cover';\n onPress: () => void;\n}) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n const [loaded, setLoaded] = useState(false);\n return (\n <Pressable\n onPress={onPress}\n style={({ pressed }) => [styles.card, { width, height }, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n accessibilityLabel={`Use template ${template.title}`}\n >\n {template.cover ? (\n <>\n {loaded ? null : <Skeleton />}\n <Image\n source={{ uri: template.cover }}\n style={StyleSheet.absoluteFill}\n contentFit={fit}\n transition={150}\n onLoad={() => setLoaded(true)}\n />\n </>\n ) : (\n <View style={styles.noCover}>\n <MaterialCommunityIcons\n name={template.source === 'audio' ? 'music-note-outline' : 'view-dashboard-outline'}\n size={28}\n color={theme.mutedForeground}\n />\n </View>\n )}\n <View pointerEvents=\"none\" style={styles.band}>\n {/* A stepped fade into the band: no gradient module in the remote. */}\n <View style={[styles.fade, { backgroundColor: 'rgba(0,0,0,0.12)' }]} />\n <View style={[styles.fade, { backgroundColor: 'rgba(0,0,0,0.3)' }]} />\n <View style={[styles.fade, { backgroundColor: 'rgba(0,0,0,0.5)' }]} />\n <View style={styles.bandBody}>\n <Text style={styles.bandTitle} numberOfLines={2}>\n {template.title}\n </Text>\n </View>\n </View>\n </Pressable>\n );\n}\n\nconst makeStyles = themedStyles((theme: CanvasPalette) =>\n StyleSheet.create({\n root: { flex: 1, backgroundColor: theme.background },\n fill: { flex: 1 },\n stale: { opacity: 0.6 },\n head: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: SPACE.md,\n paddingHorizontal: GUTTER,\n paddingTop: SPACE.md,\n paddingBottom: SPACE.xs,\n },\n headText: { flex: 1, minWidth: 0 },\n titleRow: { flexDirection: 'row', alignItems: 'baseline', gap: SPACE.sm },\n title: { ...TYPE.heading, color: theme.foreground, flexShrink: 1 },\n count: { ...TYPE.caption, color: theme.mutedForeground, fontVariant: ['tabular-nums'] },\n subtitle: { ...TYPE.caption, fontWeight: '400', marginTop: 2, color: theme.mutedForeground },\n // flexGrow 0: a horizontal ScrollView otherwise swells into any spare height.\n chipScroll: { flexGrow: 0 },\n chips: { paddingHorizontal: GUTTER, paddingVertical: SPACE.sm, gap: SPACE.sm },\n chip: {\n minHeight: 36,\n justifyContent: 'center',\n paddingHorizontal: SPACE.md + 2,\n borderRadius: RADIUS.pill,\n backgroundColor: theme.card,\n },\n chipOn: { backgroundColor: theme.foreground },\n chipLabel: { ...TYPE.label, color: theme.foreground },\n chipLabelOn: { color: theme.background },\n searchBox: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: SPACE.sm,\n minHeight: 44,\n marginHorizontal: GUTTER,\n marginTop: SPACE.xs,\n marginBottom: SPACE.md,\n paddingLeft: SPACE.md,\n paddingRight: SPACE.xs,\n borderRadius: RADIUS.pill,\n backgroundColor: theme.card,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: theme.border,\n },\n searchInput: { ...TYPE.body, flex: 1, paddingVertical: SPACE.sm, color: theme.foreground },\n list: { paddingHorizontal: GUTTER, paddingBottom: SPACE.xxl },\n columns: { gap: SPACE.md, marginBottom: SPACE.md },\n skeletonGrid: { flexDirection: 'row', flexWrap: 'wrap', gap: SPACE.md },\n card: {\n borderRadius: RADIUS.md,\n overflow: 'hidden',\n backgroundColor: theme.card,\n },\n noCover: { ...StyleSheet.absoluteFillObject, alignItems: 'center', justifyContent: 'center' },\n band: { position: 'absolute', left: 0, right: 0, bottom: 0 },\n fade: { height: 6 },\n bandBody: {\n backgroundColor: 'rgba(0,0,0,0.72)',\n paddingHorizontal: SPACE.md,\n paddingTop: SPACE.xs,\n paddingBottom: SPACE.md - 2,\n },\n bandTitle: { ...TYPE.label, lineHeight: 18, color: '#ffffff' },\n message: { alignItems: 'flex-start', gap: SPACE.md, paddingVertical: SPACE.lg },\n messageText: { ...TYPE.body, fontSize: 14, color: theme.mutedForeground },\n retry: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: SPACE.xs + 2,\n minHeight: 40,\n paddingHorizontal: SPACE.lg - 2,\n borderRadius: RADIUS.pill,\n backgroundColor: theme.card,\n },\n retryLabel: { ...TYPE.label, color: theme.foreground },\n }),\n);\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,221 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ const GALLERY_PAGE_SIZE = 24;
21
+ const COVER_ASPECT = {
22
+ audio: 1,
23
+ slides: 16 / 9,
24
+ "business-cards": 16 / 9,
25
+ carousels: 4 / 5,
26
+ logos: 1,
27
+ banners: 2,
28
+ brochures: Math.SQRT2,
29
+ "social-posts": 4 / 5,
30
+ certificates: 11 / 8.5,
31
+ infographics: 2 / 3
32
+ };
33
+ const source = (id, label, group) => {
34
+ var _a;
35
+ return __spreadProps(__spreadValues({
36
+ id,
37
+ label
38
+ }, group ? {
39
+ group
40
+ } : {}), {
41
+ coverAspect: (_a = COVER_ASPECT[id]) != null ? _a : 3 / 4
42
+ });
43
+ };
44
+ const TEMPLATES_GALLERY_SOURCES = [source("video", "Video"), source("image", "Image"), source("audio", "Audio"), source("slides", "Presentations", "canvas-presentation"), source("flyers", "Flyers", "canvas-flyer"), source("business-cards", "Business cards", "canvas-business-card"), source("carousels", "Carousels", "canvas-carousel"), source("logos", "Logos", "canvas-logo"), source("banners", "Banners", "canvas-banner"), source("brochures", "Brochures", "canvas-brochure"), source("branding", "Branding", "canvas-branding"), source("social-posts", "Social posts", "canvas-social-post"), source("certificates", "Certificates", "canvas-certificate"), source("worksheets", "Worksheets", "canvas-worksheet"), source("proposals", "Proposals", "canvas-proposal"), source("newsletters", "Newsletters", "canvas-newsletter"), source("menus", "Menus", "canvas-menu"), source("infographics", "Infographics", "canvas-infographic"), source("documents", "Documents", "canvas-document"), source("reports", "Reports", "canvas-report"), source("letters", "Letters", "canvas-letter"), source("resumes", "Resumes", "canvas-resume")];
45
+ function gallerySourceInfo(id) {
46
+ var _a;
47
+ return (_a = TEMPLATES_GALLERY_SOURCES.find((s) => s.id === id)) != null ? _a : TEMPLATES_GALLERY_SOURCES[0];
48
+ }
49
+ function searchPlaceholder(label) {
50
+ if (!label) return "Search templates\u2026";
51
+ const words = label.toLowerCase();
52
+ return /s$/.test(words) ? `Search ${words}\u2026` : `Search ${words} templates\u2026`;
53
+ }
54
+ function galleryCountLabel(count, hasMore) {
55
+ if (count <= 0) return "";
56
+ return `${count.toLocaleString("en-US")}${hasMore ? "+" : ""}`;
57
+ }
58
+ function galleryEmptyText(label, query) {
59
+ const q = query.trim();
60
+ if (q) return `No templates match "${q}".`;
61
+ const what = /s$/i.test(label) ? label : `${label} templates`;
62
+ return `${what} are being added. Check back soon.`;
63
+ }
64
+ function galleryQueryFor(id, query, offset) {
65
+ const q = (query == null ? void 0 : query.trim()) || void 0;
66
+ const info = gallerySourceInfo(id);
67
+ if (info.group) {
68
+ return {
69
+ kind: "design",
70
+ group: info.group,
71
+ opts: __spreadProps(__spreadValues({}, q ? {
72
+ search: q
73
+ } : {}), {
74
+ offset,
75
+ limit: GALLERY_PAGE_SIZE
76
+ })
77
+ };
78
+ }
79
+ if (id === "video") return {
80
+ kind: "looks",
81
+ params: __spreadProps(__spreadValues({}, q ? {
82
+ query: q
83
+ } : {}), {
84
+ offset,
85
+ limit: GALLERY_PAGE_SIZE
86
+ })
87
+ };
88
+ return __spreadProps(__spreadValues({
89
+ kind: "lane",
90
+ lane: id
91
+ }, q ? {
92
+ query: q
93
+ } : {}), {
94
+ offset,
95
+ limit: GALLERY_PAGE_SIZE
96
+ });
97
+ }
98
+ function lookFromTemplate(t) {
99
+ var _a, _b, _c, _d, _e, _f;
100
+ return {
101
+ id: t.id,
102
+ name: t.title,
103
+ description: (_a = t.description) != null ? _a : "",
104
+ cover: (_b = t.cover) != null ? _b : "",
105
+ coverVideo: (_c = t.coverVideo) != null ? _c : "",
106
+ prompt: t.prompt,
107
+ aspect: (_d = t.aspect) != null ? _d : "",
108
+ category: (_e = t.category) != null ? _e : "",
109
+ tags: (_f = t.tags) != null ? _f : []
110
+ };
111
+ }
112
+ function lookItem(look) {
113
+ return __spreadValues(__spreadProps(__spreadValues(__spreadValues({
114
+ id: look.id,
115
+ source: "video",
116
+ title: look.name
117
+ }, look.description ? {
118
+ description: look.description
119
+ } : {}), look.cover ? {
120
+ cover: look.cover
121
+ } : {}), {
122
+ look,
123
+ prompt: look.prompt
124
+ }), look.aspect ? {
125
+ aspect: look.aspect
126
+ } : {});
127
+ }
128
+ function designItem(id, card) {
129
+ return {
130
+ id: card.id,
131
+ source: id,
132
+ title: card.title,
133
+ cover: card.coverUrl,
134
+ design: card
135
+ };
136
+ }
137
+ function promptItem(id, t) {
138
+ return __spreadValues(__spreadProps(__spreadValues(__spreadValues({
139
+ id: t.id,
140
+ source: id,
141
+ title: t.title
142
+ }, t.description ? {
143
+ description: t.description
144
+ } : {}), t.cover ? {
145
+ cover: t.cover
146
+ } : {}), {
147
+ prompt: t.prompt || t.description || t.title
148
+ }), t.aspect ? {
149
+ aspect: t.aspect
150
+ } : {});
151
+ }
152
+ function slicePage(items, offset, limit) {
153
+ const end = offset + limit;
154
+ return {
155
+ items: items.slice(offset, end),
156
+ next: end < items.length ? end : null
157
+ };
158
+ }
159
+ function createGalleryReader(reads) {
160
+ const lanes = /* @__PURE__ */ new Map();
161
+ const lane = (kind, query) => {
162
+ const key = `${kind}|${query != null ? query : ""}`;
163
+ let hit = lanes.get(key);
164
+ if (!hit) {
165
+ hit = reads.loadLane ? reads.loadLane(kind, query) : Promise.resolve([]);
166
+ lanes.set(key, hit);
167
+ hit.catch(() => lanes.delete(key));
168
+ }
169
+ return hit;
170
+ };
171
+ return async function readPage(id, query, offset) {
172
+ var _a;
173
+ const ask = galleryQueryFor(id, query, offset);
174
+ if (ask.kind === "design") {
175
+ if (!reads.loadDesign) return {
176
+ items: [],
177
+ next: null
178
+ };
179
+ const page = await reads.loadDesign(ask.group, ask.opts);
180
+ return {
181
+ items: page.cards.map((card) => designItem(id, card)),
182
+ // Counted in rows, not cards: a dropped row still moves the next page on.
183
+ next: page.hasMore ? offset + page.fetched : null
184
+ };
185
+ }
186
+ if (ask.kind === "looks") {
187
+ const fallback = async () => slicePage((await lane("video", ask.params.query)).map((t) => lookItem(lookFromTemplate(t))), offset, ask.params.limit);
188
+ if (!reads.listLooks) return fallback();
189
+ const page = await reads.listLooks(ask.params);
190
+ if (offset === 0 && !ask.params.query && page.looks.length === 0 && !page.hasMore) return fallback();
191
+ return {
192
+ items: page.looks.map(lookItem),
193
+ next: page.hasMore ? (_a = page.next) != null ? _a : offset + ask.params.limit : null
194
+ };
195
+ }
196
+ return slicePage((await lane(ask.lane, ask.query)).map((t) => promptItem(id, t)), ask.offset, ask.limit);
197
+ };
198
+ }
199
+ const MAX_EMPTY_PAGES = 5;
200
+ async function readGalleryPage(readPage, id, query, offset) {
201
+ let from = offset;
202
+ for (let read = 1; ; read++) {
203
+ const page = await readPage(id, query, from);
204
+ const next = page.next !== null && page.next > from ? page.next : null;
205
+ if (page.items.length > 0 || next === null || read >= MAX_EMPTY_PAGES) return {
206
+ items: page.items,
207
+ next
208
+ };
209
+ from = next;
210
+ }
211
+ }
212
+ function appendGalleryTemplates(shown, page) {
213
+ const seen = new Set(shown.map((t) => t.id));
214
+ const added = [];
215
+ for (const t of page) {
216
+ if (seen.has(t.id)) continue;
217
+ seen.add(t.id);
218
+ added.push(t);
219
+ }
220
+ return added.length ? [...shown, ...added] : shown;
221
+ }export{GALLERY_PAGE_SIZE,TEMPLATES_GALLERY_SOURCES,appendGalleryTemplates,createGalleryReader,galleryCountLabel,galleryEmptyText,galleryQueryFor,gallerySourceInfo,lookFromTemplate,readGalleryPage,searchPlaceholder};//# sourceMappingURL=templatesGallerySources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templatesGallerySources.js","sources":["../../../../src/features/canvas/home/templatesGallerySources.ts"],"sourcesContent":["/**\n * The canvas's full templates gallery, native twin of canvas-surface\n * `components/templatesGallerySources.ts` + surface-kit `chat/TemplatesGallery`\n * (`templatesPaging`, `templatesSearch`): one chip per kind of template the\n * canvas makes, in web's order. Video first (the video-studio catalog's looks),\n * then the Image and Audio prompt lanes, then every Design Studio catalog.\n *\n * Pure: the reads are injected (`GalleryReads`), so it runs under jest as-is.\n */\nimport type { CanvasPromptTemplate } from '../canvasChatTemplates';\nimport type { DesignCatalogCard, DesignCatalogGroup, DesignCatalogOptions, DesignCatalogPage } from '../designCatalog';\nimport type { StudioLook } from '../studioLooks';\n\nexport type MediaGallerySource = 'video' | 'image' | 'audio';\n\n/** The chips that list a Design Studio catalog: a template on one opens in the native design studio, by id. */\nexport const DESIGN_GALLERY_SOURCES = [\n 'slides',\n 'flyers',\n 'business-cards',\n 'carousels',\n 'logos',\n 'banners',\n 'brochures',\n 'branding',\n 'social-posts',\n 'certificates',\n 'worksheets',\n 'proposals',\n 'newsletters',\n 'menus',\n 'infographics',\n 'documents',\n 'reports',\n 'letters',\n 'resumes',\n] as const;\nexport type DesignGallerySource = (typeof DESIGN_GALLERY_SOURCES)[number];\nexport type CanvasGallerySource = MediaGallerySource | DesignGallerySource;\n\nexport interface GallerySourceInfo {\n id: CanvasGallerySource;\n label: string;\n /** Design sources: the `canvas-*` catalog group the chip lists. */\n group?: DesignCatalogGroup;\n /** The shape of the chip's covers (width / height). */\n coverAspect: number;\n}\n\n/** Templates per page on a phone: about three screens of two-column cards. */\nexport const GALLERY_PAGE_SIZE = 24;\n\n/**\n * Web COVER_ASPECT: decks, business cards and brochures are landscape, banners 2:1,\n * logos square, carousels 4:5, audio square, the rest 3:4.\n */\nconst COVER_ASPECT: Partial<Record<CanvasGallerySource, number>> = {\n audio: 1,\n slides: 16 / 9,\n 'business-cards': 16 / 9,\n carousels: 4 / 5,\n logos: 1,\n banners: 2,\n brochures: Math.SQRT2,\n 'social-posts': 4 / 5,\n certificates: 11 / 8.5,\n infographics: 2 / 3,\n};\n\nconst source = (id: CanvasGallerySource, label: string, group?: DesignCatalogGroup): GallerySourceInfo => ({\n id,\n label,\n ...(group ? { group } : {}),\n coverAspect: COVER_ASPECT[id] ?? 3 / 4,\n});\n\n/** Web CANVAS_GALLERY_CATALOGS, in its order. */\nexport const TEMPLATES_GALLERY_SOURCES: readonly GallerySourceInfo[] = [\n source('video', 'Video'),\n source('image', 'Image'),\n source('audio', 'Audio'),\n source('slides', 'Presentations', 'canvas-presentation'),\n source('flyers', 'Flyers', 'canvas-flyer'),\n source('business-cards', 'Business cards', 'canvas-business-card'),\n source('carousels', 'Carousels', 'canvas-carousel'),\n source('logos', 'Logos', 'canvas-logo'),\n source('banners', 'Banners', 'canvas-banner'),\n source('brochures', 'Brochures', 'canvas-brochure'),\n source('branding', 'Branding', 'canvas-branding'),\n source('social-posts', 'Social posts', 'canvas-social-post'),\n source('certificates', 'Certificates', 'canvas-certificate'),\n source('worksheets', 'Worksheets', 'canvas-worksheet'),\n source('proposals', 'Proposals', 'canvas-proposal'),\n source('newsletters', 'Newsletters', 'canvas-newsletter'),\n source('menus', 'Menus', 'canvas-menu'),\n source('infographics', 'Infographics', 'canvas-infographic'),\n source('documents', 'Documents', 'canvas-document'),\n source('reports', 'Reports', 'canvas-report'),\n source('letters', 'Letters', 'canvas-letter'),\n source('resumes', 'Resumes', 'canvas-resume'),\n];\n\nexport function gallerySourceInfo(id: CanvasGallerySource): GallerySourceInfo {\n return TEMPLATES_GALLERY_SOURCES.find((s) => s.id === id) ?? TEMPLATES_GALLERY_SOURCES[0];\n}\n\nexport function isDesignGallerySource(id: CanvasGallerySource): id is DesignGallerySource {\n return (DESIGN_GALLERY_SOURCES as readonly string[]).includes(id);\n}\n\n/** App gallery group -> the chip that shows it (web SOURCE_FOR_GROUP). */\nconst SOURCE_FOR_GROUP: Record<string, CanvasGallerySource> = {\n videoGeneration: 'video',\n imageGeneration: 'image',\n audioGeneration: 'audio',\n slideDeck: 'slides',\n flyer: 'flyers',\n businessCard: 'business-cards',\n carousel: 'carousels',\n logo: 'logos',\n banner: 'banners',\n brochure: 'brochures',\n branding: 'branding',\n socialPost: 'social-posts',\n certificate: 'certificates',\n worksheet: 'worksheets',\n proposal: 'proposals',\n newsletter: 'newsletters',\n menu: 'menus',\n infographic: 'infographics',\n document: 'documents',\n report: 'reports',\n letter: 'letters',\n resume: 'resumes',\n};\n\n/** The chip a gallery group opens on, or null when the canvas does not make that kind. */\nexport function canvasGallerySourceFor(group: string): CanvasGallerySource | null {\n return SOURCE_FOR_GROUP[group] ?? null;\n}\n\n/** One card in the gallery, whatever it starts. */\nexport interface GalleryTemplate {\n id: string;\n source: CanvasGallerySource;\n title: string;\n description?: string;\n cover?: string;\n /** A design template: opens in the native design studio by id. */\n design?: DesignCatalogCard;\n /** A video look: opens its detail, Recreate seeds the video generator. */\n look?: StudioLook;\n /** An image / audio prompt template: seeds that generator. */\n prompt?: string;\n aspect?: string;\n}\n\nexport interface GalleryPage {\n items: GalleryTemplate[];\n /** Where the next page starts; null once the source is all shown. */\n next: number | null;\n}\n\n/** The search field's hint (surface-kit `searchPlaceholder`): \"Search flyers...\", \"Search video templates...\". */\nexport function searchPlaceholder(label?: string): string {\n if (!label) return 'Search templates…';\n const words = label.toLowerCase();\n return /s$/.test(words) ? `Search ${words}…` : `Search ${words} templates…`;\n}\n\n/** The header count: shown so far, `+` while more pages wait; empty when nothing is shown. */\nexport function galleryCountLabel(count: number, hasMore: boolean): string {\n if (count <= 0) return '';\n return `${count.toLocaleString('en-US')}${hasMore ? '+' : ''}`;\n}\n\n/** The empty grid's line: a search that matched nothing, or a source whose templates are still coming. */\nexport function galleryEmptyText(label: string, query: string): string {\n const q = query.trim();\n if (q) return `No templates match \"${q}\".`;\n const what = /s$/i.test(label) ? label : `${label} templates`;\n return `${what} are being added. Check back soon.`;\n}\n\n/** What one source's page read asks for. */\nexport type GalleryQuery =\n | { kind: 'design'; group: DesignCatalogGroup; opts: DesignCatalogOptions }\n | { kind: 'looks'; params: { query?: string; offset: number; limit: number } }\n | { kind: 'lane'; lane: 'image' | 'audio' | 'video'; query?: string; offset: number; limit: number };\n\n/** One page of a source, as its read names it. */\nexport function galleryQueryFor(id: CanvasGallerySource, query: string | undefined, offset: number): GalleryQuery {\n const q = query?.trim() || undefined;\n const info = gallerySourceInfo(id);\n if (info.group) {\n return {\n kind: 'design',\n group: info.group,\n opts: { ...(q ? { search: q } : {}), offset, limit: GALLERY_PAGE_SIZE },\n };\n }\n if (id === 'video')\n return { kind: 'looks', params: { ...(q ? { query: q } : {}), offset, limit: GALLERY_PAGE_SIZE } };\n return {\n kind: 'lane',\n lane: id as 'image' | 'audio',\n ...(q ? { query: q } : {}),\n offset,\n limit: GALLERY_PAGE_SIZE,\n };\n}\n\n/** The reads a host gives the gallery; a missing one leaves its sources empty. */\nexport interface GalleryReads {\n loadDesign?: (group: DesignCatalogGroup, opts: DesignCatalogOptions) => Promise<DesignCatalogPage>;\n listLooks?: (params: {\n query?: string;\n offset: number;\n limit: number;\n }) => Promise<{ looks: StudioLook[]; hasMore: boolean; next?: number }>;\n /** A prompt lane's whole list (marketplace first, then the corpus), searched. */\n loadLane?: (lane: 'image' | 'audio' | 'video', query: string | undefined) => Promise<CanvasPromptTemplate[]>;\n}\n\nexport function lookFromTemplate(t: CanvasPromptTemplate): StudioLook {\n return {\n id: t.id,\n name: t.title,\n description: t.description ?? '',\n cover: t.cover ?? '',\n coverVideo: t.coverVideo ?? '',\n prompt: t.prompt,\n aspect: t.aspect ?? '',\n category: t.category ?? '',\n tags: t.tags ?? [],\n };\n}\n\nfunction lookItem(look: StudioLook): GalleryTemplate {\n return {\n id: look.id,\n source: 'video',\n title: look.name,\n ...(look.description ? { description: look.description } : {}),\n ...(look.cover ? { cover: look.cover } : {}),\n look,\n prompt: look.prompt,\n ...(look.aspect ? { aspect: look.aspect } : {}),\n };\n}\n\nfunction designItem(id: CanvasGallerySource, card: DesignCatalogCard): GalleryTemplate {\n return { id: card.id, source: id, title: card.title, cover: card.coverUrl, design: card };\n}\n\nfunction promptItem(id: CanvasGallerySource, t: CanvasPromptTemplate): GalleryTemplate {\n return {\n id: t.id,\n source: id,\n title: t.title,\n ...(t.description ? { description: t.description } : {}),\n ...(t.cover ? { cover: t.cover } : {}),\n prompt: t.prompt || t.description || t.title,\n ...(t.aspect ? { aspect: t.aspect } : {}),\n };\n}\n\n/** A local list, a page at a time. */\nfunction slicePage(items: GalleryTemplate[], offset: number, limit: number): GalleryPage {\n const end = offset + limit;\n return { items: items.slice(offset, end), next: end < items.length ? end : null };\n}\n\n/**\n * Reads one page of a source. A prompt lane is one list, read once per search and\n * paged locally. Video is the studio catalog's looks; where it has nothing\n * published (first unsearched page empty), the video prompt lane stands in.\n */\nexport function createGalleryReader(reads: GalleryReads) {\n const lanes = new Map<string, Promise<CanvasPromptTemplate[]>>();\n const lane = (kind: 'image' | 'audio' | 'video', query: string | undefined) => {\n const key = `${kind}|${query ?? ''}`;\n let hit = lanes.get(key);\n if (!hit) {\n hit = reads.loadLane ? reads.loadLane(kind, query) : Promise.resolve([]);\n lanes.set(key, hit);\n hit.catch(() => lanes.delete(key));\n }\n return hit;\n };\n\n return async function readPage(\n id: CanvasGallerySource,\n query: string | undefined,\n offset: number,\n ): Promise<GalleryPage> {\n const ask = galleryQueryFor(id, query, offset);\n if (ask.kind === 'design') {\n if (!reads.loadDesign) return { items: [], next: null };\n const page = await reads.loadDesign(ask.group, ask.opts);\n return {\n items: page.cards.map((card) => designItem(id, card)),\n // Counted in rows, not cards: a dropped row still moves the next page on.\n next: page.hasMore ? offset + page.fetched : null,\n };\n }\n if (ask.kind === 'looks') {\n const fallback = async (): Promise<GalleryPage> =>\n slicePage(\n (await lane('video', ask.params.query)).map((t) => lookItem(lookFromTemplate(t))),\n offset,\n ask.params.limit,\n );\n if (!reads.listLooks) return fallback();\n const page = await reads.listLooks(ask.params);\n if (offset === 0 && !ask.params.query && page.looks.length === 0 && !page.hasMore) return fallback();\n return {\n items: page.looks.map(lookItem),\n next: page.hasMore ? (page.next ?? offset + ask.params.limit) : null,\n };\n }\n return slicePage(\n (await lane(ask.lane, ask.query)).map((t) => promptItem(id, t)),\n ask.offset,\n ask.limit,\n );\n };\n}\n\n/** Pages read in a row that hold nothing to show before the read stops (surface-kit MAX_EMPTY_PAGES). */\nconst MAX_EMPTY_PAGES = 5;\n\n/**\n * One page from `offset`, skipping pages a source emptied (surface-kit\n * `readTemplatesPage`), so the grid never reads \"no templates\" while more wait.\n * A `next` that does not move forward ends the list.\n */\nexport async function readGalleryPage(\n readPage: (id: CanvasGallerySource, query: string | undefined, offset: number) => Promise<GalleryPage>,\n id: CanvasGallerySource,\n query: string | undefined,\n offset: number,\n): Promise<GalleryPage> {\n let from = offset;\n for (let read = 1; ; read++) {\n const page = await readPage(id, query, from);\n const next = page.next !== null && page.next > from ? page.next : null;\n if (page.items.length > 0 || next === null || read >= MAX_EMPTY_PAGES) return { items: page.items, next };\n from = next;\n }\n}\n\n/** `shown` plus the page's templates it does not hold yet (surface-kit `appendTemplates`). */\nexport function appendGalleryTemplates(shown: GalleryTemplate[], page: GalleryTemplate[]): GalleryTemplate[] {\n const seen = new Set(shown.map((t) => t.id));\n const added: GalleryTemplate[] = [];\n for (const t of page) {\n if (seen.has(t.id)) continue;\n seen.add(t.id);\n added.push(t);\n }\n return added.length ? [...shown, ...added] : shown;\n}\n"],"names":[],"mappings":"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"}
@@ -64,16 +64,13 @@ function designNoun(doc) {
64
64
  return "Design";
65
65
  }
66
66
  }
67
- const WORK_ROWS_COLLAPSED = 3;
68
67
  const WORK_ARTIFACTS = {
69
- collapsed: 24,
70
- expanded: 96
71
- };
72
- function collapsedWorkCount(columns = 2, rows = WORK_ROWS_COLLAPSED) {
73
- return Math.max(1, columns) * Math.max(1, rows);
74
- }
75
- function showAllLabel(count, more) {
76
- return `Show all ${count}${more ? "+" : ""}`;
68
+ collapsed: 24};
69
+ const WORK_PAGE = 20;
70
+ const WORK_READ_STEP = 24;
71
+ const WORK_READ_MAX = 200;
72
+ function nextWorkReadLimit(current) {
73
+ return Math.min(WORK_READ_MAX, current + WORK_READ_STEP);
77
74
  }
78
75
  function presetFor(doc, kind) {
79
76
  var _a, _b, _c, _d;
@@ -96,7 +93,11 @@ const CATEGORY_NOUN = {
96
93
  proposal: "Proposal",
97
94
  newsletter: "Newsletter",
98
95
  menu: "Menu",
99
- infographic: "Infographic"
96
+ infographic: "Infographic",
97
+ document: "Document",
98
+ report: "Report",
99
+ letter: "Letter",
100
+ resume: "Resume"
100
101
  };
101
102
  function isBusinessCardSize(doc) {
102
103
  return DESIGN_SIZES.some((s) => s.category === "business-card" && (s.width === doc.pageWidth && s.height === doc.pageHeight || s.width === doc.pageHeight && s.height === doc.pageWidth));
@@ -130,4 +131,4 @@ function videoCoverFrame(src, runAction, pickUrl) {
130
131
  }).then((result) => pickUrl(result) || null).catch(() => null);
131
132
  videoFrames.set(src, job);
132
133
  return job;
133
- }export{WORK_ARTIFACTS,WORK_FILTERS,WORK_ROWS_COLLAPSED,availableFilters,boardCover,collapsedWorkCount,designNoun,matchesFilter,mergeWork,pageCount,presetFor,showAllLabel,studioNoun,videoCoverFrame};//# sourceMappingURL=homeWork.js.map
134
+ }export{WORK_ARTIFACTS,WORK_FILTERS,WORK_PAGE,WORK_READ_MAX,WORK_READ_STEP,availableFilters,boardCover,designNoun,matchesFilter,mergeWork,nextWorkReadLimit,pageCount,presetFor,studioNoun,videoCoverFrame};//# sourceMappingURL=homeWork.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"homeWork.js","sources":["../../../src/features/canvas/homeWork.ts"],"sourcesContent":["/**\n * What screen one lists under \"Your work\" - native twin of canvas-surface\n * `components/home/homeWork.ts`: the boards plus the designs made in the\n * design studio, newest first, with All / Canvases / Designs / Docs filters.\n *\n * Native's design index has no docs today; the Docs filter is kept so the\n * contract matches web and simply never shows until a doc kind exists.\n *\n * Pure (no RN imports) so merge, filters, labels and covers are jest-testable.\n */\nimport type { CanvasBoardSummary } from './surfaceIndex';\nimport type { CanvasItem } from './canvasCore';\nimport type { DesignDocSummary } from '../design/designIndex';\nimport type { PersistedDesignDoc } from '../design/designCore';\nimport type { DesignArtifact } from '../design/doc/artifacts';\nimport type { RunMediaAction } from './videoEditor/mediaActions';\nimport type { DocArtifact } from '../docs/docArtifacts';\n\nexport { docPreviewLines } from '../docs/blocks';\nimport { DESIGN_SIZES, isPrintCategory, type DesignSize, type SizeCategory } from '../design/doc/sizes';\n\nexport type WorkFilter = 'all' | 'canvases' | 'designs' | 'docs';\n\nexport const WORK_FILTERS: ReadonlyArray<{ id: WorkFilter; label: string }> = [\n { id: 'all', label: 'All' },\n { id: 'canvases', label: 'Canvases' },\n { id: 'designs', label: 'Designs' },\n { id: 'docs', label: 'Docs' },\n];\n\nexport type WorkItem =\n | { type: 'board'; id: string; at: number; board: CanvasBoardSummary }\n | { type: 'design'; id: string; at: number; design: DesignDocSummary }\n /** A design studio design (`deck:` / `flyer:` row) - the web Design Studio's own. */\n | { type: 'studio'; id: string; at: number; studio: DesignArtifact }\n /** A rich-text doc (`doc:` row) - the web docs editor's own, opened in the native docs editor. */\n | { type: 'doc'; id: string; at: number; doc: DocArtifact };\n\n/** One list, newest first; equal times keep their input order (boards first). */\nexport function mergeWork(\n boards: readonly CanvasBoardSummary[],\n designs: readonly DesignDocSummary[],\n studio: readonly DesignArtifact[] = [],\n docs: readonly DocArtifact[] = [],\n): WorkItem[] {\n const items: WorkItem[] = [\n ...boards.map((board) => ({ type: 'board' as const, id: board.channelId, at: board.savedAt || 0, board })),\n ...designs.map((d) => ({ type: 'design' as const, id: d.channelId, at: d.savedAt || 0, design: d })),\n ...studio.map((a) => ({ type: 'studio' as const, id: a.id, at: a.updatedAt || 0, studio: a })),\n ...docs.map((d) => ({ type: 'doc' as const, id: d.id, at: d.updatedAt || 0, doc: d })),\n ];\n return items\n .map((item, i) => ({ item, i }))\n .sort((a, b) => b.item.at - a.item.at || a.i - b.i)\n .map((x) => x.item);\n}\n\n/** A design whose kind is a document (none on native yet; web `doc`). */\nfunction isDocKind(kind: string): boolean {\n return kind === 'doc';\n}\n\nexport function matchesFilter(item: WorkItem, filter: WorkFilter): boolean {\n if (filter === 'all') return true;\n if (item.type === 'board') return filter === 'canvases';\n if (item.type === 'doc') return filter === 'docs';\n if (item.type === 'studio') return filter === (isDocKind(item.studio.kind) ? 'docs' : 'designs');\n return filter === (isDocKind(item.design.doc.kind) ? 'docs' : 'designs');\n}\n\n/** The filters worth offering: All plus each kind present. One kind alone needs no chips. */\nexport function availableFilters(items: readonly WorkItem[]): WorkFilter[] {\n const present = WORK_FILTERS.filter((f) => f.id !== 'all' && items.some((item) => matchesFilter(item, f.id)));\n return present.length > 1 ? ['all', ...present.map((f) => f.id)] : [];\n}\n\n/** What a saved design is, in a word or two: the badge on its tile. */\nexport function designNoun(doc: Pick<PersistedDesignDoc, 'kind'>): string {\n switch (doc.kind) {\n case 'tshirt':\n return 'T-shirt';\n case 'postcard':\n return 'Postcard';\n case 'carousel':\n return 'Carousel';\n default:\n return 'Design';\n }\n}\n\n/** Rows of Your work before \"Show all\": three on a phone's two columns (web `ROWS.phone`). */\nexport const WORK_ROWS_COLLAPSED = 3;\n/** Studio designs read for the collapsed list; \"Show all\" re-reads this many (web `ARTIFACTS`). */\nexport const WORK_ARTIFACTS = { collapsed: 24, expanded: 96 } as const;\n\n/** Tiles shown before \"Show all\" on a grid of `columns`. */\nexport function collapsedWorkCount(columns = 2, rows = WORK_ROWS_COLLAPSED): number {\n return Math.max(1, columns) * Math.max(1, rows);\n}\n\n/** \"Show all 14\" / \"Show all 96+\" when the index has more past the read limit. */\nexport function showAllLabel(count: number, more: boolean): string {\n return `Show all ${count}${more ? '+' : ''}`;\n}\n\ntype SizedDoc = { pageWidth?: number; pageHeight?: number; brief?: { platform?: string } | null };\ntype StudioKind = DesignArtifact['kind'] | 'doc';\n\n/**\n * The preset a design was made at (web `presetFor`). Sizes are shared (a US\n * Letter flyer and a letterhead), so the platform the design was made for picks\n * first; a printed piece turned the other way up is still that piece.\n */\nexport function presetFor(doc: SizedDoc, kind: StudioKind): DesignSize | undefined {\n const match = (s: DesignSize) => s.width === doc.pageWidth && s.height === doc.pageHeight;\n const turned = (s: DesignSize) =>\n isPrintCategory(s.category) && s.width === doc.pageHeight && s.height === doc.pageWidth;\n const platform = doc.brief?.platform;\n return (\n DESIGN_SIZES.find((s) => match(s) && s.kind === kind && s.platform === platform) ??\n DESIGN_SIZES.find((s) => match(s) && s.kind === kind) ??\n DESIGN_SIZES.find(match) ??\n DESIGN_SIZES.find((s) => turned(s) && s.kind === kind)\n );\n}\n\nconst CATEGORY_NOUN: Partial<Record<SizeCategory, string>> = {\n presentation: 'Presentation',\n social: 'Social post',\n carousel: 'Carousel',\n flyer: 'Print',\n 'business-card': 'Business card',\n logo: 'Logo',\n banner: 'Banner',\n brochure: 'Brochure',\n certificate: 'Certificate',\n worksheet: 'Worksheet',\n proposal: 'Proposal',\n newsletter: 'Newsletter',\n menu: 'Menu',\n infographic: 'Infographic',\n};\n\nfunction isBusinessCardSize(doc: SizedDoc): boolean {\n return DESIGN_SIZES.some(\n (s) =>\n s.category === 'business-card' &&\n ((s.width === doc.pageWidth && s.height === doc.pageHeight) ||\n (s.width === doc.pageHeight && s.height === doc.pageWidth)),\n );\n}\n\n/** What a studio design is, in a word or two (web `designNoun`): \"Presentation\", \"Poster\", \"Business card\". */\nexport function studioNoun(artifact: { kind: string; doc?: unknown }): string {\n if (artifact.kind === 'doc') return 'Doc';\n const doc = (artifact.doc ?? {}) as SizedDoc;\n if (Number(doc.pageWidth) > 0 && Number(doc.pageHeight) > 0 && isBusinessCardSize(doc)) return 'Business card';\n const preset = presetFor(doc, artifact.kind === 'flyer' ? 'flyer' : 'deck');\n if (preset?.category === 'flyer')\n return /^(Poster|Invitation|Postcard)\\b/.exec(preset.label.replace(/^A\\d /, ''))?.[1] ?? 'Flyer';\n if (preset?.category === 'branding') return /^(Letterhead|Envelope)\\b/.exec(preset.label)?.[1] ?? 'Branding';\n return (preset && CATEGORY_NOUN[preset.category]) ?? (artifact.kind === 'flyer' ? 'Print' : 'Design');\n}\n\n/** \"3 pages\" for a design with more than one page, else empty. */\nexport function pageCount(doc: Pick<PersistedDesignDoc, 'pages'> | null | undefined): string {\n const pages = doc?.pages;\n if (!Array.isArray(pages) || pages.length < 2) return '';\n return `${pages.length} pages`;\n}\n\n/**\n * A board's cover: the first image (always paints, costs nothing), else the\n * first video (its frame is fetched), else none - web `BoardCard`.\n */\nexport function boardCover(items: readonly CanvasItem[]): CanvasItem | undefined {\n return items.find((it) => it.type === 'image') ?? items.find((it) => it.type === 'video');\n}\n\nconst videoFrames = new Map<string, Promise<string | null>>();\n\n/**\n * A still from a video for its board cover, via the editing connector's\n * THUMBNAIL action (as the generate panel's frame picker). One request per\n * source per session; a failure is remembered as null so a broken clip is not\n * re-asked on every grid render. `pickUrl` reads the connector result.\n */\nexport function videoCoverFrame(\n src: string,\n runAction: RunMediaAction,\n pickUrl: (result: Record<string, unknown>) => string,\n): Promise<string | null> {\n const cached = videoFrames.get(src);\n if (cached) return cached;\n const job = runAction('yantra-video-editing', 'YANTRA_VIDEO_EDIT_THUMBNAIL', { input_url: src, time_secs: 1 })\n .then((result) => pickUrl(result) || null)\n .catch(() => null);\n videoFrames.set(src, job);\n return job;\n}\n\n/** Tests only. */\nexport function clearVideoCoverCache(): void {\n videoFrames.clear();\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"homeWork.js","sources":["../../../src/features/canvas/homeWork.ts"],"sourcesContent":["/**\n * What screen one lists under \"Your work\" - native twin of canvas-surface\n * `components/home/homeWork.ts`: the boards plus the designs made in the\n * design studio, newest first, with All / Canvases / Designs / Docs filters.\n *\n * Native's design index has no docs today; the Docs filter is kept so the\n * contract matches web and simply never shows until a doc kind exists.\n *\n * Pure (no RN imports) so merge, filters, labels and covers are jest-testable.\n */\nimport type { CanvasBoardSummary } from './surfaceIndex';\nimport type { CanvasItem } from './canvasCore';\nimport type { DesignDocSummary } from '../design/designIndex';\nimport type { PersistedDesignDoc } from '../design/designCore';\nimport type { DesignArtifact } from '../design/doc/artifacts';\nimport type { RunMediaAction } from './videoEditor/mediaActions';\nimport type { DocArtifact } from '../docs/docArtifacts';\n\nexport { docPreviewLines } from '../docs/blocks';\nimport { DESIGN_SIZES, isPrintCategory, type DesignSize, type SizeCategory } from '../design/doc/sizes';\n\nexport type WorkFilter = 'all' | 'canvases' | 'designs' | 'docs';\n\nexport const WORK_FILTERS: ReadonlyArray<{ id: WorkFilter; label: string }> = [\n { id: 'all', label: 'All' },\n { id: 'canvases', label: 'Canvases' },\n { id: 'designs', label: 'Designs' },\n { id: 'docs', label: 'Docs' },\n];\n\nexport type WorkItem =\n | { type: 'board'; id: string; at: number; board: CanvasBoardSummary }\n | { type: 'design'; id: string; at: number; design: DesignDocSummary }\n /** A design studio design (`deck:` / `flyer:` row) - the web Design Studio's own. */\n | { type: 'studio'; id: string; at: number; studio: DesignArtifact }\n /** A rich-text doc (`doc:` row) - the web docs editor's own, opened in the native docs editor. */\n | { type: 'doc'; id: string; at: number; doc: DocArtifact };\n\n/** One list, newest first; equal times keep their input order (boards first). */\nexport function mergeWork(\n boards: readonly CanvasBoardSummary[],\n designs: readonly DesignDocSummary[],\n studio: readonly DesignArtifact[] = [],\n docs: readonly DocArtifact[] = [],\n): WorkItem[] {\n const items: WorkItem[] = [\n ...boards.map((board) => ({ type: 'board' as const, id: board.channelId, at: board.savedAt || 0, board })),\n ...designs.map((d) => ({ type: 'design' as const, id: d.channelId, at: d.savedAt || 0, design: d })),\n ...studio.map((a) => ({ type: 'studio' as const, id: a.id, at: a.updatedAt || 0, studio: a })),\n ...docs.map((d) => ({ type: 'doc' as const, id: d.id, at: d.updatedAt || 0, doc: d })),\n ];\n return items\n .map((item, i) => ({ item, i }))\n .sort((a, b) => b.item.at - a.item.at || a.i - b.i)\n .map((x) => x.item);\n}\n\n/** A design whose kind is a document (none on native yet; web `doc`). */\nfunction isDocKind(kind: string): boolean {\n return kind === 'doc';\n}\n\nexport function matchesFilter(item: WorkItem, filter: WorkFilter): boolean {\n if (filter === 'all') return true;\n if (item.type === 'board') return filter === 'canvases';\n if (item.type === 'doc') return filter === 'docs';\n if (item.type === 'studio') return filter === (isDocKind(item.studio.kind) ? 'docs' : 'designs');\n return filter === (isDocKind(item.design.doc.kind) ? 'docs' : 'designs');\n}\n\n/** The filters worth offering: All plus each kind present. One kind alone needs no chips. */\nexport function availableFilters(items: readonly WorkItem[]): WorkFilter[] {\n const present = WORK_FILTERS.filter((f) => f.id !== 'all' && items.some((item) => matchesFilter(item, f.id)));\n return present.length > 1 ? ['all', ...present.map((f) => f.id)] : [];\n}\n\n/** What a saved design is, in a word or two: the badge on its tile. */\nexport function designNoun(doc: Pick<PersistedDesignDoc, 'kind'>): string {\n switch (doc.kind) {\n case 'tshirt':\n return 'T-shirt';\n case 'postcard':\n return 'Postcard';\n case 'carousel':\n return 'Carousel';\n default:\n return 'Design';\n }\n}\n\n/** Rows of Your work before \"Show all\": three on a phone's two columns (web `ROWS.phone`). */\nexport const WORK_ROWS_COLLAPSED = 3;\n/** Studio designs read for the collapsed list; \"Show all\" re-reads this many (web `ARTIFACTS`). */\nexport const WORK_ARTIFACTS = { collapsed: 24, expanded: 96 } as const;\n\n/**\n * Your work on a phone pages instead of \"Show all\": 20 tiles, then 20 more as the\n * list nears its end (or \"Load more\"). Designs are read from the index in steps of\n * WORK_READ_STEP as the shown tiles reach what has been read, up to WORK_READ_MAX,\n * so a person with hundreds of designs never loads them all at once.\n */\nexport const WORK_PAGE = 20;\nexport const WORK_READ_STEP = 24;\nexport const WORK_READ_MAX = 200;\n\n/** The next index read size once the shown tiles have used what was read. */\nexport function nextWorkReadLimit(current: number): number {\n return Math.min(WORK_READ_MAX, current + WORK_READ_STEP);\n}\n\n/** Tiles shown before \"Show all\" on a grid of `columns`. */\nexport function collapsedWorkCount(columns = 2, rows = WORK_ROWS_COLLAPSED): number {\n return Math.max(1, columns) * Math.max(1, rows);\n}\n\n/** \"Show all 14\" / \"Show all 96+\" when the index has more past the read limit. */\nexport function showAllLabel(count: number, more: boolean): string {\n return `Show all ${count}${more ? '+' : ''}`;\n}\n\ntype SizedDoc = { pageWidth?: number; pageHeight?: number; brief?: { platform?: string } | null };\ntype StudioKind = DesignArtifact['kind'] | 'doc';\n\n/**\n * The preset a design was made at (web `presetFor`). Sizes are shared (a US\n * Letter flyer and a letterhead), so the platform the design was made for picks\n * first; a printed piece turned the other way up is still that piece.\n */\nexport function presetFor(doc: SizedDoc, kind: StudioKind): DesignSize | undefined {\n const match = (s: DesignSize) => s.width === doc.pageWidth && s.height === doc.pageHeight;\n const turned = (s: DesignSize) =>\n isPrintCategory(s.category) && s.width === doc.pageHeight && s.height === doc.pageWidth;\n const platform = doc.brief?.platform;\n return (\n DESIGN_SIZES.find((s) => match(s) && s.kind === kind && s.platform === platform) ??\n DESIGN_SIZES.find((s) => match(s) && s.kind === kind) ??\n DESIGN_SIZES.find(match) ??\n DESIGN_SIZES.find((s) => turned(s) && s.kind === kind)\n );\n}\n\nconst CATEGORY_NOUN: Partial<Record<SizeCategory, string>> = {\n presentation: 'Presentation',\n social: 'Social post',\n carousel: 'Carousel',\n flyer: 'Print',\n 'business-card': 'Business card',\n logo: 'Logo',\n banner: 'Banner',\n brochure: 'Brochure',\n certificate: 'Certificate',\n worksheet: 'Worksheet',\n proposal: 'Proposal',\n newsletter: 'Newsletter',\n menu: 'Menu',\n infographic: 'Infographic',\n document: 'Document',\n report: 'Report',\n letter: 'Letter',\n resume: 'Resume',\n};\n\nfunction isBusinessCardSize(doc: SizedDoc): boolean {\n return DESIGN_SIZES.some(\n (s) =>\n s.category === 'business-card' &&\n ((s.width === doc.pageWidth && s.height === doc.pageHeight) ||\n (s.width === doc.pageHeight && s.height === doc.pageWidth)),\n );\n}\n\n/** What a studio design is, in a word or two (web `designNoun`): \"Presentation\", \"Poster\", \"Business card\". */\nexport function studioNoun(artifact: { kind: string; doc?: unknown }): string {\n if (artifact.kind === 'doc') return 'Doc';\n const doc = (artifact.doc ?? {}) as SizedDoc;\n if (Number(doc.pageWidth) > 0 && Number(doc.pageHeight) > 0 && isBusinessCardSize(doc)) return 'Business card';\n const preset = presetFor(doc, artifact.kind === 'flyer' ? 'flyer' : 'deck');\n if (preset?.category === 'flyer')\n return /^(Poster|Invitation|Postcard)\\b/.exec(preset.label.replace(/^A\\d /, ''))?.[1] ?? 'Flyer';\n if (preset?.category === 'branding') return /^(Letterhead|Envelope)\\b/.exec(preset.label)?.[1] ?? 'Branding';\n return (preset && CATEGORY_NOUN[preset.category]) ?? (artifact.kind === 'flyer' ? 'Print' : 'Design');\n}\n\n/** \"3 pages\" for a design with more than one page, else empty. */\nexport function pageCount(doc: Pick<PersistedDesignDoc, 'pages'> | null | undefined): string {\n const pages = doc?.pages;\n if (!Array.isArray(pages) || pages.length < 2) return '';\n return `${pages.length} pages`;\n}\n\n/**\n * A board's cover: the first image (always paints, costs nothing), else the\n * first video (its frame is fetched), else none - web `BoardCard`.\n */\nexport function boardCover(items: readonly CanvasItem[]): CanvasItem | undefined {\n return items.find((it) => it.type === 'image') ?? items.find((it) => it.type === 'video');\n}\n\nconst videoFrames = new Map<string, Promise<string | null>>();\n\n/**\n * A still from a video for its board cover, via the editing connector's\n * THUMBNAIL action (as the generate panel's frame picker). One request per\n * source per session; a failure is remembered as null so a broken clip is not\n * re-asked on every grid render. `pickUrl` reads the connector result.\n */\nexport function videoCoverFrame(\n src: string,\n runAction: RunMediaAction,\n pickUrl: (result: Record<string, unknown>) => string,\n): Promise<string | null> {\n const cached = videoFrames.get(src);\n if (cached) return cached;\n const job = runAction('yantra-video-editing', 'YANTRA_VIDEO_EDIT_THUMBNAIL', { input_url: src, time_secs: 1 })\n .then((result) => pickUrl(result) || null)\n .catch(() => null);\n videoFrames.set(src, job);\n return job;\n}\n\n/** Tests only. */\nexport function clearVideoCoverCache(): void {\n videoFrames.clear();\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import {jsx}from'react/jsx-runtime';import React__default,{Suspense}from'react';import {StyleSheet,View,ActivityIndicator}from'react-native';import {useCanvasTheme}from'./canvasTheme.js';var __defProp = Object.defineProperty;
2
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
4
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
5
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
+ var __spreadValues = (a, b) => {
7
+ for (var prop in b || (b = {}))
8
+ if (__hasOwnProp.call(b, prop))
9
+ __defNormalProp(a, prop, b[prop]);
10
+ if (__getOwnPropSymbols)
11
+ for (var prop of __getOwnPropSymbols(b)) {
12
+ if (__propIsEnum.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ }
15
+ return a;
16
+ };
17
+ function EditorLoading() {
18
+ const theme = useCanvasTheme();
19
+ return /* @__PURE__ */ jsx(View, { style: [styles.fill, {
20
+ backgroundColor: theme.background
21
+ }], children: /* @__PURE__ */ jsx(ActivityIndicator, { color: theme.mutedForeground }) });
22
+ }
23
+ function lazyEditor(load) {
24
+ const Lazy = React__default.lazy(async () => ({
25
+ default: await load()
26
+ }));
27
+ function LazyEditor(props) {
28
+ return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(EditorLoading, {}), children: /* @__PURE__ */ jsx(Lazy, __spreadValues({}, props)) });
29
+ }
30
+ return LazyEditor;
31
+ }
32
+ const VideoEditorExperience = lazyEditor(async () => (await import('./VideoEditorExperience.js')).VideoEditorExperience);
33
+ const ImageEditorExperience = lazyEditor(async () => (await import('./ImageEditorExperience.js')).ImageEditorExperience);
34
+ const AudioEditorExperience = lazyEditor(async () => (await import('./AudioEditorExperience.js')).AudioEditorExperience);
35
+ const VideoGeneratorExperience = lazyEditor(async () => (await import('./VideoGeneratorExperience.js')).VideoGeneratorExperience);
36
+ const VideoEditExperience = lazyEditor(async () => (await import('./VideoEditExperience.js')).VideoEditExperience);
37
+ const VideoClipsExperience = lazyEditor(async () => (await import('./VideoClipsExperience.js')).VideoClipsExperience);
38
+ const FrameExtractorExperience = lazyEditor(async () => (await import('./FrameExtractorExperience.js')).FrameExtractorExperience);
39
+ const MoodboardExperience = lazyEditor(async () => (await import('./MoodboardExperience.js')).MoodboardExperience);
40
+ const SetStudioExperience = lazyEditor(async () => (await import('./SetStudioExperience.js')).SetStudioExperience);
41
+ const InfluencerStudioExperience = lazyEditor(async () => (await import('./InfluencerStudioExperience.js')).InfluencerStudioExperience);
42
+ const CameraRecorderExperience = lazyEditor(async () => (await import('./recorder/CameraRecorderExperience.js')).CameraRecorderExperience);
43
+ const DesignExperience = lazyEditor(async () => (await import('../design/DesignExperience.js')).DesignExperience);
44
+ const DocsEditorExperience = lazyEditor(async () => (await import('../docs/DocsEditorExperience.js')).DocsEditorExperience);
45
+ const styles = StyleSheet.create({
46
+ fill: {
47
+ flex: 1,
48
+ alignItems: "center",
49
+ justifyContent: "center"
50
+ }
51
+ });export{AudioEditorExperience,CameraRecorderExperience,DesignExperience,DocsEditorExperience,FrameExtractorExperience,ImageEditorExperience,InfluencerStudioExperience,MoodboardExperience,SetStudioExperience,VideoClipsExperience,VideoEditExperience,VideoEditorExperience,VideoGeneratorExperience};//# sourceMappingURL=lazyEditors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazyEditors.js","sources":["../../../src/features/canvas/lazyEditors.tsx"],"sourcesContent":["/**\n * The canvas editors and studios, loaded when one is opened instead of with the\n * canvas home.\n *\n * WHY: CanvasExperience used to import all of them statically - the 4.6k-line\n * video editor, the Design studio, the Document editor, the 3D set, the image and\n * audio editors and the rest. Opening Canvas then had to load that whole graph\n * before the home could draw: a spinner on every open (in a Metro dev session, a\n * network fetch of every editor). Only the board home is needed to open Canvas;\n * each editor now loads the first time it is opened, and its own module stays\n * cached after that.\n *\n * Each wrapper carries its own Suspense boundary, so a call site renders it\n * exactly like the statically imported component (same props, no boundary to\n * remember). Types still come from the modules via `import type` (erased).\n */\nimport React, { Suspense, type ComponentType } from 'react';\nimport { ActivityIndicator, StyleSheet, View } from 'react-native';\nimport { useCanvasTheme } from './canvasTheme';\nimport type { VideoEditorExperience as VideoEditorT } from './VideoEditorExperience';\nimport type { ImageEditorExperience as ImageEditorT } from './ImageEditorExperience';\nimport type { AudioEditorExperience as AudioEditorT } from './AudioEditorExperience';\nimport type { VideoGeneratorExperience as VideoGeneratorT } from './VideoGeneratorExperience';\nimport type { VideoEditExperience as VideoEditT } from './VideoEditExperience';\nimport type { VideoClipsExperience as VideoClipsT } from './VideoClipsExperience';\nimport type { FrameExtractorExperience as FrameExtractorT } from './FrameExtractorExperience';\nimport type { MoodboardExperience as MoodboardT } from './MoodboardExperience';\nimport type { SetStudioExperience as SetStudioT } from './SetStudioExperience';\nimport type { InfluencerStudioExperience as InfluencerStudioT } from './InfluencerStudioExperience';\nimport type { CameraRecorderExperience as CameraRecorderT } from './recorder/CameraRecorderExperience';\nimport type { DesignExperience as DesignT } from '../design/DesignExperience';\nimport type { DocsEditorExperience as DocsEditorT } from '../docs/DocsEditorExperience';\n\n/** Full-screen placeholder while an editor's module loads (usually a blink). */\nfunction EditorLoading() {\n const theme = useCanvasTheme();\n return (\n <View style={[styles.fill, { backgroundColor: theme.background }]}>\n <ActivityIndicator color={theme.mutedForeground} />\n </View>\n );\n}\n\nfunction lazyEditor<C extends ComponentType<any>>(load: () => Promise<C>): C {\n const Lazy = React.lazy(async () => ({ default: await load() }));\n function LazyEditor(props: React.ComponentProps<C>) {\n return (\n <Suspense fallback={<EditorLoading />}>\n <Lazy {...props} />\n </Suspense>\n );\n }\n return LazyEditor as unknown as C;\n}\n\nexport const VideoEditorExperience = lazyEditor<typeof VideoEditorT>(\n async () => (await import('./VideoEditorExperience')).VideoEditorExperience,\n);\nexport const ImageEditorExperience = lazyEditor<typeof ImageEditorT>(\n async () => (await import('./ImageEditorExperience')).ImageEditorExperience,\n);\nexport const AudioEditorExperience = lazyEditor<typeof AudioEditorT>(\n async () => (await import('./AudioEditorExperience')).AudioEditorExperience,\n);\nexport const VideoGeneratorExperience = lazyEditor<typeof VideoGeneratorT>(\n async () => (await import('./VideoGeneratorExperience')).VideoGeneratorExperience,\n);\nexport const VideoEditExperience = lazyEditor<typeof VideoEditT>(\n async () => (await import('./VideoEditExperience')).VideoEditExperience,\n);\nexport const VideoClipsExperience = lazyEditor<typeof VideoClipsT>(\n async () => (await import('./VideoClipsExperience')).VideoClipsExperience,\n);\nexport const FrameExtractorExperience = lazyEditor<typeof FrameExtractorT>(\n async () => (await import('./FrameExtractorExperience')).FrameExtractorExperience,\n);\nexport const MoodboardExperience = lazyEditor<typeof MoodboardT>(\n async () => (await import('./MoodboardExperience')).MoodboardExperience,\n);\nexport const SetStudioExperience = lazyEditor<typeof SetStudioT>(\n async () => (await import('./SetStudioExperience')).SetStudioExperience,\n);\nexport const InfluencerStudioExperience = lazyEditor<typeof InfluencerStudioT>(\n async () => (await import('./InfluencerStudioExperience')).InfluencerStudioExperience,\n);\nexport const CameraRecorderExperience = lazyEditor<typeof CameraRecorderT>(\n async () => (await import('./recorder/CameraRecorderExperience')).CameraRecorderExperience,\n);\nexport const DesignExperience = lazyEditor<typeof DesignT>(\n async () => (await import('../design/DesignExperience')).DesignExperience,\n);\nexport const DocsEditorExperience = lazyEditor<typeof DocsEditorT>(\n async () => (await import('../docs/DocsEditorExperience')).DocsEditorExperience,\n);\n\nconst styles = StyleSheet.create({\n fill: { flex: 1, alignItems: 'center', justifyContent: 'center' },\n});\n"],"names":["React"],"mappings":";;;;;;;;;;;;;;;;AAkCA,SAAS,aAAgB,GAAA;AACvB,EAAA,MAAM,QAAQ,cAAe,EAAA;AAC7B,EAAA,uBAAQ,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,IAAM,EAAA;AAAA,IAChC,iBAAiB,KAAM,CAAA;AAAA,GACxB,CACS,EAAA,QAAA,kBAAA,GAAA,CAAC,qBAAkB,KAAO,EAAA,KAAA,CAAM,iBAAiB,CACrD,EAAA,CAAA;AACR;AACA,SAAS,WAAyC,IAA2B,EAAA;AAC3E,EAAM,MAAA,IAAA,GAAOA,cAAM,CAAA,IAAA,CAAK,aAAa;AAAA,IACnC,OAAA,EAAS,MAAM,IAAK;AAAA,GACpB,CAAA,CAAA;AACF,EAAA,SAAS,WAAW,KAAgC,EAAA;AAClD,IAAO,uBAAA,GAAA,CAAC,YAAS,QAAU,kBAAA,GAAA,CAAC,iBAAc,CAC9B,EAAA,QAAA,kBAAA,GAAA,CAAC,IAAS,EAAA,cAAA,CAAA,EAAA,EAAA,KAAA,CAAO,CACrB,EAAA,CAAA;AAAA;AAEV,EAAO,OAAA,UAAA;AACT;AACO,MAAM,wBAAwB,UAAgC,CAAA,YAAA,CAAa,MAAM,OAAO,4BAAyB,GAAG,qBAAqB;AACzI,MAAM,wBAAwB,UAAgC,CAAA,YAAA,CAAa,MAAM,OAAO,4BAAyB,GAAG,qBAAqB;AACzI,MAAM,wBAAwB,UAAgC,CAAA,YAAA,CAAa,MAAM,OAAO,4BAAyB,GAAG,qBAAqB;AACzI,MAAM,2BAA2B,UAAmC,CAAA,YAAA,CAAa,MAAM,OAAO,+BAA4B,GAAG,wBAAwB;AACrJ,MAAM,sBAAsB,UAA8B,CAAA,YAAA,CAAa,MAAM,OAAO,0BAAuB,GAAG,mBAAmB;AACjI,MAAM,uBAAuB,UAA+B,CAAA,YAAA,CAAa,MAAM,OAAO,2BAAwB,GAAG,oBAAoB;AACrI,MAAM,2BAA2B,UAAmC,CAAA,YAAA,CAAa,MAAM,OAAO,+BAA4B,GAAG,wBAAwB;AACrJ,MAAM,sBAAsB,UAA8B,CAAA,YAAA,CAAa,MAAM,OAAO,0BAAuB,GAAG,mBAAmB;AACjI,MAAM,sBAAsB,UAA8B,CAAA,YAAA,CAAa,MAAM,OAAO,0BAAuB,GAAG,mBAAmB;AACjI,MAAM,6BAA6B,UAAqC,CAAA,YAAA,CAAa,MAAM,OAAO,iCAA8B,GAAG,0BAA0B;AAC7J,MAAM,2BAA2B,UAAmC,CAAA,YAAA,CAAa,MAAM,OAAO,wCAAqC,GAAG,wBAAwB;AAC9J,MAAM,mBAAmB,UAA2B,CAAA,YAAA,CAAa,MAAM,OAAO,+BAA4B,GAAG,gBAAgB;AAC7H,MAAM,uBAAuB,UAA+B,CAAA,YAAA,CAAa,MAAM,OAAO,iCAA8B,GAAG,oBAAoB;AAClJ,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,IAAM,EAAA;AAAA,IACJ,IAAM,EAAA,CAAA;AAAA,IACN,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA;AAAA;AAEpB,CAAC,CAAA"}