@activecollab/components 2.0.411 → 2.0.412

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.
Files changed (31) hide show
  1. package/dist/cjs/components/PortableText/PortableText.js +12 -1
  2. package/dist/cjs/components/PortableText/PortableText.js.map +1 -1
  3. package/dist/cjs/components/PortableText/Styles.js +31 -2
  4. package/dist/cjs/components/PortableText/Styles.js.map +1 -1
  5. package/dist/cjs/components/PortableText/renderers.js +46 -2
  6. package/dist/cjs/components/PortableText/renderers.js.map +1 -1
  7. package/dist/cjs/components/PortableText/types.js +20 -2
  8. package/dist/cjs/components/PortableText/types.js.map +1 -1
  9. package/dist/cjs/components/PortableText/types.test.js +78 -1
  10. package/dist/cjs/components/PortableText/types.test.js.map +1 -1
  11. package/dist/esm/components/PortableText/PortableText.d.ts.map +1 -1
  12. package/dist/esm/components/PortableText/PortableText.js +8 -1
  13. package/dist/esm/components/PortableText/PortableText.js.map +1 -1
  14. package/dist/esm/components/PortableText/Styles.d.ts +14 -0
  15. package/dist/esm/components/PortableText/Styles.d.ts.map +1 -1
  16. package/dist/esm/components/PortableText/Styles.js +30 -1
  17. package/dist/esm/components/PortableText/Styles.js.map +1 -1
  18. package/dist/esm/components/PortableText/renderers.d.ts.map +1 -1
  19. package/dist/esm/components/PortableText/renderers.js +35 -3
  20. package/dist/esm/components/PortableText/renderers.js.map +1 -1
  21. package/dist/esm/components/PortableText/types.d.ts +31 -1
  22. package/dist/esm/components/PortableText/types.d.ts.map +1 -1
  23. package/dist/esm/components/PortableText/types.js +15 -1
  24. package/dist/esm/components/PortableText/types.js.map +1 -1
  25. package/dist/esm/components/PortableText/types.test.js +78 -1
  26. package/dist/esm/components/PortableText/types.test.js.map +1 -1
  27. package/dist/index.js +105 -3
  28. package/dist/index.js.map +1 -1
  29. package/dist/index.min.js +1 -1
  30. package/dist/index.min.js.map +1 -1
  31. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"PortableText.js","names":["React","Fragment","forwardRef","useMemo","portableTextDefaultBlockRenderers","portableTextDefaultMarkRenderers","isPortableTextBlock","isPortableTextContent","isPortableTextObjectNode","isPortableTextSpan","Stack","defaultUnknownTypeHandler","kind","type","console","warn","renderSpan","span","ctx","_span$marks","marks","reduce","children","mark","_ctx$components$marks","_ctx$components","Renderer","components","report","createElement","undefined","text","renderBlockChildren","block","_ref","content","Array","isArray","map","child","index","key","renderBlock","renderNodes","_ctx$components$block","_ctx$components2","blocks","renderObject","node","_ctx$components3","objects","_type","nodes","PortableText","_ref2","ref","_ref2$space","space","rest","_objectWithoutPropertiesLoose","_excluded","reported","Set","_components$onUnknown","has","add","onUnknownType","_extends","displayName"],"sources":["../../../../src/components/PortableText/PortableText.tsx"],"sourcesContent":["import React, { Fragment, ReactNode, forwardRef, useMemo } from \"react\";\n\nimport {\n portableTextDefaultBlockRenderers,\n portableTextDefaultMarkRenderers,\n} from \"./renderers\";\nimport {\n isPortableTextBlock,\n isPortableTextContent,\n isPortableTextObjectNode,\n isPortableTextSpan,\n PortableTextBlock,\n PortableTextComponents,\n PortableTextContent,\n PortableTextDefaultBlockType,\n PortableTextDefaultMark,\n PortableTextListItemBlock,\n PortableTextObjectNode,\n PortableTextSpan,\n PortableTextUnknownTypeHandler,\n} from \"./types\";\nimport { Space } from \"../LayoutTokens\";\nimport { Stack } from \"../Stack\";\n\nexport interface IPortableTextProps\n extends Omit<React.ComponentPropsWithoutRef<\"div\">, \"content\"> {\n /** The message body: the node list an API returns under `content`. */\n content: PortableTextContent;\n /**\n * Application-injected renderers: catalog marks and objects, optional\n * default-block overrides, and the unknown-type hook. See README.md.\n */\n components?: PortableTextComponents;\n /** Vertical rhythm between top-level nodes. */\n space?: Space;\n}\n\ninterface IWalkContext {\n components?: PortableTextComponents;\n report: PortableTextUnknownTypeHandler;\n}\n\nconst defaultUnknownTypeHandler: PortableTextUnknownTypeHandler = (\n kind,\n type\n) => {\n console.warn(`PortableText: no renderer for ${kind} type \"${type}\".`);\n};\n\n/**\n * A span's marks wrap its text inside out. An unknown mark is reported and\n * skipped — the text stays, because dropping a word would break the sentence.\n */\nconst renderSpan = (span: PortableTextSpan, ctx: IWalkContext): ReactNode =>\n (span.marks ?? []).reduce<ReactNode>((children, mark) => {\n const type = typeof mark === \"string\" ? mark : mark.type;\n const Renderer =\n ctx.components?.marks?.[type] ??\n portableTextDefaultMarkRenderers[type as PortableTextDefaultMark];\n\n if (!Renderer) {\n ctx.report(\"mark\", type);\n return children;\n }\n\n return (\n <Renderer mark={typeof mark === \"string\" ? undefined : mark}>\n {children}\n </Renderer>\n );\n }, span.text);\n\n/**\n * Traversal is structural, so the walker keeps no list of block types of its\n * own: a `children` array holds spans or nested blocks, a nested `content`\n * holds a node list, and anything else has no children to render.\n */\nconst renderBlockChildren = (\n block: PortableTextBlock | PortableTextListItemBlock,\n ctx: IWalkContext\n): ReactNode => {\n const { children, content } = block as {\n children?: unknown;\n content?: unknown;\n };\n\n if (Array.isArray(children)) {\n return children.map((child, index) => (\n <Fragment key={index}>\n {isPortableTextSpan(child)\n ? renderSpan(child, ctx)\n : isPortableTextBlock(child)\n ? renderBlock(child, ctx)\n : null}\n </Fragment>\n ));\n }\n\n return isPortableTextContent(content) ? renderNodes(content, ctx) : undefined;\n};\n\nconst renderBlock = (\n block: PortableTextBlock | PortableTextListItemBlock,\n ctx: IWalkContext\n): ReactNode => {\n const type = block.type as PortableTextDefaultBlockType;\n const Renderer =\n ctx.components?.blocks?.[type] ?? portableTextDefaultBlockRenderers[type];\n\n if (!Renderer) {\n ctx.report(\"block\", block.type);\n return null;\n }\n\n return (\n <Renderer block={block as PortableTextBlock}>\n {renderBlockChildren(block, ctx)}\n </Renderer>\n );\n};\n\nconst renderObject = (\n node: PortableTextObjectNode,\n ctx: IWalkContext\n): ReactNode => {\n const Renderer = ctx.components?.objects?.[node._type];\n\n if (!Renderer) {\n ctx.report(\"object\", node._type);\n return null;\n }\n\n return (\n <Renderer node={node}>\n {isPortableTextContent(node.content)\n ? renderNodes(node.content, ctx)\n : undefined}\n </Renderer>\n );\n};\n\nconst renderNodes = (\n nodes: PortableTextContent,\n ctx: IWalkContext\n): ReactNode =>\n nodes.map((node, index) => (\n <Fragment key={index}>\n {isPortableTextObjectNode(node)\n ? renderObject(node, ctx)\n : renderBlock(node, ctx)}\n </Fragment>\n ));\n\n/**\n * The Portable Text engine: walks a {@link PortableTextContent} envelope and\n * renders it with the default renderers for the universal set, plus whatever\n * the application injects through `components`. The engine itself is hollow —\n * it knows no product element; an unknown block or object renders nothing and\n * is reported once per type through `onUnknownType` (console.warn when the\n * hook is absent).\n */\nexport const PortableText = forwardRef<HTMLDivElement, IPortableTextProps>(\n ({ content, components, space = \"md\", ...rest }, ref) => {\n // Memoized so unknown types are reported once per type for a given\n // content/components pair, not again on every parent re-render.\n const nodes = useMemo(() => {\n const reported = new Set<string>();\n const report: PortableTextUnknownTypeHandler = (kind, type) => {\n const key = `${kind}:${type}`;\n if (reported.has(key)) return;\n reported.add(key);\n (components?.onUnknownType ?? defaultUnknownTypeHandler)(kind, type);\n };\n\n return renderNodes(content, { components, report });\n }, [content, components]);\n\n return (\n <Stack ref={ref} space={space} {...rest}>\n {nodes}\n </Stack>\n );\n }\n);\n\nPortableText.displayName = \"PortableText\";\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"PortableText.js","names":["React","Fragment","forwardRef","useMemo","portableTextDefaultBlockRenderers","portableTextDefaultMarkRenderers","isPortableTextBlock","isPortableTextContent","isPortableTextObjectNode","isPortableTextSpan","Stack","defaultUnknownTypeHandler","kind","type","console","warn","renderSpan","span","ctx","_span$marks","marks","reduce","children","mark","_ctx$components$marks","_ctx$components","Renderer","components","report","createElement","undefined","text","renderBlockChildren","block","_ref","content","Array","isArray","map","child","index","key","renderBlock","renderNodes","_ctx$components$block","_ctx$components2","blocks","renderSpans","spans","renderObject","node","_ctx$components3","objects","_type","nodes","PortableText","_ref2","ref","_ref2$space","space","rest","_objectWithoutPropertiesLoose","_excluded","reported","Set","_components$onUnknown","has","add","onUnknownType","_extends","displayName"],"sources":["../../../../src/components/PortableText/PortableText.tsx"],"sourcesContent":["import React, { Fragment, ReactNode, forwardRef, useMemo } from \"react\";\n\nimport {\n portableTextDefaultBlockRenderers,\n portableTextDefaultMarkRenderers,\n} from \"./renderers\";\nimport {\n isPortableTextBlock,\n isPortableTextContent,\n isPortableTextObjectNode,\n isPortableTextSpan,\n PortableTextBlock,\n PortableTextComponents,\n PortableTextContent,\n PortableTextDefaultBlockType,\n PortableTextDefaultMark,\n PortableTextListItemBlock,\n PortableTextObjectNode,\n PortableTextSpan,\n PortableTextUnknownTypeHandler,\n} from \"./types\";\nimport { Space } from \"../LayoutTokens\";\nimport { Stack } from \"../Stack\";\n\nexport interface IPortableTextProps\n extends Omit<React.ComponentPropsWithoutRef<\"div\">, \"content\"> {\n /** The message body: the node list an API returns under `content`. */\n content: PortableTextContent;\n /**\n * Application-injected renderers: catalog marks and objects, optional\n * default-block overrides, and the unknown-type hook. See README.md.\n */\n components?: PortableTextComponents;\n /** Vertical rhythm between top-level nodes. */\n space?: Space;\n}\n\ninterface IWalkContext {\n components?: PortableTextComponents;\n report: PortableTextUnknownTypeHandler;\n}\n\nconst defaultUnknownTypeHandler: PortableTextUnknownTypeHandler = (\n kind,\n type\n) => {\n console.warn(`PortableText: no renderer for ${kind} type \"${type}\".`);\n};\n\n/**\n * A span's marks wrap its text inside out. An unknown mark is reported and\n * skipped — the text stays, because dropping a word would break the sentence.\n */\nconst renderSpan = (span: PortableTextSpan, ctx: IWalkContext): ReactNode =>\n (span.marks ?? []).reduce<ReactNode>((children, mark) => {\n const type = typeof mark === \"string\" ? mark : mark.type;\n const Renderer =\n ctx.components?.marks?.[type] ??\n portableTextDefaultMarkRenderers[type as PortableTextDefaultMark];\n\n if (!Renderer) {\n ctx.report(\"mark\", type);\n return children;\n }\n\n return (\n <Renderer mark={typeof mark === \"string\" ? undefined : mark}>\n {children}\n </Renderer>\n );\n }, span.text);\n\n/**\n * Traversal is structural, so the walker keeps no list of block types of its\n * own: a `children` array holds spans or nested blocks, a nested `content`\n * holds a node list, and anything else has no children to render.\n */\nconst renderBlockChildren = (\n block: PortableTextBlock | PortableTextListItemBlock,\n ctx: IWalkContext\n): ReactNode => {\n const { children, content } = block as {\n children?: unknown;\n content?: unknown;\n };\n\n if (Array.isArray(children)) {\n return children.map((child, index) => (\n <Fragment key={index}>\n {isPortableTextSpan(child)\n ? renderSpan(child, ctx)\n : isPortableTextBlock(child)\n ? renderBlock(child, ctx)\n : null}\n </Fragment>\n ));\n }\n\n return isPortableTextContent(content) ? renderNodes(content, ctx) : undefined;\n};\n\nconst renderBlock = (\n block: PortableTextBlock | PortableTextListItemBlock,\n ctx: IWalkContext\n): ReactNode => {\n const type = block.type as PortableTextDefaultBlockType;\n const Renderer =\n ctx.components?.blocks?.[type] ?? portableTextDefaultBlockRenderers[type];\n\n if (!Renderer) {\n ctx.report(\"block\", block.type);\n return null;\n }\n\n // Blocks that carry spans outside `children` (table cells) render them\n // through this engine-bound helper, so mark injection works there too.\n const renderSpans = (spans: PortableTextSpan[]): ReactNode =>\n spans.map((span, index) => (\n <Fragment key={index}>{renderSpan(span, ctx)}</Fragment>\n ));\n\n return (\n <Renderer block={block as PortableTextBlock} renderSpans={renderSpans}>\n {renderBlockChildren(block, ctx)}\n </Renderer>\n );\n};\n\nconst renderObject = (\n node: PortableTextObjectNode,\n ctx: IWalkContext\n): ReactNode => {\n const Renderer = ctx.components?.objects?.[node._type];\n\n if (!Renderer) {\n ctx.report(\"object\", node._type);\n return null;\n }\n\n return (\n <Renderer node={node}>\n {isPortableTextContent(node.content)\n ? renderNodes(node.content, ctx)\n : undefined}\n </Renderer>\n );\n};\n\nconst renderNodes = (\n nodes: PortableTextContent,\n ctx: IWalkContext\n): ReactNode =>\n nodes.map((node, index) => (\n <Fragment key={index}>\n {isPortableTextObjectNode(node)\n ? renderObject(node, ctx)\n : renderBlock(node, ctx)}\n </Fragment>\n ));\n\n/**\n * The Portable Text engine: walks a {@link PortableTextContent} envelope and\n * renders it with the default renderers for the universal set, plus whatever\n * the application injects through `components`. The engine itself is hollow —\n * it knows no product element; an unknown block or object renders nothing and\n * is reported once per type through `onUnknownType` (console.warn when the\n * hook is absent).\n */\nexport const PortableText = forwardRef<HTMLDivElement, IPortableTextProps>(\n ({ content, components, space = \"md\", ...rest }, ref) => {\n // Memoized so unknown types are reported once per type for a given\n // content/components pair, not again on every parent re-render.\n const nodes = useMemo(() => {\n const reported = new Set<string>();\n const report: PortableTextUnknownTypeHandler = (kind, type) => {\n const key = `${kind}:${type}`;\n if (reported.has(key)) return;\n reported.add(key);\n (components?.onUnknownType ?? defaultUnknownTypeHandler)(kind, type);\n };\n\n return renderNodes(content, { components, report });\n }, [content, components]);\n\n return (\n <Stack ref={ref} space={space} {...rest}>\n {nodes}\n </Stack>\n );\n }\n);\n\nPortableText.displayName = \"PortableText\";\n"],"mappings":"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","ignoreList":[]}
