@alfadocs/ui-kit-debug 1.4.12 → 1.4.13

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 (167) hide show
  1. package/dist/_chunks/actions-cell-renderer-BD-jruqA.js +1784 -0
  2. package/dist/_chunks/actions-cell-renderer-BD-jruqA.js.map +1 -0
  3. package/dist/_chunks/{anamnesis-summary-rows-DAIpD0Or.js → anamnesis-summary-rows-B5MAYkJ-.js} +2150 -2092
  4. package/dist/_chunks/anamnesis-summary-rows-B5MAYkJ-.js.map +1 -0
  5. package/dist/_chunks/{bmi-calculator-CxPn0T0s.js → bmi-calculator-DC5SaqXT.js} +2 -2
  6. package/dist/_chunks/{bmi-calculator-CxPn0T0s.js.map → bmi-calculator-DC5SaqXT.js.map} +1 -1
  7. package/dist/_chunks/{cycle-calculator-D9M7IKfh.js → cycle-calculator-B_NlctlQ.js} +2 -2
  8. package/dist/_chunks/{cycle-calculator-D9M7IKfh.js.map → cycle-calculator-B_NlctlQ.js.map} +1 -1
  9. package/dist/_chunks/{due-date-calculator-BkqZEvL4.js → due-date-calculator-le1z3KpW.js} +2 -2
  10. package/dist/_chunks/{due-date-calculator-BkqZEvL4.js.map → due-date-calculator-le1z3KpW.js.map} +1 -1
  11. package/dist/_chunks/{fetal-weight-C7JXGg6E.js → fetal-weight-DXA6ZpMq.js} +2 -2
  12. package/dist/_chunks/{fetal-weight-C7JXGg6E.js.map → fetal-weight-DXA6ZpMq.js.map} +1 -1
  13. package/dist/_chunks/{file-manager-DzWYcRpE.js → file-manager-BjCM2fZB.js} +2 -2
  14. package/dist/_chunks/{file-manager-DzWYcRpE.js.map → file-manager-BjCM2fZB.js.map} +1 -1
  15. package/dist/_chunks/{hcg-doubling-CFJlMH7Z.js → hcg-doubling-BT6lki_i.js} +2 -2
  16. package/dist/_chunks/{hcg-doubling-CFJlMH7Z.js.map → hcg-doubling-BT6lki_i.js.map} +1 -1
  17. package/dist/_chunks/{link-cell-renderer-DCCca2m3.js → link-cell-renderer-C7GvyK66.js} +2 -2
  18. package/dist/_chunks/{link-cell-renderer-DCCca2m3.js.map → link-cell-renderer-C7GvyK66.js.map} +1 -1
  19. package/dist/_chunks/number-input-CM1q9zvH.js +414 -0
  20. package/dist/_chunks/number-input-CM1q9zvH.js.map +1 -0
  21. package/dist/_chunks/{optical-prescription-Brs0CeP3.js → optical-prescription-CQR_WJiS.js} +2 -2
  22. package/dist/_chunks/{optical-prescription-Brs0CeP3.js.map → optical-prescription-CQR_WJiS.js.map} +1 -1
  23. package/dist/_chunks/{patient-details-CGhnfdUB.js → patient-details-CnFgF3MU.js} +2 -2
  24. package/dist/_chunks/{patient-details-CGhnfdUB.js.map → patient-details-CnFgF3MU.js.map} +1 -1
  25. package/dist/_chunks/{patient-table-D2fhV4mV.js → patient-table-BXzcrC79.js} +3 -3
  26. package/dist/_chunks/{patient-table-D2fhV4mV.js.map → patient-table-BXzcrC79.js.map} +1 -1
  27. package/dist/_chunks/{pregnancy-dating-iI6_j2K2.js → pregnancy-dating-4tPV_Yko.js} +2 -2
  28. package/dist/_chunks/{pregnancy-dating-iI6_j2K2.js.map → pregnancy-dating-4tPV_Yko.js.map} +1 -1
  29. package/dist/_chunks/{pregnancy-weight-gain-Co-YFMJZ.js → pregnancy-weight-gain-BBgbWBGe.js} +2 -2
  30. package/dist/_chunks/{pregnancy-weight-gain-Co-YFMJZ.js.map → pregnancy-weight-gain-BBgbWBGe.js.map} +1 -1
  31. package/dist/_chunks/{signature-status-chip-DUcTgQ0E.js → signature-status-chip-DlLJk1VA.js} +16 -14
  32. package/dist/_chunks/signature-status-chip-DlLJk1VA.js.map +1 -0
  33. package/dist/_chunks/{unit-converter-BeTicruA.js → unit-converter-Dsk__pjA.js} +2 -2
  34. package/dist/_chunks/{unit-converter-BeTicruA.js.map → unit-converter-Dsk__pjA.js.map} +1 -1
  35. package/dist/agent-catalog.json +14 -8
  36. package/dist/agent-i18n/en.json +3 -2
  37. package/dist/components/bmi-calculator/index.js +1 -1
  38. package/dist/components/cycle-calculator/index.js +1 -1
  39. package/dist/components/data-table/data-table.agent.d.ts.map +1 -1
  40. package/dist/components/data-table/data-table.d.ts +19 -0
  41. package/dist/components/data-table/data-table.d.ts.map +1 -1
  42. package/dist/components/data-table/expanded-row-renderer.d.ts +47 -0
  43. package/dist/components/data-table/expanded-row-renderer.d.ts.map +1 -0
  44. package/dist/components/data-table/index.d.ts +2 -0
  45. package/dist/components/data-table/index.d.ts.map +1 -1
  46. package/dist/components/data-table/index.js +31 -27
  47. package/dist/components/due-date-calculator/index.js +1 -1
  48. package/dist/components/fetal-weight/index.js +1 -1
  49. package/dist/components/file-manager/index.js +1 -1
  50. package/dist/components/hcg-doubling/index.js +1 -1
  51. package/dist/components/number-input/index.js +1 -1
  52. package/dist/components/number-input/number-input.d.ts +11 -0
  53. package/dist/components/number-input/number-input.d.ts.map +1 -1
  54. package/dist/components/optical-prescription/index.js +1 -1
  55. package/dist/components/patient-details/index.js +1 -1
  56. package/dist/components/patient-table/index.js +1 -1
  57. package/dist/components/pregnancy-dating/index.js +1 -1
  58. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  59. package/dist/components/signature-status-chip/index.js +1 -1
  60. package/dist/components/signature-status-chip/signature-status-chip.d.ts.map +1 -1
  61. package/dist/components/unit-converter/index.js +1 -1
  62. package/dist/host-compat.css +4 -1
  63. package/dist/i18n/locales/ar.d.ts +1 -0
  64. package/dist/i18n/locales/ar.d.ts.map +1 -1
  65. package/dist/i18n/locales/ar.js +1 -0
  66. package/dist/i18n/locales/ar.js.map +1 -1
  67. package/dist/i18n/locales/de.d.ts +1 -0
  68. package/dist/i18n/locales/de.d.ts.map +1 -1
  69. package/dist/i18n/locales/de.js +1 -0
  70. package/dist/i18n/locales/de.js.map +1 -1
  71. package/dist/i18n/locales/el.d.ts +1 -0
  72. package/dist/i18n/locales/el.d.ts.map +1 -1
  73. package/dist/i18n/locales/el.js +1 -0
  74. package/dist/i18n/locales/el.js.map +1 -1
  75. package/dist/i18n/locales/en.d.ts +1 -0
  76. package/dist/i18n/locales/en.d.ts.map +1 -1
  77. package/dist/i18n/locales/en.js +1 -0
  78. package/dist/i18n/locales/en.js.map +1 -1
  79. package/dist/i18n/locales/es.d.ts +1 -0
  80. package/dist/i18n/locales/es.d.ts.map +1 -1
  81. package/dist/i18n/locales/es.js +1 -0
  82. package/dist/i18n/locales/es.js.map +1 -1
  83. package/dist/i18n/locales/fr.d.ts +1 -0
  84. package/dist/i18n/locales/fr.d.ts.map +1 -1
  85. package/dist/i18n/locales/fr.js +1 -0
  86. package/dist/i18n/locales/fr.js.map +1 -1
  87. package/dist/i18n/locales/hi.d.ts +1 -0
  88. package/dist/i18n/locales/hi.d.ts.map +1 -1
  89. package/dist/i18n/locales/hi.js +1 -0
  90. package/dist/i18n/locales/hi.js.map +1 -1
  91. package/dist/i18n/locales/it.d.ts +1 -0
  92. package/dist/i18n/locales/it.d.ts.map +1 -1
  93. package/dist/i18n/locales/it.js +1 -0
  94. package/dist/i18n/locales/it.js.map +1 -1
  95. package/dist/i18n/locales/ja.d.ts +1 -0
  96. package/dist/i18n/locales/ja.d.ts.map +1 -1
  97. package/dist/i18n/locales/ja.js +1 -0
  98. package/dist/i18n/locales/ja.js.map +1 -1
  99. package/dist/i18n/locales/nl.d.ts +1 -0
  100. package/dist/i18n/locales/nl.d.ts.map +1 -1
  101. package/dist/i18n/locales/nl.js +1 -0
  102. package/dist/i18n/locales/nl.js.map +1 -1
  103. package/dist/i18n/locales/pl.d.ts +1 -0
  104. package/dist/i18n/locales/pl.d.ts.map +1 -1
  105. package/dist/i18n/locales/pl.js +1 -0
  106. package/dist/i18n/locales/pl.js.map +1 -1
  107. package/dist/i18n/locales/pt.d.ts +1 -0
  108. package/dist/i18n/locales/pt.d.ts.map +1 -1
  109. package/dist/i18n/locales/pt.js +1 -0
  110. package/dist/i18n/locales/pt.js.map +1 -1
  111. package/dist/i18n/locales/ro.d.ts +1 -0
  112. package/dist/i18n/locales/ro.d.ts.map +1 -1
  113. package/dist/i18n/locales/ro.js +1 -0
  114. package/dist/i18n/locales/ro.js.map +1 -1
  115. package/dist/i18n/locales/ru.d.ts +1 -0
  116. package/dist/i18n/locales/ru.d.ts.map +1 -1
  117. package/dist/i18n/locales/ru.js +1 -0
  118. package/dist/i18n/locales/ru.js.map +1 -1
  119. package/dist/i18n/locales/sq.d.ts +1 -0
  120. package/dist/i18n/locales/sq.d.ts.map +1 -1
  121. package/dist/i18n/locales/sq.js +1 -0
  122. package/dist/i18n/locales/sq.js.map +1 -1
  123. package/dist/i18n/locales/sv.d.ts +1 -0
  124. package/dist/i18n/locales/sv.d.ts.map +1 -1
  125. package/dist/i18n/locales/sv.js +1 -0
  126. package/dist/i18n/locales/sv.js.map +1 -1
  127. package/dist/i18n/locales/tr.d.ts +1 -0
  128. package/dist/i18n/locales/tr.d.ts.map +1 -1
  129. package/dist/i18n/locales/tr.js +1 -0
  130. package/dist/i18n/locales/tr.js.map +1 -1
  131. package/dist/i18n/locales/zh.d.ts +1 -0
  132. package/dist/i18n/locales/zh.d.ts.map +1 -1
  133. package/dist/i18n/locales/zh.js +1 -0
  134. package/dist/i18n/locales/zh.js.map +1 -1
  135. package/dist/index.js +779 -775
  136. package/dist/locales/ar.json +1 -0
  137. package/dist/locales/de.json +1 -0
  138. package/dist/locales/el.json +1 -0
  139. package/dist/locales/en.json +1 -0
  140. package/dist/locales/es.json +1 -0
  141. package/dist/locales/fr.json +1 -0
  142. package/dist/locales/hi.json +1 -0
  143. package/dist/locales/it.json +1 -0
  144. package/dist/locales/ja.json +1 -0
  145. package/dist/locales/nl.json +1 -0
  146. package/dist/locales/pl.json +1 -0
  147. package/dist/locales/pt.json +1 -0
  148. package/dist/locales/ro.json +1 -0
  149. package/dist/locales/ru.json +1 -0
  150. package/dist/locales/sq.json +1 -0
  151. package/dist/locales/sv.json +1 -0
  152. package/dist/locales/tr.json +1 -0
  153. package/dist/locales/zh.json +1 -0
  154. package/dist/patterns/anamnesis/anamnesis-evolution.d.ts.map +1 -1
  155. package/dist/patterns/anamnesis/anamnesis-field.d.ts.map +1 -1
  156. package/dist/patterns/anamnesis/anamnesis-i18n.d.ts.map +1 -1
  157. package/dist/patterns/anamnesis/anamnesis-intake.d.ts +5 -1
  158. package/dist/patterns/anamnesis/anamnesis-intake.d.ts.map +1 -1
  159. package/dist/patterns/anamnesis/index.js +1 -1
  160. package/dist/tokens.css +5 -2
  161. package/package.json +1 -1
  162. package/dist/_chunks/actions-cell-renderer-C67oj7mR.js +0 -1581
  163. package/dist/_chunks/actions-cell-renderer-C67oj7mR.js.map +0 -1
  164. package/dist/_chunks/anamnesis-summary-rows-DAIpD0Or.js.map +0 -1
  165. package/dist/_chunks/number-input-DOe5VYei.js +0 -370
  166. package/dist/_chunks/number-input-DOe5VYei.js.map +0 -1
  167. package/dist/_chunks/signature-status-chip-DUcTgQ0E.js.map +0 -1
