@activecollab/components 2.0.410 → 2.0.411

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.
@@ -55,14 +55,34 @@ var HEADING_LEVEL_VARIANTS = {
55
55
  3: "header2"
56
56
  };
57
57
 
58
+ /** The level `heading` and `titled-text` fall back to. */
59
+ var DEFAULT_HEADING_LEVEL = 3;
60
+
61
+ /**
62
+ * Resolve a semantic wire level to its typography variant. An absent level is
63
+ * the documented default; any other unrecognised level is a serializer bug on
64
+ * a fixed 1–3 scale, so it falls back to the default and is logged, per the
65
+ * contract's degradation rule.
66
+ */
67
+ var headingVariantForLevel = function headingVariantForLevel(level) {
68
+ if (level === undefined) {
69
+ return HEADING_LEVEL_VARIANTS[DEFAULT_HEADING_LEVEL];
70
+ }
71
+ var variant = HEADING_LEVEL_VARIANTS[level];
72
+ if (!variant) {
73
+ console.warn("PortableText: unknown heading level ".concat(level, ", falling back to ").concat(DEFAULT_HEADING_LEVEL, "."));
74
+ return HEADING_LEVEL_VARIANTS[DEFAULT_HEADING_LEVEL];
75
+ }
76
+ return variant;
77
+ };
78
+
58
79
  /** Heading levels map to the same typography TitledText uses. */
59
80
  var HeadingBlock = function HeadingBlock(_ref5) {
60
- var _HEADING_LEVEL_VARIAN;
61
81
  var block = _ref5.block,
62
82
  children = _ref5.children;
63
83
  var _ref6 = block,
64
84
  level = _ref6.level;
65
- var Heading = _TitledText.titledTextHeadings[(_HEADING_LEVEL_VARIAN = HEADING_LEVEL_VARIANTS[level]) !== null && _HEADING_LEVEL_VARIAN !== void 0 ? _HEADING_LEVEL_VARIAN : "header2"];
85
+ var Heading = _TitledText.titledTextHeadings[headingVariantForLevel(level)];
66
86
  return /*#__PURE__*/_react.default.createElement(Heading, null, children);
67
87
  };
68
88
  var portableTextDefaultBlockRenderers = exports.portableTextDefaultBlockRenderers = {
@@ -109,7 +129,7 @@ var portableTextDefaultBlockRenderers = exports.portableTextDefaultBlockRenderer
109
129
  level = _ref11.level;
110
130
  return /*#__PURE__*/_react.default.createElement(_TitledText.TitledText, {
111
131
  title: title,
112
- variant: HEADING_LEVEL_VARIANTS[level !== null && level !== void 0 ? level : 3]
132
+ variant: headingVariantForLevel(level)
113
133
  }, children);
114
134
  }
115
135
  };
