@activecollab/components 2.0.410 → 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 +69 -5
  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 +89 -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 +58 -6
  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 +89 -1
  26. package/dist/esm/components/PortableText/types.test.js.map +1 -1
  27. package/dist/index.js +128 -6
  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
@@ -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,69 @@ 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
+ });
216
+ it("accepts a titled-text with only a title, with or without content", () => {
217
+ expect(isPortableTextContent([{
218
+ type: "titled-text",
219
+ title: "Ranges"
220
+ }])).toBe(true);
221
+ expect(isPortableTextContent([{
222
+ type: "titled-text",
223
+ title: "Ranges",
224
+ content: []
225
+ }])).toBe(true);
226
+ });
139
227
  it("tells blocks, objects and spans apart", () => {
140
228
  const heading = sampleMessageContent[0],
141
229
  paragraph = sampleMessageContent[1];
@@ -150,7 +238,7 @@ describe("PortableText envelope", () => {
150
238
  expect(isPortableTextSpan(paragraph)).toBe(false);
151
239
  });
152
240
  it("ships a universal default set free of product elements", () => {
153
- 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"]);
154
242
  expect(PORTABLE_TEXT_DEFAULT_MARKS).toEqual(["strong", "em", "code", "link"]);
155
243
  });
156
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(\"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":[]}
package/dist/index.js CHANGED
@@ -25292,10 +25292,39 @@
25292
25292
  })(["color:var(--color-primary);text-decoration:underline var(--color-primary);text-underline-offset:3px;&:hover{text-decoration:none;}"]);
25293
25293
  StyledLink.displayName = "StyledLink";
25294
25294
 
