@alfadocs/ui-kit 1.30.0 → 1.32.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 (233) hide show
  1. package/dist/_chunks/{address-fields-CZ0pEdEI.js → address-fields-jFfjxOQR.js} +3 -3
  2. package/dist/_chunks/{agenda-card-pdN49pMu.js → agenda-card-DVz3jwTf.js} +2 -2
  3. package/dist/_chunks/{agenda-tray-BweO8pDo.js → agenda-tray-1oDWCJdB.js} +2 -2
  4. package/dist/_chunks/{ai-prompt-input-CrHr-5H8.js → ai-prompt-input-Dt7tpCBh.js} +2 -2
  5. package/dist/_chunks/{alia-sidebar-BWcWZivN.js → alia-sidebar-D18kp3p9.js} +3 -3
  6. package/dist/_chunks/{anamnesis-summary-rows-DMO3MWSt.js → anamnesis-summary-rows-BYgyp_i2.js} +6 -6
  7. package/dist/_chunks/{appointment-card-Dzr3GeVz.js → appointment-card-D-oj_ugh.js} +9 -7
  8. package/dist/_chunks/{appointment-timeline-DhHwmHo1.js → appointment-timeline-CymGHyIP.js} +2 -2
  9. package/dist/_chunks/{appointment-tray-4FUu_5NX.js → appointment-tray-DCk8gHod.js} +2 -2
  10. package/dist/_chunks/{audio-recorder-DXG6LTtO.js → audio-recorder-11wClczr.js} +2 -2
  11. package/dist/_chunks/{avatar-BNQNhoyL.js → avatar-CkDeQOSI.js} +37 -37
  12. package/dist/_chunks/{balance-badge-cell-CX6b0ML4.js → balance-badge-cell-DhBtFRoW.js} +4 -4
  13. package/dist/_chunks/{bishop-score-CJUVBfAu.js → bishop-score-CAl7C5hm.js} +2 -2
  14. package/dist/_chunks/{bmi-calculator-CcH6upht.js → bmi-calculator-Dwkih9a4.js} +3 -3
  15. package/dist/_chunks/{booking-AabCk7CI.js → booking-l6UGNiE1.js} +3 -3
  16. package/dist/_chunks/{calculator-dialog-12d3Sxaz.js → calculator-dialog-C0ixc3SU.js} +2 -2
  17. package/dist/_chunks/{calendar-CI9MINcR.js → calendar-Dgvl5L4T.js} +494 -438
  18. package/dist/_chunks/{calendar-event-card-66CEEWU6.js → calendar-event-card-DSh-69HT.js} +130 -122
  19. package/dist/_chunks/calendar-workspace-BX-zDyVR.js +9392 -0
  20. package/dist/_chunks/{care-plan-card-CQVboTn1.js → care-plan-card-CZW476Kg.js} +2 -2
  21. package/dist/_chunks/{care-plan-entry-card-jxHkzez5.js → care-plan-entry-card-BMUYagEw.js} +2 -2
  22. package/dist/_chunks/{chat-message-DBQu10rs.js → chat-message-C-8UU2av.js} +2 -2
  23. package/dist/_chunks/{clinical-note-card-BBgFd2nB.js → clinical-note-card-D2WTV2CO.js} +185 -188
  24. package/dist/_chunks/{color-picker-CU303VjY.js → color-picker-Bl5f0iK1.js} +28 -25
  25. package/dist/_chunks/{combobox-D7_NLE2Z.js → combobox-DnSdYssy.js} +216 -215
  26. package/dist/_chunks/{country-select-DzbPFktV.js → country-select-CfDNFG5c.js} +2 -2
  27. package/dist/_chunks/{data-table-DB5BiVQ0.js → data-table-DC96JJIq.js} +2 -2
  28. package/dist/_chunks/{dependent-selector-cJlJFAKD.js → dependent-selector-yTKKsuc9.js} +2 -2
  29. package/dist/_chunks/{dialog-UbKJCi1X.js → dialog-BJiLqhx6.js} +54 -46
  30. package/dist/_chunks/{document-preview-CDb-n_W7.js → document-preview-BrhMHNh8.js} +2 -2
  31. package/dist/_chunks/{due-date-calculator-BtgWeFqp.js → due-date-calculator-CxgK8vzt.js} +3 -3
  32. package/dist/_chunks/{entity-summary-B_vO5Ur4.js → entity-summary-5o768XLU.js} +2 -2
  33. package/dist/_chunks/{face-scheme-DA2vjqaM.js → face-scheme-l-CQyLs-.js} +2 -2
  34. package/dist/_chunks/{file-manager-Cd8V9IcZ.js → file-manager-CI2Qn8qW.js} +3 -3
  35. package/dist/_chunks/{gestational-age-calculator-KdMg9z9H.js → gestational-age-calculator-CZHVrERT.js} +4 -4
  36. package/dist/_chunks/{link-cell-renderer-tWEOv3Sc.js → link-cell-renderer-BEpMNtAa.js} +3 -3
  37. package/dist/_chunks/{marketplace-app-shell-C4AjQmvz.js → marketplace-app-shell-CK_ND8Tr.js} +2 -2
  38. package/dist/_chunks/{message-card-D8GB4FdF.js → message-card-BUMv16un.js} +2 -2
  39. package/dist/_chunks/{message-tray-CGIRQjx5.js → message-tray-0zsv27xX.js} +2 -2
  40. package/dist/_chunks/{muscle-scheme-BSJsI4-I.js → muscle-scheme-UVz_x4iE.js} +2 -2
  41. package/dist/_chunks/notes-panel-C4G-mhZ9.js +380 -0
  42. package/dist/_chunks/{operator-hero-BnFv-Uef.js → operator-hero-D7-iiFQ9.js} +2 -2
  43. package/dist/_chunks/{optical-prescription-BvwuqTpl.js → optical-prescription-DUJOhKz_.js} +2 -2
  44. package/dist/_chunks/{patient-details-DYAmq76G.js → patient-details-BGiawUHd.js} +5 -5
  45. package/dist/_chunks/{patient-summary-card-C9WBwct-.js → patient-summary-card--CT_gbaQ.js} +2 -2
  46. package/dist/_chunks/{periodontal-diagnosis-HrFsVi-C.js → periodontal-diagnosis-lEwA8wqX.js} +3 -3
  47. package/dist/_chunks/{practice-profile-hero-YQ7h2K4o.js → practice-profile-hero-DQyDvpJL.js} +2 -2
  48. package/dist/_chunks/{practice-results-CxIsU2YO.js → practice-results-DjEzPgAK.js} +2 -2
  49. package/dist/_chunks/{pregnancy-dating-m-c05DOI.js → pregnancy-dating-n5j5dAKy.js} +4 -4
  50. package/dist/_chunks/{pregnancy-weight-gain-CJwbs9W-.js → pregnancy-weight-gain-D5A8vPjj.js} +3 -3
  51. package/dist/_chunks/{province-select-BBc7s7vR.js → province-select-BaUnkg4S.js} +2 -2
  52. package/dist/_chunks/qr-code-DOJs4suh.js +750 -0
  53. package/dist/_chunks/radio-DNRe6H_8.js +193 -0
  54. package/dist/_chunks/radio-group-DyVBgnA3.js +297 -0
  55. package/dist/_chunks/{radiograph-panel.agent-ByM9M3qm.js → radiograph-panel.agent-o4jwEJPC.js} +2 -2
  56. package/dist/_chunks/{rich-text-editor-lSCiE0Zz.js → rich-text-editor-CQ7yZdG3.js} +3 -3
  57. package/dist/_chunks/select-CLSUnKjF.js +520 -0
  58. package/dist/_chunks/signature-request-vihDT8On.js +2232 -0
  59. package/dist/_chunks/{tabs-DqKtTIjZ.js → tabs-BnRaLT0y.js} +2 -2
  60. package/dist/_chunks/{tasks-panel-DPCNaRko.js → tasks-panel-DQuaVvl5.js} +2 -2
  61. package/dist/_chunks/{timeline-r-8IUoBS.js → timeline-Bs9Erxlo.js} +38 -36
  62. package/dist/_chunks/{tooth-scheme-C9jssOmy.js → tooth-scheme-Qe7LO5Di.js} +2 -2
  63. package/dist/_chunks/{unit-converter-C6jMjqL9.js → unit-converter-BTgU50gk.js} +2 -2
  64. package/dist/_chunks/{widget-picker-em4xGgv0.js → widget-picker-DvUkBemi.js} +2 -2
  65. package/dist/agent-catalog.json +366 -29
  66. package/dist/agent-i18n/en.json +27 -15
  67. package/dist/components/_shared/get-error-message.d.ts +3 -0
  68. package/dist/components/address-fields/index.js +1 -1
  69. package/dist/components/agenda-card/index.js +1 -1
  70. package/dist/components/agenda-tray/index.js +1 -1
  71. package/dist/components/ai-prompt-input/index.js +1 -1
  72. package/dist/components/appointment-card/index.js +2 -2
  73. package/dist/components/appointment-timeline/index.js +1 -1
  74. package/dist/components/audio-recorder/index.js +1 -1
  75. package/dist/components/avatar/avatar.d.ts +2 -0
  76. package/dist/components/avatar/index.js +1 -1
  77. package/dist/components/bishop-score/index.js +1 -1
  78. package/dist/components/bmi-calculator/index.js +1 -1
  79. package/dist/components/booking/index.js +1 -1
  80. package/dist/components/calculator-dialog/index.js +1 -1
  81. package/dist/components/calendar/calendar.d.ts +26 -2
  82. package/dist/components/calendar/index.js +1 -1
  83. package/dist/components/calendar-event-card/calendar-event-card.d.ts +9 -0
  84. package/dist/components/calendar-event-card/index.js +1 -1
  85. package/dist/components/care-plan-card/index.js +1 -1
  86. package/dist/components/care-plan-entry-card/index.js +1 -1
  87. package/dist/components/chat-message/index.js +1 -1
  88. package/dist/components/clinical-note-card/clinical-note-card.d.ts +16 -1
  89. package/dist/components/clinical-note-card/index.js +1 -1
  90. package/dist/components/color-picker/index.js +1 -1
  91. package/dist/components/combobox/combobox.d.ts +5 -0
  92. package/dist/components/combobox/index.js +1 -1
  93. package/dist/components/country-select/index.js +1 -1
  94. package/dist/components/data-table/index.js +2 -2
  95. package/dist/components/dependent-selector/index.js +1 -1
  96. package/dist/components/dialog/dialog.d.ts +9 -0
  97. package/dist/components/dialog/index.js +1 -1
  98. package/dist/components/document-preview/index.js +1 -1
  99. package/dist/components/due-date-calculator/index.js +1 -1
  100. package/dist/components/entity-summary/index.js +1 -1
  101. package/dist/components/face-scheme/index.js +1 -1
  102. package/dist/components/file-manager/index.js +1 -1
  103. package/dist/components/gestational-age-calculator/index.js +1 -1
  104. package/dist/components/message-card/index.js +1 -1
  105. package/dist/components/message-tray/index.js +1 -1
  106. package/dist/components/muscle-scheme/index.js +1 -1
  107. package/dist/components/notes-panel/index.d.ts +1 -1
  108. package/dist/components/notes-panel/index.js +1 -1
  109. package/dist/components/notes-panel/notes-panel.d.ts +24 -5
  110. package/dist/components/operator-hero/index.js +1 -1
  111. package/dist/components/optical-prescription/index.js +1 -1
  112. package/dist/components/patient-details/index.js +1 -1
  113. package/dist/components/patient-summary-card/index.js +1 -1
  114. package/dist/components/patient-table/index.js +1 -1
  115. package/dist/components/periodontal-diagnosis/index.js +1 -1
  116. package/dist/components/practice-profile-hero/index.js +1 -1
  117. package/dist/components/practice-results/index.js +1 -1
  118. package/dist/components/pregnancy-dating/index.js +1 -1
  119. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  120. package/dist/components/province-select/index.js +1 -1
  121. package/dist/components/qr-code/index.js +1 -1
  122. package/dist/components/qr-code/qr-encode.d.ts +14 -16
  123. package/dist/components/radio/index.js +1 -1
  124. package/dist/components/radio-group/index.js +2 -2
  125. package/dist/components/radio-group/radio-group-context.d.ts +4 -1
  126. package/dist/components/radio-group/radio-group.d.ts +13 -1
  127. package/dist/components/radio-group/radio.d.ts +24 -1
  128. package/dist/components/radiograph-panel/index.js +1 -1
  129. package/dist/components/rich-text-editor/index.js +1 -1
  130. package/dist/components/select/index.js +1 -1
  131. package/dist/components/select/select.d.ts +33 -0
  132. package/dist/components/skeleton-scheme/index.js +1 -1
  133. package/dist/components/tabs/index.js +1 -1
  134. package/dist/components/tasks-panel/index.js +1 -1
  135. package/dist/components/timeline/index.js +1 -1
  136. package/dist/components/timeline/timeline.d.ts +2 -0
  137. package/dist/components/tooth-scheme/index.js +1 -1
  138. package/dist/components/unit-converter/index.js +1 -1
  139. package/dist/components/widget-picker/index.js +1 -1
  140. package/dist/host-compat.css +7 -1
  141. package/dist/i18n/locales/ar.d.ts +118 -0
  142. package/dist/i18n/locales/ar.js +123 -5
  143. package/dist/i18n/locales/de.d.ts +128 -10
  144. package/dist/i18n/locales/de.js +135 -15
  145. package/dist/i18n/locales/el.d.ts +118 -0
  146. package/dist/i18n/locales/el.js +123 -5
  147. package/dist/i18n/locales/en.d.ts +118 -0
  148. package/dist/i18n/locales/en.js +123 -5
  149. package/dist/i18n/locales/es.d.ts +118 -0
  150. package/dist/i18n/locales/es.js +123 -5
  151. package/dist/i18n/locales/fr.d.ts +118 -0
  152. package/dist/i18n/locales/fr.js +122 -4
  153. package/dist/i18n/locales/hi.d.ts +118 -0
  154. package/dist/i18n/locales/hi.js +123 -5
  155. package/dist/i18n/locales/it.d.ts +128 -10
  156. package/dist/i18n/locales/it.js +133 -15
  157. package/dist/i18n/locales/ja.d.ts +118 -0
  158. package/dist/i18n/locales/ja.js +123 -5
  159. package/dist/i18n/locales/nl.d.ts +118 -0
  160. package/dist/i18n/locales/nl.js +123 -5
  161. package/dist/i18n/locales/pl.d.ts +118 -0
  162. package/dist/i18n/locales/pl.js +123 -5
  163. package/dist/i18n/locales/pt.d.ts +118 -0
  164. package/dist/i18n/locales/pt.js +123 -5
  165. package/dist/i18n/locales/ro.d.ts +118 -0
  166. package/dist/i18n/locales/ro.js +122 -4
  167. package/dist/i18n/locales/ru.d.ts +118 -0
  168. package/dist/i18n/locales/ru.js +123 -5
  169. package/dist/i18n/locales/sq.d.ts +118 -0
  170. package/dist/i18n/locales/sq.js +123 -5
  171. package/dist/i18n/locales/sv.d.ts +118 -0
  172. package/dist/i18n/locales/sv.js +123 -5
  173. package/dist/i18n/locales/tr.d.ts +118 -0
  174. package/dist/i18n/locales/tr.js +123 -5
  175. package/dist/i18n/locales/zh.d.ts +118 -0
  176. package/dist/i18n/locales/zh.js +123 -5
  177. package/dist/index.js +131 -130
  178. package/dist/locales/ar.json +123 -5
  179. package/dist/locales/de.json +133 -15
  180. package/dist/locales/el.json +123 -5
  181. package/dist/locales/en.json +123 -5
  182. package/dist/locales/es.json +123 -5
  183. package/dist/locales/fr.json +122 -4
  184. package/dist/locales/hi.json +123 -5
  185. package/dist/locales/it.json +133 -15
  186. package/dist/locales/ja.json +123 -5
  187. package/dist/locales/nl.json +123 -5
  188. package/dist/locales/pl.json +123 -5
  189. package/dist/locales/pt.json +123 -5
  190. package/dist/locales/ro.json +122 -4
  191. package/dist/locales/ru.json +123 -5
  192. package/dist/locales/sq.json +123 -5
  193. package/dist/locales/sv.json +123 -5
  194. package/dist/locales/tr.json +123 -5
  195. package/dist/locales/zh.json +123 -5
  196. package/dist/patterns/alia-assistant/index.js +1 -1
  197. package/dist/patterns/anamnesis/index.js +1 -1
  198. package/dist/patterns/calendar/calendar-appointment-details.d.ts +145 -0
  199. package/dist/patterns/calendar/calendar-appointment-details.sections.d.ts +32 -0
  200. package/dist/patterns/calendar/calendar-editor-hydration.d.ts +59 -0
  201. package/dist/patterns/calendar/calendar-notes-tool.d.ts +14 -0
  202. package/dist/patterns/calendar/calendar-patient-picker.d.ts +11 -0
  203. package/dist/patterns/calendar/calendar-series-scope-chooser.d.ts +18 -0
  204. package/dist/patterns/calendar/calendar-workspace.d.ts +26 -1
  205. package/dist/patterns/calendar/calendar-workspace.model.d.ts +8 -5
  206. package/dist/patterns/calendar/calendar.data.d.ts +66 -1
  207. package/dist/patterns/calendar/calendar.host.d.ts +2 -0
  208. package/dist/patterns/calendar/calendar.journey.d.ts +42 -7
  209. package/dist/patterns/calendar/calendar.model.d.ts +54 -5
  210. package/dist/patterns/calendar/calendar.sheets.d.ts +68 -15
  211. package/dist/patterns/calendar/calendar.surface.d.ts +12 -2
  212. package/dist/patterns/calendar/calendar.types.d.ts +29 -1
  213. package/dist/patterns/calendar/index.d.ts +9 -6
  214. package/dist/patterns/calendar/index.js +15 -14
  215. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  216. package/dist/patterns/signature-request/channel-meta.d.ts +27 -0
  217. package/dist/patterns/signature-request/index.d.ts +1 -1
  218. package/dist/patterns/signature-request/index.js +1 -1
  219. package/dist/patterns/signature-request/load-status.d.ts +13 -0
  220. package/dist/patterns/signature-request/person-grid.d.ts +32 -0
  221. package/dist/patterns/signature-request/required-documents.d.ts +127 -0
  222. package/dist/patterns/signature-request/signature-history.d.ts +57 -0
  223. package/dist/patterns/signature-request/signature-outcome.d.ts +29 -0
  224. package/dist/patterns/signature-request/signature-request.d.ts +390 -26
  225. package/dist/tokens.css +10 -2
  226. package/package.json +3 -1
  227. package/dist/_chunks/calendar-workspace-a84AHQwj.js +0 -7506
  228. package/dist/_chunks/notes-panel-CTNpsByN.js +0 -353
  229. package/dist/_chunks/qr-code-CPkEs5mG.js +0 -574
  230. package/dist/_chunks/radio-TWf9Q-mp.js +0 -108
  231. package/dist/_chunks/radio-group-rXDJADzW.js +0 -175
  232. package/dist/_chunks/select-Bi8zril7.js +0 -471
  233. package/dist/_chunks/signature-request-C-IsbkPf.js +0 -417
