@alfadocs/ui-kit-debug 0.41.2 → 0.42.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 (248) hide show
  1. package/dist/_chunks/address-autocomplete-CSjMrBvu.js +358 -0
  2. package/dist/_chunks/address-autocomplete-CSjMrBvu.js.map +1 -0
  3. package/dist/_chunks/{alia-sidebar-DXsYPinm.js → alia-sidebar-BpX4z_af.js} +2 -2
  4. package/dist/_chunks/{alia-sidebar-DXsYPinm.js.map → alia-sidebar-BpX4z_af.js.map} +1 -1
  5. package/dist/_chunks/{bmi-calculator-DnEr513I.js → bmi-calculator-D4juUcyF.js} +57 -51
  6. package/dist/_chunks/bmi-calculator-D4juUcyF.js.map +1 -0
  7. package/dist/_chunks/{breadcrumb-CLlhx7qo.js → breadcrumb-OTbaY70e.js} +4 -4
  8. package/dist/_chunks/{breadcrumb-CLlhx7qo.js.map → breadcrumb-OTbaY70e.js.map} +1 -1
  9. package/dist/_chunks/cycle-calculator-DsZbyzX6.js +191 -0
  10. package/dist/_chunks/cycle-calculator-DsZbyzX6.js.map +1 -0
  11. package/dist/_chunks/{document-scanner-CqS_klIr.js → document-scanner-BqLsGs4Y.js} +7 -7
  12. package/dist/_chunks/{document-scanner-CqS_klIr.js.map → document-scanner-BqLsGs4Y.js.map} +1 -1
  13. package/dist/_chunks/{dropdown-menu-BC5ZdOMo.js → dropdown-menu-CUEXqKis.js} +2 -2
  14. package/dist/_chunks/{dropdown-menu-BC5ZdOMo.js.map → dropdown-menu-CUEXqKis.js.map} +1 -1
  15. package/dist/_chunks/{due-date-calculator-CUspKSTw.js → due-date-calculator-s_CBgaFs.js} +53 -40
  16. package/dist/_chunks/due-date-calculator-s_CBgaFs.js.map +1 -0
  17. package/dist/_chunks/{editable-currency-cell-renderer-DgkCIIcO.js → editable-currency-cell-renderer-BhUkRiPZ.js} +2 -2
  18. package/dist/_chunks/{editable-currency-cell-renderer-DgkCIIcO.js.map → editable-currency-cell-renderer-BhUkRiPZ.js.map} +1 -1
  19. package/dist/_chunks/{freemium-paywall-BAk3a6er.js → freemium-paywall-BLXESpH4.js} +2 -2
  20. package/dist/_chunks/{freemium-paywall-BAk3a6er.js.map → freemium-paywall-BLXESpH4.js.map} +1 -1
  21. package/dist/_chunks/{gestational-age-calculator-CsQ05qDy.js → gestational-age-calculator-CWOG3bkI.js} +56 -43
  22. package/dist/_chunks/gestational-age-calculator-CWOG3bkI.js.map +1 -0
  23. package/dist/_chunks/{header-settings-CBLwUK6t.js → header-settings-Bx0Biimh.js} +2 -2
  24. package/dist/_chunks/{header-settings-CBLwUK6t.js.map → header-settings-Bx0Biimh.js.map} +1 -1
  25. package/dist/_chunks/index.modern-D2LGACWg.js +1529 -0
  26. package/dist/_chunks/index.modern-D2LGACWg.js.map +1 -0
  27. package/dist/_chunks/insert-result-DtQQeSSf.js +227 -0
  28. package/dist/_chunks/insert-result-DtQQeSSf.js.map +1 -0
  29. package/dist/_chunks/{kbd-Cglkd7CY.js → kbd-D855ZXIW.js} +2 -2
  30. package/dist/_chunks/{kbd-Cglkd7CY.js.map → kbd-D855ZXIW.js.map} +1 -1
  31. package/dist/_chunks/map-view-Tb5VfK9Y.js +333 -0
  32. package/dist/_chunks/map-view-Tb5VfK9Y.js.map +1 -0
  33. package/dist/_chunks/marketplace-app-shell-kVAVycz_.js +391 -0
  34. package/dist/_chunks/marketplace-app-shell-kVAVycz_.js.map +1 -0
  35. package/dist/_chunks/{patient-search-CBq62kmL.js → patient-search-DPe2ZYEL.js} +2 -2
  36. package/dist/_chunks/{patient-search-CBq62kmL.js.map → patient-search-DPe2ZYEL.js.map} +1 -1
  37. package/dist/_chunks/{patient-shell-DF81lALv.js → patient-shell-lDX3wwu6.js} +2 -2
  38. package/dist/_chunks/{patient-shell-DF81lALv.js.map → patient-shell-lDX3wwu6.js.map} +1 -1
  39. package/dist/_chunks/{payment-form-Dy3WIIsC.js → payment-form-BzVsG6Ks.js} +5 -5
  40. package/dist/_chunks/{payment-form-Dy3WIIsC.js.map → payment-form-BzVsG6Ks.js.map} +1 -1
  41. package/dist/_chunks/{pdf-viewer-Cy6Ul3hZ.js → pdf-viewer-B6MC6VTx.js} +139 -126
  42. package/dist/_chunks/pdf-viewer-B6MC6VTx.js.map +1 -0
  43. package/dist/_chunks/{practice-results-C0d4IL5E.js → practice-results-CrLpEiiW.js} +4 -4
  44. package/dist/_chunks/{practice-results-C0d4IL5E.js.map → practice-results-CrLpEiiW.js.map} +1 -1
  45. package/dist/_chunks/pregnancy-weight-gain-B7kBK-ZR.js +223 -0
  46. package/dist/_chunks/pregnancy-weight-gain-B7kBK-ZR.js.map +1 -0
  47. package/dist/_chunks/{public-header.agent-B2dDg2_d.js → public-header.agent-BY6FH71R.js} +2 -2
  48. package/dist/_chunks/{public-header.agent-B2dDg2_d.js.map → public-header.agent-BY6FH71R.js.map} +1 -1
  49. package/dist/_chunks/radio-group-CLjK-SlK.js +167 -0
  50. package/dist/_chunks/radio-group-CLjK-SlK.js.map +1 -0
  51. package/dist/_chunks/{rich-text-editor-DLbg2852.js → rich-text-editor-DhGIBd4a.js} +10 -10
  52. package/dist/_chunks/{rich-text-editor-DLbg2852.js.map → rich-text-editor-DhGIBd4a.js.map} +1 -1
  53. package/dist/_chunks/{sheet-BV-yuLE2.js → sheet-xbzu4YiY.js} +7 -7
  54. package/dist/_chunks/{sheet-BV-yuLE2.js.map → sheet-xbzu4YiY.js.map} +1 -1
  55. package/dist/_chunks/{sign-document-CpLDZ6Db.js → sign-document-QHfcNKFj.js} +5 -5
  56. package/dist/_chunks/{sign-document-CpLDZ6Db.js.map → sign-document-QHfcNKFj.js.map} +1 -1
  57. package/dist/_chunks/{signature-capture-DoiBd6i3.js → signature-capture-CpMBhqQ9.js} +6 -6
  58. package/dist/_chunks/{signature-capture-DoiBd6i3.js.map → signature-capture-CpMBhqQ9.js.map} +1 -1
  59. package/dist/_chunks/tab-bar-C4II-7ej.js +86 -0
  60. package/dist/_chunks/tab-bar-C4II-7ej.js.map +1 -0
  61. package/dist/_chunks/{theme-toggle-DpC28kt5.js → theme-toggle-ClATnY4Q.js} +2 -2
  62. package/dist/_chunks/{theme-toggle-DpC28kt5.js.map → theme-toggle-ClATnY4Q.js.map} +1 -1
  63. package/dist/_chunks/{toast.agent-WHHfw5VX.js → toast.agent-B0MCsvdZ.js} +2 -2
  64. package/dist/_chunks/{toast.agent-WHHfw5VX.js.map → toast.agent-B0MCsvdZ.js.map} +1 -1
  65. package/dist/_chunks/{unit-converter-EUwO6QYq.js → unit-converter-D1UrEUxa.js} +46 -40
  66. package/dist/_chunks/unit-converter-D1UrEUxa.js.map +1 -0
  67. package/dist/_chunks/{workflow-map-C3gB0FvB.js → workflow-map-BFNpzTiw.js} +2 -2
  68. package/dist/_chunks/{workflow-map-C3gB0FvB.js.map → workflow-map-BFNpzTiw.js.map} +1 -1
  69. package/dist/agent-catalog.json +1 -1
  70. package/dist/brand/product-lockup/product-lockup.d.ts +16 -0
  71. package/dist/brand/product-lockup/product-lockup.d.ts.map +1 -1
  72. package/dist/components/_shared/insert-result.d.ts +21 -4
  73. package/dist/components/_shared/insert-result.d.ts.map +1 -1
  74. package/dist/components/address-autocomplete/address-autocomplete.d.ts +77 -0
  75. package/dist/components/address-autocomplete/address-autocomplete.d.ts.map +1 -0
  76. package/dist/components/address-autocomplete/index.d.ts +4 -0
  77. package/dist/components/address-autocomplete/index.d.ts.map +1 -0
  78. package/dist/components/address-autocomplete/index.js +6 -0
  79. package/dist/components/address-autocomplete/index.js.map +1 -0
  80. package/dist/components/address-autocomplete/parse-address.d.ts +52 -0
  81. package/dist/components/address-autocomplete/parse-address.d.ts.map +1 -0
  82. package/dist/components/bmi-calculator/bmi-calculator.d.ts +11 -1
  83. package/dist/components/bmi-calculator/bmi-calculator.d.ts.map +1 -1
  84. package/dist/components/bmi-calculator/index.js +1 -1
  85. package/dist/components/breadcrumb/index.js +1 -1
  86. package/dist/components/cycle-calculator/cycle-calculator.d.ts +12 -2
  87. package/dist/components/cycle-calculator/cycle-calculator.d.ts.map +1 -1
  88. package/dist/components/cycle-calculator/index.js +1 -1
  89. package/dist/components/data-table/index.js +1 -1
  90. package/dist/components/document-scanner/index.js +1 -1
  91. package/dist/components/dropdown-menu/index.js +1 -1
  92. package/dist/components/due-date-calculator/due-date-calculator.d.ts +11 -1
  93. package/dist/components/due-date-calculator/due-date-calculator.d.ts.map +1 -1
  94. package/dist/components/due-date-calculator/index.js +1 -1
  95. package/dist/components/freemium-paywall/index.js +1 -1
  96. package/dist/components/gestational-age-calculator/gestational-age-calculator.d.ts +12 -2
  97. package/dist/components/gestational-age-calculator/gestational-age-calculator.d.ts.map +1 -1
  98. package/dist/components/gestational-age-calculator/index.js +1 -1
  99. package/dist/components/header-settings/index.js +1 -1
  100. package/dist/components/index.d.ts +3 -1
  101. package/dist/components/index.d.ts.map +1 -1
  102. package/dist/components/kbd/index.js +1 -1
  103. package/dist/components/map-view/index.js +1 -1
  104. package/dist/components/matrix-rain/matrix-rain.d.ts +1 -1
  105. package/dist/components/patient-search/index.js +1 -1
  106. package/dist/components/payment-form/index.js +1 -1
  107. package/dist/components/pdf-viewer/index.js +1 -1
  108. package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +1 -1
  109. package/dist/components/practice-results/index.js +1 -1
  110. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  111. package/dist/components/pregnancy-weight-gain/pregnancy-weight-gain.d.ts +12 -2
  112. package/dist/components/pregnancy-weight-gain/pregnancy-weight-gain.d.ts.map +1 -1
  113. package/dist/components/public-header/index.js +1 -1
  114. package/dist/components/radio-group/index.js +1 -1
  115. package/dist/components/radio-group/radio-group.d.ts.map +1 -1
  116. package/dist/components/rich-text-editor/index.js +1 -1
  117. package/dist/components/sheet/index.js +1 -1
  118. package/dist/components/sheet/sheet.d.ts.map +1 -1
  119. package/dist/components/sign-document/index.js +1 -1
  120. package/dist/components/signature-capture/index.js +1 -1
  121. package/dist/components/tab-bar/index.d.ts +3 -0
  122. package/dist/components/tab-bar/index.d.ts.map +1 -0
  123. package/dist/components/tab-bar/index.js +5 -0
  124. package/dist/components/tab-bar/index.js.map +1 -0
  125. package/dist/components/tab-bar/tab-bar.d.ts +61 -0
  126. package/dist/components/tab-bar/tab-bar.d.ts.map +1 -0
  127. package/dist/components/theme-toggle/index.js +1 -1
  128. package/dist/components/toast/index.js +1 -1
  129. package/dist/components/unit-converter/index.js +1 -1
  130. package/dist/components/unit-converter/unit-converter.d.ts +11 -1
  131. package/dist/components/unit-converter/unit-converter.d.ts.map +1 -1
  132. package/dist/components/workflow/index.js +1 -1
  133. package/dist/i18n/locales/ar.d.ts +17 -0
  134. package/dist/i18n/locales/ar.d.ts.map +1 -1
  135. package/dist/i18n/locales/ar.js +18 -1
  136. package/dist/i18n/locales/ar.js.map +1 -1
  137. package/dist/i18n/locales/de.d.ts +17 -0
  138. package/dist/i18n/locales/de.d.ts.map +1 -1
  139. package/dist/i18n/locales/de.js +18 -1
  140. package/dist/i18n/locales/de.js.map +1 -1
  141. package/dist/i18n/locales/el.d.ts +17 -0
  142. package/dist/i18n/locales/el.d.ts.map +1 -1
  143. package/dist/i18n/locales/el.js +18 -1
  144. package/dist/i18n/locales/el.js.map +1 -1
  145. package/dist/i18n/locales/en.d.ts +17 -0
  146. package/dist/i18n/locales/en.d.ts.map +1 -1
  147. package/dist/i18n/locales/en.js +18 -1
  148. package/dist/i18n/locales/en.js.map +1 -1
  149. package/dist/i18n/locales/es.d.ts +17 -0
  150. package/dist/i18n/locales/es.d.ts.map +1 -1
  151. package/dist/i18n/locales/es.js +18 -1
  152. package/dist/i18n/locales/es.js.map +1 -1
  153. package/dist/i18n/locales/fr.d.ts +17 -0
  154. package/dist/i18n/locales/fr.d.ts.map +1 -1
  155. package/dist/i18n/locales/fr.js +18 -1
  156. package/dist/i18n/locales/fr.js.map +1 -1
  157. package/dist/i18n/locales/hi.d.ts +17 -0
  158. package/dist/i18n/locales/hi.d.ts.map +1 -1
  159. package/dist/i18n/locales/hi.js +18 -1
  160. package/dist/i18n/locales/hi.js.map +1 -1
  161. package/dist/i18n/locales/it.d.ts +17 -0
  162. package/dist/i18n/locales/it.d.ts.map +1 -1
  163. package/dist/i18n/locales/it.js +18 -1
  164. package/dist/i18n/locales/it.js.map +1 -1
  165. package/dist/i18n/locales/ja.d.ts +17 -0
  166. package/dist/i18n/locales/ja.d.ts.map +1 -1
  167. package/dist/i18n/locales/ja.js +18 -1
  168. package/dist/i18n/locales/ja.js.map +1 -1
  169. package/dist/i18n/locales/nl.d.ts +17 -0
  170. package/dist/i18n/locales/nl.d.ts.map +1 -1
  171. package/dist/i18n/locales/nl.js +18 -1
  172. package/dist/i18n/locales/nl.js.map +1 -1
  173. package/dist/i18n/locales/pl.d.ts +17 -0
  174. package/dist/i18n/locales/pl.d.ts.map +1 -1
  175. package/dist/i18n/locales/pl.js +18 -1
  176. package/dist/i18n/locales/pl.js.map +1 -1
  177. package/dist/i18n/locales/pt.d.ts +17 -0
  178. package/dist/i18n/locales/pt.d.ts.map +1 -1
  179. package/dist/i18n/locales/pt.js +18 -1
  180. package/dist/i18n/locales/pt.js.map +1 -1
  181. package/dist/i18n/locales/ro.d.ts +17 -0
  182. package/dist/i18n/locales/ro.d.ts.map +1 -1
  183. package/dist/i18n/locales/ro.js +18 -1
  184. package/dist/i18n/locales/ro.js.map +1 -1
  185. package/dist/i18n/locales/ru.d.ts +17 -0
  186. package/dist/i18n/locales/ru.d.ts.map +1 -1
  187. package/dist/i18n/locales/ru.js +18 -1
  188. package/dist/i18n/locales/ru.js.map +1 -1
  189. package/dist/i18n/locales/sq.d.ts +17 -0
  190. package/dist/i18n/locales/sq.d.ts.map +1 -1
  191. package/dist/i18n/locales/sq.js +18 -1
  192. package/dist/i18n/locales/sq.js.map +1 -1
  193. package/dist/i18n/locales/sv.d.ts +17 -0
  194. package/dist/i18n/locales/sv.d.ts.map +1 -1
  195. package/dist/i18n/locales/sv.js +18 -1
  196. package/dist/i18n/locales/sv.js.map +1 -1
  197. package/dist/i18n/locales/tr.d.ts +17 -0
  198. package/dist/i18n/locales/tr.d.ts.map +1 -1
  199. package/dist/i18n/locales/tr.js +18 -1
  200. package/dist/i18n/locales/tr.js.map +1 -1
  201. package/dist/i18n/locales/zh.d.ts +17 -0
  202. package/dist/i18n/locales/zh.d.ts.map +1 -1
  203. package/dist/i18n/locales/zh.js +18 -1
  204. package/dist/i18n/locales/zh.js.map +1 -1
  205. package/dist/index.js +604 -599
  206. package/dist/index.js.map +1 -1
  207. package/dist/locales/ar.json +18 -1
  208. package/dist/locales/de.json +18 -1
  209. package/dist/locales/el.json +18 -1
  210. package/dist/locales/en.json +18 -1
  211. package/dist/locales/es.json +18 -1
  212. package/dist/locales/fr.json +18 -1
  213. package/dist/locales/hi.json +18 -1
  214. package/dist/locales/it.json +18 -1
  215. package/dist/locales/ja.json +18 -1
  216. package/dist/locales/nl.json +18 -1
  217. package/dist/locales/pl.json +18 -1
  218. package/dist/locales/pt.json +18 -1
  219. package/dist/locales/ro.json +18 -1
  220. package/dist/locales/ru.json +18 -1
  221. package/dist/locales/sq.json +18 -1
  222. package/dist/locales/sv.json +18 -1
  223. package/dist/locales/tr.json +18 -1
  224. package/dist/locales/zh.json +18 -1
  225. package/dist/patterns/alia-assistant/index.js +1 -1
  226. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  227. package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts +30 -3
  228. package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts.map +1 -1
  229. package/dist/patterns/patient-shell/index.js +1 -1
  230. package/dist/tokens.css +1 -1
  231. package/package.json +16 -1
  232. package/dist/_chunks/bmi-calculator-DnEr513I.js.map +0 -1
  233. package/dist/_chunks/cycle-calculator-B5Uj9QeT.js +0 -185
  234. package/dist/_chunks/cycle-calculator-B5Uj9QeT.js.map +0 -1
  235. package/dist/_chunks/due-date-calculator-CUspKSTw.js.map +0 -1
  236. package/dist/_chunks/gestational-age-calculator-CsQ05qDy.js.map +0 -1
  237. package/dist/_chunks/insert-result-yJ0QavoN.js +0 -133
  238. package/dist/_chunks/insert-result-yJ0QavoN.js.map +0 -1
  239. package/dist/_chunks/map-view-qJLybrmN.js +0 -1850
  240. package/dist/_chunks/map-view-qJLybrmN.js.map +0 -1
  241. package/dist/_chunks/marketplace-app-shell-BlxVizU4.js +0 -296
  242. package/dist/_chunks/marketplace-app-shell-BlxVizU4.js.map +0 -1
  243. package/dist/_chunks/pdf-viewer-Cy6Ul3hZ.js.map +0 -1
  244. package/dist/_chunks/pregnancy-weight-gain-BCdi-JSv.js +0 -209
  245. package/dist/_chunks/pregnancy-weight-gain-BCdi-JSv.js.map +0 -1
  246. package/dist/_chunks/radio-group-BcF92GEF.js +0 -152
  247. package/dist/_chunks/radio-group-BcF92GEF.js.map +0 -1
  248. package/dist/_chunks/unit-converter-EUwO6QYq.js.map +0 -1
