@purpur/library 9.0.6 → 9.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.json +33 -0
- package/CHANGELOG.md +15 -1
- package/dist/{RichText-DRacgpis.mjs → RichText-Bi51HE6X.mjs} +3 -3
- package/dist/{RichText-DRacgpis.mjs.map → RichText-Bi51HE6X.mjs.map} +1 -1
- package/dist/{RichText-DMyGiMN0.js → RichText-DNroJJXv.js} +2 -2
- package/dist/{RichText-DMyGiMN0.js.map → RichText-DNroJJXv.js.map} +1 -1
- package/dist/{ThemeProvider-CrjMv3M8.mjs → ThemeProvider-BR1hJQOD.mjs} +85 -85
- package/dist/{ThemeProvider-CrjMv3M8.mjs.map → ThemeProvider-BR1hJQOD.mjs.map} +1 -1
- package/dist/{accordion-DWflnyWa.mjs → accordion-BKTz9DM6.mjs} +18 -18
- package/dist/{accordion-DWflnyWa.mjs.map → accordion-BKTz9DM6.mjs.map} +1 -1
- package/dist/{accordion-CF2fj2uq.js → accordion-DX8efWOt.js} +2 -2
- package/dist/{accordion-CF2fj2uq.js.map → accordion-DX8efWOt.js.map} +1 -1
- package/dist/accordion.cjs.js +1 -1
- package/dist/accordion.es.js +1 -1
- package/dist/{alert-badge-u7qAhYbR.mjs → alert-badge-DR8cigWu.mjs} +3 -3
- package/dist/{alert-badge-u7qAhYbR.mjs.map → alert-badge-DR8cigWu.mjs.map} +1 -1
- package/dist/alert-badge.es.js +1 -1
- package/dist/{autocomplete-yD0-1vlF.js → autocomplete-6qSqK3SI.js} +2 -2
- package/dist/{autocomplete-yD0-1vlF.js.map → autocomplete-6qSqK3SI.js.map} +1 -1
- package/dist/{autocomplete-0kGG_STe.mjs → autocomplete-B4dZx9zF.mjs} +3 -3
- package/dist/{autocomplete-0kGG_STe.mjs.map → autocomplete-B4dZx9zF.mjs.map} +1 -1
- package/dist/autocomplete.cjs.js +1 -1
- package/dist/autocomplete.es.js +1 -1
- package/dist/button-BfYKNBmC.mjs +102 -0
- package/dist/button-BfYKNBmC.mjs.map +1 -0
- package/dist/button-DDYGuqZ0.js +2 -0
- package/dist/button-DDYGuqZ0.js.map +1 -0
- package/dist/button.cjs.js +1 -1
- package/dist/button.es.js +1 -1
- package/dist/{calendar-pMM0fKEu.js → calendar-CxkJMONO.js} +2 -2
- package/dist/{calendar-pMM0fKEu.js.map → calendar-CxkJMONO.js.map} +1 -1
- package/dist/{calendar-DDie8jSH.mjs → calendar-vALLklKV.mjs} +2 -2
- package/dist/{calendar-DDie8jSH.mjs.map → calendar-vALLklKV.mjs.map} +1 -1
- package/dist/calendar.cjs.js +1 -1
- package/dist/calendar.es.js +1 -1
- package/dist/{card-DiMVw06l.mjs → card-CkZQZOz1.mjs} +9 -9
- package/dist/{card-DiMVw06l.mjs.map → card-CkZQZOz1.mjs.map} +1 -1
- package/dist/{card-B512KHpr.js → card-VMa3cGCP.js} +2 -2
- package/dist/{card-B512KHpr.js.map → card-VMa3cGCP.js.map} +1 -1
- package/dist/card.cjs.js +1 -1
- package/dist/card.es.js +1 -1
- package/dist/{checkbox-LYzMiXu7.mjs → checkbox-D6qWgpWR.mjs} +8 -8
- package/dist/{checkbox-LYzMiXu7.mjs.map → checkbox-D6qWgpWR.mjs.map} +1 -1
- package/dist/checkbox.es.js +1 -1
- package/dist/{chip-group-aj1fdnjC.js → chip-group-B775zvKD.js} +2 -2
- package/dist/{chip-group-aj1fdnjC.js.map → chip-group-B775zvKD.js.map} +1 -1
- package/dist/{chip-group-CJVvfl_J.mjs → chip-group-xuOe7nL3.mjs} +3 -3
- package/dist/{chip-group-CJVvfl_J.mjs.map → chip-group-xuOe7nL3.mjs.map} +1 -1
- package/dist/chip-group.cjs.js +1 -1
- package/dist/chip-group.es.js +1 -1
- package/dist/components/button/src/button.d.ts +1 -2
- package/dist/components/button/src/button.d.ts.map +1 -1
- package/dist/components/date-field/src/date-field.d.ts.map +1 -1
- package/dist/components/stepper/src/stepper-button.d.ts.map +1 -1
- package/dist/components/table/src/table-toolbar.d.ts.map +1 -1
- package/dist/components/tabs/src/tab-content.d.ts.map +1 -1
- package/dist/components/tabs/src/tabs.d.ts.map +1 -1
- package/dist/{container-Bw12NgHN.mjs → container-DLjBTB_w.mjs} +3 -3
- package/dist/{container-Bw12NgHN.mjs.map → container-DLjBTB_w.mjs.map} +1 -1
- package/dist/container.es.js +1 -1
- package/dist/{content-block-DUcjAZgG.mjs → content-block-BMOvlH7a.mjs} +6 -6
- package/dist/{content-block-DUcjAZgG.mjs.map → content-block-BMOvlH7a.mjs.map} +1 -1
- package/dist/{content-block-kzdUWgvH.js → content-block-Cd7xSE8t.js} +2 -2
- package/dist/{content-block-kzdUWgvH.js.map → content-block-Cd7xSE8t.js.map} +1 -1
- package/dist/content-block.cjs.js +1 -1
- package/dist/content-block.es.js +1 -1
- package/dist/{countdown-DxAGVUFI.mjs → countdown-DZ4IwkNy.mjs} +12 -12
- package/dist/{countdown-DxAGVUFI.mjs.map → countdown-DZ4IwkNy.mjs.map} +1 -1
- package/dist/countdown.es.js +1 -1
- package/dist/date-field-CORqon6B.js +2 -0
- package/dist/{date-field-CPiTZqa0.js.map → date-field-CORqon6B.js.map} +1 -1
- package/dist/{date-field-D_6iP2fC.mjs → date-field-CTJB8O0e.mjs} +325 -310
- package/dist/{date-field-D_6iP2fC.mjs.map → date-field-CTJB8O0e.mjs.map} +1 -1
- package/dist/date-field.cjs.js +1 -1
- package/dist/date-field.es.js +1 -1
- package/dist/{date-picker-BRnwwZv1.mjs → date-picker-CJcIJ5VL.mjs} +5 -5
- package/dist/{date-picker-BRnwwZv1.mjs.map → date-picker-CJcIJ5VL.mjs.map} +1 -1
- package/dist/{date-picker-DlJGggam.js → date-picker-Dv3W05Hf.js} +2 -2
- package/dist/{date-picker-DlJGggam.js.map → date-picker-Dv3W05Hf.js.map} +1 -1
- package/dist/date-picker.cjs.js +1 -1
- package/dist/date-picker.es.js +1 -1
- package/dist/{dismissable-chip-group-DsO2cZaF.js → dismissable-chip-group-CnziecOt.js} +2 -2
- package/dist/{dismissable-chip-group-DsO2cZaF.js.map → dismissable-chip-group-CnziecOt.js.map} +1 -1
- package/dist/{dismissable-chip-group-Bl0D18qM.mjs → dismissable-chip-group-ZCYOt1sB.mjs} +2 -2
- package/dist/{dismissable-chip-group-Bl0D18qM.mjs.map → dismissable-chip-group-ZCYOt1sB.mjs.map} +1 -1
- package/dist/dismissable-chip-group.cjs.js +1 -1
- package/dist/dismissable-chip-group.es.js +1 -1
- package/dist/{drawer-nBpCtIdI.js → drawer-Ce5LNpU2.js} +2 -2
- package/dist/{drawer-nBpCtIdI.js.map → drawer-Ce5LNpU2.js.map} +1 -1
- package/dist/{drawer-Boqmgh-i.mjs → drawer-DSFZ61OH.mjs} +14 -14
- package/dist/{drawer-Boqmgh-i.mjs.map → drawer-DSFZ61OH.mjs.map} +1 -1
- package/dist/drawer.cjs.js +1 -1
- package/dist/drawer.es.js +1 -1
- package/dist/{floating-ui.react-dom-0ol4sFzt.mjs → floating-ui.react-dom-gsHLgcoR.mjs} +5 -5
- package/dist/{floating-ui.react-dom-0ol4sFzt.mjs.map → floating-ui.react-dom-gsHLgcoR.mjs.map} +1 -1
- package/dist/{footer-DrjAwjuL.js → footer-BL0ewBZT.js} +2 -2
- package/dist/{footer-DrjAwjuL.js.map → footer-BL0ewBZT.js.map} +1 -1
- package/dist/{footer-DcWsihxS.mjs → footer-cH07Xqil.mjs} +5 -5
- package/dist/{footer-DcWsihxS.mjs.map → footer-cH07Xqil.mjs.map} +1 -1
- package/dist/footer.cjs.js +1 -1
- package/dist/footer.es.js +1 -1
- package/dist/heading-drD5ugCC.js +2 -0
- package/dist/{heading-DLCdW6gx.js.map → heading-drD5ugCC.js.map} +1 -1
- package/dist/heading-xwBuT_-9.mjs +75 -0
- package/dist/{heading-gqtQNo5n.mjs.map → heading-xwBuT_-9.mjs.map} +1 -1
- package/dist/heading.cjs.js +1 -1
- package/dist/heading.es.js +1 -1
- package/dist/{hero-banner-B8fRHxXc.mjs → hero-banner-CkSSlxTW.mjs} +5 -5
- package/dist/{hero-banner-B8fRHxXc.mjs.map → hero-banner-CkSSlxTW.mjs.map} +1 -1
- package/dist/{hero-banner-D3peC1NR.js → hero-banner-JFaqW20R.js} +2 -2
- package/dist/{hero-banner-D3peC1NR.js.map → hero-banner-JFaqW20R.js.map} +1 -1
- package/dist/hero-banner.cjs.js +1 -1
- package/dist/hero-banner.es.js +1 -1
- package/dist/library.cjs.js +1 -1
- package/dist/library.es.js +44 -44
- package/dist/{listbox-u6__DsLw.mjs → listbox-oDeP8FvH.mjs} +2 -2
- package/dist/{listbox-u6__DsLw.mjs.map → listbox-oDeP8FvH.mjs.map} +1 -1
- package/dist/listbox.es.js +1 -1
- package/dist/{modal-C2UQsW-g.mjs → modal-2ymCXTup.mjs} +19 -19
- package/dist/{modal-C2UQsW-g.mjs.map → modal-2ymCXTup.mjs.map} +1 -1
- package/dist/{modal-nyhf5zxG.js → modal-CXi2xez5.js} +2 -2
- package/dist/{modal-nyhf5zxG.js.map → modal-CXi2xez5.js.map} +1 -1
- package/dist/modal.cjs.js +1 -1
- package/dist/modal.es.js +1 -1
- package/dist/{notification-C32wHljA.mjs → notification-BFSOuDp8.mjs} +22 -22
- package/dist/{notification-C32wHljA.mjs.map → notification-BFSOuDp8.mjs.map} +1 -1
- package/dist/{notification-Bg1vQkQ3.js → notification-DdnI2rOh.js} +2 -2
- package/dist/{notification-Bg1vQkQ3.js.map → notification-DdnI2rOh.js.map} +1 -1
- package/dist/{notification-banner-BY2iZOIa.mjs → notification-banner-CQvBezAL.mjs} +3 -3
- package/dist/{notification-banner-BY2iZOIa.mjs.map → notification-banner-CQvBezAL.mjs.map} +1 -1
- package/dist/{notification-banner-C8XsBDTq.js → notification-banner-CT4ew8IQ.js} +2 -2
- package/dist/{notification-banner-C8XsBDTq.js.map → notification-banner-CT4ew8IQ.js.map} +1 -1
- package/dist/notification-banner.cjs.js +1 -1
- package/dist/notification-banner.es.js +1 -1
- package/dist/notification.cjs.js +1 -1
- package/dist/notification.es.js +1 -1
- package/dist/{pagination-CVVCAQ65.mjs → pagination-BdCjh1Pi.mjs} +2 -2
- package/dist/{pagination-CVVCAQ65.mjs.map → pagination-BdCjh1Pi.mjs.map} +1 -1
- package/dist/pagination.es.js +1 -1
- package/dist/{paragraph-DNtj7OLr.mjs → paragraph-Ci50OF1u.mjs} +3 -3
- package/dist/{paragraph-DNtj7OLr.mjs.map → paragraph-Ci50OF1u.mjs.map} +1 -1
- package/dist/paragraph.es.js +1 -1
- package/dist/{popover-B1BgSoQx.js → popover-D3qWbbU4.js} +2 -2
- package/dist/{popover-B1BgSoQx.js.map → popover-D3qWbbU4.js.map} +1 -1
- package/dist/{popover-DBMI9Jy1.mjs → popover-ZeQKmyEb.mjs} +25 -25
- package/dist/{popover-DBMI9Jy1.mjs.map → popover-ZeQKmyEb.mjs.map} +1 -1
- package/dist/popover.cjs.js +1 -1
- package/dist/popover.es.js +1 -1
- package/dist/{product-card-rfpJbzzV.mjs → product-card-BU1ThhCx.mjs} +12 -12
- package/dist/{product-card-rfpJbzzV.mjs.map → product-card-BU1ThhCx.mjs.map} +1 -1
- package/dist/{product-card-DOBHGAa2.js → product-card-CNBegEBW.js} +2 -2
- package/dist/{product-card-DOBHGAa2.js.map → product-card-CNBegEBW.js.map} +1 -1
- package/dist/product-card.cjs.js +1 -1
- package/dist/product-card.es.js +1 -1
- package/dist/{promotion-card-BIFOwMrw.js → promotion-card-CXNhskRl.js} +2 -2
- package/dist/{promotion-card-BIFOwMrw.js.map → promotion-card-CXNhskRl.js.map} +1 -1
- package/dist/{promotion-card-DeyqFnyP.mjs → promotion-card-_bPyVr9t.mjs} +9 -9
- package/dist/{promotion-card-DeyqFnyP.mjs.map → promotion-card-_bPyVr9t.mjs.map} +1 -1
- package/dist/promotion-card.cjs.js +1 -1
- package/dist/promotion-card.es.js +1 -1
- package/dist/purpur.css +1 -1
- package/dist/{quantity-selector-DPOTlMSq.js → quantity-selector-CjSAaj7d.js} +2 -2
- package/dist/{quantity-selector-DPOTlMSq.js.map → quantity-selector-CjSAaj7d.js.map} +1 -1
- package/dist/{quantity-selector-_VcZYLjR.mjs → quantity-selector-HvyYSKah.mjs} +5 -5
- package/dist/{quantity-selector-_VcZYLjR.mjs.map → quantity-selector-HvyYSKah.mjs.map} +1 -1
- package/dist/quantity-selector.cjs.js +1 -1
- package/dist/quantity-selector.es.js +1 -1
- package/dist/{radio-button-group-CZ_FnVAi.js → radio-button-group-BaFpGAcD.js} +2 -2
- package/dist/{radio-button-group-CZ_FnVAi.js.map → radio-button-group-BaFpGAcD.js.map} +1 -1
- package/dist/{radio-button-group-BnCPcmSN.mjs → radio-button-group-CFqPsu5A.mjs} +5 -5
- package/dist/{radio-button-group-BnCPcmSN.mjs.map → radio-button-group-CFqPsu5A.mjs.map} +1 -1
- package/dist/radio-button-group.cjs.js +1 -1
- package/dist/radio-button-group.es.js +1 -1
- package/dist/{radio-card-group-DkaMcmen.mjs → radio-card-group-BlRZBa-9.mjs} +16 -16
- package/dist/{radio-card-group-DkaMcmen.mjs.map → radio-card-group-BlRZBa-9.mjs.map} +1 -1
- package/dist/{radio-card-group-BT5pV3tA.js → radio-card-group-sYcfDPJq.js} +2 -2
- package/dist/{radio-card-group-BT5pV3tA.js.map → radio-card-group-sYcfDPJq.js.map} +1 -1
- package/dist/radio-card-group.cjs.js +1 -1
- package/dist/radio-card-group.es.js +1 -1
- package/dist/rich-text.cjs.js +1 -1
- package/dist/rich-text.es.js +1 -1
- package/dist/scss/heading.mixins.scss +1 -1
- package/dist/{search-field-DH0xeW_J.mjs → search-field-BOmCVr5b.mjs} +11 -11
- package/dist/{search-field-DH0xeW_J.mjs.map → search-field-BOmCVr5b.mjs.map} +1 -1
- package/dist/{search-field-CxX4BBcg.js → search-field-CanOlkIY.js} +2 -2
- package/dist/{search-field-CxX4BBcg.js.map → search-field-CanOlkIY.js.map} +1 -1
- package/dist/search-field.cjs.js +1 -1
- package/dist/search-field.es.js +1 -1
- package/dist/{stepper-BfIbJwZn.mjs → stepper-D7T0wed7.mjs} +68 -71
- package/dist/stepper-D7T0wed7.mjs.map +1 -0
- package/dist/stepper-DYjJgEHL.js +2 -0
- package/dist/stepper-DYjJgEHL.js.map +1 -0
- package/dist/stepper.cjs.js +1 -1
- package/dist/stepper.es.js +1 -1
- package/dist/{table-DvcpczWf.mjs → table-B4pts_r4.mjs} +181 -179
- package/dist/{table-DvcpczWf.mjs.map → table-B4pts_r4.mjs.map} +1 -1
- package/dist/{table-BNeo_B1h.js → table-Bv_BISXV.js} +4 -4
- package/dist/{table-BNeo_B1h.js.map → table-Bv_BISXV.js.map} +1 -1
- package/dist/table.cjs.js +1 -1
- package/dist/table.es.js +1 -1
- package/dist/tabs-Bye5lgZ1.mjs +424 -0
- package/dist/tabs-Bye5lgZ1.mjs.map +1 -0
- package/dist/tabs-D-nfZHIA.js +2 -0
- package/dist/tabs-D-nfZHIA.js.map +1 -0
- package/dist/tabs.cjs.js +1 -1
- package/dist/tabs.es.js +1 -1
- package/dist/{text-area-Cb9Hm2Z9.mjs → text-area-CpYWt99s.mjs} +3 -3
- package/dist/{text-area-Cb9Hm2Z9.mjs.map → text-area-CpYWt99s.mjs.map} +1 -1
- package/dist/text-area.es.js +1 -1
- package/dist/{text-field-PKAaXO1N.mjs → text-field-5rIuW8gc.mjs} +2 -2
- package/dist/{text-field-PKAaXO1N.mjs.map → text-field-5rIuW8gc.mjs.map} +1 -1
- package/dist/{text-field-B8a-NKm4.js → text-field-Xt6T3zjO.js} +2 -2
- package/dist/{text-field-B8a-NKm4.js.map → text-field-Xt6T3zjO.js.map} +1 -1
- package/dist/text-field.cjs.js +1 -1
- package/dist/text-field.es.js +1 -1
- package/dist/theme.es.js +2 -2
- package/dist/{toggle-Cezg5MUc.mjs → toggle-D23x1wWk.mjs} +9 -9
- package/dist/{toggle-Cezg5MUc.mjs.map → toggle-D23x1wWk.mjs.map} +1 -1
- package/dist/toggle.es.js +1 -1
- package/dist/tokens.es.js +3 -3
- package/dist/{tooltip-DXi7ikUT.mjs → tooltip-DkwyNxrQ.mjs} +12 -12
- package/dist/{tooltip-DXi7ikUT.mjs.map → tooltip-DkwyNxrQ.mjs.map} +1 -1
- package/dist/{tooltip-CLQLxoaf.js → tooltip-svlZkXBs.js} +2 -2
- package/dist/{tooltip-CLQLxoaf.js.map → tooltip-svlZkXBs.js.map} +1 -1
- package/dist/tooltip.cjs.js +1 -1
- package/dist/tooltip.es.js +1 -1
- package/dist/{useColorScheme-DRQcbSog.mjs → useColorScheme-9rgSgG0N.mjs} +2 -2
- package/dist/{useColorScheme-DRQcbSog.mjs.map → useColorScheme-9rgSgG0N.mjs.map} +1 -1
- package/dist/{variables-91UvS2rU.mjs → variables-BVgnpUH9.mjs} +253 -253
- package/dist/{variables-91UvS2rU.mjs.map → variables-BVgnpUH9.mjs.map} +1 -1
- package/dist/{variables-BSsIx39i.mjs → variables-DkCN2x27.mjs} +7 -7
- package/dist/{variables-BSsIx39i.mjs.map → variables-DkCN2x27.mjs.map} +1 -1
- package/dist/{variables-BUfnQw6H.mjs → variables-Dr3Hsdn-.mjs} +9 -9
- package/dist/{variables-BUfnQw6H.mjs.map → variables-Dr3Hsdn-.mjs.map} +1 -1
- package/package.json +18 -18
- package/scripts/generate.mts +4 -1
- package/vite-plugin-generate-components-metadata.js +4 -1
- package/dist/button-ChYUPi2k.js +0 -2
- package/dist/button-ChYUPi2k.js.map +0 -1
- package/dist/button-DBX_tvfJ.mjs +0 -105
- package/dist/button-DBX_tvfJ.mjs.map +0 -1
- package/dist/date-field-CPiTZqa0.js +0 -2
- package/dist/heading-DLCdW6gx.js +0 -2
- package/dist/heading-gqtQNo5n.mjs +0 -75
- package/dist/stepper-B248FwO-.js +0 -2
- package/dist/stepper-B248FwO-.js.map +0 -1
- package/dist/stepper-BfIbJwZn.mjs.map +0 -1
- package/dist/tabs-CfHd4UQ2.js +0 -2
- package/dist/tabs-CfHd4UQ2.js.map +0 -1
- package/dist/tabs-CoXMAwMx.mjs +0 -396
- package/dist/tabs-CoXMAwMx.mjs.map +0 -1
package/CHANGELOG.json
CHANGED
|
@@ -1,6 +1,39 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@purpur/library",
|
|
3
3
|
"entries": [
|
|
4
|
+
{
|
|
5
|
+
"version": "9.0.7",
|
|
6
|
+
"tag": "@purpur/library_v9.0.7",
|
|
7
|
+
"date": "Tue, 24 Mar 2026 08:08:48 GMT",
|
|
8
|
+
"comments": {
|
|
9
|
+
"none": [
|
|
10
|
+
{
|
|
11
|
+
"comment": "Button: Deprecate tertiary variant and update border-radius for text variant"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"comment": "PromotionCard: fix content stretching on tablet and desktop to fill available space"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"comment": "DateField: Fix cursor position jumping to end when editing in the middle of the date"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"comment": "Icon: Bump svgo to 4.0.1 to fix security vulnerability"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"comment": "IllustrativeIcon: Bump svgo to 4.0.1 to fix security vulnerability"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"comment": "Logo: Bump svgo to 4.0.1 to fix security vulnerability"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"comment": "Stepper: Fix completedStepLabel not being read by VoiceOver and screen readers"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"comment": "Tabs: Fix accessibility issue: tab panels now have tabindex=\"0\" so keyboard users can Tab from the tab list into the active panel"
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
},
|
|
4
37
|
{
|
|
5
38
|
"version": "9.0.6",
|
|
6
39
|
"tag": "@purpur/library_v9.0.6",
|
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
# Change Log - @purpur/library
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Tue, 24 Mar 2026 08:08:48 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
## 9.0.7
|
|
6
|
+
Tue, 24 Mar 2026 08:08:48 GMT
|
|
7
|
+
|
|
8
|
+
### Updates
|
|
9
|
+
|
|
10
|
+
- Button: Deprecate tertiary variant and update border-radius for text variant
|
|
11
|
+
- PromotionCard: fix content stretching on tablet and desktop to fill available space
|
|
12
|
+
- DateField: Fix cursor position jumping to end when editing in the middle of the date
|
|
13
|
+
- Icon: Bump svgo to 4.0.1 to fix security vulnerability
|
|
14
|
+
- IllustrativeIcon: Bump svgo to 4.0.1 to fix security vulnerability
|
|
15
|
+
- Logo: Bump svgo to 4.0.1 to fix security vulnerability
|
|
16
|
+
- Stepper: Fix completedStepLabel not being read by VoiceOver and screen readers
|
|
17
|
+
- Tabs: Fix accessibility issue: tab panels now have tabindex="0" so keyboard users can Tab from the tab list into the active panel
|
|
4
18
|
|
|
5
19
|
## 9.0.6
|
|
6
20
|
Mon, 16 Mar 2026 17:24:08 GMT
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsx as l, jsxs as L } from "react/jsx-runtime";
|
|
2
2
|
import { Fragment as I } from "react";
|
|
3
|
-
import {
|
|
3
|
+
import { H as h } from "./heading-xwBuT_-9.mjs";
|
|
4
4
|
import { a as p } from "./link-DY5WLpyc.mjs";
|
|
5
|
-
import {
|
|
5
|
+
import { P as H } from "./paragraph-Ci50OF1u.mjs";
|
|
6
6
|
import { T as N } from "./text-spacing-BU0mkEf9.mjs";
|
|
7
7
|
const m = {
|
|
8
8
|
HYPERLINK: "hyperlink",
|
|
@@ -186,4 +186,4 @@ export {
|
|
|
186
186
|
j as R,
|
|
187
187
|
B as r
|
|
188
188
|
};
|
|
189
|
-
//# sourceMappingURL=RichText-
|
|
189
|
+
//# sourceMappingURL=RichText-Bi51HE6X.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RichText-DRacgpis.mjs","sources":["../../../components/rich-text/src/constants.ts","../../../components/rich-text/src/renderers.tsx","../../../components/rich-text/src/utils.ts","../../../components/rich-text/src/RichText.tsx"],"sourcesContent":["export const INLINE = {\n HYPERLINK: \"hyperlink\",\n ENTRY_HYPERLINK: \"entry-hyperlink\",\n ASSET_HYPERLINK: \"asset-hyperlink\",\n RESOURCE_HYPERLINK: \"resource-hyperlink\",\n EMBEDDED_ENTRY: \"embedded-entry-inline\",\n} as const;\n\nexport const BLOCK = {\n DOCUMENT: \"document\",\n PARAGRAPH: \"paragraph\",\n TEXT: \"text\",\n HYPERLINK: \"hyperlink\",\n ENTRY_HYPERLINK: \"entry-hyperlink\",\n\n HEADER_1: \"header-1\",\n HEADER_2: \"header-2\",\n HEADER_3: \"header-3\",\n HEADER_4: \"header-4\",\n HEADER_5: \"header-5\",\n HEADER_6: \"header-6\",\n\n HEADING_1: \"heading-1\",\n HEADING_2: \"heading-2\",\n HEADING_3: \"heading-3\",\n HEADING_4: \"heading-4\",\n HEADING_5: \"heading-5\",\n HEADING_6: \"heading-6\",\n\n TABLE: \"table\",\n TABLE_ROW: \"table-row\",\n TABLE_HEADER_CELL: \"table-header-cell\",\n TABLE_CELL: \"table-cell\",\n TABLE_BODY: \"table-body\",\n\n OL_LIST: \"ordered-list\",\n UL_LIST: \"unordered-list\",\n LIST_ITEM: \"list-item\",\n\n HR: \"horizontal-row\",\n QUOTE: \"blockquote\",\n\n EMBEDDED_ENTRY: \"embedded-entity\",\n EMBEDDED_ASSET: \"embedded-asset-block\",\n\n IMAGE: \"image\",\n VIDEO: \"video\",\n RICHTEXTDOCUMENT: \"rich-text-document\",\n TEASER: \"teaser\",\n} as const;\n\nexport const MARK = {\n BOLD: \"bold\",\n ITALIC: \"italic\",\n UNDERLINE: \"underline\",\n CODE: \"code\",\n} as const;\n\nexport const ELEMENT = {\n DIV: \"div\",\n SPAN: \"span\",\n} as const;\n","import React, { type ReactNode } from \"react\";\n\nimport { BLOCK } from \"./constants\";\nimport { type RichTextNode } from \"./types\";\n\nconst isHeaderRow = (row: RichTextNode): boolean =>\n row.type === BLOCK.TABLE_ROW &&\n !!row.content?.every((node) => node.type === BLOCK.TABLE_HEADER_CELL);\n\n/**\n * Wrap the first rows with <thead /> if it consists of only <th> elements.\n * Wrap the rest of the rows with <tbody />.\n */\nexport const tableRenderer = (richTextNode: RichTextNode, children: ReactNode[]) => {\n if (richTextNode.type !== BLOCK.TABLE) {\n return children;\n }\n const { content: tableContent } = richTextNode;\n const [headerRows, bodyRows] = (tableContent || []).reduce<[RichTextNode[], RichTextNode[]]>(\n ([headers, body], row) => {\n return isHeaderRow(row) ? [[...headers, row], body] : [headers, [...body, row]];\n },\n [[], []]\n );\n const headerRowChildren = children.slice(0, headerRows.length);\n const bodyRowChildren = children.slice(headerRows.length, children.length);\n return (\n <div className=\"purpur-rich-text-table-scroll-container\">\n <div className=\"purpur-rich-text-table-inner-scroll-container\">\n <table>\n {headerRows.length > 0 && <thead>{headerRowChildren}</thead>}\n {bodyRows.length > 0 && <tbody>{bodyRowChildren}</tbody>}\n </table>\n </div>\n </div>\n );\n};\n","import { BLOCK, INLINE } from \"./constants\";\nimport { type Block, type Inline, type Mark, type RichTextNode, type Value } from \"./types\";\n\nexport type MarkNode = {\n type: Mark;\n};\n\ntype TextNode<T> = RichTextNode<T> & {\n type: \"text\";\n value: string;\n marks: MarkNode[];\n};\n\ntype InlineNode<T> = RichTextNode<T> & {\n type: Inline;\n content: Array<Inline | Text>;\n};\n\ntype BlockNode<T> = RichTextNode<T> & {\n type: Block;\n content: Array<Block | Inline | Text>;\n};\n\nconst hasValue = (obj: Record<string, unknown>, value: unknown) =>\n Object.values(obj).includes(value);\n\nconst isText = <T>(node: RichTextNode<T> | undefined): node is TextNode<T> => node?.type === \"text\";\n\nconst isBlock = <T>(node: RichTextNode<T> | undefined): node is BlockNode<T> =>\n !isInline(node) && !isText(node) && hasValue(BLOCK, node?.type);\n\nconst isInline = <T>(node: RichTextNode<T> | undefined): node is InlineNode<T> =>\n hasValue(INLINE, node?.type);\n\nexport const safeJsonParse = <T>(jsonString: string): T | null => {\n try {\n return JSON.parse(jsonString);\n } catch {\n return null;\n }\n};\n\n// This is equivalent to https://github.com/contentful/rich-text/tree/master/packages/rich-text-plain-text-renderer\nexport const richToPlainText = <T>(data: string, blockDivisor = \" \"): string => {\n const rootNode = safeJsonParse<RichTextNode<T>>(data);\n\n if (!rootNode || !rootNode.content) {\n return \"\";\n }\n\n return rootNode.content.reduce((acc: string, node: RichTextNode<T>, i) => {\n let nodeTextValue = \"\";\n\n if (isText(node)) {\n nodeTextValue = node.value;\n } else if (isBlock(node) || isInline(node)) {\n nodeTextValue = richToPlainText(JSON.stringify(node), blockDivisor);\n if (!nodeTextValue.length) {\n return acc;\n }\n }\n\n const nextNode = rootNode?.content?.[i + 1];\n const divisor = isBlock(nextNode) ? blockDivisor : \"\";\n\n return acc + nodeTextValue + divisor;\n }, \"\");\n};\n\nexport function normalizeNode<T = Value>(node: RichTextNode<T>) {\n if (\n node.type === BLOCK.IMAGE &&\n typeof node.value === \"object\" &&\n node?.value &&\n \"image\" in node.value &&\n node?.value?.image?.url\n ) {\n return { ...node, value: { ...node.value, url: node.value.image.url } };\n }\n\n if (\n node.type === BLOCK.VIDEO &&\n typeof node.value === \"object\" &&\n node?.value &&\n \"video\" in node.value &&\n node.value.video?.url\n ) {\n return { ...node, value: { ...node.value, url: node.value.video.url } };\n }\n\n return node;\n}\n","import React, { Fragment, type ReactNode } from \"react\";\nimport { Heading } from \"@purpur/heading\";\nimport { Link } from \"@purpur/link\";\nimport { Paragraph } from \"@purpur/paragraph\";\nimport { TextSpacing } from \"@purpur/text-spacing\";\n\nimport { BLOCK, MARK } from \"./constants\";\nimport { tableRenderer } from \"./renderers\";\nimport type {\n ImageProp,\n LinkProp,\n Mark,\n NodeTypes,\n RichTextNode,\n RichTextProps,\n Value,\n VideoPosterProp,\n} from \"./types\";\nimport { normalizeNode } from \"./utils\";\n\n// Inspired by https://github.com/contentful/rich-text/blob/master/packages/rich-text-react-renderer/src/index.tsx\nconst MARK_TYPES = {\n [MARK.BOLD]: (children: ReactNode) => <b>{children}</b>,\n [MARK.ITALIC]: (children: ReactNode) => <i>{children}</i>,\n [MARK.UNDERLINE]: (children: ReactNode) => <u>{children}</u>,\n [MARK.CODE]: (children: ReactNode) => <code>{children}</code>,\n};\n\nconst getNodeType = (node: RichTextNode) => {\n const type = node.type ?? node.nodeType!;\n if (type.startsWith(\"heading-\")) return type.replace(\"heading-\", \"header-\");\n if (type.startsWith(\"entry-hyperlink\")) return type.replace(\"entry-hyperlink\", \"hyperlink\");\n return type;\n};\n\nfunction getNodeTypes<T = Value>(\n link: LinkProp,\n image: ImageProp,\n videoPoster: VideoPosterProp\n): NodeTypes<T> {\n return {\n [BLOCK.RICHTEXTDOCUMENT]: (_, children) => children,\n [BLOCK.DOCUMENT]: (_, children) => children,\n [BLOCK.PARAGRAPH]: (_, children) => <Paragraph variant=\"paragraph-200\">{children}</Paragraph>,\n [BLOCK.TEXT]: (node) => {\n const { value: nodeValue, marks } = node;\n const value = typeof nodeValue === \"string\" ? nodeValue.replace(/\\n/g, \"<br />\") : nodeValue;\n\n const element = <span dangerouslySetInnerHTML={{ __html: value as string }} />;\n\n if (!marks) {\n return element;\n }\n return marks.reduce((accumulator: ReactNode, currentValue: Mark | { type: Mark }) => {\n return MARK_TYPES[typeof currentValue === \"string\" ? currentValue : currentValue.type](\n accumulator\n );\n }, element);\n },\n [BLOCK.HYPERLINK]: (node, children) => {\n const uri = node.uri ?? (node.data?.uri as string);\n\n if (link) {\n return <Link variant=\"text\">{link(children, uri)}</Link>;\n }\n return (\n <Link variant=\"text\">\n <a href={uri}>{children}</a>\n </Link>\n );\n },\n [BLOCK.HR]: () => <hr />,\n [BLOCK.HEADER_2]: (_, children) => (\n <Heading tag=\"h2\" variant=\"title-300\">\n {children}\n </Heading>\n ),\n [BLOCK.HEADER_3]: (_, children) => (\n <Heading tag=\"h3\" variant=\"title-200\">\n {children}\n </Heading>\n ),\n [BLOCK.HEADER_4]: (_, children) => (\n <Heading tag=\"h4\" variant=\"title-100\">\n {children}\n </Heading>\n ),\n [BLOCK.HEADER_5]: (_, children) => (\n <Heading tag=\"h5\" variant=\"title-100\">\n {children}\n </Heading>\n ),\n [BLOCK.HEADER_6]: (_, children) => (\n <Heading tag=\"h6\" variant=\"title-100\">\n {children}\n </Heading>\n ),\n [BLOCK.TABLE]: tableRenderer,\n [BLOCK.TABLE_ROW]: (_, children) => <tr>{children}</tr>,\n [BLOCK.TABLE_HEADER_CELL]: (_, children) => <th scope=\"col\">{children}</th>,\n [BLOCK.TABLE_CELL]: (_, children) => {\n return <td>{children}</td>;\n },\n [BLOCK.TABLE_BODY]: (_, children) => <tbody>{children}</tbody>,\n [BLOCK.LIST_ITEM]: (_, children) => <li>{children}</li>,\n [BLOCK.OL_LIST]: (_, children) => <ol>{children}</ol>,\n [BLOCK.UL_LIST]: (_, children) => <ul>{children}</ul>,\n [BLOCK.QUOTE]: (_, children) => <blockquote>“{children}”</blockquote>,\n [BLOCK.EMBEDDED_ENTRY]: (_, children) => children,\n [BLOCK.EMBEDDED_ASSET]: (_, children) => children,\n [BLOCK.IMAGE]: ({ value }) => {\n if (typeof value === \"object\" && value && \"url\" in value && value.url) {\n if (image) {\n return image(value.url, value.altText, value.image?.contentType);\n }\n return <img src={value.url} alt={value.altText ?? \"\"} loading=\"lazy\" />;\n }\n return null;\n },\n [BLOCK.VIDEO]: ({ value }) => {\n if (typeof value === \"object\" && value && \"posterImage\" in value) {\n const posterImage = value.posterImage?.url;\n\n return (\n // eslint-disable-next-line jsx-a11y/media-has-caption\n <video\n data-testid=\"rich text video\"\n controls\n src={value.url}\n poster={videoPoster && posterImage ? videoPoster(posterImage) : posterImage}\n />\n );\n }\n return null;\n },\n };\n}\n\nconst isValueWhitespaceOnly = (value: string): boolean => {\n return !value.replace(/\\s+/g, \"\");\n};\n\n/**\n * Strictly checks if a singular node value OR nested node content is an empty element.\n */\n\nconst isNodeOrContentEmpty = <T,>(node: RichTextNode<T>): boolean => {\n const { content, value } = node;\n\n if (!content) {\n return typeof value === \"string\" && isValueWhitespaceOnly(value);\n }\n\n for (const item of content) {\n if (getNodeType(item) === BLOCK.HYPERLINK) {\n return false;\n }\n }\n\n return (\n content.length > 0 &&\n typeof content[0].value === \"string\" &&\n isValueWhitespaceOnly(content[0].value)\n );\n};\n\nconst serializeRichText = <T,>(\n node: RichTextNode<T>,\n customNodeTypes?: NodeTypes<T>,\n link?: LinkProp,\n image?: ImageProp,\n videoPoster?: VideoPosterProp\n): ReactNode => {\n let index = 0; // nodes in rich text does not contain ids, we'll use index as keys for react\n\n const nodes = {\n ...getNodeTypes(link, image, videoPoster),\n ...customNodeTypes,\n };\n\n const renderNode = (node: RichTextNode<T>): ReactNode => {\n const renderFunc = nodes[getNodeType(node)];\n\n // node types that are missing from both default NODE_TYPES and custom are never rendered\n if (typeof renderFunc === \"undefined\") {\n return null;\n }\n\n if (isNodeOrContentEmpty(node)) {\n return null;\n }\n\n const children = node.content ? node.content.map(renderNode) : [];\n\n return <Fragment key={index++}>{renderFunc(normalizeNode(node), children)}</Fragment>;\n };\n\n return renderNode(node);\n};\n\n/* Not using a arrow function here since the default generic will mess with the highlighting\n and it still needs a eslint-disable-next-line because it still lints incorrect */\n\nfunction RichText<T = Value>({\n data,\n className,\n customNodeTypes,\n noTextSpacing = false,\n link,\n image,\n videoPoster,\n element: ElementTag = \"div\",\n ...rest\n}: RichTextProps<T>) {\n return data ? (\n noTextSpacing ? (\n <ElementTag className={className} {...rest}>\n {serializeRichText(data, customNodeTypes, link, image, videoPoster)}\n </ElementTag>\n ) : (\n <TextSpacing className={className} element={ElementTag} {...rest}>\n {serializeRichText(data, customNodeTypes, link, image, videoPoster)}\n </TextSpacing>\n )\n ) : null;\n}\n\nexport { getNodeTypes, RichText, serializeRichText };\n"],"names":["INLINE","BLOCK","MARK","isHeaderRow","row","node","tableRenderer","richTextNode","children","tableContent","headerRows","bodyRows","headers","body","headerRowChildren","bodyRowChildren","jsx","jsxs","hasValue","obj","value","isText","isBlock","isInline","safeJsonParse","jsonString","richToPlainText","data","blockDivisor","rootNode","acc","i","nodeTextValue","nextNode","divisor","normalizeNode","MARK_TYPES","getNodeType","type","getNodeTypes","link","image","videoPoster","_","Paragraph","nodeValue","marks","element","accumulator","currentValue","uri","Link","Heading","posterImage","isValueWhitespaceOnly","isNodeOrContentEmpty","content","item","serializeRichText","customNodeTypes","index","nodes","renderNode","renderFunc","Fragment","RichText","className","noTextSpacing","ElementTag","rest","TextSpacing"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RichText-Bi51HE6X.mjs","sources":["../../../components/rich-text/src/constants.ts","../../../components/rich-text/src/renderers.tsx","../../../components/rich-text/src/utils.ts","../../../components/rich-text/src/RichText.tsx"],"sourcesContent":["export const INLINE = {\n HYPERLINK: \"hyperlink\",\n ENTRY_HYPERLINK: \"entry-hyperlink\",\n ASSET_HYPERLINK: \"asset-hyperlink\",\n RESOURCE_HYPERLINK: \"resource-hyperlink\",\n EMBEDDED_ENTRY: \"embedded-entry-inline\",\n} as const;\n\nexport const BLOCK = {\n DOCUMENT: \"document\",\n PARAGRAPH: \"paragraph\",\n TEXT: \"text\",\n HYPERLINK: \"hyperlink\",\n ENTRY_HYPERLINK: \"entry-hyperlink\",\n\n HEADER_1: \"header-1\",\n HEADER_2: \"header-2\",\n HEADER_3: \"header-3\",\n HEADER_4: \"header-4\",\n HEADER_5: \"header-5\",\n HEADER_6: \"header-6\",\n\n HEADING_1: \"heading-1\",\n HEADING_2: \"heading-2\",\n HEADING_3: \"heading-3\",\n HEADING_4: \"heading-4\",\n HEADING_5: \"heading-5\",\n HEADING_6: \"heading-6\",\n\n TABLE: \"table\",\n TABLE_ROW: \"table-row\",\n TABLE_HEADER_CELL: \"table-header-cell\",\n TABLE_CELL: \"table-cell\",\n TABLE_BODY: \"table-body\",\n\n OL_LIST: \"ordered-list\",\n UL_LIST: \"unordered-list\",\n LIST_ITEM: \"list-item\",\n\n HR: \"horizontal-row\",\n QUOTE: \"blockquote\",\n\n EMBEDDED_ENTRY: \"embedded-entity\",\n EMBEDDED_ASSET: \"embedded-asset-block\",\n\n IMAGE: \"image\",\n VIDEO: \"video\",\n RICHTEXTDOCUMENT: \"rich-text-document\",\n TEASER: \"teaser\",\n} as const;\n\nexport const MARK = {\n BOLD: \"bold\",\n ITALIC: \"italic\",\n UNDERLINE: \"underline\",\n CODE: \"code\",\n} as const;\n\nexport const ELEMENT = {\n DIV: \"div\",\n SPAN: \"span\",\n} as const;\n","import React, { type ReactNode } from \"react\";\n\nimport { BLOCK } from \"./constants\";\nimport { type RichTextNode } from \"./types\";\n\nconst isHeaderRow = (row: RichTextNode): boolean =>\n row.type === BLOCK.TABLE_ROW &&\n !!row.content?.every((node) => node.type === BLOCK.TABLE_HEADER_CELL);\n\n/**\n * Wrap the first rows with <thead /> if it consists of only <th> elements.\n * Wrap the rest of the rows with <tbody />.\n */\nexport const tableRenderer = (richTextNode: RichTextNode, children: ReactNode[]) => {\n if (richTextNode.type !== BLOCK.TABLE) {\n return children;\n }\n const { content: tableContent } = richTextNode;\n const [headerRows, bodyRows] = (tableContent || []).reduce<[RichTextNode[], RichTextNode[]]>(\n ([headers, body], row) => {\n return isHeaderRow(row) ? [[...headers, row], body] : [headers, [...body, row]];\n },\n [[], []]\n );\n const headerRowChildren = children.slice(0, headerRows.length);\n const bodyRowChildren = children.slice(headerRows.length, children.length);\n return (\n <div className=\"purpur-rich-text-table-scroll-container\">\n <div className=\"purpur-rich-text-table-inner-scroll-container\">\n <table>\n {headerRows.length > 0 && <thead>{headerRowChildren}</thead>}\n {bodyRows.length > 0 && <tbody>{bodyRowChildren}</tbody>}\n </table>\n </div>\n </div>\n );\n};\n","import { BLOCK, INLINE } from \"./constants\";\nimport { type Block, type Inline, type Mark, type RichTextNode, type Value } from \"./types\";\n\nexport type MarkNode = {\n type: Mark;\n};\n\ntype TextNode<T> = RichTextNode<T> & {\n type: \"text\";\n value: string;\n marks: MarkNode[];\n};\n\ntype InlineNode<T> = RichTextNode<T> & {\n type: Inline;\n content: Array<Inline | Text>;\n};\n\ntype BlockNode<T> = RichTextNode<T> & {\n type: Block;\n content: Array<Block | Inline | Text>;\n};\n\nconst hasValue = (obj: Record<string, unknown>, value: unknown) =>\n Object.values(obj).includes(value);\n\nconst isText = <T>(node: RichTextNode<T> | undefined): node is TextNode<T> => node?.type === \"text\";\n\nconst isBlock = <T>(node: RichTextNode<T> | undefined): node is BlockNode<T> =>\n !isInline(node) && !isText(node) && hasValue(BLOCK, node?.type);\n\nconst isInline = <T>(node: RichTextNode<T> | undefined): node is InlineNode<T> =>\n hasValue(INLINE, node?.type);\n\nexport const safeJsonParse = <T>(jsonString: string): T | null => {\n try {\n return JSON.parse(jsonString);\n } catch {\n return null;\n }\n};\n\n// This is equivalent to https://github.com/contentful/rich-text/tree/master/packages/rich-text-plain-text-renderer\nexport const richToPlainText = <T>(data: string, blockDivisor = \" \"): string => {\n const rootNode = safeJsonParse<RichTextNode<T>>(data);\n\n if (!rootNode || !rootNode.content) {\n return \"\";\n }\n\n return rootNode.content.reduce((acc: string, node: RichTextNode<T>, i) => {\n let nodeTextValue = \"\";\n\n if (isText(node)) {\n nodeTextValue = node.value;\n } else if (isBlock(node) || isInline(node)) {\n nodeTextValue = richToPlainText(JSON.stringify(node), blockDivisor);\n if (!nodeTextValue.length) {\n return acc;\n }\n }\n\n const nextNode = rootNode?.content?.[i + 1];\n const divisor = isBlock(nextNode) ? blockDivisor : \"\";\n\n return acc + nodeTextValue + divisor;\n }, \"\");\n};\n\nexport function normalizeNode<T = Value>(node: RichTextNode<T>) {\n if (\n node.type === BLOCK.IMAGE &&\n typeof node.value === \"object\" &&\n node?.value &&\n \"image\" in node.value &&\n node?.value?.image?.url\n ) {\n return { ...node, value: { ...node.value, url: node.value.image.url } };\n }\n\n if (\n node.type === BLOCK.VIDEO &&\n typeof node.value === \"object\" &&\n node?.value &&\n \"video\" in node.value &&\n node.value.video?.url\n ) {\n return { ...node, value: { ...node.value, url: node.value.video.url } };\n }\n\n return node;\n}\n","import React, { Fragment, type ReactNode } from \"react\";\nimport { Heading } from \"@purpur/heading\";\nimport { Link } from \"@purpur/link\";\nimport { Paragraph } from \"@purpur/paragraph\";\nimport { TextSpacing } from \"@purpur/text-spacing\";\n\nimport { BLOCK, MARK } from \"./constants\";\nimport { tableRenderer } from \"./renderers\";\nimport type {\n ImageProp,\n LinkProp,\n Mark,\n NodeTypes,\n RichTextNode,\n RichTextProps,\n Value,\n VideoPosterProp,\n} from \"./types\";\nimport { normalizeNode } from \"./utils\";\n\n// Inspired by https://github.com/contentful/rich-text/blob/master/packages/rich-text-react-renderer/src/index.tsx\nconst MARK_TYPES = {\n [MARK.BOLD]: (children: ReactNode) => <b>{children}</b>,\n [MARK.ITALIC]: (children: ReactNode) => <i>{children}</i>,\n [MARK.UNDERLINE]: (children: ReactNode) => <u>{children}</u>,\n [MARK.CODE]: (children: ReactNode) => <code>{children}</code>,\n};\n\nconst getNodeType = (node: RichTextNode) => {\n const type = node.type ?? node.nodeType!;\n if (type.startsWith(\"heading-\")) return type.replace(\"heading-\", \"header-\");\n if (type.startsWith(\"entry-hyperlink\")) return type.replace(\"entry-hyperlink\", \"hyperlink\");\n return type;\n};\n\nfunction getNodeTypes<T = Value>(\n link: LinkProp,\n image: ImageProp,\n videoPoster: VideoPosterProp\n): NodeTypes<T> {\n return {\n [BLOCK.RICHTEXTDOCUMENT]: (_, children) => children,\n [BLOCK.DOCUMENT]: (_, children) => children,\n [BLOCK.PARAGRAPH]: (_, children) => <Paragraph variant=\"paragraph-200\">{children}</Paragraph>,\n [BLOCK.TEXT]: (node) => {\n const { value: nodeValue, marks } = node;\n const value = typeof nodeValue === \"string\" ? nodeValue.replace(/\\n/g, \"<br />\") : nodeValue;\n\n const element = <span dangerouslySetInnerHTML={{ __html: value as string }} />;\n\n if (!marks) {\n return element;\n }\n return marks.reduce((accumulator: ReactNode, currentValue: Mark | { type: Mark }) => {\n return MARK_TYPES[typeof currentValue === \"string\" ? currentValue : currentValue.type](\n accumulator\n );\n }, element);\n },\n [BLOCK.HYPERLINK]: (node, children) => {\n const uri = node.uri ?? (node.data?.uri as string);\n\n if (link) {\n return <Link variant=\"text\">{link(children, uri)}</Link>;\n }\n return (\n <Link variant=\"text\">\n <a href={uri}>{children}</a>\n </Link>\n );\n },\n [BLOCK.HR]: () => <hr />,\n [BLOCK.HEADER_2]: (_, children) => (\n <Heading tag=\"h2\" variant=\"title-300\">\n {children}\n </Heading>\n ),\n [BLOCK.HEADER_3]: (_, children) => (\n <Heading tag=\"h3\" variant=\"title-200\">\n {children}\n </Heading>\n ),\n [BLOCK.HEADER_4]: (_, children) => (\n <Heading tag=\"h4\" variant=\"title-100\">\n {children}\n </Heading>\n ),\n [BLOCK.HEADER_5]: (_, children) => (\n <Heading tag=\"h5\" variant=\"title-100\">\n {children}\n </Heading>\n ),\n [BLOCK.HEADER_6]: (_, children) => (\n <Heading tag=\"h6\" variant=\"title-100\">\n {children}\n </Heading>\n ),\n [BLOCK.TABLE]: tableRenderer,\n [BLOCK.TABLE_ROW]: (_, children) => <tr>{children}</tr>,\n [BLOCK.TABLE_HEADER_CELL]: (_, children) => <th scope=\"col\">{children}</th>,\n [BLOCK.TABLE_CELL]: (_, children) => {\n return <td>{children}</td>;\n },\n [BLOCK.TABLE_BODY]: (_, children) => <tbody>{children}</tbody>,\n [BLOCK.LIST_ITEM]: (_, children) => <li>{children}</li>,\n [BLOCK.OL_LIST]: (_, children) => <ol>{children}</ol>,\n [BLOCK.UL_LIST]: (_, children) => <ul>{children}</ul>,\n [BLOCK.QUOTE]: (_, children) => <blockquote>“{children}”</blockquote>,\n [BLOCK.EMBEDDED_ENTRY]: (_, children) => children,\n [BLOCK.EMBEDDED_ASSET]: (_, children) => children,\n [BLOCK.IMAGE]: ({ value }) => {\n if (typeof value === \"object\" && value && \"url\" in value && value.url) {\n if (image) {\n return image(value.url, value.altText, value.image?.contentType);\n }\n return <img src={value.url} alt={value.altText ?? \"\"} loading=\"lazy\" />;\n }\n return null;\n },\n [BLOCK.VIDEO]: ({ value }) => {\n if (typeof value === \"object\" && value && \"posterImage\" in value) {\n const posterImage = value.posterImage?.url;\n\n return (\n // eslint-disable-next-line jsx-a11y/media-has-caption\n <video\n data-testid=\"rich text video\"\n controls\n src={value.url}\n poster={videoPoster && posterImage ? videoPoster(posterImage) : posterImage}\n />\n );\n }\n return null;\n },\n };\n}\n\nconst isValueWhitespaceOnly = (value: string): boolean => {\n return !value.replace(/\\s+/g, \"\");\n};\n\n/**\n * Strictly checks if a singular node value OR nested node content is an empty element.\n */\n\nconst isNodeOrContentEmpty = <T,>(node: RichTextNode<T>): boolean => {\n const { content, value } = node;\n\n if (!content) {\n return typeof value === \"string\" && isValueWhitespaceOnly(value);\n }\n\n for (const item of content) {\n if (getNodeType(item) === BLOCK.HYPERLINK) {\n return false;\n }\n }\n\n return (\n content.length > 0 &&\n typeof content[0].value === \"string\" &&\n isValueWhitespaceOnly(content[0].value)\n );\n};\n\nconst serializeRichText = <T,>(\n node: RichTextNode<T>,\n customNodeTypes?: NodeTypes<T>,\n link?: LinkProp,\n image?: ImageProp,\n videoPoster?: VideoPosterProp\n): ReactNode => {\n let index = 0; // nodes in rich text does not contain ids, we'll use index as keys for react\n\n const nodes = {\n ...getNodeTypes(link, image, videoPoster),\n ...customNodeTypes,\n };\n\n const renderNode = (node: RichTextNode<T>): ReactNode => {\n const renderFunc = nodes[getNodeType(node)];\n\n // node types that are missing from both default NODE_TYPES and custom are never rendered\n if (typeof renderFunc === \"undefined\") {\n return null;\n }\n\n if (isNodeOrContentEmpty(node)) {\n return null;\n }\n\n const children = node.content ? node.content.map(renderNode) : [];\n\n return <Fragment key={index++}>{renderFunc(normalizeNode(node), children)}</Fragment>;\n };\n\n return renderNode(node);\n};\n\n/* Not using a arrow function here since the default generic will mess with the highlighting\n and it still needs a eslint-disable-next-line because it still lints incorrect */\n\nfunction RichText<T = Value>({\n data,\n className,\n customNodeTypes,\n noTextSpacing = false,\n link,\n image,\n videoPoster,\n element: ElementTag = \"div\",\n ...rest\n}: RichTextProps<T>) {\n return data ? (\n noTextSpacing ? (\n <ElementTag className={className} {...rest}>\n {serializeRichText(data, customNodeTypes, link, image, videoPoster)}\n </ElementTag>\n ) : (\n <TextSpacing className={className} element={ElementTag} {...rest}>\n {serializeRichText(data, customNodeTypes, link, image, videoPoster)}\n </TextSpacing>\n )\n ) : null;\n}\n\nexport { getNodeTypes, RichText, serializeRichText };\n"],"names":["INLINE","BLOCK","MARK","isHeaderRow","row","node","tableRenderer","richTextNode","children","tableContent","headerRows","bodyRows","headers","body","headerRowChildren","bodyRowChildren","jsx","jsxs","hasValue","obj","value","isText","isBlock","isInline","safeJsonParse","jsonString","richToPlainText","data","blockDivisor","rootNode","acc","i","nodeTextValue","nextNode","divisor","normalizeNode","MARK_TYPES","getNodeType","type","getNodeTypes","link","image","videoPoster","_","Paragraph","nodeValue","marks","element","accumulator","currentValue","uri","Link","Heading","posterImage","isValueWhitespaceOnly","isNodeOrContentEmpty","content","item","serializeRichText","customNodeTypes","index","nodes","renderNode","renderFunc","Fragment","RichText","className","noTextSpacing","ElementTag","rest","TextSpacing"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const n=require("react/jsx-runtime"),I=require("react"),h=require("./heading-
|
|
2
|
-
//# sourceMappingURL=RichText-
|
|
1
|
+
"use strict";const n=require("react/jsx-runtime"),I=require("react"),h=require("./heading-drD5ugCC.js"),d=require("./link-DhWVrkTz.js"),H=require("./paragraph-BsI53OR0.js"),j=require("./text-spacing-CiGPZHuB.js"),f={HYPERLINK:"hyperlink",ENTRY_HYPERLINK:"entry-hyperlink",ASSET_HYPERLINK:"asset-hyperlink",RESOURCE_HYPERLINK:"resource-hyperlink",EMBEDDED_ENTRY:"embedded-entry-inline"},s={DOCUMENT:"document",PARAGRAPH:"paragraph",TEXT:"text",HYPERLINK:"hyperlink",ENTRY_HYPERLINK:"entry-hyperlink",HEADER_1:"header-1",HEADER_2:"header-2",HEADER_3:"header-3",HEADER_4:"header-4",HEADER_5:"header-5",HEADER_6:"header-6",HEADING_1:"heading-1",HEADING_2:"heading-2",HEADING_3:"heading-3",HEADING_4:"heading-4",HEADING_5:"heading-5",HEADING_6:"heading-6",TABLE:"table",TABLE_ROW:"table-row",TABLE_HEADER_CELL:"table-header-cell",TABLE_CELL:"table-cell",TABLE_BODY:"table-body",OL_LIST:"ordered-list",UL_LIST:"unordered-list",LIST_ITEM:"list-item",HR:"horizontal-row",QUOTE:"blockquote",EMBEDDED_ENTRY:"embedded-entity",EMBEDDED_ASSET:"embedded-asset-block",IMAGE:"image",VIDEO:"video",RICHTEXTDOCUMENT:"rich-text-document",TEASER:"teaser"},_={BOLD:"bold",ITALIC:"italic",UNDERLINE:"underline",CODE:"code"},N=e=>e.type===s.TABLE_ROW&&!!e.content?.every(i=>i.type===s.TABLE_HEADER_CELL),b=(e,i)=>{if(e.type!==s.TABLE)return i;const{content:l}=e,[r,t]=(l||[]).reduce(([u,a],o)=>N(o)?[[...u,o],a]:[u,[...a,o]],[[],[]]),E=i.slice(0,r.length),c=i.slice(r.length,i.length);return n.jsx("div",{className:"purpur-rich-text-table-scroll-container",children:n.jsx("div",{className:"purpur-rich-text-table-inner-scroll-container",children:n.jsxs("table",{children:[r.length>0&&n.jsx("thead",{children:E}),t.length>0&&n.jsx("tbody",{children:c})]})})})},x=(e,i)=>Object.values(e).includes(i),L=e=>e?.type==="text",T=e=>!g(e)&&!L(e)&&x(s,e?.type),g=e=>x(f,e?.type),O=e=>{try{return JSON.parse(e)}catch{return null}},A=(e,i=" ")=>{const l=O(e);return!l||!l.content?"":l.content.reduce((r,t,E)=>{let c="";if(L(t))c=t.value;else if((T(t)||g(t))&&(c=A(JSON.stringify(t),i),!c.length))return r;const u=l?.content?.[E+1],a=T(u)?i:"";return r+c+a},"")};function v(e){return e.type===s.IMAGE&&typeof e.value=="object"&&e?.value&&"image"in e.value&&e?.value?.image?.url?{...e,value:{...e.value,url:e.value.image.url}}:e.type===s.VIDEO&&typeof e.value=="object"&&e?.value&&"video"in e.value&&e.value.video?.url?{...e,value:{...e.value,url:e.value.video.url}}:e}const B={[_.BOLD]:e=>n.jsx("b",{children:e}),[_.ITALIC]:e=>n.jsx("i",{children:e}),[_.UNDERLINE]:e=>n.jsx("u",{children:e}),[_.CODE]:e=>n.jsx("code",{children:e})},y=e=>{const i=e.type??e.nodeType;return i.startsWith("heading-")?i.replace("heading-","header-"):i.startsWith("entry-hyperlink")?i.replace("entry-hyperlink","hyperlink"):i};function m(e,i,l){return{[s.RICHTEXTDOCUMENT]:(r,t)=>t,[s.DOCUMENT]:(r,t)=>t,[s.PARAGRAPH]:(r,t)=>n.jsx(H.Paragraph,{variant:"paragraph-200",children:t}),[s.TEXT]:r=>{const{value:t,marks:E}=r,c=typeof t=="string"?t.replace(/\n/g,"<br />"):t,u=n.jsx("span",{dangerouslySetInnerHTML:{__html:c}});return E?E.reduce((a,o)=>B[typeof o=="string"?o:o.type](a),u):u},[s.HYPERLINK]:(r,t)=>{const E=r.uri??r.data?.uri;return e?n.jsx(d.Link,{variant:"text",children:e(t,E)}):n.jsx(d.Link,{variant:"text",children:n.jsx("a",{href:E,children:t})})},[s.HR]:()=>n.jsx("hr",{}),[s.HEADER_2]:(r,t)=>n.jsx(h.Heading,{tag:"h2",variant:"title-300",children:t}),[s.HEADER_3]:(r,t)=>n.jsx(h.Heading,{tag:"h3",variant:"title-200",children:t}),[s.HEADER_4]:(r,t)=>n.jsx(h.Heading,{tag:"h4",variant:"title-100",children:t}),[s.HEADER_5]:(r,t)=>n.jsx(h.Heading,{tag:"h5",variant:"title-100",children:t}),[s.HEADER_6]:(r,t)=>n.jsx(h.Heading,{tag:"h6",variant:"title-100",children:t}),[s.TABLE]:b,[s.TABLE_ROW]:(r,t)=>n.jsx("tr",{children:t}),[s.TABLE_HEADER_CELL]:(r,t)=>n.jsx("th",{scope:"col",children:t}),[s.TABLE_CELL]:(r,t)=>n.jsx("td",{children:t}),[s.TABLE_BODY]:(r,t)=>n.jsx("tbody",{children:t}),[s.LIST_ITEM]:(r,t)=>n.jsx("li",{children:t}),[s.OL_LIST]:(r,t)=>n.jsx("ol",{children:t}),[s.UL_LIST]:(r,t)=>n.jsx("ul",{children:t}),[s.QUOTE]:(r,t)=>n.jsxs("blockquote",{children:["“",t,"”"]}),[s.EMBEDDED_ENTRY]:(r,t)=>t,[s.EMBEDDED_ASSET]:(r,t)=>t,[s.IMAGE]:({value:r})=>typeof r=="object"&&r&&"url"in r&&r.url?i?i(r.url,r.altText,r.image?.contentType):n.jsx("img",{src:r.url,alt:r.altText??"",loading:"lazy"}):null,[s.VIDEO]:({value:r})=>{if(typeof r=="object"&&r&&"posterImage"in r){const t=r.posterImage?.url;return n.jsx("video",{"data-testid":"rich text video",controls:!0,src:r.url,poster:l&&t?l(t):t})}return null}}}const p=e=>!e.replace(/\s+/g,""),C=e=>{const{content:i,value:l}=e;if(!i)return typeof l=="string"&&p(l);for(const r of i)if(y(r)===s.HYPERLINK)return!1;return i.length>0&&typeof i[0].value=="string"&&p(i[0].value)},R=(e,i,l,r,t)=>{let E=0;const c={...m(l,r,t),...i},u=a=>{const o=c[y(a)];if(typeof o>"u"||C(a))return null;const D=a.content?a.content.map(u):[];return n.jsx(I.Fragment,{children:o(v(a),D)},E++)};return u(e)};function S({data:e,className:i,customNodeTypes:l,noTextSpacing:r=!1,link:t,image:E,videoPoster:c,element:u="div",...a}){return e?r?n.jsx(u,{className:i,...a,children:R(e,l,t,E,c)}):n.jsx(j.TextSpacing,{className:i,element:u,...a,children:R(e,l,t,E,c)}):null}exports.RichText=S;exports.richToPlainText=A;
|
|
2
|
+
//# sourceMappingURL=RichText-DNroJJXv.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RichText-DMyGiMN0.js","sources":["../../../components/rich-text/src/constants.ts","../../../components/rich-text/src/renderers.tsx","../../../components/rich-text/src/utils.ts","../../../components/rich-text/src/RichText.tsx"],"sourcesContent":["export const INLINE = {\n HYPERLINK: \"hyperlink\",\n ENTRY_HYPERLINK: \"entry-hyperlink\",\n ASSET_HYPERLINK: \"asset-hyperlink\",\n RESOURCE_HYPERLINK: \"resource-hyperlink\",\n EMBEDDED_ENTRY: \"embedded-entry-inline\",\n} as const;\n\nexport const BLOCK = {\n DOCUMENT: \"document\",\n PARAGRAPH: \"paragraph\",\n TEXT: \"text\",\n HYPERLINK: \"hyperlink\",\n ENTRY_HYPERLINK: \"entry-hyperlink\",\n\n HEADER_1: \"header-1\",\n HEADER_2: \"header-2\",\n HEADER_3: \"header-3\",\n HEADER_4: \"header-4\",\n HEADER_5: \"header-5\",\n HEADER_6: \"header-6\",\n\n HEADING_1: \"heading-1\",\n HEADING_2: \"heading-2\",\n HEADING_3: \"heading-3\",\n HEADING_4: \"heading-4\",\n HEADING_5: \"heading-5\",\n HEADING_6: \"heading-6\",\n\n TABLE: \"table\",\n TABLE_ROW: \"table-row\",\n TABLE_HEADER_CELL: \"table-header-cell\",\n TABLE_CELL: \"table-cell\",\n TABLE_BODY: \"table-body\",\n\n OL_LIST: \"ordered-list\",\n UL_LIST: \"unordered-list\",\n LIST_ITEM: \"list-item\",\n\n HR: \"horizontal-row\",\n QUOTE: \"blockquote\",\n\n EMBEDDED_ENTRY: \"embedded-entity\",\n EMBEDDED_ASSET: \"embedded-asset-block\",\n\n IMAGE: \"image\",\n VIDEO: \"video\",\n RICHTEXTDOCUMENT: \"rich-text-document\",\n TEASER: \"teaser\",\n} as const;\n\nexport const MARK = {\n BOLD: \"bold\",\n ITALIC: \"italic\",\n UNDERLINE: \"underline\",\n CODE: \"code\",\n} as const;\n\nexport const ELEMENT = {\n DIV: \"div\",\n SPAN: \"span\",\n} as const;\n","import React, { type ReactNode } from \"react\";\n\nimport { BLOCK } from \"./constants\";\nimport { type RichTextNode } from \"./types\";\n\nconst isHeaderRow = (row: RichTextNode): boolean =>\n row.type === BLOCK.TABLE_ROW &&\n !!row.content?.every((node) => node.type === BLOCK.TABLE_HEADER_CELL);\n\n/**\n * Wrap the first rows with <thead /> if it consists of only <th> elements.\n * Wrap the rest of the rows with <tbody />.\n */\nexport const tableRenderer = (richTextNode: RichTextNode, children: ReactNode[]) => {\n if (richTextNode.type !== BLOCK.TABLE) {\n return children;\n }\n const { content: tableContent } = richTextNode;\n const [headerRows, bodyRows] = (tableContent || []).reduce<[RichTextNode[], RichTextNode[]]>(\n ([headers, body], row) => {\n return isHeaderRow(row) ? [[...headers, row], body] : [headers, [...body, row]];\n },\n [[], []]\n );\n const headerRowChildren = children.slice(0, headerRows.length);\n const bodyRowChildren = children.slice(headerRows.length, children.length);\n return (\n <div className=\"purpur-rich-text-table-scroll-container\">\n <div className=\"purpur-rich-text-table-inner-scroll-container\">\n <table>\n {headerRows.length > 0 && <thead>{headerRowChildren}</thead>}\n {bodyRows.length > 0 && <tbody>{bodyRowChildren}</tbody>}\n </table>\n </div>\n </div>\n );\n};\n","import { BLOCK, INLINE } from \"./constants\";\nimport { type Block, type Inline, type Mark, type RichTextNode, type Value } from \"./types\";\n\nexport type MarkNode = {\n type: Mark;\n};\n\ntype TextNode<T> = RichTextNode<T> & {\n type: \"text\";\n value: string;\n marks: MarkNode[];\n};\n\ntype InlineNode<T> = RichTextNode<T> & {\n type: Inline;\n content: Array<Inline | Text>;\n};\n\ntype BlockNode<T> = RichTextNode<T> & {\n type: Block;\n content: Array<Block | Inline | Text>;\n};\n\nconst hasValue = (obj: Record<string, unknown>, value: unknown) =>\n Object.values(obj).includes(value);\n\nconst isText = <T>(node: RichTextNode<T> | undefined): node is TextNode<T> => node?.type === \"text\";\n\nconst isBlock = <T>(node: RichTextNode<T> | undefined): node is BlockNode<T> =>\n !isInline(node) && !isText(node) && hasValue(BLOCK, node?.type);\n\nconst isInline = <T>(node: RichTextNode<T> | undefined): node is InlineNode<T> =>\n hasValue(INLINE, node?.type);\n\nexport const safeJsonParse = <T>(jsonString: string): T | null => {\n try {\n return JSON.parse(jsonString);\n } catch {\n return null;\n }\n};\n\n// This is equivalent to https://github.com/contentful/rich-text/tree/master/packages/rich-text-plain-text-renderer\nexport const richToPlainText = <T>(data: string, blockDivisor = \" \"): string => {\n const rootNode = safeJsonParse<RichTextNode<T>>(data);\n\n if (!rootNode || !rootNode.content) {\n return \"\";\n }\n\n return rootNode.content.reduce((acc: string, node: RichTextNode<T>, i) => {\n let nodeTextValue = \"\";\n\n if (isText(node)) {\n nodeTextValue = node.value;\n } else if (isBlock(node) || isInline(node)) {\n nodeTextValue = richToPlainText(JSON.stringify(node), blockDivisor);\n if (!nodeTextValue.length) {\n return acc;\n }\n }\n\n const nextNode = rootNode?.content?.[i + 1];\n const divisor = isBlock(nextNode) ? blockDivisor : \"\";\n\n return acc + nodeTextValue + divisor;\n }, \"\");\n};\n\nexport function normalizeNode<T = Value>(node: RichTextNode<T>) {\n if (\n node.type === BLOCK.IMAGE &&\n typeof node.value === \"object\" &&\n node?.value &&\n \"image\" in node.value &&\n node?.value?.image?.url\n ) {\n return { ...node, value: { ...node.value, url: node.value.image.url } };\n }\n\n if (\n node.type === BLOCK.VIDEO &&\n typeof node.value === \"object\" &&\n node?.value &&\n \"video\" in node.value &&\n node.value.video?.url\n ) {\n return { ...node, value: { ...node.value, url: node.value.video.url } };\n }\n\n return node;\n}\n","import React, { Fragment, type ReactNode } from \"react\";\nimport { Heading } from \"@purpur/heading\";\nimport { Link } from \"@purpur/link\";\nimport { Paragraph } from \"@purpur/paragraph\";\nimport { TextSpacing } from \"@purpur/text-spacing\";\n\nimport { BLOCK, MARK } from \"./constants\";\nimport { tableRenderer } from \"./renderers\";\nimport type {\n ImageProp,\n LinkProp,\n Mark,\n NodeTypes,\n RichTextNode,\n RichTextProps,\n Value,\n VideoPosterProp,\n} from \"./types\";\nimport { normalizeNode } from \"./utils\";\n\n// Inspired by https://github.com/contentful/rich-text/blob/master/packages/rich-text-react-renderer/src/index.tsx\nconst MARK_TYPES = {\n [MARK.BOLD]: (children: ReactNode) => <b>{children}</b>,\n [MARK.ITALIC]: (children: ReactNode) => <i>{children}</i>,\n [MARK.UNDERLINE]: (children: ReactNode) => <u>{children}</u>,\n [MARK.CODE]: (children: ReactNode) => <code>{children}</code>,\n};\n\nconst getNodeType = (node: RichTextNode) => {\n const type = node.type ?? node.nodeType!;\n if (type.startsWith(\"heading-\")) return type.replace(\"heading-\", \"header-\");\n if (type.startsWith(\"entry-hyperlink\")) return type.replace(\"entry-hyperlink\", \"hyperlink\");\n return type;\n};\n\nfunction getNodeTypes<T = Value>(\n link: LinkProp,\n image: ImageProp,\n videoPoster: VideoPosterProp\n): NodeTypes<T> {\n return {\n [BLOCK.RICHTEXTDOCUMENT]: (_, children) => children,\n [BLOCK.DOCUMENT]: (_, children) => children,\n [BLOCK.PARAGRAPH]: (_, children) => <Paragraph variant=\"paragraph-200\">{children}</Paragraph>,\n [BLOCK.TEXT]: (node) => {\n const { value: nodeValue, marks } = node;\n const value = typeof nodeValue === \"string\" ? nodeValue.replace(/\\n/g, \"<br />\") : nodeValue;\n\n const element = <span dangerouslySetInnerHTML={{ __html: value as string }} />;\n\n if (!marks) {\n return element;\n }\n return marks.reduce((accumulator: ReactNode, currentValue: Mark | { type: Mark }) => {\n return MARK_TYPES[typeof currentValue === \"string\" ? currentValue : currentValue.type](\n accumulator\n );\n }, element);\n },\n [BLOCK.HYPERLINK]: (node, children) => {\n const uri = node.uri ?? (node.data?.uri as string);\n\n if (link) {\n return <Link variant=\"text\">{link(children, uri)}</Link>;\n }\n return (\n <Link variant=\"text\">\n <a href={uri}>{children}</a>\n </Link>\n );\n },\n [BLOCK.HR]: () => <hr />,\n [BLOCK.HEADER_2]: (_, children) => (\n <Heading tag=\"h2\" variant=\"title-300\">\n {children}\n </Heading>\n ),\n [BLOCK.HEADER_3]: (_, children) => (\n <Heading tag=\"h3\" variant=\"title-200\">\n {children}\n </Heading>\n ),\n [BLOCK.HEADER_4]: (_, children) => (\n <Heading tag=\"h4\" variant=\"title-100\">\n {children}\n </Heading>\n ),\n [BLOCK.HEADER_5]: (_, children) => (\n <Heading tag=\"h5\" variant=\"title-100\">\n {children}\n </Heading>\n ),\n [BLOCK.HEADER_6]: (_, children) => (\n <Heading tag=\"h6\" variant=\"title-100\">\n {children}\n </Heading>\n ),\n [BLOCK.TABLE]: tableRenderer,\n [BLOCK.TABLE_ROW]: (_, children) => <tr>{children}</tr>,\n [BLOCK.TABLE_HEADER_CELL]: (_, children) => <th scope=\"col\">{children}</th>,\n [BLOCK.TABLE_CELL]: (_, children) => {\n return <td>{children}</td>;\n },\n [BLOCK.TABLE_BODY]: (_, children) => <tbody>{children}</tbody>,\n [BLOCK.LIST_ITEM]: (_, children) => <li>{children}</li>,\n [BLOCK.OL_LIST]: (_, children) => <ol>{children}</ol>,\n [BLOCK.UL_LIST]: (_, children) => <ul>{children}</ul>,\n [BLOCK.QUOTE]: (_, children) => <blockquote>“{children}”</blockquote>,\n [BLOCK.EMBEDDED_ENTRY]: (_, children) => children,\n [BLOCK.EMBEDDED_ASSET]: (_, children) => children,\n [BLOCK.IMAGE]: ({ value }) => {\n if (typeof value === \"object\" && value && \"url\" in value && value.url) {\n if (image) {\n return image(value.url, value.altText, value.image?.contentType);\n }\n return <img src={value.url} alt={value.altText ?? \"\"} loading=\"lazy\" />;\n }\n return null;\n },\n [BLOCK.VIDEO]: ({ value }) => {\n if (typeof value === \"object\" && value && \"posterImage\" in value) {\n const posterImage = value.posterImage?.url;\n\n return (\n // eslint-disable-next-line jsx-a11y/media-has-caption\n <video\n data-testid=\"rich text video\"\n controls\n src={value.url}\n poster={videoPoster && posterImage ? videoPoster(posterImage) : posterImage}\n />\n );\n }\n return null;\n },\n };\n}\n\nconst isValueWhitespaceOnly = (value: string): boolean => {\n return !value.replace(/\\s+/g, \"\");\n};\n\n/**\n * Strictly checks if a singular node value OR nested node content is an empty element.\n */\n\nconst isNodeOrContentEmpty = <T,>(node: RichTextNode<T>): boolean => {\n const { content, value } = node;\n\n if (!content) {\n return typeof value === \"string\" && isValueWhitespaceOnly(value);\n }\n\n for (const item of content) {\n if (getNodeType(item) === BLOCK.HYPERLINK) {\n return false;\n }\n }\n\n return (\n content.length > 0 &&\n typeof content[0].value === \"string\" &&\n isValueWhitespaceOnly(content[0].value)\n );\n};\n\nconst serializeRichText = <T,>(\n node: RichTextNode<T>,\n customNodeTypes?: NodeTypes<T>,\n link?: LinkProp,\n image?: ImageProp,\n videoPoster?: VideoPosterProp\n): ReactNode => {\n let index = 0; // nodes in rich text does not contain ids, we'll use index as keys for react\n\n const nodes = {\n ...getNodeTypes(link, image, videoPoster),\n ...customNodeTypes,\n };\n\n const renderNode = (node: RichTextNode<T>): ReactNode => {\n const renderFunc = nodes[getNodeType(node)];\n\n // node types that are missing from both default NODE_TYPES and custom are never rendered\n if (typeof renderFunc === \"undefined\") {\n return null;\n }\n\n if (isNodeOrContentEmpty(node)) {\n return null;\n }\n\n const children = node.content ? node.content.map(renderNode) : [];\n\n return <Fragment key={index++}>{renderFunc(normalizeNode(node), children)}</Fragment>;\n };\n\n return renderNode(node);\n};\n\n/* Not using a arrow function here since the default generic will mess with the highlighting\n and it still needs a eslint-disable-next-line because it still lints incorrect */\n\nfunction RichText<T = Value>({\n data,\n className,\n customNodeTypes,\n noTextSpacing = false,\n link,\n image,\n videoPoster,\n element: ElementTag = \"div\",\n ...rest\n}: RichTextProps<T>) {\n return data ? (\n noTextSpacing ? (\n <ElementTag className={className} {...rest}>\n {serializeRichText(data, customNodeTypes, link, image, videoPoster)}\n </ElementTag>\n ) : (\n <TextSpacing className={className} element={ElementTag} {...rest}>\n {serializeRichText(data, customNodeTypes, link, image, videoPoster)}\n </TextSpacing>\n )\n ) : null;\n}\n\nexport { getNodeTypes, RichText, serializeRichText };\n"],"names":["INLINE","BLOCK","MARK","isHeaderRow","row","node","tableRenderer","richTextNode","children","tableContent","headerRows","bodyRows","headers","body","headerRowChildren","bodyRowChildren","jsx","jsxs","hasValue","obj","value","isText","isBlock","isInline","safeJsonParse","jsonString","richToPlainText","data","blockDivisor","rootNode","acc","i","nodeTextValue","nextNode","divisor","normalizeNode","MARK_TYPES","getNodeType","type","getNodeTypes","link","image","videoPoster","_","Paragraph","nodeValue","marks","element","accumulator","currentValue","uri","Link","Heading","posterImage","isValueWhitespaceOnly","isNodeOrContentEmpty","content","item","serializeRichText","customNodeTypes","index","nodes","renderNode","renderFunc","Fragment","RichText","className","noTextSpacing","ElementTag","rest","TextSpacing"],"mappings":"qNAAaA,EAAS,CACpB,UAAW,YACX,gBAAiB,kBACjB,gBAAiB,kBACjB,mBAAoB,qBACpB,eAAgB,uBAClB,EAEaC,EAAQ,CACnB,SAAU,WACV,UAAW,YACX,KAAM,OACN,UAAW,YACX,gBAAiB,kBAEjB,SAAU,WACV,SAAU,WACV,SAAU,WACV,SAAU,WACV,SAAU,WACV,SAAU,WAEV,UAAW,YACX,UAAW,YACX,UAAW,YACX,UAAW,YACX,UAAW,YACX,UAAW,YAEX,MAAO,QACP,UAAW,YACX,kBAAmB,oBACnB,WAAY,aACZ,WAAY,aAEZ,QAAS,eACT,QAAS,iBACT,UAAW,YAEX,GAAI,iBACJ,MAAO,aAEP,eAAgB,kBAChB,eAAgB,uBAEhB,MAAO,QACP,MAAO,QACP,iBAAkB,qBAClB,OAAQ,QACV,EAEaC,EAAO,CAClB,KAAM,OACN,OAAQ,SACR,UAAW,YACX,KAAM,MACR,ECnDMC,EAAeC,GACnBA,EAAI,OAASH,EAAM,WACnB,CAAC,CAACG,EAAI,SAAS,MAAOC,GAASA,EAAK,OAASJ,EAAM,iBAAiB,EAMzDK,EAAgB,CAACC,EAA4BC,IAA0B,CAClF,GAAID,EAAa,OAASN,EAAM,MAC9B,OAAOO,EAET,KAAM,CAAE,QAASC,CAAA,EAAiBF,EAC5B,CAACG,EAAYC,CAAQ,GAAKF,GAAgB,CAAA,GAAI,OAClD,CAAC,CAACG,EAASC,CAAI,EAAGT,IACTD,EAAYC,CAAG,EAAI,CAAC,CAAC,GAAGQ,EAASR,CAAG,EAAGS,CAAI,EAAI,CAACD,EAAS,CAAC,GAAGC,EAAMT,CAAG,CAAC,EAEhF,CAAC,CAAA,EAAI,CAAA,CAAE,CAAA,EAEHU,EAAoBN,EAAS,MAAM,EAAGE,EAAW,MAAM,EACvDK,EAAkBP,EAAS,MAAME,EAAW,OAAQF,EAAS,MAAM,EACzE,OACEQ,EAAAA,IAAC,OAAI,UAAU,0CACb,eAAC,MAAA,CAAI,UAAU,gDACb,SAAAC,EAAAA,KAAC,QAAA,CACE,SAAA,CAAAP,EAAW,OAAS,GAAKM,EAAAA,IAAC,QAAA,CAAO,SAAAF,EAAkB,EACnDH,EAAS,OAAS,GAAKK,EAAAA,IAAC,SAAO,SAAAD,CAAA,CAAgB,CAAA,CAAA,CAClD,EACF,EACF,CAEJ,ECbMG,EAAW,CAACC,EAA8BC,IAC9C,OAAO,OAAOD,CAAG,EAAE,SAASC,CAAK,EAE7BC,EAAahB,GAA2DA,GAAM,OAAS,OAEvFiB,EAAcjB,GAClB,CAACkB,EAASlB,CAAI,GAAK,CAACgB,EAAOhB,CAAI,GAAKa,EAASjB,EAAOI,GAAM,IAAI,EAE1DkB,EAAelB,GACnBa,EAASlB,EAAQK,GAAM,IAAI,EAEhBmB,EAAoBC,GAAiC,CAChE,GAAI,CACF,OAAO,KAAK,MAAMA,CAAU,CAC9B,MAAQ,CACN,OAAO,IACT,CACF,EAGaC,EAAkB,CAAIC,EAAcC,EAAe,MAAgB,CAC9E,MAAMC,EAAWL,EAA+BG,CAAI,EAEpD,MAAI,CAACE,GAAY,CAACA,EAAS,QAClB,GAGFA,EAAS,QAAQ,OAAO,CAACC,EAAazB,EAAuB0B,IAAM,CACxE,IAAIC,EAAgB,GAEpB,GAAIX,EAAOhB,CAAI,EACb2B,EAAgB3B,EAAK,eACZiB,EAAQjB,CAAI,GAAKkB,EAASlB,CAAI,KACvC2B,EAAgBN,EAAgB,KAAK,UAAUrB,CAAI,EAAGuB,CAAY,EAC9D,CAACI,EAAc,QACjB,OAAOF,EAIX,MAAMG,EAAWJ,GAAU,UAAUE,EAAI,CAAC,EACpCG,EAAUZ,EAAQW,CAAQ,EAAIL,EAAe,GAEnD,OAAOE,EAAME,EAAgBE,CAC/B,EAAG,EAAE,CACP,EAEO,SAASC,EAAyB9B,EAAuB,CAC9D,OACEA,EAAK,OAASJ,EAAM,OACpB,OAAOI,EAAK,OAAU,UACtBA,GAAM,OACN,UAAWA,EAAK,OAChBA,GAAM,OAAO,OAAO,IAEb,CAAE,GAAGA,EAAM,MAAO,CAAE,GAAGA,EAAK,MAAO,IAAKA,EAAK,MAAM,MAAM,IAAI,EAIpEA,EAAK,OAASJ,EAAM,OACpB,OAAOI,EAAK,OAAU,UACtBA,GAAM,OACN,UAAWA,EAAK,OAChBA,EAAK,MAAM,OAAO,IAEX,CAAE,GAAGA,EAAM,MAAO,CAAE,GAAGA,EAAK,MAAO,IAAKA,EAAK,MAAM,MAAM,IAAI,EAG/DA,CACT,CCtEA,MAAM+B,EAAa,CACjB,CAAClC,EAAK,IAAI,EAAIM,GAAwBQ,EAAAA,IAAC,KAAG,SAAAR,EAAS,EACnD,CAACN,EAAK,MAAM,EAAIM,GAAwBQ,EAAAA,IAAC,KAAG,SAAAR,EAAS,EACrD,CAACN,EAAK,SAAS,EAAIM,GAAwBQ,EAAAA,IAAC,KAAG,SAAAR,EAAS,EACxD,CAACN,EAAK,IAAI,EAAIM,GAAwBQ,EAAAA,IAAC,QAAM,SAAAR,CAAA,CAAS,CACxD,EAEM6B,EAAehC,GAAuB,CAC1C,MAAMiC,EAAOjC,EAAK,MAAQA,EAAK,SAC/B,OAAIiC,EAAK,WAAW,UAAU,EAAUA,EAAK,QAAQ,WAAY,SAAS,EACtEA,EAAK,WAAW,iBAAiB,EAAUA,EAAK,QAAQ,kBAAmB,WAAW,EACnFA,CACT,EAEA,SAASC,EACPC,EACAC,EACAC,EACc,CACd,MAAO,CACL,CAACzC,EAAM,gBAAgB,EAAG,CAAC0C,EAAGnC,IAAaA,EAC3C,CAACP,EAAM,QAAQ,EAAG,CAAC0C,EAAGnC,IAAaA,EACnC,CAACP,EAAM,SAAS,EAAG,CAAC0C,EAAGnC,IAAaQ,MAAC4B,EAAAA,UAAA,CAAU,QAAQ,gBAAiB,SAAApC,CAAA,CAAS,EACjF,CAACP,EAAM,IAAI,EAAII,GAAS,CACtB,KAAM,CAAE,MAAOwC,EAAW,MAAAC,CAAA,EAAUzC,EAC9Be,EAAQ,OAAOyB,GAAc,SAAWA,EAAU,QAAQ,MAAO,QAAQ,EAAIA,EAE7EE,EAAU/B,EAAAA,IAAC,OAAA,CAAK,wBAAyB,CAAE,OAAQI,GAAmB,EAE5E,OAAK0B,EAGEA,EAAM,OAAO,CAACE,EAAwBC,IACpCb,EAAW,OAAOa,GAAiB,SAAWA,EAAeA,EAAa,IAAI,EACnFD,CAAA,EAEDD,CAAO,EANDA,CAOX,EACA,CAAC9C,EAAM,SAAS,EAAG,CAACI,EAAMG,IAAa,CACrC,MAAM0C,EAAM7C,EAAK,KAAQA,EAAK,MAAM,IAEpC,OAAImC,QACMW,OAAA,CAAK,QAAQ,OAAQ,SAAAX,EAAKhC,EAAU0C,CAAG,EAAE,EAGjDlC,EAAAA,IAACmC,EAAAA,MAAK,QAAQ,OACZ,eAAC,IAAA,CAAE,KAAMD,EAAM,SAAA1C,CAAA,CAAS,CAAA,CAC1B,CAEJ,EACA,CAACP,EAAM,EAAE,EAAG,UAAO,KAAA,CAAA,CAAG,EACtB,CAACA,EAAM,QAAQ,EAAG,CAAC0C,EAAGnC,IACpBQ,EAAAA,IAACoC,UAAA,CAAQ,IAAI,KAAK,QAAQ,YACvB,SAAA5C,CAAA,CACH,EAEF,CAACP,EAAM,QAAQ,EAAG,CAAC0C,EAAGnC,IACpBQ,EAAAA,IAACoC,UAAA,CAAQ,IAAI,KAAK,QAAQ,YACvB,SAAA5C,CAAA,CACH,EAEF,CAACP,EAAM,QAAQ,EAAG,CAAC0C,EAAGnC,IACpBQ,EAAAA,IAACoC,UAAA,CAAQ,IAAI,KAAK,QAAQ,YACvB,SAAA5C,CAAA,CACH,EAEF,CAACP,EAAM,QAAQ,EAAG,CAAC0C,EAAGnC,IACpBQ,EAAAA,IAACoC,UAAA,CAAQ,IAAI,KAAK,QAAQ,YACvB,SAAA5C,CAAA,CACH,EAEF,CAACP,EAAM,QAAQ,EAAG,CAAC0C,EAAGnC,IACpBQ,EAAAA,IAACoC,UAAA,CAAQ,IAAI,KAAK,QAAQ,YACvB,SAAA5C,CAAA,CACH,EAEF,CAACP,EAAM,KAAK,EAAGK,EACf,CAACL,EAAM,SAAS,EAAG,CAAC0C,EAAGnC,IAAaQ,MAAC,KAAA,CAAI,SAAAR,EAAS,EAClD,CAACP,EAAM,iBAAiB,EAAG,CAAC0C,EAAGnC,IAAaQ,MAAC,KAAA,CAAG,MAAM,MAAO,SAAAR,CAAA,CAAS,EACtE,CAACP,EAAM,UAAU,EAAG,CAAC0C,EAAGnC,IACfQ,MAAC,MAAI,SAAAR,EAAS,EAEvB,CAACP,EAAM,UAAU,EAAG,CAAC0C,EAAGnC,IAAaQ,MAAC,QAAA,CAAO,SAAAR,EAAS,EACtD,CAACP,EAAM,SAAS,EAAG,CAAC0C,EAAGnC,IAAaQ,MAAC,KAAA,CAAI,SAAAR,EAAS,EAClD,CAACP,EAAM,OAAO,EAAG,CAAC0C,EAAGnC,IAAaQ,MAAC,KAAA,CAAI,SAAAR,EAAS,EAChD,CAACP,EAAM,OAAO,EAAG,CAAC0C,EAAGnC,IAAaQ,MAAC,KAAA,CAAI,SAAAR,EAAS,EAChD,CAACP,EAAM,KAAK,EAAG,CAAC0C,EAAGnC,WAAc,aAAA,CAAW,SAAA,CAAA,IAAQA,EAAS,GAAA,EAAO,EACpE,CAACP,EAAM,cAAc,EAAG,CAAC0C,EAAGnC,IAAaA,EACzC,CAACP,EAAM,cAAc,EAAG,CAAC0C,EAAGnC,IAAaA,EACzC,CAACP,EAAM,KAAK,EAAG,CAAC,CAAE,MAAAmB,KACZ,OAAOA,GAAU,UAAYA,GAAS,QAASA,GAASA,EAAM,IAC5DqB,EACKA,EAAMrB,EAAM,IAAKA,EAAM,QAASA,EAAM,OAAO,WAAW,EAE1DJ,EAAAA,IAAC,MAAA,CAAI,IAAKI,EAAM,IAAK,IAAKA,EAAM,SAAW,GAAI,QAAQ,MAAA,CAAO,EAEhE,KAET,CAACnB,EAAM,KAAK,EAAG,CAAC,CAAE,MAAAmB,KAAY,CAC5B,GAAI,OAAOA,GAAU,UAAYA,GAAS,gBAAiBA,EAAO,CAChE,MAAMiC,EAAcjC,EAAM,aAAa,IAEvC,OAEEJ,EAAAA,IAAC,QAAA,CACC,cAAY,kBACZ,SAAQ,GACR,IAAKI,EAAM,IACX,OAAQsB,GAAeW,EAAcX,EAAYW,CAAW,EAAIA,CAAA,CAAA,CAGtE,CACA,OAAO,IACT,CAAA,CAEJ,CAEA,MAAMC,EAAyBlC,GACtB,CAACA,EAAM,QAAQ,OAAQ,EAAE,EAO5BmC,EAA4BlD,GAAmC,CACnE,KAAM,CAAE,QAAAmD,EAAS,MAAApC,CAAA,EAAUf,EAE3B,GAAI,CAACmD,EACH,OAAO,OAAOpC,GAAU,UAAYkC,EAAsBlC,CAAK,EAGjE,UAAWqC,KAAQD,EACjB,GAAInB,EAAYoB,CAAI,IAAMxD,EAAM,UAC9B,MAAO,GAIX,OACEuD,EAAQ,OAAS,GACjB,OAAOA,EAAQ,CAAC,EAAE,OAAU,UAC5BF,EAAsBE,EAAQ,CAAC,EAAE,KAAK,CAE1C,EAEME,EAAoB,CACxBrD,EACAsD,EACAnB,EACAC,EACAC,IACc,CACd,IAAIkB,EAAQ,EAEZ,MAAMC,EAAQ,CACZ,GAAGtB,EAAaC,EAAMC,EAAOC,CAAW,EACxC,GAAGiB,CAAA,EAGCG,EAAczD,GAAqC,CACvD,MAAM0D,EAAaF,EAAMxB,EAAYhC,CAAI,CAAC,EAO1C,GAJI,OAAO0D,EAAe,KAItBR,EAAqBlD,CAAI,EAC3B,OAAO,KAGT,MAAMG,EAAWH,EAAK,QAAUA,EAAK,QAAQ,IAAIyD,CAAU,EAAI,CAAA,EAE/D,OAAO9C,MAACgD,EAAAA,UAAwB,SAAAD,EAAW5B,EAAc9B,CAAI,EAAGG,CAAQ,GAAlDoD,GAAoD,CAC5E,EAEA,OAAOE,EAAWzD,CAAI,CACxB,EAKA,SAAS4D,EAAoB,CAC3B,KAAAtC,EACA,UAAAuC,EACA,gBAAAP,EACA,cAAAQ,EAAgB,GAChB,KAAA3B,EACA,MAAAC,EACA,YAAAC,EACA,QAAS0B,EAAa,MACtB,GAAGC,CACL,EAAqB,CACnB,OAAO1C,EACLwC,EACEnD,EAAAA,IAACoD,EAAA,CAAW,UAAAF,EAAuB,GAAGG,EACnC,SAAAX,EAAkB/B,EAAMgC,EAAiBnB,EAAMC,EAAOC,CAAW,CAAA,CACpE,EAEA1B,EAAAA,IAACsD,EAAAA,YAAA,CAAY,UAAAJ,EAAsB,QAASE,EAAa,GAAGC,EACzD,SAAAX,EAAkB/B,EAAMgC,EAAiBnB,EAAMC,EAAOC,CAAW,EACpE,EAEA,IACN"}
|
|
1
|
+
{"version":3,"file":"RichText-DNroJJXv.js","sources":["../../../components/rich-text/src/constants.ts","../../../components/rich-text/src/renderers.tsx","../../../components/rich-text/src/utils.ts","../../../components/rich-text/src/RichText.tsx"],"sourcesContent":["export const INLINE = {\n HYPERLINK: \"hyperlink\",\n ENTRY_HYPERLINK: \"entry-hyperlink\",\n ASSET_HYPERLINK: \"asset-hyperlink\",\n RESOURCE_HYPERLINK: \"resource-hyperlink\",\n EMBEDDED_ENTRY: \"embedded-entry-inline\",\n} as const;\n\nexport const BLOCK = {\n DOCUMENT: \"document\",\n PARAGRAPH: \"paragraph\",\n TEXT: \"text\",\n HYPERLINK: \"hyperlink\",\n ENTRY_HYPERLINK: \"entry-hyperlink\",\n\n HEADER_1: \"header-1\",\n HEADER_2: \"header-2\",\n HEADER_3: \"header-3\",\n HEADER_4: \"header-4\",\n HEADER_5: \"header-5\",\n HEADER_6: \"header-6\",\n\n HEADING_1: \"heading-1\",\n HEADING_2: \"heading-2\",\n HEADING_3: \"heading-3\",\n HEADING_4: \"heading-4\",\n HEADING_5: \"heading-5\",\n HEADING_6: \"heading-6\",\n\n TABLE: \"table\",\n TABLE_ROW: \"table-row\",\n TABLE_HEADER_CELL: \"table-header-cell\",\n TABLE_CELL: \"table-cell\",\n TABLE_BODY: \"table-body\",\n\n OL_LIST: \"ordered-list\",\n UL_LIST: \"unordered-list\",\n LIST_ITEM: \"list-item\",\n\n HR: \"horizontal-row\",\n QUOTE: \"blockquote\",\n\n EMBEDDED_ENTRY: \"embedded-entity\",\n EMBEDDED_ASSET: \"embedded-asset-block\",\n\n IMAGE: \"image\",\n VIDEO: \"video\",\n RICHTEXTDOCUMENT: \"rich-text-document\",\n TEASER: \"teaser\",\n} as const;\n\nexport const MARK = {\n BOLD: \"bold\",\n ITALIC: \"italic\",\n UNDERLINE: \"underline\",\n CODE: \"code\",\n} as const;\n\nexport const ELEMENT = {\n DIV: \"div\",\n SPAN: \"span\",\n} as const;\n","import React, { type ReactNode } from \"react\";\n\nimport { BLOCK } from \"./constants\";\nimport { type RichTextNode } from \"./types\";\n\nconst isHeaderRow = (row: RichTextNode): boolean =>\n row.type === BLOCK.TABLE_ROW &&\n !!row.content?.every((node) => node.type === BLOCK.TABLE_HEADER_CELL);\n\n/**\n * Wrap the first rows with <thead /> if it consists of only <th> elements.\n * Wrap the rest of the rows with <tbody />.\n */\nexport const tableRenderer = (richTextNode: RichTextNode, children: ReactNode[]) => {\n if (richTextNode.type !== BLOCK.TABLE) {\n return children;\n }\n const { content: tableContent } = richTextNode;\n const [headerRows, bodyRows] = (tableContent || []).reduce<[RichTextNode[], RichTextNode[]]>(\n ([headers, body], row) => {\n return isHeaderRow(row) ? [[...headers, row], body] : [headers, [...body, row]];\n },\n [[], []]\n );\n const headerRowChildren = children.slice(0, headerRows.length);\n const bodyRowChildren = children.slice(headerRows.length, children.length);\n return (\n <div className=\"purpur-rich-text-table-scroll-container\">\n <div className=\"purpur-rich-text-table-inner-scroll-container\">\n <table>\n {headerRows.length > 0 && <thead>{headerRowChildren}</thead>}\n {bodyRows.length > 0 && <tbody>{bodyRowChildren}</tbody>}\n </table>\n </div>\n </div>\n );\n};\n","import { BLOCK, INLINE } from \"./constants\";\nimport { type Block, type Inline, type Mark, type RichTextNode, type Value } from \"./types\";\n\nexport type MarkNode = {\n type: Mark;\n};\n\ntype TextNode<T> = RichTextNode<T> & {\n type: \"text\";\n value: string;\n marks: MarkNode[];\n};\n\ntype InlineNode<T> = RichTextNode<T> & {\n type: Inline;\n content: Array<Inline | Text>;\n};\n\ntype BlockNode<T> = RichTextNode<T> & {\n type: Block;\n content: Array<Block | Inline | Text>;\n};\n\nconst hasValue = (obj: Record<string, unknown>, value: unknown) =>\n Object.values(obj).includes(value);\n\nconst isText = <T>(node: RichTextNode<T> | undefined): node is TextNode<T> => node?.type === \"text\";\n\nconst isBlock = <T>(node: RichTextNode<T> | undefined): node is BlockNode<T> =>\n !isInline(node) && !isText(node) && hasValue(BLOCK, node?.type);\n\nconst isInline = <T>(node: RichTextNode<T> | undefined): node is InlineNode<T> =>\n hasValue(INLINE, node?.type);\n\nexport const safeJsonParse = <T>(jsonString: string): T | null => {\n try {\n return JSON.parse(jsonString);\n } catch {\n return null;\n }\n};\n\n// This is equivalent to https://github.com/contentful/rich-text/tree/master/packages/rich-text-plain-text-renderer\nexport const richToPlainText = <T>(data: string, blockDivisor = \" \"): string => {\n const rootNode = safeJsonParse<RichTextNode<T>>(data);\n\n if (!rootNode || !rootNode.content) {\n return \"\";\n }\n\n return rootNode.content.reduce((acc: string, node: RichTextNode<T>, i) => {\n let nodeTextValue = \"\";\n\n if (isText(node)) {\n nodeTextValue = node.value;\n } else if (isBlock(node) || isInline(node)) {\n nodeTextValue = richToPlainText(JSON.stringify(node), blockDivisor);\n if (!nodeTextValue.length) {\n return acc;\n }\n }\n\n const nextNode = rootNode?.content?.[i + 1];\n const divisor = isBlock(nextNode) ? blockDivisor : \"\";\n\n return acc + nodeTextValue + divisor;\n }, \"\");\n};\n\nexport function normalizeNode<T = Value>(node: RichTextNode<T>) {\n if (\n node.type === BLOCK.IMAGE &&\n typeof node.value === \"object\" &&\n node?.value &&\n \"image\" in node.value &&\n node?.value?.image?.url\n ) {\n return { ...node, value: { ...node.value, url: node.value.image.url } };\n }\n\n if (\n node.type === BLOCK.VIDEO &&\n typeof node.value === \"object\" &&\n node?.value &&\n \"video\" in node.value &&\n node.value.video?.url\n ) {\n return { ...node, value: { ...node.value, url: node.value.video.url } };\n }\n\n return node;\n}\n","import React, { Fragment, type ReactNode } from \"react\";\nimport { Heading } from \"@purpur/heading\";\nimport { Link } from \"@purpur/link\";\nimport { Paragraph } from \"@purpur/paragraph\";\nimport { TextSpacing } from \"@purpur/text-spacing\";\n\nimport { BLOCK, MARK } from \"./constants\";\nimport { tableRenderer } from \"./renderers\";\nimport type {\n ImageProp,\n LinkProp,\n Mark,\n NodeTypes,\n RichTextNode,\n RichTextProps,\n Value,\n VideoPosterProp,\n} from \"./types\";\nimport { normalizeNode } from \"./utils\";\n\n// Inspired by https://github.com/contentful/rich-text/blob/master/packages/rich-text-react-renderer/src/index.tsx\nconst MARK_TYPES = {\n [MARK.BOLD]: (children: ReactNode) => <b>{children}</b>,\n [MARK.ITALIC]: (children: ReactNode) => <i>{children}</i>,\n [MARK.UNDERLINE]: (children: ReactNode) => <u>{children}</u>,\n [MARK.CODE]: (children: ReactNode) => <code>{children}</code>,\n};\n\nconst getNodeType = (node: RichTextNode) => {\n const type = node.type ?? node.nodeType!;\n if (type.startsWith(\"heading-\")) return type.replace(\"heading-\", \"header-\");\n if (type.startsWith(\"entry-hyperlink\")) return type.replace(\"entry-hyperlink\", \"hyperlink\");\n return type;\n};\n\nfunction getNodeTypes<T = Value>(\n link: LinkProp,\n image: ImageProp,\n videoPoster: VideoPosterProp\n): NodeTypes<T> {\n return {\n [BLOCK.RICHTEXTDOCUMENT]: (_, children) => children,\n [BLOCK.DOCUMENT]: (_, children) => children,\n [BLOCK.PARAGRAPH]: (_, children) => <Paragraph variant=\"paragraph-200\">{children}</Paragraph>,\n [BLOCK.TEXT]: (node) => {\n const { value: nodeValue, marks } = node;\n const value = typeof nodeValue === \"string\" ? nodeValue.replace(/\\n/g, \"<br />\") : nodeValue;\n\n const element = <span dangerouslySetInnerHTML={{ __html: value as string }} />;\n\n if (!marks) {\n return element;\n }\n return marks.reduce((accumulator: ReactNode, currentValue: Mark | { type: Mark }) => {\n return MARK_TYPES[typeof currentValue === \"string\" ? currentValue : currentValue.type](\n accumulator\n );\n }, element);\n },\n [BLOCK.HYPERLINK]: (node, children) => {\n const uri = node.uri ?? (node.data?.uri as string);\n\n if (link) {\n return <Link variant=\"text\">{link(children, uri)}</Link>;\n }\n return (\n <Link variant=\"text\">\n <a href={uri}>{children}</a>\n </Link>\n );\n },\n [BLOCK.HR]: () => <hr />,\n [BLOCK.HEADER_2]: (_, children) => (\n <Heading tag=\"h2\" variant=\"title-300\">\n {children}\n </Heading>\n ),\n [BLOCK.HEADER_3]: (_, children) => (\n <Heading tag=\"h3\" variant=\"title-200\">\n {children}\n </Heading>\n ),\n [BLOCK.HEADER_4]: (_, children) => (\n <Heading tag=\"h4\" variant=\"title-100\">\n {children}\n </Heading>\n ),\n [BLOCK.HEADER_5]: (_, children) => (\n <Heading tag=\"h5\" variant=\"title-100\">\n {children}\n </Heading>\n ),\n [BLOCK.HEADER_6]: (_, children) => (\n <Heading tag=\"h6\" variant=\"title-100\">\n {children}\n </Heading>\n ),\n [BLOCK.TABLE]: tableRenderer,\n [BLOCK.TABLE_ROW]: (_, children) => <tr>{children}</tr>,\n [BLOCK.TABLE_HEADER_CELL]: (_, children) => <th scope=\"col\">{children}</th>,\n [BLOCK.TABLE_CELL]: (_, children) => {\n return <td>{children}</td>;\n },\n [BLOCK.TABLE_BODY]: (_, children) => <tbody>{children}</tbody>,\n [BLOCK.LIST_ITEM]: (_, children) => <li>{children}</li>,\n [BLOCK.OL_LIST]: (_, children) => <ol>{children}</ol>,\n [BLOCK.UL_LIST]: (_, children) => <ul>{children}</ul>,\n [BLOCK.QUOTE]: (_, children) => <blockquote>“{children}”</blockquote>,\n [BLOCK.EMBEDDED_ENTRY]: (_, children) => children,\n [BLOCK.EMBEDDED_ASSET]: (_, children) => children,\n [BLOCK.IMAGE]: ({ value }) => {\n if (typeof value === \"object\" && value && \"url\" in value && value.url) {\n if (image) {\n return image(value.url, value.altText, value.image?.contentType);\n }\n return <img src={value.url} alt={value.altText ?? \"\"} loading=\"lazy\" />;\n }\n return null;\n },\n [BLOCK.VIDEO]: ({ value }) => {\n if (typeof value === \"object\" && value && \"posterImage\" in value) {\n const posterImage = value.posterImage?.url;\n\n return (\n // eslint-disable-next-line jsx-a11y/media-has-caption\n <video\n data-testid=\"rich text video\"\n controls\n src={value.url}\n poster={videoPoster && posterImage ? videoPoster(posterImage) : posterImage}\n />\n );\n }\n return null;\n },\n };\n}\n\nconst isValueWhitespaceOnly = (value: string): boolean => {\n return !value.replace(/\\s+/g, \"\");\n};\n\n/**\n * Strictly checks if a singular node value OR nested node content is an empty element.\n */\n\nconst isNodeOrContentEmpty = <T,>(node: RichTextNode<T>): boolean => {\n const { content, value } = node;\n\n if (!content) {\n return typeof value === \"string\" && isValueWhitespaceOnly(value);\n }\n\n for (const item of content) {\n if (getNodeType(item) === BLOCK.HYPERLINK) {\n return false;\n }\n }\n\n return (\n content.length > 0 &&\n typeof content[0].value === \"string\" &&\n isValueWhitespaceOnly(content[0].value)\n );\n};\n\nconst serializeRichText = <T,>(\n node: RichTextNode<T>,\n customNodeTypes?: NodeTypes<T>,\n link?: LinkProp,\n image?: ImageProp,\n videoPoster?: VideoPosterProp\n): ReactNode => {\n let index = 0; // nodes in rich text does not contain ids, we'll use index as keys for react\n\n const nodes = {\n ...getNodeTypes(link, image, videoPoster),\n ...customNodeTypes,\n };\n\n const renderNode = (node: RichTextNode<T>): ReactNode => {\n const renderFunc = nodes[getNodeType(node)];\n\n // node types that are missing from both default NODE_TYPES and custom are never rendered\n if (typeof renderFunc === \"undefined\") {\n return null;\n }\n\n if (isNodeOrContentEmpty(node)) {\n return null;\n }\n\n const children = node.content ? node.content.map(renderNode) : [];\n\n return <Fragment key={index++}>{renderFunc(normalizeNode(node), children)}</Fragment>;\n };\n\n return renderNode(node);\n};\n\n/* Not using a arrow function here since the default generic will mess with the highlighting\n and it still needs a eslint-disable-next-line because it still lints incorrect */\n\nfunction RichText<T = Value>({\n data,\n className,\n customNodeTypes,\n noTextSpacing = false,\n link,\n image,\n videoPoster,\n element: ElementTag = \"div\",\n ...rest\n}: RichTextProps<T>) {\n return data ? (\n noTextSpacing ? (\n <ElementTag className={className} {...rest}>\n {serializeRichText(data, customNodeTypes, link, image, videoPoster)}\n </ElementTag>\n ) : (\n <TextSpacing className={className} element={ElementTag} {...rest}>\n {serializeRichText(data, customNodeTypes, link, image, videoPoster)}\n </TextSpacing>\n )\n ) : null;\n}\n\nexport { getNodeTypes, RichText, serializeRichText };\n"],"names":["INLINE","BLOCK","MARK","isHeaderRow","row","node","tableRenderer","richTextNode","children","tableContent","headerRows","bodyRows","headers","body","headerRowChildren","bodyRowChildren","jsx","jsxs","hasValue","obj","value","isText","isBlock","isInline","safeJsonParse","jsonString","richToPlainText","data","blockDivisor","rootNode","acc","i","nodeTextValue","nextNode","divisor","normalizeNode","MARK_TYPES","getNodeType","type","getNodeTypes","link","image","videoPoster","_","Paragraph","nodeValue","marks","element","accumulator","currentValue","uri","Link","Heading","posterImage","isValueWhitespaceOnly","isNodeOrContentEmpty","content","item","serializeRichText","customNodeTypes","index","nodes","renderNode","renderFunc","Fragment","RichText","className","noTextSpacing","ElementTag","rest","TextSpacing"],"mappings":"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"}
|