themelia-react-ui 2.0.1 → 2.0.2

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 (480) hide show
  1. package/CHANGELOG.md +307 -131
  2. package/README.md +28 -8
  3. package/THIRD_PARTY_NOTICES.md +13 -0
  4. package/dist/{accordion-B6a3vVgA.js → accordion-Cjb6sx0G.js} +14 -13
  5. package/dist/accordion-Cjb6sx0G.js.map +1 -0
  6. package/dist/action-menu-CllU52Mm.js +280 -0
  7. package/dist/action-menu-CllU52Mm.js.map +1 -0
  8. package/dist/affordance-geometry.generated-tF36bREk.js +140 -0
  9. package/dist/affordance-geometry.generated-tF36bREk.js.map +1 -0
  10. package/dist/ai-artifact-DvTwDVyL.js +1148 -0
  11. package/dist/ai-artifact-DvTwDVyL.js.map +1 -0
  12. package/dist/{app-shell-ZK5RWdo6.js → app-shell-C4FhvCqF.js} +5 -5
  13. package/dist/{app-shell-ZK5RWdo6.js.map → app-shell-C4FhvCqF.js.map} +1 -1
  14. package/dist/attachment-BxDfL2mw.js +246 -0
  15. package/dist/attachment-BxDfL2mw.js.map +1 -0
  16. package/dist/{auth-CYxKfo69.js → auth-ax2BqjrI.js} +58 -54
  17. package/dist/auth-ax2BqjrI.js.map +1 -0
  18. package/dist/{avatar-BBnEJIx8.js → avatar-DAPlDvhJ.js} +7 -7
  19. package/dist/avatar-DAPlDvhJ.js.map +1 -0
  20. package/dist/{badge-MrKVNzW9.js → badge-HpFqoqSY.js} +40 -40
  21. package/dist/badge-HpFqoqSY.js.map +1 -0
  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 +40 -36
  31. package/dist/base/carousel.js.map +1 -1
  32. package/dist/base/cascader.js +92 -92
  33. package/dist/base/cascader.js.map +1 -1
  34. package/dist/base/chart.js +1 -1
  35. package/dist/base/choice-inputs.js +2 -2
  36. package/dist/base/code-block.js +1 -1
  37. package/dist/base/combobox.js +2 -2
  38. package/dist/base/command.js +1 -1
  39. package/dist/base/copyable.js +1 -1
  40. package/dist/base/date-pickers.js +2 -2
  41. package/dist/base/display.js +6 -6
  42. package/dist/base/feedback.js +3 -3
  43. package/dist/base/forms-numeric.js +1 -1
  44. package/dist/base/forms.js +2 -2
  45. package/dist/base/inline-edit.js +14 -14
  46. package/dist/base/inline-edit.js.map +1 -1
  47. package/dist/base/item.js +1 -1
  48. package/dist/base/media-gallery.js +1 -1
  49. package/dist/base/metadata-list.js +1 -1
  50. package/dist/base/navigation.js +6 -6
  51. package/dist/base/popover-menu.js +1 -1
  52. package/dist/base/popover.js +1 -1
  53. package/dist/base/qr-code.js +1 -1
  54. package/dist/base/repeaters.js +171 -176
  55. package/dist/base/repeaters.js.map +1 -1
  56. package/dist/base/sheet.js +1 -1
  57. package/dist/base/sidebar.js +1 -1
  58. package/dist/base/signature-pad.js +6 -6
  59. package/dist/base/skeleton.js +1 -1
  60. package/dist/base/spinner.js +79 -2
  61. package/dist/base/spinner.js.map +1 -0
  62. package/dist/base/structure.js +1 -1
  63. package/dist/base/table.js +1 -1
  64. package/dist/base/text-inputs.js +2 -2
  65. package/dist/base/toaster.js +46 -45
  66. package/dist/base/toaster.js.map +1 -1
  67. package/dist/base/tree.js +1 -1
  68. package/dist/base/upload-queue.js +1 -1
  69. package/dist/base/upload.js +3 -3
  70. package/dist/base/value-inputs.js +1 -1
  71. package/dist/{batch-action-bar-BZGDG-Si.js → batch-action-bar-DnUJ21NQ.js} +6 -5
  72. package/dist/batch-action-bar-DnUJ21NQ.js.map +1 -0
  73. package/dist/blocks/admin.js +42 -42
  74. package/dist/blocks/admin.js.map +1 -1
  75. package/dist/blocks/ai.js +260 -240
  76. package/dist/blocks/ai.js.map +1 -1
  77. package/dist/blocks/analytics/usage-card.js +1 -1
  78. package/dist/blocks/analytics.js +620 -585
  79. package/dist/blocks/analytics.js.map +1 -1
  80. package/dist/blocks/collaboration.js +1 -1
  81. package/dist/blocks/commerce/receipt.js +1 -1
  82. package/dist/blocks/commerce.js +1152 -1109
  83. package/dist/blocks/commerce.js.map +1 -1
  84. package/dist/blocks/data-display.js +2 -2
  85. package/dist/blocks/onboarding.js +48 -39
  86. package/dist/blocks/onboarding.js.map +1 -1
  87. package/dist/blocks/planning.js +13 -12
  88. package/dist/blocks/planning.js.map +1 -1
  89. package/dist/blocks/timelines.js +1 -1
  90. package/dist/{breadcrumbs-D5t7I023.js → breadcrumbs-C-oqs1sQ.js} +5 -5
  91. package/dist/breadcrumbs-C-oqs1sQ.js.map +1 -0
  92. package/dist/{button-QYwiyhD2.js → button-DVzspB_G.js} +2 -2
  93. package/dist/{button-QYwiyhD2.js.map → button-DVzspB_G.js.map} +1 -1
  94. package/dist/{buttons-SbIcm1HJ.js → buttons-DPZekJFu.js} +20 -15
  95. package/dist/buttons-DPZekJFu.js.map +1 -0
  96. package/dist/cards-BaBZR-AU.js +68 -0
  97. package/dist/cards-BaBZR-AU.js.map +1 -0
  98. package/dist/{chart-QfrARkXl.js → chart-ZOYyK2xG.js} +58 -55
  99. package/dist/chart-ZOYyK2xG.js.map +1 -0
  100. package/dist/{checkbox-DhB6K0bK.js → checkbox-AWIhNhmo.js} +2 -2
  101. package/dist/{checkbox-DhB6K0bK.js.map → checkbox-AWIhNhmo.js.map} +1 -1
  102. package/dist/{choice-inputs-t6w3ATNz.js → choice-inputs-CNHvARCJ.js} +49 -45
  103. package/dist/choice-inputs-CNHvARCJ.js.map +1 -0
  104. package/dist/{code-block-Dgbu-CU3.js → code-block-DeneBJR_.js} +8 -8
  105. package/dist/code-block-DeneBJR_.js.map +1 -0
  106. package/dist/{collapsible-D8AEGU1-.js → collapsible-C-_l4hpy.js} +3 -3
  107. package/dist/{collapsible-D8AEGU1-.js.map → collapsible-C-_l4hpy.js.map} +1 -1
  108. package/dist/{collection-content-uK16Grv0.js → collection-content-By56pLog.js} +3 -3
  109. package/dist/{collection-content-uK16Grv0.js.map → collection-content-By56pLog.js.map} +1 -1
  110. package/dist/combobox-C0EQW6dr.js +875 -0
  111. package/dist/combobox-C0EQW6dr.js.map +1 -0
  112. package/dist/combobox-xCQ2RMNE.js +309 -0
  113. package/dist/combobox-xCQ2RMNE.js.map +1 -0
  114. package/dist/{command-kNR20o7x.js → command-C25VMRII.js} +7 -7
  115. package/dist/{command-kNR20o7x.js.map → command-C25VMRII.js.map} +1 -1
  116. package/dist/{comments-BpDuCUUu.js → comments-BYYlTA8E.js} +114 -105
  117. package/dist/comments-BYYlTA8E.js.map +1 -0
  118. package/dist/components/base/badge/badge.recipes.d.ts +1 -1
  119. package/dist/components/base/buttons/loader-button.d.ts +2 -1
  120. package/dist/components/base/cards/card.recipes.d.ts +2 -3
  121. package/dist/components/base/cards/partials/smart-card-skeleton.d.ts +3 -13
  122. package/dist/components/base/cards/smart-card.types.d.ts +11 -4
  123. package/dist/components/base/chart/chart.d.ts +2 -5
  124. package/dist/components/base/combobox/combobox.strings.d.ts +7 -0
  125. package/dist/components/base/combobox/index.d.ts +30 -4
  126. package/dist/components/base/forms/form-sizing.d.ts +11 -3
  127. package/dist/components/base/navigation/pagination.d.ts +5 -2
  128. package/dist/components/base/popover/popover.recipes.d.ts +15 -1
  129. package/dist/components/base/table/index.d.ts +9 -2
  130. package/dist/components/base/text-inputs/input-group.d.ts +2 -2
  131. package/dist/components/blocks/ai/ai-shimmer/ai-shimmer.d.ts +1 -1
  132. package/dist/components/blocks/ai/ai-shimmer/types.d.ts +3 -0
  133. package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +3 -1
  134. package/dist/components/blocks/data-display/inline-stat/inline-stat.d.ts +16 -8
  135. package/dist/components/features/activities/partials/activity-marker.d.ts +6 -3
  136. package/dist/components/features/appointment-calendar/appointment-calendar.d.ts +5 -0
  137. package/dist/components/features/appointment-calendar/appointment-calendar.types.d.ts +220 -0
  138. package/dist/components/features/appointment-calendar/appointment-calendar.utils.d.ts +41 -0
  139. package/dist/components/features/appointment-calendar/index.d.ts +3 -0
  140. package/dist/components/features/appointment-calendar/partials/appointment-agenda.d.ts +32 -0
  141. package/dist/components/features/appointment-calendar/partials/appointment-month.d.ts +13 -0
  142. package/dist/components/features/combobox/combobox.strings.d.ts +15 -1
  143. package/dist/components/features/combobox/types.d.ts +4 -0
  144. package/dist/components/features/media-library/media-library.strings.d.ts +2 -0
  145. package/dist/components/features/rich-text-editor/index.d.ts +1 -1
  146. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +6 -0
  147. package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +9 -1
  148. package/dist/components/features/table/table-header.d.ts +1 -1
  149. package/dist/components/features/table/table.strings.d.ts +55 -1
  150. package/dist/components/features/table/table.types.d.ts +17 -4
  151. package/dist/components/features/theme-tweaker/theme-tweaker.types.d.ts +5 -0
  152. package/dist/components/primitives/number.d.ts +4 -2
  153. package/dist/components/primitives/value.d.ts +3 -1
  154. package/dist/components/typography/text-link.d.ts +4 -0
  155. package/dist/components/ui/combobox.d.ts +6 -2
  156. package/dist/components/ui/item.d.ts +8 -8
  157. package/dist/components/ui/tabs.d.ts +1 -1
  158. package/dist/{containers-DmWiJa2I.js → containers-Mu1LMGV1.js} +2 -2
  159. package/dist/{containers-DmWiJa2I.js.map → containers-Mu1LMGV1.js.map} +1 -1
  160. package/dist/{copyable-B3Gwgdqc.js → copyable-ClBuk_UK.js} +4 -4
  161. package/dist/{copyable-B3Gwgdqc.js.map → copyable-ClBuk_UK.js.map} +1 -1
  162. package/dist/{data-display-DafIvCl5.js → data-display-DT_khPl_.js} +98 -87
  163. package/dist/data-display-DT_khPl_.js.map +1 -0
  164. package/dist/{date-BgK3bTdo.js → date-DCrsDTZc.js} +5 -5
  165. package/dist/{date-BgK3bTdo.js.map → date-DCrsDTZc.js.map} +1 -1
  166. package/dist/{date-picker-CF-DtUpF.js → date-picker-ay0Pha_a.js} +594 -593
  167. package/dist/date-picker-ay0Pha_a.js.map +1 -0
  168. package/dist/date-pickers-Ccw8DL2b.js +175 -0
  169. package/dist/date-pickers-Ccw8DL2b.js.map +1 -0
  170. package/dist/{display-DsQTVzMz.js → display-hAc1HjpI.js} +49 -49
  171. package/dist/display-hAc1HjpI.js.map +1 -0
  172. package/dist/dropdown-menu-Cl4X7L5S.js +193 -0
  173. package/dist/dropdown-menu-Cl4X7L5S.js.map +1 -0
  174. package/dist/editable-text-recipe-Cn61kEcv.js +10 -0
  175. package/dist/editable-text-recipe-Cn61kEcv.js.map +1 -0
  176. package/dist/features/activities.js +398 -375
  177. package/dist/features/activities.js.map +1 -1
  178. package/dist/features/ai-chat.js +188 -179
  179. package/dist/features/ai-chat.js.map +1 -1
  180. package/dist/features/appointment-calendar.js +683 -0
  181. package/dist/features/appointment-calendar.js.map +1 -0
  182. package/dist/features/async-preview.js +109 -107
  183. package/dist/features/async-preview.js.map +1 -1
  184. package/dist/features/combobox.js +1 -1
  185. package/dist/features/comments.js +1 -1
  186. package/dist/features/data-view.js +137 -137
  187. package/dist/features/data-view.js.map +1 -1
  188. package/dist/features/email-composer.js +255 -255
  189. package/dist/features/email-composer.js.map +1 -1
  190. package/dist/features/event-calendar.js +254 -248
  191. package/dist/features/event-calendar.js.map +1 -1
  192. package/dist/features/filters.js +1 -1
  193. package/dist/features/global-search.js +35 -32
  194. package/dist/features/global-search.js.map +1 -1
  195. package/dist/features/kanban.js +118 -117
  196. package/dist/features/kanban.js.map +1 -1
  197. package/dist/features/map.js +233 -231
  198. package/dist/features/map.js.map +1 -1
  199. package/dist/features/media-library.js +789 -775
  200. package/dist/features/media-library.js.map +1 -1
  201. package/dist/features/mentions.js +1 -1
  202. package/dist/features/overlays.js +1 -1
  203. package/dist/features/products.js +922 -902
  204. package/dist/features/products.js.map +1 -1
  205. package/dist/features/questionnaire.js +28 -24
  206. package/dist/features/questionnaire.js.map +1 -1
  207. package/dist/features/resource-assignment.js +18 -15
  208. package/dist/features/resource-assignment.js.map +1 -1
  209. package/dist/features/resource.js +12 -12
  210. package/dist/features/resource.js.map +1 -1
  211. package/dist/features/rich-text-editor.js +2 -2
  212. package/dist/features/schema-form.js +15 -13
  213. package/dist/features/schema-form.js.map +1 -1
  214. package/dist/features/suggestions.js +3 -3
  215. package/dist/features/sync.js +11 -5
  216. package/dist/features/sync.js.map +1 -1
  217. package/dist/features/table.js +1 -1
  218. package/dist/features/theme-tweaker.js +493 -489
  219. package/dist/features/theme-tweaker.js.map +1 -1
  220. package/dist/feedback-BYIhtitP.js +239 -0
  221. package/dist/feedback-BYIhtitP.js.map +1 -0
  222. package/dist/{field-affordance-recipes-qQeIf4lG.js → field-affordance-recipes-DZhnIL_Y.js} +11 -18
  223. package/dist/field-affordance-recipes-DZhnIL_Y.js.map +1 -0
  224. package/dist/{filters-BkHH53uv.js → filters-BGfvjP4d.js} +589 -580
  225. package/dist/filters-BGfvjP4d.js.map +1 -0
  226. package/dist/{form-field-DUt4UxSV.js → form-field-CwH9y77i.js} +6 -5
  227. package/dist/form-field-CwH9y77i.js.map +1 -0
  228. package/dist/{form-sizing-By94KzXE.js → form-sizing-BdP_Mf5p.js} +39 -44
  229. package/dist/form-sizing-BdP_Mf5p.js.map +1 -0
  230. package/dist/{forms-Bzha-Y3B.js → forms-B9G_xwzi.js} +8 -8
  231. package/dist/{forms-Bzha-Y3B.js.map → forms-B9G_xwzi.js.map} +1 -1
  232. package/dist/{forms-numeric-C0bvjRPZ.js → forms-numeric-B_jraJaQ.js} +309 -309
  233. package/dist/forms-numeric-B_jraJaQ.js.map +1 -0
  234. package/dist/{header-BOefOKd1.js → header-CGXuhcRm.js} +160 -153
  235. package/dist/header-CGXuhcRm.js.map +1 -0
  236. package/dist/{hooks-9k_TtmKh.js → hooks-Dkz0K2WT.js} +2 -2
  237. package/dist/{hooks-9k_TtmKh.js.map → hooks-Dkz0K2WT.js.map} +1 -1
  238. package/dist/{icon-badge-CAuKupo9.js → icon-badge-DYKIwvOV.js} +4 -4
  239. package/dist/{icon-badge-CAuKupo9.js.map → icon-badge-DYKIwvOV.js.map} +1 -1
  240. package/dist/index.js +3 -3
  241. package/dist/input-CZw8iU99.js +21 -0
  242. package/dist/input-CZw8iU99.js.map +1 -0
  243. package/dist/input-DQdEd0YD.js +263 -0
  244. package/dist/input-DQdEd0YD.js.map +1 -0
  245. package/dist/{interaction-recipes-CHr0dJUs.js → interaction-recipes-XR9ZpVYL.js} +2 -1
  246. package/dist/interaction-recipes-XR9ZpVYL.js.map +1 -0
  247. package/dist/item-K5_ghvze.js +275 -0
  248. package/dist/item-K5_ghvze.js.map +1 -0
  249. package/dist/layout/app-shell.js +1 -1
  250. package/dist/layout/auth.js +1 -1
  251. package/dist/layout/containers.js +1 -1
  252. package/dist/layout/header.js +1 -1
  253. package/dist/layout/hooks.js +1 -1
  254. package/dist/layout/navigation.js +1 -1
  255. package/dist/layout/page.js +1 -1
  256. package/dist/layout/settings.js +1 -1
  257. package/dist/layout/sidebar.js +2 -2
  258. package/dist/layout/workspace.js +1 -1
  259. package/dist/layout.js +10 -10
  260. package/dist/lib/affordance-geometry.generated.d.ts +71 -0
  261. package/dist/lib/editable-text-recipe.d.ts +4 -4
  262. package/dist/lib/field-affordance-recipes.d.ts +2 -2
  263. package/dist/lib/interaction-recipes.d.ts +5 -0
  264. package/dist/lib/theme-mode-css.d.ts +7 -0
  265. package/dist/lib/tone-recipes.d.ts +8 -0
  266. package/dist/lib/ui-provider/types.d.ts +2 -2
  267. package/dist/lib/utils.js +1 -1
  268. package/dist/{media-gallery-DcTtAaeC.js → media-gallery-3zIVLMWH.js} +8 -8
  269. package/dist/media-gallery-3zIVLMWH.js.map +1 -0
  270. package/dist/{mentions-D-uyCh01.js → mentions-utuUvH1K.js} +144 -142
  271. package/dist/mentions-utuUvH1K.js.map +1 -0
  272. package/dist/{message-CdHgIWKf.js → message-DZ_ruyUV.js} +6 -5
  273. package/dist/message-DZ_ruyUV.js.map +1 -0
  274. package/dist/{metadata-list-X5rYAKSB.js → metadata-list-8N16ZMW_.js} +130 -119
  275. package/dist/metadata-list-8N16ZMW_.js.map +1 -0
  276. package/dist/{navigation-D3KwXmaq.js → navigation-Bnotn4AQ.js} +19 -19
  277. package/dist/navigation-Bnotn4AQ.js.map +1 -0
  278. package/dist/{navigation-HJf5zxlH.js → navigation-BzhHI3lo.js} +36 -35
  279. package/dist/navigation-BzhHI3lo.js.map +1 -0
  280. package/dist/{navigation-row-recipes-BVowojQw.js → navigation-row-recipes-BFLCk_Aq.js} +2 -2
  281. package/dist/{navigation-row-recipes-BVowojQw.js.map → navigation-row-recipes-BFLCk_Aq.js.map} +1 -1
  282. package/dist/{number-DMhe-Vsk.js → number-DbV1Dija.js} +36 -34
  283. package/dist/{number-DMhe-Vsk.js.map → number-DbV1Dija.js.map} +1 -1
  284. package/dist/{overflow-tab-bar-sQHXLlwQ.js → overflow-tab-bar-CWY7Nogn.js} +105 -103
  285. package/dist/overflow-tab-bar-CWY7Nogn.js.map +1 -0
  286. package/dist/{overlays-I0axtYA6.js → overlays-DNWmZrJ4.js} +14 -12
  287. package/dist/overlays-DNWmZrJ4.js.map +1 -0
  288. package/dist/{page-B5dTH9gE.js → page-Bgl1F560.js} +8 -8
  289. package/dist/{page-B5dTH9gE.js.map → page-Bgl1F560.js.map} +1 -1
  290. package/dist/{page-header-commands-DjzFEq3E.js → page-header-commands-DOb6WsfD.js} +5 -5
  291. package/dist/{page-header-commands-DjzFEq3E.js.map → page-header-commands-DOb6WsfD.js.map} +1 -1
  292. package/dist/pagination-BL25hu2s.js +158 -0
  293. package/dist/pagination-BL25hu2s.js.map +1 -0
  294. package/dist/{popover-Di55PyAI.js → popover-7_m66eYW.js} +8 -7
  295. package/dist/{popover-Di55PyAI.js.map → popover-7_m66eYW.js.map} +1 -1
  296. package/dist/popover-menu-B9WWygpa.js +100 -0
  297. package/dist/popover-menu-B9WWygpa.js.map +1 -0
  298. package/dist/{popover.recipes-Bdyhj2db.js → popover.recipes-D3j8R8Yp.js} +17 -10
  299. package/dist/popover.recipes-D3j8R8Yp.js.map +1 -0
  300. package/dist/{primitives-B-CkiEMU.js → primitives-BFK08r9M.js} +45 -44
  301. package/dist/primitives-BFK08r9M.js.map +1 -0
  302. package/dist/primitives.js +4 -4
  303. package/dist/{progress-rnS8-uAW.js → progress-B1VnCT0K.js} +5 -5
  304. package/dist/{progress-rnS8-uAW.js.map → progress-B1VnCT0K.js.map} +1 -1
  305. package/dist/{receipt-D0oswZ0p.js → receipt-BVSOH3Xo.js} +9 -6
  306. package/dist/{receipt-D0oswZ0p.js.map → receipt-BVSOH3Xo.js.map} +1 -1
  307. package/dist/{rich-text-DvGulsNJ.js → rich-text-GOUyKQ-s.js} +3 -3
  308. package/dist/{rich-text-DvGulsNJ.js.map → rich-text-GOUyKQ-s.js.map} +1 -1
  309. package/dist/{rich-text-editor-sMU_Scqm.js → rich-text-editor-cRLC-eBK.js} +418 -426
  310. package/dist/rich-text-editor-cRLC-eBK.js.map +1 -0
  311. package/dist/rich-text-editor-toolbar-DfXg0-VC.js +94 -0
  312. package/dist/rich-text-editor-toolbar-DfXg0-VC.js.map +1 -0
  313. package/dist/{scroll-area-Bt_vXY2b.js → scroll-area-DcI-M1UT.js} +2 -2
  314. package/dist/{scroll-area-Bt_vXY2b.js.map → scroll-area-DcI-M1UT.js.map} +1 -1
  315. package/dist/{separator-C8DlRGwF.js → separator-BDV-Y648.js} +3 -3
  316. package/dist/{separator-C8DlRGwF.js.map → separator-BDV-Y648.js.map} +1 -1
  317. package/dist/{separator-CYHnjsAb.js → separator-Bom7NsGO.js} +2 -2
  318. package/dist/{separator-CYHnjsAb.js.map → separator-Bom7NsGO.js.map} +1 -1
  319. package/dist/services/actions.js +1 -1
  320. package/dist/{settings-CQW3b-Cu.js → settings-ybnjVwbd.js} +20 -19
  321. package/dist/settings-ybnjVwbd.js.map +1 -0
  322. package/dist/{sheet-4SEvVYzA.js → sheet-CGpB3omz.js} +8 -7
  323. package/dist/{sheet-4SEvVYzA.js.map → sheet-CGpB3omz.js.map} +1 -1
  324. package/dist/{sidebar-d7Dg80ln.js → sidebar-A0ElHINE.js} +14 -13
  325. package/dist/{sidebar-d7Dg80ln.js.map → sidebar-A0ElHINE.js.map} +1 -1
  326. package/dist/{sidebar-C7WWR29L.js → sidebar-CPx_7YBa.js} +183 -182
  327. package/dist/sidebar-CPx_7YBa.js.map +1 -0
  328. package/dist/{skeleton-Cz890JZF.js → skeleton-Byjnt7qr.js} +3 -3
  329. package/dist/{skeleton-Cz890JZF.js.map → skeleton-Byjnt7qr.js.map} +1 -1
  330. package/dist/smart-card-DiC5aac3.js +604 -0
  331. package/dist/smart-card-DiC5aac3.js.map +1 -0
  332. package/dist/{structure-DC2dygdA.js → structure-BmisBK-3.js} +2 -2
  333. package/dist/{structure-DC2dygdA.js.map → structure-BmisBK-3.js.map} +1 -1
  334. package/dist/style.css +1 -1
  335. package/dist/table-BweFy_P9.js +1530 -0
  336. package/dist/table-BweFy_P9.js.map +1 -0
  337. package/dist/{table-CIKyLUsy.js → table-DsfzoUia.js} +75 -63
  338. package/dist/table-DsfzoUia.js.map +1 -0
  339. package/dist/{tabs-DwBJfjxX.js → tabs-CDocW5D1.js} +14 -13
  340. package/dist/tabs-CDocW5D1.js.map +1 -0
  341. package/dist/text-inputs-f9Ia-aCi.js +353 -0
  342. package/dist/text-inputs-f9Ia-aCi.js.map +1 -0
  343. package/dist/theme-mode-css-BB-_RYab.js +14 -0
  344. package/dist/theme-mode-css-BB-_RYab.js.map +1 -0
  345. package/dist/theme-scope-BJ6eE2xt.js +50 -0
  346. package/dist/theme-scope-BJ6eE2xt.js.map +1 -0
  347. package/dist/theme.css +285 -228
  348. package/dist/themes/green.css +16 -12
  349. package/dist/timelines-CwM_9IhD.js +457 -0
  350. package/dist/timelines-CwM_9IhD.js.map +1 -0
  351. package/dist/{tone-recipes-CPoExcTE.js → tone-recipes-BPsRAvhu.js} +5 -2
  352. package/dist/tone-recipes-BPsRAvhu.js.map +1 -0
  353. package/dist/{tooltip-CsfgrfS7.js → tooltip-yiRJUFjp.js} +4 -4
  354. package/dist/{tooltip-CsfgrfS7.js.map → tooltip-yiRJUFjp.js.map} +1 -1
  355. package/dist/{tree-BiKhg8AY.js → tree-WnKQzwbq.js} +9 -9
  356. package/dist/{tree-BiKhg8AY.js.map → tree-WnKQzwbq.js.map} +1 -1
  357. package/dist/typography/rich-text.js +1 -1
  358. package/dist/{typography-DTRkE9zL.js → typography-UTnveOEy.js} +6 -6
  359. package/dist/typography-UTnveOEy.js.map +1 -0
  360. package/dist/typography.js +2 -2
  361. package/dist/{ui-provider-1D_NSYzO.js → ui-provider-C_U0Xma4.js} +3 -3
  362. package/dist/ui-provider-C_U0Xma4.js.map +1 -0
  363. package/dist/ui-provider.js +2 -2
  364. package/dist/{upload-BO8-CLN6.js → upload-CXyxmQBP.js} +13 -12
  365. package/dist/upload-CXyxmQBP.js.map +1 -0
  366. package/dist/{upload-queue-EOC8g1gf.js → upload-queue-Boscubn9.js} +11 -9
  367. package/dist/upload-queue-Boscubn9.js.map +1 -0
  368. package/dist/{usage-card-obRaBskq.js → usage-card-BhO5eqkX.js} +53 -37
  369. package/dist/usage-card-BhO5eqkX.js.map +1 -0
  370. package/dist/{utils-l5LpDw2z.js → utils-BRhFDwuU.js} +59 -44
  371. package/dist/utils-BRhFDwuU.js.map +1 -0
  372. package/dist/{value-inputs-TAYMX111.js → value-inputs-DXPDjvBU.js} +268 -252
  373. package/dist/value-inputs-DXPDjvBU.js.map +1 -0
  374. package/dist/{value-typography-b8wpz1eX.js → value-typography-BP8OG6h5.js} +2 -2
  375. package/dist/{value-typography-b8wpz1eX.js.map → value-typography-BP8OG6h5.js.map} +1 -1
  376. package/dist/{workspace-DH0v0KcB.js → workspace-Cdrg7k9f.js} +34 -33
  377. package/dist/workspace-Cdrg7k9f.js.map +1 -0
  378. package/docs/consumer-skill/SKILL.md +2 -2
  379. package/docs/consumer-skill/references/agents-md.md +1 -1
  380. package/docs/consumer-skill/references/composition.md +8 -6
  381. package/docs/consumer-skill/references/integration.md +4 -3
  382. package/docs/consumer-skill/references/public-api.json +105 -2
  383. package/docs/consumer-skill/references/review.md +7 -0
  384. package/docs/consumer-skill/references/theming.md +71 -6
  385. package/docs/consumer-skill/references/tokens.json +1 -1
  386. package/docs/consumer-skill/references/workflows.md +25 -0
  387. package/docs/consumer-skill/scripts/composition-policy.mjs +3 -2
  388. package/docs/consumer-skill/scripts/surface-policy.mjs +11 -0
  389. package/package.json +8 -4
  390. package/dist/accordion-B6a3vVgA.js.map +0 -1
  391. package/dist/action-menu-TzCoSlwL.js +0 -280
  392. package/dist/action-menu-TzCoSlwL.js.map +0 -1
  393. package/dist/affordance-geometry.generated-B5iu-Mkr.js +0 -69
  394. package/dist/affordance-geometry.generated-B5iu-Mkr.js.map +0 -1
  395. package/dist/ai-artifact-BMJdv-6q.js +0 -1115
  396. package/dist/ai-artifact-BMJdv-6q.js.map +0 -1
  397. package/dist/attachment-BtfhGm8i.js +0 -245
  398. package/dist/attachment-BtfhGm8i.js.map +0 -1
  399. package/dist/auth-CYxKfo69.js.map +0 -1
  400. package/dist/avatar-BBnEJIx8.js.map +0 -1
  401. package/dist/badge-MrKVNzW9.js.map +0 -1
  402. package/dist/batch-action-bar-BZGDG-Si.js.map +0 -1
  403. package/dist/breadcrumbs-D5t7I023.js.map +0 -1
  404. package/dist/buttons-SbIcm1HJ.js.map +0 -1
  405. package/dist/cards-CiiHpKYd.js +0 -66
  406. package/dist/cards-CiiHpKYd.js.map +0 -1
  407. package/dist/chart-QfrARkXl.js.map +0 -1
  408. package/dist/choice-inputs-t6w3ATNz.js.map +0 -1
  409. package/dist/code-block-Dgbu-CU3.js.map +0 -1
  410. package/dist/combobox-2Ic8N9bL.js +0 -278
  411. package/dist/combobox-2Ic8N9bL.js.map +0 -1
  412. package/dist/combobox-DLl0bfiq.js +0 -867
  413. package/dist/combobox-DLl0bfiq.js.map +0 -1
  414. package/dist/comments-BpDuCUUu.js.map +0 -1
  415. package/dist/data-display-DafIvCl5.js.map +0 -1
  416. package/dist/date-picker-CF-DtUpF.js.map +0 -1
  417. package/dist/date-pickers-BmzxJl5l.js +0 -174
  418. package/dist/date-pickers-BmzxJl5l.js.map +0 -1
  419. package/dist/display-DsQTVzMz.js.map +0 -1
  420. package/dist/dropdown-menu-E2qmdC7o.js +0 -193
  421. package/dist/dropdown-menu-E2qmdC7o.js.map +0 -1
  422. package/dist/editable-text-recipe-Bkm6wKHp.js +0 -10
  423. package/dist/editable-text-recipe-Bkm6wKHp.js.map +0 -1
  424. package/dist/feedback-qNuMBtRH.js +0 -233
  425. package/dist/feedback-qNuMBtRH.js.map +0 -1
  426. package/dist/field-affordance-recipes-qQeIf4lG.js.map +0 -1
  427. package/dist/filters-BkHH53uv.js.map +0 -1
  428. package/dist/form-field-DUt4UxSV.js.map +0 -1
  429. package/dist/form-sizing-By94KzXE.js.map +0 -1
  430. package/dist/forms-numeric-C0bvjRPZ.js.map +0 -1
  431. package/dist/header-BOefOKd1.js.map +0 -1
  432. package/dist/input-DWhBBBww.js +0 -262
  433. package/dist/input-DWhBBBww.js.map +0 -1
  434. package/dist/input-Ddi_LSYv.js +0 -20
  435. package/dist/input-Ddi_LSYv.js.map +0 -1
  436. package/dist/interaction-recipes-CHr0dJUs.js.map +0 -1
  437. package/dist/item-DEmDiTlD.js +0 -265
  438. package/dist/item-DEmDiTlD.js.map +0 -1
  439. package/dist/media-gallery-DcTtAaeC.js.map +0 -1
  440. package/dist/mentions-D-uyCh01.js.map +0 -1
  441. package/dist/message-CdHgIWKf.js.map +0 -1
  442. package/dist/metadata-list-X5rYAKSB.js.map +0 -1
  443. package/dist/navigation-D3KwXmaq.js.map +0 -1
  444. package/dist/navigation-HJf5zxlH.js.map +0 -1
  445. package/dist/overflow-tab-bar-sQHXLlwQ.js.map +0 -1
  446. package/dist/overlays-I0axtYA6.js.map +0 -1
  447. package/dist/pagination-3bPA_a6K.js +0 -149
  448. package/dist/pagination-3bPA_a6K.js.map +0 -1
  449. package/dist/popover-menu-B71Tn2Qz.js +0 -99
  450. package/dist/popover-menu-B71Tn2Qz.js.map +0 -1
  451. package/dist/popover.recipes-Bdyhj2db.js.map +0 -1
  452. package/dist/primitives-B-CkiEMU.js.map +0 -1
  453. package/dist/rich-text-editor-sMU_Scqm.js.map +0 -1
  454. package/dist/rich-text-editor.recipes-CadiF_Uu.js +0 -88
  455. package/dist/rich-text-editor.recipes-CadiF_Uu.js.map +0 -1
  456. package/dist/settings-CQW3b-Cu.js.map +0 -1
  457. package/dist/sidebar-C7WWR29L.js.map +0 -1
  458. package/dist/smart-card-lFKxn5Hu.js +0 -595
  459. package/dist/smart-card-lFKxn5Hu.js.map +0 -1
  460. package/dist/spinner-fa3h1Aif.js +0 -80
  461. package/dist/spinner-fa3h1Aif.js.map +0 -1
  462. package/dist/table-CIKyLUsy.js.map +0 -1
  463. package/dist/table-CrcLN9Io.js +0 -1458
  464. package/dist/table-CrcLN9Io.js.map +0 -1
  465. package/dist/tabs-DwBJfjxX.js.map +0 -1
  466. package/dist/text-inputs-aaK9wcDT.js +0 -326
  467. package/dist/text-inputs-aaK9wcDT.js.map +0 -1
  468. package/dist/theme-scope-kStaAer0.js +0 -39
  469. package/dist/theme-scope-kStaAer0.js.map +0 -1
  470. package/dist/timelines-C_SBwHNP.js +0 -442
  471. package/dist/timelines-C_SBwHNP.js.map +0 -1
  472. package/dist/tone-recipes-CPoExcTE.js.map +0 -1
  473. package/dist/typography-DTRkE9zL.js.map +0 -1
  474. package/dist/ui-provider-1D_NSYzO.js.map +0 -1
  475. package/dist/upload-BO8-CLN6.js.map +0 -1
  476. package/dist/upload-queue-EOC8g1gf.js.map +0 -1
  477. package/dist/usage-card-obRaBskq.js.map +0 -1
  478. package/dist/utils-l5LpDw2z.js.map +0 -1
  479. package/dist/value-inputs-TAYMX111.js.map +0 -1
  480. package/dist/workspace-DH0v0KcB.js.map +0 -1
