@adminide-stack/yantra-mobile 12.0.121 → 12.0.123

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/lib/features/apps/appArt.js +1 -1
  2. package/lib/features/apps/appArt.js.map +1 -1
  3. package/lib/features/apps/mobileAppCatalog.js +15 -11
  4. package/lib/features/apps/mobileAppCatalog.js.map +1 -1
  5. package/lib/features/canvas/CanvasAgentChatPane.js +82 -20
  6. package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
  7. package/lib/features/canvas/CanvasBoardsGrid.js +291 -100
  8. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
  9. package/lib/features/canvas/CanvasEditToolsPanel.js +105 -12
  10. package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
  11. package/lib/features/canvas/CanvasExperience.js +266 -68
  12. package/lib/features/canvas/CanvasExperience.js.map +1 -1
  13. package/lib/features/canvas/CanvasGeneratePanel.js +204 -66
  14. package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
  15. package/lib/features/canvas/CanvasLibrarySheet.js +31 -13
  16. package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -1
  17. package/lib/features/canvas/CanvasModelPicker.js +176 -0
  18. package/lib/features/canvas/CanvasModelPicker.js.map +1 -0
  19. package/lib/features/canvas/CanvasTasksPanel.js +325 -29
  20. package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
  21. package/lib/features/canvas/CanvasTemplatesPanel.js +5 -4
  22. package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -1
  23. package/lib/features/canvas/CanvasToolDock.js +137 -61
  24. package/lib/features/canvas/CanvasToolDock.js.map +1 -1
  25. package/lib/features/canvas/FrameExtractorExperience.js +33 -2
  26. package/lib/features/canvas/FrameExtractorExperience.js.map +1 -1
  27. package/lib/features/canvas/GeneratorReferenceSlots.js +197 -0
  28. package/lib/features/canvas/GeneratorReferenceSlots.js.map +1 -0
  29. package/lib/features/canvas/NativeCanvasViewer.js +89 -11
  30. package/lib/features/canvas/NativeCanvasViewer.js.map +1 -1
  31. package/lib/features/canvas/PromoContextFields.js +55 -2
  32. package/lib/features/canvas/PromoContextFields.js.map +1 -1
  33. package/lib/features/canvas/SetStudioExperience.js +323 -13
  34. package/lib/features/canvas/SetStudioExperience.js.map +1 -1
  35. package/lib/features/canvas/VideoEditExperience.js +1 -53
  36. package/lib/features/canvas/VideoEditExperience.js.map +1 -1
  37. package/lib/features/canvas/VideoEditorExperience.js +697 -506
  38. package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
  39. package/lib/features/canvas/VideoGeneratorExperience.js +22 -5
  40. package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
  41. package/lib/features/canvas/canvasAgentChat.js +125 -11
  42. package/lib/features/canvas/canvasAgentChat.js.map +1 -1
  43. package/lib/features/canvas/canvasCore.js +117 -12
  44. package/lib/features/canvas/canvasCore.js.map +1 -1
  45. package/lib/features/canvas/canvasEditOps.js +148 -111
  46. package/lib/features/canvas/canvasEditOps.js.map +1 -1
  47. package/lib/features/canvas/canvasTaskSync.js +235 -0
  48. package/lib/features/canvas/canvasTaskSync.js.map +1 -0
  49. package/lib/features/canvas/canvasTasks.js +98 -11
  50. package/lib/features/canvas/canvasTasks.js.map +1 -1
  51. package/lib/features/canvas/createTiles.js +247 -0
  52. package/lib/features/canvas/createTiles.js.map +1 -0
  53. package/lib/features/canvas/deepLinks.js +83 -0
  54. package/lib/features/canvas/deepLinks.js.map +1 -0
  55. package/lib/features/canvas/frameExtract.js +13 -1
  56. package/lib/features/canvas/frameExtract.js.map +1 -1
  57. package/lib/features/canvas/generationModels.js +36 -8
  58. package/lib/features/canvas/generationModels.js.map +1 -1
  59. package/lib/features/canvas/generatorCommands.js +106 -0
  60. package/lib/features/canvas/generatorCommands.js.map +1 -0
  61. package/lib/features/canvas/generatorReferences.js +82 -0
  62. package/lib/features/canvas/generatorReferences.js.map +1 -0
  63. package/lib/features/canvas/homeWork.js +74 -0
  64. package/lib/features/canvas/homeWork.js.map +1 -0
  65. package/lib/features/canvas/linksRpc.js +130 -0
  66. package/lib/features/canvas/linksRpc.js.map +1 -0
  67. package/lib/features/canvas/mediaRecheck.js +176 -0
  68. package/lib/features/canvas/mediaRecheck.js.map +1 -0
  69. package/lib/features/canvas/mediaUrls.js +258 -0
  70. package/lib/features/canvas/mediaUrls.js.map +1 -0
  71. package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
  72. package/lib/features/canvas/promoProjectImport.js +80 -13
  73. package/lib/features/canvas/promoProjectImport.js.map +1 -1
  74. package/lib/features/canvas/promoVideo.js +106 -15
  75. package/lib/features/canvas/promoVideo.js.map +1 -1
  76. package/lib/features/canvas/reframe.js +228 -0
  77. package/lib/features/canvas/reframe.js.map +1 -0
  78. package/lib/features/canvas/serverTasks.js +697 -0
  79. package/lib/features/canvas/serverTasks.js.map +1 -0
  80. package/lib/features/canvas/set/SetViewportWebView.js +207 -28
  81. package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
  82. package/lib/features/canvas/set/agent/prompt.js +66 -0
  83. package/lib/features/canvas/set/agent/prompt.js.map +1 -0
  84. package/lib/features/canvas/set/agent/setOps.js +203 -0
  85. package/lib/features/canvas/set/agent/setOps.js.map +1 -0
  86. package/lib/features/canvas/set/agent/setTurn.js +128 -0
  87. package/lib/features/canvas/set/agent/setTurn.js.map +1 -0
  88. package/lib/features/canvas/set/agent/snapshot.js +43 -0
  89. package/lib/features/canvas/set/agent/snapshot.js.map +1 -0
  90. package/lib/features/canvas/set/agent/tools.js +580 -0
  91. package/lib/features/canvas/set/agent/tools.js.map +1 -0
  92. package/lib/features/canvas/set/setProject.js +43 -4
  93. package/lib/features/canvas/set/setProject.js.map +1 -1
  94. package/lib/features/canvas/set/supplyLibrary.js +397 -0
  95. package/lib/features/canvas/set/supplyLibrary.js.map +1 -0
  96. package/lib/features/canvas/storageLibrary.js +113 -52
  97. package/lib/features/canvas/storageLibrary.js.map +1 -1
  98. package/lib/features/canvas/studioCatalog.js +15 -2
  99. package/lib/features/canvas/studioCatalog.js.map +1 -1
  100. package/lib/features/canvas/studioLooks.js +1 -8
  101. package/lib/features/canvas/studioLooks.js.map +1 -1
  102. package/lib/features/canvas/useBoardMediaRefresh.js +66 -0
  103. package/lib/features/canvas/useBoardMediaRefresh.js.map +1 -0
  104. package/lib/features/canvas/useMediaSource.js +84 -0
  105. package/lib/features/canvas/useMediaSource.js.map +1 -0
  106. package/lib/features/canvas/video3d.js +11 -10
  107. package/lib/features/canvas/video3d.js.map +1 -1
  108. package/lib/features/canvas/videoEditor/BlurBoxOverlay.js +46 -0
  109. package/lib/features/canvas/videoEditor/BlurBoxOverlay.js.map +1 -0
  110. package/lib/features/canvas/videoEditor/ExportTaskCard.js +134 -0
  111. package/lib/features/canvas/videoEditor/ExportTaskCard.js.map +1 -0
  112. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +45 -7
  113. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
  114. package/lib/features/canvas/videoEditor/agent/agentLoop.js +4 -2
  115. package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
  116. package/lib/features/canvas/videoEditor/agent/attachments.js +304 -0
  117. package/lib/features/canvas/videoEditor/agent/attachments.js.map +1 -0
  118. package/lib/features/canvas/videoEditor/agent/brainClient.js +3 -2
  119. package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
  120. package/lib/features/canvas/videoEditor/agent/cutTools.js +207 -7
  121. package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
  122. package/lib/features/canvas/videoEditor/blurBox.js +34 -0
  123. package/lib/features/canvas/videoEditor/blurBox.js.map +1 -0
  124. package/lib/features/canvas/videoEditor/compileTimeline.js +668 -0
  125. package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -0
  126. package/lib/features/canvas/videoEditor/editorModel.js +56 -22
  127. package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
  128. package/lib/features/canvas/videoEditor/exportPipeline.js +77 -0
  129. package/lib/features/canvas/videoEditor/exportPipeline.js.map +1 -0
  130. package/lib/features/canvas/videoEditor/exportRenderer.js +19 -12
  131. package/lib/features/canvas/videoEditor/exportRenderer.js.map +1 -1
  132. package/lib/features/canvas/videoEditor/exportTask.js +216 -0
  133. package/lib/features/canvas/videoEditor/exportTask.js.map +1 -0
  134. package/lib/features/canvas/videoEditor/formWidgets.js +142 -0
  135. package/lib/features/canvas/videoEditor/formWidgets.js.map +1 -0
  136. package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js +195 -0
  137. package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js.map +1 -0
  138. package/lib/features/canvas/videoEditor/produce/produceScenes.js +158 -0
  139. package/lib/features/canvas/videoEditor/produce/produceScenes.js.map +1 -0
  140. package/lib/features/canvas/videoEditor/remoteMediaClient.js +17 -5
  141. package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
  142. package/lib/features/canvas/videoEditor/renderTimeline.js +207 -0
  143. package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -0
  144. package/lib/features/canvas/videoEditor/renewLinks.js +64 -0
  145. package/lib/features/canvas/videoEditor/renewLinks.js.map +1 -0
  146. package/lib/features/canvas/videoEditor/sceneLayers.js +101 -0
  147. package/lib/features/canvas/videoEditor/sceneLayers.js.map +1 -0
  148. package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js +283 -0
  149. package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js.map +1 -0
  150. package/lib/features/canvas/videoEditor/tools/catalog.js +576 -0
  151. package/lib/features/canvas/videoEditor/tools/catalog.js.map +1 -0
  152. package/lib/features/canvas/videoEditor/videoProjectsStore.js +27 -3
  153. package/lib/features/canvas/videoEditor/videoProjectsStore.js.map +1 -1
  154. package/lib/features/webbuilder/WebBuilderExperience.js +29 -1
  155. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  156. package/lib/features/webbuilder/buildFragments.js +8 -4
  157. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  158. package/lib/features/webbuilder/codezenHandoff.js +108 -0
  159. package/lib/features/webbuilder/codezenHandoff.js.map +1 -0
  160. package/lib/features/webbuilder/workflow.js.map +1 -1
  161. package/lib/hooks/useChatApi.js +1 -2
  162. package/lib/hooks/useChatApi.js.map +1 -1
  163. package/lib/screens/CanvasBoard/index.js +12 -1
  164. package/lib/screens/CanvasBoard/index.js.map +1 -1
  165. package/lib/screens/Home/HomeScreen.js.map +1 -1
  166. package/lib/screens/Home/components/HomeSuggestions.js +3 -3
  167. package/lib/screens/Home/components/HomeSuggestions.js.map +1 -1
  168. package/lib/screens/WebBuilder/index.js +4 -2
  169. package/lib/screens/WebBuilder/index.js.map +1 -1
  170. package/lib/screens/WebBuilderNative/index.js +29 -2
  171. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  172. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +30 -6
  173. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  174. package/package.json +3 -3
  175. /package/lib/assets/apps/{paper2poster.webp → poster.webp} +0 -0