25295
+ /**
25296
+ * The default `code-block`: quiet preformatted content. It stays a bare
25297
+ * `<pre><code>` on purpose — article surfaces inject a Copy button onto
25298
+ * every `<pre>` they render.
25299
+ */
25300
+ var StyledCodeBlock = styled__default["default"].pre.withConfig({
25301
+ displayName: "Styles__StyledCodeBlock",
25302
+ componentId: "sc-1fss4z4-2"
25303
+ })(["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");
25304
+ StyledCodeBlock.displayName = "StyledCodeBlock";
25305
+
25306
+ /**
25307
+ * The default `table` block wrapper: Table ships page-level chrome (outer
25308
+ * margins) that flowing content does not want — the PortableText Stack owns
25309
+ * the vertical rhythm here.
25310
+ */
25311
+ var StyledTableBlock = styled__default["default"].div.withConfig({
25312
+ displayName: "Styles__StyledTableBlock",
25313
+ componentId: "sc-1fss4z4-3"
25314
+ })([".c-table__wrap{margin:0;}"]);
25315
+ StyledTableBlock.displayName = "StyledTableBlock";
25316
+
25317
+ /** The default `divider` block: a themed horizontal rule. */
25318
+ var StyledDivider = styled__default["default"].hr.withConfig({
25319
+ displayName: "Styles__StyledDivider",
25320
+ componentId: "sc-1fss4z4-4"
25321
+ })(["margin:0;border:none;border-top:1px solid var(--border-primary);"]);
25322
+ StyledDivider.displayName = "StyledDivider";
25323
+
25295
25324
  /** The default `list` block; rendered as ul or ol through the `as` prop. */
25296
25325
  var StyledList$1 = styled__default["default"].ul.withConfig({
25297
25326
  displayName: "Styles__StyledList",
25298
- componentId: "sc-1fss4z4-2"
25327
+ componentId: "sc-1fss4z4-5"
25299
25328
  })(["margin:0;padding-left:", ";list-style:", " outside;li + li{margin-top:", ";}"], "1.25rem", function (_ref) {
25300
25329
  var $ordered = _ref.$ordered;
25301
25330
  return $ordered ? "decimal" : "disc";
@@ -25451,14 +25480,34 @@
25451
25480
  3: "header2"
25452
25481
  };
25453
25482
 
25483
+ /** The level `heading` and `titled-text` fall back to. */
25484
+ var DEFAULT_HEADING_LEVEL = 3;
25485
+
25486
+ /**
25487
+ * Resolve a semantic wire level to its typography variant. An absent level is
25488
+ * the documented default; any other unrecognised level is a serializer bug on
25489
+ * a fixed 1–3 scale, so it falls back to the default and is logged, per the
25490
+ * contract's degradation rule.
25491
+ */
25492
+ var headingVariantForLevel = function headingVariantForLevel(level) {
25493
+ if (level === undefined) {
25494
+ return HEADING_LEVEL_VARIANTS[DEFAULT_HEADING_LEVEL];
25495
+ }
25496
+ var variant = HEADING_LEVEL_VARIANTS[level];
25497
+ if (!variant) {
25498
+ console.warn("PortableText: unknown heading level ".concat(level, ", falling back to ").concat(DEFAULT_HEADING_LEVEL, "."));
25499
+ return HEADING_LEVEL_VARIANTS[DEFAULT_HEADING_LEVEL];
25500
+ }
25501
+ return variant;
25502
+ };
25503
+
25454
25504
  /** Heading levels map to the same typography TitledText uses. */
25455
25505
  var HeadingBlock = function HeadingBlock(_ref5) {
25456
- var _HEADING_LEVEL_VARIAN;
25457
25506
  var block = _ref5.block,
25458
25507
  children = _ref5.children;
25459
25508
  var _ref6 = block,
25460
25509
  level = _ref6.level;
25461
- var Heading = titledTextHeadings[(_HEADING_LEVEL_VARIAN = HEADING_LEVEL_VARIANTS[level]) !== null && _HEADING_LEVEL_VARIAN !== void 0 ? _HEADING_LEVEL_VARIAN : "header2"];
25510
+ var Heading = titledTextHeadings[headingVariantForLevel(level)];
25462
25511
  return /*#__PURE__*/React__default["default"].createElement(Heading, null, children);
25463
25512
  };
25464
25513
  var portableTextDefaultBlockRenderers = {
@@ -25505,8 +25554,51 @@
25505
25554
  level = _ref11.level;
25506
25555
  return /*#__PURE__*/React__default["default"].createElement(TitledText, {
25507
25556
  title: title,
25508
- variant: HEADING_LEVEL_VARIANTS[level !== null && level !== void 0 ? level : 3]
25557
+ variant: headingVariantForLevel(level)
25509
25558
  }, children);
25559
+ },
25560
+ // No highlighter ships with the default set, so every language — known,
25561
+ // unknown or absent — is plain preformatted text; the hint travels on
25562
+ // data-language for surfaces that highlight.
25563
+ "code-block": function codeBlock(_ref12) {
25564
+ var block = _ref12.block;
25565
+ var _ref13 = block,
25566
+ code = _ref13.code,
25567
+ language = _ref13.language;
25568
+ return /*#__PURE__*/React__default["default"].createElement(StyledCodeBlock, {
25569
+ "data-language": language || undefined
25570
+ }, /*#__PURE__*/React__default["default"].createElement("code", null, code));
25571
+ },
25572
+ table: function table(_ref14) {
25573
+ var block = _ref14.block,
25574
+ renderSpans = _ref14.renderSpans;
25575
+ var _ref15 = block,
25576
+ header = _ref15.header,
25577
+ rows = _ref15.rows;
25578
+ // Standalone (engine-less) use has no span renderer — keep the raw text.
25579
+ var cell = function cell(spans) {
25580
+ return renderSpans ? renderSpans(spans) : spans.map(function (span, index) {
25581
+ return /*#__PURE__*/React__default["default"].createElement(React.Fragment, {
25582
+ key: index
25583
+ }, span.text);
25584
+ });
25585
+ };
25586
+ return /*#__PURE__*/React__default["default"].createElement(StyledTableBlock, null, /*#__PURE__*/React__default["default"].createElement(Table, null, /*#__PURE__*/React__default["default"].createElement(Thead, null, /*#__PURE__*/React__default["default"].createElement("tr", null, header.map(function (spans, index) {
25587
+ return /*#__PURE__*/React__default["default"].createElement("th", {
25588
+ key: index
25589
+ }, cell(spans));
25590
+ }))), /*#__PURE__*/React__default["default"].createElement(Tbody, null, rows.map(function (row, rowIndex) {
25591
+ return /*#__PURE__*/React__default["default"].createElement("tr", {
25592
+ key: rowIndex
25593
+ }, row.map(function (spans, cellIndex) {
25594
+ return /*#__PURE__*/React__default["default"].createElement("td", {
25595
+ key: cellIndex
25596
+ }, cell(spans));
25597
+ }));
25598
+ }))));
25599
+ },
25600
+ divider: function divider() {
25601
+ return /*#__PURE__*/React__default["default"].createElement(StyledDivider, null);
25510
25602
  }
25511
25603
  };
25512
25604
 
@@ -25541,6 +25633,10 @@
25541
25633
 
25542
25634
  /** Screenshots render framed (border, no shadow); illustrations render flat. */
25543
25635
 
25636
+ /** A table cell is a span array, so inline marks work inside cells. */
25637
+
25638
+ /** A themed horizontal rule between sections. Carries no data. */
25639
+
25544
25640
  /**
25545
25641
  * Derived from the union's discriminators, so adding a block to the union
25546
25642
  * without a renderer entry is a compile error, never silent drift.
@@ -25554,7 +25650,10 @@
25554
25650
  list: true,
25555
25651
  "list-item": true,
25556
25652
  media: true,
25557
- "titled-text": true
25653
+ "titled-text": true,
25654
+ "code-block": true,
25655
+ table: true,
25656
+ divider: true
25558
25657
  };
25559
25658
 
25560
25659
  /** Blocks every client understands without injection. */
@@ -25591,6 +25690,11 @@
25591
25690
  var isPortableTextSpan = function isPortableTextSpan(value) {
25592
25691
  return isRecord(value) && typeof value.text === "string";
25593
25692
  };
25693
+ var isPortableTextTableRow = function isPortableTextTableRow(value) {
25694
+ return Array.isArray(value) && value.every(function (cell) {
25695
+ return Array.isArray(cell) && cell.every(isPortableTextSpan);
25696
+ });
25697
+ };
25594
25698
  var isPortableTextObjectNode = function isPortableTextObjectNode(value) {
25595
25699
  return isRecord(value) && value.type === "object" && typeof value._type === "string";
25596
25700
  };
@@ -25616,6 +25720,12 @@
25616
25720
  return typeof value.src === "string";
25617
25721
  case "titled-text":
25618
25722
  return typeof value.title === "string" && (value.content === undefined || isPortableTextContent(value.content));
25723
+ case "code-block":
25724
+ return typeof value.code === "string" && (value.language === undefined || typeof value.language === "string");
25725
+ case "table":
25726
+ return isPortableTextTableRow(value.header) && Array.isArray(value.rows) && value.rows.every(isPortableTextTableRow);
25727
+ case "divider":
25728
+ return true;
25619
25729
  default:
25620
25730
  return true;
25621
25731
  }