@@ -1,209 +0,0 @@
1
- import { jsxs as s, jsx as a } from "react/jsx-runtime";
2
- import { forwardRef as B, useState as f, useMemo as $, useEffect as S } from "react";
3
- import { c as E } from "./index-D2ZczOXr.js";
4
- import { useTranslation as I } from "react-i18next";
5
- import { F as x } from "./form-field-BOm9hK35.js";
6
- import { N as y } from "./number-input-Dj5L3pXK.js";
7
- import { B as A } from "./badge-zsf5i5bH.js";
8
- import { I as F } from "./insert-result-yJ0QavoN.js";
9
- import { b as _, e as R } from "./bmi-BxD-tFzU.js";
10
- const k = {
11
- underweight: { min: 12.5, max: 18 },
12
- normal: { min: 11.5, max: 16 },
13
- overweight: { min: 7, max: 11.5 },
14
- obese: { min: 5, max: 9 }
15
- }, M = {
16
- underweight: { min: 0.44, max: 0.58 },
17
- normal: { min: 0.35, max: 0.5 },
18
- overweight: { min: 0.23, max: 0.33 },
19
- obese: { min: 0.17, max: 0.27 }
20
- }, G = { min: 0.5, max: 2 }, v = 13;
21
- function C(t, i) {
22
- if (i <= 0) return { min: 0, max: 0 };
23
- if (i <= v) {
24
- const l = i / v;
25
- return {
26
- min: G.min * l,
27
- max: G.max * l
28
- };
29
- }
30
- const c = Math.min(i, 40) - v, r = M[t];
31
- return {
32
- min: G.min + r.min * c,
33
- max: G.max + r.max * c
34
- };
35
- }
36
- function j(t) {
37
- const i = _(t.prePregnancyBmi), c = k[i], r = C(
38
- i,
39
- t.gestationalWeeks
40
- ), l = t.currentWeightKg - t.prePregnancyWeightKg, W = l < r.min ? "below" : l > r.max ? "above" : "within";
41
- return { category: i, totalRange: c, recommendedToDate: r, actualGainKg: l, status: W };
42
- }
43
- const V = E("ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]", {
44
- variants: {
45
- width: { full: "ds:w-full", auto: "ds:inline-flex" }
46
- },
47
- defaultVariants: { width: "full" }
48
- }), z = {
49
- below: "warning",
50
- within: "success",
51
- above: "warning"
52
- }, H = B(({ onResultChange: t, onInsert: i, id: c, width: r, className: l }, W) => {
53
- const { t: e, i18n: N } = I(), [b, w] = f(null), [o, K] = f(null), [g, P] = f(null), [u, D] = f(null), p = R(o, b), n = $(() => p === null || o === null || g === null || u === null ? null : j({
54
- prePregnancyBmi: p,
55
- prePregnancyWeightKg: o,
56
- currentWeightKg: g,
57
- gestationalWeeks: u
58
- }), [p, o, g, u]), d = $(
59
- () => new Intl.NumberFormat(N.language, {
60
- minimumFractionDigits: 1,
61
- maximumFractionDigits: 1
62
- }),
63
- [N.language]
64
- );
65
- S(() => {
66
- t == null || t(n);
67
- }, [n, t]);
68
- const m = e("pregnancyWeightGain.units.kg"), h = (T) => `${d.format(T.min)} – ${d.format(T.max)} ${m}`;
69
- return /* @__PURE__ */ s(
70
- "div",
71
- {
72
- ref: W,
73
- "data-component": "pregnancy-weight-gain",
74
- "data-component-id": c,
75
- className: V({ width: r, className: l }),
76
- children: [
77
- /* @__PURE__ */ s("div", { className: "ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2", children: [
78
- /* @__PURE__ */ a(
79
- x,
80
- {
81
- label: `${e("pregnancyWeightGain.height")} (${e("pregnancyWeightGain.units.cm")})`,
82
- children: /* @__PURE__ */ a(
83
- y,
84
- {
85
- mode: "decimal",
86
- min: 0,
87
- step: 0.5,
88
- value: b,
89
- onChange: w
90
- }
91
- )
92
- }
93
- ),
94
- /* @__PURE__ */ a(
95
- x,
96
- {
97
- label: `${e("pregnancyWeightGain.prePregnancyWeight")} (${m})`,
98
- children: /* @__PURE__ */ a(
99
- y,
100
- {
101
- mode: "decimal",
102
- min: 0,
103
- step: 0.1,
104
- value: o,
105
- onChange: K
106
- }
107
- )
108
- }
109
- ),
110
- /* @__PURE__ */ a(
111
- x,
112
- {
113
- label: `${e("pregnancyWeightGain.currentWeight")} (${m})`,
114
- children: /* @__PURE__ */ a(
115
- y,
116
- {
117
- mode: "decimal",
118
- min: 0,
119
- step: 0.1,
120
- value: g,
121
- onChange: P
122
- }
123
- )
124
- }
125
- ),
126
- /* @__PURE__ */ a(x, { label: e("pregnancyWeightGain.gestationalWeeks"), children: /* @__PURE__ */ a(
127
- y,
128
- {
129
- mode: "integer",
130
- min: 0,
131
- max: 42,
132
- value: u,
133
- onChange: D
134
- }
135
- ) })
136
- ] }),
137
- /* @__PURE__ */ a("p", { className: "ds:sr-only", role: "status", "aria-live": "polite", children: n ? `${e("pregnancyWeightGain.actualGain")}: ${d.format(
138
- n.actualGainKg
139
- )} ${m}. ${e(`pregnancyWeightGain.status.${n.status}`)}.` : "" }),
140
- n ? /* @__PURE__ */ s("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-md)]", children: [
141
- /* @__PURE__ */ s("dl", { className: "ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2", children: [
142
- /* @__PURE__ */ s("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]", children: [
143
- /* @__PURE__ */ a("dt", { className: "type-label ds:text-muted-foreground", children: e("pregnancyWeightGain.prePregnancyBmi") }),
144
- /* @__PURE__ */ s("dd", { className: "type-body ds:text-foreground", children: [
145
- d.format(p ?? 0),
146
- " ·",
147
- " ",
148
- e(`pregnancyWeightGain.category.${n.category}`)
149
- ] })
150
- ] }),
151
- /* @__PURE__ */ s("div", { className: "ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)]", children: [
152
- /* @__PURE__ */ a("dt", { className: "type-label ds:text-muted-foreground", children: e("pregnancyWeightGain.actualGain") }),
153
- /* @__PURE__ */ s("dd", { className: "ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)]", children: [
154
- /* @__PURE__ */ s("span", { className: "type-metric ds:text-foreground", children: [
155
- d.format(n.actualGainKg),
156
- " ",
157
- m
158
- ] }),
159
- /* @__PURE__ */ a(A, { variant: z[n.status], size: "lg", children: e(`pregnancyWeightGain.status.${n.status}`) })
160
- ] })
161
- ] }),
162
- /* @__PURE__ */ s("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]", children: [
163
- /* @__PURE__ */ a("dt", { className: "type-label ds:text-muted-foreground", children: e("pregnancyWeightGain.recommendedToDate") }),
164
- /* @__PURE__ */ a("dd", { className: "type-body ds:text-foreground", children: h(n.recommendedToDate) })
165
- ] }),
166
- /* @__PURE__ */ s("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]", children: [
167
- /* @__PURE__ */ a("dt", { className: "type-label ds:text-muted-foreground", children: e("pregnancyWeightGain.recommendedTotal") }),
168
- /* @__PURE__ */ a("dd", { className: "type-body ds:text-foreground", children: h(n.totalRange) })
169
- ] })
170
- ] }),
171
- /* @__PURE__ */ a("p", { className: "type-body-sm ds:text-muted-foreground", children: e("pregnancyWeightGain.disclaimer") }),
172
- i ? /* @__PURE__ */ a(
173
- F,
174
- {
175
- onInsert: i,
176
- card: {
177
- title: e("insert.title.weightGain"),
178
- highlight: e(`pregnancyWeightGain.status.${n.status}`),
179
- fields: [
180
- {
181
- label: e("pregnancyWeightGain.actualGain"),
182
- value: `${d.format(n.actualGainKg)} ${m}`
183
- },
184
- {
185
- label: e("pregnancyWeightGain.recommendedToDate"),
186
- value: h(n.recommendedToDate)
187
- },
188
- {
189
- label: e("pregnancyWeightGain.recommendedTotal"),
190
- value: h(n.totalRange)
191
- }
192
- ]
193
- }
194
- }
195
- ) : null
196
- ] }) : /* @__PURE__ */ a("p", { className: "type-body ds:text-muted-foreground", children: e("pregnancyWeightGain.empty") })
197
- ]
198
- }
199
- );
200
- });
201
- H.displayName = "PregnancyWeightGain";
202
- export {
203
- H as P,
204
- M as R,
205
- k as T,
206
- j as a,
207
- C as r
208
- };
209
- //# sourceMappingURL=pregnancy-weight-gain-BCdi-JSv.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pregnancy-weight-gain-BCdi-JSv.js","sources":["../../src/components/pregnancy-weight-gain/weight-gain.ts","../../src/components/pregnancy-weight-gain/pregnancy-weight-gain.tsx"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* Pregnancy weight-gain guidance — pure, framework-free, testable. */\n/* */\n/* Recommended ranges follow the US IOM (2009) guidelines for a */\n/* SINGLETON pregnancy, keyed off pre-pregnancy BMI category. The */\n/* \"to date\" estimate adds a small first-trimester gain (≤13 wk) to a */\n/* per-week rate applied across the 2nd/3rd trimesters. */\n/* */\n/* Guidance only — not a substitute for clinical judgement. */\n/* ------------------------------------------------------------------ */\n\nimport { type BmiCategory, bmiCategory } from '../bmi-calculator/bmi';\n\nexport interface GainBand {\n /** Lower bound, kg. */\n min: number;\n /** Upper bound, kg. */\n max: number;\n}\n\nexport type GainStatus = 'below' | 'within' | 'above';\n\n/** IOM (2009) total recommended gain for a singleton pregnancy, kg. */\nexport const TOTAL_GAIN_BANDS: Record<BmiCategory, GainBand> = {\n underweight: { min: 12.5, max: 18 },\n normal: { min: 11.5, max: 16 },\n overweight: { min: 7, max: 11.5 },\n obese: { min: 5, max: 9 },\n};\n\n/** IOM (2009) mean rate of gain in the 2nd/3rd trimester, kg per week. */\nexport const RATE_BANDS: Record<BmiCategory, GainBand> = {\n underweight: { min: 0.44, max: 0.58 },\n normal: { min: 0.35, max: 0.5 },\n overweight: { min: 0.23, max: 0.33 },\n obese: { min: 0.17, max: 0.27 },\n};\n\n/** First-trimester total gain band, kg (category-independent in IOM). */\nexport const FIRST_TRIMESTER_GAIN: GainBand = { min: 0.5, max: 2 };\n/** Completed weeks counted as the first trimester for gain purposes. */\nexport const FIRST_TRIMESTER_WEEKS = 13;\n\nexport interface WeightGainInput {\n /** Pre-pregnancy BMI (kg/m²) — drives the category. */\n prePregnancyBmi: number;\n /** Pre-pregnancy weight, kg. */\n prePregnancyWeightKg: number;\n /** Current weight, kg. */\n currentWeightKg: number;\n /** Completed gestational weeks. */\n gestationalWeeks: number;\n}\n\nexport interface WeightGainResult {\n category: BmiCategory;\n /** Recommended TOTAL gain across the whole pregnancy. */\n totalRange: GainBand;\n /** Recommended gain accumulated by the current gestational week. */\n recommendedToDate: GainBand;\n /** Actual gain so far (current − pre-pregnancy), kg. */\n actualGainKg: number;\n /** Where the actual gain sits against the to-date recommendation. */\n status: GainStatus;\n}\n\n/** Recommended cumulative gain by a given gestational week. */\nexport function recommendedGainToDate(\n category: BmiCategory,\n weeks: number,\n): GainBand {\n if (weeks <= 0) return { min: 0, max: 0 };\n if (weeks <= FIRST_TRIMESTER_WEEKS) {\n const frac = weeks / FIRST_TRIMESTER_WEEKS;\n return {\n min: FIRST_TRIMESTER_GAIN.min * frac,\n max: FIRST_TRIMESTER_GAIN.max * frac,\n };\n }\n const extraWeeks = Math.min(weeks, 40) - FIRST_TRIMESTER_WEEKS;\n const rate = RATE_BANDS[category];\n return {\n min: FIRST_TRIMESTER_GAIN.min + rate.min * extraWeeks,\n max: FIRST_TRIMESTER_GAIN.max + rate.max * extraWeeks,\n };\n}\n\nexport function assessWeightGain(input: WeightGainInput): WeightGainResult {\n const category = bmiCategory(input.prePregnancyBmi);\n const totalRange = TOTAL_GAIN_BANDS[category];\n const recommendedToDate = recommendedGainToDate(\n category,\n input.gestationalWeeks,\n );\n const actualGainKg = input.currentWeightKg - input.prePregnancyWeightKg;\n const status: GainStatus =\n actualGainKg < recommendedToDate.min\n ? 'below'\n : actualGainKg > recommendedToDate.max\n ? 'above'\n : 'within';\n return { category, totalRange, recommendedToDate, actualGainKg, status };\n}\n","/* ------------------------------------------------------------------ */\n/* PregnancyWeightGain — actual vs IOM-recommended gestational weight */\n/* gain, keyed off pre-pregnancy BMI. */\n/* */\n/* Composes the BMI maths from bmi-calculator and the IOM bands in */\n/* `./weight-gain` (both pure, separately tested). Metric only. */\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 { Badge } from '../badge';\nimport { InsertButton, type InsertPayload } from '../_shared/insert-result';\nimport { computeBmi } from '../bmi-calculator/bmi';\nimport {\n type WeightGainResult,\n type GainStatus,\n type GainBand,\n assessWeightGain,\n} from './weight-gain';\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\nconst STATUS_BADGE: Record<GainStatus, 'info' | 'success' | 'warning'> = {\n below: 'warning',\n within: 'success',\n above: 'warning',\n};\n\nexport interface PregnancyWeightGainProps extends VariantProps<\n typeof rootVariants\n> {\n /** Fires whenever a result can be computed (and `null` when it can't). */\n onResultChange?: (result: WeightGainResult | null) => void;\n /** When provided, shows an \"Insert\" button that emits the result for an editor. */\n onInsert?: (payload: InsertPayload) => void;\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 PregnancyWeightGain = forwardRef<\n HTMLDivElement,\n PregnancyWeightGainProps\n>(({ onResultChange, onInsert, id, width, className }, ref) => {\n const { t, i18n } = useTranslation();\n\n const [heightCm, setHeightCm] = useState<number | null>(null);\n const [prePregnancyKg, setPrePregnancyKg] = useState<number | null>(null);\n const [currentKg, setCurrentKg] = useState<number | null>(null);\n const [weeks, setWeeks] = useState<number | null>(null);\n\n const prePregnancyBmi = computeBmi(prePregnancyKg, heightCm);\n\n const result = useMemo<WeightGainResult | null>(() => {\n if (\n prePregnancyBmi === null ||\n prePregnancyKg === null ||\n currentKg === null ||\n weeks === null\n ) {\n return null;\n }\n return assessWeightGain({\n prePregnancyBmi,\n prePregnancyWeightKg: prePregnancyKg,\n currentWeightKg: currentKg,\n gestationalWeeks: weeks,\n });\n }, [prePregnancyBmi, prePregnancyKg, currentKg, weeks]);\n\n const kg = useMemo(\n () =>\n new Intl.NumberFormat(i18n.language, {\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n }),\n [i18n.language],\n );\n\n useEffect(() => {\n onResultChange?.(result);\n }, [result, onResultChange]);\n\n const unit = t('pregnancyWeightGain.units.kg');\n const band = (b: GainBand): string =>\n `${kg.format(b.min)} – ${kg.format(b.max)} ${unit}`;\n\n return (\n <div\n ref={ref}\n data-component=\"pregnancy-weight-gain\"\n data-component-id={id}\n className={rootVariants({ width, className })}\n >\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n <FormField\n label={`${t('pregnancyWeightGain.height')} (${t('pregnancyWeightGain.units.cm')})`}\n >\n <NumberInput\n mode=\"decimal\"\n min={0}\n step={0.5}\n value={heightCm}\n onChange={setHeightCm}\n />\n </FormField>\n <FormField\n label={`${t('pregnancyWeightGain.prePregnancyWeight')} (${unit})`}\n >\n <NumberInput\n mode=\"decimal\"\n min={0}\n step={0.1}\n value={prePregnancyKg}\n onChange={setPrePregnancyKg}\n />\n </FormField>\n <FormField\n label={`${t('pregnancyWeightGain.currentWeight')} (${unit})`}\n >\n <NumberInput\n mode=\"decimal\"\n min={0}\n step={0.1}\n value={currentKg}\n onChange={setCurrentKg}\n />\n </FormField>\n <FormField label={t('pregnancyWeightGain.gestationalWeeks')}>\n <NumberInput\n mode=\"integer\"\n min={0}\n max={42}\n value={weeks}\n onChange={setWeeks}\n />\n </FormField>\n </div>\n\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {result\n ? `${t('pregnancyWeightGain.actualGain')}: ${kg.format(\n result.actualGainKg,\n )} ${unit}. ${t(`pregnancyWeightGain.status.${result.status}`)}.`\n : ''}\n </p>\n\n {result ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <dl className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('pregnancyWeightGain.prePregnancyBmi')}\n </dt>\n <dd className=\"type-body ds:text-foreground\">\n {kg.format(prePregnancyBmi ?? 0)} ·{' '}\n {t(`pregnancyWeightGain.category.${result.category}`)}\n </dd>\n </div>\n <div className=\"ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)]\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('pregnancyWeightGain.actualGain')}\n </dt>\n <dd className=\"ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)]\">\n <span className=\"type-metric ds:text-foreground\">\n {kg.format(result.actualGainKg)} {unit}\n </span>\n <Badge variant={STATUS_BADGE[result.status]} size=\"lg\">\n {t(`pregnancyWeightGain.status.${result.status}`)}\n </Badge>\n </dd>\n </div>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('pregnancyWeightGain.recommendedToDate')}\n </dt>\n <dd className=\"type-body ds:text-foreground\">\n {band(result.recommendedToDate)}\n </dd>\n </div>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('pregnancyWeightGain.recommendedTotal')}\n </dt>\n <dd className=\"type-body ds:text-foreground\">\n {band(result.totalRange)}\n </dd>\n </div>\n </dl>\n <p className=\"type-body-sm ds:text-muted-foreground\">\n {t('pregnancyWeightGain.disclaimer')}\n </p>\n {onInsert ? (\n <InsertButton\n onInsert={onInsert}\n card={{\n title: t('insert.title.weightGain'),\n highlight: t(`pregnancyWeightGain.status.${result.status}`),\n fields: [\n {\n label: t('pregnancyWeightGain.actualGain'),\n value: `${kg.format(result.actualGainKg)} ${unit}`,\n },\n {\n label: t('pregnancyWeightGain.recommendedToDate'),\n value: band(result.recommendedToDate),\n },\n {\n label: t('pregnancyWeightGain.recommendedTotal'),\n value: band(result.totalRange),\n },\n ],\n }}\n />\n ) : null}\n </div>\n ) : (\n <p className=\"type-body ds:text-muted-foreground\">\n {t('pregnancyWeightGain.empty')}\n </p>\n )}\n </div>\n );\n});\n\nPregnancyWeightGain.displayName = 'PregnancyWeightGain';\n"],"names":["TOTAL_GAIN_BANDS","RATE_BANDS","FIRST_TRIMESTER_GAIN","FIRST_TRIMESTER_WEEKS","recommendedGainToDate","category","weeks","frac","extraWeeks","rate","assessWeightGain","input","bmiCategory","totalRange","recommendedToDate","actualGainKg","status","rootVariants","cva","STATUS_BADGE","PregnancyWeightGain","forwardRef","onResultChange","onInsert","id","width","className","ref","t","i18n","useTranslation","heightCm","setHeightCm","useState","prePregnancyKg","setPrePregnancyKg","currentKg","setCurrentKg","setWeeks","prePregnancyBmi","computeBmi","result","useMemo","kg","useEffect","unit","band","b","jsxs","jsx","FormField","NumberInput","Badge","InsertButton"],"mappings":"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"}
@@ -1,152 +0,0 @@
1
- import { jsx as e, jsxs as d } from "react/jsx-runtime";
2
- import { forwardRef as D, useId as T, useMemo as I, useRef as k, useState as q } from "react";
3
- import * as E from "@radix-ui/react-radio-group";
4
- import { c as F } from "./index-D2ZczOXr.js";
5
- import { a as z } from "./radio-TWf9Q-mp.js";
6
- import { c as J } from "./compose-refs-C0k0tdqF.js";
7
- import { u as L } from "./use-direction-Dp8h70PP.js";
8
- import { u as O } from "./registry-nPAVE19X.js";
9
- import { C as Q } from "./circle-alert-ChA9opNA.js";
10
- const U = {
11
- id: "radio-group",
12
- capabilities: ["select_single"],
13
- state: {
14
- value: {
15
- type: "string",
16
- descriptionKey: "ui.agent.radioGroup.state.value",
17
- description: "Currently selected radio value, or empty string when none.",
18
- read: (o) => o.getValue()
19
- }
20
- },
21
- actions: {
22
- set_value: {
23
- safety: "write",
24
- argsType: "{ value: string }",
25
- descriptionKey: "ui.agent.radioGroup.actions.setValue",
26
- description: "Select the radio with the given value.",
27
- invoke: (o, t) => {
28
- o.setValue(t.value);
29
- }
30
- }
31
- },
32
- domHooks: {
33
- root: {
34
- attr: "data-component",
35
- value: "radio-group",
36
- description: "Marks the RadioGroup root."
37
- },
38
- instanceId: {
39
- attr: "data-component-id",
40
- sourceProp: "id",
41
- description: "Sourced from the id prop."
42
- },
43
- item: {
44
- attr: "data-option-id",
45
- description: "Stable opaque value emitted on each rendered Radio child."
46
- }
47
- }
48
- }, W = F("ds:flex", {
49
- variants: {
50
- variant: {
51
- vertical: "ds:flex-col ds:gap-[var(--spacing-sm)]",
52
- horizontal: "ds:flex-row ds:flex-wrap ds:gap-[var(--spacing-md)]",
53
- card: "ds:flex-col ds:gap-[var(--spacing-md)]"
54
- }
55
- },
56
- defaultVariants: {
57
- variant: "vertical"
58
- }
59
- }), X = D(
60
- ({
61
- children: o,
62
- variant: t = "vertical",
63
- label: u,
64
- description: n,
65
- error: s,
66
- required: c,
67
- disabled: S,
68
- className: j,
69
- id: l,
70
- value: p,
71
- defaultValue: m,
72
- onValueChange: a,
73
- ...A
74
- }, B) => {
75
- const v = T(), f = `${v}-description`, g = `${v}-error`, C = [n ? f : null, s ? g : null].filter(Boolean).join(" ") || void 0, P = t === "horizontal" ? "horizontal" : "vertical", h = I(
76
- () => ({ variant: t }),
77
- [t]
78
- ), x = n ? /* @__PURE__ */ e("p", { id: f, className: "type-body-sm ds:text-muted-foreground", children: n }) : null, R = s ? /* @__PURE__ */ d(
79
- "p",
80
- {
81
- id: g,
82
- role: "alert",
83
- className: "ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-body-sm ds:text-destructive",
84
- children: [
85
- /* @__PURE__ */ e(Q, { "aria-hidden": "true", className: "ds:size-4 ds:shrink-0" }),
86
- /* @__PURE__ */ e("span", { children: s })
87
- ]
88
- }
89
- ) : null, y = k(null), $ = J(B, y), H = L(y), r = p !== void 0, [K, M] = q(
90
- m ?? ""
91
- ), N = r ? p ?? "" : K, b = k(N);
92
- b.current = N;
93
- const G = (i) => {
94
- r || M(i), a == null || a(i);
95
- }, _ = I(
96
- () => ({
97
- getValue: () => b.current,
98
- setValue: (i) => G(i)
99
- }),
100
- // eslint-disable-next-line react-hooks/exhaustive-deps
101
- [r, a]
102
- );
103
- O(U, _, l);
104
- const V = /* @__PURE__ */ e(
105
- E.Root,
106
- {
107
- ref: $,
108
- id: l,
109
- orientation: P,
110
- dir: H,
111
- disabled: S,
112
- required: c,
113
- value: r ? p : void 0,
114
- defaultValue: r ? void 0 : m,
115
- onValueChange: G,
116
- "aria-describedby": C,
117
- "aria-invalid": !!s || void 0,
118
- "aria-required": c || void 0,
119
- className: W({ variant: t, className: j }),
120
- "data-component": "radio-group",
121
- "data-component-id": l,
122
- ...A,
123
- children: o
124
- }
125
- ), w = "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:min-w-0";
126
- return u ? /* @__PURE__ */ e(z.Provider, { value: h, children: /* @__PURE__ */ d("fieldset", { className: `${w} ds:border-0 ds:p-0 ds:m-0`, children: [
127
- /* @__PURE__ */ d("legend", { className: "type-label ds:text-foreground ds:p-0", children: [
128
- u,
129
- c ? /* @__PURE__ */ e(
130
- "span",
131
- {
132
- "aria-hidden": "true",
133
- className: "ds:text-destructive ds:ms-[var(--spacing-xs)]",
134
- children: "*"
135
- }
136
- ) : null
137
- ] }),
138
- x,
139
- V,
140
- R
141
- ] }) }) : /* @__PURE__ */ e(z.Provider, { value: h, children: /* @__PURE__ */ d("div", { className: w, children: [
142
- x,
143
- V,
144
- R
145
- ] }) });
146
- }
147
- );
148
- X.displayName = "RadioGroup";
149
- export {
150
- X as R
151
- };
152
- //# sourceMappingURL=radio-group-BcF92GEF.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"radio-group-BcF92GEF.js","sources":["../../src/components/radio-group/radio-group.agent.ts","../../src/components/radio-group/radio-group.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — RadioGroup. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { RadioGroupHandle } from './radio-group';\n\nexport const radioGroupAgent: AgentAdapter<RadioGroupHandle> = {\n id: 'radio-group',\n capabilities: ['select_single'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.radioGroup.state.value',\n description: 'Currently selected radio value, or empty string when none.',\n read: (handle) => handle.getValue(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: string }',\n descriptionKey: 'ui.agent.radioGroup.actions.setValue',\n description: 'Select the radio with the given value.',\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'radio-group',\n description: 'Marks the RadioGroup root.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-option-id',\n description: 'Stable opaque value emitted on each rendered Radio child.',\n },\n },\n};\n","import {\n forwardRef,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport * as RadixRadioGroup from '@radix-ui/react-radio-group';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { AlertCircle } from 'lucide-react';\nimport {\n RadioGroupInternalContext,\n type RadioGroupInternalContextShape,\n type RadioGroupVariant,\n} from './radio-group-context';\nimport { useDirection } from '../_shared/use-direction';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { useAgentRegistration } from '../../agent';\nimport { radioGroupAgent } from './radio-group.agent';\n\n/** Agent-readiness curated handle for RadioGroup. */\nexport interface RadioGroupHandle {\n getValue: () => string;\n setValue: (value: string) => void;\n}\n\nconst radioGroupVariants = cva('ds:flex', {\n variants: {\n variant: {\n vertical: 'ds:flex-col ds:gap-[var(--spacing-sm)]',\n horizontal: 'ds:flex-row ds:flex-wrap ds:gap-[var(--spacing-md)]',\n card: 'ds:flex-col ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: {\n variant: 'vertical',\n },\n});\n\ntype RadixRootProps = ComponentPropsWithoutRef<typeof RadixRadioGroup.Root>;\n\nexport interface RadioGroupProps\n extends\n Omit<RadixRootProps, 'children' | 'orientation'>,\n VariantProps<typeof radioGroupVariants> {\n children: React.ReactNode;\n variant?: RadioGroupVariant;\n label?: string;\n description?: string;\n error?: string;\n required?: boolean;\n}\n\nexport const RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(\n (\n {\n children,\n variant = 'vertical',\n label,\n description,\n error,\n required,\n disabled,\n className,\n id,\n value,\n defaultValue,\n onValueChange,\n ...props\n },\n ref,\n ) => {\n const baseId = useId();\n const descriptionId = `${baseId}-description`;\n const errorId = `${baseId}-error`;\n\n const describedBy =\n [description ? descriptionId : null, error ? errorId : null]\n .filter(Boolean)\n .join(' ') || undefined;\n\n const orientation: 'vertical' | 'horizontal' =\n variant === 'horizontal' ? 'horizontal' : 'vertical';\n\n const ctxValue: RadioGroupInternalContextShape = useMemo(\n () => ({ variant }),\n [variant],\n );\n\n const descriptionNode = description ? (\n <p id={descriptionId} className=\"type-body-sm ds:text-muted-foreground\">\n {description}\n </p>\n ) : null;\n\n const errorNode = error ? (\n <p\n id={errorId}\n role=\"alert\"\n className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-body-sm ds:text-destructive\"\n >\n <AlertCircle aria-hidden=\"true\" className=\"ds:size-4 ds:shrink-0\" />\n <span>{error}</span>\n </p>\n ) : null;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = composeRefs(ref, rootRef);\n const dir = useDirection(rootRef);\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n defaultValue ?? '',\n );\n const currentValue = isControlled ? (value ?? '') : internalValue;\n const currentValueRef = useRef<string>(currentValue);\n currentValueRef.current = currentValue;\n\n const handleValueChange = (next: string) => {\n if (!isControlled) setInternalValue(next);\n onValueChange?.(next);\n };\n\n const agentHandle = useMemo<RadioGroupHandle>(\n () => ({\n getValue: () => currentValueRef.current,\n setValue: (next) => handleValueChange(next),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [isControlled, onValueChange],\n );\n useAgentRegistration(radioGroupAgent, agentHandle, id);\n\n const root = (\n <RadixRadioGroup.Root\n ref={composedRef}\n id={id}\n orientation={orientation}\n dir={dir}\n disabled={disabled}\n required={required}\n value={isControlled ? value : undefined}\n defaultValue={!isControlled ? defaultValue : undefined}\n onValueChange={handleValueChange}\n aria-describedby={describedBy}\n aria-invalid={Boolean(error) || undefined}\n aria-required={required || undefined}\n className={radioGroupVariants({ variant, className })}\n data-component=\"radio-group\"\n data-component-id={id}\n {...props}\n >\n {children}\n </RadixRadioGroup.Root>\n );\n\n const outerClasses =\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:min-w-0';\n\n if (label) {\n return (\n <RadioGroupInternalContext.Provider value={ctxValue}>\n <fieldset className={`${outerClasses} ds:border-0 ds:p-0 ds:m-0`}>\n <legend className=\"type-label ds:text-foreground ds:p-0\">\n {label}\n {required ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:text-destructive ds:ms-[var(--spacing-xs)]\"\n >\n *\n </span>\n ) : null}\n </legend>\n {descriptionNode}\n {root}\n {errorNode}\n </fieldset>\n </RadioGroupInternalContext.Provider>\n );\n }\n\n return (\n <RadioGroupInternalContext.Provider value={ctxValue}>\n <div className={outerClasses}>\n {descriptionNode}\n {root}\n {errorNode}\n </div>\n </RadioGroupInternalContext.Provider>\n );\n },\n);\n\nRadioGroup.displayName = 'RadioGroup';\n"],"names":["radioGroupAgent","handle","args","radioGroupVariants","cva","RadioGroup","forwardRef","children","variant","label","description","error","required","disabled","className","id","value","defaultValue","onValueChange","props","ref","baseId","useId","descriptionId","errorId","describedBy","orientation","ctxValue","useMemo","descriptionNode","jsx","errorNode","jsxs","AlertCircle","rootRef","useRef","composedRef","composeRefs","dir","useDirection","isControlled","internalValue","setInternalValue","useState","currentValue","currentValueRef","handleValueChange","next","agentHandle","useAgentRegistration","root","RadixRadioGroup","outerClasses","RadioGroupInternalContext"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"unit-converter-EUwO6QYq.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 { InsertButton, type InsertPayload } 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\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 /** 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 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 {onInsert ? (\n <InsertButton\n onInsert={onInsert}\n card={{\n title: t('insert.title.unitConverter'),\n fields: [\n {\n label: t('unitConverter.from'),\n value: `${numberFmt.format(value ?? 0)} ${t(\n `unitConverter.units.${fromId}`,\n )}`,\n },\n {\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","UnitConverter","forwardRef","defaultCategory","onResultChange","onInsert","id","width","className","ref","i18n","useTranslation","category","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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"}