@alfadocs/ui-kit-debug 0.65.0 → 0.67.0

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 (270) hide show
  1. package/dist/_chunks/{agenda-card-Bl-SBiCh.js → agenda-card-BxSFkqgY.js} +2 -2
  2. package/dist/_chunks/{agenda-card-Bl-SBiCh.js.map → agenda-card-BxSFkqgY.js.map} +1 -1
  3. package/dist/_chunks/{agenda-tray-Bh1KfEOG.js → agenda-tray-T-BumlGZ.js} +2 -2
  4. package/dist/_chunks/{agenda-tray-Bh1KfEOG.js.map → agenda-tray-T-BumlGZ.js.map} +1 -1
  5. package/dist/_chunks/{ai-consent-banner-Btzmk8OH.js → ai-consent-banner-Dxtx_WAh.js} +2 -2
  6. package/dist/_chunks/{ai-consent-banner-Btzmk8OH.js.map → ai-consent-banner-Dxtx_WAh.js.map} +1 -1
  7. package/dist/_chunks/{ai-tools-rail-JnlTqfS4.js → ai-tools-rail-DfmewPUN.js} +92 -76
  8. package/dist/_chunks/ai-tools-rail-DfmewPUN.js.map +1 -0
  9. package/dist/_chunks/{alia-sidebar-CN8pA6c-.js → alia-sidebar-Ckv0yCKi.js} +2 -2
  10. package/dist/_chunks/{alia-sidebar-CN8pA6c-.js.map → alia-sidebar-Ckv0yCKi.js.map} +1 -1
  11. package/dist/_chunks/{anamnesis-card-qeLYRG79.js → anamnesis-card-N8pIKWuS.js} +2 -2
  12. package/dist/_chunks/{anamnesis-card-qeLYRG79.js.map → anamnesis-card-N8pIKWuS.js.map} +1 -1
  13. package/dist/_chunks/{antenatal-schedule-timeline-BfzFjEyb.js → antenatal-schedule-timeline-35ebkcZT.js} +2 -2
  14. package/dist/_chunks/{antenatal-schedule-timeline-BfzFjEyb.js.map → antenatal-schedule-timeline-35ebkcZT.js.map} +1 -1
  15. package/dist/_chunks/{appointment-tray-BQnJEora.js → appointment-tray-CQJ3Nbi5.js} +4 -4
  16. package/dist/_chunks/{appointment-tray-BQnJEora.js.map → appointment-tray-CQJ3Nbi5.js.map} +1 -1
  17. package/dist/_chunks/{badge-zsf5i5bH.js → badge-CqGsX32l.js} +46 -42
  18. package/dist/_chunks/badge-CqGsX32l.js.map +1 -0
  19. package/dist/_chunks/{bishop-score-x2fNqbuZ.js → bishop-score-CjsB9bM-.js} +3 -3
  20. package/dist/_chunks/{bishop-score-x2fNqbuZ.js.map → bishop-score-CjsB9bM-.js.map} +1 -1
  21. package/dist/_chunks/{bmi-calculator-C3roxbqD.js → bmi-calculator-n-823_1V.js} +3 -3
  22. package/dist/_chunks/{bmi-calculator-C3roxbqD.js.map → bmi-calculator-n-823_1V.js.map} +1 -1
  23. package/dist/_chunks/{care-plan-card-D42WD4-T.js → care-plan-card-CJei-nl9.js} +4 -4
  24. package/dist/_chunks/{care-plan-card-D42WD4-T.js.map → care-plan-card-CJei-nl9.js.map} +1 -1
  25. package/dist/_chunks/{care-plan-entry-card-BukNI7Uy.js → care-plan-entry-card-EmfrbHu8.js} +4 -4
  26. package/dist/_chunks/{care-plan-entry-card-BukNI7Uy.js.map → care-plan-entry-card-EmfrbHu8.js.map} +1 -1
  27. package/dist/_chunks/{clinical-note-card-BYo437dU.js → clinical-note-card-gtrxv6zn.js} +2 -2
  28. package/dist/_chunks/{clinical-note-card-BYo437dU.js.map → clinical-note-card-gtrxv6zn.js.map} +1 -1
  29. package/dist/_chunks/{color-picker-9tL7pz5y.js → color-picker-B7xsn6tX.js} +186 -167
  30. package/dist/_chunks/color-picker-B7xsn6tX.js.map +1 -0
  31. package/dist/_chunks/columns-2-BTOBZbep.js +15 -0
  32. package/dist/_chunks/columns-2-BTOBZbep.js.map +1 -0
  33. package/dist/_chunks/{contact-profile-card-CCeJmjbd.js → contact-profile-card-7BMB85T6.js} +2 -2
  34. package/dist/_chunks/{contact-profile-card-CCeJmjbd.js.map → contact-profile-card-7BMB85T6.js.map} +1 -1
  35. package/dist/_chunks/{cycle-calculator-DrVXbIB4.js → cycle-calculator-BF0ointe.js} +3 -3
  36. package/dist/_chunks/{cycle-calculator-DrVXbIB4.js.map → cycle-calculator-BF0ointe.js.map} +1 -1
  37. package/dist/_chunks/{dependent-selector-CRWgieHm.js → dependent-selector-DpzGtr_J.js} +2 -2
  38. package/dist/_chunks/{dependent-selector-CRWgieHm.js.map → dependent-selector-DpzGtr_J.js.map} +1 -1
  39. package/dist/_chunks/{document-scanner-biBS_f6c.js → document-scanner-D2qehl3-.js} +53 -53
  40. package/dist/_chunks/{document-scanner-biBS_f6c.js.map → document-scanner-D2qehl3-.js.map} +1 -1
  41. package/dist/_chunks/{due-date-calculator-D4K1BnE2.js → due-date-calculator-DU9AEWNy.js} +4 -4
  42. package/dist/_chunks/{due-date-calculator-D4K1BnE2.js.map → due-date-calculator-DU9AEWNy.js.map} +1 -1
  43. package/dist/_chunks/{editable-currency-cell-renderer-CFqQc56y.js → editable-currency-cell-renderer-BVJ04DkB.js} +914 -865
  44. package/dist/_chunks/editable-currency-cell-renderer-BVJ04DkB.js.map +1 -0
  45. package/dist/_chunks/{fetal-weight-B_pBjlO7.js → fetal-weight-BVSzOhuR.js} +3 -3
  46. package/dist/_chunks/{fetal-weight-B_pBjlO7.js.map → fetal-weight-BVSzOhuR.js.map} +1 -1
  47. package/dist/_chunks/{gestational-age-calculator-BETQAVkA.js → gestational-age-calculator-DBlFdoiP.js} +4 -4
  48. package/dist/_chunks/{gestational-age-calculator-BETQAVkA.js.map → gestational-age-calculator-DBlFdoiP.js.map} +1 -1
  49. package/dist/_chunks/{hcg-doubling-8zXCJgAQ.js → hcg-doubling-if4Q8aSX.js} +3 -3
  50. package/dist/_chunks/{hcg-doubling-8zXCJgAQ.js.map → hcg-doubling-if4Q8aSX.js.map} +1 -1
  51. package/dist/_chunks/{type-DZ5OMRA2.js → image-C6RM5hfF.js} +4 -16
  52. package/dist/_chunks/image-C6RM5hfF.js.map +1 -0
  53. package/dist/_chunks/{insert-result-DIAG3ltJ.js → insert-result-njqBthzT.js} +68 -57
  54. package/dist/_chunks/insert-result-njqBthzT.js.map +1 -0
  55. package/dist/_chunks/{marketplace-app-shell-BXfRMiRk.js → marketplace-app-shell-Bu-HD3fy.js} +3 -3
  56. package/dist/_chunks/{marketplace-app-shell-BXfRMiRk.js.map → marketplace-app-shell-Bu-HD3fy.js.map} +1 -1
  57. package/dist/_chunks/{message-card-Bgcvfj6-.js → message-card-Bx4GmLvf.js} +9 -9
  58. package/dist/_chunks/{message-card-Bgcvfj6-.js.map → message-card-Bx4GmLvf.js.map} +1 -1
  59. package/dist/_chunks/{message-tray-saAVMeHP.js → message-tray-CVyJajVJ.js} +2 -2
  60. package/dist/_chunks/{message-tray-saAVMeHP.js.map → message-tray-CVyJajVJ.js.map} +1 -1
  61. package/dist/_chunks/{operator-hero-CM8949Hd.js → operator-hero-f_KaRhw5.js} +2 -2
  62. package/dist/_chunks/{operator-hero-CM8949Hd.js.map → operator-hero-f_KaRhw5.js.map} +1 -1
  63. package/dist/_chunks/{patient-search-Bw9ONucF.js → patient-search-DR9XUYRQ.js} +2 -2
  64. package/dist/_chunks/{patient-search-Bw9ONucF.js.map → patient-search-DR9XUYRQ.js.map} +1 -1
  65. package/dist/_chunks/{patient-shell-CF_qon7C.js → patient-shell-DrV_iekt.js} +2 -2
  66. package/dist/_chunks/{patient-shell-CF_qon7C.js.map → patient-shell-DrV_iekt.js.map} +1 -1
  67. package/dist/_chunks/{patient-summary-card-Bgso0p_l.js → patient-summary-card-ByfIU8N0.js} +4 -4
  68. package/dist/_chunks/{patient-summary-card-Bgso0p_l.js.map → patient-summary-card-ByfIU8N0.js.map} +1 -1
  69. package/dist/_chunks/{payment-request-card-DBz3hVDz.js → payment-request-card-yTjzKQCU.js} +3 -3
  70. package/dist/_chunks/{payment-request-card-DBz3hVDz.js.map → payment-request-card-yTjzKQCU.js.map} +1 -1
  71. package/dist/_chunks/{periodontal-chart-card-AYyHtU9K.js → periodontal-chart-card-Dh3KgvYG.js} +2 -2
  72. package/dist/_chunks/{periodontal-chart-card-AYyHtU9K.js.map → periodontal-chart-card-Dh3KgvYG.js.map} +1 -1
  73. package/dist/_chunks/{practice-results-CVAgY2RZ.js → practice-results-DND2SAt7.js} +2 -2
  74. package/dist/_chunks/{practice-results-CVAgY2RZ.js.map → practice-results-DND2SAt7.js.map} +1 -1
  75. package/dist/_chunks/{pregnancy-dating-BuzLTwjy.js → pregnancy-dating-QY-sqpvj.js} +4 -4
  76. package/dist/_chunks/{pregnancy-dating-BuzLTwjy.js.map → pregnancy-dating-QY-sqpvj.js.map} +1 -1
  77. package/dist/_chunks/{pregnancy-weight-gain-aicn7qs7.js → pregnancy-weight-gain-DOJXXNYP.js} +3 -3
  78. package/dist/_chunks/{pregnancy-weight-gain-aicn7qs7.js.map → pregnancy-weight-gain-DOJXXNYP.js.map} +1 -1
  79. package/dist/_chunks/rich-text-editor-BOQr5lHx.js +1970 -0
  80. package/dist/_chunks/rich-text-editor-BOQr5lHx.js.map +1 -0
  81. package/dist/_chunks/{scroll-area-BWqCkEGz.js → scroll-area-eccd_Uf-.js} +38 -28
  82. package/dist/_chunks/scroll-area-eccd_Uf-.js.map +1 -0
  83. package/dist/_chunks/{sidebar-DPEHzxLZ.js → sidebar-CGjIk_FQ.js} +36 -22
  84. package/dist/_chunks/sidebar-CGjIk_FQ.js.map +1 -0
  85. package/dist/_chunks/{suggestion-chip-C4kxWUIs.js → suggestion-chip-Bk4PmYTg.js} +30 -30
  86. package/dist/_chunks/suggestion-chip-Bk4PmYTg.js.map +1 -0
  87. package/dist/_chunks/{tab-bar-Xetknddo.js → tab-bar-B1ovILzh.js} +2 -2
  88. package/dist/_chunks/{tab-bar-Xetknddo.js.map → tab-bar-B1ovILzh.js.map} +1 -1
  89. package/dist/_chunks/{tag-CdA0s_VV.js → tag-BQXwuJq1.js} +41 -38
  90. package/dist/_chunks/tag-BQXwuJq1.js.map +1 -0
  91. package/dist/_chunks/{transaction-chip-BZCa6XDn.js → transaction-chip-BrW8P50O.js} +19 -19
  92. package/dist/_chunks/transaction-chip-BrW8P50O.js.map +1 -0
  93. package/dist/_chunks/trash-2-rPAKaRgB.js +18 -0
  94. package/dist/_chunks/trash-2-rPAKaRgB.js.map +1 -0
  95. package/dist/_chunks/{unit-converter-CHN2cZ4b.js → unit-converter-C1V3ACM9.js} +2 -2
  96. package/dist/_chunks/{unit-converter-CHN2cZ4b.js.map → unit-converter-C1V3ACM9.js.map} +1 -1
  97. package/dist/_chunks/{workflow-map-BX3JY1Bu.js → workflow-map-JAZryZJr.js} +137 -149
  98. package/dist/_chunks/workflow-map-JAZryZJr.js.map +1 -0
  99. package/dist/agent-catalog.json +1 -1
  100. package/dist/components/agenda-card/index.js +1 -1
  101. package/dist/components/agenda-tray/index.js +1 -1
  102. package/dist/components/ai-consent-banner/index.js +1 -1
  103. package/dist/components/ai-tools-rail/ai-tools-rail.d.ts.map +1 -1
  104. package/dist/components/ai-tools-rail/index.js +1 -1
  105. package/dist/components/anamnesis-card/index.js +1 -1
  106. package/dist/components/appointment-card/index.js +1 -1
  107. package/dist/components/badge/badge.d.ts.map +1 -1
  108. package/dist/components/badge/index.js +1 -1
  109. package/dist/components/bishop-score/index.js +1 -1
  110. package/dist/components/bmi-calculator/index.js +1 -1
  111. package/dist/components/care-plan-card/index.js +1 -1
  112. package/dist/components/care-plan-entry-card/index.js +1 -1
  113. package/dist/components/clinical-note-card/index.js +1 -1
  114. package/dist/components/color-picker/color-picker.d.ts.map +1 -1
  115. package/dist/components/color-picker/index.js +1 -1
  116. package/dist/components/contact-profile-card/index.js +1 -1
  117. package/dist/components/cycle-calculator/index.js +1 -1
  118. package/dist/components/data-table/cell-renderers/actions-cell-renderer.d.ts +16 -0
  119. package/dist/components/data-table/cell-renderers/actions-cell-renderer.d.ts.map +1 -1
  120. package/dist/components/data-table/cell-renderers/tooth-cell-renderer.d.ts +12 -0
  121. package/dist/components/data-table/cell-renderers/tooth-cell-renderer.d.ts.map +1 -0
  122. package/dist/components/data-table/data-table.d.ts +1 -1
  123. package/dist/components/data-table/index.d.ts +2 -0
  124. package/dist/components/data-table/index.d.ts.map +1 -1
  125. package/dist/components/data-table/index.js +13 -12
  126. package/dist/components/data-table/toolbar.d.ts +5 -1
  127. package/dist/components/data-table/toolbar.d.ts.map +1 -1
  128. package/dist/components/dependent-selector/index.js +1 -1
  129. package/dist/components/document-scanner/index.js +1 -1
  130. package/dist/components/due-date-calculator/index.js +2 -2
  131. package/dist/components/fetal-weight/index.js +1 -1
  132. package/dist/components/gestational-age-calculator/index.js +1 -1
  133. package/dist/components/hcg-doubling/index.js +1 -1
  134. package/dist/components/message-card/index.js +1 -1
  135. package/dist/components/message-tray/index.js +1 -1
  136. package/dist/components/operator-hero/index.js +1 -1
  137. package/dist/components/patient-search/index.js +1 -1
  138. package/dist/components/patient-summary-card/index.js +1 -1
  139. package/dist/components/payment-card/index.js +1 -1
  140. package/dist/components/periodontal-chart-card/index.js +1 -1
  141. package/dist/components/practice-results/index.js +1 -1
  142. package/dist/components/pregnancy-dating/index.js +1 -1
  143. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  144. package/dist/components/rich-text-editor/editor-toolbar.d.ts +36 -2
  145. package/dist/components/rich-text-editor/editor-toolbar.d.ts.map +1 -1
  146. package/dist/components/rich-text-editor/index.js +1 -1
  147. package/dist/components/rich-text-editor/rich-text-editor.d.ts +2 -0
  148. package/dist/components/rich-text-editor/rich-text-editor.d.ts.map +1 -1
  149. package/dist/components/scroll-area/index.js +1 -1
  150. package/dist/components/scroll-area/scroll-area.d.ts.map +1 -1
  151. package/dist/components/sidebar/index.js +1 -1
  152. package/dist/components/sidebar/sidebar.d.ts.map +1 -1
  153. package/dist/components/suggestion-chip/index.js +1 -1
  154. package/dist/components/tab-bar/index.js +1 -1
  155. package/dist/components/tag/index.js +1 -1
  156. package/dist/components/tag/tag.d.ts.map +1 -1
  157. package/dist/components/transaction-chip/index.js +1 -1
  158. package/dist/components/transaction-chip/transaction-chip.d.ts.map +1 -1
  159. package/dist/components/unit-converter/index.js +1 -1
  160. package/dist/components/workflow/index.js +1 -1
  161. package/dist/i18n/locales/ar.d.ts +26 -0
  162. package/dist/i18n/locales/ar.d.ts.map +1 -1
  163. package/dist/i18n/locales/ar.js +27 -1
  164. package/dist/i18n/locales/ar.js.map +1 -1
  165. package/dist/i18n/locales/de.d.ts +26 -0
  166. package/dist/i18n/locales/de.d.ts.map +1 -1
  167. package/dist/i18n/locales/de.js +27 -1
  168. package/dist/i18n/locales/de.js.map +1 -1
  169. package/dist/i18n/locales/el.d.ts +26 -0
  170. package/dist/i18n/locales/el.d.ts.map +1 -1
  171. package/dist/i18n/locales/el.js +27 -1
  172. package/dist/i18n/locales/el.js.map +1 -1
  173. package/dist/i18n/locales/en.d.ts +26 -0
  174. package/dist/i18n/locales/en.d.ts.map +1 -1
  175. package/dist/i18n/locales/en.js +27 -1
  176. package/dist/i18n/locales/en.js.map +1 -1
  177. package/dist/i18n/locales/es.d.ts +26 -0
  178. package/dist/i18n/locales/es.d.ts.map +1 -1
  179. package/dist/i18n/locales/es.js +27 -1
  180. package/dist/i18n/locales/es.js.map +1 -1
  181. package/dist/i18n/locales/fr.d.ts +26 -0
  182. package/dist/i18n/locales/fr.d.ts.map +1 -1
  183. package/dist/i18n/locales/fr.js +27 -1
  184. package/dist/i18n/locales/fr.js.map +1 -1
  185. package/dist/i18n/locales/hi.d.ts +26 -0
  186. package/dist/i18n/locales/hi.d.ts.map +1 -1
  187. package/dist/i18n/locales/hi.js +27 -1
  188. package/dist/i18n/locales/hi.js.map +1 -1
  189. package/dist/i18n/locales/it.d.ts +26 -0
  190. package/dist/i18n/locales/it.d.ts.map +1 -1
  191. package/dist/i18n/locales/it.js +27 -1
  192. package/dist/i18n/locales/it.js.map +1 -1
  193. package/dist/i18n/locales/ja.d.ts +26 -0
  194. package/dist/i18n/locales/ja.d.ts.map +1 -1
  195. package/dist/i18n/locales/ja.js +27 -1
  196. package/dist/i18n/locales/ja.js.map +1 -1
  197. package/dist/i18n/locales/nl.d.ts +26 -0
  198. package/dist/i18n/locales/nl.d.ts.map +1 -1
  199. package/dist/i18n/locales/nl.js +25 -1
  200. package/dist/i18n/locales/nl.js.map +1 -1
  201. package/dist/i18n/locales/pl.d.ts +26 -0
  202. package/dist/i18n/locales/pl.d.ts.map +1 -1
  203. package/dist/i18n/locales/pl.js +27 -1
  204. package/dist/i18n/locales/pl.js.map +1 -1
  205. package/dist/i18n/locales/pt.d.ts +26 -0
  206. package/dist/i18n/locales/pt.d.ts.map +1 -1
  207. package/dist/i18n/locales/pt.js +27 -1
  208. package/dist/i18n/locales/pt.js.map +1 -1
  209. package/dist/i18n/locales/ro.d.ts +26 -0
  210. package/dist/i18n/locales/ro.d.ts.map +1 -1
  211. package/dist/i18n/locales/ro.js +27 -1
  212. package/dist/i18n/locales/ro.js.map +1 -1
  213. package/dist/i18n/locales/ru.d.ts +26 -0
  214. package/dist/i18n/locales/ru.d.ts.map +1 -1
  215. package/dist/i18n/locales/ru.js +27 -1
  216. package/dist/i18n/locales/ru.js.map +1 -1
  217. package/dist/i18n/locales/sq.d.ts +26 -0
  218. package/dist/i18n/locales/sq.d.ts.map +1 -1
  219. package/dist/i18n/locales/sq.js +27 -1
  220. package/dist/i18n/locales/sq.js.map +1 -1
  221. package/dist/i18n/locales/sv.d.ts +26 -0
  222. package/dist/i18n/locales/sv.d.ts.map +1 -1
  223. package/dist/i18n/locales/sv.js +25 -1
  224. package/dist/i18n/locales/sv.js.map +1 -1
  225. package/dist/i18n/locales/tr.d.ts +26 -0
  226. package/dist/i18n/locales/tr.d.ts.map +1 -1
  227. package/dist/i18n/locales/tr.js +27 -1
  228. package/dist/i18n/locales/tr.js.map +1 -1
  229. package/dist/i18n/locales/zh.d.ts +26 -0
  230. package/dist/i18n/locales/zh.d.ts.map +1 -1
  231. package/dist/i18n/locales/zh.js +25 -1
  232. package/dist/i18n/locales/zh.js.map +1 -1
  233. package/dist/index.js +509 -508
  234. package/dist/locales/ar.json +27 -1
  235. package/dist/locales/de.json +27 -1
  236. package/dist/locales/el.json +27 -1
  237. package/dist/locales/en.json +27 -1
  238. package/dist/locales/es.json +27 -1
  239. package/dist/locales/fr.json +27 -1
  240. package/dist/locales/hi.json +27 -1
  241. package/dist/locales/it.json +27 -1
  242. package/dist/locales/ja.json +27 -1
  243. package/dist/locales/nl.json +27 -1
  244. package/dist/locales/pl.json +27 -1
  245. package/dist/locales/pt.json +27 -1
  246. package/dist/locales/ro.json +27 -1
  247. package/dist/locales/ru.json +27 -1
  248. package/dist/locales/sq.json +27 -1
  249. package/dist/locales/sv.json +27 -1
  250. package/dist/locales/tr.json +27 -1
  251. package/dist/locales/zh.json +27 -1
  252. package/dist/patterns/alia-assistant/index.js +1 -1
  253. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  254. package/dist/patterns/patient-shell/index.js +1 -1
  255. package/dist/tokens.css +6 -3
  256. package/package.json +1 -1
  257. package/dist/_chunks/ai-tools-rail-JnlTqfS4.js.map +0 -1
  258. package/dist/_chunks/badge-zsf5i5bH.js.map +0 -1
  259. package/dist/_chunks/color-picker-9tL7pz5y.js.map +0 -1
  260. package/dist/_chunks/editable-currency-cell-renderer-CFqQc56y.js.map +0 -1
  261. package/dist/_chunks/insert-result-DIAG3ltJ.js.map +0 -1
  262. package/dist/_chunks/rich-text-editor-u36FqSWz.js +0 -1190
  263. package/dist/_chunks/rich-text-editor-u36FqSWz.js.map +0 -1
  264. package/dist/_chunks/scroll-area-BWqCkEGz.js.map +0 -1
  265. package/dist/_chunks/sidebar-DPEHzxLZ.js.map +0 -1
  266. package/dist/_chunks/suggestion-chip-C4kxWUIs.js.map +0 -1
  267. package/dist/_chunks/tag-CdA0s_VV.js.map +0 -1
  268. package/dist/_chunks/transaction-chip-BZCa6XDn.js.map +0 -1
  269. package/dist/_chunks/type-DZ5OMRA2.js.map +0 -1
  270. package/dist/_chunks/workflow-map-BX3JY1Bu.js.map +0 -1
