@alfadocs/ui-kit-debug 1.3.11 → 1.3.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 (72) hide show
  1. package/dist/_chunks/{anamnesis-i18n-DFXSM72N.js → anamnesis-i18n-CfC0qYzy.js} +883 -875
  2. package/dist/_chunks/anamnesis-i18n-CfC0qYzy.js.map +1 -0
  3. package/dist/_chunks/{appointment-timeline-BB-c1LeR.js → appointment-timeline-B630OT_J.js} +2 -2
  4. package/dist/_chunks/{appointment-timeline-BB-c1LeR.js.map → appointment-timeline-B630OT_J.js.map} +1 -1
  5. package/dist/_chunks/{bmi-calculator-Bk2GAju7.js → bmi-calculator-CM0-G2mg.js} +2 -2
  6. package/dist/_chunks/{bmi-calculator-Bk2GAju7.js.map → bmi-calculator-CM0-G2mg.js.map} +1 -1
  7. package/dist/_chunks/{booking-BxFV0hT5.js → booking-DjNbd7C1.js} +2 -2
  8. package/dist/_chunks/{booking-BxFV0hT5.js.map → booking-DjNbd7C1.js.map} +1 -1
  9. package/dist/_chunks/{cycle-calculator-DNvvr0bP.js → cycle-calculator-BwqYVPB4.js} +3 -3
  10. package/dist/_chunks/{cycle-calculator-DNvvr0bP.js.map → cycle-calculator-BwqYVPB4.js.map} +1 -1
  11. package/dist/_chunks/{date-picker-BP_W6VtE.js → date-picker-ZHejTVAJ.js} +81 -77
  12. package/dist/_chunks/date-picker-ZHejTVAJ.js.map +1 -0
  13. package/dist/_chunks/{due-date-calculator-BEcdoy_E.js → due-date-calculator-CwfsFd3T.js} +3 -3
  14. package/dist/_chunks/{due-date-calculator-BEcdoy_E.js.map → due-date-calculator-CwfsFd3T.js.map} +1 -1
  15. package/dist/_chunks/{fetal-weight-1F9N4IMx.js → fetal-weight-ePlLjJPc.js} +2 -2
  16. package/dist/_chunks/{fetal-weight-1F9N4IMx.js.map → fetal-weight-ePlLjJPc.js.map} +1 -1
  17. package/dist/_chunks/{gestational-age-calculator-CuGkVqKp.js → gestational-age-calculator-DdgbH69Z.js} +2 -2
  18. package/dist/_chunks/{gestational-age-calculator-CuGkVqKp.js.map → gestational-age-calculator-DdgbH69Z.js.map} +1 -1
  19. package/dist/_chunks/{hcg-doubling-fZ6qQN08.js → hcg-doubling-BBqD2wI2.js} +2 -2
  20. package/dist/_chunks/{hcg-doubling-fZ6qQN08.js.map → hcg-doubling-BBqD2wI2.js.map} +1 -1
  21. package/dist/_chunks/{link-cell-renderer-_DlEZHLI.js → link-cell-renderer-C5XLwVXQ.js} +2 -2
  22. package/dist/_chunks/{link-cell-renderer-_DlEZHLI.js.map → link-cell-renderer-C5XLwVXQ.js.map} +1 -1
  23. package/dist/_chunks/number-input-DrozbZAU.js +370 -0
  24. package/dist/_chunks/number-input-DrozbZAU.js.map +1 -0
  25. package/dist/_chunks/{optical-prescription-BEjYQjiO.js → optical-prescription-BDHJr8Zz.js} +2 -2
  26. package/dist/_chunks/{optical-prescription-BEjYQjiO.js.map → optical-prescription-BDHJr8Zz.js.map} +1 -1
  27. package/dist/_chunks/{patient-details-BAUg0FWs.js → patient-details-DqjjwPmt.js} +3 -3
  28. package/dist/_chunks/{patient-details-BAUg0FWs.js.map → patient-details-DqjjwPmt.js.map} +1 -1
  29. package/dist/_chunks/{patient-table-C7QHFC63.js → patient-table-BmIDrLIS.js} +2 -2
  30. package/dist/_chunks/{patient-table-C7QHFC63.js.map → patient-table-BmIDrLIS.js.map} +1 -1
  31. package/dist/_chunks/{pregnancy-dating-BdFl-rB1.js → pregnancy-dating-DzYTlBkT.js} +3 -3
  32. package/dist/_chunks/{pregnancy-dating-BdFl-rB1.js.map → pregnancy-dating-DzYTlBkT.js.map} +1 -1
  33. package/dist/_chunks/{pregnancy-weight-gain-B-CkVYnU.js → pregnancy-weight-gain-O6J0sUIi.js} +2 -2
  34. package/dist/_chunks/{pregnancy-weight-gain-B-CkVYnU.js.map → pregnancy-weight-gain-O6J0sUIi.js.map} +1 -1
  35. package/dist/_chunks/{radiograph-panel.agent-AsXJBr1p.js → radiograph-panel.agent-BQZ64Riy.js} +2 -2
  36. package/dist/_chunks/{radiograph-panel.agent-AsXJBr1p.js.map → radiograph-panel.agent-BQZ64Riy.js.map} +1 -1
  37. package/dist/_chunks/{unit-converter-CSLWFDQh.js → unit-converter-COgkN7YP.js} +2 -2
  38. package/dist/_chunks/{unit-converter-CSLWFDQh.js.map → unit-converter-COgkN7YP.js.map} +1 -1
  39. package/dist/agent-catalog.json +1 -1
  40. package/dist/components/appointment-timeline/index.js +1 -1
  41. package/dist/components/bmi-calculator/index.js +1 -1
  42. package/dist/components/booking/index.js +1 -1
  43. package/dist/components/cycle-calculator/index.js +1 -1
  44. package/dist/components/data-table/index.js +1 -1
  45. package/dist/components/date-picker/date-picker.d.ts +8 -0
  46. package/dist/components/date-picker/date-picker.d.ts.map +1 -1
  47. package/dist/components/date-picker/index.js +1 -1
  48. package/dist/components/due-date-calculator/index.js +1 -1
  49. package/dist/components/fetal-weight/index.js +1 -1
  50. package/dist/components/gestational-age-calculator/index.js +1 -1
  51. package/dist/components/hcg-doubling/index.js +1 -1
  52. package/dist/components/number-input/index.js +1 -1
  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/radiograph-panel/index.js +1 -1
  60. package/dist/components/unit-converter/index.js +1 -1
  61. package/dist/index.js +19 -19
  62. package/dist/patterns/anamnesis/anamnesis-derive.d.ts +16 -0
  63. package/dist/patterns/anamnesis/anamnesis-derive.d.ts.map +1 -1
  64. package/dist/patterns/anamnesis/anamnesis-questionnaire.d.ts.map +1 -1
  65. package/dist/patterns/anamnesis/anamnesis-target-strip.d.ts +4 -3
  66. package/dist/patterns/anamnesis/anamnesis-target-strip.d.ts.map +1 -1
  67. package/dist/patterns/anamnesis/index.js +1 -1
  68. package/package.json +1 -1
  69. package/dist/_chunks/anamnesis-i18n-DFXSM72N.js.map +0 -1
  70. package/dist/_chunks/date-picker-BP_W6VtE.js.map +0 -1
  71. package/dist/_chunks/number-input-DjWzmlEY.js +0 -350
  72. package/dist/_chunks/number-input-DjWzmlEY.js.map +0 -1