@@ -2,6 +2,20 @@
2
2
  export declare const StyledCode: import("styled-components").StyledComponent<"code", any, {}, never>;
3
3
  /** The default `link` mark: an inline text link inside flowing content. */
4
4
  export declare const StyledLink: import("styled-components").StyledComponent<"a", any, {}, never>;
5
+ /**
6
+ * The default `code-block`: quiet preformatted content. It stays a bare
7
+ * `<pre><code>` on purpose — article surfaces inject a Copy button onto
8
+ * every `<pre>` they render.
9
+ */
10
+ export declare const StyledCodeBlock: import("styled-components").StyledComponent<"pre", any, {}, never>;
11
+ /**
12
+ * The default `table` block wrapper: Table ships page-level chrome (outer
13
+ * margins) that flowing content does not want — the PortableText Stack owns
14
+ * the vertical rhythm here.
15
+ */
16
+ export declare const StyledTableBlock: import("styled-components").StyledComponent<"div", any, {}, never>;
17
+ /** The default `divider` block: a themed horizontal rule. */
18
+ export declare const StyledDivider: import("styled-components").StyledComponent<"hr", any, {}, never>;
5
19
  /** The default `list` block; rendered as ul or ol through the `as` prop. */
6
20
  export declare const StyledList: import("styled-components").StyledComponent<"ul", any, {
7
21
  $ordered: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"Styles.d.ts","sourceRoot":"","sources":["../../../../src/components/PortableText/Styles.ts"],"names":[],"mappings":"AAKA,+EAA+E;AAC/E,eAAO,MAAM,UAAU,qEAMtB,CAAC;AAIF,2EAA2E;AAC3E,eAAO,MAAM,UAAU,kEAQtB,CAAC;AAIF,4EAA4E;AAC5E,eAAO,MAAM,UAAU;cAAyB,OAAO;SAQtD,CAAC"}
1
+ {"version":3,"file":"Styles.d.ts","sourceRoot":"","sources":["../../../../src/components/PortableText/Styles.ts"],"names":[],"mappings":"AAKA,+EAA+E;AAC/E,eAAO,MAAM,UAAU,qEAMtB,CAAC;AAIF,2EAA2E;AAC3E,eAAO,MAAM,UAAU,kEAQtB,CAAC;AAIF;;;;GAIG;AACH,eAAO,MAAM,eAAe,oEAY3B,CAAC;AAIF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,oEAI5B,CAAC;AAIF,6DAA6D;AAC7D,eAAO,MAAM,aAAa,mEAIzB,CAAC;AAIF,4EAA4E;AAC5E,eAAO,MAAM,UAAU;cAAyB,OAAO;SAQtD,CAAC"}
@@ -15,10 +15,39 @@ export const StyledLink = styled.a.withConfig({
15
15
  })(["color:var(--color-primary);text-decoration:underline var(--color-primary);text-underline-offset:3px;&:hover{text-decoration:none;}"]);
16
16
  StyledLink.displayName = "StyledLink";
17
17
 
18
+ /**
19
+ * The default `code-block`: quiet preformatted content. It stays a bare
20
+ * `<pre><code>` on purpose — article surfaces inject a Copy button onto
21
+ * every `<pre>` they render.
22
+ */
23
+ export const StyledCodeBlock = styled.pre.withConfig({
24
+ displayName: "Styles__StyledCodeBlock",
25
+ componentId: "sc-1fss4z4-2"
26
+ })(["margin:0;padding:", ";border-radius:", ";background-color:var(--color-theme-200);overflow-x:auto;code{font-family:\"SFMono-Regular\",Menlo,Consolas,\"Liberation Mono\",monospace;font-size:", ";color:var(--color-theme-900);}"], SPACE.md, "0.5rem", "0.875rem");
27
+ StyledCodeBlock.displayName = "StyledCodeBlock";
28
+
29
+ /**
30
+ * The default `table` block wrapper: Table ships page-level chrome (outer
31
+ * margins) that flowing content does not want — the PortableText Stack owns
32
+ * the vertical rhythm here.
33
+ */
34
+ export const StyledTableBlock = styled.div.withConfig({
35
+ displayName: "Styles__StyledTableBlock",
36
+ componentId: "sc-1fss4z4-3"
37
+ })([".c-table__wrap{margin:0;}"]);
38
+ StyledTableBlock.displayName = "StyledTableBlock";
39
+
40
+ /** The default `divider` block: a themed horizontal rule. */
41
+ export const StyledDivider = styled.hr.withConfig({
42
+ displayName: "Styles__StyledDivider",
43
+ componentId: "sc-1fss4z4-4"
44
+ })(["margin:0;border:none;border-top:1px solid var(--border-primary);"]);
45
+ StyledDivider.displayName = "StyledDivider";
46
+
18
47
  /** The default `list` block; rendered as ul or ol through the `as` prop. */