@@ -1,9 +1,9 @@
1
1
  "use client";
2
- import { c as e, m as t } from "./ui-provider-1D_NSYzO.js";
3
- import { t as n } from "./utils-l5LpDw2z.js";
4
- import { c as r, l as i, n as a, r as o, s } from "./typography-DTRkE9zL.js";
2
+ import { c as e, m as t } from "./ui-provider-C_U0Xma4.js";
3
+ import { t as n } from "./utils-BRhFDwuU.js";
4
+ import { c as r, i, l as a, r as o, u as s } from "./typography-UTnveOEy.js";
5
5
  import { n as c } from "./text.styles-g4He6UIW.js";
6
- import { n as l, o as u, r as d, t as f } from "./value-typography-b8wpz1eX.js";
6
+ import { n as l, o as u, r as d, t as f } from "./value-typography-BP8OG6h5.js";
7
7
  import { t as p } from "./initials-format-CDoQEOd_.js";
8
8
  import "react";
9
9
  import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
@@ -23,24 +23,25 @@ var _ = {
23
23
  function b(e) {
24
24
  return e == null || e === "";
25
25
  }
26
- function x({ valueRole: e, hookClassName: t, numeric: r = !1, children: i, emptyLabel: a = "—", size: o, align: c, weight: u, type: d, className: p, ref: m, ...g }) {
27
- let _ = l({
28
- size: o,
26
+ function x({ valueRole: e, hookClassName: t, numeric: i = !1, children: a, emptyLabel: o = "—", size: s, align: c, weight: u, type: d, lineHeight: p, className: m, ref: g, ..._ }) {
27
+ let v = l({
28
+ size: s,
29
29
  type: d,
30
- weight: u
31
- }, e), v = b(i), y = v ? f(_, u) : _;
32
- return /* @__PURE__ */ h(s, {
33
- ref: m,
30
+ weight: u,
31
+ lineHeight: p
32
+ }, e), y = b(a), x = y ? f(v, u) : v;
33
+ return /* @__PURE__ */ h(r, {
34
+ ref: g,
34
35
  tag: "span",
35
- size: y.size,
36
+ size: x.size,
36
37
  align: c,
37
- weight: y.weight,
38
- type: y.type,
39
- lineHeight: y.lineHeight,
40
- numeric: r && !v,
41
- className: n(t, p),
42
- ...g,
43
- children: v ? a : i
38
+ weight: x.weight,
39
+ type: x.type,
40
+ lineHeight: x.lineHeight,
41
+ numeric: i && !y,
42
+ className: n(t, m),
43
+ ..._,
44
+ children: y ? o : a
44
45
  });
45
46
  }
46
47
  function S(e) {
@@ -61,7 +62,7 @@ function w(e) {
61
62
  return /* @__PURE__ */ h(x, {
62
63
  ...e,
63
64
  valueRole: v,
64
- hookClassName: "muted-value--component inline min-w-0 opacity-80"
65
+ hookClassName: "muted-value--component inline min-w-0"
65
66
  });
66
67
  }
67
68
  function T(e) {
@@ -151,8 +152,8 @@ function z({ value: e, strategy: t, maxCharacters: r, locale: i, fallback: a, si
151
152
  }
152
153
  //#endregion
153
154
  //#region src/components/primitives/link.tsx
154
- function B({ children: e, emptyLabel: s = "—", className: l, ref: u, ...d }) {
155
- let f = i(), { defaultTextSize: p } = t(), m = e == null || e === "" ? s : e;
155
+ function B({ children: e, emptyLabel: r = "—", className: l, ref: u, ...d }) {
156
+ let f = s(), { defaultTextSize: p } = t(), m = e == null || e === "" ? r : e;
156
157
  return /* @__PURE__ */ h("a", {
157
158
  ref: u,
158
159
  "data-typography": "link",
@@ -162,9 +163,9 @@ function B({ children: e, emptyLabel: s = "—", className: l, ref: u, ...d }) {
162
163
  weight: null,
163
164
  align: null,
164
165
  lineHeight: f ? null : "normal"
165
- }), "link--component text-link-color wrap-anywhere", a, f ? `${o} hover:decoration-transparent` : "no-underline underline-offset-[0.2em] hover:underline", l),
166
+ }), "link--component text-link-color wrap-anywhere", o, f ? `${i} hover:decoration-transparent` : "no-underline underline-offset-[0.2em] hover:underline", l),
166
167
  ...d,
167
- children: /* @__PURE__ */ h(r.Provider, {
168
+ children: /* @__PURE__ */ h(a.Provider, {
168
169
  value: !0,
169
170
  children: m
170
171
  })
@@ -273,16 +274,16 @@ function Z(e, t) {
273
274
  minimumFractionDigits: 0
274
275
  }).format(i)} ${J[a]}`;
275
276
  }
276
- function te({ value: t, from: r = "bytes", locale: i, emptyLabel: a = "—", size: o, align: c = "right", weight: u, type: d, className: p, ref: m, ...g }) {
277
+ function te({ value: t, from: i = "bytes", locale: a, emptyLabel: o = "—", size: s, align: c = "right", weight: u, type: d, className: p, ref: m, ...g }) {
277
278
  let _ = e(), v = l({
278
- size: o,
279
+ size: s,
279
280
  type: d,
280
281
  weight: u
281
282
  }, q), y = Z(t, {
282
- from: r,
283
- locale: i ?? _.locale
283
+ from: i,
284
+ locale: a ?? _.locale
284
285
  }), b = y === null ? f(v, u) : v;
285
- return /* @__PURE__ */ h(s, {
286
+ return /* @__PURE__ */ h(r, {
286
287
  ref: m,
287
288
  tag: "span",
288
289
  size: b.size,
@@ -292,7 +293,7 @@ function te({ value: t, from: r = "bytes", locale: i, emptyLabel: a = "—", siz
292
293
  lineHeight: b.lineHeight,
293
294
  className: n("file-size--component inline tabular-nums", p),
294
295
  ...g,
295
- children: y ?? a
296
+ children: y ?? o
296
297
  });
297
298
  }
298
299
  //#endregion
@@ -301,20 +302,20 @@ var ne = {
301
302
  type: "main",
302
303
  weight: "regular"
303
304
  };
304
- function re({ value: t, from: r = "seconds", locale: i, maxParts: a = 2, unitDisplay: o = "narrow", minimumFractionDigits: c, maximumFractionDigits: u, emptyLabel: p = "—", size: m, align: g = "right", weight: _, type: v, className: y, ref: b, ...x }) {
305
+ function re({ value: t, from: i = "seconds", locale: a, maxParts: o = 2, unitDisplay: s = "narrow", minimumFractionDigits: c, maximumFractionDigits: u, emptyLabel: p = "—", size: m, align: g = "right", weight: _, type: v, className: y, ref: b, ...x }) {
305
306
  let S = e(), C = l({
306
307
  size: m,
307
308
  type: v,
308
309
  weight: _
309
310
  }, ne), w = t == null ? null : d(t, {
310
- from: r,
311
- locale: i ?? S.locale,
312
- maxParts: a,
313
- unitDisplay: o,
311
+ from: i,
312
+ locale: a ?? S.locale,
313
+ maxParts: o,
314
+ unitDisplay: s,
314
315
  minimumFractionDigits: c,
315
- maximumFractionDigits: u ?? (r === "milliseconds" ? 1 : void 0)
316
+ maximumFractionDigits: u ?? (i === "milliseconds" ? 1 : void 0)
316
317
  }), T = w === null || w === "—", E = T ? f(C, _) : C;
317
- return /* @__PURE__ */ h(s, {
318
+ return /* @__PURE__ */ h(r, {
318
319
  ref: b,
319
320
  tag: "span",
320
321
  size: E.size,
@@ -349,18 +350,18 @@ function $(e, t, { depth: n, unit: r, separator: i = " × ", locale: a, options:
349
350
  let p = f.map((e) => u(d, e)).join(i);
350
351
  return r ? `${p} ${r}` : p;
351
352
  }
352
- function ae({ width: t, height: r, depth: i, unit: a, separator: o = " × ", locale: c, options: u, emptyLabel: d = "—", size: p, align: _ = "right", weight: v, type: y, className: b, ref: x, ...S }) {
353
+ function ae({ width: t, height: i, depth: a, unit: o, separator: s = " × ", locale: c, options: u, emptyLabel: d = "—", size: p, align: _ = "right", weight: v, type: y, className: b, ref: x, ...S }) {
353
354
  let C = e(), w = l({
354
355
  size: p,
355
356
  type: y,
356
357
  weight: v
357
- }, ie), T = $(t, r, {
358
- depth: i,
359
- separator: typeof o == "string" ? o : " × ",
358
+ }, ie), T = $(t, i, {
359
+ depth: a,
360
+ separator: typeof s == "string" ? s : " × ",
360
361
  locale: c ?? C.locale,
361
362
  options: u
362
363
  }), E = T === null ? f(w, v) : w;
363
- return /* @__PURE__ */ h(s, {
364
+ return /* @__PURE__ */ h(r, {
364
365
  ref: x,
365
366
  tag: "span",
366
367
  size: E.size,
@@ -370,10 +371,10 @@ function ae({ width: t, height: r, depth: i, unit: a, separator: o = " × ", loc
370
371
  lineHeight: E.lineHeight,
371
372
  className: n("dimensions--component inline tabular-nums", b),
372
373
  ...S,
373
- children: T === null ? d : /* @__PURE__ */ g(m, { children: [typeof o == "string" ? T : T.split(" × ").map((e, t) => /* @__PURE__ */ g("span", { children: [t > 0 && o, e] }, `${e}-${t}`)), !!a && /* @__PURE__ */ g(m, { children: [" ", a] })] })
374
+ children: T === null ? d : /* @__PURE__ */ g(m, { children: [typeof s == "string" ? T : T.split(" × ").map((e, t) => /* @__PURE__ */ g("span", { children: [t > 0 && s, e] }, `${e}-${t}`)), !!o && /* @__PURE__ */ g(m, { children: [" ", o] })] })
374
375
  });
375
376
  }
376
377
  //#endregion
377
378
  export { S as _, Z as a, W as c, R as d, L as f, C as g, w as h, te as i, K as l, T as m, $ as n, H as o, E as p, re as r, B as s, ae as t, z as u };
378
379
 
379
- //# sourceMappingURL=primitives-B-CkiEMU.js.map
380
+ //# sourceMappingURL=primitives-BFK08r9M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitives-BFK08r9M.js","names":["_Fragment","useFormattingConfig","useTypographyConfig","cn","Text","RunningTextContext","inlineLinkClassName","useInRunningText","resolveTextClassNames","useValueTypography","formatWithMinusSign","formatDuration","emptyValueTypography","formatInitials","Fragment$1","VALUE_ROLE","SECONDARY_ROLE","MONO_ROLE","isEmptyValue","children","ValueText","props","resolved","valueRole","empty","typography","weight","numeric","hookClassName","className","emptyLabel","Value","SecondaryValue","MutedValue","MonoValue","EmptyValue","WORD_SEPARATOR","NAME_CONNECTOR","LETTER_MATCHER","LETTERS_MATCHER","normalizeNameWhitespace","value","getLetters","getFirstLetter","match","isFormattedSegment","first","segment","letters","isAllUpper","isAllLower","isFormattedName","word","formatNameSegment","before","after","formatNameWord","formatName","normalized","options","Name","rawValue","content","Initials","Link","inText","defaultTextSize","linkUnderlineClassName","EmptyContact","_href","_target","_rel","_download","_hrefLang","_ping","_referrerPolicy","_media","_type","spanProps","contactProps","Email","query","subject","body","href","display","normalizeTel","Phone","normalizeUrl","Url","isExternal","external","resolvedTarget","target","resolvedRel","rel","FILE_SIZE_ROLE","FILE_SIZE_UNITS","FILE_SIZE_UNIT_MULTIPLIER","normalizeFileSizeValue","from","formatFileSize","locale","bytes","displayValue","unitIndex","FileSize","formatting","label","DURATION_ROLE","Duration","maximumFractionDigits","DIMENSIONS_ROLE","parseDimensionPart","parsed","formatDimensions","parsedWidth","width","parsedHeight","height","parsedDepth","depth","formatter","values","separator","unit","Dimensions","index","part"],"sources":["../src/components/primitives/value.tsx","../src/components/primitives/name.tsx","../src/components/primitives/initials.tsx","../src/components/primitives/link.tsx","../src/components/primitives/file-size.tsx","../src/components/primitives/duration.tsx","../src/components/primitives/dimensions.tsx"],"sourcesContent":["import { type ComponentPropsWithoutRef, type ReactNode, type Ref } from 'react';\n\nimport { Text, type TextProps } from '../typography';\nimport type { TextSize } from '../../lib/ui-provider';\nimport { EMPTY } from '../../lib/format';\nimport { cn } from '../../lib/utils';\n\nimport { emptyValueTypography, useValueTypography, type ValueTypographyRole } from './value-typography';\n\ntype SpanProps = Omit<ComponentPropsWithoutRef<'span'>, 'children' | 'color'>;\n/** Value colour roles: foreground, secondary, or the surrounding text colour. */\nexport type ValueType = Extract<TextProps['type'], 'main' | 'secondary' | 'inherit'>;\n\nexport interface ValueProps extends SpanProps {\n\tchildren?: ReactNode;\n\t/** Rendered with the shared empty treatment when children are absent. Defaults to an em dash. */\n\temptyLabel?: ReactNode;\n\t/**\n\t * Text size. A standalone value uses the provider text size; inside running\n\t * text (`Text`, `Heading`, labels, links, other values) it inherits the size.\n\t */\n\tsize?: TextSize;\n\talign?: TextProps['align'];\n\t/** Font weight. Defaults to the component's role weight; inside running text, the surrounding weight. */\n\tweight?: TextProps['weight'];\n\t/** Colour role. Defaults to the component's role; inside running text `Value` and `MonoValue` take the surrounding colour. */\n\ttype?: ValueType;\n\t/** Line height. Defaults to the role leading; inside running text, the surrounding leading. */\n\tlineHeight?: TextProps['lineHeight'];\n\tref?: Ref<HTMLSpanElement>;\n}\n\nconst VALUE_ROLE: ValueTypographyRole = { type: 'main', weight: 'regular' };\nconst SECONDARY_ROLE: ValueTypographyRole = { type: 'secondary', weight: 'regular', keepType: true };\nconst MONO_ROLE: ValueTypographyRole = { type: 'main', weight: 'medium', inTextLineHeight: 'none' };\n\nfunction isEmptyValue(children: ReactNode) {\n\treturn children === null || children === undefined || children === '';\n}\n\ninterface ValueTextProps extends ValueProps {\n\tvalueRole: ValueTypographyRole;\n\thookClassName: string;\n\tnumeric?: boolean;\n}\n\n/** Shared span for the value family: role resolution plus the empty treatment. */\nfunction ValueText({ valueRole, hookClassName, numeric = false, children, emptyLabel = EMPTY, size, align, weight, type, lineHeight, className, ref, ...props }: ValueTextProps) {\n\tconst resolved = useValueTypography({ size, type, weight, lineHeight }, valueRole);\n\tconst empty = isEmptyValue(children);\n\tconst typography = empty ? emptyValueTypography(resolved, weight) : resolved;\n\treturn (\n\t\t<Text\n\t\t\tref={ref}\n\t\t\ttag=\"span\"\n\t\t\tsize={typography.size}\n\t\t\talign={align}\n\t\t\tweight={typography.weight}\n\t\t\ttype={typography.type}\n\t\t\tlineHeight={typography.lineHeight}\n\t\t\tnumeric={numeric && !empty}\n\t\t\tclassName={cn(hookClassName, className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{empty ? emptyLabel : children}\n\t\t</Text>\n\t);\n}\n\n/**\n * An ordinary displayed fact: foreground, regular weight. Inside running text it\n * takes the sentence's size, colour and weight.\n */\nexport function Value(props: ValueProps) {\n\treturn <ValueText {...props} valueRole={VALUE_ROLE} hookClassName=\"value--component inline min-w-0\" />;\n}\n\n/** Supporting detail in the secondary colour. Inside running text it keeps the colour and takes the size and weight. */\nexport function SecondaryValue(props: ValueProps) {\n\treturn <ValueText {...props} valueRole={SECONDARY_ROLE} hookClassName=\"secondary-value--component inline min-w-0\" />;\n}\n\n/** A quiet note using the shared secondary foreground. */\nexport function MutedValue(props: ValueProps) {\n\treturn <ValueText {...props} valueRole={SECONDARY_ROLE} hookClassName=\"muted-value--component inline min-w-0\" />;\n}\n\n/**\n * An identifier or code (SKU, reference, tracking number, key) in the monospace\n * family. Standalone it is foreground medium at the provider size; inside running\n * text only the family changes, so an SKU in a description matches the words\n * around it. Amounts and dates belong to the number primitives, which keep the\n * sans font with tabular figures.\n */\nexport function MonoValue(props: ValueProps) {\n\treturn <ValueText {...props} valueRole={MONO_ROLE} numeric hookClassName=\"mono-value--component inline min-w-0 break-words\" />;\n}\n\nexport interface EmptyValueProps extends Omit<ValueProps, 'emptyLabel'> {\n\tref?: Ref<HTMLSpanElement>;\n}\n\n/**\n * An intentionally absent value: secondary colour, regular weight. Every value\n * primitive renders its missing state with this treatment.\n */\nexport function EmptyValue({ children = EMPTY, ...props }: EmptyValueProps) {\n\treturn <ValueText {...props} valueRole={SECONDARY_ROLE} emptyLabel={EMPTY} hookClassName=\"empty-value--component inline min-w-0\">{children}</ValueText>;\n}\n","import { type ReactNode } from 'react';\n\nimport { cn } from '../../lib/utils';\n\nimport { Value, type ValueProps } from './value';\n\nconst WORD_SEPARATOR = /(\\s+)/u;\nconst NAME_CONNECTOR = /([-'])/u;\nconst LETTER_MATCHER = /\\p{L}/u;\nconst LETTERS_MATCHER = /\\p{L}/gu;\n\nexport interface NameFormatOptions {\n\t/** Force title-casing even when the name already looks intentionally cased. */\n\tforce?: boolean;\n}\n\nexport interface NameProps extends Omit<ValueProps, 'children'> {\n\t/** Raw name value to normalize for display. */\n\tvalue?: string | null;\n\t/** String children are normalized when value is not provided. */\n\tchildren?: ReactNode;\n\t/** Force title-casing even when the name already looks intentionally cased. */\n\tforce?: boolean;\n}\n\nfunction normalizeNameWhitespace(value: string) {\n\treturn value.trim().replace(/\\s+/g, ' ');\n}\n\nfunction getLetters(value: string) {\n\treturn value.match(LETTERS_MATCHER)?.join('') ?? '';\n}\n\nfunction getFirstLetter(value: string) {\n\tconst match = LETTER_MATCHER.exec(value);\n\tif (!match) return null;\n\treturn {\n\t\tindex: match.index,\n\t\tvalue: match[0],\n\t};\n}\n\nfunction isFormattedSegment(segment: string) {\n\tconst first = getFirstLetter(segment);\n\tif (!first) return true;\n\n\tconst letters = getLetters(segment);\n\tif (letters.length <= 1) return first.value === first.value.toLocaleUpperCase();\n\n\tconst isAllUpper = letters === letters.toLocaleUpperCase();\n\tconst isAllLower = letters === letters.toLocaleLowerCase();\n\n\treturn first.value === first.value.toLocaleUpperCase() && !isAllUpper && !isAllLower;\n}\n\nfunction isFormattedName(value: string) {\n\treturn normalizeNameWhitespace(value)\n\t\t.split(WORD_SEPARATOR)\n\t\t.filter((word) => word.trim() !== '')\n\t\t.every((word) =>\n\t\t\tword\n\t\t\t\t.split(NAME_CONNECTOR)\n\t\t\t\t.filter((segment) => segment !== '-' && segment !== \"'\")\n\t\t\t\t.every(isFormattedSegment),\n\t\t);\n}\n\nfunction formatNameSegment(segment: string) {\n\tconst first = getFirstLetter(segment);\n\tif (!first) return segment;\n\n\tconst before = segment.slice(0, first.index);\n\tconst after = segment.slice(first.index + first.value.length);\n\n\treturn `${before}${first.value.toLocaleUpperCase()}${after.toLocaleLowerCase()}`;\n}\n\nfunction formatNameWord(word: string) {\n\treturn word\n\t\t.split(NAME_CONNECTOR)\n\t\t.map((segment) => (segment === '-' || segment === \"'\" ? segment : formatNameSegment(segment)))\n\t\t.join('');\n}\n\nexport function formatName(value: string | null | undefined, options: NameFormatOptions = {}) {\n\tif (value === null || value === undefined) return '';\n\n\tconst normalized = normalizeNameWhitespace(value);\n\tif (!normalized) return '';\n\tif (!options.force && isFormattedName(normalized)) return normalized;\n\n\treturn normalized\n\t\t.split(WORD_SEPARATOR)\n\t\t.map((word) => (word.trim() === '' ? word : formatNameWord(word)))\n\t\t.join('');\n}\n\nexport function Name({\n\tvalue,\n\tchildren,\n\tforce,\n\tclassName,\n\tref,\n\t...props\n}: NameProps) {\n\tconst rawValue = value ?? (typeof children === 'string' ? children : undefined);\n\tconst content = rawValue === undefined ? children : formatName(rawValue, { force });\n\n\treturn (\n\t\t<Value ref={ref} className={cn('name--component', className)} {...props}>\n\t\t\t{content}\n\t\t</Value>\n\t);\n}\n","import { cn } from '../../lib/utils';\n\nimport { Value, type ValueProps } from './value';\nimport {\n\tformatInitials,\n\ttype InitialsMaxCharacters,\n\ttype InitialsStrategy,\n} from './initials-format';\n\nexport interface InitialsProps extends Omit<ValueProps, 'children'> {\n\t/** Person, organization, or resource name used to derive initials. */\n\tvalue?: string | null;\n\t/** First + last word by default; use first-words to preserve the first N words. */\n\tstrategy?: InitialsStrategy;\n\t/** Maximum visible characters. Defaults to 2. */\n\tmaxCharacters?: InitialsMaxCharacters;\n\t/** Optional BCP-47 locale used for locale-sensitive uppercasing. */\n\tlocale?: string;\n\t/** Returned when no usable letter or number exists. Defaults to an empty string. */\n\tfallback?: string;\n\t/** Defaults to `inherit`: the avatar or chip that hosts the initials owns their size. */\n\tsize?: ValueProps['size'];\n\t/** Defaults to `inherit`: the host owns the colour, such as an avatar fallback tone. */\n\ttype?: ValueProps['type'];\n\t/** Defaults to `inherit`: the host owns the weight. */\n\tweight?: ValueProps['weight'];\n}\n\n/**\n * Semantic displayed initials for identities and avatar fallbacks. They take the\n * size, colour and weight of the avatar or chip that hosts them.\n */\nexport function Initials({\n\tvalue,\n\tstrategy,\n\tmaxCharacters,\n\tlocale,\n\tfallback,\n\tsize = 'inherit',\n\ttype = 'inherit',\n\tweight = 'inherit',\n\tclassName,\n\tref,\n\t...props\n}: InitialsProps) {\n\treturn (\n\t\t<Value\n\t\t\tref={ref}\n\t\t\t{...props}\n\t\t\tsize={size}\n\t\t\ttype={type}\n\t\t\tweight={weight}\n\t\t\tclassName={cn('initials--component', className)}\n\t\t>\n\t\t\t{formatInitials(value, {\n\t\t\t\tstrategy,\n\t\t\t\tmaxCharacters,\n\t\t\t\tlocale,\n\t\t\t\tfallback,\n\t\t\t})}\n\t\t</Value>\n\t);\n}\n","import { type AnchorHTMLAttributes, type ReactNode, type Ref } from 'react';\n\nimport { useTypographyConfig } from '../../lib/ui-provider';\nimport { EMPTY } from '../../lib/format';\nimport { cn } from '../../lib/utils';\nimport { RunningTextContext, useInRunningText } from '../typography/running-text';\nimport { inlineLinkClassName, linkUnderlineClassName } from '../typography/text-link';\nimport { resolveTextClassNames } from '../typography/text.styles';\n\nimport { EmptyValue } from './value';\n\nexport interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n\tchildren?: ReactNode;\n\t/** Rendered instead of a dead link when there is nothing to show. Defaults to an em dash. */\n\temptyLabel?: ReactNode;\n\tref?: Ref<HTMLAnchorElement>;\n}\n\n/**\n * Link-coloured inline value. Standalone it uses the provider text size with an\n * underline on hover. Inside running text it takes the sentence's size, weight\n * and leading and stays underlined, because colour alone does not set a link\n * apart from the words around it.\n */\nexport function Link({\n\tchildren,\n\temptyLabel = EMPTY,\n\tclassName,\n\tref,\n\t...props\n}: LinkProps) {\n\tconst inText = useInRunningText();\n\tconst { defaultTextSize } = useTypographyConfig();\n\tconst content =\n\t\tchildren === null || children === undefined || children === '' ? emptyLabel : children;\n\n\treturn (\n\t\t<a\n\t\t\tref={ref}\n\t\t\tdata-typography=\"link\"\n\t\t\tclassName={cn(\n\t\t\t\tresolveTextClassNames({\n\t\t\t\t\ttype: null,\n\t\t\t\t\tsize: inText ? 'inherit' : defaultTextSize,\n\t\t\t\t\tweight: null,\n\t\t\t\t\talign: null,\n\t\t\t\t\tlineHeight: inText ? null : 'normal',\n\t\t\t\t}),\n\t\t\t\t'link--component text-link-color wrap-anywhere',\n\t\t\t\tinlineLinkClassName,\n\t\t\t\tinText ? `${linkUnderlineClassName} hover:decoration-transparent` : 'no-underline underline-offset-[0.2em] hover:underline',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<RunningTextContext.Provider value>{content}</RunningTextContext.Provider>\n\t\t</a>\n\t);\n}\n\ntype ContactSpanProps = Omit<LinkProps, 'children' | 'emptyLabel' | 'ref' | 'href' | 'target' | 'rel' | 'download' | 'hrefLang' | 'ping' | 'referrerPolicy' | 'media' | 'type'>;\n\n/**\n * The missing contact value: the shared empty treatment, never a dead link.\n * Global attributes (ARIA, data, id, title) still reach the rendered span.\n */\nfunction EmptyContact({ className, emptyLabel, ref, contactProps }: { className: string; emptyLabel: ReactNode; ref?: Ref<HTMLElement>; contactProps: LinkProps }) {\n\tconst { href: _href, target: _target, rel: _rel, download: _download, hrefLang: _hrefLang, ping: _ping, referrerPolicy: _referrerPolicy, media: _media, type: _type, ...spanProps } = contactProps;\n\treturn <EmptyValue {...(spanProps as ContactSpanProps)} ref={ref as Ref<HTMLSpanElement>} className={className}>{emptyLabel}</EmptyValue>;\n}\n\nexport interface EmailProps extends Omit<LinkProps, 'href' | 'children' | 'ref'> {\n\tvalue?: string | null;\n\tdisplay?: ReactNode;\n\tsubject?: string;\n\tbody?: string;\n\tref?: Ref<HTMLElement>;\n}\n\nexport function Email({\n\tvalue,\n\tdisplay,\n\tsubject,\n\tbody,\n\tclassName,\n\temptyLabel = EMPTY,\n\tref,\n\t...props\n}: EmailProps) {\n\tif (!value) return <EmptyContact ref={ref} className={cn('email--component', className)} emptyLabel={emptyLabel} contactProps={props} />;\n\n\tconst query = new URLSearchParams();\n\tif (subject) query.set('subject', subject);\n\tif (body) query.set('body', body);\n\tconst href = `mailto:${value}${query.size ? `?${query.toString()}` : ''}`;\n\n\treturn (\n\t\t<Link ref={ref as Ref<HTMLAnchorElement>} className={cn('email--component', className)} href={href} emptyLabel={emptyLabel} {...props}>\n\t\t\t{display ?? value}\n\t\t</Link>\n\t);\n}\n\nexport interface PhoneProps extends Omit<LinkProps, 'href' | 'children' | 'ref'> {\n\tvalue?: string | null;\n\tdisplay?: ReactNode;\n\tref?: Ref<HTMLElement>;\n}\n\nfunction normalizeTel(value: string) {\n\treturn value.replace(/[^\\d+*#;,.]/g, '');\n}\n\nexport function Phone({\n\tvalue,\n\tdisplay,\n\tclassName,\n\temptyLabel = EMPTY,\n\tref,\n\t...props\n}: PhoneProps) {\n\tif (!value) return <EmptyContact ref={ref} className={cn('phone--component', className)} emptyLabel={emptyLabel} contactProps={props} />;\n\n\treturn (\n\t\t<Link ref={ref as Ref<HTMLAnchorElement>} className={cn('phone--component', className)} href={`tel:${normalizeTel(value)}`} emptyLabel={emptyLabel} {...props}>\n\t\t\t{display ?? value}\n\t\t</Link>\n\t);\n}\n\nexport interface UrlProps extends Omit<LinkProps, 'href' | 'children' | 'ref'> {\n\tvalue?: string | null;\n\tdisplay?: ReactNode;\n\texternal?: boolean;\n\tref?: Ref<HTMLElement>;\n}\n\nfunction normalizeUrl(value: string) {\n\tif (/^[a-z][a-z\\d+\\-.]*:/i.test(value) || value.startsWith('/') || value.startsWith('#')) return value;\n\treturn `https://${value}`;\n}\n\nexport function Url({\n\tvalue,\n\tdisplay,\n\texternal,\n\ttarget,\n\trel,\n\tclassName,\n\temptyLabel = EMPTY,\n\tref,\n\t...props\n}: UrlProps) {\n\tif (!value) return <EmptyContact ref={ref} className={cn('url--component', className)} emptyLabel={emptyLabel} contactProps={{ ...props, target, rel }} />;\n\n\tconst href = normalizeUrl(value);\n\tconst isExternal = external ?? /^https?:\\/\\//i.test(href);\n\tconst resolvedTarget = target ?? (isExternal ? '_blank' : undefined);\n\tconst resolvedRel = rel ?? (isExternal ? 'noreferrer' : undefined);\n\n\treturn (\n\t\t<Link\n\t\t\tref={ref as Ref<HTMLAnchorElement>}\n\t\t\tclassName={cn('url--component', className)}\n\t\t\thref={href}\n\t\t\ttarget={resolvedTarget}\n\t\t\trel={resolvedRel}\n\t\t\temptyLabel={emptyLabel}\n\t\t\t{...props}\n\t\t>\n\t\t\t{display ?? value}\n\t\t</Link>\n\t);\n}\n","import { type ComponentPropsWithoutRef, type ReactNode, type Ref } from 'react';\n\nimport { Text, type TextProps } from '../typography';\nimport type { TextSize } from '../../lib/ui-provider';\nimport { EMPTY } from '../../lib/format';\nimport { useFormattingConfig } from '../../lib/ui-provider';\nimport { cn } from '../../lib/utils';\n\nimport { emptyValueTypography, useValueTypography, type ValueTypographyRole } from './value-typography';\n\ntype SpanProps = Omit<ComponentPropsWithoutRef<'span'>, 'children' | 'color'>;\n\nexport type FileSizeUnit = 'bytes' | 'kb' | 'mb' | 'gb' | 'tb';\n\nexport interface FileSizeProps extends SpanProps {\n\tvalue?: number | null;\n\tfrom?: FileSizeUnit;\n\tlocale?: string;\n\t/** Rendered with the shared empty treatment when the value is absent or not positive. Defaults to an em dash. */\n\temptyLabel?: ReactNode;\n\t/** Text size. Defaults to the provider text size; inside running text, the surrounding size. */\n\tsize?: TextSize;\n\t/** Text alignment. Defaults to `right` so columns of sizes line up. */\n\talign?: TextProps['align'];\n\t/** Font weight. Defaults to `regular`; inside running text, the surrounding weight. */\n\tweight?: TextProps['weight'];\n\t/** Colour role. Defaults to `main`; inside running text, the surrounding colour. */\n\ttype?: TextProps['type'];\n\tref?: Ref<HTMLSpanElement>;\n}\n\nconst FILE_SIZE_ROLE: ValueTypographyRole = { type: 'main', weight: 'regular' };\n\nconst FILE_SIZE_UNITS = ['B', 'KB', 'MB', 'GB', 'TB'] as const;\nconst FILE_SIZE_UNIT_MULTIPLIER: Record<FileSizeUnit, number> = {\n\tbytes: 1,\n\tkb: 1024,\n\tmb: 1024 ** 2,\n\tgb: 1024 ** 3,\n\ttb: 1024 ** 4,\n};\n\nexport interface FileSizeFormatOptions {\n\tfrom?: FileSizeUnit;\n\tlocale?: string;\n}\n\nfunction normalizeFileSizeValue(value?: number | null, from: FileSizeUnit = 'bytes') {\n\tif (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) return null;\n\treturn value * FILE_SIZE_UNIT_MULTIPLIER[from];\n}\n\nexport function formatFileSize(\n\tvalue?: number | null,\n\toptions?: FileSizeFormatOptions | string,\n): string | null {\n\tconst locale = typeof options === 'string' ? options : options?.locale;\n\tconst from = typeof options === 'string' ? 'bytes' : options?.from ?? 'bytes';\n\tconst bytes = normalizeFileSizeValue(value, from);\n\tif (bytes === null) return null;\n\n\tlet displayValue = bytes;\n\tlet unitIndex = 0;\n\twhile (displayValue >= 1024 && unitIndex < FILE_SIZE_UNITS.length - 1) {\n\t\tdisplayValue /= 1024;\n\t\tunitIndex += 1;\n\t}\n\n\tconst formattedValue = new Intl.NumberFormat(locale, {\n\t\tmaximumFractionDigits: unitIndex === 0 ? 0 : 1,\n\t\tminimumFractionDigits: 0,\n\t}).format(displayValue);\n\n\treturn `${formattedValue} ${FILE_SIZE_UNITS[unitIndex]}`;\n}\n\n/** A byte count in the largest readable unit, sans UI font with tabular figures. */\nexport function FileSize({\n\tvalue,\n\tfrom = 'bytes',\n\tlocale,\n\temptyLabel = EMPTY,\n\tsize,\n\talign = 'right',\n\tweight,\n\ttype,\n\tclassName,\n\tref,\n\t...props\n}: FileSizeProps) {\n\tconst formatting = useFormattingConfig();\n\tconst resolved = useValueTypography({ size, type, weight }, FILE_SIZE_ROLE);\n\tconst label = formatFileSize(value, { from, locale: locale ?? formatting.locale });\n\tconst typography = label === null ? emptyValueTypography(resolved, weight) : resolved;\n\n\treturn (\n\t\t<Text\n\t\t\tref={ref}\n\t\t\ttag=\"span\"\n\t\t\tsize={typography.size}\n\t\t\talign={align}\n\t\t\tweight={typography.weight}\n\t\t\ttype={typography.type}\n\t\t\tlineHeight={typography.lineHeight}\n\t\t\tclassName={cn('file-size--component inline tabular-nums', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{label ?? emptyLabel}\n\t\t</Text>\n\t);\n}\n","import { type ComponentPropsWithoutRef, type ReactNode, type Ref } from 'react';\n\nimport { Text, type TextProps } from '../typography';\nimport type { TextSize } from '../../lib/ui-provider';\nimport {\n\tEMPTY,\n\tformatDuration,\n\ttype DurationUnit,\n\ttype DurationUnitDisplay,\n} from '../../lib/format';\nimport { useFormattingConfig } from '../../lib/ui-provider';\nimport { cn } from '../../lib/utils';\n\nimport { emptyValueTypography, useValueTypography, type ValueTypographyRole } from './value-typography';\n\ntype SpanProps = Omit<ComponentPropsWithoutRef<'span'>, 'children' | 'color'>;\n\nexport interface DurationProps extends SpanProps {\n\tvalue?: number | null;\n\tfrom?: DurationUnit;\n\tlocale?: string;\n\tmaxParts?: number;\n\tunitDisplay?: DurationUnitDisplay;\n\tminimumFractionDigits?: number;\n\tmaximumFractionDigits?: number;\n\t/** Rendered with the shared empty treatment when the value is absent. Defaults to an em dash. */\n\temptyLabel?: ReactNode;\n\t/** Text size. Defaults to the provider text size; inside running text, the surrounding size. */\n\tsize?: TextSize;\n\t/** Text alignment. Defaults to `right` so columns of durations line up. */\n\talign?: TextProps['align'];\n\t/** Font weight. Defaults to `regular`; inside running text, the surrounding weight. */\n\tweight?: TextProps['weight'];\n\t/** Colour role. Defaults to `main`; inside running text, the surrounding colour. */\n\ttype?: TextProps['type'];\n\tref?: Ref<HTMLSpanElement>;\n}\n\nconst DURATION_ROLE: ValueTypographyRole = { type: 'main', weight: 'regular' };\n\n/** An elapsed span in localized units, sans UI font with tabular figures. */\nexport function Duration({\n\tvalue,\n\tfrom = 'seconds',\n\tlocale,\n\tmaxParts = 2,\n\tunitDisplay = 'narrow',\n\tminimumFractionDigits,\n\tmaximumFractionDigits,\n\temptyLabel = EMPTY,\n\tsize,\n\talign = 'right',\n\tweight,\n\ttype,\n\tclassName,\n\tref,\n\t...props\n}: DurationProps) {\n\tconst formatting = useFormattingConfig();\n\tconst resolved = useValueTypography({ size, type, weight }, DURATION_ROLE);\n\tconst label = value === null || value === undefined\n\t\t? null\n\t\t: formatDuration(value, {\n\t\t\t\tfrom,\n\t\t\t\tlocale: locale ?? formatting.locale,\n\t\t\t\tmaxParts,\n\t\t\t\tunitDisplay,\n\t\t\t\tminimumFractionDigits,\n\t\t\t\tmaximumFractionDigits: maximumFractionDigits ?? (\n\t\t\t\t\tfrom === 'milliseconds' ? 1 : undefined\n\t\t\t\t),\n\t\t\t});\n\n\tconst empty = label === null || label === EMPTY;\n\tconst typography = empty ? emptyValueTypography(resolved, weight) : resolved;\n\n\treturn (\n\t\t<Text\n\t\t\tref={ref}\n\t\t\ttag=\"span\"\n\t\t\tsize={typography.size}\n\t\t\talign={align}\n\t\t\tweight={typography.weight}\n\t\t\ttype={typography.type}\n\t\t\tlineHeight={typography.lineHeight}\n\t\t\tclassName={cn('duration--component inline tabular-nums', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{empty ? emptyLabel : label}\n\t\t</Text>\n\t);\n}\n\nexport { formatDuration } from '../../lib/format';\nexport type { DurationUnit, DurationUnitDisplay, FormatDurationOptions } from '../../lib/format';\n","import { type ComponentPropsWithoutRef, type ReactNode, type Ref } from 'react';\n\nimport { Text, type TextProps } from '../typography';\nimport type { TextSize } from '../../lib/ui-provider';\nimport { EMPTY, formatWithMinusSign } from '../../lib/format';\nimport { useFormattingConfig } from '../../lib/ui-provider';\nimport { cn } from '../../lib/utils';\n\nimport { emptyValueTypography, useValueTypography, type ValueTypographyRole } from './value-typography';\n\ntype SpanProps = Omit<ComponentPropsWithoutRef<'span'>, 'children' | 'color'>;\ntype DimensionPart = number | string | null | undefined;\n\nexport interface FormatDimensionsOptions {\n\tdepth?: DimensionPart;\n\tunit?: string;\n\tseparator?: string;\n\tlocale?: string;\n\toptions?: Intl.NumberFormatOptions;\n}\n\nexport interface DimensionsProps extends SpanProps {\n\twidth?: DimensionPart;\n\theight?: DimensionPart;\n\tdepth?: DimensionPart;\n\tunit?: ReactNode;\n\tseparator?: ReactNode;\n\tlocale?: string;\n\toptions?: Intl.NumberFormatOptions;\n\t/** Rendered with the shared empty treatment when width or height is missing. Defaults to an em dash. */\n\temptyLabel?: ReactNode;\n\t/** Text size. Defaults to the provider text size; inside running text, the surrounding size. */\n\tsize?: TextSize;\n\t/** Text alignment. Defaults to `right` so columns of readings line up. */\n\talign?: TextProps['align'];\n\t/** Font weight. Defaults to `regular`; inside running text, the surrounding weight. */\n\tweight?: TextProps['weight'];\n\t/** Colour role. Defaults to `main`; inside running text, the surrounding colour. */\n\ttype?: TextProps['type'];\n\tref?: Ref<HTMLSpanElement>;\n}\n\nconst DIMENSIONS_ROLE: ValueTypographyRole = { type: 'main', weight: 'regular' };\n\nfunction parseDimensionPart(value: DimensionPart): number | null {\n\tif (value === null || value === undefined || value === '') return null;\n\tif (typeof value === 'number') return Number.isFinite(value) ? value : null;\n\tconst normalized = value.trim().replace(',', '.');\n\tif (!normalized) return null;\n\tconst parsed = Number(normalized);\n\treturn Number.isFinite(parsed) ? parsed : null;\n}\n\nexport function formatDimensions(\n\twidth: DimensionPart,\n\theight: DimensionPart,\n\t{\n\t\tdepth,\n\t\tunit,\n\t\tseparator = ' × ',\n\t\tlocale,\n\t\toptions,\n\t}: FormatDimensionsOptions = {},\n): string | null {\n\tconst parsedWidth = parseDimensionPart(width);\n\tconst parsedHeight = parseDimensionPart(height);\n\tconst parsedDepth = parseDimensionPart(depth);\n\tif (parsedWidth === null || parsedHeight === null) return null;\n\tif (depth !== null && depth !== undefined && depth !== '' && parsedDepth === null) return null;\n\n\tconst formatter = new Intl.NumberFormat(locale, options);\n\tconst values = [parsedWidth, parsedHeight];\n\tif (parsedDepth !== null) values.push(parsedDepth);\n\tconst label = values.map((value) => formatWithMinusSign(formatter, value)).join(separator);\n\treturn unit ? `${label} ${unit}` : label;\n}\n\n/** A width × height (× depth) reading with localized numbers, sans UI font with tabular figures. */\nexport function Dimensions({\n\twidth,\n\theight,\n\tdepth,\n\tunit,\n\tseparator = ' × ',\n\tlocale,\n\toptions,\n\temptyLabel = EMPTY,\n\tsize,\n\talign = 'right',\n\tweight,\n\ttype,\n\tclassName,\n\tref,\n\t...props\n}: DimensionsProps) {\n\tconst formatting = useFormattingConfig();\n\tconst resolved = useValueTypography({ size, type, weight }, DIMENSIONS_ROLE);\n\tconst label = formatDimensions(width, height, {\n\t\tdepth,\n\t\tseparator: typeof separator === 'string' ? separator : ' × ',\n\t\tlocale: locale ?? formatting.locale,\n\t\toptions,\n\t});\n\n\tconst typography = label === null ? emptyValueTypography(resolved, weight) : resolved;\n\n\treturn (\n\t\t<Text\n\t\t\tref={ref}\n\t\t\ttag=\"span\"\n\t\t\tsize={typography.size}\n\t\t\talign={align}\n\t\t\tweight={typography.weight}\n\t\t\ttype={typography.type}\n\t\t\tlineHeight={typography.lineHeight}\n\t\t\tclassName={cn('dimensions--component inline tabular-nums', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{label === null ? emptyLabel : (\n\t\t\t\t<>\n\t\t\t\t\t{typeof separator === 'string' ? label : label.split(' × ').map((part, index) => (\n\t\t\t\t\t\t<span key={`${part}-${index}`}>\n\t\t\t\t\t\t\t{index > 0 && separator}\n\t\t\t\t\t\t\t{part}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t))}\n\t\t\t\t\t{!!unit && <> {unit}</>}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</Text>\n\t);\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
- import { r as e } from "./value-typography-b8wpz1eX.js";
3
- import { _ as t, a as n, c as r, d as i, f as a, g as o, h as s, i as c, l, m as u, n as d, o as f, p, r as m, s as h, t as g, u as _ } from "./primitives-B-CkiEMU.js";
2
+ import { r as e } from "./value-typography-BP8OG6h5.js";
3
+ import { _ as t, a as n, c as r, d as i, f as a, g as o, h as s, i as c, l, m as u, n as d, o as f, p, r as m, s as h, t as g, u as _ } from "./primitives-BFK08r9M.js";
4
4
  import { t as v } from "./initials-format-CDoQEOd_.js";
5
- import { i as y, n as b, r as x, t as S } from "./number-DMhe-Vsk.js";
6
- import { a as C, i as w, n as T, o as E, r as D, s as O, t as k } from "./date-BgK3bTdo.js";
5
+ import { i as y, n as b, r as x, t as S } from "./number-DbV1Dija.js";
6
+ import { a as C, i as w, n as T, o as E, r as D, s as O, t as k } from "./date-DCrsDTZc.js";
7
7
  export { k as Date, T as DateRange, D as DateTime, g as Dimensions, m as Duration, f as Email, p as EmptyValue, c as FileSize, _ as Initials, h as Link, x as Money, u as MonoValue, s as MutedValue, i as Name, S as Number, b as Percent, r as Phone, w as RelativeTime, o as SecondaryValue, C as Time, l as Url, t as Value, E as formatDateRange, d as formatDimensions, e as formatDuration, n as formatFileSize, v as formatInitials, a as formatName, O as parseDateInput, y as useMoneyFormatter };
@@ -1,9 +1,9 @@
1
1
  "use client";
2
- import { c as e, s as t, v as n } from "./ui-provider-1D_NSYzO.js";
2
+ import { c as e, s as t, v as n } from "./ui-provider-C_U0Xma4.js";
3
3
  import { useStrings as r } from "./lib/strings.js";
4
- import { t as i } from "./utils-l5LpDw2z.js";
5
- import { s as a } from "./typography-DTRkE9zL.js";
6
- import { t as o } from "./structure-DC2dygdA.js";
4
+ import { t as i } from "./utils-BRhFDwuU.js";
5
+ import { c as a } from "./typography-UTnveOEy.js";
6
+ import { t as o } from "./structure-BmisBK-3.js";
7
7
  import { n as s } from "./track-recipes-CDcKmndW.js";
8
8
  import { createContext as c, forwardRef as l, useContext as u, useId as d, useMemo as f } from "react";
9
9
  import { Fragment as ee, jsx as p, jsxs as m } from "react/jsx-runtime";
@@ -166,4 +166,4 @@ D.displayName = "ProgressValue";
166
166
  //#endregion
167
167
  export { D as a, w as i, T as n, g as o, E as r, C as t };
168
168
 
169
- //# sourceMappingURL=progress-rnS8-uAW.js.map
169
+ //# sourceMappingURL=progress-B1VnCT0K.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"progress-rnS8-uAW.js","names":["Progress","_Fragment","ProgressPrimitive","useFormattingConfig","useDensityConfig","resolveComponentScale","cn","Text","Stack","trackHeightClasses","Fragment$1","defaultProgressStrings","ProgressContext","createContext","isSimpleText","value","INDICATOR_TONE_CLASSNAMES","mergeStateClassName","className","baseClassName","state","normalizeRange","min","minProp","maxCandidate","maxProp","normalizeValue","max","formatProgressValue","format","locale","normalized","Progress$1","forwardRef","valueProp","showValueProp","sizeProp","stringsProp","ariaDescribedBy","props","strings","useStrings","formatting","size","defaultScale","resolvedLocale","descriptionId","useId","formattedValue","usesGeneratedHeader","headerSlot","children","showValue","label","hasSummary","description","metadata","valueSlot","descriptionIds","resolvedGetAriaValueText","normalizedFormattedValue","currentValue","getAriaValueText","contextValue","useMemo","resolvedHeader","ProgressLabel","ProgressValue","resolvedTrack","trackSlot","ProgressTrack","trackProps","ProgressIndicator","indicatorProps","tone","Progress","context","useContext","primitiveValue","_primitiveFormattedValue","content"],"sources":["../src/components/base/feedback/progress.strings.ts","../src/components/base/feedback/progress.tsx"],"sourcesContent":["export interface ProgressStrings {\n\t/** Screen-reader value announced while progress is indeterminate. */\n\tindeterminateValue: string;\n}\n\nexport const defaultProgressStrings: ProgressStrings = {\n\tindeterminateValue: 'In progress',\n};\n","import { trackHeightClasses } from '../../../lib/track-recipes';\n/**\n * Progress — token-driven Base UI progress wrapper for completion, quota,\n * and long-running task states.\n *\n * The root keeps the Base UI accessibility contract while adding a concise\n * admin summary API (`label`, `description`, `metadata`, `showValue`),\n * semantic tones, structural sizes, stable DOM hooks, and composition slots.\n * Consumers can still assemble `ProgressLabel`, `ProgressValue`,\n * `ProgressTrack`, and `ProgressIndicator` directly.\n */\nimport { Progress as ProgressPrimitive } from '@base-ui/react/progress';\nimport { createContext, forwardRef, useContext, useId, useMemo, type ReactNode } from 'react';\n\nimport { Text } from '../../typography';\nimport { Stack } from '../structure';\nimport { useDensityConfig, useFormattingConfig, type ComponentScale } from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\nimport type { SemanticTone } from '../../../lib/component-vocabulary';\n\nimport { defaultProgressStrings, type ProgressStrings } from './progress.strings';\n\nexport type ProgressSize = ComponentScale;\nexport type ProgressTone = SemanticTone;\n\ntype ProgressRootState = ProgressPrimitive.Root.State;\ntype ProgressTrackState = ProgressPrimitive.Track.State;\ntype ProgressIndicatorState = ProgressPrimitive.Indicator.State;\ntype ProgressLabelState = ProgressPrimitive.Label.State;\ntype ProgressValueState = ProgressPrimitive.Value.State;\n\ntype StatefulClassName<TState> = string | ((state: TState) => string | undefined) | undefined;\n\nexport interface ProgressProps extends Omit<\n\tProgressPrimitive.Root.Props,\n\t'children' | 'format' | 'getAriaValueText' | 'locale' | 'max' | 'min' | 'value'\n> {\n\t/** Current value. `null` renders an indeterminate state. */\n\tvalue: number | null;\n\t/** Minimum value used to normalize the visual percentage. @default 0 */\n\tmin?: number;\n\t/** Maximum value used to normalize the visual percentage. @default 100 */\n\tmax?: number;\n\t/** Intl options for formatting the raw value instead of the default normalized percentage. */\n\tformat?: Intl.NumberFormatOptions;\n\t/** Locale forwarded to `Intl.NumberFormat`. */\n\tlocale?: Intl.LocalesArgument;\n\t/** Human-readable text for the current value. Receives the wrapper's normalized display value. */\n\tgetAriaValueText?: (formattedValue: string | null, value: number | null) => string;\n\t/** Low-level compound content. `headerSlot` takes precedence when both are supplied. */\n\tchildren?: ReactNode;\n\t/** Accessible visual label. Supplying it also enables `showValue` by default. */\n\tlabel?: ReactNode;\n\t/** Supporting text automatically connected with `aria-describedby`. */\n\tdescription?: ReactNode;\n\t/** Optional right-aligned task metadata, such as \"18,400 of 25,000 rows\". */\n\tmetadata?: ReactNode;\n\t/** Show the formatted value beside the label. Defaults to `true` when `label` is supplied. */\n\tshowValue?: boolean;\n\t/** Replaces the formatted value while retaining the default summary layout. */\n\tvalueSlot?: ReactNode;\n\t/** Replaces the entire content above the track. */\n\theaderSlot?: ReactNode;\n\t/** Replaces the default track and indicator composition. */\n\ttrackSlot?: ReactNode;\n\t/** Track thickness. @default \"default\" */\n\tsize?: ProgressSize;\n\t/** Semantic indicator color. @default \"primary\" */\n\ttone?: ProgressTone;\n\t/** Props forwarded to the default track. Ignored when `trackSlot` is supplied. */\n\ttrackProps?: ProgressTrackProps;\n\t/** Props forwarded to the default indicator. Ignored when `trackSlot` is supplied. */\n\tindicatorProps?: ProgressIndicatorProps;\n\t/** Override the indeterminate screen-reader copy. */\n\tstrings?: StringsProp<ProgressStrings>;\n}\n\nexport interface ProgressTrackProps extends ProgressPrimitive.Track.Props {\n\t/** Track thickness. @default \"default\" */\n\tsize?: ProgressSize;\n}\n\nexport interface ProgressIndicatorProps extends ProgressPrimitive.Indicator.Props {\n\t/** Semantic fill color. @default \"primary\" */\n\ttone?: ProgressTone;\n}\n\nexport interface ProgressLabelProps extends ProgressPrimitive.Label.Props {\n\t/** Accessible label content. */\n\tchildren?: ReactNode;\n}\n\nexport interface ProgressValueProps extends Omit<ProgressPrimitive.Value.Props, 'children'> {\n\t/** Customize the formatted display while preserving the value semantics. */\n\tchildren?: (formattedValue: string | null, value: number | null) => ReactNode;\n}\n\ninterface ProgressContextValue {\n\tformattedValue: string | null;\n\tvalue: number | null;\n}\n\nconst ProgressContext = createContext<ProgressContextValue | null>(null);\n\nfunction isSimpleText(value: ReactNode): value is string | number | bigint {\n\treturn typeof value === 'string' || typeof value === 'number' || typeof value === 'bigint';\n}\n\n\n\nconst INDICATOR_TONE_CLASSNAMES: Record<ProgressTone, string> = {\n\tneutral: 'bg-muted-foreground',\n\tprimary: 'bg-primary',\n\tsecondary: 'bg-secondary-foreground',\n\tsuccess: 'bg-success',\n\tinfo: 'bg-info',\n\twarning: 'bg-warning',\n\tdestructive: 'bg-destructive',\n};\n\nfunction mergeStateClassName<TState>(\n\tbaseClassName: string,\n\tclassName: StatefulClassName<TState>,\n): string | ((state: TState) => string) {\n\tif (typeof className === 'function') {\n\t\treturn (state) => cn(baseClassName, className(state));\n\t}\n\n\treturn cn(baseClassName, className);\n}\n\nfunction normalizeRange(minProp: number | undefined, maxProp: number | undefined) {\n\tconst min = Number.isFinite(minProp) ? (minProp as number) : 0;\n\tconst maxCandidate = Number.isFinite(maxProp) ? (maxProp as number) : 100;\n\tconst max = maxCandidate > min ? maxCandidate : min + 100;\n\n\treturn { min, max };\n}\n\nfunction normalizeValue(value: number | null, min: number, max: number): number | null {\n\tif (value === null || !Number.isFinite(value)) return null;\n\treturn Math.min(max, Math.max(min, value));\n}\n\nfunction formatProgressValue(\n\tvalue: number | null,\n\tmin: number,\n\tmax: number,\n\tlocale: Intl.LocalesArgument | undefined,\n\tformat: Intl.NumberFormatOptions | undefined,\n): string | null {\n\tif (value === null) return null;\n\n\tif (format) {\n\t\treturn new Intl.NumberFormat(locale, format).format(value);\n\t}\n\n\tconst normalized = max === min ? 0 : (value - min) / (max - min);\n\treturn new Intl.NumberFormat(locale, {\n\t\tstyle: 'percent',\n\t\tmaximumFractionDigits: 0,\n\t}).format(normalized);\n}\n\nconst Progress = forwardRef<HTMLDivElement, ProgressProps>(function Progress(\n\t{\n\t\tvalue: valueProp,\n\t\tmin: minProp,\n\t\tmax: maxProp,\n\t\tformat,\n\t\tlocale,\n\t\tgetAriaValueText,\n\t\tchildren,\n\t\tlabel,\n\t\tdescription,\n\t\tmetadata,\n\t\tshowValue: showValueProp,\n\t\tvalueSlot,\n\t\theaderSlot,\n\t\ttrackSlot,\n\t\tsize: sizeProp,\n\t\ttone = 'primary',\n\t\ttrackProps,\n\t\tindicatorProps,\n\t\tstrings: stringsProp,\n\t\tclassName,\n\t\t'aria-describedby': ariaDescribedBy,\n\t\t...props\n\t},\n\tref,\n) {\n\tconst strings = useStrings(defaultProgressStrings, stringsProp);\n\tconst formatting = useFormattingConfig();\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveComponentScale(sizeProp, defaultScale);\n\tconst resolvedLocale = locale ?? formatting.locale;\n\tconst descriptionId = useId();\n\tconst { min, max } = normalizeRange(minProp, maxProp);\n\tconst value = normalizeValue(valueProp, min, max);\n\tconst formattedValue = formatProgressValue(value, min, max, resolvedLocale, format);\n\tconst usesGeneratedHeader = headerSlot === undefined && children === undefined;\n\tconst showValue = showValueProp ?? label !== undefined;\n\tconst hasSummary =\n\t\tlabel !== undefined || description !== undefined || metadata !== undefined || valueSlot !== undefined || showValue;\n\tconst descriptionIds =\n\t\t[ariaDescribedBy, usesGeneratedHeader && description !== undefined ? descriptionId : undefined]\n\t\t\t.filter(Boolean)\n\t\t\t.join(' ') || undefined;\n\tconst resolvedGetAriaValueText = (_formattedValue: string | null, currentValue: number | null) => {\n\t\tconst normalizedFormattedValue = formatProgressValue(currentValue, min, max, resolvedLocale, format);\n\t\tif (getAriaValueText) {\n\t\t\treturn getAriaValueText(normalizedFormattedValue, currentValue);\n\t\t}\n\t\treturn normalizedFormattedValue ?? strings.indeterminateValue;\n\t};\n\tconst contextValue = useMemo(() => ({ formattedValue, value }), [formattedValue, value]);\n\tconst resolvedHeader =\n\t\theaderSlot ??\n\t\tchildren ??\n\t\t(hasSummary ? (\n\t\t\t<>\n\t\t\t\t<Stack gap=\"dense\" className=\"progress--summary min-w-0\">\n\t\t\t\t\t{label !== undefined && <ProgressLabel>{label}</ProgressLabel>}\n\t\t\t\t\t{description !== undefined &&\n\t\t\t\t\t\t(isSimpleText(description) ? (\n\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\tid={descriptionId}\n\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\tclassName=\"progress--description block\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div id={descriptionId} className=\"progress--description\">\n\t\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t</Stack>\n\t\t\t\t{(showValue || valueSlot !== undefined || metadata !== undefined) && (\n\t\t\t\t\t<Stack gap=\"dense\" align=\"end\" className=\"progress--details text-end\">\n\t\t\t\t\t\t{valueSlot ?? (showValue ? <ProgressValue /> : null)}\n\t\t\t\t\t\t{metadata !== undefined &&\n\t\t\t\t\t\t\t(isSimpleText(metadata) ? (\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"progress--metadata tabular-nums\">\n\t\t\t\t\t\t\t\t\t{metadata}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\tmetadata\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\t\t\t</>\n\t\t) : null);\n\tconst resolvedTrack = trackSlot ?? (\n\t\t<ProgressTrack {...trackProps} size={trackProps?.size ?? size}>\n\t\t\t{trackProps?.children ?? <ProgressIndicator {...indicatorProps} tone={indicatorProps?.tone ?? tone} />}\n\t\t</ProgressTrack>\n\t);\n\n\treturn (\n\t\t<ProgressContext.Provider value={contextValue}>\n\t\t\t<ProgressPrimitive.Root\n\t\t\t\tref={ref}\n\t\t\t\tvalue={value}\n\t\t\t\tmin={min}\n\t\t\t\tmax={max}\n\t\t\t\tformat={format}\n\t\t\t\tlocale={resolvedLocale}\n\t\t\t\tgetAriaValueText={resolvedGetAriaValueText}\n\t\t\t\taria-describedby={descriptionIds}\n\t\t\t\tdata-slot=\"progress\"\n\t\t\t\tdata-size={size}\n\t\t\t\tdata-tone={tone}\n\t\t\t\tclassName={mergeStateClassName<ProgressRootState>(\n\t\t\t\t\t'progress--component grid min-w-0 w-full grid-cols-[minmax(0,1fr)_auto] items-start gap-x-space-lg gap-y-space-sm',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{resolvedHeader}\n\t\t\t\t{resolvedTrack}\n\t\t\t</ProgressPrimitive.Root>\n\t\t</ProgressContext.Provider>\n\t);\n});\nProgress.displayName = 'Progress';\n\nconst ProgressTrack = forwardRef<HTMLDivElement, ProgressTrackProps>(function ProgressTrack(\n\t{ className, size: sizeProp, ...props },\n\tref,\n) {\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveComponentScale(sizeProp, defaultScale);\n\treturn (\n\t\t<ProgressPrimitive.Track\n\t\t\tref={ref}\n\t\t\tdata-slot=\"progress-track\"\n\t\t\tdata-size={size}\n\t\t\tclassName={mergeStateClassName<ProgressTrackState>(\n\t\t\t\tcn(\n\t\t\t\t\t'progress-track--component progress--track relative col-span-full flex w-full items-center overflow-hidden rounded-full bg-muted',\n\t\t\t\t\ttrackHeightClasses[size],\n\t\t\t\t),\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nProgressTrack.displayName = 'ProgressTrack';\n\nconst ProgressIndicator = forwardRef<HTMLDivElement, ProgressIndicatorProps>(function ProgressIndicator(\n\t{ className, tone = 'primary', ...props },\n\tref,\n) {\n\treturn (\n\t\t<ProgressPrimitive.Indicator\n\t\t\tref={ref}\n\t\t\tdata-slot=\"progress-indicator\"\n\t\t\tdata-tone={tone}\n\t\t\tclassName={mergeStateClassName<ProgressIndicatorState>(\n\t\t\t\tcn(\n\t\t\t\t\t'progress-indicator--component progress--indicator h-full rounded-full transition-[width] duration-300 ease-out motion-reduce:transition-none',\n\t\t\t\t\t'data-[indeterminate]:w-full motion-safe:data-[indeterminate]:animate-pulse',\n\t\t\t\t\tINDICATOR_TONE_CLASSNAMES[tone],\n\t\t\t\t),\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nProgressIndicator.displayName = 'ProgressIndicator';\n\nconst ProgressLabel = forwardRef<HTMLSpanElement, ProgressLabelProps>(function ProgressLabel(\n\t{ className, children, ...props },\n\tref,\n) {\n\treturn (\n\t\t<ProgressPrimitive.Label\n\t\t\tref={ref}\n\t\t\tdata-slot=\"progress-label\"\n\t\t\tclassName={mergeStateClassName<ProgressLabelState>(\n\t\t\t\t'progress-label--component progress--label min-w-0',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{isSimpleText(children) ? (\n\t\t\t\t<Text tag=\"span\" weight=\"medium\" lineHeight=\"tight\" className=\"block\">\n\t\t\t\t\t{children}\n\t\t\t\t</Text>\n\t\t\t) : (\n\t\t\t\tchildren\n\t\t\t)}\n\t\t</ProgressPrimitive.Label>\n\t);\n});\nProgressLabel.displayName = 'ProgressLabel';\n\nconst ProgressValue = forwardRef<HTMLSpanElement, ProgressValueProps>(function ProgressValue(\n\t{ className, children, ...props },\n\tref,\n) {\n\tconst context = useContext(ProgressContext);\n\n\treturn (\n\t\t<ProgressPrimitive.Value\n\t\t\tref={ref}\n\t\t\tdata-slot=\"progress-value\"\n\t\t\tclassName={mergeStateClassName<ProgressValueState>(\n\t\t\t\t'progress-value--component progress--value whitespace-nowrap',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{(_primitiveFormattedValue, primitiveValue) => {\n\t\t\t\tconst value = context?.value ?? primitiveValue;\n\t\t\t\tconst formattedValue = context?.formattedValue ?? _primitiveFormattedValue;\n\t\t\t\tconst content = children ? children(formattedValue, value) : formattedValue;\n\n\t\t\t\tif (content === null || content === undefined) return null;\n\t\t\t\treturn isSimpleText(content) ? (\n\t\t\t\t\t// The percentage is the bar's primary value, so it mirrors\n\t\t\t\t\t// ProgressLabel: provider-default size and medium weight. Pinning\n\t\t\t\t\t// it to `xs`/secondary demoted the headline number below its own\n\t\t\t\t\t// caption and left the two off a shared baseline.\n\t\t\t\t\t<Text tag=\"span\" weight=\"medium\" lineHeight=\"tight\" className=\"block tabular-nums\">\n\t\t\t\t\t\t{content}\n\t\t\t\t\t</Text>\n\t\t\t\t) : (\n\t\t\t\t\tcontent\n\t\t\t\t);\n\t\t\t}}\n\t\t</ProgressPrimitive.Value>\n\t);\n});\nProgressValue.displayName = 'ProgressValue';\n\nexport { Progress, ProgressTrack, ProgressIndicator, ProgressLabel, ProgressValue, defaultProgressStrings };\nexport type { ProgressStrings };\n"],"mappings":"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"}
1
+ {"version":3,"file":"progress-B1VnCT0K.js","names":["Progress","_Fragment","ProgressPrimitive","useFormattingConfig","useDensityConfig","resolveComponentScale","cn","Text","Stack","trackHeightClasses","Fragment$1","defaultProgressStrings","ProgressContext","createContext","isSimpleText","value","INDICATOR_TONE_CLASSNAMES","mergeStateClassName","className","baseClassName","state","normalizeRange","min","minProp","maxCandidate","maxProp","normalizeValue","max","formatProgressValue","format","locale","normalized","Progress$1","forwardRef","valueProp","showValueProp","sizeProp","stringsProp","ariaDescribedBy","props","strings","useStrings","formatting","size","defaultScale","resolvedLocale","descriptionId","useId","formattedValue","usesGeneratedHeader","headerSlot","children","showValue","label","hasSummary","description","metadata","valueSlot","descriptionIds","resolvedGetAriaValueText","normalizedFormattedValue","currentValue","getAriaValueText","contextValue","useMemo","resolvedHeader","ProgressLabel","ProgressValue","resolvedTrack","trackSlot","ProgressTrack","trackProps","ProgressIndicator","indicatorProps","tone","Progress","context","useContext","primitiveValue","_primitiveFormattedValue","content"],"sources":["../src/components/base/feedback/progress.strings.ts","../src/components/base/feedback/progress.tsx"],"sourcesContent":["export interface ProgressStrings {\n\t/** Screen-reader value announced while progress is indeterminate. */\n\tindeterminateValue: string;\n}\n\nexport const defaultProgressStrings: ProgressStrings = {\n\tindeterminateValue: 'In progress',\n};\n","import { trackHeightClasses } from '../../../lib/track-recipes';\n/**\n * Progress — token-driven Base UI progress wrapper for completion, quota,\n * and long-running task states.\n *\n * The root keeps the Base UI accessibility contract while adding a concise\n * admin summary API (`label`, `description`, `metadata`, `showValue`),\n * semantic tones, structural sizes, stable DOM hooks, and composition slots.\n * Consumers can still assemble `ProgressLabel`, `ProgressValue`,\n * `ProgressTrack`, and `ProgressIndicator` directly.\n */\nimport { Progress as ProgressPrimitive } from '@base-ui/react/progress';\nimport { createContext, forwardRef, useContext, useId, useMemo, type ReactNode } from 'react';\n\nimport { Text } from '../../typography';\nimport { Stack } from '../structure';\nimport { useDensityConfig, useFormattingConfig, type ComponentScale } from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\nimport type { SemanticTone } from '../../../lib/component-vocabulary';\n\nimport { defaultProgressStrings, type ProgressStrings } from './progress.strings';\n\nexport type ProgressSize = ComponentScale;\nexport type ProgressTone = SemanticTone;\n\ntype ProgressRootState = ProgressPrimitive.Root.State;\ntype ProgressTrackState = ProgressPrimitive.Track.State;\ntype ProgressIndicatorState = ProgressPrimitive.Indicator.State;\ntype ProgressLabelState = ProgressPrimitive.Label.State;\ntype ProgressValueState = ProgressPrimitive.Value.State;\n\ntype StatefulClassName<TState> = string | ((state: TState) => string | undefined) | undefined;\n\nexport interface ProgressProps extends Omit<\n\tProgressPrimitive.Root.Props,\n\t'children' | 'format' | 'getAriaValueText' | 'locale' | 'max' | 'min' | 'value'\n> {\n\t/** Current value. `null` renders an indeterminate state. */\n\tvalue: number | null;\n\t/** Minimum value used to normalize the visual percentage. @default 0 */\n\tmin?: number;\n\t/** Maximum value used to normalize the visual percentage. @default 100 */\n\tmax?: number;\n\t/** Intl options for formatting the raw value instead of the default normalized percentage. */\n\tformat?: Intl.NumberFormatOptions;\n\t/** Locale forwarded to `Intl.NumberFormat`. */\n\tlocale?: Intl.LocalesArgument;\n\t/** Human-readable text for the current value. Receives the wrapper's normalized display value. */\n\tgetAriaValueText?: (formattedValue: string | null, value: number | null) => string;\n\t/** Low-level compound content. `headerSlot` takes precedence when both are supplied. */\n\tchildren?: ReactNode;\n\t/** Accessible visual label. Supplying it also enables `showValue` by default. */\n\tlabel?: ReactNode;\n\t/** Supporting text automatically connected with `aria-describedby`. */\n\tdescription?: ReactNode;\n\t/** Optional right-aligned task metadata, such as \"18,400 of 25,000 rows\". */\n\tmetadata?: ReactNode;\n\t/** Show the formatted value beside the label. Defaults to `true` when `label` is supplied. */\n\tshowValue?: boolean;\n\t/** Replaces the formatted value while retaining the default summary layout. */\n\tvalueSlot?: ReactNode;\n\t/** Replaces the entire content above the track. */\n\theaderSlot?: ReactNode;\n\t/** Replaces the default track and indicator composition. */\n\ttrackSlot?: ReactNode;\n\t/** Track thickness. @default \"default\" */\n\tsize?: ProgressSize;\n\t/** Semantic indicator color. @default \"primary\" */\n\ttone?: ProgressTone;\n\t/** Props forwarded to the default track. Ignored when `trackSlot` is supplied. */\n\ttrackProps?: ProgressTrackProps;\n\t/** Props forwarded to the default indicator. Ignored when `trackSlot` is supplied. */\n\tindicatorProps?: ProgressIndicatorProps;\n\t/** Override the indeterminate screen-reader copy. */\n\tstrings?: StringsProp<ProgressStrings>;\n}\n\nexport interface ProgressTrackProps extends ProgressPrimitive.Track.Props {\n\t/** Track thickness. @default \"default\" */\n\tsize?: ProgressSize;\n}\n\nexport interface ProgressIndicatorProps extends ProgressPrimitive.Indicator.Props {\n\t/** Semantic fill color. @default \"primary\" */\n\ttone?: ProgressTone;\n}\n\nexport interface ProgressLabelProps extends ProgressPrimitive.Label.Props {\n\t/** Accessible label content. */\n\tchildren?: ReactNode;\n}\n\nexport interface ProgressValueProps extends Omit<ProgressPrimitive.Value.Props, 'children'> {\n\t/** Customize the formatted display while preserving the value semantics. */\n\tchildren?: (formattedValue: string | null, value: number | null) => ReactNode;\n}\n\ninterface ProgressContextValue {\n\tformattedValue: string | null;\n\tvalue: number | null;\n}\n\nconst ProgressContext = createContext<ProgressContextValue | null>(null);\n\nfunction isSimpleText(value: ReactNode): value is string | number | bigint {\n\treturn typeof value === 'string' || typeof value === 'number' || typeof value === 'bigint';\n}\n\n\n\nconst INDICATOR_TONE_CLASSNAMES: Record<ProgressTone, string> = {\n\tneutral: 'bg-muted-foreground',\n\tprimary: 'bg-primary',\n\tsecondary: 'bg-secondary-foreground',\n\tsuccess: 'bg-success',\n\tinfo: 'bg-info',\n\twarning: 'bg-warning',\n\tdestructive: 'bg-destructive',\n};\n\nfunction mergeStateClassName<TState>(\n\tbaseClassName: string,\n\tclassName: StatefulClassName<TState>,\n): string | ((state: TState) => string) {\n\tif (typeof className === 'function') {\n\t\treturn (state) => cn(baseClassName, className(state));\n\t}\n\n\treturn cn(baseClassName, className);\n}\n\nfunction normalizeRange(minProp: number | undefined, maxProp: number | undefined) {\n\tconst min = Number.isFinite(minProp) ? (minProp as number) : 0;\n\tconst maxCandidate = Number.isFinite(maxProp) ? (maxProp as number) : 100;\n\tconst max = maxCandidate > min ? maxCandidate : min + 100;\n\n\treturn { min, max };\n}\n\nfunction normalizeValue(value: number | null, min: number, max: number): number | null {\n\tif (value === null || !Number.isFinite(value)) return null;\n\treturn Math.min(max, Math.max(min, value));\n}\n\nfunction formatProgressValue(\n\tvalue: number | null,\n\tmin: number,\n\tmax: number,\n\tlocale: Intl.LocalesArgument | undefined,\n\tformat: Intl.NumberFormatOptions | undefined,\n): string | null {\n\tif (value === null) return null;\n\n\tif (format) {\n\t\treturn new Intl.NumberFormat(locale, format).format(value);\n\t}\n\n\tconst normalized = max === min ? 0 : (value - min) / (max - min);\n\treturn new Intl.NumberFormat(locale, {\n\t\tstyle: 'percent',\n\t\tmaximumFractionDigits: 0,\n\t}).format(normalized);\n}\n\nconst Progress = forwardRef<HTMLDivElement, ProgressProps>(function Progress(\n\t{\n\t\tvalue: valueProp,\n\t\tmin: minProp,\n\t\tmax: maxProp,\n\t\tformat,\n\t\tlocale,\n\t\tgetAriaValueText,\n\t\tchildren,\n\t\tlabel,\n\t\tdescription,\n\t\tmetadata,\n\t\tshowValue: showValueProp,\n\t\tvalueSlot,\n\t\theaderSlot,\n\t\ttrackSlot,\n\t\tsize: sizeProp,\n\t\ttone = 'primary',\n\t\ttrackProps,\n\t\tindicatorProps,\n\t\tstrings: stringsProp,\n\t\tclassName,\n\t\t'aria-describedby': ariaDescribedBy,\n\t\t...props\n\t},\n\tref,\n) {\n\tconst strings = useStrings(defaultProgressStrings, stringsProp);\n\tconst formatting = useFormattingConfig();\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveComponentScale(sizeProp, defaultScale);\n\tconst resolvedLocale = locale ?? formatting.locale;\n\tconst descriptionId = useId();\n\tconst { min, max } = normalizeRange(minProp, maxProp);\n\tconst value = normalizeValue(valueProp, min, max);\n\tconst formattedValue = formatProgressValue(value, min, max, resolvedLocale, format);\n\tconst usesGeneratedHeader = headerSlot === undefined && children === undefined;\n\tconst showValue = showValueProp ?? label !== undefined;\n\tconst hasSummary =\n\t\tlabel !== undefined || description !== undefined || metadata !== undefined || valueSlot !== undefined || showValue;\n\tconst descriptionIds =\n\t\t[ariaDescribedBy, usesGeneratedHeader && description !== undefined ? descriptionId : undefined]\n\t\t\t.filter(Boolean)\n\t\t\t.join(' ') || undefined;\n\tconst resolvedGetAriaValueText = (_formattedValue: string | null, currentValue: number | null) => {\n\t\tconst normalizedFormattedValue = formatProgressValue(currentValue, min, max, resolvedLocale, format);\n\t\tif (getAriaValueText) {\n\t\t\treturn getAriaValueText(normalizedFormattedValue, currentValue);\n\t\t}\n\t\treturn normalizedFormattedValue ?? strings.indeterminateValue;\n\t};\n\tconst contextValue = useMemo(() => ({ formattedValue, value }), [formattedValue, value]);\n\tconst resolvedHeader =\n\t\theaderSlot ??\n\t\tchildren ??\n\t\t(hasSummary ? (\n\t\t\t<>\n\t\t\t\t<Stack gap=\"dense\" className=\"progress--summary min-w-0\">\n\t\t\t\t\t{label !== undefined && <ProgressLabel>{label}</ProgressLabel>}\n\t\t\t\t\t{description !== undefined &&\n\t\t\t\t\t\t(isSimpleText(description) ? (\n\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\tid={descriptionId}\n\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\tclassName=\"progress--description block\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div id={descriptionId} className=\"progress--description\">\n\t\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t</Stack>\n\t\t\t\t{(showValue || valueSlot !== undefined || metadata !== undefined) && (\n\t\t\t\t\t<Stack gap=\"dense\" align=\"end\" className=\"progress--details text-end\">\n\t\t\t\t\t\t{valueSlot ?? (showValue ? <ProgressValue /> : null)}\n\t\t\t\t\t\t{metadata !== undefined &&\n\t\t\t\t\t\t\t(isSimpleText(metadata) ? (\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"progress--metadata tabular-nums\">\n\t\t\t\t\t\t\t\t\t{metadata}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\tmetadata\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\t\t\t</>\n\t\t) : null);\n\tconst resolvedTrack = trackSlot ?? (\n\t\t<ProgressTrack {...trackProps} size={trackProps?.size ?? size}>\n\t\t\t{trackProps?.children ?? <ProgressIndicator {...indicatorProps} tone={indicatorProps?.tone ?? tone} />}\n\t\t</ProgressTrack>\n\t);\n\n\treturn (\n\t\t<ProgressContext.Provider value={contextValue}>\n\t\t\t<ProgressPrimitive.Root\n\t\t\t\tref={ref}\n\t\t\t\tvalue={value}\n\t\t\t\tmin={min}\n\t\t\t\tmax={max}\n\t\t\t\tformat={format}\n\t\t\t\tlocale={resolvedLocale}\n\t\t\t\tgetAriaValueText={resolvedGetAriaValueText}\n\t\t\t\taria-describedby={descriptionIds}\n\t\t\t\tdata-slot=\"progress\"\n\t\t\t\tdata-size={size}\n\t\t\t\tdata-tone={tone}\n\t\t\t\tclassName={mergeStateClassName<ProgressRootState>(\n\t\t\t\t\t'progress--component grid min-w-0 w-full grid-cols-[minmax(0,1fr)_auto] items-start gap-x-space-lg gap-y-space-sm',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{resolvedHeader}\n\t\t\t\t{resolvedTrack}\n\t\t\t</ProgressPrimitive.Root>\n\t\t</ProgressContext.Provider>\n\t);\n});\nProgress.displayName = 'Progress';\n\nconst ProgressTrack = forwardRef<HTMLDivElement, ProgressTrackProps>(function ProgressTrack(\n\t{ className, size: sizeProp, ...props },\n\tref,\n) {\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveComponentScale(sizeProp, defaultScale);\n\treturn (\n\t\t<ProgressPrimitive.Track\n\t\t\tref={ref}\n\t\t\tdata-slot=\"progress-track\"\n\t\t\tdata-size={size}\n\t\t\tclassName={mergeStateClassName<ProgressTrackState>(\n\t\t\t\tcn(\n\t\t\t\t\t'progress-track--component progress--track relative col-span-full flex w-full items-center overflow-hidden rounded-full bg-muted',\n\t\t\t\t\ttrackHeightClasses[size],\n\t\t\t\t),\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nProgressTrack.displayName = 'ProgressTrack';\n\nconst ProgressIndicator = forwardRef<HTMLDivElement, ProgressIndicatorProps>(function ProgressIndicator(\n\t{ className, tone = 'primary', ...props },\n\tref,\n) {\n\treturn (\n\t\t<ProgressPrimitive.Indicator\n\t\t\tref={ref}\n\t\t\tdata-slot=\"progress-indicator\"\n\t\t\tdata-tone={tone}\n\t\t\tclassName={mergeStateClassName<ProgressIndicatorState>(\n\t\t\t\tcn(\n\t\t\t\t\t'progress-indicator--component progress--indicator h-full rounded-full transition-[width] duration-300 ease-out motion-reduce:transition-none',\n\t\t\t\t\t'data-[indeterminate]:w-full motion-safe:data-[indeterminate]:animate-pulse',\n\t\t\t\t\tINDICATOR_TONE_CLASSNAMES[tone],\n\t\t\t\t),\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nProgressIndicator.displayName = 'ProgressIndicator';\n\nconst ProgressLabel = forwardRef<HTMLSpanElement, ProgressLabelProps>(function ProgressLabel(\n\t{ className, children, ...props },\n\tref,\n) {\n\treturn (\n\t\t<ProgressPrimitive.Label\n\t\t\tref={ref}\n\t\t\tdata-slot=\"progress-label\"\n\t\t\tclassName={mergeStateClassName<ProgressLabelState>(\n\t\t\t\t'progress-label--component progress--label min-w-0',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{isSimpleText(children) ? (\n\t\t\t\t<Text tag=\"span\" weight=\"medium\" lineHeight=\"tight\" className=\"block\">\n\t\t\t\t\t{children}\n\t\t\t\t</Text>\n\t\t\t) : (\n\t\t\t\tchildren\n\t\t\t)}\n\t\t</ProgressPrimitive.Label>\n\t);\n});\nProgressLabel.displayName = 'ProgressLabel';\n\nconst ProgressValue = forwardRef<HTMLSpanElement, ProgressValueProps>(function ProgressValue(\n\t{ className, children, ...props },\n\tref,\n) {\n\tconst context = useContext(ProgressContext);\n\n\treturn (\n\t\t<ProgressPrimitive.Value\n\t\t\tref={ref}\n\t\t\tdata-slot=\"progress-value\"\n\t\t\tclassName={mergeStateClassName<ProgressValueState>(\n\t\t\t\t'progress-value--component progress--value whitespace-nowrap',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{(_primitiveFormattedValue, primitiveValue) => {\n\t\t\t\tconst value = context?.value ?? primitiveValue;\n\t\t\t\tconst formattedValue = context?.formattedValue ?? _primitiveFormattedValue;\n\t\t\t\tconst content = children ? children(formattedValue, value) : formattedValue;\n\n\t\t\t\tif (content === null || content === undefined) return null;\n\t\t\t\treturn isSimpleText(content) ? (\n\t\t\t\t\t// The percentage is the bar's primary value, so it mirrors\n\t\t\t\t\t// ProgressLabel: provider-default size and medium weight. Pinning\n\t\t\t\t\t// it to `xs`/secondary demoted the headline number below its own\n\t\t\t\t\t// caption and left the two off a shared baseline.\n\t\t\t\t\t<Text tag=\"span\" weight=\"medium\" lineHeight=\"tight\" className=\"block tabular-nums\">\n\t\t\t\t\t\t{content}\n\t\t\t\t\t</Text>\n\t\t\t\t) : (\n\t\t\t\t\tcontent\n\t\t\t\t);\n\t\t\t}}\n\t\t</ProgressPrimitive.Value>\n\t);\n});\nProgressValue.displayName = 'ProgressValue';\n\nexport { Progress, ProgressTrack, ProgressIndicator, ProgressLabel, ProgressValue, defaultProgressStrings };\nexport type { ProgressStrings };\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  "use client";
2
- import { t as e } from "./utils-l5LpDw2z.js";
3
- import { s as t } from "./typography-DTRkE9zL.js";
4
- import { t as n } from "./structure-DC2dygdA.js";
5
- import { d as r, t as i } from "./smart-card-lFKxn5Hu.js";
6
- import { r as a, t as o } from "./number-DMhe-Vsk.js";
2
+ import { t as e } from "./utils-BRhFDwuU.js";
3
+ import { c as t } from "./typography-UTnveOEy.js";
4
+ import { t as n } from "./structure-BmisBK-3.js";
5
+ import { d as r, t as i } from "./smart-card-DiC5aac3.js";
6
+ import { r as a, t as o } from "./number-DbV1Dija.js";
7
7
  import { forwardRef as s, useEffect as c, useRef as l, useState as u } from "react";
8
8
  import { jsx as d, jsxs as f } from "react/jsx-runtime";
9
9
  //#region src/components/blocks/commerce/receipt/receipt.tsx
@@ -79,11 +79,13 @@ function h({ items: r, currency: i, locale: s, unit: c, minorUnitScale: l, forma
79
79
  gap: "dense",
80
80
  className: "receipt-items--copy min-w-0 flex-1",
81
81
  children: [/* @__PURE__ */ f(t, {
82
+ type: "inherit",
82
83
  className: "break-words [overflow-wrap:anywhere]",
83
84
  children: [
84
85
  e.name,
85
86
  " × ",
86
87
  /* @__PURE__ */ d(o, {
88
+ type: "inherit",
87
89
  value: e.quantity,
88
90
  locale: s,
89
91
  align: "left"
@@ -96,6 +98,7 @@ function h({ items: r, currency: i, locale: s, unit: c, minorUnitScale: l, forma
96
98
  children: e.description
97
99
  })]
98
100
  }), /* @__PURE__ */ d(a, {
101
+ type: "inherit",
99
102
  amount: e.total ?? e.quantity * e.unitPrice,
100
103
  currency: i,
101
104
  locale: s,
@@ -110,4 +113,4 @@ function h({ items: r, currency: i, locale: s, unit: c, minorUnitScale: l, forma
110
113
  //#endregion
111
114
  export { m as n, h as t };
112
115
 
113
- //# sourceMappingURL=receipt-D0oswZ0p.js.map
116
+ //# sourceMappingURL=receipt-BVSOH3Xo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"receipt-D0oswZ0p.js","names":["NumberValue","cn","Text","Stack","hasRenderableContent","Card","Money","Number$1","paperClip","width","height","depth","inset","count","toothWidth","step","point","x","y","points","segment","Receipt","forwardRef","props","paper","useRef","clipPath","setClipPath","useState","toothDepth","element","update","rectangle","observer","children","header","footer","qrCode","hasFooter","className","shadow","ReceiptItems","items","item"],"sources":["../src/components/blocks/commerce/receipt/receipt.tsx","../src/components/blocks/commerce/receipt/receipt-items.tsx"],"sourcesContent":["import { forwardRef, useEffect, useRef, useState } from 'react';\nimport { Card, hasRenderableContent } from '../../../base/cards';\nimport { Stack } from '../../../base/structure';\nimport { cn } from '../../../../lib/utils';\nimport type { ReceiptProps } from './types';\n\nfunction paperClip(width: number, height: number, depth: number, toothWidth: number) {\n\tif (!(width > 0 && height > 0 && depth > 0)) return undefined;\n\tconst inset = Math.min(depth, height / 4);\n\tconst count = Math.max(1, Math.min(1024, Math.round(width / toothWidth)));\n\tconst step = width / count;\n\tconst point = (x: number, y: number) => `${Number(x.toFixed(2))}px ${Number(y.toFixed(2))}px`;\n\tconst points: string[] = [point(0, inset)];\n\tfor (let segment = 0; segment < count; segment++) {\n\t\tpoints.push(point((segment + 0.5) * step, 0), point((segment + 1) * step, inset));\n\t}\n\tpoints.push(point(width, height - inset));\n\tfor (let segment = count - 1; segment >= 0; segment--) {\n\t\tpoints.push(point((segment + 0.5) * step, height), point(segment * step, height - inset));\n\t}\n\treturn `polygon(${points.join(', ')})`;\n}\n\n/** Explicit paper surface: Card owns all content insets; clipping is decorative geometry. */\nexport const Receipt = forwardRef<HTMLDivElement, ReceiptProps>(function Receipt({\n\tchildren, header, footer, qrCode, padding = 'md', toothDepth = 5, toothWidth = 8,\n\tshadow = true, className, ...props\n}, ref) {\n\tconst paper = useRef<HTMLDivElement>(null);\n\tconst [clipPath, setClipPath] = useState<string>();\n\tconst depth = Number.isFinite(toothDepth) ? Math.max(0, toothDepth) : 5;\n\tconst width = Number.isFinite(toothWidth) ? Math.max(2, toothWidth) : 8;\n\tuseEffect(() => {\n\t\tconst element = paper.current;\n\t\tif (!element) return;\n\t\tconst update = () => {\n\t\t\tconst rectangle = element.getBoundingClientRect();\n\t\t\tsetClipPath(paperClip(rectangle.width, rectangle.height, depth, width));\n\t\t};\n\t\tupdate();\n\t\tif (typeof ResizeObserver === 'undefined') {\n\t\t\twindow.addEventListener('resize', update);\n\t\t\treturn () => window.removeEventListener('resize', update);\n\t\t}\n\t\tconst observer = new ResizeObserver(update);\n\t\tobserver.observe(element);\n\t\treturn () => observer.disconnect();\n\t}, [depth, width, children, header, footer, qrCode]);\n\tconst hasFooter = hasRenderableContent(footer) || hasRenderableContent(qrCode);\n\treturn <div {...props} ref={ref} className={cn('receipt--component relative isolate w-full min-w-0', className)}>\n\t\t{shadow && <div aria-hidden=\"true\" className=\"receipt--shadow pointer-events-none absolute inset-x-0 rounded-radius shadow-sm\" style={{ insetBlock: depth }} />}\n\t\t<Card ref={paper} surface=\"flat\" padding={padding} headerStart={header}\n\t\t\tfooterSlot={hasFooter ? <Stack gap=\"normal\" align=\"center\" className=\"receipt--footer w-full min-w-0\">{qrCode}{footer}</Stack> : undefined}\n\t\t\tclassName=\"receipt--paper relative bg-card text-card-foreground\" style={{ clipPath }}>\n\t\t\t{children}\n\t\t</Card>\n\t</div>;\n});\n","import { Stack } from '../../../base/structure';\nimport { Money } from '../../../primitives/money';\nimport { Number as NumberValue } from '../../../primitives/number';\nimport { Text } from '../../../typography/text';\nimport { cn } from '../../../../lib/utils';\nimport type { ReceiptItemsProps } from './types';\n\nexport function ReceiptItems({ items, currency, locale, unit, minorUnitScale, formatMode, className, ...props }: ReceiptItemsProps) {\n\tif (items.length === 0) return null;\n\treturn <Stack {...props} gap=\"md\" className={cn('receipt-items--component min-w-0', className)}>\n\t\t{items.map(item => <Stack key={item.id} direction=\"horizontal\" gap=\"md\" justify=\"between\" align=\"start\" wrap={false} className=\"receipt-items--item min-w-0\">\n\t\t\t<Stack gap=\"dense\" className=\"receipt-items--copy min-w-0 flex-1\">\n\t\t\t\t<Text className=\"break-words [overflow-wrap:anywhere]\">{item.name} × <NumberValue value={item.quantity} locale={locale} align=\"left\" /></Text>\n\t\t\t\t{item.description != null && <Text size=\"xs\" type=\"secondary\" className=\"break-words [overflow-wrap:anywhere]\">{item.description}</Text>}\n\t\t\t</Stack>\n\t\t\t<Money amount={item.total ?? item.quantity * item.unitPrice} currency={currency} locale={locale} unit={unit} minorUnitScale={minorUnitScale} formatMode={formatMode} className=\"receipt-items--amount min-w-0 max-w-full whitespace-normal [overflow-wrap:anywhere]\" />\n\t\t</Stack>)}\n\t</Stack>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"receipt-BVSOH3Xo.js","names":["NumberValue","cn","Text","Stack","hasRenderableContent","Card","Money","Number$1","paperClip","width","height","depth","inset","count","toothWidth","step","point","x","y","points","segment","Receipt","forwardRef","props","paper","useRef","clipPath","setClipPath","useState","toothDepth","element","update","rectangle","observer","children","header","footer","qrCode","hasFooter","className","shadow","ReceiptItems","items","item"],"sources":["../src/components/blocks/commerce/receipt/receipt.tsx","../src/components/blocks/commerce/receipt/receipt-items.tsx"],"sourcesContent":["import { forwardRef, useEffect, useRef, useState } from 'react';\nimport { Card, hasRenderableContent } from '../../../base/cards';\nimport { Stack } from '../../../base/structure';\nimport { cn } from '../../../../lib/utils';\nimport type { ReceiptProps } from './types';\n\nfunction paperClip(width: number, height: number, depth: number, toothWidth: number) {\n\tif (!(width > 0 && height > 0 && depth > 0)) return undefined;\n\tconst inset = Math.min(depth, height / 4);\n\tconst count = Math.max(1, Math.min(1024, Math.round(width / toothWidth)));\n\tconst step = width / count;\n\tconst point = (x: number, y: number) => `${Number(x.toFixed(2))}px ${Number(y.toFixed(2))}px`;\n\tconst points: string[] = [point(0, inset)];\n\tfor (let segment = 0; segment < count; segment++) {\n\t\tpoints.push(point((segment + 0.5) * step, 0), point((segment + 1) * step, inset));\n\t}\n\tpoints.push(point(width, height - inset));\n\tfor (let segment = count - 1; segment >= 0; segment--) {\n\t\tpoints.push(point((segment + 0.5) * step, height), point(segment * step, height - inset));\n\t}\n\treturn `polygon(${points.join(', ')})`;\n}\n\n/** Explicit paper surface: Card owns all content insets; clipping is decorative geometry. */\nexport const Receipt = forwardRef<HTMLDivElement, ReceiptProps>(function Receipt({\n\tchildren, header, footer, qrCode, padding = 'md', toothDepth = 5, toothWidth = 8,\n\tshadow = true, className, ...props\n}, ref) {\n\tconst paper = useRef<HTMLDivElement>(null);\n\tconst [clipPath, setClipPath] = useState<string>();\n\tconst depth = Number.isFinite(toothDepth) ? Math.max(0, toothDepth) : 5;\n\tconst width = Number.isFinite(toothWidth) ? Math.max(2, toothWidth) : 8;\n\tuseEffect(() => {\n\t\tconst element = paper.current;\n\t\tif (!element) return;\n\t\tconst update = () => {\n\t\t\tconst rectangle = element.getBoundingClientRect();\n\t\t\tsetClipPath(paperClip(rectangle.width, rectangle.height, depth, width));\n\t\t};\n\t\tupdate();\n\t\tif (typeof ResizeObserver === 'undefined') {\n\t\t\twindow.addEventListener('resize', update);\n\t\t\treturn () => window.removeEventListener('resize', update);\n\t\t}\n\t\tconst observer = new ResizeObserver(update);\n\t\tobserver.observe(element);\n\t\treturn () => observer.disconnect();\n\t}, [depth, width, children, header, footer, qrCode]);\n\tconst hasFooter = hasRenderableContent(footer) || hasRenderableContent(qrCode);\n\treturn <div {...props} ref={ref} className={cn('receipt--component relative isolate w-full min-w-0', className)}>\n\t\t{shadow && <div aria-hidden=\"true\" className=\"receipt--shadow pointer-events-none absolute inset-x-0 rounded-radius shadow-sm\" style={{ insetBlock: depth }} />}\n\t\t<Card ref={paper} surface=\"flat\" padding={padding} headerStart={header}\n\t\t\tfooterSlot={hasFooter ? <Stack gap=\"normal\" align=\"center\" className=\"receipt--footer w-full min-w-0\">{qrCode}{footer}</Stack> : undefined}\n\t\t\tclassName=\"receipt--paper relative bg-card text-card-foreground\" style={{ clipPath }}>\n\t\t\t{children}\n\t\t</Card>\n\t</div>;\n});\n","import { Stack } from '../../../base/structure';\nimport { Money } from '../../../primitives/money';\nimport { Number as NumberValue } from '../../../primitives/number';\nimport { Text } from '../../../typography/text';\nimport { cn } from '../../../../lib/utils';\nimport type { ReceiptItemsProps } from './types';\n\nexport function ReceiptItems({ items, currency, locale, unit, minorUnitScale, formatMode, className, ...props }: ReceiptItemsProps) {\n\tif (items.length === 0) return null;\n\treturn <Stack {...props} gap=\"md\" className={cn('receipt-items--component min-w-0', className)}>\n\t\t{items.map(item => <Stack key={item.id} direction=\"horizontal\" gap=\"md\" justify=\"between\" align=\"start\" wrap={false} className=\"receipt-items--item min-w-0\">\n\t\t\t<Stack gap=\"dense\" className=\"receipt-items--copy min-w-0 flex-1\">\n\t\t\t\t<Text type=\"inherit\" className=\"break-words [overflow-wrap:anywhere]\">{item.name} × <NumberValue type=\"inherit\" value={item.quantity} locale={locale} align=\"left\" /></Text>\n\t\t\t\t{item.description != null && <Text size=\"xs\" type=\"secondary\" className=\"break-words [overflow-wrap:anywhere]\">{item.description}</Text>}\n\t\t\t</Stack>\n\t\t\t<Money type=\"inherit\" amount={item.total ?? item.quantity * item.unitPrice} currency={currency} locale={locale} unit={unit} minorUnitScale={minorUnitScale} formatMode={formatMode} className=\"receipt-items--amount min-w-0 max-w-full whitespace-normal [overflow-wrap:anywhere]\" />\n\t\t</Stack>)}\n\t</Stack>;\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { m as e } from "./ui-provider-1D_NSYzO.js";
3
- import { t } from "./utils-l5LpDw2z.js";
2
+ import { m as e } from "./ui-provider-C_U0Xma4.js";
3
+ import { t } from "./utils-BRhFDwuU.js";
4
4
  import { n } from "./text.styles-g4He6UIW.js";
5
5
  import { n as r } from "./safe-image-src-C6kQSMBZ.js";
6
6
  import { n as i, t as a } from "./sanitize-html-DsQmI48u.js";
@@ -75,4 +75,4 @@ _.displayName = "RichText";
75
75
  //#endregion
76
76
  export { _ as t };
77
77
 
78
- //# sourceMappingURL=rich-text-DvGulsNJ.js.map
78
+ //# sourceMappingURL=rich-text-GOUyKQ-s.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rich-text-DvGulsNJ.js","names":["useTypographyConfig","safeImageSrc","sanitizeHtmlTree","sanitizeHtml","contentTypographyClassName","VOID_ELEMENTS","toNumber","number","value","toReactProps","props","name","element","letter","renderNode","node","src","image","Fragment","renderImage","key","createElement","child","index","renderRichTextTree","tree","RichText","forwardRef","sizeProp","Tag","size","defaultTextSize","allowImages","images","sanitizedHtml","useMemo","html","classNames","cn","resolveTextClassNames"],"sources":["../src/components/typography/rich-text/rich-text-tree.tsx","../src/components/typography/rich-text/rich-text.tsx"],"sourcesContent":["import { createElement, Fragment, type ReactNode } from 'react';\nimport type { Element, Root, RootContent } from 'hast';\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\nconst VOID_ELEMENTS = new Set(['br', 'img']);\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 props[name] = Array.isArray(value) ? value.join(' ') : value;\n\t}\n\treturn props;\n}\n\nfunction renderNode(node: RootContent, key: number, renderImage: RenderRichTextImage): ReactNode {\n\tif (node.type === 'text') return node.value;\n\tif (node.type !== 'element') return null;\n\tif (node.tagName === 'img') {\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)));\n}\n\n/**\n * Renders an already sanitized tree as React elements, so each image can be\n * the consumer's own component (a framework image, a lightbox trigger) while\n * the surrounding markup keeps its structure. Server and client output match.\n */\nexport function renderRichTextTree(tree: Root, renderImage: RenderRichTextImage): ReactNode {\n\treturn tree.children.map((child, index) => renderNode(child, index, renderImage));\n}\n","import { forwardRef, useMemo } from 'react';\n\nimport { sanitizeHtml, sanitizeHtmlTree } from '../../../lib/sanitize-html';\nimport { useTypographyConfig } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\nimport { contentTypographyClassName } from '../content-typography';\n\nimport type { TextProps } from '../text';\nimport { resolveTextClassNames } from '../text.styles';\nimport { renderRichTextTree, type RenderRichTextImage } from './rich-text-tree';\n\nexport type { RenderRichTextImage, RichTextImageAttributes } from './rich-text-tree';\n\n/** Image rendering for read-only rich text. */\nexport interface RichTextImageRendering {\n\t/**\n\t * Renders each image, for example with a framework image component. It\n\t * receives only sources that passed the package image policy.\n\t */\n\trenderImage?: RenderRichTextImage;\n}\n\nexport interface RichTextProps\n\textends Omit<\n\t\tTextProps,\n\t\t'children' | 'content' | 'dangerouslySetInnerHTML'\n\t> {\n\t/** HTML sanitized through the package allowlist before rendering. */\n\thtml?: string | null;\n\t/**\n\t * Keeps images whose source is a web URL, a `blob:` preview or a relative\n\t * path (script and `data:` sources are removed). Pass `renderImage` to draw\n\t * each image with your own component. Default: images are removed.\n\t */\n\timages?: boolean | RichTextImageRendering;\n}\n\nexport const RichText = forwardRef<HTMLElement, RichTextProps>(\n\tfunction RichText(\n\t\t{\n\t\t\thtml,\n\t\t\ttype = 'main',\n\t\t\tsize: sizeProp,\n\t\t\talign = 'left',\n\t\t\tlineHeight = 'normal',\n\t\t\tweight = 'regular',\n\t\t\tclassName,\n\t\t\tnumeric = false,\n\t\t\ttag: Tag = 'p',\n\t\t\timages = false,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) {\n\t\tconst { defaultTextSize } = useTypographyConfig();\n\t\tconst size = sizeProp ?? defaultTextSize ?? 'sm';\n\t\tconst allowImages = Boolean(images);\n\t\tconst renderImage = typeof images === 'object' ? images.renderImage : undefined;\n\t\tconst sanitizedHtml = useMemo(() => sanitizeHtml(html ?? '', { images: allowImages }), [allowImages, html]);\n\t\t// Consumer image components need React elements; plain images keep the HTML path.\n\t\tconst tree = useMemo(\n\t\t\t() => (renderImage && sanitizedHtml ? renderRichTextTree(sanitizeHtmlTree(html ?? '', { images: true }), renderImage) : null),\n\t\t\t[html, renderImage, sanitizedHtml],\n\t\t);\n\n\t\tif (!sanitizedHtml) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst classNames = cn(contentTypographyClassName, resolveTextClassNames({\n\t\t\ttype,\n\t\t\tsize,\n\t\t\talign,\n\t\t\tlineHeight,\n\t\t\tweight,\n\t\t\tnumeric,\n\t\t\tclassName,\n\t\t}));\n\n\t\tif (tree) {\n\t\t\treturn (\n\t\t\t\t<Tag ref={ref as never} className={classNames} data-typography=\"rich-text\" {...props}>\n\t\t\t\t\t{tree}\n\t\t\t\t</Tag>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<Tag\n\t\t\t\tref={ref as never}\n\t\t\t\tclassName={classNames}\n\t\t\t\tdata-typography=\"rich-text\"\n\t\t\t\tdangerouslySetInnerHTML={{ __html: sanitizedHtml }}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t},\n);\n\nRichText.displayName = 'RichText';\n"],"mappings":"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"}
1
+ {"version":3,"file":"rich-text-GOUyKQ-s.js","names":["useTypographyConfig","safeImageSrc","sanitizeHtmlTree","sanitizeHtml","contentTypographyClassName","VOID_ELEMENTS","toNumber","number","value","toReactProps","props","name","element","letter","renderNode","node","src","image","Fragment","renderImage","key","createElement","child","index","renderRichTextTree","tree","RichText","forwardRef","sizeProp","Tag","size","defaultTextSize","allowImages","images","sanitizedHtml","useMemo","html","classNames","cn","resolveTextClassNames"],"sources":["../src/components/typography/rich-text/rich-text-tree.tsx","../src/components/typography/rich-text/rich-text.tsx"],"sourcesContent":["import { createElement, Fragment, type ReactNode } from 'react';\nimport type { Element, Root, RootContent } from 'hast';\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\nconst VOID_ELEMENTS = new Set(['br', 'img']);\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 props[name] = Array.isArray(value) ? value.join(' ') : value;\n\t}\n\treturn props;\n}\n\nfunction renderNode(node: RootContent, key: number, renderImage: RenderRichTextImage): ReactNode {\n\tif (node.type === 'text') return node.value;\n\tif (node.type !== 'element') return null;\n\tif (node.tagName === 'img') {\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)));\n}\n\n/**\n * Renders an already sanitized tree as React elements, so each image can be\n * the consumer's own component (a framework image, a lightbox trigger) while\n * the surrounding markup keeps its structure. Server and client output match.\n */\nexport function renderRichTextTree(tree: Root, renderImage: RenderRichTextImage): ReactNode {\n\treturn tree.children.map((child, index) => renderNode(child, index, renderImage));\n}\n","import { forwardRef, useMemo } from 'react';\n\nimport { sanitizeHtml, sanitizeHtmlTree } from '../../../lib/sanitize-html';\nimport { useTypographyConfig } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\nimport { contentTypographyClassName } from '../content-typography';\n\nimport type { TextProps } from '../text';\nimport { resolveTextClassNames } from '../text.styles';\nimport { renderRichTextTree, type RenderRichTextImage } from './rich-text-tree';\n\nexport type { RenderRichTextImage, RichTextImageAttributes } from './rich-text-tree';\n\n/** Image rendering for read-only rich text. */\nexport interface RichTextImageRendering {\n\t/**\n\t * Renders each image, for example with a framework image component. It\n\t * receives only sources that passed the package image policy.\n\t */\n\trenderImage?: RenderRichTextImage;\n}\n\nexport interface RichTextProps\n\textends Omit<\n\t\tTextProps,\n\t\t'children' | 'content' | 'dangerouslySetInnerHTML'\n\t> {\n\t/** HTML sanitized through the package allowlist before rendering. */\n\thtml?: string | null;\n\t/**\n\t * Keeps images whose source is a web URL, a `blob:` preview or a relative\n\t * path (script and `data:` sources are removed). Pass `renderImage` to draw\n\t * each image with your own component. Default: images are removed.\n\t */\n\timages?: boolean | RichTextImageRendering;\n}\n\nexport const RichText = forwardRef<HTMLElement, RichTextProps>(\n\tfunction RichText(\n\t\t{\n\t\t\thtml,\n\t\t\ttype = 'main',\n\t\t\tsize: sizeProp,\n\t\t\talign = 'left',\n\t\t\tlineHeight = 'normal',\n\t\t\tweight = 'regular',\n\t\t\tclassName,\n\t\t\tnumeric = false,\n\t\t\ttag: Tag = 'p',\n\t\t\timages = false,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) {\n\t\tconst { defaultTextSize } = useTypographyConfig();\n\t\tconst size = sizeProp ?? defaultTextSize ?? 'sm';\n\t\tconst allowImages = Boolean(images);\n\t\tconst renderImage = typeof images === 'object' ? images.renderImage : undefined;\n\t\tconst sanitizedHtml = useMemo(() => sanitizeHtml(html ?? '', { images: allowImages }), [allowImages, html]);\n\t\t// Consumer image components need React elements; plain images keep the HTML path.\n\t\tconst tree = useMemo(\n\t\t\t() => (renderImage && sanitizedHtml ? renderRichTextTree(sanitizeHtmlTree(html ?? '', { images: true }), renderImage) : null),\n\t\t\t[html, renderImage, sanitizedHtml],\n\t\t);\n\n\t\tif (!sanitizedHtml) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst classNames = cn(contentTypographyClassName, resolveTextClassNames({\n\t\t\ttype,\n\t\t\tsize,\n\t\t\talign,\n\t\t\tlineHeight,\n\t\t\tweight,\n\t\t\tnumeric,\n\t\t\tclassName,\n\t\t}));\n\n\t\tif (tree) {\n\t\t\treturn (\n\t\t\t\t<Tag ref={ref as never} className={classNames} data-typography=\"rich-text\" {...props}>\n\t\t\t\t\t{tree}\n\t\t\t\t</Tag>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<Tag\n\t\t\t\tref={ref as never}\n\t\t\t\tclassName={classNames}\n\t\t\t\tdata-typography=\"rich-text\"\n\t\t\t\tdangerouslySetInnerHTML={{ __html: sanitizedHtml }}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t},\n);\n\nRichText.displayName = 'RichText';\n"],"mappings":"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"}