@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
|
@@ -9,3 +9,9 @@ export type MarkdownAstNode = {
|
|
|
9
9
|
* (text, another link, emphasis, a hard break) does, as on the web.
|
|
10
10
|
*/
|
|
11
11
|
export declare function isStandaloneLinkGroup(group: MarkdownAstNode, container: MarkdownAstNode | undefined): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* The text group a list item holds when that group is its only content,
|
|
14
|
+
* looking through a lone paragraph (loose lists keep one). A list item whose
|
|
15
|
+
* only content is a host-drawn block link is drawn without its marker.
|
|
16
|
+
*/
|
|
17
|
+
export declare function soleTextGroupOf(item: MarkdownAstNode): MarkdownAstNode | undefined;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { useNativeTimelineMessages, withAlpha } from '../chunk-
|
|
2
|
-
import { fontStyle, MONO_FALLBACK, insetSurface, useNativeTimelineTheme, Icon } from '../chunk-
|
|
1
|
+
import { useNativeTimelineMessages, withAlpha } from '../chunk-QBQRHN64.js';
|
|
2
|
+
import { fontStyle, MONO_FALLBACK, insetSurface, useNativeTimelineTheme, Icon } from '../chunk-NIQPBSB4.js';
|
|
3
3
|
import { createContext, useMemo, Fragment, useState, useContext, useRef } from 'react';
|
|
4
4
|
import { Text, View, Image, ScrollView, Pressable } from 'react-native';
|
|
5
5
|
import Markdown, { MarkdownIt, renderRules } from 'react-native-markdown-display';
|
|
@@ -22,6 +22,13 @@ function isStandaloneLinkGroup(group, container) {
|
|
|
22
22
|
const content = (group.children ?? []).filter((child) => !isBlankNode(child));
|
|
23
23
|
return content.length === 1 && content[0].type === "link";
|
|
24
24
|
}
|
|
25
|
+
function soleTextGroupOf(item) {
|
|
26
|
+
let blocks = (item.children ?? []).filter((child) => !isBlankNode(child));
|
|
27
|
+
if (blocks.length === 1 && blocks[0].type === "paragraph") {
|
|
28
|
+
blocks = (blocks[0].children ?? []).filter((child) => !isBlankNode(child));
|
|
29
|
+
}
|
|
30
|
+
return blocks.length === 1 && blocks[0].type === "textgroup" ? blocks[0] : void 0;
|
|
31
|
+
}
|
|
25
32
|
var PARSER = (() => {
|
|
26
33
|
const parser = MarkdownIt({ typographer: false, linkify: true });
|
|
27
34
|
parser.linkify.set({ fuzzyLink: false, fuzzyEmail: false });
|
|
@@ -399,8 +406,10 @@ function webRules(theme, tone, onCopy, media = {}) {
|
|
|
399
406
|
// Every run of text is selectable, as on the web: a long press selects
|
|
400
407
|
// words (and, inside a timeline message, offers Add note). A standalone
|
|
401
408
|
// link the host drew as a block sits in a view instead, since a block
|
|
402
|
-
// nested in text does not lay out.
|
|
403
|
-
|
|
409
|
+
// nested in text does not lay out. The view spans the message: a paragraph
|
|
410
|
+
// lays its children out in a wrapping row, where a plain view would size
|
|
411
|
+
// to its content.
|
|
412
|
+
textgroup: (node, children, _parent, styles) => BLOCK_LINK_GROUPS.has(node) ? /* @__PURE__ */ jsx(View, { style: { width: "100%" }, children }, node.key) : /* @__PURE__ */ jsx(Text, { selectable: true, style: styles.textgroup, children }, node.key),
|
|
404
413
|
link: (node, children, parent, styles, onLinkPress) => {
|
|
405
414
|
const href = node.attributes?.href;
|
|
406
415
|
if (media.renderLink && typeof href === "string" && href && !parseOpenGeniLink(href) && !isReservedOpenGeniLink(href)) {
|
|
@@ -416,6 +425,10 @@ function webRules(theme, tone, onCopy, media = {}) {
|
|
|
416
425
|
},
|
|
417
426
|
// Web lists use a disc marker in fg-subtle; the library's iOS default is a middle dot.
|
|
418
427
|
list_item: (node, children, parent, styles, inheritedStyles = {}) => {
|
|
428
|
+
const group = soleTextGroupOf(node);
|
|
429
|
+
if (group && BLOCK_LINK_GROUPS.has(group)) {
|
|
430
|
+
return /* @__PURE__ */ jsx(View, { style: { marginBottom: 4 }, children }, node.key);
|
|
431
|
+
}
|
|
419
432
|
if (parent.some((entry) => entry.type === "bullet_list")) {
|
|
420
433
|
const disc = 5.5;
|
|
421
434
|
return /* @__PURE__ */ jsxs(View, { style: { flexDirection: "row", marginBottom: 4 }, children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/timeline/markdown-standalone-links.ts","../../src/timeline/markdown.tsx"],"names":["Fragment"],"mappings":"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","file":"markdown.js","sourcesContent":["/* Which links in a react-native-markdown-display tree stand alone, the native\n counterpart of the web's rehype-standalone-links. The library wraps inline\n content in `textgroup` nodes and drops the paragraph inside list items, so a\n standalone link is the only link in a text group that is the only content of\n its paragraph or list item. */\n\nexport type MarkdownAstNode = {\n type: string;\n content?: string;\n children?: MarkdownAstNode[];\n};\n\nconst LINK_CONTAINERS = new Set([\"paragraph\", \"list_item\"]);\n\nfunction isBlankNode(node: MarkdownAstNode): boolean {\n return node.type === \"softbreak\" || (node.type === \"text\" && !(node.content ?? \"\").trim());\n}\n\n/**\n * Whether a text group holds a single link and is the only content of its\n * paragraph or list item. Whitespace does not count as content; anything else\n * (text, another link, emphasis, a hard break) does, as on the web.\n */\nexport function isStandaloneLinkGroup(\n group: MarkdownAstNode,\n container: MarkdownAstNode | undefined,\n): boolean {\n if (group.type !== \"textgroup\" || !container || !LINK_CONTAINERS.has(container.type)) {\n return false;\n }\n const blocks = (container.children ?? []).filter((child) => !isBlankNode(child));\n if (blocks.length !== 1 || blocks[0] !== group) return false;\n const content = (group.children ?? []).filter((child) => !isBlankNode(child));\n return content.length === 1 && content[0]!.type === \"link\";\n}\n","import {\n createContext,\n Fragment,\n useContext,\n useMemo,\n useRef,\n useState,\n type ComponentRef,\n type ReactNode,\n} from \"react\";\nimport { Image, Pressable, ScrollView, Text, View, type TextStyle } from \"react-native\";\nimport Markdown, { MarkdownIt, renderRules, type RenderRules } from \"react-native-markdown-display\";\nimport Svg, { Defs, LinearGradient, Rect, Stop } from \"react-native-svg\";\nimport {\n isReservedOpenGeniLink,\n parseOpenGeniLink,\n parseRetainedFileReference,\n type OpenGeniLinkTarget,\n} from \"@opengeni/sdk\";\nimport {\n interactivePreviewKind,\n type InteractivePreviewKind,\n} from \"@opengeni/react/native-previews\";\nimport { Icon } from \"./icon\";\nimport { isStandaloneLinkGroup } from \"./markdown-standalone-links\";\nimport { withAlpha as withAlphaColor } from \"./primitives\";\nimport type { NativeMarkdownRenderer } from \"./message-timeline\";\nimport {\n fontStyle,\n insetSurface,\n MONO_FALLBACK,\n useNativeTimelineTheme,\n type NativeTimelineTheme,\n} from \"./theme\";\nimport { useNativeTimelineMessages } from \"./messages\";\n\n/**\n * One parser for every message, configured like the web's `remark-gfm`: no typographic\n * substitution (quotes, dashes and `(c)` stay as written), and bare `http(s)://` URLs\n * autolink while file-like words (`fib.py`) do not. The library default would build a\n * new typographer parser on every render, including every streaming delta.\n */\nconst PARSER = (() => {\n const parser = MarkdownIt({ typographer: false, linkify: true });\n parser.linkify.set({ fuzzyLink: false, fuzzyEmail: false });\n return parser;\n})();\n\n/* ----------------------------------------------------------------------------\n Web Markdown (components/markdown.tsx) styles for react-native-markdown-display.\n Prose 15/28 (`text-og-md leading-7`), paragraphs `my-2.5`, lists `ml-5 gap-1`,\n code blocks `rounded-og-md bg-surface-1/70 px-3 py-2.5 text-og-sm leading-5`.\n -------------------------------------------------------------------------- */\n\nexport function webMarkdownStyles(\n theme: NativeTimelineTheme,\n tone: \"body\" | \"muted\",\n): Record<string, TextStyle> {\n const c = theme.colors;\n const muted = tone === \"muted\";\n const size = muted ? theme.size.base : theme.size.md;\n const line = muted ? 24 : 28;\n const body = {\n ...fontStyle(theme),\n color: muted ? c[\"fg-muted\"] : c.fg,\n fontSize: size,\n lineHeight: line,\n };\n const mono = fontStyle(theme, 400, \"mono\");\n const heading = { ...fontStyle(theme, 600), color: c.fg, letterSpacing: -0.2 };\n return {\n body,\n paragraph: { marginTop: 0, marginBottom: 10 },\n // Web margins collapse against the 10pt paragraph margin; native margins add up.\n heading1: { ...heading, fontSize: 20, lineHeight: 28, marginTop: 10, marginBottom: 10 },\n heading2: { ...heading, fontSize: 18, lineHeight: 26, marginTop: 10, marginBottom: 8 },\n heading3: {\n ...heading,\n fontSize: theme.size.md,\n lineHeight: 24,\n marginTop: 6,\n marginBottom: 6,\n },\n heading4: {\n ...heading,\n fontSize: theme.size.sm,\n lineHeight: 18,\n marginTop: 6,\n marginBottom: 6,\n textTransform: \"uppercase\" as const,\n },\n strong: { ...fontStyle(theme, 600), color: muted ? c[\"fg-muted\"] : c.fg },\n em: theme.fonts.sansItalic\n ? { fontFamily: theme.fonts.sansItalic }\n : { fontStyle: \"italic\" as const },\n bullet_list: { marginTop: 0, marginBottom: 10 },\n ordered_list: { marginTop: 0, marginBottom: 10 },\n list_item: { marginBottom: 4 },\n bullet_list_icon: { color: c[\"fg-subtle\"], marginLeft: 6, marginRight: 8, lineHeight: line },\n ordered_list_icon: { color: c[\"fg-subtle\"], marginLeft: 2, marginRight: 6, lineHeight: line },\n code_inline: {\n ...mono,\n fontFamily: (mono.fontFamily as string | undefined) ?? MONO_FALLBACK,\n fontSize: theme.size.sm,\n backgroundColor: c[\"surface-2\"],\n color: c.fg,\n borderRadius: theme.radius.xs,\n paddingHorizontal: 4,\n borderWidth: 0,\n },\n fence: {\n ...mono,\n fontSize: theme.size.sm,\n lineHeight: 20,\n color: c[\"fg-muted\"],\n backgroundColor: insetSurface(theme),\n borderWidth: 0,\n borderRadius: theme.radius.md,\n paddingHorizontal: 12,\n paddingVertical: 10,\n marginTop: 2,\n marginBottom: 10,\n },\n code_block: {\n ...mono,\n fontSize: theme.size.sm,\n lineHeight: 20,\n color: c[\"fg-muted\"],\n backgroundColor: insetSurface(theme),\n borderWidth: 0,\n borderRadius: theme.radius.md,\n paddingHorizontal: 12,\n paddingVertical: 10,\n },\n // Web MARKDOWN_LINK_CLASS: medium weight in accent-strong, no underline.\n link: {\n ...fontStyle(theme, 500),\n color: c[\"accent-strong\"],\n textDecorationLine: \"none\" as const,\n },\n blockquote: {\n // Web blockquote text is fg-muted; text styles inherit through the renderer.\n color: c[\"fg-muted\"],\n backgroundColor: \"transparent\",\n borderLeftColor: c[\"border-strong\"],\n borderLeftWidth: 2,\n paddingLeft: 14,\n marginLeft: 0,\n marginVertical: 12,\n },\n hr: { backgroundColor: c.border, height: 1, marginVertical: 16 },\n // Web tables: unboxed, text-og-base, hairline rules, content-sized columns.\n table: { borderWidth: 0, marginTop: 12, marginBottom: 10 },\n thead: {},\n th: {\n ...fontStyle(theme, 500),\n color: c.fg,\n fontSize: theme.size.base,\n lineHeight: 20,\n paddingVertical: 6,\n paddingRight: 16,\n },\n tr: { borderBottomWidth: 0 },\n td: {\n color: c[\"fg-muted\"],\n fontSize: theme.size.base,\n lineHeight: 20,\n paddingVertical: 6,\n paddingRight: 16,\n },\n };\n}\n\nfunction CodeFence({\n content,\n language,\n onCopy,\n}: {\n content: string;\n language: string;\n onCopy?: ((text: string) => void) | undefined;\n}) {\n const theme = useNativeTimelineTheme();\n const m = useNativeTimelineMessages();\n const styles = webMarkdownStyles(theme, \"body\");\n const [copied, setCopied] = useState(false);\n // The code scrolls in the space left of the language label and copy button, which\n // vary in width (\"SH\" vs \"TYPESCRIPT\"); reserve their measured width plus a gap.\n const [chromeWidth, setChromeWidth] = useState(64);\n return (\n <View style={{ marginTop: 2, marginBottom: 10 }}>\n <View\n style={{\n borderRadius: theme.radius.md,\n backgroundColor: insetSurface(theme),\n paddingLeft: 12,\n paddingRight: chromeWidth,\n paddingVertical: 10,\n }}\n >\n <ScrollView horizontal showsHorizontalScrollIndicator={false}>\n <Text\n selectable\n style={{\n ...styles.code_block,\n backgroundColor: \"transparent\",\n paddingHorizontal: 0,\n paddingVertical: 0,\n }}\n >\n {content}\n </Text>\n </ScrollView>\n </View>\n <View\n onLayout={(event) => {\n const next = Math.ceil(event.nativeEvent.layout.width) + 6 + 10;\n if (next !== chromeWidth) setChromeWidth(next);\n }}\n style={{\n position: \"absolute\",\n top: 6,\n right: 6,\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 4,\n }}\n >\n {language ? (\n <Text\n style={{\n ...fontStyle(theme, 400, \"mono\"),\n fontSize: 10,\n letterSpacing: 0.5,\n textTransform: \"uppercase\",\n color: theme.colors[\"fg-subtle\"],\n opacity: 0.7,\n }}\n >\n {language}\n </Text>\n ) : null}\n {onCopy ? (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={m.copyCode}\n hitSlop={8}\n onPress={() => {\n onCopy(content);\n setCopied(true);\n setTimeout(() => setCopied(false), 1400);\n }}\n style={{ width: 28, height: 28, alignItems: \"center\", justifyContent: \"center\" }}\n >\n <Icon name={copied ? \"check\" : \"copy\"} size={14} color={theme.colors[\"fg-subtle\"]} />\n </Pressable>\n ) : null}\n </View>\n </View>\n );\n}\n\n/* Tables ------------------------------------------------------------------- */\n\ntype AstNode = { type: string; content?: string; children?: AstNode[] };\n\nfunction astText(node: AstNode): string {\n // Container nodes carry an empty content string; text lives in their leaves.\n if (node.children && node.children.length > 0) return node.children.map(astText).join(\"\");\n return typeof node.content === \"string\" ? node.content : \"\";\n}\n\nfunction tableRows(table: AstNode): string[][] {\n const rows: string[][] = [];\n const visit = (node: AstNode) => {\n if (node.type === \"tr\") rows.push((node.children ?? []).map((cell) => astText(cell).trim()));\n else (node.children ?? []).forEach(visit);\n };\n visit(table);\n return rows;\n}\n\n/**\n * Content-sized columns, as a browser's auto table layout lays them out: short\n * columns keep their natural width on one line, long ones share the rest.\n */\nfunction tableColumns(rows: string[][]): { width?: number; grow: number }[] {\n const count = Math.max(0, ...rows.map((row) => row.length));\n return Array.from({ length: count }, (_, index) => {\n const longest = Math.max(1, ...rows.map((row) => row[index]?.length ?? 0));\n return longest <= 14 ? { width: Math.ceil(longest * 8.4) + 20, grow: 0 } : { grow: longest };\n });\n}\n\n/** A cell's column: its sibling index in the row (set by the AST builder). */\nfunction cellIndex(node: { index?: unknown }): number {\n return typeof node.index === \"number\" && node.index >= 0 ? node.index : 0;\n}\n\n/** Explicit column widths for a measured table; empty until the table lays out. */\nconst TableColumnsContext = createContext<number[]>([]);\n\nfunction columnWidths(columns: { width?: number; grow: number }[], available: number): number[] {\n const fixed = columns.reduce((sum, column) => sum + (column.width ?? 0), 0);\n const growth = columns.reduce(\n (sum, column) => sum + (column.width === undefined ? column.grow : 0),\n 0,\n );\n const rest = Math.max(0, available - fixed);\n if (growth === 0) return columns.map((column) => column.width ?? 0);\n // Long columns share the rest by length, each keeping a readable minimum.\n return columns.map((column) =>\n column.width !== undefined ? column.width : Math.max(64, (rest * column.grow) / growth),\n );\n}\n\n/** A column's comfortable width when the table is wider than the screen. */\nfunction naturalColumnWidth(column: { width?: number; grow: number }): number {\n return column.width ?? Math.min(280, Math.max(120, Math.ceil(column.grow * 7.6) + 20));\n}\n\nfunction MarkdownTable({\n node,\n children,\n onCopy,\n}: {\n node: AstNode;\n children: ReactNode;\n onCopy?: ((text: string) => void) | undefined;\n}) {\n const theme = useNativeTimelineTheme();\n const m = useNativeTimelineMessages();\n const rows = useMemo(() => tableRows(node), [node]);\n const columns = useMemo(() => tableColumns(rows), [rows]);\n const natural = useMemo(() => columns.map(naturalColumnWidth), [columns]);\n const naturalWidth = natural.reduce((sum, width) => sum + width, 0);\n const [available, setAvailable] = useState(0);\n // Web wraps tables in overflow-x-auto: a table that cannot fit keeps readable\n // columns and scrolls sideways instead of crushing every cell.\n const scrolls = available > 0 && naturalWidth > available;\n const widths = useMemo(\n () => (available > 0 ? (scrolls ? natural : columnWidths(columns, available)) : []),\n [available, columns, natural, scrolls],\n );\n const [copied, setCopied] = useState(false);\n // A soft edge says \"more columns this way\" until the reader reaches the end.\n const [atEnd, setAtEnd] = useState(false);\n const scroller = useRef<ComponentRef<typeof ScrollView>>(null);\n const body = (\n <TableColumnsContext.Provider value={widths}>{children}</TableColumnsContext.Provider>\n );\n return (\n <View\n style={{ marginTop: 12, marginBottom: 10 }}\n onLayout={(event) => setAvailable(Math.round(event.nativeEvent.layout.width))}\n >\n {scrolls ? (\n <View>\n <ScrollView\n ref={scroller}\n horizontal\n nestedScrollEnabled\n directionalLockEnabled\n showsHorizontalScrollIndicator\n scrollEventThrottle={32}\n onLayout={() => scroller.current?.flashScrollIndicators()}\n onScroll={(event) => {\n const { contentOffset, contentSize, layoutMeasurement } = event.nativeEvent;\n setAtEnd(contentOffset.x + layoutMeasurement.width >= contentSize.width - 8);\n }}\n accessibilityHint={m.scrollTableHint}\n >\n <View style={{ width: naturalWidth }}>{body}</View>\n </ScrollView>\n {atEnd ? null : (\n <Svg\n pointerEvents=\"none\"\n width={36}\n height=\"100%\"\n style={{ position: \"absolute\", top: 0, right: 0, bottom: 0 }}\n >\n <Defs>\n <LinearGradient id=\"table-edge\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n <Stop offset=\"0\" stopColor={theme.colors.bg} stopOpacity={0} />\n <Stop offset=\"1\" stopColor={theme.colors.bg} stopOpacity={0.95} />\n </LinearGradient>\n </Defs>\n <Rect x=\"0\" y=\"0\" width=\"36\" height=\"100%\" fill=\"url(#table-edge)\" />\n </Svg>\n )}\n </View>\n ) : (\n body\n )}\n {onCopy ? (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={m.copyTable}\n hitSlop={8}\n onPress={() => {\n onCopy(rows.map((row) => row.join(\"\\t\")).join(\"\\n\"));\n setCopied(true);\n setTimeout(() => setCopied(false), 1400);\n }}\n style={{\n position: \"absolute\",\n top: 2,\n right: 0,\n width: 28,\n height: 28,\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: 8,\n backgroundColor: scrolls ? theme.colors.bg : \"transparent\",\n }}\n >\n <Icon name={copied ? \"check\" : \"copy\"} size={14} color={theme.colors[\"fg-subtle\"]} />\n </Pressable>\n ) : null}\n </View>\n );\n}\n\nfunction TableRow({ head, last, children }: { head: boolean; last: boolean; children: ReactNode }) {\n const theme = useNativeTimelineTheme();\n const c = theme.colors;\n return (\n <View\n style={{\n flexDirection: \"row\",\n borderBottomWidth: last ? 0 : 1,\n // Header rule in border; body rules at 70% (web border-og-border/70).\n borderBottomColor: head ? c.border : withAlphaColor(c.border, 0.7),\n }}\n >\n {children}\n </View>\n );\n}\n\nfunction TableCell({\n index,\n style,\n children,\n}: {\n index: number;\n style: object;\n children: ReactNode;\n}) {\n const width = useContext(TableColumnsContext)[index];\n return (\n <View\n style={[\n style,\n // The renderer's default cell style is flex: 1 (equal columns); a measured\n // table replaces it with content-sized widths.\n width !== undefined ? { flex: 0, width } : null,\n ]}\n >\n {children}\n </View>\n );\n}\n\nfunction webRules(\n theme: NativeTimelineTheme,\n tone: \"body\" | \"muted\",\n onCopy?: (text: string) => void,\n media: MarkdownMediaOptions & MarkdownLinkOptions = {},\n): RenderRules {\n const line = tone === \"muted\" ? 24 : 28;\n return {\n ...renderRules,\n // Every run of text is selectable, as on the web: a long press selects\n // words (and, inside a timeline message, offers Add note). A standalone\n // link the host drew as a block sits in a view instead, since a block\n // nested in text does not lay out.\n textgroup: (node, children, _parent, styles) =>\n BLOCK_LINK_GROUPS.has(node) ? (\n <View key={node.key}>{children}</View>\n ) : (\n <Text key={node.key} selectable style={styles.textgroup}>\n {children}\n </Text>\n ),\n link: (node, children, parent, styles, onLinkPress) => {\n const href = node.attributes?.href;\n if (\n media.renderLink &&\n typeof href === \"string\" &&\n href &&\n !parseOpenGeniLink(href) &&\n !isReservedOpenGeniLink(href)\n ) {\n const group = parent[0];\n const standalone = group !== undefined && isStandaloneLinkGroup(group, parent[1]);\n const drawn = media.renderLink({ href, children, standalone });\n if (drawn !== undefined) {\n // Children render before their parent, so the group's rule sees this.\n if (standalone && group) BLOCK_LINK_GROUPS.add(group);\n return <Fragment key={node.key}>{drawn}</Fragment>;\n }\n }\n return renderRules.link!(node, children, parent, styles, onLinkPress);\n },\n // Web lists use a disc marker in fg-subtle; the library's iOS default is a middle dot.\n list_item: (node, children, parent, styles, inheritedStyles = {}) => {\n if (parent.some((entry: { type: string }) => entry.type === \"bullet_list\")) {\n // A drawn disc: the text bullet glyph renders noticeably smaller than\n // the browser's list-disc marker at the same line height.\n const disc = 5.5;\n return (\n <View key={node.key} style={{ flexDirection: \"row\", marginBottom: 4 }}>\n <View\n accessible={false}\n style={{ width: 20, height: line, alignItems: \"center\", justifyContent: \"center\" }}\n >\n <View\n style={{\n width: disc,\n height: disc,\n borderRadius: disc / 2,\n backgroundColor: theme.colors[\"fg-subtle\"],\n }}\n />\n </View>\n <View style={{ flex: 1, minWidth: 0 }}>{children}</View>\n </View>\n );\n }\n return renderRules.list_item!(node, children, parent, styles, inheritedStyles);\n },\n table: (node, children) => (\n <MarkdownTable key={node.key} node={node} onCopy={onCopy}>\n {children}\n </MarkdownTable>\n ),\n tr: (node, children, parent) => {\n const head = parent.some((entry: { type: string }) => entry.type === \"thead\");\n const body = parent.find((entry: { type: string }) => entry.type === \"tbody\") as\n | { children?: unknown[] }\n | undefined;\n const last = !head && body?.children?.[body.children.length - 1] === node;\n return (\n <TableRow key={node.key} head={head} last={last}>\n {children}\n </TableRow>\n );\n },\n th: (node, children, _parent, styles) => (\n <TableCell key={node.key} index={cellIndex(node)} style={styles._VIEW_SAFE_th}>\n {children}\n </TableCell>\n ),\n td: (node, children, _parent, styles) => (\n <TableCell key={node.key} index={cellIndex(node)} style={styles._VIEW_SAFE_td}>\n {children}\n </TableCell>\n ),\n fence: (node) => {\n const raw = typeof node.content === \"string\" ? node.content : \"\";\n const content = raw.endsWith(\"\\n\") ? raw.slice(0, -1) : raw;\n const info = (node as { sourceInfo?: unknown }).sourceInfo;\n const language = typeof info === \"string\" ? (info.trim().split(/\\s+/)[0] ?? \"\") : \"\";\n const kind = interactivePreviewKind(language);\n if (kind && media.renderInteractiveBlock) {\n return (\n <InteractiveFence\n key={node.key}\n kind={kind}\n content={content}\n render={media.renderInteractiveBlock}\n />\n );\n }\n return <CodeFence key={node.key} content={content} language={language} onCopy={onCopy} />;\n },\n image: (node) => {\n const attributes = (node as { attributes?: { src?: unknown; alt?: unknown } }).attributes;\n const src = typeof attributes?.src === \"string\" ? attributes.src : \"\";\n const alt = typeof attributes?.alt === \"string\" ? attributes.alt : \"\";\n const custom = src ? media.renderImage?.({ src, alt }) : undefined;\n return custom !== undefined && custom !== null ? (\n <View key={node.key}>{custom}</View>\n ) : (\n <MarkdownImage key={node.key} src={src} alt={alt} />\n );\n },\n };\n}\n\n/** An assistant-authored interactive preview fence, as the host should draw it. */\nexport type NativeInteractiveBlock = {\n kind: InteractivePreviewKind;\n /** The fence body (complete only when `state` is \"complete\"). */\n content: string;\n /**\n * \"streaming\": still being written (show a loading surface, never the body);\n * \"incomplete\": generation stopped before the fence closed; \"complete\".\n */\n state: \"streaming\" | \"incomplete\" | \"complete\";\n};\n\nexport interface MarkdownMediaOptions {\n /**\n * Draw a Markdown image. Retained files arrive as `artifact:<id>` sources,\n * which only the host can resolve; return null to use the built-in image.\n */\n renderImage?: ((image: { src: string; alt: string }) => ReactNode) | undefined;\n /**\n * Draw `opengeni-html` / `opengeni-site` fences (web `renderInteractiveBlock`).\n * Without it they show as code, like the web without the host opt-in.\n */\n renderInteractiveBlock?: ((block: NativeInteractiveBlock) => ReactNode) | undefined;\n}\n\n/**\n * One ordinary link in an agent's Markdown that the host may draw itself: its\n * own scheme (`myapp:order/42`), an in-app path, or a web URL. The native\n * counterpart of the web `OpenGeniHostLink`.\n */\nexport type NativeHostLink = {\n /** The destination exactly as the agent wrote it. It is not sanitized: check it before use. */\n href: string;\n /** The rendered link text (text nodes: draw it inside a `Text`). */\n children: ReactNode;\n /**\n * The link is the only content of its paragraph or list item, so the host\n * can draw it as a block (a card or preview) instead of inline text.\n */\n standalone: boolean;\n};\n\nexport interface MarkdownLinkOptions {\n /**\n * Draw a host-owned link (web `renderLink`). Return `undefined` to keep the\n * default link. Inline links sit inside text, so draw them with `Text`; a\n * standalone link may be any block. Opengeni object links (`artifact:`,\n * `sandbox:`) never reach it; they go to `onOpenGeniLink`.\n */\n renderLink?: ((link: NativeHostLink) => ReactNode | undefined) | undefined;\n}\n\n/** Text groups whose only link the host drew as a block, so they render as views. */\nconst BLOCK_LINK_GROUPS = new WeakSet<object>();\n\n/** Whether the message ends inside an unclosed fence, and that fence's body. */\nexport function trailingOpenFence(text: string): string | null {\n let open: { char: string; length: number; lines: string[] } | null = null;\n for (const line of text.split(\"\\n\")) {\n if (open) {\n const close = /^ {0,3}([`~]{3,})\\s*$/.exec(line);\n if (close && close[1]![0] === open.char && close[1]!.length >= open.length) open = null;\n else open.lines.push(line);\n continue;\n }\n const start = /^ {0,3}(`{3,}|~{3,})/.exec(line);\n if (start) open = { char: start[1]![0]!, length: start[1]!.length, lines: [] };\n }\n return open ? open.lines.join(\"\\n\") : null;\n}\n\nconst FenceStateContext = createContext<{ openTail: string | null; streaming: boolean }>({\n openTail: null,\n streaming: false,\n});\n\nfunction InteractiveFence({\n kind,\n content,\n render,\n}: {\n kind: InteractivePreviewKind;\n content: string;\n render: (block: NativeInteractiveBlock) => ReactNode;\n}) {\n const { openTail, streaming } = useContext(FenceStateContext);\n const open = openTail !== null && openTail.trimEnd() === content.trimEnd();\n const state = !open ? \"complete\" : streaming ? \"streaming\" : \"incomplete\";\n return <>{render({ kind, content: state === \"complete\" ? content : \"\", state })}</>;\n}\n\n/** Plain image URLs load directly; retained files need the host's `renderImage`. */\nfunction MarkdownImage({ src, alt }: { src: string; alt: string }) {\n const theme = useNativeTimelineTheme();\n const m = useNativeTimelineMessages();\n const [ratio, setRatio] = useState<number | null>(null);\n const [failed, setFailed] = useState(false);\n const remote = /^https?:\\/\\//i.test(src) && !parseRetainedFileReference(src);\n if (!remote || failed) {\n return (\n <Text\n style={{ ...fontStyle(theme), color: theme.colors[\"fg-muted\"], fontSize: theme.size.sm }}\n >\n {m.previewUnavailable(alt || m.image)}\n </Text>\n );\n }\n return (\n <Image\n accessibilityLabel={alt || m.image}\n source={{ uri: src }}\n resizeMode=\"contain\"\n onLoad={(event) => {\n const { width, height } = event.nativeEvent.source;\n if (width > 0 && height > 0) setRatio(width / height);\n }}\n onError={() => setFailed(true)}\n style={{\n width: \"100%\",\n aspectRatio: ratio ?? 4 / 3,\n maxHeight: 420,\n marginVertical: 8,\n borderRadius: theme.radius.md,\n backgroundColor: theme.colors[\"surface-2\"],\n }}\n />\n );\n}\n\n/** Trim the trailing paragraph margin (web `last:mb-0`). */\nfunction TrimmedMarkdown({\n text,\n tone,\n streaming,\n onLinkPress,\n onCopy,\n media,\n}: {\n text: string;\n tone: \"body\" | \"muted\";\n streaming: boolean;\n onLinkPress?: ((url: string) => boolean) | undefined;\n onCopy?: ((text: string) => void) | undefined;\n media: MarkdownMediaOptions & MarkdownLinkOptions;\n}) {\n const theme = useNativeTimelineTheme();\n const styles = useMemo(() => webMarkdownStyles(theme, tone), [theme, tone]);\n const rules = useMemo(() => webRules(theme, tone, onCopy, media), [theme, tone, onCopy, media]);\n const openTail = useMemo(\n () => (media.renderInteractiveBlock ? trailingOpenFence(text) : null),\n [media.renderInteractiveBlock, text],\n );\n const fenceState = useMemo(() => ({ openTail, streaming }), [openTail, streaming]);\n return (\n <View style={{ marginBottom: -10 }}>\n <FenceStateContext.Provider value={fenceState}>\n <Markdown\n markdownit={PARSER}\n style={styles}\n rules={rules}\n {...(onLinkPress ? { onLinkPress } : {})}\n >\n {text}\n </Markdown>\n </FenceStateContext.Provider>\n </View>\n );\n}\n\nexport function createWebMarkdownRenderer(\n options: {\n onLinkPress?: (url: string) => boolean;\n onCopy?: (text: string) => void;\n /** Opengeni links (sandbox files, artifacts, Sites); never handed to the OS. */\n onOpenGeniLink?: (target: OpenGeniLinkTarget) => void;\n } & MarkdownMediaOptions &\n MarkdownLinkOptions = {},\n): NativeMarkdownRenderer {\n const onLinkPress = (url: string): boolean => {\n const target = parseOpenGeniLink(url);\n if (target || isReservedOpenGeniLink(url)) {\n if (target) options.onOpenGeniLink?.(target);\n return false;\n }\n return options.onLinkPress ? options.onLinkPress(url) : true;\n };\n // One stable object, so the memoized rules survive every streaming delta.\n const media: MarkdownMediaOptions & MarkdownLinkOptions = {\n renderImage: options.renderImage,\n renderInteractiveBlock: options.renderInteractiveBlock,\n renderLink: options.renderLink,\n };\n return (text, { tone, streaming }): ReactNode =>\n text.trim() ? (\n <TrimmedMarkdown\n text={text}\n tone={tone}\n streaming={streaming === true}\n onLinkPress={onLinkPress}\n onCopy={options.onCopy}\n media={media}\n />\n ) : (\n <Text />\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/timeline/markdown-standalone-links.ts","../../src/timeline/markdown.tsx"],"names":["Fragment"],"mappings":"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","file":"markdown.js","sourcesContent":["/* Which links in a react-native-markdown-display tree stand alone, the native\n counterpart of the web's rehype-standalone-links. The library wraps inline\n content in `textgroup` nodes and drops the paragraph inside list items, so a\n standalone link is the only link in a text group that is the only content of\n its paragraph or list item. */\n\nexport type MarkdownAstNode = {\n type: string;\n content?: string;\n children?: MarkdownAstNode[];\n};\n\nconst LINK_CONTAINERS = new Set([\"paragraph\", \"list_item\"]);\n\nfunction isBlankNode(node: MarkdownAstNode): boolean {\n return node.type === \"softbreak\" || (node.type === \"text\" && !(node.content ?? \"\").trim());\n}\n\n/**\n * Whether a text group holds a single link and is the only content of its\n * paragraph or list item. Whitespace does not count as content; anything else\n * (text, another link, emphasis, a hard break) does, as on the web.\n */\nexport function isStandaloneLinkGroup(\n group: MarkdownAstNode,\n container: MarkdownAstNode | undefined,\n): boolean {\n if (group.type !== \"textgroup\" || !container || !LINK_CONTAINERS.has(container.type)) {\n return false;\n }\n const blocks = (container.children ?? []).filter((child) => !isBlankNode(child));\n if (blocks.length !== 1 || blocks[0] !== group) return false;\n const content = (group.children ?? []).filter((child) => !isBlankNode(child));\n return content.length === 1 && content[0]!.type === \"link\";\n}\n\n/**\n * The text group a list item holds when that group is its only content,\n * looking through a lone paragraph (loose lists keep one). A list item whose\n * only content is a host-drawn block link is drawn without its marker.\n */\nexport function soleTextGroupOf(item: MarkdownAstNode): MarkdownAstNode | undefined {\n let blocks = (item.children ?? []).filter((child) => !isBlankNode(child));\n if (blocks.length === 1 && blocks[0]!.type === \"paragraph\") {\n blocks = (blocks[0]!.children ?? []).filter((child) => !isBlankNode(child));\n }\n return blocks.length === 1 && blocks[0]!.type === \"textgroup\" ? blocks[0] : undefined;\n}\n","import {\n createContext,\n Fragment,\n useContext,\n useMemo,\n useRef,\n useState,\n type ComponentRef,\n type ReactNode,\n} from \"react\";\nimport { Image, Pressable, ScrollView, Text, View, type TextStyle } from \"react-native\";\nimport Markdown, { MarkdownIt, renderRules, type RenderRules } from \"react-native-markdown-display\";\nimport Svg, { Defs, LinearGradient, Rect, Stop } from \"react-native-svg\";\nimport {\n isReservedOpenGeniLink,\n parseOpenGeniLink,\n parseRetainedFileReference,\n type OpenGeniLinkTarget,\n} from \"@opengeni/sdk\";\nimport {\n interactivePreviewKind,\n type InteractivePreviewKind,\n} from \"@opengeni/react/native-previews\";\nimport { Icon } from \"./icon\";\nimport { isStandaloneLinkGroup, soleTextGroupOf } from \"./markdown-standalone-links\";\nimport { withAlpha as withAlphaColor } from \"./primitives\";\nimport type { NativeMarkdownRenderer } from \"./message-timeline\";\nimport {\n fontStyle,\n insetSurface,\n MONO_FALLBACK,\n useNativeTimelineTheme,\n type NativeTimelineTheme,\n} from \"./theme\";\nimport { useNativeTimelineMessages } from \"./messages\";\n\n/**\n * One parser for every message, configured like the web's `remark-gfm`: no typographic\n * substitution (quotes, dashes and `(c)` stay as written), and bare `http(s)://` URLs\n * autolink while file-like words (`fib.py`) do not. The library default would build a\n * new typographer parser on every render, including every streaming delta.\n */\nconst PARSER = (() => {\n const parser = MarkdownIt({ typographer: false, linkify: true });\n parser.linkify.set({ fuzzyLink: false, fuzzyEmail: false });\n return parser;\n})();\n\n/* ----------------------------------------------------------------------------\n Web Markdown (components/markdown.tsx) styles for react-native-markdown-display.\n Prose 15/28 (`text-og-md leading-7`), paragraphs `my-2.5`, lists `ml-5 gap-1`,\n code blocks `rounded-og-md bg-surface-1/70 px-3 py-2.5 text-og-sm leading-5`.\n -------------------------------------------------------------------------- */\n\nexport function webMarkdownStyles(\n theme: NativeTimelineTheme,\n tone: \"body\" | \"muted\",\n): Record<string, TextStyle> {\n const c = theme.colors;\n const muted = tone === \"muted\";\n const size = muted ? theme.size.base : theme.size.md;\n const line = muted ? 24 : 28;\n const body = {\n ...fontStyle(theme),\n color: muted ? c[\"fg-muted\"] : c.fg,\n fontSize: size,\n lineHeight: line,\n };\n const mono = fontStyle(theme, 400, \"mono\");\n const heading = { ...fontStyle(theme, 600), color: c.fg, letterSpacing: -0.2 };\n return {\n body,\n paragraph: { marginTop: 0, marginBottom: 10 },\n // Web margins collapse against the 10pt paragraph margin; native margins add up.\n heading1: { ...heading, fontSize: 20, lineHeight: 28, marginTop: 10, marginBottom: 10 },\n heading2: { ...heading, fontSize: 18, lineHeight: 26, marginTop: 10, marginBottom: 8 },\n heading3: {\n ...heading,\n fontSize: theme.size.md,\n lineHeight: 24,\n marginTop: 6,\n marginBottom: 6,\n },\n heading4: {\n ...heading,\n fontSize: theme.size.sm,\n lineHeight: 18,\n marginTop: 6,\n marginBottom: 6,\n textTransform: \"uppercase\" as const,\n },\n strong: { ...fontStyle(theme, 600), color: muted ? c[\"fg-muted\"] : c.fg },\n em: theme.fonts.sansItalic\n ? { fontFamily: theme.fonts.sansItalic }\n : { fontStyle: \"italic\" as const },\n bullet_list: { marginTop: 0, marginBottom: 10 },\n ordered_list: { marginTop: 0, marginBottom: 10 },\n list_item: { marginBottom: 4 },\n bullet_list_icon: { color: c[\"fg-subtle\"], marginLeft: 6, marginRight: 8, lineHeight: line },\n ordered_list_icon: { color: c[\"fg-subtle\"], marginLeft: 2, marginRight: 6, lineHeight: line },\n code_inline: {\n ...mono,\n fontFamily: (mono.fontFamily as string | undefined) ?? MONO_FALLBACK,\n fontSize: theme.size.sm,\n backgroundColor: c[\"surface-2\"],\n color: c.fg,\n borderRadius: theme.radius.xs,\n paddingHorizontal: 4,\n borderWidth: 0,\n },\n fence: {\n ...mono,\n fontSize: theme.size.sm,\n lineHeight: 20,\n color: c[\"fg-muted\"],\n backgroundColor: insetSurface(theme),\n borderWidth: 0,\n borderRadius: theme.radius.md,\n paddingHorizontal: 12,\n paddingVertical: 10,\n marginTop: 2,\n marginBottom: 10,\n },\n code_block: {\n ...mono,\n fontSize: theme.size.sm,\n lineHeight: 20,\n color: c[\"fg-muted\"],\n backgroundColor: insetSurface(theme),\n borderWidth: 0,\n borderRadius: theme.radius.md,\n paddingHorizontal: 12,\n paddingVertical: 10,\n },\n // Web MARKDOWN_LINK_CLASS: medium weight in accent-strong, no underline.\n link: {\n ...fontStyle(theme, 500),\n color: c[\"accent-strong\"],\n textDecorationLine: \"none\" as const,\n },\n blockquote: {\n // Web blockquote text is fg-muted; text styles inherit through the renderer.\n color: c[\"fg-muted\"],\n backgroundColor: \"transparent\",\n borderLeftColor: c[\"border-strong\"],\n borderLeftWidth: 2,\n paddingLeft: 14,\n marginLeft: 0,\n marginVertical: 12,\n },\n hr: { backgroundColor: c.border, height: 1, marginVertical: 16 },\n // Web tables: unboxed, text-og-base, hairline rules, content-sized columns.\n table: { borderWidth: 0, marginTop: 12, marginBottom: 10 },\n thead: {},\n th: {\n ...fontStyle(theme, 500),\n color: c.fg,\n fontSize: theme.size.base,\n lineHeight: 20,\n paddingVertical: 6,\n paddingRight: 16,\n },\n tr: { borderBottomWidth: 0 },\n td: {\n color: c[\"fg-muted\"],\n fontSize: theme.size.base,\n lineHeight: 20,\n paddingVertical: 6,\n paddingRight: 16,\n },\n };\n}\n\nfunction CodeFence({\n content,\n language,\n onCopy,\n}: {\n content: string;\n language: string;\n onCopy?: ((text: string) => void) | undefined;\n}) {\n const theme = useNativeTimelineTheme();\n const m = useNativeTimelineMessages();\n const styles = webMarkdownStyles(theme, \"body\");\n const [copied, setCopied] = useState(false);\n // The code scrolls in the space left of the language label and copy button, which\n // vary in width (\"SH\" vs \"TYPESCRIPT\"); reserve their measured width plus a gap.\n const [chromeWidth, setChromeWidth] = useState(64);\n return (\n <View style={{ marginTop: 2, marginBottom: 10 }}>\n <View\n style={{\n borderRadius: theme.radius.md,\n backgroundColor: insetSurface(theme),\n paddingLeft: 12,\n paddingRight: chromeWidth,\n paddingVertical: 10,\n }}\n >\n <ScrollView horizontal showsHorizontalScrollIndicator={false}>\n <Text\n selectable\n style={{\n ...styles.code_block,\n backgroundColor: \"transparent\",\n paddingHorizontal: 0,\n paddingVertical: 0,\n }}\n >\n {content}\n </Text>\n </ScrollView>\n </View>\n <View\n onLayout={(event) => {\n const next = Math.ceil(event.nativeEvent.layout.width) + 6 + 10;\n if (next !== chromeWidth) setChromeWidth(next);\n }}\n style={{\n position: \"absolute\",\n top: 6,\n right: 6,\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 4,\n }}\n >\n {language ? (\n <Text\n style={{\n ...fontStyle(theme, 400, \"mono\"),\n fontSize: 10,\n letterSpacing: 0.5,\n textTransform: \"uppercase\",\n color: theme.colors[\"fg-subtle\"],\n opacity: 0.7,\n }}\n >\n {language}\n </Text>\n ) : null}\n {onCopy ? (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={m.copyCode}\n hitSlop={8}\n onPress={() => {\n onCopy(content);\n setCopied(true);\n setTimeout(() => setCopied(false), 1400);\n }}\n style={{ width: 28, height: 28, alignItems: \"center\", justifyContent: \"center\" }}\n >\n <Icon name={copied ? \"check\" : \"copy\"} size={14} color={theme.colors[\"fg-subtle\"]} />\n </Pressable>\n ) : null}\n </View>\n </View>\n );\n}\n\n/* Tables ------------------------------------------------------------------- */\n\ntype AstNode = { type: string; content?: string; children?: AstNode[] };\n\nfunction astText(node: AstNode): string {\n // Container nodes carry an empty content string; text lives in their leaves.\n if (node.children && node.children.length > 0) return node.children.map(astText).join(\"\");\n return typeof node.content === \"string\" ? node.content : \"\";\n}\n\nfunction tableRows(table: AstNode): string[][] {\n const rows: string[][] = [];\n const visit = (node: AstNode) => {\n if (node.type === \"tr\") rows.push((node.children ?? []).map((cell) => astText(cell).trim()));\n else (node.children ?? []).forEach(visit);\n };\n visit(table);\n return rows;\n}\n\n/**\n * Content-sized columns, as a browser's auto table layout lays them out: short\n * columns keep their natural width on one line, long ones share the rest.\n */\nfunction tableColumns(rows: string[][]): { width?: number; grow: number }[] {\n const count = Math.max(0, ...rows.map((row) => row.length));\n return Array.from({ length: count }, (_, index) => {\n const longest = Math.max(1, ...rows.map((row) => row[index]?.length ?? 0));\n return longest <= 14 ? { width: Math.ceil(longest * 8.4) + 20, grow: 0 } : { grow: longest };\n });\n}\n\n/** A cell's column: its sibling index in the row (set by the AST builder). */\nfunction cellIndex(node: { index?: unknown }): number {\n return typeof node.index === \"number\" && node.index >= 0 ? node.index : 0;\n}\n\n/** Explicit column widths for a measured table; empty until the table lays out. */\nconst TableColumnsContext = createContext<number[]>([]);\n\nfunction columnWidths(columns: { width?: number; grow: number }[], available: number): number[] {\n const fixed = columns.reduce((sum, column) => sum + (column.width ?? 0), 0);\n const growth = columns.reduce(\n (sum, column) => sum + (column.width === undefined ? column.grow : 0),\n 0,\n );\n const rest = Math.max(0, available - fixed);\n if (growth === 0) return columns.map((column) => column.width ?? 0);\n // Long columns share the rest by length, each keeping a readable minimum.\n return columns.map((column) =>\n column.width !== undefined ? column.width : Math.max(64, (rest * column.grow) / growth),\n );\n}\n\n/** A column's comfortable width when the table is wider than the screen. */\nfunction naturalColumnWidth(column: { width?: number; grow: number }): number {\n return column.width ?? Math.min(280, Math.max(120, Math.ceil(column.grow * 7.6) + 20));\n}\n\nfunction MarkdownTable({\n node,\n children,\n onCopy,\n}: {\n node: AstNode;\n children: ReactNode;\n onCopy?: ((text: string) => void) | undefined;\n}) {\n const theme = useNativeTimelineTheme();\n const m = useNativeTimelineMessages();\n const rows = useMemo(() => tableRows(node), [node]);\n const columns = useMemo(() => tableColumns(rows), [rows]);\n const natural = useMemo(() => columns.map(naturalColumnWidth), [columns]);\n const naturalWidth = natural.reduce((sum, width) => sum + width, 0);\n const [available, setAvailable] = useState(0);\n // Web wraps tables in overflow-x-auto: a table that cannot fit keeps readable\n // columns and scrolls sideways instead of crushing every cell.\n const scrolls = available > 0 && naturalWidth > available;\n const widths = useMemo(\n () => (available > 0 ? (scrolls ? natural : columnWidths(columns, available)) : []),\n [available, columns, natural, scrolls],\n );\n const [copied, setCopied] = useState(false);\n // A soft edge says \"more columns this way\" until the reader reaches the end.\n const [atEnd, setAtEnd] = useState(false);\n const scroller = useRef<ComponentRef<typeof ScrollView>>(null);\n const body = (\n <TableColumnsContext.Provider value={widths}>{children}</TableColumnsContext.Provider>\n );\n return (\n <View\n style={{ marginTop: 12, marginBottom: 10 }}\n onLayout={(event) => setAvailable(Math.round(event.nativeEvent.layout.width))}\n >\n {scrolls ? (\n <View>\n <ScrollView\n ref={scroller}\n horizontal\n nestedScrollEnabled\n directionalLockEnabled\n showsHorizontalScrollIndicator\n scrollEventThrottle={32}\n onLayout={() => scroller.current?.flashScrollIndicators()}\n onScroll={(event) => {\n const { contentOffset, contentSize, layoutMeasurement } = event.nativeEvent;\n setAtEnd(contentOffset.x + layoutMeasurement.width >= contentSize.width - 8);\n }}\n accessibilityHint={m.scrollTableHint}\n >\n <View style={{ width: naturalWidth }}>{body}</View>\n </ScrollView>\n {atEnd ? null : (\n <Svg\n pointerEvents=\"none\"\n width={36}\n height=\"100%\"\n style={{ position: \"absolute\", top: 0, right: 0, bottom: 0 }}\n >\n <Defs>\n <LinearGradient id=\"table-edge\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n <Stop offset=\"0\" stopColor={theme.colors.bg} stopOpacity={0} />\n <Stop offset=\"1\" stopColor={theme.colors.bg} stopOpacity={0.95} />\n </LinearGradient>\n </Defs>\n <Rect x=\"0\" y=\"0\" width=\"36\" height=\"100%\" fill=\"url(#table-edge)\" />\n </Svg>\n )}\n </View>\n ) : (\n body\n )}\n {onCopy ? (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={m.copyTable}\n hitSlop={8}\n onPress={() => {\n onCopy(rows.map((row) => row.join(\"\\t\")).join(\"\\n\"));\n setCopied(true);\n setTimeout(() => setCopied(false), 1400);\n }}\n style={{\n position: \"absolute\",\n top: 2,\n right: 0,\n width: 28,\n height: 28,\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: 8,\n backgroundColor: scrolls ? theme.colors.bg : \"transparent\",\n }}\n >\n <Icon name={copied ? \"check\" : \"copy\"} size={14} color={theme.colors[\"fg-subtle\"]} />\n </Pressable>\n ) : null}\n </View>\n );\n}\n\nfunction TableRow({ head, last, children }: { head: boolean; last: boolean; children: ReactNode }) {\n const theme = useNativeTimelineTheme();\n const c = theme.colors;\n return (\n <View\n style={{\n flexDirection: \"row\",\n borderBottomWidth: last ? 0 : 1,\n // Header rule in border; body rules at 70% (web border-og-border/70).\n borderBottomColor: head ? c.border : withAlphaColor(c.border, 0.7),\n }}\n >\n {children}\n </View>\n );\n}\n\nfunction TableCell({\n index,\n style,\n children,\n}: {\n index: number;\n style: object;\n children: ReactNode;\n}) {\n const width = useContext(TableColumnsContext)[index];\n return (\n <View\n style={[\n style,\n // The renderer's default cell style is flex: 1 (equal columns); a measured\n // table replaces it with content-sized widths.\n width !== undefined ? { flex: 0, width } : null,\n ]}\n >\n {children}\n </View>\n );\n}\n\nfunction webRules(\n theme: NativeTimelineTheme,\n tone: \"body\" | \"muted\",\n onCopy?: (text: string) => void,\n media: MarkdownMediaOptions & MarkdownLinkOptions = {},\n): RenderRules {\n const line = tone === \"muted\" ? 24 : 28;\n return {\n ...renderRules,\n // Every run of text is selectable, as on the web: a long press selects\n // words (and, inside a timeline message, offers Add note). A standalone\n // link the host drew as a block sits in a view instead, since a block\n // nested in text does not lay out. The view spans the message: a paragraph\n // lays its children out in a wrapping row, where a plain view would size\n // to its content.\n textgroup: (node, children, _parent, styles) =>\n BLOCK_LINK_GROUPS.has(node) ? (\n <View key={node.key} style={{ width: \"100%\" }}>\n {children}\n </View>\n ) : (\n <Text key={node.key} selectable style={styles.textgroup}>\n {children}\n </Text>\n ),\n link: (node, children, parent, styles, onLinkPress) => {\n const href = node.attributes?.href;\n if (\n media.renderLink &&\n typeof href === \"string\" &&\n href &&\n !parseOpenGeniLink(href) &&\n !isReservedOpenGeniLink(href)\n ) {\n const group = parent[0];\n const standalone = group !== undefined && isStandaloneLinkGroup(group, parent[1]);\n const drawn = media.renderLink({ href, children, standalone });\n if (drawn !== undefined) {\n // Children render before their parent, so the group's rule sees this.\n if (standalone && group) BLOCK_LINK_GROUPS.add(group);\n return <Fragment key={node.key}>{drawn}</Fragment>;\n }\n }\n return renderRules.link!(node, children, parent, styles, onLinkPress);\n },\n // Web lists use a disc marker in fg-subtle; the library's iOS default is a middle dot.\n list_item: (node, children, parent, styles, inheritedStyles = {}) => {\n // A host-drawn block link is its own marker: the item drops the bullet or\n // number and its indent, so it lines up with the same card on its own line.\n const group = soleTextGroupOf(node);\n if (group && BLOCK_LINK_GROUPS.has(group)) {\n return (\n <View key={node.key} style={{ marginBottom: 4 }}>\n {children}\n </View>\n );\n }\n if (parent.some((entry: { type: string }) => entry.type === \"bullet_list\")) {\n // A drawn disc: the text bullet glyph renders noticeably smaller than\n // the browser's list-disc marker at the same line height.\n const disc = 5.5;\n return (\n <View key={node.key} style={{ flexDirection: \"row\", marginBottom: 4 }}>\n <View\n accessible={false}\n style={{ width: 20, height: line, alignItems: \"center\", justifyContent: \"center\" }}\n >\n <View\n style={{\n width: disc,\n height: disc,\n borderRadius: disc / 2,\n backgroundColor: theme.colors[\"fg-subtle\"],\n }}\n />\n </View>\n <View style={{ flex: 1, minWidth: 0 }}>{children}</View>\n </View>\n );\n }\n return renderRules.list_item!(node, children, parent, styles, inheritedStyles);\n },\n table: (node, children) => (\n <MarkdownTable key={node.key} node={node} onCopy={onCopy}>\n {children}\n </MarkdownTable>\n ),\n tr: (node, children, parent) => {\n const head = parent.some((entry: { type: string }) => entry.type === \"thead\");\n const body = parent.find((entry: { type: string }) => entry.type === \"tbody\") as\n | { children?: unknown[] }\n | undefined;\n const last = !head && body?.children?.[body.children.length - 1] === node;\n return (\n <TableRow key={node.key} head={head} last={last}>\n {children}\n </TableRow>\n );\n },\n th: (node, children, _parent, styles) => (\n <TableCell key={node.key} index={cellIndex(node)} style={styles._VIEW_SAFE_th}>\n {children}\n </TableCell>\n ),\n td: (node, children, _parent, styles) => (\n <TableCell key={node.key} index={cellIndex(node)} style={styles._VIEW_SAFE_td}>\n {children}\n </TableCell>\n ),\n fence: (node) => {\n const raw = typeof node.content === \"string\" ? node.content : \"\";\n const content = raw.endsWith(\"\\n\") ? raw.slice(0, -1) : raw;\n const info = (node as { sourceInfo?: unknown }).sourceInfo;\n const language = typeof info === \"string\" ? (info.trim().split(/\\s+/)[0] ?? \"\") : \"\";\n const kind = interactivePreviewKind(language);\n if (kind && media.renderInteractiveBlock) {\n return (\n <InteractiveFence\n key={node.key}\n kind={kind}\n content={content}\n render={media.renderInteractiveBlock}\n />\n );\n }\n return <CodeFence key={node.key} content={content} language={language} onCopy={onCopy} />;\n },\n image: (node) => {\n const attributes = (node as { attributes?: { src?: unknown; alt?: unknown } }).attributes;\n const src = typeof attributes?.src === \"string\" ? attributes.src : \"\";\n const alt = typeof attributes?.alt === \"string\" ? attributes.alt : \"\";\n const custom = src ? media.renderImage?.({ src, alt }) : undefined;\n return custom !== undefined && custom !== null ? (\n <View key={node.key}>{custom}</View>\n ) : (\n <MarkdownImage key={node.key} src={src} alt={alt} />\n );\n },\n };\n}\n\n/** An assistant-authored interactive preview fence, as the host should draw it. */\nexport type NativeInteractiveBlock = {\n kind: InteractivePreviewKind;\n /** The fence body (complete only when `state` is \"complete\"). */\n content: string;\n /**\n * \"streaming\": still being written (show a loading surface, never the body);\n * \"incomplete\": generation stopped before the fence closed; \"complete\".\n */\n state: \"streaming\" | \"incomplete\" | \"complete\";\n};\n\nexport interface MarkdownMediaOptions {\n /**\n * Draw a Markdown image. Retained files arrive as `artifact:<id>` sources,\n * which only the host can resolve; return null to use the built-in image.\n */\n renderImage?: ((image: { src: string; alt: string }) => ReactNode) | undefined;\n /**\n * Draw `opengeni-html` / `opengeni-site` fences (web `renderInteractiveBlock`).\n * Without it they show as code, like the web without the host opt-in.\n */\n renderInteractiveBlock?: ((block: NativeInteractiveBlock) => ReactNode) | undefined;\n}\n\n/**\n * One ordinary link in an agent's Markdown that the host may draw itself: its\n * own scheme (`myapp:order/42`), an in-app path, or a web URL. The native\n * counterpart of the web `OpenGeniHostLink`.\n */\nexport type NativeHostLink = {\n /** The destination exactly as the agent wrote it. It is not sanitized: check it before use. */\n href: string;\n /** The rendered link text (text nodes: draw it inside a `Text`). */\n children: ReactNode;\n /**\n * The link is the only content of its paragraph or list item, so the host\n * can draw it as a block (a card or preview) instead of inline text.\n */\n standalone: boolean;\n};\n\nexport interface MarkdownLinkOptions {\n /**\n * Draw a host-owned link (web `renderLink`). Return `undefined` to keep the\n * default link. Inline links sit inside text, so draw them with `Text`; a\n * standalone link may be any block. Opengeni object links (`artifact:`,\n * `sandbox:`) never reach it; they go to `onOpenGeniLink`.\n */\n renderLink?: ((link: NativeHostLink) => ReactNode | undefined) | undefined;\n}\n\n/** Text groups whose only link the host drew as a block, so they render as views. */\nconst BLOCK_LINK_GROUPS = new WeakSet<object>();\n\n/** Whether the message ends inside an unclosed fence, and that fence's body. */\nexport function trailingOpenFence(text: string): string | null {\n let open: { char: string; length: number; lines: string[] } | null = null;\n for (const line of text.split(\"\\n\")) {\n if (open) {\n const close = /^ {0,3}([`~]{3,})\\s*$/.exec(line);\n if (close && close[1]![0] === open.char && close[1]!.length >= open.length) open = null;\n else open.lines.push(line);\n continue;\n }\n const start = /^ {0,3}(`{3,}|~{3,})/.exec(line);\n if (start) open = { char: start[1]![0]!, length: start[1]!.length, lines: [] };\n }\n return open ? open.lines.join(\"\\n\") : null;\n}\n\nconst FenceStateContext = createContext<{ openTail: string | null; streaming: boolean }>({\n openTail: null,\n streaming: false,\n});\n\nfunction InteractiveFence({\n kind,\n content,\n render,\n}: {\n kind: InteractivePreviewKind;\n content: string;\n render: (block: NativeInteractiveBlock) => ReactNode;\n}) {\n const { openTail, streaming } = useContext(FenceStateContext);\n const open = openTail !== null && openTail.trimEnd() === content.trimEnd();\n const state = !open ? \"complete\" : streaming ? \"streaming\" : \"incomplete\";\n return <>{render({ kind, content: state === \"complete\" ? content : \"\", state })}</>;\n}\n\n/** Plain image URLs load directly; retained files need the host's `renderImage`. */\nfunction MarkdownImage({ src, alt }: { src: string; alt: string }) {\n const theme = useNativeTimelineTheme();\n const m = useNativeTimelineMessages();\n const [ratio, setRatio] = useState<number | null>(null);\n const [failed, setFailed] = useState(false);\n const remote = /^https?:\\/\\//i.test(src) && !parseRetainedFileReference(src);\n if (!remote || failed) {\n return (\n <Text\n style={{ ...fontStyle(theme), color: theme.colors[\"fg-muted\"], fontSize: theme.size.sm }}\n >\n {m.previewUnavailable(alt || m.image)}\n </Text>\n );\n }\n return (\n <Image\n accessibilityLabel={alt || m.image}\n source={{ uri: src }}\n resizeMode=\"contain\"\n onLoad={(event) => {\n const { width, height } = event.nativeEvent.source;\n if (width > 0 && height > 0) setRatio(width / height);\n }}\n onError={() => setFailed(true)}\n style={{\n width: \"100%\",\n aspectRatio: ratio ?? 4 / 3,\n maxHeight: 420,\n marginVertical: 8,\n borderRadius: theme.radius.md,\n backgroundColor: theme.colors[\"surface-2\"],\n }}\n />\n );\n}\n\n/** Trim the trailing paragraph margin (web `last:mb-0`). */\nfunction TrimmedMarkdown({\n text,\n tone,\n streaming,\n onLinkPress,\n onCopy,\n media,\n}: {\n text: string;\n tone: \"body\" | \"muted\";\n streaming: boolean;\n onLinkPress?: ((url: string) => boolean) | undefined;\n onCopy?: ((text: string) => void) | undefined;\n media: MarkdownMediaOptions & MarkdownLinkOptions;\n}) {\n const theme = useNativeTimelineTheme();\n const styles = useMemo(() => webMarkdownStyles(theme, tone), [theme, tone]);\n const rules = useMemo(() => webRules(theme, tone, onCopy, media), [theme, tone, onCopy, media]);\n const openTail = useMemo(\n () => (media.renderInteractiveBlock ? trailingOpenFence(text) : null),\n [media.renderInteractiveBlock, text],\n );\n const fenceState = useMemo(() => ({ openTail, streaming }), [openTail, streaming]);\n return (\n <View style={{ marginBottom: -10 }}>\n <FenceStateContext.Provider value={fenceState}>\n <Markdown\n markdownit={PARSER}\n style={styles}\n rules={rules}\n {...(onLinkPress ? { onLinkPress } : {})}\n >\n {text}\n </Markdown>\n </FenceStateContext.Provider>\n </View>\n );\n}\n\nexport function createWebMarkdownRenderer(\n options: {\n onLinkPress?: (url: string) => boolean;\n onCopy?: (text: string) => void;\n /** Opengeni links (sandbox files, artifacts, Sites); never handed to the OS. */\n onOpenGeniLink?: (target: OpenGeniLinkTarget) => void;\n } & MarkdownMediaOptions &\n MarkdownLinkOptions = {},\n): NativeMarkdownRenderer {\n const onLinkPress = (url: string): boolean => {\n const target = parseOpenGeniLink(url);\n if (target || isReservedOpenGeniLink(url)) {\n if (target) options.onOpenGeniLink?.(target);\n return false;\n }\n return options.onLinkPress ? options.onLinkPress(url) : true;\n };\n // One stable object, so the memoized rules survive every streaming delta.\n const media: MarkdownMediaOptions & MarkdownLinkOptions = {\n renderImage: options.renderImage,\n renderInteractiveBlock: options.renderInteractiveBlock,\n renderLink: options.renderLink,\n };\n return (text, { tone, streaming }): ReactNode =>\n text.trim() ? (\n <TrimmedMarkdown\n text={text}\n tone={tone}\n streaming={streaming === true}\n onLinkPress={onLinkPress}\n onCopy={options.onCopy}\n media={media}\n />\n ) : (\n <Text />\n );\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { NativeImageViewer } from '../chunk-
|
|
1
|
+
import { NativeImageViewer } from '../chunk-CLIXZUMZ.js';
|
|
2
2
|
import { useOpenNativeLink } from '../chunk-2WJTBHO6.js';
|
|
3
3
|
import '../chunk-7ZDF5VGA.js';
|
|
4
|
-
import { useNativeTimelineTheme, Icon, fontStyle } from '../chunk-
|
|
4
|
+
import { useNativeTimelineTheme, Icon, fontStyle } from '../chunk-NIQPBSB4.js';
|
|
5
5
|
import { previewLoadingDocument, inlineHtmlDocument, parseSiteFence, loadSiteSnapshot } from '@opengeni/react/native-previews';
|
|
6
6
|
import { parseRetainedFileReference } from '@opengeni/sdk';
|
|
7
7
|
import { useOpenGeniText } from '@opengeni/react/messages';
|
|
@@ -23,10 +23,12 @@ export interface SessionRowProps {
|
|
|
23
23
|
* When set, a long press offers Pin or Unpin, and so does an accessibility action.
|
|
24
24
|
*/
|
|
25
25
|
onTogglePin?: (() => void) | undefined;
|
|
26
|
+
/** The workspace the chat lives in, when it is not the one on screen (search results). */
|
|
27
|
+
workspaceName?: string | undefined;
|
|
26
28
|
now?: Date | undefined;
|
|
27
29
|
}
|
|
28
30
|
/** One recent-session row, as the web home canvas renders it. */
|
|
29
|
-
export declare function SessionRow({ session, models, onPress, onTogglePin, now }: SessionRowProps): import("react").JSX.Element;
|
|
31
|
+
export declare function SessionRow({ session, models, onPress, onTogglePin, workspaceName, now, }: SessionRowProps): import("react").JSX.Element;
|
|
30
32
|
/** A small-caps section label (web: text-2xs semibold uppercase tracking-wider). */
|
|
31
33
|
export declare function SectionLabel({ children }: {
|
|
32
34
|
children: string;
|
|
@@ -38,6 +40,8 @@ export declare function SessionRowList(props: {
|
|
|
38
40
|
onOpen: (sessionId: string) => void;
|
|
39
41
|
/** Pin or unpin a chat from its row (long press); omitted, rows offer no pin. */
|
|
40
42
|
onTogglePin?: ((session: Session) => void) | undefined;
|
|
43
|
+
/** Labels rows from another workspace with that workspace's name. */
|
|
44
|
+
workspaceNameOf?: ((session: Session) => string | undefined) | undefined;
|
|
41
45
|
}): import("react").JSX.Element;
|
|
42
46
|
/** The web session status badge: tinted pill, breathing dot for live states. */
|
|
43
47
|
export declare function SessionStatusBadge({ status, label, }: {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opengeni/react-native",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.5.0",
|
|
4
4
|
"description": "React Native and Expo kit for Opengeni agents: the native session timeline, composer adapters, voice dictation, and realtime voice calls (CallKit) on the same SDK controllers as the web.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -68,9 +68,9 @@
|
|
|
68
68
|
"prepublishOnly": "bash ../../scripts/prepublish-guard"
|
|
69
69
|
},
|
|
70
70
|
"dependencies": {
|
|
71
|
-
"@opengeni/contracts": "4.
|
|
72
|
-
"@opengeni/react": "4.
|
|
73
|
-
"@opengeni/sdk": "4.
|
|
71
|
+
"@opengeni/contracts": "4.5.0",
|
|
72
|
+
"@opengeni/react": "4.5.0",
|
|
73
|
+
"@opengeni/sdk": "4.5.0",
|
|
74
74
|
"thinking-orbs": "^0.3.1"
|
|
75
75
|
},
|
|
76
76
|
"peerDependencies": {
|
|
@@ -102,6 +102,33 @@ const TOOL_ICON: Record<ToolIconKind, NativeIconName> = {
|
|
|
102
102
|
"file-search": "file-search",
|
|
103
103
|
"package-search": "package-search",
|
|
104
104
|
plug: "plug",
|
|
105
|
+
browser: "globe",
|
|
106
|
+
screen: "monitor",
|
|
107
|
+
spreadsheet: "file-spreadsheet",
|
|
108
|
+
wait: "hourglass",
|
|
109
|
+
download: "download",
|
|
110
|
+
clipboard: "clipboard",
|
|
111
|
+
image: "image",
|
|
112
|
+
video: "video",
|
|
113
|
+
record: "circle-dot",
|
|
114
|
+
document: "file-text",
|
|
115
|
+
file: "file",
|
|
116
|
+
attachment: "paperclip",
|
|
117
|
+
archive: "archive",
|
|
118
|
+
folder: "folder",
|
|
119
|
+
site: "app-window",
|
|
120
|
+
guide: "book-open",
|
|
121
|
+
settings: "settings",
|
|
122
|
+
bell: "bell",
|
|
123
|
+
inbox: "inbox",
|
|
124
|
+
help: "hand",
|
|
125
|
+
model: "sparkles",
|
|
126
|
+
progress: "activity",
|
|
127
|
+
helper: "bot",
|
|
128
|
+
"sign-in": "log-in",
|
|
129
|
+
code: "code",
|
|
130
|
+
accounting: "receipt",
|
|
131
|
+
rename: "pencil",
|
|
105
132
|
wrench: "wrench",
|
|
106
133
|
};
|
|
107
134
|
|