@@ -170,24 +170,26 @@
170
170
  "filterColumns": "Narrow the grid to particular chairs or operators from the two filter popovers, with the platform's semantics: nothing ticked shows everyone and ticking narrows. Operators list under their groups with a tri-state row per group; \"Only available operators\" is on by default in the operator views, and a session-local \"Show disabled operators\" switch reveals the operators the practice has disabled. A count badge rides each filter button while it narrows, and the \"Reset filters\" chip beside them clears both selections and restores both switches without ever changing the view. Selection only — no appointment is touched.",
171
171
  "maskPatientNames": "Turn privacy mode on or off from the toolbar. While on, patient names are masked on the cards, in the hover peek, in the Appointments panel and on the printed call sheet, so the page can stay open beside a waiting patient. It is a display mask, not a permission: it is not persisted and it changes no record.",
172
172
  "configureDisplay": "Set the per-user display knobs in the cog popover — layout, zebra rows, show times, slot precision, the day window, the care-description mode, what the cards are coloured by, the default duration of a new appointment (5–240 minutes), whether operators read as an initials disc or a dot plus full name, whether chairs read as a full name or a short code, and whether the details panel offers the map link. The choices are remembered per user through the host's preferences adapter under `calendarWorkspace.*` keys, so they persist beyond the page load; they change presentation only and touch no patient record.",