@@ -1 +1 @@
1
- {"version":3,"file":"renderers.js","names":["_react","_interopRequireDefault","require","_Styles","_Media","_TitledText","_Typography","_Typography2","e","__esModule","default","portableTextDefaultMarkRenderers","exports","strong","_ref","children","createElement","em","_ref2","code","_ref3","StyledCode","link","_ref4","mark","href","Fragment","StyledLink","target","rel","HEADING_LEVEL_VARIANTS","HeadingBlock","_ref5","_HEADING_LEVEL_VARIAN","block","_ref6","level","Heading","titledTextHeadings","portableTextDefaultBlockRenderers","paragraph","_ref7","Body1","heading","list","_ref8","ordered","style","StyledList","as","$ordered","listItem","_ref9","Typography","variant","media","_ref0","_ref1","src","alt","caption","Media","titledText","_ref10","_ref11","title","TitledText"],"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/** Heading levels map to the same typography TitledText uses. */\nconst HeadingBlock: PortableTextBlockRenderer = ({ block, children }) => {\n const { level } = block as PortableTextHeadingBlock;\n const Heading =\n titledTextHeadings[HEADING_LEVEL_VARIANTS[level] ?? \"header2\"];\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={HEADING_LEVEL_VARIANTS[level ?? 3]}>\n {children}\n </TitledText>\n );\n },\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AAaA,IAAAE,MAAA,GAAAF,OAAA;AACA,IAAAG,WAAA,GAAAH,OAAA;AAKA,IAAAI,WAAA,GAAAJ,OAAA;AACA,IAAAK,YAAA,GAAAL,OAAA;AAAsD,SAAAD,uBAAAO,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEtD;AACA;AACA;AACA;AACA;;AAEO,IAAMG,gCAGZ,GAAAC,OAAA,CAAAD,gCAAA,GAAG;EACFE,MAAM,EAAE,SAARA,MAAMA,CAAAC,IAAA;IAAA,IAAKC,QAAQ,GAAAD,IAAA,CAARC,QAAQ;IAAA,oBAAOf,MAAA,CAAAU,OAAA,CAAAM,aAAA,iBAASD,QAAiB,CAAC;EAAA;EACrDE,EAAE,EAAE,SAAJA,EAAEA,CAAAC,KAAA;IAAA,IAAKH,QAAQ,GAAAG,KAAA,CAARH,QAAQ;IAAA,oBAAOf,MAAA,CAAAU,OAAA,CAAAM,aAAA,aAAKD,QAAa,CAAC;EAAA;EACzCI,IAAI,EAAE,SAANA,IAAIA,CAAAC,KAAA;IAAA,IAAKL,QAAQ,GAAAK,KAAA,CAARL,QAAQ;IAAA,oBAAOf,MAAA,CAAAU,OAAA,CAAAM,aAAA,CAACb,OAAA,CAAAkB,UAAU,QAAEN,QAAqB,CAAC;EAAA;EAC3DO,IAAI,EAAE,SAANA,IAAIA,CAAAC,KAAA,EAA0B;IAAA,IAArBC,IAAI,GAAAD,KAAA,CAAJC,IAAI;MAAET,QAAQ,GAAAQ,KAAA,CAARR,QAAQ;IACrB,IAAMU,IAAI,GAAID,IAAI,aAAJA,IAAI,uBAAJA,IAAI,CAAuCC,IAAI;;IAE7D;IACA;IACA,IAAI,CAACA,IAAI,EAAE;MACT,oBAAOzB,MAAA,CAAAU,OAAA,CAAAM,aAAA,CAAAhB,MAAA,CAAAU,OAAA,CAAAgB,QAAA,QAAGX,QAAW,CAAC;IACxB;IAEA,oBACEf,MAAA,CAAAU,OAAA,CAAAM,aAAA,CAACb,OAAA,CAAAwB,UAAU;MAACF,IAAI,EAAEA,IAAK;MAACG,MAAM,EAAC,QAAQ;MAACC,GAAG,EAAC;IAAqB,GAC9Dd,QACS,CAAC;EAEjB;AACF,CAAC;;AAED;AACA,IAAMe,sBAGL,GAAG;EACF,CAAC,EAAE,QAAQ;EACX,CAAC,EAAE,QAAQ;EACX,CAAC,EAAE;AACL,CAAC;;AAED;AACA,IAAMC,YAAuC,GAAG,SAA1CA,YAAuCA,CAAAC,KAAA,EAA4B;EAAA,IAAAC,qBAAA;EAAA,IAAtBC,KAAK,GAAAF,KAAA,CAALE,KAAK;IAAEnB,QAAQ,GAAAiB,KAAA,CAARjB,QAAQ;EAChE,IAAAoB,KAAA,GAAkBD,KAAK;IAAfE,KAAK,GAAAD,KAAA,CAALC,KAAK;EACb,IAAMC,OAAO,GACXC,8BAAkB,EAAAL,qBAAA,GAACH,sBAAsB,CAACM,KAAK,CAAC,cAAAH,qBAAA,cAAAA,qBAAA,GAAI,SAAS,CAAC;EAChE,oBAAOjC,MAAA,CAAAU,OAAA,CAAAM,aAAA,CAACqB,OAAO,QAAEtB,QAAkB,CAAC;AACtC,CAAC;AAEM,IAAMwB,iCAGZ,GAAA3B,OAAA,CAAA2B,iCAAA,GAAG;EACFC,SAAS,EAAE,SAAXA,SAASA,CAAAC,KAAA;IAAA,IAAK1B,QAAQ,GAAA0B,KAAA,CAAR1B,QAAQ;IAAA,oBAAOf,MAAA,CAAAU,OAAA,CAAAM,aAAA,CAACV,WAAA,CAAAoC,KAAK,QAAE3B,QAAgB,CAAC;EAAA;EACtD4B,OAAO,EAAEZ,YAAY;EACrBa,IAAI,EAAE,SAANA,IAAIA,CAAAC,KAAA,EAA2B;IAAA,IAAtBX,KAAK,GAAAW,KAAA,CAALX,KAAK;MAAEnB,QAAQ,GAAA8B,KAAA,CAAR9B,QAAQ;IACtB,IAAM+B,OAAO,GAAIZ,KAAK,CAA2Ba,KAAK,KAAK,QAAQ;IACnE,oBACE/C,MAAA,CAAAU,OAAA,CAAAM,aAAA,CAACb,OAAA,CAAA6C,UAAU;MAACC,EAAE,EAAEH,OAAO,GAAG,IAAI,GAAG,IAAK;MAACI,QAAQ,EAAEJ;IAAQ,GACtD/B,QACS,CAAC;EAEjB,CAAC;EACD,WAAW,EAAE,SAAboC,QAAWA,CAAAC,KAAA;IAAA,IAAKrC,QAAQ,GAAAqC,KAAA,CAARrC,QAAQ;IAAA,oBACtBf,MAAA,CAAAU,OAAA,CAAAM,aAAA,CAACT,YAAA,CAAA8C,UAAU;MAACC,OAAO,EAAC,QAAQ;MAACL,EAAE,EAAC;IAAI,GACjClC,QACS,CAAC;EAAA,CACd;EACDwC,KAAK,EAAE,SAAPA,KAAKA,CAAAC,KAAA,EAAiB;IAAA,IAAZtB,KAAK,GAAAsB,KAAA,CAALtB,KAAK;IACb,IAAAuB,KAAA,GAAuCvB,KAAK;MAApCwB,GAAG,GAAAD,KAAA,CAAHC,GAAG;MAAEC,GAAG,GAAAF,KAAA,CAAHE,GAAG;MAAEL,OAAO,GAAAG,KAAA,CAAPH,OAAO;MAAEM,OAAO,GAAAH,KAAA,CAAPG,OAAO;IAClC,oBAAO5D,MAAA,CAAAU,OAAA,CAAAM,aAAA,CAACZ,MAAA,CAAAyD,KAAK;MAACH,GAAG,EAAEA,GAAI;MAACC,GAAG,EAAEA,GAAI;MAACL,OAAO,EAAEA,OAAQ;MAACM,OAAO,EAAEA;IAAQ,CAAE,CAAC;EAC1E,CAAC;EACD,aAAa,EAAE,SAAfE,UAAaA,CAAAC,MAAA,EAA2B;IAAA,IAAtB7B,KAAK,GAAA6B,MAAA,CAAL7B,KAAK;MAAEnB,QAAQ,GAAAgD,MAAA,CAARhD,QAAQ;IAC/B,IAAAiD,MAAA,GAAyB9B,KAAK;MAAtB+B,KAAK,GAAAD,MAAA,CAALC,KAAK;MAAE7B,KAAK,GAAA4B,MAAA,CAAL5B,KAAK;IACpB,oBACEpC,MAAA,CAAAU,OAAA,CAAAM,aAAA,CAACX,WAAA,CAAA6D,UAAU;MAACD,KAAK,EAAEA,KAAM;MAACX,OAAO,EAAExB,sBAAsB,CAACM,KAAK,aAALA,KAAK,cAALA,KAAK,GAAI,CAAC;IAAE,GACnErB,QACS,CAAC;EAEjB;AACF,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"renderers.js","names":["_react","_interopRequireDefault","require","_Styles","_Media","_TitledText","_Typography","_Typography2","e","__esModule","default","portableTextDefaultMarkRenderers","exports","strong","_ref","children","createElement","em","_ref2","code","_ref3","StyledCode","link","_ref4","mark","href","Fragment","StyledLink","target","rel","HEADING_LEVEL_VARIANTS","DEFAULT_HEADING_LEVEL","headingVariantForLevel","level","undefined","variant","console","warn","concat","HeadingBlock","_ref5","block","_ref6","Heading","titledTextHeadings","portableTextDefaultBlockRenderers","paragraph","_ref7","Body1","heading","list","_ref8","ordered","style","StyledList","as","$ordered","listItem","_ref9","Typography","media","_ref0","_ref1","src","alt","caption","Media","titledText","_ref10","_ref11","title","TitledText"],"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":[]}
@@ -138,6 +138,17 @@ describe("PortableText envelope", function () {
138
138
  content: "oops"
139
139
  }])).toBe(false);
