@pantheon-systems/pcc-react-sdk
Version:
Pantheon Content Cloud React SDK
1 lines • 41.4 kB
Source Map (JSON)
{"version":3,"sources":["../../src/utils/react-element.ts","../../src/utils/cdn-domains.ts","../../src/components/ArticleRenderer/SmartComponentErrorBoundary.tsx","../../src/components/ArticleRenderer/Markdown.tsx","../../src/components/ArticleRenderer/PantheonTreeV2Renderer.tsx","../../src/utils/attributes.ts","../../src/utils/styles.ts","../../src/components/ArticleRenderer/useArticleTitle.tsx","../../src/components/ArticleRenderer/index.tsx"],"names":["getTextContent","node","_a","CDNDomains","ErrorBoundary","Component","props","error","jsx","SuspenseErrorBoundary","children","Suspense","withSmartComponentErrorBoundary","WithSmartComponentErrorBoundary","__spreadValues","getDisplayName","MarkdownRenderer","smartComponentMap","componentMap","disableDefaultErrorBoundaries","cdnURLOverride","ReactMarkdown","rehypeRaw","fixComponentParentRehypePlugin","overrideCDNUrls","remarkHeaderId","__spreadProps","attrs","type","decodedAttrs","isomorphicBase64Decode","jsxs","str","stringifiedJSON","e","tree","visit","_","parent","src","url","err","Markdown_default","htmlAttributeToReactProp","convertAttributes","acc","attr","key","value","formatStringToCamelCase","splitted","word","getStyleObjectFromString","style","el","property","formattedProperty","PantheonTreeRenderer","element","disableAllStyles","preserveImageStyles","renderImageCaptions","_b","_c","_d","_e","_f","child","idx","React","componentType","component","nodeChildren","convertedTagName","componentOverride","shouldPruneStyles","targetingClasses","styleObject","isImageContainer","imageChild","isOldImageContainer","imageTitle","srcUrl","PantheonTreeV2Renderer_default","getArticleTitle","article","jsonContent","titleContent","flattenDocumentTabs","x","flatMap","useArticleTitle","useMemo","UnboxContent","content","ArticleRenderer","tabId","bodyClassName","containerClassName","headerClassName","renderTitle","renderBody","__experimentalFlags","useEffect","contentType","unboxedContent","contentToShow","findTab","parsedContent","titleElement","indexOfFirstHeader","indexOfFirstParagraph","resolvedTitleIndex","bodyElement","ArticleRenderer_default"],"mappings":"2xBAEO,IAAMA,EAAkBC,CAA4B,EAAA,CAF3D,IAAAC,CAIE,CAAA,OAAID,GAAQ,IACH,CAAA,EAAA,CAEP,OAAOA,CAAAA,EAAS,QAChB,EAAA,OAAOA,GAAS,QAChB,EAAA,OAAOA,GAAS,QAETA,CAAAA,CAAAA,CAAK,UACH,CAAA,OAAOA,CAAS,EAAA,SAAA,CAClB,EACE,CAAA,KAAA,CAAM,QAAQA,CAAI,CAAA,CACpBA,CAAK,CAAA,GAAA,CAAID,CAAc,CAAA,CAAE,KAAK,EAAE,CAAA,CAC9B,OAAWC,GAAAA,CAAAA,CAAAA,CACZA,CAAK,CAAA,KAAA,CAAM,YAAYC,CAAAD,CAAAA,CAAAA,CAAK,MAAM,OAAX,GAAA,IAAA,CAAA,MAAA,CAAAC,EAAoB,QAAY,CAAA,EAAA,EAC5D,EAAA,GAAA,CAAIF,CAAc,CAAA,CAClB,KAAK,EAAE,CAAA,CAGL,EACT,CAAA,CCvBO,IAAMG,EAAa,CACxB,iCAAA,CACA,iCACA,CAAA,yBAAA,CACA,0BACA,CAAA,6BACF,ECAA,IAAMC,CAAAA,CAAN,cAA4BC,SAK1B,CACA,WAAYC,CAAAA,CAAAA,CAAc,CACxB,KAAMA,CAAAA,CAAK,EAEX,IAAK,CAAA,KAAA,CAAQ,CAAE,QAAA,CAAU,KAAM,EACjC,CAEA,OAAO,wBAAA,EAA2B,CAChC,OAAO,CAAE,QAAA,CAAU,IAAK,CAC1B,CAEA,iBAAkBC,CAAAA,CAAAA,CAAc,CAC9B,OAAA,CAAQ,MAAMA,CAAK,EACrB,CAEA,MAAS,EAAA,CACP,OAAI,IAAK,CAAA,KAAA,CAAM,QAEXC,CAAAA,GAAAA,CAAC,KAAI,CAAA,CAAA,QAAA,CAAA,4DAAA,CAA0D,EAI5D,IAAK,CAAA,KAAA,CAAM,QACpB,CACF,CAEMC,CAAAA,EAAAA,CAAwB,CAAC,CAAE,QAAA,CAAAC,CAAS,CAAA,GAEtCF,GAACJ,CAAAA,CAAAA,CAAA,CACC,QAAAI,CAAAA,GAAAA,CAACG,SAAA,CAAS,QAAA,CAAUH,IAAC,KAAI,CAAA,CAAA,QAAA,CAAA,4BAAA,CAA0B,CAChD,CAAA,QAAA,CAAAE,CACH,CAAA,CAAA,CACF,EAISE,CACXP,CAAAA,CAAAA,EACG,CACH,IAAMQ,CAAmCP,CAAAA,CAAAA,EACvCE,IAACC,EAAA,CAAA,CACC,QAAAD,CAAAA,GAAAA,CAACH,CAAAS,CAAAA,CAAAA,CAAA,GAAcR,CAAO,CAAA,CAAA,CACxB,EAGF,OAAAO,CAAAA,CAAgC,YAAc,CAAmCE,gCAAAA,EAAAA,EAAAA,CAC/EV,CACF,CAAC,CAEMQ,CAAAA,CAAAA,CAAAA,CACT,EAEA,SAASE,EAAAA,CAAeV,CAAyC,CAAA,CAC/D,OAAOA,CAAAA,CAAU,aAAeA,CAAU,CAAA,IAAA,EAAQ,WACpD,CCxCA,IAAMW,EAAAA,CAAmB,CAAC,CACxB,QAAA,CAAAN,CACA,CAAA,iBAAA,CAAAO,CACA,CAAA,YAAA,CAAAC,EACA,6BAAAC,CAAAA,CAAAA,CACA,cAAAC,CAAAA,CACF,CAEIZ,GAAAA,GAAAA,CAACa,cAAA,CACC,aAAA,CAAe,CACbC,EAAAA,CACAC,EACAC,CAAAA,EAAAA,CAAgBJ,CAAc,CAChC,CAAA,CACA,cAAe,CAACK,EAAc,EAC9B,UAAYC,CAAAA,CAAAA,CAAAZ,CAAA,CAAA,EAAA,CACNI,CADM,CAAA,CAAA,CAET,gBAA2B,CAAC,CAAE,IAAAjB,CAAAA,CAAK,CAA0B,GAAA,CAC5D,GAAM,CAAE,KAAA,CAAA0B,CAAO,CAAA,IAAA,CAAAC,CAAK,CAAA,CAAI3B,EAAK,UAG7B,CAAA,GAAIgB,GAAqBA,CAAkBW,CAAAA,CAAI,EAAG,CAChD,GAAM,CAAE,cAAA,CAAgBvB,CAAU,CAAA,CAAIY,EAAkBW,CAAI,CAAA,CACtDC,CAAeC,CAAAA,EAAAA,CAAuBH,CAAK,CAAA,CAEjD,OAAKtB,CAUHG,CAAAA,GAAAA,CAAC,KACE,CAAA,CAAA,QAAA,CAAAW,CACCX,CAAAA,GAAAA,CAACH,EAAAS,CAAA,CAAA,EAAA,CAAce,EAAc,CAE7BjB,CAAAA,CAAAA,CAAgCP,CAAS,CAAEwB,CAAAA,CAAY,CAE3D,CAAA,CAAA,CAdEE,IAAC,CAAA,KAAA,CAAA,CAAI,kCACmBH,CAAK,CAAA,6DAAA,CAAA,CAE7B,CAaN,CAEA,OACEpB,GAAAA,CAAC,OAAI,SAAU,CAAA,eAAA,CACb,QAAAuB,CAAAA,IAAAA,CAAC,GAAE,CAAA,CAAA,QAAA,CAAA,CAAA,kBAAA,CAAiBH,GAAK,CAC3B,CAAA,CAEJ,CACF,CAEC,CAAA,CAAA,QAAA,CAAAlB,EACH,CAIJ,CAAA,SAASoB,EAAuBE,CAAAA,CAAAA,CAAsC,CACpE,GAAI,CACF,IAAIC,CAAAA,CAOJ,GANI,OAAO,MAAW,EAAA,WAAA,CACpBA,EAAkB,MAAO,CAAA,IAAA,CAAKD,CAAK,CAAA,QAAQ,CAAE,CAAA,QAAA,CAAS,MAAM,CACnD,CAAA,OAAO,MAAS,WACzBC,GAAAA,CAAAA,CAAkB,KAAKD,CAAG,CAAA,CAAA,CAGxB,CAACC,CAAAA,CAAiB,MAAM,IAAI,MAAM,gCAAgC,CAAA,CAEtE,OAAO,IAAA,CAAK,KAAMA,CAAAA,CAAe,CACnC,CAASC,MAAAA,CAAAA,CAAG,CACV,OAAA,OAAA,CAAQ,KAAMA,CAAAA,CAAC,EACR,EACT,CACF,CAMA,SAASX,IAAiC,CACxC,OAAQY,CAAsB,EAAA,CAC5BC,KACED,CAAAA,CAAAA,CACA,CAAE,IAAM,CAAA,SAAA,CAAW,OAAS,CAAA,eAAgB,CAC5C,CAAA,CAAClC,EAAMoC,CAAGC,CAAAA,CAAAA,GAAW,CAEjBA,CAAAA,EACA,SAAaA,GAAAA,CAAAA,EAEbA,EAAO,OAAY,GAAA,KAAA,GAGnBA,EAAO,OAAU,CAAA,KAAA,EAErB,CACF,EACF,CACF,CAKA,SAASd,EAAgBJ,CAAAA,CAAAA,CAAyB,CAEhD,OAAKA,CAAAA,CAIE,IAAOe,CAAAA,EAAsB,CAClCC,KAAAA,CACED,EACA,SACClC,CAAAA,CAAAA,EAAoD,CACnD,GAAI,CACF,GAAIA,EAAK,OAAY,GAAA,KAAA,EAASA,EAAK,UAAW,CAAA,GAAA,CAAK,CACjD,IAAMsC,CAAAA,CAAMtC,CAAK,CAAA,UAAA,CAAW,GACtBuC,CAAAA,CAAAA,CAAM,IAAI,GAAID,CAAAA,CAAG,CAEnBpC,CAAAA,CAAAA,CAAW,QAASqC,CAAAA,CAAAA,CAAI,QAAQ,CAClCA,GAAAA,CAAAA,CAAI,QAAWpB,CAAAA,CAAAA,CACfnB,CAAK,CAAA,UAAA,CAAW,IAAMuC,CAAI,CAAA,QAAA,IAE9B,CACF,CAAA,MAASC,EAAK,EAGhB,CACF,EACF,CAvBS,CAAA,IAAON,GAAsBA,CAwBxC,CAEA,IAAOO,CAAAA,CAAQ1B,EC5Jf,CCAA,IAAM2B,EAAmD,CAAA,CAEvD,GAAK,CAAA,SAAA,CACL,MAAO,WAGP,CAAA,WAAA,CAAa,cACb,WAAa,CAAA,aAAA,CACb,UAAW,WACX,CAAA,OAAA,CAAS,SACT,CAAA,WAAA,CAAa,aACb,CAAA,OAAA,CAAS,UACT,YAAc,CAAA,cAAA,CACd,WAAa,CAAA,aAAA,CACb,SAAW,CAAA,WAAA,CACX,UAAW,WACX,CAAA,QAAA,CAAU,UACV,CAAA,OAAA,CAAS,SACT,CAAA,MAAA,CAAQ,SACR,OAAS,CAAA,SAAA,CACT,OAAQ,QACV,CAAA,CAEaC,EAAoB,SAAUjB,CAAAA,CAAgC,CACzE,OAAO,MAAO,CAAA,IAAA,CAAKA,CAAK,CAAE,CAAA,MAAA,CACxB,CAACkB,CAAAA,CAAKC,CAAS,GAAA,CACb,IAAMC,CAAMD,CAAAA,CAAAA,CAAK,WAAY,EAAA,CACvBE,CAAQrB,CAAAA,CAAAA,CAAMmB,CAAI,CAExB,CAAA,OAAOpB,EAAAZ,CAAA,CAAA,EAAA,CACF+B,GADE,CAEL,CAACF,EAAyBI,CAAAA,CAAG,CAAKA,EAAAA,CAAG,EAAGC,CAC1C,CAAA,CACF,CACA,CAAA,EACF,CACF,ECrCA,IAAMC,EAAAA,CAA2BjB,CAAiB,EAAA,CAChD,IAAMkB,CAAAA,CAAAA,CAAWlB,GAAA,IAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAK,MAAM,GAAQ,CAAA,GAAA,GACpC,OAAIkB,CAAAA,CAAS,MAAW,GAAA,CAAA,CAAUA,CAAS,CAAA,CAAC,EAE1CA,CAAS,CAAA,CAAC,CACVA,CAAAA,CAAAA,CACG,KAAM,CAAA,CAAC,EACP,GAAKC,CAAAA,CAAAA,EAASA,CAAK,CAAA,CAAC,CAAE,CAAA,WAAA,GAAgBA,CAAK,CAAA,KAAA,CAAM,CAAC,CAAC,CAAA,CACnD,KAAK,EAAE,CAEd,CAEaC,CAAAA,CAAAA,CAA4BpB,CAA0B,EAAA,CACjE,GAAI,CAACA,CAAAA,EAAOA,CAAI,CAAA,MAAA,CAAS,CAAG,CAAA,OAE5B,IAAMqB,CAAQ,CAAA,EAEd,CAAA,OAAArB,CAAI,CAAA,OAAA,CAASsB,GAAO,CAClB,GAAM,CAACC,CAAUP,CAAAA,CAAK,EAAIM,CAAG,CAAA,KAAA,CAAM,GAAG,CAAA,CACtC,GAAI,EAAA,CAACC,GAAY,CAACP,CAAAA,CAAAA,CAElB,CAAIO,GAAAA,CAAAA,EAAYP,CAAO,CAAA,CACrB,IAAMQ,CAAoBP,CAAAA,EAAAA,CAAwBM,CAAS,CAAA,IAAA,EAAM,CAAA,CACjEF,EAAMG,CAAiB,CAAA,CAAIR,EAAM,IAAK,EAAA,CACtC,MACF,CACA,OAAQO,CAAU,EAChB,KAAK,WAAA,CACHF,EAAM,cAAiB,CAAA,WAAA,CACvB,MACF,KAAK,cACHA,CAAAA,CAAAA,CAAM,eAAiB,cACvB,CAAA,MACF,KAAK,QAAA,CACHA,CAAM,CAAA,SAAA,CAAY,SAClB,MACF,KAAK,OACHA,CAAM,CAAA,UAAA,CAAa,OACnB,MACF,KAAK,gBACHA,CAAAA,CAAAA,CAAM,cAAiB,CAAA,cAAA,CACvB,MACF,KAAK,aAAA,CACHA,CAAM,CAAA,aAAA,CAAgB,OACtB,CAAA,MACF,KAAK,WACHA,CAAAA,CAAAA,CAAM,aAAgB,CAAA,KAAA,CACtB,MAGJ,CACF,CAAA,CAAC,EAEMA,CACT,CAAA,CFnCA,IAAMI,EAAuB,CAAC,CAC5B,OAAAC,CAAAA,CAAAA,CACA,iBAAAzC,CAAAA,CAAAA,CACA,aAAAC,CACA,CAAA,gBAAA,CAAAyC,CACA,CAAA,mBAAA,CAAAC,CACA,CAAA,6BAAA,CAAAzC,EACA,mBAAA0C,CAAAA,CAAAA,CACA,eAAAzC,CACF,CAAA,GAAwC,CA5BxC,IAAAlB,CAAAA,CAAA4D,CAAAC,CAAAA,CAAAA,CAAAC,CAAAC,CAAAA,CAAAA,CAAAC,EA6BE,IAAMxD,CAAAA,CAAAA,CACJoD,CAAA5D,CAAAA,CAAAA,CAAAA,CAAAwD,CAAQ,CAAA,QAAA,GAAR,YAAAxD,CAAkB,CAAA,GAAA,CAAI,CAACiE,CAAAA,CAAOC,CAC5BC,GAAAA,CAAAA,CAAM,cAAcZ,CAAsB,CAAA,CACxC,IAAKW,CACL,CAAA,OAAA,CAAS1C,EAAAZ,CAAA,CAAA,EAAA,CACJqD,CADI,CAAA,CAAA,CAEP,QAAUT,CAAAA,CAAAA,CAAQ,SAASU,CAAM,CAAA,CAAC,CAClC,CAAA,QAAA,CAAUV,CAAQ,CAAA,QAAA,CAASU,EAAM,CAAC,CACpC,CACA,CAAA,CAAA,iBAAA,CAAAnD,CACA,CAAA,YAAA,CAAAC,EACA,gBAAAyC,CAAAA,CAAAA,CACA,oBAAAC,CACA,CAAA,6BAAA,CAAAzC,EACA,mBAAA0C,CAAAA,CAAAA,CACA,cAAAzC,CAAAA,CACF,CAAC,CAAA,CAAA,GAfH,KAAA0C,CAgBK,CAAA,EAEP,CAAA,GAAIJ,CAAQ,CAAA,GAAA,GAAQ,YAAa,CAC/B,IAAMY,CAAgBP,CAAAA,CAAAA,CAAAA,CAAAL,CAAQ,CAAA,IAAA,GAAR,YAAAK,CAAc,CAAA,WAAA,EAAA,CAEpC,GAAI,CAACO,CAAAA,CACH,OAAO,IAGT,CAAA,IAAMC,CAAYtD,CAAAA,CAAAA,EAAA,IAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAoBqD,GAEtC,GAAIC,CAAAA,CACF,OAAKA,CAAAA,CAAU,cASRpD,CAAAA,CAAAA,CACHkD,EAAM,aACJE,CAAAA,CAAAA,CAAU,cACVb,CAAAA,CAAAA,CAAQ,KACV,CAAA,CACA9C,EAAgC2D,CAAU,CAAA,cAAc,EACtDb,CAAQ,CAAA,KACV,EAdA3B,IAAC,CAAA,KAAA,CAAA,CAAI,QACmBuC,CAAAA,CAAAA,uBAAAA,CAAAA,CAAAA,CAAc,6DAEtC,CAAA,CAAA,CAaR,CAEA,GAAIZ,CAAAA,CAAQ,GAAQ,GAAA,OAAA,CAClB,OAAIC,CAAAA,CAAyB,KAItBU,CAAM,CAAA,aAAA,CAAc,OAAS,CAAA,CAClC,uBAAyB,CAAA,CACvB,OAAQX,CAAQ,CAAA,IAClB,CACF,CAAC,CAAA,CAGH,IAAMc,CAAe,CAAA,CAACd,CAAQ,CAAA,IAAA,CAAM,GAAGhD,CAAQ,EAAE,MAAO,CAAA,OAAO,EACzD+D,CAAmBf,CAAAA,CAAAA,CAAQ,MAAQ,OAAU,CAAA,IAAA,CAAOA,CAAQ,CAAA,GAAA,CAC5DgB,CAAoBxD,CAAAA,CAAAA,EAAA,YAAAA,CAAewC,CAAAA,CAAAA,CAAQ,KAC3CiB,CACJhB,CAAAA,CAAAA,GAAqB,OACpBD,CAAQ,CAAA,GAAA,GAAQ,KAAS,EAAA,CAACE,CAC1B,CAAA,GAAA,OAAOc,GAAsB,QAAYA,EAAAA,CAAAA,EAAqB,IAE3DE,CAAAA,CAAAA,CAAAA,CAAmB,EAAC,CACpBC,EAAcF,CAChB,CAAA,MAAA,CACAvB,CAAyBM,CAAAA,CAAAA,EAAA,IAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAS,KAAK,CAE3C,CAAA,GAAIoB,EAAiBpB,CAAO,CAAA,EAAKhD,EAAS,MAAW,GAAA,CAAA,CAAG,CACtDkE,CAAAA,CAAiB,IAAK,CAAA,wBAAwB,GAE1CC,CAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAa,CAAA,KAAA,IAAU,MACzBD,CAAAA,CAAAA,CAAiB,KAAK,kCAAkC,CAAA,CAAA,CAC/CC,CAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAa,CAAA,KAAA,IAAU,QAChCD,CAAiB,CAAA,IAAA,CAAK,mCAAmC,CAChDC,CAAAA,CAAAA,CAAAA,EAAA,YAAAA,CAAa,CAAA,KAAA,IAAU,MAChCD,CAAAA,CAAAA,CAAiB,IAAK,CAAA,kCAAkC,GAExDA,CAAiB,CAAA,IAAA,CAAK,+BAA+B,CAAA,CAAA,CAGlDlB,CAAQ,CAAA,QAAA,EAAY,MAAQ,CAACoB,CAAAA,CAAiBpB,CAAQ,CAAA,QAAQ,CAC9DA,IAAAA,CAAAA,CAAQ,UAAY,IAAQ,EAAA,CAACoB,EAAiBpB,CAAQ,CAAA,QAAQ,IAE/DkB,CAAiB,CAAA,IAAA,CAAK,8BAA8B,CAAA,CAAA,CAIxD,IAAMG,CAAAA,CAAaC,EAAoBtB,CAAO,CAAA,CAC1CA,CAAQ,CAAA,QAAA,CAAS,CAAC,CAAA,CAClBA,EAAQ,QAAS,CAAA,CAAC,CAAE,CAAA,QAAA,CAAS,CAAC,CAAA,CAC5BuB,GAAahB,CAAAD,CAAAA,CAAAA,CAAAA,CAAAe,EAAW,KAAX,GAAA,IAAA,CAAA,MAAA,CAAAf,EAAkB,KAAlB,GAAA,IAAA,CAAA,MAAA,CAAAC,CAAyB,CAAA,IAAA,EAAA,CAE5C,GAAIc,CAAAA,CAAW,MAAM,GAAO3D,EAAAA,CAAAA,CAC1B,GAAI,CACF,IAAM8D,CAAAA,CAAS,IAAI,GAAIH,CAAAA,CAAAA,CAAW,KAAM,CAAA,GAAG,CAEvC5E,CAAAA,CAAAA,CAAW,SAAS+E,CAAO,CAAA,QAAQ,IACrCA,CAAO,CAAA,QAAA,CAAW9D,EAClB2D,CAAW,CAAA,KAAA,CAAM,GAAMG,CAAAA,CAAAA,CAAO,QAAS,EAAA,EAE3C,OAASzC,CAAK,CAAA,EAKZoB,CAAAA,GAAwB,KAASoB,GAAAA,CAAAA,EAAA,MAAAA,CAAY,CAAA,MAAA,CAAA,EAC/CT,CAAa,CAAA,IAAA,CACXhE,GAAC,CAAA,MAAA,CAAA,CACC,MAAO,CACL,KAAA,CAAO,OACP,OAAS,CAAA,MAAA,CACT,eAAgB,QAChB,CAAA,QAAA,CAAU,QACZ,CAAA,CACA,SAAU,CAAA,kBAAA,CAET,SAAAyE,CACH,CAAA,CACF,EAEJ,CAEA,OAAOZ,CAAAA,CAAM,cACXK,CAAqBD,EAAAA,CAAAA,CACrB3D,CAAA,CAAA,CACE,KAAO+D,CAAAA,CAAAA,CAAAA,CACJjC,EAAkBlB,CAAAZ,CAAAA,CAAAA,CAAA,GAChB4C,CAAQ,CAAA,KAAA,CAAA,CADQ,CAEnB,KAAO,CAAA,CAAA,CAACQ,CAAAR,CAAAA,CAAAA,CAAQ,KAAR,GAAA,IAAA,CAAA,MAAA,CAAAQ,EAAe,KAAO,CAAA,GAAGU,CAAgB,CAAA,CAC9C,MAAO,CAAA,OAAO,EACd,IAAK,CAAA,GAAG,CACb,CAAA,CAAC,CAEHJ,CAAAA,CAAAA,CAAAA,CAAa,OAASA,CAAe,CAAA,MACvC,CACF,CAEA,CAAA,SAASQ,EAAoBtB,CAAmC,CAAA,CA7KhE,IAAAxD,CAAAA,CA8KE,OACEwD,CAAAA,CAAQ,MAAQ,MAChBxD,EAAAA,CAAAA,CAAAA,CAAAA,CAAAwD,CAAQ,CAAA,QAAA,GAAR,IAAAxD,CAAAA,MAAAA,CAAAA,CAAAA,CAAmB,GAAG,GAAQ,IAAA,KAAA,EAC9BwD,CAAQ,CAAA,QAAA,CAAS,MAAW,GAAA,CAEhC,CAEA,SAASoB,CAAAA,CAAiBpB,EAAmC,CArL7D,IAAAxD,EAAA4D,CAAAC,CAAAA,CAAAA,CAAAC,CAsLE,CAAA,OACEN,CAAQ,CAAA,GAAA,GAAQ,SACfsB,CAAoBtB,CAAAA,CAAO,CACzBxD,EAAAA,CAAAA,CAAAA,CAAAA,CAAAwD,CAAQ,CAAA,QAAA,GAAR,YAAAxD,CAAmB,CAAA,CAAA,CAAA,CAAG,GAAQ,IAAA,MAAA,EAC7BwD,CAAQ,CAAA,QAAA,CAAS,SAAW,CAC5BK,EAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAD,EAAAJ,CAAQ,CAAA,QAAA,GAAR,YAAAI,CAAmB,CAAA,CAAA,CAAA,CAAG,QAAtB,GAAA,IAAA,CAAA,MAAA,CAAAC,CAAiC,CAAA,CAAA,CAAA,CAAG,OAAQ,KAC5CC,EAAAA,CAAAA,CAAAA,CAAAA,CAAAN,CAAQ,CAAA,QAAA,CAAS,CAAC,CAAA,CAAE,WAApB,IAAAM,CAAAA,MAAAA,CAAAA,CAAAA,CAA8B,MAAW,IAAA,CAAA,CAEjD,CAEA,IAAOmB,EAAQ1B,CGhMf,CAWO,SAAS2B,CAAgBC,CAAAA,CAAAA,CAA6C,CAX7E,IAAAnF,CAAA4D,CAAAA,CAAAA,CAkBE,GANI,EAACuB,CAAAA,EAAA,IAAAA,EAAAA,CAAAA,CAAS,eAIMA,CAAAA,EAAAA,CAAAA,CAAAA,EAAA,YAAAA,CAAS,CAAA,WAAA,IAET,gBAClB,OAAO,IAAA,CAGT,IAAMC,CACJ,CAAA,OAAOD,CAAQ,CAAA,eAAA,EAAoB,QAC/B,CAAA,IAAA,CAAK,MAAMA,CAAQ,CAAA,eAAe,CACjCA,CAAAA,CAAAA,CAAQ,eAMTE,CAAAA,CAAAA,CAAAA,CAJmC,MAAM,OAAQD,CAAAA,CAAW,CAC9DjD,CAAAA,CAAAA,CAAE,OAAQiD,CAAAA,CAAAA,CAAaE,mBAAmB,CAC1CF,CAAAA,CAAAA,CAAY,UAEa,IAAMG,CAAAA,CAAAA,EAAMA,EAAE,GAAQ,GAAA,OAAO,CAE1D,CAAA,GAAIF,CAAgB,EAAA,IAAA,CAAM,CACxB,IAAMG,CAAAA,CAAUH,CAAa,CAAA,QAAA,CACzBlD,CAAE,CAAA,WAAA,CACAkD,EAAa,QACZE,CAAAA,CAAAA,EAA8CA,CAAE,CAAA,IACnD,CACA,CAAA,GAEJ,OAAOF,CAAAA,CAAa,KAAOG,CAAQ,CAAA,IAAA,CAAK,EAAE,CAC5C,CAAA,KACExF,OAAAA,CAAAA,CAAAA,CAAAA,CAAAmF,CAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,EAAS,QAAT,GAAA,IAAA,CAAA,MAAA,CAAAnF,CAAmB,CAAA,KAAA,GAAS,IAC5B,EAAA,OAAA,CAAO4D,EAAAuB,CAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAS,CAAA,QAAA,GAAT,IAAAvB,CAAAA,MAAAA,CAAAA,CAAAA,CAAmB,QAAU,QAE7BuB,CAAAA,CAAAA,CAAQ,SAAS,KAEjBA,CAAAA,CAAAA,CAAQ,OAAS,EAE5B,CAEO,SAASM,CAAAA,CAAgBN,CAA6C,CAAA,CAC3E,OAAOO,OAAQ,CAAA,IAAMR,CAAgBC,CAAAA,CAAO,CAAK,EAAA,EAAA,CAAI,CAACA,CAAO,CAAC,CAChE,CCWA,SAASQ,EAAaC,CAAAA,CAAAA,CAA2B,CAC/C,GAAI,OAAOA,CAAY,EAAA,QAAA,CAAU,OAAOA,CAAAA,CAExC,GAAI,CACF,OAAO,IAAK,CAAA,KAAA,CAAMA,CAAO,CAC3B,OAAS5D,CAAG,CAAA,CACV,OAAO4D,CACT,CACF,KAEMC,EAAkB,CAAA,CAAC,CACvB,OAAAV,CAAAA,CAAAA,CACA,MAAAW,CACA,CAAA,aAAA,CAAAC,CACA,CAAA,kBAAA,CAAAC,CACA,CAAA,eAAA,CAAAC,EACA,WAAAC,CAAAA,CAAAA,CACA,iBAAAnF,CAAAA,CAAAA,CACA,YAAAC,CAAAA,CAAAA,CACA,WAAAmF,CACA,CAAA,mBAAA,CAAAC,CACF,CAAA,GAAa,CACXC,SAAAA,CAAU,IAAM,CACVD,CAAAA,CAAAA,EAAA,YAAAA,CAAqB,CAAA,4BAAA,IAAiC,MACxD,OAAQ,CAAA,IAAA,CACN,yGACF,EAEJ,CAAG,CAAA,CAACA,CAAmB,CAAC,CAAA,CAExB,IAAME,CAAAA,CAAcnB,CAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,EAAS,WACvBoB,CAAAA,CAAAA,CAAiBb,OACrB,CAAA,IACEP,CAAA,EAAA,IAAA,EAAAA,EAAS,eAAkBQ,CAAAA,EAAAA,CAAaR,EAAQ,eAAe,CAAA,CAAI,KACrE,CAACA,CAAAA,EAAA,IAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAS,eAAe,CAC3B,EAEMqB,CAAgBd,CAAAA,OAAAA,CAAQ,IAAM,CAtGtC,IAAA1F,CAAAA,CAAA4D,EAuGI,GAAI,CAAC2C,CAAgB,CAAA,OAAO,IAE5B,CAAA,IAAMX,EACHE,CAAS,EAAA,IAAA,GAAA,CAAQ9F,EAAAyG,OAAQF,CAAAA,CAAAA,CAAgBT,CAAK,CAA7B,GAAA,IAAA,CAAA,MAAA,CAAA9F,CAAgC,CAAA,WAAA,CAAA,EAClDuG,CAEF,CAAA,OACET,GAAS,IACT,EAAA,OAAOS,CAAmB,EAAA,QAAA,EAAA,CAC1BX,CAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,EAAS,QAAY,GAAA,IAAA,CAEd,KAAM,CAAA,OAAA,CAAQW,CAAc,CAAA,CAAA,CAC/B3C,EAAA2C,CAAe,CAAA,CAAC,IAAhB,IAAA3C,CAAAA,MAAAA,CAAAA,CAAAA,CAAmB,YAClB2C,CAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAiC,CAAA,WAAA,CAGjCX,CACT,CAAA,CAAG,CAACE,CAAOS,CAAAA,CAAc,CAAC,CAAA,CAE1B,GAAI,CAACC,EACH,OAAO,IAAA,CAGT,GAAIF,CAAAA,GAAgB,eAClB,CAAA,OACEhG,IAAC,KAAI,CAAA,CAAA,SAAA,CAAW0F,EACb,QAAAQ,CAAAA,CAAAA,CACClG,IAACkC,CAAA,CAAA,CACC,iBAAmBzB,CAAAA,CAAAA,CACnB,YAAcC,CAAAA,CAAAA,CACd,8BACE,CAAC,EAACoF,CAAA,EAAA,IAAA,EAAAA,CAAqB,CAAA,6BAAA,CAAA,CAEzB,eAAgBA,CAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAqB,CAAA,cAAA,CAEpC,QAAAI,CAAAA,CAAAA,CACH,EAEAlG,GAAC,CAAA,MAAA,CAAA,CAAK,iCAAqB,CAE/B,CAAA,CAAA,CAIJ,IAAMoG,CAAoCF,CAAAA,CAAAA,CAAc,QAAY,EAAA,EAEhEG,CAAAA,CAAAA,CAAe,KAEnB,GAAIP,CAAAA,CAAAA,EAAA,IAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAqB,4BAAiC,IAAA,IAAA,CAAM,CAC9D,IAAMQ,CAAAA,CAAqBF,CAAc,CAAA,SAAA,CAAWnB,CAClD,EAAA,CAAC,KAAM,IAAM,CAAA,IAAA,CAAM,KAAM,IAAM,CAAA,IAAA,CAAM,KAAM,OAAO,CAAA,CAAE,QAASA,CAAAA,CAAAA,CAAE,GAAG,CACpE,EAEMsB,CAAwBH,CAAAA,CAAAA,CAAc,SAAWnB,CAAAA,CAAAA,EAAMA,CAAE,CAAA,GAAA,GAAQ,GAAG,CACpEuB,CAAAA,CAAAA,CACJF,CAAuB,GAAA,EAAA,CAAKC,CAAwBD,CAAAA,CAAAA,CAEhD,CAACvB,CAAY,CAAA,CAAIqB,EAAc,MAAOI,CAAAA,CAAAA,CAAoB,CAAC,CAGjEH,CAAAA,CAAAA,CAAexC,CAAM,CAAA,aAAA,CAAc,QAAU,CAAA,CAC3C,QAASkB,CACT,CAAA,YAAA,CAAArE,CACA,CAAA,iBAAA,CAAAD,CACA,CAAA,gBAAA,CAAkB,CAAC,EAACqF,CAAAA,EAAA,IAAAA,EAAAA,CAAAA,CAAqB,gBACzC,CAAA,CAAA,mBAAA,CAAqB,CAAC,EAACA,CAAAA,EAAA,MAAAA,CAAqB,CAAA,mBAAA,CAAA,CAC5C,8BACE,CAAC,EAACA,CAAA,EAAA,IAAA,EAAAA,CAAqB,CAAA,6BAAA,CAAA,CACzB,qBAAqBA,CAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAqB,CAAA,mBAAA,IAAwB,KAClE,CAAA,cAAA,CAAgBA,GAAA,IAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAqB,cACvC,CAAC,EACH,CAEA,IAAMW,CACJzG,CAAAA,GAAAA,CAAC,OAAI,SAAWyF,CAAAA,CAAAA,CACb,SAAAW,CAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAe,CAAA,GAAA,CAAI,CAAClD,CAAAA,CAASU,IAC5BC,CAAM,CAAA,aAAA,CAAcc,CAAwB,CAAA,CAC1C,GAAKf,CAAAA,CAAAA,CACL,QAAS1C,CAAAZ,CAAAA,CAAAA,CAAA,EACJ4C,CAAAA,CAAAA,CAAAA,CADI,CAEP,QAAA,CAAUkD,EAAcxC,CAAM,CAAA,CAAC,EAC/B,QAAUwC,CAAAA,CAAAA,CAAcxC,EAAM,CAAC,CACjC,CACA,CAAA,CAAA,iBAAA,CAAAnD,CACA,CAAA,YAAA,CAAAC,EACA,gBAAkB,CAAA,CAAC,EAACoF,CAAAA,EAAA,IAAAA,EAAAA,CAAAA,CAAqB,kBACzC,mBAAqB,CAAA,CAAC,EAACA,CAAAA,EAAA,IAAAA,EAAAA,CAAAA,CAAqB,qBAC5C,6BACE,CAAA,CAAC,EAACA,CAAA,EAAA,IAAA,EAAAA,EAAqB,6BACzB,CAAA,CAAA,mBAAA,CAAA,CACEA,CAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAqB,CAAA,mBAAA,IAAwB,MAC/C,cAAgBA,CAAAA,CAAAA,EAAA,IAAAA,CAAAA,MAAAA,CAAAA,CAAAA,CAAqB,cACvC,CAAC,GAEL,CAGF,CAAA,OACEvE,IAAC,CAAA,KAAA,CAAA,CAAI,SAAWmE,CAAAA,CAAAA,CACb,UAAAW,CAAgB,EAAA,IAAA,CACfrG,IAAC,KAAI,CAAA,CAAA,SAAA,CAAW2F,EACb,QAAAC,CAAAA,CAAAA,CACGA,CAAYS,CAAAA,CAAAA,CAAc7G,CAAe6G,CAAAA,CAAY,CAAC,CACtDA,CAAAA,CAAAA,CACN,CACE,CAAA,IAAA,CACHR,CAAaA,CAAAA,CAAAA,CAAWY,CAAW,CAAIA,CAAAA,CAAAA,CAAAA,CAC1C,CAEJ,CAAA,CAEOC,EAAQnB,CAAAA","file":"index.mjs","sourcesContent":["import { type ReactNode } from \"react\";\n\nexport const getTextContent = (node: ReactNode): string => {\n // Handle all possible types that ReactNode can be, since it is a union of types.\n if (node == null) {\n return \"\";\n } else if (\n typeof node === \"string\" ||\n typeof node === \"number\" ||\n typeof node === \"bigint\"\n ) {\n return node.toString();\n } else if (typeof node === \"boolean\") {\n return \"\";\n } else if (Array.isArray(node)) {\n return node.map(getTextContent).join(\"\");\n } else if (\"props\" in node) {\n return (node.props.children || node.props.element?.children || [])\n .map(getTextContent)\n .join(\"\");\n }\n\n return \"\";\n};\n","export const CDNDomains = [\n \"staging.cdn.content.pantheon.io\",\n \"cdn.staging.content.pantheon.io\",\n \"cdn.content.pantheon.io\",\n \"cdn.prod.pcc.pantheon.io\",\n \"cdn.staging.pcc.pantheon.io\",\n];\n","import React, { Component, Suspense } from \"react\";\n\ninterface Props {\n children: React.ReactNode;\n}\n\nclass ErrorBoundary extends Component<\n Props,\n {\n hasError: boolean;\n }\n> {\n constructor(props: Props) {\n super(props);\n\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError() {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error) {\n console.error(error);\n }\n\n render() {\n if (this.state.hasError) {\n return (\n <div>Something went wrong while rendering this smart component.</div>\n );\n }\n\n return this.props.children;\n }\n}\n\nconst SuspenseErrorBoundary = ({ children }: Props) => {\n return (\n <ErrorBoundary>\n <Suspense fallback={<div>Loading smart component...</div>}>\n {children}\n </Suspense>\n </ErrorBoundary>\n );\n};\n\nexport const withSmartComponentErrorBoundary = (\n Component: React.ComponentType<unknown>,\n) => {\n const WithSmartComponentErrorBoundary = (props: Record<string, unknown>) => (\n <SuspenseErrorBoundary>\n <Component {...props} />\n </SuspenseErrorBoundary>\n );\n\n WithSmartComponentErrorBoundary.displayName = `WithSmartComponentErrorBoundary(${getDisplayName(\n Component,\n )})`;\n\n return WithSmartComponentErrorBoundary;\n};\n\nfunction getDisplayName(Component: React.ComponentType<unknown>) {\n return Component.displayName || Component.name || \"Component\";\n}\n","import { Components } from \"react-markdown\";\nimport type { ReactMarkdownProps } from \"react-markdown/lib/complex-types\";\nimport { ReactMarkdown } from \"react-markdown/lib/react-markdown.js\";\nimport rehypeRaw from \"rehype-raw\";\nimport remarkHeaderId from \"remark-heading-id\";\nimport { visit } from \"unist-util-visit\";\nimport type { UnistParent } from \"unist-util-visit/lib\";\nimport type { ComponentMap, SmartComponentMap } from \".\";\nimport { CDNDomains } from \"../../utils/cdn-domains\";\nimport { withSmartComponentErrorBoundary } from \"./SmartComponentErrorBoundary\";\n\ninterface MarkdownRendererProps {\n children: string;\n smartComponentMap?: SmartComponentMap;\n componentMap?: ComponentMap;\n disableDefaultErrorBoundaries: boolean;\n cdnURLOverride?: string;\n}\n\ninterface ComponentProperties {\n attrs: string;\n id: string;\n type: string;\n}\n\nconst MarkdownRenderer = ({\n children,\n smartComponentMap,\n componentMap,\n disableDefaultErrorBoundaries,\n cdnURLOverride,\n}: MarkdownRendererProps) => {\n return (\n <ReactMarkdown\n rehypePlugins={[\n rehypeRaw,\n fixComponentParentRehypePlugin,\n overrideCDNUrls(cdnURLOverride),\n ]}\n remarkPlugins={[remarkHeaderId]}\n components={{\n ...(componentMap as Components),\n [\"pcc-component\" as \"div\"]: ({ node }: ReactMarkdownProps) => {\n const { attrs, type } = node.properties as typeof node.properties &\n ComponentProperties;\n\n if (smartComponentMap && smartComponentMap[type]) {\n const { reactComponent: Component } = smartComponentMap[type];\n const decodedAttrs = isomorphicBase64Decode(attrs);\n\n if (!Component) {\n return (\n <div>\n Error: Cannot render {type} because it was provided without a\n reactComponent property.\n </div>\n );\n }\n\n return (\n <div>\n {disableDefaultErrorBoundaries ? (\n <Component {...decodedAttrs} />\n ) : (\n withSmartComponentErrorBoundary(Component)(decodedAttrs)\n )}\n </div>\n );\n }\n\n return (\n <div className=\"pcc-component\">\n <u>PCC Component - {type}</u>\n </div>\n );\n },\n }}\n >\n {children}\n </ReactMarkdown>\n );\n};\n\nfunction isomorphicBase64Decode(str: string): Record<string, unknown> {\n try {\n let stringifiedJSON: string | undefined;\n if (typeof Buffer !== \"undefined\") {\n stringifiedJSON = Buffer.from(str, \"base64\").toString(\"utf8\");\n } else if (typeof atob !== \"undefined\") {\n stringifiedJSON = atob(str);\n }\n\n if (!stringifiedJSON) throw new Error(\"Failed to decode base64 string\");\n\n return JSON.parse(stringifiedJSON);\n } catch (e) {\n console.error(e);\n return {};\n }\n}\n\n/**\n * Rehype plugin to set the parent of a pcc-component node to a div\n * to fix hydration errors from the component being nested in an invalid parent.\n */\nfunction fixComponentParentRehypePlugin() {\n return (tree: UnistParent) => {\n visit(\n tree,\n { type: \"element\", tagName: \"pcc-component\" },\n (node, _, parent) => {\n if (\n parent &&\n \"tagName\" in parent &&\n // @ts-expect-error TODO: Type this properly\n parent.tagName !== \"div\"\n ) {\n // @ts-expect-error TODO: Type this properly\n parent.tagName = \"div\";\n }\n },\n );\n };\n}\n\n/**\n * Rehype plugin to override the CDN domain.\n */\nfunction overrideCDNUrls(cdnURLOverride?: string) {\n // If cdnURLOverride is not provided, return a no-op transformer:\n if (!cdnURLOverride) {\n return () => (tree: UnistParent) => tree;\n }\n\n return () => (tree: UnistParent) => {\n visit(\n tree,\n \"element\",\n (node: Element & { properties: { src: string } }) => {\n try {\n if (node.tagName === \"img\" && node.properties.src) {\n const src = node.properties.src;\n const url = new URL(src);\n\n if (CDNDomains.includes(url.hostname)) {\n url.hostname = cdnURLOverride;\n node.properties.src = url.toString();\n }\n }\n } catch (err) {\n // If it's not a valid URL (or cannot be parsed), leave it unchanged.\n }\n },\n );\n };\n}\n\nexport default MarkdownRenderer;\n","import { PantheonTreeNode } from \"@pantheon-systems/pcc-sdk-core/types\";\nimport React from \"react\";\nimport { ComponentMap, SmartComponentMap } from \".\";\nimport { convertAttributes } from \"../../utils/attributes\";\nimport { CDNDomains } from \"../../utils/cdn-domains\";\nimport { getStyleObjectFromString } from \"../../utils/styles\";\nimport { withSmartComponentErrorBoundary } from \"./SmartComponentErrorBoundary\";\n\ninterface Props {\n element: PantheonTreeNode;\n smartComponentMap?: SmartComponentMap;\n componentMap?: ComponentMap;\n disableAllStyles?: boolean;\n preserveImageStyles?: boolean;\n disableDefaultErrorBoundaries?: boolean;\n renderImageCaptions?: boolean;\n cdnURLOverride?: string;\n}\n\nconst PantheonTreeRenderer = ({\n element,\n smartComponentMap,\n componentMap,\n disableAllStyles,\n preserveImageStyles,\n disableDefaultErrorBoundaries,\n renderImageCaptions,\n cdnURLOverride,\n}: Props): React.ReactElement | null => {\n const children =\n element.children?.map((child, idx) =>\n React.createElement(PantheonTreeRenderer, {\n key: idx,\n element: {\n ...child,\n prevNode: element.children[idx - 1],\n nextNode: element.children[idx + 1],\n },\n smartComponentMap,\n componentMap,\n disableAllStyles,\n preserveImageStyles,\n disableDefaultErrorBoundaries,\n renderImageCaptions,\n cdnURLOverride,\n }),\n ) ?? [];\n\n if (element.tag === \"component\") {\n const componentType = element.type?.toUpperCase();\n\n if (!componentType) {\n return null;\n }\n\n const component = smartComponentMap?.[componentType];\n\n if (component) {\n if (!component.reactComponent) {\n return (\n <div>\n Error: Cannot render {componentType} because it was provided without\n a reactComponent property.\n </div>\n );\n }\n\n return disableDefaultErrorBoundaries\n ? React.createElement(\n component.reactComponent,\n element.attrs as Record<string, unknown>,\n )\n : withSmartComponentErrorBoundary(component.reactComponent)(\n element.attrs as Record<string, unknown>,\n );\n }\n }\n\n if (element.tag === \"style\") {\n if (disableAllStyles) return null;\n\n // `renderToStaticMarkup` will escape the HTML entities in the style tag\n // https://github.com/facebook/react/issues/13838#issuecomment-470294454\n return React.createElement(\"style\", {\n dangerouslySetInnerHTML: {\n __html: element.data,\n },\n });\n }\n\n const nodeChildren = [element.data, ...children].filter(Boolean);\n const convertedTagName = element.tag === \"title\" ? \"h1\" : element.tag;\n const componentOverride = componentMap?.[element.tag as \"div\"];\n const shouldPruneStyles =\n disableAllStyles === true &&\n (element.tag !== \"img\" || !preserveImageStyles) &&\n (typeof componentOverride === \"string\" || componentOverride == null);\n\n const targetingClasses = [];\n const styleObject = shouldPruneStyles\n ? undefined\n : getStyleObjectFromString(element?.style);\n\n if (isImageContainer(element) && children.length === 1) {\n targetingClasses.push(\"pantheon-img-container\");\n\n if (styleObject?.float === \"left\") {\n targetingClasses.push(\"pantheon-img-container-breakleft\");\n } else if (styleObject?.float === \"right\") {\n targetingClasses.push(\"pantheon-img-container-breakright\");\n } else if (styleObject?.clear === \"both\") {\n targetingClasses.push(\"pantheon-img-container-breakboth\");\n } else {\n targetingClasses.push(\"pantheon-img-container-inline\");\n\n if (\n (element.prevNode == null || !isImageContainer(element.prevNode)) &&\n (element.nextNode == null || !isImageContainer(element.nextNode))\n ) {\n targetingClasses.push(\"pantheon-img-container-alone\");\n }\n }\n\n const imageChild = isOldImageContainer(element)\n ? element.children[0]\n : element.children[0].children[0];\n const imageTitle = imageChild.attrs?.title?.trim();\n\n if (imageChild.attrs.src && cdnURLOverride) {\n try {\n const srcUrl = new URL(imageChild.attrs.src);\n\n if (CDNDomains.includes(srcUrl.hostname)) {\n srcUrl.hostname = cdnURLOverride;\n imageChild.attrs.src = srcUrl.toString();\n }\n } catch (err) {\n // If it's not a valid URL (or cannot be parsed), leave it unchanged.\n }\n }\n\n if (renderImageCaptions !== false && imageTitle?.length) {\n nodeChildren.push(\n <span\n style={{\n width: \"100%\",\n display: \"flex\",\n justifyContent: \"center\",\n fontSize: \".75rem\",\n }}\n className=\"pantheon-caption\"\n >\n {imageTitle}\n </span>,\n );\n }\n }\n\n return React.createElement(\n componentOverride || convertedTagName,\n {\n style: styleObject,\n ...convertAttributes({\n ...element.attrs,\n class: [element.attrs?.class, ...targetingClasses]\n .filter(Boolean)\n .join(\" \"),\n }),\n },\n nodeChildren.length ? nodeChildren : undefined,\n );\n};\n\nfunction isOldImageContainer(element: PantheonTreeNode<string>) {\n return (\n element.tag === \"span\" &&\n element.children?.[0].tag === \"img\" &&\n element.children.length === 1\n );\n}\n\nfunction isImageContainer(element: PantheonTreeNode<string>) {\n return (\n element.tag === \"span\" &&\n (isOldImageContainer(element) ||\n (element.children?.[0].tag === \"span\" &&\n element.children.length === 1 &&\n element.children?.[0].children?.[0].tag === \"img\" &&\n element.children[0].children?.length === 1))\n );\n}\n\nexport default PantheonTreeRenderer;\n","// Sourced from https://github.com/hatashiro/react-attr-converter/blob/master/index.js\nconst htmlAttributeToReactProp: Record<string, string> = {\n // Specials\n for: \"htmlFor\",\n class: \"className\",\n\n // HTML attributes\n cellpadding: \"cellPadding\",\n cellspacing: \"cellSpacing\",\n classname: \"className\",\n colspan: \"colSpan\",\n crossorigin: \"crossOrigin\",\n htmlfor: \"htmlFor\",\n marginheight: \"marginHeight\",\n marginwidth: \"marginWidth\",\n maxlength: \"maxLength\",\n minlength: \"minLength\",\n readonly: \"readOnly\",\n rowspan: \"rowSpan\",\n srcdoc: \"srcDoc\",\n srclang: \"srcLang\",\n srcset: \"srcSet\",\n};\n\nexport const convertAttributes = function (attrs: Record<string, unknown>) {\n return Object.keys(attrs).reduce(\n (acc, attr) => {\n const key = attr.toLowerCase();\n const value = attrs[attr];\n\n return {\n ...acc,\n [htmlAttributeToReactProp[key] || key]: value,\n };\n },\n {} as Record<string, unknown>,\n );\n};\n","const formatStringToCamelCase = (str?: string) => {\n const splitted = str?.split(\"-\") || [];\n if (splitted.length === 1) return splitted[0];\n return (\n splitted[0] +\n splitted\n .slice(1)\n .map((word) => word[0].toUpperCase() + word.slice(1))\n .join(\"\")\n );\n};\n\nexport const getStyleObjectFromString = (str?: string[] | null) => {\n if (!str || str.length < 1) return undefined;\n\n const style = {} as Record<string, string>;\n\n str.forEach((el) => {\n const [property, value] = el.split(\":\");\n if (!property && !value) return;\n\n if (property && value) {\n const formattedProperty = formatStringToCamelCase(property.trim());\n style[formattedProperty] = value.trim();\n return;\n }\n switch (property) {\n case \"underline\":\n style.textDecoration = \"underline\";\n break;\n case \"line-through\":\n style.textDecoration = \"line-through\";\n break;\n case \"italic\":\n style.fontStyle = \"italic\";\n break;\n case \"bold\":\n style.fontWeight = \"bold\";\n break;\n case \"strike-through\":\n style.textDecoration = \"line-through\";\n break;\n case \"superscript\":\n style.verticalAlign = \"super\";\n break;\n case \"subscript\":\n style.verticalAlign = \"sub\";\n break;\n default:\n break;\n }\n });\n\n return style;\n};\n","import { flattenDocumentTabs } from \"@pantheon-systems/pcc-sdk-core\";\nimport {\n Article,\n PantheonTree,\n PantheonTreeNode,\n TabTree,\n TreePantheonContent,\n} from \"@pantheon-systems/pcc-sdk-core/types\";\nimport _ from \"lodash\";\nimport { useMemo } from \"react\";\n\nexport function getArticleTitle(article: Article | undefined): string | null {\n if (!article?.resolvedContent) {\n return null;\n }\n\n const contentType = article?.contentType;\n\n if (contentType === \"TEXT_MARKDOWN\") {\n return null;\n }\n\n const jsonContent =\n typeof article.resolvedContent === \"string\"\n ? JSON.parse(article.resolvedContent)\n : (article.resolvedContent as PantheonTree | TabTree<PantheonTree>[]);\n\n const content: Array<PantheonTreeNode> = Array.isArray(jsonContent)\n ? _.flatMap(jsonContent, flattenDocumentTabs)\n : jsonContent.children;\n\n const titleContent = content.find((x) => x.tag === \"title\");\n\n if (titleContent != null) {\n const flatMap = titleContent.children\n ? _.flatMapDeep(\n titleContent.children,\n (x: PantheonTreeNode | TreePantheonContent) => x.data,\n )\n : [];\n\n return titleContent.data + flatMap.join(\"\");\n } else if (\n article?.metadata?.title != null &&\n typeof article?.metadata?.title === \"string\"\n ) {\n return article.metadata.title;\n } else {\n return article.title || \"\";\n }\n}\n\nexport function useArticleTitle(article: Article | undefined): string | null {\n return useMemo(() => getArticleTitle(article) || \"\", [article]);\n}\n","import { findTab } from \"@pantheon-systems/pcc-sdk-core\";\nimport {\n Article,\n PantheonTreeNode,\n TabTree,\n type SmartComponentMap as CoreSmartComponentMap,\n} from \"@pantheon-systems/pcc-sdk-core/types\";\nimport { Element } from \"hast\";\nimport React, { useEffect, useMemo } from \"react\";\nimport { getTextContent } from \"../../utils/react-element\";\nimport MarkdownRenderer from \"./Markdown\";\nimport PantheonTreeV2Renderer from \"./PantheonTreeV2Renderer\";\n\nexport { getArticleTitle, useArticleTitle } from \"./useArticleTitle\";\n\nexport type ServersideSmartComponentMap = {\n [K in keyof CoreSmartComponentMap]: CoreSmartComponentMap[K];\n};\n\nexport type SmartComponentMap = {\n [K in keyof CoreSmartComponentMap]: CoreSmartComponentMap[K] & {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n reactComponent: (props: any) => React.JSX.Element;\n };\n};\n\ntype ExtraProps = {\n // If Content type is Markdown\n node?: Element;\n};\n\nexport type ComponentMap = Partial<{\n [TagName in keyof JSX.IntrinsicElements]:\n | (new (\n props: JSX.IntrinsicElements[TagName] & ExtraProps,\n ) => JSX.ElementClass)\n // Function component:\n | ((props: JSX.IntrinsicElements[TagName] & ExtraProps) => JSX.Element)\n // Tag name:\n | keyof JSX.IntrinsicElements;\n}>;\n\ninterface Props {\n article?: Article;\n tabId?: string | null;\n bodyClassName?: string;\n containerClassName?: string;\n headerClassName?: string;\n renderTitle?: (\n titleElement: React.ReactElement,\n content: string,\n ) => React.ReactNode;\n smartComponentMap?: SmartComponentMap;\n componentMap?: ComponentMap;\n renderBody?: (bodyElement: React.ReactElement) => React.ReactNode;\n __experimentalFlags?: {\n disableAllStyles?: boolean;\n preserveImageStyles?: boolean;\n disableDefaultErrorBoundaries?: boolean;\n useUnintrusiveTitleRendering?: boolean;\n renderImageCaptions?: boolean;\n cdnURLOverride?: string;\n };\n}\n\nfunction UnboxContent(content: string | unknown) {\n if (typeof content !== \"string\") return content;\n\n try {\n return JSON.parse(content);\n } catch (e) {\n return content;\n }\n}\n\nconst ArticleRenderer = ({\n article,\n tabId,\n bodyClassName,\n containerClassName,\n headerClassName,\n renderTitle,\n smartComponentMap,\n componentMap,\n renderBody,\n __experimentalFlags,\n}: Props) => {\n useEffect(() => {\n if (__experimentalFlags?.useUnintrusiveTitleRendering !== true) {\n console.warn(\n \"PCC Deprecation Warning: ArticleRenderer's renderTitle will no longer be supported in a future release.\",\n );\n }\n }, [__experimentalFlags]);\n\n const contentType = article?.contentType;\n const unboxedContent = useMemo(\n () =>\n article?.resolvedContent ? UnboxContent(article.resolvedContent) : null,\n [article?.resolvedContent],\n );\n\n const contentToShow = useMemo(() => {\n if (!unboxedContent) return null;\n\n const content =\n (tabId != null && findTab(unboxedContent, tabId)?.documentTab) ||\n unboxedContent;\n\n if (\n tabId == null &&\n typeof unboxedContent === \"object\" &&\n content?.children == null\n ) {\n return Array.isArray(unboxedContent)\n ? unboxedContent[0]?.documentTab\n : (unboxedContent as TabTree<any>)?.documentTab;\n }\n\n return content;\n }, [tabId, unboxedContent]);\n\n if (!contentToShow) {\n return null;\n }\n\n if (contentType === \"TEXT_MARKDOWN\") {\n return (\n <div className={containerClassName}>\n {contentToShow ? (\n <MarkdownRenderer\n smartComponentMap={smartComponentMap}\n componentMap={componentMap}\n disableDefaultErrorBoundaries={\n !!__experimentalFlags?.disableDefaultErrorBoundaries\n }\n cdnURLOverride={__experimentalFlags?.cdnURLOverride}\n >\n {contentToShow}\n </MarkdownRenderer>\n ) : (\n <span>No content to display</span>\n )}\n </div>\n );\n }\n\n const parsedContent: PantheonTreeNode[] = contentToShow.children || [];\n\n let titleElement = null;\n\n if (__experimentalFlags?.useUnintrusiveTitleRendering !== true) {\n const indexOfFirstHeader = parsedContent.findIndex((x) =>\n [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"h7\", \"title\"].includes(x.tag),\n );\n\n const indexOfFirstParagraph = parsedContent.findIndex((x) => x.tag === \"p\");\n const resolvedTitleIndex =\n indexOfFirstHeader === -1 ? indexOfFirstParagraph : indexOfFirstHeader;\n\n const [titleContent] = parsedContent.splice(resolvedTitleIndex, 1);\n\n // @ts-expect-error Dynamic component props\n titleElement = React.createElement(renderer, {\n element: titleContent,\n componentMap,\n smartComponentMap,\n disableAllStyles: !!__experimentalFlags?.disableAllStyles,\n preserveImageStyles: !!__experimentalFlags?.preserveImageStyles,\n disableDefaultErrorBoundaries:\n !!__experimentalFlags?.disableDefaultErrorBoundaries,\n renderImageCaptions: __experimentalFlags?.renderImageCaptions !== false,\n cdnURLOverride: __experimentalFlags?.cdnURLOverride,\n });\n }\n\n const bodyElement = (\n <div className={bodyClassName}>\n {parsedContent?.map((element, idx) =>\n React.createElement(PantheonTreeV2Renderer, {\n key: idx,\n element: {\n ...element,\n prevNode: parsedContent[idx - 1],\n nextNode: parsedContent[idx + 1],\n },\n smartComponentMap,\n componentMap,\n disableAllStyles: !!__experimentalFlags?.disableAllStyles,\n preserveImageStyles: !!__experimentalFlags?.preserveImageStyles,\n disableDefaultErrorBoundaries:\n !!__experimentalFlags?.disableDefaultErrorBoundaries,\n renderImageCaptions:\n __experimentalFlags?.renderImageCaptions !== false,\n cdnURLOverride: __experimentalFlags?.cdnURLOverride,\n }),\n )}\n </div>\n );\n\n return (\n <div className={containerClassName}>\n {titleElement != null ? (\n <div className={headerClassName}>\n {renderTitle\n ? renderTitle(titleElement, getTextContent(titleElement))\n : titleElement}\n </div>\n ) : null}\n {renderBody ? renderBody(bodyElement) : bodyElement}\n </div>\n );\n};\n\nexport default ArticleRenderer;\n"]}