@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.
- package/dist/cjs/components/PortableText/PortableText.js +12 -1
- package/dist/cjs/components/PortableText/PortableText.js.map +1 -1
- package/dist/cjs/components/PortableText/Styles.js +31 -2
- package/dist/cjs/components/PortableText/Styles.js.map +1 -1
- package/dist/cjs/components/PortableText/renderers.js +69 -5
- package/dist/cjs/components/PortableText/renderers.js.map +1 -1
- package/dist/cjs/components/PortableText/types.js +20 -2
- package/dist/cjs/components/PortableText/types.js.map +1 -1
- package/dist/cjs/components/PortableText/types.test.js +89 -1
- package/dist/cjs/components/PortableText/types.test.js.map +1 -1
- package/dist/esm/components/PortableText/PortableText.d.ts.map +1 -1
- package/dist/esm/components/PortableText/PortableText.js +8 -1
- package/dist/esm/components/PortableText/PortableText.js.map +1 -1
- package/dist/esm/components/PortableText/Styles.d.ts +14 -0
- package/dist/esm/components/PortableText/Styles.d.ts.map +1 -1
- package/dist/esm/components/PortableText/Styles.js +30 -1
- package/dist/esm/components/PortableText/Styles.js.map +1 -1
- package/dist/esm/components/PortableText/renderers.d.ts.map +1 -1
- package/dist/esm/components/PortableText/renderers.js +58 -6
- package/dist/esm/components/PortableText/renderers.js.map +1 -1
- package/dist/esm/components/PortableText/types.d.ts +31 -1
- package/dist/esm/components/PortableText/types.d.ts.map +1 -1
- package/dist/esm/components/PortableText/types.js +15 -1
- package/dist/esm/components/PortableText/types.js.map +1 -1
- package/dist/esm/components/PortableText/types.test.js +89 -1
- package/dist/esm/components/PortableText/types.test.js.map +1 -1
- package/dist/index.js +128 -6
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- 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-
|
|
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[(
|
|
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:
|
|
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;
|