173
- "dockTool": "Open one of the rail's tools — Appointments, the appointment editor / details panel, the waiting list, the online bookings or the free-slot finder — or read which one is docked. A host declares which of the five it can back with real data, so read the strip rather than assuming all five: a tool the host withheld is absent, and anything routed at it docks Appointments instead. Closing returns to the Appointments panel rather than collapsing the rail, so no path leaves an empty dock. Docking moves no focus; a polite live region announces the panel that arrived.",
173
+ "dockTool": "Open a workspace rail tool: Appointments, appointment editor / details, waiting list, patient notes, online bookings or free-slot finder. Read the actual strip: hosts may withhold tools, and patient-notes is registered only with patient context. Notes uses the host's note permissions, independently of appointment-edit rights. Clearing its patient context returns to the previous available tool and focuses its rail button. Opening notes from a panel may address a note id and moves focus into Notes. Closing other tools returns to Appointments.",
174
174
  "reviewUpcoming": "Read the rail's resting panel: the practice's upcoming appointments — now to the end of the seventh day, cancelled excluded, earliest first — each row led by the patient. The preset row, the jump-to-date picker and the edge loaders widen the derived window up to ±180 days. Activating a row selects that appointment on the grid, which docks its details. Read-only; the rows carry ids and lifecycle state, never patient identity.",
175
+ "readAppointmentDetails": "Read one appointment in the docked details panel. With the host's details read, any card click, including a patient-less block and a chip whose names are still loading, focuses the appointment and docks a read-only panel: appointment, booking, money, contact, treatments, signing and series sections, the patient's latest three notes and a History sub-view. See more or a note opens the separate Notes rail tool when the host offers it. While the read is loading, failed or refused the panel shows that status instead. Edit, withheld from a read-only viewer, opens the editor. Without the host's read a pending chip stays inert and the editor form is the details. Reads patient-identifiable data.",
175
176
  "createAppointment": "Book a new appointment in the editor panel, docked from the New appointment button, from a click on an empty slot (prefilled with the slot, the clicked column and the cog's default duration) or from an online booking being processed. Set the patient, the linked care or care-plan lines, the date, start time and duration, the operator, chair, branch and colour, the description (255 characters at most — a longer one blocks the save), and, once a patient is chosen, the SMS and e-mail reminders, the first-visit question and — where the patient has unsigned required documents — how they are asked to sign. Busy chair, busy operator and operator-away warnings are advisory and do not hold the save; only a practice closure does. Enter submits from any text field. Writes patient-identifiable data.",
176
- "editAppointment": "Amend an existing appointment. Clicking its card docks the SAME panel in details mode — the identity strip, the prefilled form, the read-only extras and the History sub-view — so there is one editing paradigm and no separate Edit jump. Change any field and save; for a member of a repeating series the save asks how far it reaches. On save the rail returns to the Appointments panel and a toast names the day, carrying a \"Go to\" action when that day is off screen, on a hidden weekend or filtered out. Writes patient-identifiable data.",
177
+ "editAppointment": "Amend an existing appointment in the docked editor. With the host's details read the editor opens from Edit on the details panel and Cancel or Save returns there; without it the details panel is the form. A remote host first loads canonical data; loading, failure and whole-appointment refusal expose no editable form. When that data carries a series, the editor first asks the scope: this occurrence, this and following, or the whole series. Honour the returned patient, care, description and recurrence capabilities. A refused recurring scope cannot be treated as an ordinary edit. Save waits for host acceptance before closing or announcing success; rejection preserves the entered draft for correction or retry. Writes patient-identifiable data.",
177
178
  "changeAppointmentStatus": "Set an appointment's attendance status from the Status select in the details panel. The status is patient-identifiable attendance data.",
178
- "moveAppointment": "Reschedule an appointment either by dragging its card to a new slot or by arming \"Move…\" in the details panel and then clicking the target slot — the panel stays docked and a banner tinted with the appointment's own colour names what is being placed. Either route ends in the confirmation dialog, which offers the SMS and e-mail notify channels (kept even when the appointment recurs, where the platform drops them) and, for a series member, the recurring scope. Cancelling reverts the card and commits nothing. Writes patient-identifiable data.",
179
+ "moveAppointment": "Reschedule an appointment either by dragging its card to a new slot or by arming \"Move…\" in the details panel and then clicking the target slot — the panel stays docked and a banner tinted with the appointment's own colour names what is being placed. Either route ends in the confirmation dialog, which offers the SMS and e-mail notify channels and, for a series member, the recurring scope. A host recurring parent always confirms, asks the scope and hides the notify channels, as the platform does. Cancelling reverts the card and commits nothing. Writes patient-identifiable data.",
179
180
  "resizeAppointment": "Change an appointment's duration by dragging its card edge. Unlike a move this SAVES AT ONCE with no confirmation, exactly as the platform does; the toast that follows carries an Undo that restores the previous duration and logs both changes on the appointment's history. Writes patient-identifiable data.",
180
181
  "copyAppointment": "Duplicate an appointment onto another slot: arm \"Copy…\" in the details panel, then click the target. The copy lands immediately with no confirmation, and its toast carries an Undo. A plan-linked appointment first asks whether to copy the appointment only or the appointment and its treatments. Writes patient-identifiable data.",
181
182
  "deleteAppointment": "Remove an appointment from the details panel behind an alert dialog. The dialog asks for the recurring scope when the appointment belongs to a series, and for the care-plan cleanup when it is the parent of a price-list recurrence — so confirming can drop far more than the one card. Irreversible from this surface.",
182
- "managePatientNotes": "Read and write the patient's notes from the Notes sub-view beside History: add a note through the composer, pin one, edit one in a dialog or delete one behind an alert dialog. Every write goes to the host, which stamps the note's id, time and author — the kit attributes nothing to a clinical note. With no host seam, or without the edit permission, the sub-view is a read-only timeline. The rows carry ids and pin / flag / clinical markers only; the body and the author are never exposed as state. Writes patient-identifiable clinical data.",
183
+ "managePatientNotes": "Read and write the patient's notes from the conditional Notes rail tool: add a note through the composer, pin one, edit one in a dialog or delete one behind an alert dialog. Every write goes to the host, which stamps the note's id, time and author. The kit attributes nothing to a clinical note. An HTML note edits in a rich text editor and saves as HTML; a clinical or deleted note offers no edit. With no host seam, or when the host's seam is not writable, the tool is a read-only timeline. Explicit note permissions take precedence over appointment-edit permission. Details and the editor have no Notes sub-view. The rows carry ids and pin / flag / clinical markers only; the body and author are never exposed as state. Writes patient-identifiable clinical data.",
183
184
  "readModificationHistory": "Open the History sub-view of the details panel and read the appointment's modification ledger, newest first — what changed, from what to what, and when. No mutation.",