19
48
  export const StyledList = styled.ul.withConfig({
20
49
  displayName: "Styles__StyledList",
21
- componentId: "sc-1fss4z4-2"
50
+ componentId: "sc-1fss4z4-5"
22
51
  })(["margin:0;padding-left:", ";list-style:", " outside;li + li{margin-top:", ";}"], "1.25rem", _ref => {
23
52
  let $ordered = _ref.$ordered;
24
53
  return $ordered ? "decimal" : "disc";
@@ -1 +1 @@
1
- {"version":3,"file":"Styles.js","names":["styled","SPACE","StyledCode","code","withConfig","displayName","componentId","StyledLink","a","StyledList","ul","_ref","$ordered","xs"],"sources":["../../../../src/components/PortableText/Styles.ts"],"sourcesContent":["import styled from \"styled-components\";\nimport { theme } from \"twin.macro\";\n\nimport { SPACE } from \"../LayoutTokens\";\n\n/** The default `code` mark: a quiet inline chip that keeps the line intact. */\nexport const StyledCode = styled.code`\n padding: 0 ${theme(\"spacing.1\")};\n border-radius: ${theme(\"borderRadius.DEFAULT\")};\n background-color: var(--color-theme-300);\n font-family: \"SFMono-Regular\", Menlo, Consolas, \"Liberation Mono\", monospace;\n font-size: 0.85em;\n`;\n\nStyledCode.displayName = \"StyledCode\";\n\n/** The default `link` mark: an inline text link inside flowing content. */\nexport const StyledLink = styled.a`\n color: var(--color-primary);\n text-decoration: underline var(--color-primary);\n text-underline-offset: 3px;\n\n &:hover {\n text-decoration: none;\n }\n`;\n\nStyledLink.displayName = \"StyledLink\";\n\n/** The default `list` block; rendered as ul or ol through the `as` prop. */\nexport const StyledList = styled.ul<{ $ordered: boolean }>`\n margin: 0;\n padding-left: ${theme(\"spacing.5\")};\n list-style: ${({ $ordered }) => ($ordered ? \"decimal\" : \"disc\")} outside;\n\n li + li {\n margin-top: ${SPACE.xs};\n }\n`;\n\nStyledList.displayName = \"StyledList\";\n"],"mappings":"AAAA,OAAOA,MAAM,MAAM,mBAAmB;AAGtC,SAASC,KAAK,QAAQ,iBAAiB;;AAEvC;AACA,OAAO,MAAMC,UAAU,GAAGF,MAAM,CAACG,IAAI,CAAAC,UAAA;EAAAC,WAAA;EAAAC,WAAA;AAAA,gLACtB,SAAkB,EACd,SAA6B,CAI/C;AAEDJ,UAAU,CAACG,WAAW,GAAG,YAAY;;AAErC;AACA,OAAO,MAAME,UAAU,GAAGP,MAAM,CAACQ,CAAC,CAAAJ,UAAA;EAAAC,WAAA;EAAAC,WAAA;AAAA,0IAQjC;AAEDC,UAAU,CAACF,WAAW,GAAG,YAAY;;AAErC;AACA,OAAO,MAAMI,UAAU,GAAGT,MAAM,CAACU,EAAE,CAAAN,UAAA;EAAAC,WAAA;EAAAC,WAAA;AAAA,qFAEjB,SAAkB,EACpBK,IAAA;EAAA,IAAGC,QAAQ,GAAAD,IAAA,CAARC,QAAQ;EAAA,OAAQA,QAAQ,GAAG,SAAS,GAAG,MAAM;AAAA,CAAC,EAG/CX,KAAK,CAACY,EAAE,CAEzB;AAEDJ,UAAU,CAACJ,WAAW,GAAG,YAAY","ignoreList":[]}
1
+ {"version":3,"file":"Styles.js","names":["styled","SPACE","StyledCode","code","withConfig","displayName","componentId","StyledLink","a","StyledCodeBlock","pre","md","StyledTableBlock","div","StyledDivider","hr","StyledList","ul","_ref","$ordered","xs"],"sources":["../../../../src/components/PortableText/Styles.ts"],"sourcesContent":["import styled from \"styled-components\";\nimport { theme } from \"twin.macro\";\n\nimport { SPACE } from \"../LayoutTokens\";\n\n/** The default `code` mark: a quiet inline chip that keeps the line intact. */\nexport const StyledCode = styled.code`\n padding: 0 ${theme(\"spacing.1\")};\n border-radius: ${theme(\"borderRadius.DEFAULT\")};\n background-color: var(--color-theme-300);\n font-family: \"SFMono-Regular\", Menlo, Consolas, \"Liberation Mono\", monospace;\n font-size: 0.85em;\n`;\n\nStyledCode.displayName = \"StyledCode\";\n\n/** The default `link` mark: an inline text link inside flowing content. */\nexport const StyledLink = styled.a`\n color: var(--color-primary);\n text-decoration: underline var(--color-primary);\n text-underline-offset: 3px;\n\n &:hover {\n text-decoration: none;\n }\n`;\n\nStyledLink.displayName = \"StyledLink\";\n\n/**\n * The default `code-block`: quiet preformatted content. It stays a bare\n * `<pre><code>` on purpose — article surfaces inject a Copy button onto\n * every `<pre>` they render.\n */\nexport const StyledCodeBlock = styled.pre`\n margin: 0;\n padding: ${SPACE.md};\n border-radius: ${theme(\"borderRadius.lg\")};\n background-color: var(--color-theme-200);\n overflow-x: auto;\n\n code {\n font-family: \"SFMono-Regular\", Menlo, Consolas, \"Liberation Mono\", monospace;\n font-size: ${theme(\"fontSize.body-2\")};\n color: var(--color-theme-900);\n }\n`;\n\nStyledCodeBlock.displayName = \"StyledCodeBlock\";\n\n/**\n * The default `table` block wrapper: Table ships page-level chrome (outer\n * margins) that flowing content does not want — the PortableText Stack owns\n * the vertical rhythm here.\n */\nexport const StyledTableBlock = styled.div`\n .c-table__wrap {\n margin: 0;\n }\n`;\n\nStyledTableBlock.displayName = \"StyledTableBlock\";\n\n/** The default `divider` block: a themed horizontal rule. */\nexport const StyledDivider = styled.hr`\n margin: 0;\n border: none;\n border-top: 1px solid var(--border-primary);\n`;\n\nStyledDivider.displayName = \"StyledDivider\";\n\n/** The default `list` block; rendered as ul or ol through the `as` prop. */\nexport const StyledList = styled.ul<{ $ordered: boolean }>`\n margin: 0;\n padding-left: ${theme(\"spacing.5\")};\n list-style: ${({ $ordered }) => ($ordered ? \"decimal\" : \"disc\")} outside;\n\n li + li {\n margin-top: ${SPACE.xs};\n }\n`;\n\nStyledList.displayName = \"StyledList\";\n"],"mappings":"AAAA,OAAOA,MAAM,MAAM,mBAAmB;AAGtC,SAASC,KAAK,QAAQ,iBAAiB;;AAEvC;AACA,OAAO,MAAMC,UAAU,GAAGF,MAAM,CAACG,IAAI,CAAAC,UAAA;EAAAC,WAAA;EAAAC,WAAA;AAAA,gLACtB,SAAkB,EACd,SAA6B,CAI/C;AAEDJ,UAAU,CAACG,WAAW,GAAG,YAAY;;AAErC;AACA,OAAO,MAAME,UAAU,GAAGP,MAAM,CAACQ,CAAC,CAAAJ,UAAA;EAAAC,WAAA;EAAAC,WAAA;AAAA,0IAQjC;AAEDC,UAAU,CAACF,WAAW,GAAG,YAAY;;AAErC;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMI,eAAe,GAAGT,MAAM,CAACU,GAAG,CAAAN,UAAA;EAAAC,WAAA;EAAAC,WAAA;AAAA,wOAE5BL,KAAK,CAACU,EAAE,EACF,QAAwB,EAM1B,UAAwB,CAGxC;AAEDF,eAAe,CAACJ,WAAW,GAAG,iBAAiB;;AAE/C;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMO,gBAAgB,GAAGZ,MAAM,CAACa,GAAG,CAAAT,UAAA;EAAAC,WAAA;EAAAC,WAAA;AAAA,iCAIzC;AAEDM,gBAAgB,CAACP,WAAW,GAAG,kBAAkB;;AAEjD;AACA,OAAO,MAAMS,aAAa,GAAGd,MAAM,CAACe,EAAE,CAAAX,UAAA;EAAAC,WAAA;EAAAC,WAAA;AAAA,wEAIrC;AAEDQ,aAAa,CAACT,WAAW,GAAG,eAAe;;AAE3C;AACA,OAAO,MAAMW,UAAU,GAAGhB,MAAM,CAACiB,EAAE,CAAAb,UAAA;EAAAC,WAAA;EAAAC,WAAA;AAAA,qFAEjB,SAAkB,EACpBY,IAAA;EAAA,IAAGC,QAAQ,GAAAD,IAAA,CAARC,QAAQ;EAAA,OAAQA,QAAQ,GAAG,SAAS,GAAG,MAAM;AAAA,CAAC,EAG/ClB,KAAK,CAACmB,EAAE,CAEzB;AAEDJ,UAAU,CAACX,WAAW,GAAG,YAAY","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"renderers.d.ts","sourceRoot":"","sources":["../../../../src/components/PortableText/renderers.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,yBAAyB,EACzB,4BAA4B,EAC5B,uBAAuB,EAKvB,wBAAwB,EAGzB,MAAM,SAAS,CAAC;AAUjB;;;;GAIG;AAEH,eAAO,MAAM,gCAAgC,EAAE,MAAM,CACnD,uBAAuB,EACvB,wBAAwB,CAoBzB,CAAC;AA8CF,eAAO,MAAM,iCAAiC,EAAE,MAAM,CACpD,4BAA4B,EAC5B,yBAAyB,CA6B1B,CAAC"}
1
+ {"version":3,"file":"renderers.d.ts","sourceRoot":"","sources":["../../../../src/components/PortableText/renderers.tsx"],"names":[],"mappings":"AAUA,OAAO,EACL,yBAAyB,EAEzB,4BAA4B,EAC5B,uBAAuB,EAKvB,wBAAwB,EAKzB,MAAM,SAAS,CAAC;AAWjB;;;;GAIG;AAEH,eAAO,MAAM,gCAAgC,EAAE,MAAM,CACnD,uBAAuB,EACvB,wBAAwB,CAoBzB,CAAC;AA8CF,eAAO,MAAM,iCAAiC,EAAE,MAAM,CACpD,4BAA4B,EAC5B,yBAAyB,CA0E1B,CAAC"}
@@ -1,6 +1,7 @@
1
- import React from "react";
2
- import { StyledCode, StyledLink, StyledList } from "./Styles";
1
+ import React, { Fragment } from "react";
2
+ import { StyledCode, StyledCodeBlock, StyledDivider, StyledLink, StyledList, StyledTableBlock } from "./Styles";
3
3
  import { Media } from "../Media";
4
+ import { Table, Tbody, Thead } from "../Tables";
4
5
  import { TitledText, titledTextHeadings } from "../TitledText";
5
6
  import { Body1 } from "../Typography";
6
7
  import { Typography } from "../Typography/Typography";
@@ -125,6 +126,37 @@ export const portableTextDefaultBlockRenderers = {
125
126
  title: title,
126
127
  variant: headingVariantForLevel(level)
127
128
  }, children);
128
- }
129
+ },
130
+ // No highlighter ships with the default set, so every language — known,
131
+ // unknown or absent — is plain preformatted text; the hint travels on
132
+ // data-language for surfaces that highlight.
133
+ "code-block": _ref12 => {
134
+ let block = _ref12.block;
135
+ const _ref13 = block,
136
+ code = _ref13.code,
137
+ language = _ref13.language;
138
+ return /*#__PURE__*/React.createElement(StyledCodeBlock, {
139
+ "data-language": language || undefined
140
+ }, /*#__PURE__*/React.createElement("code", null, code));
141
+ },
142
+ table: _ref14 => {
143
+ let block = _ref14.block,
144
+ renderSpans = _ref14.renderSpans;
145
+ const _ref15 = block,
146
+ header = _ref15.header,
147
+ rows = _ref15.rows;
148
+ // Standalone (engine-less) use has no span renderer — keep the raw text.
149
+ const cell = spans => renderSpans ? renderSpans(spans) : spans.map((span, index) => /*#__PURE__*/React.createElement(Fragment, {
150
+ key: index
151
+ }, span.text));
152
+ return /*#__PURE__*/React.createElement(StyledTableBlock, null, /*#__PURE__*/React.createElement(Table, null, /*#__PURE__*/React.createElement(Thead, null, /*#__PURE__*/React.createElement("tr", null, header.map((spans, index) => /*#__PURE__*/React.createElement("th", {
153
+ key: index
154
+ }, cell(spans))))), /*#__PURE__*/React.createElement(Tbody, null, rows.map((row, rowIndex) => /*#__PURE__*/React.createElement("tr", {
155
+ key: rowIndex
156
+ }, row.map((spans, cellIndex) => /*#__PURE__*/React.createElement("td", {
157
+ key: cellIndex
158
+ }, cell(spans))))))));
159
+ },
160
+ divider: () => /*#__PURE__*/React.createElement(StyledDivider, null)
129
161
  };
