@alfadocs/ui-kit 1.65.0 → 1.67.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 (158) hide show
  1. package/dist/_chunks/ai-credits-exhausted-notice-DfAgfZDF.js +287 -0
  2. package/dist/_chunks/ai-credits-exhausted-notice.agent-DgTSTgez.js +43 -0
  3. package/dist/_chunks/ai-credits-notice-DQ-r3iQU.js +191 -0
  4. package/dist/_chunks/{ai-permission-notice-DpRmZ9Q3.js → ai-permission-notice-qsdm4Sx4.js} +2 -2
  5. package/dist/_chunks/{alert-DdDpOi-P.js → alert-DjsJMGRE.js} +3 -2
  6. package/dist/_chunks/{anamnesis-summary-rows-BIfw890v.js → anamnesis-summary-rows-BQ_EokKz.js} +2 -2
  7. package/dist/_chunks/{audio-recorder-DR-u1qbl.js → audio-recorder-B11RR-rC.js} +2 -2
  8. package/dist/_chunks/{auth-form-parts-Cmb41LSQ.js → auth-form-parts-DwUTH6YN.js} +2 -2
  9. package/dist/_chunks/{booking-DkjatiXc.js → booking-tTVxKPQY.js} +2 -2
  10. package/dist/_chunks/{calendar-workspace-Cp8yTZ1g.js → calendar-workspace-MRrzcxAy.js} +6 -6
  11. package/dist/_chunks/chart-CwmyCuWe.js +1340 -0
  12. package/dist/_chunks/{document-preview-B1dQm292.js → document-preview-VyQOjFVL.js} +2 -2
  13. package/dist/_chunks/{document-scanner-CVPVLK7z.js → document-scanner-CXH_GYh4.js} +2 -2
  14. package/dist/_chunks/{entity-summary-BQ9_KA8S.js → entity-summary-Bj-Wxq7Y.js} +2 -2
  15. package/dist/_chunks/{error-summary-DrUfuKu1.js → error-summary-PUE5Zxp9.js} +2 -2
  16. package/dist/_chunks/{forgot-password-form-CgZkEvZy.js → forgot-password-form-CPOfRE0C.js} +4 -4
  17. package/dist/_chunks/{freemium-paywall-DKJHRFpp.js → freemium-paywall-6DO7noHX.js} +2 -2
  18. package/dist/_chunks/heatmap-C1TeC7wT.js +3650 -0
  19. package/dist/_chunks/help-me-write-templates-Bw3Q58x-.js +687 -0
  20. package/dist/_chunks/hourglass-BEAzW1wE.js +26 -0
  21. package/dist/_chunks/{login-dev-card-PnADNcI9.js → login-dev-card-A-CL3mjt.js} +3 -3
  22. package/dist/_chunks/{marketplace-app-shell-C-2e4eCD.js → marketplace-app-shell-DtSX8sYb.js} +2 -2
  23. package/dist/_chunks/{notes-panel-uEGIL7mi.js → notes-panel-IdsmqRFC.js} +3 -3
  24. package/dist/_chunks/{patient-details-4P1vA9Ls.js → patient-details-C-EWQTms.js} +2 -2
  25. package/dist/_chunks/{patient-field-row-CBXhlfGD.js → patient-field-row-lY-Tb5Mo.js} +155 -176
  26. package/dist/_chunks/{patient-search-DOnDUVsl.js → patient-search-DpAKidZ5.js} +2 -2
  27. package/dist/_chunks/{patient-summary-card-CuDLo8MP.js → patient-summary-card-Bpto_VCD.js} +2 -2
  28. package/dist/_chunks/{payment-automation-upsell-C8MEu0t6.js → payment-automation-upsell-BQ307qEX.js} +2 -2
  29. package/dist/_chunks/{payment-form-C3dGY7v4.js → payment-form-XKtinW8r.js} +2 -2
  30. package/dist/_chunks/{pdf-viewer-DJ9VN7cu.js → pdf-viewer-BvoVMjH4.js} +2 -2
  31. package/dist/_chunks/{practice-results-8h2Utpt3.js → practice-results-BrUDDMXC.js} +2 -2
  32. package/dist/_chunks/{registration-form-BQyT_kBX.js → registration-form-BxwqUZzk.js} +3 -3
  33. package/dist/_chunks/{rich-text-editor-M2gT_E7f.js → rich-text-editor-aCIoptbg.js} +1653 -1743
  34. package/dist/_chunks/{sign-document-CY7xTXbm.js → sign-document-D1P1nUQA.js} +2 -2
  35. package/dist/_chunks/{signature-request-BMCHy2ZO.js → signature-request-3u6TvRt2.js} +2 -2
  36. package/dist/_chunks/{task-editor-CifOznfq.js → task-editor-Bb5MMcid.js} +2 -2
  37. package/dist/_chunks/{tasks-panel-8nLwBw6P.js → tasks-panel-BOb57Ysw.js} +2 -2
  38. package/dist/_chunks/{use-appointment-details-read-B-FEWbQM.js → use-appointment-details-read-CVSPoP5j.js} +4 -4
  39. package/dist/_chunks/voice-control-panel-BJIEbDq6.js +1148 -0
  40. package/dist/_chunks/{warning-stack-HYWAytZV.js → warning-stack-BdY-0bd3.js} +2 -2
  41. package/dist/_chunks/{workflow-map-C2B2qIr1.js → workflow-map-CYbRD9ek.js} +2 -2
  42. package/dist/agent-catalog.json +50 -3
  43. package/dist/agent-i18n/en.json +7 -4
  44. package/dist/components/_shared/use-apex-radial-centre.d.ts +7 -4
  45. package/dist/components/ai-credits-notice/ai-credits-exhausted-notice.agent.d.ts +4 -0
  46. package/dist/components/ai-credits-notice/ai-credits-exhausted-notice.d.ts +96 -0
  47. package/dist/components/ai-credits-notice/ai-credits-notice.d.ts +30 -4
  48. package/dist/components/ai-credits-notice/index.d.ts +3 -0
  49. package/dist/components/ai-credits-notice/index.js +10 -4
  50. package/dist/components/ai-permission-notice/index.js +1 -1
  51. package/dist/components/alert/index.js +1 -1
  52. package/dist/components/appointment-details-panel/index.js +1 -1
  53. package/dist/components/audio-recorder/index.js +1 -1
  54. package/dist/components/booking/index.js +1 -1
  55. package/dist/components/chart/index.js +1 -1
  56. package/dist/components/document-preview/index.js +1 -1
  57. package/dist/components/document-scanner/index.js +1 -1
  58. package/dist/components/entity-summary/index.js +1 -1
  59. package/dist/components/error-summary/index.js +1 -1
  60. package/dist/components/freemium-paywall/index.js +1 -1
  61. package/dist/components/heatmap/heatmap-context.d.ts +3 -0
  62. package/dist/components/heatmap/heatmap-disclosure.d.ts +67 -0
  63. package/dist/components/heatmap/heatmap-grid.d.ts +1 -1
  64. package/dist/components/heatmap/heatmap-legend.d.ts +5 -2
  65. package/dist/components/heatmap/heatmap-model.d.ts +107 -15
  66. package/dist/components/heatmap/heatmap-table-view.d.ts +3 -2
  67. package/dist/components/heatmap/heatmap.d.ts +33 -7
  68. package/dist/components/heatmap/index.d.ts +1 -1
  69. package/dist/components/heatmap/index.js +1 -1
  70. package/dist/components/notes-panel/index.js +1 -1
  71. package/dist/components/patient-details/index.js +1 -1
  72. package/dist/components/patient-search/index.js +1 -1
  73. package/dist/components/patient-summary-card/index.js +1 -1
  74. package/dist/components/payment-form/index.js +1 -1
  75. package/dist/components/pdf-viewer/index.js +1 -1
  76. package/dist/components/practice-results/index.js +1 -1
  77. package/dist/components/rich-text-editor/index.js +1 -1
  78. package/dist/components/sign-document/index.js +1 -1
  79. package/dist/components/task-editor/index.js +1 -1
  80. package/dist/components/tasks-panel/index.js +1 -1
  81. package/dist/components/voice-control-panel/index.d.ts +2 -1
  82. package/dist/components/voice-control-panel/index.js +1 -1
  83. package/dist/components/voice-control-panel/voice-control-panel.d.ts +43 -3
  84. package/dist/components/warning-stack/index.js +1 -1
  85. package/dist/components/workflow/index.js +1 -1
  86. package/dist/i18n/locales/ar.d.ts +29 -12
  87. package/dist/i18n/locales/ar.js +29 -12
  88. package/dist/i18n/locales/de.d.ts +29 -12
  89. package/dist/i18n/locales/de.js +29 -12
  90. package/dist/i18n/locales/el.d.ts +29 -12
  91. package/dist/i18n/locales/el.js +29 -12
  92. package/dist/i18n/locales/en.d.ts +29 -12
  93. package/dist/i18n/locales/en.js +29 -12
  94. package/dist/i18n/locales/es.d.ts +29 -12
  95. package/dist/i18n/locales/es.js +29 -12
  96. package/dist/i18n/locales/fr.d.ts +29 -12
  97. package/dist/i18n/locales/fr.js +29 -12
  98. package/dist/i18n/locales/hi.d.ts +29 -12
  99. package/dist/i18n/locales/hi.js +29 -12
  100. package/dist/i18n/locales/it.d.ts +29 -12
  101. package/dist/i18n/locales/it.js +29 -12
  102. package/dist/i18n/locales/ja.d.ts +29 -12
  103. package/dist/i18n/locales/ja.js +29 -12
  104. package/dist/i18n/locales/nl.d.ts +29 -12
  105. package/dist/i18n/locales/nl.js +29 -12
  106. package/dist/i18n/locales/pl.d.ts +29 -12
  107. package/dist/i18n/locales/pl.js +29 -12
  108. package/dist/i18n/locales/pt.d.ts +29 -12
  109. package/dist/i18n/locales/pt.js +29 -12
  110. package/dist/i18n/locales/ro.d.ts +29 -12
  111. package/dist/i18n/locales/ro.js +29 -12
  112. package/dist/i18n/locales/ru.d.ts +29 -12
  113. package/dist/i18n/locales/ru.js +29 -12
  114. package/dist/i18n/locales/sq.d.ts +29 -12
  115. package/dist/i18n/locales/sq.js +29 -12
  116. package/dist/i18n/locales/sv.d.ts +29 -12
  117. package/dist/i18n/locales/sv.js +29 -12
  118. package/dist/i18n/locales/tr.d.ts +29 -12
  119. package/dist/i18n/locales/tr.js +29 -12
  120. package/dist/i18n/locales/zh.d.ts +29 -12
  121. package/dist/i18n/locales/zh.js +29 -12
  122. package/dist/index.js +814 -809
  123. package/dist/locales/ar.json +29 -12
  124. package/dist/locales/de.json +29 -12
  125. package/dist/locales/el.json +29 -12
  126. package/dist/locales/en.json +29 -12
  127. package/dist/locales/es.json +29 -12
  128. package/dist/locales/fr.json +29 -12
  129. package/dist/locales/hi.json +29 -12
  130. package/dist/locales/it.json +29 -12
  131. package/dist/locales/ja.json +29 -12
  132. package/dist/locales/nl.json +29 -12
  133. package/dist/locales/pl.json +29 -12
  134. package/dist/locales/pt.json +29 -12
  135. package/dist/locales/ro.json +29 -12
  136. package/dist/locales/ru.json +29 -12
  137. package/dist/locales/sq.json +29 -12
  138. package/dist/locales/sv.json +29 -12
  139. package/dist/locales/tr.json +29 -12
  140. package/dist/locales/zh.json +29 -12
  141. package/dist/patterns/anamnesis/index.js +1 -1
  142. package/dist/patterns/calendar/index.js +1 -1
  143. package/dist/patterns/forgot-password-form/index.js +1 -1
  144. package/dist/patterns/help-me-write-templates/help-me-write-templates.d.ts +6 -23
  145. package/dist/patterns/help-me-write-templates/index.js +8 -7
  146. package/dist/patterns/login-form/index.js +1 -1
  147. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  148. package/dist/patterns/payment-automation-upsell/index.js +1 -1
  149. package/dist/patterns/registration-form/index.js +1 -1
  150. package/dist/patterns/signature-request/index.js +1 -1
  151. package/dist/tokens.css +1 -1
  152. package/package.json +1 -1
  153. package/dist/_chunks/ai-credits-notice-pK9BOmEz.js +0 -90
  154. package/dist/_chunks/ai-credits-notice.agent-C9L7orrP.js +0 -17
  155. package/dist/_chunks/chart-CIzXxNeM.js +0 -1322
  156. package/dist/_chunks/heatmap-BxRHM8Et.js +0 -2865
  157. package/dist/_chunks/help-me-write-templates-DFmqnsAa.js +0 -747
  158. package/dist/_chunks/voice-control-panel-C0BfY23Y.js +0 -1009