184
185
  "requestSignature": "Ask the patient to sign the appointment's documents from the details panel, by SMS or e-mail through the kit menu. The chip beside it reports the channel a request has already gone out on. There is no \"On this device…\" item: on-device signing is the host's own e-signature surface and no seam here mounts it, so the menu offers only the two channels it can honour. Sends a patient-identifiable request.",
186
+ "createDocument": "Open the appointment details create menu through data-action=\"open-create-document\" and select an offered data-action=\"create-document-<kind>\" item: bill, folder, template, empty, identification or webcam. The host supplies permitted kinds and owns navigation, confirmation and persistence. Appointment read-only mode does not withhold document rights. A selection starts the host workflow; it does not prove that a document or bill was created. May write patient-identifiable data.",
185
187
  "messagePatientWhatsapp": "Reach the patient over WhatsApp from a waiting-list row. The affordance is a `wa.me` deep link the row opens in a new tab — it is disabled, and names its reason in its accessible name, when the entry carries no WhatsApp-capable number. There is no equivalent in the details panel: the send-reminder group is handed an empty channel list, because the host's legacy Snippets island is the only composing surface and no seam here mounts it. Hands a patient's contact detail to an outbound channel.",
186
188
  "filterWaitingList": "Narrow the waiting queue: the four quick views (all, patients without an appointment, appointment scheduled over 30 days ago, on the list over 30 days) and, behind \"Show advanced filters\", the platform's nine optional client-side inputs — patient, patient assigned, operator, appointment scheduled, appointment scheduled from / to, on the waiting list from / to and description — applied only when \"Filter list\" is pressed. The toggle carries a count badge while any input is set, and changing the quick view drops the form. Selection only.",
187
189
  "manageWaitingListEntry": "Add, amend or remove a waiting-list entry. The four-field form opens as a rail SUB-VIEW — from the toolbar split button's plus segment, from Add entry, or from a row's pencil — with a back arrow to the queue. Editing is refused on a row already linked to an appointment, because those fields belong to the appointment; the pencil stays focusable and names that reason. Remove deletes at once with no confirmation, platform parity, and its toast carries an Undo that puts the entry back. Writes patient-identifiable data.",
188
190
  "scheduleWaitingPatient": "Give a waiting patient a slot. \"Schedule\" on an unlinked row hands off to the free-slot finder seeded from the entry — operator, chair, duration, patient, care and colour already filled in — and booking a slot opens the editor carrying the entry, so saving books the appointment and takes the entry off the list. A row already linked to an appointment reads \"Reschedule\" and seeds the same finder, but booking there MOVES the existing appointment rather than creating a second one. Writes patient-identifiable data.",
189
- "findFreeSlot": "Search the practice for bookable time in the finder panel. Operator and chair scope are grouped checklists behind a popover per axis — a select-all row first, operators sectioned under their groups, nothing ticked searching every eligible resource — beside the care, the duration, the date range and, for a care that needs one, a medical-device select. The results list groups the slots under a day heading; a click steers the grid to that day and docks the editor prefilled with the date, time, duration, chair, operator and any seeded patient or care. The 185-day range warning is advisory (the search still runs), \"Show more slots\" pushes the To date out by 30 days and re-searches, and an alert names which business hours are missing when the practice or its operators hold none (it links to the scheduler only where the host supplies that navigation, which this workspace does not). Read-only until a slot is booked.",
190
- "triageOnlineBooking": "Work the online-bookings panel — the platform's bookings page hosted in the rail, badged with the bookings of the last thirty days still missing a patient or an operator. A row can be shown on the grid, which selects it and docks its details, or completed, which docks the editor prefilled with what the person typed on the booking site so the missing patient or operator can be filled in and saved. Completing writes patient-identifiable data.",
191
+ "findFreeSlot": "Search the practice for bookable time in the finder panel. Operator and chair scope are grouped checklists behind a popover per axis — a select-all row first, operators sectioned under their groups, nothing ticked searching every eligible resource — beside the care, the duration, the date range and, for a care that needs one, a medical-device select. The results list groups the slots under a day heading; when the viewer may write appointments, a click steers the grid to that day and docks the editor prefilled with the date, time, duration, chair, operator and any seeded patient or care; read-only viewers see the list and projection only, under a lock note, with no Book. The 185-day range warning is advisory (the search still runs), \"Show more slots\" pushes the To date out by 30 days and re-searches, and an alert names which business hours are missing when the practice or its operators hold none (it links to the scheduler only where the host supplies that navigation, which this workspace does not). Projected bands open a modal list of original options by click, Enter or Space; only an explicit Book action uses the finder booking path. Read-only viewers can scroll those options without Book. Dismissal restores focus to the band.",
192
+ "triageOnlineBooking": "Review the online-bookings queue independently of the visible dates. The host owns membership and loading/error state. Show a row on the grid; completion is available only when the host enables it and the user can edit. Review-only rows remain in the queue on selection and cannot be dragged, resized or edited. Unknown last-seen data never marks a booking New. Completing writes patient-identifiable data.",
191
193
  "printDaySheet": "Print the front-desk call sheet. The toolbar's printer icon opens a dialog asking which day — one day, never the visible range — and Print renders that day's appointments through the browser, scoped by the filters in force and masked when privacy mode is on. Nothing is sent to a server, but the sheet itself is a patient-identifiable document."
192
194
  }
193
195
  },
@@ -800,7 +802,7 @@
800
802
  },
801
803
  "actions": {
802
804
  "addNote": "Compose and commit a new note. A clinical note requires the clinical-note permission (read canAddClinical first).",
803
- "togglePin": "Toggle the pinned state of the note with the given id.",
805
+ "togglePin": "Toggle the pinned state of the note with the given id. Refused for a deleted note or one whose actions.pin is false.",
804
806
  "toggleFlag": "Toggle the flagged state of the note with the given id."
805
807
  }
806
808
  },
@@ -1158,7 +1160,7 @@
1158
1160
  "value": "Currently selected radio value, or empty string when none."
1159
1161
  },
1160
1162
  "actions": {
1161
- "setValue": "Select the radio with the given value."
1163
+ "setValue": "Select the radio with the given value. A value that matches no enabled radio is ignored."
1162
1164
  }
1163
1165
  },
1164
1166
  "radiographPanel": {
@@ -1241,7 +1243,7 @@
1241
1243
  "isOpen": "Whether the option list is open."
1242
1244
  },
1243
1245
  "actions": {
1244
- "setValue": "Select the option with the given value.",
1246
+ "setValue": "Select the option with the given value. A value that is not among the options, or belongs to a disabled option, is ignored and the selection stays as it was.",
1245
1247
  "clear": "Clear the current selection.",
1246
1248
  "open": "Open the option list.",
1247
1249
  "close": "Close the option list."
@@ -1790,7 +1792,8 @@
1790
1792
  "uploadDocument": "Upload one or more files into the open folder of the patient's document tree. Writes a patient-identifiable document.",
1791
1793
  "organiseDocuments": "Reorganise the document tree: create a folder, rename an item, or move the selected items into another folder. Only one of these action dialogs can be in flight at a time — read the active action before starting another. Reversible through the same toolbar.",
1792
1794
  "deleteDocuments": "Delete the selected files or folders from the patient's document tree. Deleting a folder takes everything nested beneath it. Not reversible from this surface — read the selection first and confirm.",
1793
- "requestDocumentSignature": "Send the selected document out for the patient's signature. The banner's unsigned-documents count is the same signal, so read it to see what is already pending before requesting another. Puts a patient-identifiable document into an outbound signing envelope.",
1795
+ "requestDocumentSignature": "Send one document out for the patient's signature. A pending document's Request signature row action opens the signature request modal with that document's signed versions table above the request form; for Via QR, the QR step follows in the same dialog (the full contract is signature-request.agent.ts). The banner's unsigned-documents count is the same signal, so read it to see what is already pending before requesting another. Puts a patient-identifiable document into an outbound signing envelope.",
1796
+ "requestRequiredSignatures": "Ask the patient to sign every outstanding item in one request. The banner's Documents to sign button (a user-driven button with no adapter action) opens the signature request modal in required documents mode: the unsigned documents and anamnesis interviews, each with its own operator picker, one signer roster for the batch, and a link sent outcome after submit. A signer the host marks as under 18 shows a warning that never blocks the request. Read the banner's counts first to know what will be listed.",
1794
1797
  "shareDocuments": "Share the selected documents with the patient. The shared files then appear as a document-share bubble in the Communications thread. Sends patient-identifiable documents out of the practice.",
1795
1798
  "readMessageThread": "Read the per-patient message thread in the Communications tab — App, SMS, Email and inbound WhatsApp messages in one chronological log, with SMS delivery status and campaign / workflow / document-share provenance on each bubble — and scroll back to the latest message. Read-only.",
1796
1799
  "composeMessage": "Draft a message to the patient: pick the outbound channel (App, SMS or Email — WhatsApp is inbound-only and never offered) and type the body. On SMS the composer counts GSM/Unicode segments including the appended practice sender name, so read the draft back before sending a long one. Nothing leaves the practice until the draft is submitted.",
@@ -1909,11 +1912,20 @@
1909
1912
  },
