@alfadocs/ui-kit 1.55.0 → 1.56.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 (169) hide show
  1. package/dist/_chunks/{alia-sidebar-DS0b54Mv.js → alia-sidebar-DOei4Iyu.js} +2 -2
  2. package/dist/_chunks/{anamnesis-summary-rows-Dtw5Hpg4.js → anamnesis-summary-rows-CQ-XGr0T.js} +3 -3
  3. package/dist/_chunks/{balance-badge-cell-zP-iN-Pd.js → balance-badge-cell-DmDcXw0c.js} +3 -3
  4. package/dist/_chunks/{bmi-calculator-DTZhRhXe.js → bmi-calculator-C0UTxB7R.js} +2 -2
  5. package/dist/_chunks/{booking-uZO10TLK.js → booking-WyNGKPE2.js} +2 -2
  6. package/dist/_chunks/{breadcrumb-xgVpPH2H.js → breadcrumb-Boan-5n8.js} +39 -39
  7. package/dist/_chunks/{calculator-dialog-BRjZMWuE.js → calculator-dialog-pCPWta7h.js} +2 -2
  8. package/dist/_chunks/{calendar-workspace-DVajSkKA.js → calendar-workspace-Du2ryaI-.js} +8 -8
  9. package/dist/_chunks/{care-plan-header-BeMYMiI7.js → care-plan-header-DUX_SVvF.js} +2 -2
  10. package/dist/_chunks/chart-HsF1KHbx.js +909 -0
  11. package/dist/_chunks/{contact-profile-card-C5DbP_X3.js → contact-profile-card-Ci8lBQ6a.js} +2 -2
  12. package/dist/_chunks/dashboard-grid-DfEY2qci.js +844 -0
  13. package/dist/_chunks/{data-table-C6T31E33.js → data-table-D8fuhqO1.js} +1 -1
  14. package/dist/_chunks/{date-range-picker-BOvHwWO5.js → date-range-picker-CtUOI38x.js} +188 -182
  15. package/dist/_chunks/{dependent-selector-Bet3XAFj.js → dependent-selector-DgaAQc-c.js} +91 -86
  16. package/dist/_chunks/{dialog-D52AI4nF.js → dialog-CUzbnKLw.js} +86 -69
  17. package/dist/_chunks/{due-date-calculator-DXDJbUzo.js → due-date-calculator-CSjklbyw.js} +2 -2
  18. package/dist/_chunks/{file-manager-dIJQUZvq.js → file-manager-Cc_uO8r2.js} +4 -4
  19. package/dist/_chunks/{freemium-paywall-B6ojVXq7.js → freemium-paywall-DIKuhX8b.js} +90 -86
  20. package/dist/_chunks/{gestational-age-calculator-BfGpt3du.js → gestational-age-calculator-DqVeJke2.js} +2 -2
  21. package/dist/_chunks/{heatmap-BARGZZt2.js → heatmap-Gf9r7Tn1.js} +2 -2
  22. package/dist/_chunks/{help-me-write-templates-B7L3zGsE.js → help-me-write-templates-fV-Apf72.js} +2 -2
  23. package/dist/_chunks/{key-value-pair-Ax8IJr1M.js → key-value-pair-BNNITp6S.js} +25 -19
  24. package/dist/_chunks/{kit-extensions-C9-v8Dih.js → kit-extensions-Byfxy6sy.js} +4 -4
  25. package/dist/_chunks/{link-cell-renderer-DlBVPMTi.js → link-cell-renderer-TeJNvymP.js} +2 -2
  26. package/dist/_chunks/non-modal-tab-exit-D2Bd93Bq.js +65 -0
  27. package/dist/_chunks/{notes-panel-I8ntrrUW.js → notes-panel-DceRhthG.js} +3 -3
  28. package/dist/_chunks/{patient-summary-card-3dspc2tR.js → patient-summary-card-9nQWTQf6.js} +7 -3
  29. package/dist/_chunks/{payment-automation-upsell-DEUfM7EU.js → payment-automation-upsell-DiHovmUL.js} +2 -2
  30. package/dist/_chunks/{payment-request-card-DAGqh9Yx.js → payment-request-card-CwDpwXUC.js} +2 -2
  31. package/dist/_chunks/{periodontal-chart-BqwLxy2m.js → periodontal-chart-DD5C0M3l.js} +2 -2
  32. package/dist/_chunks/{periodontal-chart-card-CWZ1YM1h.js → periodontal-chart-card-CxdXvsPU.js} +2 -2
  33. package/dist/_chunks/{periodontal-diagnosis-C9IuvLId.js → periodontal-diagnosis-D-PJv7KS.js} +2 -2
  34. package/dist/_chunks/{position-grid-D2D5_Tze.js → position-grid-CBB88EaH.js} +38 -36
  35. package/dist/_chunks/{practice-results-DxOgbPDy.js → practice-results-Dhbo-fc_.js} +2 -2
  36. package/dist/_chunks/{pregnancy-dating-R3q5n1Wh.js → pregnancy-dating-Bfu0Cq4H.js} +2 -2
  37. package/dist/_chunks/{pregnancy-weight-gain-DwmNklDU.js → pregnancy-weight-gain-CUUrBTBo.js} +2 -2
  38. package/dist/_chunks/{public-header.agent-BWusjxY8.js → public-header.agent-pr2hyiND.js} +2 -2
  39. package/dist/_chunks/{radio-group-BT97ty7o.js → radio-group-DicxWJXP.js} +111 -106
  40. package/dist/_chunks/{radiograph-panel.agent-BA90I3Mu.js → radiograph-panel.agent-DkUokbEa.js} +3 -3
  41. package/dist/_chunks/{rich-text-editor-Blp4smUr.js → rich-text-editor-CkFfmA3v.js} +2 -2
  42. package/dist/_chunks/{sheet-CNFW8mYZ.js → sheet-C7SwIxwB.js} +95 -79
  43. package/dist/_chunks/{signature-request-rgMsgo-C.js → signature-request-DhbpB9N9.js} +2 -2
  44. package/dist/_chunks/{stat-51CDL4au.js → stat-DmjGfXND.js} +117 -108
  45. package/dist/_chunks/{stepper-accordion-D7lnBGh2.js → stepper-accordion-DDTSOUHc.js} +17 -6
  46. package/dist/_chunks/{task-editor-Ctxsa1BY.js → task-editor-ByyRu29Y.js} +3 -3
  47. package/dist/_chunks/{use-appointment-details-read-DinTrRIW.js → use-appointment-details-read-JsDM48tf.js} +2 -2
  48. package/dist/_chunks/use-select-on-arrow-Cr4iBuW5.js +26 -0
  49. package/dist/_chunks/{widget-picker-D8RiWrJd.js → widget-picker-DXYBMTfe.js} +2 -2
  50. package/dist/_chunks/{workflow-map-D3mezmGB.js → workflow-map-Demlpy39.js} +2 -2
  51. package/dist/agent-catalog.json +27 -10
  52. package/dist/agent-i18n/en.json +8 -7
  53. package/dist/components/_shared/non-modal-tab-exit.d.ts +8 -0
  54. package/dist/components/_shared/use-apex-chart-semantics.d.ts +6 -0
  55. package/dist/components/_shared/use-select-on-arrow.d.ts +20 -0
  56. package/dist/components/appointment-details-panel/index.js +1 -1
  57. package/dist/components/bmi-calculator/index.js +1 -1
  58. package/dist/components/booking/index.js +1 -1
  59. package/dist/components/breadcrumb/index.js +1 -1
  60. package/dist/components/calculator-dialog/index.js +1 -1
  61. package/dist/components/care-plan-header/index.js +1 -1
  62. package/dist/components/chart/chart.d.ts +10 -5
  63. package/dist/components/chart/index.js +1 -1
  64. package/dist/components/contact-profile-card/index.js +1 -1
  65. package/dist/components/dashboard-grid/dashboard-grid-engine.d.ts +22 -0
  66. package/dist/components/dashboard-grid/dashboard-grid.d.ts +48 -4
  67. package/dist/components/dashboard-grid/index.js +1 -1
  68. package/dist/components/data-table/index.js +2 -2
  69. package/dist/components/date-range-picker/index.js +1 -1
  70. package/dist/components/dependent-selector/index.js +1 -1
  71. package/dist/components/dialog/dialog.d.ts +2 -2
  72. package/dist/components/dialog/index.js +1 -1
  73. package/dist/components/due-date-calculator/index.js +1 -1
  74. package/dist/components/file-manager/index.js +1 -1
  75. package/dist/components/freemium-paywall/index.js +1 -1
  76. package/dist/components/gestational-age-calculator/index.js +1 -1
  77. package/dist/components/heatmap/index.js +1 -1
  78. package/dist/components/key-value-pair/index.js +1 -1
  79. package/dist/components/notes-panel/index.js +1 -1
  80. package/dist/components/patient-summary-card/index.js +1 -1
  81. package/dist/components/patient-table/index.js +1 -1
  82. package/dist/components/payment-card/index.js +1 -1
  83. package/dist/components/periodontal-chart/index.js +1 -1
  84. package/dist/components/periodontal-chart-card/index.js +1 -1
  85. package/dist/components/periodontal-diagnosis/index.js +1 -1
  86. package/dist/components/position-grid/index.js +1 -1
  87. package/dist/components/practice-results/index.js +1 -1
  88. package/dist/components/pregnancy-dating/index.js +1 -1
  89. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  90. package/dist/components/public-header/index.js +1 -1
  91. package/dist/components/radio-group/index.js +1 -1
  92. package/dist/components/radiograph-panel/index.js +1 -1
  93. package/dist/components/rich-text-editor/index.js +2 -2
  94. package/dist/components/sheet/index.js +1 -1
  95. package/dist/components/sheet/sheet.d.ts +2 -2
  96. package/dist/components/stat/index.d.ts +1 -1
  97. package/dist/components/stat/index.js +1 -1
  98. package/dist/components/stat/stat.d.ts +9 -0
  99. package/dist/components/stepper-accordion/index.js +1 -1
  100. package/dist/components/task-editor/index.js +1 -1
  101. package/dist/components/widget-picker/index.js +1 -1
  102. package/dist/components/workflow/index.js +1 -1
  103. package/dist/host-legacy.css +13 -2
  104. package/dist/i18n/locales/ar.d.ts +3 -2
  105. package/dist/i18n/locales/ar.js +5 -4
  106. package/dist/i18n/locales/de.d.ts +3 -2
  107. package/dist/i18n/locales/de.js +5 -4
  108. package/dist/i18n/locales/el.d.ts +3 -2
  109. package/dist/i18n/locales/el.js +5 -4
  110. package/dist/i18n/locales/en.d.ts +3 -2
  111. package/dist/i18n/locales/en.js +5 -4
  112. package/dist/i18n/locales/es.d.ts +3 -2
  113. package/dist/i18n/locales/es.js +5 -4
  114. package/dist/i18n/locales/fr.d.ts +3 -2
  115. package/dist/i18n/locales/fr.js +5 -4
  116. package/dist/i18n/locales/hi.d.ts +3 -2
  117. package/dist/i18n/locales/hi.js +5 -4
  118. package/dist/i18n/locales/it.d.ts +3 -2
  119. package/dist/i18n/locales/it.js +5 -4
  120. package/dist/i18n/locales/ja.d.ts +3 -2
  121. package/dist/i18n/locales/ja.js +5 -4
  122. package/dist/i18n/locales/nl.d.ts +3 -2
  123. package/dist/i18n/locales/nl.js +5 -4
  124. package/dist/i18n/locales/pl.d.ts +3 -2
  125. package/dist/i18n/locales/pl.js +5 -4
  126. package/dist/i18n/locales/pt.d.ts +3 -2
  127. package/dist/i18n/locales/pt.js +5 -4
  128. package/dist/i18n/locales/ro.d.ts +3 -2
  129. package/dist/i18n/locales/ro.js +5 -4
  130. package/dist/i18n/locales/ru.d.ts +3 -2
  131. package/dist/i18n/locales/ru.js +5 -4
  132. package/dist/i18n/locales/sq.d.ts +3 -2
  133. package/dist/i18n/locales/sq.js +5 -4
  134. package/dist/i18n/locales/sv.d.ts +3 -2
  135. package/dist/i18n/locales/sv.js +5 -4
  136. package/dist/i18n/locales/tr.d.ts +3 -2
  137. package/dist/i18n/locales/tr.js +5 -4
  138. package/dist/i18n/locales/zh.d.ts +3 -2
  139. package/dist/i18n/locales/zh.js +5 -4
  140. package/dist/index.js +48 -48
  141. package/dist/locales/ar.json +5 -4
  142. package/dist/locales/de.json +5 -4
  143. package/dist/locales/el.json +5 -4
  144. package/dist/locales/en.json +5 -4
  145. package/dist/locales/es.json +5 -4
  146. package/dist/locales/fr.json +5 -4
  147. package/dist/locales/hi.json +5 -4
  148. package/dist/locales/it.json +5 -4
  149. package/dist/locales/ja.json +5 -4
  150. package/dist/locales/nl.json +5 -4
  151. package/dist/locales/pl.json +5 -4
  152. package/dist/locales/pt.json +5 -4
  153. package/dist/locales/ro.json +5 -4
  154. package/dist/locales/ru.json +5 -4
  155. package/dist/locales/sq.json +5 -4
  156. package/dist/locales/sv.json +5 -4
  157. package/dist/locales/tr.json +5 -4
  158. package/dist/locales/zh.json +5 -4
  159. package/dist/patterns/alia-assistant/index.js +1 -1
  160. package/dist/patterns/anamnesis/index.js +1 -1
  161. package/dist/patterns/calendar/index.js +1 -1
  162. package/dist/patterns/help-me-write-templates/help-me-write-templates.d.ts +2 -2
  163. package/dist/patterns/help-me-write-templates/index.js +1 -1
  164. package/dist/patterns/payment-automation-upsell/index.js +1 -1
  165. package/dist/patterns/signature-request/index.js +1 -1
  166. package/dist/tokens.css +13 -2
  167. package/package.json +1 -1
  168. package/dist/_chunks/chart-C2RBJERE.js +0 -705
  169. package/dist/_chunks/dashboard-grid-SAGoyCtL.js +0 -691