130
162
  //# sourceMappingURL=renderers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderers.js","names":["React","StyledCode","StyledLink","StyledList","Media","TitledText","titledTextHeadings","Body1","Typography","portableTextDefaultMarkRenderers","strong","_ref","children","createElement","em","_ref2","code","_ref3","link","_ref4","mark","href","Fragment","target","rel","HEADING_LEVEL_VARIANTS","DEFAULT_HEADING_LEVEL","headingVariantForLevel","level","undefined","variant","console","warn","HeadingBlock","_ref5","block","_ref6","Heading","portableTextDefaultBlockRenderers","paragraph","_ref7","heading","list","_ref8","ordered","style","as","$ordered","_ref9","media","_ref0","_ref1","src","alt","caption","_ref10","_ref11","title"],"sources":["../../../../src/components/PortableText/renderers.tsx"],"sourcesContent":["import React from \"react\";\n\nimport { StyledCode, StyledLink, StyledList } from \"./Styles\";\nimport {\n PortableTextBlockRenderer,\n PortableTextDefaultBlockType,\n PortableTextDefaultMark,\n PortableTextHeadingBlock,\n PortableTextHeadingLevel,\n PortableTextLinkMark,\n PortableTextListBlock,\n PortableTextMarkRenderer,\n PortableTextMediaBlock,\n PortableTextTitledTextBlock,\n} from \"./types\";\nimport { Media } from \"../Media\";\nimport {\n TitledText,\n TitledTextVariant,\n titledTextHeadings,\n} from \"../TitledText\";\nimport { Body1 } from \"../Typography\";\nimport { Typography } from \"../Typography/Typography\";\n\n/**\n * The default renderers for the universal set — everything a client renders\n * without injection, and nothing more: no product element ever lands here.\n * Injected {@link PortableTextComponents} maps take precedence entry by entry.\n */\n\nexport const portableTextDefaultMarkRenderers: Record<\n PortableTextDefaultMark,\n PortableTextMarkRenderer\n> = {\n strong: ({ children }) => <strong>{children}</strong>,\n em: ({ children }) => <em>{children}</em>,\n code: ({ children }) => <StyledCode>{children}</StyledCode>,\n link: ({ mark, children }) => {\n const href = (mark as PortableTextLinkMark | undefined)?.href;\n\n // A link mark without an href (authored as a plain string) has nowhere\n // to go — keep the text, skip the anchor.\n if (!href) {\n return <>{children}</>;\n }\n\n return (\n <StyledLink href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n {children}\n </StyledLink>\n );\n },\n};\n\n/** The semantic wire levels resolve to typography only here, in the renderer. */\nconst HEADING_LEVEL_VARIANTS: Record<\n PortableTextHeadingLevel,\n TitledTextVariant\n> = {\n 1: \"title1\",\n 2: \"title2\",\n 3: \"header2\",\n};\n\n/** The level `heading` and `titled-text` fall back to. */\nconst DEFAULT_HEADING_LEVEL: PortableTextHeadingLevel = 3;\n\n/**\n * Resolve a semantic wire level to its typography variant. An absent level is\n * the documented default; any other unrecognised level is a serializer bug on\n * a fixed 1–3 scale, so it falls back to the default and is logged, per the\n * contract's degradation rule.\n */\nconst headingVariantForLevel = (\n level: PortableTextHeadingLevel | undefined\n): TitledTextVariant => {\n if (level === undefined) {\n return HEADING_LEVEL_VARIANTS[DEFAULT_HEADING_LEVEL];\n }\n\n const variant = HEADING_LEVEL_VARIANTS[level];\n if (!variant) {\n console.warn(\n `PortableText: unknown heading level ${level}, falling back to ${DEFAULT_HEADING_LEVEL}.`\n );\n return HEADING_LEVEL_VARIANTS[DEFAULT_HEADING_LEVEL];\n }\n\n return variant;\n};\n\n/** Heading levels map to the same typography TitledText uses. */\nconst HeadingBlock: PortableTextBlockRenderer = ({ block, children }) => {\n const { level } = block as PortableTextHeadingBlock;\n const Heading = titledTextHeadings[headingVariantForLevel(level)];\n return <Heading>{children}</Heading>;\n};\n\nexport const portableTextDefaultBlockRenderers: Record<\n PortableTextDefaultBlockType,\n PortableTextBlockRenderer\n> = {\n paragraph: ({ children }) => <Body1>{children}</Body1>,\n heading: HeadingBlock,\n list: ({ block, children }) => {\n const ordered = (block as PortableTextListBlock).style === \"number\";\n return (\n <StyledList as={ordered ? \"ol\" : \"ul\"} $ordered={ordered}>\n {children}\n </StyledList>\n );\n },\n \"list-item\": ({ children }) => (\n <Typography variant=\"Body 1\" as=\"li\">\n {children}\n </Typography>\n ),\n media: ({ block }) => {\n const { src, alt, variant, caption } = block as PortableTextMediaBlock;\n return <Media src={src} alt={alt} variant={variant} caption={caption} />;\n },\n \"titled-text\": ({ block, children }) => {\n const { title, level } = block as PortableTextTitledTextBlock;\n return (\n <TitledText title={title} variant={headingVariantForLevel(level)}>\n {children}\n </TitledText>\n );\n },\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"renderers.js","names":["React","Fragment","StyledCode","StyledCodeBlock","StyledDivider","StyledLink","StyledList","StyledTableBlock","Media","Table","Tbody","Thead","TitledText","titledTextHeadings","Body1","Typography","portableTextDefaultMarkRenderers","strong","_ref","children","createElement","em","_ref2","code","_ref3","link","_ref4","mark","href","target","rel","HEADING_LEVEL_VARIANTS","DEFAULT_HEADING_LEVEL","headingVariantForLevel","level","undefined","variant","console","warn","HeadingBlock","_ref5","block","_ref6","Heading","portableTextDefaultBlockRenderers","paragraph","_ref7","heading","list","_ref8","ordered","style","as","$ordered","_ref9","media","_ref0","_ref1","src","alt","caption","_ref10","_ref11","title","_ref12","_ref13","language","table","_ref14","renderSpans","_ref15","header","rows","cell","spans","map","span","index","key","text","row","rowIndex","cellIndex","divider"],"sources":["../../../../src/components/PortableText/renderers.tsx"],"sourcesContent":["import React, { Fragment, ReactNode } from \"react\";\n\nimport {\n StyledCode,\n StyledCodeBlock,\n StyledDivider,\n StyledLink,\n StyledList,\n StyledTableBlock,\n} from \"./Styles\";\nimport {\n PortableTextBlockRenderer,\n PortableTextCodeBlock,\n PortableTextDefaultBlockType,\n PortableTextDefaultMark,\n PortableTextHeadingBlock,\n PortableTextHeadingLevel,\n PortableTextLinkMark,\n PortableTextListBlock,\n PortableTextMarkRenderer,\n PortableTextMediaBlock,\n PortableTextSpan,\n PortableTextTableBlock,\n PortableTextTitledTextBlock,\n} from \"./types\";\nimport { Media } from \"../Media\";\nimport { Table, Tbody, Thead } from \"../Tables\";\nimport {\n TitledText,\n TitledTextVariant,\n titledTextHeadings,\n} from \"../TitledText\";\nimport { Body1 } from \"../Typography\";\nimport { Typography } from \"../Typography/Typography\";\n\n/**\n * The default renderers for the universal set — everything a client renders\n * without injection, and nothing more: no product element ever lands here.\n * Injected {@link PortableTextComponents} maps take precedence entry by entry.\n */\n\nexport const portableTextDefaultMarkRenderers: Record<\n PortableTextDefaultMark,\n PortableTextMarkRenderer\n> = {\n strong: ({ children }) => <strong>{children}</strong>,\n em: ({ children }) => <em>{children}</em>,\n code: ({ children }) => <StyledCode>{children}</StyledCode>,\n link: ({ mark, children }) => {\n const href = (mark as PortableTextLinkMark | undefined)?.href;\n\n // A link mark without an href (authored as a plain string) has nowhere\n // to go — keep the text, skip the anchor.\n if (!href) {\n return <>{children}</>;\n }\n\n return (\n <StyledLink href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n {children}\n </StyledLink>\n );\n },\n};\n\n/** The semantic wire levels resolve to typography only here, in the renderer. */\nconst HEADING_LEVEL_VARIANTS: Record<\n PortableTextHeadingLevel,\n TitledTextVariant\n> = {\n 1: \"title1\",\n 2: \"title2\",\n 3: \"header2\",\n};\n\n/** The level `heading` and `titled-text` fall back to. */\nconst DEFAULT_HEADING_LEVEL: PortableTextHeadingLevel = 3;\n\n/**\n * Resolve a semantic wire level to its typography variant. An absent level is\n * the documented default; any other unrecognised level is a serializer bug on\n * a fixed 1–3 scale, so it falls back to the default and is logged, per the\n * contract's degradation rule.\n */\nconst headingVariantForLevel = (\n level: PortableTextHeadingLevel | undefined\n): TitledTextVariant => {\n if (level === undefined) {\n return HEADING_LEVEL_VARIANTS[DEFAULT_HEADING_LEVEL];\n }\n\n const variant = HEADING_LEVEL_VARIANTS[level];\n if (!variant) {\n console.warn(\n `PortableText: unknown heading level ${level}, falling back to ${DEFAULT_HEADING_LEVEL}.`\n );\n return HEADING_LEVEL_VARIANTS[DEFAULT_HEADING_LEVEL];\n }\n\n return variant;\n};\n\n/** Heading levels map to the same typography TitledText uses. */\nconst HeadingBlock: PortableTextBlockRenderer = ({ block, children }) => {\n const { level } = block as PortableTextHeadingBlock;\n const Heading = titledTextHeadings[headingVariantForLevel(level)];\n return <Heading>{children}</Heading>;\n};\n\nexport const portableTextDefaultBlockRenderers: Record<\n PortableTextDefaultBlockType,\n PortableTextBlockRenderer\n> = {\n paragraph: ({ children }) => <Body1>{children}</Body1>,\n heading: HeadingBlock,\n list: ({ block, children }) => {\n const ordered = (block as PortableTextListBlock).style === \"number\";\n return (\n <StyledList as={ordered ? \"ol\" : \"ul\"} $ordered={ordered}>\n {children}\n </StyledList>\n );\n },\n \"list-item\": ({ children }) => (\n <Typography variant=\"Body 1\" as=\"li\">\n {children}\n </Typography>\n ),\n media: ({ block }) => {\n const { src, alt, variant, caption } = block as PortableTextMediaBlock;\n return <Media src={src} alt={alt} variant={variant} caption={caption} />;\n },\n \"titled-text\": ({ block, children }) => {\n const { title, level } = block as PortableTextTitledTextBlock;\n return (\n <TitledText title={title} variant={headingVariantForLevel(level)}>\n {children}\n </TitledText>\n );\n },\n // No highlighter ships with the default set, so every language — known,\n // unknown or absent — is plain preformatted text; the hint travels on\n // data-language for surfaces that highlight.\n \"code-block\": ({ block }) => {\n const { code, language } = block as PortableTextCodeBlock;\n return (\n <StyledCodeBlock data-language={language || undefined}>\n <code>{code}</code>\n </StyledCodeBlock>\n );\n },\n table: ({ block, renderSpans }) => {\n const { header, rows } = block as PortableTextTableBlock;\n // Standalone (engine-less) use has no span renderer — keep the raw text.\n const cell = (spans: PortableTextSpan[]): ReactNode =>\n renderSpans\n ? renderSpans(spans)\n : spans.map((span, index) => (\n <Fragment key={index}>{span.text}</Fragment>\n ));\n\n return (\n <StyledTableBlock>\n <Table>\n <Thead>\n <tr>\n {header.map((spans, index) => (\n <th key={index}>{cell(spans)}</th>\n ))}\n </tr>\n </Thead>\n <Tbody>\n {rows.map((row, rowIndex) => (\n <tr key={rowIndex}>\n {row.map((spans, cellIndex) => (\n <td key={cellIndex}>{cell(spans)}</td>\n ))}\n </tr>\n ))}\n </Tbody>\n </Table>\n </StyledTableBlock>\n );\n },\n divider: () => <StyledDivider />,\n};\n"],"mappings":"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","ignoreList":[]}
@@ -72,7 +72,29 @@ export interface PortableTextTitledTextBlock {
72
72
  title: string;
73
73
  content?: PortableTextNode[];
74
74
  }
