@adminide-stack/yantra-mobile 12.0.131 → 12.0.132-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.
- package/lib/components/CustomDrawer.js +2 -2
- package/lib/components/CustomDrawer.js.map +1 -1
- package/lib/features/apps/AppsCatalog.js +7 -1
- package/lib/features/apps/AppsCatalog.js.map +1 -1
- package/lib/features/apps/nativeSurfaceTwin.js +35 -0
- package/lib/features/apps/nativeSurfaceTwin.js.map +1 -0
- package/lib/features/canvas/CanvasBoardsGrid.js +49 -49
- package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
- package/lib/features/canvas/CanvasExperience.js +69 -28
- package/lib/features/canvas/CanvasExperience.js.map +1 -1
- package/lib/features/canvas/audioEditor/AudioWaveform.js +1 -1
- package/lib/features/canvas/designCatalog.js +63 -39
- package/lib/features/canvas/designCatalog.js.map +1 -1
- package/lib/features/canvas/designCategories.js +56 -0
- package/lib/features/canvas/designCategories.js.map +1 -1
- package/lib/features/canvas/generator/DirectorSheet.js +3 -2
- package/lib/features/canvas/generator/DirectorSheet.js.map +1 -1
- package/lib/features/canvas/home/HeroComposer.js +165 -76
- package/lib/features/canvas/home/HeroComposer.js.map +1 -1
- package/lib/features/canvas/home/HeroMonitor.js +75 -46
- package/lib/features/canvas/home/HeroMonitor.js.map +1 -1
- package/lib/features/canvas/home/TemplatesGallery.js +273 -138
- package/lib/features/canvas/home/TemplatesGallery.js.map +1 -1
- package/lib/features/canvas/home/templatesGallerySources.js +221 -0
- package/lib/features/canvas/home/templatesGallerySources.js.map +1 -0
- package/lib/features/canvas/homeWork.js +12 -11
- package/lib/features/canvas/homeWork.js.map +1 -1
- package/lib/features/canvas/lazyEditors.js +51 -0
- package/lib/features/canvas/lazyEditors.js.map +1 -0
- package/lib/features/canvas/rankedCatalogSearch.js +33 -23
- package/lib/features/canvas/rankedCatalogSearch.js.map +1 -1
- package/lib/features/canvas/set/SetViewportWebView.js +1 -1
- package/lib/features/canvas/set/agent/tools.js +1 -1
- package/lib/features/canvas/studioCatalog.js +2 -2
- package/lib/features/canvas/studioCatalog.js.map +1 -1
- package/lib/features/canvas/templateSearch.js +8 -1
- package/lib/features/canvas/templateSearch.js.map +1 -1
- package/lib/features/canvas/videoEditor/BlurBoxOverlay.js +1 -1
- package/lib/features/design/DesignEditorExperience.js +103 -29
- package/lib/features/design/DesignEditorExperience.js.map +1 -1
- package/lib/features/design/DesignExperience.js +4 -3
- package/lib/features/design/DesignExperience.js.map +1 -1
- package/lib/features/design/doc/aiDesign.js +1 -1
- package/lib/features/design/doc/aiDesign.js.map +1 -1
- package/lib/features/design/doc/artifacts.js +40 -13
- package/lib/features/design/doc/artifacts.js.map +1 -1
- package/lib/features/design/doc/chart.js +387 -13
- package/lib/features/design/doc/chart.js.map +1 -1
- package/lib/features/design/doc/copyStyle.js +47 -0
- package/lib/features/design/doc/copyStyle.js.map +1 -0
- package/lib/features/design/doc/docOps.js +22 -4
- package/lib/features/design/doc/docOps.js.map +1 -1
- package/lib/features/design/doc/geometry.js +32 -18
- package/lib/features/design/doc/geometry.js.map +1 -1
- package/lib/features/design/doc/newDoc.js +5 -1
- package/lib/features/design/doc/newDoc.js.map +1 -1
- package/lib/features/design/doc/resize.js +101 -0
- package/lib/features/design/doc/resize.js.map +1 -0
- package/lib/features/design/doc/sizes.js +15 -2
- package/lib/features/design/doc/sizes.js.map +1 -1
- package/lib/features/design/editor/ChartDataPanel.js +49 -9
- package/lib/features/design/editor/ChartDataPanel.js.map +1 -1
- package/lib/features/design/editor/CropOverlay.js +1 -1
- package/lib/features/design/editor/DesignCanvas.js +14 -13
- package/lib/features/design/editor/DesignCanvas.js.map +1 -1
- package/lib/features/design/editor/ExportSheet.js +8 -4
- package/lib/features/design/editor/ExportSheet.js.map +1 -1
- package/lib/features/design/editor/LayerTools.js +37 -5
- package/lib/features/design/editor/LayerTools.js.map +1 -1
- package/lib/features/design/editor/Slideshow.js +30 -5
- package/lib/features/design/editor/Slideshow.js.map +1 -1
- package/lib/features/design/editor/useDesignSave.js +21 -36
- package/lib/features/design/editor/useDesignSave.js.map +1 -1
- package/lib/features/design/export/exportDesign.js +3 -1
- package/lib/features/design/export/exportDesign.js.map +1 -1
- package/lib/features/design/home/DesignHome.js +7 -2
- package/lib/features/design/home/DesignHome.js.map +1 -1
- package/lib/features/design/render/DesignPageView.js +1 -1
- package/lib/features/design/render/DesignPageView.js.map +1 -1
- package/lib/features/design/render/PageCapture.js +11 -10
- package/lib/features/design/render/PageCapture.js.map +1 -1
- package/lib/features/design/render/fontRegistry.js +27 -3
- package/lib/features/design/render/fontRegistry.js.map +1 -1
- package/lib/features/design/render/svgParts.js +27 -74
- package/lib/features/design/render/svgParts.js.map +1 -1
- package/lib/features/devices/brands/qnScale.js +7 -2
- package/lib/features/devices/brands/qnScale.js.map +1 -1
- package/lib/features/devices/brands/uuids.js +2 -1
- package/lib/features/devices/brands/uuids.js.map +1 -1
- package/lib/features/devices/devices.js +2 -1
- package/lib/features/devices/devices.js.map +1 -1
- package/lib/features/docs/DocBlockRow.js +1 -1
- package/lib/features/docs/docArtifacts.js +2 -2
- package/lib/features/docs/docArtifacts.js.map +1 -1
- package/lib/features/health/healthSync.js +3 -1
- package/lib/features/health/healthSync.js.map +1 -1
- package/lib/features/health/nativeHealth.js +8 -0
- package/lib/features/health/nativeHealth.js.map +1 -0
- package/lib/features/links/openInApp.js +11 -1
- package/lib/features/links/openInApp.js.map +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +135 -28
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
- package/lib/features/webbuilder/buildFragments.js +14 -6
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/components/PreviewFrame.js +28 -3
- package/lib/features/webbuilder/components/PreviewFrame.js.map +1 -1
- package/lib/features/webbuilder/components/PreviewScreen.js +1 -1
- package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
- package/lib/features/webbuilder/components/ProjectChat.js +24 -5
- package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
- package/lib/features/webbuilder/components/ProjectsScreen.js +18 -2
- package/lib/features/webbuilder/components/ProjectsScreen.js.map +1 -1
- package/lib/features/webbuilder/components/ui.js +20 -6
- package/lib/features/webbuilder/components/ui.js.map +1 -1
- package/lib/features/webbuilder/exportCode.js +52 -0
- package/lib/features/webbuilder/exportCode.js.map +1 -0
- package/lib/features/webbuilder/siteAddress.js +71 -0
- package/lib/features/webbuilder/siteAddress.js.map +1 -0
- package/lib/features/webbuilder/widgetBlocks.js +30 -0
- package/lib/features/webbuilder/widgetBlocks.js.map +1 -0
- package/lib/screens/Chat/index.js +5 -6
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/ChatHistory/index.js +3 -2
- package/lib/screens/ChatHistory/index.js.map +1 -1
- package/lib/screens/Home/HomeScreen.js +20 -4
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/Home/components/WebBuilderCodePrewarm.js +18 -0
- package/lib/screens/Home/components/WebBuilderCodePrewarm.js.map +1 -0
- package/lib/screens/WebBuilderNative/index.js +1 -1
- package/lib/screens/WebBuilderNative/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/keepAlive.js +112 -0
- package/lib/screens/WebBuilderNative/keepAlive.js.map +1 -0
- package/lib/screens/WebBuilderNative/runningBuilds.js +40 -0
- package/lib/screens/WebBuilderNative/runningBuilds.js.map +1 -0
- package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js +57 -0
- package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js.map +1 -0
- package/lib/screens/WebBuilderNative/useWebBuilderGallery.js +73 -14
- package/lib/screens/WebBuilderNative/useWebBuilderGallery.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +143 -34
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderJobs.js +17 -5
- package/lib/screens/WebBuilderNative/useWebBuilderJobs.js.map +1 -1
- package/lib/screens/WebBuilderNative/versionUndo.js +144 -0
- package/lib/screens/WebBuilderNative/versionUndo.js.map +1 -0
- package/lib/screens/WebBuilderNative/webbuilderSnapshotKey.js +1 -0
- package/lib/screens/WebBuilderNative/webbuilderSnapshotKey.js.map +1 -0
- package/lib/screens/WebBuilderNative/webbuilderTransport.js +90 -6
- package/lib/screens/WebBuilderNative/webbuilderTransport.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {jsxs,jsx}from'react/jsx-runtime';import {useMemo,useState,useCallback}from'react';import {View,Text,Modal,TextInput,
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {useMemo,useState,useCallback}from'react';import {View,Text,Modal,TextInput,ActivityIndicator,StyleSheet}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Image}from'expo-image';import {useCanvasTheme,themedStyles}from'../canvasTheme.js';import {Pressable,pressedStyle,Segmented,RADIUS,SPACE,TYPE}from'../canvasUi.js';import {HeroMonitor}from'./HeroMonitor.js';import {DirectorSheet}from'../generator/DirectorSheet.js';import {EMPTY_DIRECTION,directedPrompt}from'../generator/direction.js';import {heroShots,heroAspectOf,nextIn,heroSettings,HERO_ASPECTS,HERO_RESOLUTIONS}from'./heroShots.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -32,8 +32,10 @@ function HeroComposer({
|
|
|
32
32
|
playing,
|
|
33
33
|
onStartWithPrompt,
|
|
34
34
|
onPickReference,
|
|
35
|
-
onBrowseTemplates
|
|
35
|
+
onBrowseTemplates,
|
|
36
|
+
headerActions
|
|
36
37
|
}) {
|
|
38
|
+
var _a;
|
|
37
39
|
const theme = useCanvasTheme();
|
|
38
40
|
const styles = makeStyles(theme);
|
|
39
41
|
const shots = useMemo(() => heroShots(featuredLooks, showcase, PHONE_SHOTS), [featuredLooks, showcase]);
|
|
@@ -46,7 +48,7 @@ function HeroComposer({
|
|
|
46
48
|
const [product, setProduct] = useState(null);
|
|
47
49
|
const [attaching, setAttaching] = useState(false);
|
|
48
50
|
const [direction, setDirection] = useState(EMPTY_DIRECTION);
|
|
49
|
-
const [directing, setDirecting] = useState(
|
|
51
|
+
const [directing, setDirecting] = useState(null);
|
|
50
52
|
const index = shots.length ? shot % shots.length : 0;
|
|
51
53
|
const ready = Boolean(draft.trim());
|
|
52
54
|
const applyShot = useCallback((s) => {
|
|
@@ -72,38 +74,31 @@ function HeroComposer({
|
|
|
72
74
|
onStartWithPrompt(sent, heroSettings(mode, aspect, resolution, product));
|
|
73
75
|
};
|
|
74
76
|
return /* @__PURE__ */ jsxs(View, { style: styles.root, children: [
|
|
75
|
-
/* @__PURE__ */
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
77
|
+
headerActions ? /* @__PURE__ */ jsx(View, { style: styles.actions, children: headerActions }) : null,
|
|
78
|
+
/* @__PURE__ */ jsx(HeroMonitor, { shots, index, onCut: setShot, paused: ready || focused, playing, still: mode === "image", aspect, resolution, slate: draft }),
|
|
79
|
+
/* @__PURE__ */ jsx(Text, { style: styles.headline, accessibilityRole: "header", children: "Direct the shot." }),
|
|
80
|
+
/* @__PURE__ */ jsx(Text, { style: styles.lede, children: "Every choice you make shows up on the monitor before you spend a run on it." }),
|
|
81
|
+
onBrowseTemplates ? /* @__PURE__ */ jsxs(Pressable, { onPress: onBrowseTemplates, hitSlop: 8, style: ({
|
|
82
|
+
pressed
|
|
83
|
+
}) => [styles.templatesLink, pressedStyle(pressed)], accessibilityRole: "button", testID: "hero-browse-templates", children: [
|
|
84
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "view-dashboard-outline", size: 16, color: theme.foreground }),
|
|
85
|
+
/* @__PURE__ */ jsx(Text, { style: styles.templatesLinkLabel, children: "Start from a template" }),
|
|
86
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "arrow-right", size: 15, color: theme.mutedForeground })
|
|
87
|
+
] }) : null,
|
|
88
|
+
directing ? /* @__PURE__ */ jsx(Modal, { transparent: true, animationType: "slide", visible: true, onRequestClose: () => setDirecting(null), children: /* @__PURE__ */ jsx(View, { style: styles.sheetHost, children: /* @__PURE__ */ jsx(DirectorSheet, { initialTab: directing, value: direction, onChange: setDirection, onClose: () => setDirecting(null), prompt: draft }) }) }) : null,
|
|
86
89
|
/* @__PURE__ */ jsxs(View, { style: styles.composer, children: [
|
|
87
|
-
/* @__PURE__ */
|
|
88
|
-
|
|
89
|
-
|
|
90
|
+
/* @__PURE__ */ jsx(Segmented, { options: MODES, value: mode, onChange: setMode, style: styles.modes }),
|
|
91
|
+
/* @__PURE__ */ jsx(TextInput, { value: draft, onChangeText: setDraft, onFocus: () => setFocused(true), onBlur: () => setFocused(false), placeholder: ((_a = shots[index]) == null ? void 0 : _a.title) || (mode === "video" ? PLACEHOLDER : "A ceramic mug on a sunlit table"), placeholderTextColor: theme.tint(0.32), multiline: true, style: styles.prompt, accessibilityLabel: "Describe the shot", testID: "hero-prompt" }),
|
|
92
|
+
shots[index] ? (
|
|
93
|
+
// Web's "Tab: use this shot's prompt", as a tap on a phone.
|
|
94
|
+
/* @__PURE__ */ jsxs(Pressable, { onPress: () => applyShot(shots[index]), hitSlop: 6, style: ({
|
|
90
95
|
pressed
|
|
91
|
-
}) => [styles.
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
/* @__PURE__ */ jsxs(Pressable, { onPress: () => setAspect(nextIn(HERO_ASPECTS, aspect)), style: ({
|
|
98
|
-
pressed
|
|
99
|
-
}) => [styles.pill, pressedStyle(pressed)], accessibilityRole: "button", accessibilityLabel: `Aspect ratio ${aspect}. Tap to change`, children: [
|
|
100
|
-
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "aspect-ratio", size: 15, color: theme.mutedForeground }),
|
|
101
|
-
/* @__PURE__ */ jsx(Text, { style: styles.pillLabel, children: aspect })
|
|
102
|
-
] }),
|
|
103
|
-
/* @__PURE__ */ jsx(Pressable, { onPress: () => setResolution(nextIn(HERO_RESOLUTIONS, resolution)), style: ({
|
|
104
|
-
pressed
|
|
105
|
-
}) => [styles.pill, pressedStyle(pressed)], accessibilityRole: "button", accessibilityLabel: `Resolution ${resolution}. Tap to change`, children: /* @__PURE__ */ jsx(Text, { style: styles.pillLabel, children: resolution }) }),
|
|
106
|
-
mode === "video" ? /* @__PURE__ */ jsx(DirectorPill, { value: direction, onPress: () => setDirecting(true) }) : null,
|
|
96
|
+
}) => [styles.useShot, pressedStyle(pressed)], accessibilityRole: "button", accessibilityLabel: `Use this shot's prompt: ${shots[index].title}`, children: [
|
|
97
|
+
/* @__PURE__ */ jsx(View, { style: styles.useShotKey, children: /* @__PURE__ */ jsx(Text, { style: styles.useShotKeyText, children: "Tap" }) }),
|
|
98
|
+
/* @__PURE__ */ jsx(Text, { style: styles.useShotLabel, children: "Use this shot's prompt" })
|
|
99
|
+
] })
|
|
100
|
+
) : null,
|
|
101
|
+
/* @__PURE__ */ jsxs(View, { style: styles.chips, children: [
|
|
107
102
|
product ? /* @__PURE__ */ jsxs(View, { style: styles.pill, children: [
|
|
108
103
|
/* @__PURE__ */ jsx(Image, { source: {
|
|
109
104
|
uri: product
|
|
@@ -115,7 +110,30 @@ function HeroComposer({
|
|
|
115
110
|
}) => [styles.pill, pressedStyle(pressed)], accessibilityRole: "button", accessibilityLabel: "Add a product reference image", children: [
|
|
116
111
|
attaching ? /* @__PURE__ */ jsx(ActivityIndicator, { size: "small", color: theme.mutedForeground }) : /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "image-plus", size: 15, color: theme.mutedForeground }),
|
|
117
112
|
/* @__PURE__ */ jsx(Text, { style: styles.pillLabel, children: "Product" })
|
|
118
|
-
] }) : null
|
|
113
|
+
] }) : null,
|
|
114
|
+
mode === "video" ? [["Film setup", "movie-open-outline", "film"], ["Camera", "camera-iris", "camera"], ["Palette", "palette-outline", "look"], ["Lighting", "white-balance-sunny", "look"]].map(([label, icon, tab]) => /* @__PURE__ */ jsxs(Pressable, { onPress: () => setDirecting(tab), style: ({
|
|
115
|
+
pressed
|
|
116
|
+
}) => [styles.pill, styles.pillDashed, pressedStyle(pressed)], accessibilityRole: "button", accessibilityLabel: label, children: [
|
|
117
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: icon, size: 16, color: theme.mutedForeground }),
|
|
118
|
+
/* @__PURE__ */ jsx(Text, { style: styles.pillLabelSoft, children: label })
|
|
119
|
+
] }, label)) : null
|
|
120
|
+
] }),
|
|
121
|
+
/* @__PURE__ */ jsxs(View, { style: styles.bar, children: [
|
|
122
|
+
/* @__PURE__ */ jsx(Pressable, { onPress: () => setAspect(nextIn(HERO_ASPECTS, aspect)), hitSlop: 6, style: ({
|
|
123
|
+
pressed
|
|
124
|
+
}) => [styles.barOption, pressedStyle(pressed)], accessibilityRole: "button", accessibilityLabel: `Aspect ratio ${aspect}. Tap to change`, children: /* @__PURE__ */ jsx(Text, { style: styles.barLabel, children: aspect }) }),
|
|
125
|
+
/* @__PURE__ */ jsx(Pressable, { onPress: () => setResolution(nextIn(HERO_RESOLUTIONS, resolution)), hitSlop: 6, style: ({
|
|
126
|
+
pressed
|
|
127
|
+
}) => [styles.barOption, pressedStyle(pressed)], accessibilityRole: "button", accessibilityLabel: `Resolution ${resolution}. Tap to change`, children: /* @__PURE__ */ jsx(Text, { style: styles.barLabel, children: resolution }) }),
|
|
128
|
+
/* @__PURE__ */ jsx(View, { style: styles.spacer }),
|
|
129
|
+
/* @__PURE__ */ jsxs(Pressable, { onPress: submit, disabled: !ready, style: ({
|
|
130
|
+
pressed
|
|
131
|
+
}) => [styles.generate, ready ? styles.generateReady : null, pressedStyle(pressed && ready)], accessibilityRole: "button", accessibilityLabel: mode === "video" ? "Generate video" : "Generate image", accessibilityState: {
|
|
132
|
+
disabled: !ready
|
|
133
|
+
}, testID: "hero-generate", children: [
|
|
134
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.generateLabel, ready && styles.generateLabelReady], children: "Generate" }),
|
|
135
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "arrow-right", size: 16, color: ready ? theme.primaryForeground : theme.mutedForeground })
|
|
136
|
+
] })
|
|
119
137
|
] })
|
|
120
138
|
] })
|
|
121
139
|
] });
|
|
@@ -128,71 +146,100 @@ const makeStyles = themedStyles((theme) => StyleSheet.create({
|
|
|
128
146
|
sheetHost: {
|
|
129
147
|
flex: 1
|
|
130
148
|
},
|
|
131
|
-
|
|
149
|
+
actions: {
|
|
132
150
|
flexDirection: "row",
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
151
|
+
justifyContent: "flex-end",
|
|
152
|
+
gap: SPACE.sm,
|
|
153
|
+
marginBottom: -4
|
|
136
154
|
},
|
|
137
|
-
|
|
155
|
+
headline: {
|
|
156
|
+
fontSize: 36,
|
|
157
|
+
lineHeight: 40,
|
|
158
|
+
fontWeight: "800",
|
|
159
|
+
letterSpacing: -1,
|
|
138
160
|
color: theme.foreground,
|
|
139
|
-
|
|
161
|
+
marginTop: SPACE.sm
|
|
162
|
+
},
|
|
163
|
+
lede: __spreadProps(__spreadValues({}, TYPE.body), {
|
|
164
|
+
color: theme.mutedForeground,
|
|
165
|
+
marginTop: -4
|
|
140
166
|
}),
|
|
141
167
|
templatesLink: {
|
|
142
168
|
flexDirection: "row",
|
|
143
169
|
alignItems: "center",
|
|
144
|
-
gap: SPACE.xs,
|
|
170
|
+
gap: SPACE.xs + 2,
|
|
171
|
+
alignSelf: "flex-start",
|
|
145
172
|
minHeight: 32
|
|
146
173
|
},
|
|
147
174
|
templatesLinkLabel: __spreadProps(__spreadValues({}, TYPE.label), {
|
|
148
|
-
|
|
175
|
+
fontSize: 14,
|
|
176
|
+
color: theme.foreground
|
|
149
177
|
}),
|
|
178
|
+
// A raised card, as the web composer: white on the page, hairline edge, soft shadow.
|
|
150
179
|
composer: {
|
|
151
|
-
gap: SPACE.
|
|
152
|
-
padding: SPACE.
|
|
180
|
+
gap: SPACE.md,
|
|
181
|
+
padding: SPACE.md,
|
|
153
182
|
borderRadius: RADIUS.xl,
|
|
154
|
-
backgroundColor: theme.
|
|
183
|
+
backgroundColor: theme.surface,
|
|
184
|
+
borderWidth: StyleSheet.hairlineWidth,
|
|
185
|
+
borderColor: theme.border,
|
|
186
|
+
shadowColor: "#000",
|
|
187
|
+
shadowOpacity: theme.isDark ? 0 : 0.06,
|
|
188
|
+
shadowRadius: 14,
|
|
189
|
+
shadowOffset: {
|
|
190
|
+
width: 0,
|
|
191
|
+
height: 6
|
|
192
|
+
},
|
|
193
|
+
elevation: theme.isDark ? 0 : 2
|
|
155
194
|
},
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
alignItems: "flex-end",
|
|
159
|
-
gap: SPACE.sm,
|
|
160
|
-
paddingLeft: SPACE.md,
|
|
161
|
-
paddingRight: SPACE.xs + 2,
|
|
162
|
-
paddingVertical: SPACE.xs + 2,
|
|
163
|
-
borderRadius: RADIUS.lg,
|
|
164
|
-
backgroundColor: theme.isDark ? theme.secondary : theme.surface
|
|
195
|
+
modes: {
|
|
196
|
+
alignSelf: "flex-start"
|
|
165
197
|
},
|
|
166
198
|
prompt: __spreadProps(__spreadValues({}, TYPE.body), {
|
|
167
|
-
|
|
168
|
-
minHeight:
|
|
169
|
-
maxHeight:
|
|
170
|
-
|
|
171
|
-
|
|
199
|
+
fontSize: 16,
|
|
200
|
+
minHeight: 96,
|
|
201
|
+
maxHeight: 180,
|
|
202
|
+
paddingHorizontal: SPACE.md,
|
|
203
|
+
paddingTop: SPACE.md,
|
|
204
|
+
paddingBottom: SPACE.md,
|
|
205
|
+
borderRadius: RADIUS.lg,
|
|
206
|
+
backgroundColor: theme.card,
|
|
172
207
|
color: theme.foreground,
|
|
173
208
|
textAlignVertical: "top"
|
|
174
209
|
}),
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
borderRadius: 20,
|
|
210
|
+
chips: {
|
|
211
|
+
flexDirection: "row",
|
|
212
|
+
flexWrap: "wrap",
|
|
179
213
|
alignItems: "center",
|
|
180
|
-
|
|
181
|
-
backgroundColor: theme.primary
|
|
182
|
-
},
|
|
183
|
-
// Stays lime so the main action is always findable; dimmed until there is a prompt.
|
|
184
|
-
sendIdle: {
|
|
185
|
-
opacity: 0.4
|
|
214
|
+
gap: SPACE.sm
|
|
186
215
|
},
|
|
187
|
-
|
|
188
|
-
|
|
216
|
+
pillDashed: {
|
|
217
|
+
borderStyle: "dashed"
|
|
189
218
|
},
|
|
190
|
-
|
|
219
|
+
pillLabelSoft: __spreadProps(__spreadValues({}, TYPE.label), {
|
|
220
|
+
color: theme.mutedForeground
|
|
221
|
+
}),
|
|
222
|
+
useShot: {
|
|
191
223
|
flexDirection: "row",
|
|
192
224
|
alignItems: "center",
|
|
193
225
|
gap: SPACE.sm,
|
|
194
|
-
|
|
226
|
+
alignSelf: "flex-start",
|
|
227
|
+
marginTop: -4
|
|
228
|
+
},
|
|
229
|
+
useShotKey: {
|
|
230
|
+
paddingHorizontal: SPACE.sm,
|
|
231
|
+
paddingVertical: 2,
|
|
232
|
+
borderRadius: RADIUS.sm,
|
|
233
|
+
borderWidth: StyleSheet.hairlineWidth,
|
|
234
|
+
borderColor: theme.borderStrong
|
|
195
235
|
},
|
|
236
|
+
useShotKeyText: __spreadProps(__spreadValues({}, TYPE.caption), {
|
|
237
|
+
color: theme.mutedForeground
|
|
238
|
+
}),
|
|
239
|
+
useShotLabel: __spreadProps(__spreadValues({}, TYPE.caption), {
|
|
240
|
+
fontWeight: "400",
|
|
241
|
+
color: theme.mutedForeground
|
|
242
|
+
}),
|
|
196
243
|
pill: {
|
|
197
244
|
flexDirection: "row",
|
|
198
245
|
alignItems: "center",
|
|
@@ -200,7 +247,9 @@ const makeStyles = themedStyles((theme) => StyleSheet.create({
|
|
|
200
247
|
minHeight: 36,
|
|
201
248
|
paddingHorizontal: SPACE.md,
|
|
202
249
|
borderRadius: RADIUS.pill,
|
|
203
|
-
|
|
250
|
+
borderWidth: StyleSheet.hairlineWidth,
|
|
251
|
+
borderColor: theme.borderStrong,
|
|
252
|
+
backgroundColor: theme.surface
|
|
204
253
|
},
|
|
205
254
|
refThumb: {
|
|
206
255
|
width: 20,
|
|
@@ -208,7 +257,47 @@ const makeStyles = themedStyles((theme) => StyleSheet.create({
|
|
|
208
257
|
borderRadius: 5
|
|
209
258
|
},
|
|
210
259
|
pillLabel: __spreadProps(__spreadValues({}, TYPE.label), {
|
|
211
|
-
fontVariant: ["tabular-nums"],
|
|
212
260
|
color: theme.foreground
|
|
213
|
-
})
|
|
261
|
+
}),
|
|
262
|
+
bar: {
|
|
263
|
+
flexDirection: "row",
|
|
264
|
+
alignItems: "center",
|
|
265
|
+
gap: SPACE.md,
|
|
266
|
+
paddingTop: SPACE.md,
|
|
267
|
+
borderTopWidth: StyleSheet.hairlineWidth,
|
|
268
|
+
borderTopColor: theme.border
|
|
269
|
+
},
|
|
270
|
+
barOption: {
|
|
271
|
+
minHeight: 36,
|
|
272
|
+
justifyContent: "center",
|
|
273
|
+
paddingHorizontal: SPACE.xs
|
|
274
|
+
},
|
|
275
|
+
barLabel: __spreadProps(__spreadValues({}, TYPE.label), {
|
|
276
|
+
fontSize: 14,
|
|
277
|
+
fontVariant: ["tabular-nums"],
|
|
278
|
+
color: theme.mutedForeground
|
|
279
|
+
}),
|
|
280
|
+
spacer: {
|
|
281
|
+
flex: 1
|
|
282
|
+
},
|
|
283
|
+
generate: {
|
|
284
|
+
flexDirection: "row",
|
|
285
|
+
alignItems: "center",
|
|
286
|
+
gap: SPACE.sm,
|
|
287
|
+
minHeight: 44,
|
|
288
|
+
paddingHorizontal: SPACE.lg + 2,
|
|
289
|
+
borderRadius: RADIUS.md,
|
|
290
|
+
backgroundColor: theme.card
|
|
291
|
+
},
|
|
292
|
+
// Lime once there is a prompt: the one main action, as web turns it on.
|
|
293
|
+
generateReady: {
|
|
294
|
+
backgroundColor: theme.primary
|
|
295
|
+
},
|
|
296
|
+
generateLabel: __spreadProps(__spreadValues({}, TYPE.label), {
|
|
297
|
+
fontSize: 15,
|
|
298
|
+
color: theme.mutedForeground
|
|
299
|
+
}),
|
|
300
|
+
generateLabelReady: {
|
|
301
|
+
color: theme.primaryForeground
|
|
302
|
+
}
|
|
214
303
|
}));export{HeroComposer};//# sourceMappingURL=HeroComposer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeroComposer.js","sources":["../../../../src/features/canvas/home/HeroComposer.tsx"],"sourcesContent":["/**\n * \"Direct the shot\" - the home hero, native twin of canvas-surface\n * `CanvasHome.tsx` (hero + composer). The monitor previews what the composer\n * will make; Generate opens a fresh canvas with the generator seeded from it.\n *\n * Monitor looping shots (HeroMonitor), \"Use this shot\" copies a prompt\n * Composer image / video, the prompt, a product reference, aspect and\n * resolution pills, Generate\n *\n * Film / camera / palette / lighting ride the \"Direct\" pill (generator/DirectorSheet)\n * and are applied to the prompt on Generate, as web CanvasHome does. The\n * character picker and model chip are not here yet.\n */\nimport React, { useCallback, useMemo, useState } from 'react';\nimport { ActivityIndicator, Modal, ScrollView, StyleSheet, Text, TextInput, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Image } from 'expo-image';\nimport type { StudioLook } from '../studioLooks';\nimport type { ShowcaseClip } from '../seedanceShowcase';\nimport { useCanvasTheme, themedStyles, type CanvasPalette } from '../canvasTheme';\nimport { Pressable, RADIUS, SPACE, Segmented, TYPE, pressedStyle } from '../canvasUi';\nimport { HeroMonitor } from './HeroMonitor';\nimport { DirectorPill, DirectorSheet } from '../generator/DirectorSheet';\nimport { EMPTY_DIRECTION, directedPrompt, type Direction } from '../generator/direction';\nimport {\n HERO_ASPECTS,\n HERO_RESOLUTIONS,\n heroAspectOf,\n heroSettings,\n heroShots,\n nextIn,\n type HeroAspect,\n type HeroMode,\n type HeroResolution,\n type HeroSettings,\n type HeroShot,\n} from './heroShots';\n\nconst MODES = [\n { id: 'image' as const, label: 'Image' },\n { id: 'video' as const, label: 'Video' },\n];\nconst PLACEHOLDER = 'A slow push-in on a ceramic mug on a sunlit table, steam curling, shallow focus';\n/** The monitor's four thumbs on a phone; it cycles only what it shows. */\nconst PHONE_SHOTS = 4;\n\nexport function HeroComposer({\n featuredLooks,\n showcase,\n playing,\n onStartWithPrompt,\n onPickReference,\n onBrowseTemplates,\n}: {\n featuredLooks: readonly StudioLook[];\n showcase: readonly ShowcaseClip[];\n /** The home playback governor: true while the hero is the region on screen. */\n playing: boolean;\n onStartWithPrompt: (prompt: string, settings: HeroSettings) => void;\n /** Picks an image from the device and answers its uploaded URL (null when cancelled). */\n onPickReference?: () => Promise<string | null>;\n onBrowseTemplates?: () => void;\n}) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n const shots = useMemo(() => heroShots(featuredLooks, showcase, PHONE_SHOTS), [featuredLooks, showcase]);\n const [shot, setShot] = useState(0);\n const [mode, setMode] = useState<HeroMode>('video');\n const [draft, setDraft] = useState('');\n const [focused, setFocused] = useState(false);\n const [aspect, setAspect] = useState<HeroAspect>('16:9');\n const [resolution, setResolution] = useState<HeroResolution>('720p');\n const [product, setProduct] = useState<string | null>(null);\n const [attaching, setAttaching] = useState(false);\n const [direction, setDirection] = useState<Direction>(EMPTY_DIRECTION);\n const [directing, setDirecting] = useState(false);\n const index = shots.length ? shot % shots.length : 0;\n const ready = Boolean(draft.trim());\n\n const applyShot = useCallback((s: HeroShot) => {\n setDraft(s.prompt);\n setMode('video');\n const fit = heroAspectOf(s.aspect);\n if (fit) setAspect(fit);\n }, []);\n\n const attach = async () => {\n if (!onPickReference || attaching) return;\n setAttaching(true);\n try {\n const url = await onPickReference();\n if (url) setProduct(url);\n } finally {\n setAttaching(false);\n }\n };\n\n const submit = () => {\n const text = draft.trim();\n if (!text) return;\n // Web CanvasHome: applyCinematic(draft, composeCameraPhrase(camera), cine). Video only.\n const sent = mode === 'video' ? directedPrompt(text, direction) : text;\n onStartWithPrompt(sent, heroSettings(mode, aspect, resolution, product));\n };\n\n return (\n <View style={styles.root}>\n <View style={styles.titleRow}>\n <Text style={styles.title} accessibilityRole=\"header\">\n Direct the shot\n </Text>\n {onBrowseTemplates ? (\n <Pressable\n onPress={onBrowseTemplates}\n hitSlop={8}\n style={({ pressed }) => [styles.templatesLink, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Start from a template\"\n testID=\"hero-browse-templates\"\n >\n <Text style={styles.templatesLinkLabel}>Templates</Text>\n <MaterialCommunityIcons name=\"arrow-right\" size={14} color={theme.mutedForeground} />\n </Pressable>\n ) : null}\n </View>\n\n <HeroMonitor\n shots={shots}\n index={index}\n onCut={setShot}\n paused={ready || focused}\n playing={playing}\n still={mode === 'image'}\n aspect={aspect}\n resolution={resolution}\n slate={draft}\n onUseShot={applyShot}\n />\n\n {directing ? (\n <Modal transparent animationType=\"slide\" visible onRequestClose={() => setDirecting(false)}>\n <View style={styles.sheetHost}>\n <DirectorSheet\n value={direction}\n onChange={setDirection}\n onClose={() => setDirecting(false)}\n prompt={draft}\n />\n </View>\n </Modal>\n ) : null}\n\n <View style={styles.composer}>\n {/* The prompt carries its own send, like the home prompt bar. */}\n <View style={styles.promptWell}>\n <TextInput\n value={draft}\n onChangeText={setDraft}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n placeholder={\n mode === 'video' ? PLACEHOLDER : 'A ceramic mug on a sunlit table, soft morning light'\n }\n placeholderTextColor={theme.tint(0.32)}\n multiline\n style={styles.prompt}\n accessibilityLabel=\"Describe the shot\"\n testID=\"hero-prompt\"\n />\n <Pressable\n onPress={submit}\n disabled={!ready}\n style={({ pressed }) => [\n styles.send,\n !ready && styles.sendIdle,\n pressedStyle(pressed && ready),\n ]}\n accessibilityRole=\"button\"\n accessibilityLabel={mode === 'video' ? 'Generate video' : 'Generate image'}\n accessibilityState={{ disabled: !ready }}\n testID=\"hero-generate\"\n >\n <MaterialCommunityIcons name=\"arrow-up\" size={20} color={theme.primaryForeground} />\n </Pressable>\n </View>\n\n {/* Every setting in one row: what it makes, its frame, and how it is shot. */}\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n style={styles.optionsScroll}\n contentContainerStyle={styles.options}\n keyboardShouldPersistTaps=\"handled\"\n >\n <Segmented options={MODES} value={mode} onChange={setMode} />\n <Pressable\n onPress={() => setAspect(nextIn(HERO_ASPECTS, aspect))}\n style={({ pressed }) => [styles.pill, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n accessibilityLabel={`Aspect ratio ${aspect}. Tap to change`}\n >\n <MaterialCommunityIcons name=\"aspect-ratio\" size={15} color={theme.mutedForeground} />\n <Text style={styles.pillLabel}>{aspect}</Text>\n </Pressable>\n <Pressable\n onPress={() => setResolution(nextIn(HERO_RESOLUTIONS, resolution))}\n style={({ pressed }) => [styles.pill, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n accessibilityLabel={`Resolution ${resolution}. Tap to change`}\n >\n <Text style={styles.pillLabel}>{resolution}</Text>\n </Pressable>\n {mode === 'video' ? <DirectorPill value={direction} onPress={() => setDirecting(true)} /> : null}\n {product ? (\n <View style={styles.pill}>\n <Image source={{ uri: product }} style={styles.refThumb} contentFit=\"cover\" />\n <Text style={styles.pillLabel}>Product</Text>\n <Pressable\n onPress={() => setProduct(null)}\n hitSlop={10}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Remove product reference\"\n >\n <MaterialCommunityIcons name=\"close\" size={14} color={theme.mutedForeground} />\n </Pressable>\n </View>\n ) : onPickReference ? (\n <Pressable\n onPress={() => void attach()}\n disabled={attaching}\n style={({ pressed }) => [styles.pill, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Add a product reference image\"\n >\n {attaching ? (\n <ActivityIndicator size=\"small\" color={theme.mutedForeground} />\n ) : (\n <MaterialCommunityIcons name=\"image-plus\" size={15} color={theme.mutedForeground} />\n )}\n <Text style={styles.pillLabel}>Product</Text>\n </Pressable>\n ) : null}\n </ScrollView>\n </View>\n </View>\n );\n}\n\nconst makeStyles = themedStyles((theme: CanvasPalette) =>\n StyleSheet.create({\n root: { gap: SPACE.md, marginBottom: SPACE.xl },\n sheetHost: { flex: 1 },\n titleRow: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', gap: SPACE.md },\n title: { ...TYPE.heading, color: theme.foreground, flexShrink: 1 },\n templatesLink: { flexDirection: 'row', alignItems: 'center', gap: SPACE.xs, minHeight: 32 },\n templatesLinkLabel: { ...TYPE.label, color: theme.mutedForeground },\n composer: {\n gap: SPACE.sm,\n padding: SPACE.sm,\n borderRadius: RADIUS.xl,\n backgroundColor: theme.card,\n },\n promptWell: {\n flexDirection: 'row',\n alignItems: 'flex-end',\n gap: SPACE.sm,\n paddingLeft: SPACE.md,\n paddingRight: SPACE.xs + 2,\n paddingVertical: SPACE.xs + 2,\n borderRadius: RADIUS.lg,\n backgroundColor: theme.isDark ? theme.secondary : theme.surface,\n },\n prompt: {\n ...TYPE.body,\n flex: 1,\n minHeight: 64,\n maxHeight: 160,\n paddingTop: SPACE.sm,\n paddingBottom: SPACE.sm,\n color: theme.foreground,\n textAlignVertical: 'top',\n },\n send: {\n width: 40,\n height: 40,\n borderRadius: 20,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: theme.primary,\n },\n // Stays lime so the main action is always findable; dimmed until there is a prompt.\n sendIdle: { opacity: 0.4 },\n optionsScroll: { flexGrow: 0 },\n options: { flexDirection: 'row', alignItems: 'center', gap: SPACE.sm, paddingHorizontal: 2 },\n pill: {\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.isDark ? theme.secondary : theme.surface,\n },\n refThumb: { width: 20, height: 20, borderRadius: 5 },\n pillLabel: { ...TYPE.label, fontVariant: ['tabular-nums'], color: theme.foreground },\n }),\n);\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HeroComposer.js","sources":["../../../../src/features/canvas/home/HeroComposer.tsx"],"sourcesContent":["/**\n * \"Direct the shot\" - the home hero, native twin of canvas-surface\n * `CanvasHome.tsx` (hero + composer). The monitor previews what the composer\n * will make; Generate opens a fresh canvas with the generator seeded from it.\n *\n * Monitor looping shots (HeroMonitor), \"Use this shot\" copies a prompt\n * Composer image / video, the prompt, a product reference, aspect and\n * resolution pills, Generate\n *\n * Film / camera / palette / lighting ride the \"Direct\" pill (generator/DirectorSheet)\n * and are applied to the prompt on Generate, as web CanvasHome does. The\n * character picker and model chip are not here yet.\n */\nimport React, { useCallback, useMemo, useState } from 'react';\nimport { ActivityIndicator, Modal, StyleSheet, Text, TextInput, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Image } from 'expo-image';\nimport type { StudioLook } from '../studioLooks';\nimport type { ShowcaseClip } from '../seedanceShowcase';\nimport { useCanvasTheme, themedStyles, type CanvasPalette } from '../canvasTheme';\nimport { Pressable, RADIUS, SPACE, Segmented, TYPE, pressedStyle } from '../canvasUi';\nimport { HeroMonitor } from './HeroMonitor';\nimport { DirectorSheet, type DirectorTab } from '../generator/DirectorSheet';\nimport { EMPTY_DIRECTION, directedPrompt, type Direction } from '../generator/direction';\nimport {\n HERO_ASPECTS,\n HERO_RESOLUTIONS,\n heroAspectOf,\n heroSettings,\n heroShots,\n nextIn,\n type HeroAspect,\n type HeroMode,\n type HeroResolution,\n type HeroSettings,\n type HeroShot,\n} from './heroShots';\n\nconst MODES = [\n { id: 'image' as const, label: 'Image' },\n { id: 'video' as const, label: 'Video' },\n];\nconst PLACEHOLDER = 'A slow push-in on a ceramic mug on a sunlit table, steam curling, shallow focus';\n/** The monitor's four thumbs on a phone; it cycles only what it shows. */\nconst PHONE_SHOTS = 4;\n\nexport function HeroComposer({\n featuredLooks,\n showcase,\n playing,\n onStartWithPrompt,\n onPickReference,\n onBrowseTemplates,\n headerActions,\n}: {\n featuredLooks: readonly StudioLook[];\n showcase: readonly ShowcaseClip[];\n /** The home playback governor: true while the hero is the region on screen. */\n playing: boolean;\n onStartWithPrompt: (prompt: string, settings: HeroSettings) => void;\n /** Picks an image from the device and answers its uploaded URL (null when cancelled). */\n onPickReference?: () => Promise<string | null>;\n onBrowseTemplates?: () => void;\n /** Round buttons beside the headline (AI Chat, theme); the hero is the top of home. */\n headerActions?: React.ReactNode;\n}) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n const shots = useMemo(() => heroShots(featuredLooks, showcase, PHONE_SHOTS), [featuredLooks, showcase]);\n const [shot, setShot] = useState(0);\n const [mode, setMode] = useState<HeroMode>('video');\n const [draft, setDraft] = useState('');\n const [focused, setFocused] = useState(false);\n const [aspect, setAspect] = useState<HeroAspect>('16:9');\n const [resolution, setResolution] = useState<HeroResolution>('720p');\n const [product, setProduct] = useState<string | null>(null);\n const [attaching, setAttaching] = useState(false);\n const [direction, setDirection] = useState<Direction>(EMPTY_DIRECTION);\n const [directing, setDirecting] = useState<DirectorTab | null>(null);\n const index = shots.length ? shot % shots.length : 0;\n const ready = Boolean(draft.trim());\n\n const applyShot = useCallback((s: HeroShot) => {\n setDraft(s.prompt);\n setMode('video');\n const fit = heroAspectOf(s.aspect);\n if (fit) setAspect(fit);\n }, []);\n\n const attach = async () => {\n if (!onPickReference || attaching) return;\n setAttaching(true);\n try {\n const url = await onPickReference();\n if (url) setProduct(url);\n } finally {\n setAttaching(false);\n }\n };\n\n const submit = () => {\n const text = draft.trim();\n if (!text) return;\n // Web CanvasHome: applyCinematic(draft, composeCameraPhrase(camera), cine). Video only.\n const sent = mode === 'video' ? directedPrompt(text, direction) : text;\n onStartWithPrompt(sent, heroSettings(mode, aspect, resolution, product));\n };\n\n return (\n <View style={styles.root}>\n {headerActions ? <View style={styles.actions}>{headerActions}</View> : null}\n\n {/* Web CanvasHome on a phone: the monitor first, then the headline and the composer. */}\n <HeroMonitor\n shots={shots}\n index={index}\n onCut={setShot}\n paused={ready || focused}\n playing={playing}\n still={mode === 'image'}\n aspect={aspect}\n resolution={resolution}\n slate={draft}\n />\n\n <Text style={styles.headline} accessibilityRole=\"header\">\n Direct the shot.\n </Text>\n <Text style={styles.lede}>Every choice you make shows up on the monitor before you spend a run on it.</Text>\n {onBrowseTemplates ? (\n <Pressable\n onPress={onBrowseTemplates}\n hitSlop={8}\n style={({ pressed }) => [styles.templatesLink, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n testID=\"hero-browse-templates\"\n >\n <MaterialCommunityIcons name=\"view-dashboard-outline\" size={16} color={theme.foreground} />\n <Text style={styles.templatesLinkLabel}>Start from a template</Text>\n <MaterialCommunityIcons name=\"arrow-right\" size={15} color={theme.mutedForeground} />\n </Pressable>\n ) : null}\n\n {directing ? (\n <Modal transparent animationType=\"slide\" visible onRequestClose={() => setDirecting(null)}>\n <View style={styles.sheetHost}>\n <DirectorSheet\n initialTab={directing}\n value={direction}\n onChange={setDirection}\n onClose={() => setDirecting(null)}\n prompt={draft}\n />\n </View>\n </Modal>\n ) : null}\n\n <View style={styles.composer}>\n <Segmented options={MODES} value={mode} onChange={setMode} style={styles.modes} />\n <TextInput\n value={draft}\n onChangeText={setDraft}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n placeholder={\n shots[index]?.title || (mode === 'video' ? PLACEHOLDER : 'A ceramic mug on a sunlit table')\n }\n placeholderTextColor={theme.tint(0.32)}\n multiline\n style={styles.prompt}\n accessibilityLabel=\"Describe the shot\"\n testID=\"hero-prompt\"\n />\n {shots[index] ? (\n // Web's \"Tab: use this shot's prompt\", as a tap on a phone.\n <Pressable\n onPress={() => applyShot(shots[index])}\n hitSlop={6}\n style={({ pressed }) => [styles.useShot, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n accessibilityLabel={`Use this shot's prompt: ${shots[index].title}`}\n >\n <View style={styles.useShotKey}>\n <Text style={styles.useShotKeyText}>Tap</Text>\n </View>\n <Text style={styles.useShotLabel}>Use this shot's prompt</Text>\n </Pressable>\n ) : null}\n <View style={styles.chips}>\n {product ? (\n <View style={styles.pill}>\n <Image source={{ uri: product }} style={styles.refThumb} contentFit=\"cover\" />\n <Text style={styles.pillLabel}>Product</Text>\n <Pressable\n onPress={() => setProduct(null)}\n hitSlop={10}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Remove product reference\"\n >\n <MaterialCommunityIcons name=\"close\" size={14} color={theme.mutedForeground} />\n </Pressable>\n </View>\n ) : onPickReference ? (\n <Pressable\n onPress={() => void attach()}\n disabled={attaching}\n style={({ pressed }) => [styles.pill, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Add a product reference image\"\n >\n {attaching ? (\n <ActivityIndicator size=\"small\" color={theme.mutedForeground} />\n ) : (\n <MaterialCommunityIcons name=\"image-plus\" size={15} color={theme.mutedForeground} />\n )}\n <Text style={styles.pillLabel}>Product</Text>\n </Pressable>\n ) : null}\n {mode === 'video'\n ? (\n [\n ['Film setup', 'movie-open-outline', 'film'],\n ['Camera', 'camera-iris', 'camera'],\n ['Palette', 'palette-outline', 'look'],\n ['Lighting', 'white-balance-sunny', 'look'],\n ] as const\n ).map(([label, icon, tab]) => (\n <Pressable\n key={label}\n onPress={() => setDirecting(tab)}\n style={({ pressed }) => [styles.pill, styles.pillDashed, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n >\n <MaterialCommunityIcons name={icon} size={16} color={theme.mutedForeground} />\n <Text style={styles.pillLabelSoft}>{label}</Text>\n </Pressable>\n ))\n : null}\n </View>\n <View style={styles.bar}>\n <Pressable\n onPress={() => setAspect(nextIn(HERO_ASPECTS, aspect))}\n hitSlop={6}\n style={({ pressed }) => [styles.barOption, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n accessibilityLabel={`Aspect ratio ${aspect}. Tap to change`}\n >\n <Text style={styles.barLabel}>{aspect}</Text>\n </Pressable>\n <Pressable\n onPress={() => setResolution(nextIn(HERO_RESOLUTIONS, resolution))}\n hitSlop={6}\n style={({ pressed }) => [styles.barOption, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n accessibilityLabel={`Resolution ${resolution}. Tap to change`}\n >\n <Text style={styles.barLabel}>{resolution}</Text>\n </Pressable>\n <View style={styles.spacer} />\n <Pressable\n onPress={submit}\n disabled={!ready}\n style={({ pressed }) => [\n styles.generate,\n ready ? styles.generateReady : null,\n pressedStyle(pressed && ready),\n ]}\n accessibilityRole=\"button\"\n accessibilityLabel={mode === 'video' ? 'Generate video' : 'Generate image'}\n accessibilityState={{ disabled: !ready }}\n testID=\"hero-generate\"\n >\n <Text style={[styles.generateLabel, ready && styles.generateLabelReady]}>Generate</Text>\n <MaterialCommunityIcons\n name=\"arrow-right\"\n size={16}\n color={ready ? theme.primaryForeground : theme.mutedForeground}\n />\n </Pressable>\n </View>\n </View>\n </View>\n );\n}\n\nconst makeStyles = themedStyles((theme: CanvasPalette) =>\n StyleSheet.create({\n root: { gap: SPACE.md, marginBottom: SPACE.xl },\n sheetHost: { flex: 1 },\n actions: { flexDirection: 'row', justifyContent: 'flex-end', gap: SPACE.sm, marginBottom: -SPACE.xs },\n headline: {\n fontSize: 36,\n lineHeight: 40,\n fontWeight: '800',\n letterSpacing: -1,\n color: theme.foreground,\n marginTop: SPACE.sm,\n },\n lede: { ...TYPE.body, color: theme.mutedForeground, marginTop: -SPACE.xs },\n templatesLink: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: SPACE.xs + 2,\n alignSelf: 'flex-start',\n minHeight: 32,\n },\n templatesLinkLabel: { ...TYPE.label, fontSize: 14, color: theme.foreground },\n // A raised card, as the web composer: white on the page, hairline edge, soft shadow.\n composer: {\n gap: SPACE.md,\n padding: SPACE.md,\n borderRadius: RADIUS.xl,\n backgroundColor: theme.surface,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: theme.border,\n shadowColor: '#000',\n shadowOpacity: theme.isDark ? 0 : 0.06,\n shadowRadius: 14,\n shadowOffset: { width: 0, height: 6 },\n elevation: theme.isDark ? 0 : 2,\n },\n modes: { alignSelf: 'flex-start' },\n prompt: {\n ...TYPE.body,\n fontSize: 16,\n minHeight: 96,\n maxHeight: 180,\n paddingHorizontal: SPACE.md,\n paddingTop: SPACE.md,\n paddingBottom: SPACE.md,\n borderRadius: RADIUS.lg,\n backgroundColor: theme.card,\n color: theme.foreground,\n textAlignVertical: 'top',\n },\n chips: { flexDirection: 'row', flexWrap: 'wrap', alignItems: 'center', gap: SPACE.sm },\n pillDashed: { borderStyle: 'dashed' },\n pillLabelSoft: { ...TYPE.label, color: theme.mutedForeground },\n useShot: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: SPACE.sm,\n alignSelf: 'flex-start',\n marginTop: -SPACE.xs,\n },\n useShotKey: {\n paddingHorizontal: SPACE.sm,\n paddingVertical: 2,\n borderRadius: RADIUS.sm,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: theme.borderStrong,\n },\n useShotKeyText: { ...TYPE.caption, color: theme.mutedForeground },\n useShotLabel: { ...TYPE.caption, fontWeight: '400', color: theme.mutedForeground },\n pill: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: SPACE.xs + 2,\n minHeight: 36,\n paddingHorizontal: SPACE.md,\n borderRadius: RADIUS.pill,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: theme.borderStrong,\n backgroundColor: theme.surface,\n },\n refThumb: { width: 20, height: 20, borderRadius: 5 },\n pillLabel: { ...TYPE.label, color: theme.foreground },\n bar: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: SPACE.md,\n paddingTop: SPACE.md,\n borderTopWidth: StyleSheet.hairlineWidth,\n borderTopColor: theme.border,\n },\n barOption: { minHeight: 36, justifyContent: 'center', paddingHorizontal: SPACE.xs },\n barLabel: { ...TYPE.label, fontSize: 14, fontVariant: ['tabular-nums'], color: theme.mutedForeground },\n spacer: { flex: 1 },\n generate: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: SPACE.sm,\n minHeight: 44,\n paddingHorizontal: SPACE.lg + 2,\n borderRadius: RADIUS.md,\n backgroundColor: theme.card,\n },\n // Lime once there is a prompt: the one main action, as web turns it on.\n generateReady: { backgroundColor: theme.primary },\n generateLabel: { ...TYPE.label, fontSize: 15, color: theme.mutedForeground },\n generateLabelReady: { color: theme.primaryForeground },\n }),\n);\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useState,useRef,useEffect,useCallback}from'react';import {View,Text,StyleSheet,Linking}from'react-native';import {
|
|
1
|
+
import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useState,useRef,useEffect,useCallback}from'react';import {View,Text,StyleSheet,Linking}from'react-native';import {Image}from'expo-image';import {useCanvasTheme,themedStyles}from'../canvasTheme.js';import {Skeleton,RADIUS,Pressable,SPACE,TYPE}from'../canvasUi.js';import {LoopingVideo}from'./LoopingVideo.js';import {HERO_CUT_MS,cropInset,heroTimecode}from'./heroShots.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -27,8 +27,7 @@ function HeroMonitor({
|
|
|
27
27
|
still,
|
|
28
28
|
aspect,
|
|
29
29
|
resolution,
|
|
30
|
-
slate
|
|
31
|
-
onUseShot
|
|
30
|
+
slate
|
|
32
31
|
}) {
|
|
33
32
|
const theme = useCanvasTheme();
|
|
34
33
|
const styles = makeStyles(theme);
|
|
@@ -99,28 +98,29 @@ function HeroMonitor({
|
|
|
99
98
|
/* @__PURE__ */ jsx(Text, { style: styles.mono, children: resolution })
|
|
100
99
|
] }),
|
|
101
100
|
/* @__PURE__ */ jsx(View, { style: styles.slate, pointerEvents: "none", children: /* @__PURE__ */ jsx(Text, { style: styles.slateText, numberOfLines: 2, children: slate.trim() || shot.title }) }),
|
|
102
|
-
/* @__PURE__ */
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
] })
|
|
101
|
+
/* @__PURE__ */ jsx(View, { pointerEvents: "none", style: [styles.corner, styles.cornerTL] }),
|
|
102
|
+
/* @__PURE__ */ jsx(View, { pointerEvents: "none", style: [styles.corner, styles.cornerTR] }),
|
|
103
|
+
/* @__PURE__ */ jsx(View, { pointerEvents: "none", style: [styles.corner, styles.cornerBL] }),
|
|
104
|
+
/* @__PURE__ */ jsx(View, { pointerEvents: "none", style: [styles.corner, styles.cornerBR] }),
|
|
105
|
+
/* @__PURE__ */ jsx(View, { style: styles.lens, pointerEvents: "none", children: /* @__PURE__ */ jsx(Text, { style: styles.lensText, children: "Auto lens" }) })
|
|
108
106
|
] }),
|
|
109
|
-
/* @__PURE__ */ jsx(View, { style: styles.
|
|
107
|
+
/* @__PURE__ */ jsx(View, { style: styles.thumbs, children: shots.slice(0, PHONE_THUMBS).map((s, i) => {
|
|
110
108
|
const on = i === index;
|
|
111
|
-
return /* @__PURE__ */ jsx(Pressable, { onPress: () => onCut(i),
|
|
109
|
+
return /* @__PURE__ */ jsx(Pressable, { onPress: () => onCut(i), style: [styles.thumb, on && styles.thumbOn], accessibilityRole: "button", accessibilityLabel: s.title, accessibilityState: {
|
|
112
110
|
selected: on
|
|
113
|
-
}, children: /* @__PURE__ */ jsx(
|
|
111
|
+
}, children: s.poster ? /* @__PURE__ */ jsx(Image, { source: {
|
|
112
|
+
uri: s.poster
|
|
113
|
+
}, style: [StyleSheet.absoluteFill, !on && styles.thumbDim], contentFit: "cover" }) : null }, s.id);
|
|
114
114
|
}) }),
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
/* @__PURE__ */ jsx(
|
|
118
|
-
)
|
|
115
|
+
/* @__PURE__ */ jsxs(View, { children: [
|
|
116
|
+
shot.credit ? /* @__PURE__ */ jsx(Pressable, { onPress: openCredit, hitSlop: 6, accessibilityRole: "link", accessibilityLabel: `${shot.title} by ${shot.credit.author}, ${shot.credit.license}. Open the original post`, children: /* @__PURE__ */ jsx(Text, { style: [styles.caption, styles.captionLink], numberOfLines: 1, children: `${shot.title} \xB7 ${shot.credit.author} \xB7 ${shot.credit.license}` }) }) : /* @__PURE__ */ jsx(Text, { style: styles.caption, numberOfLines: 1, children: `Studio look \xB7 ${shot.title}` }),
|
|
117
|
+
/* @__PURE__ */ jsx(Text, { style: styles.caption, children: "Cuts every 7s, pauses while you type" })
|
|
118
|
+
] })
|
|
119
119
|
] });
|
|
120
120
|
}
|
|
121
121
|
const makeStyles = themedStyles((theme) => StyleSheet.create({
|
|
122
122
|
root: {
|
|
123
|
-
gap: SPACE.
|
|
123
|
+
gap: SPACE.sm + 2
|
|
124
124
|
},
|
|
125
125
|
loadingFrame: {
|
|
126
126
|
width: "100%",
|
|
@@ -143,7 +143,7 @@ const makeStyles = themedStyles((theme) => StyleSheet.create({
|
|
|
143
143
|
topBar: {
|
|
144
144
|
position: "absolute",
|
|
145
145
|
top: SPACE.sm,
|
|
146
|
-
|
|
146
|
+
alignSelf: "center",
|
|
147
147
|
flexDirection: "row",
|
|
148
148
|
alignItems: "center",
|
|
149
149
|
gap: SPACE.sm,
|
|
@@ -182,44 +182,73 @@ const makeStyles = themedStyles((theme) => StyleSheet.create({
|
|
|
182
182
|
slateText: __spreadProps(__spreadValues({}, TYPE.caption), {
|
|
183
183
|
color: "#fafafa"
|
|
184
184
|
}),
|
|
185
|
-
|
|
185
|
+
thumbs: {
|
|
186
186
|
flexDirection: "row",
|
|
187
|
-
|
|
188
|
-
gap: SPACE.xs
|
|
187
|
+
gap: SPACE.sm
|
|
189
188
|
},
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
189
|
+
thumb: {
|
|
190
|
+
flex: 1,
|
|
191
|
+
aspectRatio: 16 / 10,
|
|
192
|
+
borderRadius: RADIUS.md,
|
|
193
|
+
overflow: "hidden",
|
|
194
|
+
backgroundColor: theme.card,
|
|
195
|
+
borderWidth: 2,
|
|
196
|
+
borderColor: "transparent"
|
|
193
197
|
},
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
height: 6,
|
|
197
|
-
borderRadius: 3,
|
|
198
|
-
backgroundColor: theme.borderStrong
|
|
198
|
+
thumbOn: {
|
|
199
|
+
borderColor: theme.foreground
|
|
199
200
|
},
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
backgroundColor: theme.foreground
|
|
201
|
+
thumbDim: {
|
|
202
|
+
opacity: 0.7
|
|
203
203
|
},
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
204
|
+
caption: __spreadProps(__spreadValues({}, TYPE.caption), {
|
|
205
|
+
fontWeight: "400",
|
|
206
|
+
lineHeight: 18,
|
|
207
|
+
color: theme.mutedForeground
|
|
208
208
|
}),
|
|
209
|
-
|
|
209
|
+
captionLink: {
|
|
210
|
+
textDecorationLine: "underline"
|
|
211
|
+
},
|
|
212
|
+
corner: {
|
|
213
|
+
position: "absolute",
|
|
214
|
+
width: 18,
|
|
215
|
+
height: 18,
|
|
216
|
+
borderColor: "rgba(255,255,255,0.75)"
|
|
217
|
+
},
|
|
218
|
+
cornerTL: {
|
|
219
|
+
top: SPACE.md,
|
|
220
|
+
left: SPACE.md,
|
|
221
|
+
borderTopWidth: 1.5,
|
|
222
|
+
borderLeftWidth: 1.5
|
|
223
|
+
},
|
|
224
|
+
cornerTR: {
|
|
225
|
+
top: SPACE.md,
|
|
226
|
+
right: SPACE.md,
|
|
227
|
+
borderTopWidth: 1.5,
|
|
228
|
+
borderRightWidth: 1.5
|
|
229
|
+
},
|
|
230
|
+
cornerBL: {
|
|
231
|
+
bottom: SPACE.md,
|
|
232
|
+
left: SPACE.md,
|
|
233
|
+
borderBottomWidth: 1.5,
|
|
234
|
+
borderLeftWidth: 1.5
|
|
235
|
+
},
|
|
236
|
+
cornerBR: {
|
|
237
|
+
bottom: SPACE.md,
|
|
238
|
+
right: SPACE.md,
|
|
239
|
+
borderBottomWidth: 1.5,
|
|
240
|
+
borderRightWidth: 1.5
|
|
241
|
+
},
|
|
242
|
+
lens: {
|
|
210
243
|
position: "absolute",
|
|
211
|
-
top: SPACE.sm,
|
|
212
244
|
right: SPACE.sm,
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
paddingHorizontal: SPACE.sm + 2,
|
|
218
|
-
borderRadius: RADIUS.pill,
|
|
245
|
+
bottom: SPACE.sm,
|
|
246
|
+
paddingHorizontal: SPACE.sm,
|
|
247
|
+
paddingVertical: SPACE.xs,
|
|
248
|
+
borderRadius: RADIUS.sm,
|
|
219
249
|
backgroundColor: "rgba(0,0,0,0.5)"
|
|
220
250
|
},
|
|
221
|
-
|
|
222
|
-
fontWeight: "600",
|
|
251
|
+
lensText: __spreadProps(__spreadValues({}, TYPE.caption), {
|
|
223
252
|
color: "#fafafa"
|
|
224
253
|
})
|
|
225
254
|
}));export{HeroMonitor};//# sourceMappingURL=HeroMonitor.js.map
|