140
140
  });
141
+ it("accepts a titled-text with only a title, with or without content", function () {
142
+ expect((0, _types.isPortableTextContent)([{
143
+ type: "titled-text",
144
+ title: "Ranges"
145
+ }])).toBe(true);
146
+ expect((0, _types.isPortableTextContent)([{
147
+ type: "titled-text",
148
+ title: "Ranges",
149
+ content: []
150
+ }])).toBe(true);
151
+ });
141
152
  it("tells blocks, objects and spans apart", function () {
142
153
  var heading = sampleMessageContent[0],
143
154
  paragraph = sampleMessageContent[1];
@@ -1 +1 @@
1
- {"version":3,"file":"types.test.js","names":["_react","require","_types","describe","sampleMessageContent","type","level","children","text","marks","article","style","src","variant","caption","title","content","_type","tone","label","it","expect","isPortableTextContent","toBe","payload","data","heading","paragraph","callout","isPortableTextBlock","isPortableTextObjectNode","isPortableTextSpan","PORTABLE_TEXT_DEFAULT_BLOCKS","toEqual","PORTABLE_TEXT_DEFAULT_MARKS","_components$onUnknown","_components$marks","seen","components","interfaceName","_ref","createElement","Fragment","objects","_ref2","onUnknownType","kind","push","concat","call","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":["_react","require","_types","describe","sampleMessageContent","type","level","children","text","marks","article","style","src","variant","caption","title","content","_type","tone","label","it","expect","isPortableTextContent","toBe","payload","data","heading","paragraph","callout","isPortableTextBlock","isPortableTextObjectNode","isPortableTextSpan","PORTABLE_TEXT_DEFAULT_BLOCKS","toEqual","PORTABLE_TEXT_DEFAULT_MARKS","_components$onUnknown","_components$marks","seen","components","interfaceName","_ref","createElement","Fragment","objects","_ref2","onUnknownType","kind","push","concat","call","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 +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;AAoBF,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":"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"}
@@ -49,14 +49,34 @@ const HEADING_LEVEL_VARIANTS = {
49
49
  3: "header2"
50
50
  };
51
51
 
52
+ /** The level `heading` and `titled-text` fall back to. */
53
+ const DEFAULT_HEADING_LEVEL = 3;
54
+
55
+ /**
56
+ * Resolve a semantic wire level to its typography variant. An absent level is
57
+ * the documented default; any other unrecognised level is a serializer bug on
58
+ * a fixed 1–3 scale, so it falls back to the default and is logged, per the
59
+ * contract's degradation rule.
60
+ */
61
+ const headingVariantForLevel = level => {
62
+ if (level === undefined) {
63
+ return HEADING_LEVEL_VARIANTS[DEFAULT_HEADING_LEVEL];
64
+ }
65
+ const variant = HEADING_LEVEL_VARIANTS[level];
66
+ if (!variant) {
67
+ console.warn("PortableText: unknown heading level " + level + ", falling back to " + DEFAULT_HEADING_LEVEL + ".");
68
+ return HEADING_LEVEL_VARIANTS[DEFAULT_HEADING_LEVEL];
69
+ }
70
+ return variant;
71
+ };
72
+
52
73
  /** Heading levels map to the same typography TitledText uses. */
53
74
  const HeadingBlock = _ref5 => {
54
- var _HEADING_LEVEL_VARIAN;
55
75
  let block = _ref5.block,
56
76
  children = _ref5.children;
57
77
  const _ref6 = block,
58
78
  level = _ref6.level;
59
- const Heading = titledTextHeadings[(_HEADING_LEVEL_VARIAN = HEADING_LEVEL_VARIANTS[level]) != null ? _HEADING_LEVEL_VARIAN : "header2"];
79
+ const Heading = titledTextHeadings[headingVariantForLevel(level)];
60
80
  return /*#__PURE__*/React.createElement(Heading, null, children);
61
81
  };
62
82
  export const portableTextDefaultBlockRenderers = {
@@ -103,7 +123,7 @@ export const portableTextDefaultBlockRenderers = {
103
123
  level = _ref11.level;
104
124
  return /*#__PURE__*/React.createElement(TitledText, {
105
125
  title: title,
106
- variant: HEADING_LEVEL_VARIANTS[level != null ? level : 3]
126
+ variant: headingVariantForLevel(level)
107
127
  }, children);
108
128
  }
109
129
  };
@@ -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","HeadingBlock","_ref5","_HEADING_LEVEL_VARIAN","block","_ref6","level","Heading","portableTextDefaultBlockRenderers","paragraph","_ref7","heading","list","_ref8","ordered","style","as","$ordered","_ref9","variant","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/** Heading levels map to the same typography TitledText uses. */\nconst HeadingBlock: PortableTextBlockRenderer = ({ block, children }) => {\n const { level } = block as PortableTextHeadingBlock;\n const Heading =\n titledTextHeadings[HEADING_LEVEL_VARIANTS[level] ?? \"header2\"];\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={HEADING_LEVEL_VARIANTS[level ?? 3]}>\n {children}\n </TitledText>\n );\n },\n};\n"],"mappings":"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","ignoreList":[]}
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":[]}
@@ -136,6 +136,17 @@ describe("PortableText envelope", () => {
136
136
  content: "oops"
137
137
  }])).toBe(false);
138
138
  });
