@adminide-stack/yantra-mobile 12.0.121 → 12.0.123-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/lib/features/apps/appArt.js +1 -1
  2. package/lib/features/apps/appArt.js.map +1 -1
  3. package/lib/features/apps/mobileAppCatalog.js +15 -11
  4. package/lib/features/apps/mobileAppCatalog.js.map +1 -1
  5. package/lib/features/canvas/CanvasAgentChatPane.js +82 -20
  6. package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
  7. package/lib/features/canvas/CanvasBoardsGrid.js +291 -100
  8. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
  9. package/lib/features/canvas/CanvasEditToolsPanel.js +105 -12
  10. package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
  11. package/lib/features/canvas/CanvasExperience.js +266 -68
  12. package/lib/features/canvas/CanvasExperience.js.map +1 -1
  13. package/lib/features/canvas/CanvasGeneratePanel.js +204 -66
  14. package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
  15. package/lib/features/canvas/CanvasLibrarySheet.js +31 -13
  16. package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -1
  17. package/lib/features/canvas/CanvasModelPicker.js +176 -0
  18. package/lib/features/canvas/CanvasModelPicker.js.map +1 -0
  19. package/lib/features/canvas/CanvasTasksPanel.js +325 -29
  20. package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
  21. package/lib/features/canvas/CanvasTemplatesPanel.js +5 -4
  22. package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -1
  23. package/lib/features/canvas/CanvasToolDock.js +137 -61
  24. package/lib/features/canvas/CanvasToolDock.js.map +1 -1
  25. package/lib/features/canvas/FrameExtractorExperience.js +33 -2
  26. package/lib/features/canvas/FrameExtractorExperience.js.map +1 -1
  27. package/lib/features/canvas/GeneratorReferenceSlots.js +197 -0
  28. package/lib/features/canvas/GeneratorReferenceSlots.js.map +1 -0
  29. package/lib/features/canvas/NativeCanvasViewer.js +89 -11
  30. package/lib/features/canvas/NativeCanvasViewer.js.map +1 -1
  31. package/lib/features/canvas/PromoContextFields.js +55 -2
  32. package/lib/features/canvas/PromoContextFields.js.map +1 -1
  33. package/lib/features/canvas/SetStudioExperience.js +323 -13
  34. package/lib/features/canvas/SetStudioExperience.js.map +1 -1
  35. package/lib/features/canvas/VideoEditExperience.js +1 -53
  36. package/lib/features/canvas/VideoEditExperience.js.map +1 -1
  37. package/lib/features/canvas/VideoEditorExperience.js +697 -506
  38. package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
  39. package/lib/features/canvas/VideoGeneratorExperience.js +22 -5
  40. package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
  41. package/lib/features/canvas/canvasAgentChat.js +125 -11
  42. package/lib/features/canvas/canvasAgentChat.js.map +1 -1
  43. package/lib/features/canvas/canvasCore.js +117 -12
  44. package/lib/features/canvas/canvasCore.js.map +1 -1
  45. package/lib/features/canvas/canvasEditOps.js +148 -111
  46. package/lib/features/canvas/canvasEditOps.js.map +1 -1
  47. package/lib/features/canvas/canvasTaskSync.js +235 -0
  48. package/lib/features/canvas/canvasTaskSync.js.map +1 -0
  49. package/lib/features/canvas/canvasTasks.js +98 -11
  50. package/lib/features/canvas/canvasTasks.js.map +1 -1
  51. package/lib/features/canvas/createTiles.js +247 -0
  52. package/lib/features/canvas/createTiles.js.map +1 -0
  53. package/lib/features/canvas/deepLinks.js +83 -0
  54. package/lib/features/canvas/deepLinks.js.map +1 -0
  55. package/lib/features/canvas/frameExtract.js +13 -1
  56. package/lib/features/canvas/frameExtract.js.map +1 -1
  57. package/lib/features/canvas/generationModels.js +36 -8
  58. package/lib/features/canvas/generationModels.js.map +1 -1
  59. package/lib/features/canvas/generatorCommands.js +106 -0
  60. package/lib/features/canvas/generatorCommands.js.map +1 -0
  61. package/lib/features/canvas/generatorReferences.js +82 -0
  62. package/lib/features/canvas/generatorReferences.js.map +1 -0
  63. package/lib/features/canvas/homeWork.js +74 -0
  64. package/lib/features/canvas/homeWork.js.map +1 -0
  65. package/lib/features/canvas/linksRpc.js +130 -0
  66. package/lib/features/canvas/linksRpc.js.map +1 -0
  67. package/lib/features/canvas/mediaRecheck.js +176 -0
  68. package/lib/features/canvas/mediaRecheck.js.map +1 -0
  69. package/lib/features/canvas/mediaUrls.js +258 -0
  70. package/lib/features/canvas/mediaUrls.js.map +1 -0
  71. package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
  72. package/lib/features/canvas/promoProjectImport.js +80 -13
  73. package/lib/features/canvas/promoProjectImport.js.map +1 -1
  74. package/lib/features/canvas/promoVideo.js +106 -15
  75. package/lib/features/canvas/promoVideo.js.map +1 -1
  76. package/lib/features/canvas/reframe.js +228 -0
  77. package/lib/features/canvas/reframe.js.map +1 -0
  78. package/lib/features/canvas/serverTasks.js +697 -0
  79. package/lib/features/canvas/serverTasks.js.map +1 -0
  80. package/lib/features/canvas/set/SetViewportWebView.js +207 -28
  81. package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
  82. package/lib/features/canvas/set/agent/prompt.js +66 -0
  83. package/lib/features/canvas/set/agent/prompt.js.map +1 -0
  84. package/lib/features/canvas/set/agent/setOps.js +203 -0
  85. package/lib/features/canvas/set/agent/setOps.js.map +1 -0
  86. package/lib/features/canvas/set/agent/setTurn.js +128 -0
  87. package/lib/features/canvas/set/agent/setTurn.js.map +1 -0
  88. package/lib/features/canvas/set/agent/snapshot.js +43 -0
  89. package/lib/features/canvas/set/agent/snapshot.js.map +1 -0
  90. package/lib/features/canvas/set/agent/tools.js +580 -0
  91. package/lib/features/canvas/set/agent/tools.js.map +1 -0
  92. package/lib/features/canvas/set/setProject.js +43 -4
  93. package/lib/features/canvas/set/setProject.js.map +1 -1
  94. package/lib/features/canvas/set/supplyLibrary.js +397 -0
  95. package/lib/features/canvas/set/supplyLibrary.js.map +1 -0
  96. package/lib/features/canvas/storageLibrary.js +113 -52
  97. package/lib/features/canvas/storageLibrary.js.map +1 -1
  98. package/lib/features/canvas/studioCatalog.js +15 -2
  99. package/lib/features/canvas/studioCatalog.js.map +1 -1
  100. package/lib/features/canvas/studioLooks.js +1 -8
  101. package/lib/features/canvas/studioLooks.js.map +1 -1
  102. package/lib/features/canvas/useBoardMediaRefresh.js +66 -0
  103. package/lib/features/canvas/useBoardMediaRefresh.js.map +1 -0
  104. package/lib/features/canvas/useMediaSource.js +84 -0
  105. package/lib/features/canvas/useMediaSource.js.map +1 -0
  106. package/lib/features/canvas/video3d.js +11 -10
  107. package/lib/features/canvas/video3d.js.map +1 -1
  108. package/lib/features/canvas/videoEditor/BlurBoxOverlay.js +46 -0
  109. package/lib/features/canvas/videoEditor/BlurBoxOverlay.js.map +1 -0
  110. package/lib/features/canvas/videoEditor/ExportTaskCard.js +134 -0
  111. package/lib/features/canvas/videoEditor/ExportTaskCard.js.map +1 -0
  112. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +45 -7
  113. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
  114. package/lib/features/canvas/videoEditor/agent/agentLoop.js +4 -2
  115. package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
  116. package/lib/features/canvas/videoEditor/agent/attachments.js +304 -0
  117. package/lib/features/canvas/videoEditor/agent/attachments.js.map +1 -0
  118. package/lib/features/canvas/videoEditor/agent/brainClient.js +3 -2
  119. package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
  120. package/lib/features/canvas/videoEditor/agent/cutTools.js +207 -7
  121. package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
  122. package/lib/features/canvas/videoEditor/blurBox.js +34 -0
  123. package/lib/features/canvas/videoEditor/blurBox.js.map +1 -0
  124. package/lib/features/canvas/videoEditor/compileTimeline.js +668 -0
  125. package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -0
  126. package/lib/features/canvas/videoEditor/editorModel.js +56 -22
  127. package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
  128. package/lib/features/canvas/videoEditor/exportPipeline.js +77 -0
  129. package/lib/features/canvas/videoEditor/exportPipeline.js.map +1 -0
  130. package/lib/features/canvas/videoEditor/exportRenderer.js +19 -12
  131. package/lib/features/canvas/videoEditor/exportRenderer.js.map +1 -1
  132. package/lib/features/canvas/videoEditor/exportTask.js +216 -0
  133. package/lib/features/canvas/videoEditor/exportTask.js.map +1 -0
  134. package/lib/features/canvas/videoEditor/formWidgets.js +142 -0
  135. package/lib/features/canvas/videoEditor/formWidgets.js.map +1 -0
  136. package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js +195 -0
  137. package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js.map +1 -0
  138. package/lib/features/canvas/videoEditor/produce/produceScenes.js +158 -0
  139. package/lib/features/canvas/videoEditor/produce/produceScenes.js.map +1 -0
  140. package/lib/features/canvas/videoEditor/remoteMediaClient.js +17 -5
  141. package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
  142. package/lib/features/canvas/videoEditor/renderTimeline.js +207 -0
  143. package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -0
  144. package/lib/features/canvas/videoEditor/renewLinks.js +64 -0
  145. package/lib/features/canvas/videoEditor/renewLinks.js.map +1 -0
  146. package/lib/features/canvas/videoEditor/sceneLayers.js +101 -0
  147. package/lib/features/canvas/videoEditor/sceneLayers.js.map +1 -0
  148. package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js +283 -0
  149. package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js.map +1 -0
  150. package/lib/features/canvas/videoEditor/tools/catalog.js +576 -0
  151. package/lib/features/canvas/videoEditor/tools/catalog.js.map +1 -0
  152. package/lib/features/canvas/videoEditor/videoProjectsStore.js +27 -3
  153. package/lib/features/canvas/videoEditor/videoProjectsStore.js.map +1 -1
  154. package/lib/features/webbuilder/WebBuilderExperience.js +29 -1
  155. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  156. package/lib/features/webbuilder/buildFragments.js +8 -4
  157. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  158. package/lib/features/webbuilder/codezenHandoff.js +108 -0
  159. package/lib/features/webbuilder/codezenHandoff.js.map +1 -0
  160. package/lib/features/webbuilder/workflow.js.map +1 -1
  161. package/lib/hooks/useChatApi.js +1 -2
  162. package/lib/hooks/useChatApi.js.map +1 -1
  163. package/lib/screens/CanvasBoard/index.js +12 -1
  164. package/lib/screens/CanvasBoard/index.js.map +1 -1
  165. package/lib/screens/Home/HomeScreen.js.map +1 -1
  166. package/lib/screens/Home/components/HomeSuggestions.js +3 -3
  167. package/lib/screens/Home/components/HomeSuggestions.js.map +1 -1
  168. package/lib/screens/WebBuilder/index.js +4 -2
  169. package/lib/screens/WebBuilder/index.js.map +1 -1
  170. package/lib/screens/WebBuilderNative/index.js +29 -2
  171. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  172. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +30 -6
  173. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  174. package/package.json +4 -4
  175. /package/lib/assets/apps/{paper2poster.webp → poster.webp} +0 -0
