@purpur/library 9.10.0 → 9.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/CHANGELOG.json +18 -0
  2. package/CHANGELOG.md +10 -1
  3. package/dist/LICENSE.txt +40 -0
  4. package/dist/{RichText-D4vznH1B.mjs → RichText-2_z57EYi.mjs} +2 -2
  5. package/dist/{RichText-D4vznH1B.mjs.map → RichText-2_z57EYi.mjs.map} +1 -1
  6. package/dist/{RichText-BAVZadzi.js → RichText-IejAKqm2.js} +2 -2
  7. package/dist/{RichText-BAVZadzi.js.map → RichText-IejAKqm2.js.map} +1 -1
  8. package/dist/{autocomplete-CmLzmWp4.mjs → autocomplete-C6AqdYaZ.mjs} +2 -2
  9. package/dist/{autocomplete-CmLzmWp4.mjs.map → autocomplete-C6AqdYaZ.mjs.map} +1 -1
  10. package/dist/{autocomplete-BX1KDZqL.js → autocomplete-yrPbF5gq.js} +2 -2
  11. package/dist/{autocomplete-BX1KDZqL.js.map → autocomplete-yrPbF5gq.js.map} +1 -1
  12. package/dist/autocomplete.cjs.js +1 -1
  13. package/dist/autocomplete.es.js +1 -1
  14. package/dist/button-DZgtrGqN.js +2 -0
  15. package/dist/{button-DmybVApa.js.map → button-DZgtrGqN.js.map} +1 -1
  16. package/dist/button-EVRfctR8.mjs +109 -0
  17. package/dist/{button-4-yWOgtD.mjs.map → button-EVRfctR8.mjs.map} +1 -1
  18. package/dist/button.cjs.js +1 -1
  19. package/dist/button.es.js +1 -1
  20. package/dist/{calendar-Cru-p6gC.mjs → calendar-CTWhxuS4.mjs} +2 -2
  21. package/dist/{calendar-Cru-p6gC.mjs.map → calendar-CTWhxuS4.mjs.map} +1 -1
  22. package/dist/{calendar-DDR8CQYo.js → calendar-Cwzqytai.js} +2 -2
  23. package/dist/{calendar-DDR8CQYo.js.map → calendar-Cwzqytai.js.map} +1 -1
  24. package/dist/calendar.cjs.js +1 -1
  25. package/dist/calendar.es.js +1 -1
  26. package/dist/{carousel-BIKcwvYz.mjs → carousel-DiKGSL-7.mjs} +2 -2
  27. package/dist/{carousel-BIKcwvYz.mjs.map → carousel-DiKGSL-7.mjs.map} +1 -1
  28. package/dist/{carousel-DnSaLDZf.js → carousel-Dz_bUGo4.js} +2 -2
  29. package/dist/{carousel-DnSaLDZf.js.map → carousel-Dz_bUGo4.js.map} +1 -1
  30. package/dist/carousel.cjs.js +1 -1
  31. package/dist/carousel.es.js +1 -1
  32. package/dist/{chat-field-CVF4DooY.mjs → chat-field-8cKqYcKi.mjs} +2 -2
  33. package/dist/{chat-field-CVF4DooY.mjs.map → chat-field-8cKqYcKi.mjs.map} +1 -1
  34. package/dist/{chat-field-Wjvh2J6C.js → chat-field-B2jmpVNr.js} +2 -2
  35. package/dist/{chat-field-Wjvh2J6C.js.map → chat-field-B2jmpVNr.js.map} +1 -1
  36. package/dist/chat-field.cjs.js +1 -1
  37. package/dist/chat-field.es.js +1 -1
  38. package/dist/{comparison-table-D1evE0ri.mjs → comparison-table-CmtSOUfK.mjs} +2 -2
  39. package/dist/{comparison-table-D1evE0ri.mjs.map → comparison-table-CmtSOUfK.mjs.map} +1 -1
  40. package/dist/{comparison-table-Dtqxz8vL.js → comparison-table-N5G3k2kr.js} +2 -2
  41. package/dist/{comparison-table-Dtqxz8vL.js.map → comparison-table-N5G3k2kr.js.map} +1 -1
  42. package/dist/comparison-table.cjs.js +1 -1
  43. package/dist/comparison-table.es.js +1 -1
  44. package/dist/components/accordion/src/accordion-item.d.ts +2 -2
  45. package/dist/components/accordion/src/accordion.d.ts +2 -2
  46. package/dist/components/avatar/src/avatar.d.ts +1 -1
  47. package/dist/components/button/src/button.d.ts +5 -5
  48. package/dist/components/card/src/card-badge.d.ts +1 -1
  49. package/dist/components/card/src/card-cta.d.ts +1 -1
  50. package/dist/components/card/src/card-heading.d.ts +1 -1
  51. package/dist/components/card/src/card-media-layout.d.ts +1 -1
  52. package/dist/components/card/src/card-media.d.ts +1 -1
  53. package/dist/components/checkbox/src/checkbox.d.ts +1 -1
  54. package/dist/components/comparison-table/src/components/OptionCard/option-card.d.ts +1 -1
  55. package/dist/components/content-block/src/content-block.d.ts +2 -2
  56. package/dist/components/counter-badge/src/counter-badge.d.ts +1 -1
  57. package/dist/components/country-flag-icon/src/country-flag-icon.d.ts +1 -1
  58. package/dist/components/date-field/src/date-field.d.ts +1 -1
  59. package/dist/components/date-picker/src/date-picker.d.ts +4 -4
  60. package/dist/components/dismissable-chip-group/src/dismissable-chip-group-item.d.ts +1 -1
  61. package/dist/components/dismissable-chip-group/src/dismissable-chip-group.d.ts +2 -2
  62. package/dist/components/drawer/src/drawer-content.d.ts +2 -2
  63. package/dist/components/drawer/src/drawer-frame.d.ts +1 -1
  64. package/dist/components/drawer/src/drawer-trigger.d.ts +1 -1
  65. package/dist/components/field-error-text/src/field-error-text.d.ts +2 -2
  66. package/dist/components/field-helper-text/src/field-helper-text.d.ts +1 -1
  67. package/dist/components/footer/src/footer-navigation.d.ts +1 -1
  68. package/dist/components/footer/src/footer-social-link.d.ts +3 -3
  69. package/dist/components/footer/src/footer.d.ts +3 -3
  70. package/dist/components/grid/src/grid.item.d.ts +1 -1
  71. package/dist/components/heading/src/heading.d.ts +2 -2
  72. package/dist/components/hero-banner/src/hero-banner-actions.d.ts +1 -1
  73. package/dist/components/hero-banner/src/hero-banner-media.d.ts +1 -1
  74. package/dist/components/hero-banner/src/hero-banner-types.d.ts +2 -2
  75. package/dist/components/illustrative-icon/src/static-illustrative-icon.d.ts +2 -2
  76. package/dist/components/listbox/src/listbox-item.d.ts +1 -1
  77. package/dist/components/listbox/src/listbox.d.ts +1 -1
  78. package/dist/components/logo/src/logo.types.d.ts +1 -1
  79. package/dist/components/notification-banner/src/notification-banner.d.ts +2 -2
  80. package/dist/components/pagination/src/pagination-page-selector.d.ts +2 -2
  81. package/dist/components/pagination/src/pagination-page-size-selector.d.ts +2 -2
  82. package/dist/components/pagination/src/pagination-pages.d.ts +2 -2
  83. package/dist/components/pagination/src/use-page-options.hook.d.ts +2 -2
  84. package/dist/components/pagination/src/use-page-size-options.hook.d.ts +2 -2
  85. package/dist/components/paragraph/src/paragraph.d.ts +1 -1
  86. package/dist/components/password-field/src/password-strength-indicator.d.ts +2 -2
  87. package/dist/components/password-field/src/password-strength.d.ts +2 -2
  88. package/dist/components/popover/src/popover-button.d.ts +2 -2
  89. package/dist/components/product-card/src/product-card.d.ts +1 -1
  90. package/dist/components/promotion-card/src/promotion-card.d.ts +1 -1
  91. package/dist/components/quantity-selector/src/quantity-selector.d.ts +1 -1
  92. package/dist/components/radio-button-group/src/radio-button-group-root.d.ts +1 -1
  93. package/dist/components/radio-card-group/src/radio-card-group.d.ts +2 -2
  94. package/dist/components/search-field/src/search-field-autocomplete.d.ts +1 -1
  95. package/dist/components/search-field/src/search-field-base.d.ts +1 -1
  96. package/dist/components/search-field/src/search-field.d.ts +6 -6
  97. package/dist/components/select/src/select.d.ts +1 -1
  98. package/dist/components/spacer/src/spacer.d.ts +2 -2
  99. package/dist/components/spinner/src/spinner.d.ts +1 -1
  100. package/dist/components/stepper/src/stepper-content.d.ts +1 -1
  101. package/dist/components/stepper/src/stepper.d.ts +2 -2
  102. package/dist/components/table/src/cell-types/button-group-cell.d.ts +1 -1
  103. package/dist/components/table/src/empty-table.d.ts +2 -2
  104. package/dist/components/table/src/table-content.d.ts +2 -2
  105. package/dist/components/table/src/table.d.ts +1 -1
  106. package/dist/components/table/src/test-utils/table-data.d.ts +3 -3
  107. package/dist/components/tabs/src/tab-content.d.ts +1 -1
  108. package/dist/components/text-area/src/text-area.d.ts +1 -1
  109. package/dist/components/text-spacing/src/text-spacing.d.ts +1 -1
  110. package/dist/components/toggle/src/toggle.d.ts +1 -1
  111. package/dist/{date-field-DVp_RMNm.mjs → date-field-ChYx0N2j.mjs} +2 -2
  112. package/dist/{date-field-DVp_RMNm.mjs.map → date-field-ChYx0N2j.mjs.map} +1 -1
  113. package/dist/{date-field-hA79n6mP.js → date-field-CwZ64buh.js} +2 -2
  114. package/dist/{date-field-hA79n6mP.js.map → date-field-CwZ64buh.js.map} +1 -1
  115. package/dist/date-field.cjs.js +1 -1
  116. package/dist/date-field.es.js +1 -1
  117. package/dist/{date-picker-Dzoo_hhQ.js → date-picker-BWMKTOq6.js} +2 -2
  118. package/dist/{date-picker-Dzoo_hhQ.js.map → date-picker-BWMKTOq6.js.map} +1 -1
  119. package/dist/{date-picker-B8ta-Q8V.mjs → date-picker-CTyqgBRB.mjs} +5 -5
  120. package/dist/{date-picker-B8ta-Q8V.mjs.map → date-picker-CTyqgBRB.mjs.map} +1 -1
  121. package/dist/date-picker.cjs.js +1 -1
  122. package/dist/date-picker.es.js +1 -1
  123. package/dist/{date-range-field-Dqqgj41u.js → date-range-field-CvzOl-eC.js} +2 -2
  124. package/dist/{date-range-field-Dqqgj41u.js.map → date-range-field-CvzOl-eC.js.map} +1 -1
  125. package/dist/{date-range-field-BZUjfftV.mjs → date-range-field-DDr-qEGX.mjs} +2 -2
  126. package/dist/{date-range-field-BZUjfftV.mjs.map → date-range-field-DDr-qEGX.mjs.map} +1 -1
  127. package/dist/date-range-field.cjs.js +1 -1
  128. package/dist/date-range-field.es.js +1 -1
  129. package/dist/{drawer-DyLQfvEh.js → drawer-BnqxUIPM.js} +2 -2
  130. package/dist/{drawer-DyLQfvEh.js.map → drawer-BnqxUIPM.js.map} +1 -1
  131. package/dist/{drawer-cIUx6WSZ.mjs → drawer-Cnk2OKgi.mjs} +2 -2
  132. package/dist/{drawer-cIUx6WSZ.mjs.map → drawer-Cnk2OKgi.mjs.map} +1 -1
  133. package/dist/drawer.cjs.js +1 -1
  134. package/dist/drawer.es.js +1 -1
  135. package/dist/{footer-Cn1-zG1v.js → footer-B8rzVSrZ.js} +2 -2
  136. package/dist/{footer-Cn1-zG1v.js.map → footer-B8rzVSrZ.js.map} +1 -1
  137. package/dist/{footer-D-2b7UIB.mjs → footer-D5YkHmCo.mjs} +2 -2
  138. package/dist/{footer-D-2b7UIB.mjs.map → footer-D5YkHmCo.mjs.map} +1 -1
  139. package/dist/footer.cjs.js +1 -1
  140. package/dist/footer.es.js +1 -1
  141. package/dist/{hero-banner-n9K-Jsdz.mjs → hero-banner-BXRArPWP.mjs} +2 -2
  142. package/dist/{hero-banner-n9K-Jsdz.mjs.map → hero-banner-BXRArPWP.mjs.map} +1 -1
  143. package/dist/{hero-banner--v-ezYMr.js → hero-banner-CW7DIEZe.js} +2 -2
  144. package/dist/{hero-banner--v-ezYMr.js.map → hero-banner-CW7DIEZe.js.map} +1 -1
  145. package/dist/hero-banner.cjs.js +1 -1
  146. package/dist/hero-banner.es.js +1 -1
  147. package/dist/libraries/library/src/library.d.ts +1 -0
  148. package/dist/libraries/library/src/library.d.ts.map +1 -1
  149. package/dist/libraries/library/src/password-field.d.ts +6 -2
  150. package/dist/libraries/library/src/password-field.d.ts.map +1 -1
  151. package/dist/libraries/library/src/radio-button-group.d.ts +1 -1
  152. package/dist/libraries/library/src/radio-card-group.d.ts +1 -1
  153. package/dist/libraries/library/src/spinner.d.ts +1 -1
  154. package/dist/libraries/library/src/stepper.d.ts +1 -1
  155. package/dist/libraries/library/src/tooltip.d.ts +1 -1
  156. package/dist/libraries/library/src/visually-hidden.d.ts +1 -1
  157. package/dist/libraries/theme/src/ThemeProvider.d.ts +2 -2
  158. package/dist/library.cjs.js +1 -1
  159. package/dist/library.es.js +546 -543
  160. package/dist/library.es.js.map +1 -1
  161. package/dist/link-Dzqd0QuD.js +2 -0
  162. package/dist/{link-DhWVrkTz.js.map → link-Dzqd0QuD.js.map} +1 -1
  163. package/dist/link-ccCdDvBc.mjs +72 -0
  164. package/dist/{link-DY5WLpyc.mjs.map → link-ccCdDvBc.mjs.map} +1 -1
  165. package/dist/link.cjs.js +1 -1
  166. package/dist/link.es.js +1 -1
  167. package/dist/main-B501z9Ql.js +2 -0
  168. package/dist/main-B501z9Ql.js.map +1 -0
  169. package/dist/main-L71Sqg3s.mjs +1016 -0
  170. package/dist/main-L71Sqg3s.mjs.map +1 -0
  171. package/dist/{modal-Bu1Zv5Ic.mjs → modal-BuUQrUYJ.mjs} +2 -2
  172. package/dist/{modal-Bu1Zv5Ic.mjs.map → modal-BuUQrUYJ.mjs.map} +1 -1
  173. package/dist/{modal-D0Qxrvx5.js → modal-CnC4Zyjk.js} +2 -2
  174. package/dist/{modal-D0Qxrvx5.js.map → modal-CnC4Zyjk.js.map} +1 -1
  175. package/dist/modal.cjs.js +1 -1
  176. package/dist/modal.es.js +1 -1
  177. package/dist/{notification-DiVdy6E_.mjs → notification-C3f3N1K1.mjs} +2 -2
  178. package/dist/{notification-DiVdy6E_.mjs.map → notification-C3f3N1K1.mjs.map} +1 -1
  179. package/dist/{notification-D2oClkX2.js → notification-CeoAXDXq.js} +2 -2
  180. package/dist/{notification-D2oClkX2.js.map → notification-CeoAXDXq.js.map} +1 -1
  181. package/dist/{notification-banner-CZTQZ5Le.mjs → notification-banner-BvAy8dlg.mjs} +2 -2
  182. package/dist/{notification-banner-CZTQZ5Le.mjs.map → notification-banner-BvAy8dlg.mjs.map} +1 -1
  183. package/dist/{notification-banner-BxHwTFnH.js → notification-banner-DUe4fT1r.js} +2 -2
  184. package/dist/{notification-banner-BxHwTFnH.js.map → notification-banner-DUe4fT1r.js.map} +1 -1
  185. package/dist/notification-banner.cjs.js +1 -1
  186. package/dist/notification-banner.es.js +1 -1
  187. package/dist/notification.cjs.js +1 -1
  188. package/dist/notification.es.js +1 -1
  189. package/dist/password-field-BjKdBoIK.js +2 -0
  190. package/dist/password-field-BjKdBoIK.js.map +1 -0
  191. package/dist/password-field-C_E4563x.mjs +200 -0
  192. package/dist/password-field-C_E4563x.mjs.map +1 -0
  193. package/dist/password-field.cjs.js +2 -0
  194. package/dist/password-field.cjs.js.map +1 -0
  195. package/dist/password-field.es.js +6 -0
  196. package/dist/password-field.es.js.map +1 -0
  197. package/dist/{popover-CY75TnbA.js → popover-4phnhJLj.js} +2 -2
  198. package/dist/{popover-CY75TnbA.js.map → popover-4phnhJLj.js.map} +1 -1
  199. package/dist/{popover-wiiwtqWE.mjs → popover-DhObSx97.mjs} +2 -2
  200. package/dist/{popover-wiiwtqWE.mjs.map → popover-DhObSx97.mjs.map} +1 -1
  201. package/dist/popover.cjs.js +1 -1
  202. package/dist/popover.es.js +1 -1
  203. package/dist/purpur.css +1 -1
  204. package/dist/{quantity-selector-BEYMDsBM.js → quantity-selector-Ds7d4MnV.js} +2 -2
  205. package/dist/{quantity-selector-BEYMDsBM.js.map → quantity-selector-Ds7d4MnV.js.map} +1 -1
  206. package/dist/{quantity-selector-Cp-e5xKJ.mjs → quantity-selector-DwkKKmFy.mjs} +3 -3
  207. package/dist/{quantity-selector-Cp-e5xKJ.mjs.map → quantity-selector-DwkKKmFy.mjs.map} +1 -1
  208. package/dist/quantity-selector.cjs.js +1 -1
  209. package/dist/quantity-selector.es.js +1 -1
  210. package/dist/rich-text.cjs.js +1 -1
  211. package/dist/rich-text.es.js +1 -1
  212. package/dist/{search-field-afhtC6q5.mjs → search-field-BTqVE1-l.mjs} +3 -3
  213. package/dist/{search-field-afhtC6q5.mjs.map → search-field-BTqVE1-l.mjs.map} +1 -1
  214. package/dist/{search-field-WJBtiK0K.js → search-field-DkJrwzJB.js} +2 -2
  215. package/dist/{search-field-WJBtiK0K.js.map → search-field-DkJrwzJB.js.map} +1 -1
  216. package/dist/search-field.cjs.js +1 -1
  217. package/dist/search-field.es.js +1 -1
  218. package/dist/{stepper-VDiR2I8F.js → stepper-5rQ3cK18.js} +2 -2
  219. package/dist/{stepper-VDiR2I8F.js.map → stepper-5rQ3cK18.js.map} +1 -1
  220. package/dist/{stepper-20s8dnPA.mjs → stepper-B3p9r3gv.mjs} +3 -3
  221. package/dist/{stepper-20s8dnPA.mjs.map → stepper-B3p9r3gv.mjs.map} +1 -1
  222. package/dist/stepper.cjs.js +1 -1
  223. package/dist/stepper.es.js +1 -1
  224. package/dist/{table-B5ZitZoL.js → table-BIyaTsOh.js} +2 -2
  225. package/dist/{table-B5ZitZoL.js.map → table-BIyaTsOh.js.map} +1 -1
  226. package/dist/{table-CNIL-60s.mjs → table-BtymEUG4.mjs} +6 -6
  227. package/dist/{table-CNIL-60s.mjs.map → table-BtymEUG4.mjs.map} +1 -1
  228. package/dist/table.cjs.js +1 -1
  229. package/dist/table.es.js +1 -1
  230. package/dist/{text-field-D0e-cRbG.mjs → text-field-C9LX7LBf.mjs} +2 -2
  231. package/dist/{text-field-D0e-cRbG.mjs.map → text-field-C9LX7LBf.mjs.map} +1 -1
  232. package/dist/{text-field-VW8ObP83.js → text-field-CS0PT5T6.js} +2 -2
  233. package/dist/{text-field-VW8ObP83.js.map → text-field-CS0PT5T6.js.map} +1 -1
  234. package/dist/text-field.cjs.js +1 -1
  235. package/dist/text-field.es.js +1 -1
  236. package/dist/{tooltip-B-11qk-0.js → tooltip-COFCRUKv.js} +2 -2
  237. package/dist/{tooltip-B-11qk-0.js.map → tooltip-COFCRUKv.js.map} +1 -1
  238. package/dist/{tooltip-DngYHn5W.mjs → tooltip-FH9R2MAA.mjs} +2 -2
  239. package/dist/{tooltip-DngYHn5W.mjs.map → tooltip-FH9R2MAA.mjs.map} +1 -1
  240. package/dist/tooltip.cjs.js +1 -1
  241. package/dist/tooltip.es.js +1 -1
  242. package/package.json +24 -29
  243. package/scripts/generate.mts +1 -4
  244. package/src/aliases.ts +4 -0
  245. package/src/entries.js +1 -0
  246. package/src/library.ts +1 -1
  247. package/src/password-field.ts +0 -1
  248. package/dist/button-4-yWOgtD.mjs +0 -109
  249. package/dist/button-DmybVApa.js +0 -2
  250. package/dist/link-DY5WLpyc.mjs +0 -72
  251. package/dist/link-DhWVrkTz.js +0 -2
