themelia-react-ui 2.0.4 → 2.0.6

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 (715) hide show
  1. package/CHANGELOG.md +211 -0
  2. package/MIGRATION.md +119 -0
  3. package/README.md +122 -20
  4. package/dist/{accordion-96o0pN62.js → accordion-0tQUZ20r.js} +13 -13
  5. package/dist/accordion-0tQUZ20r.js.map +1 -0
  6. package/dist/{action-menu-CHgs8vmj.js → action-menu-C0gjzLyE.js} +48 -45
  7. package/dist/action-menu-C0gjzLyE.js.map +1 -0
  8. package/dist/{affordance-geometry.generated-B8yGOr8-.js → affordance-geometry.generated-P-aVJisu.js} +36 -36
  9. package/dist/affordance-geometry.generated-P-aVJisu.js.map +1 -0
  10. package/dist/{ai-artifact-BZUGwBq6.js → ai-artifact-CGGpQryR.js} +281 -230
  11. package/dist/ai-artifact-CGGpQryR.js.map +1 -0
  12. package/dist/app-shell-EHuuRDGy.js +321 -0
  13. package/dist/app-shell-EHuuRDGy.js.map +1 -0
  14. package/dist/{attachment-DkoqHPPl.js → attachment-BCpA4e7i.js} +10 -10
  15. package/dist/{attachment-DkoqHPPl.js.map → attachment-BCpA4e7i.js.map} +1 -1
  16. package/dist/{auth-D2FVZ1MH.js → auth-B0girIk_.js} +49 -52
  17. package/dist/auth-B0girIk_.js.map +1 -0
  18. package/dist/{avatar-DWO_HHhB.js → avatar-B9Jnp-T-.js} +8 -8
  19. package/dist/avatar-B9Jnp-T-.js.map +1 -0
  20. package/dist/{badge-DErMA7ul.js → badge-wWauMgAt.js} +5 -5
  21. package/dist/{badge-DErMA7ul.js.map → badge-wWauMgAt.js.map} +1 -1
  22. package/dist/base/accordion.js +1 -1
  23. package/dist/base/action-menu.js +1 -1
  24. package/dist/base/attachment.js +1 -1
  25. package/dist/base/avatar.js +1 -1
  26. package/dist/base/badge.js +1 -1
  27. package/dist/base/batch-action-bar.js +1 -1
  28. package/dist/base/buttons.js +1 -1
  29. package/dist/base/cards.js +2 -2
  30. package/dist/base/carousel.js +3 -3
  31. package/dist/base/cascader.js +2 -372
  32. package/dist/base/chart.js +1 -1
  33. package/dist/base/choice-inputs.js +2 -2
  34. package/dist/base/code-block.js +1 -1
  35. package/dist/base/combobox.js +2 -2
  36. package/dist/base/command.js +1 -1
  37. package/dist/base/copyable.js +1 -1
  38. package/dist/base/date-pickers.js +2 -2
  39. package/dist/base/display.js +6 -6
  40. package/dist/base/feedback.js +4 -4
  41. package/dist/base/forms-numeric.js +1 -1
  42. package/dist/base/forms.js +2 -2
  43. package/dist/base/inline-edit.js +10 -10
  44. package/dist/base/item.js +1 -1
  45. package/dist/base/media-gallery.js +1 -1
  46. package/dist/base/metadata-list.js +1 -1
  47. package/dist/base/navigation.js +7 -7
  48. package/dist/base/popover-menu.js +1 -1
  49. package/dist/base/popover.js +1 -1
  50. package/dist/base/qr-code.js +1 -1
  51. package/dist/base/repeaters.js +200 -193
  52. package/dist/base/repeaters.js.map +1 -1
  53. package/dist/base/sheet.js +1 -1
  54. package/dist/base/sidebar.js +2 -2
  55. package/dist/base/signature-pad.js +8 -8
  56. package/dist/base/signature-pad.js.map +1 -1
  57. package/dist/base/skeleton.js +1 -1
  58. package/dist/base/spinner.js +6 -6
  59. package/dist/base/spinner.js.map +1 -1
  60. package/dist/base/structure.js +1 -1
  61. package/dist/base/table.js +1 -1
  62. package/dist/base/text-inputs.js +2 -2
  63. package/dist/base/toaster.js +36 -36
  64. package/dist/base/toaster.js.map +1 -1
  65. package/dist/base/tree.js +1 -1
  66. package/dist/base/upload-queue.js +1 -1
  67. package/dist/base/upload.js +3 -3
  68. package/dist/base/value-inputs.js +1 -1
  69. package/dist/{batch-action-bar-CdfIkCsV.js → batch-action-bar-BoqWIIpV.js} +7 -7
  70. package/dist/batch-action-bar-BoqWIIpV.js.map +1 -0
  71. package/dist/blocks/admin.js +21 -21
  72. package/dist/blocks/admin.js.map +1 -1
  73. package/dist/blocks/ai.js +267 -247
  74. package/dist/blocks/ai.js.map +1 -1
  75. package/dist/blocks/analytics/usage-card.js +1 -1
  76. package/dist/blocks/analytics.js +537 -543
  77. package/dist/blocks/analytics.js.map +1 -1
  78. package/dist/blocks/collaboration.js +1 -1
  79. package/dist/blocks/commerce/receipt.js +1 -1
  80. package/dist/blocks/commerce.js +1330 -1250
  81. package/dist/blocks/commerce.js.map +1 -1
  82. package/dist/blocks/data-display.js +2 -2
  83. package/dist/blocks/onboarding.js +6 -6
  84. package/dist/blocks/onboarding.js.map +1 -1
  85. package/dist/blocks/planning.js +11 -11
  86. package/dist/blocks/timelines.js +1 -1
  87. package/dist/{breadcrumbs-B-WFKecD.js → breadcrumbs-Bp9Ke7kd.js} +7 -7
  88. package/dist/breadcrumbs-Bp9Ke7kd.js.map +1 -0
  89. package/dist/{button-DkmK-z8E.js → button-ChBovTx0.js} +3 -3
  90. package/dist/button-ChBovTx0.js.map +1 -0
  91. package/dist/{buttons-BbfzgczK.js → buttons-DeW0bQeK.js} +16 -16
  92. package/dist/buttons-DeW0bQeK.js.map +1 -0
  93. package/dist/cards-CNXnmvV5.js +69 -0
  94. package/dist/cards-CNXnmvV5.js.map +1 -0
  95. package/dist/cascader-CrAl9zD5.js +439 -0
  96. package/dist/cascader-CrAl9zD5.js.map +1 -0
  97. package/dist/chart-I7ROnsl8.js +162 -0
  98. package/dist/chart-I7ROnsl8.js.map +1 -0
  99. package/dist/{checkbox-CzYUTPeJ.js → checkbox-MoyHIAPs.js} +3 -3
  100. package/dist/{checkbox-CzYUTPeJ.js.map → checkbox-MoyHIAPs.js.map} +1 -1
  101. package/dist/choice-inputs-DHGtx0QV.js +789 -0
  102. package/dist/choice-inputs-DHGtx0QV.js.map +1 -0
  103. package/dist/{code-block-CGNaUtAE.js → code-block-BSJyq9e-.js} +9 -9
  104. package/dist/code-block-BSJyq9e-.js.map +1 -0
  105. package/dist/{collapsible-Do4G0zcC.js → collapsible-BzJ91LUG.js} +5 -5
  106. package/dist/{collapsible-Do4G0zcC.js.map → collapsible-BzJ91LUG.js.map} +1 -1
  107. package/dist/{collection-content-C0e8SsTm.js → collection-content-CSnwtOTH.js} +3 -3
  108. package/dist/{collection-content-C0e8SsTm.js.map → collection-content-CSnwtOTH.js.map} +1 -1
  109. package/dist/combobox-Bcvu5J8O.js +363 -0
  110. package/dist/combobox-Bcvu5J8O.js.map +1 -0
  111. package/dist/combobox-C2JiSQPc.js +915 -0
  112. package/dist/combobox-C2JiSQPc.js.map +1 -0
  113. package/dist/{command-D8NrBj-b.js → command-9e52NPgK.js} +11 -11
  114. package/dist/command-9e52NPgK.js.map +1 -0
  115. package/dist/{comments-Di4w0H_S.js → comments-BsgErEqd.js} +44 -39
  116. package/dist/comments-BsgErEqd.js.map +1 -0
  117. package/dist/components/base/action-menu/action-menu.d.ts +7 -1
  118. package/dist/components/base/buttons/button-group.recipes.d.ts +2 -2
  119. package/dist/components/base/cards/card.recipes.d.ts +6 -4
  120. package/dist/components/base/cards/partials/card-primitives.d.ts +9 -2
  121. package/dist/components/base/cards/partials/smart-card-header-row.d.ts +3 -1
  122. package/dist/components/base/cards/smart-card.types.d.ts +3 -4
  123. package/dist/components/base/cascader/cascader-panel.d.ts +76 -0
  124. package/dist/components/base/chart/chart.d.ts +6 -1
  125. package/dist/components/base/choice-inputs/choice-types.d.ts +5 -1
  126. package/dist/components/base/choice-inputs/pill-radio-group.d.ts +7 -6
  127. package/dist/components/base/combobox/combobox-field.d.ts +2 -2
  128. package/dist/components/base/combobox/index.d.ts +4 -2
  129. package/dist/components/base/date-pickers/date-picker-internals.d.ts +3 -1
  130. package/dist/components/base/date-pickers/datepicker.types.d.ts +10 -4
  131. package/dist/components/base/date-pickers/time-picker.d.ts +17 -3
  132. package/dist/components/base/feedback/alert.d.ts +1 -1
  133. package/dist/components/base/feedback/state-display.d.ts +5 -1
  134. package/dist/components/base/feedback/state-display.strings.d.ts +9 -0
  135. package/dist/components/base/forms/form-field.d.ts +7 -2
  136. package/dist/components/base/forms/form-sizing.d.ts +7 -7
  137. package/dist/components/base/forms/workflow.d.ts +7 -1
  138. package/dist/components/base/forms-numeric/coordinates-input.d.ts +8 -1
  139. package/dist/components/base/forms-numeric/decimal-input.d.ts +2 -2
  140. package/dist/components/base/forms-numeric/dimensions-input.d.ts +4 -1
  141. package/dist/components/base/forms-numeric/numeric-composite-field.d.ts +12 -0
  142. package/dist/components/base/forms-numeric/weight-input.d.ts +6 -1
  143. package/dist/components/base/metadata-list/metadata-list.d.ts +1 -1
  144. package/dist/components/base/navigation/dropdown-menu.d.ts +1 -1
  145. package/dist/components/base/navigation/language-switcher.d.ts +12 -4
  146. package/dist/components/base/navigation/page-header/page-header-commands.d.ts +14 -7
  147. package/dist/components/base/navigation/page-header/page-header.d.ts +10 -3
  148. package/dist/components/base/popover/popover.d.ts +3 -3
  149. package/dist/components/base/popover/popover.recipes.d.ts +10 -6
  150. package/dist/components/base/repeaters/key-value-editor.d.ts +2 -1
  151. package/dist/components/base/sheet/sheet.d.ts +2 -0
  152. package/dist/components/base/sidebar/index.d.ts +1 -1
  153. package/dist/components/base/sidebar/sidebar.d.ts +29 -5
  154. package/dist/components/base/toaster/index.d.ts +1 -0
  155. package/dist/components/base/upload/avatar-upload.d.ts +2 -1
  156. package/dist/components/base/upload/image-upload.d.ts +2 -1
  157. package/dist/components/blocks/ai/ai-citation/types.d.ts +2 -0
  158. package/dist/components/blocks/ai/ai-file-tree/types.d.ts +1 -1
  159. package/dist/components/blocks/ai/ai-reasoning/types.d.ts +2 -0
  160. package/dist/components/blocks/ai/ai-sources/types.d.ts +2 -0
  161. package/dist/components/blocks/ai/ai-tool-call/types.d.ts +5 -1
  162. package/dist/components/blocks/ai/ai.strings.d.ts +2 -0
  163. package/dist/components/blocks/analytics/metric/metric.d.ts +4 -0
  164. package/dist/components/blocks/analytics/metric-comparison/metric-comparison.d.ts +4 -0
  165. package/dist/components/blocks/analytics/metric-grid/metric-grid.d.ts +4 -5
  166. package/dist/components/blocks/analytics/types.d.ts +2 -2
  167. package/dist/components/blocks/analytics/usage-card/usage-card.strings.d.ts +2 -0
  168. package/dist/components/blocks/commerce/cart-summary/cart-summary.d.ts +1 -1
  169. package/dist/components/blocks/commerce/cart-summary/types.d.ts +3 -1
  170. package/dist/components/blocks/commerce/discount-stack/discount-stack.d.ts +1 -1
  171. package/dist/components/blocks/commerce/discount-stack/types.d.ts +3 -1
  172. package/dist/components/blocks/commerce/fulfillment-group/fulfillment-group.d.ts +1 -1
  173. package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +11 -2
  174. package/dist/components/blocks/commerce/index.d.ts +7 -6
  175. package/dist/components/blocks/commerce/inventory-section/inventory-section.d.ts +1 -1
  176. package/dist/components/blocks/commerce/inventory-section/types.d.ts +7 -2
  177. package/dist/components/blocks/commerce/invoice-header/index.d.ts +2 -1
  178. package/dist/components/blocks/commerce/invoice-header/invoice-header.d.ts +1 -1
  179. package/dist/components/blocks/commerce/invoice-header/types.d.ts +20 -6
  180. package/dist/components/blocks/commerce/invoice-line-items/invoice-line-items.d.ts +1 -1
  181. package/dist/components/blocks/commerce/invoice-line-items/types.d.ts +24 -7
  182. package/dist/components/blocks/commerce/invoice-mini/index.d.ts +2 -1
  183. package/dist/components/blocks/commerce/invoice-mini/types.d.ts +7 -1
  184. package/dist/components/blocks/commerce/order-customer/order-customer.d.ts +1 -1
  185. package/dist/components/blocks/commerce/order-customer/types.d.ts +9 -1
  186. package/dist/components/blocks/commerce/order-status/types.d.ts +4 -0
  187. package/dist/components/blocks/commerce/refund-status/refund-status.d.ts +1 -1
  188. package/dist/components/blocks/commerce/refund-status/types.d.ts +3 -1
  189. package/dist/components/blocks/commerce/shipment-tracking/shipment-tracking.d.ts +1 -1
  190. package/dist/components/blocks/commerce/shipment-tracking/types.d.ts +3 -1
  191. package/dist/components/blocks/commerce/tax-breakdown/tax-breakdown.d.ts +1 -1
  192. package/dist/components/blocks/commerce/tax-breakdown/types.d.ts +3 -1
  193. package/dist/components/blocks/data-display/empty-state/empty-state.types.d.ts +4 -3
  194. package/dist/components/features/activities/activities.types.d.ts +26 -13
  195. package/dist/components/features/activities/hooks/use-activity-resources.d.ts +2 -1
  196. package/dist/components/features/activities/partials/activity-marker.d.ts +7 -3
  197. package/dist/components/features/activities/partials/activity-row.d.ts +24 -0
  198. package/dist/components/features/ai-chat/hooks/use-ai-chat-scroll.d.ts +1 -1
  199. package/dist/components/features/appointment-calendar/appointment-calendar.d.ts +1 -1
  200. package/dist/components/features/appointment-calendar/appointment-calendar.types.d.ts +4 -2
  201. package/dist/components/features/combobox/async-resource-combobox.d.ts +2 -2
  202. package/dist/components/features/combobox/combobox.d.ts +2 -2
  203. package/dist/components/features/combobox/hooks/use-combobox-core.d.ts +2 -1
  204. package/dist/components/features/combobox/hooks/use-combobox-state.d.ts +1 -0
  205. package/dist/components/features/combobox/hooks/use-load-more.d.ts +1 -0
  206. package/dist/components/features/combobox/types.d.ts +37 -8
  207. package/dist/components/features/email-composer/types.d.ts +3 -1
  208. package/dist/components/features/event-calendar/colors.d.ts +2 -2
  209. package/dist/components/features/event-calendar/event-calendar.types.d.ts +4 -0
  210. package/dist/components/features/filters/facets/date-facet.d.ts +4 -2
  211. package/dist/components/features/filters/facets/range-facet.d.ts +12 -0
  212. package/dist/components/features/filters/facets/select-facet.d.ts +2 -1
  213. package/dist/components/features/filters/filters.strings.d.ts +4 -0
  214. package/dist/components/features/filters/filters.types.d.ts +6 -3
  215. package/dist/components/features/filters/partials/date-filter-content.d.ts +3 -2
  216. package/dist/components/features/filters/partials/filter-editor-header.d.ts +16 -0
  217. package/dist/components/features/filters/partials/filter-popover-content.d.ts +5 -3
  218. package/dist/components/features/filters/partials/nested-filter-options.d.ts +21 -0
  219. package/dist/components/features/filters/partials/range-filter-content.d.ts +12 -0
  220. package/dist/components/features/filters/partials/regular-filter-content.d.ts +2 -1
  221. package/dist/components/features/filters/utils/filter-utils.d.ts +25 -3
  222. package/dist/components/features/global-search/global-search.types.d.ts +2 -0
  223. package/dist/components/features/global-search/partials/global-search-input.d.ts +10 -0
  224. package/dist/components/features/global-search/partials/global-search-result-row.d.ts +7 -1
  225. package/dist/components/features/media-library/hooks/use-media-library.d.ts +1 -1
  226. package/dist/components/features/media-library/media-library.d.ts +1 -1
  227. package/dist/components/features/media-library/media-library.strings.d.ts +8 -0
  228. package/dist/components/features/media-library/media-library.types.d.ts +50 -12
  229. package/dist/components/features/media-library/partials/media-library-partials.d.ts +4 -4
  230. package/dist/components/features/mentions/hooks/use-mentions.d.ts +16 -1
  231. package/dist/components/features/mentions/partials/mention-inline-suggestions.d.ts +5 -1
  232. package/dist/components/features/mentions/utils/split-html-by-mentions.d.ts +1 -7
  233. package/dist/components/features/overlays/hooks/use-overlay-visibility.d.ts +2 -2
  234. package/dist/components/features/products/components/product-options-matrix.d.ts +1 -1
  235. package/dist/components/features/products/components/product-variant-editor.d.ts +1 -1
  236. package/dist/components/features/products/components/product-variants-manager.d.ts +1 -1
  237. package/dist/components/features/products/products.strings.d.ts +9 -1
  238. package/dist/components/features/products/products.types.d.ts +45 -8
  239. package/dist/components/features/questionnaire/questionnaire.types.d.ts +3 -0
  240. package/dist/components/features/resource/resource.d.ts +6 -2
  241. package/dist/components/features/resource/resource.types.d.ts +14 -1
  242. package/dist/components/features/rich-text-editor/form-rich-text-editor.d.ts +1 -1
  243. package/dist/components/features/rich-text-editor/partials/caret-helpers.d.ts +1 -1
  244. package/dist/components/features/rich-text-editor/partials/editor-field-aria.d.ts +14 -0
  245. package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +1 -1
  246. package/dist/components/features/rich-text-editor/partials/rich-text-editor-toolbar.d.ts +3 -1
  247. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +12 -2
  248. package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +17 -3
  249. package/dist/components/features/schema-form/hooks/use-schema-form.d.ts +5 -1
  250. package/dist/components/features/schema-form/partials/schema-form-field.d.ts +3 -1
  251. package/dist/components/features/schema-form/schema-form.utils.d.ts +1 -1
  252. package/dist/components/features/suggestions/suggestions.types.d.ts +1 -1
  253. package/dist/components/features/table/data-table.d.ts +1 -1
  254. package/dist/components/features/table/index.d.ts +1 -0
  255. package/dist/components/features/table/partials/resource-cell.d.ts +22 -5
  256. package/dist/components/features/table/table-body.d.ts +1 -1
  257. package/dist/components/features/table/table-helpers.d.ts +6 -3
  258. package/dist/components/features/table/table.strings.d.ts +3 -0
  259. package/dist/components/features/table/table.types.d.ts +18 -2
  260. package/dist/components/layout/app-shell/app-shell.types.d.ts +35 -6
  261. package/dist/components/layout/app-shell/index.d.ts +1 -1
  262. package/dist/components/layout/app-shell/shell-regions.d.ts +27 -0
  263. package/dist/components/layout/app-shell/sidebar-inset-layout.d.ts +1 -1
  264. package/dist/components/layout/app-shell/stacked-layout.d.ts +1 -1
  265. package/dist/components/layout/app-shell/topbar-sidebar-layout.d.ts +1 -1
  266. package/dist/components/layout/containers/two-column-layout.d.ts +2 -0
  267. package/dist/components/layout/header/header.recipes.d.ts +6 -0
  268. package/dist/components/layout/header/header.types.d.ts +9 -8
  269. package/dist/components/layout/layout.types.d.ts +5 -3
  270. package/dist/components/layout/navigation/section-nav/section-nav.d.ts +5 -0
  271. package/dist/components/layout/navigation/side-nav.d.ts +3 -2
  272. package/dist/components/layout/normalize-layout-path.d.ts +1 -0
  273. package/dist/components/layout/page/index.d.ts +2 -1
  274. package/dist/components/layout/page/page.d.ts +1 -0
  275. package/dist/components/layout/page/page.strings.d.ts +11 -0
  276. package/dist/components/layout/page/page.types.d.ts +69 -17
  277. package/dist/components/layout/page/partials/page-header.d.ts +1 -1
  278. package/dist/components/layout/settings/settings.d.ts +10 -3
  279. package/dist/components/layout/sidebar/app-sidebar.d.ts +1 -1
  280. package/dist/components/layout/sidebar/components/sidebar-grouped-navigation.d.ts +1 -1
  281. package/dist/components/layout/sidebar/components/sidebar-navigation.d.ts +1 -1
  282. package/dist/components/layout/sidebar/index.d.ts +2 -1
  283. package/dist/components/layout/sidebar/sidebar-navigation-rail.d.ts +38 -0
  284. package/dist/components/layout/sidebar/sidebar.context.d.ts +6 -7
  285. package/dist/components/layout/sidebar/sidebar.types.d.ts +50 -10
  286. package/dist/components/layout/sidebar/sidebar.utils.d.ts +9 -1
  287. package/dist/components/layout/workspace/workspace.types.d.ts +8 -1
  288. package/dist/components/primitives/link.d.ts +3 -2
  289. package/dist/components/primitives/money.d.ts +1 -1
  290. package/dist/components/primitives/number.d.ts +1 -1
  291. package/dist/components/typography/rich-text/rich-text-tree.d.ts +7 -5
  292. package/dist/components/ui/alert-dialog.d.ts +2 -2
  293. package/dist/components/ui/combobox.d.ts +1 -1
  294. package/dist/components/ui/dialog.d.ts +2 -2
  295. package/dist/components/ui/overlay-layer.d.ts +18 -0
  296. package/dist/components/ui/sheet.d.ts +5 -1
  297. package/dist/components/ui/sidebar-state.d.ts +82 -0
  298. package/dist/components/ui/sidebar.d.ts +5 -17
  299. package/dist/{containers-CRmHf7GP.js → containers-CSdc32h9.js} +26 -18
  300. package/dist/containers-CSdc32h9.js.map +1 -0
  301. package/dist/{control-group-recipes-DBXmfh2E.js → control-group-recipes-fMuFo0H7.js} +6 -6
  302. package/dist/control-group-recipes-fMuFo0H7.js.map +1 -0
  303. package/dist/{copyable-CnGCZdX4.js → copyable-3fdHfMR3.js} +7 -7
  304. package/dist/{copyable-CnGCZdX4.js.map → copyable-3fdHfMR3.js.map} +1 -1
  305. package/dist/{data-display-D4oujtx0.js → data-display-Cmj-xZYl.js} +271 -279
  306. package/dist/data-display-Cmj-xZYl.js.map +1 -0
  307. package/dist/{date-Q7jnXxpk.js → date-Br0FicVv.js} +5 -5
  308. package/dist/{date-Q7jnXxpk.js.map → date-Br0FicVv.js.map} +1 -1
  309. package/dist/date-picker-CyQlFYsP.js +1617 -0
  310. package/dist/date-picker-CyQlFYsP.js.map +1 -0
  311. package/dist/date-pickers-tj2MXmXd.js +185 -0
  312. package/dist/date-pickers-tj2MXmXd.js.map +1 -0
  313. package/dist/{display-BB4BL_-K.js → display-CT_N2a3w.js} +9 -9
  314. package/dist/{display-BB4BL_-K.js.map → display-CT_N2a3w.js.map} +1 -1
  315. package/dist/dropdown-menu-C08iIugv.js +194 -0
  316. package/dist/dropdown-menu-C08iIugv.js.map +1 -0
  317. package/dist/features/activities.js +388 -326
  318. package/dist/features/activities.js.map +1 -1
  319. package/dist/features/ai-chat.js +46 -32
  320. package/dist/features/ai-chat.js.map +1 -1
  321. package/dist/features/appointment-calendar.js +130 -130
  322. package/dist/features/appointment-calendar.js.map +1 -1
  323. package/dist/features/async-preview.js +11 -10
  324. package/dist/features/async-preview.js.map +1 -1
  325. package/dist/features/combobox.js +1 -1
  326. package/dist/features/comments.js +1 -1
  327. package/dist/features/data-view.js +13 -13
  328. package/dist/features/data-view.js.map +1 -1
  329. package/dist/features/email-composer.js +243 -239
  330. package/dist/features/email-composer.js.map +1 -1
  331. package/dist/features/event-calendar.js +197 -199
  332. package/dist/features/event-calendar.js.map +1 -1
  333. package/dist/features/filters.js +2 -2
  334. package/dist/features/global-search.js +168 -143
  335. package/dist/features/global-search.js.map +1 -1
  336. package/dist/features/kanban.js +19 -30
  337. package/dist/features/kanban.js.map +1 -1
  338. package/dist/features/map/style.css +15 -0
  339. package/dist/features/map.js +369 -343
  340. package/dist/features/map.js.map +1 -1
  341. package/dist/features/media-library.js +1202 -975
  342. package/dist/features/media-library.js.map +1 -1
  343. package/dist/features/mentions.js +2 -2
  344. package/dist/features/overlays.js +1 -1
  345. package/dist/features/products.js +1270 -1183
  346. package/dist/features/products.js.map +1 -1
  347. package/dist/features/questionnaire.js +160 -153
  348. package/dist/features/questionnaire.js.map +1 -1
  349. package/dist/features/resource-assignment.js +8 -8
  350. package/dist/features/resource.js +119 -113
  351. package/dist/features/resource.js.map +1 -1
  352. package/dist/features/rich-text-editor.js +28 -19
  353. package/dist/features/rich-text-editor.js.map +1 -1
  354. package/dist/features/schema-form.js +297 -256
  355. package/dist/features/schema-form.js.map +1 -1
  356. package/dist/features/suggestions.js +57 -50
  357. package/dist/features/suggestions.js.map +1 -1
  358. package/dist/features/sync.js +3 -3
  359. package/dist/features/table.js +1 -1
  360. package/dist/features/theme-tweaker.js +470 -470
  361. package/dist/features/theme-tweaker.js.map +1 -1
  362. package/dist/feedback-Dzo1xtAU.js +246 -0
  363. package/dist/feedback-Dzo1xtAU.js.map +1 -0
  364. package/dist/{field-affordance-recipes-DjwGx8eM.js → field-affordance-recipes-D6H7tVJi.js} +5 -5
  365. package/dist/field-affordance-recipes-D6H7tVJi.js.map +1 -0
  366. package/dist/field-control-attributes-B6i335wr.js +18 -0
  367. package/dist/field-control-attributes-B6i335wr.js.map +1 -0
  368. package/dist/{field-state-recipes-BVA2CWHo.js → field-state-recipes-7sza8QbC.js} +4 -2
  369. package/dist/{field-state-recipes-BVA2CWHo.js.map → field-state-recipes-7sza8QbC.js.map} +1 -1
  370. package/dist/filters-Dl80yYtN.js +2415 -0
  371. package/dist/filters-Dl80yYtN.js.map +1 -0
  372. package/dist/form-field-CAPdwdnZ.js +74 -0
  373. package/dist/form-field-CAPdwdnZ.js.map +1 -0
  374. package/dist/{form-sizing-NXgjkmBG.js → form-sizing-CgcrUbLU.js} +5 -5
  375. package/dist/form-sizing-CgcrUbLU.js.map +1 -0
  376. package/dist/{forms-BV5m5aQF.js → forms-B3W8CH7-.js} +17 -13
  377. package/dist/forms-B3W8CH7-.js.map +1 -0
  378. package/dist/forms-numeric-CwjQJe-O.js +991 -0
  379. package/dist/forms-numeric-CwjQJe-O.js.map +1 -0
  380. package/dist/{header-BA697l4a.js → header-ZIIsRKxP.js} +145 -141
  381. package/dist/header-ZIIsRKxP.js.map +1 -0
  382. package/dist/header.recipes-BigdJjw1.js +6 -0
  383. package/dist/header.recipes-BigdJjw1.js.map +1 -0
  384. package/dist/hooks/use-files.d.ts +2 -0
  385. package/dist/{hooks-BQ-L7Uu2.js → hooks-BitHSh-Y.js} +27 -15
  386. package/dist/hooks-BitHSh-Y.js.map +1 -0
  387. package/dist/{icon-badge-COWbCCWu.js → icon-badge-npxF1SLX.js} +4 -4
  388. package/dist/{icon-badge-COWbCCWu.js.map → icon-badge-npxF1SLX.js.map} +1 -1
  389. package/dist/index.js +4 -5
  390. package/dist/{input-Cdw4k0fb.js → input-7KAc7XQL.js} +9 -9
  391. package/dist/{input-Cdw4k0fb.js.map → input-7KAc7XQL.js.map} +1 -1
  392. package/dist/input-DIREVYHs.js +21 -0
  393. package/dist/input-DIREVYHs.js.map +1 -0
  394. package/dist/{interaction-recipes-XR9ZpVYL.js → interaction-recipes-4wZ2tvfb.js} +2 -2
  395. package/dist/{interaction-recipes-XR9ZpVYL.js.map → interaction-recipes-4wZ2tvfb.js.map} +1 -1
  396. package/dist/item-FfWnaYST.js +278 -0
  397. package/dist/item-FfWnaYST.js.map +1 -0
  398. package/dist/layout/app-shell.js +1 -1
  399. package/dist/layout/auth.js +1 -1
  400. package/dist/layout/containers.js +1 -1
  401. package/dist/layout/header.js +1 -1
  402. package/dist/layout/hooks.js +1 -1
  403. package/dist/layout/navigation.js +1 -1
  404. package/dist/layout/page.js +2 -2
  405. package/dist/layout/settings.js +1 -1
  406. package/dist/layout/sidebar.js +3 -3
  407. package/dist/layout/workspace.js +1 -1
  408. package/dist/layout.js +12 -12
  409. package/dist/layout.types-E_GAApzO.js +30 -0
  410. package/dist/layout.types-E_GAApzO.js.map +1 -0
  411. package/dist/lib/affordance-geometry.generated.d.ts +35 -35
  412. package/dist/lib/control-group-recipes.d.ts +5 -5
  413. package/dist/lib/field-affordance-recipes.d.ts +2 -2
  414. package/dist/lib/field-control-attributes.d.ts +11 -0
  415. package/dist/lib/field-state-recipes.d.ts +2 -0
  416. package/dist/lib/format.d.ts +1 -0
  417. package/dist/lib/motion-recipes.d.ts +3 -0
  418. package/dist/lib/navigation-row-recipes.d.ts +7 -7
  419. package/dist/lib/overlay-anatomy-recipes.d.ts +3 -3
  420. package/dist/lib/portal-recipes.d.ts +3 -0
  421. package/dist/lib/surface-recipes.d.ts +1 -1
  422. package/dist/lib/token-merge.generated.d.ts +18 -15
  423. package/dist/lib/utils.js +1 -1
  424. package/dist/map-demo-tile.svg +1 -1
  425. package/dist/{media-gallery-CSl5W1Fy.js → media-gallery-C81DAnKI.js} +6 -6
  426. package/dist/{media-gallery-CSl5W1Fy.js.map → media-gallery-C81DAnKI.js.map} +1 -1
  427. package/dist/{mentions-RKOQaaIB.js → mentions-qOnedSt4.js} +237 -168
  428. package/dist/mentions-qOnedSt4.js.map +1 -0
  429. package/dist/message-BJHnn43M.js +135 -0
  430. package/dist/message-BJHnn43M.js.map +1 -0
  431. package/dist/{metadata-list-qVV7AVxa.js → metadata-list-XkqZ_UXH.js} +64 -64
  432. package/dist/metadata-list-XkqZ_UXH.js.map +1 -0
  433. package/dist/{motion-recipes-ChBg4HBq.js → motion-recipes-DitYv6P2.js} +10 -2
  434. package/dist/motion-recipes-DitYv6P2.js.map +1 -0
  435. package/dist/navigation-BgtPJAhi.js +288 -0
  436. package/dist/navigation-BgtPJAhi.js.map +1 -0
  437. package/dist/navigation-Bt-v7rWP.js +261 -0
  438. package/dist/navigation-Bt-v7rWP.js.map +1 -0
  439. package/dist/{navigation-row-recipes-WZEs-hYo.js → navigation-row-recipes-BGVLvU_O.js} +9 -9
  440. package/dist/navigation-row-recipes-BGVLvU_O.js.map +1 -0
  441. package/dist/normalize-layout-path-BmEgg6fu.js +14 -0
  442. package/dist/normalize-layout-path-BmEgg6fu.js.map +1 -0
  443. package/dist/{number-E_OiIfJz.js → number-CYqBcrSj.js} +79 -87
  444. package/dist/number-CYqBcrSj.js.map +1 -0
  445. package/dist/overflow-tab-bar-BQCA2Zn2.js +172 -0
  446. package/dist/overflow-tab-bar-BQCA2Zn2.js.map +1 -0
  447. package/dist/overlays-CC8zI3Du.js +1017 -0
  448. package/dist/overlays-CC8zI3Du.js.map +1 -0
  449. package/dist/page-BoQ1VaFJ.js +331 -0
  450. package/dist/page-BoQ1VaFJ.js.map +1 -0
  451. package/dist/page-header-commands-DIKspJfx.js +193 -0
  452. package/dist/page-header-commands-DIKspJfx.js.map +1 -0
  453. package/dist/{pagination-Ch8X_47u.js → pagination-Br8TdV9A.js} +7 -7
  454. package/dist/{pagination-Ch8X_47u.js.map → pagination-Br8TdV9A.js.map} +1 -1
  455. package/dist/popover-k8TdUcAt.js +201 -0
  456. package/dist/popover-k8TdUcAt.js.map +1 -0
  457. package/dist/{popover-menu-BYaCdFhf.js → popover-menu-yn-o0kyA.js} +7 -7
  458. package/dist/{popover-menu-BYaCdFhf.js.map → popover-menu-yn-o0kyA.js.map} +1 -1
  459. package/dist/{popover.recipes-D3j8R8Yp.js → popover.recipes-DJ0AkUan.js} +19 -12
  460. package/dist/popover.recipes-DJ0AkUan.js.map +1 -0
  461. package/dist/portal-recipes-DyUXqUtD.js +9 -0
  462. package/dist/portal-recipes-DyUXqUtD.js.map +1 -0
  463. package/dist/{primitives-Du64iDbb.js → primitives-BkkQjYl7.js} +23 -18
  464. package/dist/primitives-BkkQjYl7.js.map +1 -0
  465. package/dist/primitives.js +4 -4
  466. package/dist/{progress-BvF2oCdV.js → progress-DZFXXzPs.js} +9 -9
  467. package/dist/{progress-BvF2oCdV.js.map → progress-DZFXXzPs.js.map} +1 -1
  468. package/dist/{receipt-D789Jwyy.js → receipt-C7LhOg7Q.js} +7 -7
  469. package/dist/receipt-C7LhOg7Q.js.map +1 -0
  470. package/dist/rich-text-BnTzZjIo.js +45 -0
  471. package/dist/rich-text-BnTzZjIo.js.map +1 -0
  472. package/dist/{rich-text-editor-Cm1dpUpQ.js → rich-text-editor-CAurDwT5.js} +501 -424
  473. package/dist/rich-text-editor-CAurDwT5.js.map +1 -0
  474. package/dist/rich-text-editor-toolbar-DbXig7Jk.js +99 -0
  475. package/dist/rich-text-editor-toolbar-DbXig7Jk.js.map +1 -0
  476. package/dist/rich-text-tree-BqyQ_7-R.js +66 -0
  477. package/dist/rich-text-tree-BqyQ_7-R.js.map +1 -0
  478. package/dist/{sanitize-html-DsQmI48u.js → sanitize-html-BWkH4dLM.js} +29 -16
  479. package/dist/sanitize-html-BWkH4dLM.js.map +1 -0
  480. package/dist/{scroll-area-La5RXsEk.js → scroll-area-Bj6CRUif.js} +2 -2
  481. package/dist/{scroll-area-La5RXsEk.js.map → scroll-area-Bj6CRUif.js.map} +1 -1
  482. package/dist/{separator-DAEV0w65.js → separator-B9ewiCGO.js} +2 -2
  483. package/dist/{separator-DAEV0w65.js.map → separator-B9ewiCGO.js.map} +1 -1
  484. package/dist/{separator-GNfPG-90.js → separator-DM6gs2vu.js} +3 -3
  485. package/dist/{separator-GNfPG-90.js.map → separator-DM6gs2vu.js.map} +1 -1
  486. package/dist/services/actions.js +1 -1
  487. package/dist/settings-DZPHgpx4.js +155 -0
  488. package/dist/settings-DZPHgpx4.js.map +1 -0
  489. package/dist/sheet-C4DHsgLk.js +250 -0
  490. package/dist/sheet-C4DHsgLk.js.map +1 -0
  491. package/dist/sidebar-C8BnDwTH.js +709 -0
  492. package/dist/sidebar-C8BnDwTH.js.map +1 -0
  493. package/dist/sidebar-CmD6a-HK.js +1004 -0
  494. package/dist/sidebar-CmD6a-HK.js.map +1 -0
  495. package/dist/skeleton-DDgdhmu9.js +265 -0
  496. package/dist/skeleton-DDgdhmu9.js.map +1 -0
  497. package/dist/smart-card-B6vLxqa_.js +617 -0
  498. package/dist/smart-card-B6vLxqa_.js.map +1 -0
  499. package/dist/{structure-C0V0_Fyf.js → structure-DZJ2wbAU.js} +2 -2
  500. package/dist/{structure-C0V0_Fyf.js.map → structure-DZJ2wbAU.js.map} +1 -1
  501. package/dist/style.css +1 -1
  502. package/dist/{surface-recipes-BKRVW8Os.js → surface-recipes-C8mNycaY.js} +2 -2
  503. package/dist/{surface-recipes-BKRVW8Os.js.map → surface-recipes-C8mNycaY.js.map} +1 -1
  504. package/dist/{table-DH7rozUv.js → table-CBonSdTp.js} +573 -519
  505. package/dist/table-CBonSdTp.js.map +1 -0
  506. package/dist/{table-CpvnzJn9.js → table-CXSPHH25.js} +75 -71
  507. package/dist/table-CXSPHH25.js.map +1 -0
  508. package/dist/tabs-C4Kr_hCr.js +192 -0
  509. package/dist/tabs-C4Kr_hCr.js.map +1 -0
  510. package/dist/{text-inputs-DXItiR0O.js → text-inputs-jdkS3ReG.js} +18 -18
  511. package/dist/text-inputs-jdkS3ReG.js.map +1 -0
  512. package/dist/theme.css +40 -37
  513. package/dist/{timelines-DmtztAY_.js → timelines-CoPwdJP0.js} +13 -12
  514. package/dist/timelines-CoPwdJP0.js.map +1 -0
  515. package/dist/tooltip-31NwIpTo.js +113 -0
  516. package/dist/tooltip-31NwIpTo.js.map +1 -0
  517. package/dist/{tree-CV11PURP.js → tree-CeYVzdFE.js} +9 -9
  518. package/dist/{tree-CV11PURP.js.map → tree-CeYVzdFE.js.map} +1 -1
  519. package/dist/typography/rich-text.js +1 -1
  520. package/dist/{typography-CSyJrh28.js → typography-C7-YMW1S.js} +12 -12
  521. package/dist/{typography-CSyJrh28.js.map → typography-C7-YMW1S.js.map} +1 -1
  522. package/dist/typography.js +1 -1
  523. package/dist/ui-provider-C-74NVLc.js +178 -0
  524. package/dist/ui-provider-C-74NVLc.js.map +1 -0
  525. package/dist/ui-provider.js +2 -3
  526. package/dist/{upload-C9SA0X-8.js → upload-Hdm5gObf.js} +309 -296
  527. package/dist/upload-Hdm5gObf.js.map +1 -0
  528. package/dist/{upload-queue-DhQJiSRc.js → upload-queue-D0sYPuqo.js} +16 -14
  529. package/dist/upload-queue-D0sYPuqo.js.map +1 -0
  530. package/dist/{usage-card-DVTRDmGz.js → usage-card-9s8hLDfn.js} +24 -17
  531. package/dist/usage-card-9s8hLDfn.js.map +1 -0
  532. package/dist/{utils-CF3c95Io.js → utils-DhuoqFy4.js} +255 -165
  533. package/dist/utils-DhuoqFy4.js.map +1 -0
  534. package/dist/value-inputs-D3aPgq9H.js +980 -0
  535. package/dist/value-inputs-D3aPgq9H.js.map +1 -0
  536. package/dist/{value-typography-ClupF0Gz.js → value-typography-uSzzG9Gf.js} +32 -26
  537. package/dist/value-typography-uSzzG9Gf.js.map +1 -0
  538. package/dist/{workspace-9EFVXUyk.js → workspace-CC8Vchiu.js} +51 -50
  539. package/dist/workspace-CC8Vchiu.js.map +1 -0
  540. package/docs/consumer-skill/SKILL.md +4 -3
  541. package/docs/consumer-skill/agents/themelia-ui-designer.md +96 -0
  542. package/docs/consumer-skill/examples/app-layout.tsx +52 -1
  543. package/docs/consumer-skill/examples/commerce-lines.tsx +271 -0
  544. package/docs/consumer-skill/examples/custom-composition.tsx +21 -0
  545. package/docs/consumer-skill/examples/detail.tsx +5 -4
  546. package/docs/consumer-skill/examples/edit.tsx +3 -3
  547. package/docs/consumer-skill/examples/editable-sections.tsx +38 -0
  548. package/docs/consumer-skill/examples/index-table.tsx +4 -4
  549. package/docs/consumer-skill/examples/manifest.json +38 -1
  550. package/docs/consumer-skill/examples/product-media.tsx +41 -0
  551. package/docs/consumer-skill/examples/product-parts.tsx +81 -0
  552. package/docs/consumer-skill/examples/rhf-edit-page.tsx +1 -1
  553. package/docs/consumer-skill/examples/rhf-overlay-form.tsx +24 -11
  554. package/docs/consumer-skill/examples/token-domain-structure.tsx +68 -0
  555. package/docs/consumer-skill/references/agents-md.md +21 -19
  556. package/docs/consumer-skill/references/analytics.md +33 -1
  557. package/docs/consumer-skill/references/commerce-composition.md +97 -0
  558. package/docs/consumer-skill/references/component-contracts.json +21249 -14205
  559. package/docs/consumer-skill/references/composition-mapping.md +17 -3
  560. package/docs/consumer-skill/references/composition.md +177 -32
  561. package/docs/consumer-skill/references/critique-rubric.md +98 -0
  562. package/docs/consumer-skill/references/custom-composition.md +261 -0
  563. package/docs/consumer-skill/references/data-reading.md +79 -0
  564. package/docs/consumer-skill/references/design-contract.md +12 -9
  565. package/docs/consumer-skill/references/discovery.md +27 -3
  566. package/docs/consumer-skill/references/domain-structures.md +124 -0
  567. package/docs/consumer-skill/references/installation.md +62 -8
  568. package/docs/consumer-skill/references/integration.md +59 -1
  569. package/docs/consumer-skill/references/product-composition.md +94 -0
  570. package/docs/consumer-skill/references/public-api.json +3044 -445
  571. package/docs/consumer-skill/references/review.md +87 -10
  572. package/docs/consumer-skill/references/rhf-workflows.md +79 -0
  573. package/docs/consumer-skill/references/screen-archetypes.md +19 -7
  574. package/docs/consumer-skill/references/screen-decisions.md +126 -0
  575. package/docs/consumer-skill/references/theming.md +24 -20
  576. package/docs/consumer-skill/references/tokens.json +9 -9
  577. package/docs/consumer-skill/references/view-craft.md +153 -0
  578. package/docs/consumer-skill/references/view-spec.md +73 -0
  579. package/docs/consumer-skill/references/workflows.md +7 -1
  580. package/docs/consumer-skill/scripts/composition-policy.mjs +176 -26
  581. package/docs/consumer-skill/scripts/composition-schema.mjs +1 -1
  582. package/docs/consumer-skill/scripts/composition.mjs +61 -5
  583. package/docs/consumer-skill/scripts/discovery.mjs +54 -0
  584. package/docs/consumer-skill/scripts/inspect-component.mjs +1 -1
  585. package/docs/consumer-skill/scripts/inspection.mjs +73 -18
  586. package/docs/consumer-skill/scripts/setup-skills.mjs +79 -7
  587. package/docs/consumer-skill/scripts/surface-policy.mjs +5 -5
  588. package/docs/consumer-skills/themelia-components/SKILL.md +14 -13
  589. package/docs/consumer-skills/themelia-composition/SKILL.md +16 -17
  590. package/docs/consumer-skills/themelia-design/SKILL.md +55 -0
  591. package/docs/consumer-skills/themelia-foundation/SKILL.md +2 -1
  592. package/docs/consumer-skills/themelia-tokenization/SKILL.md +24 -17
  593. package/package.json +4 -2
  594. package/templates/admin-shell-template.tsx +1 -2
  595. package/templates/customers-template.tsx +18 -16
  596. package/dist/accordion-96o0pN62.js.map +0 -1
  597. package/dist/action-menu-CHgs8vmj.js.map +0 -1
  598. package/dist/affordance-geometry.generated-B8yGOr8-.js.map +0 -1
  599. package/dist/ai-artifact-BZUGwBq6.js.map +0 -1
  600. package/dist/app-shell-D63ATkIK.js +0 -237
  601. package/dist/app-shell-D63ATkIK.js.map +0 -1
  602. package/dist/auth-D2FVZ1MH.js.map +0 -1
  603. package/dist/avatar-DWO_HHhB.js.map +0 -1
  604. package/dist/base/cascader.js.map +0 -1
  605. package/dist/batch-action-bar-CdfIkCsV.js.map +0 -1
  606. package/dist/breadcrumbs-B-WFKecD.js.map +0 -1
  607. package/dist/button-DkmK-z8E.js.map +0 -1
  608. package/dist/buttons-BbfzgczK.js.map +0 -1
  609. package/dist/cards-4JTWqvVe.js +0 -68
  610. package/dist/cards-4JTWqvVe.js.map +0 -1
  611. package/dist/chart-C19flDQb.js +0 -155
  612. package/dist/chart-C19flDQb.js.map +0 -1
  613. package/dist/choice-inputs-JLtij2y4.js +0 -776
  614. package/dist/choice-inputs-JLtij2y4.js.map +0 -1
  615. package/dist/code-block-CGNaUtAE.js.map +0 -1
  616. package/dist/combobox-CBJDs6w_.js +0 -877
  617. package/dist/combobox-CBJDs6w_.js.map +0 -1
  618. package/dist/combobox-hbhSS18O.js +0 -355
  619. package/dist/combobox-hbhSS18O.js.map +0 -1
  620. package/dist/command-D8NrBj-b.js.map +0 -1
  621. package/dist/comments-Di4w0H_S.js.map +0 -1
  622. package/dist/containers-CRmHf7GP.js.map +0 -1
  623. package/dist/control-group-recipes-DBXmfh2E.js.map +0 -1
  624. package/dist/data-display-D4oujtx0.js.map +0 -1
  625. package/dist/date-picker-zOt1oNss.js +0 -1542
  626. package/dist/date-picker-zOt1oNss.js.map +0 -1
  627. package/dist/date-pickers-cj8IXbDC.js +0 -179
  628. package/dist/date-pickers-cj8IXbDC.js.map +0 -1
  629. package/dist/dropdown-menu-CjY8Vt7W.js +0 -193
  630. package/dist/dropdown-menu-CjY8Vt7W.js.map +0 -1
  631. package/dist/feedback-DZNL5Lg1.js +0 -239
  632. package/dist/feedback-DZNL5Lg1.js.map +0 -1
  633. package/dist/field-affordance-recipes-DjwGx8eM.js.map +0 -1
  634. package/dist/filters-BcT-uoFy.js +0 -2209
  635. package/dist/filters-BcT-uoFy.js.map +0 -1
  636. package/dist/form-field-CsgRmdit.js +0 -63
  637. package/dist/form-field-CsgRmdit.js.map +0 -1
  638. package/dist/form-sizing-NXgjkmBG.js.map +0 -1
  639. package/dist/forms-BV5m5aQF.js.map +0 -1
  640. package/dist/forms-numeric-Cd33AKbD.js +0 -906
  641. package/dist/forms-numeric-Cd33AKbD.js.map +0 -1
  642. package/dist/header-BA697l4a.js.map +0 -1
  643. package/dist/hooks-BQ-L7Uu2.js.map +0 -1
  644. package/dist/input-DOPL5_QE.js +0 -21
  645. package/dist/input-DOPL5_QE.js.map +0 -1
  646. package/dist/item-BvZ2DR_x.js +0 -277
  647. package/dist/item-BvZ2DR_x.js.map +0 -1
  648. package/dist/layout.types-Cn7aUzJp.js +0 -20
  649. package/dist/layout.types-Cn7aUzJp.js.map +0 -1
  650. package/dist/mentions-RKOQaaIB.js.map +0 -1
  651. package/dist/message-INU2xsxu.js +0 -128
  652. package/dist/message-INU2xsxu.js.map +0 -1
  653. package/dist/metadata-list-qVV7AVxa.js.map +0 -1
  654. package/dist/motion-recipes-ChBg4HBq.js.map +0 -1
  655. package/dist/navigation-BQNcg1jT.js +0 -269
  656. package/dist/navigation-BQNcg1jT.js.map +0 -1
  657. package/dist/navigation-DLF3E1IC.js +0 -145
  658. package/dist/navigation-DLF3E1IC.js.map +0 -1
  659. package/dist/navigation-row-recipes-WZEs-hYo.js.map +0 -1
  660. package/dist/number-E_OiIfJz.js.map +0 -1
  661. package/dist/overflow-tab-bar-CrbqMteP.js +0 -284
  662. package/dist/overflow-tab-bar-CrbqMteP.js.map +0 -1
  663. package/dist/overlays-BlKynmde.js +0 -1004
  664. package/dist/overlays-BlKynmde.js.map +0 -1
  665. package/dist/page-CIwNUtGr.js +0 -227
  666. package/dist/page-CIwNUtGr.js.map +0 -1
  667. package/dist/page-header-commands-DFMlNYzN.js +0 -128
  668. package/dist/page-header-commands-DFMlNYzN.js.map +0 -1
  669. package/dist/popover-uwzX2vo7.js +0 -198
  670. package/dist/popover-uwzX2vo7.js.map +0 -1
  671. package/dist/popover.recipes-D3j8R8Yp.js.map +0 -1
  672. package/dist/primitives-Du64iDbb.js.map +0 -1
  673. package/dist/receipt-D789Jwyy.js.map +0 -1
  674. package/dist/rich-text-CLJEf76s.js +0 -78
  675. package/dist/rich-text-CLJEf76s.js.map +0 -1
  676. package/dist/rich-text-editor-Cm1dpUpQ.js.map +0 -1
  677. package/dist/rich-text-editor-toolbar-L__e4x47.js +0 -94
  678. package/dist/rich-text-editor-toolbar-L__e4x47.js.map +0 -1
  679. package/dist/safe-image-src-C6kQSMBZ.js +0 -17
  680. package/dist/safe-image-src-C6kQSMBZ.js.map +0 -1
  681. package/dist/sanitize-html-DsQmI48u.js.map +0 -1
  682. package/dist/settings-BA2iboic.js +0 -174
  683. package/dist/settings-BA2iboic.js.map +0 -1
  684. package/dist/sheet-DoAxTb2J.js +0 -213
  685. package/dist/sheet-DoAxTb2J.js.map +0 -1
  686. package/dist/sidebar-ByqKR_W5.js +0 -512
  687. package/dist/sidebar-ByqKR_W5.js.map +0 -1
  688. package/dist/sidebar-D2iSnGJ7.js +0 -619
  689. package/dist/sidebar-D2iSnGJ7.js.map +0 -1
  690. package/dist/skeleton-CUj8O5Bd.js +0 -264
  691. package/dist/skeleton-CUj8O5Bd.js.map +0 -1
  692. package/dist/smart-card-CqkzQsK-.js +0 -614
  693. package/dist/smart-card-CqkzQsK-.js.map +0 -1
  694. package/dist/table-CpvnzJn9.js.map +0 -1
  695. package/dist/table-DH7rozUv.js.map +0 -1
  696. package/dist/tabs-eqVsJZWO.js +0 -191
  697. package/dist/tabs-eqVsJZWO.js.map +0 -1
  698. package/dist/text-inputs-DXItiR0O.js.map +0 -1
  699. package/dist/theme-scope-BJ6eE2xt.js +0 -50
  700. package/dist/theme-scope-BJ6eE2xt.js.map +0 -1
  701. package/dist/timelines-DmtztAY_.js.map +0 -1
  702. package/dist/tooltip-B4hjKtoV.js +0 -111
  703. package/dist/tooltip-B4hjKtoV.js.map +0 -1
  704. package/dist/ui-provider-CQCuCBcy.js +0 -136
  705. package/dist/ui-provider-CQCuCBcy.js.map +0 -1
  706. package/dist/upload-C9SA0X-8.js.map +0 -1
  707. package/dist/upload-queue-DhQJiSRc.js.map +0 -1
  708. package/dist/usage-card-DVTRDmGz.js.map +0 -1
  709. package/dist/use-mobile-vaLKwgyf.js +0 -15
  710. package/dist/use-mobile-vaLKwgyf.js.map +0 -1
  711. package/dist/utils-CF3c95Io.js.map +0 -1
  712. package/dist/value-inputs-C0o70p-U.js +0 -980
  713. package/dist/value-inputs-C0o70p-U.js.map +0 -1
  714. package/dist/value-typography-ClupF0Gz.js.map +0 -1
  715. package/dist/workspace-9EFVXUyk.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rich-text-editor-CAurDwT5.js","names":["NumberValue","_Fragment","_Fragment","EditorContent","StarterKit","_Fragment","cn","Button","Text","Stack","safeImageSrc","sanitizeHtml","SecondaryValue","Number$1","Input","FormField","resolveFieldInvalid","richTextEditorRecipes","RichTextEditorToolbar","defaultRichTextEditorStrings","Fragment$1","TiptapReact","StarterKitModule","readCaretContext","sel","range","startNode","startOffset","block","editable","text","cursor","prev","rect","r","replaceBeforeCaret","editor","selection","from","length","html","caret","remaining","take","previousTextNode","fragment","notifyChange","insertHtmlIntoEditable","current","node","CountsFooterText","chars","words","overLimit","maxLength","className","strings","CountsFooter","sourceMode","sourceValue","editorFieldAria","listboxId","label","activeOptionId","normalizeHtml","trimmed","value","toEditorContent","normalized","inlineReferenceChipClassName","NODE_NAME","deleteAdjacentReference","state","direction","$from","tr","inlineReferenceNode","getInlineReferenceNode","element","attributes","HTMLAttributes","dom","UPLOAD_ATTRIBUTE","UPLOAD_PLACEHOLDER_CLASS","PLACEHOLDER_PATTERN","stripUploadPlaceholders","acceptsImageFile","type","file","name","accept","entry","altFromFileName","imageFilesFrom","data","uploadSequence","useImageUploadQueue","uploads","setUploads","useState","notice","setNotice","jobs","useRef","job","forget","useCallback","id","upload","run","images","controller","pending","result","src","placed","adapterRef","error","refused","files","reason","message","interpolateString","ImageUploadStatus","failed","AlertCircle","Loader2","onRetry","onRemove","ImageUploadPortals","queue","target","createPortal","useImageInsertControl","inputRef","beforeOpenRef","beforeOpen","enabled","useMemo","ImagePlus","event","onFiles","ImageDetailsBar","inputId","useId","alt","onDismissNotice","onAltChange","positiveNumber","number","imageNode","imageUploadNode","getImageNode","getImageUploadNode","valueHtml","EditorContent$1","useTiptapEditor","useTiptapEditorState","StarterKit$1","TiptapRichTextEditor","forwardRef","ariaLabel","ariaLabelledBy","ariaDescribedBy","ariaInvalidProp","stringsProp","useStrings","invalid","imagesEnabled","queueRef","editorInstanceRef","isFocused","setIsFocused","setSourceMode","sourceRef","setSourceValue","isFocusedRef","externalValueRef","onCaretChangeRef","onCaretChange","keyHandler","disabled","onEditorKeyDown","keyHandlerRef","suggestionPopup","editorLabel","editorAttributes","fieldAttributes","ariaInvalid","autoFocus","currentEditor","onValueChange","imagesRef","moved","at","view","useLayoutEffect","useEffect","next","handler","useImperativeHandle","ref","emitValue","findNode","found","match","created","image","uploadQueue","imageInsert","toolbarItems","extraToolbarItems","activeImage","setActiveImage","sync","nodeBefore","nodeAfter","bodyMinHeightClassName","bodyHeight","compact","contentStyle","minHeight","maxHeight","toggleSourceMode","toolbarState","item","toolbarButtons","Bold","Italic","Strikethrough","List","ListOrdered","Quote","Undo2","Redo2","countsFooter","showCounts","placeholderText","placeholder","placeholderNode","onBlur","footerSlot","hasTiptapRuntime","serializeEditable","copy","removeUnsafeImages","imageAtSelection","startContainer","placeCaretAtPoint","doc","x","y","position","FallbackRichTextEditor","editableRef","savedRangeRef","activeAlt","setActiveAlt","setEditableRef","emitEditableChange","saved","syncActiveImage","handleInput","template","isEmpty","RichTextEditor","props"],"sources":["../src/components/features/rich-text-editor/partials/caret-helpers.ts","../src/components/features/rich-text-editor/partials/counts-footer.tsx","../src/components/features/rich-text-editor/partials/editor-field-aria.ts","../src/components/features/rich-text-editor/partials/html-helpers.ts","../src/components/features/rich-text-editor/partials/inline-reference-node.ts","../src/components/features/rich-text-editor/partials/image-uploads.tsx","../src/components/features/rich-text-editor/partials/image-nodes.ts","../src/components/features/rich-text-editor/partials/rich-text-editor-tiptap.tsx","../src/components/features/rich-text-editor/partials/rich-text-editor-fallback.tsx","../src/components/features/rich-text-editor/rich-text-editor.tsx"],"sourcesContent":["/**\n * Caret-introspection helpers used by `<RichTextEditor>` to expose the\n * text before the caret and replace a leading run of characters with\n * inline HTML — the building blocks for `@`-mention chips and similar\n * inline triggers.\n */\nimport type { RichTextCaretContext, TiptapEditor } from '../rich-text-editor.types';\n\n/**\n * Read the current selection's caret context.\n *\n * Walks back from the caret through the current text node and any\n * preceding sibling text nodes inside the same block-level container\n * (paragraph / list-item / heading) collecting plain text. Returns the\n * accumulated text plus the caret's bounding rect when available.\n *\n * Returns `null` when there is no live selection or the selection isn't\n * a text caret inside a contenteditable.\n */\nexport function readCaretContext(): RichTextCaretContext | null {\n\tif (typeof window === 'undefined') return null;\n\tconst sel = window.getSelection();\n\tif (!sel || sel.rangeCount === 0) return null;\n\tconst range = sel.getRangeAt(0);\n\tif (!range.collapsed) return null;\n\n\tconst startNode = range.startContainer;\n\tconst startOffset = range.startOffset;\n\n\tlet block: Node | null = startNode;\n\twhile (block && block.nodeType !== Node.ELEMENT_NODE) {\n\t\tblock = block.parentNode;\n\t}\n\tif (!block) return null;\n\tconst editable =\n\t\t(block as Element).closest('[contenteditable=\"true\"]') ??\n\t\t(block as Element).closest('.ProseMirror');\n\tif (!editable) return null;\n\n\tlet text = '';\n\tif (startNode.nodeType === Node.TEXT_NODE) {\n\t\ttext = (startNode.textContent ?? '').slice(0, startOffset);\n\t}\n\n\tlet cursor: Node | null = startNode;\n\twhile (cursor && cursor !== editable && cursor !== block) {\n\t\tlet prev: Node | null = cursor.previousSibling;\n\t\twhile (prev) {\n\t\t\ttext = (prev.textContent ?? '') + text;\n\t\t\tprev = prev.previousSibling;\n\t\t}\n\t\tcursor = cursor.parentNode;\n\t\tif (cursor && (cursor as Element).matches?.('p, li, h1, h2, h3, h4, h5, h6, blockquote')) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tlet rect: RichTextCaretContext['rect'];\n\tconst r = range.getBoundingClientRect();\n\tif (r && (r.top || r.left || r.right || r.bottom)) {\n\t\trect = { top: r.top, left: r.left, bottom: r.bottom, right: r.right };\n\t}\n\n\treturn { textBefore: text, rect };\n}\n\n/**\n * Extend the selection backwards by `length` characters, then insert\n * `html`. The selection extension means `editor.insertContent` (or the\n * fallback's `range.deleteContents()` + insert) replaces the trigger\n * range with the chip atomically — no manual text-content mutation, no\n * timing races between \"delete\" and \"insert\".\n */\nexport function replaceBeforeCaret(\n\teditor: TiptapEditor | null,\n\tlength: number,\n\thtml: string,\n\tnotifyChange?: (next: string) => void,\n): void {\n\tif (typeof window === 'undefined') return;\n\n\tif (editor) {\n\t\t// ProseMirror owns its selection: focus() restores the stored caret and ignores a DOM range,\n\t\t// so replace the run before that caret in document positions, inside its text block.\n\t\tconst { selection } = editor.state;\n\t\tif (!selection.empty) return;\n\t\tconst from = selection.from - Math.min(length, selection.$from.parentOffset);\n\t\teditor.chain().focus().insertContentAt({ from, to: selection.from }, html).run();\n\t\t// The Tiptap transaction reports the normalized value through onUpdate.\n\t\treturn;\n\t}\n\n\tconst sel = window.getSelection();\n\tif (!sel || sel.rangeCount === 0) return;\n\tconst caret = sel.getRangeAt(0);\n\tif (!caret.collapsed) return;\n\n\tlet remaining = length;\n\tlet startNode: Node = caret.startContainer;\n\tlet startOffset = caret.startOffset;\n\n\twhile (remaining > 0) {\n\t\tif (startNode.nodeType === Node.TEXT_NODE) {\n\t\t\tconst take = Math.min(startOffset, remaining);\n\t\t\tstartOffset -= take;\n\t\t\tremaining -= take;\n\t\t\tif (remaining === 0) break;\n\t\t}\n\t\tconst prev = previousTextNode(startNode);\n\t\tif (!prev) break;\n\t\tstartNode = prev;\n\t\tstartOffset = prev.textContent?.length ?? 0;\n\t}\n\n\tconst range = document.createRange();\n\trange.setStart(startNode, startOffset);\n\trange.setEnd(caret.endContainer, caret.endOffset);\n\tsel.removeAllRanges();\n\tsel.addRange(range);\n\n\trange.deleteContents();\n\tconst fragment = document.createRange().createContextualFragment(html);\n\trange.insertNode(fragment);\n\tsel.collapseToEnd();\n\tconst editable =\n\t\t(startNode as Element | null)?.parentElement?.closest?.('[contenteditable=\"true\"]') ?? null;\n\tif (editable) notifyChange?.((editable as HTMLElement).innerHTML);\n}\n\nexport function insertHtmlIntoEditable(editable: HTMLElement | null, html: string): void {\n\tif (typeof window === 'undefined' || !editable) return;\n\teditable.focus();\n\n\tconst sel = window.getSelection();\n\tif (!sel || sel.rangeCount === 0) {\n\t\teditable.insertAdjacentHTML('beforeend', html);\n\t\treturn;\n\t}\n\n\tconst range = sel.getRangeAt(0);\n\tif (!editable.contains(range.commonAncestorContainer)) {\n\t\teditable.insertAdjacentHTML('beforeend', html);\n\t\treturn;\n\t}\n\n\trange.deleteContents();\n\tconst fragment = document.createRange().createContextualFragment(html);\n\trange.insertNode(fragment);\n\trange.collapse(false);\n\tsel.removeAllRanges();\n\tsel.addRange(range);\n}\n\nfunction previousTextNode(node: Node): Node | null {\n\tlet current: Node | null = node;\n\twhile (current) {\n\t\tif (current.previousSibling) {\n\t\t\tcurrent = current.previousSibling;\n\t\t\twhile (current && current.lastChild) {\n\t\t\t\tcurrent = current.lastChild;\n\t\t\t}\n\t\t\tif (current && current.nodeType === Node.TEXT_NODE) return current;\n\t\t\tcontinue;\n\t\t}\n\t\tcurrent = current.parentNode;\n\t\tif (!current || (current as Element).matches?.('p, li, h1, h2, h3, h4, h5, h6, blockquote, [contenteditable=\"true\"]')) {\n\t\t\treturn null;\n\t\t}\n\t}\n\treturn null;\n}\n","import { Number as NumberValue, SecondaryValue } from '../../../primitives';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport type { RichTextEditorStrings } from '../rich-text-editor.strings';\nimport type { TiptapEditor } from '../rich-text-editor.types';\n\nexport interface CountsFooterTextProps {\n\t/** Plain-text projection of the document, used for the character count. */\n\ttext: string;\n\t/** Character cap the count is measured against. */\n\tmaxLength?: number;\n\t/** Overrides this surface's own copy. */\n\tstrings: RichTextEditorStrings;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nexport function CountsFooterText({ text, maxLength, strings, className }: CountsFooterTextProps) {\n\tconst chars = text.length;\n\tconst words = text.trim().length > 0 ? text.trim().split(/\\s+/).length : 0;\n\tconst overLimit = typeof maxLength === 'number' && chars > maxLength;\n\n\treturn (\n\t\t<div className={cn('counts-footer-text--component border-border flex items-center justify-end gap-space-lg border-t px-surface-xs py-space-sm', className)}>\n\t\t\t<Text\n\t\t\t\ttag=\"span\"\n\t\t\t\tsize=\"xs\"\n\t\t\t\ttype={overLimit ? 'error' : 'secondary'}\n\t\t\t\tweight={overLimit ? 'medium' : 'regular'}\n\t\t\t\tclassName={cn('tabular-nums')}\n\t\t\t>\n\t\t\t\t<NumberValue value={chars} size=\"xs\" type={overLimit ? 'error' : 'secondary'} align=\"left\" />\n\t\t\t\t{typeof maxLength === 'number' && (\n\t\t\t\t\t<> / <NumberValue value={maxLength} size=\"xs\" type={overLimit ? 'error' : 'secondary'} align=\"left\" /></>\n\t\t\t\t)} {strings.counts.characters}\n\t\t\t</Text>\n\t\t\t<SecondaryValue size=\"xs\" className=\"tabular-nums\">\n\t\t\t\t<NumberValue value={words} size=\"xs\" type=\"secondary\" align=\"left\" /> {strings.counts.words}\n\t\t\t</SecondaryValue>\n\t\t</div>\n\t);\n}\n\nCountsFooterText.displayName = 'CountsFooterText';\n\nexport interface CountsFooterProps {\n\t/** The editor instance, for reading counts directly. */\n\teditor: TiptapEditor;\n\t/** Whether the editor is showing HTML source. */\n\tsourceMode: boolean;\n\t/** Raw HTML while in source mode. */\n\tsourceValue: string;\n\t/** Character cap the count is measured against. */\n\tmaxLength?: number;\n\t/** Overrides this surface's own copy. */\n\tstrings: RichTextEditorStrings;\n}\n\nexport function CountsFooter({\n\teditor,\n\tsourceMode,\n\tsourceValue,\n\tmaxLength,\n\tstrings,\n}: CountsFooterProps) {\n\tconst text = sourceMode\n\t\t? sourceValue.replace(/<[^>]*>/g, '')\n\t\t: (editor?.getText() ?? '');\n\n\treturn <CountsFooterText text={text} maxLength={maxLength} strings={strings} />;\n}\n\nCountsFooter.displayName = 'CountsFooter';\n","export function editorFieldAria(label: string, listboxId?: string, activeOptionId?: string) {\n\tif (!listboxId) {\n\t\treturn { role: 'textbox', 'aria-label': label, 'aria-multiline': 'true' } as const;\n\t}\n\n\treturn {\n\t\trole: 'combobox',\n\t\t'aria-label': label,\n\t\t'aria-expanded': 'true',\n\t\t'aria-haspopup': 'listbox',\n\t\t'aria-autocomplete': 'list',\n\t\t'aria-controls': listboxId,\n\t\t...(activeOptionId ? { 'aria-activedescendant': activeOptionId } : {}),\n\t} as const;\n}\n","/**\n * Plain HTML normalization shared by the TipTap and contenteditable\n * fallback editors. Keeping these out of the React tree means the\n * editor partials stay focused on rendering.\n */\n\nexport function normalizeHtml(value: string): string {\n\tconst trimmed = value.trim();\n\n\tif (trimmed === '' || trimmed === '<p></p>' || trimmed === '<p><br></p>') {\n\t\treturn '';\n\t}\n\n\treturn trimmed;\n}\n\nexport function toEditorContent(value: string): string {\n\tconst normalized = normalizeHtml(value);\n\treturn normalized === '' ? '<p></p>' : normalized;\n}\n","import * as TiptapReact from '@tiptap/react';\n\n/**\n * Inline references (`@person`, `#booking`) as one atomic editor token.\n *\n * The serialized HTML is the mentions contract written by `buildMentionHtml`\n * and read by `parseMentionsFromHtml`/`MentionContent`:\n *\n * <span class=\"rsc-mention\" data-ref-id=\"…\" data-ref-kind=\"…\" data-ref-tone=\"…\"\n * contenteditable=\"false\">@Label</span>\n *\n * Without this node the editor schema had no place for that span, so a picked\n * mention collapsed into plain text. Inside the editor the token keeps the\n * `.rsc-mention` hook, so mention-chip.css (the inline Badge utilities and\n * shared tone tints) draws it exactly as it draws serialized chips; it is\n * selectable as a unit, and Backspace/Delete remove it in one keystroke.\n */\n\nexport const inlineReferenceChipClassName = 'rsc-mention inline-reference--chip';\n\nconst NODE_NAME = 'inlineReference';\n\nfunction deleteAdjacentReference(direction: 'backward' | 'forward') {\n\treturn ({ editor }: { editor: TiptapReact.Editor }) => editor.commands.command(({ tr, state }) => {\n\t\tconst { selection } = state;\n\t\tif (!selection.empty) return false;\n\t\tconst { $from } = selection;\n\t\tconst node = direction === 'backward' ? $from.nodeBefore : $from.nodeAfter;\n\t\tif (node?.type.name !== NODE_NAME) return false;\n\t\tconst from = direction === 'backward' ? $from.pos - node.nodeSize : $from.pos;\n\t\ttr.delete(from, from + node.nodeSize);\n\t\treturn true;\n\t});\n}\n\nlet inlineReferenceNode: TiptapReact.Node | null = null;\n\n/** Created on first use, so the optional Tiptap runtime is only touched by the editor that needs it. */\nexport function getInlineReferenceNode(): TiptapReact.Node {\n\tinlineReferenceNode ??= TiptapReact.Node.create({\n\t\tname: NODE_NAME,\n\t\tgroup: 'inline',\n\t\tinline: true,\n\t\tatom: true,\n\t\tselectable: true,\n\t\tdraggable: false,\n\n\t\taddAttributes() {\n\t\t\treturn {\n\t\t\t\tid: { default: null, parseHTML: (element) => element.getAttribute('data-ref-id'), renderHTML: (attributes) => ({ 'data-ref-id': attributes.id }) },\n\t\t\t\tkind: { default: null, parseHTML: (element) => element.getAttribute('data-ref-kind'), renderHTML: (attributes) => (attributes.kind ? { 'data-ref-kind': attributes.kind } : {}) },\n\t\t\t\ttone: { default: null, parseHTML: (element) => element.getAttribute('data-ref-tone'), renderHTML: (attributes) => (attributes.tone ? { 'data-ref-tone': attributes.tone } : {}) },\n\t\t\t\tlabel: { default: '', parseHTML: (element) => element.textContent ?? '', renderHTML: () => ({}) },\n\t\t\t};\n\t\t},\n\n\t\tparseHTML() {\n\t\t\treturn [{ tag: 'span[data-ref-id]' }];\n\t\t},\n\n\t\trenderHTML({ node, HTMLAttributes }) {\n\t\t\treturn ['span', TiptapReact.mergeAttributes({ class: 'rsc-mention', contenteditable: 'false' }, HTMLAttributes), node.attrs.label as string];\n\t\t},\n\n\t\trenderText({ node }) {\n\t\t\treturn node.attrs.label as string;\n\t\t},\n\n\t\taddNodeView() {\n\t\t\treturn ({ node }) => {\n\t\t\t\tconst dom = document.createElement('span');\n\t\t\t\tdom.className = inlineReferenceChipClassName;\n\t\t\t\tdom.setAttribute('contenteditable', 'false');\n\t\t\t\tdom.setAttribute('data-ref-id', String(node.attrs.id ?? ''));\n\t\t\t\tif (node.attrs.kind) dom.setAttribute('data-ref-kind', String(node.attrs.kind));\n\t\t\t\tif (node.attrs.tone) dom.setAttribute('data-ref-tone', String(node.attrs.tone));\n\t\t\t\tdom.textContent = String(node.attrs.label ?? '');\n\t\t\t\treturn { dom };\n\t\t\t};\n\t\t},\n\n\t\taddKeyboardShortcuts() {\n\t\t\treturn {\n\t\t\t\tBackspace: deleteAdjacentReference('backward'),\n\t\t\t\tDelete: deleteAdjacentReference('forward'),\n\t\t\t};\n\t\t},\n\t});\n\treturn inlineReferenceNode;\n}\n","import { AlertCircle, ImagePlus, Loader2 } from 'lucide-react';\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type RefObject } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { Button } from '../../../base/buttons';\nimport { FormField } from '../../../base/forms';\nimport { Stack } from '../../../base/structure';\nimport { Input } from '../../../base/text-inputs';\nimport { Text } from '../../../typography';\nimport { safeImageSrc } from '../../../../lib/safe-image-src';\nimport { interpolateString } from '../../../../lib/strings';\n\nimport type { RichTextEditorStrings } from '../rich-text-editor.strings';\nimport type { RichTextEditorImages, RichTextEditorToolbarItem, RichTextImage } from '../rich-text-editor.types';\n\nexport const DEFAULT_IMAGE_ACCEPT = 'image/png,image/jpeg,image/gif,image/webp';\n\n/** Marks an upload placeholder in the editing surface; never part of the value. */\nexport const UPLOAD_ATTRIBUTE = 'data-rte-upload';\n\n/** The placeholder occupies a line of its own while its image uploads. */\nexport const UPLOAD_PLACEHOLDER_CLASS = 'rich-text-editor--upload my-space-xs flex min-h-control items-center rounded-radius border border-dashed border-input bg-muted/30 px-row-x py-row-y';\n\nconst PLACEHOLDER_PATTERN = new RegExp(`<span[^>]*\\\\b${UPLOAD_ATTRIBUTE}=\"[^\"]*\"[^>]*>[\\\\s\\\\S]*?</span>`, 'g');\n\n/** Removes upload placeholders from serialized editor HTML. */\nexport function stripUploadPlaceholders(html: string): string {\n\treturn html.includes(UPLOAD_ATTRIBUTE) ? html.replace(PLACEHOLDER_PATTERN, '') : html;\n}\n\nexport function acceptsImageFile(file: File, accept: string): boolean {\n\tconst type = file.type.toLowerCase();\n\tconst name = file.name.toLowerCase();\n\treturn accept.split(',').map((entry) => entry.trim().toLowerCase()).filter(Boolean).some((entry) => {\n\t\tif (entry.startsWith('.')) return name.endsWith(entry);\n\t\tif (entry.endsWith('/*')) return type.startsWith(entry.slice(0, -1));\n\t\treturn type === entry;\n\t});\n}\n\n/** A readable default description from the file name: `team-offsite_2026.jpg` → `team offsite 2026`. */\nexport function altFromFileName(name: string): string {\n\treturn name.replace(/\\.[^.]+$/, '').replace(/[-_]+/g, ' ').trim();\n}\n\n/** Image files carried by a paste or drop. */\nexport function imageFilesFrom(data: DataTransfer | null | undefined): File[] {\n\treturn Array.from(data?.files ?? []).filter((file) => file.type.startsWith('image/'));\n}\n\n/** How each editor engine puts placeholders and images into its document. */\nexport interface ImageUploadAdapter {\n\t/** Inserts an empty placeholder for `id` at the selection (or the drop point). */\n\tinsertPlaceholder: (id: string) => void;\n\t/** Swaps the placeholder for the uploaded image and reports the change. */\n\tresolvePlaceholder: (id: string, image: RichTextImage) => void;\n\t/** Removes the placeholder and reports the change. */\n\tremovePlaceholder: (id: string) => void;\n\t/** The placeholder's element, or null once the user has deleted it. */\n\tfindPlaceholder: (id: string) => HTMLElement | null;\n}\n\nexport interface PendingImageUpload {\n\tid: string;\n\tname: string;\n\tstatus: 'uploading' | 'error';\n}\n\nlet uploadSequence = 0;\n\n/**\n * The engine-agnostic upload lifecycle: validate, insert a placeholder, call\n * the consumer's `upload` with an abort signal, then swap in the image or keep\n * the placeholder in its error state for Retry or Remove.\n */\nexport function useImageUploadQueue(\n\timages: RichTextEditorImages | undefined,\n\tadapterRef: RefObject<ImageUploadAdapter | null>,\n\tstrings: RichTextEditorStrings['images'],\n) {\n\tconst [uploads, setUploads] = useState<PendingImageUpload[]>([]);\n\tconst [notice, setNotice] = useState<string | null>(null);\n\tconst jobs = useRef(new Map<string, { file: File; controller?: AbortController }>());\n\n\tuseEffect(() => () => {\n\t\tfor (const job of jobs.current.values()) job.controller?.abort();\n\t}, []);\n\n\tconst forget = useCallback((id: string) => {\n\t\tjobs.current.get(id)?.controller?.abort();\n\t\tjobs.current.delete(id);\n\t\tsetUploads((current) => current.filter((upload) => upload.id !== id));\n\t}, []);\n\n\tconst run = useCallback(async (id: string) => {\n\t\tconst job = jobs.current.get(id);\n\t\tif (!job || !images) return;\n\t\tjob.controller?.abort();\n\t\tconst controller = new AbortController();\n\t\tjob.controller = controller;\n\t\tconst pending: PendingImageUpload = { id, name: job.file.name, status: 'uploading' };\n\t\tsetUploads((current) => (current.some((upload) => upload.id === id) ? current.map((upload) => (upload.id === id ? pending : upload)) : [...current, pending]));\n\t\ttry {\n\t\t\tconst result = await images.upload(job.file, { signal: controller.signal });\n\t\t\tif (controller.signal.aborted) return;\n\t\t\tconst src = safeImageSrc(result?.src);\n\t\t\tif (!src) throw new Error(`The uploaded image source for ${job.file.name} is not an allowed URL.`);\n\t\t\tconst placed = adapterRef.current?.findPlaceholder(id);\n\t\t\tforget(id);\n\t\t\tif (placed) {\n\t\t\t\tadapterRef.current?.resolvePlaceholder(id, {\n\t\t\t\t\tsrc,\n\t\t\t\t\talt: result.alt ?? altFromFileName(job.file.name),\n\t\t\t\t\twidth: result.width,\n\t\t\t\t\theight: result.height,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (controller.signal.aborted) return;\n\t\t\timages.onError?.(error, job.file);\n\t\t\tsetUploads((current) => current.map((upload) => (upload.id === id ? { ...upload, status: 'error' } : upload)));\n\t\t}\n\t}, [adapterRef, forget, images]);\n\n\tconst addFiles = useCallback((files: readonly File[]) => {\n\t\tif (!images) return;\n\t\tconst accept = images.accept ?? DEFAULT_IMAGE_ACCEPT;\n\t\tconst refused: string[] = [];\n\t\tfor (const file of files) {\n\t\t\tconst reason = !acceptsImageFile(file, accept)\n\t\t\t\t? strings.unsupported\n\t\t\t\t: images.maxSize && file.size > images.maxSize ? strings.tooLarge : null;\n\t\t\tif (reason) {\n\t\t\t\tconst message = interpolateString(reason, { name: file.name });\n\t\t\t\trefused.push(message);\n\t\t\t\timages.onError?.(new Error(message), file);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tuploadSequence += 1;\n\t\t\tconst id = `upload-${uploadSequence}`;\n\t\t\tjobs.current.set(id, { file });\n\t\t\tadapterRef.current?.insertPlaceholder(id);\n\t\t\tvoid run(id);\n\t\t}\n\t\tsetNotice(refused.length > 0 ? refused.join(' ') : null);\n\t}, [adapterRef, images, run, strings.tooLarge, strings.unsupported]);\n\n\tconst retry = useCallback((id: string) => { void run(id); }, [run]);\n\n\tconst remove = useCallback((id: string) => {\n\t\tforget(id);\n\t\tadapterRef.current?.removePlaceholder(id);\n\t}, [adapterRef, forget]);\n\n\t/** Forgets uploads whose placeholder the user deleted while editing. */\n\tconst prune = useCallback(() => {\n\t\tfor (const id of Array.from(jobs.current.keys())) {\n\t\t\tif (!adapterRef.current?.findPlaceholder(id)) forget(id);\n\t\t}\n\t}, [adapterRef, forget]);\n\n\treturn { uploads, notice, dismissNotice: () => setNotice(null), addFiles, retry, remove, prune };\n}\n\nexport type ImageUploadQueue = ReturnType<typeof useImageUploadQueue>;\n\n/** Status inside a placeholder: uploading with Cancel, or the failure with Retry and Remove. */\nfunction ImageUploadStatus({ upload, strings, onRetry, onRemove }: {\n\tupload: PendingImageUpload;\n\tstrings: RichTextEditorStrings['images'];\n\tonRetry: () => void;\n\tonRemove: () => void;\n}) {\n\tconst failed = upload.status === 'error';\n\treturn (\n\t\t// The message keeps a readable width; on a narrow editor the actions wrap below it.\n\t\t<Stack direction=\"horizontal\" align=\"center\" gap=\"sm\" wrap className=\"rich-text-editor--upload-status w-full min-w-0\" data-status={upload.status}>\n\t\t\t{failed\n\t\t\t\t? <AlertCircle className=\"size-icon shrink-0 text-destructive\" aria-hidden=\"true\" />\n\t\t\t\t: <Loader2 className=\"size-icon shrink-0 animate-spin text-muted-foreground motion-reduce:animate-none\" aria-hidden=\"true\" />}\n\t\t\t<Text tag=\"span\" size=\"xs\" type={failed ? 'error' : 'secondary'} role={failed ? 'alert' : 'status'} className=\"min-w-0 flex-1 basis-40 break-words\">\n\t\t\t\t{interpolateString(failed ? strings.failed : strings.uploading, { name: upload.name })}\n\t\t\t</Text>\n\t\t\t{failed && <Button type=\"button\" size=\"sm\" onClick={onRetry}>{strings.retry}</Button>}\n\t\t\t<Button type=\"button\" size=\"sm\" buttonStyle=\"ghost\" onClick={onRemove}>{failed ? strings.remove : strings.cancel}</Button>\n\t\t</Stack>\n\t);\n}\n\n/** Renders each pending upload's status into its placeholder in the editing surface. */\nexport function ImageUploadPortals({ queue, adapterRef, strings }: {\n\tqueue: ImageUploadQueue;\n\tadapterRef: RefObject<ImageUploadAdapter | null>;\n\tstrings: RichTextEditorStrings['images'];\n}) {\n\treturn (\n\t\t<>\n\t\t\t{queue.uploads.map((upload) => {\n\t\t\t\tconst target = adapterRef.current?.findPlaceholder(upload.id);\n\t\t\t\treturn target ? createPortal(\n\t\t\t\t\t<ImageUploadStatus upload={upload} strings={strings} onRetry={() => queue.retry(upload.id)} onRemove={() => queue.remove(upload.id)} />,\n\t\t\t\t\ttarget,\n\t\t\t\t\tupload.id,\n\t\t\t\t) : null;\n\t\t\t})}\n\t\t</>\n\t);\n}\n\n/** The Insert image toolbar control and its hidden file input. */\nexport function useImageInsertControl(\n\timages: RichTextEditorImages | undefined,\n\tstrings: RichTextEditorStrings['images'],\n\tonFiles: (files: File[]) => void,\n\tbeforeOpen?: () => void,\n) {\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst beforeOpenRef = useRef(beforeOpen);\n\tbeforeOpenRef.current = beforeOpen;\n\tconst enabled = Boolean(images);\n\tconst item = useMemo<RichTextEditorToolbarItem | null>(() => (enabled ? {\n\t\tid: 'insert-image',\n\t\ticon: ImagePlus,\n\t\tlabel: strings.insert,\n\t\ttoggle: false,\n\t\tonClick: () => {\n\t\t\tbeforeOpenRef.current?.();\n\t\t\tinputRef.current?.click();\n\t\t},\n\t} : null), [enabled, strings.insert]);\n\tconst input = images ? (\n\t\t<input\n\t\t\tref={inputRef}\n\t\t\ttype=\"file\"\n\t\t\taccept={images.accept ?? DEFAULT_IMAGE_ACCEPT}\n\t\t\tmultiple\n\t\t\thidden\n\t\t\ttabIndex={-1}\n\t\t\taria-hidden=\"true\"\n\t\t\tonChange={(event) => {\n\t\t\t\tconst files = Array.from(event.target.files ?? []);\n\t\t\t\tevent.target.value = '';\n\t\t\t\tif (files.length > 0) onFiles(files);\n\t\t\t}}\n\t\t/>\n\t) : null;\n\treturn { item, input };\n}\n\n/** The description field for the image at the caret, and refused-file notices. */\nexport function ImageDetailsBar({ alt, onAltChange, onRemove, notice, onDismissNotice, strings }: {\n\talt: string | null;\n\tonAltChange: (alt: string) => void;\n\tonRemove: () => void;\n\tnotice: string | null;\n\tonDismissNotice: () => void;\n\tstrings: RichTextEditorStrings['images'];\n}) {\n\tconst inputId = useId();\n\tif (alt === null && !notice) return null;\n\treturn (\n\t\t<Stack gap=\"sm\" className=\"rich-text-editor--image-details border-t border-border/60 px-surface-xs py-space-sm\">\n\t\t\t{!!notice && (\n\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" gap=\"sm\">\n\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"error\" role=\"alert\" className=\"min-w-0 flex-1\">{notice}</Text>\n\t\t\t\t\t<Button type=\"button\" size=\"sm\" buttonStyle=\"ghost\" onClick={onDismissNotice}>{strings.remove}</Button>\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t\t{alt !== null && (\n\t\t\t\t// The action sits on the field's own row, so it lines up with the input, not the hint.\n\t\t\t\t<FormField label={strings.descriptionLabel} hint={strings.descriptionHint} htmlFor={inputId}>\n\t\t\t\t\t{/* A compound field: the fragment keeps FormField from labelling the row itself. */}\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" gap=\"sm\" wrap={false}>\n\t\t\t\t\t\t\t<Input id={inputId} value={alt} className=\"min-w-0 flex-1\" onChange={(event) => onAltChange(event.target.value)} />\n\t\t\t\t\t\t\t<Button type=\"button\" buttonStyle=\"outline\" onClick={onRemove}>{strings.removeImage}</Button>\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</>\n\t\t\t\t</FormField>\n\t\t\t)}\n\t\t</Stack>\n\t);\n}\n","import * as TiptapReact from '@tiptap/react';\n\nimport { safeImageSrc } from '../../../../lib/safe-image-src';\nimport { UPLOAD_ATTRIBUTE, UPLOAD_PLACEHOLDER_CLASS } from './image-uploads';\n\nfunction positiveNumber(value: string | null): number | null {\n\tconst number = Number(value);\n\treturn Number.isFinite(number) && number > 0 ? number : null;\n}\n\nlet imageNode: TiptapReact.Node | null = null;\nlet imageUploadNode: TiptapReact.Node | null = null;\n\n/**\n * An inline image whose source passes the package image policy; any other\n * `<img>` in loaded or pasted content is dropped. Serializes as a plain\n * `<img src alt width height>`, matching the contenteditable engine.\n */\nexport function getImageNode(): TiptapReact.Node {\n\timageNode ??= TiptapReact.Node.create({\n\t\tname: 'image',\n\t\tgroup: 'inline',\n\t\tinline: true,\n\t\tatom: true,\n\t\tselectable: true,\n\t\tdraggable: true,\n\n\t\taddAttributes() {\n\t\t\treturn {\n\t\t\t\tsrc: { default: null, parseHTML: (element) => safeImageSrc(element.getAttribute('src')) ?? null },\n\t\t\t\talt: { default: '', parseHTML: (element) => element.getAttribute('alt') ?? '' },\n\t\t\t\ttitle: { default: null },\n\t\t\t\twidth: { default: null, parseHTML: (element) => positiveNumber(element.getAttribute('width')) },\n\t\t\t\theight: { default: null, parseHTML: (element) => positiveNumber(element.getAttribute('height')) },\n\t\t\t};\n\t\t},\n\n\t\tparseHTML() {\n\t\t\treturn [{ tag: 'img[src]', getAttrs: (element) => (safeImageSrc((element as HTMLElement).getAttribute('src')) ? null : false) }];\n\t\t},\n\n\t\trenderHTML({ HTMLAttributes }) {\n\t\t\tconst src = safeImageSrc(HTMLAttributes.src);\n\t\t\treturn ['img', TiptapReact.mergeAttributes(HTMLAttributes, { src: src ?? null })];\n\t\t},\n\t});\n\treturn imageNode;\n}\n\n/**\n * The placeholder an image occupies while it uploads. It is never parsed from\n * HTML and the editor strips it from its value; the editor renders the\n * upload status into its node view.\n */\nexport function getImageUploadNode(): TiptapReact.Node {\n\timageUploadNode ??= TiptapReact.Node.create({\n\t\tname: 'imageUpload',\n\t\tgroup: 'inline',\n\t\tinline: true,\n\t\tatom: true,\n\t\tselectable: false,\n\n\t\taddAttributes() {\n\t\t\treturn { id: { default: null } };\n\t\t},\n\n\t\tparseHTML() {\n\t\t\treturn [];\n\t\t},\n\n\t\trenderHTML({ node }) {\n\t\t\treturn ['span', { [UPLOAD_ATTRIBUTE]: node.attrs.id as string }];\n\t\t},\n\n\t\taddNodeView() {\n\t\t\treturn ({ node }) => {\n\t\t\t\tconst dom = document.createElement('span');\n\t\t\t\tdom.setAttribute(UPLOAD_ATTRIBUTE, String(node.attrs.id));\n\t\t\t\tdom.setAttribute('contenteditable', 'false');\n\t\t\t\tdom.className = UPLOAD_PLACEHOLDER_CLASS;\n\t\t\t\t// The status UI is a React portal; keep ProseMirror out of it.\n\t\t\t\treturn { dom, ignoreMutation: () => true, stopEvent: () => true };\n\t\t\t};\n\t\t},\n\t});\n\treturn imageUploadNode;\n}\n","import {\n\tforwardRef,\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseLayoutEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport {\n\tBold,\n\tItalic,\n\tList,\n\tListOrdered,\n\tQuote,\n\tRedo2,\n\tStrikethrough,\n\tUndo2,\n} from 'lucide-react';\nimport * as TiptapReact from '@tiptap/react';\nimport * as StarterKitModule from '@tiptap/starter-kit';\n\nimport { richTextEditorRecipes } from '../rich-text-editor.recipes';\n\nimport { Text } from '../../../typography';\nimport { useStrings } from '../../../../lib/strings';\nimport { resolveFieldInvalid } from '../../../../lib/field-control-attributes';\nimport { cn } from '../../../../lib/utils';\n\nimport { defaultRichTextEditorStrings } from '../rich-text-editor.strings';\nimport type {\n\tRichTextEditorHandle,\n\tRichTextEditorProps,\n\tTiptapEditor,\n\tToolbarButtonConfig,\n} from '../rich-text-editor.types';\nimport { readCaretContext, replaceBeforeCaret } from './caret-helpers';\nimport { CountsFooter } from './counts-footer';\nimport { editorFieldAria } from './editor-field-aria';\nimport { normalizeHtml, toEditorContent } from './html-helpers';\nimport { RichTextEditorToolbar } from './rich-text-editor-toolbar';\nimport { getInlineReferenceNode } from './inline-reference-node';\nimport { getImageNode, getImageUploadNode } from './image-nodes';\nimport {\n\tImageDetailsBar,\n\tImageUploadPortals,\n\timageFilesFrom,\n\tstripUploadPlaceholders,\n\tuseImageInsertControl,\n\tuseImageUploadQueue,\n\ttype ImageUploadAdapter,\n\ttype ImageUploadQueue,\n} from './image-uploads';\n\ntype ProseNode = { type: { name: string }; attrs: Record<string, unknown>; nodeSize: number };\n\n/** Value HTML: the editor's HTML without upload placeholders. */\nfunction valueHtml(editor: { getHTML: () => string } | null | undefined): string {\n\treturn normalizeHtml(stripUploadPlaceholders(editor?.getHTML() ?? ''));\n}\n\nconst EditorContent = TiptapReact.EditorContent;\nconst useTiptapEditor = TiptapReact.useEditor;\nconst useTiptapEditorState = TiptapReact.useEditorState;\nconst StarterKit =\n\t'default' in StarterKitModule ? StarterKitModule.default : StarterKitModule;\n\nexport const TiptapRichTextEditor = forwardRef<RichTextEditorHandle, RichTextEditorProps>(function TiptapRichTextEditor(\n\t{\n\t\tvalue,\n\t\tonValueChange,\n\t\tplaceholder,\n\t\tcompact = false,\n\t\tbodyHeight,\n\t\tminHeight,\n\t\tmaxHeight,\n\t\tdisabled = false,\n\t\tinvalid,\n\t\tid,\n\t\tonBlur,\n\t\t'aria-label': ariaLabel,\n\t\t'aria-labelledby': ariaLabelledBy,\n\t\t'aria-describedby': ariaDescribedBy,\n\t\t'aria-invalid': ariaInvalidProp,\n\t\tshowCounts = false,\n\t\tmaxLength,\n\t\textraToolbarItems,\n\t\ttoolbarTrailing,\n\t\tfooterSlot,\n\t\thideSourceToggle = false,\n\t\tautoFocus = false,\n\t\tclassName,\n\t\tonCaretChange,\n\t\tonEditorKeyDown,\n\t\tsuggestionPopup,\n\t\tstrings: stringsProp,\n\t\timages,\n\t},\n\tref,\n) {\n\tconst strings = useStrings(defaultRichTextEditorStrings, stringsProp);\n\tconst { ariaInvalid } = resolveFieldInvalid(invalid, ariaInvalidProp);\n\tconst imagesEnabled = Boolean(images);\n\tconst queueRef = useRef<ImageUploadQueue | null>(null);\n\tconst editorInstanceRef = useRef<TiptapEditor | null>(null);\n\tconst [isFocused, setIsFocused] = useState(false);\n\tconst [sourceMode, setSourceMode] = useState(false);\n\tconst sourceRef = useRef<HTMLTextAreaElement>(null);\n\tconst [sourceValue, setSourceValue] = useState('');\n\tconst isFocusedRef = useRef(false);\n\tconst externalValueRef = useRef<string>(normalizeHtml(value));\n\tconst onCaretChangeRef = useRef(onCaretChange);\n\tonCaretChangeRef.current = onCaretChange;\n\tconst keyHandler = disabled ? undefined : onEditorKeyDown;\n\tconst keyHandlerRef = useRef(keyHandler);\n\tuseLayoutEffect(() => {\n\t\tkeyHandlerRef.current = keyHandler;\n\t}, [keyHandler]);\n\tconst listboxId = suggestionPopup?.listboxId;\n\tconst activeOptionId = suggestionPopup?.activeOptionId;\n\tconst editorLabel = ariaLabel ?? strings.editorLabel;\n\tconst editorAttributes = useMemo(() => {\n\t\tconst attributes: Record<string, string> = {\n\t\t\t'data-slot': 'editor-field',\n\t\t\tclass: richTextEditorRecipes.editable,\n\t\t};\n\t\tconst fieldAttributes = {\n\t\t\t...editorFieldAria(editorLabel, listboxId, activeOptionId),\n\t\t\tid,\n\t\t\t'aria-labelledby': ariaLabelledBy,\n\t\t\t'aria-describedby': ariaDescribedBy,\n\t\t\t'aria-invalid': ariaInvalid,\n\t\t};\n\t\tfor (const [name, value] of Object.entries(fieldAttributes)) {\n\t\t\tif (value !== undefined) attributes[name] = String(value);\n\t\t}\n\t\treturn attributes;\n\t}, [activeOptionId, ariaDescribedBy, ariaInvalid, ariaLabelledBy, editorLabel, id, listboxId]);\n\n\tconst extensions = useMemo(\n\t\t() => [StarterKit, getInlineReferenceNode(), ...(imagesEnabled ? [getImageNode(), getImageUploadNode()] : [])],\n\t\t[imagesEnabled],\n\t);\n\tconst editor = useTiptapEditor({\n\t\textensions,\n\t\tcontent: toEditorContent(value),\n\t\teditable: !disabled,\n\t\timmediatelyRender: false,\n\t\tautofocus: autoFocus ? 'end' : false,\n\t\tonFocus: () => {\n\t\t\tisFocusedRef.current = true;\n\t\t\tsetIsFocused(true);\n\t\t},\n\t\tonBlur: () => {\n\t\t\tisFocusedRef.current = false;\n\t\t\tsetIsFocused(false);\n\t\t},\n\t\tonUpdate: ({ editor: currentEditor }: { editor: { getHTML: () => string } }) => {\n\t\t\tqueueRef.current?.prune();\n\t\t\tconst html = valueHtml(currentEditor);\n\n\t\t\tif (html !== externalValueRef.current) {\n\t\t\t\texternalValueRef.current = html;\n\t\t\t\tonValueChange(html);\n\t\t\t}\n\n\t\t\tif (isFocusedRef.current) onCaretChangeRef.current?.();\n\t\t},\n\t\teditorProps: {\n\t\t\thandleKeyDown: (_view, event) => {\n\t\t\t\tif (!keyHandlerRef.current?.(event)) return false;\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\t// Image files from the clipboard or a drop go through the upload lifecycle.\n\t\t\thandlePaste: (_view: unknown, event: ClipboardEvent) => {\n\t\t\t\tconst files = imageFilesFrom(event.clipboardData);\n\t\t\t\tif (!queueRef.current || !imagesRef.current || files.length === 0) return false;\n\t\t\t\tqueueRef.current.addFiles(files);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\thandleDrop: (view: { posAtCoords: (coords: { left: number; top: number }) => { pos: number } | null }, event: DragEvent, _slice: unknown, moved: boolean) => {\n\t\t\t\tconst files = imageFilesFrom(event.dataTransfer);\n\t\t\t\tif (moved || !queueRef.current || !imagesRef.current || files.length === 0) return false;\n\t\t\t\tconst at = view.posAtCoords({ left: event.clientX, top: event.clientY });\n\t\t\t\tif (at) editorInstanceRef.current?.commands.setTextSelection(at.pos);\n\t\t\t\tqueueRef.current.addFiles(files);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\tattributes: editorAttributes,\n\t\t},\n\t// Image nodes join the schema only when images are enabled, which needs a new editor.\n\t}, [imagesEnabled]);\n\n\tuseLayoutEffect(() => {\n\t\tif (editor && editor.options.editorProps.attributes !== editorAttributes) {\n\t\t\teditor.setOptions({ editorProps: { ...editor.options.editorProps, attributes: editorAttributes } });\n\t\t}\n\t}, [editor, editorAttributes]);\n\n\tuseEffect(() => {\n\t\tif (!editor) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst current = valueHtml(editor);\n\t\tconst next = normalizeHtml(value);\n\t\texternalValueRef.current = next;\n\n\t\tif (current !== next) {\n\t\t\teditor.chain()\n\t\t\t\t.setMeta('addToHistory', false)\n\t\t\t\t.setContent(toEditorContent(next), { emitUpdate: false })\n\t\t\t\t.run();\n\t\t}\n\t}, [editor, value]);\n\n\tuseEffect(() => {\n\t\tif (editor && sourceMode) setSourceValue(editor.getHTML());\n\t}, [editor, sourceMode, value]);\n\n\tuseEffect(() => {\n\t\tif (!editor) {\n\t\t\treturn;\n\t\t}\n\n\t\teditor.setEditable(!disabled, false);\n\t}, [disabled, editor]);\n\n\tuseEffect(() => {\n\t\tif (typeof document === 'undefined') return;\n\t\tconst handler = () => {\n\t\t\tif (!isFocusedRef.current) return;\n\t\t\tonCaretChangeRef.current?.();\n\t\t};\n\t\tdocument.addEventListener('selectionchange', handler);\n\t\treturn () => document.removeEventListener('selectionchange', handler);\n\t}, []);\n\n\tuseImperativeHandle(\n\t\tref,\n\t\t() => ({\n\t\t\tfocus: () => {\n\t\t\t\tif (sourceRef.current) sourceRef.current.focus();\n\t\t\t\telse editor?.chain().focus().run();\n\t\t\t},\n\t\t\tgetHTML: () => valueHtml(editor),\n\t\t\tsetHTML: (html: string) => {\n\t\t\t\tconst next = normalizeHtml(html);\n\t\t\t\texternalValueRef.current = next;\n\t\t\t\teditor?.commands.setContent(toEditorContent(next), { emitUpdate: false });\n\t\t\t\tonValueChange(next);\n\t\t\t},\n\t\t\tinsertHTML: (html: string) => {\n\t\t\t\tif (!editor) return;\n\t\t\t\teditor.chain().focus().insertContent(html).run();\n\t\t\t},\n\t\t\tisEmpty: () => valueHtml(editor) === '',\n\t\t\tclear: () => {\n\t\t\t\texternalValueRef.current = '';\n\t\t\t\teditor?.commands.setContent('<p></p>', { emitUpdate: false });\n\t\t\t\tonValueChange('');\n\t\t\t},\n\t\t\tgetCaretContext: () => readCaretContext(),\n\t\t\treplaceBeforeCaret: (length: number, html: string) => {\n\t\t\t\tif (editor) replaceBeforeCaret(editor, length, html);\n\t\t\t},\n\t\t}),\n\t\t[editor, onValueChange],\n\t);\n\n\teditorInstanceRef.current = editor ?? null;\n\tconst imagesRef = useRef(images);\n\timagesRef.current = images;\n\n\t/** Programmatic changes (an upload landing, a description edit) report the value themselves. */\n\tconst emitValue = useCallback(() => {\n\t\tif (!editor) return;\n\t\tconst html = valueHtml(editor);\n\t\tif (html === externalValueRef.current) return;\n\t\texternalValueRef.current = html;\n\t\tonValueChange(html);\n\t}, [editor, onValueChange]);\n\n\tconst findNode = useCallback((match: (node: ProseNode) => boolean) => {\n\t\tlet found: { pos: number; node: ProseNode } | null = null;\n\t\teditor?.state.doc.descendants((node: ProseNode, pos: number) => {\n\t\t\tif (!found && match(node)) found = { pos, node };\n\t\t\treturn !found;\n\t\t});\n\t\treturn found as { pos: number; node: ProseNode } | null;\n\t}, [editor]);\n\n\tconst adapterRef = useRef<ImageUploadAdapter | null>(null);\n\tadapterRef.current = editor ? {\n\t\tinsertPlaceholder: (id) => {\n\t\t\teditor.chain().focus().insertContent({ type: 'imageUpload', attrs: { id } }).run();\n\t\t},\n\t\tfindPlaceholder: (id) => editor.view.dom.querySelector<HTMLElement>(`[data-rte-upload=\"${id}\"]`),\n\t\tresolvePlaceholder: (id, image) => {\n\t\t\tconst at = findNode((node) => node.type.name === 'imageUpload' && node.attrs.id === id);\n\t\t\tif (!at) return;\n\t\t\tconst created = editor.schema.nodes.image.create({ src: image.src, alt: image.alt ?? '', width: image.width ?? null, height: image.height ?? null });\n\t\t\teditor.view.dispatch(editor.state.tr.replaceWith(at.pos, at.pos + at.node.nodeSize, created));\n\t\t\temitValue();\n\t\t},\n\t\tremovePlaceholder: (id) => {\n\t\t\tconst at = findNode((node) => node.type.name === 'imageUpload' && node.attrs.id === id);\n\t\t\tif (!at) return;\n\t\t\teditor.view.dispatch(editor.state.tr.delete(at.pos, at.pos + at.node.nodeSize));\n\t\t\temitValue();\n\t\t},\n\t} : null;\n\tconst uploadQueue = useImageUploadQueue(images, adapterRef, strings.images);\n\tqueueRef.current = imagesEnabled ? uploadQueue : null;\n\tconst imageInsert = useImageInsertControl(images, strings.images, uploadQueue.addFiles);\n\tconst toolbarItems = useMemo(\n\t\t() => (imageInsert.item ? [imageInsert.item, ...(extraToolbarItems ?? [])] : extraToolbarItems),\n\t\t[extraToolbarItems, imageInsert.item],\n\t);\n\n\t// The image the selection holds, or that sits beside a collapsed caret.\n\tconst [activeImage, setActiveImage] = useState<{ pos: number; alt: string } | null>(null);\n\tuseEffect(() => {\n\t\tif (!editor || !imagesEnabled) return;\n\t\tconst sync = () => {\n\t\t\tconst selection = editor.state.selection as unknown as { node?: ProseNode; empty: boolean; from: number; $from: { nodeBefore: ProseNode | null; nodeAfter: ProseNode | null } };\n\t\t\tlet next: { pos: number; alt: string } | null = null;\n\t\t\tif (selection.node?.type.name === 'image') next = { pos: selection.from, alt: String(selection.node.attrs.alt ?? '') };\n\t\t\telse if (selection.empty) {\n\t\t\t\tconst { nodeBefore, nodeAfter } = selection.$from;\n\t\t\t\tif (nodeBefore?.type.name === 'image') next = { pos: selection.from - nodeBefore.nodeSize, alt: String(nodeBefore.attrs.alt ?? '') };\n\t\t\t\telse if (nodeAfter?.type.name === 'image') next = { pos: selection.from, alt: String(nodeAfter.attrs.alt ?? '') };\n\t\t\t}\n\t\t\tsetActiveImage(next);\n\t\t};\n\t\teditor.on('selectionUpdate', sync);\n\t\teditor.on('update', sync);\n\t\treturn () => {\n\t\t\teditor.off('selectionUpdate', sync);\n\t\t\teditor.off('update', sync);\n\t\t};\n\t}, [editor, imagesEnabled]);\n\n\t// The recipe owns the default body floor; inline style carries only the\n\t// consumer's explicit CSS lengths, which win over that class.\n\tconst bodyMinHeightClassName = richTextEditorRecipes.bodyMinHeight[bodyHeight ?? (compact ? 'control' : 'document')];\n\tconst contentStyle = useMemo(\n\t\t() => ({\n\t\t\t...(minHeight ? { minHeight } : {}),\n\t\t\t...(maxHeight ? { maxHeight, overflowY: 'auto' as const } : {}),\n\t\t}),\n\t\t[maxHeight, minHeight],\n\t);\n\n\tconst toggleSourceMode = useCallback(() => {\n\t\tif (!editor) return;\n\n\t\tif (sourceMode) {\n\t\t\tif (sourceValue !== editor.getHTML()) {\n\t\t\t\teditor.commands.setContent(toEditorContent(sourceValue), { emitUpdate: false });\n\t\t\t\temitValue();\n\t\t\t}\n\t\t\tsetSourceMode(false);\n\t\t} else {\n\t\t\tsetSourceValue(editor.getHTML());\n\t\t\tsetSourceMode(true);\n\t\t}\n\t}, [editor, emitValue, sourceMode, sourceValue]);\n\n\tconst toolbarState = useTiptapEditorState({\n\t\teditor,\n\t\tselector: ({ editor: current }) => ({\n\t\t\tbold: current?.isActive('bold') ?? false,\n\t\t\titalic: current?.isActive('italic') ?? false,\n\t\t\tstrike: current?.isActive('strike') ?? false,\n\t\t\tbulletList: current?.isActive('bulletList') ?? false,\n\t\t\torderedList: current?.isActive('orderedList') ?? false,\n\t\t\tblockquote: current?.isActive('blockquote') ?? false,\n\t\t\tcanUndo: current?.can().undo() ?? false,\n\t\t\tcanRedo: current?.can().redo() ?? false,\n\t\t\textraActive: toolbarItems?.map((item) => item.isActive?.() ?? false),\n\t\t}),\n\t});\n\n\tconst toolbarButtons = useMemo<ToolbarButtonConfig[]>(\n\t\t() => [\n\t\t\t{\n\t\t\t\tid: 'bold',\n\t\t\t\ticon: Bold,\n\t\t\t\tlabel: strings.toolbar.bold,\n\t\t\t\tisActive: () => toolbarState?.bold ?? false,\n\t\t\t\ttoggle: true,\n\t\t\t\trun: () => editor?.chain().focus().toggleBold().run(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'italic',\n\t\t\t\ticon: Italic,\n\t\t\t\tlabel: strings.toolbar.italic,\n\t\t\t\tisActive: () => toolbarState?.italic ?? false,\n\t\t\t\ttoggle: true,\n\t\t\t\trun: () => editor?.chain().focus().toggleItalic().run(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'strike',\n\t\t\t\ticon: Strikethrough,\n\t\t\t\tlabel: strings.toolbar.strike,\n\t\t\t\tisActive: () => toolbarState?.strike ?? false,\n\t\t\t\ttoggle: true,\n\t\t\t\trun: () => editor?.chain().focus().toggleStrike().run(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'bullet-list',\n\t\t\t\ticon: List,\n\t\t\t\tlabel: strings.toolbar.bulletList,\n\t\t\t\tisActive: () => toolbarState?.bulletList ?? false,\n\t\t\t\ttoggle: true,\n\t\t\t\trun: () => editor?.chain().focus().toggleBulletList().run(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'ordered-list',\n\t\t\t\ticon: ListOrdered,\n\t\t\t\tlabel: strings.toolbar.orderedList,\n\t\t\t\tisActive: () => toolbarState?.orderedList ?? false,\n\t\t\t\ttoggle: true,\n\t\t\t\trun: () => editor?.chain().focus().toggleOrderedList().run(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'blockquote',\n\t\t\t\ticon: Quote,\n\t\t\t\tlabel: strings.toolbar.blockquote,\n\t\t\t\tisActive: () => toolbarState?.blockquote ?? false,\n\t\t\t\ttoggle: true,\n\t\t\t\trun: () => editor?.chain().focus().toggleBlockquote().run(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'undo',\n\t\t\t\ticon: Undo2,\n\t\t\t\tlabel: strings.toolbar.undo,\n\t\t\t\tisActive: () => false,\n\t\t\t\trun: () => editor?.chain().focus().undo().run(),\n\t\t\t\tdisabled: !toolbarState?.canUndo,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'redo',\n\t\t\t\ticon: Redo2,\n\t\t\t\tlabel: strings.toolbar.redo,\n\t\t\t\tisActive: () => false,\n\t\t\t\trun: () => editor?.chain().focus().redo().run(),\n\t\t\t\tdisabled: !toolbarState?.canRedo,\n\t\t\t},\n\t\t],\n\t\t[editor, strings, toolbarState],\n\t);\n\n\tconst countsFooter =\n\t\tshowCounts && editor ? (\n\t\t\t<CountsFooter\n\t\t\t\teditor={editor}\n\t\t\t\tsourceMode={sourceMode}\n\t\t\t\tsourceValue={sourceValue}\n\t\t\t\tmaxLength={maxLength}\n\t\t\t\tstrings={strings}\n\t\t\t/>\n\t\t) : null;\n\n\tconst placeholderText = typeof placeholder === 'string' ? placeholder : '';\n\tconst showPlaceholder =\n\t\tplaceholderText.length > 0 && !isFocused && Boolean(editor?.isEmpty);\n\tconst placeholderNode = showPlaceholder ? (\n\t\t<Text\n\t\t\ttag=\"span\"\n\t\t\tsize=\"sm\"\n\t\t\ttype=\"secondary\"\n\t\t\tclassName={richTextEditorRecipes.placeholder}\n\t\t>\n\t\t\t{placeholderText}\n\t\t</Text>\n\t) : null;\n\n\treturn (\n\t\t<div\n\t\t\tonBlur={onBlur && (event => {\n\t\t\t\tif (!event.currentTarget.contains(event.relatedTarget)) onBlur(event);\n\t\t\t})}\n\t\t\tclassName={cn(\n\t\t\t\trichTextEditorRecipes.frame,\n\t\t\t\tdisabled && richTextEditorRecipes.disabled,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<RichTextEditorToolbar\n\t\t\t\tbuttons={toolbarButtons}\n\t\t\t\textraToolbarItems={toolbarItems}\n\t\t\t\textraToolbarActive={toolbarState?.extraActive}\n\t\t\t\thideSourceToggle={hideSourceToggle}\n\t\t\t\tsourceMode={sourceMode}\n\t\t\t\ttoggleSourceMode={toggleSourceMode}\n\t\t\t\tdisabled={disabled}\n\t\t\t\thasEditor={Boolean(editor)}\n\t\t\t\ttoolbarTrailing={toolbarTrailing}\n\t\t\t\tstrings={strings}\n\t\t\t/>\n\n\t\t\t{sourceMode ? (\n\t\t\t\t<textarea\n\t\t\t\t\tref={sourceRef}\n\t\t\t\t\tid={id}\n\t\t\t\t\tdata-slot=\"editor-field\"\n\t\t\t\t\taria-label={ariaLabel ?? strings.sourceLabel}\n\t\t\t\t\taria-labelledby={ariaLabelledBy}\n\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\taria-invalid={ariaInvalid}\n\t\t\t\t\tvalue={sourceValue}\n\t\t\t\t\tonChange={(event) => setSourceValue(event.target.value)}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tspellCheck={false}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\trichTextEditorRecipes.source,\n\t\t\t\t\t\tbodyMinHeightClassName,\n\t\t\t\t\t\tdisabled && 'cursor-not-allowed',\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={contentStyle}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<div className={cn('relative', bodyMinHeightClassName)} style={contentStyle}>\n\t\t\t\t\t{placeholderNode}\n\n\t\t\t\t\t<EditorContent\n\t\t\t\t\t\teditor={editor}\n\t\t\t\t\t\tclassName={richTextEditorRecipes.content}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{imagesEnabled && (\n\t\t\t\t<ImageDetailsBar\n\t\t\t\t\talt={activeImage ? activeImage.alt : null}\n\t\t\t\t\tonAltChange={(alt) => {\n\t\t\t\t\t\tif (!editor || !activeImage) return;\n\t\t\t\t\t\tconst node = editor.state.doc.nodeAt(activeImage.pos) as ProseNode | null;\n\t\t\t\t\t\tif (node?.type.name !== 'image') return;\n\t\t\t\t\t\teditor.view.dispatch(editor.state.tr.setNodeAttribute(activeImage.pos, 'alt', alt));\n\t\t\t\t\t\tsetActiveImage({ ...activeImage, alt });\n\t\t\t\t\t\temitValue();\n\t\t\t\t\t}}\n\t\t\t\t\tonRemove={() => {\n\t\t\t\t\t\tif (!editor || !activeImage) return;\n\t\t\t\t\t\tconst node = editor.state.doc.nodeAt(activeImage.pos) as ProseNode | null;\n\t\t\t\t\t\tif (node?.type.name !== 'image') return;\n\t\t\t\t\t\teditor.view.dispatch(editor.state.tr.delete(activeImage.pos, activeImage.pos + node.nodeSize));\n\t\t\t\t\t\tsetActiveImage(null);\n\t\t\t\t\t\temitValue();\n\t\t\t\t\t\teditor.commands.focus();\n\t\t\t\t\t}}\n\t\t\t\t\tnotice={uploadQueue.notice}\n\t\t\t\t\tonDismissNotice={uploadQueue.dismissNotice}\n\t\t\t\t\tstrings={strings.images}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{!!footerSlot && (\n\t\t\t\t<div className={cn(richTextEditorRecipes.regionX, 'pb-space-md pt-space-xs')}>{footerSlot}</div>\n\t\t\t)}\n\n\t\t\t{countsFooter}\n\t\t\t{imageInsert.input}\n\t\t\t{imagesEnabled && <ImageUploadPortals queue={uploadQueue} adapterRef={adapterRef} strings={strings.images} />}\n\t\t</div>\n\t);\n});\n\nTiptapRichTextEditor.displayName = 'TiptapRichTextEditor';\n\n// Tiptap 3 exports EditorContent as React.memo (an object), so accept any component type.\nconst isComponentType = (value: unknown) =>\n\ttypeof value === 'function' || (typeof value === 'object' && value !== null && '$$typeof' in value);\n\nexport const hasTiptapRuntime =\n\tisComponentType(EditorContent) &&\n\ttypeof useTiptapEditor === 'function' &&\n\ttypeof useTiptapEditorState === 'function' &&\n\ttypeof StarterKit === 'object' &&\n\tStarterKit !== null;\n","import {\n\tforwardRef,\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport {\n\tBold,\n\tItalic,\n\tList,\n\tListOrdered,\n\tQuote,\n\tRedo2,\n\tStrikethrough,\n\tUndo2,\n} from 'lucide-react';\n\nimport { richTextEditorRecipes } from '../rich-text-editor.recipes';\n\nimport { Text } from '../../../typography';\nimport { sanitizeHtml } from '../../../../lib/sanitize-html';\nimport { resolveFieldInvalid } from '../../../../lib/field-control-attributes';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { defaultRichTextEditorStrings } from '../rich-text-editor.strings';\nimport type {\n\tRichTextEditorHandle,\n\tRichTextEditorProps,\n\tToolbarButtonConfig,\n} from '../rich-text-editor.types';\nimport {\n\tinsertHtmlIntoEditable,\n\treadCaretContext,\n\treplaceBeforeCaret,\n} from './caret-helpers';\nimport { CountsFooterText } from './counts-footer';\nimport { editorFieldAria } from './editor-field-aria';\nimport { normalizeHtml, toEditorContent } from './html-helpers';\nimport { RichTextEditorToolbar } from './rich-text-editor-toolbar';\nimport {\n\tImageDetailsBar,\n\tImageUploadPortals,\n\tUPLOAD_ATTRIBUTE,\n\tUPLOAD_PLACEHOLDER_CLASS,\n\timageFilesFrom,\n\tuseImageInsertControl,\n\tuseImageUploadQueue,\n\ttype ImageUploadAdapter,\n} from './image-uploads';\nimport { safeImageSrc } from '../../../../lib/safe-image-src';\n\n/** The editable's HTML without upload placeholders, which are never part of the value. */\nfunction serializeEditable(editable: HTMLElement | null): string {\n\tif (!editable) return '';\n\tif (!editable.querySelector(`[${UPLOAD_ATTRIBUTE}]`)) return editable.innerHTML;\n\tconst copy = editable.cloneNode(true) as HTMLElement;\n\tfor (const placeholder of Array.from(copy.querySelectorAll(`[${UPLOAD_ATTRIBUTE}]`))) placeholder.remove();\n\treturn copy.innerHTML;\n}\n\n/** Pasted markup may carry images; keep only those whose source passes the image policy. */\nfunction removeUnsafeImages(editable: HTMLElement): void {\n\tfor (const image of Array.from(editable.querySelectorAll('img'))) {\n\t\tif (!safeImageSrc(image.getAttribute('src'))) image.remove();\n\t}\n}\n\n/** The image the selection touches, or that sits right beside a collapsed caret. */\nfunction imageAtSelection(editable: HTMLElement): HTMLImageElement | null {\n\tconst selection = window.getSelection();\n\tif (!selection || selection.rangeCount === 0) return null;\n\tconst range = selection.getRangeAt(0);\n\tif (!editable.contains(range.commonAncestorContainer)) return null;\n\tfor (const image of Array.from(editable.querySelectorAll('img'))) {\n\t\tif (range.intersectsNode(image) && !range.collapsed) return image;\n\t}\n\tif (!range.collapsed) return null;\n\tconst { startContainer, startOffset } = range;\n\tconst neighbours = startContainer.nodeType === Node.TEXT_NODE\n\t\t? [startOffset === 0 ? startContainer.previousSibling : null, startOffset === (startContainer.textContent?.length ?? 0) ? startContainer.nextSibling : null]\n\t\t: [startContainer.childNodes[startOffset - 1] ?? null, startContainer.childNodes[startOffset] ?? null];\n\treturn (neighbours.find((node) => node instanceof HTMLImageElement) as HTMLImageElement | undefined) ?? null;\n}\n\n/** Places the caret where a drop happened. */\nfunction placeCaretAtPoint(x: number, y: number): void {\n\tconst doc = document as Document & {\n\t\tcaretRangeFromPoint?: (x: number, y: number) => Range | null;\n\t\tcaretPositionFromPoint?: (x: number, y: number) => { offsetNode: Node; offset: number } | null;\n\t};\n\tlet range = doc.caretRangeFromPoint?.(x, y) ?? null;\n\tif (!range) {\n\t\tconst position = doc.caretPositionFromPoint?.(x, y);\n\t\tif (position) {\n\t\t\trange = document.createRange();\n\t\t\trange.setStart(position.offsetNode, position.offset);\n\t\t}\n\t}\n\tif (!range) return;\n\trange.collapse(true);\n\tconst selection = window.getSelection();\n\tselection?.removeAllRanges();\n\tselection?.addRange(range);\n}\n\n/**\n * Fallback editor used when the TipTap runtime is unavailable (e.g. in\n * environments where the package failed to load). Renders a\n * `contenteditable` surface with the same imperative handle so callers\n * never need to care which variant they got.\n */\nexport const FallbackRichTextEditor = forwardRef<RichTextEditorHandle, RichTextEditorProps>(function FallbackRichTextEditor(\n\t{\n\t\tvalue,\n\t\tonValueChange,\n\t\tplaceholder,\n\t\tcompact = false,\n\t\tbodyHeight,\n\t\tminHeight,\n\t\tmaxHeight,\n\t\tdisabled = false,\n\t\tinvalid,\n\t\tid,\n\t\tonBlur,\n\t\t'aria-label': ariaLabel,\n\t\t'aria-labelledby': ariaLabelledBy,\n\t\t'aria-describedby': ariaDescribedBy,\n\t\t'aria-invalid': ariaInvalidProp,\n\t\tshowCounts = false,\n\t\tmaxLength,\n\t\textraToolbarItems,\n\t\ttoolbarTrailing,\n\t\tfooterSlot,\n\t\thideSourceToggle = false,\n\t\tautoFocus = false,\n\t\tclassName,\n\t\tonCaretChange,\n\t\tonEditorKeyDown,\n\t\tsuggestionPopup,\n\t\tstrings: stringsProp,\n\t\timages,\n\t},\n\tref,\n) {\n\tconst strings = useStrings(defaultRichTextEditorStrings, stringsProp);\n\tconst { ariaInvalid } = resolveFieldInvalid(invalid, ariaInvalidProp);\n\tconst editableRef = useRef<HTMLDivElement>(null);\n\tconst savedRangeRef = useRef<Range | null>(null);\n\tconst [activeImage, setActiveImage] = useState<HTMLImageElement | null>(null);\n\tconst [activeAlt, setActiveAlt] = useState('');\n\tconst [isFocused, setIsFocused] = useState(false);\n\tconst [sourceMode, setSourceMode] = useState(false);\n\tconst sourceRef = useRef<HTMLTextAreaElement>(null);\n\tconst [sourceValue, setSourceValue] = useState('');\n\tconst externalValueRef = useRef<string>(normalizeHtml(value));\n\tconst onCaretChangeRef = useRef(onCaretChange);\n\tonCaretChangeRef.current = onCaretChange;\n\n\tconst setEditableRef = useCallback((node: HTMLDivElement | null) => {\n\t\teditableRef.current = node;\n\t\tif (node && node.innerHTML === '') {\n\t\t\tnode.innerHTML = toEditorContent(externalValueRef.current);\n\t\t}\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst editable = editableRef.current;\n\t\tif (!editable || isFocused) return;\n\t\tconst next = toEditorContent(value);\n\t\tif (normalizeHtml(serializeEditable(editable)) !== normalizeHtml(next)) {\n\t\t\teditable.innerHTML = next;\n\t\t}\n\t\texternalValueRef.current = normalizeHtml(value);\n\t}, [isFocused, value]);\n\n\tuseEffect(() => {\n\t\tif (!sourceMode) return;\n\t\texternalValueRef.current = normalizeHtml(value);\n\t\tsetSourceValue(toEditorContent(value));\n\t}, [sourceMode, value]);\n\n\tuseEffect(() => {\n\t\tif (!autoFocus) return;\n\t\teditableRef.current?.focus();\n\t}, [autoFocus]);\n\n\tconst emitEditableChange = useCallback(() => {\n\t\tconst editable = editableRef.current;\n\t\tconst html = normalizeHtml(serializeEditable(editable));\n\t\texternalValueRef.current = html;\n\t\tonValueChange(html);\n\t\tonCaretChangeRef.current?.();\n\t}, [onValueChange]);\n\n\tconst adapterRef = useRef<ImageUploadAdapter | null>(null);\n\tadapterRef.current = {\n\t\tinsertPlaceholder: (id) => {\n\t\t\tconst editable = editableRef.current;\n\t\t\tif (!editable) return;\n\t\t\tconst saved = savedRangeRef.current;\n\t\t\tif (saved && editable.contains(saved.commonAncestorContainer) && !editable.contains(document.activeElement)) {\n\t\t\t\teditable.focus();\n\t\t\t\tconst selection = window.getSelection();\n\t\t\t\tselection?.removeAllRanges();\n\t\t\t\tselection?.addRange(saved);\n\t\t\t}\n\t\t\tinsertHtmlIntoEditable(editable, `<span ${UPLOAD_ATTRIBUTE}=\"${id}\" contenteditable=\"false\" class=\"${UPLOAD_PLACEHOLDER_CLASS}\"></span>`);\n\t\t},\n\t\tfindPlaceholder: (id) => editableRef.current?.querySelector<HTMLElement>(`[${UPLOAD_ATTRIBUTE}=\"${id}\"]`) ?? null,\n\t\tresolvePlaceholder: (id, image) => {\n\t\t\tconst placeholder = editableRef.current?.querySelector(`[${UPLOAD_ATTRIBUTE}=\"${id}\"]`);\n\t\t\tif (!placeholder) return;\n\t\t\tconst element = document.createElement('img');\n\t\t\telement.setAttribute('src', image.src);\n\t\t\telement.setAttribute('alt', image.alt ?? '');\n\t\t\tif (image.width) element.setAttribute('width', String(image.width));\n\t\t\tif (image.height) element.setAttribute('height', String(image.height));\n\t\t\tplaceholder.replaceWith(element);\n\t\t\temitEditableChange();\n\t\t},\n\t\tremovePlaceholder: (id) => {\n\t\t\teditableRef.current?.querySelector(`[${UPLOAD_ATTRIBUTE}=\"${id}\"]`)?.remove();\n\t\t\temitEditableChange();\n\t\t},\n\t};\n\tconst uploadQueue = useImageUploadQueue(images, adapterRef, strings.images);\n\tconst imageInsert = useImageInsertControl(images, strings.images, uploadQueue.addFiles, () => {\n\t\tconst selection = window.getSelection();\n\t\tconst range = selection && selection.rangeCount > 0 ? selection.getRangeAt(0) : null;\n\t\tsavedRangeRef.current = range && editableRef.current?.contains(range.commonAncestorContainer) ? range.cloneRange() : null;\n\t});\n\tconst toolbarItems = useMemo(\n\t\t() => (imageInsert.item ? [imageInsert.item, ...(extraToolbarItems ?? [])] : extraToolbarItems),\n\t\t[extraToolbarItems, imageInsert.item],\n\t);\n\n\tconst syncActiveImage = useCallback(() => {\n\t\tconst editable = editableRef.current;\n\t\tif (!images || !editable) return;\n\t\t// Typing in the description field moves the selection out; keep the image then.\n\t\tconst selection = window.getSelection();\n\t\tif (selection && selection.rangeCount > 0 && !editable.contains(selection.getRangeAt(0).commonAncestorContainer)) return;\n\t\tconst image = imageAtSelection(editable);\n\t\tsetActiveImage(image);\n\t\tsetActiveAlt(image?.getAttribute('alt') ?? '');\n\t}, [images]);\n\n\tuseEffect(() => {\n\t\tif (!images || typeof document === 'undefined') return;\n\t\tdocument.addEventListener('selectionchange', syncActiveImage);\n\t\treturn () => document.removeEventListener('selectionchange', syncActiveImage);\n\t}, [images, syncActiveImage]);\n\n\tconst handleInput = useCallback(() => {\n\t\tconst editable = editableRef.current;\n\t\tif (images && editable) {\n\t\t\tremoveUnsafeImages(editable);\n\t\t\tuploadQueue.prune();\n\t\t\tif (activeImage && !activeImage.isConnected) setActiveImage(null);\n\t\t}\n\t\temitEditableChange();\n\t}, [activeImage, emitEditableChange, images, uploadQueue]);\n\n\tuseImperativeHandle(\n\t\tref,\n\t\t() => ({\n\t\t\tfocus: () => (sourceRef.current ?? editableRef.current)?.focus(),\n\t\t\tgetHTML: () => normalizeHtml(serializeEditable(editableRef.current)),\n\t\t\tsetHTML: (html: string) => {\n\t\t\t\tconst next = normalizeHtml(html);\n\t\t\t\texternalValueRef.current = next;\n\t\t\t\tif (editableRef.current) {\n\t\t\t\t\teditableRef.current.innerHTML = toEditorContent(next);\n\t\t\t\t}\n\t\t\t\tonValueChange(next);\n\t\t\t},\n\t\t\tinsertHTML: (html: string) => {\n\t\t\t\tinsertHtmlIntoEditable(editableRef.current, html);\n\t\t\t\temitEditableChange();\n\t\t\t},\n\t\t\tisEmpty: () => normalizeHtml(serializeEditable(editableRef.current)) === '',\n\t\t\tclear: () => {\n\t\t\t\texternalValueRef.current = '';\n\t\t\t\tif (editableRef.current) editableRef.current.innerHTML = '<p></p>';\n\t\t\t\tonValueChange('');\n\t\t\t},\n\t\t\tgetCaretContext: () => readCaretContext(),\n\t\t\treplaceBeforeCaret: (length: number, html: string) => {\n\t\t\t\treplaceBeforeCaret(null, length, html, () => emitEditableChange());\n\t\t\t},\n\t\t}),\n\t\t[emitEditableChange, onValueChange],\n\t);\n\n\t// The recipe owns the default body floor; inline style carries only the\n\t// consumer's explicit CSS lengths, which win over that class.\n\tconst bodyMinHeightClassName = richTextEditorRecipes.bodyMinHeight[bodyHeight ?? (compact ? 'control' : 'document')];\n\tconst contentStyle = useMemo(\n\t\t() => ({\n\t\t\t...(minHeight ? { minHeight } : {}),\n\t\t\t...(maxHeight ? { maxHeight, overflowY: 'auto' as const } : {}),\n\t\t}),\n\t\t[maxHeight, minHeight],\n\t);\n\n\tconst toggleSourceMode = useCallback(() => {\n\t\tif (sourceMode) {\n\t\t\tconst template = document.createElement('template');\n\t\t\ttemplate.innerHTML = sanitizeHtml(sourceValue, { images: Boolean(images) });\n\t\t\tconst normalized = normalizeHtml(template.innerHTML);\n\t\t\tif (normalized !== externalValueRef.current) {\n\t\t\t\texternalValueRef.current = normalized;\n\t\t\t\tonValueChange(normalized);\n\t\t\t}\n\t\t\tsetSourceMode(false);\n\t\t\treturn;\n\t\t}\n\t\tsetSourceValue(editableRef.current?.innerHTML ?? toEditorContent(value));\n\t\tsetSourceMode(true);\n\t}, [images, onValueChange, sourceMode, sourceValue, value]);\n\n\tconst placeholderText = typeof placeholder === 'string' ? placeholder : '';\n\tconst isEmpty = normalizeHtml(externalValueRef.current) === '' && uploadQueue.uploads.length === 0;\n\tconst placeholderNode =\n\t\tplaceholderText.length > 0 && !isFocused && isEmpty ? (\n\t\t\t<Text\n\t\t\t\ttag=\"span\"\n\t\t\t\tsize=\"sm\"\n\t\t\t\ttype=\"secondary\"\n\t\t\t\tclassName={richTextEditorRecipes.placeholder}\n\t\t\t>\n\t\t\t\t{placeholderText}\n\t\t\t</Text>\n\t\t) : null;\n\n\tconst toolbarButtons = useMemo<ToolbarButtonConfig[]>(\n\t\t() => [\n\t\t\t{ id: 'bold', toggle: true, icon: Bold, label: strings.toolbar.bold, isActive: () => false, run: () => undefined, disabled: true },\n\t\t\t{ id: 'italic', toggle: true, icon: Italic, label: strings.toolbar.italic, isActive: () => false, run: () => undefined, disabled: true },\n\t\t\t{ id: 'strike', toggle: true, icon: Strikethrough, label: strings.toolbar.strike, isActive: () => false, run: () => undefined, disabled: true },\n\t\t\t{ id: 'bullet-list', toggle: true, icon: List, label: strings.toolbar.bulletList, isActive: () => false, run: () => undefined, disabled: true },\n\t\t\t{ id: 'ordered-list', toggle: true, icon: ListOrdered, label: strings.toolbar.orderedList, isActive: () => false, run: () => undefined, disabled: true },\n\t\t\t{ id: 'blockquote', toggle: true, icon: Quote, label: strings.toolbar.blockquote, isActive: () => false, run: () => undefined, disabled: true },\n\t\t\t{ id: 'undo', icon: Undo2, label: strings.toolbar.undo, isActive: () => false, run: () => undefined, disabled: true },\n\t\t\t{ id: 'redo', icon: Redo2, label: strings.toolbar.redo, isActive: () => false, run: () => undefined, disabled: true },\n\t\t],\n\t\t[strings],\n\t);\n\n\tconst text = sourceMode\n\t\t? sourceValue.replace(/<[^>]*>/g, '')\n\t\t: (editableRef.current?.innerText ?? normalizeHtml(value).replace(/<[^>]*>/g, ''));\n\tconst countsFooter =\n\t\tshowCounts ? (\n\t\t\t<CountsFooterText text={text} maxLength={maxLength} strings={strings} />\n\t\t) : null;\n\n\treturn (\n\t\t<div\n\t\t\tonBlur={onBlur && (event => {\n\t\t\t\tif (!event.currentTarget.contains(event.relatedTarget)) onBlur(event);\n\t\t\t})}\n\t\t\tclassName={cn(\n\t\t\t\trichTextEditorRecipes.frame,\n\t\t\t\tdisabled && richTextEditorRecipes.disabled,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<RichTextEditorToolbar\n\t\t\t\tbuttons={toolbarButtons}\n\t\t\t\textraToolbarItems={toolbarItems}\n\t\t\t\thideSourceToggle={hideSourceToggle}\n\t\t\t\tsourceMode={sourceMode}\n\t\t\t\ttoggleSourceMode={toggleSourceMode}\n\t\t\t\tdisabled={disabled}\n\t\t\t\thasEditor\n\t\t\t\ttoolbarTrailing={toolbarTrailing}\n\t\t\t\tstrings={strings}\n\t\t\t/>\n\n\t\t\t{sourceMode ? (\n\t\t\t\t<textarea\n\t\t\t\t\tref={sourceRef}\n\t\t\t\t\tid={id}\n\t\t\t\t\tdata-slot=\"editor-field\"\n\t\t\t\t\taria-label={ariaLabel ?? strings.sourceLabel}\n\t\t\t\t\taria-labelledby={ariaLabelledBy}\n\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\taria-invalid={ariaInvalid}\n\t\t\t\t\tvalue={sourceValue}\n\t\t\t\t\tonChange={(event) => setSourceValue(event.target.value)}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tspellCheck={false}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\trichTextEditorRecipes.source,\n\t\t\t\t\t\tbodyMinHeightClassName,\n\t\t\t\t\t\tdisabled && 'cursor-not-allowed',\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={contentStyle}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<div className={cn('relative', bodyMinHeightClassName)} style={contentStyle}>\n\t\t\t\t\t{placeholderNode}\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={setEditableRef}\n\t\t\t\t\t\tid={id}\n\t\t\t\t\t\tdata-slot=\"editor-field\"\n\t\t\t\t\t\t{...editorFieldAria(ariaLabel ?? strings.editorLabel, suggestionPopup?.listboxId, suggestionPopup?.activeOptionId)}\n\t\t\t\t\t\taria-labelledby={ariaLabelledBy}\n\t\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\t\taria-invalid={ariaInvalid}\n\t\t\t\t\t\tcontentEditable={!disabled}\n\t\t\t\t\t\tsuppressContentEditableWarning\n\t\t\t\t\t\tonInput={handleInput}\n\t\t\t\t\t\tonKeyDown={onEditorKeyDown && !disabled ? (event) => {\n\t\t\t\t\t\t\tif (onEditorKeyDown(event.nativeEvent)) {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} : undefined}\n\t\t\t\t\t\tonKeyUp={() => onCaretChangeRef.current?.()}\n\t\t\t\t\t\tonMouseUp={() => onCaretChangeRef.current?.()}\n\t\t\t\t\t\tonClick={images ? (event) => {\n\t\t\t\t\t\t\t// A click on an image selects it, so the description field follows.\n\t\t\t\t\t\t\tif (!(event.target instanceof HTMLImageElement)) return;\n\t\t\t\t\t\t\tconst range = document.createRange();\n\t\t\t\t\t\t\trange.selectNode(event.target);\n\t\t\t\t\t\t\tconst selection = window.getSelection();\n\t\t\t\t\t\t\tselection?.removeAllRanges();\n\t\t\t\t\t\t\tselection?.addRange(range);\n\t\t\t\t\t\t} : undefined}\n\t\t\t\t\t\tonPaste={images ? (event) => {\n\t\t\t\t\t\t\tconst files = imageFilesFrom(event.clipboardData);\n\t\t\t\t\t\t\tif (files.length === 0) return;\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tuploadQueue.addFiles(files);\n\t\t\t\t\t\t} : undefined}\n\t\t\t\t\t\tonDragOver={images ? (event) => {\n\t\t\t\t\t\t\tif (Array.from(event.dataTransfer.types).includes('Files')) event.preventDefault();\n\t\t\t\t\t\t} : undefined}\n\t\t\t\t\t\tonDrop={images ? (event) => {\n\t\t\t\t\t\t\tconst files = imageFilesFrom(event.dataTransfer);\n\t\t\t\t\t\t\tif (files.length === 0) return;\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\teditableRef.current?.focus();\n\t\t\t\t\t\t\tplaceCaretAtPoint(event.clientX, event.clientY);\n\t\t\t\t\t\t\tuploadQueue.addFiles(files);\n\t\t\t\t\t\t} : undefined}\n\t\t\t\t\t\tonFocus={() => setIsFocused(true)}\n\t\t\t\t\t\tonBlur={() => setIsFocused(false)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\trichTextEditorRecipes.editable,\n\t\t\t\t\t\t\t'h-full min-h-full',\n\t\t\t\t\t\t\tdisabled && 'cursor-not-allowed',\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{!!images && (\n\t\t\t\t<ImageDetailsBar\n\t\t\t\t\talt={activeImage ? activeAlt : null}\n\t\t\t\t\tonAltChange={(alt) => {\n\t\t\t\t\t\tsetActiveAlt(alt);\n\t\t\t\t\t\tactiveImage?.setAttribute('alt', alt);\n\t\t\t\t\t\temitEditableChange();\n\t\t\t\t\t}}\n\t\t\t\t\tonRemove={() => {\n\t\t\t\t\t\tactiveImage?.remove();\n\t\t\t\t\t\tsetActiveImage(null);\n\t\t\t\t\t\temitEditableChange();\n\t\t\t\t\t\teditableRef.current?.focus();\n\t\t\t\t\t}}\n\t\t\t\t\tnotice={uploadQueue.notice}\n\t\t\t\t\tonDismissNotice={uploadQueue.dismissNotice}\n\t\t\t\t\tstrings={strings.images}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{!!footerSlot && (\n\t\t\t\t<div className={cn(richTextEditorRecipes.regionX, 'pb-space-md pt-space-xs')}>{footerSlot}</div>\n\t\t\t)}\n\n\t\t\t{countsFooter}\n\t\t\t{imageInsert.input}\n\t\t\t<ImageUploadPortals queue={uploadQueue} adapterRef={adapterRef} strings={strings.images} />\n\t\t</div>\n\t);\n});\n\nFallbackRichTextEditor.displayName = 'FallbackRichTextEditor';\n","/**\n * Public `<RichTextEditor>` shell — picks the TipTap-backed editor when\n * the runtime is loaded and falls back to a plain `contenteditable`\n * surface otherwise. Both variants implement the same imperative\n * `RichTextEditorHandle`, so callers don't have to branch.\n *\n * Heavy lifting lives in `partials/`:\n * - `partials/rich-text-editor-tiptap.tsx` — TipTap variant\n * - `partials/rich-text-editor-fallback.tsx` — contenteditable variant\n * - `partials/rich-text-editor-toolbar.tsx` — shared toolbar\n * - `partials/counts-footer.tsx` — char/word counts\n * - `partials/caret-helpers.ts` — caret introspection\n * - `partials/html-helpers.ts` — HTML normalization\n */\nimport { forwardRef } from 'react';\nimport { cn } from '../../../lib/utils';\n\nimport {\n\tFallbackRichTextEditor,\n\tTiptapRichTextEditor,\n\thasTiptapRuntime,\n} from './partials';\nimport type {\n\tRichTextEditorHandle,\n\tRichTextEditorProps,\n} from './rich-text-editor.types';\n\nexport const RichTextEditor = forwardRef<RichTextEditorHandle, RichTextEditorProps>(function RichTextEditor(\n\t{ name, ...props },\n\tref,\n) {\n\treturn <>\n\t\t{hasTiptapRuntime\n\t\t\t? <TiptapRichTextEditor {...props} ref={ref} />\n\t\t\t: <FallbackRichTextEditor {...props} ref={ref} className={cn('rich-text-editor--component', props.className)} />}\n\t\t{name && <input type=\"hidden\" name={name} value={props.value} disabled={props.disabled} />}\n\t</>;\n});\n\nRichTextEditor.displayName = 'RichTextEditor';\n\nexport type {\n\tRichTextEditorProps,\n\tRichTextEditorHandle,\n\tRichTextEditorToolbarItem,\n\tRichTextCaretContext,\n} from './rich-text-editor.types';\n"],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ "use client";
2
+ import { t as e } from "./utils-DhuoqFy4.js";
3
+ import { n as t } from "./buttons-DeW0bQeK.js";
4
+ import { i as n } from "./text.styles-B64My8RZ.js";
5
+ import { t as r } from "./interaction-recipes-4wZ2tvfb.js";
6
+ import { n as i } from "./content-typography-CnwgMJ37.js";
7
+ import { t as a } from "./field-state-recipes-7sza8QbC.js";
8
+ import { Fragment as o, jsx as s, jsxs as c } from "react/jsx-runtime";
9
+ import { Code2 as l } from "lucide-react";
10
+ //#region src/components/features/rich-text-editor/rich-text-editor.recipes.ts
11
+ var u = {
12
+ source: e("rich-text-editor--source box-border m-0 block min-h-0 w-full resize-y rounded-none border-0 bg-transparent p-surface-xs outline-none disabled:cursor-not-allowed", n({
13
+ type: "main",
14
+ size: "xs",
15
+ weight: "regular",
16
+ align: "left",
17
+ lineHeight: "relaxed",
18
+ numeric: !0
19
+ })),
20
+ editable: e(i, "p-surface-xs"),
21
+ placeholder: "pointer-events-none absolute inset-0 p-surface-xs",
22
+ regionX: "px-surface-xs",
23
+ frame: e("min-w-0 overflow-hidden border-input rounded-radius border bg-transparent transition-[color,box-shadow]", a.editorFocus, a.editorInvalid),
24
+ disabled: "opacity-50",
25
+ disabledControl: "disabled:opacity-100 aria-disabled:opacity-100",
26
+ content: "h-full [&_.ProseMirror]:h-full [&_.ProseMirror]:min-h-full [&_.ProseMirror]:outline-none",
27
+ bodyMinHeight: {
28
+ control: "min-h-control-sm",
29
+ field: "min-h-textarea-sm",
30
+ document: "min-h-48"
31
+ }
32
+ };
33
+ //#endregion
34
+ //#region src/components/features/rich-text-editor/partials/rich-text-editor-toolbar.tsx
35
+ function d({ buttons: n, extraToolbarItems: i, extraToolbarActive: a, hideSourceToggle: d = !1, sourceMode: f, toggleSourceMode: p, disabled: m = !1, hasEditor: h = !0, toolbarTrailing: g, strings: _, className: v }) {
36
+ let y = (i?.length ?? 0) > 0;
37
+ return /* @__PURE__ */ c("div", {
38
+ className: e("rich-text-editor-toolbar--component border-border flex flex-wrap items-center gap-space-xs border-b p-surface-xs", v),
39
+ children: [
40
+ n.map((n) => {
41
+ let i = n.icon, a = n.isActive();
42
+ return /* @__PURE__ */ s(t, {
43
+ type: "button",
44
+ tone: "secondary",
45
+ buttonStyle: "ghost",
46
+ size: "sm",
47
+ iconOnly: !0,
48
+ className: e(a ? r.togglePressed : r.toggleHoverButton, m && u.disabledControl),
49
+ onClick: n.run,
50
+ disabled: m || !h || f || n.disabled,
51
+ "aria-pressed": n.toggle ? a : void 0,
52
+ "aria-label": n.label,
53
+ title: n.label,
54
+ children: /* @__PURE__ */ s(i, { className: "size-icon" })
55
+ }, n.id);
56
+ }),
57
+ !d && /* @__PURE__ */ c(o, { children: [/* @__PURE__ */ s("div", { className: "bg-border mx-space-xs size-icon w-px" }), /* @__PURE__ */ s(t, {
58
+ type: "button",
59
+ tone: "secondary",
60
+ buttonStyle: "ghost",
61
+ size: "sm",
62
+ iconOnly: !0,
63
+ className: e(f ? r.togglePressed : r.toggleHoverButton, m && u.disabledControl),
64
+ onClick: p,
65
+ disabled: m || !h,
66
+ "aria-pressed": f,
67
+ "aria-label": _.toolbar.sourceCode,
68
+ title: _.toolbar.sourceCode,
69
+ children: /* @__PURE__ */ s(l, { className: "size-icon" })
70
+ })] }),
71
+ y && /* @__PURE__ */ c(o, { children: [/* @__PURE__ */ s("div", { className: "bg-border mx-space-xs size-icon w-px" }), i?.map((n, i) => {
72
+ let o = n.icon, c = a?.[i] ?? n.isActive?.() ?? !1, l = n.toggle ?? n.isActive !== void 0;
73
+ return /* @__PURE__ */ s(t, {
74
+ type: "button",
75
+ tone: "secondary",
76
+ buttonStyle: "ghost",
77
+ size: "sm",
78
+ iconOnly: !0,
79
+ className: e(c ? r.togglePressed : r.toggleHoverButton, m && u.disabledControl),
80
+ onClick: n.onClick,
81
+ disabled: m || !h || f || n.disabled,
82
+ "aria-pressed": l ? c : void 0,
83
+ "aria-label": n.label,
84
+ title: n.label,
85
+ children: /* @__PURE__ */ s(o, { className: "size-icon" })
86
+ }, n.id);
87
+ })] }),
88
+ !!g && /* @__PURE__ */ s("div", {
89
+ className: "ml-auto flex items-center gap-space-xs",
90
+ children: g
91
+ })
92
+ ]
93
+ });
94
+ }
95
+ d.displayName = "RichTextEditorToolbar";
96
+ //#endregion
97
+ export { u as n, d as t };
98
+
99
+ //# sourceMappingURL=rich-text-editor-toolbar-DbXig7Jk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rich-text-editor-toolbar-DbXig7Jk.js","names":["_Fragment","cn","Button","resolveTextClassNames","interactionRecipes","editableContentClassName","fieldStateRecipes","richTextEditorRecipes","RichTextEditorToolbar","hasExtras","extraToolbarItems","className","buttons","Icon","button","isActive","disabled","hasEditor","sourceMode","hideSourceToggle","Fragment","toggleSourceMode","strings","Code2","item","extraToolbarActive","index","toggle","toolbarTrailing"],"sources":["../src/components/features/rich-text-editor/rich-text-editor.recipes.ts","../src/components/features/rich-text-editor/partials/rich-text-editor-toolbar.tsx"],"sourcesContent":["import { editableContentClassName } from '../../typography/content-typography';\nimport { resolveTextClassNames } from '../../typography/text.styles';\nimport { cn } from '../../../lib/utils';\nimport { fieldStateRecipes } from '../../../lib/field-state-recipes';\n\n/**\n * Shared field anatomy for rich editors, including specialized document schemas.\n * Every region takes the toolbar's `surface-xs` inset, on both axes for the body,\n * so the first line sits as far below the toolbar rule as text sits from the frame edge.\n */\nexport const richTextEditorRecipes = {\n source: cn('rich-text-editor--source box-border m-0 block min-h-0 w-full resize-y rounded-none border-0 bg-transparent p-surface-xs outline-none disabled:cursor-not-allowed', resolveTextClassNames({type: 'main', size: 'xs', weight: 'regular', align: 'left', lineHeight: 'relaxed', numeric: true})),\n /** Editable body: shared content typography inside the editor's surface inset. Every embedded editor uses it. */\n editable: cn(editableContentClassName, 'p-surface-xs'),\n /** Placeholder overlay, laid over the editable body at the same inset. */\n placeholder: 'pointer-events-none absolute inset-0 p-surface-xs',\n /** Inline inset for the regions under the body (image details, counts, footer slot). */\n regionX: 'px-surface-xs',\n frame: cn('min-w-0 overflow-hidden border-input rounded-radius border bg-transparent transition-[color,box-shadow]', fieldStateRecipes.editorFocus, fieldStateRecipes.editorInvalid),\n disabled: 'opacity-50',\n // The frame owns the whole-editor dim; individually unavailable commands\n // keep Button's ordinary disabled treatment while the editor is enabled.\n disabledControl: 'disabled:opacity-100 aria-disabled:opacity-100',\n content: 'h-full [&_.ProseMirror]:h-full [&_.ProseMirror]:min-h-full [&_.ProseMirror]:outline-none',\n // Body floor when the consumer sets no `minHeight`: one small control line, a\n // textarea-sized field (a composer), or a short page (as the email body does).\n bodyMinHeight: { control: 'min-h-control-sm', field: 'min-h-textarea-sm', document: 'min-h-48' },\n} as const;\n","import { Code2 } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport { Button } from '../../../base/buttons/button';\nimport { interactionRecipes } from '../../../../lib/interaction-recipes';\nimport { cn } from '../../../../lib/utils';\n\nimport type { RichTextEditorStrings } from '../rich-text-editor.strings';\nimport { richTextEditorRecipes } from '../rich-text-editor.recipes';\nimport type {\n\tRichTextEditorToolbarItem,\n\tToolbarButtonConfig,\n} from '../rich-text-editor.types';\n\nexport interface RichTextEditorToolbarProps {\n\t/** Formatting controls to show, in order. */\n\tbuttons: ToolbarButtonConfig[];\n\t/** Additional controls appended to the toolbar. */\n\textraToolbarItems?: ReadonlyArray<RichTextEditorToolbarItem>;\n\t/** Active values read from the editor's transaction subscription. */\n\textraToolbarActive?: readonly boolean[];\n\t/** Hides the control that switches to HTML source. */\n\thideSourceToggle?: boolean;\n\t/** Whether the editor is currently showing HTML source. */\n\tsourceMode: boolean;\n\t/** Switches between rich text and HTML source. */\n\ttoggleSourceMode: () => void;\n\t/** Renders the entry as unselectable. */\n\tdisabled?: boolean;\n\t/**\n\t * The TipTap variant disables built-in buttons until the editor instance\n\t * is ready; the fallback variant simply marks them disabled. This flag\n\t * lets callers force the disabled state without re-deriving it per button.\n\t */\n\thasEditor?: boolean;\n\t/** Content pinned to the end of the toolbar. */\n\ttoolbarTrailing?: ReactNode;\n\t/** Overrides this surface's own copy. */\n\tstrings: RichTextEditorStrings;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nexport function RichTextEditorToolbar({\n\tbuttons,\n\textraToolbarItems,\n\textraToolbarActive,\n\thideSourceToggle = false,\n\tsourceMode,\n\ttoggleSourceMode,\n\tdisabled = false,\n\thasEditor = true,\n\ttoolbarTrailing,\n\tstrings,\n\tclassName,\n}: RichTextEditorToolbarProps) {\n\tconst hasExtras = (extraToolbarItems?.length ?? 0) > 0;\n\n\treturn (\n\t\t<div className={cn('rich-text-editor-toolbar--component border-border flex flex-wrap items-center gap-space-xs border-b p-surface-xs', className)}>\n\t\t\t{buttons.map((button) => {\n\t\t\t\tconst Icon = button.icon;\n\t\t\t\tconst isActive = button.isActive();\n\n\t\t\t\treturn (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tkey={button.id}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t// A formatting toggle: pressed is the accent fill, hover the lighter muted one.\n\t\t\t\t\t\tclassName={cn(isActive ? interactionRecipes.togglePressed : interactionRecipes.toggleHoverButton, disabled && richTextEditorRecipes.disabledControl)}\n\t\t\t\t\t\tonClick={button.run}\n\t\t\t\t\t\tdisabled={disabled || !hasEditor || sourceMode || button.disabled}\n\t\t\t\t\t\taria-pressed={button.toggle ? isActive : undefined}\n\t\t\t\t\t\taria-label={button.label}\n\t\t\t\t\t\ttitle={button.label}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon className=\"size-icon\" />\n\t\t\t\t\t</Button>\n\t\t\t\t);\n\t\t\t})}\n\n\t\t\t{!hideSourceToggle && (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"bg-border mx-space-xs size-icon w-px\" />\n\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t// Source view is a toggle like the formats: the same pressed fill and state.\n\t\t\t\t\t\tclassName={cn(sourceMode ? interactionRecipes.togglePressed : interactionRecipes.toggleHoverButton, disabled && richTextEditorRecipes.disabledControl)}\n\t\t\t\t\t\tonClick={toggleSourceMode}\n\t\t\t\t\t\tdisabled={disabled || !hasEditor}\n\t\t\t\t\t\taria-pressed={sourceMode}\n\t\t\t\t\t\taria-label={strings.toolbar.sourceCode}\n\t\t\t\t\t\ttitle={strings.toolbar.sourceCode}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Code2 className=\"size-icon\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t{hasExtras && (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"bg-border mx-space-xs size-icon w-px\" />\n\t\t\t\t\t{extraToolbarItems?.map((item, index) => {\n\t\t\t\t\t\tconst Icon = item.icon;\n\t\t\t\t\t\tconst isActive = extraToolbarActive?.[index] ?? item.isActive?.() ?? false;\n\t\t\t\t\t\tconst toggle = item.toggle ?? item.isActive !== undefined;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\tclassName={cn(isActive ? interactionRecipes.togglePressed : interactionRecipes.toggleHoverButton, disabled && richTextEditorRecipes.disabledControl)}\n\t\t\t\t\t\t\t\tonClick={item.onClick}\n\t\t\t\t\t\t\t\tdisabled={disabled || !hasEditor || sourceMode || item.disabled}\n\t\t\t\t\t\t\t\taria-pressed={toggle ? isActive : undefined}\n\t\t\t\t\t\t\t\taria-label={item.label}\n\t\t\t\t\t\t\t\ttitle={item.label}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon className=\"size-icon\" />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t{!!toolbarTrailing && (\n\t\t\t\t<div className=\"ml-auto flex items-center gap-space-xs\">{toolbarTrailing}</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nRichTextEditorToolbar.displayName = 'RichTextEditorToolbar';\n"],"mappings":";;;;;;;;;;AAUA,IAAaO,IAAwB;CACpC,QAAQN,EAAG,oKAAoKE,EAAsB;EAAC,MAAM;EAAQ,MAAM;EAAM,QAAQ;EAAW,OAAO;EAAQ,YAAY;EAAW,SAAS;CAAI,CAAC,CAAC;CAExS,UAAUF,EAAGI,GAA0B,cAAc;CAErD,aAAa;CAEb,SAAS;CACT,OAAOJ,EAAG,2GAA2GK,EAAkB,aAAaA,EAAkB,aAAa;CACnL,UAAU;CAGV,iBAAiB;CACjB,SAAS;CAGT,eAAe;EAAE,SAAS;EAAoB,OAAO;EAAqB,UAAU;CAAW;AAChG;;;ACgBA,SAAgBE,EAAsB,EACrC,YACA,sBACA,uBACA,sBAAmB,IACnB,eACA,qBACA,cAAW,IACX,eAAY,IACZ,oBACA,YACA,gBAC8B;CAC9B,IAAMC,KAAaC,GAAmB,UAAU,KAAK;CAErD,OACC,kBAAC,OAAD;EAAK,WAAWT,EAAG,oHAAoHU,CAAS;EAAhJ,UAAA;GACEC,EAAQ,KAAK,MAAW;IACxB,IAAMC,IAAOC,EAAO,MACdC,IAAWD,EAAO,SAAS;IAEjC,OACC,kBAACZ,GAAD;KAEC,MAAK;KACL,MAAK;KACL,aAAY;KACZ,MAAK;KAAK,UAAA;KAEV,WAAWD,EAAGc,IAAWX,EAAmB,gBAAgBA,EAAmB,mBAAmBY,KAAYT,EAAsB,eAAe;KACnJ,SAASO,EAAO;KAChB,UAAUE,KAAY,CAACC,KAAaC,KAAcJ,EAAO;KACzD,gBAAcA,EAAO,SAASC,IAAW,KAAA;KACzC,cAAYD,EAAO;KACnB,OAAOA,EAAO;KAEd,UAAA,kBAACD,GAAD,EAAM,WAAU,YAAa,CAAA;IACtB,GAdFC,EAAO,EAcL;GAEV,CAAC;GAEA,CAACK,KACD,kBAAAnB,GAAA,EAAA,UAAA,CACC,kBAAC,OAAD,EAAK,WAAU,uCAAwC,CAAA,GAEvD,kBAACE,GAAD;IACC,MAAK;IACL,MAAK;IACL,aAAY;IACZ,MAAK;IAAK,UAAA;IAEV,WAAWD,EAAGiB,IAAad,EAAmB,gBAAgBA,EAAmB,mBAAmBY,KAAYT,EAAsB,eAAe;IACrJ,SAASc;IACT,UAAUL,KAAY,CAACC;IACvB,gBAAcC;IACd,cAAYI,EAAQ,QAAQ;IAC5B,OAAOA,EAAQ,QAAQ;IAEvB,UAAA,kBAACC,GAAD,EAAO,WAAU,YAAa,CAAA;GACvB,CAAA,CACP,EAAA,CAAA;GAGFd,KACA,kBAAAT,GAAA,EAAA,UAAA,CACC,kBAAC,OAAD,EAAK,WAAU,uCAAwC,CAAA,GACtDU,GAAmB,KAAK,GAAM,MAAU;IACxC,IAAMG,IAAOW,EAAK,MACZT,IAAWU,IAAqBC,MAAUF,EAAK,WAAW,KAAK,IAC/DG,IAASH,EAAK,UAAUA,EAAK,aAAa,KAAA;IAChD,OACC,kBAACtB,GAAD;KAEC,MAAK;KACL,MAAK;KACL,aAAY;KACZ,MAAK;KAAK,UAAA;KACV,WAAWD,EAAGc,IAAWX,EAAmB,gBAAgBA,EAAmB,mBAAmBY,KAAYT,EAAsB,eAAe;KACnJ,SAASiB,EAAK;KACd,UAAUR,KAAY,CAACC,KAAaC,KAAcM,EAAK;KACvD,gBAAcG,IAASZ,IAAW,KAAA;KAClC,cAAYS,EAAK;KACjB,OAAOA,EAAK;KAEZ,UAAA,kBAACX,GAAD,EAAM,WAAU,YAAa,CAAA;IACtB,GAbFW,EAAK,EAaH;GAEV,CAAC,CACA,EAAA,CAAA;GAGF,CAAC,CAACI,KACF,kBAAC,OAAD;IAAK,WAAU;IAA0C,UAAAA;GAAqB,CAAA;EAE3E;;AAEP;AAEA,EAAsB,cAAc"}
@@ -0,0 +1,66 @@
1
+ "use client";
2
+ import { r as e } from "./sanitize-html-BWkH4dLM.js";
3
+ import { Fragment as t, createElement as n } from "react";
4
+ import { jsx as r } from "react/jsx-runtime";
5
+ import i from "style-to-js";
6
+ //#region src/components/typography/rich-text/rich-text-tree.tsx
7
+ var a = /* @__PURE__ */ new Set([
8
+ "area",
9
+ "base",
10
+ "br",
11
+ "col",
12
+ "embed",
13
+ "hr",
14
+ "img",
15
+ "input",
16
+ "link",
17
+ "meta",
18
+ "param",
19
+ "source",
20
+ "track",
21
+ "wbr"
22
+ ]);
23
+ function o(e) {
24
+ let t = typeof e == "number" ? e : Number(e);
25
+ return Number.isFinite(t) && t > 0 ? t : void 0;
26
+ }
27
+ function s(e, t) {
28
+ let n = { key: t };
29
+ for (let [t, r] of Object.entries(e.properties)) if (r != null && r !== !1) {
30
+ if (t === "className") n.className = Array.isArray(r) ? r.join(" ") : String(r);
31
+ else if (/^data[A-Z]/.test(t)) n[t.replace(/[A-Z]/g, (e) => `-${e.toLowerCase()}`)] = String(r);
32
+ else if (/^aria[A-Z]/.test(t)) n[`aria-${t.slice(4).toLowerCase()}`] = String(r);
33
+ else if (t === "style" && typeof r == "string") try {
34
+ n.style = i(r, { reactCompat: !0 });
35
+ } catch {}
36
+ else n[t] = Array.isArray(r) ? r.join(" ") : r;
37
+ }
38
+ return n;
39
+ }
40
+ function c(i, l, u, d) {
41
+ if (i.type === "text") return i.value;
42
+ if (i.type !== "element") return null;
43
+ let f = d?.(i);
44
+ if (f !== void 0) return /* @__PURE__ */ r(t, { children: f }, l);
45
+ if (i.tagName === "img" && u) {
46
+ let n = e(i.properties.src);
47
+ if (!n) return null;
48
+ let a = {
49
+ src: n,
50
+ alt: typeof i.properties.alt == "string" ? i.properties.alt : "",
51
+ title: typeof i.properties.title == "string" ? i.properties.title : void 0,
52
+ width: o(i.properties.width),
53
+ height: o(i.properties.height)
54
+ };
55
+ return /* @__PURE__ */ r(t, { children: u(a) }, l);
56
+ }
57
+ let p = s(i, l);
58
+ return a.has(i.tagName) ? n(i.tagName, p) : n(i.tagName, p, ...i.children.map((e, t) => c(e, t, u, d)));
59
+ }
60
+ function l(e, t, n) {
61
+ return e.children.map((e, r) => c(e, r, t, n));
62
+ }
63
+ //#endregion
64
+ export { l as t };
65
+
66
+ //# sourceMappingURL=rich-text-tree-BqyQ_7-R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rich-text-tree-BqyQ_7-R.js","names":["safeImageSrc","styleToJs","VOID_ELEMENTS","toNumber","number","value","toReactProps","props","name","element","letter","renderNode","node","replacement","replaceElement","Fragment","key","renderImage","src","image","createElement","child","index","renderRichTextTree","tree"],"sources":["../src/components/typography/rich-text/rich-text-tree.tsx"],"sourcesContent":["import { createElement, Fragment, type ReactNode } from 'react';\nimport type { Element, Root, RootContent } from 'hast';\nimport styleToJs from 'style-to-js';\n\nimport { safeImageSrc } from '../../../lib/safe-image-src';\n\n/** An image in sanitized rich text, as handed to `renderImage`. */\nexport interface RichTextImageAttributes {\n\t/** Source that passed the package image policy (http, https, blob or relative). */\n\tsrc: string;\n\t/** Text alternative; empty for a decorative image. */\n\talt: string;\n\ttitle?: string;\n\twidth?: number;\n\theight?: number;\n}\n\nexport type RenderRichTextImage = (image: RichTextImageAttributes) => ReactNode;\n\ntype ReplaceRichTextElement = (element: Element) => ReactNode;\n\nconst VOID_ELEMENTS = new Set(['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr']);\n\nfunction toNumber(value: unknown): number | undefined {\n\tconst number = typeof value === 'number' ? value : Number(value);\n\treturn Number.isFinite(number) && number > 0 ? number : undefined;\n}\n\n/** hast properties are camelCase (`dataRefId`); the DOM attribute is `data-ref-id`. */\nfunction toReactProps(element: Element, key: number) {\n\tconst props: Record<string, unknown> = { key };\n\tfor (const [name, value] of Object.entries(element.properties)) {\n\t\tif (value == null || value === false) continue;\n\t\tif (name === 'className') props.className = Array.isArray(value) ? value.join(' ') : String(value);\n\t\telse if (/^data[A-Z]/.test(name)) props[name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)] = String(value);\n\t\telse if (/^aria[A-Z]/.test(name)) props[`aria-${name.slice(4).toLowerCase()}`] = String(value);\n\t\telse if (name === 'style' && typeof value === 'string') {\n\t\t\ttry {\n\t\t\t\tprops.style = styleToJs(value, { reactCompat: true });\n\t\t\t} catch {\n\t\t\t\t// The package sanitizer strips styles. A custom sanitizer may\n\t\t\t\t// retain an invalid declaration, so keep the element and its text.\n\t\t\t}\n\t\t}\n\t\telse props[name] = Array.isArray(value) ? value.join(' ') : value;\n\t}\n\treturn props;\n}\n\nfunction renderNode(node: RootContent, key: number, renderImage?: RenderRichTextImage, replaceElement?: ReplaceRichTextElement): ReactNode {\n\tif (node.type === 'text') return node.value;\n\tif (node.type !== 'element') return null;\n\tconst replacement = replaceElement?.(node);\n\tif (replacement !== undefined) return <Fragment key={key}>{replacement}</Fragment>;\n\tif (node.tagName === 'img' && renderImage) {\n\t\tconst src = safeImageSrc(node.properties.src);\n\t\tif (!src) return null;\n\t\tconst image: RichTextImageAttributes = {\n\t\t\tsrc,\n\t\t\talt: typeof node.properties.alt === 'string' ? node.properties.alt : '',\n\t\t\ttitle: typeof node.properties.title === 'string' ? node.properties.title : undefined,\n\t\t\twidth: toNumber(node.properties.width),\n\t\t\theight: toNumber(node.properties.height),\n\t\t};\n\t\treturn <Fragment key={key}>{renderImage(image)}</Fragment>;\n\t}\n\tconst props = toReactProps(node, key);\n\tif (VOID_ELEMENTS.has(node.tagName)) return createElement(node.tagName, props);\n\treturn createElement(node.tagName, props, ...node.children.map((child, index) => renderNode(child, index, renderImage, replaceElement)));\n}\n\n/**\n * Renders an already sanitized tree as React elements. Individual images or\n * other elements can use React components without breaking the surrounding\n * markup. Server and client output match.\n */\nexport function renderRichTextTree(tree: Root, renderImage?: RenderRichTextImage, replaceElement?: ReplaceRichTextElement): ReactNode {\n\treturn tree.children.map((child, index) => renderNode(child, index, renderImage, replaceElement));\n}\n"],"mappings":";;;;;;AAqBA,IAAME,oBAAgB,IAAI,IAAI;CAAC;CAAQ;CAAQ;CAAM;CAAO;CAAS;CAAM;CAAO;CAAS;CAAQ;CAAQ;CAAS;CAAU;CAAS;AAAK,CAAC;AAE7I,SAASC,EAAS,GAAoC;CACrD,IAAMC,IAAS,OAAOC,KAAU,WAAWA,IAAQ,OAAOA,CAAK;CAC/D,OAAO,OAAO,SAASD,CAAM,KAAKA,IAAS,IAAIA,IAAS,KAAA;AACzD;AAGA,SAASE,EAAa,GAAkB,GAAa;CACpD,IAAMC,IAAiC,EAAE,OAAI;CAC7C,KAAK,IAAM,CAACC,GAAMH,MAAU,OAAO,QAAQI,EAAQ,UAAU,GAC5D,IAAIJ,KAAS,QAAQA,MAAU,IAC/B;MAAIG,MAAS,aAAa,EAAM,YAAY,MAAM,QAAQH,CAAK,IAAIA,EAAM,KAAK,GAAG,IAAI,OAAOA,CAAK;OAC5F,IAAI,aAAa,KAAKG,CAAI,GAAG,EAAMA,EAAK,QAAQ,WAAW,MAAW,IAAIE,EAAO,YAAY,GAAG,KAAK,OAAOL,CAAK;OACjH,IAAI,aAAa,KAAKG,CAAI,GAAG,EAAM,QAAQA,EAAK,MAAM,CAAC,CAAC,CAAC,YAAY,OAAO,OAAOH,CAAK;OACxF,IAAIG,MAAS,WAAW,OAAOH,KAAU,UAC7C,IAAI;GACH,EAAM,QAAQJ,EAAUI,GAAO,EAAE,aAAa,GAAK,CAAC;EACrD,QAAQ,CAGR;OAEI,EAAMG,KAAQ,MAAM,QAAQH,CAAK,IAAIA,EAAM,KAAK,GAAG,IAAIA;CAAA;CAE7D,OAAOE;AACR;AAEA,SAASI,EAAW,GAAmB,GAAa,GAAmC,GAAoD;CAC1I,IAAIC,EAAK,SAAS,QAAQ,OAAOA,EAAK;CACtC,IAAIA,EAAK,SAAS,WAAW,OAAO;CACpC,IAAMC,IAAcC,IAAiBF,CAAI;CACzC,IAAIC,MAAgB,KAAA,GAAW,OAAO,kBAACE,GAAD,EAAA,UAAqBF,EAAsB,GAA5BG,CAA4B;CACjF,IAAIJ,EAAK,YAAY,SAASK,GAAa;EAC1C,IAAMC,IAAMlB,EAAaY,EAAK,WAAW,GAAG;EAC5C,IAAI,CAACM,GAAK,OAAO;EACjB,IAAMC,IAAiC;GACtC;GACA,KAAK,OAAOP,EAAK,WAAW,OAAQ,WAAWA,EAAK,WAAW,MAAM;GACrE,OAAO,OAAOA,EAAK,WAAW,SAAU,WAAWA,EAAK,WAAW,QAAQ,KAAA;GAC3E,OAAOT,EAASS,EAAK,WAAW,KAAK;GACrC,QAAQT,EAASS,EAAK,WAAW,MAAM;EACxC;EACA,OAAO,kBAACG,GAAD,EAAA,UAAqBE,EAAYE,CAAK,EAAY,GAAnCH,CAAmC;CAC1D;CACA,IAAMT,IAAQD,EAAaM,GAAMI,CAAG;CAEpC,OADId,EAAc,IAAIU,EAAK,OAAO,IAAUQ,EAAcR,EAAK,SAASL,CAAK,IACtEa,EAAcR,EAAK,SAASL,GAAO,GAAGK,EAAK,SAAS,KAAK,GAAO,MAAUD,EAAWU,GAAOC,GAAOL,GAAaH,CAAc,CAAC,CAAC;AACxI;AAOA,SAAgBS,EAAmB,GAAY,GAAmC,GAAoD;CACrI,OAAOC,EAAK,SAAS,KAAK,GAAO,MAAUb,EAAWU,GAAOC,GAAOL,GAAaH,CAAc,CAAC;AACjG"}
@@ -1,7 +1,20 @@
1
- import { n as e, t } from "./safe-image-src-C6kQSMBZ.js";
2
- import { fromHtml as n } from "hast-util-from-html";
3
- import { sanitize as r } from "hast-util-sanitize";
4
- import { toHtml as i } from "hast-util-to-html";
1
+ import { fromHtml as e } from "hast-util-from-html";
2
+ import { sanitize as t } from "hast-util-sanitize";
3
+ import { toHtml as n } from "hast-util-to-html";
4
+ //#region src/lib/safe-image-src.ts
5
+ var r = [
6
+ "http",
7
+ "https",
8
+ "blob"
9
+ ];
10
+ function i(e) {
11
+ if (typeof e != "string") return;
12
+ let t = e.trim();
13
+ if (!t || t.startsWith("//") || t.startsWith("\\\\")) return;
14
+ let n = t.replace(/[\u0000- \u007F]+/g, ""), i = /^([a-z][a-z0-9+.-]*):/i.exec(n)?.[1]?.toLowerCase();
15
+ return i ? r.includes(i) ? t : void 0 : t;
16
+ }
17
+ //#endregion
5
18
  //#region src/lib/sanitize-html.ts
6
19
  var a = /* @__PURE__ */ "a.b.blockquote.br.code.del.div.em.h1.h2.h3.h4.h5.h6.i.li.mark.ol.p.pre.s.span.strong.sub.sup.u.ul".split("."), o = {
7
20
  allowComments: !1,
@@ -61,13 +74,13 @@ var a = /* @__PURE__ */ "a.b.blockquote.br.code.del.div.em.h1.h2.h3.h4.h5.h6.i.l
61
74
  },
62
75
  protocols: {
63
76
  ...o.protocols,
64
- src: [...t]
77
+ src: [...r]
65
78
  }
66
79
  };
67
- function c(t) {
68
- if (t.type === "root" || t.type === "element") {
69
- t.children = t.children.filter((t) => t.type !== "element" || t.tagName !== "img" || e(t.properties.src) !== void 0);
70
- for (let e of t.children) c(e);
80
+ function c(e) {
81
+ if (e.type === "root" || e.type === "element") {
82
+ e.children = e.children.filter((e) => e.type !== "element" || e.tagName !== "img" || i(e.properties.src) !== void 0);
83
+ for (let t of e.children) c(t);
71
84
  }
72
85
  }
73
86
  function l(e) {
@@ -78,15 +91,15 @@ function l(e) {
78
91
  if (e.type === "root" || e.type === "element") for (let t of e.children) l(t);
79
92
  }
80
93
  function u(e, t = {}) {
81
- return e ? i(d(e, t)) : "";
94
+ return e ? n(d(e, t)) : "";
82
95
  }
83
- function d(e, t = {}) {
84
- let i = n(e ?? "", { fragment: !0 });
96
+ function d(n, r = {}) {
97
+ let i = e(n ?? "", { fragment: !0 });
85
98
  l(i);
86
- let a = r(i, t.images ? s : o);
87
- return t.images && c(a), a;
99
+ let a = t(i, r.images ? s : o);
100
+ return r.images && c(a), a;
88
101
  }
89
102
  //#endregion
90
- export { d as n, u as t };
103
+ export { d as n, i as r, u as t };
91
104
 
92
- //# sourceMappingURL=sanitize-html-DsQmI48u.js.map
105
+ //# sourceMappingURL=sanitize-html-BWkH4dLM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-html-BWkH4dLM.js","names":["SAFE_IMAGE_SCHEMES","safeImageSrc","value","src","compact","scheme","ALLOWED_TAGS","SANITIZE_SCHEMA","SANITIZE_SCHEMA_WITH_IMAGES","removeUnsafeImages","node","child","removeProtocolRelativeLinks","href","sanitizeHtml","input","toHtml","sanitizeHtmlTree","options","unsafeTree","fromHtml","tree","sanitize"],"sources":["../src/lib/safe-image-src.ts","../src/lib/sanitize-html.ts"],"sourcesContent":["/** Schemes an image `src` may use: web URLs and same-document `blob:` previews. */\nexport const SAFE_IMAGE_SCHEMES = ['http', 'https', 'blob'] as const;\n\n/**\n * The one image-source policy shared by the editor and read-only rich text.\n * Returns the source when it is a web URL, a `blob:` preview or a relative\n * path, and `undefined` otherwise: script, `data:` and other schemes and\n * protocol-relative (`//host`) URLs are refused. Control characters and\n * whitespace inside a scheme are ignored, so `java\\tscript:` is still refused.\n */\nexport function safeImageSrc(value: unknown): string | undefined {\n\tif (typeof value !== 'string') return undefined;\n\tconst src = value.trim();\n\tif (!src || src.startsWith('//') || src.startsWith('\\\\\\\\')) return undefined;\n\t// eslint-disable-next-line no-control-regex\n\tconst compact = src.replace(/[\\u0000- \\u007F]+/g, '');\n\tconst scheme = /^([a-z][a-z0-9+.-]*):/i.exec(compact)?.[1]?.toLowerCase();\n\tif (!scheme) return src;\n\treturn (SAFE_IMAGE_SCHEMES as readonly string[]).includes(scheme) ? src : undefined;\n}\n","import { fromHtml } from 'hast-util-from-html';\nimport { sanitize, type Schema } from 'hast-util-sanitize';\nimport { toHtml } from 'hast-util-to-html';\nimport type { Root, RootContent } from 'hast';\n\nimport { SAFE_IMAGE_SCHEMES, safeImageSrc } from './safe-image-src';\n\nconst ALLOWED_TAGS = [\n\t'a',\n\t'b',\n\t'blockquote',\n\t'br',\n\t'code',\n\t'del',\n\t'div',\n\t'em',\n\t'h1',\n\t'h2',\n\t'h3',\n\t'h4',\n\t'h5',\n\t'h6',\n\t'i',\n\t'li',\n\t'mark',\n\t'ol',\n\t'p',\n\t'pre',\n\t's',\n\t'span',\n\t'strong',\n\t'sub',\n\t'sup',\n\t'u',\n\t'ul',\n] as const;\n\nconst SANITIZE_SCHEMA = {\n\tallowComments: false,\n\tallowDoctypes: false,\n\ttagNames: [...ALLOWED_TAGS],\n\tattributes: {\n\t\ta: [\n\t\t\t'href',\n\t\t\t'title',\n\t\t\t['target', '_blank', '_self', '_parent', '_top'],\n\t\t\t'rel',\n\t\t\t'dataRefId',\n\t\t\t'dataRefKind',\n\t\t\t'dataRefTone',\n\t\t],\n\t\tspan: ['dataRefId', 'dataRefKind', 'dataRefTone'],\n\t},\n\tprotocols: {\n\t\thref: ['http', 'https', 'mailto', 'tel'],\n\t},\n\tstrip: [\n\t\t'embed',\n\t\t'iframe',\n\t\t'math',\n\t\t'noscript',\n\t\t'object',\n\t\t'script',\n\t\t'style',\n\t\t'svg',\n\t\t'template',\n\t],\n} satisfies Schema;\n\n/** The same vocabulary plus images whose source passes `safeImageSrc`. */\nconst SANITIZE_SCHEMA_WITH_IMAGES = {\n\t...SANITIZE_SCHEMA,\n\ttagNames: [...ALLOWED_TAGS, 'img'],\n\tattributes: {\n\t\t...SANITIZE_SCHEMA.attributes,\n\t\timg: ['src', 'alt', 'title', 'width', 'height'],\n\t},\n\tprotocols: {\n\t\t...SANITIZE_SCHEMA.protocols,\n\t\tsrc: [...SAFE_IMAGE_SCHEMES],\n\t},\n} satisfies Schema;\n\nexport interface SanitizeHtmlOptions {\n\t/**\n\t * Keeps `<img>` with `src`, `alt`, `title`, `width` and `height` when its\n\t * source passes `safeImageSrc`; an image without a safe source is removed.\n\t * Default: `false`, which removes every image.\n\t */\n\timages?: boolean;\n}\n\nfunction removeUnsafeImages(node: Root | RootContent): void {\n\tif (node.type !== 'root' && node.type !== 'element') return;\n\tnode.children = node.children.filter(\n\t\t(child) => child.type !== 'element' || child.tagName !== 'img' || safeImageSrc(child.properties.src) !== undefined,\n\t);\n\tfor (const child of node.children) removeUnsafeImages(child);\n}\n\nfunction removeProtocolRelativeLinks(node: Root | RootContent): void {\n\tif (node.type === 'element') {\n\t\tconst href = node.properties.href;\n\t\tif (typeof href === 'string' && href.trimStart().startsWith('//')) {\n\t\t\tdelete node.properties.href;\n\t\t}\n\t}\n\n\tif (node.type === 'root' || node.type === 'element') {\n\t\tfor (const child of node.children) {\n\t\t\tremoveProtocolRelativeLinks(child);\n\t\t}\n\t}\n}\n\n/**\n * Sanitize package-rendered rich text with an intentionally small HTML\n * vocabulary. Styling, event handlers, embedded media, and protocol-relative\n * URLs are excluded; images only with `options.images` and a safe source.\n * Mention identity attributes remain available so the Mentions feature can\n * replace serialized references with React components.\n */\nexport function sanitizeHtml(input: string, options: SanitizeHtmlOptions = {}): string {\n\tif (!input) return '';\n\treturn toHtml(sanitizeHtmlTree(input, options));\n}\n\n/** The sanitized tree behind `sanitizeHtml`, for renderers that substitute elements. */\nexport function sanitizeHtmlTree(input: string, options: SanitizeHtmlOptions = {}): Root {\n\tconst unsafeTree = fromHtml(input ?? '', { fragment: true });\n\tremoveProtocolRelativeLinks(unsafeTree);\n\tconst tree = sanitize(unsafeTree, options.images ? SANITIZE_SCHEMA_WITH_IMAGES : SANITIZE_SCHEMA) as Root;\n\tif (options.images) removeUnsafeImages(tree);\n\treturn tree;\n}\n\nexport default sanitizeHtml;\n"],"mappings":";;;;AACA,IAAaA,IAAqB;CAAC;CAAQ;CAAS;AAAM;AAS1D,SAAgBC,EAAa,GAAoC;CAChE,IAAI,OAAOC,KAAU,UAAU;CAC/B,IAAMC,IAAMD,EAAM,KAAK;CACvB,IAAI,CAACC,KAAOA,EAAI,WAAW,IAAI,KAAKA,EAAI,WAAW,MAAM,GAAG;CAE5D,IAAMC,IAAUD,EAAI,QAAQ,sBAAsB,EAAE,GAC9CE,IAAS,yBAAyB,KAAKD,CAAO,CAAC,GAAG,EAAE,EAAE,YAAY;CAExE,OADKC,IACGL,EAAyC,SAASK,CAAM,IAAIF,IAAM,KAAA,IADtDA;AAErB;;;ACZA,IAAMG,IAAe,6HA4BrB,GAEMC,IAAkB;CACvB,eAAe;CACf,eAAe;CACf,UAAU,CAAC,GAAGD,CAAY;CAC1B,YAAY;EACX,GAAG;GACF;GACA;GACA;IAAC;IAAU;IAAU;IAAS;IAAW;GAAM;GAC/C;GACA;GACA;GACA;EACD;EACA,MAAM;GAAC;GAAa;GAAe;EAAa;CACjD;CACA,WAAW,EACV,MAAM;EAAC;EAAQ;EAAS;EAAU;CAAK,EACxC;CACA,OAAO;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD;AACD,GAGME,IAA8B;CACnC,GAAGD;CACH,UAAU,CAAC,GAAGD,GAAc,KAAK;CACjC,YAAY;EACX,GAAGC,EAAgB;EACnB,KAAK;GAAC;GAAO;GAAO;GAAS;GAAS;EAAQ;CAC/C;CACA,WAAW;EACV,GAAGA,EAAgB;EACnB,KAAK,CAAC,GAAGP,CAAkB;CAC5B;AACD;AAWA,SAASS,EAAmB,GAAgC;CAC3D,IAAIC,EAAK,SAAS,UAAUA,EAAK,SAAS,WAC1C;IAAK,WAAWA,EAAK,SAAS,QAC5B,MAAUC,EAAM,SAAS,aAAaA,EAAM,YAAY,SAASV,EAAaU,EAAM,WAAW,GAAG,MAAM,KAAA,CAC1G;EACA,KAAK,IAAMA,KAASD,EAAK,UAAU,EAAmBC,CAAK;CAD3D;AAED;AAEA,SAASC,EAA4B,GAAgC;CACpE,IAAIF,EAAK,SAAS,WAAW;EAC5B,IAAMG,IAAOH,EAAK,WAAW;EAC7B,AAAI,OAAOG,KAAS,YAAYA,EAAK,UAAU,CAAC,CAAC,WAAW,IAAI,KAC/D,OAAOH,EAAK,WAAW;CAEzB;CAEA,IAAIA,EAAK,SAAS,UAAUA,EAAK,SAAS,WACzC,KAAK,IAAMC,KAASD,EAAK,UACxB,EAA4BC,CAAK;AAGpC;AASA,SAAgBG,EAAa,GAAe,IAA+B,CAAC,GAAW;CAEtF,OADKC,IACEC,EAAOC,EAAiBF,GAAOG,CAAO,CAAC,IAD3B;AAEpB;AAGA,SAAgBD,EAAiB,GAAe,IAA+B,CAAC,GAAS;CACxF,IAAME,IAAaC,EAASL,KAAS,IAAI,EAAE,UAAU,GAAK,CAAC;CAC3D,EAA4BI,CAAU;CACtC,IAAME,IAAOC,EAASH,GAAYD,EAAQ,SAASV,IAA8BD,CAAe;CAEhG,OADIW,EAAQ,UAAQT,EAAmBY,CAAI,GACpCA;AACR"}
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { t as e } from "./utils-CF3c95Io.js";
2
+ import { t as e } from "./utils-DhuoqFy4.js";
3
3
  import { t } from "./focus-recipes-B653VaLq.js";
4
4
  import "react";
5
5
  import { jsx as n, jsxs as r } from "react/jsx-runtime";
@@ -45,4 +45,4 @@ function o({ className: t, orientation: r = "vertical", ...a }) {
45
45
  //#endregion
46
46
  export { o as n, a as t };
47
47
 
48
- //# sourceMappingURL=scroll-area-La5RXsEk.js.map
48
+ //# sourceMappingURL=scroll-area-Bj6CRUif.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scroll-area-La5RXsEk.js","names":["ScrollArea","ScrollAreaPrimitive","cn","ScrollArea$1","props","ScrollArea","className","viewportRef","focusRecipes","viewportClassName","orientation","ScrollBar","scrollbarClassName"],"sources":["../src/components/base/display/scroll-area.tsx"],"sourcesContent":["import * as React from 'react';\nimport { ScrollArea as ScrollAreaPrimitive } from '@base-ui/react/scroll-area';\n\nimport { cn } from '../../../lib/utils';\nimport { focusRecipes } from '../../../lib/focus-recipes';\n\nexport type ScrollAreaProps = ScrollAreaPrimitive.Root.Props & {\n\t/** Axes with custom scrollbar chrome. Defaults to vertical. */\n\torientation?: 'vertical' | 'horizontal' | 'both';\n\tviewportRef?: React.Ref<HTMLDivElement>;\n\tviewportClassName?: string;\n\tscrollbarClassName?: string;\n};\n\nfunction ScrollArea({\n\torientation = 'vertical',\n\tclassName,\n\tviewportClassName,\n\tscrollbarClassName,\n\tviewportRef,\n\tchildren,\n\t...props\n}: ScrollAreaProps) {\n\treturn (\n\t\t<ScrollAreaPrimitive.Root\n\t\t\tdata-slot=\"scroll-area\"\n\t\t\tclassName={cn('scroll-area--component group/scroll-area relative overflow-hidden', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ScrollAreaPrimitive.Viewport\n\t\t\t\tref={viewportRef}\n\t\t\t\tdata-slot=\"scroll-area-viewport\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'size-full rounded-[inherit] outline-none transition-[color,box-shadow]',\n\t\t\t\t\t// The root clips overflow, so the shared ring is drawn inside the viewport edge.\n\t\t\t\t\tfocusRecipes.inset,\n\t\t\t\t\tviewportClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</ScrollAreaPrimitive.Viewport>\n\t\t\t{orientation !== 'horizontal' && <ScrollBar className={scrollbarClassName} />}\n\t\t\t{orientation !== 'vertical' && <ScrollBar orientation=\"horizontal\" className={scrollbarClassName} />}\n\t\t\t<ScrollAreaPrimitive.Corner />\n\t\t</ScrollAreaPrimitive.Root>\n\t);\n}\n\nfunction ScrollBar({\n\tclassName,\n\torientation = 'vertical',\n\t...props\n}: ScrollAreaPrimitive.Scrollbar.Props) {\n\treturn (\n\t\t<ScrollAreaPrimitive.Scrollbar\n\t\t\tdata-slot=\"scroll-area-scrollbar\"\n\t\t\tdata-orientation={orientation}\n\t\t\torientation={orientation}\n\t\t\tclassName={cn(\n\t\t\t\t{\n\t\t\t\t\t'h-2.5 flex-col border-t border-t-transparent': orientation === 'horizontal',\n\t\t\t\t\t'h-full w-2 border-l border-l-transparent': orientation === 'vertical',\n\t\t\t\t},\n\t\t\t\t// `rounded-full`, not a scale value: the track is 8-10px on its short\n\t\t\t\t// axis, so any radius past half of that already clamps to a pill.\n\t\t\t\t// Saying `rounded-full` states the intent and stops the value drifting\n\t\t\t\t// with the radius scale.\n\t\t\t\t'flex touch-none select-none rounded-full p-px opacity-0 transition-opacity',\n\t\t\t\t'data-hovering:opacity-100 data-scrolling:opacity-100 group-focus-within/scroll-area:opacity-100',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ScrollAreaPrimitive.Thumb\n\t\t\t\tdata-slot=\"scroll-area-thumb\"\n\t\t\t\tclassName=\"relative flex-1 rounded-full bg-border\"\n\t\t\t/>\n\t\t</ScrollAreaPrimitive.Scrollbar>\n\t);\n}\n\nexport { ScrollArea, ScrollBar };\n"],"mappings":";;;;;;;AAcA,SAASA,EAAW,EACnB,iBAAc,YACd,cACA,sBACA,uBACA,gBACA,aACA,GAAGI,KACgB;CACnB,OACC,kBAACH,EAAoB,MAArB;EACC,aAAU;EACV,WAAWC,EAAG,qEAAqEI,CAAS;EAC5F,GAAIF;EAHL,UAAA;GAKC,kBAACH,EAAoB,UAArB;IACC,KAAKM;IACL,aAAU;IACV,WAAWL,EACV,0EAEAM,EAAa,OACbC,CACD;IAEC;GAC4B,CAAA;GAC7BC,MAAgB,gBAAgB,kBAACC,GAAD,EAAW,WAAWC,EAAqB,CAAA;GAC3EF,MAAgB,cAAc,kBAACC,GAAD;IAAW,aAAY;IAAa,WAAWC;GAAqB,CAAA;GACnG,kBAACX,EAAoB,QAArB,CAA6B,CAAA;EACJ;;AAE5B;AAEA,SAASU,EAAU,EAClB,cACA,iBAAc,YACd,GAAGP,KACoC;CACvC,OACC,kBAACH,EAAoB,WAArB;EACC,aAAU;EACV,oBAAkBS;EACL;EACb,WAAWR,EACV;GACC,gDAAgDQ,MAAgB;GAChE,4CAA4CA,MAAgB;EAC7D,GAKA,8EACA,mGACAJ,CACD;EACA,GAAIF;EAEJ,UAAA,kBAACH,EAAoB,OAArB;GACC,aAAU;GACV,WAAU;EACV,CAAA;CAC6B,CAAA;AAEjC"}
1
+ {"version":3,"file":"scroll-area-Bj6CRUif.js","names":["ScrollArea","ScrollAreaPrimitive","cn","ScrollArea$1","props","ScrollArea","className","viewportRef","focusRecipes","viewportClassName","orientation","ScrollBar","scrollbarClassName"],"sources":["../src/components/base/display/scroll-area.tsx"],"sourcesContent":["import * as React from 'react';\nimport { ScrollArea as ScrollAreaPrimitive } from '@base-ui/react/scroll-area';\n\nimport { cn } from '../../../lib/utils';\nimport { focusRecipes } from '../../../lib/focus-recipes';\n\nexport type ScrollAreaProps = ScrollAreaPrimitive.Root.Props & {\n\t/** Axes with custom scrollbar chrome. Defaults to vertical. */\n\torientation?: 'vertical' | 'horizontal' | 'both';\n\tviewportRef?: React.Ref<HTMLDivElement>;\n\tviewportClassName?: string;\n\tscrollbarClassName?: string;\n};\n\nfunction ScrollArea({\n\torientation = 'vertical',\n\tclassName,\n\tviewportClassName,\n\tscrollbarClassName,\n\tviewportRef,\n\tchildren,\n\t...props\n}: ScrollAreaProps) {\n\treturn (\n\t\t<ScrollAreaPrimitive.Root\n\t\t\tdata-slot=\"scroll-area\"\n\t\t\tclassName={cn('scroll-area--component group/scroll-area relative overflow-hidden', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ScrollAreaPrimitive.Viewport\n\t\t\t\tref={viewportRef}\n\t\t\t\tdata-slot=\"scroll-area-viewport\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'size-full rounded-[inherit] outline-none transition-[color,box-shadow]',\n\t\t\t\t\t// The root clips overflow, so the shared ring is drawn inside the viewport edge.\n\t\t\t\t\tfocusRecipes.inset,\n\t\t\t\t\tviewportClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</ScrollAreaPrimitive.Viewport>\n\t\t\t{orientation !== 'horizontal' && <ScrollBar className={scrollbarClassName} />}\n\t\t\t{orientation !== 'vertical' && <ScrollBar orientation=\"horizontal\" className={scrollbarClassName} />}\n\t\t\t<ScrollAreaPrimitive.Corner />\n\t\t</ScrollAreaPrimitive.Root>\n\t);\n}\n\nfunction ScrollBar({\n\tclassName,\n\torientation = 'vertical',\n\t...props\n}: ScrollAreaPrimitive.Scrollbar.Props) {\n\treturn (\n\t\t<ScrollAreaPrimitive.Scrollbar\n\t\t\tdata-slot=\"scroll-area-scrollbar\"\n\t\t\tdata-orientation={orientation}\n\t\t\torientation={orientation}\n\t\t\tclassName={cn(\n\t\t\t\t{\n\t\t\t\t\t'h-2.5 flex-col border-t border-t-transparent': orientation === 'horizontal',\n\t\t\t\t\t'h-full w-2 border-l border-l-transparent': orientation === 'vertical',\n\t\t\t\t},\n\t\t\t\t// `rounded-full`, not a scale value: the track is 8-10px on its short\n\t\t\t\t// axis, so any radius past half of that already clamps to a pill.\n\t\t\t\t// Saying `rounded-full` states the intent and stops the value drifting\n\t\t\t\t// with the radius scale.\n\t\t\t\t'flex touch-none select-none rounded-full p-px opacity-0 transition-opacity',\n\t\t\t\t'data-hovering:opacity-100 data-scrolling:opacity-100 group-focus-within/scroll-area:opacity-100',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ScrollAreaPrimitive.Thumb\n\t\t\t\tdata-slot=\"scroll-area-thumb\"\n\t\t\t\tclassName=\"relative flex-1 rounded-full bg-border\"\n\t\t\t/>\n\t\t</ScrollAreaPrimitive.Scrollbar>\n\t);\n}\n\nexport { ScrollArea, ScrollBar };\n"],"mappings":";;;;;;;AAcA,SAASA,EAAW,EACnB,iBAAc,YACd,cACA,sBACA,uBACA,gBACA,aACA,GAAGI,KACgB;CACnB,OACC,kBAACH,EAAoB,MAArB;EACC,aAAU;EACV,WAAWC,EAAG,qEAAqEI,CAAS;EAC5F,GAAIF;EAHL,UAAA;GAKC,kBAACH,EAAoB,UAArB;IACC,KAAKM;IACL,aAAU;IACV,WAAWL,EACV,0EAEAM,EAAa,OACbC,CACD;IAEC;GAC4B,CAAA;GAC7BC,MAAgB,gBAAgB,kBAACC,GAAD,EAAW,WAAWC,EAAqB,CAAA;GAC3EF,MAAgB,cAAc,kBAACC,GAAD;IAAW,aAAY;IAAa,WAAWC;GAAqB,CAAA;GACnG,kBAACX,EAAoB,QAArB,CAA6B,CAAA;EACJ;;AAE5B;AAEA,SAASU,EAAU,EAClB,cACA,iBAAc,YACd,GAAGP,KACoC;CACvC,OACC,kBAACH,EAAoB,WAArB;EACC,aAAU;EACV,oBAAkBS;EACL;EACb,WAAWR,EACV;GACC,gDAAgDQ,MAAgB;GAChE,4CAA4CA,MAAgB;EAC7D,GAKA,8EACA,mGACAJ,CACD;EACA,GAAIF;EAEJ,UAAA,kBAACH,EAAoB,OAArB;GACC,aAAU;GACV,WAAU;EACV,CAAA;CAC6B,CAAA;AAEjC"}