@@ -0,0 +1,370 @@
1
+ import { jsxs as we, jsx as F } from "react/jsx-runtime";
2
+ import { useMemo as Y, forwardRef as Ie, useRef as L, useCallback as z, useState as q, useEffect as De } from "react";
3
+ import { c as xe } from "./index-D2ZczOXr.js";
4
+ import { useTranslation as Ce } from "react-i18next";
5
+ import { u as Fe } from "./use-controllable-state-BiY4xTzM.js";
6
+ import { u as Se } from "./form-field-context-B3APVHKx.js";
7
+ import { c as Ve } from "./compose-refs-C0k0tdqF.js";
8
+ import { u as Me } from "./registry-DvAUVLHh.js";
9
+ import { C as ke } from "./chevron-down-DWE7GSq9.js";
10
+ import { C as Te } from "./chevron-up-umRGgtJA.js";
11
+ const Pe = {
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 ze(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 Re(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 = ze(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 Ae = xe(
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(" "), je = () => typeof navigator < "u" && navigator.language ? navigator.language : "en-US";
157
+ function Be(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 Ee(n, s) {
163
+ if (s <= 0 || !Number.isFinite(s)) return n;
164
+ const r = 10 ** Be(s);
165
+ return Math.round(n * r) / r;
166
+ }
167
+ const Ue = Ie(
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 } = Ce(), D = Se(), Z = a ?? D.id, T = !!(D.disabled || k), ee = A ?? je(), j = Re(ee, p, R), {
189
+ decimalSeparator: P,
190
+ groupingSeparator: W,
191
+ format: B,
192
+ parse: O
193
+ } = j, _ = L(null), te = Ve(N, _), [ne, re] = Fe({
194
+ value: n,
195
+ defaultValue: s ?? null,
196
+ onChange: l
197
+ }), i = ne ?? null, $ = L(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 = L(!1), [se, b] = q(!1), [U, C] = q(!1), K = 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
+ ), oe = z(
218
+ (e) => {
219
+ let t = "";
220
+ for (const o of e)
221
+ K(o) && (t += o);
222
+ return t;
223
+ },
224
+ [K]
225
+ );
226
+ De(() => {
227
+ !y.current && !U && c(v(i));
228
+ }, [i, v, U]);
229
+ const ie = se || U || i !== null && (r !== void 0 && i < r || u !== void 0 && i > u), G = D.invalid || ie, ae = G ? "error" : V ?? "default", f = (e) => {
230
+ re(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 = Ee(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
+ }, ue = (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
+ }, le = (e) => {
245
+ const t = oe(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
+ }, de = (e) => {
253
+ const { data: t } = e.nativeEvent;
254
+ typeof t != "string" || t.length !== 1 || K(t) || e.preventDefault();
255
+ }, ce = (e) => {
256
+ h == null || h(e), y.current = !0, i != null && c(x(i));
257
+ }, fe = (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
+ }, pe = () => w(1), me = () => w(-1), ve = 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
+ Me(Pe, ve, a);
293
+ const be = T || r !== void 0 && i !== null && i <= r, ge = T || u !== void 0 && i !== null && i >= u, he = i ?? void 0, Ne = (p === "currency" || p === "percentage") && i !== null && i !== null ? B(i) : void 0, ye = j.inputMode === "numeric" ? "[0-9]*" : void 0;
294
+ return /* @__PURE__ */ we(
295
+ "div",
296
+ {
297
+ className: Ae({
298
+ size: g,
299
+ tone: ae,
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: me,
313
+ onMouseDown: Q,
314
+ disabled: be,
315
+ className: `${X} ds:ps-2 ds:pe-1`,
316
+ children: /* @__PURE__ */ F(ke, { "aria-hidden": "true", className: "ds:size-4" })
317
+ }
318
+ ),
319
+ /* @__PURE__ */ F(
320
+ "input",
321
+ {
322
+ ref: te,
323
+ id: Z,
324
+ type: "text",
325
+ role: "spinbutton",
326
+ inputMode: j.inputMode,
327
+ pattern: ye,
328
+ autoComplete: "off",
329
+ value: E,
330
+ disabled: T,
331
+ "aria-valuemin": r,
332
+ "aria-valuemax": u,
333
+ "aria-valuenow": he,
334
+ "aria-valuetext": Ne,
335
+ "aria-invalid": G || void 0,
336
+ "aria-required": D.required || void 0,
337
+ "aria-describedby": D.describedBy || void 0,
338
+ onBeforeInput: de,
339
+ onChange: le,
340
+ onFocus: ce,
341
+ onBlur: fe,
342
+ onKeyDown: ue,
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: pe,
354
+ onMouseDown: Q,
355
+ disabled: ge,
356
+ className: `${X} ds:ps-1 ds:pe-2`,
357
+ children: /* @__PURE__ */ F(Te, { "aria-hidden": "true", className: "ds:size-4" })
358
+ }
359
+ )
360
+ ]
361
+ }
362
+ );
363
+ }
364
+ );
365
+ Ue.displayName = "NumberInput";
366
+ export {
367
+ Ue as N,
368
+ Re as u
369
+ };
370
+ //# sourceMappingURL=number-input-DrozbZAU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number-input-DrozbZAU.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 `navigator.language` or `'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\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 } = useTranslation();\n const ctx = useFormField();\n const inputId = id ?? ctx.id;\n const effectiveDisabled = Boolean(ctx.disabled || disabled);\n\n const resolvedLocale = locale ?? 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","decimalPlaces","dot","roundToStep","step","factor","NumberInput","forwardRef","defaultValue","onChange","min","max","size","tone","className","id","disabled","onFocus","onBlur","onKeyDown","rest","ref","t","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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"}
@@ -3,7 +3,7 @@ import { forwardRef as We, useId as je, useRef as ue, useState as Xe, useCallbac
3
3
  import { c as He } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as Fe } from "react-i18next";
5
5
  import { u as qe } from "./registry-DvAUVLHh.js";
6
- import { N as se } from "./number-input-DjWzmlEY.js";
6
+ import { N as se } from "./number-input-DrozbZAU.js";
7
7
  import { S as he } from "./select-BW5ecXlX.js";
8
8
  import { T as Ke } from "./text-area-Bt3p7Pt0.js";
9
9
  import { D as v } from "./description-list-ClNLdRMy.js";
@@ -1257,4 +1257,4 @@ export {
1257
1257
  yt as y,
1258
1258
  Re as z
1259
1259
  };
1260
- //# sourceMappingURL=optical-prescription-BEjYQjiO.js.map
1260
+ //# sourceMappingURL=optical-prescription-BDHJr8Zz.js.map