@alfadocs/ui-kit-debug 0.63.0 → 0.64.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/dist/_chunks/{ai-prompt-input-C6sCr1Vi.js → ai-prompt-input-Dx8eXoPm.js} +2 -2
  2. package/dist/_chunks/{ai-prompt-input-C6sCr1Vi.js.map → ai-prompt-input-Dx8eXoPm.js.map} +1 -1
  3. package/dist/_chunks/{audio-recorder-D6OVfNiZ.js → audio-recorder-CdXuT9ln.js} +2 -2
  4. package/dist/_chunks/{audio-recorder-D6OVfNiZ.js.map → audio-recorder-CdXuT9ln.js.map} +1 -1
  5. package/dist/_chunks/{bishop-score-B9tvgoIq.js → bishop-score-CzjSx-dm.js} +2 -2
  6. package/dist/_chunks/{bishop-score-B9tvgoIq.js.map → bishop-score-CzjSx-dm.js.map} +1 -1
  7. package/dist/_chunks/{booking-BUV9fspj.js → booking-ChfvWy3P.js} +2 -2
  8. package/dist/_chunks/{booking-BUV9fspj.js.map → booking-ChfvWy3P.js.map} +1 -1
  9. package/dist/_chunks/{care-plan-card-QmNpGggC.js → care-plan-card-DhZNoXs4.js} +2 -2
  10. package/dist/_chunks/{care-plan-card-QmNpGggC.js.map → care-plan-card-DhZNoXs4.js.map} +1 -1
  11. package/dist/_chunks/{care-plan-entry-card-Cnra7vUc.js → care-plan-entry-card-DW70yBOD.js} +2 -2
  12. package/dist/_chunks/{care-plan-entry-card-Cnra7vUc.js.map → care-plan-entry-card-DW70yBOD.js.map} +1 -1
  13. package/dist/_chunks/{editable-currency-cell-renderer-D5C5tCfu.js → editable-currency-cell-renderer-BQgaKFCz.js} +2 -2
  14. package/dist/_chunks/{editable-currency-cell-renderer-D5C5tCfu.js.map → editable-currency-cell-renderer-BQgaKFCz.js.map} +1 -1
  15. package/dist/_chunks/{gestational-age-calculator-AkNFfZYs.js → gestational-age-calculator-D85E8lGN.js} +2 -2
  16. package/dist/_chunks/{gestational-age-calculator-AkNFfZYs.js.map → gestational-age-calculator-D85E8lGN.js.map} +1 -1
  17. package/dist/_chunks/{pregnancy-dating-Dg6dTe1p.js → pregnancy-dating-7NUaAfob.js} +2 -2
  18. package/dist/_chunks/{pregnancy-dating-Dg6dTe1p.js.map → pregnancy-dating-7NUaAfob.js.map} +1 -1
  19. package/dist/_chunks/{select-hsCaJSX3.js → select-CEtRcon5.js} +46 -45
  20. package/dist/_chunks/select-CEtRcon5.js.map +1 -0
  21. package/dist/_chunks/{tabs-BpPYVme_.js → tabs-BIQ0ew1T.js} +2 -2
  22. package/dist/_chunks/{tabs-BpPYVme_.js.map → tabs-BIQ0ew1T.js.map} +1 -1
  23. package/dist/_chunks/tooth-scheme-CiphQaON.js +1257 -0
  24. package/dist/_chunks/tooth-scheme-CiphQaON.js.map +1 -0
  25. package/dist/_chunks/{unit-converter-3sINXO3m.js → unit-converter-BIbXHIQA.js} +2 -2
  26. package/dist/_chunks/{unit-converter-3sINXO3m.js.map → unit-converter-BIbXHIQA.js.map} +1 -1
  27. package/dist/agent-catalog.json +41 -4
  28. package/dist/components/ai-prompt-input/index.js +1 -1
  29. package/dist/components/audio-recorder/index.js +1 -1
  30. package/dist/components/bishop-score/index.js +1 -1
  31. package/dist/components/booking/index.js +1 -1
  32. package/dist/components/care-plan-card/index.js +1 -1
  33. package/dist/components/care-plan-entry-card/index.js +1 -1
  34. package/dist/components/data-table/index.js +1 -1
  35. package/dist/components/gestational-age-calculator/index.js +1 -1
  36. package/dist/components/pregnancy-dating/index.js +1 -1
  37. package/dist/components/select/index.js +1 -1
  38. package/dist/components/select/select.d.ts +8 -0
  39. package/dist/components/select/select.d.ts.map +1 -1
  40. package/dist/components/tabs/index.js +1 -1
  41. package/dist/components/tooth-scheme/index.d.ts +2 -2
  42. package/dist/components/tooth-scheme/index.d.ts.map +1 -1
  43. package/dist/components/tooth-scheme/index.js +22 -15
  44. package/dist/components/tooth-scheme/tooth-data.d.ts +79 -18
  45. package/dist/components/tooth-scheme/tooth-data.d.ts.map +1 -1
  46. package/dist/components/tooth-scheme/tooth-scheme.agent.d.ts +2 -0
  47. package/dist/components/tooth-scheme/tooth-scheme.agent.d.ts.map +1 -1
  48. package/dist/components/tooth-scheme/tooth-scheme.d.ts +48 -1
  49. package/dist/components/tooth-scheme/tooth-scheme.d.ts.map +1 -1
  50. package/dist/components/unit-converter/index.js +1 -1
  51. package/dist/i18n/locales/ar.d.ts +17 -0
  52. package/dist/i18n/locales/ar.d.ts.map +1 -1
  53. package/dist/i18n/locales/ar.js +18 -1
  54. package/dist/i18n/locales/ar.js.map +1 -1
  55. package/dist/i18n/locales/de.d.ts +17 -0
  56. package/dist/i18n/locales/de.d.ts.map +1 -1
  57. package/dist/i18n/locales/de.js +18 -1
  58. package/dist/i18n/locales/de.js.map +1 -1
  59. package/dist/i18n/locales/el.d.ts +17 -0
  60. package/dist/i18n/locales/el.d.ts.map +1 -1
  61. package/dist/i18n/locales/el.js +18 -1
  62. package/dist/i18n/locales/el.js.map +1 -1
  63. package/dist/i18n/locales/en.d.ts +17 -0
  64. package/dist/i18n/locales/en.d.ts.map +1 -1
  65. package/dist/i18n/locales/en.js +18 -1
  66. package/dist/i18n/locales/en.js.map +1 -1
  67. package/dist/i18n/locales/es.d.ts +17 -0
  68. package/dist/i18n/locales/es.d.ts.map +1 -1
  69. package/dist/i18n/locales/es.js +18 -1
  70. package/dist/i18n/locales/es.js.map +1 -1
  71. package/dist/i18n/locales/fr.d.ts +17 -0
  72. package/dist/i18n/locales/fr.d.ts.map +1 -1
  73. package/dist/i18n/locales/fr.js +18 -1
  74. package/dist/i18n/locales/fr.js.map +1 -1
  75. package/dist/i18n/locales/hi.d.ts +17 -0
  76. package/dist/i18n/locales/hi.d.ts.map +1 -1
  77. package/dist/i18n/locales/hi.js +18 -1
  78. package/dist/i18n/locales/hi.js.map +1 -1
  79. package/dist/i18n/locales/it.d.ts +17 -0
  80. package/dist/i18n/locales/it.d.ts.map +1 -1
  81. package/dist/i18n/locales/it.js +18 -1
  82. package/dist/i18n/locales/it.js.map +1 -1
  83. package/dist/i18n/locales/ja.d.ts +17 -0
  84. package/dist/i18n/locales/ja.d.ts.map +1 -1
  85. package/dist/i18n/locales/ja.js +18 -1
  86. package/dist/i18n/locales/ja.js.map +1 -1
  87. package/dist/i18n/locales/nl.d.ts +17 -0
  88. package/dist/i18n/locales/nl.d.ts.map +1 -1
  89. package/dist/i18n/locales/nl.js +18 -1
  90. package/dist/i18n/locales/nl.js.map +1 -1
  91. package/dist/i18n/locales/pl.d.ts +17 -0
  92. package/dist/i18n/locales/pl.d.ts.map +1 -1
  93. package/dist/i18n/locales/pl.js +18 -1
  94. package/dist/i18n/locales/pl.js.map +1 -1
  95. package/dist/i18n/locales/pt.d.ts +17 -0
  96. package/dist/i18n/locales/pt.d.ts.map +1 -1
  97. package/dist/i18n/locales/pt.js +18 -1
  98. package/dist/i18n/locales/pt.js.map +1 -1
  99. package/dist/i18n/locales/ro.d.ts +17 -0
  100. package/dist/i18n/locales/ro.d.ts.map +1 -1
  101. package/dist/i18n/locales/ro.js +18 -1
  102. package/dist/i18n/locales/ro.js.map +1 -1
  103. package/dist/i18n/locales/ru.d.ts +17 -0
  104. package/dist/i18n/locales/ru.d.ts.map +1 -1
  105. package/dist/i18n/locales/ru.js +18 -1
  106. package/dist/i18n/locales/ru.js.map +1 -1
  107. package/dist/i18n/locales/sq.d.ts +17 -0
  108. package/dist/i18n/locales/sq.d.ts.map +1 -1
  109. package/dist/i18n/locales/sq.js +18 -1
  110. package/dist/i18n/locales/sq.js.map +1 -1
  111. package/dist/i18n/locales/sv.d.ts +17 -0
  112. package/dist/i18n/locales/sv.d.ts.map +1 -1
  113. package/dist/i18n/locales/sv.js +18 -1
  114. package/dist/i18n/locales/sv.js.map +1 -1
  115. package/dist/i18n/locales/tr.d.ts +17 -0
  116. package/dist/i18n/locales/tr.d.ts.map +1 -1
  117. package/dist/i18n/locales/tr.js +18 -1
  118. package/dist/i18n/locales/tr.js.map +1 -1
  119. package/dist/i18n/locales/zh.d.ts +17 -0
  120. package/dist/i18n/locales/zh.d.ts.map +1 -1
  121. package/dist/i18n/locales/zh.js +18 -1
  122. package/dist/i18n/locales/zh.js.map +1 -1
  123. package/dist/index.js +180 -173
  124. package/dist/locales/ar.json +18 -1
  125. package/dist/locales/de.json +18 -1
  126. package/dist/locales/el.json +18 -1
  127. package/dist/locales/en.json +18 -1
  128. package/dist/locales/es.json +18 -1
  129. package/dist/locales/fr.json +18 -1
  130. package/dist/locales/hi.json +18 -1
  131. package/dist/locales/it.json +18 -1
  132. package/dist/locales/ja.json +18 -1
  133. package/dist/locales/nl.json +18 -1
  134. package/dist/locales/pl.json +18 -1
  135. package/dist/locales/pt.json +18 -1
  136. package/dist/locales/ro.json +18 -1
  137. package/dist/locales/ru.json +18 -1
  138. package/dist/locales/sq.json +18 -1
  139. package/dist/locales/sv.json +18 -1
  140. package/dist/locales/tr.json +18 -1
  141. package/dist/locales/zh.json +18 -1
  142. package/dist/tokens.css +1 -1
  143. package/package.json +1 -1
  144. package/dist/_chunks/select-hsCaJSX3.js.map +0 -1
  145. package/dist/_chunks/tooth-scheme-CxlsLjfN.js +0 -753
  146. package/dist/_chunks/tooth-scheme-CxlsLjfN.js.map +0 -1