1910
1913
  "signatureRequest": {
1911
1914
  "workflows": {
1912
- "assignOperator": "Pick the operator who must counter-sign (or \"Assign later\" to leave the request unassigned). \"Assign to me\" claims it for the signed-in operator.",
1913
- "manageSignerRoster": "Build the patient-side signer roster: pick who signs in each row (the patient or their configured signee, e.g. a legal guardian), add a second signer up to the cap, or remove a row. People already on the roster are excluded from the other rows.",
1914
- "chooseDeliveryChannel": "Choose how each signer's request is delivered via the per-row channel checkboxes (mutually exclusive — checking one channel unchecks the others): SMS, e-mail, WhatsApp, or signing on this device. On-device signers sign sequentially in roster order. The assigned operator has the same mutually exclusive checkboxes with SMS, e-mail, or on this device — the operator's own system-defined channel arrives pre-checked, and the on-device option is enabled only while a patient signer also signs on this device (an info tip explains the greyed-out state; an automatic fallback to the operator's default is announced via a live region when the last on-device patient row leaves).",
1915
- "waiveOtp": "Toggle a signer's on-device OTP waiver. Waiving OTP lowers the evidentiary value of that signature; the pattern surfaces a warning alert while waived.",
1916
- "requestSignature": "Send the signature request. Notifies every roster signer over their selected channel and hands the submission to the host.",
1915
+ "reviewSignatures": "When the host passes `signatures` (or `signaturesLoading`), the request form shows the document's past signature requests at its top, on the same screen as the operator and signers, as on platform: a table named Signed versions (section data-section=\"signed-versions\") with the columns Date, Signature type and Actions and one row per request (data-signature-id), newest first. Date is the weekday, date and time in the active locale; Signature type is the legal level (Simple or Advanced, hidden with showLegalLevel=false), the channel (SMS, e-mail, WhatsApp, on this device or Via QR) and a SignatureStatusChip whose tooltip names who signed, who is still awaited and who signed on a party's behalf. Loading shows skeleton rows; no records shows one line saying there are no signed versions. Hosts that pass neither prop get the plain form.",
1916
+ "viewSignature": "Open one signed document from its row's View button; the host receives onViewSignature(id). The button shows only when the host passes that callback.",
1917
+ "downloadSignature": "Download one signed document from its row; the host receives onDownloadSignature(id, 'full' | 'anonymised'). When the record has an anonymised version the Download button opens a menu with Full version and Anonymised version (menu id signature-download-<record id>); otherwise it asks for 'full' directly. The button shows only when the host passes that callback.",
1918
+ "shareSignature": "Share one signed document from its row's Share menu (menu id signature-share-<record id>): link, e-mail or WhatsApp, in that order. The host receives onShareSignature(id, 'link' | 'email' | 'whatsapp') and does the sharing. The host decides which targets a row offers: the record's shareTargets, else the modal's signatureShareTargets, else all three. The button shows only when the host passes that callback and the row has at least one target.",
1919
+ "deleteSignature": "Delete one signed document from its row's Delete button. It opens a confirmation, an alert dialog (dialog id signature-delete-<record id>) asking whether to delete this signed document, with the row's date under the question and Cancel and Delete. Only Delete calls onDeleteSignature(id); the host deletes and drops the record. Cancel, Esc or dialog.close / dialog.dismiss close it without deleting, and focus returns to the row's Delete button. Once the host drops the record, focus moves to the next row's first action (else the previous row's, else the line saying there are no signed versions) and a polite status says the signature was deleted. The button shows only when the host passes that callback.",
1920
+ "assignOperator": "Pick the operator who must counter-sign (or \"Assign later\" to leave the request unassigned). The operators are listed in host order, then \"Assign later\". An operator the host marks disabled shows greyed out with the host's reason under the name (the trigger is described by every greyed-out operator and reason) and cannot be picked; set_value refuses them. An operator the host marks deleted is listed only while they are the current value, and is never seeded. \"Assign to me\" claims it for the signed-in operator.",
1921
+ "manageSignerRoster": "Build the patient-side signer roster: pick who signs in each row (the patient or their configured signee, e.g. a legal guardian), add a second signer up to the cap, or remove a row. People already on the roster are excluded from the other rows; set_value with one of them, or anyone not offered in that row, leaves the row unchanged. In required documents mode the roster signs the whole batch: the main signer (row data-signer-role=\"main\"), then at most one second signee (data-signer-role=\"second\", a group named Second signee). The second signee is offered only when every listed item is a document that can carry a second signature (anamnesis interviews never can), the main signer's channel is on this device (the batch channel with channelMode batch, else the main signer's own row), and the main signer is a registered signee, not the patient (isPatient); otherwise Add signer is disabled and a visible line says why. The patient is never offered as the second signee. Changing the main signer removes the second signee, announced via a live region. Moving the main signer's channel off this device only hides them (they are not submitted) and announces why; back on this device they return. Per signer, the second signee has their own channel beside their name. A second signee who is the main signer again, is no longer on offer, or cannot receive their own channel (the batch channel in batch mode) shows a message under their row (data-note=\"second-signee-issue\") and keeps Request signature disabled. When the host marks a person as under 18 (isMinor), their row shows a warning note (data-note=\"minor-signer\") to check whether a second signee is needed; it never blocks the request, and the kit does not compute age. In required documents mode, while the patient has no registered signee (no signer option without isPatient) and the host passes onAddSignee, a link-style Add signatory button under the Patient signers heading calls it; it is user-driven with no adapter action, and the host adds the new person to signerOptions.",
1922
+ "chooseDeliveryChannel": "Choose how each signer's request is delivered in the channel dropdown beside their name, a select named Signature channel (one choice): SMS, e-mail, WhatsApp, signing on this device, or via QR (the signer scans a QR code the dialog shows in its QR step after the request; offered to every patient-side signer by default). Each signer row (data-signer-id) holds its dropdown, with the id signature-request-signer-channel-<row number>; the operator dropdown's id is signature-request-operator-channel. Each option carries data-option-id with the channel; set_value with a channel the dropdown does not offer or has disabled leaves the choice unchanged. A signer's available channels can hide any of these, Via QR included. A signer's unavailableChannels instead show a channel greyed out with the host's reason under it (e.g. SMS and WhatsApp with No mobile number): set_value refuses it, the row never falls back to it, and a signer with no channel left shows the reasons under the row and keeps Request signature disabled. On-device signers sign sequentially in roster order. The assigned operator has the same dropdown, named Operator signature channel, with SMS, e-mail, or on this device and never Via QR: the operator's own system-defined channel (defaultChannel, from their settings) arrives preselected and follows a newly picked operator, while a channel changed by hand is kept until the operator changes; the on-device option is enabled only while a patient signer also signs on this device (while disabled, its reason shows under the option and describes the trigger; an automatic fallback to the operator's default is announced via a live region when the last on-device patient row leaves). A host can replace that rule with resolveChannels: it receives the choices after every channel change (and on open) and returns the channels to use and to offer, e.g. the operator and the patient on this device together; set_value may then move another person's channel too (the operator or another signer), announced via the same live region. Channels are per signer by default, in the request form and in required documents mode. With channelMode batch there is no channel beside each name: one labelled Signature channel select (id signature-request-batch-channel) under the signers heading sets the channel for the whole roster, with SMS, e-mail, WhatsApp and Via QR offered when the main signer or the patient (isPatient) can receive them, greyed out only when neither can, and on this device always offered. It starts on e-mail, or SMS when the main signer is the patient and can receive it, unless the host passes initialBatchChannel; in required documents mode changing the main signer returns it to that default (initialBatchChannel is read only on open), announced via the live region. resolveChannels receives the batch channel as every signer's channel and moves the batch through the main signer's returned channel. In required documents mode with showOperatorChannels, each item with an assigned operator also has that operator's channel select (SMS, e-mail or on this device), named Operator signature channel for <item name> with the id signature-request-item-operator-channel-<item id>; it starts on the operator's defaultChannel and follows a newly picked operator (Assign to me included), keeping a channel changed by hand until then. Items on Assign later have none.",
1923
+ "waiveOtp": "Toggle a signer's on-device OTP waiver. Waiving OTP lowers the evidentiary value of that signature; the pattern surfaces a warning alert while waived. With channelMode batch there is one switch for the whole roster (Do not require OTP from the patient), shown only while the batch channel is on this device: it starts on when the patient cannot receive SMS, whoever the main signer is, and is on and disabled when the main signer is the patient and cannot receive SMS. The choice resets when the batch channel changes. Its warning (batchOtpWarning) is one batch-level alert outside every signer row; as on platform it shows while the waiver is on, and on every channel while it is forced. Per signer in required documents mode, the main signer's own switch follows the same rules (starts on, or on and disabled, described by the warning) and resets when that row's channel changes; other rows are the user's choice.",
1924
+ "requestSignature": "Send the signature request. Notifies every roster signer over their selected channel and hands the submission to the host. When any signer chose Via QR the dialog stays open and moves to its QR step. With channelMode batch the submission carries signMode (the batch channel, also on every signer). In required documents mode it also carries operatorAssignments (item id to operator id, null for assign later), requiredItemIds and, with showOperatorChannels, operatorChannels (item id to the operator's channel, for assigned items), with operatorChannel null; the main signer OTP waiver is skipOtp on the main signer, set only on this device.",
1925
+ "showQrCode": "After a request with a signer on the Via QR channel, the same dialog shows its QR step: a loading state until the host passes the server-issued links, then one code per QR signer with the signer name and expiry (the code or its error carries data-signer-id). With several QR signers, the user moves between codes with Previous and Next (\"1 of 2\"); Done on the last code tells the host the codes were handed over (onQrDone) and closes the dialog. Previous, Next and Done are user-driven buttons with no adapter action. Closing through dialog.close, or dismissing the waiting state with dialog.dismiss, does not fire onQrDone. A QR signer with no link shows an error in place of the code. The operator is never offered Via QR.",
1926
+ "reviewRequiredItems": "When the host passes `requiredItems` (or `requiredItemsLoading`), the form asks one patient to sign every outstanding item in one batch: documents to sign and anamnesis interviews to complete, as two lists named with their counts. Each row (data-required-item-id) shows the item name only, with no signing status: the documents API of the host says only whether an item is signed. Items marked signed are left out; when none is left the dialog shows the all signed outcome. Loading shows skeleton rows. The single operator row and the signed versions table do not appear in this mode.",
1927
+ "assignItemOperators": "In required documents mode, pick the operator for each item that needs an operator signature (requiresOperator), or \"Assign later\", listed first. Each picker is named \"Operator for <item name>\" and has the id signature-request-item-operator-<item id>. Greyed-out and deleted operators follow the same rules as the single operator picker: a disabled operator shows its reason and set_value refuses them, a deleted one shows only in a picker still assigned to them. \"Assign to me\" (shown when the host passes currentOperatorId) sets every picker to the signed-in operator; it is a user-driven button with no adapter action. An info note shows while any picker is on Assign later, and another says each operator receives the request by e-mail or SMS per their own settings, unless the host passes showOperatorChannels: then each assigned item shows its operator's channel instead (see choose_delivery_channel).",
1928
+ "showOutcome": "When the host passes `outcome`, the dialog replaces every other view with a final screen whose heading and description carry the message, and focus moves to the heading: 'linkSent' (the secure link went out; in required documents mode the heading says the documents were sent to the patient), 'allSigned' (nothing left to sign) or 'creditsExhausted' (no electronic signature documents left). Close ends it; on 'creditsExhausted' a Buy more documents button calls onBuyMoreSignatures when the host passes it, and a Cancel button, when the host passes onOutcomeCancel, returns the dialog to the form and calls it so the host clears outcome (both user-driven, no adapter action).",
1917
1929
  "dismiss": "Close the modal without sending a signature request. Discards the in-progress operator, roster, channel, and OTP choices."
1918
1930
  }
1919
1931
  },
