@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.js","sources":["../../../../src/features/webbuilder/components/ui.tsx"],"sourcesContent":["/**\n * The small pieces every Web Builder screen shares: icon buttons, status\n * pills, a whole-panel message, a bottom sheet and the toast.\n */\nimport React, { useEffect, useRef, type ReactNode } from 'react';\nimport {\n ActivityIndicator,\n Animated,\n KeyboardAvoidingView,\n Modal,\n Platform,\n StyleSheet,\n Text,\n View,\n type StyleProp,\n type ViewStyle,\n} from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\n\nexport type IconName = React.ComponentProps<typeof MaterialCommunityIcons>['name'];\n\nexport function IconButton({\n icon,\n label,\n onPress,\n theme,\n disabled = false,\n tint,\n testID,\n}: {\n icon: IconName;\n label: string;\n onPress: () => void;\n theme: WebBuilderTheme;\n disabled?: boolean;\n tint?: string;\n testID?: string;\n}) {\n return (\n <Tap\n onPress={onPress}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n hitSlop={8}\n style={[styles.iconButton, disabled && styles.disabled]}\n pressedStyle={DIM}\n testID={testID}\n >\n <MaterialCommunityIcons name={icon} size={22} color={tint ?? theme.ink} />\n </Tap>\n );\n}\n\nexport function Pill({\n label,\n tone,\n theme,\n}: {\n label: string;\n tone: 'live' | 'busy' | 'draft';\n theme: WebBuilderTheme;\n}) {\n const colors = {\n live: { ink: theme.good, fill: theme.goodSoft },\n busy: { ink: theme.accent, fill: theme.accentSoft },\n draft: { ink: theme.muted, fill: theme.chip },\n }[tone];\n return (\n <View style={[styles.pill, { backgroundColor: colors.fill }]}>\n {tone === 'live' ? <View style={[styles.dot, { backgroundColor: colors.ink }]} /> : null}\n <Text style={[styles.pillLabel, { color: colors.ink }]}>{label}</Text>\n </View>\n );\n}\n\nexport function PrimaryButton({\n label,\n icon,\n onPress,\n theme,\n busy = false,\n disabled = false,\n style,\n testID,\n}: {\n label: string;\n icon?: IconName;\n onPress: () => void;\n theme: WebBuilderTheme;\n busy?: boolean;\n disabled?: boolean;\n style?: StyleProp<ViewStyle>;\n testID?: string;\n}) {\n const off = disabled || busy;\n return (\n <Tap\n onPress={onPress}\n disabled={off}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityState={{ disabled: off, busy }}\n style={[styles.primary, { backgroundColor: theme.accent }, disabled && styles.disabled, style]}\n pressedStyle={DIM}\n testID={testID}\n >\n {busy ? (\n <ActivityIndicator size=\"small\" color={theme.accentInk} />\n ) : (\n <>\n {icon ? <MaterialCommunityIcons name={icon} size={18} color={theme.accentInk} /> : null}\n <Text style={[styles.primaryLabel, { color: theme.accentInk }]}>{label}</Text>\n </>\n )}\n </Tap>\n );\n}\n\nexport function SecondaryButton({\n label,\n icon,\n onPress,\n theme,\n testID,\n}: {\n label: string;\n icon?: IconName;\n onPress: () => void;\n theme: WebBuilderTheme;\n testID?: string;\n}) {\n return (\n <Tap\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n style={[styles.secondary, { borderColor: theme.border, backgroundColor: theme.card }]}\n pressedStyle={DIM}\n testID={testID}\n >\n {icon ? <MaterialCommunityIcons name={icon} size={18} color={theme.ink} /> : null}\n <Text style={[styles.secondaryLabel, { color: theme.ink }]}>{label}</Text>\n </Tap>\n );\n}\n\nexport function CenteredState({\n icon,\n title,\n body,\n theme,\n primary,\n secondary,\n busy = false,\n testID,\n}: {\n icon: IconName;\n title: string;\n body?: string;\n theme: WebBuilderTheme;\n primary?: { label: string; onPress: () => void; icon?: IconName };\n secondary?: { label: string; onPress: () => void };\n busy?: boolean;\n testID?: string;\n}) {\n return (\n <View style={styles.center} testID={testID}>\n <View style={[styles.iconBubble, { backgroundColor: theme.accentSoft }]}>\n {busy ? (\n <ActivityIndicator color={theme.accent} />\n ) : (\n <MaterialCommunityIcons name={icon} size={30} color={theme.accent} />\n )}\n </View>\n <Text style={[styles.title, { color: theme.ink }]}>{title}</Text>\n {body ? <Text style={[styles.body, { color: theme.muted }]}>{body}</Text> : null}\n {primary ? (\n <PrimaryButton\n label={primary.label}\n icon={primary.icon}\n onPress={primary.onPress}\n theme={theme}\n style={styles.stateButton}\n testID={testID ? `${testID}-primary` : undefined}\n />\n ) : null}\n {secondary ? (\n <Tap\n onPress={secondary.onPress}\n accessibilityRole=\"button\"\n style={styles.link}\n pressedStyle={DIM}\n testID={testID ? `${testID}-secondary` : undefined}\n >\n <Text style={[styles.linkLabel, { color: theme.accent }]}>{secondary.label}</Text>\n </Tap>\n ) : null}\n </View>\n );\n}\n\nexport function Sheet({\n visible,\n title,\n onClose,\n theme,\n children,\n testID,\n}: {\n visible: boolean;\n title: string;\n onClose: () => void;\n theme: WebBuilderTheme;\n children: ReactNode;\n testID?: string;\n}) {\n return (\n <Modal visible={visible} transparent animationType=\"slide\" onRequestClose={onClose}>\n <KeyboardAvoidingView\n style={styles.sheetRoot}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n testID={testID}\n >\n <Tap\n style={[StyleSheet.absoluteFill, { backgroundColor: theme.backdrop }]}\n onPress={onClose}\n accessibilityLabel=\"Close\"\n />\n <View style={[styles.sheet, { backgroundColor: theme.card }]}>\n <View style={[styles.grabber, { backgroundColor: theme.border }]} />\n <View style={styles.sheetHeader}>\n <Text style={[styles.sheetTitle, { color: theme.ink }]}>{title}</Text>\n <IconButton icon=\"close\" label=\"Close\" onPress={onClose} theme={theme} tint={theme.muted} />\n </View>\n {children}\n </View>\n </KeyboardAvoidingView>\n </Modal>\n );\n}\n\nexport function Toast({ message, theme, bottom }: { message: string | null; theme: WebBuilderTheme; bottom: number }) {\n const opacity = useRef(new Animated.Value(0)).current;\n useEffect(() => {\n Animated.timing(opacity, { toValue: message ? 1 : 0, duration: 180, useNativeDriver: true }).start();\n }, [message, opacity]);\n if (!message) return null;\n return (\n <Animated.View\n pointerEvents=\"none\"\n style={[styles.toast, { backgroundColor: theme.toast, bottom, opacity }]}\n accessibilityLiveRegion=\"polite\"\n >\n <Text style={[styles.toastLabel, { color: theme.toastInk }]}>{message}</Text>\n </Animated.View>\n );\n}\n\nconst styles = StyleSheet.create({\n iconButton: { width: 40, height: 40, alignItems: 'center', justifyContent: 'center', borderRadius: 20 },\n disabled: { opacity: 0.4 },\n pill: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 5,\n paddingHorizontal: 8,\n paddingVertical: 3,\n borderRadius: 999,\n },\n dot: { width: 6, height: 6, borderRadius: 3 },\n pillLabel: { fontSize: 12, fontWeight: '600' },\n primary: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n minHeight: 46,\n paddingHorizontal: 18,\n borderRadius: 12,\n },\n primaryLabel: { fontSize: 15, fontWeight: '700' },\n secondary: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n minHeight: 46,\n paddingHorizontal: 16,\n borderRadius: 12,\n borderWidth: StyleSheet.hairlineWidth,\n },\n secondaryLabel: { fontSize: 15, fontWeight: '600' },\n center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 32, paddingVertical: 40 },\n iconBubble: {\n width: 64,\n height: 64,\n borderRadius: 32,\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 16,\n },\n title: { fontSize: 18, fontWeight: '700', textAlign: 'center' },\n body: { fontSize: 14, lineHeight: 20, textAlign: 'center', marginTop: 8 },\n stateButton: { marginTop: 20, alignSelf: 'stretch' },\n link: { marginTop: 14, padding: 6 },\n linkLabel: { fontSize: 15, fontWeight: '600' },\n sheetRoot: { flex: 1, justifyContent: 'flex-end' },\n sheet: { borderTopLeftRadius: 20, borderTopRightRadius: 20, paddingHorizontal: 20, paddingBottom: 32 },\n grabber: { alignSelf: 'center', width: 40, height: 4, borderRadius: 2, marginTop: 8 },\n sheetHeader: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', paddingVertical: 10 },\n sheetTitle: { fontSize: 18, fontWeight: '700' },\n toast: {\n position: 'absolute',\n alignSelf: 'center',\n paddingHorizontal: 16,\n paddingVertical: 10,\n borderRadius: 999,\n maxWidth: '86%',\n },\n toastLabel: { fontSize: 14, fontWeight: '600', textAlign: 'center' },\n});\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ui.js","sources":["../../../../src/features/webbuilder/components/ui.tsx"],"sourcesContent":["/**\n * The small pieces every Web Builder screen shares: icon buttons, status\n * pills, a whole-panel message, a bottom sheet and the toast.\n */\nimport React, { useEffect, useRef, type ReactNode } from 'react';\nimport {\n ActivityIndicator,\n Animated,\n KeyboardAvoidingView,\n Modal,\n Platform,\n StyleSheet,\n Text,\n View,\n type StyleProp,\n type ViewStyle,\n} from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\n\nexport type IconName = React.ComponentProps<typeof MaterialCommunityIcons>['name'];\n\nexport function IconButton({\n icon,\n label,\n onPress,\n theme,\n disabled = false,\n tint,\n testID,\n}: {\n icon: IconName;\n label: string;\n onPress: () => void;\n theme: WebBuilderTheme;\n disabled?: boolean;\n tint?: string;\n testID?: string;\n}) {\n return (\n <Tap\n onPress={onPress}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n hitSlop={8}\n style={[styles.iconButton, disabled && styles.disabled]}\n pressedStyle={DIM}\n testID={testID}\n >\n <MaterialCommunityIcons name={icon} size={22} color={tint ?? theme.ink} />\n </Tap>\n );\n}\n\nexport function Pill({\n label,\n tone,\n theme,\n}: {\n label: string;\n tone: 'live' | 'busy' | 'draft';\n theme: WebBuilderTheme;\n}) {\n const colors = {\n live: { ink: theme.good, fill: theme.goodSoft },\n busy: { ink: theme.accent, fill: theme.accentSoft },\n draft: { ink: theme.muted, fill: theme.chip },\n }[tone];\n return (\n <View style={[styles.pill, { backgroundColor: colors.fill }]}>\n {tone === 'live' ? <View style={[styles.dot, { backgroundColor: colors.ink }]} /> : null}\n <Text style={[styles.pillLabel, { color: colors.ink }]}>{label}</Text>\n </View>\n );\n}\n\nexport function PrimaryButton({\n label,\n icon,\n onPress,\n theme,\n busy = false,\n disabled = false,\n style,\n testID,\n}: {\n label: string;\n icon?: IconName;\n onPress: () => void;\n theme: WebBuilderTheme;\n busy?: boolean;\n disabled?: boolean;\n style?: StyleProp<ViewStyle>;\n testID?: string;\n}) {\n const off = disabled || busy;\n return (\n <Tap\n onPress={onPress}\n disabled={off}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityState={{ disabled: off, busy }}\n style={[styles.primary, { backgroundColor: theme.accent }, disabled && styles.disabled, style]}\n pressedStyle={DIM}\n testID={testID}\n >\n {busy ? (\n <ActivityIndicator size=\"small\" color={theme.accentInk} />\n ) : (\n <>\n {icon ? <MaterialCommunityIcons name={icon} size={18} color={theme.accentInk} /> : null}\n <Text style={[styles.primaryLabel, { color: theme.accentInk }]}>{label}</Text>\n </>\n )}\n </Tap>\n );\n}\n\nexport function SecondaryButton({\n label,\n icon,\n onPress,\n theme,\n testID,\n}: {\n label: string;\n icon?: IconName;\n onPress: () => void;\n theme: WebBuilderTheme;\n testID?: string;\n}) {\n return (\n <Tap\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n style={[styles.secondary, { borderColor: theme.border, backgroundColor: theme.card }]}\n pressedStyle={DIM}\n testID={testID}\n >\n {icon ? <MaterialCommunityIcons name={icon} size={18} color={theme.ink} /> : null}\n <Text style={[styles.secondaryLabel, { color: theme.ink }]}>{label}</Text>\n </Tap>\n );\n}\n\nexport function CenteredState({\n icon,\n title,\n body,\n theme,\n primary,\n secondary,\n busy = false,\n testID,\n}: {\n icon: IconName;\n title: string;\n body?: string;\n theme: WebBuilderTheme;\n primary?: { label: string; onPress: () => void; icon?: IconName };\n secondary?: { label: string; onPress: () => void };\n busy?: boolean;\n testID?: string;\n}) {\n return (\n <View style={styles.center} testID={testID}>\n <View style={[styles.iconBubble, { backgroundColor: theme.accentSoft }]}>\n {busy ? (\n <ActivityIndicator color={theme.accent} />\n ) : (\n <MaterialCommunityIcons name={icon} size={30} color={theme.accent} />\n )}\n </View>\n <Text style={[styles.title, { color: theme.ink }]}>{title}</Text>\n {body ? <Text style={[styles.body, { color: theme.muted }]}>{body}</Text> : null}\n {primary ? (\n <PrimaryButton\n label={primary.label}\n icon={primary.icon}\n onPress={primary.onPress}\n theme={theme}\n style={styles.stateButton}\n testID={testID ? `${testID}-primary` : undefined}\n />\n ) : null}\n {secondary ? (\n <Tap\n onPress={secondary.onPress}\n accessibilityRole=\"button\"\n style={styles.link}\n pressedStyle={DIM}\n testID={testID ? `${testID}-secondary` : undefined}\n >\n <Text style={[styles.linkLabel, { color: theme.accent }]}>{secondary.label}</Text>\n </Tap>\n ) : null}\n </View>\n );\n}\n\nexport function Sheet({\n visible,\n title,\n onClose,\n theme,\n children,\n testID,\n}: {\n visible: boolean;\n title: string;\n onClose: () => void;\n theme: WebBuilderTheme;\n children: ReactNode;\n testID?: string;\n}) {\n return (\n <Modal visible={visible} transparent animationType=\"slide\" onRequestClose={onClose}>\n <KeyboardAvoidingView\n style={styles.sheetRoot}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n testID={testID}\n >\n <Tap\n style={[StyleSheet.absoluteFill, { backgroundColor: theme.backdrop }]}\n onPress={onClose}\n accessibilityLabel=\"Close\"\n />\n <View style={[styles.sheet, { backgroundColor: theme.card }]}>\n <View style={[styles.grabber, { backgroundColor: theme.border }]} />\n <View style={styles.sheetHeader}>\n <Text style={[styles.sheetTitle, { color: theme.ink }]}>{title}</Text>\n <IconButton icon=\"close\" label=\"Close\" onPress={onClose} theme={theme} tint={theme.muted} />\n </View>\n {children}\n </View>\n </KeyboardAvoidingView>\n </Modal>\n );\n}\n\nexport function Toast({\n message,\n theme,\n bottom,\n action,\n}: {\n message: string | null;\n theme: WebBuilderTheme;\n bottom: number;\n /** One tap on the toast (e.g. \"Redo\" after Undo). */\n action?: { label: string; onPress: () => void } | null;\n}) {\n const opacity = useRef(new Animated.Value(0)).current;\n useEffect(() => {\n Animated.timing(opacity, { toValue: message ? 1 : 0, duration: 180, useNativeDriver: true }).start();\n }, [message, opacity]);\n if (!message) return null;\n return (\n <Animated.View\n pointerEvents={action ? 'box-none' : 'none'}\n style={[styles.toast, action && styles.toastRow, { backgroundColor: theme.toast, bottom, opacity }]}\n accessibilityLiveRegion=\"polite\"\n >\n <Text style={[styles.toastLabel, { color: theme.toastInk }]}>{message}</Text>\n {action ? (\n <Tap\n onPress={action.onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={action.label}\n hitSlop={10}\n pressedStyle={DIM}\n testID=\"webbuilder-toast-action\"\n >\n <Text style={[styles.toastLabel, styles.toastAction, { color: theme.accent }]}>{action.label}</Text>\n </Tap>\n ) : null}\n </Animated.View>\n );\n}\n\nconst styles = StyleSheet.create({\n toastRow: { flexDirection: 'row', alignItems: 'center', gap: 16 },\n toastAction: { fontWeight: '700' },\n iconButton: { width: 40, height: 40, alignItems: 'center', justifyContent: 'center', borderRadius: 20 },\n disabled: { opacity: 0.4 },\n pill: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 5,\n paddingHorizontal: 8,\n paddingVertical: 3,\n borderRadius: 999,\n },\n dot: { width: 6, height: 6, borderRadius: 3 },\n pillLabel: { fontSize: 12, fontWeight: '600' },\n primary: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n minHeight: 46,\n paddingHorizontal: 18,\n borderRadius: 12,\n },\n primaryLabel: { fontSize: 15, fontWeight: '700' },\n secondary: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n minHeight: 46,\n paddingHorizontal: 16,\n borderRadius: 12,\n borderWidth: StyleSheet.hairlineWidth,\n },\n secondaryLabel: { fontSize: 15, fontWeight: '600' },\n center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 32, paddingVertical: 40 },\n iconBubble: {\n width: 64,\n height: 64,\n borderRadius: 32,\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 16,\n },\n title: { fontSize: 18, fontWeight: '700', textAlign: 'center' },\n body: { fontSize: 14, lineHeight: 20, textAlign: 'center', marginTop: 8 },\n stateButton: { marginTop: 20, alignSelf: 'stretch' },\n link: { marginTop: 14, padding: 6 },\n linkLabel: { fontSize: 15, fontWeight: '600' },\n sheetRoot: { flex: 1, justifyContent: 'flex-end' },\n sheet: { borderTopLeftRadius: 20, borderTopRightRadius: 20, paddingHorizontal: 20, paddingBottom: 32 },\n grabber: { alignSelf: 'center', width: 40, height: 4, borderRadius: 2, marginTop: 8 },\n sheetHeader: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', paddingVertical: 10 },\n sheetTitle: { fontSize: 18, fontWeight: '700' },\n toast: {\n position: 'absolute',\n alignSelf: 'center',\n paddingHorizontal: 16,\n paddingVertical: 10,\n borderRadius: 999,\n maxWidth: '86%',\n },\n toastLabel: { fontSize: 14, fontWeight: '600', textAlign: 'center' },\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const WEBBUILDER_EXPORT_ZIP_ACTION = "WEBBUILDER_EXPORT_ZIP";
|
|
2
|
+
const EXPORT_TARGETS = [{
|
|
3
|
+
target: "fly",
|
|
4
|
+
label: "Export to Fly.io",
|
|
5
|
+
hint: "Dockerfile + fly.toml, step by step"
|
|
6
|
+
}, {
|
|
7
|
+
target: "vercel",
|
|
8
|
+
label: "Deploy to Vercel",
|
|
9
|
+
hint: "With your own Vercel account"
|
|
10
|
+
}, {
|
|
11
|
+
target: "netlify",
|
|
12
|
+
label: "Deploy to Netlify (static sites)",
|
|
13
|
+
hint: "With your own Netlify account"
|
|
14
|
+
}];
|
|
15
|
+
function exportNote(target) {
|
|
16
|
+
return `[Export] target=${target}`;
|
|
17
|
+
}
|
|
18
|
+
function exportMessage(title, target) {
|
|
19
|
+
const name = title.trim() || "this site";
|
|
20
|
+
switch (target) {
|
|
21
|
+
case "fly":
|
|
22
|
+
return `Export "${name}" to Fly.io.`;
|
|
23
|
+
case "vercel":
|
|
24
|
+
return `Deploy "${name}" to Vercel.`;
|
|
25
|
+
case "netlify":
|
|
26
|
+
return `Deploy "${name}" to Netlify.`;
|
|
27
|
+
default:
|
|
28
|
+
return `Download the code of "${name}" as a ZIP.`;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function exportTurn(title, target) {
|
|
32
|
+
return `${exportMessage(title, target)}
|
|
33
|
+
|
|
34
|
+
${exportNote(target)}`;
|
|
35
|
+
}
|
|
36
|
+
function exportSlug(title) {
|
|
37
|
+
return String(title || "").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 48) || "site";
|
|
38
|
+
}
|
|
39
|
+
function exportZipParams(sandboxId, title) {
|
|
40
|
+
return {
|
|
41
|
+
sandbox_id: sandboxId,
|
|
42
|
+
name: exportSlug(title),
|
|
43
|
+
withDeployFiles: true
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function exportZipUrl(r) {
|
|
47
|
+
if (!(r == null ? void 0 : r.successful)) return null;
|
|
48
|
+
const raw = r.data && typeof r.data === "object" ? r.data : {};
|
|
49
|
+
const d = raw.data && typeof raw.data === "object" ? raw.data : raw;
|
|
50
|
+
const url = typeof d.downloadUrl === "string" ? d.downloadUrl.trim() : "";
|
|
51
|
+
return /^https:\/\//i.test(url) ? url : null;
|
|
52
|
+
}export{EXPORT_TARGETS,WEBBUILDER_EXPORT_ZIP_ACTION,exportMessage,exportNote,exportSlug,exportTurn,exportZipParams,exportZipUrl};//# sourceMappingURL=exportCode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exportCode.js","sources":["../../../src/features/webbuilder/exportCode.ts"],"sourcesContent":["/**\n * The Download / Export menu (web `canvas/exportCode.ts`, #438 C4). Download code is\n * a signed `WEBBUILDER_EXPORT_ZIP` link; deploys elsewhere go to the agent as a turn\n * with an `[Export] target=…` note (webbuilder-design-pro \"Notes from the surface\"). Pure.\n */\n\nexport const WEBBUILDER_EXPORT_ZIP_ACTION = 'WEBBUILDER_EXPORT_ZIP';\n\nexport type ExportTarget = 'fly' | 'vercel' | 'netlify';\n\nexport const EXPORT_TARGETS: ReadonlyArray<{ target: ExportTarget; label: string; hint: string }> = [\n { target: 'fly', label: 'Export to Fly.io', hint: 'Dockerfile + fly.toml, step by step' },\n { target: 'vercel', label: 'Deploy to Vercel', hint: 'With your own Vercel account' },\n { target: 'netlify', label: 'Deploy to Netlify (static sites)', hint: 'With your own Netlify account' },\n];\n\n/** The note the skill reads. */\nexport function exportNote(target: ExportTarget): string {\n return `[Export] target=${target}`;\n}\n\n/** The person's bubble for an export turn (the ids ride in the notes). */\nexport function exportMessage(title: string, target: ExportTarget | 'zip'): string {\n const name = title.trim() || 'this site';\n switch (target) {\n case 'fly':\n return `Export \"${name}\" to Fly.io.`;\n case 'vercel':\n return `Deploy \"${name}\" to Vercel.`;\n case 'netlify':\n return `Deploy \"${name}\" to Netlify.`;\n default:\n return `Download the code of \"${name}\" as a ZIP.`;\n }\n}\n\n/** The whole turn: the bubble, then the note (hidden from the bubble by `stripAgentNote`). */\nexport function exportTurn(title: string, target: ExportTarget): string {\n return `${exportMessage(title, target)}\\n\\n${exportNote(target)}`;\n}\n\nexport function exportSlug(title: string | null | undefined): string {\n return (\n String(title || '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 48) || 'site'\n );\n}\n\nexport function exportZipParams(sandboxId: string, title: string | null | undefined): Record<string, unknown> {\n return { sandbox_id: sandboxId, name: exportSlug(title), withDeployFiles: true };\n}\n\n/** The signed zip link from an EXPORT_ZIP answer, or null (missing action, unsigned, failed). */\nexport function exportZipUrl(r: { successful: boolean; data?: unknown } | null | undefined): string | null {\n if (!r?.successful) return null;\n const raw = r.data && typeof r.data === 'object' ? (r.data as Record<string, unknown>) : {};\n const d = raw.data && typeof raw.data === 'object' ? (raw.data as Record<string, unknown>) : raw;\n const url = typeof d.downloadUrl === 'string' ? d.downloadUrl.trim() : '';\n return /^https:\\/\\//i.test(url) ? url : null;\n}\n"],"names":[],"mappings":"AAMO,MAAM,4BAA+B,GAAA;AAErC,MAAM,iBAIR,CAAC;AAAA,EACJ,MAAQ,EAAA,KAAA;AAAA,EACR,KAAO,EAAA,kBAAA;AAAA,EACP,IAAM,EAAA;AACR,CAAG,EAAA;AAAA,EACD,MAAQ,EAAA,QAAA;AAAA,EACR,KAAO,EAAA,kBAAA;AAAA,EACP,IAAM,EAAA;AACR,CAAG,EAAA;AAAA,EACD,MAAQ,EAAA,SAAA;AAAA,EACR,KAAO,EAAA,kCAAA;AAAA,EACP,IAAM,EAAA;AACR,CAAC;AAGM,SAAS,WAAW,MAA8B,EAAA;AACvD,EAAA,OAAO,mBAAmB,MAAM,CAAA,CAAA;AAClC;AAGgB,SAAA,aAAA,CAAc,OAAe,MAAsC,EAAA;AACjF,EAAM,MAAA,IAAA,GAAO,KAAM,CAAA,IAAA,EAAU,IAAA,WAAA;AAC7B,EAAA,QAAQ,MAAQ;AAAA,IACd,KAAK,KAAA;AACH,MAAA,OAAO,WAAW,IAAI,CAAA,YAAA,CAAA;AAAA,IACxB,KAAK,QAAA;AACH,MAAA,OAAO,WAAW,IAAI,CAAA,YAAA,CAAA;AAAA,IACxB,KAAK,SAAA;AACH,MAAA,OAAO,WAAW,IAAI,CAAA,aAAA,CAAA;AAAA,IACxB;AACE,MAAA,OAAO,yBAAyB,IAAI,CAAA,WAAA,CAAA;AAAA;AAE1C;AAGgB,SAAA,UAAA,CAAW,OAAe,MAA8B,EAAA;AACtE,EAAA,OAAO,CAAG,EAAA,aAAA,CAAc,KAAO,EAAA,MAAM,CAAC;;AAAA,EAAO,UAAA,CAAW,MAAM,CAAC,CAAA,CAAA;AACjE;AACO,SAAS,WAAW,KAA0C,EAAA;AACnE,EAAA,OAAO,OAAO,KAAS,IAAA,EAAE,CAAE,CAAA,WAAA,GAAc,OAAQ,CAAA,aAAA,EAAe,GAAG,CAAA,CAAE,QAAQ,UAAY,EAAA,EAAE,EAAE,KAAM,CAAA,CAAA,EAAG,EAAE,CAAK,IAAA,MAAA;AAC/G;AACgB,SAAA,eAAA,CAAgB,WAAmB,KAA2D,EAAA;AAC5G,EAAO,OAAA;AAAA,IACL,UAAY,EAAA,SAAA;AAAA,IACZ,IAAA,EAAM,WAAW,KAAK,CAAA;AAAA,IACtB,eAAiB,EAAA;AAAA,GACnB;AACF;AAGO,SAAS,aAAa,CAGQ,EAAA;AACnC,EAAI,IAAA,EAAC,CAAG,IAAA,IAAA,GAAA,MAAA,GAAA,CAAA,CAAA,UAAA,CAAA,EAAmB,OAAA,IAAA;AAC3B,EAAM,MAAA,GAAA,GAAM,EAAE,IAAQ,IAAA,OAAO,EAAE,IAAS,KAAA,QAAA,GAAW,CAAE,CAAA,IAAA,GAAkC,EAAC;AACxF,EAAM,MAAA,CAAA,GAAI,IAAI,IAAQ,IAAA,OAAO,IAAI,IAAS,KAAA,QAAA,GAAW,IAAI,IAAkC,GAAA,GAAA;AAC3F,EAAM,MAAA,GAAA,GAAM,OAAO,CAAE,CAAA,WAAA,KAAgB,WAAW,CAAE,CAAA,WAAA,CAAY,MAAS,GAAA,EAAA;AACvE,EAAA,OAAO,cAAe,CAAA,IAAA,CAAK,GAAG,CAAA,GAAI,GAAM,GAAA,IAAA;AAC1C"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
const COMPANY_SITE_SUFFIX = "yarntra.com";
|
|
2
|
+
const PROJECT_NAME_RE = /^[a-z0-9][a-z0-9-]{0,62}$/;
|
|
3
|
+
const PAGES_DEV_RE = /\.pages\.dev$/i;
|
|
4
|
+
const PLATFORM_LABELS = /* @__PURE__ */ new Set(["www", "app", "api", "cdn", "cdecli-agent", "idefront", "ideback", "sb"]);
|
|
5
|
+
const PLATFORM_LABEL_RE = /-surface$|^sb-|^\d+-/;
|
|
6
|
+
function hostOf(url) {
|
|
7
|
+
const match = /^https?:\/\/([^/?#:\s]+)/i.exec(String(url != null ? url : "").trim());
|
|
8
|
+
return match ? match[1].toLowerCase() : "";
|
|
9
|
+
}
|
|
10
|
+
function companySiteName(host) {
|
|
11
|
+
if (host.endsWith(".yarntra.com")) {
|
|
12
|
+
const name = host.slice(0, -".yarntra.com".length).split(".").pop() || "";
|
|
13
|
+
return PROJECT_NAME_RE.test(name) ? name : "";
|
|
14
|
+
}
|
|
15
|
+
if (host.endsWith(".yantra.app")) {
|
|
16
|
+
const name = host.slice(0, -".yantra.app".length);
|
|
17
|
+
if (!PROJECT_NAME_RE.test(name) || PLATFORM_LABELS.has(name) || PLATFORM_LABEL_RE.test(name)) return "";
|
|
18
|
+
return name;
|
|
19
|
+
}
|
|
20
|
+
return "";
|
|
21
|
+
}
|
|
22
|
+
function isCompanySiteHost(host) {
|
|
23
|
+
return companySiteName(host) !== "";
|
|
24
|
+
}
|
|
25
|
+
function siteProjectName(url) {
|
|
26
|
+
const host = hostOf(url);
|
|
27
|
+
if (!host) return "";
|
|
28
|
+
if (PAGES_DEV_RE.test(host)) {
|
|
29
|
+
const name = host.replace(PAGES_DEV_RE, "").split(".").pop() || "";
|
|
30
|
+
return PROJECT_NAME_RE.test(name) ? name : "";
|
|
31
|
+
}
|
|
32
|
+
return companySiteName(host);
|
|
33
|
+
}
|
|
34
|
+
function companySiteUrl(projectName) {
|
|
35
|
+
const name = String(projectName != null ? projectName : "").trim().toLowerCase();
|
|
36
|
+
return PROJECT_NAME_RE.test(name) ? `https://${name}.${COMPANY_SITE_SUFFIX}` : "";
|
|
37
|
+
}
|
|
38
|
+
function shownDomainUrl(value) {
|
|
39
|
+
const raw = String(value != null ? value : "").trim();
|
|
40
|
+
if (!raw) return "";
|
|
41
|
+
const host = hostOf(/^https?:\/\//i.test(raw) ? raw : `https://${raw}`);
|
|
42
|
+
if (!host || !/^[a-z0-9.-]+\.[a-z]{2,}$/.test(host) || PAGES_DEV_RE.test(host) || /\.e2b\./.test(host)) return "";
|
|
43
|
+
if (host.endsWith(".yantra.app") && !isCompanySiteHost(host)) return "";
|
|
44
|
+
return `https://${host}`;
|
|
45
|
+
}
|
|
46
|
+
function siteAddress(input) {
|
|
47
|
+
var _a, _b;
|
|
48
|
+
const custom = shownDomainUrl(input.customDomainUrl);
|
|
49
|
+
if (custom) return custom;
|
|
50
|
+
const urls = ((_a = input.urls) != null ? _a : []).map((u) => String(u != null ? u : "").trim()).filter(Boolean);
|
|
51
|
+
const company = urls.find((u) => isCompanySiteHost(hostOf(u)));
|
|
52
|
+
if (company) return `https://${hostOf(company)}`;
|
|
53
|
+
const name = String((_b = input.projectName) != null ? _b : "").trim() || urls.map(siteProjectName).find(Boolean) || "";
|
|
54
|
+
const built = companySiteUrl(name);
|
|
55
|
+
if (built) return built;
|
|
56
|
+
return urls.map(shownDomainUrl).find(Boolean) || "";
|
|
57
|
+
}
|
|
58
|
+
function shownLiveUrl(url) {
|
|
59
|
+
if (!url) return null;
|
|
60
|
+
return siteAddress({
|
|
61
|
+
urls: [url]
|
|
62
|
+
}) || null;
|
|
63
|
+
}
|
|
64
|
+
const PAGES_DEV_LINK_RE = /(https?:\/\/)?((?:[a-z0-9-]+\.)*[a-z0-9][a-z0-9-]*)\.pages\.dev\b/gi;
|
|
65
|
+
function rewritePagesDevLinks(text) {
|
|
66
|
+
return String(text != null ? text : "").replace(PAGES_DEV_LINK_RE, (match, scheme, labels) => {
|
|
67
|
+
const url = companySiteUrl(labels.toLowerCase().split(".").pop() || "");
|
|
68
|
+
if (!url) return match;
|
|
69
|
+
return scheme ? url : url.replace(/^https:\/\//, "");
|
|
70
|
+
});
|
|
71
|
+
}export{COMPANY_SITE_SUFFIX,companySiteUrl,isCompanySiteHost,rewritePagesDevLinks,shownLiveUrl,siteAddress,siteProjectName};//# sourceMappingURL=siteAddress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"siteAddress.js","sources":["../../../src/features/webbuilder/siteAddress.ts"],"sourcesContent":["/**\n * The one place that knows site domains (web `publish/siteAddress.ts`, #446): a\n * published site is shown on its custom domain or the company domain\n * (`<projectName>.yarntra.com`), never `pages.dev`, which is only parsed for the\n * project name. Pure: hosts are read with a regex, not `URL`.\n */\n\nexport const COMPANY_SITE_SUFFIX = 'yarntra.com';\n\nconst PROJECT_NAME_RE = /^[a-z0-9][a-z0-9-]{0,62}$/;\nconst PAGES_DEV_RE = /\\.pages\\.dev$/i;\n// yantra.app is also the platform domain: these first labels are platform hosts, not sites.\nconst PLATFORM_LABELS = new Set(['www', 'app', 'api', 'cdn', 'cdecli-agent', 'idefront', 'ideback', 'sb']);\nconst PLATFORM_LABEL_RE = /-surface$|^sb-|^\\d+-/;\n\nfunction hostOf(url: string | null | undefined): string {\n const match = /^https?:\\/\\/([^/?#:\\s]+)/i.exec(String(url ?? '').trim());\n return match ? match[1].toLowerCase() : '';\n}\n\nfunction companySiteName(host: string): string {\n if (host.endsWith('.yarntra.com')) {\n const name = host.slice(0, -'.yarntra.com'.length).split('.').pop() || '';\n return PROJECT_NAME_RE.test(name) ? name : '';\n }\n if (host.endsWith('.yantra.app')) {\n const name = host.slice(0, -'.yantra.app'.length);\n if (!PROJECT_NAME_RE.test(name) || PLATFORM_LABELS.has(name) || PLATFORM_LABEL_RE.test(name)) return '';\n return name;\n }\n return '';\n}\n\nexport function isCompanySiteHost(host: string): boolean {\n return companySiteName(host) !== '';\n}\n\n/** The project name a live address carries (`lotus-flow.pages.dev`, `lotus-flow.yarntra.com`). */\nexport function siteProjectName(url: string | null | undefined): string {\n const host = hostOf(url);\n if (!host) return '';\n if (PAGES_DEV_RE.test(host)) {\n const name = host.replace(PAGES_DEV_RE, '').split('.').pop() || '';\n return PROJECT_NAME_RE.test(name) ? name : '';\n }\n return companySiteName(host);\n}\n\nexport function companySiteUrl(projectName: string | null | undefined): string {\n const name = String(projectName ?? '')\n .trim()\n .toLowerCase();\n return PROJECT_NAME_RE.test(name) ? `https://${name}.${COMPANY_SITE_SUFFIX}` : '';\n}\n\n/** A custom domain to show as is: not pages.dev, not a sandbox, not a platform host. */\nfunction shownDomainUrl(value: string | null | undefined): string {\n const raw = String(value ?? '').trim();\n if (!raw) return '';\n const host = hostOf(/^https?:\\/\\//i.test(raw) ? raw : `https://${raw}`);\n if (!host || !/^[a-z0-9.-]+\\.[a-z]{2,}$/.test(host) || PAGES_DEV_RE.test(host) || /\\.e2b\\./.test(host)) return '';\n if (host.endsWith('.yantra.app') && !isCompanySiteHost(host)) return '';\n return `https://${host}`;\n}\n\n/** Custom domain > recorded company URL > `https://<projectName>.yarntra.com`; never pages.dev. */\nexport function siteAddress(input: {\n customDomainUrl?: string | null;\n urls?: Array<string | null | undefined>;\n projectName?: string | null;\n}): string {\n const custom = shownDomainUrl(input.customDomainUrl);\n if (custom) return custom;\n const urls = (input.urls ?? []).map((u) => String(u ?? '').trim()).filter(Boolean);\n const company = urls.find((u) => isCompanySiteHost(hostOf(u)));\n if (company) return `https://${hostOf(company)}`;\n const name = String(input.projectName ?? '').trim() || urls.map(siteProjectName).find(Boolean) || '';\n const built = companySiteUrl(name);\n if (built) return built;\n return urls.map(shownDomainUrl).find(Boolean) || '';\n}\n\n/** The address to show for a recorded live URL (pages.dev becomes the company domain). */\nexport function shownLiveUrl(url: string | null | undefined): string | null {\n if (!url) return null;\n return siteAddress({ urls: [url] }) || null;\n}\n\nconst PAGES_DEV_LINK_RE = /(https?:\\/\\/)?((?:[a-z0-9-]+\\.)*[a-z0-9][a-z0-9-]*)\\.pages\\.dev\\b/gi;\n\n/** Display only: `<name>.pages.dev[/path]` becomes the company address, path kept. */\nexport function rewritePagesDevLinks(text: string): string {\n return String(text ?? '').replace(PAGES_DEV_LINK_RE, (match, scheme: string | undefined, labels: string) => {\n const url = companySiteUrl(labels.toLowerCase().split('.').pop() || '');\n if (!url) return match;\n return scheme ? url : url.replace(/^https:\\/\\//, '');\n });\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const WIDGET_BLOCK = /```yantra:widget[^\n]*\n([\s\S]*?)(?:```|$)/g;
|
|
2
|
+
function attachmentOf(raw) {
|
|
3
|
+
var _a, _b, _c, _d;
|
|
4
|
+
try {
|
|
5
|
+
const parsed = JSON.parse(raw.trim());
|
|
6
|
+
const contents = (_c = (_b = (_a = parsed == null ? void 0 : parsed.propsConfiguration) == null ? void 0 : _a.contents) != null ? _b : parsed == null ? void 0 : parsed.contents) != null ? _c : parsed;
|
|
7
|
+
const attachment = (_d = contents == null ? void 0 : contents.attachment) != null ? _d : contents;
|
|
8
|
+
return attachment && typeof attachment === "object" ? attachment : null;
|
|
9
|
+
} catch (e) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function safeHttpsUrl(url) {
|
|
14
|
+
return typeof url === "string" && /^https:\/\/[^\s()<>]+$/i.test(url.trim()) ? url.trim() : "";
|
|
15
|
+
}
|
|
16
|
+
function widgetMarkdown(raw) {
|
|
17
|
+
var _a, _b, _c, _d;
|
|
18
|
+
const att = attachmentOf(raw);
|
|
19
|
+
if (!att) return "";
|
|
20
|
+
const title = String(att.title || "").replace(/[[\]\n]/g, " ").trim();
|
|
21
|
+
const preview = safeHttpsUrl((_d = (_c = (_a = att.previews) == null ? void 0 : _a[0]) != null ? _c : (_b = att.previewUrls) == null ? void 0 : _b[0]) != null ? _d : att.thumbUrl);
|
|
22
|
+
if (preview) return `${title ? `
|
|
23
|
+
|
|
24
|
+
*${title}*` : ""}`;
|
|
25
|
+
return title ? `*${title}*` : "";
|
|
26
|
+
}
|
|
27
|
+
function renderWidgetBlocks(text) {
|
|
28
|
+
if (!text.includes("```yantra:widget")) return text;
|
|
29
|
+
return text.replace(WIDGET_BLOCK, (_m, body) => widgetMarkdown(body)).replace(/\n{3,}/g, "\n\n");
|
|
30
|
+
}export{renderWidgetBlocks,widgetMarkdown};//# sourceMappingURL=widgetBlocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widgetBlocks.js","sources":["../../../src/features/webbuilder/widgetBlocks.ts"],"sourcesContent":["/**\n * Agent widget blocks (```yantra:widget {json}```) that the chat would otherwise\n * show as raw JSON - logo designs from the canvas, say (web `chat/widgetBlocks.ts`,\n * #469). Each becomes markdown: its first preview picture and its title.\n */\n\nconst WIDGET_BLOCK = /```yantra:widget[^\\n]*\\n([\\s\\S]*?)(?:```|$)/g;\n\ninterface WidgetAttachment {\n title?: string;\n format?: string;\n previews?: string[];\n previewUrls?: string[];\n thumbUrl?: string;\n}\n\nfunction attachmentOf(raw: string): WidgetAttachment | null {\n try {\n const parsed = JSON.parse(raw.trim());\n const contents = parsed?.propsConfiguration?.contents ?? parsed?.contents ?? parsed;\n const attachment = contents?.attachment ?? contents;\n return attachment && typeof attachment === 'object' ? (attachment as WidgetAttachment) : null;\n } catch {\n return null;\n }\n}\n\nfunction safeHttpsUrl(url: unknown): string {\n return typeof url === 'string' && /^https:\\/\\/[^\\s()<>]+$/i.test(url.trim()) ? url.trim() : '';\n}\n\n/** One widget as markdown: its first preview picture and title, or nothing when it has neither. */\nexport function widgetMarkdown(raw: string): string {\n const att = attachmentOf(raw);\n if (!att) return '';\n const title = String(att.title || '')\n .replace(/[[\\]\\n]/g, ' ')\n .trim();\n const preview = safeHttpsUrl(att.previews?.[0] ?? att.previewUrls?.[0] ?? att.thumbUrl);\n if (preview) return `${title ? `\\n\\n*${title}*` : ''}`;\n return title ? `*${title}*` : '';\n}\n\n/** Replace every widget block with its markdown; an unreadable or half-streamed block is dropped. */\nexport function renderWidgetBlocks(text: string): string {\n if (!text.includes('```yantra:widget')) return text;\n return text.replace(WIDGET_BLOCK, (_m, body: string) => widgetMarkdown(body)).replace(/\\n{3,}/g, '\\n\\n');\n}\n"],"names":[],"mappings":"AAMA,MAAM,YAAe,GAAA,8CAAA;AAQrB,SAAS,aAAa,GAAsC,EAAA;AAd5D,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAeE,EAAI,IAAA;AACF,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,KAAM,CAAA,GAAA,CAAI,MAAM,CAAA;AACpC,IAAM,MAAA,QAAA,GAAA,CAAW,kDAAQ,kBAAR,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA4B,aAA5B,IAAwC,GAAA,EAAA,GAAA,MAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAQ,aAAhD,IAA4D,GAAA,EAAA,GAAA,MAAA;AAC7E,IAAM,MAAA,UAAA,GAAA,CAAa,EAAU,GAAA,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,QAAA,CAAA,UAAA,KAAV,IAAwB,GAAA,EAAA,GAAA,QAAA;AAC3C,IAAA,OAAO,UAAc,IAAA,OAAO,UAAe,KAAA,QAAA,GAAW,UAAiC,GAAA,IAAA;AAAA,GACjF,CAAA,OAAA,CAAA,EAAA;AACN,IAAO,OAAA,IAAA;AAAA;AAEX;AACA,SAAS,aAAa,GAAsB,EAAA;AAC1C,EAAO,OAAA,OAAO,GAAQ,KAAA,QAAA,IAAY,yBAA0B,CAAA,IAAA,CAAK,GAAI,CAAA,IAAA,EAAM,CAAA,GAAI,GAAI,CAAA,IAAA,EAAS,GAAA,EAAA;AAC9F;AAGO,SAAS,eAAe,GAAqB,EAAA;AA7BpD,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA8BE,EAAM,MAAA,GAAA,GAAM,aAAa,GAAG,CAAA;AAC5B,EAAI,IAAA,CAAC,KAAY,OAAA,EAAA;AACjB,EAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,GAAA,CAAI,KAAS,IAAA,EAAE,EAAE,OAAQ,CAAA,UAAA,EAAY,GAAG,CAAA,CAAE,IAAK,EAAA;AACpE,EAAA,MAAM,OAAU,GAAA,YAAA,CAAA,CAAa,EAAI,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAA,QAAA,KAAJ,IAAe,GAAA,MAAA,GAAA,EAAA,CAAA,CAAA,CAAA,KAAf,IAAqB,GAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,WAAJ,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAkB,CAAvC,CAAA,KAAA,IAAA,GAAA,EAAA,GAA6C,IAAI,QAAQ,CAAA;AACtF,EAAI,IAAA,OAAA,SAAgB,CAAK,EAAA,EAAA,KAAA,IAAS,gBAAgB,CAAK,EAAA,EAAA,OAAO,IAAI,KAAQ,GAAA;;AAAA,CAAQ,EAAA,KAAK,MAAM,EAAE,CAAA,CAAA;AAC/F,EAAO,OAAA,KAAA,GAAQ,CAAI,CAAA,EAAA,KAAK,CAAM,CAAA,CAAA,GAAA,EAAA;AAChC;AAGO,SAAS,mBAAmB,IAAsB,EAAA;AACvD,EAAA,IAAI,CAAC,IAAA,CAAK,QAAS,CAAA,kBAAkB,GAAU,OAAA,IAAA;AAC/C,EAAA,OAAO,IAAK,CAAA,OAAA,CAAQ,YAAc,EAAA,CAAC,EAAI,EAAA,IAAA,KAAiB,cAAe,CAAA,IAAI,CAAC,CAAA,CAAE,OAAQ,CAAA,SAAA,EAAW,MAAM,CAAA;AACzG"}
|
|
@@ -284,12 +284,11 @@ function ChatScreen() {
|
|
|
284
284
|
(_a2 = inputRef.current) == null ? void 0 : _a2.clear();
|
|
285
285
|
if (isBuildMode) {
|
|
286
286
|
navigation.dispatch(CommonActions.navigate({
|
|
287
|
-
name: "MainStack.
|
|
288
|
-
params:
|
|
289
|
-
orgName: params.orgName
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
message: t
|
|
287
|
+
name: "MainStack.WebBuilderNative",
|
|
288
|
+
params: nativeHandoffParams({
|
|
289
|
+
orgName: params.orgName,
|
|
290
|
+
query: t,
|
|
291
|
+
files: pending
|
|
293
292
|
})
|
|
294
293
|
}));
|
|
295
294
|
return;
|