@@ -0,0 +1,176 @@
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {StyleSheet,Platform,View,Pressable,Text,ScrollView}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {groupCanvasChatModels}from'./canvasAgentChat.js';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
+ function CanvasModelPicker({
21
+ models,
22
+ selectedId,
23
+ onSelect,
24
+ onClose,
25
+ title = "Select model"
26
+ }) {
27
+ const selected = models.find((m) => m.id === selectedId);
28
+ const groups = groupCanvasChatModels(models);
29
+ return /* @__PURE__ */ jsxs(View, { style: styles.scrim, pointerEvents: "auto", children: [
30
+ /* @__PURE__ */ jsx(Pressable, { style: StyleSheet.absoluteFill, onPress: onClose, accessibilityLabel: "Close model picker" }),
31
+ /* @__PURE__ */ jsxs(View, { style: styles.sheet, children: [
32
+ /* @__PURE__ */ jsxs(View, { style: styles.head, children: [
33
+ /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "chip", size: 16, color: "#64748b" }),
34
+ /* @__PURE__ */ jsx(Text, { style: styles.headTitle, children: title }),
35
+ /* @__PURE__ */ jsx(Pressable, { onPress: onClose, hitSlop: 10, accessibilityLabel: "Close model picker", style: styles.close, children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "close", size: 18, color: "#64748b" }) })
36
+ ] }),
37
+ selected ? /* @__PURE__ */ jsxs(View, { style: styles.selectedBar, children: [
38
+ /* @__PURE__ */ jsx(Text, { style: styles.selectedKicker, children: "Selected" }),
39
+ /* @__PURE__ */ jsx(Text, { style: styles.selectedTitle, numberOfLines: 1, children: selected.title })
40
+ ] }) : null,
41
+ /* @__PURE__ */ jsx(ScrollView, { style: styles.list, contentContainerStyle: styles.listBody, keyboardShouldPersistTaps: "handled", children: groups.map(({
42
+ group,
43
+ options
44
+ }) => /* @__PURE__ */ jsxs(View, { style: styles.group, children: [
45
+ /* @__PURE__ */ jsx(Text, { style: styles.groupLabel, children: group }),
46
+ options.map((m) => {
47
+ const active = m.id === selectedId;
48
+ return /* @__PURE__ */ jsx(Pressable, { onPress: () => {
49
+ onSelect(m.id);
50
+ onClose();
51
+ }, style: [styles.row, active && styles.rowOn], accessibilityRole: "button", accessibilityState: {
52
+ selected: active
53
+ }, children: /* @__PURE__ */ jsxs(View, { style: styles.rowBody, children: [
54
+ /* @__PURE__ */ jsxs(View, { style: styles.rowTitleLine, children: [
55
+ /* @__PURE__ */ jsx(Text, { style: styles.rowTitle, numberOfLines: 1, children: m.title }),
56
+ active ? /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "check", size: 16, color: "#0f172a" }) : null
57
+ ] }),
58
+ /* @__PURE__ */ jsx(Text, { style: styles.rowId, numberOfLines: 1, children: m.id }),
59
+ m.description ? /* @__PURE__ */ jsx(Text, { style: styles.rowDesc, numberOfLines: 2, children: m.description }) : null
60
+ ] }) }, m.id);
61
+ })
62
+ ] }, group)) })
63
+ ] })
64
+ ] });
65
+ }
66
+ const styles = StyleSheet.create({
67
+ scrim: __spreadProps(__spreadValues({}, StyleSheet.absoluteFillObject), {
68
+ zIndex: 40,
69
+ elevation: 40,
70
+ backgroundColor: "rgba(0,0,0,0.4)",
71
+ justifyContent: "center",
72
+ padding: 16
73
+ }),
74
+ sheet: {
75
+ maxHeight: "80%",
76
+ borderRadius: 16,
77
+ backgroundColor: "#fff",
78
+ borderWidth: StyleSheet.hairlineWidth,
79
+ borderColor: "#e2e8f0",
80
+ overflow: "hidden"
81
+ },
82
+ head: {
83
+ flexDirection: "row",
84
+ alignItems: "center",
85
+ gap: 8,
86
+ paddingHorizontal: 16,
87
+ paddingVertical: 12,
88
+ borderBottomWidth: StyleSheet.hairlineWidth,
89
+ borderBottomColor: "#e2e8f0"
90
+ },
91
+ headTitle: {
92
+ flex: 1,
93
+ fontSize: 14,
94
+ fontWeight: "600",
95
+ color: "#0f172a"
96
+ },
97
+ close: {
98
+ padding: 4
99
+ },
100
+ selectedBar: {
101
+ flexDirection: "row",
102
+ alignItems: "center",
103
+ gap: 8,
104
+ paddingHorizontal: 16,
105
+ paddingVertical: 8,
106
+ backgroundColor: "#f8fafc",
107
+ borderBottomWidth: StyleSheet.hairlineWidth,
108
+ borderBottomColor: "#e2e8f0"
109
+ },
110
+ selectedKicker: {
111
+ fontSize: 11,
112
+ fontWeight: "600",
113
+ letterSpacing: 0.6,
114
+ textTransform: "uppercase",
115
+ color: "#64748b"
116
+ },
117
+ selectedTitle: {
118
+ flex: 1,
119
+ fontSize: 14,
120
+ fontWeight: "500",
121
+ color: "#0f172a"
122
+ },
123
+ list: {
124
+ maxHeight: 420
125
+ },
126
+ listBody: {
127
+ padding: 8,
128
+ paddingBottom: 16
129
+ },
130
+ group: {
131
+ marginBottom: 8
132
+ },
133
+ groupLabel: {
134
+ paddingHorizontal: 8,
135
+ paddingVertical: 4,
136
+ fontSize: 11,
137
+ fontWeight: "600",
138
+ letterSpacing: 0.6,
139
+ textTransform: "uppercase",
140
+ color: "#94a3b8"
141
+ },
142
+ row: {
143
+ borderRadius: 10,
144
+ paddingHorizontal: 12,
145
+ paddingVertical: 8
146
+ },
147
+ rowOn: {
148
+ backgroundColor: "#f1f5f9"
149
+ },
150
+ rowBody: {
151
+ minWidth: 0,
152
+ flex: 1
153
+ },
154
+ rowTitleLine: {
155
+ flexDirection: "row",
156
+ alignItems: "center",
157
+ gap: 8
158
+ },
159
+ rowTitle: {
160
+ flex: 1,
161
+ fontSize: 14,
162
+ fontWeight: "600",
163
+ color: "#0f172a"
164
+ },
165
+ rowId: {
166
+ marginTop: 2,
167
+ fontSize: 11,
168
+ fontFamily: Platform.OS === "ios" ? "Menlo" : "monospace",
169
+ color: "#94a3b8"
170
+ },
171
+ rowDesc: {
172
+ marginTop: 2,
173
+ fontSize: 12,
174
+ color: "#94a3b8"
175
+ }
176
+ });export{CanvasModelPicker};//# sourceMappingURL=CanvasModelPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CanvasModelPicker.js","sources":["../../../src/features/canvas/CanvasModelPicker.tsx"],"sourcesContent":["/**\n * Native twin of surface-kit `ModelPicker` — grouped Auto / Image / Video / Audio.\n */\nimport React from 'react';\nimport { Pressable, ScrollView, StyleSheet, Text, View, Platform } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { groupCanvasChatModels, type CanvasChatModelOption } from './canvasAgentChat';\n\nexport function CanvasModelPicker({\n models,\n selectedId,\n onSelect,\n onClose,\n title = 'Select model',\n}: {\n title?: string;\n models: readonly CanvasChatModelOption[];\n selectedId?: string;\n onSelect: (id: string) => void;\n onClose: () => void;\n}) {\n const selected = models.find((m) => m.id === selectedId);\n const groups = groupCanvasChatModels(models);\n\n return (\n <View style={styles.scrim} pointerEvents=\"auto\">\n <Pressable style={StyleSheet.absoluteFill} onPress={onClose} accessibilityLabel=\"Close model picker\" />\n <View style={styles.sheet}>\n <View style={styles.head}>\n <MaterialCommunityIcons name=\"chip\" size={16} color=\"#64748b\" />\n <Text style={styles.headTitle}>{title}</Text>\n <Pressable\n onPress={onClose}\n hitSlop={10}\n accessibilityLabel=\"Close model picker\"\n style={styles.close}\n >\n <MaterialCommunityIcons name=\"close\" size={18} color=\"#64748b\" />\n </Pressable>\n </View>\n {selected ? (\n <View style={styles.selectedBar}>\n <Text style={styles.selectedKicker}>Selected</Text>\n <Text style={styles.selectedTitle} numberOfLines={1}>\n {selected.title}\n </Text>\n </View>\n ) : null}\n <ScrollView\n style={styles.list}\n contentContainerStyle={styles.listBody}\n keyboardShouldPersistTaps=\"handled\"\n >\n {groups.map(({ group, options }) => (\n <View key={group} style={styles.group}>\n <Text style={styles.groupLabel}>{group}</Text>\n {options.map((m) => {\n const active = m.id === selectedId;\n return (\n <Pressable\n key={m.id}\n onPress={() => {\n onSelect(m.id);\n onClose();\n }}\n style={[styles.row, active && styles.rowOn]}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: active }}\n >\n <View style={styles.rowBody}>\n <View style={styles.rowTitleLine}>\n <Text style={styles.rowTitle} numberOfLines={1}>\n {m.title}\n </Text>\n {active ? (\n <MaterialCommunityIcons name=\"check\" size={16} color=\"#0f172a\" />\n ) : null}\n </View>\n <Text style={styles.rowId} numberOfLines={1}>\n {m.id}\n </Text>\n {m.description ? (\n <Text style={styles.rowDesc} numberOfLines={2}>\n {m.description}\n </Text>\n ) : null}\n </View>\n </Pressable>\n );\n })}\n </View>\n ))}\n </ScrollView>\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n scrim: {\n ...StyleSheet.absoluteFillObject,\n zIndex: 40,\n elevation: 40,\n backgroundColor: 'rgba(0,0,0,0.4)',\n justifyContent: 'center',\n padding: 16,\n },\n sheet: {\n maxHeight: '80%',\n borderRadius: 16,\n backgroundColor: '#fff',\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: '#e2e8f0',\n overflow: 'hidden',\n },\n head: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n paddingHorizontal: 16,\n paddingVertical: 12,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: '#e2e8f0',\n },\n headTitle: { flex: 1, fontSize: 14, fontWeight: '600', color: '#0f172a' },\n close: { padding: 4 },\n selectedBar: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n paddingHorizontal: 16,\n paddingVertical: 8,\n backgroundColor: '#f8fafc',\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: '#e2e8f0',\n },\n selectedKicker: {\n fontSize: 11,\n fontWeight: '600',\n letterSpacing: 0.6,\n textTransform: 'uppercase',\n color: '#64748b',\n },\n selectedTitle: { flex: 1, fontSize: 14, fontWeight: '500', color: '#0f172a' },\n list: { maxHeight: 420 },\n listBody: { padding: 8, paddingBottom: 16 },\n group: { marginBottom: 8 },\n groupLabel: {\n paddingHorizontal: 8,\n paddingVertical: 4,\n fontSize: 11,\n fontWeight: '600',\n letterSpacing: 0.6,\n textTransform: 'uppercase',\n color: '#94a3b8',\n },\n row: { borderRadius: 10, paddingHorizontal: 12, paddingVertical: 8 },\n rowOn: { backgroundColor: '#f1f5f9' },\n rowBody: { minWidth: 0, flex: 1 },\n rowTitleLine: { flexDirection: 'row', alignItems: 'center', gap: 8 },\n rowTitle: { flex: 1, fontSize: 14, fontWeight: '600', color: '#0f172a' },\n rowId: {\n marginTop: 2,\n fontSize: 11,\n fontFamily: Platform.OS === 'ios' ? 'Menlo' : 'monospace',\n color: '#94a3b8',\n },\n rowDesc: { marginTop: 2, fontSize: 12, color: '#94a3b8' },\n});\n"],"names":[],"mappings":"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"}
@@ -1,38 +1,296 @@
1
- import {jsxs,jsx}from'react/jsx-runtime';import {useState,useEffect}from'react';import {StyleSheet,View,Text,Pressable,ScrollView}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {listCanvasTasks,hydrateCanvasTasks,subscribeCanvasTasks,markTaskDelivered,isTerminal,dismissTask}from'./canvasTasks.js';function CanvasTasksPanel({
1
+ import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useState,useRef,useEffect,useCallback}from'react';import {StyleSheet,View,Text,Pressable,ScrollView,Image}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {listCanvasTasks,hydrateCanvasTasks,subscribeCanvasTasks,dismissTask,markTaskDelivered,isTerminal,startPromoTask}from'./canvasTasks.js';import {useCanvasTasksHost,syncCanvasTasks,buildTaskRows,isRowRunningAt,SYNC_RUNNING_MS,SYNC_IDLE_MS,formatWorked,removeRemoteRow,claimRow,renderProgressPct,renderTimeLeft}from'./canvasTaskSync.js';import {isExportTask,DEADLINE_VERDICT_ERROR,jobBoardId,isStaleJob,jobDeadline,isDeadlineVerdict,serverProgressLine}from'./serverTasks.js';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 STALE_LINE = `${DEADLINE_VERDICT_ERROR}.`;
21
+ function useClock(active) {
22
+ const [now, setNow] = useState(() => Date.now());
23
+ useEffect(() => {
24
+ if (!active) return void 0;
25
+ const timer = setInterval(() => setNow(Date.now()), 1e3);
26
+ return () => clearInterval(timer);
27
+ }, [active]);
28
+ return now;
29
+ }
30
+ function CanvasTasksPanel({
2
31
  onClose,
3
32
  onPlaceResult
4
33
  }) {
5
- const [rows, setRows] = useState(() => listCanvasTasks());
34
+ const host = useCanvasTasksHost();
35
+ const [local, setLocal] = useState(() => listCanvasTasks());
36
+ const [remote, setRemote] = useState([]);
37
+ const [hidden, setHidden] = useState(() => /* @__PURE__ */ new Set());
38
+ const syncing = useRef(false);
6
39
  useEffect(() => {
7
- void hydrateCanvasTasks().then(() => setRows(listCanvasTasks()));
8
- return subscribeCanvasTasks(() => setRows(listCanvasTasks()));
40
+ void hydrateCanvasTasks().then(() => setLocal(listCanvasTasks()));
41
+ return subscribeCanvasTasks(() => setLocal(listCanvasTasks()));
42
+ }, []);
43
+ const sync = useCallback(async () => {
44
+ if (syncing.current) return;
45
+ syncing.current = true;
46
+ try {
47
+ setRemote(await syncCanvasTasks());
48
+ } catch (e) {
49
+ } finally {
50
+ syncing.current = false;
51
+ }
9
52
  }, []);
53
+ const rows = buildTaskRows(local, remote, hidden);
54
+ const now = useClock(rows.some((row) => isRowRunningAt(row, Date.now())));
55
+ const anyRunning = rows.some((row) => isRowRunningAt(row, now));
56
+ useEffect(() => {
57
+ void sync();
58
+ const timer = setInterval(() => void sync(), anyRunning ? SYNC_RUNNING_MS : SYNC_IDLE_MS);
59
+ return () => clearInterval(timer);
60
+ }, [sync, anyRunning]);
61
+ const hide = (key) => setHidden((prev) => new Set(prev).add(key));
62
+ const place = async (row) => {
63
+ var _a, _b, _c, _d;
64
+ if (row.kind === "task") {
65
+ if (!await claimRow((_a = row.remote) == null ? void 0 : _a.remoteId)) {
66
+ markTaskDelivered(row.task.id);
67
+ return;
68
+ }
69
+ onPlaceResult(row.task);
70
+ markTaskDelivered(row.task.id);
71
+ return;
72
+ }
73
+ const media = (_b = row.job.results) == null ? void 0 : _b.find(isVisualResult);
74
+ if (!media) return;
75
+ if (!await claimRow(row.job.remoteId)) {
76
+ hide(row.key);
77
+ return;
78
+ }
79
+ onPlaceResult({
80
+ id: row.job.id,
81
+ kind: "promo",
82
+ title: row.job.title,
83
+ brief: row.job.brief,
84
+ boardId: (_d = (_c = jobBoardId(row.job)) != null ? _c : host.openBoardId) != null ? _d : "",
85
+ state: "succeeded",
86
+ createdAt: row.job.createdAt,
87
+ request: {
88
+ prompt: row.job.brief
89
+ },
90
+ result: {
91
+ url: media.url,
92
+ title: media.title || row.job.title,
93
+ projectId: "",
94
+ preset: "",
95
+ pipeline: ""
96
+ }
97
+ });
98
+ hide(row.key);
99
+ };
100
+ const dismiss = (row) => {
101
+ var _a;
102
+ hide(row.key);
103
+ if (row.kind === "task") {
104
+ dismissTask(row.task.id);
105
+ void removeRemoteRow((_a = row.remote) == null ? void 0 : _a.remoteId);
106
+ } else {
107
+ void removeRemoteRow(row.job.remoteId);
108
+ }
109
+ };
110
+ const retryPromo = (request, boardId, brief) => {
111
+ if (!host.runAction) return;
112
+ void startPromoTask(host.runAction, {
113
+ request,
114
+ boardId,
115
+ brief
116
+ });
117
+ };
118
+ const retry = (row) => {
119
+ var _a, _b;
120
+ if (!host.runAction) return void 0;
121
+ if (row.kind === "task") {
122
+ if (row.task.kind !== "promo" || isExportTask(row.task)) return void 0;
123
+ const {
124
+ task
125
+ } = row;
126
+ return () => {
127
+ dismiss(row);
128
+ retryPromo(task.request, task.boardId, task.brief);
129
+ };
130
+ }
131
+ const params = (_a = row.job.input) == null ? void 0 : _a.params;
132
+ if (row.job.lane !== "promo" || !params || typeof params.prompt !== "string") return void 0;
133
+ const boardId = (_b = jobBoardId(row.job)) != null ? _b : host.openBoardId;
134
+ if (!boardId) return void 0;
135
+ return () => {
136
+ dismiss(row);
137
+ retryPromo(params, boardId, row.job.brief);
138
+ };
139
+ };
10
140
  return /* @__PURE__ */ jsxs(View, { style: styles.root, children: [
11
141
  /* @__PURE__ */ jsxs(View, { style: styles.head, children: [
12
142
  /* @__PURE__ */ jsx(Text, { style: styles.title, children: "Tasks" }),
13
143
  /* @__PURE__ */ jsx(Pressable, { onPress: onClose, hitSlop: 8, accessibilityLabel: "Close tasks", children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "close", size: 20, color: "#64748b" }) })
14
144
  ] }),
15
- /* @__PURE__ */ jsx(ScrollView, { contentContainerStyle: styles.list, children: rows.length === 0 ? /* @__PURE__ */ jsx(Text, { style: styles.empty, children: "Promo productions that run in the background show up here \u2014 start one from Generate \u2192 Promo." }) : rows.map((task) => {
16
- var _a;
17
- return /* @__PURE__ */ jsxs(View, { style: styles.card, children: [
18
- /* @__PURE__ */ jsxs(View, { style: styles.cardHead, children: [
19
- /* @__PURE__ */ jsx(Text, { style: styles.cardTitle, numberOfLines: 1, children: task.title }),
20
- /* @__PURE__ */ jsx(Text, { style: [styles.badge, task.state === "succeeded" && styles.badgeOk, task.state === "failed" && styles.badgeFail], children: task.state })
21
- ] }),
22
- task.brief ? /* @__PURE__ */ jsx(Text, { style: styles.brief, numberOfLines: 2, children: task.brief }) : null,
23
- task.lastLine ? /* @__PURE__ */ jsx(Text, { style: styles.line, children: task.lastLine }) : null,
24
- task.error ? /* @__PURE__ */ jsx(Text, { style: styles.error, children: task.error }) : null,
25
- /* @__PURE__ */ jsxs(View, { style: styles.actions, children: [
26
- task.state === "succeeded" && ((_a = task.result) == null ? void 0 : _a.url) && !task.delivered ? /* @__PURE__ */ jsx(Pressable, { onPress: () => {
27
- onPlaceResult(task);
28
- markTaskDelivered(task.id);
29
- }, style: styles.primary, children: /* @__PURE__ */ jsx(Text, { style: styles.primaryLabel, children: "Place on board" }) }) : null,
30
- isTerminal(task.state) ? /* @__PURE__ */ jsx(Pressable, { onPress: () => dismissTask(task.id), style: styles.ghost, children: /* @__PURE__ */ jsx(Text, { style: styles.ghostLabel, children: "Dismiss" }) }) : null
31
- ] })
32
- ] }, task.id);
33
- }) })
145
+ /* @__PURE__ */ jsx(ScrollView, { contentContainerStyle: styles.list, children: rows.length === 0 ? /* @__PURE__ */ jsx(Text, { style: styles.empty, children: "Nothing running. A marketing video, an export or a lip sync shows up here when you start one - here or on the web - and keeps going while you work on something else." }) : rows.map((row) => /* @__PURE__ */ jsx(RowCard, { row, now, openBoardId: host.openBoardId, boardLabel: host.boardLabel, onPlace: () => void place(row), onOpenBoard: host.openBoard, onDismiss: () => dismiss(row), onRetry: retry(row) }, row.key)) })
34
146
  ] });