75
- export type PortableTextBlock = PortableTextParagraphBlock | PortableTextHeadingBlock | PortableTextListBlock | PortableTextMediaBlock | PortableTextTitledTextBlock;
75
+ export interface PortableTextCodeBlock {
76
+ type: "code-block";
77
+ /**
78
+ * A language hint (e.g. "php", "json"). The default renderer does no
79
+ * highlighting, so any value — known, unknown or absent — renders as plain
80
+ * preformatted text; it travels as data for surfaces that highlight.
81
+ */
82
+ language?: string;
83
+ code: string;
84
+ }
85
+ /** A table cell is a span array, so inline marks work inside cells. */
86
+ export type PortableTextTableCell = PortableTextSpan[];
87
+ export type PortableTextTableRow = PortableTextTableCell[];
88
+ export interface PortableTextTableBlock {
89
+ type: "table";
90
+ header: PortableTextTableRow;
91
+ rows: PortableTextTableRow[];
92
+ }
93
+ /** A themed horizontal rule between sections. Carries no data. */
94
+ export interface PortableTextDividerBlock {
95
+ type: "divider";
96
+ }
97
+ export type PortableTextBlock = PortableTextParagraphBlock | PortableTextHeadingBlock | PortableTextListBlock | PortableTextMediaBlock | PortableTextTitledTextBlock | PortableTextCodeBlock | PortableTextTableBlock | PortableTextDividerBlock;
76
98
  /**
77
99
  * Derived from the union's discriminators, so adding a block to the union
78
100
  * without a renderer entry is a compile error, never silent drift.
@@ -109,6 +131,13 @@ export interface PortableTextBlockRendererProps<TBlock extends PortableTextBlock
109
131
  block: TBlock;
110
132
  /** The block's rendered children/content, when it has any. */
111
133
  children?: ReactNode;
134
+ /**
135
+ * Engine-bound span renderer for blocks that carry spans outside `children`
136
+ * (table cells). Resolves marks with the same precedence — injected first,
137
+ * then defaults — as flowing text. Absent when a renderer is used without
138
+ * the engine.
139
+ */
140
+ renderSpans?: (spans: PortableTextSpan[]) => ReactNode;
112
141
  }
113
142
  export type PortableTextBlockRenderer<TBlock extends PortableTextBlock = PortableTextBlock> = ComponentType<PortableTextBlockRendererProps<TBlock>>;
114
143
  export type PortableTextUnknownKind = "block" | "mark" | "object";
@@ -129,6 +158,7 @@ export interface PortableTextComponents {
129
158
  onUnknownType?: PortableTextUnknownTypeHandler;
130
159
  }
131
160
  export declare const isPortableTextSpan: (value: unknown) => value is PortableTextSpan;
161
+ export declare const isPortableTextTableRow: (value: unknown) => value is PortableTextTableRow;
132
162
  export declare const isPortableTextObjectNode: (value: unknown) => value is PortableTextObjectNode;
133
163
  /**
134
164
  * A block is any non-object node with a string `type`. Unknown block types
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/components/PortableText/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/components/PortableText/types.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,10 @@ export const PORTABLE_TEXT_DEFAULT_MARKS = ["strong", "em", "code", "link"];
29
29
 
30
30
  /** Screenshots render framed (border, no shadow); illustrations render flat. */
31
31
 
32
+ /** A table cell is a span array, so inline marks work inside cells. */
33
+
34
+ /** A themed horizontal rule between sections. Carries no data. */
35
+
32
36
  /**
33
37
  * Derived from the union's discriminators, so adding a block to the union
34
38
  * without a renderer entry is a compile error, never silent drift.
@@ -42,7 +46,10 @@ const DEFAULT_BLOCK_TYPES = {
42
46
  list: true,
43
47
  "list-item": true,
44
48
  media: true,
45
- "titled-text": true
49
+ "titled-text": true,
50
+ "code-block": true,
51
+ table: true,
52
+ divider: true
46
53
  };
47
54
 
48
55
  /** Blocks every client understands without injection. */
@@ -75,6 +82,7 @@ export const PORTABLE_TEXT_DEFAULT_BLOCKS = Object.keys(DEFAULT_BLOCK_TYPES);
75
82
 
76
83
  const isRecord = value => typeof value === "object" && value !== null;
77
84
  export const isPortableTextSpan = value => isRecord(value) && typeof value.text === "string";
85
+ export const isPortableTextTableRow = value => Array.isArray(value) && value.every(cell => Array.isArray(cell) && cell.every(isPortableTextSpan));
78
86
  export const isPortableTextObjectNode = value => isRecord(value) && value.type === "object" && typeof value._type === "string";
79
87
 