@@ -1,8 +1,8 @@
1
- import { jsxs as z, jsx as i } from "react/jsx-runtime";
2
- import { forwardRef as X, useId as Z, useCallback as O, useRef as tt, useMemo as et } from "react";
1
+ import { jsxs as b, jsx as l } from "react/jsx-runtime";
2
+ import { forwardRef as Z, useId as tt, useCallback as O, useRef as et, useMemo as rt } from "react";
3
3
  import { c as V } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as B } from "react-i18next";
5
- import { u as rt } from "./use-count-up-BLLetaZ8.js";
5
+ import { u as st } from "./use-count-up-BLLetaZ8.js";
6
6
  const P = V("ds:flex ds:flex-col ds:h-full", {
7
7
  variants: {
8
8
  variant: {
@@ -106,180 +106,188 @@ const P = V("ds:flex ds:flex-col ds:h-full", {
106
106
  variant: "default",
107
107
  intent: "foreground"
108
108
  }
109
- }), st = V(
109
+ }), at = V(
110
110
  "ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-label",
111
111
  {
112
112
  variants: {
113
- trend: {
114
- up: "ds:text-[var(--success)]",
115
- down: "ds:text-[var(--destructive)]",
116
- flat: "ds:text-[var(--muted-foreground)]"
113
+ // Whether the change is good news, not which way it went: with
114
+ // `trendPolarity="lower-is-better"` a fall is `better`.
115
+ tone: {
116
+ better: "ds:text-[var(--success)]",
117
+ worse: "ds:text-[var(--destructive)]",
118
+ neutral: "ds:text-[var(--muted-foreground)]"
117
119
  }
118
120
  },
119
121
  defaultVariants: {
120
- trend: "flat"
122
+ tone: "neutral"
121
123
  }
122
124
  }
123
- ), at = { up: "↑", down: "↓", flat: "→" }, nt = {
125
+ ), nt = { up: "↑", down: "↓", flat: "→" }, it = {
124
126
  up: "stat.trend.up",
125
127
  down: "stat.trend.down",
126
128
  flat: "stat.trend.flat"
127
129
  };
128
- function it({
129
- trend: d,
130
+ function dt({
131
+ trend: a,
130
132
  delta: t,
131
- deltaFormat: c = "decimal",
132
- locale: a
133
+ deltaFormat: u = "decimal",
134
+ locale: n,
135
+ polarity: e = "higher-is-better"
133
136
  }) {
134
- const { t: e, i18n: o } = B("ui"), l = typeof t == "string" ? t : new Intl.NumberFormat(a ?? o.language, {
135
- style: c === "percent" ? "percent" : "decimal"
136
- }).format(c === "percent" ? t / 100 : t);
137
- return /* @__PURE__ */ z("span", { className: st({ trend: d }), children: [
138
- /* @__PURE__ */ i("span", { "aria-hidden": "true", children: at[d] }),
139
- /* @__PURE__ */ i("span", { className: "ds:sr-only", children: e(nt[d]) }),
140
- l
137
+ const { t: i, i18n: m } = B("ui"), d = typeof t == "string" ? t : new Intl.NumberFormat(n ?? m.language, {
138
+ style: u === "percent" ? "percent" : "decimal"
139
+ }).format(u === "percent" ? t / 100 : t), r = a === "flat" ? "neutral" : a === "up" == (e === "higher-is-better") ? "better" : "worse";
140
+ return /* @__PURE__ */ b("span", { className: at({ tone: r }), "data-trend-tone": r, children: [
141
+ /* @__PURE__ */ l("span", { "aria-hidden": "true", children: nt[a] }),
142
+ /* @__PURE__ */ l("span", { className: "ds:sr-only", children: i(it[a]) }),
143
+ d,
144
+ r === "neutral" ? null : /* @__PURE__ */ b("span", { className: "ds:sr-only", children: [
145
+ " ",
146
+ i(r === "better" ? "stat.trend.better" : "stat.trend.worse")
147
+ ] })
141
148
  ] });
142
149
  }
143
- function dt(d, t) {
144
- const c = d.trim();
145
- if (c === "") return null;
146
- let a = "", e = c;
147
- e.startsWith("+") ? (a = "+", e = e.slice(1).trimStart()) : (e.startsWith("-") || e.startsWith("−")) && (a = "-", e = e.slice(1).trimStart());
148
- let o = "";
149
- const l = e.match(/[KMB]$/i);
150
- l && (o = l[0], e = e.slice(0, -1).trimEnd());
151
- let u = "", m = ".";
150
+ function ot(a, t) {
151
+ const u = a.trim();
152
+ if (u === "") return null;
153
+ let n = "", e = u;
154
+ e.startsWith("+") ? (n = "+", e = e.slice(1).trimStart()) : (e.startsWith("-") || e.startsWith("−")) && (n = "-", e = e.slice(1).trimStart());
155
+ let i = "";
156
+ const m = e.match(/[KMB]$/i);
157
+ m && (i = m[0], e = e.slice(0, -1).trimEnd());
158
+ let d = "", r = ".";
152
159
  try {
153
- const b = new Intl.NumberFormat(t).formatToParts(12345.6);
154
- for (const n of b)
155
- n.type === "group" ? u = n.value : n.type === "decimal" && (m = n.value);
160
+ const h = new Intl.NumberFormat(t).formatToParts(12345.6);
161
+ for (const c of h)
162
+ c.type === "group" ? d = c.value : c.type === "decimal" && (r = c.value);
156
163
  } catch {
157
164
  }
158
165
  const g = e.match(/^(\d+)\.(\d+)$/);
159
- if (g && !(g[2].length === 3 && u === ".")) {
160
- const n = Number.parseFloat(e);
161
- if (Number.isFinite(n))
162
- return { target: n, sign: a, suffix: o };
166
+ if (g && !(g[2].length === 3 && d === ".")) {
167
+ const c = Number.parseFloat(e);
168
+ if (Number.isFinite(c))
169
+ return { target: c, sign: n, suffix: i };
163
170
  }
164
- let r = e;
165
- u !== "" && (r = r.split(u).join("")), m !== "." && (r = r.split(m).join(".")), r = r.replace(/[\s\u00A0\u202F]/g, "");
166
- const v = Number.parseFloat(r);
167
- return Number.isFinite(v) ? { target: v, sign: a, suffix: o } : null;
171
+ let o = e;
172
+ d !== "" && (o = o.split(d).join("")), r !== "." && (o = o.split(r).join(".")), o = o.replace(/[\s\u00A0\u202F]/g, "");
173
+ const f = Number.parseFloat(o);
174
+ return Number.isFinite(f) ? { target: f, sign: n, suffix: i } : null;
168
175
  }
169
- const ct = X(
176
+ const ct = Z(
170
177
  ({
171
- label: d,
178
+ label: a,
172
179
  value: t,
173
- format: c,
174
- currency: a,
180
+ format: u,
181
+ currency: n,
175
182
  locale: e,
176
- trend: o,
177
- delta: l,
178
- deltaFormat: u = "decimal",
179
- icon: m,
180
- loading: g = !1,
181
- animate: r = !1,
182
- animateOnEveryView: v = !1,
183
- animateDurationMs: b = 1600,
184
- animateLocale: n,
185
- animateSeparators: h,
186
- variant: x = "default",
187
- size: y = "md",
183
+ trend: i,
184
+ trendPolarity: m,
185
+ delta: d,
186
+ deltaFormat: r = "decimal",
187
+ icon: g,
188
+ loading: o = !1,
189
+ animate: f = !1,
190
+ animateOnEveryView: h = !1,
191
+ animateDurationMs: c = 1600,
192
+ animateLocale: K,
193
+ animateSeparators: x,
194
+ variant: y = "default",
195
+ size: N = "md",
188
196
  align: I = "start",
189
197
  intent: M = "foreground",
190
198
  className: j,
191
199
  ...k
192
200
  }, R) => {
193
- const { i18n: K } = B("ui"), T = Z(), f = e ?? K.language, Y = O(() => {
201
+ const { i18n: Y } = B("ui"), T = tt(), p = e ?? Y.language, _ = O(() => {
194
202
  if (typeof t == "string") return t;
195
- switch (c) {
203
+ switch (u) {
196
204
  case "currency":
197
- return new Intl.NumberFormat(f, {
205
+ return new Intl.NumberFormat(p, {
198
206
  style: "currency",
199
- currency: a ?? "USD"
207
+ currency: n ?? "USD"
200
208
  }).format(t);
201
209
  case "percent":
202
- return new Intl.NumberFormat(f, { style: "percent" }).format(
210
+ return new Intl.NumberFormat(p, { style: "percent" }).format(
203
211
  t
204
212
  );
205
213
  case "decimal":
206
- return new Intl.NumberFormat(f, { style: "decimal" }).format(
214
+ return new Intl.NumberFormat(p, { style: "decimal" }).format(
207
215
  t
208
216
  );
209
217
  default:
210
- return new Intl.NumberFormat(f).format(t);
218
+ return new Intl.NumberFormat(p).format(t);
211
219
  }
212
- }, [t, c, f, a])(), N = n ?? f;
213
- tt(!1);
214
- const s = et(() => r ? typeof t == "number" ? Number.isFinite(t) ? { target: t, sign: "", suffix: "" } : null : dt(t, N) : null, [r, t, N]), _ = r && s !== null, q = (s == null ? void 0 : s.target) ?? 0, F = (s == null ? void 0 : s.sign) ?? "", $ = (s == null ? void 0 : s.suffix) ?? "", H = O(
215
- (w) => {
220
+ }, [t, u, p, n])(), w = K ?? p;
221
+ et(!1);
222
+ const s = rt(() => f ? typeof t == "number" ? Number.isFinite(t) ? { target: t, sign: "", suffix: "" } : null : ot(t, w) : null, [f, t, w]), q = f && s !== null, H = (s == null ? void 0 : s.target) ?? 0, F = (s == null ? void 0 : s.sign) ?? "", $ = (s == null ? void 0 : s.suffix) ?? "", J = O(
223
+ (z) => {
216
224
  const E = (() => {
217
225
  try {
218
- return new Intl.NumberFormat(N, {
226
+ return new Intl.NumberFormat(w, {
219
227
  useGrouping: !0
220
228
  });
221
229
  } catch {
222
230
  return null;
223
231
  }
224
232
  })();
225
- let p;
233
+ let v;
226
234
  if (E)
227
- if (h) {
228
- const A = Math.abs(w), D = Math.trunc(A), G = A - D, J = h.thousand ?? "", S = String(D).replace(
235
+ if (x) {
236
+ const A = Math.abs(z), D = Math.trunc(A), G = A - D, Q = x.thousand ?? "", S = String(D).replace(
229
237
  /\B(?=(\d{3})+(?!\d))/g,
230
- J
238
+ Q
231
239
  );
232
240
  if (G === 0)
233
- p = S;
241
+ v = S;
234
242
  else {
235
- const L = G.toFixed(6).replace(/0+$/, "").slice(2), Q = h.decimal ?? ".";
236
- p = L ? S + Q + L : S;
243
+ const L = G.toFixed(6).replace(/0+$/, "").slice(2), X = x.decimal ?? ".";
244
+ v = L ? S + X + L : S;
237
245
  }
238
246
  } else
239
- p = E.format(Math.abs(w));
247
+ v = E.format(Math.abs(z));
240
248
  else
241
- p = String(Math.abs(w));
249
+ v = String(Math.abs(z));
242
250
  let W = F;
243
- return F === "" && w < 0 && (W = "-"), `${W}${p}${$}`;
251
+ return F === "" && z < 0 && (W = "-"), `${W}${v}${$}`;
244
252
  },
245
- [N, h, F, $]
246
- ), C = rt({
247
- to: q,
253
+ [w, x, F, $]
254
+ ), C = st({
255
+ to: H,
248
256
  from: 0,
249
- durationMs: b,
257
+ durationMs: c,
250
258
  startOnVisible: !0,
251
- retriggerOnReEntry: v,
259
+ retriggerOnReEntry: h,
252
260
  // `formatter` is the only path we use — it owns both the locale
253
261
  // formatting and the sign/suffix re-application.
254
- formatter: H
262
+ formatter: J
255
263
  });
256
- return g ? /* @__PURE__ */ z(
264
+ return o ? /* @__PURE__ */ b(
257
265
  "div",
258
266
  {
259
267
  ref: R,
260
268
  role: "group",
261
269
  "aria-busy": "true",
262
- "aria-label": d,
270
+ "aria-label": a,
263
271
  "data-component": "stat",
264
- className: P({ variant: x, size: y, align: I, className: j }),
272
+ className: P({ variant: y, size: N, align: I, className: j }),
265
273
  ...k,
266
274
  children: [
267
- /* @__PURE__ */ i("div", { className: "ds:h-[var(--skeleton-label-h)] ds:w-[var(--skeleton-label-w)] ds:animate-pulse ds:rounded-[var(--radius-sm)] ds:bg-[var(--muted)]" }),
268
- /* @__PURE__ */ i("div", { className: "ds:h-[var(--skeleton-value-h)] ds:w-[var(--skeleton-value-w)] ds:animate-pulse ds:rounded-[var(--radius-sm)] ds:bg-[var(--muted)]" })
275
+ /* @__PURE__ */ l("div", { className: "ds:h-[var(--skeleton-label-h)] ds:w-[var(--skeleton-label-w)] ds:animate-pulse ds:rounded-[var(--radius-sm)] ds:bg-[var(--muted)]" }),
276
+ /* @__PURE__ */ l("div", { className: "ds:h-[var(--skeleton-value-h)] ds:w-[var(--skeleton-value-w)] ds:animate-pulse ds:rounded-[var(--radius-sm)] ds:bg-[var(--muted)]" })
269
277
  ]
270
278
  }
271
- ) : /* @__PURE__ */ z(
279
+ ) : /* @__PURE__ */ b(
272
280
  "div",
273
281
  {
274
282
  ref: R,
275
283
  role: "group",
276
284
  "aria-labelledby": T,
277
285
  "data-component": "stat",
278
- className: P({ variant: x, size: y, align: I, className: j }),
286
+ className: P({ variant: y, size: N, align: I, className: j }),
279
287
  ...k,
280
288
  children: [
281
- /* @__PURE__ */ z("span", { className: "ds:inline-flex ds:items-center", children: [
282
- m && /* @__PURE__ */ i(
289
+ /* @__PURE__ */ b("span", { className: "ds:inline-flex ds:items-center", children: [
290
+ g && /* @__PURE__ */ l(
283
291
  "span",
284
292
  {
285
293
  "aria-hidden": "true",
@@ -292,41 +300,42 @@ const ct = X(
292
300
  "ds:text-[color:var(--accent)]",
293
301
  "ds:forced-colors:text-[CanvasText]"
294
302
  ].join(" "),
295
- children: m
303
+ children: g
296
304
  }
297
305
  ),
298
- /* @__PURE__ */ i(
306
+ /* @__PURE__ */ l(
299
307
  "span",
300
308
  {
301
309
  id: T,
302
310
  className: "type-label ds:text-[var(--muted-foreground)]",
303
- children: d
311
+ children: a
304
312
  }
305
313
  )
306
314
  ] }),
307
- _ ? (
315
+ q ? (
308
316
  // The animated number is wrapped in an `aria-live="off"` span
309
317
  // so screen readers don't announce every interpolated frame.
310
318
  // The `role="group"` ancestor (with `aria-labelledby` pointing
311
319
  // at the label) carries the final accessible reading — the
312
320
  // animated frames are decorative only.
313
- /* @__PURE__ */ i(
321
+ /* @__PURE__ */ l(
314
322
  "span",
315
323
  {
316
324
  ref: C.ref,
317
325
  "aria-live": "off",
318
- className: U({ size: y, variant: x, intent: M }),
326
+ className: U({ size: N, variant: y, intent: M }),
319
327
  children: C.value
320
328
  }
321
329
  )
322
- ) : /* @__PURE__ */ i("span", { className: U({ size: y, variant: x, intent: M }), children: Y }),
323
- o != null && l != null && /* @__PURE__ */ i(
324
- it,
330
+ ) : /* @__PURE__ */ l("span", { className: U({ size: N, variant: y, intent: M }), children: _ }),
331
+ i != null && d != null && /* @__PURE__ */ l(
332
+ dt,
325
333
  {
326
- trend: o,
327
- delta: l,
328
- deltaFormat: u,
329
- locale: e
334
+ trend: i,
335
+ delta: d,
336
+ deltaFormat: r,
337
+ locale: e,
338
+ polarity: m
330
339
  }
331
340
  )
332
341
  ]
@@ -338,4 +347,4 @@ ct.displayName = "Stat";
338
347
  export {
339
348
  ct as S
340
349
  };
341
- //# sourceMappingURL=stat-51CDL4au.js.map
350
+ //# sourceMappingURL=stat-DmjGfXND.js.map
@@ -124,7 +124,11 @@ const K = [
124
124
  "ds:group-data-[state=open]/item:rotate-180"
125
125
  ].join(" "), sr = [
126
126
  "type-meta ds:text-[var(--muted-foreground)]",
127
- "ds:ps-[calc(var(--min-target-size)+var(--spacing-md)+var(--spacing-sm))]",
127
+ // Indented under the step title from 448px of accordion width (px, not
128
+ // rem: a container query in rem follows the host's root font size); narrower
129
+ // (a phone) the content takes the full width so a form or a list in it
130
+ // is not squeezed beside the step number.
131
+ "ds:ps-[var(--spacing-md)] ds:@[448px]/stepper:ps-[calc(var(--min-target-size)+var(--spacing-md)+var(--spacing-sm))]",
128
132
  "ds:pe-[var(--spacing-md)] ds:pb-[var(--spacing-sm)]",
129
133
  "ds:group-data-[state=open]/item:hidden"
130
134
  ].join(" "), ar = [
@@ -132,11 +136,18 @@ const K = [
132
136
  "ds:data-[state=open]:animate-[accordion-down_var(--animation-duration)_var(--ease-out)]",
133
137
  "ds:data-[state=closed]:animate-[accordion-up_var(--animation-duration)_var(--ease-in)]"
134
138
  ].join(" "), tr = [
135
- "ds:ps-[calc(var(--min-target-size)+var(--spacing-md)+var(--spacing-sm))]",
139
+ // Indented under the step title from 448px of accordion width (px, not
140
+ // rem: a container query in rem follows the host's root font size); narrower
141
+ // (a phone) the content takes the full width so a form or a list in it
142
+ // is not squeezed beside the step number.
143
+ "ds:ps-[var(--spacing-md)] ds:@[448px]/stepper:ps-[calc(var(--min-target-size)+var(--spacing-md)+var(--spacing-sm))]",
136
144
  "ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-md)]"
137
- ].join(" "), nr = b("ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]", {
138
- variants: {}
139
- }), or = P(
145
+ ].join(" "), nr = b(
146
+ "ds:@container/stepper ds:flex ds:w-full ds:min-w-0 ds:flex-col ds:gap-[var(--spacing-sm)]",
147
+ {
148
+ variants: {}
149
+ }
150
+ ), or = P(
140
151
  ({
141
152
  activeStep: s,
142
153
  steps: i,
@@ -248,4 +259,4 @@ or.displayName = "StepperAccordion";
248
259
  export {
249
260
  or as S
250
261
  };
251
- //# sourceMappingURL=stepper-accordion-D7lnBGh2.js.map
262
+ //# sourceMappingURL=stepper-accordion-DDTSOUHc.js.map
@@ -6,14 +6,14 @@ import { A as M } from "./alert-BhCstf2h.js";
6
6
  import { B as Me } from "./button-Bn16lcFM.js";
7
7
  import { I as We } from "./icon-button-COX76Jdj.js";
8
8
  import { C as Qe } from "./combobox-U5yfO6o0.js";
9
- import { D as ce } from "./dialog-D52AI4nF.js";
9
+ import { D as ce } from "./dialog-CUzbnKLw.js";
10
10
  import { D as Bt } from "./date-picker-wRAcq2lt.js";
11
11
  import { F as H } from "./form-field-Ani72sVY.js";
12
12
  import { I as Ft } from "./icon-button-group-C5hhI-R5.js";
13
13
  import { P as Pt } from "./panel-header-D_mTdhUp.js";
14
14
  import { P as Ot } from "./panel-subview-BT-Apwgb.js";
15
15
  import { R as Pe } from "./radio-BBbMdbE_.js";
16
- import { R as jt } from "./radio-group-BT97ty7o.js";
16
+ import { R as jt } from "./radio-group-DicxWJXP.js";
17
17
  import { S as Mt } from "./scroll-area-ZtFCv9K7.js";
18
18
  import { S as Ke } from "./select-Ce5RMk93.js";
19
19
  import { S as He } from "./skeleton-B1KTdJ4N.js";
@@ -1238,4 +1238,4 @@ export {
1238
1238
  vo as T,
1239
1239
  lo as t
1240
1240
  };
1241
- //# sourceMappingURL=task-editor-Ctxsa1BY.js.map
1241
+ //# sourceMappingURL=task-editor-ByyRu29Y.js.map
@@ -16,7 +16,7 @@ import { E as zt } from "./editable-description-DuJlvltc.js";
16
16
  import { N as Xe } from "./note-timeline-CsY8YOE7.js";
17
17
  import { P as Ot } from "./panel-header-D_mTdhUp.js";
18
18
  import { P as Ge } from "./panel-subview-BT-Apwgb.js";
19
- import { P as _t } from "./patient-summary-card-3dspc2tR.js";
19
+ import { P as _t } from "./patient-summary-card-9nQWTQf6.js";
20
20
  import { S as ne } from "./section-card-ChJdOlBU.js";
21
21
  import { C as nn, S as ue } from "./skeleton-B1KTdJ4N.js";
22
22
  import { T as an } from "./text-area-COMVJ1yE.js";
@@ -2195,4 +2195,4 @@ export {
2195
2195
  Kn as s,
2196
2196
  _s as u
2197
2197
  };
2198
- //# sourceMappingURL=use-appointment-details-read-DinTrRIW.js.map
2198
+ //# sourceMappingURL=use-appointment-details-read-JsDM48tf.js.map
@@ -0,0 +1,26 @@
1
+ import { useRef as u, useMemo as i } from "react";
2
+ const s = /* @__PURE__ */ new Set(["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"]);
3
+ function f() {
4
+ const t = u(null);
5
+ return i(
6
+ () => ({
7
+ onKeyDown: (r) => {
8
+ if (!s.has(r.key) || !r.defaultPrevented) return;
9
+ const n = r.currentTarget, c = r.target, o = { selected: !1 };
10
+ t.current = o, window.setTimeout(() => {
11
+ t.current === o && (t.current = null);
12
+ const e = document.activeElement;
13
+ o.selected || e === c || !(e instanceof HTMLElement) || !n.isConnected || e.getAttribute("role") !== "radio" || e.closest('[role="radiogroup"]') !== n || e.getAttribute("aria-checked") === "true" || e.click();
14
+ }, 0);
15
+ },
16
+ noteSelection: () => {
17
+ t.current && (t.current.selected = !0);
18
+ }
19
+ }),
20
+ []
21
+ );
22
+ }
23
+ export {
24
+ f as u
25
+ };
26
+ //# sourceMappingURL=use-select-on-arrow-Cr4iBuW5.js.map
@@ -2,7 +2,7 @@ import { jsx as t, jsxs as c } from "react/jsx-runtime";
2
2
  import { forwardRef as P, useState as N, useEffect as S, useMemo as f, useCallback as W, useImperativeHandle as T } from "react";
3
3
  import { c as _ } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as j } from "react-i18next";
5
- import { D as l } from "./dialog-D52AI4nF.js";
5
+ import { D as l } from "./dialog-CUzbnKLw.js";
6
6
  import { S as z } from "./state-backed-text-input-DECQy5aA.js";
7
7
  import { B as C } from "./badge-hnBt8o7n.js";
8
8
  import { u as B } from "./registry-DvAUVLHh.js";
@@ -190,4 +190,4 @@ export {
190
190
  A as W,
191
191
  L as w
192
192
  };
193
- //# sourceMappingURL=widget-picker-D8RiWrJd.js.map
193
+ //# sourceMappingURL=widget-picker-DXYBMTfe.js.map
@@ -4,7 +4,7 @@ import { c as j } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as z } from "react-i18next";
5
5
  import { C } from "./card-DMO2nkt4.js";
6
6
  import { B as ye } from "./badge-hnBt8o7n.js";
7
- import { a as Z } from "./key-value-pair-Ax8IJr1M.js";
7
+ import { a as Z } from "./key-value-pair-BNNITp6S.js";
8
8
  import { T as xe } from "./timestamp-DPLDWdxA.js";
9
9
  import { I as S } from "./icon-button-COX76Jdj.js";
10
10
  import { P as $ } from "./pencil-B1sKKyuT.js";
@@ -1321,4 +1321,4 @@ export {
1321
1321
  ee as r,
1322
1322
  D as w
1323
1323
  };
1324
- //# sourceMappingURL=workflow-map-D3mezmGB.js.map
1324
+ //# sourceMappingURL=workflow-map-Demlpy39.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "packageVersion": "1.55.0",
3
+ "packageVersion": "1.56.0",
4
4
  "components": [
5
5
  {
6
6
  "kind": "component",
@@ -2071,7 +2071,7 @@
2071
2071
  ]
2072
2072
  },
2073
2073
  "idempotent": true,
2074
- "description": "Replace the chart series without remounting. Pass the DECLARED type’s shape (see declaredType state) — when the user has switched the view cross-shape the values are converted to the rendered shape. The write targets the live instance only: a later type switch re-reads the original props and discards it.",
2074
+ "description": "Replace the chart series without remounting. Pass the DECLARED type’s shape (see declaredType state); when the user has switched the view cross-shape the values are converted to the rendered shape. The data and its summary table persist across type switches, resizes and theme changes until the host passes a new series prop.",
2075
2075
  "descriptionKey": "ui.agent.chart.actions.updateSeries"
2076
2076
  },
2077
2077
  {
@@ -2083,7 +2083,7 @@
2083
2083
  "description": "A `data:image/png;base64,…` URI of the rendered chart."
2084
2084
  },
2085
2085
  "idempotent": true,
2086
- "description": "Return a PNG data URI of the chart for export or screenshotting.",
2086
+ "description": "Return a PNG data URI of the chart for export or screenshotting. Waits until series pushed with update_series are drawn.",
2087
2087
  "descriptionKey": "ui.agent.chart.actions.exportPng"
2088
2088
  }
2089
2089
  ],
@@ -3256,6 +3256,12 @@
3256
3256
  "type": "boolean",
3257
3257
  "description": "Whether edit mode is on. Move/resize actions are refused while it is off — the host app owns the toggle.",
3258
3258
  "descriptionKey": "ui.agent.dashboardGrid.state.editing"
3259
+ },
3260
+ {
3261
+ "name": "stacked",
3262
+ "type": "boolean",
3263
+ "description": "Whether the board is narrower than its stackBelow width and shows its widgets as one read-only column. Move/resize actions are unavailable while it is true, even in edit mode; the saved layout is unchanged.",
3264
+ "descriptionKey": "ui.agent.dashboardGrid.state.stacked"
3259
3265
  }
3260
3266
  ],
3261
3267
  "actions": [
@@ -3290,10 +3296,15 @@
3290
3296
  "returns": "boolean (accepted)",
3291
3297
  "returnsSchema": {
3292
3298
  "type": "boolean",
3293
- "description": "True when applied; false when edit mode is off or the id is unknown."
3299
+ "description": "True when applied; false when edit mode is off, the board is stacked, or the id is unknown."
3294
3300
  },
3295
3301
  "idempotent": true,
3296
- "description": "Move a widget to a cell. Out-of-bounds targets are clamped; colliding widgets are pushed down and the layout re-compacts. Refused while edit mode is off.",
3302
+ "errors": [
3303
+ "Unavailable while the board is stacked (state stacked is true): returns false and changes nothing.",
3304
+ "Unavailable while edit mode is off: returns false.",
3305
+ "Unknown widget id: returns false."
3306
+ ],
3307
+ "description": "Move a widget to a cell. Out-of-bounds targets are clamped; colliding widgets are pushed down and the layout re-compacts. Refused while edit mode is off or the board is stacked.",
3297
3308
  "descriptionKey": "ui.agent.dashboardGrid.actions.moveWidget"
3298
3309
  },
3299
3310
  {
@@ -3327,17 +3338,23 @@
3327
3338
  "returns": "boolean (accepted)",
3328
3339
  "returnsSchema": {
3329
3340
  "type": "boolean",
3330
- "description": "True when applied; false when edit mode is off or the id is unknown."
3341
+ "description": "True when applied; false when edit mode is off, the board is stacked, or the id is unknown."
3331
3342
  },
3332
3343
  "idempotent": true,
3333
- "description": "Resize a widget to a span. Clamped to the grid and the widget’s min/max; colliding widgets are pushed down. Refused while edit mode is off.",
3344
+ "errors": [
3345
+ "Unavailable while the board is stacked (state stacked is true): returns false and changes nothing.",
3346
+ "Unavailable while edit mode is off: returns false.",
3347
+ "Unknown widget id: returns false."
3348
+ ],
3349
+ "description": "Resize a widget to a span. Clamped to the grid and the widget’s min/max; colliding widgets are pushed down. Refused while edit mode is off or the board is stacked.",
3334
3350
  "descriptionKey": "ui.agent.dashboardGrid.actions.resizeWidget"
3335
3351
  }
3336
3352
  ],
3337
3353
  "domHooks": {
3338
3354
  "root": {
3339
3355
  "attr": "data-component",
3340
- "value": "dashboard-grid"
3356
+ "value": "dashboard-grid",
3357
+ "description": "Also carries data-stacked=\"true\" while the board shows one read-only column."
3341
3358
  },
3342
3359
  "instanceId": {
3343
3360
  "attr": "data-component-id",
@@ -19708,7 +19725,7 @@
19708
19725
  {
19709
19726
  "name": "run_template",
19710
19727
  "safety": "phi",
19711
- "description": "Open the Templates menu from the editor's AI pill, or from the bubble that appears over selected text, and pick a template (default first). It runs straight away and rewrites the selected text, or the whole note when nothing is selected; the notice that follows offers Undo. Without patient AI consent the consent banner shows first. Out of AI credits opens the Alia Writing Assistant on the out-of-credits notice.",
19728
+ "description": "Open the Templates menu from the editor's AI pill, or from the bubble that appears over selected text, and pick a template (listed in the practice's order). It runs straight away and rewrites the selected text, or the whole note when nothing is selected; the notice that follows offers Undo. Without patient AI consent the consent banner shows first. Out of AI credits opens the Alia Writing Assistant on the out-of-credits notice.",
19712
19729
  "descriptionKey": "ui.agent.helpMeWriteTemplates.workflows.runTemplate",
19713
19730
  "uiActions": [
19714
19731
  "dropdown-menu.open",
@@ -19734,7 +19751,7 @@
19734
19751
  {
19735
19752
  "name": "manage_templates",
19736
19753
  "safety": "write",
19737
- "description": "Open Manage templates from the Templates menu in the AI pill: list the practice's templates, create or edit one (name, optional short description, instructions for the AI, use as default; names are unique) and delete one after a confirmation. Shown only when the host allows managing.",
19754
+ "description": "Open Manage templates from the Templates menu in the AI pill: list the practice's templates, create or edit one (name, optional short description, instructions for the AI; names are unique), reorder them by dragging and delete one after a confirmation. Shown only when the host allows managing.",
19738
19755
  "descriptionKey": "ui.agent.helpMeWriteTemplates.workflows.manageTemplates",
19739
19756
  "uiActions": [
19740
19757
  "dialog.close",
@@ -248,8 +248,8 @@
248
248
  },
249
249
  "actions": {
250
250
  "changeView": "Switch the rendered chart type via the type switcher. No-op (returns false) when the chart has no switcher or the type is not offered.",
251
- "updateSeries": "Replace the chart series without remounting. Pass the DECLARED type’s shape (see declaredType state) — when the user has switched the view cross-shape the values are converted to the rendered shape. The write targets the live instance only: a later type switch re-reads the original props and discards it.",
252
- "exportPng": "Return a PNG data URI of the chart for export or screenshotting."
251
+ "updateSeries": "Replace the chart series without remounting. Pass the DECLARED type’s shape (see declaredType state); when the user has switched the view cross-shape the values are converted to the rendered shape. The data and its summary table persist across type switches, resizes and theme changes until the host passes a new series prop.",
252
+ "exportPng": "Return a PNG data URI of the chart for export or screenshotting. Waits until series pushed with update_series are drawn."
253
253
  }
254
254
  },
255
255
  "chatContainer": {
@@ -399,11 +399,12 @@
399
399
  "state": {
400
400
  "layout": "Current widget geometry in cell units — ids and rectangles only, no widget content.",
401
401
  "cols": "Logical column count of the board.",
402
- "editing": "Whether edit mode is on. Move/resize actions are refused while it is off — the host app owns the toggle."
402
+ "editing": "Whether edit mode is on. Move/resize actions are refused while it is off — the host app owns the toggle.",
403
+ "stacked": "Whether the board is narrower than its stackBelow width and shows its widgets as one read-only column. Move/resize actions are unavailable while it is true, even in edit mode; the saved layout is unchanged."
403
404
  },
404
405
  "actions": {
405
- "moveWidget": "Move a widget to a cell. Out-of-bounds targets are clamped; colliding widgets are pushed down and the layout re-compacts. Refused while edit mode is off.",
406
- "resizeWidget": "Resize a widget to a span. Clamped to the grid and the widget’s min/max; colliding widgets are pushed down. Refused while edit mode is off."
406
+ "moveWidget": "Move a widget to a cell. Out-of-bounds targets are clamped; colliding widgets are pushed down and the layout re-compacts. Refused while edit mode is off or the board is stacked.",
407
+ "resizeWidget": "Resize a widget to a span. Clamped to the grid and the widget’s min/max; colliding widgets are pushed down. Refused while edit mode is off or the board is stacked."
407
408
  }
408
409
  },
409
410
  "dataTableTabs": {
@@ -1835,9 +1836,9 @@
1835
1836
  },
1836
1837
  "helpMeWriteTemplates": {
1837
1838
  "workflows": {
1838
- "runTemplate": "Open the Templates menu from the editor's AI pill, or from the bubble that appears over selected text, and pick a template (default first). It runs straight away and rewrites the selected text, or the whole note when nothing is selected; the notice that follows offers Undo. Without patient AI consent the consent banner shows first. Out of AI credits opens the Alia Writing Assistant on the out-of-credits notice.",
1839
+ "runTemplate": "Open the Templates menu from the editor's AI pill, or from the bubble that appears over selected text, and pick a template (listed in the practice's order). It runs straight away and rewrites the selected text, or the whole note when nothing is selected; the notice that follows offers Undo. Without patient AI consent the consent banner shows first. Out of AI credits opens the Alia Writing Assistant on the out-of-credits notice.",
1839
1840
  "freePrompt": "Type (or dictate with the bar mic) what to write and press Write; the draft is inserted at the caret on Insert.",
1840
- "manageTemplates": "Open Manage templates from the Templates menu in the AI pill: list the practice's templates, create or edit one (name, optional short description, instructions for the AI, use as default; names are unique) and delete one after a confirmation. Shown only when the host allows managing."
1841
+ "manageTemplates": "Open Manage templates from the Templates menu in the AI pill: list the practice's templates, create or edit one (name, optional short description, instructions for the AI; names are unique), reorder them by dragging and delete one after a confirmation. Shown only when the host allows managing."
1841
1842
  }
1842
1843
  },
1843
1844
  "invoices": {