@@ -1,9 +1,9 @@
1
- import { jsx as r, jsxs as f } from "react/jsx-runtime";
2
- import { forwardRef as q, useRef as F, useState as E, useEffect as G } from "react";
1
+ import { jsx as e, jsxs as f } from "react/jsx-runtime";
2
+ import { forwardRef as X, useRef as q, useState as E, useEffect as F } from "react";
3
3
  import { c as B } from "./index-D2ZczOXr.js";
4
- import { useTranslation as H } from "react-i18next";
4
+ import { useTranslation as G } from "react-i18next";
5
5
  import { T as v } from "./tooltip-DvmfrNvB.js";
6
- import { X as J } from "./x-CCcI3eJp.js";
6
+ import { X as H } from "./x-CCcI3eJp.js";
7
7
  const V = B(
8
8
  [
9
9
  "ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]",
@@ -26,7 +26,10 @@ const V = B(
26
26
  brand: ""
27
27
  },
28
28
  fill: {
29
- solid: "",
29
+ // Solid chips carry a subtle, theme-aware border (a low-opacity
30
+ // foreground mix) so they read as a defined chip on any surface, not a
31
+ // floating fill — works across every colour variant, light and dark.
32
+ solid: "ds:border ds:border-[color:color-mix(in_srgb,var(--foreground)_15%,transparent)]",
30
33
  outline: "ds:border ds:border-[color:var(--border)] ds:bg-transparent"
31
34
  },
32
35
  size: {
@@ -43,7 +46,7 @@ const V = B(
43
46
  {
44
47
  fill: "solid",
45
48
  variant: "neutral",
46
- className: "ds:bg-muted/20 ds:text-muted-foreground"
49
+ className: "ds:bg-muted/20 ds:text-muted-foreground ds:border-[color:var(--border)]"
47
50
  },
48
51
  {
49
52
  fill: "solid",
@@ -74,7 +77,7 @@ const V = B(
74
77
  {
75
78
  fill: "outline",
76
79
  variant: "neutral",
77
- className: "ds:border-muted ds:text-muted-foreground"
80
+ className: "ds:border-[color:var(--border)] ds:text-muted-foreground"
78
81
  },
79
82
  {
80
83
  fill: "outline",
@@ -108,7 +111,7 @@ const V = B(
108
111
  size: "md"
109
112
  }
110
113
  }
111
- ), L = B(
114
+ ), J = B(
112
115
  [
113
116
  "ds:inline-flex ds:items-center ds:justify-center ds:shrink-0 ds:rounded-full",
114
117
  // Negative end margin keeps the button flush with the pill edge
@@ -129,48 +132,48 @@ const V = B(
129
132
  },
130
133
  defaultVariants: { size: "md" }
131
134
  }
132
- ), M = q(
135
+ ), L = X(
133
136
  ({
134
137
  label: o,
135
138
  variant: g = "neutral",
136
139
  fill: p = "solid",
137
- size: a = "md",
140
+ size: t = "md",
138
141
  leading: m,
139
- onRemove: t,
142
+ onRemove: a,
140
143
  onClick: b,
141
- disabled: e = !1,
144
+ disabled: r = !1,
142
145
  maxInlineSize: n = "none",
143
146
  className: h
144
147
  }, i) => {
145
- const { t: w } = H(), y = F(null), [D, C] = E(!1), [O, R] = E("");
146
- G(() => {
148
+ const { t: w } = G(), y = q(null), [D, C] = E(!1), [O, R] = E("");
149
+ F(() => {
147
150
  const s = y.current;
148
151
  if (!s || n === "none") return;
149
152
  const z = () => C(s.scrollWidth > s.clientWidth), j = new ResizeObserver(z);
150
153
  return j.observe(s), z(), () => j.disconnect();
151
154
  }, [n]);
152
155
  const W = (s) => {
153
- (s.key === "Backspace" || s.key === "Delete") && t && !e && (s.preventDefault(), x(), setTimeout(t, 100));
156
+ (s.key === "Backspace" || s.key === "Delete") && a && !r && (s.preventDefault(), x(), setTimeout(a, 100));
154
157
  }, x = () => {
155
158
  R(w("tag.removed", { label: o }));
156
159
  }, K = () => {
157
- !e && t && (x(), setTimeout(t, 100));
158
- }, d = !!t, N = !!b && !d, T = V({
160
+ !r && a && (x(), setTimeout(a, 100));
161
+ }, d = !!a, N = !!b && !d, T = V({
159
162
  variant: g,
160
163
  fill: p,
161
- size: a,
164
+ size: t,
162
165
  className: [
163
- N && !e ? "ds:hover:brightness-90 ds:cursor-pointer" : "",
166
+ N && !r ? "ds:hover:brightness-90 ds:cursor-pointer" : "",
164
167
  h ?? ""
165
168
  ].filter(Boolean).join(" ")
166
- }), l = m ? /* @__PURE__ */ r(
169
+ }), l = m ? /* @__PURE__ */ e(
167
170
  "span",
168
171
  {
169
172
  "aria-hidden": "true",
170
173
  className: "ds:shrink-0 ds:inline-flex ds:items-center ds:[&>svg]:size-3.5",
171
174
  children: m
172
175
  }
173
- ) : null, c = /* @__PURE__ */ r(
176
+ ) : null, c = /* @__PURE__ */ e(
174
177
  "span",
175
178
  {
176
179
  ref: y,
@@ -178,16 +181,16 @@ const V = B(
178
181
  style: n !== "none" ? { maxInlineSize: n } : void 0,
179
182
  children: o
180
183
  }
181
- ), A = /* @__PURE__ */ r("span", { role: "status", "aria-live": "polite", className: "ds:sr-only", children: O }), X = d ? /* @__PURE__ */ r(
184
+ ), _ = /* @__PURE__ */ e("span", { role: "status", "aria-live": "polite", className: "ds:sr-only", children: O }), A = d ? /* @__PURE__ */ e(
182
185
  "button",
183
186
  {
184
187
  type: "button",
185
188
  "aria-label": w("tag.remove", { label: o }),
186
189
  onClick: K,
187
- disabled: e,
190
+ disabled: r,
188
191
  tabIndex: -1,
189
- className: L({ size: a }),
190
- children: /* @__PURE__ */ r(J, { "aria-hidden": "true" })
192
+ className: J({ size: t }),
193
+ children: /* @__PURE__ */ e(H, { "aria-hidden": "true" })
191
194
  }
192
195
  ) : null, u = n !== "none" && D;
193
196
  if (N) {
@@ -196,8 +199,8 @@ const V = B(
196
199
  {
197
200
  ref: i,
198
201
  type: "button",
199
- onClick: e ? void 0 : b,
200
- disabled: e,
202
+ onClick: r ? void 0 : b,
203
+ disabled: r,
201
204
  "data-component": "tag",
202
205
  className: T,
203
206
  children: [
@@ -206,7 +209,7 @@ const V = B(
206
209
  ]
207
210
  }
208
211
  );
209
- return u ? /* @__PURE__ */ r(v, { label: o, children: s }) : s;
212
+ return u ? /* @__PURE__ */ e(v, { label: o, children: s }) : s;
210
213
  }
211
214
  if (d) {
212
215
  const s = (
@@ -217,39 +220,39 @@ const V = B(
217
220
  ref: i,
218
221
  role: "group",
219
222
  "aria-label": o,
220
- tabIndex: e ? -1 : 0,
221
- "aria-disabled": e || void 0,
223
+ tabIndex: r ? -1 : 0,
224
+ "aria-disabled": r || void 0,
222
225
  onKeyDown: W,
223
226
  "data-component": "tag",
224
227
  className: T,
225
228
  children: [
226
- A,
229
+ _,
227
230
  l,
228
231
  c,
229
- X
232
+ A
230
233
  ]
231
234
  }
232
235
  )
233
236
  );
234
- return u ? /* @__PURE__ */ r(v, { label: o, children: s }) : s;
237
+ return u ? /* @__PURE__ */ e(v, { label: o, children: s }) : s;
235
238
  }
236
239
  const k = /* @__PURE__ */ f(
237
240
  "span",
238
241
  {
239
242
  ref: i,
240
243
  "data-component": "tag",
241
- className: V({ variant: g, fill: p, size: a, className: h }),
244
+ className: V({ variant: g, fill: p, size: t, className: h }),
242
245
  children: [
243
246
  l,
244
247
  c
245
248
  ]
246
249
  }
247
250
  );
248
- return u ? /* @__PURE__ */ r(v, { label: o, children: k }) : k;
251
+ return u ? /* @__PURE__ */ e(v, { label: o, children: k }) : k;
249
252
  }
250
253
  );
251
- M.displayName = "Tag";
254
+ L.displayName = "Tag";
252
255
  export {
253
- M as T
256
+ L as T
254
257
  };
255
- //# sourceMappingURL=tag-CdA0s_VV.js.map
258
+ //# sourceMappingURL=tag-BQXwuJq1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag-BQXwuJq1.js","sources":["../../src/components/tag/tag.tsx"],"sourcesContent":["import { forwardRef, useRef, useState, useEffect, type ReactNode } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport { Tooltip } from '../tooltip';\n\n/* ------------------------------------------------------------------ */\n/* CVA — tag pill */\n/* ------------------------------------------------------------------ */\n\nconst tagVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)]',\n 'type-eyebrow ds:whitespace-nowrap',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:aria-disabled:cursor-not-allowed ds:aria-disabled:opacity-50',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n ].join(' '),\n {\n variants: {\n variant: {\n neutral: '',\n info: '',\n success: '',\n warning: '',\n error: '',\n brand: '',\n },\n fill: {\n // Solid chips carry a subtle, theme-aware border (a low-opacity\n // foreground mix) so they read as a defined chip on any surface, not a\n // floating fill — works across every colour variant, light and dark.\n solid:\n 'ds:border ds:border-[color:color-mix(in_srgb,var(--foreground)_15%,transparent)]',\n outline: 'ds:border ds:border-[color:var(--border)] ds:bg-transparent',\n },\n size: {\n // Symmetric start/end padding — close button uses negative margin to stay flush.\n // Size is the only eyebrow-role axis that varies per Tag size; weight, transform,\n // tracking, line-height, and features all come from `.type-eyebrow` on the base.\n sm: 'ds:h-[calc(var(--spacing)*4)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:[--type-eyebrow-size:var(--font-size-2xs)]',\n md: 'ds:h-[calc(var(--spacing)*5)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:[--type-eyebrow-size:var(--font-size-2xs)]',\n lg: 'ds:h-[calc(var(--spacing)*6)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:[--type-eyebrow-size:var(--font-size-xs)]',\n },\n },\n compoundVariants: [\n // Solid fills — foreground tokens adapt per theme\n {\n fill: 'solid',\n variant: 'neutral',\n className:\n 'ds:bg-muted/20 ds:text-muted-foreground ds:border-[color:var(--border)]',\n },\n {\n fill: 'solid',\n variant: 'info',\n className: 'ds:bg-info ds:text-[color:var(--info-solid-foreground)]',\n },\n {\n fill: 'solid',\n variant: 'success',\n className:\n 'ds:bg-success ds:text-[color:var(--success-solid-foreground)]',\n },\n {\n fill: 'solid',\n variant: 'warning',\n className: 'ds:bg-warning ds:text-foreground',\n },\n {\n fill: 'solid',\n variant: 'error',\n className: 'ds:bg-destructive ds:text-destructive-foreground',\n },\n {\n fill: 'solid',\n variant: 'brand',\n className: 'ds:bg-primary ds:text-primary-foreground',\n },\n // Outline fills\n {\n fill: 'outline',\n variant: 'neutral',\n className: 'ds:border-[color:var(--border)] ds:text-muted-foreground',\n },\n {\n fill: 'outline',\n variant: 'info',\n className: 'ds:border-info ds:text-[var(--info-foreground)]',\n },\n {\n fill: 'outline',\n variant: 'success',\n className: 'ds:border-success ds:text-[var(--success-foreground)]',\n },\n {\n fill: 'outline',\n variant: 'warning',\n className: 'ds:border-warning ds:text-[var(--warning-foreground)]',\n },\n {\n fill: 'outline',\n variant: 'error',\n className: 'ds:border-destructive ds:text-[var(--error-foreground)]',\n },\n {\n fill: 'outline',\n variant: 'brand',\n className: 'ds:border-primary ds:text-primary',\n },\n ],\n defaultVariants: {\n variant: 'neutral',\n fill: 'solid',\n size: 'md',\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* CVA — close button */\n/* ------------------------------------------------------------------ */\n\nconst closeButtonVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center ds:shrink-0 ds:rounded-full',\n // Negative end margin keeps the button flush with the pill edge\n 'ds:-me-[var(--spacing-xs)]',\n 'ds:hover:bg-foreground/10',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:p-1 ds:[&>svg]:size-3',\n md: 'ds:p-1 ds:[&>svg]:size-3.5',\n lg: 'ds:p-1.5 ds:[&>svg]:size-4',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* TagProps */\n/* ------------------------------------------------------------------ */\n\nexport interface TagProps {\n /** The visible label text */\n label: string;\n /** Semantic colour variant */\n variant?: 'neutral' | 'info' | 'success' | 'warning' | 'error' | 'brand';\n /** Visual fill style */\n fill?: 'solid' | 'outline';\n /** Size */\n size?: 'sm' | 'md' | 'lg';\n /** Leading slot — icon element or dot */\n leading?: ReactNode;\n /** Called when the tag is removed (enables close button + Backspace/Delete) */\n onRemove?: () => void;\n /** Called when the tag is clicked (non-removable interactive tag) */\n onClick?: () => void;\n /** Disabled state */\n disabled?: boolean;\n /** Max inline size before truncation with tooltip — default 'none' */\n maxInlineSize?: string | 'none';\n /** Additional class names */\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Tag */\n/* ------------------------------------------------------------------ */\n\nexport const Tag = forwardRef<HTMLElement, TagProps>(\n (\n {\n label,\n variant = 'neutral',\n fill = 'solid',\n size = 'md',\n leading,\n onRemove,\n onClick,\n disabled = false,\n maxInlineSize = 'none',\n className,\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const labelRef = useRef<HTMLSpanElement>(null);\n const [isOverflowing, setIsOverflowing] = useState(false);\n const [announcement, setAnnouncement] = useState('');\n\n useEffect(() => {\n const el = labelRef.current;\n if (!el || maxInlineSize === 'none') return;\n\n const check = () => setIsOverflowing(el.scrollWidth > el.clientWidth);\n const observer = new ResizeObserver(check);\n observer.observe(el);\n check();\n return () => observer.disconnect();\n }, [maxInlineSize]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (\n (e.key === 'Backspace' || e.key === 'Delete') &&\n onRemove &&\n !disabled\n ) {\n e.preventDefault();\n announce();\n // Delay gives the live region one render cycle before unmount\n setTimeout(onRemove, 100);\n }\n };\n\n const announce = () => {\n setAnnouncement(t('tag.removed', { label }));\n };\n\n const handleRemove = () => {\n if (!disabled && onRemove) {\n announce();\n setTimeout(onRemove, 100);\n }\n };\n\n const isRemovable = !!onRemove;\n const isClickable = !!onClick && !isRemovable;\n\n const rootClasses = tagVariants({\n variant,\n fill,\n size,\n className: [\n isClickable && !disabled\n ? 'ds:hover:brightness-90 ds:cursor-pointer'\n : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' '),\n });\n\n const leadingEl = leading ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:shrink-0 ds:inline-flex ds:items-center ds:[&>svg]:size-3.5\"\n >\n {leading}\n </span>\n ) : null;\n\n // Consumer-controlled layout constraint — not a design token.\n // maxInlineSize is an arbitrary caller-supplied value that cannot be expressed\n // as a static Tailwind class; the style prop is the only cross-browser option.\n const labelEl = (\n <span\n ref={labelRef}\n className={\n maxInlineSize !== 'none'\n ? 'ds:overflow-hidden ds:text-ellipsis ds:whitespace-nowrap'\n : undefined\n }\n // eslint-disable-next-line react/forbid-dom-props -- caller-supplied maxInlineSize, runtime-computed\n style={maxInlineSize !== 'none' ? { maxInlineSize } : undefined}\n >\n {label}\n </span>\n );\n\n // Live region — only for removable tags; must be a sibling outside the button.\n const liveRegion = (\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {announcement}\n </span>\n );\n\n const closeButton = isRemovable ? (\n <button\n type=\"button\"\n aria-label={t('tag.remove', { label })}\n onClick={handleRemove}\n disabled={disabled}\n // Intentionally excluded from tab order: Backspace/Delete on the focused\n // group element provides the same keyboard action.\n tabIndex={-1}\n className={closeButtonVariants({ size })}\n >\n <X aria-hidden=\"true\" />\n </button>\n ) : null;\n\n const shouldWrapTooltip = maxInlineSize !== 'none' && isOverflowing;\n\n // Clickable tag — renders as <button>; live region is a sibling, not inside button\n if (isClickable) {\n const tagEl = (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n onClick={!disabled ? onClick : undefined}\n disabled={disabled}\n data-component=\"tag\"\n className={rootClasses}\n >\n {leadingEl}\n {labelEl}\n </button>\n );\n return shouldWrapTooltip ? (\n <Tooltip label={label}>{tagEl}</Tooltip>\n ) : (\n tagEl\n );\n }\n\n // Removable tag — focusable <span> with embedded close button\n if (isRemovable) {\n const tagEl = (\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- removable tag is focusable as a group; Backspace/Delete keyboard removal handled via onKeyDown\n <span\n ref={ref as React.Ref<HTMLSpanElement>}\n role=\"group\"\n aria-label={label}\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n onKeyDown={handleKeyDown}\n data-component=\"tag\"\n className={rootClasses}\n >\n {liveRegion}\n {leadingEl}\n {labelEl}\n {closeButton}\n </span>\n );\n return shouldWrapTooltip ? (\n <Tooltip label={label}>{tagEl}</Tooltip>\n ) : (\n tagEl\n );\n }\n\n // Decorative tag — plain <span>, no interactive role\n const tagEl = (\n <span\n ref={ref as React.Ref<HTMLSpanElement>}\n data-component=\"tag\"\n className={tagVariants({ variant, fill, size, className })}\n >\n {leadingEl}\n {labelEl}\n </span>\n );\n return shouldWrapTooltip ? <Tooltip label={label}>{tagEl}</Tooltip> : tagEl;\n },\n);\n\nTag.displayName = 'Tag';\n"],"names":["tagVariants","cva","closeButtonVariants","Tag","forwardRef","label","variant","fill","size","leading","onRemove","onClick","disabled","maxInlineSize","className","ref","t","useTranslation","labelRef","useRef","isOverflowing","setIsOverflowing","useState","announcement","setAnnouncement","useEffect","el","check","observer","handleKeyDown","e","announce","handleRemove","isRemovable","isClickable","rootClasses","leadingEl","jsx","labelEl","liveRegion","closeButton","X","shouldWrapTooltip","tagEl","jsxs","Tooltip"],"mappings":"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"}
@@ -65,15 +65,15 @@ const L = [
65
65
  // Text uses the deeper `*-foreground` token (matching Badge / Tag) so
66
66
  // small chip text clears WCAG AA (4.5:1) against the 10% tinted
67
67
  // background. The surface and border use the lighter alias.
68
- debt: "ds:bg-destructive/10 ds:text-[color:var(--error-foreground)] ds:border-destructive/20",
69
- credit: "ds:bg-success/10 ds:text-[color:var(--success-foreground)] ds:border-success/20",
68
+ debt: "ds:bg-destructive/10 ds:text-[color:var(--error-foreground)] ds:border-[color:var(--error-foreground)]",
69
+ credit: "ds:bg-success/10 ds:text-[color:var(--success-foreground)] ds:border-[color:var(--success-foreground)]",
70
70
  // The orange "to-invoice" tint has no kit-wide semantic alias — see
71
71
  // src/tokens/index.css §Transaction-chip-scoped tokens. The component
72
72
  // owns the alias because the customer-anchored "Da fatturare" orange
73
73
  // is distinct from `--warning` (yellow) and from `--destructive`.
74
- "to-invoice": "ds:bg-transaction-chip-to-invoice/10 ds:text-[color:var(--transaction-chip-to-invoice-foreground)] ds:border-transaction-chip-to-invoice/20",
75
- "to-deliver": "ds:bg-info/10 ds:text-[color:var(--info-foreground)] ds:border-info/20",
76
- settled: "ds:bg-muted/30 ds:text-muted-foreground ds:border-muted/40"
74
+ "to-invoice": "ds:bg-transaction-chip-to-invoice/10 ds:text-[color:var(--transaction-chip-to-invoice-foreground)] ds:border-[color:var(--transaction-chip-to-invoice-foreground)]",
75
+ "to-deliver": "ds:bg-info/10 ds:text-[color:var(--info-foreground)] ds:border-[color:var(--info-foreground)]",
76
+ settled: "ds:bg-muted/30 ds:text-muted-foreground ds:border-[color:var(--border)]"
77
77
  },
78
78
  size: {
79
79
  // Heights tuned for table-cell density (sm), default app surfaces (md),
@@ -116,24 +116,24 @@ const L = [
116
116
  ), G = T(
117
117
  ({
118
118
  state: e,
119
- amount: m,
120
- currency: t = D,
121
- locale: v,
122
- size: r = "md",
119
+ amount: v,
120
+ currency: r = D,
121
+ locale: m,
122
+ size: t = "md",
123
123
  showLabel: f = !1,
124
- className: p,
125
- "aria-label": u,
124
+ className: u,
125
+ "aria-label": p,
126
126
  ...g
127
127
  }, b) => {
128
- const { t: o, i18n: h } = C(), a = v ?? h.language ?? "en", x = F[e], i = M[e], n = Math.abs(m), y = new Intl.NumberFormat(a, {
128
+ const { t: o, i18n: h } = C(), a = m ?? h.language ?? "en", x = F[e], i = M[e], n = Math.abs(v), y = new Intl.NumberFormat(a, {
129
129
  style: "currency",
130
- currency: t,
130
+ currency: r,
131
131
  signDisplay: "never"
132
132
  }).format(n), d = o(`financial.state.${S[e]}`), w = new Intl.NumberFormat(a, {
133
133
  style: "currency",
134
- currency: t,
134
+ currency: r,
135
135
  signDisplay: e === "debt" ? "always" : "auto"
136
- }).format(n * V[e]), z = u ?? o("financial.aria.label", {
136
+ }).format(n * V[e]), z = p ?? o("financial.aria.label", {
137
137
  state: d,
138
138
  amount: w
139
139
  });
@@ -147,13 +147,13 @@ const L = [
147
147
  "data-state": e,
148
148
  className: U({
149
149
  state: e,
150
- size: r,
150
+ size: t,
151
151
  bold: e !== "settled",
152
- className: p
152
+ className: u
153
153
  }),
154
154
  ...g,
155
155
  children: [
156
- /* @__PURE__ */ s("span", { "aria-hidden": "true", className: j({ size: r }), children: /* @__PURE__ */ s(x, {}) }),
156
+ /* @__PURE__ */ s("span", { "aria-hidden": "true", className: j({ size: t }), children: /* @__PURE__ */ s(x, {}) }),
157
157
  f && /* @__PURE__ */ s("span", { "aria-hidden": "true", className: "type-eyebrow", children: d }),
158
158
  i && /* @__PURE__ */ s(
159
159
  "span",
@@ -182,4 +182,4 @@ export {
182
182
  G as T,
183
183
  R as a
184
184
  };
185
- //# sourceMappingURL=transaction-chip-BZCa6XDn.js.map
185
+ //# sourceMappingURL=transaction-chip-BrW8P50O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction-chip-BrW8P50O.js","sources":["../../node_modules/lucide-react/dist/esm/icons/arrow-down-left.js","../../node_modules/lucide-react/dist/esm/icons/arrow-up-right.js","../../src/components/transaction-chip/transaction-chip.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M17 7 7 17\", key: \"15tmo1\" }],\n [\"path\", { d: \"M17 17H7V7\", key: \"1org7z\" }]\n];\nconst ArrowDownLeft = createLucideIcon(\"arrow-down-left\", __iconNode);\n\nexport { __iconNode, ArrowDownLeft as default };\n//# sourceMappingURL=arrow-down-left.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M7 7h10v10\", key: \"1tivn9\" }],\n [\"path\", { d: \"M7 17 17 7\", key: \"1vkiza\" }]\n];\nconst ArrowUpRight = createLucideIcon(\"arrow-up-right\", __iconNode);\n\nexport { __iconNode, ArrowUpRight as default };\n//# sourceMappingURL=arrow-up-right.js.map\n","import { forwardRef, type HTMLAttributes } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n ArrowDownLeft,\n ArrowUpRight,\n CalendarClock,\n Check,\n FileText,\n type LucideIcon,\n} from 'lucide-react';\n\n/* ------------------------------------------------------------------ */\n/* State vocabulary */\n/* ------------------------------------------------------------------ */\n\nexport type TransactionState =\n | 'debt'\n | 'credit'\n | 'to-invoice'\n | 'to-deliver'\n | 'settled';\n\n// State → translation-key segment. Hyphenated state names are flattened to\n// camelCase so the i18next bundle stays consistent with the rest of `ui.*`.\nconst STATE_KEY: Record<TransactionState, string> = {\n debt: 'debt',\n credit: 'credit',\n 'to-invoice': 'toInvoice',\n 'to-deliver': 'toDeliver',\n settled: 'settled',\n};\n\nconst STATE_ICON: Record<TransactionState, LucideIcon> = {\n debt: ArrowDownLeft,\n credit: ArrowUpRight,\n 'to-invoice': FileText,\n 'to-deliver': CalendarClock,\n settled: Check,\n};\n\n// U+2212 MINUS SIGN — matches PR alfadocs/platform#523's typographic minus.\n// Hyphen-minus would render visually narrower next to the currency glyph.\nconst STATE_SIGN: Record<TransactionState, '' | '+' | '−'> = {\n debt: '−',\n credit: '+',\n 'to-invoice': '',\n 'to-deliver': '',\n settled: '',\n};\n\n// Multiplier used when composing the screen-reader announcement so SR users\n// hear the signed amount Intl produces (\"minus one thousand…\") rather than\n// the magnitude plus a separate sign glyph.\nconst SIGN_MULTIPLIER: Record<TransactionState, -1 | 1> = {\n debt: -1,\n credit: 1,\n 'to-invoice': 1,\n 'to-deliver': 1,\n settled: 1,\n};\n\nconst DEFAULT_CURRENCY = 'EUR';\n\n/* ------------------------------------------------------------------ */\n/* CVA — chip root */\n/* ------------------------------------------------------------------ */\n\nconst chipVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)] ds:border',\n 'ds:whitespace-nowrap ds:align-middle',\n 'ds:focus-visible:outline-none',\n 'ds:focus-visible:ring-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:ring-[color:var(--ring)]',\n 'ds:focus-visible:ring-offset-[length:var(--focus-ring-offset)]',\n ].join(' '),\n {\n variants: {\n state: {\n // Text uses the deeper `*-foreground` token (matching Badge / Tag) so\n // small chip text clears WCAG AA (4.5:1) against the 10% tinted\n // background. The surface and border use the lighter alias.\n debt: 'ds:bg-destructive/10 ds:text-[color:var(--error-foreground)] ds:border-[color:var(--error-foreground)]',\n credit:\n 'ds:bg-success/10 ds:text-[color:var(--success-foreground)] ds:border-[color:var(--success-foreground)]',\n // The orange \"to-invoice\" tint has no kit-wide semantic alias — see\n // src/tokens/index.css §Transaction-chip-scoped tokens. The component\n // owns the alias because the customer-anchored \"Da fatturare\" orange\n // is distinct from `--warning` (yellow) and from `--destructive`.\n 'to-invoice':\n 'ds:bg-transaction-chip-to-invoice/10 ds:text-[color:var(--transaction-chip-to-invoice-foreground)] ds:border-[color:var(--transaction-chip-to-invoice-foreground)]',\n 'to-deliver':\n 'ds:bg-info/10 ds:text-[color:var(--info-foreground)] ds:border-[color:var(--info-foreground)]',\n settled:\n 'ds:bg-muted/30 ds:text-muted-foreground ds:border-[color:var(--border)]',\n },\n size: {\n // Heights tuned for table-cell density (sm), default app surfaces (md),\n // and header / summary cards (lg). `--type-eyebrow-size` flows into the\n // optional label span, keeping its typography in step with the chip.\n sm: 'ds:h-5 ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-sm)] ds:text-[length:var(--font-size-2xs)] ds:[--type-eyebrow-size:var(--font-size-2xs)]',\n md: 'ds:h-6 ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:text-[length:var(--font-size-xs)] ds:[--type-eyebrow-size:var(--font-size-2xs)]',\n lg: 'ds:h-7 ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-md)] ds:text-[length:var(--font-size-sm)] ds:[--type-eyebrow-size:var(--font-size-xs)]',\n },\n bold: {\n // `settled` is the terminal resting state — see compound variant below.\n true: 'ds:font-semibold',\n false: 'ds:font-medium',\n },\n },\n defaultVariants: {\n state: 'debt',\n size: 'md',\n bold: true,\n },\n compoundVariants: [\n // `settled` always renders at the lighter weight, regardless of the\n // resolved default. Mirrors PR #523's follow-up where the resting branch\n // dropped from bold to medium to recede visually.\n { state: 'settled', class: 'ds:font-medium' },\n ],\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* CVA — icon wrapper */\n/* ------------------------------------------------------------------ */\n\n// `ArrowDownLeft` (debt) and `ArrowUpRight` (credit) are direction-encoded\n// glyphs — their physical orientation carries the semantic (\"money coming\n// in\" / \"money going out\"). PRS §05 RTL: directional icons flip in RTL.\n// The non-directional glyphs (FileText, CalendarClock, Check) are unaffected.\nconst iconWrapperVariants = cva(\n 'ds:shrink-0 ds:[&>svg]:block ds:rtl:[&>svg]:-scale-x-100',\n {\n variants: {\n size: {\n sm: 'ds:[&>svg]:size-3',\n md: 'ds:[&>svg]:size-3.5',\n lg: 'ds:[&>svg]:size-4',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Props */\n/* ------------------------------------------------------------------ */\n\nexport interface TransactionChipProps\n extends\n Omit<HTMLAttributes<HTMLSpanElement>, 'children'>,\n Pick<VariantProps<typeof chipVariants>, 'size'> {\n /** Financial state — drives colour, icon, sign, and label. */\n state: TransactionState;\n /**\n * Magnitude of the amount as a non-negative number. The sign is rendered\n * separately based on `state` — callers must never pass a negative value.\n */\n amount: number;\n /**\n * ISO 4217 currency code. Defaults to `EUR` for the Italian-anchored\n * release. Required at the type level so consumers can't silently render\n * a different currency than they intended.\n */\n currency?: string;\n /** BCP 47 locale override. Defaults to the active i18next language. */\n locale?: string;\n /** Render the state label (e.g. \"Da incassare\") before the amount. */\n showLabel?: boolean;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const TransactionChip = forwardRef<\n HTMLSpanElement,\n TransactionChipProps\n>(\n (\n {\n state,\n amount,\n currency = DEFAULT_CURRENCY,\n locale,\n size = 'md',\n showLabel = false,\n className,\n 'aria-label': ariaLabelProp,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const activeLocale = locale ?? i18n.language ?? 'en';\n\n const StateIcon = STATE_ICON[state];\n const sign = STATE_SIGN[state];\n const magnitude = Math.abs(amount);\n\n // The visible amount is rendered without a sign; the leading sign glyph\n // (or its absence) is owned by the state, not the formatter.\n const formattedAmount = new Intl.NumberFormat(activeLocale, {\n style: 'currency',\n currency,\n signDisplay: 'never',\n }).format(magnitude);\n\n // The accessible name uses Intl's own signed output so screen readers\n // announce the locale-correct \"minus\" / \"negative\" phrasing instead of\n // skipping the U+2212 glyph or speaking it as \"hyphen\".\n const stateLabel = t(`financial.state.${STATE_KEY[state]}`);\n const signedAmountForSR = new Intl.NumberFormat(activeLocale, {\n style: 'currency',\n currency,\n signDisplay: state === 'debt' ? 'always' : 'auto',\n }).format(magnitude * SIGN_MULTIPLIER[state]);\n const ariaLabel =\n ariaLabelProp ??\n t('financial.aria.label', {\n state: stateLabel,\n amount: signedAmountForSR,\n });\n\n return (\n <span\n ref={ref}\n role=\"img\"\n aria-label={ariaLabel}\n data-component=\"transaction-chip\"\n data-state={state}\n className={chipVariants({\n state,\n size,\n bold: state !== 'settled',\n className,\n })}\n {...rest}\n >\n <span aria-hidden=\"true\" className={iconWrapperVariants({ size })}>\n <StateIcon />\n </span>\n {showLabel && (\n <span aria-hidden=\"true\" className=\"type-eyebrow\">\n {stateLabel}\n </span>\n )}\n {sign && (\n <span\n aria-hidden=\"true\"\n className=\"ds:[font-variant-numeric:var(--font-feature-tabular)]\"\n >\n {sign}\n </span>\n )}\n <span\n aria-hidden=\"true\"\n className=\"ds:[font-variant-numeric:var(--font-feature-tabular)]\"\n >\n {formattedAmount}\n </span>\n </span>\n );\n },\n);\n\nTransactionChip.displayName = 'TransactionChip';\n"],"names":["__iconNode","ArrowDownLeft","createLucideIcon","ArrowUpRight","STATE_KEY","STATE_ICON","FileText","CalendarClock","Check","STATE_SIGN","SIGN_MULTIPLIER","DEFAULT_CURRENCY","chipVariants","cva","iconWrapperVariants","TransactionChip","forwardRef","state","amount","currency","locale","size","showLabel","className","ariaLabelProp","rest","ref","t","i18n","useTranslation","activeLocale","StateIcon","sign","magnitude","formattedAmount","stateLabel","signedAmountForSR","ariaLabel","jsxs","jsx"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -0,0 +1,18 @@
1
+ import { c as a } from "./createLucideIcon-CrFbzy84.js";
2
+ /**
3
+ * @license lucide-react v1.8.0 - ISC
4
+ *
5
+ * This source code is licensed under the ISC license.
6
+ * See the LICENSE file in the root directory of this source tree.
7
+ */
8
+ const t = [
9
+ ["path", { d: "M10 11v6", key: "nco0om" }],
10
+ ["path", { d: "M14 11v6", key: "outv1u" }],
11
+ ["path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6", key: "miytrc" }],
12
+ ["path", { d: "M3 6h18", key: "d0wm0j" }],
13
+ ["path", { d: "M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2", key: "e791ji" }]
14
+ ], o = a("trash-2", t);
15
+ export {
16
+ o as T
17
+ };
18
+ //# sourceMappingURL=trash-2-rPAKaRgB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trash-2-rPAKaRgB.js","sources":["../../node_modules/lucide-react/dist/esm/icons/trash-2.js"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 11v6\", key: \"nco0om\" }],\n [\"path\", { d: \"M14 11v6\", key: \"outv1u\" }],\n [\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\", key: \"miytrc\" }],\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\", key: \"e791ji\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n"],"names":["__iconNode","Trash2","createLucideIcon"],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMA,IAAa;AAAA,EACjB,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAAA,EACzC,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAAA,EACzC,CAAC,QAAQ,EAAE,GAAG,4CAA4C,KAAK,SAAQ,CAAE;AAAA,EACzE,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAQ,CAAE;AAAA,EACxC,CAAC,QAAQ,EAAE,GAAG,0CAA0C,KAAK,SAAQ,CAAE;AACzE,GACMC,IAASC,EAAiB,WAAWF,CAAU;","x_google_ignoreList":[0]}
@@ -5,7 +5,7 @@ import { useTranslation as j } from "react-i18next";
5
5
  import { F as v } from "./form-field-BOm9hK35.js";
6
6
  import { N as B } from "./number-input-Dj5L3pXK.js";
7
7
  import { S as C } from "./select-CEtRcon5.js";
8
- import { I as L } from "./insert-result-DIAG3ltJ.js";
8
+ import { I as L } from "./insert-result-njqBthzT.js";
9
9
  const _ = {
10
10
  // weight → base kg
11
11
  kg: { id: "kg", category: "weight", factor: 1, offset: 0 },
@@ -193,4 +193,4 @@ export {
193
193
  P as b,
194
194
  K as c
195
195
  };
196
- //# sourceMappingURL=unit-converter-CHN2cZ4b.js.map
196
+ //# sourceMappingURL=unit-converter-C1V3ACM9.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"unit-converter-CHN2cZ4b.js","sources":["../../src/components/unit-converter/units.ts","../../src/components/unit-converter/unit-converter.tsx"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* Generic unit conversion — pure, framework-free, unit-testable. */\n/* */\n/* Every unit is described by an affine map to its category's base */\n/* unit: base = value * factor + offset. Conversion is base-in then */\n/* base-out, so the same code handles linear scales (weight, length, */\n/* glucose) and offset scales (temperature) uniformly. */\n/* ------------------------------------------------------------------ */\n\nexport type UnitCategory = 'weight' | 'length' | 'temperature' | 'glucose';\n\nexport interface UnitDef {\n id: string;\n category: UnitCategory;\n /** Multiplier to the category base unit. */\n factor: number;\n /** Additive offset to the base unit (non-zero only for temperature). */\n offset: number;\n}\n\n/* Base units: kg, cm, °C, mmol/L. */\nexport const UNITS: Record<string, UnitDef> = {\n // weight → base kg\n kg: { id: 'kg', category: 'weight', factor: 1, offset: 0 },\n g: { id: 'g', category: 'weight', factor: 0.001, offset: 0 },\n lb: { id: 'lb', category: 'weight', factor: 0.45359237, offset: 0 },\n oz: { id: 'oz', category: 'weight', factor: 0.028349523125, offset: 0 },\n // length → base cm\n cm: { id: 'cm', category: 'length', factor: 1, offset: 0 },\n m: { id: 'm', category: 'length', factor: 100, offset: 0 },\n in: { id: 'in', category: 'length', factor: 2.54, offset: 0 },\n ft: { id: 'ft', category: 'length', factor: 30.48, offset: 0 },\n // temperature → base °C (affine: °C = °F·5/9 − 32·5/9)\n c: { id: 'c', category: 'temperature', factor: 1, offset: 0 },\n f: { id: 'f', category: 'temperature', factor: 5 / 9, offset: (-32 * 5) / 9 },\n // glucose → base mmol/L (1 mg/dL = 1/18.0156 mmol/L)\n mmol_l: { id: 'mmol_l', category: 'glucose', factor: 1, offset: 0 },\n mg_dl: { id: 'mg_dl', category: 'glucose', factor: 1 / 18.0156, offset: 0 },\n};\n\nexport const UNITS_BY_CATEGORY: Record<UnitCategory, string[]> = {\n weight: ['kg', 'g', 'lb', 'oz'],\n length: ['cm', 'm', 'in', 'ft'],\n temperature: ['c', 'f'],\n glucose: ['mmol_l', 'mg_dl'],\n};\n\nexport const CATEGORIES: UnitCategory[] = [\n 'weight',\n 'length',\n 'temperature',\n 'glucose',\n];\n\n/**\n * Convert `value` from one unit to another. Both ids must belong to the same\n * category; mismatched categories throw (a programming error, not user input).\n */\nexport function convertUnits(\n value: number,\n fromId: string,\n toId: string,\n): number {\n const from = UNITS[fromId];\n const to = UNITS[toId];\n if (!from || !to) throw new Error(`Unknown unit: ${fromId} → ${toId}`);\n if (from.category !== to.category) {\n throw new Error(\n `Cannot convert across categories: ${from.category} → ${to.category}`,\n );\n }\n const base = value * from.factor + from.offset;\n return (base - to.offset) / to.factor;\n}\n","/* ------------------------------------------------------------------ */\n/* UnitConverter — generic clinical/everyday unit conversion across */\n/* weight, length, temperature and glucose. */\n/* */\n/* Maths lives in `./units` (pure, separately tested). */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, useEffect, useMemo, useState } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { FormField } from '../form-field';\nimport { NumberInput } from '../number-input';\nimport { Select } from '../select';\nimport {\n InsertButton,\n type InsertPayload,\n type InsertVariant,\n type InsertMode,\n} from '../_shared/insert-result';\nimport {\n type UnitCategory,\n CATEGORIES,\n UNITS_BY_CATEGORY,\n convertUnits,\n} from './units';\n\nconst rootVariants = cva('ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]', {\n variants: {\n width: { full: 'ds:w-full', auto: 'ds:inline-flex' },\n },\n defaultVariants: { width: 'full' },\n});\n\n/**\n * DS token NAME backing the result-card category chip, one per measurement\n * family. The converter shows no on-screen badge, but the inserted card carries\n * a category chip so the reader can tell at a glance which family the figure\n * belongs to; each token is a closed-palette semantic alias resolved to a\n * concrete colour at raster time by `InsertButton`.\n */\nconst CATEGORY_HIGHLIGHT_TOKEN: Record<UnitCategory, string> = {\n weight: '--info',\n length: '--success',\n temperature: '--warning-readable',\n glucose: '--accent',\n};\n\n/**\n * Category chip token. The `temperature` family resolves to `--warning-readable`,\n * which the result card's colour probe resolves in the live themed DOM: orange-600\n * in light, non-accessible mode (where bare `--warning` yellow only reaches\n * ~3.2:1 on the white card) and `--warning` elsewhere, whose deepened ramp already\n * clears contrast. Resolving the token NAME at the card means the choice tracks\n * the live theme regardless of where the theme class lives. Other families are\n * unchanged.\n */\nfunction categoryHighlightToken(category: UnitCategory): string {\n return CATEGORY_HIGHLIGHT_TOKEN[category];\n}\n\nexport interface UnitConverterProps extends VariantProps<typeof rootVariants> {\n /** Initial category. Defaults to `'weight'`. */\n defaultCategory?: UnitCategory;\n /** Fires with the converted value (and `null` when input is empty). */\n onResultChange?: (value: number | null) => void;\n /** When provided, shows an \"Insert\" button that emits the result for an editor. */\n onInsert?: (payload: InsertPayload) => void;\n /**\n * Which verb the result button performs. Defaults to `'insert'`.\n * Use `'copy'` in an app-shell surface (no editor to insert into) — the\n * button writes the result to the clipboard as a multi-format `ClipboardItem`.\n */\n insertVariant?: InsertVariant;\n /** `copy` variant only — fired after a successful clipboard write. */\n onCopy?: (mode: InsertMode) => void;\n /** `copy` variant only — fired if the clipboard write can't proceed. */\n onError?: (error: unknown) => void;\n /**\n * Brand wordmark printed in the inserted/copied result-card footer.\n * Omitted → no brand line (and no footer hairline); a string → that custom\n * brand; `false` → no brand line. Brand is opt-in.\n */\n insertBrand?: string | false;\n /** Opaque instance id, emitted as `data-component-id`. */\n id?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\nexport const UnitConverter = forwardRef<HTMLDivElement, UnitConverterProps>(\n (\n {\n defaultCategory = 'weight',\n onResultChange,\n onInsert,\n insertVariant = 'insert',\n onCopy,\n onError,\n insertBrand,\n id,\n width,\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n\n const [category, setCategory] = useState<UnitCategory>(defaultCategory);\n const [value, setValue] = useState<number | null>(null);\n const [fromId, setFromId] = useState<string>(\n UNITS_BY_CATEGORY[defaultCategory][0],\n );\n const [toId, setToId] = useState<string>(\n UNITS_BY_CATEGORY[defaultCategory][1],\n );\n\n const handleCategoryChange = (next: string): void => {\n const cat = next as UnitCategory;\n const units = UNITS_BY_CATEGORY[cat];\n setCategory(cat);\n setFromId(units[0]);\n setToId(units[1] ?? units[0]);\n };\n\n const converted = useMemo(\n () => (value === null ? null : convertUnits(value, fromId, toId)),\n [value, fromId, toId],\n );\n\n const numberFmt = useMemo(\n () => new Intl.NumberFormat(i18n.language, { maximumFractionDigits: 3 }),\n [i18n.language],\n );\n\n useEffect(() => {\n onResultChange?.(converted);\n }, [converted, onResultChange]);\n\n const categoryOptions = CATEGORIES.map((c) => ({\n value: c,\n label: t(`unitConverter.category.${c}`),\n }));\n const unitOptions = UNITS_BY_CATEGORY[category].map((u) => ({\n value: u,\n label: t(`unitConverter.units.${u}`),\n }));\n\n return (\n <div\n ref={ref}\n data-component=\"unit-converter\"\n data-component-id={id}\n className={rootVariants({ width, className })}\n >\n <FormField label={t('unitConverter.categoryLabel')}>\n <Select\n options={categoryOptions}\n value={category}\n onValueChange={handleCategoryChange}\n />\n </FormField>\n\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-3\">\n <FormField label={t('unitConverter.value')}>\n <NumberInput mode=\"decimal\" value={value} onChange={setValue} />\n </FormField>\n <FormField label={t('unitConverter.from')}>\n <Select\n options={unitOptions}\n value={fromId}\n onValueChange={setFromId}\n />\n </FormField>\n <FormField label={t('unitConverter.to')}>\n <Select\n options={unitOptions}\n value={toId}\n onValueChange={setToId}\n />\n </FormField>\n </div>\n\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {converted !== null\n ? `${numberFmt.format(value ?? 0)} ${t(\n `unitConverter.units.${fromId}`,\n )} = ${numberFmt.format(converted)} ${t(\n `unitConverter.units.${toId}`,\n )}`\n : ''}\n </p>\n\n {converted !== null ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <span className=\"type-label ds:text-muted-foreground\">\n {t('unitConverter.result')}\n </span>\n <span className=\"type-metric ds:text-foreground\">\n {numberFmt.format(converted)} {t(`unitConverter.units.${toId}`)}\n </span>\n {insertVariant === 'copy' || onInsert ? (\n <InsertButton\n variant={insertVariant}\n onInsert={onInsert}\n onCopy={onCopy}\n onError={onError}\n card={{\n title: t('insert.title.unitConverter'),\n icon: 'ruler',\n highlight: t(`unitConverter.category.${category}`),\n // Chip tints by measurement family so the inserted card\n // signals the category at a glance — with the contrast-safe\n // orange override for the `--warning` temperature family.\n highlightToken: categoryHighlightToken(category),\n brand: insertBrand,\n fields: [\n {\n // Source measurement → ruler glyph (matches the header).\n icon: 'ruler',\n label: t('unitConverter.from'),\n value: `${numberFmt.format(value ?? 0)} ${t(\n `unitConverter.units.${fromId}`,\n )}`,\n },\n {\n // Converted result → trending-up (arrow) glyph signals the\n // conversion direction to the output value.\n icon: 'trending-up',\n label: t('unitConverter.to'),\n value: `${numberFmt.format(converted)} ${t(\n `unitConverter.units.${toId}`,\n )}`,\n },\n ],\n }}\n />\n ) : null}\n </div>\n ) : (\n <p className=\"type-body ds:text-muted-foreground\">\n {t('unitConverter.empty')}\n </p>\n )}\n </div>\n );\n },\n);\n\nUnitConverter.displayName = 'UnitConverter';\n"],"names":["UNITS","UNITS_BY_CATEGORY","CATEGORIES","convertUnits","value","fromId","toId","from","to","rootVariants","cva","CATEGORY_HIGHLIGHT_TOKEN","categoryHighlightToken","category","UnitConverter","forwardRef","defaultCategory","onResultChange","onInsert","insertVariant","onCopy","onError","insertBrand","id","width","className","ref","i18n","useTranslation","setCategory","useState","setValue","setFromId","setToId","handleCategoryChange","next","cat","units","converted","useMemo","numberFmt","useEffect","categoryOptions","c","unitOptions","u","jsxs","jsx","FormField","Select","NumberInput","InsertButton"],"mappings":"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"}
1
+ {"version":3,"file":"unit-converter-C1V3ACM9.js","sources":["../../src/components/unit-converter/units.ts","../../src/components/unit-converter/unit-converter.tsx"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* Generic unit conversion — pure, framework-free, unit-testable. */\n/* */\n/* Every unit is described by an affine map to its category's base */\n/* unit: base = value * factor + offset. Conversion is base-in then */\n/* base-out, so the same code handles linear scales (weight, length, */\n/* glucose) and offset scales (temperature) uniformly. */\n/* ------------------------------------------------------------------ */\n\nexport type UnitCategory = 'weight' | 'length' | 'temperature' | 'glucose';\n\nexport interface UnitDef {\n id: string;\n category: UnitCategory;\n /** Multiplier to the category base unit. */\n factor: number;\n /** Additive offset to the base unit (non-zero only for temperature). */\n offset: number;\n}\n\n/* Base units: kg, cm, °C, mmol/L. */\nexport const UNITS: Record<string, UnitDef> = {\n // weight → base kg\n kg: { id: 'kg', category: 'weight', factor: 1, offset: 0 },\n g: { id: 'g', category: 'weight', factor: 0.001, offset: 0 },\n lb: { id: 'lb', category: 'weight', factor: 0.45359237, offset: 0 },\n oz: { id: 'oz', category: 'weight', factor: 0.028349523125, offset: 0 },\n // length → base cm\n cm: { id: 'cm', category: 'length', factor: 1, offset: 0 },\n m: { id: 'm', category: 'length', factor: 100, offset: 0 },\n in: { id: 'in', category: 'length', factor: 2.54, offset: 0 },\n ft: { id: 'ft', category: 'length', factor: 30.48, offset: 0 },\n // temperature → base °C (affine: °C = °F·5/9 − 32·5/9)\n c: { id: 'c', category: 'temperature', factor: 1, offset: 0 },\n f: { id: 'f', category: 'temperature', factor: 5 / 9, offset: (-32 * 5) / 9 },\n // glucose → base mmol/L (1 mg/dL = 1/18.0156 mmol/L)\n mmol_l: { id: 'mmol_l', category: 'glucose', factor: 1, offset: 0 },\n mg_dl: { id: 'mg_dl', category: 'glucose', factor: 1 / 18.0156, offset: 0 },\n};\n\nexport const UNITS_BY_CATEGORY: Record<UnitCategory, string[]> = {\n weight: ['kg', 'g', 'lb', 'oz'],\n length: ['cm', 'm', 'in', 'ft'],\n temperature: ['c', 'f'],\n glucose: ['mmol_l', 'mg_dl'],\n};\n\nexport const CATEGORIES: UnitCategory[] = [\n 'weight',\n 'length',\n 'temperature',\n 'glucose',\n];\n\n/**\n * Convert `value` from one unit to another. Both ids must belong to the same\n * category; mismatched categories throw (a programming error, not user input).\n */\nexport function convertUnits(\n value: number,\n fromId: string,\n toId: string,\n): number {\n const from = UNITS[fromId];\n const to = UNITS[toId];\n if (!from || !to) throw new Error(`Unknown unit: ${fromId} → ${toId}`);\n if (from.category !== to.category) {\n throw new Error(\n `Cannot convert across categories: ${from.category} → ${to.category}`,\n );\n }\n const base = value * from.factor + from.offset;\n return (base - to.offset) / to.factor;\n}\n","/* ------------------------------------------------------------------ */\n/* UnitConverter — generic clinical/everyday unit conversion across */\n/* weight, length, temperature and glucose. */\n/* */\n/* Maths lives in `./units` (pure, separately tested). */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, useEffect, useMemo, useState } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { FormField } from '../form-field';\nimport { NumberInput } from '../number-input';\nimport { Select } from '../select';\nimport {\n InsertButton,\n type InsertPayload,\n type InsertVariant,\n type InsertMode,\n} from '../_shared/insert-result';\nimport {\n type UnitCategory,\n CATEGORIES,\n UNITS_BY_CATEGORY,\n convertUnits,\n} from './units';\n\nconst rootVariants = cva('ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]', {\n variants: {\n width: { full: 'ds:w-full', auto: 'ds:inline-flex' },\n },\n defaultVariants: { width: 'full' },\n});\n\n/**\n * DS token NAME backing the result-card category chip, one per measurement\n * family. The converter shows no on-screen badge, but the inserted card carries\n * a category chip so the reader can tell at a glance which family the figure\n * belongs to; each token is a closed-palette semantic alias resolved to a\n * concrete colour at raster time by `InsertButton`.\n */\nconst CATEGORY_HIGHLIGHT_TOKEN: Record<UnitCategory, string> = {\n weight: '--info',\n length: '--success',\n temperature: '--warning-readable',\n glucose: '--accent',\n};\n\n/**\n * Category chip token. The `temperature` family resolves to `--warning-readable`,\n * which the result card's colour probe resolves in the live themed DOM: orange-600\n * in light, non-accessible mode (where bare `--warning` yellow only reaches\n * ~3.2:1 on the white card) and `--warning` elsewhere, whose deepened ramp already\n * clears contrast. Resolving the token NAME at the card means the choice tracks\n * the live theme regardless of where the theme class lives. Other families are\n * unchanged.\n */\nfunction categoryHighlightToken(category: UnitCategory): string {\n return CATEGORY_HIGHLIGHT_TOKEN[category];\n}\n\nexport interface UnitConverterProps extends VariantProps<typeof rootVariants> {\n /** Initial category. Defaults to `'weight'`. */\n defaultCategory?: UnitCategory;\n /** Fires with the converted value (and `null` when input is empty). */\n onResultChange?: (value: number | null) => void;\n /** When provided, shows an \"Insert\" button that emits the result for an editor. */\n onInsert?: (payload: InsertPayload) => void;\n /**\n * Which verb the result button performs. Defaults to `'insert'`.\n * Use `'copy'` in an app-shell surface (no editor to insert into) — the\n * button writes the result to the clipboard as a multi-format `ClipboardItem`.\n */\n insertVariant?: InsertVariant;\n /** `copy` variant only — fired after a successful clipboard write. */\n onCopy?: (mode: InsertMode) => void;\n /** `copy` variant only — fired if the clipboard write can't proceed. */\n onError?: (error: unknown) => void;\n /**\n * Brand wordmark printed in the inserted/copied result-card footer.\n * Omitted → no brand line (and no footer hairline); a string → that custom\n * brand; `false` → no brand line. Brand is opt-in.\n */\n insertBrand?: string | false;\n /** Opaque instance id, emitted as `data-component-id`. */\n id?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\nexport const UnitConverter = forwardRef<HTMLDivElement, UnitConverterProps>(\n (\n {\n defaultCategory = 'weight',\n onResultChange,\n onInsert,\n insertVariant = 'insert',\n onCopy,\n onError,\n insertBrand,\n id,\n width,\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n\n const [category, setCategory] = useState<UnitCategory>(defaultCategory);\n const [value, setValue] = useState<number | null>(null);\n const [fromId, setFromId] = useState<string>(\n UNITS_BY_CATEGORY[defaultCategory][0],\n );\n const [toId, setToId] = useState<string>(\n UNITS_BY_CATEGORY[defaultCategory][1],\n );\n\n const handleCategoryChange = (next: string): void => {\n const cat = next as UnitCategory;\n const units = UNITS_BY_CATEGORY[cat];\n setCategory(cat);\n setFromId(units[0]);\n setToId(units[1] ?? units[0]);\n };\n\n const converted = useMemo(\n () => (value === null ? null : convertUnits(value, fromId, toId)),\n [value, fromId, toId],\n );\n\n const numberFmt = useMemo(\n () => new Intl.NumberFormat(i18n.language, { maximumFractionDigits: 3 }),\n [i18n.language],\n );\n\n useEffect(() => {\n onResultChange?.(converted);\n }, [converted, onResultChange]);\n\n const categoryOptions = CATEGORIES.map((c) => ({\n value: c,\n label: t(`unitConverter.category.${c}`),\n }));\n const unitOptions = UNITS_BY_CATEGORY[category].map((u) => ({\n value: u,\n label: t(`unitConverter.units.${u}`),\n }));\n\n return (\n <div\n ref={ref}\n data-component=\"unit-converter\"\n data-component-id={id}\n className={rootVariants({ width, className })}\n >\n <FormField label={t('unitConverter.categoryLabel')}>\n <Select\n options={categoryOptions}\n value={category}\n onValueChange={handleCategoryChange}\n />\n </FormField>\n\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-3\">\n <FormField label={t('unitConverter.value')}>\n <NumberInput mode=\"decimal\" value={value} onChange={setValue} />\n </FormField>\n <FormField label={t('unitConverter.from')}>\n <Select\n options={unitOptions}\n value={fromId}\n onValueChange={setFromId}\n />\n </FormField>\n <FormField label={t('unitConverter.to')}>\n <Select\n options={unitOptions}\n value={toId}\n onValueChange={setToId}\n />\n </FormField>\n </div>\n\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {converted !== null\n ? `${numberFmt.format(value ?? 0)} ${t(\n `unitConverter.units.${fromId}`,\n )} = ${numberFmt.format(converted)} ${t(\n `unitConverter.units.${toId}`,\n )}`\n : ''}\n </p>\n\n {converted !== null ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <span className=\"type-label ds:text-muted-foreground\">\n {t('unitConverter.result')}\n </span>\n <span className=\"type-metric ds:text-foreground\">\n {numberFmt.format(converted)} {t(`unitConverter.units.${toId}`)}\n </span>\n {insertVariant === 'copy' || onInsert ? (\n <InsertButton\n variant={insertVariant}\n onInsert={onInsert}\n onCopy={onCopy}\n onError={onError}\n card={{\n title: t('insert.title.unitConverter'),\n icon: 'ruler',\n highlight: t(`unitConverter.category.${category}`),\n // Chip tints by measurement family so the inserted card\n // signals the category at a glance — with the contrast-safe\n // orange override for the `--warning` temperature family.\n highlightToken: categoryHighlightToken(category),\n brand: insertBrand,\n fields: [\n {\n // Source measurement → ruler glyph (matches the header).\n icon: 'ruler',\n label: t('unitConverter.from'),\n value: `${numberFmt.format(value ?? 0)} ${t(\n `unitConverter.units.${fromId}`,\n )}`,\n },\n {\n // Converted result → trending-up (arrow) glyph signals the\n // conversion direction to the output value.\n icon: 'trending-up',\n label: t('unitConverter.to'),\n value: `${numberFmt.format(converted)} ${t(\n `unitConverter.units.${toId}`,\n )}`,\n },\n ],\n }}\n />\n ) : null}\n </div>\n ) : (\n <p className=\"type-body ds:text-muted-foreground\">\n {t('unitConverter.empty')}\n </p>\n )}\n </div>\n );\n },\n);\n\nUnitConverter.displayName = 'UnitConverter';\n"],"names":["UNITS","UNITS_BY_CATEGORY","CATEGORIES","convertUnits","value","fromId","toId","from","to","rootVariants","cva","CATEGORY_HIGHLIGHT_TOKEN","categoryHighlightToken","category","UnitConverter","forwardRef","defaultCategory","onResultChange","onInsert","insertVariant","onCopy","onError","insertBrand","id","width","className","ref","i18n","useTranslation","setCategory","useState","setValue","setFromId","setToId","handleCategoryChange","next","cat","units","converted","useMemo","numberFmt","useEffect","categoryOptions","c","unitOptions","u","jsxs","jsx","FormField","Select","NumberInput","InsertButton"],"mappings":"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"}