@@ -1,370 +0,0 @@
1
- import { jsxs as Ie, jsx as F } from "react/jsx-runtime";
2
- import { useMemo as Y, forwardRef as De, useRef as K, useCallback as z, useState as q, useEffect as xe } from "react";
3
- import { c as Ce } from "./index-D2ZczOXr.js";
4
- import { useTranslation as Fe } from "react-i18next";
5
- import { u as Se } from "./use-controllable-state-BiY4xTzM.js";
6
- import { u as Ve } from "./form-field-context-B3APVHKx.js";
7
- import { c as Me } from "./compose-refs-C0k0tdqF.js";
8
- import { u as ke } from "./registry-DvAUVLHh.js";
9
- import { C as Te } from "./chevron-down-DWE7GSq9.js";
10
- import { C as Pe } from "./chevron-up-umRGgtJA.js";
11
- const ze = {
12
- id: "number-input",
13
- capabilities: ["set_value"],
14
- state: {
15
- value: {
16
- type: "number | null",
17
- descriptionKey: "ui.agent.numberInput.state.value",
18
- description: "Current numeric value, or null when empty.",
19
- read: (n) => n.getValue()
20
- },
21
- isEmpty: {
22
- type: "boolean",
23
- descriptionKey: "ui.agent.numberInput.state.isEmpty",
24
- description: "Whether the input has no value.",
25
- read: (n) => n.getValue() === null
26
- }
27
- },
28
- actions: {
29
- set_value: {
30
- safety: "write",
31
- argsType: "{ value: number | null }",
32
- argsSchema: {
33
- type: "object",
34
- properties: { value: { type: ["number", "null"] } },
35
- required: ["value"]
36
- },
37
- idempotent: !0,
38
- examples: [{ args: { value: 42 } }, { args: { value: null } }],
39
- descriptionKey: "ui.agent.numberInput.actions.setValue",
40
- description: "Replace the numeric value, or pass null to clear.",
41
- invoke: (n, s) => {
42
- n.setValue(s.value);
43
- }
44
- },
45
- clear: {
46
- safety: "destructive",
47
- idempotent: !0,
48
- descriptionKey: "ui.agent.numberInput.actions.clear",
49
- description: "Empty the input. Loses any typed value.",
50
- invoke: (n) => {
51
- n.clear();
52
- }
53
- },
54
- focus: {
55
- safety: "read",
56
- idempotent: !0,
57
- descriptionKey: "ui.agent.numberInput.actions.focus",
58
- description: "Move keyboard focus to the input.",
59
- invoke: (n) => {
60
- n.focus();
61
- }
62
- }
63
- },
64
- domHooks: {
65
- root: {
66
- attr: "data-component",
67
- value: "number-input",
68
- description: "Marks the NumberInput wrapper."
69
- },
70
- instanceId: {
71
- attr: "data-component-id",
72
- sourceProp: "id",
73
- description: "Sourced from the id prop."
74
- }
75
- }
76
- };
77
- function Re(n) {
78
- let s = "";
79
- for (const l of n) {
80
- const r = l.codePointAt(0);
81
- r !== void 0 && (r >= 1632 && r <= 1641 ? s += String.fromCodePoint(48 + (r - 1632)) : r >= 1776 && r <= 1785 ? s += String.fromCodePoint(48 + (r - 1776)) : s += l);
82
- }
83
- return s;
84
- }
85
- function Ae(n, s, l) {
86
- return Y(() => {
87
- var V, M;
88
- const r = new Intl.NumberFormat(n).formatToParts(1234.5), u = ((V = r.find((a) => a.type === "decimal")) == null ? void 0 : V.value) ?? ".", S = ((M = r.find((a) => a.type === "group")) == null ? void 0 : M.value) ?? ",", p = s === "currency" ? new Intl.NumberFormat(n, {
89
- style: "currency",
90
- currency: l ?? "USD"
91
- }) : s === "percentage" ? new Intl.NumberFormat(n, {
92
- style: "percent",
93
- maximumFractionDigits: 4
94
- }) : s === "integer" ? new Intl.NumberFormat(n, { maximumFractionDigits: 0 }) : new Intl.NumberFormat(n, { maximumFractionDigits: 10 }), R = (a) => Number.isFinite(a) ? p.format(a) : "", A = (a) => {
95
- if (!a) return NaN;
96
- const k = Re(a), h = k.trim(), I = h.startsWith("-") || h.startsWith("−");
97
- let d = "";
98
- for (const N of k)
99
- N >= "0" && N <= "9" ? d += N : N === u && (d += ".");
100
- if (!d || d === ".") return NaN;
101
- let m = Number(d);
102
- return Number.isFinite(m) ? (I && (m = -m), s === "percentage" && (m = m / 100), m) : NaN;
103
- };
104
- let g = "decimal";
105
- if (s === "integer")
106
- g = "numeric";
107
- else if (s === "currency")
108
- try {
109
- const { maximumFractionDigits: a } = new Intl.NumberFormat(n, {
110
- style: "currency",
111
- currency: l ?? "USD"
112
- }).resolvedOptions();
113
- g = a === 0 ? "numeric" : "decimal";
114
- } catch {
115
- g = "decimal";
116
- }
117
- return {
118
- format: R,
119
- parse: A,
120
- decimalSeparator: u,
121
- groupingSeparator: S,
122
- inputMode: g
123
- };
124
- }, [n, s, l]);
125
- }
126
- const je = Ce(
127
- [
128
- "ds:flex ds:items-center ds:w-full ds:rounded-[var(--radius-sm)]",
129
- "ds:border ds:bg-input ds:text-foreground",
130
- "ds:shadow-[var(--shadow-input)]",
131
- "ds:transition-[colors,box-shadow] ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none",
132
- "ds:focus-within:outline-[length:var(--focus-ring-width)] ds:focus-within:outline-solid",
133
- "ds:focus-within:outline-ring ds:focus-within:outline-offset-[length:var(--focus-ring-offset)]",
134
- "ds:has-[:disabled]:cursor-not-allowed ds:has-[:disabled]:opacity-50"
135
- ].join(" "),
136
- {
137
- variants: {
138
- size: {
139
- sm: "ds:h-8 ds:text-[length:var(--font-size-sm)]",
140
- md: "ds:h-[var(--min-target-size)] ds:text-[length:var(--font-size-base)]",
141
- lg: "ds:h-12 ds:text-[length:var(--font-size-lg)]"
142
- },
143
- tone: {
144
- default: "ds:border-border",
145
- error: "ds:border-destructive ds:focus-within:outline-destructive"
146
- }
147
- },
148
- defaultVariants: { size: "md", tone: "default" }
149
- }
150
- ), X = [
151
- "ds:inline-flex ds:items-center ds:justify-center",
152
- "ds:h-full ds:shrink-0",
153
- "ds:text-muted-foreground ds:hover:text-foreground",
154
- "ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none",
155
- "ds:disabled:cursor-not-allowed ds:disabled:opacity-50"
156
- ].join(" "), Be = () => typeof navigator < "u" && navigator.language ? navigator.language : "en-US", Ee = (n) => typeof n == "string" && n.trim() !== "" ? n : void 0;
157
- function Ue(n) {
158
- if (!Number.isFinite(n)) return 0;
159
- const s = String(n), l = s.indexOf(".");
160
- return l === -1 ? 0 : s.length - l - 1;
161
- }
162
- function Le(n, s) {
163
- if (s <= 0 || !Number.isFinite(s)) return n;
164
- const r = 10 ** Ue(s);
165
- return Math.round(n * r) / r;
166
- }
167
- const Ke = De(
168
- ({
169
- value: n,
170
- defaultValue: s,
171
- onChange: l,
172
- min: r,
173
- max: u,
174
- step: S = 1,
175
- mode: p = "integer",
176
- currency: R,
177
- locale: A,
178
- size: g = "md",
179
- tone: V,
180
- className: M,
181
- id: a,
182
- disabled: k,
183
- onFocus: h,
184
- onBlur: I,
185
- onKeyDown: d,
186
- ...m
187
- }, N) => {
188
- const { t: H, i18n: Z } = Fe(), D = Ve(), ee = a ?? D.id, T = !!(D.disabled || k), te = A ?? Ee(Z.language) ?? Be(), j = Ae(te, p, R), {
189
- decimalSeparator: P,
190
- groupingSeparator: W,
191
- format: B,
192
- parse: O
193
- } = j, _ = K(null), ne = Me(N, _), [re, se] = Se({
194
- value: n,
195
- defaultValue: s ?? null,
196
- onChange: l
197
- }), i = re ?? null, $ = K(i);
198
- $.current = i;
199
- const x = z(
200
- (e) => {
201
- const t = p === "percentage" ? e * 100 : e;
202
- return (Number.isInteger(t) ? String(t) : t.toString()).replace(".", P);
203
- },
204
- [p, P]
205
- ), v = z(
206
- (e) => e == null || Number.isNaN(e) ? "" : B(e),
207
- [B]
208
- ), [E, c] = q(
209
- () => v(i)
210
- ), y = K(!1), [oe, b] = q(!1), [U, C] = q(!1), L = z(
211
- (e) => {
212
- if (e >= "0" && e <= "9") return !0;
213
- const t = e.codePointAt(0) ?? 0;
214
- return t >= 1632 && t <= 1641 || t >= 1776 && t <= 1785 ? !0 : e === P || e === W || e === "-" || e === "−";
215
- },
216
- [P, W]
217
- ), ie = z(
218
- (e) => {
219
- let t = "";
220
- for (const o of e)
221
- L(o) && (t += o);
222
- return t;
223
- },
224
- [L]
225
- );
226
- xe(() => {
227
- !y.current && !U && c(v(i));
228
- }, [i, v, U]);
229
- const ae = oe || U || i !== null && (r !== void 0 && i < r || u !== void 0 && i > u), G = D.invalid || ae, ue = G ? "error" : V ?? "default", f = (e) => {
230
- se(e);
231
- }, w = (e) => {
232
- let o = (i ?? 0) + S * e;
233
- r !== void 0 && (o = Math.max(r, o)), u !== void 0 && (o = Math.min(u, o)), o = Le(o, S), f(o), b(!1), c(
234
- y.current ? x(o) : v(o)
235
- );
236
- }, J = (e) => {
237
- f(e), b(!1), c(
238
- y.current ? x(e) : v(e)
239
- );
240
- }, le = (e) => {
241
- if (d == null || d(e), e.defaultPrevented || T) return;
242
- const { key: t, shiftKey: o } = e;
243
- t === "ArrowUp" ? (e.preventDefault(), w(o ? 10 : 1)) : t === "ArrowDown" ? (e.preventDefault(), w(o ? -10 : -1)) : t === "PageUp" ? (e.preventDefault(), w(100)) : t === "PageDown" ? (e.preventDefault(), w(-100)) : t === "Home" && r !== void 0 ? (e.preventDefault(), J(r)) : t === "End" && u !== void 0 && (e.preventDefault(), J(u));
244
- }, de = (e) => {
245
- const t = ie(e.target.value);
246
- if (c(t), t.trim() === "") {
247
- f(null), b(!1), C(!1);
248
- return;
249
- }
250
- const o = O(t);
251
- Number.isNaN(o) || (f(o), C(!1));
252
- }, ce = (e) => {
253
- const { data: t } = e.nativeEvent;
254
- typeof t != "string" || t.length !== 1 || L(t) || e.preventDefault();
255
- }, fe = (e) => {
256
- h == null || h(e), y.current = !0, i != null && c(x(i));
257
- }, pe = (e) => {
258
- if (I == null || I(e), y.current = !1, E.trim() === "") {
259
- f(null), b(!1), C(!1), c("");
260
- return;
261
- }
262
- const t = O(E);
263
- if (Number.isNaN(t)) {
264
- C(!0), b(!1), f(null);
265
- return;
266
- }
267
- const o = r !== void 0 && t < r || u !== void 0 && t > u;
268
- b(o), C(!1), f(t), c(v(t));
269
- }, Q = (e) => {
270
- e.preventDefault();
271
- }, me = () => w(1), ve = () => w(-1), be = Y(
272
- () => ({
273
- getValue: () => $.current,
274
- setValue: (e) => {
275
- f(e), c(
276
- e === null ? "" : y.current ? x(e) : v(e)
277
- );
278
- },
279
- clear: () => {
280
- f(null), c(""), b(!1);
281
- },
282
- focus: () => {
283
- var e;
284
- return (e = _.current) == null ? void 0 : e.focus();
285
- }
286
- }),
287
- // The handle is reconstructed per render; consumers (the agent runtime)
288
- // re-register only when the identity changes, which is a cheap no-op.
289
- // eslint-disable-next-line react-hooks/exhaustive-deps
290
- [x, v]
291
- );
292
- ke(ze, be, a);
293
- const ge = T || r !== void 0 && i !== null && i <= r, he = T || u !== void 0 && i !== null && i >= u, Ne = i ?? void 0, ye = (p === "currency" || p === "percentage") && i !== null && i !== null ? B(i) : void 0, we = j.inputMode === "numeric" ? "[0-9]*" : void 0;
294
- return /* @__PURE__ */ Ie(
295
- "div",
296
- {
297
- className: je({
298
- size: g,
299
- tone: ue,
300
- className: M
301
- }),
302
- "data-component": "number-input",
303
- "data-component-id": a,
304
- "data-mode": p,
305
- children: [
306
- /* @__PURE__ */ F(
307
- "button",
308
- {
309
- type: "button",
310
- tabIndex: -1,
311
- "aria-label": H("inputs.number.decrement", "Decrement"),
312
- onClick: ve,
313
- onMouseDown: Q,
314
- disabled: ge,
315
- className: `${X} ds:ps-2 ds:pe-1`,
316
- children: /* @__PURE__ */ F(Te, { "aria-hidden": "true", className: "ds:size-4" })
317
- }
318
- ),
319
- /* @__PURE__ */ F(
320
- "input",
321
- {
322
- ref: ne,
323
- id: ee,
324
- type: "text",
325
- role: "spinbutton",
326
- inputMode: j.inputMode,
327
- pattern: we,
328
- autoComplete: "off",
329
- value: E,
330
- disabled: T,
331
- "aria-valuemin": r,
332
- "aria-valuemax": u,
333
- "aria-valuenow": Ne,
334
- "aria-valuetext": ye,
335
- "aria-invalid": G || void 0,
336
- "aria-required": D.required || void 0,
337
- "aria-describedby": D.describedBy || void 0,
338
- onBeforeInput: ce,
339
- onChange: de,
340
- onFocus: fe,
341
- onBlur: pe,
342
- onKeyDown: le,
343
- className: "ds:flex-1 ds:w-full ds:min-w-0 ds:bg-transparent ds:outline-none ds:ps-2 ds:pe-2 ds:text-start ds:tabular-nums ds:disabled:cursor-not-allowed",
344
- ...m
345
- }
346
- ),
347
- /* @__PURE__ */ F(
348
- "button",
349
- {
350
- type: "button",
351
- tabIndex: -1,
352
- "aria-label": H("inputs.number.increment", "Increment"),
353
- onClick: me,
354
- onMouseDown: Q,
355
- disabled: he,
356
- className: `${X} ds:ps-1 ds:pe-2`,
357
- children: /* @__PURE__ */ F(Pe, { "aria-hidden": "true", className: "ds:size-4" })
358
- }
359
- )
360
- ]
361
- }
362
- );
363
- }
364
- );
365
- Ke.displayName = "NumberInput";
366
- export {
367
- Ke as N,
368
- Ae as u
369
- };
370
- //# sourceMappingURL=number-input-DOe5VYei.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"number-input-DOe5VYei.js","sources":["../../src/components/number-input/number-input.agent.ts","../../src/components/number-input/use-locale-number.ts","../../src/components/number-input/number-input.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — NumberInput. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { NumberInputHandle } from './number-input';\n\nexport const numberInputAgent: AgentAdapter<NumberInputHandle> = {\n id: 'number-input',\n capabilities: ['set_value'],\n state: {\n value: {\n type: 'number | null',\n descriptionKey: 'ui.agent.numberInput.state.value',\n description: 'Current numeric value, or null when empty.',\n read: (handle) => handle.getValue(),\n },\n isEmpty: {\n type: 'boolean',\n descriptionKey: 'ui.agent.numberInput.state.isEmpty',\n description: 'Whether the input has no value.',\n read: (handle) => handle.getValue() === null,\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: number | null }',\n argsSchema: {\n type: 'object',\n properties: { value: { type: ['number', 'null'] } },\n required: ['value'],\n },\n idempotent: true,\n examples: [{ args: { value: 42 } }, { args: { value: null } }],\n descriptionKey: 'ui.agent.numberInput.actions.setValue',\n description: 'Replace the numeric value, or pass null to clear.',\n invoke: (handle, args: { value: number | null }) => {\n handle.setValue(args.value);\n },\n },\n clear: {\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.numberInput.actions.clear',\n description: 'Empty the input. Loses any typed value.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n focus: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.numberInput.actions.focus',\n description: 'Move keyboard focus to the input.',\n invoke: (handle) => {\n handle.focus();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'number-input',\n description: 'Marks the NumberInput wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import { useMemo } from 'react';\n\nexport type NumberInputMode = 'integer' | 'decimal' | 'currency' | 'percentage';\n\nexport interface LocaleNumber {\n /** Format a JS number for display (e.g. `1234.5` → `1.234,5` in de-DE). */\n format: (value: number) => string;\n /** Parse a locale-formatted string back to a JS number. Returns `NaN` for invalid input. */\n parse: (text: string) => number;\n /** The decimal separator for this locale (e.g. `.` or `,`). */\n decimalSeparator: string;\n /** The grouping separator for this locale (e.g. `,` or `.` or ` `). */\n groupingSeparator: string;\n /** The correct `inputMode` for the virtual keyboard. */\n inputMode: 'numeric' | 'decimal';\n}\n\nfunction normalizeDigits(text: string): string {\n let result = '';\n for (const ch of text) {\n const code = ch.codePointAt(0);\n if (code === undefined) continue;\n if (code >= 0x0660 && code <= 0x0669) {\n result += String.fromCodePoint(0x30 + (code - 0x0660));\n } else if (code >= 0x06f0 && code <= 0x06f9) {\n result += String.fromCodePoint(0x30 + (code - 0x06f0));\n } else {\n result += ch;\n }\n }\n return result;\n}\n\nexport function useLocaleNumber(\n locale: string,\n mode: NumberInputMode,\n currency?: string,\n): LocaleNumber {\n return useMemo(() => {\n const parts = new Intl.NumberFormat(locale).formatToParts(1234.5);\n const decimalSeparator =\n parts.find((p) => p.type === 'decimal')?.value ?? '.';\n const groupingSeparator =\n parts.find((p) => p.type === 'group')?.value ?? ',';\n\n const displayFormatter: Intl.NumberFormat = (() => {\n if (mode === 'currency') {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currency ?? 'USD',\n });\n }\n if (mode === 'percentage') {\n return new Intl.NumberFormat(locale, {\n style: 'percent',\n maximumFractionDigits: 4,\n });\n }\n if (mode === 'integer') {\n return new Intl.NumberFormat(locale, { maximumFractionDigits: 0 });\n }\n return new Intl.NumberFormat(locale, { maximumFractionDigits: 10 });\n })();\n\n const format = (value: number): string => {\n if (!Number.isFinite(value)) return '';\n return displayFormatter.format(value);\n };\n\n const parse = (text: string): number => {\n if (!text) return NaN;\n const normalized = normalizeDigits(text);\n const trimmed = normalized.trim();\n const hasMinus = trimmed.startsWith('-') || trimmed.startsWith('\\u2212');\n\n let cleaned = '';\n for (const ch of normalized) {\n if (ch >= '0' && ch <= '9') {\n cleaned += ch;\n } else if (ch === decimalSeparator) {\n cleaned += '.';\n }\n }\n if (!cleaned || cleaned === '.') return NaN;\n\n let n = Number(cleaned);\n if (!Number.isFinite(n)) return NaN;\n if (hasMinus) n = -n;\n if (mode === 'percentage') n = n / 100;\n return n;\n };\n\n let inputMode: 'numeric' | 'decimal' = 'decimal';\n if (mode === 'integer') {\n inputMode = 'numeric';\n } else if (mode === 'currency') {\n try {\n const { maximumFractionDigits } = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currency ?? 'USD',\n }).resolvedOptions();\n inputMode = maximumFractionDigits === 0 ? 'numeric' : 'decimal';\n } catch {\n inputMode = 'decimal';\n }\n }\n\n return {\n format,\n parse,\n decimalSeparator,\n groupingSeparator,\n inputMode,\n };\n }, [locale, mode, currency]);\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type FocusEvent,\n type FormEvent,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type MouseEvent,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { ChevronDown, ChevronUp } from 'lucide-react';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useFormField } from '../form-field/form-field-context';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { useAgentRegistration } from '../../agent';\nimport { numberInputAgent } from './number-input.agent';\nimport { useLocaleNumber, type NumberInputMode } from './use-locale-number';\n\n/** Agent-readiness curated handle for NumberInput. */\nexport interface NumberInputHandle {\n getValue: () => number | null;\n setValue: (value: number | null) => void;\n clear: () => void;\n focus: () => void;\n}\n\nconst numberInputVariants = cva(\n [\n 'ds:flex ds:items-center ds:w-full ds:rounded-[var(--radius-sm)]',\n 'ds:border ds:bg-input ds:text-foreground',\n 'ds:shadow-[var(--shadow-input)]',\n 'ds:transition-[colors,box-shadow] ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-within:outline-[length:var(--focus-ring-width)] ds:focus-within:outline-solid',\n 'ds:focus-within:outline-ring ds:focus-within:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:has-[:disabled]:cursor-not-allowed ds:has-[:disabled]:opacity-50',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:h-8 ds:text-[length:var(--font-size-sm)]',\n md: 'ds:h-[var(--min-target-size)] ds:text-[length:var(--font-size-base)]',\n lg: 'ds:h-12 ds:text-[length:var(--font-size-lg)]',\n },\n tone: {\n default: 'ds:border-border',\n error: 'ds:border-destructive ds:focus-within:outline-destructive',\n },\n },\n defaultVariants: { size: 'md', tone: 'default' },\n },\n);\n\nconst spinnerButton = [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:h-full ds:shrink-0',\n 'ds:text-muted-foreground ds:hover:text-foreground',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n].join(' ');\n\nexport type { NumberInputMode };\n\nexport interface NumberInputProps\n extends\n Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'onChange' | 'value' | 'defaultValue' | 'size'\n >,\n VariantProps<typeof numberInputVariants> {\n /** Current numeric value (controlled). */\n value?: number | null;\n /** Initial value (uncontrolled). */\n defaultValue?: number;\n /** Fires with the parsed number (not a string). `null` when the field is empty. */\n onChange?: (value: number | null) => void;\n /** Minimum allowed value. Maps to `aria-valuemin`. */\n min?: number;\n /** Maximum allowed value. Maps to `aria-valuemax`. */\n max?: number;\n /** Increment step. Defaults to `1`. */\n step?: number;\n /** Display/parse mode. Defaults to `'integer'`. */\n mode?: NumberInputMode;\n /** ISO 4217 currency code, required when `mode='currency'`. */\n currency?: string;\n /** BCP 47 locale. Defaults to the app language (`i18n.language`), then\n * `navigator.language`, then `'en-US'`. */\n locale?: string;\n /** Size variant. */\n size?: 'sm' | 'md' | 'lg';\n /** Additional class names on the wrapper. */\n className?: string;\n}\n\nconst resolveDefaultLocale = (): string => {\n if (typeof navigator !== 'undefined' && navigator.language) {\n return navigator.language;\n }\n return 'en-US';\n};\n\n/** The app language, when i18next has one. An uninitialised instance reports\n * `undefined` (or an empty string), and handing either to `Intl` would pick\n * the runtime default over the browser's — the fallback below does better. */\nconst appLocale = (language: unknown): string | undefined =>\n typeof language === 'string' && language.trim() !== '' ? language : undefined;\n\nfunction decimalPlaces(n: number): number {\n if (!Number.isFinite(n)) return 0;\n const s = String(n);\n const dot = s.indexOf('.');\n if (dot === -1) return 0;\n return s.length - dot - 1;\n}\n\nfunction roundToStep(value: number, step: number): number {\n if (step <= 0 || !Number.isFinite(step)) return value;\n const precision = decimalPlaces(step);\n const factor = 10 ** precision;\n return Math.round(value * factor) / factor;\n}\n\nexport const NumberInput = forwardRef<HTMLInputElement, NumberInputProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n min,\n max,\n step = 1,\n mode = 'integer',\n currency,\n locale,\n size = 'md',\n tone,\n className,\n id,\n disabled,\n onFocus,\n onBlur,\n onKeyDown,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const ctx = useFormField();\n const inputId = id ?? ctx.id;\n const effectiveDisabled = Boolean(ctx.disabled || disabled);\n\n // The app language wins over the browser's: an Italian practice on an\n // English OS still types 72,5 — the separator the rest of the screen uses.\n const resolvedLocale =\n locale ?? appLocale(i18n.language) ?? resolveDefaultLocale();\n const localeNumber = useLocaleNumber(resolvedLocale, mode, currency);\n const {\n decimalSeparator,\n groupingSeparator,\n format: localeFormat,\n parse: localeParse,\n } = localeNumber;\n\n const innerInputRef = useRef<HTMLInputElement | null>(null);\n const composedRef = composeRefs(ref, innerInputRef);\n\n const [currentValueRaw, setCurrentValue] = useControllableState<\n number | null\n >({\n value,\n defaultValue: defaultValue ?? null,\n onChange,\n });\n const currentValue: number | null = currentValueRaw ?? null;\n\n const currentValueRef = useRef<number | null>(currentValue);\n currentValueRef.current = currentValue;\n\n const formatForEdit = useCallback(\n (n: number): string => {\n const displayed = mode === 'percentage' ? n * 100 : n;\n const raw = Number.isInteger(displayed)\n ? String(displayed)\n : displayed.toString();\n return raw.replace('.', decimalSeparator);\n },\n [mode, decimalSeparator],\n );\n\n const formatCurrent = useCallback(\n (n: number | null | undefined): string =>\n n === null || n === undefined || Number.isNaN(n) ? '' : localeFormat(n),\n [localeFormat],\n );\n\n const [inputText, setInputText] = useState<string>(() =>\n formatCurrent(currentValue),\n );\n const isFocusedRef = useRef(false);\n const [crossedBounds, setCrossedBounds] = useState(false);\n // The text on screen is not a number. Set on BLUR, never mid-typing: \"-\"\n // and \"1,\" are legitimate states on the way to a value and shouting at\n // them would make the field unusable.\n const [textNotANumber, setTextNotANumber] = useState(false);\n\n /** Can this character be part of a number in this locale? Everything else\n * is refused at the keystroke: a letter in a number field is never a typo\n * the user meant, and silently dropping it on blur is what made the field\n * look as though it validated nothing at all. Arabic-Indic and extended\n * Arabic-Indic digits pass — `parse` already normalises them. */\n const isNumberChar = useCallback(\n (ch: string): boolean => {\n if (ch >= '0' && ch <= '9') return true;\n const code = ch.codePointAt(0) ?? 0;\n if (code >= 0x0660 && code <= 0x0669) return true;\n if (code >= 0x06f0 && code <= 0x06f9) return true;\n return (\n ch === decimalSeparator ||\n ch === groupingSeparator ||\n ch === '-' ||\n ch === '\\u2212'\n );\n },\n [decimalSeparator, groupingSeparator],\n );\n\n /** Strip what could never belong to a number. Applied to whatever reaches\n * `change` — a paste of \"72,5 kg\" keeps its 72,5 rather than being\n * refused outright, which is the one case worth being lenient about. */\n const stripNonNumber = useCallback(\n (text: string): string => {\n let kept = '';\n for (const ch of text) {\n if (isNumberChar(ch)) kept += ch;\n }\n return kept;\n },\n [isNumberChar],\n );\n\n useEffect(() => {\n // Not while the reader is looking at their own invalid text: committing\n // null below would otherwise bounce back through here and erase it,\n // leaving a blank red box that says nothing about what was wrong.\n if (!isFocusedRef.current && !textNotANumber) {\n setInputText(formatCurrent(currentValue));\n }\n }, [currentValue, formatCurrent, textNotANumber]);\n\n const computedInvalid =\n crossedBounds ||\n textNotANumber ||\n (currentValue !== null &&\n ((min !== undefined && currentValue < min) ||\n (max !== undefined && currentValue > max)));\n const ariaInvalid = ctx.invalid || computedInvalid;\n const effectiveTone: 'default' | 'error' = ariaInvalid\n ? 'error'\n : (tone ?? 'default');\n\n const commitValue = (next: number | null) => {\n setCurrentValue(next);\n };\n\n const applyDelta = (multiplier: number) => {\n const base = currentValue ?? 0;\n let next = base + step * multiplier;\n if (min !== undefined) next = Math.max(min, next);\n if (max !== undefined) next = Math.min(max, next);\n next = roundToStep(next, step);\n commitValue(next);\n setCrossedBounds(false);\n setInputText(\n isFocusedRef.current ? formatForEdit(next) : formatCurrent(next),\n );\n };\n\n const jumpTo = (target: number) => {\n commitValue(target);\n setCrossedBounds(false);\n setInputText(\n isFocusedRef.current ? formatForEdit(target) : formatCurrent(target),\n );\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented) return;\n if (effectiveDisabled) return;\n\n const { key, shiftKey } = event;\n if (key === 'ArrowUp') {\n event.preventDefault();\n applyDelta(shiftKey ? 10 : 1);\n } else if (key === 'ArrowDown') {\n event.preventDefault();\n applyDelta(shiftKey ? -10 : -1);\n } else if (key === 'PageUp') {\n event.preventDefault();\n applyDelta(100);\n } else if (key === 'PageDown') {\n event.preventDefault();\n applyDelta(-100);\n } else if (key === 'Home' && min !== undefined) {\n event.preventDefault();\n jumpTo(min);\n } else if (key === 'End' && max !== undefined) {\n event.preventDefault();\n jumpTo(max);\n }\n };\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n const text = stripNonNumber(event.target.value);\n setInputText(text);\n if (text.trim() === '') {\n commitValue(null);\n setCrossedBounds(false);\n setTextNotANumber(false);\n return;\n }\n const parsed = localeParse(text);\n if (!Number.isNaN(parsed)) {\n commitValue(parsed);\n // Typing your way back to a number clears the flag immediately —\n // the reader should not have to leave the field to see it go.\n setTextNotANumber(false);\n }\n };\n\n /** Refuse a single disallowed keystroke without touching the caret.\n * Multi-character insertions (paste, IME) fall through to `change`, which\n * strips rather than refuses — losing a whole paste over a stray unit\n * would be worse than cleaning it. */\n const handleBeforeInput = (event: FormEvent<HTMLInputElement>) => {\n const { data } = event.nativeEvent as InputEvent;\n if (typeof data !== 'string' || data.length !== 1) return;\n if (!isNumberChar(data)) event.preventDefault();\n };\n\n const handleFocus = (event: FocusEvent<HTMLInputElement>) => {\n onFocus?.(event);\n isFocusedRef.current = true;\n if (currentValue !== null && currentValue !== undefined) {\n setInputText(formatForEdit(currentValue));\n }\n };\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n onBlur?.(event);\n isFocusedRef.current = false;\n\n if (inputText.trim() === '') {\n commitValue(null);\n setCrossedBounds(false);\n setTextNotANumber(false);\n setInputText('');\n return;\n }\n const parsed = localeParse(inputText);\n if (Number.isNaN(parsed)) {\n // KEEP WHAT WAS TYPED AND SAY IT IS WRONG. Reverting to the last good\n // value silently discarded the reader's input and looked like the\n // field simply ignored them; the box now goes to the error tone with\n // aria-invalid, holding no number until it is fixed.\n setTextNotANumber(true);\n setCrossedBounds(false);\n commitValue(null);\n return;\n }\n const crossed =\n (min !== undefined && parsed < min) ||\n (max !== undefined && parsed > max);\n setCrossedBounds(crossed);\n setTextNotANumber(false);\n commitValue(parsed);\n setInputText(formatCurrent(parsed));\n };\n\n const preventButtonBlur = (event: MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n };\n\n const handleIncrement = () => applyDelta(1);\n const handleDecrement = () => applyDelta(-1);\n\n const agentHandle = useMemo<NumberInputHandle>(\n () => ({\n getValue: () => currentValueRef.current,\n setValue: (next) => {\n commitValue(next);\n setInputText(\n next === null\n ? ''\n : isFocusedRef.current\n ? formatForEdit(next)\n : formatCurrent(next),\n );\n },\n clear: () => {\n commitValue(null);\n setInputText('');\n setCrossedBounds(false);\n },\n focus: () => innerInputRef.current?.focus(),\n }),\n // The handle is reconstructed per render; consumers (the agent runtime)\n // re-register only when the identity changes, which is a cheap no-op.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [formatForEdit, formatCurrent],\n );\n useAgentRegistration(numberInputAgent, agentHandle, id);\n\n const decrementDisabled =\n effectiveDisabled ||\n (min !== undefined && currentValue !== null && currentValue <= min);\n const incrementDisabled =\n effectiveDisabled ||\n (max !== undefined && currentValue !== null && currentValue >= max);\n\n const valueNow = currentValue ?? undefined;\n const valueTextNeeded =\n (mode === 'currency' || mode === 'percentage') && currentValue !== null;\n const valueText =\n valueTextNeeded && currentValue !== null\n ? localeFormat(currentValue)\n : undefined;\n\n const patternAttr =\n localeNumber.inputMode === 'numeric' ? '[0-9]*' : undefined;\n\n return (\n <div\n className={numberInputVariants({\n size,\n tone: effectiveTone,\n className,\n })}\n data-component=\"number-input\"\n data-component-id={id}\n data-mode={mode}\n >\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label={t('inputs.number.decrement', 'Decrement')}\n onClick={handleDecrement}\n onMouseDown={preventButtonBlur}\n disabled={decrementDisabled}\n className={`${spinnerButton} ds:ps-2 ds:pe-1`}\n >\n <ChevronDown aria-hidden=\"true\" className=\"ds:size-4\" />\n </button>\n <input\n ref={composedRef}\n id={inputId}\n type=\"text\"\n role=\"spinbutton\"\n inputMode={localeNumber.inputMode}\n pattern={patternAttr}\n autoComplete=\"off\"\n value={inputText}\n disabled={effectiveDisabled}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={valueNow}\n aria-valuetext={valueText}\n aria-invalid={ariaInvalid || undefined}\n aria-required={ctx.required || undefined}\n aria-describedby={ctx.describedBy || undefined}\n onBeforeInput={handleBeforeInput}\n onChange={handleInputChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n className=\"ds:flex-1 ds:w-full ds:min-w-0 ds:bg-transparent ds:outline-none ds:ps-2 ds:pe-2 ds:text-start ds:tabular-nums ds:disabled:cursor-not-allowed\"\n {...rest}\n />\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label={t('inputs.number.increment', 'Increment')}\n onClick={handleIncrement}\n onMouseDown={preventButtonBlur}\n disabled={incrementDisabled}\n className={`${spinnerButton} ds:ps-1 ds:pe-2`}\n >\n <ChevronUp aria-hidden=\"true\" className=\"ds:size-4\" />\n </button>\n </div>\n );\n },\n);\n\nNumberInput.displayName = 'NumberInput';\n"],"names":["numberInputAgent","handle","args","normalizeDigits","text","result","ch","code","useLocaleNumber","locale","mode","currency","useMemo","parts","decimalSeparator","_a","p","groupingSeparator","_b","displayFormatter","format","value","parse","normalized","trimmed","hasMinus","cleaned","n","inputMode","maximumFractionDigits","numberInputVariants","cva","spinnerButton","resolveDefaultLocale","appLocale","language","decimalPlaces","dot","roundToStep","step","factor","NumberInput","forwardRef","defaultValue","onChange","min","max","size","tone","className","id","disabled","onFocus","onBlur","onKeyDown","rest","ref","t","i18n","useTranslation","ctx","useFormField","inputId","effectiveDisabled","resolvedLocale","localeNumber","localeFormat","localeParse","innerInputRef","useRef","composedRef","composeRefs","currentValueRaw","setCurrentValue","useControllableState","currentValue","currentValueRef","formatForEdit","useCallback","displayed","formatCurrent","inputText","setInputText","useState","isFocusedRef","crossedBounds","setCrossedBounds","textNotANumber","setTextNotANumber","isNumberChar","stripNonNumber","kept","useEffect","computedInvalid","ariaInvalid","effectiveTone","commitValue","next","applyDelta","multiplier","jumpTo","target","handleKeyDown","event","key","shiftKey","handleInputChange","parsed","handleBeforeInput","data","handleFocus","handleBlur","crossed","preventButtonBlur","handleIncrement","handleDecrement","agentHandle","useAgentRegistration","decrementDisabled","incrementDisabled","valueNow","valueText","patternAttr","jsxs","jsx","ChevronDown","ChevronUp"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"signature-status-chip-DUcTgQ0E.js","sources":["../../src/components/signature-status-chip/signature-status-chip.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Badge, type BadgeProps } from '../badge';\n\n/* ------------------------------------------------------------------ */\n/* State vocabulary */\n/* ------------------------------------------------------------------ */\n\n/** One party's standing on the document. */\nexport type SignatureParty = 'signed' | 'pending' | 'notRequired';\n\n/** The chip's derived state. */\nexport type SignatureStatus = 'signed' | 'partial' | 'unsigned' | 'notRequired';\n\ntype PartyName = 'operator' | 'patient';\ntype RequiredStanding = Exclude<SignatureParty, 'notRequired'>;\n\n/**\n * The rule, exported so hosts can sort/filter by the same state the chip\n * shows: required = parties not `notRequired`; all signed → `signed`, some\n * signed → `partial`, none signed → `unsigned`, nobody required → `notRequired`.\n */\nexport function signatureStatusOf(\n operator: SignatureParty,\n patient: SignatureParty,\n): SignatureStatus {\n const required = [operator, patient].filter((p) => p !== 'notRequired');\n if (required.length === 0) return 'notRequired';\n const signed = required.filter((p) => p === 'signed').length;\n if (signed === 0) return 'unsigned';\n return signed === required.length ? 'signed' : 'partial';\n}\n\n// `partial` shares the warning tone with `unsigned` so a half-signed document\n// never reads as done at a glance — only a fully signed one goes green.\nconst STATUS_VARIANT: Record<\n SignatureStatus,\n NonNullable<BadgeProps['variant']>\n> = {\n signed: 'success',\n partial: 'warning',\n unsigned: 'warning',\n notRequired: 'neutral',\n};\n\nconst PARTY_DEFAULT: Record<PartyName, string> = {\n operator: 'Operator',\n patient: 'Patient',\n};\n\nconst STANDING_DEFAULT: Record<RequiredStanding, string> = {\n signed: 'signed',\n pending: 'pending',\n};\n\nfunction requiredParties(\n operator: SignatureParty,\n patient: SignatureParty,\n): Array<{ party: PartyName; standing: RequiredStanding }> {\n const out: Array<{ party: PartyName; standing: RequiredStanding }> = [];\n if (operator !== 'notRequired')\n out.push({ party: 'operator', standing: operator });\n if (patient !== 'notRequired')\n out.push({ party: 'patient', standing: patient });\n return out;\n}\n\n/* ------------------------------------------------------------------ */\n/* Props */\n/* ------------------------------------------------------------------ */\n\nexport interface SignatureStatusChipProps extends Omit<\n HTMLAttributes<HTMLSpanElement>,\n 'children'\n> {\n /** The operator's standing. */\n operator: SignatureParty;\n /** The patient's standing. */\n patient: SignatureParty;\n /** Chip height — maps onto the Badge `sm` / `md` sizes. */\n size?: 'sm' | 'md';\n /**\n * Spell the breakdown in the chip text (\"Signed · Operator signed · Patient\n * signed\") instead of the summary word. Default false — the breakdown is\n * always in the accessible name / title.\n */\n detail?: boolean;\n /** Agent-readiness consumer id, surfaced as `data-component-id`. */\n id?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const SignatureStatusChip = forwardRef<\n HTMLSpanElement,\n SignatureStatusChipProps\n>(\n (\n {\n operator,\n patient,\n size = 'md',\n detail = false,\n id,\n className,\n 'aria-label': ariaLabelProp,\n title: titleProp,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const status = signatureStatusOf(operator, patient);\n\n // In `partial` exactly one required party is pending, so the summary\n // names the missing signature rather than a vague \"partially signed\".\n const summary = (() => {\n switch (status) {\n case 'signed':\n return t('signatureStatusChip.signed', { defaultValue: 'Signed' });\n case 'unsigned':\n return t('signatureStatusChip.unsigned', {\n defaultValue: 'Not signed',\n });\n case 'notRequired':\n return t('signatureStatusChip.notRequired', {\n defaultValue: 'No signature required',\n });\n case 'partial':\n return operator === 'pending'\n ? t('signatureStatusChip.missingOperator', {\n defaultValue: 'Operator signature missing',\n })\n : t('signatureStatusChip.missingPatient', {\n defaultValue: 'Patient signature missing',\n });\n }\n })();\n\n const breakdown = requiredParties(operator, patient)\n .map(({ party, standing }) =>\n t('signatureStatusChip.breakdownItem', {\n defaultValue: '{{party}} {{state}}',\n party: t(`signatureStatusChip.party.${party}`, {\n defaultValue: PARTY_DEFAULT[party],\n }),\n state: t(`signatureStatusChip.state.${standing}`, {\n defaultValue: STANDING_DEFAULT[standing],\n }),\n }),\n )\n .join(' · ');\n\n // The full picture always reaches AT and hover, even in the compact form.\n const label = breakdown ? `${summary}, ${breakdown}` : summary;\n const visible = detail && breakdown ? `${summary} · ${breakdown}` : summary;\n\n return (\n <Badge\n ref={ref}\n variant={STATUS_VARIANT[status]}\n size={size}\n withDot\n role=\"img\"\n aria-label={ariaLabelProp ?? label}\n title={titleProp ?? label}\n data-component=\"signature-status-chip\"\n data-status={status}\n data-component-id={id}\n id={id}\n className={className}\n {...rest}\n >\n {visible}\n </Badge>\n );\n },\n);\n\nSignatureStatusChip.displayName = 'SignatureStatusChip';\n"],"names":["signatureStatusOf","operator","patient","required","p","signed","STATUS_VARIANT","PARTY_DEFAULT","STANDING_DEFAULT","requiredParties","out","SignatureStatusChip","forwardRef","size","detail","id","className","ariaLabelProp","titleProp","rest","ref","t","useTranslation","status","summary","breakdown","party","standing","label","visible","jsx","Badge"],"mappings":"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"}