@@ -0,0 +1,1257 @@
1
+ import { jsx as u, jsxs as j } from "react/jsx-runtime";
2
+ import { forwardRef as Tt, useState as H, useRef as de, useEffect as ne, useMemo as Te, useCallback as E, useImperativeHandle as St } from "react";
3
+ import * as K from "@radix-ui/react-tooltip";
4
+ import { c as Y } from "./index-D2ZczOXr.js";
5
+ import { useTranslation as nt } from "react-i18next";
6
+ import { u as Lt } from "./registry-nPAVE19X.js";
7
+ import { I as It } from "./icon-button-CKEOrN37.js";
8
+ import { P as Se } from "./popover-Devce-tT.js";
9
+ import { S as kt } from "./select-CEtRcon5.js";
10
+ import { S as Ot } from "./switch-BJ6HD3Mn.js";
11
+ import { S as At } from "./settings-ca2Yi9R8.js";
12
+ const Ct = {
13
+ id: "tooth-scheme",
14
+ // pick — focus/select a tooth; edit_inline — record/clear findings;
15
+ // view_change — the side/plan projection + dentition are view props.
16
+ capabilities: ["pick", "edit_inline", "view_change"],
17
+ state: {
18
+ chart: {
19
+ type: "object",
20
+ description: "Current dental chart — findings (and marked surfaces) keyed by FDI id.",
21
+ read: (t) => t.getChart()
22
+ },
23
+ chartedTeeth: {
24
+ type: "string[]",
25
+ description: "FDI ids of every tooth carrying at least one finding.",
26
+ read: (t) => Object.keys(t.getChart())
27
+ }
28
+ },
29
+ actions: {
30
+ focus_tooth: {
31
+ safety: "read",
32
+ argsType: "{ id: FdiId }",
33
+ description: "Move focus to a specific tooth by FDI id.",
34
+ invoke: (t, n) => {
35
+ t.focusTooth(n.id);
36
+ }
37
+ },
38
+ get_tooth: {
39
+ safety: "read",
40
+ argsType: "{ id: FdiId }",
41
+ description: "Read the findings recorded on one tooth (FDI id).",
42
+ invoke: (t, n) => t.getTooth(n.id)
43
+ },
44
+ teeth_with: {
45
+ safety: "read",
46
+ argsType: "{ condition: ToothCondition }",
47
+ description: "List the FDI ids of every tooth carrying a given finding (e.g. all teeth with caries).",
48
+ invoke: (t, n) => t.teethWith(n.condition)
49
+ },
50
+ set_finding: {
51
+ safety: "write",
52
+ argsType: "{ id: FdiId; condition: ToothCondition; surfaces?: Surface[] }",
53
+ description: "Record a finding on a tooth (crown, implant, root canal, caries, …). Optionally mark the affected surfaces for a surface finding.",
54
+ invoke: (t, n) => {
55
+ t.setFinding(n.id, n.condition, n.surfaces);
56
+ }
57
+ },
58
+ remove_finding: {
59
+ safety: "write",
60
+ argsType: "{ id: FdiId; condition: ToothCondition }",
61
+ description: "Remove a single finding from a tooth.",
62
+ invoke: (t, n) => {
63
+ t.removeFinding(n.id, n.condition);
64
+ }
65
+ },
66
+ clear_tooth: {
67
+ safety: "destructive",
68
+ argsType: "{ id: FdiId }",
69
+ description: "Clear every finding from a tooth.",
70
+ invoke: (t, n) => {
71
+ t.clearTooth(n.id);
72
+ }
73
+ }
74
+ },
75
+ domHooks: {
76
+ root: { attr: "data-component", value: "tooth-scheme" },
77
+ instanceId: {
78
+ attr: "data-component-id",
79
+ sourceProp: "id",
80
+ description: "Sourced from the id prop."
81
+ },
82
+ item: {
83
+ attr: "data-fdi",
84
+ description: "Each rendered tooth `<g>` carries its FDI id as `data-fdi`. The `data-projection` attribute on the root exposes the side/plan view."
85
+ }
86
+ }
87
+ }, Ae = [
88
+ // upper
89
+ "18",
90
+ "17",
91
+ "16",
92
+ "15",
93
+ "14",
94
+ "13",
95
+ "12",
96
+ "11",
97
+ "21",
98
+ "22",
99
+ "23",
100
+ "24",
101
+ "25",
102
+ "26",
103
+ "27",
104
+ "28",
105
+ // lower
106
+ "48",
107
+ "47",
108
+ "46",
109
+ "45",
110
+ "44",
111
+ "43",
112
+ "42",
113
+ "41",
114
+ "31",
115
+ "32",
116
+ "33",
117
+ "34",
118
+ "35",
119
+ "36",
120
+ "37",
121
+ "38"
122
+ ], Ce = [
123
+ // upper
124
+ "55",
125
+ "54",
126
+ "53",
127
+ "52",
128
+ "51",
129
+ "61",
130
+ "62",
131
+ "63",
132
+ "64",
133
+ "65",
134
+ // lower
135
+ "85",
136
+ "84",
137
+ "83",
138
+ "82",
139
+ "81",
140
+ "71",
141
+ "72",
142
+ "73",
143
+ "74",
144
+ "75"
145
+ ];
146
+ function Dt(t) {
147
+ return t <= 2 ? "incisor" : t === 3 ? "canine" : t <= 5 ? "premolar" : "molar";
148
+ }
149
+ function Mt(t) {
150
+ return t <= 2 ? "incisor" : t === 3 ? "canine" : "molar";
151
+ }
152
+ function Nt(t, n) {
153
+ const i = (t - 1) % 4 + 1;
154
+ return `${i === 1 ? "UR" : i === 2 ? "UL" : i === 3 ? "LL" : "LR"}${n}`;
155
+ }
156
+ function Rt(t, n) {
157
+ switch (t) {
158
+ case 1:
159
+ return String(1 + (8 - n));
160
+ case 2:
161
+ return String(8 + n);
162
+ case 3:
163
+ return String(17 + (8 - n));
164
+ case 4:
165
+ return String(24 + n);
166
+ default:
167
+ return "";
168
+ }
169
+ }
170
+ function _t(t, n) {
171
+ const i = "ABCDEFGHIJKLMNOPQRST";
172
+ let r = -1;
173
+ switch (t) {
174
+ case 5:
175
+ r = 0 + (5 - n);
176
+ break;
177
+ case 6:
178
+ r = 5 + (n - 1);
179
+ break;
180
+ case 7:
181
+ r = 10 + (5 - n);
182
+ break;
183
+ case 8:
184
+ r = 15 + (n - 1);
185
+ break;
186
+ default:
187
+ r = -1;
188
+ }
189
+ return r >= 0 ? i[r] : "";
190
+ }
191
+ function Et(t) {
192
+ const n = Number(t[0]), i = Number(t[1]), r = n >= 5, l = r ? Mt(i) : Dt(i), m = n === 1 || n === 2 || n === 5 || n === 6 ? "upper" : "lower", $ = n === 1 || n === 4 || n === 5 || n === 8 ? "right" : "left", v = r ? _t(n, i) : Rt(n, i), f = Nt(n, i);
193
+ return {
194
+ fdi: t,
195
+ universal: v,
196
+ palmer: f,
197
+ quadrant: n,
198
+ positionInQuadrant: i,
199
+ anatomy: l,
200
+ arch: m,
201
+ side: $,
202
+ dentition: r ? "primary" : "permanent"
203
+ };
204
+ }
205
+ const F = [
206
+ ...Ae,
207
+ ...Ce
208
+ ].reduce((t, n) => (t[n] = Et(n), t), {}), jt = Object.fromEntries(
209
+ Object.entries(F).map(([t, n]) => [t, n.universal])
210
+ ), Ft = Object.fromEntries(
211
+ Object.entries(F).map(([t, n]) => [t, n.palmer])
212
+ );
213
+ function Me(t) {
214
+ return t.dentition !== "primary" ? t.fdi : `${t.quadrant - 4}${t.positionInQuadrant}`;
215
+ }
216
+ const Ht = 0.72, hn = {
217
+ caries: "--destructive",
218
+ filled: "--info",
219
+ crowned: "--warning",
220
+ temporaryCrown: "--warning",
221
+ bridge: "--primary",
222
+ missing: "--muted-foreground",
223
+ implant: "--accent",
224
+ implantExtraction: "--accent",
225
+ stub: "--muted-foreground",
226
+ destroyed: "--destructive",
227
+ rootCanal: "--primary"
228
+ }, ue = {
229
+ caries: "var(--destructive)",
230
+ filled: "var(--info)",
231
+ crowned: "var(--warning)",
232
+ temporaryCrown: "var(--warning)",
233
+ bridge: "var(--primary)",
234
+ missing: "var(--muted-foreground)",
235
+ implant: "var(--accent)",
236
+ implantExtraction: "var(--accent)",
237
+ stub: "var(--muted-foreground)",
238
+ destroyed: "var(--destructive)",
239
+ rootCanal: "var(--primary)"
240
+ }, De = {
241
+ crowned: { folder: "crown", resolve: "per-fdi" },
242
+ temporaryCrown: { folder: "temporaryCrown", resolve: "per-fdi" },
243
+ bridge: { folder: "replacement", resolve: "per-fdi" },
244
+ destroyed: { folder: "destroyed", resolve: "per-fdi" },
245
+ implant: { folder: "implant", resolve: "general" },
246
+ implantExtraction: { folder: "implantExtraction", resolve: "general" },
247
+ stub: { folder: "stub", resolve: "general" },
248
+ rootCanal: { folder: "rootTreatment", resolve: "rct" }
249
+ };
250
+ function rt(t, n, i) {
251
+ const r = t.arch === "upper" ? "top" : "bottom", l = `${n}/side/${i.folder}/${r}`;
252
+ if (i.resolve === "general") return `${l}/general.webp`;
253
+ const m = Me(t);
254
+ return i.resolve === "rct" ? `${l}/${m}/full.webp` : `${l}/${m}.webp`;
255
+ }
256
+ const qt = {
257
+ mesial: "mesial",
258
+ distal: "distal",
259
+ occlusal: "occlusal",
260
+ buccal: "vestibular",
261
+ lingual: "oral"
262
+ }, Wt = {
263
+ caries: "caries",
264
+ filled: "filling"
265
+ };
266
+ function Pt(t, n, i, r) {
267
+ const l = t.arch === "upper" ? "top" : "bottom";
268
+ return `${n}/plan/${i}/${l}/${Me(t)}-${qt[r]}.webp`;
269
+ }
270
+ function Le(t) {
271
+ return t.anatomy === "molar" || t.anatomy === "premolar" ? ["top", "bottom", "left", "right", "center"] : ["top", "bottom", "left", "right"];
272
+ }
273
+ function Ge(t, n) {
274
+ if (n === "center") return "occlusal";
275
+ if (n === "top") return t.arch === "upper" ? "buccal" : "lingual";
276
+ if (n === "bottom") return t.arch === "upper" ? "lingual" : "buccal";
277
+ const i = t.quadrant <= 4 ? t.quadrant : t.quadrant - 4, r = i === 1 || i === 4;
278
+ return n === "left" ? r ? "distal" : "mesial" : r ? "mesial" : "distal";
279
+ }
280
+ const Qe = (t) => Math.round(t * 100) / 100;
281
+ function Ut(t, n, i) {
282
+ const { x: r, y: l, w: m, h: $ } = n, v = r + m, f = l + $, a = (O, M) => `${Qe(O)} ${Qe(M)}`;
283
+ if (!i) {
284
+ const O = r + m / 2, M = l + $ / 2;
285
+ switch (t) {
286
+ case "top":
287
+ return `M ${a(r, l)} L ${a(v, l)} L ${a(O, M)} Z`;
288
+ case "bottom":
289
+ return `M ${a(r, f)} L ${a(v, f)} L ${a(O, M)} Z`;
290
+ case "left":
291
+ return `M ${a(r, l)} L ${a(O, M)} L ${a(r, f)} Z`;
292
+ case "right":
293
+ return `M ${a(v, l)} L ${a(O, M)} L ${a(v, f)} Z`;
294
+ default:
295
+ return "";
296
+ }
297
+ }
298
+ const w = r + m * 0.3, S = l + $ * 0.3, k = r + m * 0.7, g = l + $ * 0.7;
299
+ switch (t) {
300
+ case "center":
301
+ return `M ${a(w, S)} L ${a(k, S)} L ${a(k, g)} L ${a(w, g)} Z`;
302
+ case "top":
303
+ return `M ${a(r, l)} L ${a(v, l)} L ${a(k, S)} L ${a(w, S)} Z`;
304
+ case "bottom":
305
+ return `M ${a(r, f)} L ${a(v, f)} L ${a(k, g)} L ${a(w, g)} Z`;
306
+ case "left":
307
+ return `M ${a(r, l)} L ${a(w, S)} L ${a(w, g)} L ${a(r, f)} Z`;
308
+ case "right":
309
+ return `M ${a(v, l)} L ${a(k, S)} L ${a(k, g)} L ${a(v, f)} Z`;
310
+ default:
311
+ return "";
312
+ }
313
+ }
314
+ const Ie = 5, Xe = 40, U = 4, q = 36, ot = 62;
315
+ function it(t, n, i = "default", r = "side") {
316
+ const l = t.arch === "upper" ? "top" : "bottom";
317
+ return `${n}/${r}/${i}/${l}/${Me(t)}.webp`;
318
+ }
319
+ function Zt(t, n = ot) {
320
+ const i = t === "primary" ? Ce : t === "mixed" ? [...Ae, ...Ce] : Ae, r = [], l = [];
321
+ for (const g of i)
322
+ F[g].arch === "upper" ? r.push(g) : l.push(g);
323
+ const m = q + Ie, $ = Math.max(r.length, l.length), v = $ > 0 ? $ * m - Ie : 0;
324
+ function f(g, O) {
325
+ const M = g.length > 0 ? g.length * m - Ie : 0, fe = (v - M) / 2;
326
+ return g.map((d, he) => {
327
+ const re = F[d];
328
+ return {
329
+ fdi: d,
330
+ meta: re,
331
+ x: fe + he * m,
332
+ y: O
333
+ };
334
+ });
335
+ }
336
+ const a = f(r, 0), w = f(l, n + Xe), S = v > 0 ? v : $ * m, k = n * 2 + Xe;
337
+ return { teeth: [...a, ...w], width: S, height: k };
338
+ }
339
+ function Je(t, n) {
340
+ switch (n) {
341
+ case "universal":
342
+ return jt[t] ?? t;
343
+ case "palmer":
344
+ return Ft[t] ?? t;
345
+ case "fdi":
346
+ default:
347
+ return t;
348
+ }
349
+ }
350
+ function mn() {
351
+ return {};
352
+ }
353
+ function et(t) {
354
+ const n = {};
355
+ for (const [i, r] of Object.entries(t))
356
+ !r || r.length === 0 || (n[i] = { conditions: r, surfaces: [] });
357
+ return n;
358
+ }
359
+ const Vt = Y(
360
+ [
361
+ "ds:tooth-scheme-alfadocs",
362
+ "ds:flex ds:flex-col",
363
+ "ds:gap-[var(--spacing-sm)]",
364
+ "ds:bg-[var(--background)] ds:text-[var(--foreground)]",
365
+ // Block-level flex column so the SVG's w-full can grow to fill the frame.
366
+ // min-w-fit on the SVG floors it at natural size, so narrow frames scroll
367
+ // here rather than shrinking the per-tooth hit target below the 44px floor.
368
+ "ds:max-w-full ds:overflow-x-auto",
369
+ // When the scroll container itself is the tab stop (display mode, see
370
+ // scrollTabIndex) it needs a focus ring. Use an outline (not box-shadow):
371
+ // forced-colors / high-contrast mode zeroes box-shadow, which would leave
372
+ // HCM keyboard users with no visible focus. outline survives, and the
373
+ // CanvasText fallback repaints it in the system palette.
374
+ "ds:outline-none",
375
+ "ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid",
376
+ "ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]",
377
+ "ds:forced-colors:focus-visible:outline-[CanvasText]"
378
+ ].join(" ")
379
+ ), Yt = Y(
380
+ [
381
+ "ds:block",
382
+ "ds:w-full ds:min-w-fit ds:h-auto",
383
+ "ds:text-[var(--foreground)]"
384
+ ].join(" ")
385
+ ), zt = Y(
386
+ [
387
+ "ds:group ds:cursor-pointer",
388
+ "ds:focus:outline-none",
389
+ "ds:transition-[fill,stroke,opacity] ds:duration-[var(--animation-duration)]",
390
+ "ds:motion-reduce:transition-none"
391
+ ].join(" ")
392
+ ), Bt = Y(
393
+ [
394
+ "ds:flex ds:flex-wrap ds:items-center",
395
+ "ds:gap-[var(--spacing-sm)]",
396
+ "type-meta ds:text-[var(--muted-foreground)]"
397
+ ].join(" ")
398
+ ), Kt = Y(
399
+ ["ds:inline-flex ds:items-center", "ds:gap-[var(--spacing-xs)]"].join(" ")
400
+ ), Gt = Y(["ds:sr-only"].join(" ")), Qt = Y(
401
+ [
402
+ "ds:cursor-pointer ds:outline-none",
403
+ "ds:fill-transparent ds:stroke-transparent",
404
+ "ds:transition-[fill] ds:duration-[var(--animation-duration)]",
405
+ "ds:motion-reduce:transition-none",
406
+ "ds:hover:fill-[color-mix(in_srgb,var(--accent)_18%,transparent)]",
407
+ "ds:focus-visible:fill-[color-mix(in_srgb,var(--accent)_22%,transparent)]",
408
+ "ds:focus-visible:stroke-[var(--ring)]",
409
+ "ds:forced-colors:focus-visible:stroke-[CanvasText]"
410
+ ].join(" ")
411
+ );
412
+ function ke(t) {
413
+ return t.value !== void 0;
414
+ }
415
+ function le() {
416
+ return { conditions: [], surfaces: [] };
417
+ }
418
+ function tt(t, n) {
419
+ const i = t ?? [];
420
+ return n ? i.includes(n) ? i.filter((r) => r !== n) : [...i, n] : i.length === 0 ? ["caries"] : [];
421
+ }
422
+ function Xt(t, n, i) {
423
+ var l;
424
+ return i ? ((l = {
425
+ top: { ArrowDown: "center" },
426
+ bottom: { ArrowUp: "center" },
427
+ left: { ArrowRight: "center" },
428
+ right: { ArrowLeft: "center" },
429
+ center: {
430
+ ArrowUp: "top",
431
+ ArrowDown: "bottom",
432
+ ArrowLeft: "left",
433
+ ArrowRight: "right"
434
+ }
435
+ }[t]) == null ? void 0 : l[n]) ?? t : n === "ArrowUp" ? "top" : n === "ArrowDown" ? "bottom" : n === "ArrowLeft" ? "left" : n === "ArrowRight" ? "right" : t;
436
+ }
437
+ const Jt = [
438
+ "caries",
439
+ "filled",
440
+ "crowned",
441
+ "temporaryCrown",
442
+ "bridge",
443
+ "rootCanal",
444
+ "implant",
445
+ "implantExtraction",
446
+ "stub",
447
+ "destroyed",
448
+ "missing"
449
+ ];
450
+ function en({
451
+ condition: t,
452
+ assetBaseUrl: n
453
+ }) {
454
+ const i = F[16], r = De[t], l = t === "missing", m = t === "caries" || t === "filled", $ = 36 * 0.9, v = 62 * 0.9, f = (36 - $) / 2, a = (62 - v) / 2;
455
+ return /* @__PURE__ */ j(
456
+ "svg",
457
+ {
458
+ width: "22",
459
+ height: "38",
460
+ viewBox: "0 0 36 62",
461
+ "aria-hidden": "true",
462
+ className: "ds:block ds:shrink-0",
463
+ children: [
464
+ /* @__PURE__ */ u(
465
+ "image",
466
+ {
467
+ href: it(i, n),
468
+ x: f,
469
+ y: a,
470
+ width: $,
471
+ height: v,
472
+ preserveAspectRatio: "xMidYMid meet",
473
+ opacity: l ? 0.25 : 1
474
+ }
475
+ ),
476
+ r ? /* @__PURE__ */ u(
477
+ "image",
478
+ {
479
+ href: rt(i, n, r),
480
+ x: f,
481
+ y: a,
482
+ width: $,
483
+ height: v,
484
+ preserveAspectRatio: "xMidYMid meet"
485
+ }
486
+ ) : null,
487
+ m ? /* @__PURE__ */ u(
488
+ "rect",
489
+ {
490
+ x: 3,
491
+ y: 2,
492
+ width: 30,
493
+ height: 58,
494
+ fill: "none",
495
+ stroke: ue[t],
496
+ strokeWidth: 2,
497
+ strokeDasharray: t === "filled" ? "4 2" : void 0,
498
+ rx: 6
499
+ }
500
+ ) : null,
501
+ l ? /* @__PURE__ */ u(
502
+ "path",
503
+ {
504
+ d: "M7 9 L29 53 M29 9 L7 53",
505
+ stroke: ue.missing,
506
+ strokeWidth: 2,
507
+ fill: "none"
508
+ }
509
+ ) : null
510
+ ]
511
+ }
512
+ );
513
+ }
514
+ function tn({ assetBaseUrl: t }) {
515
+ const { t: n } = nt();
516
+ return /* @__PURE__ */ j(
517
+ "section",
518
+ {
519
+ "aria-label": n("toothScheme.legendLabel"),
520
+ "data-testid": "tooth-scheme-legend",
521
+ className: "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:rounded-[var(--radius-md)] ds:bg-[var(--card)] ds:border ds:border-[color:var(--card-border)] ds:p-[var(--spacing-sm)] ds:shadow-[var(--shadow-card)] ds:[.theme-accessible_&]:border-2",
522
+ children: [
523
+ /* @__PURE__ */ u("span", { className: "type-eyebrow ds:text-[color:var(--muted-foreground)]", children: n("toothScheme.legendLabel") }),
524
+ /* @__PURE__ */ u("ul", { className: Bt(), children: Jt.map((i) => /* @__PURE__ */ j(
525
+ "li",
526
+ {
527
+ className: Kt(),
528
+ "data-condition": i,
529
+ "data-testid": `tooth-scheme-legend-item-${i}`,
530
+ children: [
531
+ /* @__PURE__ */ u(en, { condition: i, assetBaseUrl: t }),
532
+ /* @__PURE__ */ u("span", { children: n(`toothScheme.condition.${i}`) })
533
+ ]
534
+ },
535
+ i
536
+ )) })
537
+ ]
538
+ }
539
+ );
540
+ }
541
+ function Oe({
542
+ label: t,
543
+ value: n,
544
+ options: i,
545
+ onValueChange: r,
546
+ container: l
547
+ }) {
548
+ return /* @__PURE__ */ j("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]", children: [
549
+ /* @__PURE__ */ u(
550
+ "span",
551
+ {
552
+ "aria-hidden": "true",
553
+ className: "type-label ds:text-[color:var(--muted-foreground)]",
554
+ children: t
555
+ }
556
+ ),
557
+ /* @__PURE__ */ u(
558
+ kt,
559
+ {
560
+ size: "md",
561
+ "aria-label": t,
562
+ value: n,
563
+ options: i,
564
+ onValueChange: r,
565
+ container: l
566
+ }
567
+ )
568
+ ] });
569
+ }
570
+ const st = Tt(
571
+ ({
572
+ id: t,
573
+ dentition: n = "permanent",
574
+ numbering: i = "fdi",
575
+ mode: r = "interactive",
576
+ projection: l = "side",
577
+ value: m,
578
+ defaultValue: $,
579
+ onChange: v,
580
+ onSelect: f,
581
+ conditions: a,
582
+ activeCondition: w,
583
+ assetBaseUrl: S = "/toothscheme/teeth",
584
+ legend: k = !1,
585
+ controls: g = !1,
586
+ ariaLabel: O,
587
+ className: M
588
+ }, fe) => {
589
+ const { t: d } = nt(), [he, re] = H(n), [at, Ne] = H(i), [ct, Re] = H(l), [dt, _e] = H(k), [me, lt] = H(null), G = g ? he : n, Q = g ? at : i, Ee = g ? dt : k, oe = g ? ct : l, W = oe === "plan" ? "plan" : "side", je = oe === "both", Fe = de(g);
590
+ ne(() => {
591
+ g && !Fe.current && (re(n), Ne(i), Re(l), _e(k)), Fe.current = g;
592
+ }, [g, n, i, l, k]);
593
+ const [ut, He] = H(() => m !== void 0 ? m : $ !== void 0 ? $ : a ? et(a) : {}), p = ke({ value: m }) ? m : ut;
594
+ ne(() => {
595
+ ke({ value: m }) || a !== void 0 && He(et(a));
596
+ }, [a, m]);
597
+ const N = W === "plan" ? 44 : ot, X = Te(
598
+ () => Zt(G, N),
599
+ [G, N]
600
+ ), Z = Te(() => X.teeth.map((e) => e.fdi), [X]), pe = Z[0], [ie, z] = H(pe);
601
+ ne(() => {
602
+ (!ie || !Z.includes(ie)) && z(pe);
603
+ }, [pe, ie, Z]);
604
+ const [ft, B] = H(""), ge = de(null), A = E(
605
+ (e) => {
606
+ ke({ value: m }) || He(e), v == null || v(e);
607
+ },
608
+ [v, m]
609
+ ), R = E((e) => {
610
+ const o = ge.current;
611
+ if (!o) return;
612
+ const s = o.querySelector(`g[data-fdi="${e}"]`);
613
+ s && (s.focus(), z(e));
614
+ }, []), _ = W === "plan" && r === "interactive" && (w === "caries" || w === "filled"), [T, J] = H(null);
615
+ ne(() => {
616
+ (!_ || T && !Z.includes(T.fdi)) && J(null);
617
+ }, [_, T, Z]);
618
+ const qe = E((e, o) => {
619
+ var c;
620
+ const s = (c = ge.current) == null ? void 0 : c.querySelector(
621
+ `path[data-fdi="${e}"][data-zone="${o}"]`
622
+ );
623
+ s == null || s.focus();
624
+ }, []), ve = de(null);
625
+ ne(() => {
626
+ T ? qe(T.fdi, T.zone) : ve.current && R(ve.current.fdi), ve.current = T;
627
+ }, [T, qe, R]);
628
+ const ht = E(
629
+ (e, o) => {
630
+ const s = p[e];
631
+ return !!(s && s.surfaces.includes(o) && s.conditions.includes(w));
632
+ },
633
+ [p, w]
634
+ ), We = E(
635
+ (e, o) => {
636
+ o && o.conditions.length > 0 ? B(
637
+ d("toothScheme.selected", {
638
+ id: e,
639
+ conditions: o.conditions.map((s) => d(`toothScheme.condition.${s}`)).join(", ")
640
+ })
641
+ ) : B(d("toothScheme.deselected", { id: e }));
642
+ },
643
+ [d]
644
+ ), be = E(
645
+ (e, o) => {
646
+ if (!_) return;
647
+ const s = w, c = p[e] ?? le(), x = c.surfaces.includes(o), L = c.conditions.includes(s);
648
+ let b, y;
649
+ x && L ? (b = c.surfaces.filter((V) => V !== o), y = b.length === 0 ? c.conditions.filter((V) => V !== s) : c.conditions) : (b = x ? c.surfaces : [...c.surfaces, o], y = L ? c.conditions : [...c.conditions, s]);
650
+ const I = { ...p };
651
+ y.length === 0 && b.length === 0 ? delete I[e] : I[e] = { ...c, conditions: y, surfaces: b }, A(I), We(e, I[e]), f == null || f(e);
652
+ },
653
+ [
654
+ _,
655
+ w,
656
+ p,
657
+ A,
658
+ We,
659
+ f
660
+ ]
661
+ ), we = E((e) => {
662
+ const o = F[e];
663
+ o && (z(e), J({ fdi: e, zone: Le(o)[0] }));
664
+ }, []), mt = E(
665
+ (e, o, s) => {
666
+ const c = F[o];
667
+ if (c)
668
+ switch (e.key) {
669
+ case "ArrowUp":
670
+ case "ArrowDown":
671
+ case "ArrowLeft":
672
+ case "ArrowRight": {
673
+ e.preventDefault(), e.stopPropagation();
674
+ const x = Le(c).includes("center"), L = Xt(s, e.key, x);
675
+ L !== s && J({ fdi: o, zone: L });
676
+ return;
677
+ }
678
+ case " ":
679
+ case "Enter": {
680
+ e.preventDefault(), e.stopPropagation(), be(o, Ge(c, s));
681
+ return;
682
+ }
683
+ case "Escape": {
684
+ e.preventDefault(), e.stopPropagation(), J(null);
685
+ return;
686
+ }
687
+ default:
688
+ return;
689
+ }
690
+ },
691
+ [be]
692
+ ), pt = de(null), ye = Te(
693
+ () => ({
694
+ focusTooth: (e) => {
695
+ R(e);
696
+ },
697
+ getChart: () => p,
698
+ getTooth: (e) => {
699
+ var o;
700
+ return ((o = p[e]) == null ? void 0 : o.conditions) ?? [];
701
+ },
702
+ teethWith: (e) => Object.entries(p).filter(([, o]) => o.conditions.includes(e)).map(([o]) => o),
703
+ setFinding: (e, o, s) => {
704
+ const c = p[e] ?? le();
705
+ if (c.conditions.includes(o) && !s) return;
706
+ const x = {
707
+ ...p,
708
+ [e]: {
709
+ ...c,
710
+ conditions: c.conditions.includes(o) ? c.conditions : [...c.conditions, o],
711
+ surfaces: s ?? c.surfaces
712
+ }
713
+ };
714
+ A(x);
715
+ },
716
+ removeFinding: (e, o) => {
717
+ const s = p[e];
718
+ if (!s || !s.conditions.includes(o)) return;
719
+ const c = s.conditions.filter((L) => L !== o), x = { ...p };
720
+ c.length === 0 ? delete x[e] : x[e] = { ...s, conditions: c }, A(x);
721
+ },
722
+ clearTooth: (e) => {
723
+ if (!p[e]) return;
724
+ const o = { ...p };
725
+ delete o[e], A(o);
726
+ }
727
+ }),
728
+ [p, A, R]
729
+ );
730
+ St(fe, () => ye, [ye]), Lt(Ct, ye, t);
731
+ const gt = E(
732
+ (e, o) => {
733
+ var L;
734
+ if (r !== "interactive") return;
735
+ const s = F[o];
736
+ if (!s) return;
737
+ const c = Z, x = c.indexOf(o);
738
+ switch (e.key) {
739
+ case "ArrowRight": {
740
+ e.preventDefault();
741
+ const b = Math.min(c.length - 1, x + 1);
742
+ R(c[b]);
743
+ return;
744
+ }
745
+ case "ArrowLeft": {
746
+ e.preventDefault();
747
+ const b = Math.max(0, x - 1);
748
+ R(c[b]);
749
+ return;
750
+ }
751
+ case "ArrowUp":
752
+ case "ArrowDown": {
753
+ e.preventDefault();
754
+ const y = {
755
+ 1: 4,
756
+ 4: 1,
757
+ 2: 3,
758
+ 3: 2,
759
+ 5: 8,
760
+ 8: 5,
761
+ 6: 7,
762
+ 7: 6
763
+ }[s.quadrant];
764
+ if (!y) return;
765
+ const I = `${y}${s.positionInQuadrant}`;
766
+ c.includes(I) && R(I);
767
+ return;
768
+ }
769
+ case "Home": {
770
+ e.preventDefault();
771
+ const b = c.filter(
772
+ (y) => F[y].quadrant === s.quadrant
773
+ );
774
+ b.length > 0 && R(b[0]);
775
+ return;
776
+ }
777
+ case "End": {
778
+ e.preventDefault();
779
+ const b = c.filter(
780
+ (y) => F[y].quadrant === s.quadrant
781
+ );
782
+ b.length > 0 && R(b[b.length - 1]);
783
+ return;
784
+ }
785
+ case " ":
786
+ case "Enter": {
787
+ if (e.preventDefault(), _) {
788
+ we(o);
789
+ return;
790
+ }
791
+ const b = (L = p[o]) == null ? void 0 : L.conditions, y = tt(b, w), I = { ...p };
792
+ y.length === 0 ? (delete I[o], B(d("toothScheme.deselected", { id: o }))) : (I[o] = {
793
+ ...p[o] ?? le(),
794
+ conditions: y
795
+ }, B(
796
+ d("toothScheme.selected", {
797
+ id: o,
798
+ conditions: y.map((V) => d(`toothScheme.condition.${V}`)).join(", ")
799
+ })
800
+ )), A(I), f == null || f(o);
801
+ return;
802
+ }
803
+ default:
804
+ return;
805
+ }
806
+ },
807
+ [
808
+ w,
809
+ p,
810
+ A,
811
+ we,
812
+ R,
813
+ r,
814
+ f,
815
+ _,
816
+ d,
817
+ Z
818
+ ]
819
+ ), vt = E(
820
+ (e) => {
821
+ var x;
822
+ if (r !== "interactive") return;
823
+ z(e);
824
+ const o = (x = p[e]) == null ? void 0 : x.conditions, s = tt(o, w), c = { ...p };
825
+ s.length === 0 ? (delete c[e], B(d("toothScheme.deselected", { id: e }))) : (c[e] = {
826
+ ...p[e] ?? le(),
827
+ conditions: s
828
+ }, B(
829
+ d("toothScheme.selected", {
830
+ id: e,
831
+ conditions: s.map((L) => d(`toothScheme.condition.${L}`)).join(", ")
832
+ })
833
+ )), A(c), f == null || f(e);
834
+ },
835
+ [w, p, A, r, f, d]
836
+ ), Pe = X.width + 4, Ue = X.height + 4, xe = O ?? d("toothScheme.ariaLabel"), Ze = je ? `${xe} — ${d("toothScheme.view.side")}` : xe, bt = r === "interactive" ? void 0 : 0;
837
+ return /* @__PURE__ */ u(K.Provider, { delayDuration: 200, children: /* @__PURE__ */ j(
838
+ "div",
839
+ {
840
+ ref: pt,
841
+ role: "region",
842
+ "aria-label": Ze,
843
+ tabIndex: bt,
844
+ className: [Vt(), M].filter(Boolean).join(" "),
845
+ "data-component": "tooth-scheme",
846
+ "data-component-id": t,
847
+ "data-testid": "tooth-scheme-root",
848
+ "data-dentition": G,
849
+ "data-numbering": Q,
850
+ "data-mode": r,
851
+ "data-projection": W,
852
+ "data-view-mode": oe,
853
+ children: [
854
+ g ? /* @__PURE__ */ u(
855
+ "div",
856
+ {
857
+ className: "ds:flex ds:w-full ds:justify-end",
858
+ "data-testid": "tooth-scheme-controls",
859
+ children: /* @__PURE__ */ j(Se.Root, { children: [
860
+ /* @__PURE__ */ u(Se.Trigger, { asChild: !0, children: /* @__PURE__ */ u(
861
+ It,
862
+ {
863
+ size: "sm",
864
+ intent: "outline",
865
+ icon: /* @__PURE__ */ u(At, { "aria-hidden": "true" }),
866
+ "aria-label": d("toothScheme.options.label"),
867
+ tooltip: d("toothScheme.options.label")
868
+ }
869
+ ) }),
870
+ /* @__PURE__ */ u(
871
+ Se.Content,
872
+ {
873
+ ref: lt,
874
+ align: "end",
875
+ size: "md",
876
+ "aria-label": d("toothScheme.options.label"),
877
+ children: /* @__PURE__ */ j("div", { className: "ds:flex ds:w-[var(--popover-size-sm)] ds:max-w-full ds:flex-col ds:gap-[var(--spacing-md)]", children: [
878
+ /* @__PURE__ */ u("div", { className: "ds:flex ds:border-b ds:border-[color:var(--border)] ds:pb-[var(--spacing-sm)] ds:[&>*]:w-full ds:[&>*]:justify-between", children: /* @__PURE__ */ u(
879
+ Ot,
880
+ {
881
+ label: d("toothScheme.options.legend"),
882
+ labelSide: "start",
883
+ checked: Ee,
884
+ onCheckedChange: _e
885
+ }
886
+ ) }),
887
+ /* @__PURE__ */ u(
888
+ Oe,
889
+ {
890
+ container: me,
891
+ label: d("toothScheme.options.dentition"),
892
+ value: G,
893
+ onValueChange: (e) => re(e),
894
+ options: [
895
+ {
896
+ value: "permanent",
897
+ label: d("toothScheme.dentition.permanent")
898
+ },
899
+ {
900
+ value: "primary",
901
+ label: d("toothScheme.dentition.primary")
902
+ },
903
+ {
904
+ value: "mixed",
905
+ label: d("toothScheme.dentition.mixed")
906
+ }
907
+ ]
908
+ }
909
+ ),
910
+ /* @__PURE__ */ u(
911
+ Oe,
912
+ {
913
+ container: me,
914
+ label: d("toothScheme.options.numbering"),
915
+ value: Q,
916
+ onValueChange: (e) => Ne(e),
917
+ options: [
918
+ {
919
+ value: "fdi",
920
+ label: d("toothScheme.numbering.fdi")
921
+ },
922
+ {
923
+ value: "universal",
924
+ label: d("toothScheme.numbering.universal")
925
+ },
926
+ {
927
+ value: "palmer",
928
+ label: d("toothScheme.numbering.palmer")
929
+ }
930
+ ]
931
+ }
932
+ ),
933
+ /* @__PURE__ */ u(
934
+ Oe,
935
+ {
936
+ container: me,
937
+ label: d("toothScheme.options.view"),
938
+ value: oe,
939
+ onValueChange: (e) => Re(e),
940
+ options: [
941
+ {
942
+ value: "side",
943
+ label: d("toothScheme.view.side")
944
+ },
945
+ {
946
+ value: "plan",
947
+ label: d("toothScheme.view.occlusal")
948
+ },
949
+ {
950
+ value: "both",
951
+ label: d("toothScheme.view.both")
952
+ }
953
+ ]
954
+ }
955
+ )
956
+ ] })
957
+ }
958
+ )
959
+ ] })
960
+ }
961
+ ) : null,
962
+ /* @__PURE__ */ u(
963
+ "svg",
964
+ {
965
+ ref: ge,
966
+ viewBox: `0 0 ${Pe} ${Ue}`,
967
+ width: Pe,
968
+ height: Ue,
969
+ className: Yt(),
970
+ role: "group",
971
+ "aria-label": Ze,
972
+ focusable: "false",
973
+ "data-testid": "tooth-scheme-svg",
974
+ xmlns: "http://www.w3.org/2000/svg",
975
+ children: X.teeth.map((e) => {
976
+ var Ke;
977
+ const o = p[e.fdi], s = (Ke = o == null ? void 0 : o.conditions) == null ? void 0 : Ke[0], c = d(
978
+ `toothScheme.anatomy.${e.meta.anatomy}`
979
+ ), x = s ? `, ${d(`toothScheme.condition.${s}`)}` : "", L = d("toothScheme.toothLabel", {
980
+ id: Je(e.fdi, Q),
981
+ anatomy: c,
982
+ conditionSuffix: x
983
+ }), b = r === "interactive" ? T ? -1 : e.fdi === ie ? 0 : -1 : void 0, y = (o == null ? void 0 : o.conditions) ?? [], I = y.includes("missing"), V = y.map((h) => ({
984
+ condition: h,
985
+ spec: De[h]
986
+ })).filter(
987
+ (h) => !!h.spec
988
+ ), $e = y.find(
989
+ (h) => h !== "missing" && !De[h]
990
+ ), Ve = $e ? ue[$e] : void 0, wt = s ? `${c} · ${d(`toothScheme.condition.${s}`)}` : c, Ye = Je(e.fdi, Q), yt = it(
991
+ e.meta,
992
+ S,
993
+ "default",
994
+ W
995
+ ), xt = W === "plan" ? y.flatMap((h) => {
996
+ const D = Wt[h];
997
+ return D ? ((o == null ? void 0 : o.surfaces) ?? []).map((ce) => ({
998
+ key: `${h}-${ce}`,
999
+ url: Pt(
1000
+ e.meta,
1001
+ S,
1002
+ D,
1003
+ ce
1004
+ )
1005
+ })) : [];
1006
+ }) : [], ze = (e.meta.dentition === "primary" ? Ht : 1) * 0.9, ee = q * ze, te = N * ze, se = (q - ee) / 2, ae = (N - te) / 2, C = _ && (T == null ? void 0 : T.fdi) === e.fdi, Be = _ ? Le(e.meta) : [], $t = Be.includes("center");
1007
+ return /* @__PURE__ */ j(K.Root, { children: [
1008
+ /* @__PURE__ */ u(K.Trigger, { asChild: !0, children: /* @__PURE__ */ j(
1009
+ "g",
1010
+ {
1011
+ "data-fdi": e.fdi,
1012
+ "data-anatomy": e.meta.anatomy,
1013
+ "data-arch": e.meta.arch,
1014
+ "data-side": e.meta.side,
1015
+ "data-quadrant": e.meta.quadrant,
1016
+ "data-condition": s ?? "none",
1017
+ "data-testid": `tooth-${e.fdi}`,
1018
+ transform: `translate(${e.x}, ${e.y})`,
1019
+ tabIndex: b,
1020
+ role: C ? "group" : r === "interactive" ? "button" : "img",
1021
+ "aria-label": L,
1022
+ "aria-pressed": C ? void 0 : r === "interactive" ? s !== void 0 : void 0,
1023
+ className: zt(),
1024
+ onClick: C ? void 0 : r === "interactive" ? _ ? () => we(e.fdi) : () => vt(e.fdi) : void 0,
1025
+ onFocus: () => z(e.fdi),
1026
+ onKeyDown: C ? void 0 : (h) => gt(h, e.fdi),
1027
+ children: [
1028
+ /* @__PURE__ */ u(
1029
+ "rect",
1030
+ {
1031
+ x: -U,
1032
+ y: -U,
1033
+ width: q + U * 2,
1034
+ height: N + U * 2,
1035
+ fill: "transparent"
1036
+ }
1037
+ ),
1038
+ /* @__PURE__ */ u(
1039
+ "image",
1040
+ {
1041
+ href: yt,
1042
+ x: se,
1043
+ y: ae,
1044
+ width: ee,
1045
+ height: te,
1046
+ preserveAspectRatio: "xMidYMid meet",
1047
+ opacity: I ? 0.25 : 1,
1048
+ "aria-hidden": "true"
1049
+ }
1050
+ ),
1051
+ W === "side" ? V.map(({ condition: h, spec: D }) => /* @__PURE__ */ u(
1052
+ "image",
1053
+ {
1054
+ href: rt(
1055
+ e.meta,
1056
+ S,
1057
+ D
1058
+ ),
1059
+ x: se,
1060
+ y: ae,
1061
+ width: ee,
1062
+ height: te,
1063
+ preserveAspectRatio: "xMidYMid meet",
1064
+ "aria-hidden": "true",
1065
+ pointerEvents: "none"
1066
+ },
1067
+ h
1068
+ )) : null,
1069
+ W === "plan" ? xt.map(({ key: h, url: D }) => /* @__PURE__ */ u(
1070
+ "image",
1071
+ {
1072
+ href: D,
1073
+ x: se,
1074
+ y: ae,
1075
+ width: ee,
1076
+ height: te,
1077
+ preserveAspectRatio: "xMidYMid meet",
1078
+ "aria-hidden": "true",
1079
+ pointerEvents: "none"
1080
+ },
1081
+ h
1082
+ )) : null,
1083
+ _ ? Be.map((h) => {
1084
+ const D = Ge(e.meta, h), ce = ht(e.fdi, D);
1085
+ return /* @__PURE__ */ u(
1086
+ "path",
1087
+ {
1088
+ d: Ut(
1089
+ h,
1090
+ { x: se, y: ae, w: ee, h: te },
1091
+ $t
1092
+ ),
1093
+ "data-fdi": e.fdi,
1094
+ "data-zone": h,
1095
+ "data-surface": D,
1096
+ "data-testid": `tooth-${e.fdi}-zone-${h}`,
1097
+ role: C ? "button" : void 0,
1098
+ tabIndex: C ? (T == null ? void 0 : T.zone) === h ? 0 : -1 : void 0,
1099
+ "aria-label": C ? d("toothScheme.toothLabel", {
1100
+ id: Ye,
1101
+ anatomy: d(
1102
+ `toothScheme.surface.${D}`
1103
+ ),
1104
+ conditionSuffix: ""
1105
+ }) : void 0,
1106
+ "aria-pressed": C ? ce : void 0,
1107
+ strokeWidth: "var(--focus-ring-width)",
1108
+ className: Qt(),
1109
+ onClick: (P) => {
1110
+ P.stopPropagation(), C || z(e.fdi), be(e.fdi, D);
1111
+ },
1112
+ onKeyDown: C ? (P) => mt(
1113
+ P,
1114
+ e.fdi,
1115
+ h
1116
+ ) : void 0,
1117
+ onFocus: C ? () => J(
1118
+ (P) => P && P.fdi === e.fdi && P.zone === h ? P : { fdi: e.fdi, zone: h }
1119
+ ) : void 0
1120
+ },
1121
+ h
1122
+ );
1123
+ }) : null,
1124
+ W === "side" && Ve ? /* @__PURE__ */ u(
1125
+ "rect",
1126
+ {
1127
+ x: 3,
1128
+ y: 2,
1129
+ width: q - 6,
1130
+ height: N - 4,
1131
+ fill: "none",
1132
+ stroke: Ve,
1133
+ strokeWidth: "2",
1134
+ strokeDasharray: $e === "filled" ? "4 2" : void 0,
1135
+ rx: "6",
1136
+ pointerEvents: "none"
1137
+ }
1138
+ ) : null,
1139
+ I ? /* @__PURE__ */ u(
1140
+ "path",
1141
+ {
1142
+ d: `M7 9 L${q - 7} ${N - 9} M${q - 7} 9 L7 ${N - 9}`,
1143
+ stroke: ue.missing,
1144
+ strokeWidth: "2",
1145
+ fill: "none",
1146
+ pointerEvents: "none"
1147
+ }
1148
+ ) : null,
1149
+ /* @__PURE__ */ u(
1150
+ "rect",
1151
+ {
1152
+ x: -U,
1153
+ y: -U,
1154
+ width: q + U * 2,
1155
+ height: N + U * 2,
1156
+ fill: "none",
1157
+ stroke: "var(--ring)",
1158
+ strokeWidth: "var(--focus-ring-width)",
1159
+ className: [
1160
+ "ds:opacity-0",
1161
+ "ds:group-focus-visible:opacity-100",
1162
+ "ds:forced-colors:stroke-[CanvasText]"
1163
+ ].join(" "),
1164
+ "data-testid": `tooth-${e.fdi}-focus-ring`,
1165
+ pointerEvents: "none",
1166
+ rx: "4"
1167
+ }
1168
+ ),
1169
+ /* @__PURE__ */ u(
1170
+ "text",
1171
+ {
1172
+ x: q / 2,
1173
+ y: e.meta.arch === "upper" ? N + 12 : -4,
1174
+ textAnchor: "middle",
1175
+ fontSize: "10",
1176
+ fill: "var(--muted-foreground)",
1177
+ className: "ds:select-none",
1178
+ "aria-hidden": "true",
1179
+ children: Ye
1180
+ }
1181
+ )
1182
+ ]
1183
+ }
1184
+ ) }),
1185
+ /* @__PURE__ */ u(K.Portal, { children: /* @__PURE__ */ j(
1186
+ K.Content,
1187
+ {
1188
+ side: "top",
1189
+ sideOffset: 6,
1190
+ className: "ds:z-[var(--z-tooltip)] ds:rounded-[var(--radius-sm)] ds:bg-[var(--foreground)] ds:text-[var(--background)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:pt-[calc(var(--spacing-xs)/2)] ds:pb-[calc(var(--spacing-xs)/2)] ds:text-[length:var(--font-size-xs)]",
1191
+ children: [
1192
+ wt,
1193
+ /* @__PURE__ */ u(K.Arrow, { className: "ds:fill-[var(--foreground)]" })
1194
+ ]
1195
+ }
1196
+ ) })
1197
+ ] }, e.fdi);
1198
+ })
1199
+ }
1200
+ ),
1201
+ je ? /* @__PURE__ */ u(
1202
+ st,
1203
+ {
1204
+ projection: "plan",
1205
+ dentition: G,
1206
+ numbering: Q,
1207
+ mode: r,
1208
+ value: p,
1209
+ onChange: A,
1210
+ activeCondition: w,
1211
+ assetBaseUrl: S,
1212
+ ariaLabel: `${xe} — ${d("toothScheme.view.occlusal")}`
1213
+ }
1214
+ ) : null,
1215
+ Ee ? /* @__PURE__ */ u(tn, { assetBaseUrl: S }) : null,
1216
+ /* @__PURE__ */ u(
1217
+ "div",
1218
+ {
1219
+ className: Gt(),
1220
+ "aria-live": "polite",
1221
+ "aria-atomic": "true",
1222
+ "data-testid": "tooth-scheme-live",
1223
+ children: ft
1224
+ }
1225
+ )
1226
+ ]
1227
+ }
1228
+ ) });
1229
+ }
1230
+ );
1231
+ st.displayName = "ToothScheme";
1232
+ export {
1233
+ ue as C,
1234
+ F,
1235
+ Ae as P,
1236
+ qt as S,
1237
+ st as T,
1238
+ Wt as a,
1239
+ De as b,
1240
+ hn as c,
1241
+ Ft as d,
1242
+ jt as e,
1243
+ Ce as f,
1244
+ et as g,
1245
+ rt as h,
1246
+ mn as i,
1247
+ Zt as j,
1248
+ Ct as k,
1249
+ Je as l,
1250
+ Ge as m,
1251
+ Le as n,
1252
+ Vt as r,
1253
+ Pt as s,
1254
+ it as t,
1255
+ Ut as z
1256
+ };
1257
+ //# sourceMappingURL=tooth-scheme-CiphQaON.js.map