@opengeni/react-native 4.3.3-canary.39786771332001 → 4.5.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/dist/{chunk-ZZNZBZWV.js → chunk-CLIXZUMZ.js} +3 -3
- package/dist/{chunk-ZZNZBZWV.js.map → chunk-CLIXZUMZ.js.map} +1 -1
- package/dist/{chunk-2RNMGRTB.js → chunk-DQNUIL2F.js} +3 -3
- package/dist/{chunk-2RNMGRTB.js.map → chunk-DQNUIL2F.js.map} +1 -1
- package/dist/{chunk-FHPMRXIG.js → chunk-NIQPBSB4.js} +341 -2
- package/dist/chunk-NIQPBSB4.js.map +1 -0
- package/dist/{chunk-QFV5DISV.js → chunk-QBQRHN64.js} +3 -3
- package/dist/{chunk-QFV5DISV.js.map → chunk-QBQRHN64.js.map} +1 -1
- package/dist/index.js +2 -2
- package/dist/timeline/icon-nodes.generated.d.ts +139 -0
- package/dist/timeline/index.js +68 -26
- package/dist/timeline/index.js.map +1 -1
- package/dist/timeline/markdown-standalone-links.d.ts +6 -0
- package/dist/timeline/markdown.js +17 -4
- package/dist/timeline/markdown.js.map +1 -1
- package/dist/timeline/previews.js +2 -2
- package/dist/timeline/session-list.d.ts +5 -1
- package/package.json +4 -4
- package/src/timeline/activity.tsx +27 -0
- package/src/timeline/icon-nodes.generated.ts +339 -0
- package/src/timeline/markdown-standalone-links.ts +13 -0
- package/src/timeline/markdown.tsx +17 -3
- package/src/timeline/session-list.tsx +43 -16
- package/dist/chunk-FHPMRXIG.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Icon } from './chunk-
|
|
1
|
+
import { Icon } from './chunk-NIQPBSB4.js';
|
|
2
2
|
import { Directory, Paths, File } from 'expo-file-system';
|
|
3
3
|
import { useState, useRef, useEffect } from 'react';
|
|
4
4
|
import { useWindowDimensions, Modal, View, FlatList, Text, ScrollView, Pressable, Image, ActivityIndicator, Share, Platform } from 'react-native';
|
|
@@ -240,5 +240,5 @@ function NativeImageViewer(props) {
|
|
|
240
240
|
}
|
|
241
241
|
|
|
242
242
|
export { NativeImageViewer };
|
|
243
|
-
//# sourceMappingURL=chunk-
|
|
244
|
-
//# sourceMappingURL=chunk-
|
|
243
|
+
//# sourceMappingURL=chunk-CLIXZUMZ.js.map
|
|
244
|
+
//# sourceMappingURL=chunk-CLIXZUMZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/timeline/image-viewer.tsx"],"names":[],"mappings":"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","file":"chunk-ZZNZBZWV.js","sourcesContent":["/* ----------------------------------------------------------------------------\n The full-screen image viewer, in the app instead of a browser: swipe between\n a message's images, pinch or double-tap to zoom, and share the image itself\n (downloaded first, so the share sheet offers Save Image and Copy).\n -------------------------------------------------------------------------- */\nimport { Directory, File, Paths } from \"expo-file-system\";\nimport { useEffect, useRef, useState, type ComponentRef } from \"react\";\nimport {\n ActivityIndicator,\n FlatList,\n Image,\n Modal,\n Platform,\n Pressable,\n ScrollView,\n Share,\n Text,\n View,\n useWindowDimensions,\n type NativeScrollEvent,\n type NativeSyntheticEvent,\n} from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { Icon, type NativeIconName } from \"./icon\";\nimport { useOpenGeniText, type OpenGeniText } from \"@opengeni/react/messages\";\n\nexport interface NativeViewerImage {\n /** A URL the image loads from (signed links are fine). */\n url: string;\n /** What the image shows, for VoiceOver. */\n alt: string;\n /** The file name to share it under, when known. */\n filename?: string | undefined;\n}\n\nexport interface NativeImageViewerLabels {\n close: string;\n share: string;\n /** \"2 of 3\". */\n position: (index: number, count: number) => string;\n shareFailed: string;\n}\n\nconst DEFAULT_LABELS = (t: OpenGeniText): NativeImageViewerLabels => ({\n close: t(\"native.timeline.imageViewer.close\"),\n share: t(\"native.timeline.imageViewer.share\"),\n position: (index, count) => `${index + 1} of ${count}`,\n shareFailed: t(\"native.timeline.imageViewer.couldnTShareThisImage\"),\n});\n\nfunction extensionOf(image: NativeViewerImage): string {\n const fromName = image.filename?.match(/\\.([A-Za-z0-9]{2,5})$/u)?.[1];\n if (fromName) return fromName.toLowerCase();\n const fromUrl = image.url.split(\"?\")[0]?.match(/\\.([A-Za-z0-9]{2,5})$/u)?.[1];\n return fromUrl ? fromUrl.toLowerCase() : \"jpg\";\n}\n\n/** Download to the cache, then hand the file (not the link) to the share sheet. */\nasync function shareImage(image: NativeViewerImage): Promise<void> {\n const folder = new Directory(Paths.cache, \"opengeni-share\");\n if (!folder.exists) folder.create({ intermediates: true, idempotent: true });\n const base = (image.filename ?? \"image\").replace(/\\.[A-Za-z0-9]{2,5}$/u, \"\").slice(0, 60);\n const target = new File(folder, `${base || \"image\"}.${extensionOf(image)}`);\n const file = await File.downloadFileAsync(image.url, target, { idempotent: true });\n await Share.share(Platform.OS === \"ios\" ? { url: file.uri } : { message: image.url });\n}\n\nfunction ChromeButton(props: {\n icon: NativeIconName;\n label: string;\n onPress: () => void;\n busy?: boolean | undefined;\n}) {\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={props.label}\n hitSlop={10}\n disabled={props.busy}\n onPress={props.onPress}\n style={({ pressed }) => ({\n width: 40,\n height: 40,\n borderRadius: 20,\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: pressed ? \"rgba(255,255,255,0.24)\" : \"rgba(255,255,255,0.14)\",\n })}\n >\n {props.busy ? (\n <ActivityIndicator size=\"small\" color=\"#ffffff\" />\n ) : (\n <Icon name={props.icon} size={18} color=\"#ffffff\" />\n )}\n </Pressable>\n );\n}\n\n/** One page: the image fitted to the screen, zoomable up to 4×. */\nfunction ZoomablePage(props: {\n image: NativeViewerImage;\n width: number;\n height: number;\n onZoomChange: (zoomed: boolean) => void;\n}) {\n const t = useOpenGeniText();\n const scroll = useRef<ComponentRef<typeof ScrollView>>(null);\n const zoomed = useRef(false);\n const lastTap = useRef(0);\n const [loaded, setLoaded] = useState(false);\n const { width, height } = props;\n return (\n <ScrollView\n ref={scroll}\n style={{ width, height }}\n maximumZoomScale={4}\n minimumZoomScale={1}\n centerContent\n bouncesZoom\n showsHorizontalScrollIndicator={false}\n showsVerticalScrollIndicator={false}\n scrollEventThrottle={64}\n onScroll={(event: NativeSyntheticEvent<NativeScrollEvent>) => {\n const next = (event.nativeEvent.zoomScale ?? 1) > 1.01;\n if (next !== zoomed.current) {\n zoomed.current = next;\n props.onZoomChange(next);\n }\n }}\n contentContainerStyle={{ width, height, alignItems: \"center\", justifyContent: \"center\" }}\n >\n <Pressable\n accessible\n accessibilityRole=\"image\"\n accessibilityLabel={props.image.alt}\n accessibilityHint={t(\"native.timeline.imageViewer.doubleTapToZoom\")}\n onPress={(event) => {\n // Double-tap zooms in on that spot, or back out.\n const now = Date.now();\n if (now - lastTap.current < 280) {\n lastTap.current = 0;\n if (zoomed.current) {\n scroll.current?.scrollResponderZoomTo({ x: 0, y: 0, width, height, animated: true });\n } else {\n const { locationX, locationY } = event.nativeEvent;\n scroll.current?.scrollResponderZoomTo({\n x: locationX - width / 6,\n y: locationY - height / 6,\n width: width / 3,\n height: height / 3,\n animated: true,\n });\n }\n return;\n }\n lastTap.current = now;\n }}\n style={{ width, height, alignItems: \"center\", justifyContent: \"center\" }}\n >\n <Image\n source={{ uri: props.image.url }}\n resizeMode=\"contain\"\n accessibilityIgnoresInvertColors\n onLoad={() => setLoaded(true)}\n style={{ width, height }}\n />\n {loaded ? null : (\n <View style={{ position: \"absolute\" }}>\n <ActivityIndicator color=\"#ffffff\" />\n </View>\n )}\n </Pressable>\n </ScrollView>\n );\n}\n\n/**\n * Full-screen images over a dark backdrop. With several images, swipe between\n * them (paging pauses while one is zoomed). Close with the button or the\n * system back gesture.\n */\nexport function NativeImageViewer(props: {\n images: readonly NativeViewerImage[];\n /** The image to open on. */\n index: number;\n visible: boolean;\n onClose: () => void;\n labels?: Partial<NativeImageViewerLabels> | undefined;\n}) {\n const t = useOpenGeniText();\n const labels = { ...DEFAULT_LABELS(t), ...props.labels };\n const insets = useSafeAreaInsets();\n const { width, height } = useWindowDimensions();\n const [index, setIndex] = useState(props.index);\n const [zoomed, setZoomed] = useState(false);\n const [sharing, setSharing] = useState(false);\n const [problem, setProblem] = useState<string | null>(null);\n const list = useRef<FlatList<NativeViewerImage>>(null);\n useEffect(() => {\n if (!props.visible) return;\n setIndex(props.index);\n setZoomed(false);\n setProblem(null);\n }, [props.visible, props.index]);\n const current = props.images[index] ?? props.images[0];\n const count = props.images.length;\n const share = () => {\n if (!current) return;\n setSharing(true);\n setProblem(null);\n void shareImage(current)\n .catch(() => setProblem(labels.shareFailed))\n .finally(() => setSharing(false));\n };\n return (\n <Modal\n visible={props.visible}\n animationType=\"fade\"\n transparent\n statusBarTranslucent\n onRequestClose={props.onClose}\n >\n <View style={{ flex: 1, backgroundColor: \"rgba(0,0,0,0.96)\" }}>\n <FlatList\n ref={list}\n data={props.images as NativeViewerImage[]}\n keyExtractor={(image, position) => `${position}:${image.url}`}\n horizontal\n pagingEnabled\n scrollEnabled={!zoomed && count > 1}\n initialScrollIndex={Math.min(props.index, Math.max(0, count - 1))}\n getItemLayout={(_data, position) => ({\n length: width,\n offset: width * position,\n index: position,\n })}\n showsHorizontalScrollIndicator={false}\n onMomentumScrollEnd={(event) => {\n const next = Math.round(event.nativeEvent.contentOffset.x / width);\n if (next !== index) {\n setIndex(next);\n setProblem(null);\n }\n }}\n renderItem={({ item }) => (\n <ZoomablePage image={item} width={width} height={height} onZoomChange={setZoomed} />\n )}\n />\n <View\n pointerEvents=\"box-none\"\n style={{\n position: \"absolute\",\n top: insets.top + 8,\n left: 12,\n right: 12,\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n <ChromeButton icon=\"x\" label={labels.close} onPress={props.onClose} />\n {count > 1 ? (\n <Text\n accessibilityRole=\"text\"\n style={{ color: \"rgba(255,255,255,0.86)\", fontSize: 15, fontWeight: \"600\" }}\n >\n {labels.position(index, count)}\n </Text>\n ) : null}\n <ChromeButton icon=\"share-2\" label={labels.share} onPress={share} busy={sharing} />\n </View>\n {problem ? (\n <View\n pointerEvents=\"none\"\n style={{\n position: \"absolute\",\n bottom: insets.bottom + 24,\n left: 24,\n right: 24,\n alignItems: \"center\",\n }}\n >\n <Text\n style={{\n color: \"#ffffff\",\n fontSize: 14,\n paddingHorizontal: 14,\n paddingVertical: 8,\n borderRadius: 12,\n overflow: \"hidden\",\n backgroundColor: \"rgba(255,255,255,0.16)\",\n }}\n >\n {problem}\n </Text>\n </View>\n ) : null}\n </View>\n </Modal>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/timeline/image-viewer.tsx"],"names":[],"mappings":"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","file":"chunk-CLIXZUMZ.js","sourcesContent":["/* ----------------------------------------------------------------------------\n The full-screen image viewer, in the app instead of a browser: swipe between\n a message's images, pinch or double-tap to zoom, and share the image itself\n (downloaded first, so the share sheet offers Save Image and Copy).\n -------------------------------------------------------------------------- */\nimport { Directory, File, Paths } from \"expo-file-system\";\nimport { useEffect, useRef, useState, type ComponentRef } from \"react\";\nimport {\n ActivityIndicator,\n FlatList,\n Image,\n Modal,\n Platform,\n Pressable,\n ScrollView,\n Share,\n Text,\n View,\n useWindowDimensions,\n type NativeScrollEvent,\n type NativeSyntheticEvent,\n} from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { Icon, type NativeIconName } from \"./icon\";\nimport { useOpenGeniText, type OpenGeniText } from \"@opengeni/react/messages\";\n\nexport interface NativeViewerImage {\n /** A URL the image loads from (signed links are fine). */\n url: string;\n /** What the image shows, for VoiceOver. */\n alt: string;\n /** The file name to share it under, when known. */\n filename?: string | undefined;\n}\n\nexport interface NativeImageViewerLabels {\n close: string;\n share: string;\n /** \"2 of 3\". */\n position: (index: number, count: number) => string;\n shareFailed: string;\n}\n\nconst DEFAULT_LABELS = (t: OpenGeniText): NativeImageViewerLabels => ({\n close: t(\"native.timeline.imageViewer.close\"),\n share: t(\"native.timeline.imageViewer.share\"),\n position: (index, count) => `${index + 1} of ${count}`,\n shareFailed: t(\"native.timeline.imageViewer.couldnTShareThisImage\"),\n});\n\nfunction extensionOf(image: NativeViewerImage): string {\n const fromName = image.filename?.match(/\\.([A-Za-z0-9]{2,5})$/u)?.[1];\n if (fromName) return fromName.toLowerCase();\n const fromUrl = image.url.split(\"?\")[0]?.match(/\\.([A-Za-z0-9]{2,5})$/u)?.[1];\n return fromUrl ? fromUrl.toLowerCase() : \"jpg\";\n}\n\n/** Download to the cache, then hand the file (not the link) to the share sheet. */\nasync function shareImage(image: NativeViewerImage): Promise<void> {\n const folder = new Directory(Paths.cache, \"opengeni-share\");\n if (!folder.exists) folder.create({ intermediates: true, idempotent: true });\n const base = (image.filename ?? \"image\").replace(/\\.[A-Za-z0-9]{2,5}$/u, \"\").slice(0, 60);\n const target = new File(folder, `${base || \"image\"}.${extensionOf(image)}`);\n const file = await File.downloadFileAsync(image.url, target, { idempotent: true });\n await Share.share(Platform.OS === \"ios\" ? { url: file.uri } : { message: image.url });\n}\n\nfunction ChromeButton(props: {\n icon: NativeIconName;\n label: string;\n onPress: () => void;\n busy?: boolean | undefined;\n}) {\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={props.label}\n hitSlop={10}\n disabled={props.busy}\n onPress={props.onPress}\n style={({ pressed }) => ({\n width: 40,\n height: 40,\n borderRadius: 20,\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: pressed ? \"rgba(255,255,255,0.24)\" : \"rgba(255,255,255,0.14)\",\n })}\n >\n {props.busy ? (\n <ActivityIndicator size=\"small\" color=\"#ffffff\" />\n ) : (\n <Icon name={props.icon} size={18} color=\"#ffffff\" />\n )}\n </Pressable>\n );\n}\n\n/** One page: the image fitted to the screen, zoomable up to 4×. */\nfunction ZoomablePage(props: {\n image: NativeViewerImage;\n width: number;\n height: number;\n onZoomChange: (zoomed: boolean) => void;\n}) {\n const t = useOpenGeniText();\n const scroll = useRef<ComponentRef<typeof ScrollView>>(null);\n const zoomed = useRef(false);\n const lastTap = useRef(0);\n const [loaded, setLoaded] = useState(false);\n const { width, height } = props;\n return (\n <ScrollView\n ref={scroll}\n style={{ width, height }}\n maximumZoomScale={4}\n minimumZoomScale={1}\n centerContent\n bouncesZoom\n showsHorizontalScrollIndicator={false}\n showsVerticalScrollIndicator={false}\n scrollEventThrottle={64}\n onScroll={(event: NativeSyntheticEvent<NativeScrollEvent>) => {\n const next = (event.nativeEvent.zoomScale ?? 1) > 1.01;\n if (next !== zoomed.current) {\n zoomed.current = next;\n props.onZoomChange(next);\n }\n }}\n contentContainerStyle={{ width, height, alignItems: \"center\", justifyContent: \"center\" }}\n >\n <Pressable\n accessible\n accessibilityRole=\"image\"\n accessibilityLabel={props.image.alt}\n accessibilityHint={t(\"native.timeline.imageViewer.doubleTapToZoom\")}\n onPress={(event) => {\n // Double-tap zooms in on that spot, or back out.\n const now = Date.now();\n if (now - lastTap.current < 280) {\n lastTap.current = 0;\n if (zoomed.current) {\n scroll.current?.scrollResponderZoomTo({ x: 0, y: 0, width, height, animated: true });\n } else {\n const { locationX, locationY } = event.nativeEvent;\n scroll.current?.scrollResponderZoomTo({\n x: locationX - width / 6,\n y: locationY - height / 6,\n width: width / 3,\n height: height / 3,\n animated: true,\n });\n }\n return;\n }\n lastTap.current = now;\n }}\n style={{ width, height, alignItems: \"center\", justifyContent: \"center\" }}\n >\n <Image\n source={{ uri: props.image.url }}\n resizeMode=\"contain\"\n accessibilityIgnoresInvertColors\n onLoad={() => setLoaded(true)}\n style={{ width, height }}\n />\n {loaded ? null : (\n <View style={{ position: \"absolute\" }}>\n <ActivityIndicator color=\"#ffffff\" />\n </View>\n )}\n </Pressable>\n </ScrollView>\n );\n}\n\n/**\n * Full-screen images over a dark backdrop. With several images, swipe between\n * them (paging pauses while one is zoomed). Close with the button or the\n * system back gesture.\n */\nexport function NativeImageViewer(props: {\n images: readonly NativeViewerImage[];\n /** The image to open on. */\n index: number;\n visible: boolean;\n onClose: () => void;\n labels?: Partial<NativeImageViewerLabels> | undefined;\n}) {\n const t = useOpenGeniText();\n const labels = { ...DEFAULT_LABELS(t), ...props.labels };\n const insets = useSafeAreaInsets();\n const { width, height } = useWindowDimensions();\n const [index, setIndex] = useState(props.index);\n const [zoomed, setZoomed] = useState(false);\n const [sharing, setSharing] = useState(false);\n const [problem, setProblem] = useState<string | null>(null);\n const list = useRef<FlatList<NativeViewerImage>>(null);\n useEffect(() => {\n if (!props.visible) return;\n setIndex(props.index);\n setZoomed(false);\n setProblem(null);\n }, [props.visible, props.index]);\n const current = props.images[index] ?? props.images[0];\n const count = props.images.length;\n const share = () => {\n if (!current) return;\n setSharing(true);\n setProblem(null);\n void shareImage(current)\n .catch(() => setProblem(labels.shareFailed))\n .finally(() => setSharing(false));\n };\n return (\n <Modal\n visible={props.visible}\n animationType=\"fade\"\n transparent\n statusBarTranslucent\n onRequestClose={props.onClose}\n >\n <View style={{ flex: 1, backgroundColor: \"rgba(0,0,0,0.96)\" }}>\n <FlatList\n ref={list}\n data={props.images as NativeViewerImage[]}\n keyExtractor={(image, position) => `${position}:${image.url}`}\n horizontal\n pagingEnabled\n scrollEnabled={!zoomed && count > 1}\n initialScrollIndex={Math.min(props.index, Math.max(0, count - 1))}\n getItemLayout={(_data, position) => ({\n length: width,\n offset: width * position,\n index: position,\n })}\n showsHorizontalScrollIndicator={false}\n onMomentumScrollEnd={(event) => {\n const next = Math.round(event.nativeEvent.contentOffset.x / width);\n if (next !== index) {\n setIndex(next);\n setProblem(null);\n }\n }}\n renderItem={({ item }) => (\n <ZoomablePage image={item} width={width} height={height} onZoomChange={setZoomed} />\n )}\n />\n <View\n pointerEvents=\"box-none\"\n style={{\n position: \"absolute\",\n top: insets.top + 8,\n left: 12,\n right: 12,\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n <ChromeButton icon=\"x\" label={labels.close} onPress={props.onClose} />\n {count > 1 ? (\n <Text\n accessibilityRole=\"text\"\n style={{ color: \"rgba(255,255,255,0.86)\", fontSize: 15, fontWeight: \"600\" }}\n >\n {labels.position(index, count)}\n </Text>\n ) : null}\n <ChromeButton icon=\"share-2\" label={labels.share} onPress={share} busy={sharing} />\n </View>\n {problem ? (\n <View\n pointerEvents=\"none\"\n style={{\n position: \"absolute\",\n bottom: insets.bottom + 24,\n left: 24,\n right: 24,\n alignItems: \"center\",\n }}\n >\n <Text\n style={{\n color: \"#ffffff\",\n fontSize: 14,\n paddingHorizontal: 14,\n paddingVertical: 8,\n borderRadius: 12,\n overflow: \"hidden\",\n backgroundColor: \"rgba(255,255,255,0.16)\",\n }}\n >\n {problem}\n </Text>\n </View>\n ) : null}\n </View>\n </Modal>\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useNativeTimelineTheme } from './chunk-
|
|
1
|
+
import { useNativeTimelineTheme } from './chunk-NIQPBSB4.js';
|
|
2
2
|
import { resolvePreset, MODE_FRAMES } from 'thinking-orbs/engine';
|
|
3
3
|
import { useMemo, useState, useEffect } from 'react';
|
|
4
4
|
import { AppState, AccessibilityInfo } from 'react-native';
|
|
@@ -261,5 +261,5 @@ function ThinkingOrb({
|
|
|
261
261
|
}
|
|
262
262
|
|
|
263
263
|
export { SECRET_SAVE_TO_OPTIONS, ThinkingOrb, defaultSecretFieldMessages, humanInputAnswerLines, initialSecretDraft, isSecretQuestion, secretInputTraits, secretPatternMismatch, secretSubmission, secretUsernameTraits };
|
|
264
|
-
//# sourceMappingURL=chunk-
|
|
265
|
-
//# sourceMappingURL=chunk-
|
|
264
|
+
//# sourceMappingURL=chunk-DQNUIL2F.js.map
|
|
265
|
+
//# sourceMappingURL=chunk-DQNUIL2F.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/timeline/secret-field-model.ts","../src/timeline/thinking-orb.tsx"],"names":[],"mappings":"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","file":"chunk-2RNMGRTB.js","sourcesContent":["import type {\n GeneratePasswordSpec,\n HumanInputAnswer,\n HumanInputQuestion,\n HumanInputResponse,\n HumanInputSecretAnswer,\n HumanInputSecretAnswerResult,\n HumanInputSecretSaveTo,\n HumanInputSecretSpec,\n} from \"@opengeni/sdk\";\nimport { type OpenGeniText } from \"@opengeni/react/messages\";\n\n/* ----------------------------------------------------------------------------\n Pure rules for the native secret question: which keyboard and autofill\n traits the field gets, what a submission sends, and how a saved answer\n reads. No React Native imports, so the rules are unit-tested under bun.\n -------------------------------------------------------------------------- */\n\n/**\n * - `current-password` / `new-password`: the OS password manager fills or\n * suggests a password.\n * - `one-time-code`: a code the person just received (number pad, SMS autofill).\n * - `setup-key`: a TOTP seed (`fieldKind: \"totp\"` stores the seed, not a code).\n * - `off`: an API key, token or note; no autofill.\n */\nexport type SecretInputMode =\n | \"current-password\"\n | \"new-password\"\n | \"one-time-code\"\n | \"setup-key\"\n | \"off\";\n\nexport function secretInputMode(spec: HumanInputSecretSpec | null | undefined): SecretInputMode {\n const autocomplete = spec?.autocomplete;\n if (autocomplete === \"one-time-code\") return \"one-time-code\";\n if (autocomplete === \"new-password\") return \"new-password\";\n if (autocomplete === \"current-password\") return \"current-password\";\n if (autocomplete === \"off\") return spec?.fieldKind === \"totp\" ? \"setup-key\" : \"off\";\n if (spec?.fieldKind === \"totp\") return \"setup-key\";\n if (spec?.allowGenerate) return \"new-password\";\n if (spec?.itemType === \"api_key\" || spec?.itemType === \"note\") return \"off\";\n return \"current-password\";\n}\n\n/** The `TextInput` props that make the field secure and autofill-aware. */\nexport type SecretInputTraits = {\n mode: SecretInputMode;\n secureTextEntry: true;\n autoCorrect: false;\n autoCapitalize: \"none\";\n spellCheck: false;\n /** iOS. */\n textContentType: \"password\" | \"newPassword\" | \"oneTimeCode\" | \"none\";\n /** Android autofill hint (RN maps it to the platform constant). */\n autoComplete: \"password\" | \"password-new\" | \"sms-otp\" | \"off\";\n /** Android. */\n importantForAutofill: \"yes\" | \"no\";\n keyboardType: \"default\" | \"number-pad\";\n /** iOS strong-password rules, from the question's generator spec. */\n passwordRules?: string | undefined;\n};\n\nexport function secretInputTraits(\n spec: HumanInputSecretSpec | null | undefined,\n): SecretInputTraits {\n const mode = secretInputMode(spec);\n const base = {\n mode,\n secureTextEntry: true,\n autoCorrect: false,\n autoCapitalize: \"none\",\n spellCheck: false,\n } as const;\n switch (mode) {\n case \"current-password\":\n return {\n ...base,\n textContentType: \"password\",\n autoComplete: \"password\",\n importantForAutofill: \"yes\",\n keyboardType: \"default\",\n };\n case \"new-password\": {\n const passwordRules = spec?.generate ? applePasswordRules(spec.generate) : undefined;\n return {\n ...base,\n textContentType: \"newPassword\",\n autoComplete: \"password-new\",\n importantForAutofill: \"yes\",\n keyboardType: \"default\",\n ...(passwordRules ? { passwordRules } : {}),\n };\n }\n case \"one-time-code\":\n return {\n ...base,\n textContentType: \"oneTimeCode\",\n autoComplete: \"sms-otp\",\n importantForAutofill: \"yes\",\n keyboardType: \"number-pad\",\n };\n case \"setup-key\":\n case \"off\":\n return {\n ...base,\n textContentType: \"none\",\n autoComplete: \"off\",\n importantForAutofill: \"no\",\n keyboardType: \"default\",\n };\n }\n}\n\n/** The username field paired with the password, so the OS saves them together. */\nexport const secretUsernameTraits = {\n textContentType: \"username\",\n autoComplete: \"username\",\n importantForAutofill: \"yes\",\n autoCorrect: false,\n autoCapitalize: \"none\",\n spellCheck: false,\n} as const;\n\n/**\n * Apple password-rules markup for the iOS strong-password suggestion, from the\n * same spec the server generates with (defaults as in `@opengeni/contracts`).\n */\nexport function applePasswordRules(spec: GeneratePasswordSpec): string {\n const rules: string[] = [];\n const lower = spec.lowercase ?? true;\n const upper = spec.uppercase ?? true;\n const digits = spec.digits ?? true;\n const symbols = spec.symbols ?? true;\n const requireEach = spec.requireEachClass ?? true;\n // In the rules grammar a hyphen is literal only first in a class, and \"]\"\n // or a quote cannot appear at all.\n const rawSymbols = spec.symbolSet ?? \"!#%+-.:=?@_\";\n const symbolSet = (rawSymbols.includes(\"-\") ? \"-\" : \"\") + rawSymbols.replace(/[-\\]\"]/gu, \"\");\n const classes = [\n lower ? \"lower\" : null,\n upper ? \"upper\" : null,\n digits ? \"digit\" : null,\n symbols && symbolSet ? `[${symbolSet}]` : null,\n ].filter((entry): entry is string => entry !== null);\n if (requireEach) for (const entry of classes) rules.push(`required: ${entry};`);\n else rules.push(`allowed: ${classes.join(\", \")};`);\n rules.push(`minlength: ${spec.length ?? 24};`);\n return rules.join(\" \");\n}\n\n/** What the person picked for one secret question. The value itself lives in a ref. */\nexport type SecretDraft = {\n generate: boolean;\n username: string;\n saveTo: HumanInputSecretSaveTo;\n};\n\nexport const SECRET_SAVE_TO_OPTIONS: readonly HumanInputSecretSaveTo[] = [\n \"user\",\n \"task\",\n \"workspace\",\n];\n\nexport function initialSecretDraft(spec: HumanInputSecretSpec | null | undefined): SecretDraft {\n return {\n generate: false,\n username: spec?.username?.value ?? \"\",\n saveTo: spec?.saveTo ?? \"user\",\n };\n}\n\nexport function isSecretQuestion(question: Pick<HumanInputQuestion, \"kind\">): boolean {\n return question.kind === \"secret\";\n}\n\n/**\n * The secret half of a submission. Each answered secret question sends an\n * empty `answers` entry and its value (or a generate spec) only in\n * `secretAnswers`, which the API strips before anything is stored.\n */\nexport function secretSubmission(\n questions: readonly HumanInputQuestion[],\n drafts: Readonly<Record<string, SecretDraft | undefined>>,\n values: Readonly<Record<string, string | undefined>>,\n requiredMessage: string,\n): {\n answers: HumanInputAnswer[];\n secretAnswers: HumanInputSecretAnswer[];\n errors: Record<string, string>;\n} {\n const answers: HumanInputAnswer[] = [];\n const secretAnswers: HumanInputSecretAnswer[] = [];\n const errors: Record<string, string> = {};\n for (const question of questions) {\n if (!isSecretQuestion(question)) continue;\n const spec = question.secret;\n const draft = drafts[question.id] ?? initialSecretDraft(spec);\n const value = values[question.id] ?? \"\";\n const supplied = draft.generate || value.length > 0;\n if (!supplied) {\n if (question.required) errors[question.id] = requiredMessage;\n continue;\n }\n const username = draft.username.trim();\n answers.push({ questionId: question.id, values: [] });\n secretAnswers.push({\n questionId: question.id,\n ...(draft.generate ? { generate: spec?.generate ?? {} } : { value }),\n ...(spec?.username && username ? { username } : {}),\n saveTo: draft.saveTo,\n });\n }\n return { answers, secretAnswers, errors };\n}\n\n/**\n * A soft check against the question's `pattern` (anchored, like the HTML\n * attribute). Never blocks; an invalid pattern never warns.\n */\nexport function secretPatternMismatch(pattern: string | null | undefined, value: string): boolean {\n if (!pattern || value.length === 0) return false;\n let expression: RegExp;\n try {\n expression = new RegExp(`^(?:${pattern})$`, \"u\");\n } catch {\n return false;\n }\n return !expression.test(value);\n}\n\nexport type SecretFieldMessages = {\n saveTo: string;\n saveToOption: Record<HumanInputSecretSaveTo, string>;\n vaultHint: (vault: string) => string;\n show: string;\n hide: string;\n generate: string;\n generated: string;\n undo: string;\n looksLike: (example: string) => string;\n patternWarning: string;\n placeholder: Record<SecretInputMode, string>;\n saved: (vaultName: string, itemName: string) => string;\n};\n\nexport const defaultSecretFieldMessages = (t: OpenGeniText): SecretFieldMessages => ({\n saveTo: t(\"native.timeline.secretFieldModel.saveTo\"),\n saveToOption: {\n user: t(\"native.timeline.secretFieldModel.onlyMe\"),\n task: t(\"native.timeline.secretFieldModel.thisTask\"),\n workspace: t(\"native.timeline.secretFieldModel.workspace\"),\n },\n vaultHint: (vault) => t(\"native.timeline.secretFieldModel.savesToTheVaultVault\", { vault }),\n show: t(\"native.timeline.secretFieldModel.showSecret\"),\n hide: t(\"native.timeline.secretFieldModel.hideSecret\"),\n generate: t(\"native.timeline.secretFieldModel.generate\"),\n generated: t(\"native.timeline.secretFieldModel.aStrongPasswordWillBe\"),\n undo: t(\"native.timeline.secretFieldModel.undo\"),\n looksLike: (example) => t(\"native.timeline.secretFieldModel.looksLikeExample\", { example }),\n patternWarning: t(\"native.timeline.secretFieldModel.thisDoesnTMatchThe\"),\n placeholder: {\n \"current-password\": t(\"native.timeline.secretFieldModel.password\"),\n \"new-password\": t(\"native.timeline.secretFieldModel.newPassword\"),\n \"one-time-code\": t(\"native.timeline.secretFieldModel.code\"),\n \"setup-key\": t(\"native.timeline.secretFieldModel.setupKeyOrOtpauthLink\"),\n off: t(\"native.timeline.secretFieldModel.value\"),\n },\n saved: (vaultName, itemName) =>\n t(\"native.timeline.secretFieldModel.savedToVaultnameItemname\", { vaultName, itemName }),\n});\n\n/** The answered chip: where the value went, never the value. */\nexport function secretSavedLabel(\n t: OpenGeniText,\n result: Pick<HumanInputSecretAnswerResult, \"vaultName\" | \"itemName\">,\n messages: Pick<SecretFieldMessages, \"saved\"> = defaultSecretFieldMessages(t),\n): string {\n return messages.saved(result.vaultName, result.itemName);\n}\n\n/**\n * The lines of a settled answer bubble. A secret answer reads as where it was\n * saved (\"Saved to Private › GitHub\"); its value never reaches the timeline.\n */\nexport function humanInputAnswerLines(\n answers: readonly { questionId: string; label: string; values: readonly string[] }[],\n response: HumanInputResponse,\n saved: (vaultName: string, itemName: string) => string,\n multiple: boolean,\n): { questionId: string; text: string; secret: boolean }[] {\n const secrets = new Map(\n response.outcome === \"answered\"\n ? response.answers.flatMap((answer) =>\n answer.secret ? [[answer.questionId, answer.secret] as const] : [],\n )\n : [],\n );\n return answers.map((answer) => {\n const prefix = multiple ? `${answer.label}: ` : \"\";\n const secret = secrets.get(answer.questionId);\n return secret\n ? {\n questionId: answer.questionId,\n text: `${prefix}${saved(secret.vaultName, secret.itemName)}`,\n secret: true,\n }\n : {\n questionId: answer.questionId,\n text: `${prefix}${answer.values.join(\", \")}`,\n secret: false,\n };\n });\n}\n","import { MODE_FRAMES, resolvePreset, type OrbState } from \"thinking-orbs/engine\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { AccessibilityInfo, AppState } from \"react-native\";\nimport Svg, { Circle, Line } from \"react-native-svg\";\nimport { useNativeTimelineTheme } from \"./theme\";\n\n/** About 30 frames a second: smooth at 64pt without spending a frame budget. */\nconst FRAME_MS = 33;\n\nfunction ink(white: number, alpha: number | undefined, dark: boolean): string {\n // The engine's convention: 0 is the darkest ink on paper, mirrored on dark.\n const level = Math.round((dark ? 1 - Math.min(1, Math.max(0, white)) : white) * 255);\n return `rgba(${level},${level},${level},${alpha ?? 1})`;\n}\n\n/**\n * The web's ThinkingOrb on native: the same `thinking-orbs` geometry (one\n * frame of dots and edges per instant) drawn with SVG. Pauses in the\n * background and holds a still frame under Reduce Motion, as the web does.\n */\nexport function ThinkingOrb({\n state = \"searching\",\n size = 64,\n speed = 0.8,\n displaySize,\n}: {\n state?: OrbState;\n size?: 64 | 20;\n speed?: number;\n /** Draw the tuned preset larger (for example a call screen) without losing sharpness. */\n displaySize?: number;\n}) {\n const theme = useNativeTimelineTheme();\n const dark = theme.scheme === \"dark\";\n const preset = useMemo(() => resolvePreset(state, size), [state, size]);\n const [time, setTime] = useState(0.6);\n const [reduceMotion, setReduceMotion] = useState(false);\n const [active, setActive] = useState(AppState.currentState === \"active\");\n useEffect(() => {\n void AccessibilityInfo.isReduceMotionEnabled().then(setReduceMotion);\n const motion = AccessibilityInfo.addEventListener(\"reduceMotionChanged\", setReduceMotion);\n const app = AppState.addEventListener(\"change\", (next) => setActive(next === \"active\"));\n return () => {\n motion.remove();\n app.remove();\n };\n }, []);\n useEffect(() => {\n if (reduceMotion || !active) return;\n const started = Date.now();\n const timer = setInterval(() => setTime((Date.now() - started) / 1000), FRAME_MS);\n return () => clearInterval(timer);\n }, [active, reduceMotion]);\n const frame = MODE_FRAMES[preset.mode](\n size,\n reduceMotion ? 0.6 : time * preset.speed * speed,\n preset.opts,\n );\n return (\n <Svg\n width={displaySize ?? size}\n height={displaySize ?? size}\n viewBox={`0 0 ${size} ${size}`}\n accessibilityElementsHidden\n importantForAccessibility=\"no\"\n >\n {frame.lines.map((line, index) => (\n <Line\n // Stateless drawing slots retain their keys as coordinates animate.\n // oxlint-disable-next-line react/no-array-index-key\n key={`l${index}`}\n x1={line.x1}\n y1={line.y1}\n x2={line.x2}\n y2={line.y2}\n stroke={ink(line.white, line.a, dark)}\n strokeWidth={line.w}\n />\n ))}\n {frame.dots.map((dot, index) => (\n <Circle\n // Stateless drawing slots retain their keys as coordinates animate.\n // oxlint-disable-next-line react/no-array-index-key\n key={`d${index}`}\n cx={dot.x}\n cy={dot.y}\n r={dot.r}\n fill={ink(dot.white, dot.a, dark)}\n />\n ))}\n </Svg>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/timeline/secret-field-model.ts","../src/timeline/thinking-orb.tsx"],"names":[],"mappings":"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","file":"chunk-DQNUIL2F.js","sourcesContent":["import type {\n GeneratePasswordSpec,\n HumanInputAnswer,\n HumanInputQuestion,\n HumanInputResponse,\n HumanInputSecretAnswer,\n HumanInputSecretAnswerResult,\n HumanInputSecretSaveTo,\n HumanInputSecretSpec,\n} from \"@opengeni/sdk\";\nimport { type OpenGeniText } from \"@opengeni/react/messages\";\n\n/* ----------------------------------------------------------------------------\n Pure rules for the native secret question: which keyboard and autofill\n traits the field gets, what a submission sends, and how a saved answer\n reads. No React Native imports, so the rules are unit-tested under bun.\n -------------------------------------------------------------------------- */\n\n/**\n * - `current-password` / `new-password`: the OS password manager fills or\n * suggests a password.\n * - `one-time-code`: a code the person just received (number pad, SMS autofill).\n * - `setup-key`: a TOTP seed (`fieldKind: \"totp\"` stores the seed, not a code).\n * - `off`: an API key, token or note; no autofill.\n */\nexport type SecretInputMode =\n | \"current-password\"\n | \"new-password\"\n | \"one-time-code\"\n | \"setup-key\"\n | \"off\";\n\nexport function secretInputMode(spec: HumanInputSecretSpec | null | undefined): SecretInputMode {\n const autocomplete = spec?.autocomplete;\n if (autocomplete === \"one-time-code\") return \"one-time-code\";\n if (autocomplete === \"new-password\") return \"new-password\";\n if (autocomplete === \"current-password\") return \"current-password\";\n if (autocomplete === \"off\") return spec?.fieldKind === \"totp\" ? \"setup-key\" : \"off\";\n if (spec?.fieldKind === \"totp\") return \"setup-key\";\n if (spec?.allowGenerate) return \"new-password\";\n if (spec?.itemType === \"api_key\" || spec?.itemType === \"note\") return \"off\";\n return \"current-password\";\n}\n\n/** The `TextInput` props that make the field secure and autofill-aware. */\nexport type SecretInputTraits = {\n mode: SecretInputMode;\n secureTextEntry: true;\n autoCorrect: false;\n autoCapitalize: \"none\";\n spellCheck: false;\n /** iOS. */\n textContentType: \"password\" | \"newPassword\" | \"oneTimeCode\" | \"none\";\n /** Android autofill hint (RN maps it to the platform constant). */\n autoComplete: \"password\" | \"password-new\" | \"sms-otp\" | \"off\";\n /** Android. */\n importantForAutofill: \"yes\" | \"no\";\n keyboardType: \"default\" | \"number-pad\";\n /** iOS strong-password rules, from the question's generator spec. */\n passwordRules?: string | undefined;\n};\n\nexport function secretInputTraits(\n spec: HumanInputSecretSpec | null | undefined,\n): SecretInputTraits {\n const mode = secretInputMode(spec);\n const base = {\n mode,\n secureTextEntry: true,\n autoCorrect: false,\n autoCapitalize: \"none\",\n spellCheck: false,\n } as const;\n switch (mode) {\n case \"current-password\":\n return {\n ...base,\n textContentType: \"password\",\n autoComplete: \"password\",\n importantForAutofill: \"yes\",\n keyboardType: \"default\",\n };\n case \"new-password\": {\n const passwordRules = spec?.generate ? applePasswordRules(spec.generate) : undefined;\n return {\n ...base,\n textContentType: \"newPassword\",\n autoComplete: \"password-new\",\n importantForAutofill: \"yes\",\n keyboardType: \"default\",\n ...(passwordRules ? { passwordRules } : {}),\n };\n }\n case \"one-time-code\":\n return {\n ...base,\n textContentType: \"oneTimeCode\",\n autoComplete: \"sms-otp\",\n importantForAutofill: \"yes\",\n keyboardType: \"number-pad\",\n };\n case \"setup-key\":\n case \"off\":\n return {\n ...base,\n textContentType: \"none\",\n autoComplete: \"off\",\n importantForAutofill: \"no\",\n keyboardType: \"default\",\n };\n }\n}\n\n/** The username field paired with the password, so the OS saves them together. */\nexport const secretUsernameTraits = {\n textContentType: \"username\",\n autoComplete: \"username\",\n importantForAutofill: \"yes\",\n autoCorrect: false,\n autoCapitalize: \"none\",\n spellCheck: false,\n} as const;\n\n/**\n * Apple password-rules markup for the iOS strong-password suggestion, from the\n * same spec the server generates with (defaults as in `@opengeni/contracts`).\n */\nexport function applePasswordRules(spec: GeneratePasswordSpec): string {\n const rules: string[] = [];\n const lower = spec.lowercase ?? true;\n const upper = spec.uppercase ?? true;\n const digits = spec.digits ?? true;\n const symbols = spec.symbols ?? true;\n const requireEach = spec.requireEachClass ?? true;\n // In the rules grammar a hyphen is literal only first in a class, and \"]\"\n // or a quote cannot appear at all.\n const rawSymbols = spec.symbolSet ?? \"!#%+-.:=?@_\";\n const symbolSet = (rawSymbols.includes(\"-\") ? \"-\" : \"\") + rawSymbols.replace(/[-\\]\"]/gu, \"\");\n const classes = [\n lower ? \"lower\" : null,\n upper ? \"upper\" : null,\n digits ? \"digit\" : null,\n symbols && symbolSet ? `[${symbolSet}]` : null,\n ].filter((entry): entry is string => entry !== null);\n if (requireEach) for (const entry of classes) rules.push(`required: ${entry};`);\n else rules.push(`allowed: ${classes.join(\", \")};`);\n rules.push(`minlength: ${spec.length ?? 24};`);\n return rules.join(\" \");\n}\n\n/** What the person picked for one secret question. The value itself lives in a ref. */\nexport type SecretDraft = {\n generate: boolean;\n username: string;\n saveTo: HumanInputSecretSaveTo;\n};\n\nexport const SECRET_SAVE_TO_OPTIONS: readonly HumanInputSecretSaveTo[] = [\n \"user\",\n \"task\",\n \"workspace\",\n];\n\nexport function initialSecretDraft(spec: HumanInputSecretSpec | null | undefined): SecretDraft {\n return {\n generate: false,\n username: spec?.username?.value ?? \"\",\n saveTo: spec?.saveTo ?? \"user\",\n };\n}\n\nexport function isSecretQuestion(question: Pick<HumanInputQuestion, \"kind\">): boolean {\n return question.kind === \"secret\";\n}\n\n/**\n * The secret half of a submission. Each answered secret question sends an\n * empty `answers` entry and its value (or a generate spec) only in\n * `secretAnswers`, which the API strips before anything is stored.\n */\nexport function secretSubmission(\n questions: readonly HumanInputQuestion[],\n drafts: Readonly<Record<string, SecretDraft | undefined>>,\n values: Readonly<Record<string, string | undefined>>,\n requiredMessage: string,\n): {\n answers: HumanInputAnswer[];\n secretAnswers: HumanInputSecretAnswer[];\n errors: Record<string, string>;\n} {\n const answers: HumanInputAnswer[] = [];\n const secretAnswers: HumanInputSecretAnswer[] = [];\n const errors: Record<string, string> = {};\n for (const question of questions) {\n if (!isSecretQuestion(question)) continue;\n const spec = question.secret;\n const draft = drafts[question.id] ?? initialSecretDraft(spec);\n const value = values[question.id] ?? \"\";\n const supplied = draft.generate || value.length > 0;\n if (!supplied) {\n if (question.required) errors[question.id] = requiredMessage;\n continue;\n }\n const username = draft.username.trim();\n answers.push({ questionId: question.id, values: [] });\n secretAnswers.push({\n questionId: question.id,\n ...(draft.generate ? { generate: spec?.generate ?? {} } : { value }),\n ...(spec?.username && username ? { username } : {}),\n saveTo: draft.saveTo,\n });\n }\n return { answers, secretAnswers, errors };\n}\n\n/**\n * A soft check against the question's `pattern` (anchored, like the HTML\n * attribute). Never blocks; an invalid pattern never warns.\n */\nexport function secretPatternMismatch(pattern: string | null | undefined, value: string): boolean {\n if (!pattern || value.length === 0) return false;\n let expression: RegExp;\n try {\n expression = new RegExp(`^(?:${pattern})$`, \"u\");\n } catch {\n return false;\n }\n return !expression.test(value);\n}\n\nexport type SecretFieldMessages = {\n saveTo: string;\n saveToOption: Record<HumanInputSecretSaveTo, string>;\n vaultHint: (vault: string) => string;\n show: string;\n hide: string;\n generate: string;\n generated: string;\n undo: string;\n looksLike: (example: string) => string;\n patternWarning: string;\n placeholder: Record<SecretInputMode, string>;\n saved: (vaultName: string, itemName: string) => string;\n};\n\nexport const defaultSecretFieldMessages = (t: OpenGeniText): SecretFieldMessages => ({\n saveTo: t(\"native.timeline.secretFieldModel.saveTo\"),\n saveToOption: {\n user: t(\"native.timeline.secretFieldModel.onlyMe\"),\n task: t(\"native.timeline.secretFieldModel.thisTask\"),\n workspace: t(\"native.timeline.secretFieldModel.workspace\"),\n },\n vaultHint: (vault) => t(\"native.timeline.secretFieldModel.savesToTheVaultVault\", { vault }),\n show: t(\"native.timeline.secretFieldModel.showSecret\"),\n hide: t(\"native.timeline.secretFieldModel.hideSecret\"),\n generate: t(\"native.timeline.secretFieldModel.generate\"),\n generated: t(\"native.timeline.secretFieldModel.aStrongPasswordWillBe\"),\n undo: t(\"native.timeline.secretFieldModel.undo\"),\n looksLike: (example) => t(\"native.timeline.secretFieldModel.looksLikeExample\", { example }),\n patternWarning: t(\"native.timeline.secretFieldModel.thisDoesnTMatchThe\"),\n placeholder: {\n \"current-password\": t(\"native.timeline.secretFieldModel.password\"),\n \"new-password\": t(\"native.timeline.secretFieldModel.newPassword\"),\n \"one-time-code\": t(\"native.timeline.secretFieldModel.code\"),\n \"setup-key\": t(\"native.timeline.secretFieldModel.setupKeyOrOtpauthLink\"),\n off: t(\"native.timeline.secretFieldModel.value\"),\n },\n saved: (vaultName, itemName) =>\n t(\"native.timeline.secretFieldModel.savedToVaultnameItemname\", { vaultName, itemName }),\n});\n\n/** The answered chip: where the value went, never the value. */\nexport function secretSavedLabel(\n t: OpenGeniText,\n result: Pick<HumanInputSecretAnswerResult, \"vaultName\" | \"itemName\">,\n messages: Pick<SecretFieldMessages, \"saved\"> = defaultSecretFieldMessages(t),\n): string {\n return messages.saved(result.vaultName, result.itemName);\n}\n\n/**\n * The lines of a settled answer bubble. A secret answer reads as where it was\n * saved (\"Saved to Private › GitHub\"); its value never reaches the timeline.\n */\nexport function humanInputAnswerLines(\n answers: readonly { questionId: string; label: string; values: readonly string[] }[],\n response: HumanInputResponse,\n saved: (vaultName: string, itemName: string) => string,\n multiple: boolean,\n): { questionId: string; text: string; secret: boolean }[] {\n const secrets = new Map(\n response.outcome === \"answered\"\n ? response.answers.flatMap((answer) =>\n answer.secret ? [[answer.questionId, answer.secret] as const] : [],\n )\n : [],\n );\n return answers.map((answer) => {\n const prefix = multiple ? `${answer.label}: ` : \"\";\n const secret = secrets.get(answer.questionId);\n return secret\n ? {\n questionId: answer.questionId,\n text: `${prefix}${saved(secret.vaultName, secret.itemName)}`,\n secret: true,\n }\n : {\n questionId: answer.questionId,\n text: `${prefix}${answer.values.join(\", \")}`,\n secret: false,\n };\n });\n}\n","import { MODE_FRAMES, resolvePreset, type OrbState } from \"thinking-orbs/engine\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { AccessibilityInfo, AppState } from \"react-native\";\nimport Svg, { Circle, Line } from \"react-native-svg\";\nimport { useNativeTimelineTheme } from \"./theme\";\n\n/** About 30 frames a second: smooth at 64pt without spending a frame budget. */\nconst FRAME_MS = 33;\n\nfunction ink(white: number, alpha: number | undefined, dark: boolean): string {\n // The engine's convention: 0 is the darkest ink on paper, mirrored on dark.\n const level = Math.round((dark ? 1 - Math.min(1, Math.max(0, white)) : white) * 255);\n return `rgba(${level},${level},${level},${alpha ?? 1})`;\n}\n\n/**\n * The web's ThinkingOrb on native: the same `thinking-orbs` geometry (one\n * frame of dots and edges per instant) drawn with SVG. Pauses in the\n * background and holds a still frame under Reduce Motion, as the web does.\n */\nexport function ThinkingOrb({\n state = \"searching\",\n size = 64,\n speed = 0.8,\n displaySize,\n}: {\n state?: OrbState;\n size?: 64 | 20;\n speed?: number;\n /** Draw the tuned preset larger (for example a call screen) without losing sharpness. */\n displaySize?: number;\n}) {\n const theme = useNativeTimelineTheme();\n const dark = theme.scheme === \"dark\";\n const preset = useMemo(() => resolvePreset(state, size), [state, size]);\n const [time, setTime] = useState(0.6);\n const [reduceMotion, setReduceMotion] = useState(false);\n const [active, setActive] = useState(AppState.currentState === \"active\");\n useEffect(() => {\n void AccessibilityInfo.isReduceMotionEnabled().then(setReduceMotion);\n const motion = AccessibilityInfo.addEventListener(\"reduceMotionChanged\", setReduceMotion);\n const app = AppState.addEventListener(\"change\", (next) => setActive(next === \"active\"));\n return () => {\n motion.remove();\n app.remove();\n };\n }, []);\n useEffect(() => {\n if (reduceMotion || !active) return;\n const started = Date.now();\n const timer = setInterval(() => setTime((Date.now() - started) / 1000), FRAME_MS);\n return () => clearInterval(timer);\n }, [active, reduceMotion]);\n const frame = MODE_FRAMES[preset.mode](\n size,\n reduceMotion ? 0.6 : time * preset.speed * speed,\n preset.opts,\n );\n return (\n <Svg\n width={displaySize ?? size}\n height={displaySize ?? size}\n viewBox={`0 0 ${size} ${size}`}\n accessibilityElementsHidden\n importantForAccessibility=\"no\"\n >\n {frame.lines.map((line, index) => (\n <Line\n // Stateless drawing slots retain their keys as coordinates animate.\n // oxlint-disable-next-line react/no-array-index-key\n key={`l${index}`}\n x1={line.x1}\n y1={line.y1}\n x2={line.x2}\n y2={line.y2}\n stroke={ink(line.white, line.a, dark)}\n strokeWidth={line.w}\n />\n ))}\n {frame.dots.map((dot, index) => (\n <Circle\n // Stateless drawing slots retain their keys as coordinates animate.\n // oxlint-disable-next-line react/no-array-index-key\n key={`d${index}`}\n cx={dot.x}\n cy={dot.y}\n r={dot.r}\n fill={ink(dot.white, dot.a, dark)}\n />\n ))}\n </Svg>\n );\n}\n"]}
|
|
@@ -2072,6 +2072,345 @@ var iconNodes = {
|
|
|
2072
2072
|
}
|
|
2073
2073
|
]
|
|
2074
2074
|
],
|
|
2075
|
+
monitor: [
|
|
2076
|
+
[
|
|
2077
|
+
"rect",
|
|
2078
|
+
{
|
|
2079
|
+
width: "20",
|
|
2080
|
+
height: "14",
|
|
2081
|
+
x: "2",
|
|
2082
|
+
y: "3",
|
|
2083
|
+
rx: "2"
|
|
2084
|
+
}
|
|
2085
|
+
],
|
|
2086
|
+
[
|
|
2087
|
+
"line",
|
|
2088
|
+
{
|
|
2089
|
+
x1: "8",
|
|
2090
|
+
x2: "16",
|
|
2091
|
+
y1: "21",
|
|
2092
|
+
y2: "21"
|
|
2093
|
+
}
|
|
2094
|
+
],
|
|
2095
|
+
[
|
|
2096
|
+
"line",
|
|
2097
|
+
{
|
|
2098
|
+
x1: "12",
|
|
2099
|
+
x2: "12",
|
|
2100
|
+
y1: "17",
|
|
2101
|
+
y2: "21"
|
|
2102
|
+
}
|
|
2103
|
+
]
|
|
2104
|
+
],
|
|
2105
|
+
"file-spreadsheet": [
|
|
2106
|
+
[
|
|
2107
|
+
"path",
|
|
2108
|
+
{
|
|
2109
|
+
d: "M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"
|
|
2110
|
+
}
|
|
2111
|
+
],
|
|
2112
|
+
[
|
|
2113
|
+
"path",
|
|
2114
|
+
{
|
|
2115
|
+
d: "M14 2v5a1 1 0 0 0 1 1h5"
|
|
2116
|
+
}
|
|
2117
|
+
],
|
|
2118
|
+
[
|
|
2119
|
+
"path",
|
|
2120
|
+
{
|
|
2121
|
+
d: "M8 13h2"
|
|
2122
|
+
}
|
|
2123
|
+
],
|
|
2124
|
+
[
|
|
2125
|
+
"path",
|
|
2126
|
+
{
|
|
2127
|
+
d: "M14 13h2"
|
|
2128
|
+
}
|
|
2129
|
+
],
|
|
2130
|
+
[
|
|
2131
|
+
"path",
|
|
2132
|
+
{
|
|
2133
|
+
d: "M8 17h2"
|
|
2134
|
+
}
|
|
2135
|
+
],
|
|
2136
|
+
[
|
|
2137
|
+
"path",
|
|
2138
|
+
{
|
|
2139
|
+
d: "M14 17h2"
|
|
2140
|
+
}
|
|
2141
|
+
]
|
|
2142
|
+
],
|
|
2143
|
+
hourglass: [
|
|
2144
|
+
[
|
|
2145
|
+
"path",
|
|
2146
|
+
{
|
|
2147
|
+
d: "M5 22h14"
|
|
2148
|
+
}
|
|
2149
|
+
],
|
|
2150
|
+
[
|
|
2151
|
+
"path",
|
|
2152
|
+
{
|
|
2153
|
+
d: "M5 2h14"
|
|
2154
|
+
}
|
|
2155
|
+
],
|
|
2156
|
+
[
|
|
2157
|
+
"path",
|
|
2158
|
+
{
|
|
2159
|
+
d: "M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22"
|
|
2160
|
+
}
|
|
2161
|
+
],
|
|
2162
|
+
[
|
|
2163
|
+
"path",
|
|
2164
|
+
{
|
|
2165
|
+
d: "M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2"
|
|
2166
|
+
}
|
|
2167
|
+
]
|
|
2168
|
+
],
|
|
2169
|
+
download: [
|
|
2170
|
+
[
|
|
2171
|
+
"path",
|
|
2172
|
+
{
|
|
2173
|
+
d: "M 12 15V3"
|
|
2174
|
+
}
|
|
2175
|
+
],
|
|
2176
|
+
[
|
|
2177
|
+
"path",
|
|
2178
|
+
{
|
|
2179
|
+
d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"
|
|
2180
|
+
}
|
|
2181
|
+
],
|
|
2182
|
+
[
|
|
2183
|
+
"path",
|
|
2184
|
+
{
|
|
2185
|
+
d: "m7 10 5 5 5-5"
|
|
2186
|
+
}
|
|
2187
|
+
]
|
|
2188
|
+
],
|
|
2189
|
+
clipboard: [
|
|
2190
|
+
[
|
|
2191
|
+
"rect",
|
|
2192
|
+
{
|
|
2193
|
+
width: "8",
|
|
2194
|
+
height: "4",
|
|
2195
|
+
x: "8",
|
|
2196
|
+
y: "2",
|
|
2197
|
+
rx: "1",
|
|
2198
|
+
ry: "1"
|
|
2199
|
+
}
|
|
2200
|
+
],
|
|
2201
|
+
[
|
|
2202
|
+
"path",
|
|
2203
|
+
{
|
|
2204
|
+
d: "M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"
|
|
2205
|
+
}
|
|
2206
|
+
]
|
|
2207
|
+
],
|
|
2208
|
+
video: [
|
|
2209
|
+
[
|
|
2210
|
+
"path",
|
|
2211
|
+
{
|
|
2212
|
+
d: "m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5"
|
|
2213
|
+
}
|
|
2214
|
+
],
|
|
2215
|
+
[
|
|
2216
|
+
"rect",
|
|
2217
|
+
{
|
|
2218
|
+
x: "2",
|
|
2219
|
+
y: "6",
|
|
2220
|
+
width: "14",
|
|
2221
|
+
height: "12",
|
|
2222
|
+
rx: "2"
|
|
2223
|
+
}
|
|
2224
|
+
]
|
|
2225
|
+
],
|
|
2226
|
+
"circle-dot": [
|
|
2227
|
+
[
|
|
2228
|
+
"circle",
|
|
2229
|
+
{
|
|
2230
|
+
cx: "12",
|
|
2231
|
+
cy: "12",
|
|
2232
|
+
r: "10"
|
|
2233
|
+
}
|
|
2234
|
+
],
|
|
2235
|
+
[
|
|
2236
|
+
"circle",
|
|
2237
|
+
{
|
|
2238
|
+
cx: "12",
|
|
2239
|
+
cy: "12",
|
|
2240
|
+
r: "1"
|
|
2241
|
+
}
|
|
2242
|
+
]
|
|
2243
|
+
],
|
|
2244
|
+
file: [
|
|
2245
|
+
[
|
|
2246
|
+
"path",
|
|
2247
|
+
{
|
|
2248
|
+
d: "M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"
|
|
2249
|
+
}
|
|
2250
|
+
],
|
|
2251
|
+
[
|
|
2252
|
+
"path",
|
|
2253
|
+
{
|
|
2254
|
+
d: "M14 2v5a1 1 0 0 0 1 1h5"
|
|
2255
|
+
}
|
|
2256
|
+
]
|
|
2257
|
+
],
|
|
2258
|
+
archive: [
|
|
2259
|
+
[
|
|
2260
|
+
"rect",
|
|
2261
|
+
{
|
|
2262
|
+
width: "20",
|
|
2263
|
+
height: "5",
|
|
2264
|
+
x: "2",
|
|
2265
|
+
y: "3",
|
|
2266
|
+
rx: "1"
|
|
2267
|
+
}
|
|
2268
|
+
],
|
|
2269
|
+
[
|
|
2270
|
+
"path",
|
|
2271
|
+
{
|
|
2272
|
+
d: "M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8"
|
|
2273
|
+
}
|
|
2274
|
+
],
|
|
2275
|
+
[
|
|
2276
|
+
"path",
|
|
2277
|
+
{
|
|
2278
|
+
d: "M10 12h4"
|
|
2279
|
+
}
|
|
2280
|
+
]
|
|
2281
|
+
],
|
|
2282
|
+
"app-window": [
|
|
2283
|
+
[
|
|
2284
|
+
"rect",
|
|
2285
|
+
{
|
|
2286
|
+
x: "2",
|
|
2287
|
+
y: "4",
|
|
2288
|
+
width: "20",
|
|
2289
|
+
height: "16",
|
|
2290
|
+
rx: "2"
|
|
2291
|
+
}
|
|
2292
|
+
],
|
|
2293
|
+
[
|
|
2294
|
+
"path",
|
|
2295
|
+
{
|
|
2296
|
+
d: "M10 4v4"
|
|
2297
|
+
}
|
|
2298
|
+
],
|
|
2299
|
+
[
|
|
2300
|
+
"path",
|
|
2301
|
+
{
|
|
2302
|
+
d: "M2 8h20"
|
|
2303
|
+
}
|
|
2304
|
+
],
|
|
2305
|
+
[
|
|
2306
|
+
"path",
|
|
2307
|
+
{
|
|
2308
|
+
d: "M6 4v4"
|
|
2309
|
+
}
|
|
2310
|
+
]
|
|
2311
|
+
],
|
|
2312
|
+
"book-open": [
|
|
2313
|
+
[
|
|
2314
|
+
"path",
|
|
2315
|
+
{
|
|
2316
|
+
d: "M 12 5v16"
|
|
2317
|
+
}
|
|
2318
|
+
],
|
|
2319
|
+
[
|
|
2320
|
+
"path",
|
|
2321
|
+
{
|
|
2322
|
+
d: "M20.001 19A2 2 0 0022 17V5a2 2 0 00-1.999-2L16 3.002A5 5 0 0012 5a5 5 0 00-4-2H4a2 2 0 00-2 2v12a2 2 0 001.999 2H8a5 5 0 014 2 5 5 0 014-2z"
|
|
2323
|
+
}
|
|
2324
|
+
]
|
|
2325
|
+
],
|
|
2326
|
+
hand: [
|
|
2327
|
+
[
|
|
2328
|
+
"path",
|
|
2329
|
+
{
|
|
2330
|
+
d: "M18 11V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2"
|
|
2331
|
+
}
|
|
2332
|
+
],
|
|
2333
|
+
[
|
|
2334
|
+
"path",
|
|
2335
|
+
{
|
|
2336
|
+
d: "M14 10V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v2"
|
|
2337
|
+
}
|
|
2338
|
+
],
|
|
2339
|
+
[
|
|
2340
|
+
"path",
|
|
2341
|
+
{
|
|
2342
|
+
d: "M10 10.5V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2v8"
|
|
2343
|
+
}
|
|
2344
|
+
],
|
|
2345
|
+
[
|
|
2346
|
+
"path",
|
|
2347
|
+
{
|
|
2348
|
+
d: "M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15"
|
|
2349
|
+
}
|
|
2350
|
+
]
|
|
2351
|
+
],
|
|
2352
|
+
activity: [
|
|
2353
|
+
[
|
|
2354
|
+
"path",
|
|
2355
|
+
{
|
|
2356
|
+
d: "M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2"
|
|
2357
|
+
}
|
|
2358
|
+
]
|
|
2359
|
+
],
|
|
2360
|
+
"log-in": [
|
|
2361
|
+
[
|
|
2362
|
+
"path",
|
|
2363
|
+
{
|
|
2364
|
+
d: "m10 17 5-5-5-5"
|
|
2365
|
+
}
|
|
2366
|
+
],
|
|
2367
|
+
[
|
|
2368
|
+
"path",
|
|
2369
|
+
{
|
|
2370
|
+
d: "M15 12H3"
|
|
2371
|
+
}
|
|
2372
|
+
],
|
|
2373
|
+
[
|
|
2374
|
+
"path",
|
|
2375
|
+
{
|
|
2376
|
+
d: "M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4"
|
|
2377
|
+
}
|
|
2378
|
+
]
|
|
2379
|
+
],
|
|
2380
|
+
code: [
|
|
2381
|
+
[
|
|
2382
|
+
"path",
|
|
2383
|
+
{
|
|
2384
|
+
d: "m16 18 6-6-6-6"
|
|
2385
|
+
}
|
|
2386
|
+
],
|
|
2387
|
+
[
|
|
2388
|
+
"path",
|
|
2389
|
+
{
|
|
2390
|
+
d: "m8 6-6 6 6 6"
|
|
2391
|
+
}
|
|
2392
|
+
]
|
|
2393
|
+
],
|
|
2394
|
+
receipt: [
|
|
2395
|
+
[
|
|
2396
|
+
"path",
|
|
2397
|
+
{
|
|
2398
|
+
d: "M 12 17V7"
|
|
2399
|
+
}
|
|
2400
|
+
],
|
|
2401
|
+
[
|
|
2402
|
+
"path",
|
|
2403
|
+
{
|
|
2404
|
+
d: "M16 8h-6a2 2 0 0 0 0 4h4a2 2 0 0 1 0 4H8"
|
|
2405
|
+
}
|
|
2406
|
+
],
|
|
2407
|
+
[
|
|
2408
|
+
"path",
|
|
2409
|
+
{
|
|
2410
|
+
d: "M4 3a1 1 0 0 1 1-1 1.3 1.3 0 0 1 .7.2l.933.6a1.3 1.3 0 0 0 1.4 0l.934-.6a1.3 1.3 0 0 1 1.4 0l.933.6a1.3 1.3 0 0 0 1.4 0l.933-.6a1.3 1.3 0 0 1 1.4 0l.934.6a1.3 1.3 0 0 0 1.4 0l.933-.6A1.3 1.3 0 0 1 19 2a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1 1.3 1.3 0 0 1-.7-.2l-.933-.6a1.3 1.3 0 0 0-1.4 0l-.934.6a1.3 1.3 0 0 1-1.4 0l-.933-.6a1.3 1.3 0 0 0-1.4 0l-.933.6a1.3 1.3 0 0 1-1.4 0l-.934-.6a1.3 1.3 0 0 0-1.4 0l-.933.6a1.3 1.3 0 0 1-.7.2 1 1 0 0 1-1-1z"
|
|
2411
|
+
}
|
|
2412
|
+
]
|
|
2413
|
+
],
|
|
2075
2414
|
eye: [
|
|
2076
2415
|
[
|
|
2077
2416
|
"path",
|
|
@@ -2284,5 +2623,5 @@ function fontStyle(theme, weight = 400, face = "sans") {
|
|
|
2284
2623
|
var MONO_FALLBACK = "Menlo";
|
|
2285
2624
|
|
|
2286
2625
|
export { Icon, MONO_FALLBACK, NativeTimelineThemeProvider, createNativeTimelineTheme, fontStyle, insetSurface, useNativeTimelineTheme, webColorsDark, webColorsLight };
|
|
2287
|
-
//# sourceMappingURL=chunk-
|
|
2288
|
-
//# sourceMappingURL=chunk-
|
|
2626
|
+
//# sourceMappingURL=chunk-NIQPBSB4.js.map
|
|
2627
|
+
//# sourceMappingURL=chunk-NIQPBSB4.js.map
|