@@ -1,6 +1,4 @@
1
- import {jsxs,jsx}from'react/jsx-runtime';import {useState,useEffect,useMemo,useCallback}from'react';import {StyleSheet,useWindowDimensions,View,Text,ScrollView,Pressable,FlatList}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Image}from'expo-image';import {isUnsetBoardTitle}from'./canvasCore.js';import {CANVAS_BOARD_PAGE_SIZE}from'./canvasBoardsCatalog.js';var __defProp = Object.defineProperty;
2
- var __defProps = Object.defineProperties;
3
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
1
+ import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useState,useMemo,useEffect,useCallback}from'react';import {StyleSheet,useWindowDimensions,View,Text,Pressable,ScrollView,FlatList}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Image}from'expo-image';import {isUnsetBoardTitle}from'./canvasCore.js';import {CANVAS_BOARD_PAGE_SIZE}from'./canvasBoardsCatalog.js';import {mergeWork,availableFilters,matchesFilter,WORK_FILTERS,designNoun,pageCount,boardCover,videoCoverFrame}from'./homeWork.js';import {resultUrl}from'./videoEditor/mediaActions.js';import {unwrapProxyUrl}from'./videoEditor/remoteMediaClient.js';var __defProp = Object.defineProperty;
4
2
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
3
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
4
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
@@ -16,12 +14,12 @@ var __spreadValues = (a, b) => {
16
14
  }
