@agimon-ai/po-native-components 0.0.0-alpha.122 → 0.0.0-alpha.124

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.
@@ -12,7 +12,7 @@ import { ScrollView } from "react-native-unistyles/components/native/ScrollView"
12
12
  //#region src/components/CodeBlock.tsx
13
13
  function CodeBlock({ text, language, initialPage = 1 }) {
14
14
  const { page, reveal } = useReadingPage(text, initialPage);
15
- const visible = codePrefix(text, page);
15
+ const visible = codePrefix(text, Math.max(initialPage, page));
16
16
  return /* @__PURE__ */ jsxs(View, {
17
17
  style: styles.root,
18
18
  children: [/* @__PURE__ */ jsxs(View, {
@@ -1 +1 @@
1
- {"version":3,"file":"CodeBlock.mjs","names":["StyleSheet","fontOf","codePrefix","useReadingPage","CopyButton","ShowMore","CodeBlockProps","text","language","initialPage","CodeBlock","page","reveal","visible","styles","root","block","undefined","scroll","code","copy","length","split","create","theme","gap","spacing","minWidth","uni__dependencies","borderRadius","DEFAULT","borderWidth","borderColor","colors","border","backgroundColor","deep","padding","paddingRight","color","fontFamily","mono","fontSize","sm","lineHeight","lineHeightRelaxed","position","top","right"],"sources":["../../src/components/CodeBlock.tsx"],"sourcesContent":["import { ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { fontOf } from '../lib/fonts';\nimport { codePrefix } from '../lib/reading';\nimport { useReadingPage } from '../lib/useReadingPage';\nimport { CopyButton } from './CopyButton';\nimport { ShowMore } from './ShowMore';\n\n/*\n * A fenced code block: the source in selectable mono type that scrolls\n * sideways rather than wrapping, and a copy button that says when it worked.\n *\n * ponytail: no syntax colouring and no mermaid diagrams yet; a mermaid fence\n * shows its source, which is still the whole content.\n */\n\nexport interface CodeBlockProps {\n /** The block's source, without the fence lines. */\n text: string;\n /** The fence's language word, such as `ts`; the web reads it from a `language-*` class. */\n language?: string;\n /** Initial reveal pages, useful for a reader restored to a known position. */\n initialPage?: number;\n}\n\nexport function CodeBlock({ text, language, initialPage = 1 }: CodeBlockProps) {\n const { page, reveal } = useReadingPage(text, initialPage);\n const visible = codePrefix(text, page);\n return (\n <View style={styles.root}>\n <View style={styles.block} accessibilityLabel={language === undefined ? undefined : `${language} code`}>\n <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.scroll}>\n <Text selectable style={styles.code}>\n {visible}\n </Text>\n </ScrollView>\n\n <CopyButton text={text} style={styles.copy} />\n </View>\n {visible.length < text.length ? (\n <ShowMore\n label=\"Show more code\"\n summary={`${visible.length} of ${text.length} characters · ${visible.split('\\n').length} of ${text.split('\\n').length} lines`}\n onPress={reveal}\n />\n ) : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n root: { gap: theme.spacing(2), minWidth: 0 },\n block: {\n borderRadius: theme.borderRadius.DEFAULT,\n borderWidth: 1,\n borderColor: theme.colors.border,\n backgroundColor: theme.colors.deep,\n },\n // The right padding keeps the first line clear of the copy button.\n scroll: { padding: theme.spacing(2.5), paddingRight: theme.spacing(9) },\n code: {\n color: theme.colors.text,\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeightRelaxed.sm,\n },\n copy: { position: 'absolute', top: theme.spacing(1.5), right: theme.spacing(1.5) },\n}));\n"],"mappings":";;;;;;;;;;;;AA0BA,SAAgBU,UAAU,EAAEH,MAAMC,UAAUC,cAAc,KAAqB;CAC7E,MAAM,EAAEE,MAAMC,WAAWT,eAAeI,MAAME,WAAW;CACzD,MAAMI,UAAUX,WAAWK,MAAMI,IAAI;CACrC,OACE,qBAAC,MAAD;EAAM,OAAOG,OAAOC;YAApB,CACE,qBAAC,MAAD;GAAM,OAAOD,OAAOE;GAAO,oBAAoBR,aAAaS,SAAYA,SAAY,GAAGT,SAAQ;aAA/F,CACE,oBAAC,YAAD;IAAY;IAAW,gCAAgC;IAAO,uBAAuBM,OAAOI;cAC1F,oBAAC,MAAD;KAAM;KAAW,OAAOJ,OAAOK;eAC5BN;IACG;GACI,IAEZ,oBAAC,YAAD;IAAkBN;IAAM,OAAOO,OAAOM;GAAK,EACvC;MACLP,QAAQQ,SAASd,KAAKc,SACrB,oBAAC,UAAD;GACE,OAAM;GACN,SAAS,GAAGR,QAAQQ,OAAM,MAAOd,KAAKc,OAAM,gBAAiBR,QAAQS,MAAM,IAAI,CAAC,CAACD,OAAM,MAAOd,KAAKe,MAAM,IAAI,CAAC,CAACD,OAAM;GACrH,SAAST;EAAO,KAEhB,IACA;;AAEV;AAEA,MAAME,SAASd,WAAWuB,QAAQC,WAAW;CAC3CT,MAAM;EAAEU,KAAKD,MAAME,QAAQ,CAAC;EAAGC,UAAU;EAACC,mBAAA,CAAA,CAAA;CAAC;CAC3CZ,OAAO;EACLa,cAAcL,MAAMK,aAAaC;EACjCC,aAAa;EACbC,aAAaR,MAAMS,OAAOC;EAC1BC,iBAAiBX,MAAMS,OAAOG;EAAIR,mBAAA,CAAA,CAAA;CACpC;CAEAV,QAAQ;EAAEmB,SAASb,MAAME,QAAQ,GAAG;EAAGY,cAAcd,MAAME,QAAQ,CAAC;EAACE,mBAAA,CAAA,CAAA;CAAC;CACtET,MAAM;EACJoB,OAAOf,MAAMS,OAAO1B;EACpBiC,YAAYvC,OAAOuB,MAAMgB,WAAWC,IAAI;EACxCC,UAAUlB,MAAMkB,SAASC;EACzBC,YAAYpB,MAAMqB,kBAAkBF;EAAEf,mBAAA,CAAA,CAAA;CACxC;CACAR,MAAM;EAAE0B,UAAU;EAAYC,KAAKvB,MAAME,QAAQ,GAAG;EAAGsB,OAAOxB,MAAME,QAAQ,GAAG;EAACE,mBAAA,CAAA,CAAA;CAAC;AACnF,EAAE"}
1
+ {"version":3,"file":"CodeBlock.mjs","names":["StyleSheet","fontOf","codePrefix","useReadingPage","CopyButton","ShowMore","CodeBlockProps","text","language","initialPage","CodeBlock","page","reveal","visible","Math","max","styles","root","block","undefined","scroll","code","copy","length","split","create","theme","gap","spacing","minWidth","uni__dependencies","borderRadius","DEFAULT","borderWidth","borderColor","colors","border","backgroundColor","deep","padding","paddingRight","color","fontFamily","mono","fontSize","sm","lineHeight","lineHeightRelaxed","position","top","right"],"sources":["../../src/components/CodeBlock.tsx"],"sourcesContent":["import { ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { fontOf } from '../lib/fonts';\nimport { codePrefix } from '../lib/reading';\nimport { useReadingPage } from '../lib/useReadingPage';\nimport { CopyButton } from './CopyButton';\nimport { ShowMore } from './ShowMore';\n\n/*\n * A fenced code block: the source in selectable mono type that scrolls\n * sideways rather than wrapping, and a copy button that says when it worked.\n *\n * ponytail: no syntax colouring and no mermaid diagrams yet; a mermaid fence\n * shows its source, which is still the whole content.\n */\n\nexport interface CodeBlockProps {\n /** The block's source, without the fence lines. */\n text: string;\n /** The fence's language word, such as `ts`; the web reads it from a `language-*` class. */\n language?: string;\n /** Initial reveal pages, useful for a reader restored to a known position. */\n initialPage?: number;\n}\n\nexport function CodeBlock({ text, language, initialPage = 1 }: CodeBlockProps) {\n const { page, reveal } = useReadingPage(text, initialPage);\n const visible = codePrefix(text, Math.max(initialPage, page));\n return (\n <View style={styles.root}>\n <View style={styles.block} accessibilityLabel={language === undefined ? undefined : `${language} code`}>\n <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.scroll}>\n <Text selectable style={styles.code}>\n {visible}\n </Text>\n </ScrollView>\n\n <CopyButton text={text} style={styles.copy} />\n </View>\n {visible.length < text.length ? (\n <ShowMore\n label=\"Show more code\"\n summary={`${visible.length} of ${text.length} characters · ${visible.split('\\n').length} of ${text.split('\\n').length} lines`}\n onPress={reveal}\n />\n ) : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n root: { gap: theme.spacing(2), minWidth: 0 },\n block: {\n borderRadius: theme.borderRadius.DEFAULT,\n borderWidth: 1,\n borderColor: theme.colors.border,\n backgroundColor: theme.colors.deep,\n },\n // The right padding keeps the first line clear of the copy button.\n scroll: { padding: theme.spacing(2.5), paddingRight: theme.spacing(9) },\n code: {\n color: theme.colors.text,\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeightRelaxed.sm,\n },\n copy: { position: 'absolute', top: theme.spacing(1.5), right: theme.spacing(1.5) },\n}));\n"],"mappings":";;;;;;;;;;;;AA0BA,SAAgBU,UAAU,EAAEH,MAAMC,UAAUC,cAAc,KAAqB;CAC7E,MAAM,EAAEE,MAAMC,WAAWT,eAAeI,MAAME,WAAW;CACzD,MAAMI,UAAUX,WAAWK,MAAMO,KAAKC,IAAIN,aAAaE,IAAI,CAAC;CAC5D,OACE,qBAAC,MAAD;EAAM,OAAOK,OAAOC;YAApB,CACE,qBAAC,MAAD;GAAM,OAAOD,OAAOE;GAAO,oBAAoBV,aAAaW,SAAYA,SAAY,GAAGX,SAAQ;aAA/F,CACE,oBAAC,YAAD;IAAY;IAAW,gCAAgC;IAAO,uBAAuBQ,OAAOI;cAC1F,oBAAC,MAAD;KAAM;KAAW,OAAOJ,OAAOK;eAC5BR;IACG;GACI,IAEZ,oBAAC,YAAD;IAAkBN;IAAM,OAAOS,OAAOM;GAAK,EACvC;MACLT,QAAQU,SAAShB,KAAKgB,SACrB,oBAAC,UAAD;GACE,OAAM;GACN,SAAS,GAAGV,QAAQU,OAAM,MAAOhB,KAAKgB,OAAM,gBAAiBV,QAAQW,MAAM,IAAI,CAAC,CAACD,OAAM,MAAOhB,KAAKiB,MAAM,IAAI,CAAC,CAACD,OAAM;GACrH,SAASX;EAAO,KAEhB,IACA;;AAEV;AAEA,MAAMI,SAAShB,WAAWyB,QAAQC,WAAW;CAC3CT,MAAM;EAAEU,KAAKD,MAAME,QAAQ,CAAC;EAAGC,UAAU;EAACC,mBAAA,CAAA,CAAA;CAAC;CAC3CZ,OAAO;EACLa,cAAcL,MAAMK,aAAaC;EACjCC,aAAa;EACbC,aAAaR,MAAMS,OAAOC;EAC1BC,iBAAiBX,MAAMS,OAAOG;EAAIR,mBAAA,CAAA,CAAA;CACpC;CAEAV,QAAQ;EAAEmB,SAASb,MAAME,QAAQ,GAAG;EAAGY,cAAcd,MAAME,QAAQ,CAAC;EAACE,mBAAA,CAAA,CAAA;CAAC;CACtET,MAAM;EACJoB,OAAOf,MAAMS,OAAO5B;EACpBmC,YAAYzC,OAAOyB,MAAMgB,WAAWC,IAAI;EACxCC,UAAUlB,MAAMkB,SAASC;EACzBC,YAAYpB,MAAMqB,kBAAkBF;EAAEf,mBAAA,CAAA,CAAA;CACxC;CACAR,MAAM;EAAE0B,UAAU;EAAYC,KAAKvB,MAAME,QAAQ,GAAG;EAAGsB,OAAOxB,MAAME,QAAQ,GAAG;EAACE,mBAAA,CAAA,CAAA;CAAC;AACnF,EAAE"}
@@ -1 +1 @@
1
- {"version":3,"file":"Markdown.d.mts","names":[],"sources":["../../src/components/Markdown.tsx"],"mappings":";;;;;;YAuBY,mBAAmB,cAAc;;YAQjC,uBAAuB,iBAAiB;EAAU;EAAa;;iBAuU1D;EACf;EACA,aAAa;;EAEb,YAAY;;EAEZ;;;qBAIW,0BAAQ,uBAAA,MAAA,YAAA,WAAA,eAA4E,kCAAa,IAAA"}
1
+ {"version":3,"file":"Markdown.d.mts","names":[],"sources":["../../src/components/Markdown.tsx"],"mappings":";;;;;;YAuBY,mBAAmB,cAAc;;YAQjC,uBAAuB,iBAAiB;EAAU;EAAa;;iBAyU1D;EACf;EACA,aAAa;;EAEb,YAAY;;EAEZ;;;qBAIW,0BAAQ,uBAAA,MAAA,YAAA,WAAA,eAA4E,kCAAa,IAAA"}
@@ -9,7 +9,7 @@ import { Text } from "react-native-unistyles/components/native/Text";
9
9
  import { StyleSheet } from "react-native-unistyles";
10
10
  import { Linking } from "react-native";
11
11
  import { createContext, memo, useContext, useEffect, useMemo, useState } from "react";
12
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
12
+ import { jsx, jsxs } from "react/jsx-runtime";
13
13
  import { ScrollView } from "react-native-unistyles/components/native/ScrollView";
14
14
  import { Image } from "react-native-unistyles/components/native/Image";
15
15
 
@@ -160,9 +160,9 @@ function MarkdownTable({ header, rows }) {
160
160
  const [rowPage, setRows] = useState(initialPage);
161
161
  const [columnPage, setColumns] = useState(initialPage);
162
162
  const [cellPage, setCells] = useState(initialPage);
163
- const visibleRows = rows.slice(0, READING.rows * rowPage);
164
- const visibleHeader = header.slice(0, READING.columns * columnPage);
165
- const limit = READING.cell * cellPage;
163
+ const visibleRows = rows.slice(0, READING.rows * Math.max(initialPage, rowPage));
164
+ const visibleHeader = header.slice(0, READING.columns * Math.max(initialPage, columnPage));
165
+ const limit = READING.cell * Math.max(initialPage, cellPage);
166
166
  const clipped = [visibleHeader, ...visibleRows.map((row) => row.slice(0, visibleHeader.length))].some((row) => row.some((cell) => inlineLength(cell) > limit));
167
167
  return /* @__PURE__ */ jsxs(View, {
168
168
  style: styles.root,
@@ -222,20 +222,24 @@ function MarkdownTable({ header, rows }) {
222
222
  function Blocks({ blocks, quoted = false }) {
223
223
  const initialPage = useContext(InitialPageContext);
224
224
  const [page, setPage] = useState(initialPage);
225
- const visible = blocks.slice(0, READING.parts * page);
226
- return /* @__PURE__ */ jsxs(Fragment, { children: [visible.map((block, index) => /* @__PURE__ */ jsx(BoundedBlock, {
227
- block,
228
- first: index === 0,
229
- quoted
230
- }, index)), visible.length < blocks.length ? /* @__PURE__ */ jsx(ShowMore, {
231
- label: "Show more",
232
- summary: `${visible.length} of ${blocks.length} parts`,
233
- onPress: () => setPage((value) => value + 1)
234
- }) : null] });
225
+ const visible = blocks.slice(0, READING.parts * Math.max(initialPage, page));
226
+ return /* @__PURE__ */ jsxs(InitialPageContext.Provider, {
227
+ value: Math.max(initialPage, page),
228
+ children: [visible.map((block, index) => /* @__PURE__ */ jsx(BoundedBlock, {
229
+ block,
230
+ first: index === 0,
231
+ quoted
232
+ }, index)), visible.length < blocks.length ? /* @__PURE__ */ jsx(ShowMore, {
233
+ label: "Show more",
234
+ summary: `${visible.length} of ${blocks.length} parts`,
235
+ onPress: () => setPage(Infinity)
236
+ }) : null]
237
+ });
235
238
  }
236
239
  function BoundedBlock({ block, ...props }) {
237
240
  const initialPage = useContext(InitialPageContext);
238
- const [page, setPage] = useState(initialPage);
241
+ const [revealedPage, setPage] = useState(initialPage);
242
+ const page = Math.max(initialPage, revealedPage);
239
243
  const limit = READING.characters * page;
240
244
  let visible = block;
241
245
  let total = 0;
@@ -256,9 +260,10 @@ function BoundedBlock({ block, ...props }) {
256
260
  if (remaining <= 0) break;
257
261
  const next = inlinePrefix(item, remaining);
258
262
  items.push(next);
259
- remaining -= inlineLength(next);
263
+ const length = inlineLength(next);
264
+ shown += length;
265
+ remaining -= length;
260
266
  }
261
- shown = limit - remaining;
262
267
  visible = {
263
268
  ...block,
264
269
  items
@@ -273,7 +278,7 @@ function BoundedBlock({ block, ...props }) {
273
278
  }), more ? /* @__PURE__ */ jsx(ShowMore, {
274
279
  label: "Show more text",
275
280
  summary: `${shown} of ${total} characters`,
276
- onPress: () => setPage((value) => value + 1)
281
+ onPress: () => setPage(Infinity)
277
282
  }) : null]
278
283
  });
279
284
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Markdown.mjs","names":["createContext","memo","ReactNode","useContext","useEffect","useMemo","useState","Linking","StyleSheet","fontOf","MarkdownBlock","MarkdownHeadingLevel","MarkdownInline","parseMarkdown","READING","inlineLength","inlinePrefix","useReadingPage","CodeBlock","ShowMore","FileLinkHandler","text","explicit","InitialPageContext","FileLinkContext","undefined","MarkdownImageLoader","path","Promise","url","dispose","ImageContext","URL_OR_ANCHOR","DIRECT_IMAGE","PLACEHOLDER_RATIO","decoded","href","decodeURIComponent","InlineCode","originalText","onFileLink","open","includes","styles","code","fileLink","InlineLink","children","isFile","test","openURL","catch","link","MarkdownImage","src","alt","loader","source","startsWith","slice","split","loaded","setLoaded","failed","ratio","setRatio","active","asset","Awaited","ReturnType","resolve","then","Error","result","current","uri","waiting","prose","imageState","nativeEvent","fit","width","height","size","Image","getSize","image","aspectRatio","renderInline","nodes","map","node","index","type","strong","em","MarkdownTable","header","rows","initialPage","rowPage","setRows","columnPage","setColumns","cellPage","setCells","visibleRows","visibleHeader","columns","limit","cell","clipped","row","length","some","root","table","column","headCell","meta","actions","page","Blocks","blocks","quoted","setPage","visible","parts","block","value","BoundedBlock","props","first","characters","total","shown","items","reduce","sum","item","remaining","next","push","more","Block","heading","level","firstHeading","run","flush","list","marker","ordered","start","itemText","language","rule","quote","MarkdownProps","loadImage","Markdown","generation","HEADING_STEP","const","HEADING_SPACE","HEADING_INK","create","theme","color","colors","dim","fontFamily","sans","fontSize","sm","lineHeight","uni__dependencies","flexDirection","flexWrap","minWidth","gap","spacing","base","marginTop","letterSpacing","fontWeight","semibold","hi","fontStyle","backgroundColor","deep","green","mono","textDecorationLine","blue","paddingLeft","flexShrink","borderLeftWidth","borderLeftColor","border","borderTopWidth","borderColor","paddingHorizontal","paddingVertical","borderRightWidth","borderBottomWidth","maxHeight","borderRadius","md","borderWidth"],"sources":["../../src/components/Markdown.tsx"],"sourcesContent":["import { createContext, memo, type ReactNode, useContext, useEffect, useMemo, useState } from 'react';\nimport { Image, Linking, ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { fontOf } from '../lib/fonts';\nimport { type MarkdownBlock, type MarkdownHeadingLevel, type MarkdownInline, parseMarkdown } from '../lib/markdown';\nimport { READING, inlineLength, inlinePrefix } from '../lib/reading';\nimport { useReadingPage } from '../lib/useReadingPage';\nimport { CodeBlock } from './CodeBlock';\nimport { ShowMore } from './ShowMore';\n\n/*\n * Markdown in the web component's element styles, from the package's own\n * parser: headings, paragraphs, lists, code spans and fences, bold, italic,\n * links, images, blockquotes and tables. Web links open with Linking; a file\n * path goes to the host. Raw HTML blocks are left out, as on the web.\n */\n\n/**\n * What a piece of inline code or a relative link opens, when the host knows.\n * Returning undefined leaves it as plain code or an ordinary link. The same\n * contract as the web Markdown's handler.\n */\nexport type FileLinkHandler = (text: string, explicit?: boolean) => (() => void) | undefined;\n\n/** Passed by context so the inline renderers stay module functions. */\nconst InitialPageContext = createContext(1);\n\nconst FileLinkContext = createContext<FileLinkHandler | undefined>(undefined);\n\n/** Loads a relative image path from the host; the same contract as the web Markdown's `loadImage`. */\nexport type MarkdownImageLoader = (path: string) => Promise<{ url: string; dispose(): void }>;\n\nconst ImageContext = createContext<MarkdownImageLoader | undefined>(undefined);\n\nconst URL_OR_ANCHOR = /^(?:[a-z][a-z\\d+.-]*:|\\/\\/|#|\\?)/i;\n/** Sources an Image may load as written; any other scheme stays its alt text. */\nconst DIRECT_IMAGE = /^(?:https?:|data:image\\/)/i;\n/** Until the image reports its size, it holds a landscape box rather than collapsing. */\nconst PLACEHOLDER_RATIO = 16 / 9;\n\nfunction decoded(href: string): string | undefined {\n try {\n return decodeURIComponent(href);\n } catch {\n return undefined;\n }\n}\n\nfunction InlineCode({ text, originalText = text }: { text: string; originalText?: string }) {\n const onFileLink = useContext(FileLinkContext);\n const open = originalText.includes('\\n') ? undefined : onFileLink?.(originalText);\n if (open !== undefined) {\n return (\n <Text\n accessibilityRole=\"link\"\n accessibilityHint={`open ${originalText}`}\n onPress={open}\n style={[styles.code, styles.fileLink]}\n >\n {text}\n </Text>\n );\n }\n return <Text style={styles.code}>{text}</Text>;\n}\n\nfunction InlineLink({ href, children }: { href: string; children: ReactNode }) {\n const onFileLink = useContext(FileLinkContext);\n const path = decoded(href);\n const isFile = path !== undefined && path !== '' && !URL_OR_ANCHOR.test(path);\n const open = isFile ? onFileLink?.(path, true) : undefined;\n return (\n <Text\n accessibilityRole=\"link\"\n onPress={() => {\n if (open !== undefined) open();\n else if (!isFile) Linking.openURL(href).catch(() => undefined);\n }}\n style={styles.link}\n >\n {children}\n </Text>\n );\n}\n\n/** One image: a file path through the host's loader, or a web or data address as written. */\nfunction MarkdownImage({ src, alt }: { src: string; alt: string }) {\n const loader = useContext(ImageContext);\n // An invalid encoded filename is shown as unavailable, never fetched.\n const source = src.startsWith('@artifact:') ? src.slice(1) : src;\n const path =\n URL_OR_ANCHOR.test(source) && !source.startsWith('artifact:')\n ? undefined\n : (decoded(source.split(/[?#]/u, 1)[0]!) ?? '');\n const [loaded, setLoaded] = useState<{ path: string; url?: string; failed?: boolean }>();\n const [ratio, setRatio] = useState(PLACEHOLDER_RATIO);\n useEffect(() => {\n if (loader === undefined || path === undefined) return;\n let active = true;\n let asset: Awaited<ReturnType<MarkdownImageLoader>> | undefined;\n void Promise.resolve()\n .then(() => {\n if (path === '') throw new Error('Invalid image path.');\n return loader(path);\n })\n .then((result) => {\n if (!active) return result.dispose();\n asset = result;\n setLoaded({ path, url: result.url });\n })\n .catch(() => {\n // The failure is shown in place, as the web image does.\n if (active) setLoaded({ path, failed: true });\n });\n return () => {\n active = false;\n asset?.dispose();\n };\n }, [path, loader]);\n const current = loaded?.path === path ? loaded : undefined;\n const uri = path === undefined ? (DIRECT_IMAGE.test(src) ? src : undefined) : current?.url;\n if (uri === undefined || current?.failed) {\n const waiting = path !== undefined && loader !== undefined && current === undefined;\n return (\n <Text style={[styles.prose, styles.imageState]} accessibilityRole={waiting ? 'text' : 'alert'}>\n {alt || path || 'Image'} ({waiting ? 'loading\\u2026' : 'unavailable'})\n </Text>\n );\n }\n return (\n <Image\n source={{ uri }}\n accessibilityLabel={alt || 'Image'}\n accessibilityIgnoresInvertColors\n resizeMode=\"contain\"\n onLoad={({ nativeEvent }) => {\n const fit = (width: number, height: number) => {\n if (width > 0 && height > 0) setRatio(width / height);\n };\n // iOS and Android report the size with the event; react-native-web does not, so it asks.\n const size = (nativeEvent as { source?: { width: number; height: number } } | undefined)?.source;\n if (size !== undefined) fit(size.width, size.height);\n else Image.getSize(uri, fit, () => undefined);\n }}\n onError={() => setLoaded({ path: path ?? src, failed: true })}\n style={[styles.image, { aspectRatio: ratio }]}\n />\n );\n}\nfunction renderInline(nodes: readonly MarkdownInline[]): ReactNode[] {\n return nodes.map((node, index) => {\n switch (node.type) {\n case 'text':\n return node.text;\n case 'code':\n return <InlineCode key={index} text={node.text} originalText={node.originalText} />;\n case 'strong':\n return (\n <Text key={index} style={styles.strong}>\n {renderInline(node.children)}\n </Text>\n );\n case 'em':\n return (\n <Text key={index} style={styles.em}>\n {renderInline(node.children)}\n </Text>\n );\n case 'link':\n return (\n <InlineLink key={index} href={node.href}>\n {renderInline(node.children)}\n </InlineLink>\n );\n case 'image':\n // Inside a heading or list item an image keeps to its alt text; paragraphs draw it.\n return node.alt;\n }\n });\n}\n\n/**\n * A table read column by column: every cell keeps to one line inside the sideways scroll, so each\n * column takes its widest cell and the rows line up without a table layout.\n */\nfunction MarkdownTable({ header, rows }: { header: MarkdownInline[][]; rows: MarkdownInline[][][] }) {\n const initialPage = useContext(InitialPageContext);\n const [rowPage, setRows] = useState(initialPage);\n const [columnPage, setColumns] = useState(initialPage);\n const [cellPage, setCells] = useState(initialPage);\n const visibleRows = rows.slice(0, READING.rows * rowPage);\n const visibleHeader = header.slice(0, READING.columns * columnPage);\n const limit = READING.cell * cellPage;\n const clipped = [visibleHeader, ...visibleRows.map((row) => row.slice(0, visibleHeader.length))].some((row) =>\n row.some((cell) => inlineLength(cell) > limit),\n );\n return (\n <View style={styles.root}>\n <ScrollView horizontal showsHorizontalScrollIndicator={false}>\n <View style={styles.table}>\n {visibleHeader.map((cell, column) => (\n <View key={column}>\n <Text style={[styles.prose, styles.cell, styles.headCell]}>\n {renderInline(inlinePrefix(cell, limit))}\n {inlineLength(cell) > limit ? '…' : ''}\n </Text>\n {visibleRows.map((row, index) => (\n <Text key={index} style={[styles.prose, styles.cell]}>\n {renderInline(inlinePrefix(row[column] ?? [], limit))}\n {inlineLength(row[column] ?? []) > limit ? '…' : ''}\n </Text>\n ))}\n </View>\n ))}\n </View>\n </ScrollView>\n <Text style={styles.meta}>\n {visibleRows.length} of {rows.length} rows · {visibleHeader.length} of {header.length} columns\n {clipped ? ` · Cells: first ${limit} characters` : ''}\n </Text>\n <View style={styles.actions}>\n {visibleRows.length < rows.length ? (\n <ShowMore label=\"Show more rows\" onPress={() => setRows((page) => page + 1)} />\n ) : null}\n {visibleHeader.length < header.length ? (\n <ShowMore label=\"Show more columns\" onPress={() => setColumns((page) => page + 1)} />\n ) : null}\n {clipped ? <ShowMore label=\"Show more cell text\" onPress={() => setCells((page) => page + 1)} /> : null}\n </View>\n </View>\n );\n}\n\nfunction Blocks({ blocks, quoted = false }: { blocks: MarkdownBlock[]; quoted?: boolean }) {\n const initialPage = useContext(InitialPageContext);\n const [page, setPage] = useState(initialPage);\n const visible = blocks.slice(0, READING.parts * page);\n return (\n <>\n {visible.map((block, index) => (\n <BoundedBlock key={index} block={block} first={index === 0} quoted={quoted} />\n ))}\n {visible.length < blocks.length ? (\n <ShowMore\n label=\"Show more\"\n summary={`${visible.length} of ${blocks.length} parts`}\n onPress={() => setPage((value) => value + 1)}\n />\n ) : null}\n </>\n );\n}\n\nfunction BoundedBlock({ block, ...props }: { block: MarkdownBlock; first: boolean; quoted?: boolean }) {\n const initialPage = useContext(InitialPageContext);\n const [page, setPage] = useState(initialPage);\n const limit = READING.characters * page;\n let visible = block;\n let total = 0;\n let shown = 0;\n if (block.type === 'heading' || block.type === 'paragraph') {\n total = inlineLength(block.children);\n const children = inlinePrefix(block.children, limit);\n shown = inlineLength(children);\n visible = { ...block, children };\n } else if (block.type === 'list') {\n total = block.items.reduce((sum, item) => sum + inlineLength(item), 0);\n let remaining = limit;\n const items = [];\n for (const item of block.items.slice(0, READING.parts * page)) {\n if (remaining <= 0) break;\n const next = inlinePrefix(item, remaining);\n items.push(next);\n remaining -= inlineLength(next);\n }\n shown = limit - remaining;\n visible = { ...block, items };\n }\n const more =\n shown < total || (block.type === 'list' && visible.type === 'list' && visible.items.length < block.items.length);\n return (\n <View style={styles.root}>\n <Block block={visible} {...props} />\n {more ? (\n <ShowMore\n label=\"Show more text\"\n summary={`${shown} of ${total} characters`}\n onPress={() => setPage((value) => value + 1)}\n />\n ) : null}\n </View>\n );\n}\n\nfunction Block({ block, first, quoted = false }: { block: MarkdownBlock; first: boolean; quoted?: boolean }) {\n const initialPage = useContext(InitialPageContext);\n const prose = [styles.prose, quoted && styles.quoted];\n switch (block.type) {\n case 'heading':\n return (\n <Text\n accessibilityRole=\"header\"\n style={[...prose, styles.heading(block.level), first && styles.firstHeading, quoted && styles.quoted]}\n >\n {renderInline(block.children)}\n </Text>\n );\n case 'paragraph': {\n // An image breaks the paragraph's text into runs, since an Image cannot sit inside Text.\n const parts: ReactNode[] = [];\n let run: MarkdownInline[] = [];\n const flush = () => {\n if (run.length > 0)\n parts.push(\n <Text key={parts.length} style={prose}>\n {renderInline(run)}\n </Text>,\n );\n run = [];\n };\n for (const node of block.children) {\n if (node.type !== 'image') {\n run.push(node);\n continue;\n }\n flush();\n parts.push(<MarkdownImage key={parts.length} src={node.src} alt={node.alt} />);\n }\n flush();\n return parts.length === 1 ? parts[0] : <View style={styles.root}>{parts}</View>;\n }\n case 'list':\n return (\n <View accessibilityRole=\"list\" style={styles.list}>\n {block.items.map((item, index) => (\n <View key={index} style={styles.item}>\n <Text style={[...prose, styles.marker]}>{block.ordered ? `${block.start + index}.` : '\\u2022'}</Text>\n <Text style={[...prose, styles.itemText]}>{renderInline(item)}</Text>\n </View>\n ))}\n </View>\n );\n case 'code':\n return <CodeBlock text={block.text} language={block.language} initialPage={initialPage} />;\n case 'rule':\n return <View accessible={false} style={styles.rule} />;\n case 'quote':\n return (\n <View style={[styles.root, styles.quote]}>\n <Blocks blocks={block.children} quoted />\n </View>\n );\n case 'table':\n return <MarkdownTable header={block.header} rows={block.rows} />;\n }\n}\n\nexport interface MarkdownProps {\n text: string;\n onFileLink?: FileLinkHandler;\n /** Loads relative image paths; without it they show as unavailable. */\n loadImage?: MarkdownImageLoader;\n /** Initial reveal pages for a restored reading position. Defaults to one. */\n initialPage?: number;\n}\n\n/** Markdown in Po's shared presentation, parsed by the package's own small parser. */\nexport const Markdown = memo(function Markdown({ text, onFileLink, loadImage, initialPage = 1 }: MarkdownProps) {\n const blocks = useMemo(() => parseMarkdown(text), [text]);\n const { generation } = useReadingPage(text);\n return (\n <InitialPageContext.Provider value={initialPage}>\n <FileLinkContext.Provider value={onFileLink}>\n <ImageContext.Provider value={loadImage}>\n <View style={styles.root}>\n <Blocks key={generation} blocks={blocks} />\n </View>\n </ImageContext.Provider>\n </FileLinkContext.Provider>\n </InitialPageContext.Provider>\n );\n});\n\n/**\n * Headings step up from the prose and never shrink below it; h4 to h6 keep\n * the prose size and lean on weight, fading from `hi` to `dim`.\n */\nconst HEADING_STEP = { 1: '2xl', 2: 'xl', 3: 'lg', 4: 'base', 5: 'base', 6: 'base' } as const;\nconst HEADING_SPACE = { 1: 2, 2: 2, 3: 1, 4: 0, 5: 0, 6: 0 } as const;\nconst HEADING_INK = { 1: 'hi', 2: 'hi', 3: 'hi', 4: 'hi', 5: 'text', 6: 'dim' } as const;\n\nconst styles = StyleSheet.create((theme) => ({\n meta: {\n color: theme.colors.dim,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n },\n actions: { flexDirection: 'row', flexWrap: 'wrap' },\n root: { minWidth: 0, gap: theme.spacing(2) },\n prose: {\n color: theme.colors.text,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n heading: (level: MarkdownHeadingLevel) => ({\n marginTop: theme.spacing(HEADING_SPACE[level]),\n fontSize: theme.fontSize[HEADING_STEP[level]],\n lineHeight: theme.lineHeight[HEADING_STEP[level]],\n letterSpacing: theme.letterSpacing[HEADING_STEP[level]],\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors[HEADING_INK[level]],\n }),\n firstHeading: { marginTop: 0 },\n strong: { fontWeight: theme.fontWeight.semibold, color: theme.colors.hi },\n em: { fontStyle: 'italic' },\n code: {\n backgroundColor: theme.colors.deep,\n color: theme.colors.green,\n fontFamily: fontOf(theme.fontFamily.mono),\n },\n fileLink: { textDecorationLine: 'underline' },\n link: { color: theme.colors.blue, textDecorationLine: 'underline' },\n list: { gap: theme.spacing(0.5) },\n item: { flexDirection: 'row', gap: theme.spacing(2), paddingLeft: theme.spacing(1) },\n marker: { minWidth: theme.spacing(3), color: theme.colors.dim },\n itemText: { flexShrink: 1 },\n rule: { height: 1, backgroundColor: theme.colors['border-soft'] },\n // The web blockquote: a rule at the left and quieter text.\n quote: { borderLeftWidth: 2, borderLeftColor: theme.colors.border, paddingLeft: theme.spacing(3) },\n quoted: { color: theme.colors.dim },\n // The web table: bordered cells, the header on the deep surface.\n table: {\n flexDirection: 'row',\n borderTopWidth: 1,\n borderLeftWidth: 1,\n borderColor: theme.colors.border,\n },\n cell: {\n paddingHorizontal: theme.spacing(2),\n paddingVertical: theme.spacing(1),\n borderRightWidth: 1,\n borderBottomWidth: 1,\n borderColor: theme.colors.border,\n },\n headCell: { backgroundColor: theme.colors.deep, fontWeight: theme.fontWeight.semibold, color: theme.colors.hi },\n // The web image's frame: at most 480 tall, a soft border and rounded corners.\n image: {\n width: '100%',\n maxHeight: 480,\n borderRadius: theme.borderRadius.md,\n borderWidth: 1,\n borderColor: theme.colors.border,\n },\n imageState: { color: theme.colors.dim },\n}));\n"],"mappings":"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"}
1
+ {"version":3,"file":"Markdown.mjs","names":["createContext","memo","ReactNode","useContext","useEffect","useMemo","useState","Linking","StyleSheet","fontOf","MarkdownBlock","MarkdownHeadingLevel","MarkdownInline","parseMarkdown","READING","inlineLength","inlinePrefix","useReadingPage","CodeBlock","ShowMore","FileLinkHandler","text","explicit","InitialPageContext","FileLinkContext","undefined","MarkdownImageLoader","path","Promise","url","dispose","ImageContext","URL_OR_ANCHOR","DIRECT_IMAGE","PLACEHOLDER_RATIO","decoded","href","decodeURIComponent","InlineCode","originalText","onFileLink","open","includes","styles","code","fileLink","InlineLink","children","isFile","test","openURL","catch","link","MarkdownImage","src","alt","loader","source","startsWith","slice","split","loaded","setLoaded","failed","ratio","setRatio","active","asset","Awaited","ReturnType","resolve","then","Error","result","current","uri","waiting","prose","imageState","nativeEvent","fit","width","height","size","Image","getSize","image","aspectRatio","renderInline","nodes","map","node","index","type","strong","em","MarkdownTable","header","rows","initialPage","rowPage","setRows","columnPage","setColumns","cellPage","setCells","visibleRows","Math","max","visibleHeader","columns","limit","cell","clipped","row","length","some","root","table","column","headCell","meta","actions","page","Blocks","blocks","quoted","setPage","visible","parts","block","Infinity","BoundedBlock","props","first","revealedPage","characters","total","shown","items","reduce","sum","item","remaining","next","push","more","Block","heading","level","firstHeading","run","flush","list","marker","ordered","start","itemText","language","rule","quote","MarkdownProps","loadImage","Markdown","generation","HEADING_STEP","const","HEADING_SPACE","HEADING_INK","create","theme","color","colors","dim","fontFamily","sans","fontSize","sm","lineHeight","uni__dependencies","flexDirection","flexWrap","minWidth","gap","spacing","base","marginTop","letterSpacing","fontWeight","semibold","hi","fontStyle","backgroundColor","deep","green","mono","textDecorationLine","blue","paddingLeft","flexShrink","borderLeftWidth","borderLeftColor","border","borderTopWidth","borderColor","paddingHorizontal","paddingVertical","borderRightWidth","borderBottomWidth","maxHeight","borderRadius","md","borderWidth"],"sources":["../../src/components/Markdown.tsx"],"sourcesContent":["import { createContext, memo, type ReactNode, useContext, useEffect, useMemo, useState } from 'react';\nimport { Image, Linking, ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { fontOf } from '../lib/fonts';\nimport { type MarkdownBlock, type MarkdownHeadingLevel, type MarkdownInline, parseMarkdown } from '../lib/markdown';\nimport { READING, inlineLength, inlinePrefix } from '../lib/reading';\nimport { useReadingPage } from '../lib/useReadingPage';\nimport { CodeBlock } from './CodeBlock';\nimport { ShowMore } from './ShowMore';\n\n/*\n * Markdown in the web component's element styles, from the package's own\n * parser: headings, paragraphs, lists, code spans and fences, bold, italic,\n * links, images, blockquotes and tables. Web links open with Linking; a file\n * path goes to the host. Raw HTML blocks are left out, as on the web.\n */\n\n/**\n * What a piece of inline code or a relative link opens, when the host knows.\n * Returning undefined leaves it as plain code or an ordinary link. The same\n * contract as the web Markdown's handler.\n */\nexport type FileLinkHandler = (text: string, explicit?: boolean) => (() => void) | undefined;\n\n/** Passed by context so the inline renderers stay module functions. */\nconst InitialPageContext = createContext(1);\n\nconst FileLinkContext = createContext<FileLinkHandler | undefined>(undefined);\n\n/** Loads a relative image path from the host; the same contract as the web Markdown's `loadImage`. */\nexport type MarkdownImageLoader = (path: string) => Promise<{ url: string; dispose(): void }>;\n\nconst ImageContext = createContext<MarkdownImageLoader | undefined>(undefined);\n\nconst URL_OR_ANCHOR = /^(?:[a-z][a-z\\d+.-]*:|\\/\\/|#|\\?)/i;\n/** Sources an Image may load as written; any other scheme stays its alt text. */\nconst DIRECT_IMAGE = /^(?:https?:|data:image\\/)/i;\n/** Until the image reports its size, it holds a landscape box rather than collapsing. */\nconst PLACEHOLDER_RATIO = 16 / 9;\n\nfunction decoded(href: string): string | undefined {\n try {\n return decodeURIComponent(href);\n } catch {\n return undefined;\n }\n}\n\nfunction InlineCode({ text, originalText = text }: { text: string; originalText?: string }) {\n const onFileLink = useContext(FileLinkContext);\n const open = originalText.includes('\\n') ? undefined : onFileLink?.(originalText);\n if (open !== undefined) {\n return (\n <Text\n accessibilityRole=\"link\"\n accessibilityHint={`open ${originalText}`}\n onPress={open}\n style={[styles.code, styles.fileLink]}\n >\n {text}\n </Text>\n );\n }\n return <Text style={styles.code}>{text}</Text>;\n}\n\nfunction InlineLink({ href, children }: { href: string; children: ReactNode }) {\n const onFileLink = useContext(FileLinkContext);\n const path = decoded(href);\n const isFile = path !== undefined && path !== '' && !URL_OR_ANCHOR.test(path);\n const open = isFile ? onFileLink?.(path, true) : undefined;\n return (\n <Text\n accessibilityRole=\"link\"\n onPress={() => {\n if (open !== undefined) open();\n else if (!isFile) Linking.openURL(href).catch(() => undefined);\n }}\n style={styles.link}\n >\n {children}\n </Text>\n );\n}\n\n/** One image: a file path through the host's loader, or a web or data address as written. */\nfunction MarkdownImage({ src, alt }: { src: string; alt: string }) {\n const loader = useContext(ImageContext);\n // An invalid encoded filename is shown as unavailable, never fetched.\n const source = src.startsWith('@artifact:') ? src.slice(1) : src;\n const path =\n URL_OR_ANCHOR.test(source) && !source.startsWith('artifact:')\n ? undefined\n : (decoded(source.split(/[?#]/u, 1)[0]!) ?? '');\n const [loaded, setLoaded] = useState<{ path: string; url?: string; failed?: boolean }>();\n const [ratio, setRatio] = useState(PLACEHOLDER_RATIO);\n useEffect(() => {\n if (loader === undefined || path === undefined) return;\n let active = true;\n let asset: Awaited<ReturnType<MarkdownImageLoader>> | undefined;\n void Promise.resolve()\n .then(() => {\n if (path === '') throw new Error('Invalid image path.');\n return loader(path);\n })\n .then((result) => {\n if (!active) return result.dispose();\n asset = result;\n setLoaded({ path, url: result.url });\n })\n .catch(() => {\n // The failure is shown in place, as the web image does.\n if (active) setLoaded({ path, failed: true });\n });\n return () => {\n active = false;\n asset?.dispose();\n };\n }, [path, loader]);\n const current = loaded?.path === path ? loaded : undefined;\n const uri = path === undefined ? (DIRECT_IMAGE.test(src) ? src : undefined) : current?.url;\n if (uri === undefined || current?.failed) {\n const waiting = path !== undefined && loader !== undefined && current === undefined;\n return (\n <Text style={[styles.prose, styles.imageState]} accessibilityRole={waiting ? 'text' : 'alert'}>\n {alt || path || 'Image'} ({waiting ? 'loading\\u2026' : 'unavailable'})\n </Text>\n );\n }\n return (\n <Image\n source={{ uri }}\n accessibilityLabel={alt || 'Image'}\n accessibilityIgnoresInvertColors\n resizeMode=\"contain\"\n onLoad={({ nativeEvent }) => {\n const fit = (width: number, height: number) => {\n if (width > 0 && height > 0) setRatio(width / height);\n };\n // iOS and Android report the size with the event; react-native-web does not, so it asks.\n const size = (nativeEvent as { source?: { width: number; height: number } } | undefined)?.source;\n if (size !== undefined) fit(size.width, size.height);\n else Image.getSize(uri, fit, () => undefined);\n }}\n onError={() => setLoaded({ path: path ?? src, failed: true })}\n style={[styles.image, { aspectRatio: ratio }]}\n />\n );\n}\nfunction renderInline(nodes: readonly MarkdownInline[]): ReactNode[] {\n return nodes.map((node, index) => {\n switch (node.type) {\n case 'text':\n return node.text;\n case 'code':\n return <InlineCode key={index} text={node.text} originalText={node.originalText} />;\n case 'strong':\n return (\n <Text key={index} style={styles.strong}>\n {renderInline(node.children)}\n </Text>\n );\n case 'em':\n return (\n <Text key={index} style={styles.em}>\n {renderInline(node.children)}\n </Text>\n );\n case 'link':\n return (\n <InlineLink key={index} href={node.href}>\n {renderInline(node.children)}\n </InlineLink>\n );\n case 'image':\n // Inside a heading or list item an image keeps to its alt text; paragraphs draw it.\n return node.alt;\n }\n });\n}\n\n/**\n * A table read column by column: every cell keeps to one line inside the sideways scroll, so each\n * column takes its widest cell and the rows line up without a table layout.\n */\nfunction MarkdownTable({ header, rows }: { header: MarkdownInline[][]; rows: MarkdownInline[][][] }) {\n const initialPage = useContext(InitialPageContext);\n const [rowPage, setRows] = useState(initialPage);\n const [columnPage, setColumns] = useState(initialPage);\n const [cellPage, setCells] = useState(initialPage);\n const visibleRows = rows.slice(0, READING.rows * Math.max(initialPage, rowPage));\n const visibleHeader = header.slice(0, READING.columns * Math.max(initialPage, columnPage));\n const limit = READING.cell * Math.max(initialPage, cellPage);\n const clipped = [visibleHeader, ...visibleRows.map((row) => row.slice(0, visibleHeader.length))].some((row) =>\n row.some((cell) => inlineLength(cell) > limit),\n );\n return (\n <View style={styles.root}>\n <ScrollView horizontal showsHorizontalScrollIndicator={false}>\n <View style={styles.table}>\n {visibleHeader.map((cell, column) => (\n <View key={column}>\n <Text style={[styles.prose, styles.cell, styles.headCell]}>\n {renderInline(inlinePrefix(cell, limit))}\n {inlineLength(cell) > limit ? '…' : ''}\n </Text>\n {visibleRows.map((row, index) => (\n <Text key={index} style={[styles.prose, styles.cell]}>\n {renderInline(inlinePrefix(row[column] ?? [], limit))}\n {inlineLength(row[column] ?? []) > limit ? '…' : ''}\n </Text>\n ))}\n </View>\n ))}\n </View>\n </ScrollView>\n <Text style={styles.meta}>\n {visibleRows.length} of {rows.length} rows · {visibleHeader.length} of {header.length} columns\n {clipped ? ` · Cells: first ${limit} characters` : ''}\n </Text>\n <View style={styles.actions}>\n {visibleRows.length < rows.length ? (\n <ShowMore label=\"Show more rows\" onPress={() => setRows((page) => page + 1)} />\n ) : null}\n {visibleHeader.length < header.length ? (\n <ShowMore label=\"Show more columns\" onPress={() => setColumns((page) => page + 1)} />\n ) : null}\n {clipped ? <ShowMore label=\"Show more cell text\" onPress={() => setCells((page) => page + 1)} /> : null}\n </View>\n </View>\n );\n}\n\nfunction Blocks({ blocks, quoted = false }: { blocks: MarkdownBlock[]; quoted?: boolean }) {\n const initialPage = useContext(InitialPageContext);\n const [page, setPage] = useState(initialPage);\n const visible = blocks.slice(0, READING.parts * Math.max(initialPage, page));\n return (\n <InitialPageContext.Provider value={Math.max(initialPage, page)}>\n {visible.map((block, index) => (\n <BoundedBlock key={index} block={block} first={index === 0} quoted={quoted} />\n ))}\n {visible.length < blocks.length ? (\n <ShowMore\n label=\"Show more\"\n summary={`${visible.length} of ${blocks.length} parts`}\n onPress={() => setPage(Infinity)}\n />\n ) : null}\n </InitialPageContext.Provider>\n );\n}\n\nfunction BoundedBlock({ block, ...props }: { block: MarkdownBlock; first: boolean; quoted?: boolean }) {\n const initialPage = useContext(InitialPageContext);\n const [revealedPage, setPage] = useState(initialPage);\n const page = Math.max(initialPage, revealedPage);\n const limit = READING.characters * page;\n let visible = block;\n let total = 0;\n let shown = 0;\n if (block.type === 'heading' || block.type === 'paragraph') {\n total = inlineLength(block.children);\n const children = inlinePrefix(block.children, limit);\n shown = inlineLength(children);\n visible = { ...block, children };\n } else if (block.type === 'list') {\n total = block.items.reduce((sum, item) => sum + inlineLength(item), 0);\n let remaining = limit;\n const items = [];\n for (const item of block.items.slice(0, READING.parts * page)) {\n if (remaining <= 0) break;\n const next = inlinePrefix(item, remaining);\n items.push(next);\n const length = inlineLength(next);\n shown += length;\n remaining -= length;\n }\n visible = { ...block, items };\n }\n const more =\n shown < total || (block.type === 'list' && visible.type === 'list' && visible.items.length < block.items.length);\n return (\n <View style={styles.root}>\n <Block block={visible} {...props} />\n {more ? (\n <ShowMore\n label=\"Show more text\"\n summary={`${shown} of ${total} characters`}\n onPress={() => setPage(Infinity)}\n />\n ) : null}\n </View>\n );\n}\n\nfunction Block({ block, first, quoted = false }: { block: MarkdownBlock; first: boolean; quoted?: boolean }) {\n const initialPage = useContext(InitialPageContext);\n const prose = [styles.prose, quoted && styles.quoted];\n switch (block.type) {\n case 'heading':\n return (\n <Text\n accessibilityRole=\"header\"\n style={[...prose, styles.heading(block.level), first && styles.firstHeading, quoted && styles.quoted]}\n >\n {renderInline(block.children)}\n </Text>\n );\n case 'paragraph': {\n // An image breaks the paragraph's text into runs, since an Image cannot sit inside Text.\n const parts: ReactNode[] = [];\n let run: MarkdownInline[] = [];\n const flush = () => {\n if (run.length > 0)\n parts.push(\n <Text key={parts.length} style={prose}>\n {renderInline(run)}\n </Text>,\n );\n run = [];\n };\n for (const node of block.children) {\n if (node.type !== 'image') {\n run.push(node);\n continue;\n }\n flush();\n parts.push(<MarkdownImage key={parts.length} src={node.src} alt={node.alt} />);\n }\n flush();\n return parts.length === 1 ? parts[0] : <View style={styles.root}>{parts}</View>;\n }\n case 'list':\n return (\n <View accessibilityRole=\"list\" style={styles.list}>\n {block.items.map((item, index) => (\n <View key={index} style={styles.item}>\n <Text style={[...prose, styles.marker]}>{block.ordered ? `${block.start + index}.` : '\\u2022'}</Text>\n <Text style={[...prose, styles.itemText]}>{renderInline(item)}</Text>\n </View>\n ))}\n </View>\n );\n case 'code':\n return <CodeBlock text={block.text} language={block.language} initialPage={initialPage} />;\n case 'rule':\n return <View accessible={false} style={styles.rule} />;\n case 'quote':\n return (\n <View style={[styles.root, styles.quote]}>\n <Blocks blocks={block.children} quoted />\n </View>\n );\n case 'table':\n return <MarkdownTable header={block.header} rows={block.rows} />;\n }\n}\n\nexport interface MarkdownProps {\n text: string;\n onFileLink?: FileLinkHandler;\n /** Loads relative image paths; without it they show as unavailable. */\n loadImage?: MarkdownImageLoader;\n /** Initial reveal pages for a restored reading position. Defaults to one. */\n initialPage?: number;\n}\n\n/** Markdown in Po's shared presentation, parsed by the package's own small parser. */\nexport const Markdown = memo(function Markdown({ text, onFileLink, loadImage, initialPage = 1 }: MarkdownProps) {\n const blocks = useMemo(() => parseMarkdown(text), [text]);\n const { generation } = useReadingPage(text);\n return (\n <InitialPageContext.Provider value={initialPage}>\n <FileLinkContext.Provider value={onFileLink}>\n <ImageContext.Provider value={loadImage}>\n <View style={styles.root}>\n <Blocks key={generation} blocks={blocks} />\n </View>\n </ImageContext.Provider>\n </FileLinkContext.Provider>\n </InitialPageContext.Provider>\n );\n});\n\n/**\n * Headings step up from the prose and never shrink below it; h4 to h6 keep\n * the prose size and lean on weight, fading from `hi` to `dim`.\n */\nconst HEADING_STEP = { 1: '2xl', 2: 'xl', 3: 'lg', 4: 'base', 5: 'base', 6: 'base' } as const;\nconst HEADING_SPACE = { 1: 2, 2: 2, 3: 1, 4: 0, 5: 0, 6: 0 } as const;\nconst HEADING_INK = { 1: 'hi', 2: 'hi', 3: 'hi', 4: 'hi', 5: 'text', 6: 'dim' } as const;\n\nconst styles = StyleSheet.create((theme) => ({\n meta: {\n color: theme.colors.dim,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n },\n actions: { flexDirection: 'row', flexWrap: 'wrap' },\n root: { minWidth: 0, gap: theme.spacing(2) },\n prose: {\n color: theme.colors.text,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n heading: (level: MarkdownHeadingLevel) => ({\n marginTop: theme.spacing(HEADING_SPACE[level]),\n fontSize: theme.fontSize[HEADING_STEP[level]],\n lineHeight: theme.lineHeight[HEADING_STEP[level]],\n letterSpacing: theme.letterSpacing[HEADING_STEP[level]],\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors[HEADING_INK[level]],\n }),\n firstHeading: { marginTop: 0 },\n strong: { fontWeight: theme.fontWeight.semibold, color: theme.colors.hi },\n em: { fontStyle: 'italic' },\n code: {\n backgroundColor: theme.colors.deep,\n color: theme.colors.green,\n fontFamily: fontOf(theme.fontFamily.mono),\n },\n fileLink: { textDecorationLine: 'underline' },\n link: { color: theme.colors.blue, textDecorationLine: 'underline' },\n list: { gap: theme.spacing(0.5) },\n item: { flexDirection: 'row', gap: theme.spacing(2), paddingLeft: theme.spacing(1) },\n marker: { minWidth: theme.spacing(3), color: theme.colors.dim },\n itemText: { flexShrink: 1 },\n rule: { height: 1, backgroundColor: theme.colors['border-soft'] },\n // The web blockquote: a rule at the left and quieter text.\n quote: { borderLeftWidth: 2, borderLeftColor: theme.colors.border, paddingLeft: theme.spacing(3) },\n quoted: { color: theme.colors.dim },\n // The web table: bordered cells, the header on the deep surface.\n table: {\n flexDirection: 'row',\n borderTopWidth: 1,\n borderLeftWidth: 1,\n borderColor: theme.colors.border,\n },\n cell: {\n paddingHorizontal: theme.spacing(2),\n paddingVertical: theme.spacing(1),\n borderRightWidth: 1,\n borderBottomWidth: 1,\n borderColor: theme.colors.border,\n },\n headCell: { backgroundColor: theme.colors.deep, fontWeight: theme.fontWeight.semibold, color: theme.colors.hi },\n // The web image's frame: at most 480 tall, a soft border and rounded corners.\n image: {\n width: '100%',\n maxHeight: 480,\n borderRadius: theme.borderRadius.md,\n borderWidth: 1,\n borderColor: theme.colors.border,\n },\n imageState: { color: theme.colors.dim },\n}));\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agimon-ai/po-native-components",
3
- "version": "0.0.0-alpha.122",
3
+ "version": "0.0.0-alpha.124",
4
4
  "description": "Shared React Native components for Po and its native plugins: the web component library's look and API on native parts, tuned to the Po palette.",
5
5
  "keywords": [
6
6
  "ai",
@@ -49,12 +49,12 @@
49
49
  "access": "public"
50
50
  },
51
51
  "dependencies": {
52
- "@agimon-ai/po-web-components": "0.0.0-alpha.122"
52
+ "@agimon-ai/po-web-components": "0.0.0-alpha.124"
53
53
  },
54
54
  "devDependencies": {
55
- "@agimon-ai/po-build": "0.0.0-alpha.122",
56
- "@agimon-ai/po-core": "0.0.0-alpha.122",
57
- "@agimon-ai/vibe-lint-plugin-po-web": "0.0.0-alpha.122",
55
+ "@agimon-ai/po-build": "0.0.0-alpha.124",
56
+ "@agimon-ai/po-core": "0.0.0-alpha.124",
57
+ "@agimon-ai/vibe-lint-plugin-po-web": "0.0.0-alpha.124",
58
58
  "@babel/core": "7.29.7",
59
59
  "@expo/vector-icons": "15.1.1",
60
60
  "@fontsource-variable/ibm-plex-sans": "5.3.0",