139
+ it("accepts a titled-text with only a title, with or without content", () => {
140
+ expect(isPortableTextContent([{
141
+ type: "titled-text",
142
+ title: "Ranges"
143
+ }])).toBe(true);
144
+ expect(isPortableTextContent([{
145
+ type: "titled-text",
146
+ title: "Ranges",
147
+ content: []
148
+ }])).toBe(true);
149
+ });
139
150
  it("tells blocks, objects and spans apart", () => {
140
151
  const heading = sampleMessageContent[0],
141
152
  paragraph = sampleMessageContent[1];
@@ -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","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":"AAAA,SAASA,aAAa,EAAEC,QAAQ,QAAQ,OAAO;AAE/C,SACEC,mBAAmB,EACnBC,qBAAqB,EACrBC,wBAAwB,EACxBC,kBAAkB,EAClBC,4BAA4B,EAC5BC,2BAA2B,QAGtB,SAAS;AAEhBC,QAAQ,CAAC,uBAAuB,EAAE,MAAM;EACtC,MAAMC,oBAAyC,GAAG,CAChD;IAAEC,IAAI,EAAE,SAAS;IAAEC,KAAK,EAAE,CAAC;IAAEC,QAAQ,EAAE,CAAC;MAAEC,IAAI,EAAE;IAAc,CAAC;EAAE,CAAC,EAClE;IACEH,IAAI,EAAE,WAAW;IACjBE,QAAQ,EAAE,CACR;MAAEC,IAAI,EAAE;IAAY,CAAC,EACrB;MAAEA,IAAI,EAAE,eAAe;MAAEC,KAAK,EAAE,CAAC,gBAAgB;IAAE,CAAC,EACpD;MAAED,IAAI,EAAE;IAAc,CAAC,EACvB;MAAEA,IAAI,EAAE,OAAO;MAAEC,KAAK,EAAE,CAAC,cAAc;IAAE,CAAC,EAC1C;MAAED,IAAI,EAAE;IAAkB,CAAC,EAC3B;MACEA,IAAI,EAAE,kBAAkB;MACxBC,KAAK,EAAE,CAAC;QAAEJ,IAAI,EAAE,UAAU;QAAEK,OAAO,EAAE;MAAc,CAAC;IACtD,CAAC,EACD;MAAEF,IAAI,EAAE;IAAI,CAAC;EAEjB,CAAC,EACD;IACEH,IAAI,EAAE,MAAM;IACZM,KAAK,EAAE,QAAQ;IACfJ,QAAQ,EAAE,CACR;MACEF,IAAI,EAAE,WAAW;MACjBE,QAAQ,EAAE,CAAC;QAAEC,IAAI,EAAE;MAA8B,CAAC;IACpD,CAAC,EACD;MACEH,IAAI,EAAE,WAAW;MACjBE,QAAQ,EAAE,CAAC;QAAEC,IAAI,EAAE,aAAa;QAAEC,KAAK,EAAE,CAAC,QAAQ;MAAE,CAAC;IACvD,CAAC;EAEL,CAAC,EACD;IACEJ,IAAI,EAAE,OAAO;IACbO,GAAG,EAAE,2BAA2B;IAChCC,OAAO,EAAE,YAAY;IACrBC,OAAO,EAAE;EACX,CAAC,EACD;IACET,IAAI,EAAE,aAAa;IACnBU,KAAK,EAAE,6BAA6B;IACpCT,KAAK,EAAE,CAAC;IACRU,OAAO,EAAE,CACP;MAAEX,IAAI,EAAE,WAAW;MAAEE,QAAQ,EAAE,CAAC;QAAEC,IAAI,EAAE;MAA0B,CAAC;IAAE,CAAC;EAE1E,CAAC,EACD;IACEH,IAAI,EAAE,QAAQ;IACdY,KAAK,EAAE,SAAS;IAChBC,IAAI,EAAE,MAAM;IACZF,OAAO,EAAE,CACP;MACEX,IAAI,EAAE,WAAW;MACjBE,QAAQ,EAAE,CAAC;QAAEC,IAAI,EAAE;MAA4B,CAAC;IAClD,CAAC;EAEL,CAAC,EACD;IACEH,IAAI,EAAE,QAAQ;IACdY,KAAK,EAAE,kBAAkB;IACzBE,KAAK,EAAE,cAAc;IACrBN,OAAO,EAAE;EACX,CAAC,CACF;EAEDO,EAAE,CAAC,0EAA0E,EAAE,MAAM;IACnFC,MAAM,CAACvB,qBAAqB,CAACM,oBAAoB,CAAC,CAAC,CAACkB,IAAI,CAAC,IAAI,CAAC;EAChE,CAAC,CAAC;EAEFF,EAAE,CAAC,sFAAsF,EAAE,MAAM;IAC/FC,MAAM,CACJvB,qBAAqB,CAAC,CACpB;MAAEO,IAAI,EAAE,mBAAmB;MAAEkB,OAAO,EAAE;IAAE,CAAC,EACzC;MAAElB,IAAI,EAAE,QAAQ;MAAEY,KAAK,EAAE,qBAAqB;MAAEO,IAAI,EAAE;IAAK,CAAC,CAC7D,CACH,CAAC,CAACF,IAAI,CAAC,IAAI,CAAC;EACd,CAAC,CAAC;EAEFF,EAAE,CAAC,sEAAsE,EAAE,MAAM;IAC/EC,MAAM,CAACvB,qBAAqB,CAAC,CAAC;MAAES,QAAQ,EAAE;IAAG,CAAC,CAAC,CAAC,CAAC,CAACe,IAAI,CAAC,KAAK,CAAC;IAC7DD,MAAM,CAACvB,qBAAqB,CAAC,CAAC;MAAEO,IAAI,EAAE;IAAS,CAAC,CAAC,CAAC,CAAC,CAACiB,IAAI,CAAC,KAAK,CAAC;IAC/DD,MAAM,CAACvB,qBAAqB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAACwB,IAAI,CAAC,KAAK,CAAC;IACxDD,MAAM,CAACvB,qBAAqB,CAAC;MAAEkB,OAAO,EAAE;IAAG,CAAC,CAAC,CAAC,CAACM,IAAI,CAAC,KAAK,CAAC;EAC5D,CAAC,CAAC;EAEFF,EAAE,CAAC,8DAA8D,EAAE,MAAM;IACvEC,MAAM,CAACvB,qBAAqB,CAAC,CAAC;MAAEO,IAAI,EAAE;IAAY,CAAC,CAAC,CAAC,CAAC,CAACiB,IAAI,CAAC,KAAK,CAAC;IAClED,MAAM,CACJvB,qBAAqB,CAAC,CAAC;MAAEO,IAAI,EAAE,SAAS;MAAEC,KAAK,EAAE,CAAC;MAAEC,QAAQ,EAAE;IAAO,CAAC,CAAC,CACzE,CAAC,CAACe,IAAI,CAAC,KAAK,CAAC;IACbD,MAAM,CACJvB,qBAAqB,CAAC,CACpB;MAAEO,IAAI,EAAE,WAAW;MAAEE,QAAQ,EAAE,CAAC;QAAEE,KAAK,EAAE,CAAC,QAAQ;MAAE,CAAC;IAAE,CAAC,CACzD,CACH,CAAC,CAACa,IAAI,CAAC,KAAK,CAAC;IACbD,MAAM,CAACvB,qBAAqB,CAAC,CAAC;MAAEO,IAAI,EAAE;IAAO,CAAC,CAAC,CAAC,CAAC,CAACiB,IAAI,CAAC,KAAK,CAAC;IAC7DD,MAAM,CACJvB,qBAAqB,CAAC,CAAC;MAAEO,IAAI,EAAE,MAAM;MAAEE,QAAQ,EAAE,CAAC,YAAY;IAAE,CAAC,CAAC,CACpE,CAAC,CAACe,IAAI,CAAC,KAAK,CAAC;IACbD,MAAM,CAACvB,qBAAqB,CAAC,CAAC;MAAEO,IAAI,EAAE;IAAQ,CAAC,CAAC,CAAC,CAAC,CAACiB,IAAI,CAAC,KAAK,CAAC;IAC9DD,MAAM,CAACvB,qBAAqB,CAAC,CAAC;MAAEO,IAAI,EAAE,aAAa;MAAEW,OAAO,EAAE;IAAG,CAAC,CAAC,CAAC,CAAC,CAACM,IAAI,CACxE,KACF,CAAC;IACDD,MAAM,CACJvB,qBAAqB,CAAC,CACpB;MAAEO,IAAI,EAAE,aAAa;MAAEU,KAAK,EAAE,QAAQ;MAAEC,OAAO,EAAE;IAAO,CAAC,CAC1D,CACH,CAAC,CAACM,IAAI,CAAC,KAAK,CAAC;EACf,CAAC,CAAC;EAEFF,EAAE,CAAC,kEAAkE,EAAE,MAAM;IAC3EC,MAAM,CACJvB,qBAAqB,CAAC,CAAC;MAAEO,IAAI,EAAE,aAAa;MAAEU,KAAK,EAAE;IAAS,CAAC,CAAC,CAClE,CAAC,CAACO,IAAI,CAAC,IAAI,CAAC;IACZD,MAAM,CACJvB,qBAAqB,CAAC,CACpB;MAAEO,IAAI,EAAE,aAAa;MAAEU,KAAK,EAAE,QAAQ;MAAEC,OAAO,EAAE;IAAG,CAAC,CACtD,CACH,CAAC,CAACM,IAAI,CAAC,IAAI,CAAC;EACd,CAAC,CAAC;EAEFF,EAAE,CAAC,uCAAuC,EAAE,MAAM;IAChD,MAAOK,OAAO,GAAerB,oBAAoB;MAAjCsB,SAAS,GAAItB,oBAAoB;IACjD,MAAMuB,OAAO,GAAGvB,oBAAoB,CAAC,CAAC,CAAC;IAEvCiB,MAAM,CAACxB,mBAAmB,CAAC4B,OAAO,CAAC,CAAC,CAACH,IAAI,CAAC,IAAI,CAAC;IAC/CD,MAAM,CAACxB,mBAAmB,CAAC8B,OAAO,CAAC,CAAC,CAACL,IAAI,CAAC,KAAK,CAAC;IAChDD,MAAM,CAACtB,wBAAwB,CAAC4B,OAAO,CAAC,CAAC,CAACL,IAAI,CAAC,IAAI,CAAC;IACpDD,MAAM,CAACtB,wBAAwB,CAAC0B,OAAO,CAAC,CAAC,CAACH,IAAI,CAAC,KAAK,CAAC;IACrDD,MAAM,CAACrB,kBAAkB,CAAC;MAAEQ,IAAI,EAAE;IAAQ,CAAC,CAAC,CAAC,CAACc,IAAI,CAAC,IAAI,CAAC;IACxDD,MAAM,CAACrB,kBAAkB,CAAC0B,SAAS,CAAC,CAAC,CAACJ,IAAI,CAAC,KAAK,CAAC;EACnD,CAAC,CAAC;EAEFF,EAAE,CAAC,wDAAwD,EAAE,MAAM;IACjEC,MAAM,CAACpB,4BAA4B,CAAC,CAAC2B,OAAO,CAAC,CAC3C,WAAW,EACX,SAAS,EACT,MAAM,EACN,WAAW,EACX,OAAO,EACP,aAAa,CACd,CAAC;IACFP,MAAM,CAACnB,2BAA2B,CAAC,CAAC0B,OAAO,CAAC,CAC1C,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,MAAM,CACP,CAAC;EACJ,CAAC,CAAC;EAEFR,EAAE,CAAC,sEAAsE,EAAE,MAAM;IAAA,IAAAS,iBAAA;IAC/E,MAAMC,IAAc,GAAG,EAAE;IACzB,MAAMC,UAAkC,GAAG;MACzCtB,KAAK,EAAE;QACL,gBAAgB,EAAEuB,IAAA;UAAA,IAAGzB,QAAQ,GAAAyB,IAAA,CAARzB,QAAQ;UAAA,oBAC3BZ,aAAa,CAACC,QAAQ,EAAE,IAAI,EAAEW,QAAQ,CAAC;QAAA;MAC3C,CAAC;MACD0B,OAAO,EAAE;QACPN,OAAO,EAAEO,KAAA;UAAA,IAAG3B,QAAQ,GAAA2B,KAAA,CAAR3B,QAAQ;UAAA,oBAAOZ,aAAa,CAACC,QAAQ,EAAE,IAAI,EAAEW,QAAQ,CAAC;QAAA;MACpE,CAAC;MACD4B,aAAa,EAAEA,CAACC,IAAI,EAAE/B,IAAI,KAAK;QAC7ByB,IAAI,CAACO,IAAI,CAAID,IAAI,SAAI/B,IAAM,CAAC;MAC9B;IACF,CAAC;IAED0B,UAAU,CAACI,aAAa,YAAxBJ,UAAU,CAACI,aAAa,CAAG,QAAQ,EAAE,qBAAqB,CAAC;IAE3Dd,MAAM,CAACiB,MAAM,CAACC,IAAI,EAAAV,iBAAA,GAACE,UAAU,CAACtB,KAAK,YAAAoB,iBAAA,GAAI,CAAC,CAAC,CAAC,CAAC,CAACD,OAAO,CAAC,CAAC,gBAAgB,CAAC,CAAC;IACvEP,MAAM,CAACS,IAAI,CAAC,CAACF,OAAO,CAAC,CAAC,4BAA4B,CAAC,CAAC;EACtD,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
package/dist/index.js CHANGED
@@ -25451,14 +25451,34 @@
25451
25451
  3: "header2"
25452
25452
  };
25453
25453
 
25454
+ /** The level `heading` and `titled-text` fall back to. */
25455
+ var DEFAULT_HEADING_LEVEL = 3;
25456
+
25457
+ /**
25458
+ * Resolve a semantic wire level to its typography variant. An absent level is
25459
+ * the documented default; any other unrecognised level is a serializer bug on
25460
+ * a fixed 1–3 scale, so it falls back to the default and is logged, per the
25461
+ * contract's degradation rule.
25462
+ */
25463
+ var headingVariantForLevel = function headingVariantForLevel(level) {
25464
+ if (level === undefined) {
25465
+ return HEADING_LEVEL_VARIANTS[DEFAULT_HEADING_LEVEL];
25466
+ }
25467
+ var variant = HEADING_LEVEL_VARIANTS[level];
25468
+ if (!variant) {
25469
+ console.warn("PortableText: unknown heading level ".concat(level, ", falling back to ").concat(DEFAULT_HEADING_LEVEL, "."));
25470
+ return HEADING_LEVEL_VARIANTS[DEFAULT_HEADING_LEVEL];
25471
+ }
25472
+ return variant;
25473
+ };
25474
+
25454
25475
  /** Heading levels map to the same typography TitledText uses. */
25455
25476
  var HeadingBlock = function HeadingBlock(_ref5) {
25456
- var _HEADING_LEVEL_VARIAN;
25457
25477
  var block = _ref5.block,
25458
25478
  children = _ref5.children;
25459
25479
  var _ref6 = block,
25460
25480
  level = _ref6.level;
25461
- var Heading = titledTextHeadings[(_HEADING_LEVEL_VARIAN = HEADING_LEVEL_VARIANTS[level]) !== null && _HEADING_LEVEL_VARIAN !== void 0 ? _HEADING_LEVEL_VARIAN : "header2"];
25481
+ var Heading = titledTextHeadings[headingVariantForLevel(level)];
25462
25482
  return /*#__PURE__*/React__default["default"].createElement(Heading, null, children);
25463
25483
  };
25464
25484
  var portableTextDefaultBlockRenderers = {
@@ -25505,7 +25525,7 @@
25505
25525
  level = _ref11.level;
25506
25526
  return /*#__PURE__*/React__default["default"].createElement(TitledText, {
25507
25527
  title: title,
25508
- variant: HEADING_LEVEL_VARIANTS[level !== null && level !== void 0 ? level : 3]
25528
+ variant: headingVariantForLevel(level)
25509
25529
  }, children);
25510
25530
  }
25511
25531
  };