80
88
  /**
@@ -98,6 +106,12 @@ export const isPortableTextBlock = value => {
98
106
  return typeof value.src === "string";
99
107
  case "titled-text":
100
108
  return typeof value.title === "string" && (value.content === undefined || isPortableTextContent(value.content));
109
+ case "code-block":
110
+ return typeof value.code === "string" && (value.language === undefined || typeof value.language === "string");
111
+ case "table":
112
+ return isPortableTextTableRow(value.header) && Array.isArray(value.rows) && value.rows.every(isPortableTextTableRow);
113
+ case "divider":
114
+ return true;
101
115
  default:
102
116
  return true;
103
117
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":["PORTABLE_TEXT_DEFAULT_MARKS","DEFAULT_BLOCK_TYPES","paragraph","heading","list","media","PORTABLE_TEXT_DEFAULT_BLOCKS","Object","keys","isRecord","value","isPortableTextSpan","text","isPortableTextObjectNode","type","_type","isPortableTextBlock","Array","isArray","children","every","src","title","content","undefined","isPortableTextContent","node"],"sources":["../../../../src/components/PortableText/types.ts"],"sourcesContent":["import { ComponentType, ReactNode } from \"react\";\n\n/**\n * Portable Text envelope — the general content contract for structured,\n * renderer-independent content (in-app messages, help, changelogs).\n *\n * The design system owns this envelope and the universal default set below.\n * It never hardcodes a product element: concrete elements (callout,\n * button-reference, doc-link, …) are defined in the application catalog and\n * injected into the Portable Text engine through {@link PortableTextComponents}.\n * See README.md next to this file for the full contract.\n */\n\n/* ---- Spans and marks ------------------------------------------------- */\n\n/**\n * A mark with data. Parameterless marks travel as plain strings (\"strong\");\n * marks that need data travel as objects discriminated by `type`.\n */\nexport interface PortableTextMarkObject {\n type: string;\n [data: string]: unknown;\n}\n\n/** The one default mark that carries data. */\nexport interface PortableTextLinkMark extends PortableTextMarkObject {\n type: \"link\";\n href: string;\n}\n\nexport type PortableTextMark = string | PortableTextMarkObject;\n\n/** The leaf of every text run: a piece of text plus the marks wrapping it. */\nexport interface PortableTextSpan {\n text: string;\n marks?: PortableTextMark[];\n}\n\n/** Marks every client understands without injection. */\nexport const PORTABLE_TEXT_DEFAULT_MARKS = [\n \"strong\",\n \"em\",\n \"code\",\n \"link\",\n] as const;\n\nexport type PortableTextDefaultMark =\n (typeof PORTABLE_TEXT_DEFAULT_MARKS)[number];\n\n/* ---- Blocks ----------------------------------------------------------- */\n\nexport interface PortableTextParagraphBlock {\n type: \"paragraph\";\n children: PortableTextSpan[];\n}\n\n/** 1 maps to Title1, 2 to Title2, 3 to Header2 typography. */\nexport type PortableTextHeadingLevel = 1 | 2 | 3;\n\nexport interface PortableTextHeadingBlock {\n type: \"heading\";\n level: PortableTextHeadingLevel;\n children: PortableTextSpan[];\n}\n\nexport type PortableTextListStyle = \"bullet\" | \"number\";\n\nexport interface PortableTextListItemBlock {\n type: \"list-item\";\n children: PortableTextSpan[];\n}\n\nexport interface PortableTextListBlock {\n type: \"list\";\n style?: PortableTextListStyle;\n children: PortableTextListItemBlock[];\n}\n\n/** Screenshots render framed (border, no shadow); illustrations render flat. */\nexport type PortableTextMediaVariant = \"screenshot\" | \"illustration\";\n\nexport interface PortableTextMediaBlock {\n type: \"media\";\n src: string;\n alt?: string;\n variant?: PortableTextMediaVariant;\n caption?: string;\n}\n\nexport interface PortableTextTitledTextBlock {\n type: \"titled-text\";\n /**\n * Same semantic scale as `heading` — 1, 2 or 3 (the default) — so the wire\n * format never encodes a typography name. How a level looks is the\n * renderer's business.\n */\n level?: PortableTextHeadingLevel;\n title: string;\n content?: PortableTextNode[];\n}\n\nexport type PortableTextBlock =\n | PortableTextParagraphBlock\n | PortableTextHeadingBlock\n | PortableTextListBlock\n | PortableTextMediaBlock\n | PortableTextTitledTextBlock;\n\n/**\n * Derived from the union's discriminators, so adding a block to the union\n * without a renderer entry is a compile error, never silent drift.\n */\nexport type PortableTextDefaultBlockType = (\n | PortableTextBlock\n | PortableTextListItemBlock\n)[\"type\"];\n\n// A Record so the compiler checks the list against the union in both\n// directions: a missing and a stray key each fail to build.\nconst DEFAULT_BLOCK_TYPES: Record<PortableTextDefaultBlockType, true> = {\n paragraph: true,\n heading: true,\n list: true,\n \"list-item\": true,\n media: true,\n \"titled-text\": true,\n};\n\n/** Blocks every client understands without injection. */\nexport const PORTABLE_TEXT_DEFAULT_BLOCKS = Object.keys(\n DEFAULT_BLOCK_TYPES\n) as readonly PortableTextDefaultBlockType[];\n\n/* ---- Objects ----------------------------------------------------------- */\n\n/**\n * An embedded component the envelope does not interpret: `_type` names an\n * application-catalog element, everything else is that element's data. An\n * object whose `_type` has no injected renderer renders nothing and is logged.\n */\nexport interface PortableTextObjectNode {\n type: \"object\";\n _type: string;\n [data: string]: unknown;\n}\n\nexport type PortableTextNode = PortableTextBlock | PortableTextObjectNode;\n\n/** The root of a message body: what an API returns under `content`. */\nexport type PortableTextContent = PortableTextNode[];\n\n/* ---- Injection contract ------------------------------------------------ */\n\nexport interface PortableTextMarkRendererProps<\n TMark extends PortableTextMarkObject = PortableTextMarkObject\n> {\n /** Present for object marks; absent when the mark is a plain string. */\n mark?: TMark;\n children: ReactNode;\n}\n\nexport type PortableTextMarkRenderer<\n TMark extends PortableTextMarkObject = PortableTextMarkObject\n> = ComponentType<PortableTextMarkRendererProps<TMark>>;\n\nexport interface PortableTextObjectRendererProps<\n TNode extends PortableTextObjectNode = PortableTextObjectNode\n> {\n node: TNode;\n /** The object's nested `content`, already rendered by the engine. */\n children?: ReactNode;\n}\n\nexport type PortableTextObjectRenderer<\n TNode extends PortableTextObjectNode = PortableTextObjectNode\n> = ComponentType<PortableTextObjectRendererProps<TNode>>;\n\nexport interface PortableTextBlockRendererProps<\n TBlock extends PortableTextBlock = PortableTextBlock\n> {\n block: TBlock;\n /** The block's rendered children/content, when it has any. */\n children?: ReactNode;\n}\n\nexport type PortableTextBlockRenderer<\n TBlock extends PortableTextBlock = PortableTextBlock\n> = ComponentType<PortableTextBlockRendererProps<TBlock>>;\n\nexport type PortableTextUnknownKind = \"block\" | \"mark\" | \"object\";\n\n/**\n * Called once per unknown type instead of rendering it, so content written\n * for newer clients degrades silently on older ones.\n */\nexport type PortableTextUnknownTypeHandler = (\n kind: PortableTextUnknownKind,\n type: string\n) => void;\n\n/**\n * What an application injects into the Portable Text engine: renderers for\n * its catalog marks and objects, optional overrides for the default blocks,\n * and the unknown-type hook.\n */\nexport interface PortableTextComponents {\n marks?: Record<string, PortableTextMarkRenderer>;\n objects?: Record<string, PortableTextObjectRenderer>;\n blocks?: Partial<\n Record<PortableTextDefaultBlockType, PortableTextBlockRenderer>\n >;\n onUnknownType?: PortableTextUnknownTypeHandler;\n}\n\n/* ---- Runtime guards ----------------------------------------------------- */\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nexport const isPortableTextSpan = (value: unknown): value is PortableTextSpan =>\n isRecord(value) && typeof value.text === \"string\";\n\nexport const isPortableTextObjectNode = (\n value: unknown\n): value is PortableTextObjectNode =>\n isRecord(value) && value.type === \"object\" && typeof value._type === \"string\";\n\n/**\n * A block is any non-object node with a string `type`. Unknown block types\n * stay valid on purpose — they render nothing on clients that predate them.\n * Known types are held to their shape, so a serializer bug (a paragraph\n * without `children`, a list of non-nodes) fails here instead of at render.\n */\nexport const isPortableTextBlock = (\n value: unknown\n): value is PortableTextBlock => {\n if (\n !isRecord(value) ||\n typeof value.type !== \"string\" ||\n value.type === \"object\"\n ) {\n return false;\n }\n\n switch (value.type) {\n case \"paragraph\":\n case \"heading\":\n case \"list-item\":\n return (\n Array.isArray(value.children) &&\n value.children.every(isPortableTextSpan)\n );\n case \"list\":\n return (\n Array.isArray(value.children) &&\n value.children.every(isPortableTextBlock)\n );\n case \"media\":\n return typeof value.src === \"string\";\n case \"titled-text\":\n return (\n typeof value.title === \"string\" &&\n (value.content === undefined || isPortableTextContent(value.content))\n );\n default:\n return true;\n }\n};\n\nexport const isPortableTextContent = (\n value: unknown\n): value is PortableTextContent =>\n Array.isArray(value) &&\n value.every(\n (node) => isPortableTextBlock(node) || isPortableTextObjectNode(node)\n );\n"],"mappings":"AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAMA;;AAQA;;AAMA;AACA,OAAO,MAAMA,2BAA2B,GAAG,CACzC,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,MAAM,CACE;;AAKV;;AAOA;;AAsBA;;AA8BA;AACA;AACA;AACA;;AAMA;AACA;AACA,MAAMC,mBAA+D,GAAG;EACtEC,SAAS,EAAE,IAAI;EACfC,OAAO,EAAE,IAAI;EACbC,IAAI,EAAE,IAAI;EACV,WAAW,EAAE,IAAI;EACjBC,KAAK,EAAE,IAAI;EACX,aAAa,EAAE;AACjB,CAAC;;AAED;AACA,OAAO,MAAMC,4BAA4B,GAAGC,MAAM,CAACC,IAAI,CACrDP,mBACF,CAA4C;;AAE5C;;AAEA;AACA;AACA;AACA;AACA;;AASA;;AAGA;;AAwCA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;AACA;;AAUA;;AAEA,MAAMQ,QAAQ,GAAIC,KAAc,IAC9B,OAAOA,KAAK,KAAK,QAAQ,IAAIA,KAAK,KAAK,IAAI;AAE7C,OAAO,MAAMC,kBAAkB,GAAID,KAAc,IAC/CD,QAAQ,CAACC,KAAK,CAAC,IAAI,OAAOA,KAAK,CAACE,IAAI,KAAK,QAAQ;AAEnD,OAAO,MAAMC,wBAAwB,GACnCH,KAAc,IAEdD,QAAQ,CAACC,KAAK,CAAC,IAAIA,KAAK,CAACI,IAAI,KAAK,QAAQ,IAAI,OAAOJ,KAAK,CAACK,KAAK,KAAK,QAAQ;;AAE/E;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,mBAAmB,GAC9BN,KAAc,IACiB;EAC/B,IACE,CAACD,QAAQ,CAACC,KAAK,CAAC,IAChB,OAAOA,KAAK,CAACI,IAAI,KAAK,QAAQ,IAC9BJ,KAAK,CAACI,IAAI,KAAK,QAAQ,EACvB;IACA,OAAO,KAAK;EACd;EAEA,QAAQJ,KAAK,CAACI,IAAI;IAChB,KAAK,WAAW;IAChB,KAAK,SAAS;IACd,KAAK,WAAW;MACd,OACEG,KAAK,CAACC,OAAO,CAACR,KAAK,CAACS,QAAQ,CAAC,IAC7BT,KAAK,CAACS,QAAQ,CAACC,KAAK,CAACT,kBAAkB,CAAC;IAE5C,KAAK,MAAM;MACT,OACEM,KAAK,CAACC,OAAO,CAACR,KAAK,CAACS,QAAQ,CAAC,IAC7BT,KAAK,CAACS,QAAQ,CAACC,KAAK,CAACJ,mBAAmB,CAAC;IAE7C,KAAK,OAAO;MACV,OAAO,OAAON,KAAK,CAACW,GAAG,KAAK,QAAQ;IACtC,KAAK,aAAa;MAChB,OACE,OAAOX,KAAK,CAACY,KAAK,KAAK,QAAQ,KAC9BZ,KAAK,CAACa,OAAO,KAAKC,SAAS,IAAIC,qBAAqB,CAACf,KAAK,CAACa,OAAO,CAAC,CAAC;IAEzE;MACE,OAAO,IAAI;EACf;AACF,CAAC;AAED,OAAO,MAAME,qBAAqB,GAChCf,KAAc,IAEdO,KAAK,CAACC,OAAO,CAACR,KAAK,CAAC,IACpBA,KAAK,CAACU,KAAK,CACRM,IAAI,IAAKV,mBAAmB,CAACU,IAAI,CAAC,IAAIb,wBAAwB,CAACa,IAAI,CACtE,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"types.js","names":["PORTABLE_TEXT_DEFAULT_MARKS","DEFAULT_BLOCK_TYPES","paragraph","heading","list","media","table","divider","PORTABLE_TEXT_DEFAULT_BLOCKS","Object","keys","isRecord","value","isPortableTextSpan","text","isPortableTextTableRow","Array","isArray","every","cell","isPortableTextObjectNode","type","_type","isPortableTextBlock","children","src","title","content","undefined","isPortableTextContent","code","language","header","rows","node"],"sources":["../../../../src/components/PortableText/types.ts"],"sourcesContent":["import { ComponentType, ReactNode } from \"react\";\n\n/**\n * Portable Text envelope — the general content contract for structured,\n * renderer-independent content (in-app messages, help, changelogs).\n *\n * The design system owns this envelope and the universal default set below.\n * It never hardcodes a product element: concrete elements (callout,\n * button-reference, doc-link, …) are defined in the application catalog and\n * injected into the Portable Text engine through {@link PortableTextComponents}.\n * See README.md next to this file for the full contract.\n */\n\n/* ---- Spans and marks ------------------------------------------------- */\n\n/**\n * A mark with data. Parameterless marks travel as plain strings (\"strong\");\n * marks that need data travel as objects discriminated by `type`.\n */\nexport interface PortableTextMarkObject {\n type: string;\n [data: string]: unknown;\n}\n\n/** The one default mark that carries data. */\nexport interface PortableTextLinkMark extends PortableTextMarkObject {\n type: \"link\";\n href: string;\n}\n\nexport type PortableTextMark = string | PortableTextMarkObject;\n\n/** The leaf of every text run: a piece of text plus the marks wrapping it. */\nexport interface PortableTextSpan {\n text: string;\n marks?: PortableTextMark[];\n}\n\n/** Marks every client understands without injection. */\nexport const PORTABLE_TEXT_DEFAULT_MARKS = [\n \"strong\",\n \"em\",\n \"code\",\n \"link\",\n] as const;\n\nexport type PortableTextDefaultMark =\n (typeof PORTABLE_TEXT_DEFAULT_MARKS)[number];\n\n/* ---- Blocks ----------------------------------------------------------- */\n\nexport interface PortableTextParagraphBlock {\n type: \"paragraph\";\n children: PortableTextSpan[];\n}\n\n/** 1 maps to Title1, 2 to Title2, 3 to Header2 typography. */\nexport type PortableTextHeadingLevel = 1 | 2 | 3;\n\nexport interface PortableTextHeadingBlock {\n type: \"heading\";\n level: PortableTextHeadingLevel;\n children: PortableTextSpan[];\n}\n\nexport type PortableTextListStyle = \"bullet\" | \"number\";\n\nexport interface PortableTextListItemBlock {\n type: \"list-item\";\n children: PortableTextSpan[];\n}\n\nexport interface PortableTextListBlock {\n type: \"list\";\n style?: PortableTextListStyle;\n children: PortableTextListItemBlock[];\n}\n\n/** Screenshots render framed (border, no shadow); illustrations render flat. */\nexport type PortableTextMediaVariant = \"screenshot\" | \"illustration\";\n\nexport interface PortableTextMediaBlock {\n type: \"media\";\n src: string;\n alt?: string;\n variant?: PortableTextMediaVariant;\n caption?: string;\n}\n\nexport interface PortableTextTitledTextBlock {\n type: \"titled-text\";\n /**\n * Same semantic scale as `heading` — 1, 2 or 3 (the default) — so the wire\n * format never encodes a typography name. How a level looks is the\n * renderer's business.\n */\n level?: PortableTextHeadingLevel;\n title: string;\n content?: PortableTextNode[];\n}\n\nexport interface PortableTextCodeBlock {\n type: \"code-block\";\n /**\n * A language hint (e.g. \"php\", \"json\"). The default renderer does no\n * highlighting, so any value — known, unknown or absent — renders as plain\n * preformatted text; it travels as data for surfaces that highlight.\n */\n language?: string;\n code: string;\n}\n\n/** A table cell is a span array, so inline marks work inside cells. */\nexport type PortableTextTableCell = PortableTextSpan[];\nexport type PortableTextTableRow = PortableTextTableCell[];\n\nexport interface PortableTextTableBlock {\n type: \"table\";\n header: PortableTextTableRow;\n rows: PortableTextTableRow[];\n}\n\n/** A themed horizontal rule between sections. Carries no data. */\nexport interface PortableTextDividerBlock {\n type: \"divider\";\n}\n\nexport type PortableTextBlock =\n | PortableTextParagraphBlock\n | PortableTextHeadingBlock\n | PortableTextListBlock\n | PortableTextMediaBlock\n | PortableTextTitledTextBlock\n | PortableTextCodeBlock\n | PortableTextTableBlock\n | PortableTextDividerBlock;\n\n/**\n * Derived from the union's discriminators, so adding a block to the union\n * without a renderer entry is a compile error, never silent drift.\n */\nexport type PortableTextDefaultBlockType = (\n | PortableTextBlock\n | PortableTextListItemBlock\n)[\"type\"];\n\n// A Record so the compiler checks the list against the union in both\n// directions: a missing and a stray key each fail to build.\nconst DEFAULT_BLOCK_TYPES: Record<PortableTextDefaultBlockType, true> = {\n paragraph: true,\n heading: true,\n list: true,\n \"list-item\": true,\n media: true,\n \"titled-text\": true,\n \"code-block\": true,\n table: true,\n divider: true,\n};\n\n/** Blocks every client understands without injection. */\nexport const PORTABLE_TEXT_DEFAULT_BLOCKS = Object.keys(\n DEFAULT_BLOCK_TYPES\n) as readonly PortableTextDefaultBlockType[];\n\n/* ---- Objects ----------------------------------------------------------- */\n\n/**\n * An embedded component the envelope does not interpret: `_type` names an\n * application-catalog element, everything else is that element's data. An\n * object whose `_type` has no injected renderer renders nothing and is logged.\n */\nexport interface PortableTextObjectNode {\n type: \"object\";\n _type: string;\n [data: string]: unknown;\n}\n\nexport type PortableTextNode = PortableTextBlock | PortableTextObjectNode;\n\n/** The root of a message body: what an API returns under `content`. */\nexport type PortableTextContent = PortableTextNode[];\n\n/* ---- Injection contract ------------------------------------------------ */\n\nexport interface PortableTextMarkRendererProps<\n TMark extends PortableTextMarkObject = PortableTextMarkObject\n> {\n /** Present for object marks; absent when the mark is a plain string. */\n mark?: TMark;\n children: ReactNode;\n}\n\nexport type PortableTextMarkRenderer<\n TMark extends PortableTextMarkObject = PortableTextMarkObject\n> = ComponentType<PortableTextMarkRendererProps<TMark>>;\n\nexport interface PortableTextObjectRendererProps<\n TNode extends PortableTextObjectNode = PortableTextObjectNode\n> {\n node: TNode;\n /** The object's nested `content`, already rendered by the engine. */\n children?: ReactNode;\n}\n\nexport type PortableTextObjectRenderer<\n TNode extends PortableTextObjectNode = PortableTextObjectNode\n> = ComponentType<PortableTextObjectRendererProps<TNode>>;\n\nexport interface PortableTextBlockRendererProps<\n TBlock extends PortableTextBlock = PortableTextBlock\n> {\n block: TBlock;\n /** The block's rendered children/content, when it has any. */\n children?: ReactNode;\n /**\n * Engine-bound span renderer for blocks that carry spans outside `children`\n * (table cells). Resolves marks with the same precedence — injected first,\n * then defaults — as flowing text. Absent when a renderer is used without\n * the engine.\n */\n renderSpans?: (spans: PortableTextSpan[]) => ReactNode;\n}\n\nexport type PortableTextBlockRenderer<\n TBlock extends PortableTextBlock = PortableTextBlock\n> = ComponentType<PortableTextBlockRendererProps<TBlock>>;\n\nexport type PortableTextUnknownKind = \"block\" | \"mark\" | \"object\";\n\n/**\n * Called once per unknown type instead of rendering it, so content written\n * for newer clients degrades silently on older ones.\n */\nexport type PortableTextUnknownTypeHandler = (\n kind: PortableTextUnknownKind,\n type: string\n) => void;\n\n/**\n * What an application injects into the Portable Text engine: renderers for\n * its catalog marks and objects, optional overrides for the default blocks,\n * and the unknown-type hook.\n */\nexport interface PortableTextComponents {\n marks?: Record<string, PortableTextMarkRenderer>;\n objects?: Record<string, PortableTextObjectRenderer>;\n blocks?: Partial<\n Record<PortableTextDefaultBlockType, PortableTextBlockRenderer>\n >;\n onUnknownType?: PortableTextUnknownTypeHandler;\n}\n\n/* ---- Runtime guards ----------------------------------------------------- */\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nexport const isPortableTextSpan = (value: unknown): value is PortableTextSpan =>\n isRecord(value) && typeof value.text === \"string\";\n\nexport const isPortableTextTableRow = (\n value: unknown\n): value is PortableTextTableRow =>\n Array.isArray(value) &&\n value.every((cell) => Array.isArray(cell) && cell.every(isPortableTextSpan));\n\nexport const isPortableTextObjectNode = (\n value: unknown\n): value is PortableTextObjectNode =>\n isRecord(value) && value.type === \"object\" && typeof value._type === \"string\";\n\n/**\n * A block is any non-object node with a string `type`. Unknown block types\n * stay valid on purpose — they render nothing on clients that predate them.\n * Known types are held to their shape, so a serializer bug (a paragraph\n * without `children`, a list of non-nodes) fails here instead of at render.\n */\nexport const isPortableTextBlock = (\n value: unknown\n): value is PortableTextBlock => {\n if (\n !isRecord(value) ||\n typeof value.type !== \"string\" ||\n value.type === \"object\"\n ) {\n return false;\n }\n\n switch (value.type) {\n case \"paragraph\":\n case \"heading\":\n case \"list-item\":\n return (\n Array.isArray(value.children) &&\n value.children.every(isPortableTextSpan)\n );\n case \"list\":\n return (\n Array.isArray(value.children) &&\n value.children.every(isPortableTextBlock)\n );\n case \"media\":\n return typeof value.src === \"string\";\n case \"titled-text\":\n return (\n typeof value.title === \"string\" &&\n (value.content === undefined || isPortableTextContent(value.content))\n );\n case \"code-block\":\n return (\n typeof value.code === \"string\" &&\n (value.language === undefined || typeof value.language === \"string\")\n );\n case \"table\":\n return (\n isPortableTextTableRow(value.header) &&\n Array.isArray(value.rows) &&\n value.rows.every(isPortableTextTableRow)\n );\n case \"divider\":\n return true;\n default:\n return true;\n }\n};\n\nexport const isPortableTextContent = (\n value: unknown\n): value is PortableTextContent =>\n Array.isArray(value) &&\n value.every(\n (node) => isPortableTextBlock(node) || isPortableTextObjectNode(node)\n );\n"],"mappings":"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","ignoreList":[]}
@@ -75,6 +75,31 @@ describe("PortableText envelope", () => {
75
75
  _type: "button-reference",
76
76
  label: "Save Changes",
77
77
  variant: "primary"
78
+ }, {
79
+ type: "divider"
80
+ }, {
81
+ type: "code-block",
82
+ language: "json",
83
+ code: '{ "allowlist": ["203.0.113.0/24"] }'
84
+ }, {
85
+ type: "table",
86
+ header: [[{
87
+ text: "Range"
88
+ }], [{
89
+ text: "Purpose"
90
+ }]],
91
+ rows: [[[{
92
+ text: "203.0.113.0/24",
93
+ marks: ["code"]
94
+ }], [{
95
+ text: "Office",
96
+ marks: ["strong"]
97
+ }]], [[{
98
+ text: "198.51.100.0/24",
99
+ marks: ["code"]
100
+ }], [{
101
+ text: "VPN"
102
+ }]]]
78
103
  }];