17
15
  return a;
18
16
  };
19
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
17
  const MINUTE = 6e4;
21
18
  const HOUR = 60 * MINUTE;
22
19
  const DAY = 24 * HOUR;
23
20
  const GUTTER = 16;
24
21
  const TILE_RADIUS = 12;
22
+ const THUMB_HEIGHT = 140;
25
23
  function relativeTime(ts) {
26
24
  const diff = Date.now() - ts;
27
25
  if (diff < HOUR) return `${Math.max(1, Math.round(diff / MINUTE))}m ago`;
@@ -35,32 +33,34 @@ function CanvasBoardsGrid({
35
33
  onNewCanvas,
36
34
  designs = [],
37
35
  onOpenDesign,
38
- onNewDesign,
39
36
  onAskAgent,
40
- onComposeGenerate,
37
+ createGroups = [],
38
+ onCreate,
41
39
  featuredLooks = [],
42
- onRecreateLook
40
+ onRecreateLook,
41
+ runAction
43
42
  }) {
44
43
  const {
45
44
  width
46
45
  } = useWindowDimensions();
47
46
  const tileWidth = Math.max(140, (width - GUTTER * 3) / 2);
48
47
  const [visible, setVisible] = useState(CANVAS_BOARD_PAGE_SIZE);
48
+ const [filter, setFilter] = useState("all");
49
+ const work = useMemo(() => mergeWork(boards, designs), [boards, designs]);
50
+ const filters = useMemo(() => availableFilters(work), [work]);
51
+ const active = filters.includes(filter) ? filter : "all";
52
+ const shown = useMemo(() => work.filter((item) => matchesFilter(item, active)), [work, active]);
49
53
  useEffect(() => {
50
54
  setVisible(CANVAS_BOARD_PAGE_SIZE);
51
- }, [boards]);
52
- const tiles = useMemo(() => {
53
- const shown = boards.slice(0, visible);
54
- return [{
55
- kind: "new",
56
- id: "__new__"
57
- }, ...shown.map((board) => ({
58
- kind: "board",
59
- id: board.channelId,
60
- board,
61
- preview: board.board.items.find((it) => it.type === "image" || it.type === "video")
62
- }))];
63
- }, [boards, visible]);
55
+ }, [boards, designs, active]);
56
+ const tiles = useMemo(() => [{
57
+ kind: "new",
58
+ id: "__new__"
59
+ }, ...shown.slice(0, visible).map((entry) => ({
60
+ kind: "work",
61
+ id: `${entry.type}:${entry.id}`,
62
+ work: entry
63
+ }))], [shown, visible]);
64
64
  const rows = useMemo(() => {
65
65
  const chunked = [];
66
66
  for (let i = 0; i < tiles.length; i += 2) {
@@ -70,17 +70,39 @@ function CanvasBoardsGrid({
70
70
  }, [tiles]);
71
71
  const loadMore = useCallback(() => {
72
72
  setVisible((count) => {
73
- if (count >= boards.length) return count;
74
- return Math.min(count + CANVAS_BOARD_PAGE_SIZE, boards.length);
73
+ if (count >= shown.length) return count;
74
+ return Math.min(count + CANVAS_BOARD_PAGE_SIZE, shown.length);
75
75
  });
76
- }, [boards.length]);
77
- const studioStrip = onNewDesign || onAskAgent || onComposeGenerate || featuredLooks.length > 0 ? /* @__PURE__ */ jsxs(View, { style: styles.studioStrip, children: [
78
- onComposeGenerate ? /* @__PURE__ */ jsxs(View, { style: styles.composerBlock, children: [
79
- /* @__PURE__ */ jsx(Text, { style: styles.studioLabel, children: "Start creating" }),
80
- /* @__PURE__ */ jsx(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, contentContainerStyle: styles.studioRow, children: [["video", "Featured look", "Cinematic product hero, soft rim light, 9:16"], ["image", "Character", "Portrait of a friendly guide character, clean studio"], ["video", "Camera", "Handheld tracking shot through a neon alley at night"], ["video", "Film setup", "Anamorphic film still, shallow DOF, golden hour"]].map(([mode, label, prompt]) => /* @__PURE__ */ jsx(Pressable, { onPress: () => onComposeGenerate({
81
- mode,
82
- prompt
83
- }), style: styles.studioChip, accessibilityRole: "button", children: /* @__PURE__ */ jsx(Text, { style: styles.studioChipLabel, children: label }) }, label)) })
76
+ }, [shown.length]);
77
+ const header = /* @__PURE__ */ jsxs(View, { style: styles.header, children: [
78
+ onCreate && createGroups.length > 0 ? /* @__PURE__ */ jsxs(View, { style: styles.createBlock, children: [
79
+ /* @__PURE__ */ jsxs(View, { style: styles.createHead, children: [
80
+ /* @__PURE__ */ jsxs(View, { style: styles.flexShrink, children: [
81
+ /* @__PURE__ */ jsx(Text, { style: styles.createTitle, children: "Create" }),
82
+ /* @__PURE__ */ jsx(Text, { style: styles.createSub, children: "Generate, edit, or start a blank design." })
83
+ ] }),
84
+ onAskAgent ? /* @__PURE__ */ jsxs(Pressable, { onPress: onAskAgent, style: styles.askAgentBtn, accessibilityRole: "button", accessibilityLabel: "AI Chat", children: [
85
+ /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "creation", size: 14, color: "#64748b" }),
86
+ /* @__PURE__ */ jsx(Text, { style: styles.askAgentLabel, children: "AI Chat" })
87
+ ] }) : null
88
+ ] }),
89
+ createGroups.map((group) => /* @__PURE__ */ jsxs(View, { style: styles.group, children: [
90
+ /* @__PURE__ */ jsx(Text, { style: [styles.groupTitle, {
91
+ color: group.accent.fg,
92
+ borderBottomColor: group.accent.bg
93
+ }], children: group.title }),
94
+ /* @__PURE__ */ jsx(View, { style: styles.groupTiles, children: group.tiles.map((tile) => /* @__PURE__ */ jsxs(Pressable, { onPress: () => onCreate(tile.action, tile.id), style: [styles.createTile, {
95
+ width: tileWidth
96
+ }], accessibilityRole: "button", accessibilityLabel: `${tile.label}: ${tile.hint}`, testID: `create-tile-${tile.id}`, children: [
97
+ /* @__PURE__ */ jsx(View, { style: [styles.createIcon, {
98
+ backgroundColor: group.accent.bg
99
+ }], children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: tile.icon, size: 18, color: group.accent.fg }) }),
100
+ /* @__PURE__ */ jsxs(View, { style: styles.flexShrink, children: [
101
+ /* @__PURE__ */ jsx(Text, { style: styles.createLabel, numberOfLines: 1, children: tile.label }),
102
+ /* @__PURE__ */ jsx(Text, { style: styles.createHint, numberOfLines: 2, children: tile.hint })
103
+ ] })
104
+ ] }, tile.id)) })
105
+ ] }, group.id))
84
106
  ] }) : null,
85
107
  featuredLooks.length > 0 && onRecreateLook ? /* @__PURE__ */ jsxs(View, { style: styles.composerBlock, children: [
86
108
  /* @__PURE__ */ jsx(Text, { style: styles.studioLabel, children: "Looks" }),
@@ -91,26 +113,18 @@ function CanvasBoardsGrid({
91
113
  /* @__PURE__ */ jsx(Text, { style: styles.lookName, numberOfLines: 2, children: look.name })
92
114
  ] }, look.id)) })
93
115
  ] }) : null,
94
- /* @__PURE__ */ jsxs(View, { style: styles.studioHead, children: [
95
- /* @__PURE__ */ jsx(Text, { style: styles.studioLabel, children: "Design studio" }),
96
- onAskAgent ? /* @__PURE__ */ jsxs(Pressable, { onPress: onAskAgent, style: styles.askAgentBtn, accessibilityRole: "button", accessibilityLabel: "AI Chat", children: [
97
- /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "creation", size: 14, color: "#64748b" }),
98
- /* @__PURE__ */ jsx(Text, { style: styles.askAgentLabel, children: "AI Chat" })
99
- ] }) : null
100
- ] }),
101
- onNewDesign ? /* @__PURE__ */ jsxs(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, contentContainerStyle: styles.studioRow, children: [
102
- [["design", "shape-square-plus", "Design"], ["tshirt", "tshirt-crew-outline", "T-shirt"], ["postcard", "email-outline", "Postcard"]].map(([kind, icon, label]) => /* @__PURE__ */ jsxs(Pressable, { onPress: () => onNewDesign(kind), style: styles.studioChip, accessibilityRole: "button", accessibilityLabel: `New ${label}`, children: [
103
- /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: icon, size: 16, color: "#0f172a" }),
104
- /* @__PURE__ */ jsx(Text, { style: styles.studioChipLabel, children: label })
105
- ] }, kind)),
106
- designs.map((design) => /* @__PURE__ */ jsxs(Pressable, { onPress: () => onOpenDesign == null ? void 0 : onOpenDesign(design.channelId), style: [styles.studioChip, styles.studioChipSaved], accessibilityRole: "button", children: [
107
- /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: design.doc.kind === "tshirt" ? "tshirt-crew-outline" : design.doc.kind === "postcard" ? "email-outline" : "shape-square-plus", size: 16, color: "#f8fafc" }),
108
- /* @__PURE__ */ jsx(Text, { style: [styles.studioChipLabel, styles.studioChipLabelSaved], numberOfLines: 1, children: design.title || "Design" })
109
- ] }, design.channelId))
110
- ] }) : null
111
- ] }) : null;
116
+ /* @__PURE__ */ jsxs(View, { style: styles.workHead, children: [
117
+ /* @__PURE__ */ jsx(Text, { style: styles.workTitle, children: "Your work" }),
118
+ filters.length > 0 ? /* @__PURE__ */ jsx(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, contentContainerStyle: styles.studioRow, children: WORK_FILTERS.filter((f) => filters.includes(f.id)).map((f) => {
119
+ const on = f.id === active;
120
+ return /* @__PURE__ */ jsx(Pressable, { onPress: () => setFilter(f.id), style: [styles.filterChip, on && styles.filterChipOn], accessibilityRole: "button", accessibilityState: {
121
+ selected: on
122
+ }, children: /* @__PURE__ */ jsx(Text, { style: [styles.filterLabel, on && styles.filterLabelOn], children: f.label }) }, f.id);
123
+ }) }) : null
124
+ ] })
125
+ ] });
112
126
  const renderTile = (item) => {
113
- var _a;
127
+ var _a, _b;
114
128
  if (item.kind === "new") {
115
129
  return /* @__PURE__ */ jsxs(Pressable, { onPress: onNewCanvas, style: [styles.tile, styles.tileDashed, {
116
130
  width: tileWidth
@@ -123,23 +137,43 @@ function CanvasBoardsGrid({
123
137
  ] });
124
138
  }
125
139
  const {
126
- board,
127
- preview
140
+ work: entry
128
141
  } = item;
129
- const title = !isUnsetBoardTitle(board.title) ? board.title : ((_a = board.board.items.find((it) => it.generatedAssetName)) == null ? void 0 : _a.generatedAssetName) || "Untitled";
142
+ if (entry.type === "design") {
143
+ const {
144
+ design
145
+ } = entry;
146
+ const noun = designNoun(design.doc);
147
+ const title2 = ((_a = design.title) == null ? void 0 : _a.trim()) || `Untitled ${noun.toLowerCase()}`;
148
+ const meta = [noun, pageCount(design.doc), relativeTime(design.savedAt)].filter(Boolean).join(" \xB7 ");
149
+ return /* @__PURE__ */ jsxs(Pressable, { onPress: () => onOpenDesign == null ? void 0 : onOpenDesign(design.channelId), style: [styles.tile, {
150
+ width: tileWidth
151
+ }], accessibilityRole: "button", accessibilityLabel: `Open ${noun.toLowerCase()} ${title2}`, children: [
152
+ /* @__PURE__ */ jsx(View, { style: styles.thumb, children: /* @__PURE__ */ jsx(DesignThumb, { doc: design.doc, maxWidth: tileWidth - 24 }) }),
153
+ /* @__PURE__ */ jsxs(View, { style: styles.meta, children: [
154
+ /* @__PURE__ */ jsx(Text, { style: styles.metaTitle, numberOfLines: 1, children: title2 }),
155
+ /* @__PURE__ */ jsx(Text, { style: styles.metaSub, numberOfLines: 1, children: meta })
156
+ ] })
157
+ ] });
158
+ }
159
+ const {
160
+ board
161
+ } = entry;
162
+ const cover = boardCover(board.board.items);
163
+ const title = !isUnsetBoardTitle(board.title) ? board.title : ((_b = board.board.items.find((it) => it.generatedAssetName)) == null ? void 0 : _b.generatedAssetName) || "Untitled";
130
164
  return /* @__PURE__ */ jsxs(Pressable, { onPress: () => onOpen(board.channelId), style: [styles.tile, {
131
165
  width: tileWidth
132
166
  }], accessibilityRole: "button", children: [
133
- /* @__PURE__ */ jsx(View, { style: styles.thumb, children: (preview == null ? void 0 : preview.type) === "image" ? /* @__PURE__ */ jsx(Image, { source: {
134
- uri: preview.src
135
- }, style: styles.thumbImage, contentFit: "cover" }) : (preview == null ? void 0 : preview.type) === "video" ? /* @__PURE__ */ jsx(View, { style: styles.thumbVideo, children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "play", size: 28, color: "#f8fafc" }) }) : /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "image-outline", size: 28, color: "#94a3b8" }) }),
167
+ /* @__PURE__ */ jsx(View, { style: styles.thumb, children: cover ? /* @__PURE__ */ jsx(BoardCover, { item: cover, runAction }, cover.src) : /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "image-outline", size: 28, color: "#94a3b8" }) }),
136
168
  /* @__PURE__ */ jsxs(View, { style: styles.meta, children: [
137
169
  /* @__PURE__ */ jsx(Text, { style: styles.metaTitle, numberOfLines: 1, children: title }),
138
170
  /* @__PURE__ */ jsxs(Text, { style: styles.metaSub, children: [
171
+ "Canvas \xB7 ",
139
172
  board.itemCount,
140
173
  " item",
141
174
  board.itemCount === 1 ? "" : "s",
142
- " \xB7 ",
175
+ " \xB7",
176
+ " ",
143
177
  relativeTime(board.savedAt)
144
178
  ] })
145
179
  ] })
@@ -147,8 +181,8 @@ function CanvasBoardsGrid({
147
181
  };
148
182
  return /* @__PURE__ */ jsxs(View, { style: styles.plane, children: [
149
183
  /* @__PURE__ */ jsx(DotGrid, {}),
150
- boards.length === 0 ? /* @__PURE__ */ jsxs(View, { style: styles.emptyWrap, children: [
151
- studioStrip,
184
+ work.length === 0 ? /* @__PURE__ */ jsxs(ScrollView, { contentContainerStyle: styles.emptyWrap, showsVerticalScrollIndicator: false, children: [
185
+ header,
152
186
  /* @__PURE__ */ jsxs(View, { style: styles.emptyCard, children: [
153
187
  /* @__PURE__ */ jsx(Text, { style: styles.emptyTitle, children: "Your canvases will appear here" }),
154
188
  /* @__PURE__ */ jsx(Text, { style: styles.emptyDetail, children: "Every chat gets its own canvas. Generate an image, video, or audio and it lands on this board \u2014 come back here to reach the ones from your other chats." }),
@@ -157,7 +191,7 @@ function CanvasBoardsGrid({
157
191
  /* @__PURE__ */ jsx(Text, { style: styles.emptyCtaLabel, children: "New canvas" })
158
192
  ] })
159
193
  ] })
160
- ] }) : /* @__PURE__ */ jsx(FlatList, { data: rows, keyExtractor: (pair) => pair.map((item) => item.id).join(":"), contentContainerStyle: styles.gridList, showsVerticalScrollIndicator: false, onEndReached: loadMore, onEndReachedThreshold: 0.4, ListHeaderComponent: studioStrip ? /* @__PURE__ */ jsx(View, { style: styles.studioInGrid, children: studioStrip }) : null, renderItem: ({
194
+ ] }) : /* @__PURE__ */ jsx(FlatList, { data: rows, keyExtractor: (pair) => pair.map((item) => item.id).join(":"), contentContainerStyle: styles.gridList, showsVerticalScrollIndicator: false, onEndReached: loadMore, onEndReachedThreshold: 0.4, ListHeaderComponent: header, renderItem: ({
161
195
  item: pair
162
196
  }) => /* @__PURE__ */ jsxs(View, { style: styles.row, children: [
163
197
  pair.map((entry) => /* @__PURE__ */ jsx(View, { children: renderTile(entry) }, entry.id)),
@@ -167,6 +201,85 @@ function CanvasBoardsGrid({
167
201
  ] }) })
168
202
  ] });
169
203
  }
204
+ function BoardCover({
205
+ item,
206
+ runAction
207
+ }) {
208
+ const [failed, setFailed] = useState(false);
209
+ const [frame, setFrame] = useState(item.type === "video" ? void 0 : item.src);
210
+ useEffect(() => {
211
+ if (item.type !== "video") return void 0;
212
+ if (!runAction) {
213
+ setFrame(null);
214
+ return void 0;
215
+ }
216
+ let live = true;
217
+ void videoCoverFrame(unwrapProxyUrl(item.src), runAction, (result) => resultUrl(result, "YANTRA_VIDEO_EDIT_THUMBNAIL")).then((url) => {
218
+ if (live) setFrame(url);
219
+ });
220
+ return () => {
221
+ live = false;
222
+ };
223
+ }, [item.src, item.type, runAction]);
224
+ const isVideo = item.type === "video";
225
+ if (failed || frame === null) {
226
+ return /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: isVideo ? "movie-outline" : "image-off-outline", size: 28, color: "#94a3b8" });
227
+ }
228
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
229
+ frame ? /* @__PURE__ */ jsx(Image, { source: {
230
+ uri: frame
231
+ }, style: styles.thumbImage, contentFit: "cover", onError: () => setFailed(true) }) : null,
232
+ isVideo ? /* @__PURE__ */ jsx(View, { style: styles.playBadge, pointerEvents: "none", children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "play", size: 18, color: "#f8fafc" }) }) : null
233
+ ] });
234
+ }
235
+ function DesignThumb({
236
+ doc,
237
+ maxWidth
238
+ }) {
239
+ const page = doc.pages[0];
240
+ if (!page || !(page.width > 0) || !(page.height > 0)) {
241
+ return /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "shape-outline", size: 28, color: "#94a3b8" });
242
+ }
243
+ const maxH = THUMB_HEIGHT - 24;
244
+ const scale = Math.min(maxWidth / page.width, maxH / page.height);
245
+ const layers = [...page.layers].sort((a, b) => a.zIndex - b.zIndex);
246
+ return /* @__PURE__ */ jsx(View, { style: [styles.designPage, {
247
+ width: page.width * scale,
248
+ height: page.height * scale,
249
+ backgroundColor: page.background || "#ffffff"
250
+ }], pointerEvents: "none", children: layers.map((layer) => /* @__PURE__ */ jsx(DesignThumbLayer, { layer, scale }, layer.id)) });
251
+ }
252
+ function DesignThumbLayer({
253
+ layer,
254
+ scale
255
+ }) {
256
+ const box = {
257
+ position: "absolute",
258
+ left: layer.x * scale,
259
+ top: layer.y * scale,
260
+ width: layer.width * scale,
261
+ height: layer.height * scale,
262
+ opacity: layer.opacity
263
+ };
264
+ if (layer.type === "image") {
265
+ return /* @__PURE__ */ jsx(Image, { source: {
266
+ uri: layer.src
267
+ }, style: box, contentFit: "cover" });
268
+ }
269
+ if (layer.type === "shape") {
270
+ return /* @__PURE__ */ jsx(View, { style: [box, {
271
+ backgroundColor: layer.fill,
272
+ borderRadius: layer.cornerRadius * scale
273
+ }] });
274
+ }
275
+ return /* @__PURE__ */ jsx(Text, { style: [box, {
276
+ color: layer.color,
277
+ fontSize: Math.max(4, layer.fontSize * scale),
278
+ lineHeight: Math.max(5, layer.fontSize * scale * 1.15),
279
+ fontWeight: layer.bold ? "700" : "400",
280
+ textAlign: layer.align
281
+ }], numberOfLines: 3, children: layer.text });
282
+ }
170
283
  function DotGrid() {
171
284
  return /* @__PURE__ */ jsx(View, { pointerEvents: "none", style: styles.dots, children: Array.from({
172
285
  length: 18
@@ -198,10 +311,10 @@ const styles = StyleSheet.create({
198
311
  backgroundColor: "rgba(15,23,42,0.14)"
199
312
  },
200
313
  emptyWrap: {
201
- flex: 1,
314
+ flexGrow: 1,
202
315
  alignItems: "center",
203
- justifyContent: "center",
204
- padding: 24
316
+ padding: GUTTER,
317
+ paddingBottom: 32
205
318
  },
206
319
  emptyCard: {
207
320
  width: "100%",
@@ -279,7 +392,7 @@ const styles = StyleSheet.create({
279
392
  backgroundColor: "rgba(255,255,255,0.7)"
280
393
  },
281
394
  thumb: {
282
- height: 140,
395
+ height: THUMB_HEIGHT,
283
396
  alignItems: "center",
284
397
  justifyContent: "center",
285
398
  backgroundColor: "#f1f5f9",
@@ -287,21 +400,104 @@ const styles = StyleSheet.create({
287
400
  gap: 8
288
401
  },
289
402
  thumbImage: __spreadValues({}, StyleSheet.absoluteFillObject),
290
- thumbVideo: __spreadProps(__spreadValues({}, StyleSheet.absoluteFillObject), {
403
+ playBadge: {
404
+ position: "absolute",
405
+ right: 8,
406
+ bottom: 8,
407
+ width: 28,
408
+ height: 28,
409
+ borderRadius: 14,
291
410
  alignItems: "center",
292
411
  justifyContent: "center",
293
- backgroundColor: "#0f172a"
294
- }),
412
+ backgroundColor: "rgba(15,23,42,0.55)"
413
+ },
414
+ designPage: {
415
+ overflow: "hidden",
416
+ borderRadius: 2,
417
+ shadowColor: "#0f172a",
418
+ shadowOpacity: 0.12,
419
+ shadowRadius: 4,
420
+ shadowOffset: {
421
+ width: 0,
422
+ height: 1
423
+ },
424
+ elevation: 1
425
+ },
295
426
  dashHint: {
296
427
  fontSize: 12,
297
428
  color: "#64748b"
298
429
  },
299
- studioStrip: {
430
+ header: {
300
431
  alignSelf: "stretch",
432
+ width: "100%",
433
+ marginBottom: 4
434
+ },
435
+ createBlock: {
301
436
  marginBottom: 16
302
437
  },
438
+ createHead: {
439
+ flexDirection: "row",
440
+ alignItems: "flex-start",
441
+ justifyContent: "space-between",
442
+ gap: 12,
443
+ marginBottom: 12
444
+ },
445
+ createTitle: {
446
+ fontSize: 22,
447
+ fontWeight: "600",
448
+ color: "#0f172a"
449
+ },
450
+ createSub: {
451
+ marginTop: 2,
452
+ fontSize: 13,
453
+ color: "#64748b"
454
+ },
455
+ flexShrink: {
456
+ flexShrink: 1
457
+ },
458
+ group: {
459
+ marginBottom: 14
460
+ },
461
+ groupTitle: {
462
+ fontSize: 16,
463
+ fontWeight: "600",
464
+ paddingBottom: 6,
465
+ marginBottom: 8,
466
+ borderBottomWidth: 1
467
+ },
468
+ groupTiles: {
469
+ flexDirection: "row",
470
+ flexWrap: "wrap",
471
+ columnGap: GUTTER,
472
+ rowGap: 4
473
+ },
474
+ createTile: {
475
+ flexDirection: "row",
476
+ alignItems: "flex-start",
477
+ gap: 10,
478
+ minHeight: 48,
479
+ paddingVertical: 6
480
+ },
481
+ createIcon: {
482
+ width: 36,
483
+ height: 36,
484
+ borderRadius: 10,
485
+ alignItems: "center",
486
+ justifyContent: "center"
487
+ },
488
+ createLabel: {
489
+ fontSize: 14,
490
+ fontWeight: "600",
491
+ color: "#0f172a"
492
+ },
493
+ createHint: {
494
+ marginTop: 1,
495
+ fontSize: 11,
496
+ lineHeight: 14,
497
+ color: "#64748b"
498
+ },
303
499
  composerBlock: {
304
- marginBottom: 12,
500
+ marginBottom: 16,
305
501
  gap: 8
306
502
  },
307
503
  lookChip: {
@@ -328,15 +524,34 @@ const styles = StyleSheet.create({
328
524
  fontWeight: "600",
329
525
  color: "#0f172a"
330
526
  },
331
- studioInGrid: {
332
- width: "100%"
527
+ workHead: {
528
+ gap: 8,
529
+ marginBottom: 12
333
530
  },
334
- studioHead: {
335
- flexDirection: "row",
336
- alignItems: "center",
337
- justifyContent: "space-between",
338
- gap: 12,
339
- marginBottom: 8
531
+ workTitle: {
532
+ fontSize: 18,
533
+ fontWeight: "600",
534
+ color: "#0f172a"
535
+ },
536
+ filterChip: {
537
+ backgroundColor: "#ffffff",
538
+ borderWidth: 1,
539
+ borderColor: "rgba(15,23,42,0.1)",
540
+ borderRadius: 999,
541
+ paddingHorizontal: 14,
542
+ paddingVertical: 7
543
+ },
544
+ filterChipOn: {
545
+ backgroundColor: "#0f172a",
546
+ borderColor: "#0f172a"
547
+ },
548
+ filterLabel: {
549
+ fontSize: 13,
550
+ fontWeight: "600",
551
+ color: "#0f172a"
552
+ },
553
+ filterLabelOn: {
554
+ color: "#f8fafc"
340
555
  },
341
556
  studioLabel: {
342
557
  fontSize: 11,
@@ -368,30 +583,6 @@ const styles = StyleSheet.create({
368
583
  gap: 8,
369
584
  paddingBottom: 4
370
585
  },
371
- studioChip: {
372
- flexDirection: "row",
373
- alignItems: "center",
374
- gap: 6,
375
- backgroundColor: "#ffffff",
376
- borderWidth: 1,
377
- borderColor: "rgba(15,23,42,0.1)",
378
- borderRadius: 999,
379
- paddingHorizontal: 14,
380
- paddingVertical: 9
381
- },
382
- studioChipSaved: {
383
- backgroundColor: "#0f172a",
384
- borderColor: "#0f172a"
385
- },
386
- studioChipLabel: {
387
- fontSize: 13,
388
- fontWeight: "600",
389
- color: "#0f172a",
390
- maxWidth: 140
391
- },
392
- studioChipLabelSaved: {
393
- color: "#f8fafc"
394
- },
395
586
  meta: {
396
587
  borderTopWidth: StyleSheet.hairlineWidth,
397
588
  borderTopColor: "rgba(15,23,42,0.08)",