@@ -0,0 +1,3 @@
1
+ /** Read host error messages without relying on the host's JavaScript realm. */
2
+ export declare function getErrorMessage(error: unknown, fallback: string): string;
3
+ //# sourceMappingURL=get-error-message.d.ts.map
@@ -1,4 +1,4 @@
1
- import { A as e, a } from "../../_chunks/address-fields-CZ0pEdEI.js";
1
+ import { A as e, a } from "../../_chunks/address-fields-jFfjxOQR.js";
2
2
  export {
3
3
  e as AddressFields,
4
4
  a as addressFieldsAgent
@@ -1,4 +1,4 @@
1
- import { A as e } from "../../_chunks/agenda-card-pdN49pMu.js";
1
+ import { A as e } from "../../_chunks/agenda-card-DVz3jwTf.js";
2
2
  import { a as d } from "../../_chunks/agenda-card.agent-Cb5tuEh3.js";
3
3
  import { i as g } from "../../_chunks/is-safe-url-DkETxeHz.js";
4
4
  export {
@@ -1,4 +1,4 @@
1
- import { A as r, a as g } from "../../_chunks/agenda-tray-BweO8pDo.js";
1
+ import { A as r, a as g } from "../../_chunks/agenda-tray-1oDWCJdB.js";
2
2
  export {
3
3
  r as AgendaTray,
4
4
  g as agendaTrayAgent
@@ -1,4 +1,4 @@
1
- import { A as a, a as o } from "../../_chunks/ai-prompt-input-CrHr-5H8.js";
1
+ import { A as a, a as o } from "../../_chunks/ai-prompt-input-Dt7tpCBh.js";
2
2
  export {
3
3
  a as AIPromptInput,
4
4
  o as aiPromptInputAgent
@@ -1,5 +1,5 @@
1
- import { A as p } from "../../_chunks/appointment-card-Dzr3GeVz.js";
2
- import { A as e, a as o, b as r } from "../../_chunks/appointment-tray-4FUu_5NX.js";
1
+ import { A as p } from "../../_chunks/appointment-card-D-oj_ugh.js";
2
+ import { A as e, a as o, b as r } from "../../_chunks/appointment-tray-DCk8gHod.js";
3
3
  import { i } from "../../_chunks/is-safe-url-DkETxeHz.js";
4
4
  export {
5
5
  p as AppointmentCard,
@@ -1,4 +1,4 @@
1
- import { A as i, a as t } from "../../_chunks/appointment-timeline-DhHwmHo1.js";
1
+ import { A as i, a as t } from "../../_chunks/appointment-timeline-CymGHyIP.js";
2
2
  export {
3
3
  i as AppointmentTimeline,
4
4
  t as appointmentTimelineAgent
@@ -1,4 +1,4 @@
1
- import { A as r, a } from "../../_chunks/audio-recorder-DXG6LTtO.js";
1
+ import { A as r, a } from "../../_chunks/audio-recorder-11wClczr.js";
2
2
  export {
3
3
  r as AudioRecorder,
4
4
  a as audioRecorderAgent
@@ -6,6 +6,8 @@ export declare function nameToColorClass(name: string): string;
6
6
  * Extracts 1–2 uppercase initials:
7
7
  * - Single-word name: first two characters ("John" → "JO")
8
8
  * - Multi-word name: first char of first word + first char of last word ("John Doe" → "JD")
9
+ * - Parenthesised or bracketed parts and words with no letter are skipped
10
+ * ("Lucy Danvers (daughter)" → "LD"), unless nothing else is left.
9
11
  */
10
12
  export declare function getInitials(name: string): string;
11
13
  declare const avatarVariants: (props?: ({
@@ -1,4 +1,4 @@
1
- import { A as o, g as r, n as t } from "../../_chunks/avatar-BNQNhoyL.js";
1
+ import { A as o, g as r, n as t } from "../../_chunks/avatar-CkDeQOSI.js";
2
2
  export {
3
3
  o as Avatar,
4
4
  r as getInitials,
@@ -1,4 +1,4 @@
1
- import { B as O, a as S, b as o, c as B, d as P, e } from "../../_chunks/bishop-score-CJUVBfAu.js";
1
+ import { B as O, a as S, b as o, c as B, d as P, e } from "../../_chunks/bishop-score-CAl7C5hm.js";
2
2
  export {
3
3
  O as BISHOP_COMPONENTS,
4
4
  S as BISHOP_MAX_SCORE,
@@ -1,4 +1,4 @@
1
- import { B as m } from "../../_chunks/bmi-calculator-CcH6upht.js";
1
+ import { B as m } from "../../_chunks/bmi-calculator-Dwkih9a4.js";
2
2
  import { b as e, a as t, c as r, d as T, e as c, f as i, i as b, k as n, l as f } from "../../_chunks/bmi-BxD-tFzU.js";
3
3
  export {
4
4
  m as BmiCalculator,
@@ -1,4 +1,4 @@
1
- import { B as A, C as R, O as a, b as s } from "../../_chunks/booking-AabCk7CI.js";
1
+ import { B as A, C as R, O as a, b as s } from "../../_chunks/booking-l6UGNiE1.js";
2
2
  export {
3
3
  A as Booking,
4
4
  R as CONFIRMATION_CHANNEL_ORDER,
@@ -1,4 +1,4 @@
1
- import { C as l } from "../../_chunks/calculator-dialog-12d3Sxaz.js";
1
+ import { C as l } from "../../_chunks/calculator-dialog-C0ixc3SU.js";
2
2
  export {
3
3
  l as CalculatorDialog
4
4
  };
@@ -60,7 +60,7 @@ export interface CalendarEvent {
60
60
  * own: use `isRecurring` for the grid indicator.
61
61
  */
62
62
  isRecurrenceParent?: boolean;
63
- /** Rendered as a background event; not clickable. */
63
+ /** Background event; interactive only with onBackgroundEventClick. */
64
64
  isInternal?: boolean;
65
65
  /**
66
66
  * Renders the card as a TASK rather than an appointment — calendar-scheduled
@@ -79,13 +79,24 @@ export interface CalendarEvent {
79
79
  * filling.
80
80
  */
81
81
  isDraft?: boolean;
82
+ /**
83
+ * A REAL booked appointment whose details the host is still fetching —
84
+ * an occupancy-first host draws the block from the slot it occupies
85
+ * (colour, time, chair) and fills the name in afterwards. Renders the
86
+ * card's details-pending treatment (`data-kind="pending-details"`). A
87
+ * click is delivered and the host decides what it opens; the hover
88
+ * callback and drag stay refused, so a block nobody can name yet is never
89
+ * previewed or moved. Distinct from the pattern's `isPendingBooking` (an
90
+ * online booking still missing a patient or an operator).
91
+ */
92
+ detailsPending?: boolean;
82
93
  /**
83
94
  * Per-event master switch for drag AND resize. Overrides the
84
95
  * calendar-level `editable` for this event only (true enables even when
85
96
  * the calendar is not editable; false disables both gestures).
86
97
  * Leave undefined to inherit the calendar-level setting.
87
98
  * Precedence: per-event `startEditable` > per-event `editable` >
88
- * calendar-level `editable`. Background events (`isInternal: true`)
99
+ * calendar-level `editable`. Background and details-pending events
89
100
  * are never draggable regardless.
90
101
  */
91
102
  editable?: boolean;
@@ -297,6 +308,9 @@ export interface CalendarProps {
297
308
  * caveat. Existing one-argument handlers keep working unchanged.
298
309
  */
299
310
  onEventClick?: (event: CalendarEvent, meta?: CalendarEventClickMeta) => void;
311
+ /** Opt in to keyboard-accessible titled background buttons. The anchor
312
+ * follows CalendarEventClickMeta's lifetime rules; no booking is implied. */
313
+ onBackgroundEventClick?: (event: CalendarEvent, meta: CalendarEventClickMeta) => void;
300
314
  /**
301
315
  * Fires when the pointer enters an event's rendered surface — the anchor
302
316
  * seam for hover "peek" cards. Skipped for background events
@@ -409,6 +423,16 @@ export interface CalendarProps {
409
423
  * Omitted / empty array shows all seven days.
410
424
  */
411
425
  hiddenDays?: number[];
426
+ /**
427
+ * Local ISO `YYYY-MM-DD` dates whose rows the host has NOT finished
428
+ * loading: every cell of such a day wears the loading wash and carries
429
+ * `aria-busy`, and its date header gains a visually-hidden "still
430
+ * loading" word, so a half-drawn day is never read as an empty one. A
431
+ * date left out of the list is one the host says is fully loaded; an
432
+ * omitted prop says every rendered day is. The workspace pattern
433
+ * derives it from `CalendarData.dayLoadState`.
434
+ */
435
+ loadingDates?: readonly string[];
412
436
  /** Lower bound of the time axis (e.g. '07:00'). */
413
437
  slotMinTime?: string;
414
438
  /** Upper bound of the time axis (e.g. '23:00'). */
@@ -1,4 +1,4 @@
1
- import { C as r, c as l, r as n } from "../../_chunks/calendar-CI9MINcR.js";
1
+ import { C as r, c as l, r as n } from "../../_chunks/calendar-Dgvl5L4T.js";
2
2
  export {
3
3
  r as Calendar,
4
4
  l as calendarAgent,
@@ -107,6 +107,15 @@ export interface CalendarEventCardProps extends Omit<HTMLAttributes<HTMLDivEleme
107
107
  * of each paint custom property exists per render.
108
108
  */
109
109
  isDraft?: boolean;
110
+ /**
111
+ * Details-pending treatment — a REAL booked appointment an
112
+ * occupancy-first host drew from the slot it occupies while it still
113
+ * fetches whose it is. The card keeps its colour and size and renders an
114
+ * `aria-hidden` skeleton bar where the title goes, with the localised
115
+ * "loading details" word in the accessible name and
116
+ * `data-kind="pending-details"` as the hook. Wins over `isDraft`/`isTask`.
117
+ */
118
+ detailsPending?: boolean;
110
119
  /**
111
120
  * Colour scheme for the picker colour. `'solid'` (default) is the
112
121
  * platform model — the hex paints the whole surface, ink auto-derived.
@@ -1,4 +1,4 @@
1
- import { C as e } from "../../_chunks/calendar-event-card-66CEEWU6.js";
1
+ import { C as e } from "../../_chunks/calendar-event-card-DSh-69HT.js";
2
2
  export {
3
3
  e as CalendarEventCard
4
4
  };
@@ -1,4 +1,4 @@
1
- import { C as e, c as C } from "../../_chunks/care-plan-card-CQVboTn1.js";
1
+ import { C as e, c as C } from "../../_chunks/care-plan-card-CZW476Kg.js";
2
2
  export {
3
3
  e as CarePlanCard,
4
4
  C as carePlanCardAgent
@@ -1,4 +1,4 @@
1
- import { C as n, c as e } from "../../_chunks/care-plan-entry-card-jxHkzez5.js";
1
+ import { C as n, c as e } from "../../_chunks/care-plan-entry-card-BMUYagEw.js";
2
2
  export {
3
3
  n as CarePlanEntryCard,
4
4
  e as carePlanEntryCardAgent
@@ -1,4 +1,4 @@
1
- import { C as s } from "../../_chunks/chat-message-DBQu10rs.js";
1
+ import { C as s } from "../../_chunks/chat-message-C-8UU2av.js";
2
2
  export {
3
3
  s as ChatMessage
4
4
  };
@@ -16,6 +16,9 @@ export interface ClinicalNoteAuthor {
16
16
  * care and (optionally) the listed elements.
17
17
  * - `phase` — attached to a treatment phase, labelled.
18
18
  * - `xray` — attached to an x-ray / radiograph, optionally labelled.
19
+ *
20
+ * Every non-patient kind takes an optional `url`: a safe one turns the chip
21
+ * into a link, an unsafe one keeps the chip.
19
22
  */
20
23
  export type NoteAttachment = {
21
24
  kind: 'patient';
@@ -27,12 +30,15 @@ export type NoteAttachment = {
27
30
  kind: 'carePlanEntry';
28
31
  careName: string;
29
32
  elements?: string[];
33
+ url?: string;
30
34
  } | {
31
35
  kind: 'phase';
32
36
  label: string;
37
+ url?: string;
33
38
  } | {
34
39
  kind: 'xray';
35
40
  label?: string;
41
+ url?: string;
36
42
  };
37
43
  /** Imperative handle exposed to the agent runtime — identifiers / flags only. */
38
44
  export interface ClinicalNoteCardHandle {
@@ -50,7 +56,8 @@ export interface ClinicalNoteCardProps extends Omit<HTMLAttributes<HTMLDivElemen
50
56
  id?: string;
51
57
  /**
52
58
  * ISO-8601 timestamp the note refers to (the clinical date). Drives the
53
- * primary `<Timestamp>`.
59
+ * primary `<Timestamp>`. An empty string renders no timestamp (an undated
60
+ * imported note).
54
61
  */
55
62
  dateIso: string;
56
63
  /**
@@ -60,6 +67,14 @@ export interface ClinicalNoteCardProps extends Omit<HTMLAttributes<HTMLDivElemen
60
67
  createdAtIso?: string;
61
68
  /** Author identity — avatar + byline. Optional for system notes. */
62
69
  author?: ClinicalNoteAuthor;
70
+ /** The operator the note is credited to: a secondary "Operator: …" byline. */
71
+ operatorName?: string;
72
+ /**
73
+ * A deleted note kept for the record. Shows a "Deleted" badge and keeps the
74
+ * body out of the DOM until the reader presses "Show deleted note". Not an
75
+ * access control: the body is one press away.
76
+ */
77
+ deleted?: boolean;
63
78
  /**
64
79
  * Whether this is a clinical note (vs. an administrative one). When true a
65
80
  * "Clinical" badge is shown so the note's nature is unambiguous at a glance.
@@ -1,4 +1,4 @@
1
- import { C as e, c as i } from "../../_chunks/clinical-note-card-BBgFd2nB.js";
1
+ import { C as e, c as i } from "../../_chunks/clinical-note-card-D2WTV2CO.js";
2
2
  export {
3
3
  e as ClinicalNoteCard,
4
4
  i as clinicalNoteCardAgent
@@ -1,4 +1,4 @@
1
- import { A as T, B as P, C as L, G as a } from "../../_chunks/color-picker-CU303VjY.js";
1
+ import { A as T, B as P, C as L, G as a } from "../../_chunks/color-picker-Bl5f0iK1.js";
2
2
  export {
3
3
  T as APPOINTMENT_PALETTE,
4
4
  P as BRAND_PALETTE,
@@ -30,6 +30,11 @@ export interface ComboboxProps<T extends string = string> {
30
30
  onCreate?: (value: string) => void;
31
31
  open?: boolean;
32
32
  onOpenChange?: (open: boolean) => void;
33
+ /** Query typed by the user (including IME commits and Clear), or set
34
+ * through the agent handle. Selection and closing do not emit queries.
35
+ * Pair with `filter` for host-provided results and `emptyMessage` for
36
+ * their state. This callback also fires when there are no options. */
37
+ onQueryChange?: (query: string) => void;
33
38
  emptyMessage?: ReactNode;
34
39
  'aria-label'?: string;
35
40
  /**
@@ -1,4 +1,4 @@
1
- import { C as b, c as s, a as t, b as m, d as n, e as r } from "../../_chunks/combobox-D7_NLE2Z.js";
1
+ import { C as b, c as s, a as t, b as m, d as n, e as r } from "../../_chunks/combobox-DnSdYssy.js";
2
2
  export {
3
3
  b as Combobox,
4
4
  s as comboboxAgent,
@@ -1,4 +1,4 @@
1
- import { C as o, I as t, a, c as n, r as s } from "../../_chunks/country-select-DzbPFktV.js";
1
+ import { C as o, I as t, a, c as n, r as s } from "../../_chunks/country-select-CfDNFG5c.js";
2
2
  export {
3
3
  o as CountrySelect,
4
4
  t as ISO_3166_ALPHA2,
@@ -1,6 +1,6 @@
1
- import { D as r, E as l, T as t, a as s, b as d, c as o, d as n, e as i, f as R, i as C, g as T } from "../../_chunks/data-table-DB5BiVQ0.js";
1
+ import { D as r, E as l, T as t, a as s, b as d, c as o, d as n, e as i, f as R, i as C, g as T } from "../../_chunks/data-table-DC96JJIq.js";
2
2
  import { B as g, C as D, a as b, E as x, b as c, R as p, T as u, c as m, r as E, u as f } from "../../_chunks/editable-currency-cell-renderer-B7TVZ5ZJ.js";
3
- import { D as h, a as A, b as w, I as y, L as I, N as L, c as N, S as P, d as W, e as B, T as U, f as _, g as k, U as v } from "../../_chunks/link-cell-renderer-tWEOv3Sc.js";
3
+ import { D as h, a as A, b as w, I as y, L as I, N as L, c as N, S as P, d as W, e as B, T as U, f as _, g as k, U as v } from "../../_chunks/link-cell-renderer-BEpMNtAa.js";
4
4
  import { A as X, a as j } from "../../_chunks/actions-cell-renderer-yy03OgRL.js";
5
5
  export {
6
6
  X as ActionsCellRenderer,
@@ -1,4 +1,4 @@
1
- import { D as n, d } from "../../_chunks/dependent-selector-cJlJFAKD.js";
1
+ import { D as n, d } from "../../_chunks/dependent-selector-yTKKsuc9.js";
2
2
  export {
3
3
  n as DependentSelector,
4
4
  d as dependentSelectorAgent
@@ -3,6 +3,7 @@ import * as RadixDialog from '@radix-ui/react-dialog';
3
3
  import { type VariantProps } from 'class-variance-authority';
4
4
  declare const contentVariants: (props?: ({
5
5
  size?: "sm" | "md" | "lg" | "fullscreen" | null | undefined;
6
+ scroll?: "body" | "surface" | null | undefined;
6
7
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
8
  export interface DialogHandle {
8
9
  getIsOpen: () => boolean;
@@ -24,6 +25,14 @@ export interface DialogContentProps extends Omit<ComponentPropsWithoutRef<typeof
24
25
  * to force the X onto an alert, or `true` to suppress it on a default dialog.
25
26
  */
26
27
  hideCloseButton?: boolean;
28
+ /**
29
+ * What scrolls once the content passes the height cap (85dvh). `surface`
30
+ * (default) scrolls the whole panel, title and footer included. `body`
31
+ * keeps `Dialog.Header` and `Dialog.Footer` in view and scrolls only
32
+ * `Dialog.Body`, so the content must sit in a `Dialog.Body`. Below 480px
33
+ * of viewport height it falls back to scrolling the whole panel.
34
+ */
35
+ scroll?: 'surface' | 'body';
27
36
  className?: string;
28
37
  children: ReactNode;
29
38
  }
@@ -1,4 +1,4 @@
1
- import { D as g, d } from "../../_chunks/dialog-UbKJCi1X.js";
1
+ import { D as g, d } from "../../_chunks/dialog-BJiLqhx6.js";
2
2
  export {
3
3
  g as Dialog,
4
4
  d as dialogAgent
@@ -1,4 +1,4 @@
1
- import { D as r, d as t } from "../../_chunks/document-preview-CDb-n_W7.js";
1
+ import { D as r, d as t } from "../../_chunks/document-preview-BrhMHNh8.js";
2
2
  export {
3
3
  r as DocumentPreview,
4
4
  t as documentPreviewAgent
@@ -1,4 +1,4 @@
1
- import { D as e } from "../../_chunks/due-date-calculator-BtgWeFqp.js";
1
+ import { D as e } from "../../_chunks/due-date-calculator-CxgK8vzt.js";
2
2
  import { C as r, a as o, D, G as _, M as T, T as M, c as E, b as l, g as C, p as A, r as N, d as i, t as n } from "../../_chunks/antenatal-schedule-timeline-sXfIp5lp.js";
3
3
  export {
4
4
  r as CRL_DATING_MAX_MM,
@@ -1,4 +1,4 @@
1
- import { E as t } from "../../_chunks/entity-summary-B_vO5Ur4.js";
1
+ import { E as t } from "../../_chunks/entity-summary-5o768XLU.js";
2
2
  export {
3
3
  t as EntitySummary
4
4
  };
@@ -1,4 +1,4 @@
1
- import { A as e, F as o, a as n, b as A, c as i, d as f, e as t, I, f as N, g as T, h as F, i as _, j as E, k as c, l as h, m as r, n as p, o as O, p as S, q as m, r as l, s as d, t as C, u as D } from "../../_chunks/face-scheme-DA2vjqaM.js";
1
+ import { A as e, F as o, a as n, b as A, c as i, d as f, e as t, I, f as N, g as T, h as F, i as _, j as E, k as c, l as h, m as r, n as p, o as O, p as S, q as m, r as l, s as d, t as C, u as D } from "../../_chunks/face-scheme-l-CQyLs-.js";
2
2
  export {
3
3
  e as ANNOTATION_TOOL_KIND,
4
4
  o as FACE_ANNOTATION_TOOLS,
@@ -1,4 +1,4 @@
1
- import { F as r, f } from "../../_chunks/file-manager-Cd8V9IcZ.js";
1
+ import { F as r, f } from "../../_chunks/file-manager-CI2Qn8qW.js";
2
2
  export {
3
3
  r as FileManager,
4
4
  f as fileManagerAgent
@@ -1,4 +1,4 @@
1
- import { G as t } from "../../_chunks/gestational-age-calculator-KdMg9z9H.js";
1
+ import { G as t } from "../../_chunks/gestational-age-calculator-CZHVrERT.js";
2
2
  export {
3
3
  t as GestationalAgeCalculator
4
4
  };
@@ -1,4 +1,4 @@
1
- import { M as a } from "../../_chunks/message-card-D8GB4FdF.js";
1
+ import { M as a } from "../../_chunks/message-card-BUMv16un.js";
2
2
  import { m as o } from "../../_chunks/message-card.agent-ZLhx3Bs5.js";
3
3
  import { i as f } from "../../_chunks/is-safe-url-DkETxeHz.js";
4
4
  export {
@@ -1,4 +1,4 @@
1
- import { M as s, m as r } from "../../_chunks/message-tray-CGIRQjx5.js";
1
+ import { M as s, m as r } from "../../_chunks/message-tray-0zsv27xX.js";
2
2
  export {
3
3
  s as MessageTray,
4
4
  r as messageTrayAgent
@@ -1,4 +1,4 @@
1
- import { D as a, F as r, a as t, M as g, b as i, e as m, f as o, g as E, c as F, m as c, r as I, v as M } from "../../_chunks/muscle-scheme-BSJsI4-I.js";
1
+ import { D as a, F as r, a as t, M as g, b as i, e as m, f as o, g as E, c as F, m as c, r as I, v as M } from "../../_chunks/muscle-scheme-UVz_x4iE.js";
2
2
  export {
3
3
  a as DEFAULT_MUSCLE_VIEW,
4
4
  r as FINDING_MARKER,