package/CHANGELOG.json CHANGED
@@ -1,6 +1,24 @@
1
1
  {
2
2
  "name": "@purpur/library",
3
3
  "entries": [
4
+ {
5
+ "version": "9.10.1",
6
+ "tag": "@purpur/library_v9.10.1",
7
+ "date": "Tue, 18 Aug 2026 06:37:54 GMT",
8
+ "comments": {
9
+ "none": [
10
+ {
11
+ "comment": "Button: Add radius sm to text variant and full to icon-only variant"
12
+ },
13
+ {
14
+ "comment": "Link: Add radius xs to text variant and sm to standalone variant"
15
+ },
16
+ {
17
+ "comment": "Expose PasswordField the same as other standard components"
18
+ }
19
+ ]
20
+ }
21
+ },
4
22
  {
5
23
  "version": "9.10.0",
6
24
  "tag": "@purpur/library_v9.10.0",
package/CHANGELOG.md CHANGED
@@ -1,6 +1,15 @@
1
1
  # Change Log - @purpur/library
2
2
 
3
- This log was last generated on Thu, 13 Aug 2026 13:24:20 GMT and should not be manually modified.
3
+ This log was last generated on Tue, 18 Aug 2026 06:37:54 GMT and should not be manually modified.
4
+
5
+ ## 9.10.1
6
+ Tue, 18 Aug 2026 06:37:54 GMT
7
+
8
+ ### Updates
9
+
10
+ - Button: Add radius sm to text variant and full to icon-only variant
11
+ - Link: Add radius xs to text variant and sm to standalone variant
12
+ - Expose PasswordField the same as other standard components
4
13
 
5
14
  ## 9.10.0
6
15
  Thu, 13 Aug 2026 13:24:20 GMT
package/dist/LICENSE.txt CHANGED
@@ -986,6 +986,39 @@ Private: false
986
986
 
987
987
  ---
988
988
 
989
+ Name: zxcvbn
990
+ Version: 4.4.2
991
+ License: MIT
992
+ Private: false
993
+ Description: realistic password strength estimation
994
+ Repository: undefined
995
+ Author: Dan Wheeler
996
+ License Copyright:
997
+ ===
998
+
999
+ Copyright (c) 2012-2016 Dan Wheeler and Dropbox, Inc.
1000
+
1001
+ Permission is hereby granted, free of charge, to any person obtaining
1002
+ a copy of this software and associated documentation files (the
1003
+ "Software"), to deal in the Software without restriction, including
1004
+ without limitation the rights to use, copy, modify, merge, publish,
1005
+ distribute, sublicense, and/or sell copies of the Software, and to
1006
+ permit persons to whom the Software is furnished to do so, subject to
1007
+ the following conditions:
1008
+
1009
+ The above copyright notice and this permission notice shall be
1010
+ included in all copies or substantial portions of the Software.
1011
+
1012
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1013
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1014
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1015
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
1016
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
1017
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
1018
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1019
+
1020
+ ---
1021
+
989
1022
  Name: @purpur/comparison-table
990
1023
  Version: 8.21.0
991
1024
  License: AGPL-3.0-only
@@ -1007,6 +1040,13 @@ Private: false
1007
1040
 
1008
1041
  ---
1009
1042
 
1043
+ Name: @purpur/password-field
1044
+ Version: 8.21.0
1045
+ License: AGPL-3.0-only
1046
+ Private: false
1047
+
1048
+ ---
1049
+
1010
1050
  Name: @radix-ui/react-tabs
1011
1051
  Version: 1.1.13
1012
1052
  License: MIT
@@ -1,7 +1,7 @@
1
1
  import { jsx as l, jsxs as L } from "react/jsx-runtime";
2
2
  import { Fragment as I } from "react";
3
3
  import { H as h } from "./heading-xwBuT_-9.mjs";
4
- import { a as p } from "./link-DY5WLpyc.mjs";
4
+ import { a as p } from "./link-ccCdDvBc.mjs";
5
5
  import { P as H } from "./paragraph-CwAdFoIm.mjs";
6
6
  import { T as N } from "./text-spacing-BU0mkEf9.mjs";
7
7
  const m = {
@@ -186,4 +186,4 @@ export {
186
186
  j as R,
187
187
  B as r
188
188
  };
189
- //# sourceMappingURL=RichText-D4vznH1B.mjs.map
189
+ //# sourceMappingURL=RichText-2_z57EYi.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"RichText-D4vznH1B.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>&#8220;{children}&#8221;</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-2_z57EYi.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>&#8220;{children}&#8221;</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-drD5ugCC.js"),d=require("./link-DhWVrkTz.js"),H=require("./paragraph-B8HFdNne.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-BAVZadzi.js.map
1
+ "use strict";const n=require("react/jsx-runtime"),I=require("react"),h=require("./heading-drD5ugCC.js"),d=require("./link-Dzqd0QuD.js"),H=require("./paragraph-B8HFdNne.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-IejAKqm2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RichText-BAVZadzi.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>&#8220;{children}&#8221;</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-IejAKqm2.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>&#8220;{children}&#8221;</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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"}
@@ -2,7 +2,7 @@ import { jsxs as H, jsx as g, Fragment as de } from "react/jsx-runtime";
2
2
  import { useRef as D, useCallback as pe, useEffect as me, useState as U, forwardRef as be, cloneElement as fe } from "react";
3
3
  import { l as ve } from "./chevron-down.es-PCIIj6oG.mjs";
4
4
  import { L as V } from "./listbox-CtV-Vcmy.mjs";
5
- import { i as _e } from "./text-field-D0e-cRbG.mjs";
5
+ import { i as _e } from "./text-field-C9LX7LBf.mjs";
6
6
  import { c as xe } from "./bind-CU-R61T-.mjs";
7
7
  const he = {
8
8
  "purpur-autocomplete": "_purpur-autocomplete_dgjyz_1",
@@ -225,4 +225,4 @@ export {
225
225
  Ie as A,
226
226
  ge as u
227
227
  };
228
- //# sourceMappingURL=autocomplete-CmLzmWp4.mjs.map
228
+ //# sourceMappingURL=autocomplete-C6AqdYaZ.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"autocomplete-CmLzmWp4.mjs","sources":["../../../components/autocomplete/src/utils.ts","../../../components/autocomplete/src/useAutocomplete.ts","../../../components/autocomplete/src/autocomplete.tsx"],"sourcesContent":["import { type RefObject, useCallback, useEffect, useRef } from \"react\";\n\n// Used to \"merge\" \"intersection types\". Used to get comments on the props to the docs.\nexport type Prettify<T> = {\n [K in keyof T]: T[K];\n} & {};\n\nexport const useRefObject = <T>(value: T): RefObject<T> => {\n return useRef<T>(value) as RefObject<T>;\n};\n\nexport const useOnClickOutside = (element: HTMLElement | null, callback: () => void) => {\n const handleClickOutside = useCallback(\n (event: MouseEvent) => {\n if (element && !element.contains(event.target as Node)) {\n callback();\n }\n },\n [callback, element]\n );\n\n useEffect(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [handleClickOutside]);\n};\n","import type { CSSProperties, ReactNode } from \"react\";\nimport { useRef, useState } from \"react\";\nimport type { BaseProps } from \"@purpur/common-types\";\nimport type { ListboxItemProps, ListboxProps } from \"@purpur/listbox\";\n\nimport { useOnClickOutside, useRefObject } from \"./utils\";\n\nexport type AutocompleteOption = {\n label: string;\n id: string;\n value?: string;\n disabled?: boolean;\n};\n\nexport type InputProps = Omit<BaseProps<\"input\">, \"onFocus\" | \"onMouseDown\"> & {\n onFocus: (event: React.FocusEvent<HTMLInputElement> | undefined) => void;\n onMouseDown: (event: React.MouseEvent<HTMLInputElement> | undefined) => void;\n};\n\ntype ComboboxProps = {\n /*\n * Set to get combobox features. Use in combination with `noOptionsText`, `comboboxButtonAriaLabel` and Purpur TextField.\n */\n combobox: true;\n /**\n * An accessible label for the button that toggles the list of options for a combobox.\n * */\n comboboxButtonAriaLabel: string;\n /*\n * Shown when there are no options to show. Will be displayed inside a listbox item.\n */\n noOptionsText: ReactNode;\n};\n\ntype NoComboboxProps = {\n combobox?: never;\n comboboxButtonAriaLabel?: never;\n /*\n * Shown when there are no options to show. Will be displayed inside a listbox item.\n */\n noOptionsText?: ReactNode;\n};\n\nexport type UseAutocompleteResult<T extends AutocompleteOption> = {\n /*\n * Set to highlight the first option in the listbox when the input is focused.\n */\n highlightFirstOption?: boolean;\n /*\n * The default input value. Only to use when the input is uncontrolled.\n */\n defaultInputValue?: string;\n /*\n * The input value. Use this to control the input value.\n */\n inputValue?: string;\n /*\n * Invoked for each option. Use to control which options are shown.\n */\n filterOption?: (inputValue: string | undefined, option: T) => boolean;\n /*\n * Id will be used to prefix id:s of all elements.\n */\n id: string;\n /*\n * The label of the listbox (dropdown) displaying the options.\n */\n listboxLabel: string;\n /*\n * The height of the listbox. Number will be interpreted as px value. defaults to `calc(2 * var(--purpur-spacing-1200))`.\n */\n listboxMaxHeight?: string | number;\n /*\n * NOTE! Always use this instead of onBlur directly on the input element. Event handler invoked on input blur.\n */\n onInputBlur?: React.FocusEventHandler<HTMLInputElement>;\n /*\n * NOTE! Always use this instead of onChange directly on the input element. Event handler invoked when the input value changes.\n */\n onInputChange?: (value: string) => void;\n /*\n * NOTE! Always use this instead of onFocus directly on the input element. Event handler invoked on input focus.\n */\n onInputFocus?: (event: React.FocusEvent<HTMLInputElement> | undefined) => undefined;\n /*\n * NOTE! Always use this instead of onKeyDown directly on the input element. Event handler invoked on input key down.\n */\n onInputKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;\n /*\n * NOTE! Always use this instead of onMouseDown directly on the input element. Event handler invoked on input mouse down.\n */\n onInputMouseDown?: (event: React.MouseEvent<HTMLInputElement> | undefined) => undefined;\n /*\n * Set to open the listbox when input gets focus.\n */\n openOnFocus?: boolean;\n /*\n * Event handler invoked when an option is selected.\n */\n onSelect?: (option: T | undefined) => void;\n /*\n * The list of options. Could include custom props.\n */\n options: T[];\n /*\n * The selected option.\n */\n selectedOption?: T;\n [\"data-testid\"]?: string;\n} & (ComboboxProps | NoComboboxProps);\n\nexport const useAutocomplete = <T extends AutocompleteOption>({\n combobox,\n comboboxButtonAriaLabel,\n highlightFirstOption,\n defaultInputValue,\n inputValue,\n filterOption,\n id,\n listboxLabel,\n listboxMaxHeight,\n onInputBlur,\n onInputChange,\n onInputFocus,\n onInputKeyDown,\n onInputMouseDown,\n openOnFocus,\n noOptionsText,\n onSelect,\n options,\n selectedOption,\n [\"data-testid\"]: dataTestid,\n}: UseAutocompleteResult<T>) => {\n const [internalInputValue, setInternalInputValue] = useState(\n ((typeof inputValue === \"string\" ? inputValue : defaultInputValue) || selectedOption?.label) ??\n \"\"\n );\n const definiteInputValue = typeof inputValue === \"string\" ? inputValue : internalInputValue;\n const [highlightedOption, setHighlightedOption] = useState<\n (T & { isSetByClickEvent?: false }) | undefined\n >(highlightFirstOption ? options[0] : undefined);\n const inputRef = useRef<HTMLInputElement>(null);\n const internalRef = useRefObject<HTMLDivElement | null>(null);\n const listboxRef = useRef<HTMLUListElement>(null);\n const optionRefs = useRef<Record<string, HTMLLIElement>>({});\n const [listboxIsOpen, setListboxIsOpen] = useState(false);\n\n function getTestId(name: string) {\n return dataTestid ? `${dataTestid}-${name}` : undefined;\n }\n\n const closeListbox = () => {\n setListboxIsOpen(false);\n setHighlightedOption(undefined);\n };\n\n useOnClickOutside(internalRef.current, closeListbox);\n\n const openListbox = ({ eventType }: { eventType: \"CLICK\" | \"KEYBOARD\" }) => {\n setListboxIsOpen(true);\n if (selectedOption) {\n requestAnimationFrame(() => {\n const isSetByClickEvent = eventType === \"CLICK\";\n setHighlightedOption({ ...selectedOption, isSetByClickEvent });\n scrollOptionIntoView(optionRefs.current[selectedOption.id]);\n });\n }\n };\n\n const filterOptions = (searchTerm: string | undefined) => {\n if (filterOption) {\n return options.filter((option) => filterOption(searchTerm, option));\n }\n\n if (!searchTerm) {\n return options;\n }\n\n const searchTermChunks = searchTerm.toUpperCase().split(\" \") || [];\n return options.filter((option) =>\n searchTermChunks.every((chunk) =>\n (option.value || option.label).toUpperCase().includes(chunk)\n )\n );\n };\n\n const getOptionsToShow = (searchTerm: string | undefined): (T | undefined)[] => {\n return selectedOption && selectedOption?.label === searchTerm\n ? options\n : filterOptions(searchTerm);\n };\n\n const optionsToShow = getOptionsToShow(definiteInputValue);\n\n const populateInputField = (value: string) => {\n onInputChange?.(value);\n setInternalInputValue(value);\n };\n\n const scrollOptionIntoView = (option: HTMLLIElement | undefined) => {\n if (option) {\n const optionRect = option.getBoundingClientRect();\n const listboxRect = listboxRef.current?.getBoundingClientRect() || { top: 0, bottom: 0 };\n const isOptionOutsideView =\n optionRect.top < listboxRect.top || optionRect.bottom > listboxRect.bottom;\n if (isOptionOutsideView) {\n option.scrollIntoView({ block: \"nearest\" });\n }\n }\n };\n\n const selectOption = (option: T | undefined) => {\n if (option) {\n inputRef.current?.focus();\n populateInputField(option.label);\n onSelect?.(option);\n }\n closeListbox();\n };\n\n const findNextOption = (key: \"ArrowUp\" | \"ArrowDown\"): T | undefined => {\n const index =\n highlightFirstOption && !highlightedOption\n ? 0\n : optionsToShow.findIndex((option) => option && highlightedOption?.id === option.id);\n\n const optionsLength = optionsToShow.length;\n\n return key === \"ArrowDown\"\n ? optionsToShow[(index ?? -1) + 1] || optionsToShow[0]\n : optionsToShow[(index ?? optionsLength) - 1] || optionsToShow[optionsLength - 1];\n };\n\n const showListbox = listboxIsOpen && (!!optionsToShow.length || !!noOptionsText);\n\n const highlightNextOption = (key: \"ArrowUp\" | \"ArrowDown\") => {\n !showListbox && openListbox({ eventType: \"KEYBOARD\" });\n const nextOption = findNextOption(key);\n\n setHighlightedOption(nextOption);\n nextOption && scrollOptionIntoView(optionRefs.current[nextOption.id]);\n };\n\n const handleOnKeyDown: React.KeyboardEventHandler<HTMLInputElement> = (event) => {\n onInputKeyDown?.(event);\n switch (event.key) {\n case \"ArrowUp\":\n case \"ArrowDown\":\n event.preventDefault(); // Preventing default to not move cursor in input\n highlightNextOption(event.key);\n break;\n case \"Enter\": {\n const optionToSelect = highlightedOption || (highlightFirstOption ? options[0] : undefined);\n showListbox && selectOption(optionToSelect);\n !showListbox && openListbox({ eventType: \"KEYBOARD\" });\n break;\n }\n case \"Escape\":\n case \"Tab\":\n closeListbox();\n break;\n }\n };\n\n const handleOnChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {\n const nextOptionsToShow = getOptionsToShow(e.target.value);\n populateInputField(e.target.value);\n setHighlightedOption(undefined);\n !showListbox && openListbox({ eventType: \"KEYBOARD\" });\n highlightFirstOption &&\n nextOptionsToShow[0] &&\n scrollOptionIntoView(optionRefs.current[nextOptionsToShow[0].id]);\n };\n\n const handleOnMouseDown = (event: React.MouseEvent<HTMLInputElement> | undefined) => {\n onInputMouseDown?.(event);\n showListbox ? closeListbox() : openListbox({ eventType: \"CLICK\" });\n };\n\n const handleOnFocus = (event: React.FocusEvent<HTMLInputElement> | undefined) => {\n onInputFocus?.(event);\n !listboxIsOpen && openOnFocus && openListbox({ eventType: \"KEYBOARD\" });\n inputRef.current?.select();\n };\n\n const handleOnBlur: React.FocusEventHandler<HTMLInputElement> = (event) => {\n onInputBlur?.(event);\n // Use a timeout to allow click events on the listbox to fire before this check\n setTimeout(() => {\n if (\n !inputRef.current?.contains(document.activeElement) &&\n !listboxRef.current?.contains(document.activeElement)\n ) {\n closeListbox();\n\n // If the blur happened due to a click inside the listbox for a combobox, don't reset the value\n if (combobox) {\n populateInputField(selectedOption ? selectedOption.label : \"\");\n }\n }\n });\n };\n\n const listboxStyle: CSSProperties = {\n maxHeight: typeof listboxMaxHeight === \"number\" ? `${listboxMaxHeight}px` : listboxMaxHeight,\n };\n\n const listboxProps: ListboxProps = {\n \"aria-label\": listboxLabel,\n \"aria-expanded\": showListbox,\n \"data-testid\": getTestId(\"listbox\"),\n id: `${id}-listbox`,\n ref: listboxRef,\n onMouseLeave: () => setHighlightedOption(undefined),\n style: listboxMaxHeight ? listboxStyle : undefined,\n };\n\n const createListboxItemId = (option: T) => `${id}-listbox-item-${option.id}`;\n\n const getListBoxItemProps = (option: T, index: number): ListboxItemProps => {\n const handleOnMouseMove = () =>\n option.id !== highlightedOption?.id &&\n setHighlightedOption({ ...option, isSetByClickEvent: true });\n\n const highlighted =\n (option.id === highlightedOption?.id ||\n (!!highlightFirstOption && !highlightedOption && index === 0)) &&\n !highlightedOption?.isSetByClickEvent;\n\n return {\n \"data-testid\": getTestId(`listbox-item-${option.id}`),\n id: createListboxItemId(option),\n key: option.id,\n onMouseMove: handleOnMouseMove,\n onMouseUp: () => selectOption(option),\n ref: (el) => {\n if (el) {\n optionRefs.current[option.id] = el;\n }\n },\n tabIndex: -1,\n selected: option.id === selectedOption?.id,\n disabled: option.disabled,\n highlighted,\n hovered: option.id === highlightedOption?.id && !!highlightedOption?.isSetByClickEvent,\n };\n };\n\n const inputProps: InputProps = {\n \"aria-activedescendant\": highlightedOption ? createListboxItemId(highlightedOption) : undefined,\n \"aria-autocomplete\": \"list\",\n \"aria-controls\": listboxProps.id,\n \"data-testid\": getTestId(\"input\"),\n autoComplete: \"off\",\n id: `${id}-input`,\n onChange: handleOnChange,\n onMouseDown: handleOnMouseDown,\n onFocus: handleOnFocus,\n onKeyDown: handleOnKeyDown,\n onBlur: handleOnBlur,\n ref: inputRef,\n role: \"combobox\",\n value: definiteInputValue,\n };\n\n return {\n id,\n inputProps,\n internalRef,\n optionsToShow,\n showListbox,\n noOptionsText,\n combobox,\n comboboxButtonAriaLabel,\n getListBoxItemProps,\n listboxProps,\n };\n};\n","import type { ComponentPropsWithRef, ForwardedRef, ReactNode } from \"react\";\nimport React, { cloneElement, forwardRef } from \"react\";\nimport { IconChevronDown } from \"@purpur/icon/chevron-down\";\nimport { Listbox } from \"@purpur/listbox\";\nimport { isTextField } from \"@purpur/text-field\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./autocomplete.module.scss\";\nimport type { AutocompleteOption, UseAutocompleteResult } from \"./useAutocomplete\";\nimport { useAutocomplete } from \"./useAutocomplete\";\nimport type { Prettify } from \"./utils\";\n\nconst cx = c.bind(styles);\n\ntype AutocompleteProps<T extends AutocompleteOption> = Prettify<\n UseAutocompleteResult<T> & {\n className?: string;\n /**\n * Render the input. `props` are native input props\n */\n renderInput: (props: ComponentPropsWithRef<\"input\">) => ReactNode;\n /**\n * Invoked for each given option. Use to customize the rendering of the options\n */\n renderOption?: (option: T) => ReactNode;\n }\n>;\n\nconst rootClassName = \"purpur-autocomplete\";\n\nconst AutocompleteComponent = <T extends AutocompleteOption>(\n { className, renderInput, renderOption, ...useAutocompleteProps }: AutocompleteProps<T>,\n ref: ForwardedRef<HTMLDivElement>\n) => {\n const {\n id,\n inputProps,\n internalRef,\n optionsToShow,\n showListbox,\n noOptionsText,\n combobox,\n comboboxButtonAriaLabel,\n getListBoxItemProps,\n listboxProps,\n } = useAutocomplete(useAutocompleteProps);\n\n const renderListboxItem = (option: T, index: number) => {\n const { key, ...listboxItemProps } = getListBoxItemProps(option, index);\n\n return (\n <Listbox.Item key={key} {...listboxItemProps}>\n {renderOption ? renderOption?.(option) : option.label}\n </Listbox.Item>\n );\n };\n\n const setRootRef = (node: HTMLDivElement | null) => {\n internalRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n };\n\n const getInputComponent = () => {\n const input = renderInput(inputProps);\n const isCombobox =\n combobox && comboboxButtonAriaLabel && noOptionsText && input && isTextField(input);\n\n if (isCombobox) {\n const endAdornment = (\n <>\n {input.props.endAdornment}\n <button\n data-testid=\"chevron button\"\n type=\"button\"\n className={cx(`${rootClassName}__chevron-button`)}\n onClick={() => {\n inputProps.onFocus(undefined);\n inputProps.onMouseDown(undefined);\n }}\n aria-label={comboboxButtonAriaLabel}\n aria-expanded={showListbox}\n aria-controls={listboxProps.id}\n >\n <IconChevronDown\n size=\"sm\"\n className={cx(`${rootClassName}__chevron-icon`, {\n [`${rootClassName}__chevron-icon--up`]: showListbox,\n })}\n />\n </button>\n </>\n );\n\n return cloneElement(input, { endAdornment });\n }\n\n return input;\n };\n\n return (\n <div id={id} ref={setRootRef} className={cx([rootClassName, className])}>\n {getInputComponent()}\n {showListbox && (\n <Listbox {...listboxProps} className={cx(`${rootClassName}__listbox`)}>\n {!optionsToShow.length ? (\n <Listbox.Item noninteractive>{noOptionsText}</Listbox.Item>\n ) : (\n optionsToShow.filter((option): option is T => !!option).map(renderListboxItem)\n )}\n </Listbox>\n )}\n </div>\n );\n};\n\n/* @deprecated use `Dropdown` or `SearchField` instead, this is only exported for backwards compatibility and will be removed in a future release */\nexport const Autocomplete = forwardRef(AutocompleteComponent);\nAutocomplete.displayName = \"Autocomplete\";\n\nexport type {\n AutocompleteOption,\n UseAutocompleteResult as UseAutocompleteOptions,\n} from \"./useAutocomplete\";\nexport { useAutocomplete } from \"./useAutocomplete\";\n"],"names":["useRefObject","value","useRef","useOnClickOutside","element","callback","handleClickOutside","useCallback","event","useEffect","useAutocomplete","combobox","comboboxButtonAriaLabel","highlightFirstOption","defaultInputValue","inputValue","filterOption","id","listboxLabel","listboxMaxHeight","onInputBlur","onInputChange","onInputFocus","onInputKeyDown","onInputMouseDown","openOnFocus","noOptionsText","onSelect","options","selectedOption","dataTestid","internalInputValue","setInternalInputValue","useState","definiteInputValue","highlightedOption","setHighlightedOption","inputRef","internalRef","listboxRef","optionRefs","listboxIsOpen","setListboxIsOpen","getTestId","name","closeListbox","openListbox","eventType","scrollOptionIntoView","filterOptions","searchTerm","option","searchTermChunks","chunk","getOptionsToShow","optionsToShow","populateInputField","optionRect","listboxRect","selectOption","findNextOption","key","index","optionsLength","showListbox","highlightNextOption","nextOption","handleOnKeyDown","optionToSelect","handleOnChange","nextOptionsToShow","handleOnMouseDown","handleOnFocus","handleOnBlur","listboxStyle","listboxProps","createListboxItemId","getListBoxItemProps","handleOnMouseMove","highlighted","el","inputProps","cx","c","styles","rootClassName","AutocompleteComponent","className","renderInput","renderOption","useAutocompleteProps","ref","renderListboxItem","listboxItemProps","jsx","Listbox","setRootRef","node","getInputComponent","input","isTextField","endAdornment","jsxs","Fragment","IconChevronDown","cloneElement","Autocomplete","forwardRef"],"mappings":"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"}
1
+ {"version":3,"file":"autocomplete-C6AqdYaZ.mjs","sources":["../../../components/autocomplete/src/utils.ts","../../../components/autocomplete/src/useAutocomplete.ts","../../../components/autocomplete/src/autocomplete.tsx"],"sourcesContent":["import { type RefObject, useCallback, useEffect, useRef } from \"react\";\n\n// Used to \"merge\" \"intersection types\". Used to get comments on the props to the docs.\nexport type Prettify<T> = {\n [K in keyof T]: T[K];\n} & {};\n\nexport const useRefObject = <T>(value: T): RefObject<T> => {\n return useRef<T>(value) as RefObject<T>;\n};\n\nexport const useOnClickOutside = (element: HTMLElement | null, callback: () => void) => {\n const handleClickOutside = useCallback(\n (event: MouseEvent) => {\n if (element && !element.contains(event.target as Node)) {\n callback();\n }\n },\n [callback, element]\n );\n\n useEffect(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [handleClickOutside]);\n};\n","import type { CSSProperties, ReactNode } from \"react\";\nimport { useRef, useState } from \"react\";\nimport type { BaseProps } from \"@purpur/common-types\";\nimport type { ListboxItemProps, ListboxProps } from \"@purpur/listbox\";\n\nimport { useOnClickOutside, useRefObject } from \"./utils\";\n\nexport type AutocompleteOption = {\n label: string;\n id: string;\n value?: string;\n disabled?: boolean;\n};\n\nexport type InputProps = Omit<BaseProps<\"input\">, \"onFocus\" | \"onMouseDown\"> & {\n onFocus: (event: React.FocusEvent<HTMLInputElement> | undefined) => void;\n onMouseDown: (event: React.MouseEvent<HTMLInputElement> | undefined) => void;\n};\n\ntype ComboboxProps = {\n /*\n * Set to get combobox features. Use in combination with `noOptionsText`, `comboboxButtonAriaLabel` and Purpur TextField.\n */\n combobox: true;\n /**\n * An accessible label for the button that toggles the list of options for a combobox.\n * */\n comboboxButtonAriaLabel: string;\n /*\n * Shown when there are no options to show. Will be displayed inside a listbox item.\n */\n noOptionsText: ReactNode;\n};\n\ntype NoComboboxProps = {\n combobox?: never;\n comboboxButtonAriaLabel?: never;\n /*\n * Shown when there are no options to show. Will be displayed inside a listbox item.\n */\n noOptionsText?: ReactNode;\n};\n\nexport type UseAutocompleteResult<T extends AutocompleteOption> = {\n /*\n * Set to highlight the first option in the listbox when the input is focused.\n */\n highlightFirstOption?: boolean;\n /*\n * The default input value. Only to use when the input is uncontrolled.\n */\n defaultInputValue?: string;\n /*\n * The input value. Use this to control the input value.\n */\n inputValue?: string;\n /*\n * Invoked for each option. Use to control which options are shown.\n */\n filterOption?: (inputValue: string | undefined, option: T) => boolean;\n /*\n * Id will be used to prefix id:s of all elements.\n */\n id: string;\n /*\n * The label of the listbox (dropdown) displaying the options.\n */\n listboxLabel: string;\n /*\n * The height of the listbox. Number will be interpreted as px value. defaults to `calc(2 * var(--purpur-spacing-1200))`.\n */\n listboxMaxHeight?: string | number;\n /*\n * NOTE! Always use this instead of onBlur directly on the input element. Event handler invoked on input blur.\n */\n onInputBlur?: React.FocusEventHandler<HTMLInputElement>;\n /*\n * NOTE! Always use this instead of onChange directly on the input element. Event handler invoked when the input value changes.\n */\n onInputChange?: (value: string) => void;\n /*\n * NOTE! Always use this instead of onFocus directly on the input element. Event handler invoked on input focus.\n */\n onInputFocus?: (event: React.FocusEvent<HTMLInputElement> | undefined) => undefined;\n /*\n * NOTE! Always use this instead of onKeyDown directly on the input element. Event handler invoked on input key down.\n */\n onInputKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;\n /*\n * NOTE! Always use this instead of onMouseDown directly on the input element. Event handler invoked on input mouse down.\n */\n onInputMouseDown?: (event: React.MouseEvent<HTMLInputElement> | undefined) => undefined;\n /*\n * Set to open the listbox when input gets focus.\n */\n openOnFocus?: boolean;\n /*\n * Event handler invoked when an option is selected.\n */\n onSelect?: (option: T | undefined) => void;\n /*\n * The list of options. Could include custom props.\n */\n options: T[];\n /*\n * The selected option.\n */\n selectedOption?: T;\n [\"data-testid\"]?: string;\n} & (ComboboxProps | NoComboboxProps);\n\nexport const useAutocomplete = <T extends AutocompleteOption>({\n combobox,\n comboboxButtonAriaLabel,\n highlightFirstOption,\n defaultInputValue,\n inputValue,\n filterOption,\n id,\n listboxLabel,\n listboxMaxHeight,\n onInputBlur,\n onInputChange,\n onInputFocus,\n onInputKeyDown,\n onInputMouseDown,\n openOnFocus,\n noOptionsText,\n onSelect,\n options,\n selectedOption,\n [\"data-testid\"]: dataTestid,\n}: UseAutocompleteResult<T>) => {\n const [internalInputValue, setInternalInputValue] = useState(\n ((typeof inputValue === \"string\" ? inputValue : defaultInputValue) || selectedOption?.label) ??\n \"\"\n );\n const definiteInputValue = typeof inputValue === \"string\" ? inputValue : internalInputValue;\n const [highlightedOption, setHighlightedOption] = useState<\n (T & { isSetByClickEvent?: false }) | undefined\n >(highlightFirstOption ? options[0] : undefined);\n const inputRef = useRef<HTMLInputElement>(null);\n const internalRef = useRefObject<HTMLDivElement | null>(null);\n const listboxRef = useRef<HTMLUListElement>(null);\n const optionRefs = useRef<Record<string, HTMLLIElement>>({});\n const [listboxIsOpen, setListboxIsOpen] = useState(false);\n\n function getTestId(name: string) {\n return dataTestid ? `${dataTestid}-${name}` : undefined;\n }\n\n const closeListbox = () => {\n setListboxIsOpen(false);\n setHighlightedOption(undefined);\n };\n\n useOnClickOutside(internalRef.current, closeListbox);\n\n const openListbox = ({ eventType }: { eventType: \"CLICK\" | \"KEYBOARD\" }) => {\n setListboxIsOpen(true);\n if (selectedOption) {\n requestAnimationFrame(() => {\n const isSetByClickEvent = eventType === \"CLICK\";\n setHighlightedOption({ ...selectedOption, isSetByClickEvent });\n scrollOptionIntoView(optionRefs.current[selectedOption.id]);\n });\n }\n };\n\n const filterOptions = (searchTerm: string | undefined) => {\n if (filterOption) {\n return options.filter((option) => filterOption(searchTerm, option));\n }\n\n if (!searchTerm) {\n return options;\n }\n\n const searchTermChunks = searchTerm.toUpperCase().split(\" \") || [];\n return options.filter((option) =>\n searchTermChunks.every((chunk) =>\n (option.value || option.label).toUpperCase().includes(chunk)\n )\n );\n };\n\n const getOptionsToShow = (searchTerm: string | undefined): (T | undefined)[] => {\n return selectedOption && selectedOption?.label === searchTerm\n ? options\n : filterOptions(searchTerm);\n };\n\n const optionsToShow = getOptionsToShow(definiteInputValue);\n\n const populateInputField = (value: string) => {\n onInputChange?.(value);\n setInternalInputValue(value);\n };\n\n const scrollOptionIntoView = (option: HTMLLIElement | undefined) => {\n if (option) {\n const optionRect = option.getBoundingClientRect();\n const listboxRect = listboxRef.current?.getBoundingClientRect() || { top: 0, bottom: 0 };\n const isOptionOutsideView =\n optionRect.top < listboxRect.top || optionRect.bottom > listboxRect.bottom;\n if (isOptionOutsideView) {\n option.scrollIntoView({ block: \"nearest\" });\n }\n }\n };\n\n const selectOption = (option: T | undefined) => {\n if (option) {\n inputRef.current?.focus();\n populateInputField(option.label);\n onSelect?.(option);\n }\n closeListbox();\n };\n\n const findNextOption = (key: \"ArrowUp\" | \"ArrowDown\"): T | undefined => {\n const index =\n highlightFirstOption && !highlightedOption\n ? 0\n : optionsToShow.findIndex((option) => option && highlightedOption?.id === option.id);\n\n const optionsLength = optionsToShow.length;\n\n return key === \"ArrowDown\"\n ? optionsToShow[(index ?? -1) + 1] || optionsToShow[0]\n : optionsToShow[(index ?? optionsLength) - 1] || optionsToShow[optionsLength - 1];\n };\n\n const showListbox = listboxIsOpen && (!!optionsToShow.length || !!noOptionsText);\n\n const highlightNextOption = (key: \"ArrowUp\" | \"ArrowDown\") => {\n !showListbox && openListbox({ eventType: \"KEYBOARD\" });\n const nextOption = findNextOption(key);\n\n setHighlightedOption(nextOption);\n nextOption && scrollOptionIntoView(optionRefs.current[nextOption.id]);\n };\n\n const handleOnKeyDown: React.KeyboardEventHandler<HTMLInputElement> = (event) => {\n onInputKeyDown?.(event);\n switch (event.key) {\n case \"ArrowUp\":\n case \"ArrowDown\":\n event.preventDefault(); // Preventing default to not move cursor in input\n highlightNextOption(event.key);\n break;\n case \"Enter\": {\n const optionToSelect = highlightedOption || (highlightFirstOption ? options[0] : undefined);\n showListbox && selectOption(optionToSelect);\n !showListbox && openListbox({ eventType: \"KEYBOARD\" });\n break;\n }\n case \"Escape\":\n case \"Tab\":\n closeListbox();\n break;\n }\n };\n\n const handleOnChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {\n const nextOptionsToShow = getOptionsToShow(e.target.value);\n populateInputField(e.target.value);\n setHighlightedOption(undefined);\n !showListbox && openListbox({ eventType: \"KEYBOARD\" });\n highlightFirstOption &&\n nextOptionsToShow[0] &&\n scrollOptionIntoView(optionRefs.current[nextOptionsToShow[0].id]);\n };\n\n const handleOnMouseDown = (event: React.MouseEvent<HTMLInputElement> | undefined) => {\n onInputMouseDown?.(event);\n showListbox ? closeListbox() : openListbox({ eventType: \"CLICK\" });\n };\n\n const handleOnFocus = (event: React.FocusEvent<HTMLInputElement> | undefined) => {\n onInputFocus?.(event);\n !listboxIsOpen && openOnFocus && openListbox({ eventType: \"KEYBOARD\" });\n inputRef.current?.select();\n };\n\n const handleOnBlur: React.FocusEventHandler<HTMLInputElement> = (event) => {\n onInputBlur?.(event);\n // Use a timeout to allow click events on the listbox to fire before this check\n setTimeout(() => {\n if (\n !inputRef.current?.contains(document.activeElement) &&\n !listboxRef.current?.contains(document.activeElement)\n ) {\n closeListbox();\n\n // If the blur happened due to a click inside the listbox for a combobox, don't reset the value\n if (combobox) {\n populateInputField(selectedOption ? selectedOption.label : \"\");\n }\n }\n });\n };\n\n const listboxStyle: CSSProperties = {\n maxHeight: typeof listboxMaxHeight === \"number\" ? `${listboxMaxHeight}px` : listboxMaxHeight,\n };\n\n const listboxProps: ListboxProps = {\n \"aria-label\": listboxLabel,\n \"aria-expanded\": showListbox,\n \"data-testid\": getTestId(\"listbox\"),\n id: `${id}-listbox`,\n ref: listboxRef,\n onMouseLeave: () => setHighlightedOption(undefined),\n style: listboxMaxHeight ? listboxStyle : undefined,\n };\n\n const createListboxItemId = (option: T) => `${id}-listbox-item-${option.id}`;\n\n const getListBoxItemProps = (option: T, index: number): ListboxItemProps => {\n const handleOnMouseMove = () =>\n option.id !== highlightedOption?.id &&\n setHighlightedOption({ ...option, isSetByClickEvent: true });\n\n const highlighted =\n (option.id === highlightedOption?.id ||\n (!!highlightFirstOption && !highlightedOption && index === 0)) &&\n !highlightedOption?.isSetByClickEvent;\n\n return {\n \"data-testid\": getTestId(`listbox-item-${option.id}`),\n id: createListboxItemId(option),\n key: option.id,\n onMouseMove: handleOnMouseMove,\n onMouseUp: () => selectOption(option),\n ref: (el) => {\n if (el) {\n optionRefs.current[option.id] = el;\n }\n },\n tabIndex: -1,\n selected: option.id === selectedOption?.id,\n disabled: option.disabled,\n highlighted,\n hovered: option.id === highlightedOption?.id && !!highlightedOption?.isSetByClickEvent,\n };\n };\n\n const inputProps: InputProps = {\n \"aria-activedescendant\": highlightedOption ? createListboxItemId(highlightedOption) : undefined,\n \"aria-autocomplete\": \"list\",\n \"aria-controls\": listboxProps.id,\n \"data-testid\": getTestId(\"input\"),\n autoComplete: \"off\",\n id: `${id}-input`,\n onChange: handleOnChange,\n onMouseDown: handleOnMouseDown,\n onFocus: handleOnFocus,\n onKeyDown: handleOnKeyDown,\n onBlur: handleOnBlur,\n ref: inputRef,\n role: \"combobox\",\n value: definiteInputValue,\n };\n\n return {\n id,\n inputProps,\n internalRef,\n optionsToShow,\n showListbox,\n noOptionsText,\n combobox,\n comboboxButtonAriaLabel,\n getListBoxItemProps,\n listboxProps,\n };\n};\n","import type { ComponentPropsWithRef, ForwardedRef, ReactNode } from \"react\";\nimport React, { cloneElement, forwardRef } from \"react\";\nimport { IconChevronDown } from \"@purpur/icon/chevron-down\";\nimport { Listbox } from \"@purpur/listbox\";\nimport { isTextField } from \"@purpur/text-field\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./autocomplete.module.scss\";\nimport type { AutocompleteOption, UseAutocompleteResult } from \"./useAutocomplete\";\nimport { useAutocomplete } from \"./useAutocomplete\";\nimport type { Prettify } from \"./utils\";\n\nconst cx = c.bind(styles);\n\ntype AutocompleteProps<T extends AutocompleteOption> = Prettify<\n UseAutocompleteResult<T> & {\n className?: string;\n /**\n * Render the input. `props` are native input props\n */\n renderInput: (props: ComponentPropsWithRef<\"input\">) => ReactNode;\n /**\n * Invoked for each given option. Use to customize the rendering of the options\n */\n renderOption?: (option: T) => ReactNode;\n }\n>;\n\nconst rootClassName = \"purpur-autocomplete\";\n\nconst AutocompleteComponent = <T extends AutocompleteOption>(\n { className, renderInput, renderOption, ...useAutocompleteProps }: AutocompleteProps<T>,\n ref: ForwardedRef<HTMLDivElement>\n) => {\n const {\n id,\n inputProps,\n internalRef,\n optionsToShow,\n showListbox,\n noOptionsText,\n combobox,\n comboboxButtonAriaLabel,\n getListBoxItemProps,\n listboxProps,\n } = useAutocomplete(useAutocompleteProps);\n\n const renderListboxItem = (option: T, index: number) => {\n const { key, ...listboxItemProps } = getListBoxItemProps(option, index);\n\n return (\n <Listbox.Item key={key} {...listboxItemProps}>\n {renderOption ? renderOption?.(option) : option.label}\n </Listbox.Item>\n );\n };\n\n const setRootRef = (node: HTMLDivElement | null) => {\n internalRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n };\n\n const getInputComponent = () => {\n const input = renderInput(inputProps);\n const isCombobox =\n combobox && comboboxButtonAriaLabel && noOptionsText && input && isTextField(input);\n\n if (isCombobox) {\n const endAdornment = (\n <>\n {input.props.endAdornment}\n <button\n data-testid=\"chevron button\"\n type=\"button\"\n className={cx(`${rootClassName}__chevron-button`)}\n onClick={() => {\n inputProps.onFocus(undefined);\n inputProps.onMouseDown(undefined);\n }}\n aria-label={comboboxButtonAriaLabel}\n aria-expanded={showListbox}\n aria-controls={listboxProps.id}\n >\n <IconChevronDown\n size=\"sm\"\n className={cx(`${rootClassName}__chevron-icon`, {\n [`${rootClassName}__chevron-icon--up`]: showListbox,\n })}\n />\n </button>\n </>\n );\n\n return cloneElement(input, { endAdornment });\n }\n\n return input;\n };\n\n return (\n <div id={id} ref={setRootRef} className={cx([rootClassName, className])}>\n {getInputComponent()}\n {showListbox && (\n <Listbox {...listboxProps} className={cx(`${rootClassName}__listbox`)}>\n {!optionsToShow.length ? (\n <Listbox.Item noninteractive>{noOptionsText}</Listbox.Item>\n ) : (\n optionsToShow.filter((option): option is T => !!option).map(renderListboxItem)\n )}\n </Listbox>\n )}\n </div>\n );\n};\n\n/* @deprecated use `Dropdown` or `SearchField` instead, this is only exported for backwards compatibility and will be removed in a future release */\nexport const Autocomplete = forwardRef(AutocompleteComponent);\nAutocomplete.displayName = \"Autocomplete\";\n\nexport type {\n AutocompleteOption,\n UseAutocompleteResult as UseAutocompleteOptions,\n} from \"./useAutocomplete\";\nexport { useAutocomplete } from \"./useAutocomplete\";\n"],"names":["useRefObject","value","useRef","useOnClickOutside","element","callback","handleClickOutside","useCallback","event","useEffect","useAutocomplete","combobox","comboboxButtonAriaLabel","highlightFirstOption","defaultInputValue","inputValue","filterOption","id","listboxLabel","listboxMaxHeight","onInputBlur","onInputChange","onInputFocus","onInputKeyDown","onInputMouseDown","openOnFocus","noOptionsText","onSelect","options","selectedOption","dataTestid","internalInputValue","setInternalInputValue","useState","definiteInputValue","highlightedOption","setHighlightedOption","inputRef","internalRef","listboxRef","optionRefs","listboxIsOpen","setListboxIsOpen","getTestId","name","closeListbox","openListbox","eventType","scrollOptionIntoView","filterOptions","searchTerm","option","searchTermChunks","chunk","getOptionsToShow","optionsToShow","populateInputField","optionRect","listboxRect","selectOption","findNextOption","key","index","optionsLength","showListbox","highlightNextOption","nextOption","handleOnKeyDown","optionToSelect","handleOnChange","nextOptionsToShow","handleOnMouseDown","handleOnFocus","handleOnBlur","listboxStyle","listboxProps","createListboxItemId","getListBoxItemProps","handleOnMouseMove","highlighted","el","inputProps","cx","c","styles","rootClassName","AutocompleteComponent","className","renderInput","renderOption","useAutocompleteProps","ref","renderListboxItem","listboxItemProps","jsx","Listbox","setRootRef","node","getInputComponent","input","isTextField","endAdornment","jsxs","Fragment","IconChevronDown","cloneElement","Autocomplete","forwardRef"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const p=require("react/jsx-runtime"),r=require("react"),de=require("./chevron-down.es-BMjgiS3F.js"),M=require("./listbox-lXO21cJV.js"),pe=require("./text-field-VW8ObP83.js"),be=require("./bind-DeUYJ6m9.js"),me={"purpur-autocomplete":"_purpur-autocomplete_dgjyz_1","purpur-autocomplete__listbox":"_purpur-autocomplete__listbox_dgjyz_4","purpur-autocomplete__chevron-button":"_purpur-autocomplete__chevron-button_dgjyz_9","purpur-autocomplete__chevron-icon":"_purpur-autocomplete__chevron-icon_dgjyz_15","purpur-autocomplete__chevron-icon--up":"_purpur-autocomplete__chevron-icon--up_dgjyz_20"},fe=i=>r.useRef(i),xe=(i,x)=>{const n=r.useCallback(_=>{i&&!i.contains(_.target)&&x()},[x,i]);r.useEffect(()=>(document.addEventListener("mousedown",n),()=>{document.removeEventListener("mousedown",n)}),[n])},Z=({combobox:i,comboboxButtonAriaLabel:x,highlightFirstOption:n,defaultInputValue:_,inputValue:u,filterOption:R,id:l,listboxLabel:S,listboxMaxHeight:b,onInputBlur:h,onInputChange:L,onInputFocus:D,onInputKeyDown:k,onInputMouseDown:$,openOnFocus:A,noOptionsText:E,onSelect:T,options:a,selectedOption:t,["data-testid"]:y})=>{const[C,K]=r.useState(((typeof u=="string"?u:_)||t?.label)??""),F=typeof u=="string"?u:C,[c,v]=r.useState(n?a[0]:void 0),B=r.useRef(null),U=fe(null),N=r.useRef(null),O=r.useRef({}),[V,Y]=r.useState(!1);function q(e){return y?`${y}-${e}`:void 0}const w=()=>{Y(!1),v(void 0)};xe(U.current,w);const g=({eventType:e})=>{Y(!0),t&&requestAnimationFrame(()=>{v({...t,isSetByClickEvent:e==="CLICK"}),z(O.current[t.id])})},ee=e=>{if(R)return a.filter(s=>R(e,s));if(!e)return a;const o=e.toUpperCase().split(" ")||[];return a.filter(s=>o.every(f=>(s.value||s.label).toUpperCase().includes(f)))},G=e=>t&&t?.label===e?a:ee(e),d=G(F),P=e=>{L?.(e),K(e)},z=e=>{if(e){const o=e.getBoundingClientRect(),s=N.current?.getBoundingClientRect()||{top:0,bottom:0};(o.top<s.top||o.bottom>s.bottom)&&e.scrollIntoView({block:"nearest"})}},J=e=>{e&&(B.current?.focus(),P(e.label),T?.(e)),w()},te=e=>{const o=n&&!c?0:d.findIndex(f=>f&&c?.id===f.id),s=d.length;return e==="ArrowDown"?d[(o??-1)+1]||d[0]:d[(o??s)-1]||d[s-1]},m=V&&(!!d.length||!!E),oe=e=>{!m&&g({eventType:"KEYBOARD"});const o=te(e);v(o),o&&z(O.current[o.id])},ne=e=>{switch(k?.(e),e.key){case"ArrowUp":case"ArrowDown":e.preventDefault(),oe(e.key);break;case"Enter":{const o=c||(n?a[0]:void 0);m&&J(o),!m&&g({eventType:"KEYBOARD"});break}case"Escape":case"Tab":w();break}},se=e=>{const o=G(e.target.value);P(e.target.value),v(void 0),!m&&g({eventType:"KEYBOARD"}),n&&o[0]&&z(O.current[o[0].id])},ce=e=>{$?.(e),m?w():g({eventType:"CLICK"})},re=e=>{D?.(e),!V&&A&&g({eventType:"KEYBOARD"}),B.current?.select()},ie=e=>{h?.(e),setTimeout(()=>{!B.current?.contains(document.activeElement)&&!N.current?.contains(document.activeElement)&&(w(),i&&P(t?t.label:""))})},ue={maxHeight:typeof b=="number"?`${b}px`:b},Q={"aria-label":S,"aria-expanded":m,"data-testid":q("listbox"),id:`${l}-listbox`,ref:N,onMouseLeave:()=>v(void 0),style:b?ue:void 0},W=e=>`${l}-listbox-item-${e.id}`,le=(e,o)=>{const s=()=>e.id!==c?.id&&v({...e,isSetByClickEvent:!0}),f=(e.id===c?.id||!!n&&!c&&o===0)&&!c?.isSetByClickEvent;return{"data-testid":q(`listbox-item-${e.id}`),id:W(e),key:e.id,onMouseMove:s,onMouseUp:()=>J(e),ref:X=>{X&&(O.current[e.id]=X)},tabIndex:-1,selected:e.id===t?.id,disabled:e.disabled,highlighted:f,hovered:e.id===c?.id&&!!c?.isSetByClickEvent}},ae={"aria-activedescendant":c?W(c):void 0,"aria-autocomplete":"list","aria-controls":Q.id,"data-testid":q("input"),autoComplete:"off",id:`${l}-input`,onChange:se,onMouseDown:ce,onFocus:re,onKeyDown:ne,onBlur:ie,ref:B,role:"combobox",value:F};return{id:l,inputProps:ae,internalRef:U,optionsToShow:d,showListbox:m,noOptionsText:E,combobox:i,comboboxButtonAriaLabel:x,getListBoxItemProps:le,listboxProps:Q}},j=be.c.bind(me),I="purpur-autocomplete",ve=({className:i,renderInput:x,renderOption:n,..._},u)=>{const{id:R,inputProps:l,internalRef:S,optionsToShow:b,showListbox:h,noOptionsText:L,combobox:D,comboboxButtonAriaLabel:k,getListBoxItemProps:$,listboxProps:A}=Z(_),E=(t,y)=>{const{key:C,...K}=$(t,y);return p.jsx(M.Listbox.Item,{...K,children:n?n?.(t):t.label},C)},T=t=>{S.current=t,typeof u=="function"?u(t):u&&(u.current=t)},a=()=>{const t=x(l);if(D&&k&&L&&t&&pe.isTextField(t)){const C=p.jsxs(p.Fragment,{children:[t.props.endAdornment,p.jsx("button",{"data-testid":"chevron button",type:"button",className:j(`${I}__chevron-button`),onClick:()=>{l.onFocus(void 0),l.onMouseDown(void 0)},"aria-label":k,"aria-expanded":h,"aria-controls":A.id,children:p.jsx(de.l,{size:"sm",className:j(`${I}__chevron-icon`,{[`${I}__chevron-icon--up`]:h})})})]});return r.cloneElement(t,{endAdornment:C})}return t};return p.jsxs("div",{id:R,ref:T,className:j([I,i]),children:[a(),h&&p.jsx(M.Listbox,{...A,className:j(`${I}__listbox`),children:b.length?b.filter(t=>!!t).map(E):p.jsx(M.Listbox.Item,{noninteractive:!0,children:L})})]})},H=r.forwardRef(ve);H.displayName="Autocomplete";exports.Autocomplete=H;exports.useAutocomplete=Z;
2
- //# sourceMappingURL=autocomplete-BX1KDZqL.js.map
1
+ "use strict";const p=require("react/jsx-runtime"),r=require("react"),de=require("./chevron-down.es-BMjgiS3F.js"),M=require("./listbox-lXO21cJV.js"),pe=require("./text-field-CS0PT5T6.js"),be=require("./bind-DeUYJ6m9.js"),me={"purpur-autocomplete":"_purpur-autocomplete_dgjyz_1","purpur-autocomplete__listbox":"_purpur-autocomplete__listbox_dgjyz_4","purpur-autocomplete__chevron-button":"_purpur-autocomplete__chevron-button_dgjyz_9","purpur-autocomplete__chevron-icon":"_purpur-autocomplete__chevron-icon_dgjyz_15","purpur-autocomplete__chevron-icon--up":"_purpur-autocomplete__chevron-icon--up_dgjyz_20"},fe=i=>r.useRef(i),xe=(i,x)=>{const n=r.useCallback(_=>{i&&!i.contains(_.target)&&x()},[x,i]);r.useEffect(()=>(document.addEventListener("mousedown",n),()=>{document.removeEventListener("mousedown",n)}),[n])},Z=({combobox:i,comboboxButtonAriaLabel:x,highlightFirstOption:n,defaultInputValue:_,inputValue:u,filterOption:R,id:l,listboxLabel:S,listboxMaxHeight:b,onInputBlur:h,onInputChange:L,onInputFocus:D,onInputKeyDown:k,onInputMouseDown:$,openOnFocus:A,noOptionsText:E,onSelect:T,options:a,selectedOption:t,["data-testid"]:y})=>{const[C,K]=r.useState(((typeof u=="string"?u:_)||t?.label)??""),F=typeof u=="string"?u:C,[c,v]=r.useState(n?a[0]:void 0),B=r.useRef(null),U=fe(null),N=r.useRef(null),O=r.useRef({}),[V,Y]=r.useState(!1);function q(e){return y?`${y}-${e}`:void 0}const w=()=>{Y(!1),v(void 0)};xe(U.current,w);const g=({eventType:e})=>{Y(!0),t&&requestAnimationFrame(()=>{v({...t,isSetByClickEvent:e==="CLICK"}),z(O.current[t.id])})},ee=e=>{if(R)return a.filter(s=>R(e,s));if(!e)return a;const o=e.toUpperCase().split(" ")||[];return a.filter(s=>o.every(f=>(s.value||s.label).toUpperCase().includes(f)))},G=e=>t&&t?.label===e?a:ee(e),d=G(F),P=e=>{L?.(e),K(e)},z=e=>{if(e){const o=e.getBoundingClientRect(),s=N.current?.getBoundingClientRect()||{top:0,bottom:0};(o.top<s.top||o.bottom>s.bottom)&&e.scrollIntoView({block:"nearest"})}},J=e=>{e&&(B.current?.focus(),P(e.label),T?.(e)),w()},te=e=>{const o=n&&!c?0:d.findIndex(f=>f&&c?.id===f.id),s=d.length;return e==="ArrowDown"?d[(o??-1)+1]||d[0]:d[(o??s)-1]||d[s-1]},m=V&&(!!d.length||!!E),oe=e=>{!m&&g({eventType:"KEYBOARD"});const o=te(e);v(o),o&&z(O.current[o.id])},ne=e=>{switch(k?.(e),e.key){case"ArrowUp":case"ArrowDown":e.preventDefault(),oe(e.key);break;case"Enter":{const o=c||(n?a[0]:void 0);m&&J(o),!m&&g({eventType:"KEYBOARD"});break}case"Escape":case"Tab":w();break}},se=e=>{const o=G(e.target.value);P(e.target.value),v(void 0),!m&&g({eventType:"KEYBOARD"}),n&&o[0]&&z(O.current[o[0].id])},ce=e=>{$?.(e),m?w():g({eventType:"CLICK"})},re=e=>{D?.(e),!V&&A&&g({eventType:"KEYBOARD"}),B.current?.select()},ie=e=>{h?.(e),setTimeout(()=>{!B.current?.contains(document.activeElement)&&!N.current?.contains(document.activeElement)&&(w(),i&&P(t?t.label:""))})},ue={maxHeight:typeof b=="number"?`${b}px`:b},Q={"aria-label":S,"aria-expanded":m,"data-testid":q("listbox"),id:`${l}-listbox`,ref:N,onMouseLeave:()=>v(void 0),style:b?ue:void 0},W=e=>`${l}-listbox-item-${e.id}`,le=(e,o)=>{const s=()=>e.id!==c?.id&&v({...e,isSetByClickEvent:!0}),f=(e.id===c?.id||!!n&&!c&&o===0)&&!c?.isSetByClickEvent;return{"data-testid":q(`listbox-item-${e.id}`),id:W(e),key:e.id,onMouseMove:s,onMouseUp:()=>J(e),ref:X=>{X&&(O.current[e.id]=X)},tabIndex:-1,selected:e.id===t?.id,disabled:e.disabled,highlighted:f,hovered:e.id===c?.id&&!!c?.isSetByClickEvent}},ae={"aria-activedescendant":c?W(c):void 0,"aria-autocomplete":"list","aria-controls":Q.id,"data-testid":q("input"),autoComplete:"off",id:`${l}-input`,onChange:se,onMouseDown:ce,onFocus:re,onKeyDown:ne,onBlur:ie,ref:B,role:"combobox",value:F};return{id:l,inputProps:ae,internalRef:U,optionsToShow:d,showListbox:m,noOptionsText:E,combobox:i,comboboxButtonAriaLabel:x,getListBoxItemProps:le,listboxProps:Q}},j=be.c.bind(me),I="purpur-autocomplete",ve=({className:i,renderInput:x,renderOption:n,..._},u)=>{const{id:R,inputProps:l,internalRef:S,optionsToShow:b,showListbox:h,noOptionsText:L,combobox:D,comboboxButtonAriaLabel:k,getListBoxItemProps:$,listboxProps:A}=Z(_),E=(t,y)=>{const{key:C,...K}=$(t,y);return p.jsx(M.Listbox.Item,{...K,children:n?n?.(t):t.label},C)},T=t=>{S.current=t,typeof u=="function"?u(t):u&&(u.current=t)},a=()=>{const t=x(l);if(D&&k&&L&&t&&pe.isTextField(t)){const C=p.jsxs(p.Fragment,{children:[t.props.endAdornment,p.jsx("button",{"data-testid":"chevron button",type:"button",className:j(`${I}__chevron-button`),onClick:()=>{l.onFocus(void 0),l.onMouseDown(void 0)},"aria-label":k,"aria-expanded":h,"aria-controls":A.id,children:p.jsx(de.l,{size:"sm",className:j(`${I}__chevron-icon`,{[`${I}__chevron-icon--up`]:h})})})]});return r.cloneElement(t,{endAdornment:C})}return t};return p.jsxs("div",{id:R,ref:T,className:j([I,i]),children:[a(),h&&p.jsx(M.Listbox,{...A,className:j(`${I}__listbox`),children:b.length?b.filter(t=>!!t).map(E):p.jsx(M.Listbox.Item,{noninteractive:!0,children:L})})]})},H=r.forwardRef(ve);H.displayName="Autocomplete";exports.Autocomplete=H;exports.useAutocomplete=Z;
2
+ //# sourceMappingURL=autocomplete-yrPbF5gq.js.map