@@ -25677,8 +25787,19 @@
25677
25787
  ctx.report("block", block.type);
25678
25788
  return null;
25679
25789
  }
25790
+
25791
+ // Blocks that carry spans outside `children` (table cells) render them
25792
+ // through this engine-bound helper, so mark injection works there too.
25793
+ var renderSpans = function renderSpans(spans) {
25794
+ return spans.map(function (span, index) {
25795
+ return /*#__PURE__*/React__default["default"].createElement(React.Fragment, {
25796
+ key: index
25797
+ }, renderSpan(span, ctx));
25798
+ });
25799
+ };
25680
25800
  return /*#__PURE__*/React__default["default"].createElement(Renderer, {
25681
- block: block
25801
+ block: block,
25802
+ renderSpans: renderSpans
25682
25803
  }, renderBlockChildren(block, ctx));
25683
25804
  };
25684
25805
  var renderObject = function renderObject(node, ctx) {
@@ -30402,6 +30523,7 @@
30402
30523
  exports.isPortableTextContent = isPortableTextContent;
30403
30524
  exports.isPortableTextObjectNode = isPortableTextObjectNode;
30404
30525
  exports.isPortableTextSpan = isPortableTextSpan;
30526
+ exports.isPortableTextTableRow = isPortableTextTableRow;
30405
30527
  exports.isResizeKey = isResizeKey;
30406
30528
  exports.isValidUrl = isValidUrl;
30407
30529
  exports.keyboardResize = keyboardResize;