35
147
  }
148
+ const isVisualResult = (r) => r.kind === "image" || r.kind === "video";
149
+ function viewOf(row, now) {
150
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i;
151
+ if (row.kind === "task") {
152
+ const {
153
+ task
154
+ } = row;
155
+ const loose = task;
156
+ const isExport = isExportTask(task);
157
+ const stale2 = !isTerminal(task.state) && isStaleJob({
158
+ state: "running",
159
+ deadlineAt: jobDeadline(task),
160
+ createdAt: task.createdAt
161
+ }, now) || isDeadlineVerdict(task);
162
+ return __spreadProps(__spreadValues({
163
+ title: task.title,
164
+ state: stale2 ? "stale" : task.state,
165
+ line: task.lastLine,
166
+ error: task.error,
167
+ boardId: task.boardId,
168
+ media: ((_a = task.result) == null ? void 0 : _a.url) ? {
169
+ url: task.result.url,
170
+ kind: isExport && ((_b = loose.request) == null ? void 0 : _b.media) === "image" ? "image" : "video"
171
+ } : void 0,
172
+ delivered: Boolean(task.delivered),
173
+ elapsedMs: ((_c = task.endedAt) != null ? _c : now) - ((_d = task.startedAt) != null ? _d : task.createdAt)
174
+ }, isExport ? {
175
+ exportInfo: {
176
+ step: loose.step,
177
+ projectedMs: (_e = loose.handle) == null ? void 0 : _e.projectedMs,
178
+ notice: (_f = loose.handle) == null ? void 0 : _f.notice
179
+ }
180
+ } : {}), {
181
+ elsewhere: false
182
+ });
183
+ }
184
+ const {
185
+ job
186
+ } = row;
187
+ const stale = isStaleJob(job, now) || isDeadlineVerdict(job);
188
+ const media = (_g = job.results) == null ? void 0 : _g.find(isVisualResult);
189
+ return {
190
+ title: job.title,
191
+ state: stale ? "stale" : job.state,
192
+ line: serverProgressLine(job),
193
+ error: job.error,
194
+ boardId: jobBoardId(job),
195
+ media: media ? {
196
+ url: media.url,
197
+ kind: media.kind
198
+ } : void 0,
199
+ delivered: Boolean(job.delivered),
200
+ elapsedMs: ((_h = job.endedAt) != null ? _h : now) - ((_i = job.startedAt) != null ? _i : job.createdAt),
201
+ elsewhere: true
202
+ };
203
+ }
204
+ function RowCard({
205
+ row,
206
+ now,
207
+ openBoardId,
208
+ boardLabel,
209
+ onPlace,
210
+ onOpenBoard,
211
+ onDismiss,
212
+ onRetry
213
+ }) {
214
+ var _a;
215
+ const view = viewOf(row, now);
216
+ const worked = formatWorked(view.elapsedMs);
217
+ const onThisBoard = !view.boardId || view.boardId === openBoardId;
218
+ const board = view.boardId ? boardLabel == null ? void 0 : boardLabel(view.boardId) : void 0;
219
+ const icon = row.kind === "task" ? isExportTask(row.task) ? "movie-open-outline" : "bullhorn-outline" : row.job.lane === "lipsync" ? "account-voice" : row.job.lane === "promo" || row.job.lane === "promo-design" ? "bullhorn-outline" : "creation";
220
+ return /* @__PURE__ */ jsxs(View, { style: styles.card, testID: `task-card-${row.key}`, children: [
221
+ /* @__PURE__ */ jsxs(View, { style: styles.cardHead, children: [
222
+ /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: icon, size: 16, color: "#64748b" }),
223
+ /* @__PURE__ */ jsx(Text, { style: styles.cardTitle, numberOfLines: 1, children: view.title }),
224
+ /* @__PURE__ */ jsx(StateChip, { state: view.state, worked }),
225
+ view.state !== "submitting" ? /* @__PURE__ */ jsx(Pressable, { onPress: onDismiss, hitSlop: 8, accessibilityLabel: "Dismiss", children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "close", size: 16, color: "#94a3b8" }) }) : null
226
+ ] }),
227
+ !onThisBoard ? /* @__PURE__ */ jsxs(Text, { style: styles.line, children: [
228
+ "on ",
229
+ board ? `\u201C${board}\u201D` : "another board"
230
+ ] }) : null,
231
+ view.elsewhere ? /* @__PURE__ */ jsx(Text, { style: styles.line, children: "Started on another device" }) : null,
232
+ view.state === "stale" ? /* @__PURE__ */ jsxs(View, { style: styles.staleBox, children: [
233
+ /* @__PURE__ */ jsx(Text, { style: styles.error, children: STALE_LINE }),
234
+ /* @__PURE__ */ jsxs(View, { style: styles.actions, children: [
235
+ onRetry ? /* @__PURE__ */ jsx(Pressable, { onPress: onRetry, style: styles.primary, children: /* @__PURE__ */ jsx(Text, { style: styles.primaryLabel, children: "Run again" }) }) : null,
236
+ /* @__PURE__ */ jsx(Pressable, { onPress: onDismiss, style: styles.ghost, children: /* @__PURE__ */ jsx(Text, { style: styles.ghostLabel, children: "Dismiss" }) })
237
+ ] })
238
+ ] }) : null,
239
+ view.state === "running" || view.state === "submitting" ? /* @__PURE__ */ jsx(Fragment, { children: view.exportInfo ? /* @__PURE__ */ jsx(ExportProgress, { info: view.exportInfo, elapsedMs: view.elapsedMs, line: view.line }) : view.line ? /* @__PURE__ */ jsx(Text, { style: styles.line, numberOfLines: 2, children: view.line }) : null }) : null,
240
+ view.state === "succeeded" ? /* @__PURE__ */ jsxs(Fragment, { children: [
241
+ view.media ? /* @__PURE__ */ jsx(ResultThumb, { url: view.media.url, kind: view.media.kind }) : null,
242
+ /* @__PURE__ */ jsx(View, { style: styles.actions, children: !view.media ? null : view.delivered && onThisBoard ? /* @__PURE__ */ jsx(Text, { style: styles.done, children: "On this board" }) : onThisBoard ? /* @__PURE__ */ jsx(Pressable, { onPress: onPlace, style: styles.primary, children: /* @__PURE__ */ jsx(Text, { style: styles.primaryLabel, children: "Place on board" }) }) : onOpenBoard && view.boardId ? /* @__PURE__ */ jsx(Pressable, { onPress: () => onOpenBoard(view.boardId), style: styles.primary, children: /* @__PURE__ */ jsx(Text, { style: styles.primaryLabel, children: "Open board" }) }) : null })
243
+ ] }) : null,
244
+ view.state === "failed" ? /* @__PURE__ */ jsxs(Fragment, { children: [
245
+ /* @__PURE__ */ jsx(Text, { style: styles.error, children: view.error || "The run could not finish." }),
246
+ ((_a = view.exportInfo) == null ? void 0 : _a.notice) ? /* @__PURE__ */ jsx(Text, { style: styles.notice, children: view.exportInfo.notice }) : null,
247
+ onRetry ? /* @__PURE__ */ jsx(View, { style: styles.actions, children: /* @__PURE__ */ jsx(Pressable, { onPress: onRetry, style: styles.primary, children: /* @__PURE__ */ jsx(Text, { style: styles.primaryLabel, children: "Run again" }) }) }) : null
248
+ ] }) : null
249
+ ] });
250
+ }
251
+ function StateChip({
252
+ state,
253
+ worked
254
+ }) {
255
+ if (state === "stale") return /* @__PURE__ */ jsx(Text, { style: [styles.badge, styles.badgeFail], children: "Stopped responding" });
256
+ if (state === "succeeded") return /* @__PURE__ */ jsxs(Text, { style: [styles.badge, styles.badgeOk], children: [
257
+ "Ready \xB7 ",
258
+ worked
259
+ ] });
260
+ if (state === "failed") return /* @__PURE__ */ jsxs(Text, { style: [styles.badge, styles.badgeFail], children: [
261
+ "Stopped \xB7 ",
262
+ worked
263
+ ] });
264
+ return /* @__PURE__ */ jsx(Text, { style: [styles.badge, styles.badgeRun], children: state === "submitting" ? "Starting" : `Running \xB7 ${worked}` });
265
+ }
266
+ function ExportProgress({
267
+ info,
268
+ elapsedMs,
269
+ line
270
+ }) {
271
+ const pct = Math.round(renderProgressPct(info.step, info.projectedMs, elapsedMs));
272
+ return /* @__PURE__ */ jsxs(View, { style: styles.progressBox, children: [
273
+ /* @__PURE__ */ jsx(Text, { style: styles.line, numberOfLines: 1, children: info.step ? `Step ${info.step.index} of ${info.step.total} \xB7 ${info.step.label}` : line || "Rendering\u2026" }),
274
+ /* @__PURE__ */ jsx(View, { style: styles.bar, accessibilityRole: "progressbar", accessibilityValue: {
275
+ min: 0,
276
+ max: 100,
277
+ now: pct
278
+ }, accessibilityLabel: "Render progress", children: /* @__PURE__ */ jsx(View, { style: [styles.barFill, {
279
+ width: `${pct}%`
280
+ }] }) }),
281
+ info.projectedMs ? /* @__PURE__ */ jsx(Text, { style: styles.line, children: renderTimeLeft(info.projectedMs, elapsedMs) }) : null,
282
+ info.notice ? /* @__PURE__ */ jsx(Text, { style: styles.notice, children: info.notice }) : null
283
+ ] });
284
+ }
285
+ function ResultThumb({
286
+ url,
287
+ kind
288
+ }) {
289
+ if (kind === "image") return /* @__PURE__ */ jsx(Image, { source: {
290
+ uri: url
291
+ }, style: styles.thumb, resizeMode: "cover" });
292
+ return /* @__PURE__ */ jsx(View, { style: [styles.thumb, styles.thumbGlyph], children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "filmstrip", size: 28, color: "#94a3b8" }) });
293
+ }
36
294
  const styles = StyleSheet.create({
37
295
  root: {
38
296
  flex: 1,
@@ -83,12 +341,16 @@ const styles = StyleSheet.create({
83
341
  badge: {
84
342
  fontSize: 10,
85
343
  fontWeight: "700",
86
- textTransform: "uppercase",
87
344
  color: "#64748b",
88
345
  backgroundColor: "#f1f5f9",
89
346
  paddingHorizontal: 6,
90
347
  paddingVertical: 2,
91
- borderRadius: 6
348
+ borderRadius: 6,
349
+ overflow: "hidden"
350
+ },
351
+ badgeRun: {
352
+ color: "#fff7ed",
353
+ backgroundColor: "#ea580c"
92
354
  },
93
355
  badgeOk: {
94
356
  color: "#166534",
@@ -98,10 +360,6 @@ const styles = StyleSheet.create({
98
360
  color: "#991b1b",
99
361
  backgroundColor: "#fee2e2"
100
362
  },
101
- brief: {
102
- fontSize: 12,
103
- color: "#334155"
104
- },
105
363
  line: {
106
364
  fontSize: 11,
107
365
  color: "#64748b"
@@ -110,6 +368,44 @@ const styles = StyleSheet.create({
110
368
  fontSize: 12,
111
369
  color: "#b91c1c"
112
370
  },
371
+ notice: {
372
+ fontSize: 11,
373
+ color: "#b45309"
374
+ },
375
+ done: {
376
+ fontSize: 12,
377
+ fontWeight: "600",
378
+ color: "#166534",
379
+ paddingVertical: 8
380
+ },
381
+ staleBox: {
382
+ gap: 6
383
+ },
384
+ progressBox: {
385
+ gap: 4
386
+ },
387
+ bar: {
388
+ height: 6,
389
+ borderRadius: 3,
390
+ backgroundColor: "#f1f5f9",
391
+ overflow: "hidden"
392
+ },
393
+ barFill: {
394
+ height: 6,
395
+ borderRadius: 3,
396
+ backgroundColor: "#ea580c"
397
+ },
398
+ thumb: {
399
+ width: "100%",
400
+ aspectRatio: 16 / 9,
401
+ borderRadius: 8,
402
+ overflow: "hidden",
403
+ backgroundColor: "#f1f5f9"
404
+ },
405
+ thumbGlyph: {
406
+ alignItems: "center",
407
+ justifyContent: "center"
408
+ },
113
409
  actions: {
114
410
  flexDirection: "row",
115
411
  gap: 8,