@@ -1,4 +1,4 @@
1
- import { type AggregateResult, type HeatmapAggregate } from './heatmap-scale';
1
+ import { type HeatmapAggregate } from './heatmap-scale';
2
2
  /** One row of the heatmap. */
3
3
  export interface HeatmapRow {
4
4
  /** Stable, opaque id. Emitted in DOM hooks, so never a name. */
@@ -97,6 +97,10 @@ export interface ModelCell {
97
97
  count?: number;
98
98
  label?: string;
99
99
  status: HeatmapCellStatus;
100
+ /** A total withheld to protect hidden cells. Its status stays
101
+ * `low-sample`, but it may rest on many records, so it is worded apart
102
+ * from a cell that is too few to show. */
103
+ withheld?: true;
100
104
  }
101
105
  /** How rows are ordered (within their group when grouped). */
102
106
  export type HeatmapSortRows = 'none' | 'label' | 'total-asc' | 'total-desc';
@@ -110,26 +114,114 @@ export declare function buildMatrix(rows: readonly HeatmapRow[], columns: readon
110
114
  export declare function shownValues(matrix: readonly ModelCell[][]): number[];
111
115
  /** Whether at least one cell carries data (a value or a low sample). */
112
116
  export declare function hasAnyData(matrix: readonly ModelCell[][]): boolean;
117
+ /**
118
+ * Which total `getTotal` is asked for, with the rows, columns and group it
119
+ * covers. `method` is how the kit combines the cells for it: the
120
+ * `rowTotals` method for a row, a group and the grand total, the
121
+ * `columnTotals` method for a column, and the column method (else the row
122
+ * method) for a group header cell.
123
+ */
124
+ export type HeatmapTotalScope = {
125
+ /** A row's total, in the totals column. */
126
+ kind: 'row';
127
+ method: HeatmapAggregate;
128
+ row: HeatmapRow;
129
+ rowId: string;
130
+ /** Index into the `rows` prop. */
131
+ rowIndex: number;
132
+ } | {
133
+ /** A column's total, in the totals row. */
134
+ kind: 'column';
135
+ method: HeatmapAggregate;
136
+ column: HeatmapColumn;
137
+ columnId: string | number;
138
+ /** Index into the `columns` prop. */
139
+ columnIndex: number;
140
+ } | {
141
+ /** A group's total, in the totals column of its header row. */
142
+ kind: 'group';
143
+ method: HeatmapAggregate;
144
+ /** The id the group's rows carry in `group`. */
145
+ groupId: string;
146
+ /** The group's entry in `groups`, when it has one. */
147
+ group?: HeatmapGroup;
148
+ /** The group's rows, in the order of the `rows` prop. */
149
+ rows: readonly HeatmapRow[];
150
+ rowIndexes: readonly number[];
151
+ } | {
152
+ /** One column's total within a group, in the group's header row. */
153
+ kind: 'group-column';
154
+ method: HeatmapAggregate;
155
+ groupId: string;
156
+ group?: HeatmapGroup;
157
+ rows: readonly HeatmapRow[];
158
+ rowIndexes: readonly number[];
159
+ column: HeatmapColumn;
160
+ columnId: string | number;
161
+ columnIndex: number;
162
+ } | {
163
+ /** The grand total of every cell, in the corner. */
164
+ kind: 'grand';
165
+ method: HeatmapAggregate;
166
+ };
167
+ /** Returns a total, or undefined to let the kit work it out from the cells. */
168
+ export type HeatmapGetTotal = (scope: HeatmapTotalScope) => HeatmapCellInput | undefined;
169
+ /**
170
+ * Every margin, ready to render. A withheld total is `{ value: null,
171
+ * status: 'low-sample', withheld: true }`: no value and no count, so
172
+ * nothing that reads it (the grid, the table view, a sort by total) can
173
+ * pass one on.
174
+ */
113
175
  export interface HeatmapTotals {
114
176
  /** Per row index (props order), by the row method. */
115
- rows: AggregateResult[];
177
+ rows: ModelCell[];
116
178
  /** Per column index, by the column method. */
117
- columns: AggregateResult[];
179
+ columns: ModelCell[];
118
180
  /** Every cell, by the row method (it sits in the row-totals column). */
119
- grand: AggregateResult;
120
- /** Per group id: one result per column, by the group column method. */
121
- groupColumns: Map<string, AggregateResult[]>;
122
- /** Per group id: every cell in the group, by the row method (it sits in
123
- * the row-totals column). */
124
- groups: Map<string, AggregateResult>;
181
+ grand: ModelCell;
182
+ /** Per group id, whenever rows carry a group: one per column, by the
183
+ * group column method. */
184
+ groupColumns: Map<string, ModelCell[]>;
185
+ /** Per group id, whenever rows carry a group: every cell in the group,
186
+ * by the row method (it sits in the row-totals column). */
187
+ groups: Map<string, ModelCell>;
188
+ }
189
+ /** Which totals the viewer sees: drawn, or, for rows, ordering the rows. */
190
+ export interface ShownTotals {
191
+ rows: boolean;
192
+ columns: boolean;
193
+ grand: boolean;
194
+ groups: boolean;
195
+ groupColumns: boolean;
196
+ }
197
+ export interface TotalsOptions {
198
+ rowMethod: HeatmapAggregate;
199
+ columnMethod: HeatmapAggregate;
200
+ groupColumnMethod: HeatmapAggregate;
201
+ groups?: readonly HeatmapGroup[];
202
+ minCount?: number;
203
+ getTotal?: HeatmapGetTotal;
204
+ /** `rate` values are proportions of their count. Default `number`. */
205
+ valueType?: 'number' | 'rate';
206
+ /** Which totals the viewer sees. Default: every one. */
207
+ shown?: ShownTotals;
125
208
  }
126
209
  /**
127
- * Works out every margin. A total in the row-totals column (a row's, a
128
- * group's, the grand total) uses the row method, so the column means one
129
- * thing; a group's per-column totals use the group column method. Low-sample
130
- * cells count: their data is real, only too thin to show on its own.
210
+ * Works out every margin, then withholds whatever would let someone work
211
+ * out a hidden cell (status `low-sample`), alone or with any combination
212
+ * of the other totals shown, the shown cells and the known bounds. A total
213
+ * in the row-totals column (a row's, a group's, the grand total) uses the
214
+ * row method, so the column means one thing; a group's per-column totals
215
+ * use the group column method. Low-sample cells count: their data is real,
216
+ * only too thin to show on its own. `getTotal` may supply any total
217
+ * instead; the same rule applies.
218
+ *
219
+ * Primary: a total under minCount on its own count, one the kit would work
220
+ * out over a value it never had, and one whose hidden cells hold fewer
221
+ * than minCount records. Secondary: the disclosure audit in
222
+ * heatmap-disclosure.ts, over every total the viewer sees.
131
223
  */
132
- export declare function computeTotals(matrix: readonly ModelCell[][], rows: readonly HeatmapRow[], columnCount: number, rowMethod: HeatmapAggregate, columnMethod: HeatmapAggregate, groupColumnMethod: HeatmapAggregate): HeatmapTotals;
224
+ export declare function computeTotals(matrix: readonly ModelCell[][], rows: readonly HeatmapRow[], columns: readonly HeatmapColumn[], options: TotalsOptions): HeatmapTotals;
133
225
  /** A row the grid body renders. */
134
226
  export type BodyRow = {
135
227
  kind: 'group';
@@ -149,7 +241,7 @@ export declare const dataRowKey: (rowId: string) => string;
149
241
  export declare const groupRowKey: (groupId: string) => string;
150
242
  export declare const FOOTER_ROW_KEY = "f";
151
243
  /** Orders row indexes. Ties keep the props order (a stable sort). */
152
- export declare function sortRowIndexes(indexes: readonly number[], rows: readonly HeatmapRow[], totals: readonly AggregateResult[], sort: HeatmapSortRows, collator: Intl.Collator): number[];
244
+ export declare function sortRowIndexes(indexes: readonly number[], rows: readonly HeatmapRow[], totals: readonly ModelCell[], sort: HeatmapSortRows, collator: Intl.Collator): number[];
153
245
  /** Builds the body: group headers (when grouping) and data rows. */
154
246
  export declare function buildBodyRows(rows: readonly HeatmapRow[], sortedIndexes: readonly number[], groupRows: boolean, collapsed: ReadonlySet<string>): BodyRow[];
155
247
  //# sourceMappingURL=heatmap-model.d.ts.map
@@ -16,11 +16,12 @@ export interface HeatmapTableViewProps {
16
16
  /** Each group's public id, for the table's row ids (never a label). */
17
17
  groupIds: ReadonlyMap<string, string>;
18
18
  describer: HeatmapDescriber;
19
+ /** The grid's totals, withheld ones already reduced to a value-less
20
+ * cell, so the table can show nothing the grid does not. */
19
21
  totals: HeatmapTotals | null;
20
22
  rowTotals: HeatmapAggregate | false;
21
23
  columnTotals: HeatmapAggregate | false;
22
24
  groupColumnMethod: HeatmapAggregate;
23
- minCount?: number;
24
25
  /** The table failed to load or render (announced by the heatmap). */
25
26
  onLoadError?: () => void;
26
27
  }
@@ -31,5 +32,5 @@ export interface HeatmapTableViewProps {
31
32
  * their groups in the grid's order. Labels go through the same privacy
32
33
  * masking as the grid.
33
34
  */
34
- export declare function HeatmapTableView({ title, rowsLabel, rows, columns, matrix, body, grouped, groupIds, describer, totals, rowTotals, columnTotals, groupColumnMethod, minCount, onLoadError, }: HeatmapTableViewProps): import("react/jsx-runtime").JSX.Element;
35
+ export declare function HeatmapTableView({ title, rowsLabel, rows, columns, matrix, body, grouped, groupIds, describer, totals, rowTotals, columnTotals, groupColumnMethod, onLoadError, }: HeatmapTableViewProps): import("react/jsx-runtime").JSX.Element;
35
36
  //# sourceMappingURL=heatmap-table-view.d.ts.map
@@ -1,11 +1,11 @@
1
1
  import { type ReactNode } from 'react';
2
2
  import { type HeatmapPrivacyScope, type HeatmapValueType } from './heatmap-format';
3
3
  import { type HeatmapSelectionMode } from './heatmap-grid';
4
- import { type HeatmapCellInfo, type HeatmapCellInput, type HeatmapCellKey, type HeatmapColumn, type HeatmapGroup, type HeatmapRow, type HeatmapSortRows } from './heatmap-model';
4
+ import { type HeatmapCellInfo, type HeatmapCellInput, type HeatmapCellKey, type HeatmapColumn, type HeatmapGetTotal, type HeatmapGroup, type HeatmapRow, type HeatmapSortRows } from './heatmap-model';
5
5
  import { type HeatmapAggregate, type HeatmapScale } from './heatmap-scale';
6
6
  import { HeatmapTooltip } from './heatmap-tooltip';
7
7
  import { type HeatmapPalette } from './heatmap-variants';
8
- export type { HeatmapCellData, HeatmapCellInfo, HeatmapCellInput, HeatmapCellKey, HeatmapCellStatus, HeatmapColumn, HeatmapGroup, HeatmapRow, HeatmapSortRows, } from './heatmap-model';
8
+ export type { HeatmapCellData, HeatmapCellInfo, HeatmapCellInput, HeatmapCellKey, HeatmapCellStatus, HeatmapColumn, HeatmapGetTotal, HeatmapGroup, HeatmapRow, HeatmapSortRows, HeatmapTotalScope, } from './heatmap-model';
9
9
  export type { HeatmapAggregate, HeatmapScale } from './heatmap-scale';
10
10
  export type { HeatmapPalette } from './heatmap-variants';
11
11
  export type { HeatmapPrivacyScope, HeatmapValueType } from './heatmap-format';
@@ -85,12 +85,32 @@ export interface HeatmapProps {
85
85
  valueType?: HeatmapValueType;
86
86
  /**
87
87
  * Cells with a count below this render as "too few to show", hatched.
88
- * A display rule, not disclosure control: `read_cell`, `onCellClick`,
89
- * `onSelectionChange` and the totals still carry any value you pass. To
90
- * keep a value off the page, send `{ value: null, count }`: it still
88
+ * For a cell it is a display rule, not disclosure control: `read_cell`,
89
+ * `onCellClick` and `onSelectionChange` still carry any value you pass.
90
+ * To keep a value off the page, send `{ value: null, count }`: it still
91
91
  * renders as too few, and nothing can read a value the kit never had.
92
+ * Totals follow small-number disclosure control: any total that, in any
93
+ * combination with the other totals and cells, would pin down a hidden
94
+ * cell, narrow it below the protection level (half its range, for a
95
+ * rate), or determine a set of hidden cells with fewer than minCount
96
+ * records, is withheld too, and carries no value anywhere. Every total
97
+ * the data could show is audited, drawn or not. See `getTotal` and
98
+ * heatmap.mdx.
92
99
  */
93
100
  minCount?: number;
101
+ /**
102
+ * Supplies a total: a row's, a column's, a group's, a group header cell
103
+ * or the grand total, as `scope.kind` says. Return a cell input (`null`
104
+ * for no total), or `undefined` to let the kit work it out from the
105
+ * cells. Needed when you withhold values (`value: null`): the kit cannot
106
+ * add up a value it never had, so it withholds any total it would get
107
+ * wrong. `minCount` and the disclosure audit apply to a supplied total
108
+ * exactly as to a worked-out one, which must be the exact count-weighted
109
+ * mean (or sum) of its cells. Asked for every row, every column and the
110
+ * grand total, and, whenever rows carry a group, every group and group
111
+ * header cell, drawn or not. Keep it stable (`useCallback`).
112
+ */
113
+ getTotal?: HeatmapGetTotal;
94
114
  /** Formats a value. Default: Intl in the active locale. Keep it stable. */
95
115
  valueFormatter?: (value: number) => string;
96
116
  /** Print the value inside each cell. */
@@ -100,18 +120,24 @@ export interface HeatmapProps {
100
120
  /**
101
121
  * A totals column at the row ends. A mean weights by count. Everything in
102
122
  * that column uses this method: each row's total, each group's and the
103
- * grand total in the corner.
123
+ * grand total in the corner. With `minCount`, a mean of plain numbers
124
+ * (`valueType="number"`) is not audited for hidden cells: every such
125
+ * average that holds one is withheld, so use `sum` for plain numbers.
104
126
  */
105
127
  rowTotals?: HeatmapAggregate | false;
106
128
  /**
107
129
  * A totals row under the columns. A mean weights by count. A group
108
130
  * header's per-column totals use this method too (else `rowTotals`).
131
+ * With `minCount`, a mean of plain numbers is withheld wherever it holds
132
+ * a hidden cell, as for `rowTotals`: use `sum` for plain numbers.
109
133
  */
110
134
  columnTotals?: HeatmapAggregate | false;
111
135
  /**
112
136
  * Row order (within each group). Controlled when set. In privacy mode
113
137
  * `label` keeps the given order: sorting by masked names would reveal
114
- * their order.
138
+ * their order. A sort by total reads each row's total by the
139
+ * `rowTotals` method (else the `columnTotals` one, else mean); a row
140
+ * whose total is withheld sorts last.
115
141
  */
116
142
  sortRows?: HeatmapSortRows;
117
143
  /** Initial row order when uncontrolled. Default `none`. */
@@ -1,5 +1,5 @@
1
1
  export { Heatmap } from './heatmap';
2
- export type { HeatmapProps, HeatmapHandle, HeatmapView, HeatmapCellReading, HeatmapCellData, HeatmapCellInfo, HeatmapCellInput, HeatmapCellKey, HeatmapCellStatus, HeatmapColumn, HeatmapGroup, HeatmapRow, HeatmapSortRows, HeatmapAggregate, HeatmapScale, HeatmapPalette, HeatmapValueType, HeatmapSelectionMode, HeatmapPrivacyScope, HeatmapTooltipContext, } from './heatmap';
2
+ export type { HeatmapProps, HeatmapHandle, HeatmapView, HeatmapCellReading, HeatmapCellData, HeatmapCellInfo, HeatmapCellInput, HeatmapCellKey, HeatmapCellStatus, HeatmapColumn, HeatmapGetTotal, HeatmapGroup, HeatmapRow, HeatmapSortRows, HeatmapTotalScope, HeatmapAggregate, HeatmapScale, HeatmapPalette, HeatmapValueType, HeatmapSelectionMode, HeatmapPrivacyScope, HeatmapTooltipContext, } from './heatmap';
3
3
  export { HeatmapLegend } from './heatmap-legend';
4
4
  export type { HeatmapLegendProps } from './heatmap-legend';
5
5
  export { HeatmapTooltip } from './heatmap-tooltip';
@@ -1,4 +1,4 @@
1
- import { H as t, a as p, b as m, h as o } from "../../_chunks/heatmap-BxRHM8Et.js";
1
+ import { H as t, a as p, b as m, h as o } from "../../_chunks/heatmap-C1TeC7wT.js";
2
2
  export {
3
3
  t as Heatmap,
4
4
  p as HeatmapLegend,
@@ -1,4 +1,4 @@
1
- import { N as a } from "../../_chunks/notes-panel-uEGIL7mi.js";
1
+ import { N as a } from "../../_chunks/notes-panel-IdsmqRFC.js";
2
2
  export {
3
3
  a as NotesPanel
4
4
  };
@@ -1,4 +1,4 @@
1
- import { P as e, p as i } from "../../_chunks/patient-details-4P1vA9Ls.js";
1
+ import { P as e, p as i } from "../../_chunks/patient-details-C-EWQTms.js";
2
2
  export {
3
3
  e as PatientDetails,
4
4
  i as patientDetailsAgent
@@ -1,4 +1,4 @@
1
- import { P as t, p as r } from "../../_chunks/patient-search-DOnDUVsl.js";
1
+ import { P as t, p as r } from "../../_chunks/patient-search-DpAKidZ5.js";
2
2
  export {
3
3
  t as PatientSearch,
4
4
  r as patientSearchAgent
@@ -1,4 +1,4 @@
1
- import { P as t, p as m } from "../../_chunks/patient-summary-card-CuDLo8MP.js";
1
+ import { P as t, p as m } from "../../_chunks/patient-summary-card-Bpto_VCD.js";
2
2
  export {
3
3
  t as PatientSummaryCard,
4
4
  m as patientSummaryCardAgent
@@ -1,4 +1,4 @@
1
- import { P as r, f as s, p as m, a as e, s as n, b as o, c as i } from "../../_chunks/payment-form-C3dGY7v4.js";
1
+ import { P as r, f as s, p as m, a as e, s as n, b as o, c as i } from "../../_chunks/payment-form-XKtinW8r.js";
2
2
  export {
3
3
  r as PaymentForm,
4
4
  s as formatPaymentAmount,
@@ -1,4 +1,4 @@
1
- import { P as p, p as a } from "../../_chunks/pdf-viewer-DJ9VN7cu.js";
1
+ import { P as p, p as a } from "../../_chunks/pdf-viewer-BvoVMjH4.js";
2
2
  export {
3
3
  p as PDFViewer,
4
4
  a as pdfViewerAgent
@@ -1,4 +1,4 @@
1
- import { P as t, p as a } from "../../_chunks/practice-results-8h2Utpt3.js";
1
+ import { P as t, p as a } from "../../_chunks/practice-results-BrUDDMXC.js";
2
2
  export {
3
3
  t as PracticeResults,
4
4
  a as practiceResultsAgent
@@ -1,4 +1,4 @@
1
- import { R as i, r as o, w as a } from "../../_chunks/rich-text-editor-M2gT_E7f.js";
1
+ import { R as i, r as o, w as a } from "../../_chunks/rich-text-editor-aCIoptbg.js";
2
2
  import { k as s } from "../../_chunks/kit-extensions-DWs1UEXb.js";
3
3
  export {
4
4
  i as RichTextEditor,
@@ -1,4 +1,4 @@
1
- import { S as o, s } from "../../_chunks/sign-document-CY7xTXbm.js";
1
+ import { S as o, s } from "../../_chunks/sign-document-D1P1nUQA.js";
2
2
  export {
3
3
  o as SignDocument,
4
4
  s as signDocumentAgent
@@ -1,4 +1,4 @@
1
- import { T as o, t as r } from "../../_chunks/task-editor-CifOznfq.js";
1
+ import { T as o, t as r } from "../../_chunks/task-editor-Bb5MMcid.js";
2
2
  export {
3
3
  o as TaskEditor,
4
4
  r as taskEditorAgent
@@ -1,4 +1,4 @@
1
- import { T as e, t } from "../../_chunks/tasks-panel-8nLwBw6P.js";
1
+ import { T as e, t } from "../../_chunks/tasks-panel-BOb57Ysw.js";
2
2
  export {
3
3
  e as TasksPanel,
4
4
  t as tasksPanelAgent
@@ -1,5 +1,6 @@
1
1
  export { VoiceControlPanel } from './voice-control-panel';
2
- export type { VoiceControlPanelProps, VoiceControlPanelHandle, VoiceControlStatus, VoiceControlTone, VoiceControlError, VoiceControlMessage, VoiceControlTranscript, VoiceControlLanguage, VoiceControlCandidate, VoiceControlCommand, VoiceControlToggle, VoiceControlLayout, VoiceControlPosition, } from './voice-control-panel';
2
+ export type { VoiceControlPanelProps, VoiceControlPanelHandle, VoiceControlStatus, VoiceControlTone, VoiceControlError, VoiceControlMessage, VoiceControlTranscript, VoiceControlLanguage, VoiceControlCandidate, VoiceControlCommand, VoiceControlToggle, VoiceControlLayout, VoiceControlPosition, VoiceControlAiCredits, } from './voice-control-panel';
3
3
  export type { AiConsentGate } from '../ai-permission-notice';
4
+ export type { AiCreditsInfo, AiCreditsExpiring, AiCreditsNoticeProps, } from '../ai-credits-notice';
4
5
  export { voiceControlPanelAgent } from './voice-control-panel.agent';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,4 @@
1
- import { V as n, v as a } from "../../_chunks/voice-control-panel-C0BfY23Y.js";
1
+ import { V as n, v as a } from "../../_chunks/voice-control-panel-BJIEbDq6.js";
2
2
  export {
3
3
  n as VoiceControlPanel,
4
4
  a as voiceControlPanelAgent
@@ -1,4 +1,5 @@
1
1
  import { type HTMLAttributes, type ReactNode } from 'react';
2
+ import { type AiCreditsInfo, type AiCreditsNoticeProps } from '../ai-credits-notice';
2
3
  import { type AiConsentBannerHeadingLevel, type AiConsentGate } from '../ai-permission-notice';
3
4
  import { type KbdNamedKey } from '../kbd';
4
5
  /** Where the host's voice session is. */
@@ -45,14 +46,29 @@ export type VoiceControlToggle = 'start' | 'stop';
45
46
  export type VoiceControlLayout = 'inline' | 'floating';
46
47
  /** The viewport corner of the floating pill. Logical: mirrors in RTL. */
47
48
  export type VoiceControlPosition = 'bottom-end' | 'bottom-start';
49
+ /**
50
+ * The practice's AI credits, as the platform keeps them (a yearly allowance
51
+ * that expires, then welcome and bought credits that do not), plus whether
52
+ * they have run out. See `AiCreditsInfo` for the allowance, the dates and
53
+ * the next steps the host can offer.
54
+ */
55
+ export interface VoiceControlAiCredits extends AiCreditsInfo {
56
+ /**
57
+ * Out of AI credits. Every way of starting shows the out-of-credits
58
+ * notice in the panel instead of calling `onToggle`; stopping is never
59
+ * gated. Set while a session runs or is paused, the panel stops it
60
+ * (`onToggle('stop')`, once) and shows the notice on its own.
61
+ */
62
+ exhausted?: boolean;
63
+ }
48
64
  /** Curated imperative handle for agent / external automation. */
49
65
  export interface VoiceControlPanelHandle {
50
66
  getStatus: () => VoiceControlStatus;
51
67
  /** Ask the host to start (`onToggle('start')`) unless already starting
52
68
  * or listening, or disabled. Gated by `aiConsent` like a press. */
53
69
  start: () => void;
54
- /** Ask the host to stop or cancel a start (`onToggle('stop')`); a no-op
55
- * when not starting or listening. Never gated. */
70
+ /** Ask the host to stop, cancel a start or end a paused session
71
+ * (`onToggle('stop')`); a no-op when idle or stopped. Never gated. */
56
72
  stop: () => void;
57
73
  getCandidateIds: () => string[];
58
74
  pickCandidate: (id: string) => void;
@@ -66,6 +82,12 @@ export interface VoiceControlPanelHandle {
66
82
  openPanel: () => void;
67
83
  /** Floating layout: close the panel; listening carries on. A no-op inline. */
68
84
  closePanel: () => void;
85
+ /** Whether `aiCredits.exhausted` is gating every start. */
86
+ isCreditsExhausted: () => boolean;
87
+ /** Whether the out-of-credits notice is showing. */
88
+ isCreditsNoticeOpen: () => boolean;
89
+ /** Close the out-of-credits notice, back to the controls. */
90
+ closeCreditsNotice: () => void;
69
91
  }
70
92
  export interface VoiceControlPanelProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'children' | 'onToggle'> {
71
93
  /** Where the host's voice session is. Drives the button, dot and status. */
@@ -154,8 +176,26 @@ export interface VoiceControlPanelProps extends Omit<HTMLAttributes<HTMLDivEleme
154
176
  * calling `onToggle`; stopping is never gated. Omit for ungated behaviour.
155
177
  */
156
178
  aiConsent?: AiConsentGate;
157
- /** Heading level for the `AiConsentBanner` title. Default: the banner's. */
179
+ /**
180
+ * Heading level for the `AiConsentBanner` title and the out-of-credits
181
+ * notice title, which show in the same place. Default 5.
182
+ */
158
183
  aiConsentHeadingLevel?: AiConsentBannerHeadingLevel;
184
+ /**
185
+ * The practice's AI credits. With `exhausted`, every way of starting (the
186
+ * Start button, the pill's mic, the shortcut, the agent's
187
+ * `start_listening`) shows the out-of-credits notice instead of calling
188
+ * `onToggle`, after the consent check; stopping is never gated. Running
189
+ * low (80% used, or `runningLow`) and `expiring` show as quiet lines in
190
+ * the panel and never block. Omit for ungated behaviour.
191
+ */
192
+ aiCredits?: VoiceControlAiCredits;
193
+ /**
194
+ * Floating only: the `AiCreditsNotice` hover card on the pill's mic, as on
195
+ * the RichTextEditor's AI triggers. It never takes the click: the mic
196
+ * still starts, stops or opens a gate exactly as without it.
197
+ */
198
+ aiCreditsNotice?: AiCreditsNoticeProps;
159
199
  }
160
200
  type ShortcutModifier = Extract<KbdNamedKey, 'Alt' | 'Control' | 'Shift' | 'Meta'>;
161
201
  interface ParsedShortcut {
@@ -1,4 +1,4 @@
1
- import { W as n } from "../../_chunks/warning-stack-HYWAytZV.js";
1
+ import { W as n } from "../../_chunks/warning-stack-BdY-0bd3.js";
2
2
  export {
3
3
  n as WarningStack
4
4
  };
@@ -1,4 +1,4 @@
1
- import { C as r, W as e, a as s, b as d, c as w, i as t, l as f, m as l, r as i, w as k, d as n, e as A, f as C } from "../../_chunks/workflow-map-C2B2qIr1.js";
1
+ import { C as r, W as e, a as s, b as d, c as w, i as t, l as f, m as l, r as i, w as k, d as n, e as A, f as C } from "../../_chunks/workflow-map-CYbRD9ek.js";
2
2
  export {
3
3
  r as CORE_PATIENT_FIELDS,
4
4
  e as WorkflowCard,
@@ -64,19 +64,44 @@ export declare const arUi: {
64
64
  readonly eyebrow: "مساعدة الذكاء الاصطناعي";
65
65
  readonly heading: "مُدرج ضمن خطتك";
66
66
  readonly body: "تُقدَّم ميزات الذكاء الاصطناعي دون أي تكلفة إضافية خلال فترة التجربة هذه.";
67
- readonly allowance: "{{remaining}} من {{limit}} إجراءً بالذكاء الاصطناعي هذا الشهر";
67
+ readonly allowance: "تبقّى {{remaining}} من {{limit}} من أرصدة الذكاء الاصطناعي";
68
68
  readonly resetsOn: "يتجدد في {{date}}";
69
69
  readonly learnMore: "معرفة المزيد";
70
70
  };
71
71
  readonly bundles: {
72
72
  readonly eyebrow: "أرصدة الذكاء الاصطناعي";
73
73
  readonly headingWithAllowance: "{{remaining}} من {{limit}} رصيدًا";
74
- readonly body: "عدد الإجراءات المشمولة شهريًا في الخطة المجانية: {{limit}}. اختر باقة أرصدة لمواصلة استخدام ميزات الذكاء الاصطناعي.";
74
+ readonly body: "حصتك هي {{limit}} من أرصدة الذكاء الاصطناعي. للحصول على المزيد، اختر باقة أرصدة.";
75
75
  readonly bodyGeneric: "اختر باقة أرصدة لمواصلة استخدام ميزات الذكاء الاصطناعي.";
76
76
  readonly viewBundles: "عرض الباقات";
77
77
  readonly seeCosts: "تكلفة كل إجراء";
78
78
  };
79
79
  };
80
+ readonly aiCredits: {
81
+ readonly title: "نفدت أرصدة الذكاء الاصطناعي";
82
+ readonly bodyBuy: "أضف أرصدة للمتابعة اليوم.";
83
+ readonly bodyUpgrade: "فعّل وحدة أرصدة الذكاء الاصطناعي لمواصلة استخدام مساعدة الذكاء الاصطناعي.";
84
+ readonly bodySupport: "تواصل مع الدعم لمواصلة استخدام مساعدة الذكاء الاصطناعي.";
85
+ readonly bodyRenews: "ستتوفر مساعدة الذكاء الاصطناعي مجددًا في {{date}}، عند تجديد حصتك.";
86
+ readonly bodyNone: "مساعدة الذكاء الاصطناعي غير متاحة إلى أن يتوفر لدى عيادتك مزيد من الأرصدة. للمساعدة، اسأل مسؤول العيادة أو تواصل مع دعم Alfadocs.";
87
+ readonly renewsOn: "تتجدد حصتك في {{date}}.";
88
+ readonly meterLabel: "أرصدة الذكاء الاصطناعي";
89
+ readonly remaining: "تبقّى {{remaining}} من {{limit}}";
90
+ readonly buy: "اشترِ أرصدة الذكاء الاصطناعي";
91
+ readonly upgrade: "فعّل وحدة أرصدة الذكاء الاصطناعي";
92
+ readonly contactSupport: "تواصل مع الدعم";
93
+ readonly seeCosts: "اطّلع على تكلفة كل إجراء";
94
+ readonly back: "رجوع";
95
+ readonly runningLow: "أرصدة الذكاء الاصطناعي توشك على النفاد: تبقّى {{remaining}} من {{limit}}.";
96
+ readonly runningLowCount: "أرصدة الذكاء الاصطناعي توشك على النفاد: تبقّى {{remaining}}.";
97
+ readonly runningLowPlain: "أرصدة الذكاء الاصطناعي توشك على النفاد.";
98
+ readonly expiring_zero: "تنتهي صلاحية {{amount}} من أرصدة الذكاء الاصطناعي في {{date}}.";
99
+ readonly expiring_one: "تنتهي صلاحية {{amount}} من أرصدة الذكاء الاصطناعي في {{date}}.";
100
+ readonly expiring_two: "تنتهي صلاحية {{amount}} من أرصدة الذكاء الاصطناعي في {{date}}.";
101
+ readonly expiring_few: "تنتهي صلاحية {{amount}} أرصدة ذكاء اصطناعي في {{date}}.";
102
+ readonly expiring_many: "تنتهي صلاحية {{amount}} رصيدًا من أرصدة الذكاء الاصطناعي في {{date}}.";
103
+ readonly expiring_other: "تنتهي صلاحية {{amount}} من أرصدة الذكاء الاصطناعي في {{date}}.";
104
+ };
80
105
  readonly opticalPrescription: {
81
106
  readonly ariaLabel: "وصفة النظارات";
82
107
  readonly metaLabel: "تفاصيل الوصفة";
@@ -1553,6 +1578,7 @@ export declare const arUi: {
1553
1578
  readonly allCells: "كل الخلايا";
1554
1579
  readonly noData: "لا توجد بيانات";
1555
1580
  readonly lowSample: "بيانات غير كافية";
1581
+ readonly totalWithheld: "مخفي لحماية الأعداد الصغيرة";
1556
1582
  readonly countOf: "{{part}} من {{total}}";
1557
1583
  readonly records_zero: "عدد السجلات: {{formatted}}";
1558
1584
  readonly records_one: "عدد السجلات: {{formatted}}";
@@ -1581,6 +1607,7 @@ export declare const arUi: {
1581
1607
  readonly noData: "لا توجد بيانات";
1582
1608
  readonly lowSample: "بيانات غير كافية";
1583
1609
  readonly lowSampleUnder: "بيانات غير كافية (أقل من {{value}})";
1610
+ readonly totalWithheld: "الإجماليات مخفية لحماية الأعداد الصغيرة";
1584
1611
  readonly descriptionBands_zero: "مقياس الألوان مقسّم إلى فئات عددها {{formatted}}، وحدود التقسيم عند {{edges}}.";
1585
1612
  readonly descriptionBands_one: "مقياس الألوان مقسّم إلى فئات عددها {{formatted}}، وحدود التقسيم عند {{edges}}.";
1586
1613
  readonly descriptionBands_two: "مقياس الألوان مقسّم إلى فئات عددها {{formatted}}، وحدود التقسيم عند {{edges}}.";
@@ -3714,16 +3741,6 @@ export declare const arUi: {
3714
3741
  readonly undo: "تراجع";
3715
3742
  };
3716
3743
  readonly credits: {
3717
- readonly title: "نفدت أرصدة الذكاء الاصطناعي";
3718
- readonly body: "أضف أرصدة للمتابعة اليوم.";
3719
- readonly bodyResets: "يعود رصيدك المجاني في {{date}}. أضف أرصدة للمتابعة اليوم.";
3720
- readonly bodyWait: "تتوفر مساعدة الذكاء الاصطناعي من جديد عند تجديد رصيدك الشهري.";
3721
- readonly bodyWaitResets: "تتوفر مساعدة الذكاء الاصطناعي من جديد في {{date}}، عند تجديد رصيدك الشهري.";
3722
- readonly meterLabel: "أرصدة الذكاء الاصطناعي هذا الشهر";
3723
- readonly remaining: "تبقّى {{remaining}} من {{limit}}";
3724
- readonly cta: "اشترِ أرصدة الذكاء الاصطناعي";
3725
- readonly secondary: "اطّلع على تكلفة كل إجراء";
3726
- readonly back: "رجوع";
3727
3744
  readonly kept: "ملاحظتك وتعليماتك محفوظة.";
3728
3745
  };
3729
3746
  readonly manager: {
@@ -55,19 +55,44 @@ const e = {
55
55
  eyebrow: "مساعدة الذكاء الاصطناعي",
56
56
  heading: "مُدرج ضمن خطتك",
57
57
  body: "تُقدَّم ميزات الذكاء الاصطناعي دون أي تكلفة إضافية خلال فترة التجربة هذه.",
58
- allowance: "{{remaining}} من {{limit}} إجراءً بالذكاء الاصطناعي هذا الشهر",
58
+ allowance: "تبقّى {{remaining}} من {{limit}} من أرصدة الذكاء الاصطناعي",
59
59
  resetsOn: "يتجدد في {{date}}",
60
60
  learnMore: "معرفة المزيد"
61
61
  },
62
62
  bundles: {
63
63
  eyebrow: "أرصدة الذكاء الاصطناعي",
64
64
  headingWithAllowance: "{{remaining}} من {{limit}} رصيدًا",
65
- body: "عدد الإجراءات المشمولة شهريًا في الخطة المجانية: {{limit}}. اختر باقة أرصدة لمواصلة استخدام ميزات الذكاء الاصطناعي.",
65
+ body: "حصتك هي {{limit}} من أرصدة الذكاء الاصطناعي. للحصول على المزيد، اختر باقة أرصدة.",
66
66
  bodyGeneric: "اختر باقة أرصدة لمواصلة استخدام ميزات الذكاء الاصطناعي.",
67
67
  viewBundles: "عرض الباقات",
68
68
  seeCosts: "تكلفة كل إجراء"
69
69
  }
70
70
  },
71
+ aiCredits: {
72
+ title: "نفدت أرصدة الذكاء الاصطناعي",
73
+ bodyBuy: "أضف أرصدة للمتابعة اليوم.",
74
+ bodyUpgrade: "فعّل وحدة أرصدة الذكاء الاصطناعي لمواصلة استخدام مساعدة الذكاء الاصطناعي.",
75
+ bodySupport: "تواصل مع الدعم لمواصلة استخدام مساعدة الذكاء الاصطناعي.",
76
+ bodyRenews: "ستتوفر مساعدة الذكاء الاصطناعي مجددًا في {{date}}، عند تجديد حصتك.",
77
+ bodyNone: "مساعدة الذكاء الاصطناعي غير متاحة إلى أن يتوفر لدى عيادتك مزيد من الأرصدة. للمساعدة، اسأل مسؤول العيادة أو تواصل مع دعم Alfadocs.",
78
+ renewsOn: "تتجدد حصتك في {{date}}.",
79
+ meterLabel: "أرصدة الذكاء الاصطناعي",
80
+ remaining: "تبقّى {{remaining}} من {{limit}}",
81
+ buy: "اشترِ أرصدة الذكاء الاصطناعي",
82
+ upgrade: "فعّل وحدة أرصدة الذكاء الاصطناعي",
83
+ contactSupport: "تواصل مع الدعم",
84
+ seeCosts: "اطّلع على تكلفة كل إجراء",
85
+ back: "رجوع",
86
+ runningLow: "أرصدة الذكاء الاصطناعي توشك على النفاد: تبقّى {{remaining}} من {{limit}}.",
87
+ runningLowCount: "أرصدة الذكاء الاصطناعي توشك على النفاد: تبقّى {{remaining}}.",
88
+ runningLowPlain: "أرصدة الذكاء الاصطناعي توشك على النفاد.",
89
+ expiring_zero: "تنتهي صلاحية {{amount}} من أرصدة الذكاء الاصطناعي في {{date}}.",
90
+ expiring_one: "تنتهي صلاحية {{amount}} من أرصدة الذكاء الاصطناعي في {{date}}.",
91
+ expiring_two: "تنتهي صلاحية {{amount}} من أرصدة الذكاء الاصطناعي في {{date}}.",
92
+ expiring_few: "تنتهي صلاحية {{amount}} أرصدة ذكاء اصطناعي في {{date}}.",
93
+ expiring_many: "تنتهي صلاحية {{amount}} رصيدًا من أرصدة الذكاء الاصطناعي في {{date}}.",
94
+ expiring_other: "تنتهي صلاحية {{amount}} من أرصدة الذكاء الاصطناعي في {{date}}."
95
+ },
71
96
  opticalPrescription: {
72
97
  ariaLabel: "وصفة النظارات",
73
98
  metaLabel: "تفاصيل الوصفة",
@@ -1548,6 +1573,7 @@ const e = {
1548
1573
  allCells: "كل الخلايا",
1549
1574
  noData: "لا توجد بيانات",
1550
1575
  lowSample: "بيانات غير كافية",
1576
+ totalWithheld: "مخفي لحماية الأعداد الصغيرة",
1551
1577
  countOf: "{{part}} من {{total}}",
1552
1578
  records_zero: "عدد السجلات: {{formatted}}",
1553
1579
  records_one: "عدد السجلات: {{formatted}}",
@@ -1576,6 +1602,7 @@ const e = {
1576
1602
  noData: "لا توجد بيانات",
1577
1603
  lowSample: "بيانات غير كافية",
1578
1604
  lowSampleUnder: "بيانات غير كافية (أقل من {{value}})",
1605
+ totalWithheld: "الإجماليات مخفية لحماية الأعداد الصغيرة",
1579
1606
  descriptionBands_zero: "مقياس الألوان مقسّم إلى فئات عددها {{formatted}}، وحدود التقسيم عند {{edges}}.",
1580
1607
  descriptionBands_one: "مقياس الألوان مقسّم إلى فئات عددها {{formatted}}، وحدود التقسيم عند {{edges}}.",
1581
1608
  descriptionBands_two: "مقياس الألوان مقسّم إلى فئات عددها {{formatted}}، وحدود التقسيم عند {{edges}}.",
@@ -3681,16 +3708,6 @@ const e = {
3681
3708
  undo: "تراجع"
3682
3709
  },
3683
3710
  credits: {
3684
- title: "نفدت أرصدة الذكاء الاصطناعي",
3685
- body: "أضف أرصدة للمتابعة اليوم.",
3686
- bodyResets: "يعود رصيدك المجاني في {{date}}. أضف أرصدة للمتابعة اليوم.",
3687
- bodyWait: "تتوفر مساعدة الذكاء الاصطناعي من جديد عند تجديد رصيدك الشهري.",
3688
- bodyWaitResets: "تتوفر مساعدة الذكاء الاصطناعي من جديد في {{date}}، عند تجديد رصيدك الشهري.",
3689
- meterLabel: "أرصدة الذكاء الاصطناعي هذا الشهر",
3690
- remaining: "تبقّى {{remaining}} من {{limit}}",
3691
- cta: "اشترِ أرصدة الذكاء الاصطناعي",
3692
- secondary: "اطّلع على تكلفة كل إجراء",
3693
- back: "رجوع",
3694
3711
  kept: "ملاحظتك وتعليماتك محفوظة."
3695
3712
  },
3696
3713
  manager: {