79
104
  it("validates a sample message that mixes default blocks and catalog objects", () => {
80
105
  expect(isPortableTextContent(sampleMessageContent)).toBe(true);
@@ -136,6 +161,58 @@ describe("PortableText envelope", () => {
136
161
  content: "oops"
137
162
  }])).toBe(false);
138
163
  });
164
+ it("rejects malformed code-block, table and divider-adjacent shapes", () => {
165
+ expect(isPortableTextContent([{
166
+ type: "code-block"
167
+ }])).toBe(false);
168
+ expect(isPortableTextContent([{
169
+ type: "code-block",
170
+ code: 42
171
+ }])).toBe(false);
172
+ expect(isPortableTextContent([{
173
+ type: "code-block",
174
+ code: "x",
175
+ language: 1
176
+ }])).toBe(false);
177
+ expect(isPortableTextContent([{
178
+ type: "table"
179
+ }])).toBe(false);
180
+ expect(isPortableTextContent([{
181
+ type: "table",
182
+ header: [],
183
+ rows: "oops"
184
+ }])).toBe(false);
185
+ expect(isPortableTextContent([{
186
+ type: "table",
187
+ header: [[{
188
+ text: "A"
189
+ }]],
190
+ rows: [["not a cell"]]
191
+ }])).toBe(false);
192
+ expect(isPortableTextContent([{
193
+ type: "table",
194
+ header: [{
195
+ text: "not a cell"
196
+ }],
197
+ rows: []
198
+ }])).toBe(false);
199
+ });
200
+ it("accepts a code-block without a language and a table without rows", () => {
201
+ expect(isPortableTextContent([{
202
+ type: "code-block",
203
+ code: "npm install"
204
+ }])).toBe(true);
205
+ expect(isPortableTextContent([{
206
+ type: "table",
207
+ header: [[{
208
+ text: "A"
209
+ }]],
210
+ rows: []
211
+ }])).toBe(true);
212
+ expect(isPortableTextContent([{
213
+ type: "divider"
214
+ }])).toBe(true);
215
+ });
139
216
  it("accepts a titled-text with only a title, with or without content", () => {
140
217
  expect(isPortableTextContent([{
141
218
  type: "titled-text",
@@ -161,7 +238,7 @@ describe("PortableText envelope", () => {
161
238
  expect(isPortableTextSpan(paragraph)).toBe(false);
162
239
  });
163
240
  it("ships a universal default set free of product elements", () => {
164
- expect(PORTABLE_TEXT_DEFAULT_BLOCKS).toEqual(["paragraph", "heading", "list", "list-item", "media", "titled-text"]);
241
+ expect(PORTABLE_TEXT_DEFAULT_BLOCKS).toEqual(["paragraph", "heading", "list", "list-item", "media", "titled-text", "code-block", "table", "divider"]);
165
242
  expect(PORTABLE_TEXT_DEFAULT_MARKS).toEqual(["strong", "em", "code", "link"]);
166
243
  });
167
244
  it("accepts an application components map through the injection contract", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"types.test.js","names":["createElement","Fragment","isPortableTextBlock","isPortableTextContent","isPortableTextObjectNode","isPortableTextSpan","PORTABLE_TEXT_DEFAULT_BLOCKS","PORTABLE_TEXT_DEFAULT_MARKS","describe","sampleMessageContent","type","level","children","text","marks","article","style","src","variant","caption","title","content","_type","tone","label","it","expect","toBe","payload","data","heading","paragraph","callout","toEqual","_components$marks","seen","components","_ref","objects","_ref2","onUnknownType","kind","push","Object","keys"],"sources":["../../../../src/components/PortableText/types.test.ts"],"sourcesContent":["import { createElement, Fragment } from \"react\";\n\nimport {\n isPortableTextBlock,\n isPortableTextContent,\n isPortableTextObjectNode,\n isPortableTextSpan,\n PORTABLE_TEXT_DEFAULT_BLOCKS,\n PORTABLE_TEXT_DEFAULT_MARKS,\n PortableTextComponents,\n PortableTextContent,\n} from \"./types\";\n\ndescribe(\"PortableText envelope\", () => {\n const sampleMessageContent: PortableTextContent = [\n { type: \"heading\", level: 2, children: [{ text: \"IP Firewall\" }] },\n {\n type: \"paragraph\",\n children: [\n { text: \"Open the \" },\n { text: \"Security page\", marks: [\"interface-name\"] },\n { text: \" and press \" },\n { text: \"Enter\", marks: [\"keyboard-key\"] },\n { text: \". Read more in \" },\n {\n text: \"the help article\",\n marks: [{ type: \"doc-link\", article: \"ip-firewall\" }],\n },\n { text: \".\" },\n ],\n },\n {\n type: \"list\",\n style: \"bullet\",\n children: [\n {\n type: \"list-item\",\n children: [{ text: \"Allowlist the IPs you trust\" }],\n },\n {\n type: \"list-item\",\n children: [{ text: \"immediately\", marks: [\"strong\"] }],\n },\n ],\n },\n {\n type: \"media\",\n src: \"/screenshots/firewall.png\",\n variant: \"screenshot\",\n caption: \"The firewall settings\",\n },\n {\n type: \"titled-text\",\n title: \"Allowlist the IPs you trust\",\n level: 3,\n content: [\n { type: \"paragraph\", children: [{ text: \"Add one range per line.\" }] },\n ],\n },\n {\n type: \"object\",\n _type: \"callout\",\n tone: \"note\",\n content: [\n {\n type: \"paragraph\",\n children: [{ text: \"Takes effect immediately.\" }],\n },\n ],\n },\n {\n type: \"object\",\n _type: \"button-reference\",\n label: \"Save Changes\",\n variant: \"primary\",\n },\n ];\n\n it(\"validates a sample message that mixes default blocks and catalog objects\", () => {\n expect(isPortableTextContent(sampleMessageContent)).toBe(true);\n });\n\n it(\"keeps unknown block and object types valid so older clients degrade instead of break\", () => {\n expect(\n isPortableTextContent([\n { type: \"some-future-block\", payload: 1 },\n { type: \"object\", _type: \"some-future-element\", data: true },\n ])\n ).toBe(true);\n });\n\n it(\"rejects nodes without a type discriminator and objects without _type\", () => {\n expect(isPortableTextContent([{ children: [] }])).toBe(false);\n expect(isPortableTextContent([{ type: \"object\" }])).toBe(false);\n expect(isPortableTextContent([\"paragraph\"])).toBe(false);\n expect(isPortableTextContent({ content: [] })).toBe(false);\n });\n\n it(\"rejects known blocks whose shape a serializer bug has broken\", () => {\n expect(isPortableTextContent([{ type: \"paragraph\" }])).toBe(false);\n expect(\n isPortableTextContent([{ type: \"heading\", level: 2, children: \"oops\" }])\n ).toBe(false);\n expect(\n isPortableTextContent([\n { type: \"paragraph\", children: [{ marks: [\"strong\"] }] },\n ])\n ).toBe(false);\n expect(isPortableTextContent([{ type: \"list\" }])).toBe(false);\n expect(\n isPortableTextContent([{ type: \"list\", children: [\"not a node\"] }])\n ).toBe(false);\n expect(isPortableTextContent([{ type: \"media\" }])).toBe(false);\n expect(isPortableTextContent([{ type: \"titled-text\", content: [] }])).toBe(\n false\n );\n expect(\n isPortableTextContent([\n { type: \"titled-text\", title: \"Ranges\", content: \"oops\" },\n ])\n ).toBe(false);\n });\n\n it(\"accepts a titled-text with only a title, with or without content\", () => {\n expect(\n isPortableTextContent([{ type: \"titled-text\", title: \"Ranges\" }])\n ).toBe(true);\n expect(\n isPortableTextContent([\n { type: \"titled-text\", title: \"Ranges\", content: [] },\n ])\n ).toBe(true);\n });\n\n it(\"tells blocks, objects and spans apart\", () => {\n const [heading, paragraph] = sampleMessageContent;\n const callout = sampleMessageContent[5];\n\n expect(isPortableTextBlock(heading)).toBe(true);\n expect(isPortableTextBlock(callout)).toBe(false);\n expect(isPortableTextObjectNode(callout)).toBe(true);\n expect(isPortableTextObjectNode(heading)).toBe(false);\n expect(isPortableTextSpan({ text: \"plain\" })).toBe(true);\n expect(isPortableTextSpan(paragraph)).toBe(false);\n });\n\n it(\"ships a universal default set free of product elements\", () => {\n expect(PORTABLE_TEXT_DEFAULT_BLOCKS).toEqual([\n \"paragraph\",\n \"heading\",\n \"list\",\n \"list-item\",\n \"media\",\n \"titled-text\",\n ]);\n expect(PORTABLE_TEXT_DEFAULT_MARKS).toEqual([\n \"strong\",\n \"em\",\n \"code\",\n \"link\",\n ]);\n });\n\n it(\"accepts an application components map through the injection contract\", () => {\n const seen: string[] = [];\n const components: PortableTextComponents = {\n marks: {\n \"interface-name\": ({ children }) =>\n createElement(Fragment, null, children),\n },\n objects: {\n callout: ({ children }) => createElement(Fragment, null, children),\n },\n onUnknownType: (kind, type) => {\n seen.push(`${kind}:${type}`);\n },\n };\n\n components.onUnknownType?.(\"object\", \"some-future-element\");\n\n expect(Object.keys(components.marks ?? {})).toEqual([\"interface-name\"]);\n expect(seen).toEqual([\"object:some-future-element\"]);\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"types.test.js","names":["createElement","Fragment","isPortableTextBlock","isPortableTextContent","isPortableTextObjectNode","isPortableTextSpan","PORTABLE_TEXT_DEFAULT_BLOCKS","PORTABLE_TEXT_DEFAULT_MARKS","describe","sampleMessageContent","type","level","children","text","marks","article","style","src","variant","caption","title","content","_type","tone","label","language","code","header","rows","it","expect","toBe","payload","data","heading","paragraph","callout","toEqual","_components$marks","seen","components","_ref","objects","_ref2","onUnknownType","kind","push","Object","keys"],"sources":["../../../../src/components/PortableText/types.test.ts"],"sourcesContent":["import { createElement, Fragment } from \"react\";\n\nimport {\n isPortableTextBlock,\n isPortableTextContent,\n isPortableTextObjectNode,\n isPortableTextSpan,\n PORTABLE_TEXT_DEFAULT_BLOCKS,\n PORTABLE_TEXT_DEFAULT_MARKS,\n PortableTextComponents,\n PortableTextContent,\n} from \"./types\";\n\ndescribe(\"PortableText envelope\", () => {\n const sampleMessageContent: PortableTextContent = [\n { type: \"heading\", level: 2, children: [{ text: \"IP Firewall\" }] },\n {\n type: \"paragraph\",\n children: [\n { text: \"Open the \" },\n { text: \"Security page\", marks: [\"interface-name\"] },\n { text: \" and press \" },\n { text: \"Enter\", marks: [\"keyboard-key\"] },\n { text: \". Read more in \" },\n {\n text: \"the help article\",\n marks: [{ type: \"doc-link\", article: \"ip-firewall\" }],\n },\n { text: \".\" },\n ],\n },\n {\n type: \"list\",\n style: \"bullet\",\n children: [\n {\n type: \"list-item\",\n children: [{ text: \"Allowlist the IPs you trust\" }],\n },\n {\n type: \"list-item\",\n children: [{ text: \"immediately\", marks: [\"strong\"] }],\n },\n ],\n },\n {\n type: \"media\",\n src: \"/screenshots/firewall.png\",\n variant: \"screenshot\",\n caption: \"The firewall settings\",\n },\n {\n type: \"titled-text\",\n title: \"Allowlist the IPs you trust\",\n level: 3,\n content: [\n { type: \"paragraph\", children: [{ text: \"Add one range per line.\" }] },\n ],\n },\n {\n type: \"object\",\n _type: \"callout\",\n tone: \"note\",\n content: [\n {\n type: \"paragraph\",\n children: [{ text: \"Takes effect immediately.\" }],\n },\n ],\n },\n {\n type: \"object\",\n _type: \"button-reference\",\n label: \"Save Changes\",\n variant: \"primary\",\n },\n { type: \"divider\" },\n {\n type: \"code-block\",\n language: \"json\",\n code: '{ \"allowlist\": [\"203.0.113.0/24\"] }',\n },\n {\n type: \"table\",\n header: [[{ text: \"Range\" }], [{ text: \"Purpose\" }]],\n rows: [\n [\n [{ text: \"203.0.113.0/24\", marks: [\"code\"] }],\n [{ text: \"Office\", marks: [\"strong\"] }],\n ],\n [[{ text: \"198.51.100.0/24\", marks: [\"code\"] }], [{ text: \"VPN\" }]],\n ],\n },\n ];\n\n it(\"validates a sample message that mixes default blocks and catalog objects\", () => {\n expect(isPortableTextContent(sampleMessageContent)).toBe(true);\n });\n\n it(\"keeps unknown block and object types valid so older clients degrade instead of break\", () => {\n expect(\n isPortableTextContent([\n { type: \"some-future-block\", payload: 1 },\n { type: \"object\", _type: \"some-future-element\", data: true },\n ])\n ).toBe(true);\n });\n\n it(\"rejects nodes without a type discriminator and objects without _type\", () => {\n expect(isPortableTextContent([{ children: [] }])).toBe(false);\n expect(isPortableTextContent([{ type: \"object\" }])).toBe(false);\n expect(isPortableTextContent([\"paragraph\"])).toBe(false);\n expect(isPortableTextContent({ content: [] })).toBe(false);\n });\n\n it(\"rejects known blocks whose shape a serializer bug has broken\", () => {\n expect(isPortableTextContent([{ type: \"paragraph\" }])).toBe(false);\n expect(\n isPortableTextContent([{ type: \"heading\", level: 2, children: \"oops\" }])\n ).toBe(false);\n expect(\n isPortableTextContent([\n { type: \"paragraph\", children: [{ marks: [\"strong\"] }] },\n ])\n ).toBe(false);\n expect(isPortableTextContent([{ type: \"list\" }])).toBe(false);\n expect(\n isPortableTextContent([{ type: \"list\", children: [\"not a node\"] }])\n ).toBe(false);\n expect(isPortableTextContent([{ type: \"media\" }])).toBe(false);\n expect(isPortableTextContent([{ type: \"titled-text\", content: [] }])).toBe(\n false\n );\n expect(\n isPortableTextContent([\n { type: \"titled-text\", title: \"Ranges\", content: \"oops\" },\n ])\n ).toBe(false);\n });\n\n it(\"rejects malformed code-block, table and divider-adjacent shapes\", () => {\n expect(isPortableTextContent([{ type: \"code-block\" }])).toBe(false);\n expect(isPortableTextContent([{ type: \"code-block\", code: 42 }])).toBe(\n false\n );\n expect(\n isPortableTextContent([{ type: \"code-block\", code: \"x\", language: 1 }])\n ).toBe(false);\n expect(isPortableTextContent([{ type: \"table\" }])).toBe(false);\n expect(\n isPortableTextContent([{ type: \"table\", header: [], rows: \"oops\" }])\n ).toBe(false);\n expect(\n isPortableTextContent([\n { type: \"table\", header: [[{ text: \"A\" }]], rows: [[\"not a cell\"]] },\n ])\n ).toBe(false);\n expect(\n isPortableTextContent([\n { type: \"table\", header: [{ text: \"not a cell\" }], rows: [] },\n ])\n ).toBe(false);\n });\n\n it(\"accepts a code-block without a language and a table without rows\", () => {\n expect(\n isPortableTextContent([{ type: \"code-block\", code: \"npm install\" }])\n ).toBe(true);\n expect(\n isPortableTextContent([\n { type: \"table\", header: [[{ text: \"A\" }]], rows: [] },\n ])\n ).toBe(true);\n expect(isPortableTextContent([{ type: \"divider\" }])).toBe(true);\n });\n\n it(\"accepts a titled-text with only a title, with or without content\", () => {\n expect(\n isPortableTextContent([{ type: \"titled-text\", title: \"Ranges\" }])\n ).toBe(true);\n expect(\n isPortableTextContent([\n { type: \"titled-text\", title: \"Ranges\", content: [] },\n ])\n ).toBe(true);\n });\n\n it(\"tells blocks, objects and spans apart\", () => {\n const [heading, paragraph] = sampleMessageContent;\n const callout = sampleMessageContent[5];\n\n expect(isPortableTextBlock(heading)).toBe(true);\n expect(isPortableTextBlock(callout)).toBe(false);\n expect(isPortableTextObjectNode(callout)).toBe(true);\n expect(isPortableTextObjectNode(heading)).toBe(false);\n expect(isPortableTextSpan({ text: \"plain\" })).toBe(true);\n expect(isPortableTextSpan(paragraph)).toBe(false);\n });\n\n it(\"ships a universal default set free of product elements\", () => {\n expect(PORTABLE_TEXT_DEFAULT_BLOCKS).toEqual([\n \"paragraph\",\n \"heading\",\n \"list\",\n \"list-item\",\n \"media\",\n \"titled-text\",\n \"code-block\",\n \"table\",\n \"divider\",\n ]);\n expect(PORTABLE_TEXT_DEFAULT_MARKS).toEqual([\n \"strong\",\n \"em\",\n \"code\",\n \"link\",\n ]);\n });\n\n it(\"accepts an application components map through the injection contract\", () => {\n const seen: string[] = [];\n const components: PortableTextComponents = {\n marks: {\n \"interface-name\": ({ children }) =>\n createElement(Fragment, null, children),\n },\n objects: {\n callout: ({ children }) => createElement(Fragment, null, children),\n },\n onUnknownType: (kind, type) => {\n seen.push(`${kind}:${type}`);\n },\n };\n\n components.onUnknownType?.(\"object\", \"some-future-element\");\n\n expect(Object.keys(components.marks ?? {})).toEqual([\"interface-name\"]);\n expect(seen).toEqual([\"object:some-future-element\"]);\n });\n});\n"],"mappings":"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","ignoreList":[]}