@alfadocs/ui-kit-debug 0.47.0 → 0.48.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.
- package/dist/_chunks/{agenda-card-CFyWSX7Z.js → agenda-card-BaSfVfrL.js} +25 -29
- package/dist/_chunks/agenda-card-BaSfVfrL.js.map +1 -0
- package/dist/_chunks/{agenda-tray-Dyj9ChHC.js → agenda-tray-DQayYmQ0.js} +50 -67
- package/dist/_chunks/agenda-tray-DQayYmQ0.js.map +1 -0
- package/dist/_chunks/ai-consent-banner-DO5ingMq.js +169 -0
- package/dist/_chunks/ai-consent-banner-DO5ingMq.js.map +1 -0
- package/dist/_chunks/ai-tools-rail-CxYG04cw.js +280 -0
- package/dist/_chunks/ai-tools-rail-CxYG04cw.js.map +1 -0
- package/dist/_chunks/{alia-sidebar-CVIPrdc9.js → alia-sidebar-DlvyXgVC.js} +3 -2
- package/dist/_chunks/alia-sidebar-DlvyXgVC.js.map +1 -0
- package/dist/_chunks/anamnesis-card-CmkBVAln.js +156 -0
- package/dist/_chunks/anamnesis-card-CmkBVAln.js.map +1 -0
- package/dist/_chunks/appointment-tray-BwDHhWWC.js +419 -0
- package/dist/_chunks/appointment-tray-BwDHhWWC.js.map +1 -0
- package/dist/_chunks/{bmi-calculator-CQqXTVNL.js → bmi-calculator-DdylQzT6.js} +2 -2
- package/dist/_chunks/{bmi-calculator-CQqXTVNL.js.map → bmi-calculator-DdylQzT6.js.map} +1 -1
- package/dist/_chunks/{booking-DlDVuWMd.js → booking-WV2GSru5.js} +291 -303
- package/dist/_chunks/booking-WV2GSru5.js.map +1 -0
- package/dist/_chunks/{calculator-dialog-D-nfvteH.js → calculator-dialog-CFk4I91b.js} +2 -2
- package/dist/_chunks/{calculator-dialog-D-nfvteH.js.map → calculator-dialog-CFk4I91b.js.map} +1 -1
- package/dist/_chunks/calendar-days-C4BmpCZg.js +23 -0
- package/dist/_chunks/calendar-days-C4BmpCZg.js.map +1 -0
- package/dist/_chunks/{calendar-YHFknAGv.js → calendar-oYWOCrnf.js} +195 -210
- package/dist/_chunks/calendar-oYWOCrnf.js.map +1 -0
- package/dist/_chunks/care-plan-card-QmNpGggC.js +252 -0
- package/dist/_chunks/care-plan-card-QmNpGggC.js.map +1 -0
- package/dist/_chunks/care-plan-entry-card-Cnra7vUc.js +318 -0
- package/dist/_chunks/care-plan-entry-card-Cnra7vUc.js.map +1 -0
- package/dist/_chunks/{chat-message-B5JpFj0F.js → chat-message-Dm8U2RY1.js} +36 -35
- package/dist/_chunks/chat-message-Dm8U2RY1.js.map +1 -0
- package/dist/_chunks/clinical-note-card-BYo437dU.js +333 -0
- package/dist/_chunks/clinical-note-card-BYo437dU.js.map +1 -0
- package/dist/_chunks/{contact-profile-card-DHyuAPXM.js → contact-profile-card-DvvVfAA2.js} +102 -115
- package/dist/_chunks/contact-profile-card-DvvVfAA2.js.map +1 -0
- package/dist/_chunks/{cycle-calculator-KxA8dqDf.js → cycle-calculator-DYvGm_m1.js} +2 -2
- package/dist/_chunks/{cycle-calculator-KxA8dqDf.js.map → cycle-calculator-DYvGm_m1.js.map} +1 -1
- package/dist/_chunks/{dialog-BTpZV6It.js → dialog-DMGnSelc.js} +55 -55
- package/dist/_chunks/dialog-DMGnSelc.js.map +1 -0
- package/dist/_chunks/{due-date-calculator-mFxpHLml.js → due-date-calculator-BXd3ANj7.js} +2 -2
- package/dist/_chunks/{due-date-calculator-mFxpHLml.js.map → due-date-calculator-BXd3ANj7.js.map} +1 -1
- package/dist/_chunks/entity-card-COhmqHly.js +69 -0
- package/dist/_chunks/entity-card-COhmqHly.js.map +1 -0
- package/dist/_chunks/{gestational-age-calculator-gWI_uRA1.js → gestational-age-calculator-Crj6FgZw.js} +2 -2
- package/dist/_chunks/{gestational-age-calculator-gWI_uRA1.js.map → gestational-age-calculator-Crj6FgZw.js.map} +1 -1
- package/dist/_chunks/{insert-result-C5ABnzDl.js → insert-result-DNdi_JYW.js} +140 -168
- package/dist/_chunks/insert-result-DNdi_JYW.js.map +1 -0
- package/dist/_chunks/is-safe-url-DkETxeHz.js +7 -0
- package/dist/_chunks/is-safe-url-DkETxeHz.js.map +1 -0
- package/dist/_chunks/languages-DsVf_WzT.js +19 -0
- package/dist/_chunks/languages-DsVf_WzT.js.map +1 -0
- package/dist/_chunks/layers-pzGcbLPj.js +34 -0
- package/dist/_chunks/layers-pzGcbLPj.js.map +1 -0
- package/dist/_chunks/{message-card-DSPw5ghw.js → message-card-Dvl1TgaN.js} +15 -19
- package/dist/_chunks/message-card-Dvl1TgaN.js.map +1 -0
- package/dist/_chunks/{message-tray-hSQff9u4.js → message-tray-Dl6GQaaV.js} +2 -2
- package/dist/_chunks/{message-tray-hSQff9u4.js.map → message-tray-Dl6GQaaV.js.map} +1 -1
- package/dist/_chunks/operator-hero-CM8949Hd.js +198 -0
- package/dist/_chunks/operator-hero-CM8949Hd.js.map +1 -0
- package/dist/_chunks/patient-summary-card-BnTqxcTr.js +443 -0
- package/dist/_chunks/patient-summary-card-BnTqxcTr.js.map +1 -0
- package/dist/_chunks/payment-request-card-B_lyobd0.js +478 -0
- package/dist/_chunks/payment-request-card-B_lyobd0.js.map +1 -0
- package/dist/_chunks/{pdf-viewer-CWEXTlwq.js → pdf-viewer-G8SU6Azw.js} +3 -3
- package/dist/_chunks/pdf-viewer-G8SU6Azw.js.map +1 -0
- package/dist/_chunks/periodontal-chart-card-BYs9hax1.js +455 -0
- package/dist/_chunks/periodontal-chart-card-BYs9hax1.js.map +1 -0
- package/dist/_chunks/phone-Bi5yUm4I.js +20 -0
- package/dist/_chunks/phone-Bi5yUm4I.js.map +1 -0
- package/dist/_chunks/{practice-results-DDi-kvaD.js → practice-results-BFL_mcDW.js} +3 -2
- package/dist/_chunks/{practice-results-DDi-kvaD.js.map → practice-results-BFL_mcDW.js.map} +1 -1
- package/dist/_chunks/{pregnancy-weight-gain-BtEHaSqy.js → pregnancy-weight-gain-C7dK89jE.js} +2 -2
- package/dist/_chunks/{pregnancy-weight-gain-BtEHaSqy.js.map → pregnancy-weight-gain-C7dK89jE.js.map} +1 -1
- package/dist/_chunks/scan-line-lGioFwLC.js +18 -0
- package/dist/_chunks/scan-line-lGioFwLC.js.map +1 -0
- package/dist/_chunks/shield-check-BjCGH_Sr.js +21 -0
- package/dist/_chunks/shield-check-BjCGH_Sr.js.map +1 -0
- package/dist/_chunks/{sign-document-BCyLpFHJ.js → sign-document-DPI2pY9V.js} +2 -2
- package/dist/_chunks/{sign-document-BCyLpFHJ.js.map → sign-document-DPI2pY9V.js.map} +1 -1
- package/dist/_chunks/{transaction-chip-B8ujzowA.js → transaction-chip-BZCa6XDn.js} +8 -6
- package/dist/_chunks/{transaction-chip-B8ujzowA.js.map → transaction-chip-BZCa6XDn.js.map} +1 -1
- package/dist/_chunks/{unit-converter-u3CwNDpP.js → unit-converter-jWp3Z85y.js} +2 -2
- package/dist/_chunks/{unit-converter-u3CwNDpP.js.map → unit-converter-jWp3Z85y.js.map} +1 -1
- package/dist/_chunks/user-cog-BS_qc8nA.js +24 -0
- package/dist/_chunks/user-cog-BS_qc8nA.js.map +1 -0
- package/dist/_chunks/video-BAeICxCT.js +21 -0
- package/dist/_chunks/video-BAeICxCT.js.map +1 -0
- package/dist/_chunks/{workflow-map-Djn1QMJc.js → workflow-map-ZXw-zsZ8.js} +138 -156
- package/dist/_chunks/workflow-map-ZXw-zsZ8.js.map +1 -0
- package/dist/agent-catalog.json +324 -1
- package/dist/components/_shared/entity-card/entity-card.d.ts +40 -0
- package/dist/components/_shared/entity-card/entity-card.d.ts.map +1 -0
- package/dist/components/_shared/entity-card/index.d.ts +3 -0
- package/dist/components/_shared/entity-card/index.d.ts.map +1 -0
- package/dist/components/_shared/index.d.ts +2 -0
- package/dist/components/_shared/index.d.ts.map +1 -1
- package/dist/components/_shared/is-safe-url.d.ts +13 -0
- package/dist/components/_shared/is-safe-url.d.ts.map +1 -0
- package/dist/components/agenda-card/agenda-card.d.ts +1 -2
- package/dist/components/agenda-card/agenda-card.d.ts.map +1 -1
- package/dist/components/agenda-card/index.d.ts +2 -1
- package/dist/components/agenda-card/index.d.ts.map +1 -1
- package/dist/components/agenda-card/index.js +6 -5
- package/dist/components/agenda-card/index.js.map +1 -1
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/ai-consent-banner/ai-consent-banner.agent.d.ts +4 -0
- package/dist/components/ai-consent-banner/ai-consent-banner.agent.d.ts.map +1 -0
- package/dist/components/ai-consent-banner/ai-consent-banner.d.ts +45 -0
- package/dist/components/ai-consent-banner/ai-consent-banner.d.ts.map +1 -0
- package/dist/components/ai-consent-banner/index.d.ts +4 -0
- package/dist/components/ai-consent-banner/index.d.ts.map +1 -0
- package/dist/components/ai-consent-banner/index.js +6 -0
- package/dist/components/ai-consent-banner/index.js.map +1 -0
- package/dist/components/ai-tools-rail/ai-tools-rail.agent.d.ts +4 -0
- package/dist/components/ai-tools-rail/ai-tools-rail.agent.d.ts.map +1 -0
- package/dist/components/ai-tools-rail/ai-tools-rail.d.ts +60 -0
- package/dist/components/ai-tools-rail/ai-tools-rail.d.ts.map +1 -0
- package/dist/components/ai-tools-rail/index.d.ts +4 -0
- package/dist/components/ai-tools-rail/index.d.ts.map +1 -0
- package/dist/components/ai-tools-rail/index.js +6 -0
- package/dist/components/ai-tools-rail/index.js.map +1 -0
- package/dist/components/anamnesis-card/anamnesis-card.d.ts +68 -0
- package/dist/components/anamnesis-card/anamnesis-card.d.ts.map +1 -0
- package/dist/components/anamnesis-card/index.d.ts +3 -0
- package/dist/components/anamnesis-card/index.d.ts.map +1 -0
- package/dist/components/anamnesis-card/index.js +5 -0
- package/dist/components/anamnesis-card/index.js.map +1 -0
- package/dist/components/appointment-card/appointment-card.agent.d.ts +3 -0
- package/dist/components/appointment-card/appointment-card.agent.d.ts.map +1 -0
- package/dist/components/appointment-card/appointment-card.d.ts +93 -0
- package/dist/components/appointment-card/appointment-card.d.ts.map +1 -0
- package/dist/components/appointment-card/appointment-tray.agent.d.ts +4 -0
- package/dist/components/appointment-card/appointment-tray.agent.d.ts.map +1 -0
- package/dist/components/appointment-card/appointment-tray.d.ts +48 -0
- package/dist/components/appointment-card/appointment-tray.d.ts.map +1 -0
- package/dist/components/appointment-card/index.d.ts +8 -0
- package/dist/components/appointment-card/index.d.ts.map +1 -0
- package/dist/components/appointment-card/index.js +10 -0
- package/dist/components/appointment-card/index.js.map +1 -0
- package/dist/components/badge/badge.d.ts +1 -1
- package/dist/components/bmi-calculator/index.js +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/calculator-dialog/index.js +1 -1
- package/dist/components/calendar/index.js +1 -1
- package/dist/components/card/card.d.ts +1 -1
- package/dist/components/care-plan-card/care-plan-card.agent.d.ts +4 -0
- package/dist/components/care-plan-card/care-plan-card.agent.d.ts.map +1 -0
- package/dist/components/care-plan-card/care-plan-card.d.ts +102 -0
- package/dist/components/care-plan-card/care-plan-card.d.ts.map +1 -0
- package/dist/components/care-plan-card/index.d.ts +4 -0
- package/dist/components/care-plan-card/index.d.ts.map +1 -0
- package/dist/components/care-plan-card/index.js +6 -0
- package/dist/components/care-plan-card/index.js.map +1 -0
- package/dist/components/care-plan-entry-card/care-plan-entry-card.agent.d.ts +4 -0
- package/dist/components/care-plan-entry-card/care-plan-entry-card.agent.d.ts.map +1 -0
- package/dist/components/care-plan-entry-card/care-plan-entry-card.d.ts +110 -0
- package/dist/components/care-plan-entry-card/care-plan-entry-card.d.ts.map +1 -0
- package/dist/components/care-plan-entry-card/index.d.ts +4 -0
- package/dist/components/care-plan-entry-card/index.d.ts.map +1 -0
- package/dist/components/care-plan-entry-card/index.js +6 -0
- package/dist/components/care-plan-entry-card/index.js.map +1 -0
- package/dist/components/chat-message/chat-message.d.ts +7 -0
- package/dist/components/chat-message/chat-message.d.ts.map +1 -1
- package/dist/components/chat-message/index.js +1 -1
- package/dist/components/clinical-note-card/clinical-note-card.agent.d.ts +4 -0
- package/dist/components/clinical-note-card/clinical-note-card.agent.d.ts.map +1 -0
- package/dist/components/clinical-note-card/clinical-note-card.d.ts +98 -0
- package/dist/components/clinical-note-card/clinical-note-card.d.ts.map +1 -0
- package/dist/components/clinical-note-card/index.d.ts +4 -0
- package/dist/components/clinical-note-card/index.d.ts.map +1 -0
- package/dist/components/clinical-note-card/index.js +6 -0
- package/dist/components/clinical-note-card/index.js.map +1 -0
- package/dist/components/contact-profile-card/index.js +1 -1
- package/dist/components/cycle-calculator/index.js +1 -1
- package/dist/components/dialog/dialog.d.ts +7 -0
- package/dist/components/dialog/dialog.d.ts.map +1 -1
- package/dist/components/dialog/index.js +1 -1
- package/dist/components/due-date-calculator/index.js +1 -1
- package/dist/components/gestational-age-calculator/index.js +1 -1
- package/dist/components/index.d.ts +10 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/message-card/index.js +5 -4
- package/dist/components/message-card/index.js.map +1 -1
- package/dist/components/message-card/message-card.d.ts +1 -2
- package/dist/components/message-card/message-card.d.ts.map +1 -1
- package/dist/components/message-tray/index.js +1 -1
- package/dist/components/operator-hero/index.js +1 -1
- package/dist/components/operator-hero/operator-hero.agent.d.ts.map +1 -1
- package/dist/components/operator-hero/operator-hero.d.ts +9 -0
- package/dist/components/operator-hero/operator-hero.d.ts.map +1 -1
- package/dist/components/patient-summary-card/index.d.ts +4 -0
- package/dist/components/patient-summary-card/index.d.ts.map +1 -0
- package/dist/components/patient-summary-card/index.js +6 -0
- package/dist/components/patient-summary-card/index.js.map +1 -0
- package/dist/components/patient-summary-card/patient-summary-card.agent.d.ts +4 -0
- package/dist/components/patient-summary-card/patient-summary-card.agent.d.ts.map +1 -0
- package/dist/components/patient-summary-card/patient-summary-card.d.ts +120 -0
- package/dist/components/patient-summary-card/patient-summary-card.d.ts.map +1 -0
- package/dist/components/payment-card/index.d.ts +7 -0
- package/dist/components/payment-card/index.d.ts.map +1 -0
- package/dist/components/payment-card/index.js +8 -0
- package/dist/components/payment-card/index.js.map +1 -0
- package/dist/components/payment-card/payment-card.agent.d.ts +4 -0
- package/dist/components/payment-card/payment-card.agent.d.ts.map +1 -0
- package/dist/components/payment-card/payment-card.d.ts +71 -0
- package/dist/components/payment-card/payment-card.d.ts.map +1 -0
- package/dist/components/payment-card/payment-request-card.agent.d.ts +4 -0
- package/dist/components/payment-card/payment-request-card.agent.d.ts.map +1 -0
- package/dist/components/payment-card/payment-request-card.d.ts +43 -0
- package/dist/components/payment-card/payment-request-card.d.ts.map +1 -0
- package/dist/components/pdf-viewer/index.js +1 -1
- package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +1 -1
- package/dist/components/periodontal-chart-card/index.d.ts +4 -0
- package/dist/components/periodontal-chart-card/index.d.ts.map +1 -0
- package/dist/components/periodontal-chart-card/index.js +7 -0
- package/dist/components/periodontal-chart-card/index.js.map +1 -0
- package/dist/components/periodontal-chart-card/periodontal-chart-card.agent.d.ts +4 -0
- package/dist/components/periodontal-chart-card/periodontal-chart-card.agent.d.ts.map +1 -0
- package/dist/components/periodontal-chart-card/periodontal-chart-card.d.ts +74 -0
- package/dist/components/periodontal-chart-card/periodontal-chart-card.d.ts.map +1 -0
- package/dist/components/practice-results/index.js +1 -1
- package/dist/components/pregnancy-weight-gain/index.js +1 -1
- package/dist/components/public-header/public-header.d.ts +1 -1
- package/dist/components/sign-document/index.js +1 -1
- package/dist/components/stat/stat.d.ts +1 -1
- package/dist/components/transaction-chip/index.js +1 -1
- package/dist/components/unit-converter/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/i18n/locales/ar.d.ts +351 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +351 -0
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +351 -0
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +351 -0
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +351 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +351 -0
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +351 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +351 -0
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +351 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +351 -0
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +351 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +351 -0
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +351 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +351 -0
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +351 -0
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +351 -0
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +351 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +351 -0
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +351 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +351 -0
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +351 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +351 -0
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +351 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +351 -0
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +351 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +351 -0
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +351 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +351 -0
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +351 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +351 -0
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +351 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +351 -0
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +351 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +351 -0
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +351 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +351 -0
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +527 -491
- package/dist/index.js.map +1 -1
- package/dist/locales/ar.json +351 -0
- package/dist/locales/de.json +351 -0
- package/dist/locales/el.json +351 -0
- package/dist/locales/en.json +351 -0
- package/dist/locales/es.json +351 -0
- package/dist/locales/fr.json +351 -0
- package/dist/locales/hi.json +351 -0
- package/dist/locales/it.json +351 -0
- package/dist/locales/ja.json +351 -0
- package/dist/locales/nl.json +351 -0
- package/dist/locales/pl.json +351 -0
- package/dist/locales/pt.json +351 -0
- package/dist/locales/ro.json +351 -0
- package/dist/locales/ru.json +351 -0
- package/dist/locales/sq.json +351 -0
- package/dist/locales/sv.json +351 -0
- package/dist/locales/tr.json +351 -0
- package/dist/locales/zh.json +351 -0
- package/dist/patterns/alia-assistant/alia-chat-surface.d.ts.map +1 -1
- package/dist/patterns/alia-assistant/alia-types.d.ts +15 -0
- package/dist/patterns/alia-assistant/alia-types.d.ts.map +1 -1
- package/dist/patterns/alia-assistant/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +42 -1
- package/dist/_chunks/agenda-card-CFyWSX7Z.js.map +0 -1
- package/dist/_chunks/agenda-tray-Dyj9ChHC.js.map +0 -1
- package/dist/_chunks/alia-sidebar-CVIPrdc9.js.map +0 -1
- package/dist/_chunks/booking-DlDVuWMd.js.map +0 -1
- package/dist/_chunks/calendar-YHFknAGv.js.map +0 -1
- package/dist/_chunks/chat-message-B5JpFj0F.js.map +0 -1
- package/dist/_chunks/contact-profile-card-DHyuAPXM.js.map +0 -1
- package/dist/_chunks/dialog-BTpZV6It.js.map +0 -1
- package/dist/_chunks/insert-result-C5ABnzDl.js.map +0 -1
- package/dist/_chunks/message-card-DSPw5ghw.js.map +0 -1
- package/dist/_chunks/operator-hero-7LiiP7zi.js +0 -171
- package/dist/_chunks/operator-hero-7LiiP7zi.js.map +0 -1
- package/dist/_chunks/pdf-viewer-CWEXTlwq.js.map +0 -1
- package/dist/_chunks/shield-check-C73ma9Cs.js +0 -36
- package/dist/_chunks/shield-check-C73ma9Cs.js.map +0 -1
- package/dist/_chunks/workflow-map-Djn1QMJc.js.map +0 -1
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { jsx as e, jsxs as s } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as Y, useId as v } from "react";
|
|
3
|
+
import { useTranslation as R } from "react-i18next";
|
|
4
|
+
import { B as c } from "./badge-zsf5i5bH.js";
|
|
5
|
+
import { P as O } from "./progress-kzIRcdaq.js";
|
|
6
|
+
import { T as q } from "./tag-CdA0s_VV.js";
|
|
7
|
+
import { T as b } from "./timestamp-BV2lC-wV.js";
|
|
8
|
+
import { T as G } from "./transaction-chip-BZCa6XDn.js";
|
|
9
|
+
import { f as J } from "./tooth-scheme-CxlsLjfN.js";
|
|
10
|
+
import { C as Q, b as X, a as Z } from "./collapsible-X3oaLPU3.js";
|
|
11
|
+
import { u as ee } from "./registry-nPAVE19X.js";
|
|
12
|
+
import { C as ae } from "./chevron-down-BX_NP2Yh.js";
|
|
13
|
+
import { e as te } from "./entity-card-COhmqHly.js";
|
|
14
|
+
const re = {
|
|
15
|
+
id: "care-plan-entry-card",
|
|
16
|
+
capabilities: ["view_change"],
|
|
17
|
+
state: {
|
|
18
|
+
done: {
|
|
19
|
+
type: "boolean",
|
|
20
|
+
descriptionKey: "ui.agent.carePlanEntryCard.state.done",
|
|
21
|
+
description: "Whether the treatment line is marked executed.",
|
|
22
|
+
read: (t) => t.isDone()
|
|
23
|
+
},
|
|
24
|
+
phaseProgress: {
|
|
25
|
+
type: "{ executed: number; total: number }",
|
|
26
|
+
descriptionKey: "ui.agent.carePlanEntryCard.state.phaseProgress",
|
|
27
|
+
description: "Phase progress as executed / total counts. Counts only — never phase labels or operator identity.",
|
|
28
|
+
read: (t) => t.getPhaseProgress()
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
actions: {},
|
|
32
|
+
domHooks: {
|
|
33
|
+
root: {
|
|
34
|
+
attr: "data-component",
|
|
35
|
+
value: "care-plan-entry-card",
|
|
36
|
+
description: "Marks the CarePlanEntryCard root region."
|
|
37
|
+
},
|
|
38
|
+
instanceId: {
|
|
39
|
+
attr: "data-component-id",
|
|
40
|
+
sourceProp: "id",
|
|
41
|
+
description: "Sourced from the id prop. Addresses a specific line."
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}, se = "EUR";
|
|
45
|
+
function ne(t) {
|
|
46
|
+
const o = {};
|
|
47
|
+
for (const l of t)
|
|
48
|
+
o[l] = ["filled"];
|
|
49
|
+
return o;
|
|
50
|
+
}
|
|
51
|
+
const le = Y(
|
|
52
|
+
({
|
|
53
|
+
id: t,
|
|
54
|
+
careName: o,
|
|
55
|
+
code: l,
|
|
56
|
+
label: h,
|
|
57
|
+
elements: u,
|
|
58
|
+
done: g = !1,
|
|
59
|
+
executionDateIso: C,
|
|
60
|
+
plannedAppointment: P,
|
|
61
|
+
operator: i,
|
|
62
|
+
price: n,
|
|
63
|
+
phases: a,
|
|
64
|
+
billed: E = !1,
|
|
65
|
+
outsideOfEstimate: k = !1,
|
|
66
|
+
notesCount: p,
|
|
67
|
+
toothDisplay: S = "chips",
|
|
68
|
+
locale: j,
|
|
69
|
+
currency: N = se,
|
|
70
|
+
surface: A = "elevated",
|
|
71
|
+
"aria-label": w,
|
|
72
|
+
className: U,
|
|
73
|
+
...B
|
|
74
|
+
}, F) => {
|
|
75
|
+
var L;
|
|
76
|
+
const { t: r, i18n: H } = R(), D = v(), K = v(), T = v(), V = v(), m = j ?? H.language ?? "en";
|
|
77
|
+
ee(
|
|
78
|
+
re,
|
|
79
|
+
{
|
|
80
|
+
isDone: () => g,
|
|
81
|
+
getPhaseProgress: () => ({
|
|
82
|
+
executed: (a == null ? void 0 : a.executed) ?? 0,
|
|
83
|
+
total: (a == null ? void 0 : a.total) ?? 0
|
|
84
|
+
})
|
|
85
|
+
},
|
|
86
|
+
t
|
|
87
|
+
);
|
|
88
|
+
const M = !!u && u.length > 0, z = !!(a != null && a.detail) && a.detail.length > 0, _ = E ? "settled" : "to-invoice", f = n == null ? void 0 : n.priceCents, x = n == null ? void 0 : n.discountedPriceCents, I = x !== void 0 && f !== void 0 && x < f, y = x ?? f, $ = (d) => new Intl.NumberFormat(m, {
|
|
89
|
+
style: "currency",
|
|
90
|
+
currency: N
|
|
91
|
+
}).format(d / 100);
|
|
92
|
+
return /* @__PURE__ */ e(
|
|
93
|
+
"div",
|
|
94
|
+
{
|
|
95
|
+
ref: F,
|
|
96
|
+
role: "region",
|
|
97
|
+
"aria-label": w,
|
|
98
|
+
"aria-labelledby": w ? void 0 : D,
|
|
99
|
+
"data-component": "care-plan-entry-card",
|
|
100
|
+
"data-component-id": t,
|
|
101
|
+
"data-done": g ? "true" : "false",
|
|
102
|
+
id: t,
|
|
103
|
+
className: te({ surface: A, className: U }),
|
|
104
|
+
...B,
|
|
105
|
+
children: /* @__PURE__ */ s("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]", children: [
|
|
106
|
+
/* @__PURE__ */ s("div", { className: "ds:flex ds:items-start ds:gap-[var(--spacing-sm)]", children: [
|
|
107
|
+
/* @__PURE__ */ s("div", { className: "ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-2xs)]", children: [
|
|
108
|
+
/* @__PURE__ */ s("div", { className: "ds:flex ds:flex-wrap ds:items-baseline ds:gap-[var(--spacing-xs)]", children: [
|
|
109
|
+
/* @__PURE__ */ e(
|
|
110
|
+
"h3",
|
|
111
|
+
{
|
|
112
|
+
id: D,
|
|
113
|
+
className: "type-title-item ds:m-0 ds:text-[color:var(--foreground)]",
|
|
114
|
+
children: o
|
|
115
|
+
}
|
|
116
|
+
),
|
|
117
|
+
l ? /* @__PURE__ */ e("span", { className: "type-meta ds:text-[color:var(--muted-foreground)] ds:tabular-nums", children: l }) : null
|
|
118
|
+
] }),
|
|
119
|
+
h ? /* @__PURE__ */ e("span", { className: "type-body-sm ds:text-[color:var(--muted-foreground)]", children: h }) : null
|
|
120
|
+
] }),
|
|
121
|
+
/* @__PURE__ */ s("div", { className: "ds:flex ds:shrink-0 ds:flex-wrap ds:items-center ds:justify-end ds:gap-[var(--spacing-2xs)]", children: [
|
|
122
|
+
g ? /* @__PURE__ */ e(c, { variant: "success", size: "sm", withDot: !0, children: r("carePlanEntryCard.flag.done", "Done") }) : null,
|
|
123
|
+
k ? /* @__PURE__ */ e(c, { variant: "warning", size: "sm", withDot: !0, children: r(
|
|
124
|
+
"carePlanEntryCard.flag.outsideOfEstimate",
|
|
125
|
+
"Outside estimate"
|
|
126
|
+
) }) : null,
|
|
127
|
+
E ? /* @__PURE__ */ e(c, { variant: "neutral", size: "sm", children: r("carePlanEntryCard.flag.billed", "Billed") }) : null,
|
|
128
|
+
typeof p == "number" && p > 0 ? /* @__PURE__ */ e(
|
|
129
|
+
c,
|
|
130
|
+
{
|
|
131
|
+
variant: "neutral",
|
|
132
|
+
size: "sm",
|
|
133
|
+
"aria-label": r("carePlanEntryCard.notesLabel", {
|
|
134
|
+
count: p,
|
|
135
|
+
defaultValue: "{{count}} notes"
|
|
136
|
+
}),
|
|
137
|
+
children: p
|
|
138
|
+
}
|
|
139
|
+
) : null
|
|
140
|
+
] })
|
|
141
|
+
] }),
|
|
142
|
+
M ? S === "scheme" ? /* @__PURE__ */ e(
|
|
143
|
+
J,
|
|
144
|
+
{
|
|
145
|
+
mode: "display",
|
|
146
|
+
conditions: ne(u),
|
|
147
|
+
ariaLabel: r("carePlanEntryCard.toothSchemeLabel", {
|
|
148
|
+
count: u.length,
|
|
149
|
+
defaultValue: "Teeth involved: {{count}}"
|
|
150
|
+
})
|
|
151
|
+
}
|
|
152
|
+
) : /* @__PURE__ */ e(
|
|
153
|
+
"div",
|
|
154
|
+
{
|
|
155
|
+
role: "list",
|
|
156
|
+
"aria-label": r(
|
|
157
|
+
"carePlanEntryCard.elementsLabel",
|
|
158
|
+
"Teeth involved"
|
|
159
|
+
),
|
|
160
|
+
className: "ds:flex ds:flex-wrap ds:gap-[var(--spacing-2xs)]",
|
|
161
|
+
children: u.map((d) => /* @__PURE__ */ e("div", { role: "listitem", children: /* @__PURE__ */ e(q, { label: d, variant: "info", size: "sm" }) }, d))
|
|
162
|
+
}
|
|
163
|
+
) : null,
|
|
164
|
+
g && C ? /* @__PURE__ */ s("p", { className: "type-body-sm ds:m-0 ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]", children: [
|
|
165
|
+
/* @__PURE__ */ e("span", { children: r("carePlanEntryCard.executedOn", "Executed on") }),
|
|
166
|
+
/* @__PURE__ */ e(
|
|
167
|
+
b,
|
|
168
|
+
{
|
|
169
|
+
value: C,
|
|
170
|
+
format: "absolute",
|
|
171
|
+
locale: m
|
|
172
|
+
}
|
|
173
|
+
),
|
|
174
|
+
i ? /* @__PURE__ */ e("span", { children: r("carePlanEntryCard.byOperator", {
|
|
175
|
+
operator: i.name,
|
|
176
|
+
defaultValue: "by {{operator}}"
|
|
177
|
+
}) }) : null
|
|
178
|
+
] }) : P ? /* @__PURE__ */ s("p", { className: "type-body-sm ds:m-0 ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]", children: [
|
|
179
|
+
/* @__PURE__ */ e("span", { children: r("carePlanEntryCard.plannedFor", "Planned for") }),
|
|
180
|
+
/* @__PURE__ */ e(
|
|
181
|
+
b,
|
|
182
|
+
{
|
|
183
|
+
value: P.dateIso,
|
|
184
|
+
format: "absolute",
|
|
185
|
+
locale: m
|
|
186
|
+
}
|
|
187
|
+
),
|
|
188
|
+
i ? /* @__PURE__ */ e("span", { children: r("carePlanEntryCard.byOperator", {
|
|
189
|
+
operator: i.name,
|
|
190
|
+
defaultValue: "by {{operator}}"
|
|
191
|
+
}) }) : null
|
|
192
|
+
] }) : i ? /* @__PURE__ */ e("p", { className: "type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]", children: r("carePlanEntryCard.assignedTo", {
|
|
193
|
+
operator: i.name,
|
|
194
|
+
defaultValue: "Assigned to {{operator}}"
|
|
195
|
+
}) }) : null,
|
|
196
|
+
a && a.total > 0 ? /* @__PURE__ */ e(
|
|
197
|
+
O,
|
|
198
|
+
{
|
|
199
|
+
value: a.executed,
|
|
200
|
+
max: a.total,
|
|
201
|
+
size: "sm",
|
|
202
|
+
"aria-label": r("carePlanEntryCard.phasesLabel", {
|
|
203
|
+
executed: a.executed,
|
|
204
|
+
total: a.total,
|
|
205
|
+
defaultValue: "Phases: {{executed}} of {{total}} executed"
|
|
206
|
+
}),
|
|
207
|
+
children: /* @__PURE__ */ s("div", { className: "ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]", children: [
|
|
208
|
+
/* @__PURE__ */ e(O.Label, { id: K, children: r("carePlanEntryCard.phasesHeading", "Phases") }),
|
|
209
|
+
/* @__PURE__ */ e("span", { className: "type-body-sm ds:tabular-nums ds:text-[color:var(--muted-foreground)]", children: r("carePlanEntryCard.phasesCount", {
|
|
210
|
+
executed: a.executed,
|
|
211
|
+
total: a.total,
|
|
212
|
+
defaultValue: "{{executed}} / {{total}}"
|
|
213
|
+
}) })
|
|
214
|
+
] })
|
|
215
|
+
}
|
|
216
|
+
) : null,
|
|
217
|
+
y !== void 0 || z ? /* @__PURE__ */ s("div", { className: "ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]", children: [
|
|
218
|
+
y !== void 0 ? /* @__PURE__ */ s("div", { className: "ds:flex ds:items-center ds:gap-[var(--spacing-xs)]", children: [
|
|
219
|
+
/* @__PURE__ */ e(
|
|
220
|
+
G,
|
|
221
|
+
{
|
|
222
|
+
state: _,
|
|
223
|
+
amount: y / 100,
|
|
224
|
+
currency: N,
|
|
225
|
+
locale: m,
|
|
226
|
+
size: "md"
|
|
227
|
+
}
|
|
228
|
+
),
|
|
229
|
+
I && f !== void 0 ? /* @__PURE__ */ e("span", { className: "type-meta ds:text-[color:var(--muted-foreground)] ds:line-through ds:tabular-nums", children: $(f) }) : null,
|
|
230
|
+
I && (n == null ? void 0 : n.discountPercentage) !== void 0 ? /* @__PURE__ */ e(c, { variant: "success", size: "sm", children: r("carePlanEntryCard.discountLabel", {
|
|
231
|
+
percentage: n.discountPercentage,
|
|
232
|
+
defaultValue: "-{{percentage}}%"
|
|
233
|
+
}) }) : null
|
|
234
|
+
] }) : null,
|
|
235
|
+
z ? /* @__PURE__ */ s(
|
|
236
|
+
Q,
|
|
237
|
+
{
|
|
238
|
+
variant: "default",
|
|
239
|
+
className: "ds:ms-auto ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]",
|
|
240
|
+
children: [
|
|
241
|
+
/* @__PURE__ */ e(X, { asChild: !0, children: /* @__PURE__ */ s(
|
|
242
|
+
"button",
|
|
243
|
+
{
|
|
244
|
+
type: "button",
|
|
245
|
+
id: T,
|
|
246
|
+
"aria-controls": V,
|
|
247
|
+
className: "ds:group ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)] ds:rounded-[var(--radius-sm)] ds:border-0 ds:bg-transparent type-body-sm ds:text-[color:var(--foreground)] ds:cursor-pointer ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]",
|
|
248
|
+
children: [
|
|
249
|
+
/* @__PURE__ */ e("span", { children: r(
|
|
250
|
+
"carePlanEntryCard.phaseDetail.toggle",
|
|
251
|
+
"Phase detail"
|
|
252
|
+
) }),
|
|
253
|
+
/* @__PURE__ */ e(
|
|
254
|
+
ae,
|
|
255
|
+
{
|
|
256
|
+
"aria-hidden": "true",
|
|
257
|
+
className: "ds:size-4 ds:shrink-0 ds:text-[color:var(--muted-foreground)] ds:transition-transform ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none ds:group-data-[state=open]:rotate-180"
|
|
258
|
+
}
|
|
259
|
+
)
|
|
260
|
+
]
|
|
261
|
+
}
|
|
262
|
+
) }),
|
|
263
|
+
/* @__PURE__ */ e(
|
|
264
|
+
Z,
|
|
265
|
+
{
|
|
266
|
+
id: V,
|
|
267
|
+
"aria-labelledby": T,
|
|
268
|
+
children: /* @__PURE__ */ e("ul", { className: "ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-xs)] ds:p-0", children: (L = a == null ? void 0 : a.detail) == null ? void 0 : L.map((d, W) => /* @__PURE__ */ e(
|
|
269
|
+
de,
|
|
270
|
+
{
|
|
271
|
+
phase: d,
|
|
272
|
+
locale: m
|
|
273
|
+
},
|
|
274
|
+
`${d.label}-${W}`
|
|
275
|
+
)) })
|
|
276
|
+
}
|
|
277
|
+
)
|
|
278
|
+
]
|
|
279
|
+
}
|
|
280
|
+
) : null
|
|
281
|
+
] }) : null
|
|
282
|
+
] })
|
|
283
|
+
}
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
);
|
|
287
|
+
le.displayName = "CarePlanEntryCard";
|
|
288
|
+
function de({
|
|
289
|
+
phase: t,
|
|
290
|
+
locale: o
|
|
291
|
+
}) {
|
|
292
|
+
const { t: l } = R();
|
|
293
|
+
return /* @__PURE__ */ s("li", { className: "ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]", children: [
|
|
294
|
+
/* @__PURE__ */ e(c, { variant: t.executed ? "success" : "neutral", size: "sm", withDot: !0, children: t.executed ? l("carePlanEntryCard.phaseDetail.executed", "Executed") : l("carePlanEntryCard.phaseDetail.pending", "Pending") }),
|
|
295
|
+
/* @__PURE__ */ e("span", { className: "type-body-sm ds:text-[color:var(--foreground)]", children: t.label }),
|
|
296
|
+
t.executed && t.executionDateIso ? /* @__PURE__ */ e(
|
|
297
|
+
b,
|
|
298
|
+
{
|
|
299
|
+
value: t.executionDateIso,
|
|
300
|
+
format: "absolute",
|
|
301
|
+
locale: o
|
|
302
|
+
}
|
|
303
|
+
) : null,
|
|
304
|
+
t.operator ? /* @__PURE__ */ e("span", { className: "type-meta ds:text-[color:var(--muted-foreground)]", children: l("carePlanEntryCard.byOperator", {
|
|
305
|
+
operator: t.operator,
|
|
306
|
+
defaultValue: "by {{operator}}"
|
|
307
|
+
}) }) : null,
|
|
308
|
+
t.udi ? /* @__PURE__ */ e("span", { className: "type-meta ds:text-[color:var(--muted-foreground)] ds:tabular-nums", children: l("carePlanEntryCard.phaseDetail.udi", {
|
|
309
|
+
udi: t.udi,
|
|
310
|
+
defaultValue: "UDI {{udi}}"
|
|
311
|
+
}) }) : null
|
|
312
|
+
] });
|
|
313
|
+
}
|
|
314
|
+
export {
|
|
315
|
+
le as C,
|
|
316
|
+
re as c
|
|
317
|
+
};
|
|
318
|
+
//# sourceMappingURL=care-plan-entry-card-Cnra7vUc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"care-plan-entry-card-Cnra7vUc.js","sources":["../../src/components/care-plan-entry-card/care-plan-entry-card.agent.ts","../../src/components/care-plan-entry-card/care-plan-entry-card.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — CarePlanEntryCard. */\n/* */\n/* Read-only surface: expose the execution flag and phase-progress */\n/* counts so an agent can introspect a treatment line's status. Counts + */\n/* booleans only — never the treatment name, operator, or any patient */\n/* identity. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { CarePlanEntryCardHandle } from './care-plan-entry-card';\n\nexport const carePlanEntryCardAgent: AgentAdapter<CarePlanEntryCardHandle> = {\n id: 'care-plan-entry-card',\n capabilities: ['view_change'],\n state: {\n done: {\n type: 'boolean',\n descriptionKey: 'ui.agent.carePlanEntryCard.state.done',\n description: 'Whether the treatment line is marked executed.',\n read: (handle) => handle.isDone(),\n },\n phaseProgress: {\n type: '{ executed: number; total: number }',\n descriptionKey: 'ui.agent.carePlanEntryCard.state.phaseProgress',\n description:\n 'Phase progress as executed / total counts. Counts only — never phase labels or operator identity.',\n read: (handle) => handle.getPhaseProgress(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'care-plan-entry-card',\n description: 'Marks the CarePlanEntryCard root region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop. Addresses a specific line.',\n },\n },\n};\n","import { forwardRef, useId, type HTMLAttributes, type ReactNode } from 'react';\nimport { type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { ChevronDown } from 'lucide-react';\nimport { Badge } from '../badge/badge';\nimport { Progress } from '../progress/progress';\nimport { Tag } from '../tag/tag';\nimport { Timestamp } from '../timestamp/timestamp';\nimport { TransactionChip } from '../transaction-chip/transaction-chip';\nimport { ToothScheme } from '../tooth-scheme/tooth-scheme';\nimport type { FdiId, ToothCondition } from '../tooth-scheme/tooth-data';\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from '../collapsible/collapsible';\nimport { entitySurfaceVariants } from '../_shared/entity-card';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { carePlanEntryCardAgent } from './care-plan-entry-card.agent';\n\n/* -------------------------------------------------------------------- */\n/* CarePlanEntryCard */\n/* */\n/* A single granular treatment line within a care plan / estimate */\n/* (\"voce di preventivo\"). Replaces the hand-rolled platform treatment */\n/* row that interleaves the treatment label, FDI tooth codes, an */\n/* execution badge, a phase-progress bar, a price chip, and an */\n/* expandable per-phase breakdown. */\n/* */\n/* Composes: entitySurfaceVariants (shared card surface) + Tag / ToothScheme*/\n/* (elements) + Badge (lifecycle flags) + Timestamp (execution / planned) */\n/* + Progress (phases) + TransactionChip (price) + Collapsible (per-phase */\n/* detail). */\n/* */\n/* All visible text flows through useTranslation('ui') against the */\n/* `carePlanEntryCard.*` namespace. Identifiers + structural state only */\n/* reach the agent layer — never patient identity. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\n/** A planned (not-yet-executed) appointment the line is scheduled into. */\nexport interface CarePlanEntryPlannedAppointment {\n /** ISO-8601 date / datetime string. */\n dateIso: string;\n /** Stable appointment id (identifier only — never PHI). */\n appointmentId: string;\n /** Optional deep link to the appointment. */\n url?: string;\n}\n\n/** Price breakdown for the line, all amounts in integer cents. */\nexport interface CarePlanEntryPrice {\n /** List price in cents (non-negative). */\n priceCents?: number;\n /** Discounted price in cents (non-negative), when a discount applies. */\n discountedPriceCents?: number;\n /** Discount percentage (0–100), for the discount label. */\n discountPercentage?: number;\n}\n\n/** One row of the per-phase execution breakdown. */\nexport interface CarePlanEntryPhaseDetail {\n /** Short localised phase label (consumer-localised). */\n label: string;\n /** Whether this phase has been executed. */\n executed: boolean;\n /** ISO-8601 execution date, when executed. */\n executionDateIso?: string;\n /** Operator display name for the phase. */\n operator?: string;\n /** Unique Device Identifier / lot string for traceable materials. */\n udi?: string;\n}\n\n/** Phase progress summary + optional drill-down detail. */\nexport interface CarePlanEntryPhases {\n /** Number of executed phases. */\n executed: number;\n /** Total number of phases. */\n total: number;\n /** Optional per-phase breakdown rendered inside the Collapsible. */\n detail?: CarePlanEntryPhaseDetail[];\n}\n\n/** Operator the line is assigned to. */\nexport interface CarePlanEntryOperator {\n /** Operator display name (consumer-localised). */\n name: string;\n}\n\n/** Curated read-only handle exposed to the agent registry. */\nexport interface CarePlanEntryCardHandle {\n /** Whether the line is marked executed. */\n isDone: () => boolean;\n /** Phase progress as `{ executed, total }` — counts only, no PHI. */\n getPhaseProgress: () => { executed: number; total: number };\n}\n\nexport interface CarePlanEntryCardProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'aria-label' | 'title' | 'children'\n> {\n /**\n * Stable instance id — surfaced as `data-component-id` for the agent\n * registry and used to wire up the heading ↔ region relationship.\n */\n id?: string;\n /** Treatment / service name. Rendered as the line heading. */\n careName: string;\n /** Optional treatment code (e.g. tariff code) shown beside the name. */\n code?: string;\n /** Optional secondary label (e.g. category) under the name. */\n label?: string;\n /** FDI tooth codes the line applies to (e.g. `['16', '36']`). */\n elements?: string[];\n /** Whether the line has been executed / completed. */\n done?: boolean;\n /** ISO-8601 execution date — rendered next to the \"done\" badge. */\n executionDateIso?: string;\n /** A planned appointment the line is scheduled into, when not yet done. */\n plannedAppointment?: CarePlanEntryPlannedAppointment;\n /** Operator the line is assigned to. */\n operator?: CarePlanEntryOperator;\n /** Price breakdown (list / discounted). */\n price?: CarePlanEntryPrice;\n /** Phase progress + optional drill-down detail. */\n phases?: CarePlanEntryPhases;\n /** Whether the line has been billed / invoiced. */\n billed?: boolean;\n /** Whether the line falls outside the accepted estimate. */\n outsideOfEstimate?: boolean;\n /** Count of attached notes — rendered as a neutral count badge when > 0. */\n notesCount?: number;\n /**\n * How to render `elements`: `'chips'` (default) lists each FDI code as a\n * Tag; `'scheme'` renders a read-only `ToothScheme` highlighting them.\n */\n toothDisplay?: 'scheme' | 'chips';\n /** BCP 47 locale override for dates / currency. Defaults to i18n.language. */\n locale?: string;\n /** ISO 4217 currency code for the price chip. Defaults to `EUR`. */\n currency?: string;\n /**\n * `elevated` (default) paints the kit card chrome; `flat` drops it for use\n * inside an existing Card / Sheet.\n */\n surface?: 'flat' | 'elevated';\n /** Accessible label override for the line region. */\n 'aria-label'?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------- */\n\nconst DEFAULT_CURRENCY = 'EUR';\n\n/**\n * Map the FDI element codes to a `ToothScheme` conditions shortcut. Codes\n * outside the FDI vocabulary are dropped (the scheme ignores unknown ids).\n * Every applied tooth is flagged `filled` so the display-mode chart marks\n * them with both colour and pattern — colour-not-alone.\n */\nfunction elementsToConditions(\n elements: string[],\n): Partial<Record<FdiId, ToothCondition[]>> {\n const conditions: Partial<Record<FdiId, ToothCondition[]>> = {};\n for (const code of elements) {\n conditions[code as FdiId] = ['filled'];\n }\n return conditions;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const CarePlanEntryCard = forwardRef<\n HTMLDivElement,\n CarePlanEntryCardProps\n>(\n (\n {\n id,\n careName,\n code,\n label,\n elements,\n done = false,\n executionDateIso,\n plannedAppointment,\n operator,\n price,\n phases,\n billed = false,\n outsideOfEstimate = false,\n notesCount,\n toothDisplay = 'chips',\n locale,\n currency = DEFAULT_CURRENCY,\n surface = 'elevated',\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const headingId = useId();\n const phasesLabelId = useId();\n const detailTriggerId = useId();\n const detailContentId = useId();\n const activeLocale = locale ?? i18n.language ?? 'en';\n\n useAgentRegistration(\n carePlanEntryCardAgent,\n {\n isDone: () => done,\n getPhaseProgress: () => ({\n executed: phases?.executed ?? 0,\n total: phases?.total ?? 0,\n }),\n },\n id,\n );\n\n const hasElements = !!elements && elements.length > 0;\n const hasPhaseDetail = !!phases?.detail && phases.detail.length > 0;\n\n // Price: prefer the discounted amount when present; show the list price\n // struck through beside it. Both are \"to-invoice\" until billed, then\n // settled.\n const priceState = billed ? 'settled' : 'to-invoice';\n const listCents = price?.priceCents;\n const discountedCents = price?.discountedPriceCents;\n const hasDiscount =\n discountedCents !== undefined &&\n listCents !== undefined &&\n discountedCents < listCents;\n const payableCents = discountedCents ?? listCents;\n\n const formatMoney = (cents: number): string =>\n new Intl.NumberFormat(activeLocale, {\n style: 'currency',\n currency,\n }).format(cents / 100);\n\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabel ? undefined : headingId}\n data-component=\"care-plan-entry-card\"\n data-component-id={id}\n data-done={done ? 'true' : 'false'}\n id={id}\n className={entitySurfaceVariants({ surface, className })}\n {...rest}\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {/* Heading row: name + code + trailing status flags */}\n <div className=\"ds:flex ds:items-start ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-baseline ds:gap-[var(--spacing-xs)]\">\n <h3\n id={headingId}\n className=\"type-title-item ds:m-0 ds:text-[color:var(--foreground)]\"\n >\n {careName}\n </h3>\n {code ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)] ds:tabular-nums\">\n {code}\n </span>\n ) : null}\n </div>\n {label ? (\n <span className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {label}\n </span>\n ) : null}\n </div>\n\n <div className=\"ds:flex ds:shrink-0 ds:flex-wrap ds:items-center ds:justify-end ds:gap-[var(--spacing-2xs)]\">\n {done ? (\n <Badge variant=\"success\" size=\"sm\" withDot>\n {t('carePlanEntryCard.flag.done', 'Done')}\n </Badge>\n ) : null}\n {outsideOfEstimate ? (\n <Badge variant=\"warning\" size=\"sm\" withDot>\n {t(\n 'carePlanEntryCard.flag.outsideOfEstimate',\n 'Outside estimate',\n )}\n </Badge>\n ) : null}\n {billed ? (\n <Badge variant=\"neutral\" size=\"sm\">\n {t('carePlanEntryCard.flag.billed', 'Billed')}\n </Badge>\n ) : null}\n {typeof notesCount === 'number' && notesCount > 0 ? (\n <Badge\n variant=\"neutral\"\n size=\"sm\"\n aria-label={t('carePlanEntryCard.notesLabel', {\n count: notesCount,\n defaultValue: '{{count}} notes',\n })}\n >\n {notesCount}\n </Badge>\n ) : null}\n </div>\n </div>\n\n {/* Elements: tooth scheme (display mode) or FDI tag chips */}\n {hasElements ? (\n toothDisplay === 'scheme' ? (\n <ToothScheme\n mode=\"display\"\n conditions={elementsToConditions(elements)}\n ariaLabel={t('carePlanEntryCard.toothSchemeLabel', {\n count: elements.length,\n defaultValue: 'Teeth involved: {{count}}',\n })}\n />\n ) : (\n <div\n role=\"list\"\n aria-label={t(\n 'carePlanEntryCard.elementsLabel',\n 'Teeth involved',\n )}\n className=\"ds:flex ds:flex-wrap ds:gap-[var(--spacing-2xs)]\"\n >\n {elements.map((element) => (\n <div role=\"listitem\" key={element}>\n <Tag label={element} variant=\"info\" size=\"sm\" />\n </div>\n ))}\n </div>\n )\n ) : null}\n\n {/* Schedule / execution line */}\n {done && executionDateIso ? (\n <p className=\"type-body-sm ds:m-0 ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]\">\n <span>{t('carePlanEntryCard.executedOn', 'Executed on')}</span>\n <Timestamp\n value={executionDateIso}\n format=\"absolute\"\n locale={activeLocale}\n />\n {operator ? (\n <span>\n {t('carePlanEntryCard.byOperator', {\n operator: operator.name,\n defaultValue: 'by {{operator}}',\n })}\n </span>\n ) : null}\n </p>\n ) : plannedAppointment ? (\n <p className=\"type-body-sm ds:m-0 ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]\">\n <span>{t('carePlanEntryCard.plannedFor', 'Planned for')}</span>\n <Timestamp\n value={plannedAppointment.dateIso}\n format=\"absolute\"\n locale={activeLocale}\n />\n {operator ? (\n <span>\n {t('carePlanEntryCard.byOperator', {\n operator: operator.name,\n defaultValue: 'by {{operator}}',\n })}\n </span>\n ) : null}\n </p>\n ) : operator ? (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('carePlanEntryCard.assignedTo', {\n operator: operator.name,\n defaultValue: 'Assigned to {{operator}}',\n })}\n </p>\n ) : null}\n\n {/* Phase progress */}\n {phases && phases.total > 0 ? (\n <Progress\n value={phases.executed}\n max={phases.total}\n size=\"sm\"\n aria-label={t('carePlanEntryCard.phasesLabel', {\n executed: phases.executed,\n total: phases.total,\n defaultValue: 'Phases: {{executed}} of {{total}} executed',\n })}\n >\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <Progress.Label id={phasesLabelId}>\n {t('carePlanEntryCard.phasesHeading', 'Phases')}\n </Progress.Label>\n <span className=\"type-body-sm ds:tabular-nums ds:text-[color:var(--muted-foreground)]\">\n {t('carePlanEntryCard.phasesCount', {\n executed: phases.executed,\n total: phases.total,\n defaultValue: '{{executed}} / {{total}}',\n })}\n </span>\n </div>\n </Progress>\n ) : null}\n\n {/* Footer: price + (optional) phase-detail disclosure */}\n {payableCents !== undefined || hasPhaseDetail ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n {payableCents !== undefined ? (\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <TransactionChip\n state={priceState}\n amount={payableCents / 100}\n currency={currency}\n locale={activeLocale}\n size=\"md\"\n />\n {hasDiscount && listCents !== undefined ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)] ds:line-through ds:tabular-nums\">\n {formatMoney(listCents)}\n </span>\n ) : null}\n {hasDiscount && price?.discountPercentage !== undefined ? (\n <Badge variant=\"success\" size=\"sm\">\n {t('carePlanEntryCard.discountLabel', {\n percentage: price.discountPercentage,\n defaultValue: '-{{percentage}}%',\n })}\n </Badge>\n ) : null}\n </div>\n ) : null}\n\n {hasPhaseDetail ? (\n <Collapsible\n variant=\"default\"\n className=\"ds:ms-auto ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n <CollapsibleTrigger asChild>\n <button\n type=\"button\"\n id={detailTriggerId}\n aria-controls={detailContentId}\n className=\"ds:group ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)] ds:rounded-[var(--radius-sm)] ds:border-0 ds:bg-transparent type-body-sm ds:text-[color:var(--foreground)] ds:cursor-pointer ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]\"\n >\n <span>\n {t(\n 'carePlanEntryCard.phaseDetail.toggle',\n 'Phase detail',\n )}\n </span>\n <ChevronDown\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0 ds:text-[color:var(--muted-foreground)] ds:transition-transform ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none ds:group-data-[state=open]:rotate-180\"\n />\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent\n id={detailContentId}\n aria-labelledby={detailTriggerId}\n >\n <ul className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-xs)] ds:p-0\">\n {phases?.detail?.map((phase, index) => (\n <PhaseDetailRow\n key={`${phase.label}-${index}`}\n phase={phase}\n locale={activeLocale}\n />\n ))}\n </ul>\n </CollapsibleContent>\n </Collapsible>\n ) : null}\n </div>\n ) : null}\n </div>\n </div>\n );\n },\n);\n\nCarePlanEntryCard.displayName = 'CarePlanEntryCard';\n\n/* -------------------------------------------------------------------- */\n/* PhaseDetailRow — one row inside the per-phase Collapsible */\n/* -------------------------------------------------------------------- */\n\nfunction PhaseDetailRow({\n phase,\n locale,\n}: {\n phase: CarePlanEntryPhaseDetail;\n locale: string;\n}): ReactNode {\n const { t } = useTranslation();\n return (\n <li className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n <Badge variant={phase.executed ? 'success' : 'neutral'} size=\"sm\" withDot>\n {phase.executed\n ? t('carePlanEntryCard.phaseDetail.executed', 'Executed')\n : t('carePlanEntryCard.phaseDetail.pending', 'Pending')}\n </Badge>\n <span className=\"type-body-sm ds:text-[color:var(--foreground)]\">\n {phase.label}\n </span>\n {phase.executed && phase.executionDateIso ? (\n <Timestamp\n value={phase.executionDateIso}\n format=\"absolute\"\n locale={locale}\n />\n ) : null}\n {phase.operator ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {t('carePlanEntryCard.byOperator', {\n operator: phase.operator,\n defaultValue: 'by {{operator}}',\n })}\n </span>\n ) : null}\n {phase.udi ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)] ds:tabular-nums\">\n {t('carePlanEntryCard.phaseDetail.udi', {\n udi: phase.udi,\n defaultValue: 'UDI {{udi}}',\n })}\n </span>\n ) : null}\n </li>\n );\n}\n\nexport type CarePlanEntryCardSurface = NonNullable<\n VariantProps<typeof entitySurfaceVariants>['surface']\n>;\n"],"names":["carePlanEntryCardAgent","handle","DEFAULT_CURRENCY","elementsToConditions","elements","conditions","code","CarePlanEntryCard","forwardRef","id","careName","label","done","executionDateIso","plannedAppointment","operator","price","phases","billed","outsideOfEstimate","notesCount","toothDisplay","locale","currency","surface","ariaLabel","className","rest","ref","t","i18n","useTranslation","headingId","useId","phasesLabelId","detailTriggerId","detailContentId","activeLocale","useAgentRegistration","hasElements","hasPhaseDetail","priceState","listCents","discountedCents","hasDiscount","payableCents","formatMoney","cents","jsx","entitySurfaceVariants","jsxs","Badge","ToothScheme","element","Tag","Timestamp","Progress","TransactionChip","Collapsible","CollapsibleTrigger","ChevronDown","CollapsibleContent","phase","index","PhaseDetailRow"],"mappings":"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"}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { jsxs as d, jsx as a } from "react/jsx-runtime";
|
|
2
|
-
import { forwardRef as
|
|
2
|
+
import { forwardRef as T, useMemo as z, Fragment as l } from "react";
|
|
3
3
|
import { c as h } from "./index-D2ZczOXr.js";
|
|
4
|
-
import { useTranslation as
|
|
4
|
+
import { useTranslation as B } from "react-i18next";
|
|
5
5
|
import { B as F } from "./button-DD_0Xdmr.js";
|
|
6
6
|
import { A as I } from "./avatar-BNQNhoyL.js";
|
|
7
7
|
import { T as A } from "./timestamp-BV2lC-wV.js";
|
|
8
|
-
import { s as
|
|
9
|
-
import { s as
|
|
10
|
-
import { R as
|
|
11
|
-
import { C as
|
|
12
|
-
import { C as
|
|
13
|
-
import { C as
|
|
14
|
-
const
|
|
8
|
+
import { s as M, C as S } from "./code-block-HoddNOKJ.js";
|
|
9
|
+
import { s as V } from "./safe-image-src-DstKgCo7.js";
|
|
10
|
+
import { R as D } from "./rotate-ccw-BWANpitO.js";
|
|
11
|
+
import { C as E } from "./clock-21AGPWJ5.js";
|
|
12
|
+
import { C as L } from "./check-DPdL_Sm7.js";
|
|
13
|
+
import { C as R } from "./circle-alert-ChA9opNA.js";
|
|
14
|
+
const _ = h(
|
|
15
15
|
"ds:flex ds:w-full ds:items-start ds:gap-[var(--spacing-sm)]",
|
|
16
16
|
{
|
|
17
17
|
variants: {
|
|
@@ -23,7 +23,7 @@ const R = h(
|
|
|
23
23
|
},
|
|
24
24
|
defaultVariants: { role: "assistant" }
|
|
25
25
|
}
|
|
26
|
-
),
|
|
26
|
+
), $ = h(
|
|
27
27
|
[
|
|
28
28
|
// Cap at 42rem on wide surfaces; on narrow docks (Alia sidebar ≈22rem)
|
|
29
29
|
// leave room for the avatar column (size-8 = 32px = --spacing-xl) +
|
|
@@ -45,8 +45,8 @@ const R = h(
|
|
|
45
45
|
},
|
|
46
46
|
defaultVariants: { role: "assistant" }
|
|
47
47
|
}
|
|
48
|
-
),
|
|
49
|
-
function
|
|
48
|
+
), k = /^(https?:|mailto:)/i;
|
|
49
|
+
function H(n) {
|
|
50
50
|
const e = [];
|
|
51
51
|
let s = n;
|
|
52
52
|
const t = /\*\*([^*]+)\*\*|`([^`]+)`|\[([^\]]+)\]\(([^)]+)\)|\n/;
|
|
@@ -60,8 +60,8 @@ function k(n) {
|
|
|
60
60
|
}
|
|
61
61
|
return e;
|
|
62
62
|
}
|
|
63
|
-
function
|
|
64
|
-
return
|
|
63
|
+
function q(n) {
|
|
64
|
+
return H(n).map((e, s) => e.type === "bold" ? /* @__PURE__ */ a("strong", { children: e.value }, s) : e.type === "code" ? /* @__PURE__ */ a(
|
|
65
65
|
"code",
|
|
66
66
|
{
|
|
67
67
|
dir: "ltr",
|
|
@@ -69,7 +69,7 @@ function H(n) {
|
|
|
69
69
|
children: e.value
|
|
70
70
|
},
|
|
71
71
|
s
|
|
72
|
-
) : e.type === "br" ? /* @__PURE__ */ a("br", {}, s) : e.type === "link" ?
|
|
72
|
+
) : e.type === "br" ? /* @__PURE__ */ a("br", {}, s) : e.type === "link" ? k.test(e.href) ? /* @__PURE__ */ a(
|
|
73
73
|
"a",
|
|
74
74
|
{
|
|
75
75
|
href: e.href,
|
|
@@ -81,10 +81,10 @@ function H(n) {
|
|
|
81
81
|
s
|
|
82
82
|
) : /* @__PURE__ */ a(l, { children: e.label }, s) : /* @__PURE__ */ a(l, { children: e.value }, s));
|
|
83
83
|
}
|
|
84
|
-
function
|
|
85
|
-
return
|
|
84
|
+
function G(n) {
|
|
85
|
+
return M(n).map((e, s) => e.type === "code" ? /* @__PURE__ */ a(S, { code: e.value, language: e.lang }, s) : /* @__PURE__ */ a(l, { children: q(e.value) }, s));
|
|
86
86
|
}
|
|
87
|
-
const
|
|
87
|
+
const J = T(
|
|
88
88
|
({
|
|
89
89
|
role: n,
|
|
90
90
|
content: e,
|
|
@@ -94,18 +94,19 @@ const G = j(
|
|
|
94
94
|
renderMarkdown: x = !1,
|
|
95
95
|
onRetry: m,
|
|
96
96
|
actions: c,
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
97
|
+
body: b,
|
|
98
|
+
className: y,
|
|
99
|
+
...N
|
|
100
|
+
}, w) => {
|
|
101
|
+
const { t: i, i18n: u } = B(), o = z(() => {
|
|
101
102
|
if (!t) return null;
|
|
102
103
|
const v = t instanceof Date ? t : new Date(t);
|
|
103
104
|
return Number.isNaN(v.getTime()) ? null : new Intl.DateTimeFormat(u.language, {
|
|
104
105
|
hour: "2-digit",
|
|
105
106
|
minute: "2-digit"
|
|
106
107
|
}).format(v);
|
|
107
|
-
}, [t, u.language]), f = i(`chat.message.role.${n}`),
|
|
108
|
-
|
|
108
|
+
}, [t, u.language]), f = i(`chat.message.role.${n}`), C = o ? i("chat.message.label", { role: f, time: o }) : i("chat.message.labelNoTime", { role: f }), j = b ?? (x ? G(e) : e), p = !r || r === "edited" ? null : r === "sending" ? /* @__PURE__ */ a(E, { "aria-hidden": "true", className: "ds:size-3.5" }) : r === "sent" ? /* @__PURE__ */ a(L, { "aria-hidden": "true", className: "ds:size-3.5" }) : /* @__PURE__ */ a(
|
|
109
|
+
R,
|
|
109
110
|
{
|
|
110
111
|
"aria-hidden": "true",
|
|
111
112
|
className: "ds:size-3.5 ds:text-[color:var(--destructive)]"
|
|
@@ -114,18 +115,18 @@ const G = j(
|
|
|
114
115
|
return /* @__PURE__ */ d(
|
|
115
116
|
"article",
|
|
116
117
|
{
|
|
117
|
-
ref:
|
|
118
|
-
"aria-label":
|
|
118
|
+
ref: w,
|
|
119
|
+
"aria-label": C,
|
|
119
120
|
"data-component": "chat-message",
|
|
120
121
|
className: [
|
|
121
|
-
|
|
122
|
+
_({ role: n, className: y }),
|
|
122
123
|
// Entrance: fade + slide up on mount. `--animation-duration` is 0ms
|
|
123
124
|
// under `prefers-reduced-motion` and `.theme-accessible`, so both
|
|
124
125
|
// collapse the animation to an instant state change automatically.
|
|
125
126
|
"ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:slide-in-from-bottom-2",
|
|
126
127
|
"ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]"
|
|
127
128
|
].join(" "),
|
|
128
|
-
...
|
|
129
|
+
...N,
|
|
129
130
|
children: [
|
|
130
131
|
n !== "system" && s ? s.slot ? (
|
|
131
132
|
// Consumer-supplied avatar node (e.g. Alia's Sparkles tile).
|
|
@@ -138,7 +139,7 @@ const G = j(
|
|
|
138
139
|
I,
|
|
139
140
|
{
|
|
140
141
|
name: s.name,
|
|
141
|
-
src:
|
|
142
|
+
src: V(s.src),
|
|
142
143
|
size: "sm"
|
|
143
144
|
}
|
|
144
145
|
)
|
|
@@ -160,14 +161,14 @@ const G = j(
|
|
|
160
161
|
{
|
|
161
162
|
dir: "auto",
|
|
162
163
|
className: [
|
|
163
|
-
|
|
164
|
+
$({ role: n }),
|
|
164
165
|
// `break-words` (from bubbleVariants) handles soft hyphens;
|
|
165
166
|
// `overflow-wrap: anywhere` is the last-resort break for
|
|
166
167
|
// URLs, hashes, or CJK runs that would otherwise push the
|
|
167
168
|
// bubble wider than its parent in narrow docks like Alia.
|
|
168
169
|
"ds:[overflow-wrap:anywhere]"
|
|
169
170
|
].join(" "),
|
|
170
|
-
children:
|
|
171
|
+
children: j
|
|
171
172
|
}
|
|
172
173
|
),
|
|
173
174
|
(o || g) && n !== "system" ? /* @__PURE__ */ d(
|
|
@@ -213,7 +214,7 @@ const G = j(
|
|
|
213
214
|
intent: "ghost",
|
|
214
215
|
size: "sm",
|
|
215
216
|
onClick: m,
|
|
216
|
-
startIcon: /* @__PURE__ */ a(
|
|
217
|
+
startIcon: /* @__PURE__ */ a(D, {}),
|
|
217
218
|
children: i("chat.message.retry")
|
|
218
219
|
}
|
|
219
220
|
) : null
|
|
@@ -229,8 +230,8 @@ const G = j(
|
|
|
229
230
|
);
|
|
230
231
|
}
|
|
231
232
|
);
|
|
232
|
-
|
|
233
|
+
J.displayName = "ChatMessage";
|
|
233
234
|
export {
|
|
234
|
-
|
|
235
|
+
J as C
|
|
235
236
|
};
|
|
236
|
-
//# sourceMappingURL=chat-message-
|
|
237
|
+
//# sourceMappingURL=chat-message-Dm8U2RY1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-message-Dm8U2RY1.js","sources":["../../src/components/chat-message/chat-message.tsx"],"sourcesContent":["import {\n forwardRef,\n Fragment,\n useMemo,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { AlertCircle, Check, Clock, RotateCcw } from 'lucide-react';\nimport { Button } from '../button';\nimport { Avatar } from '../avatar';\nimport { Timestamp } from '../timestamp';\nimport { safeImageSrc } from '../_shared';\nimport { CodeBlock, splitCodeFences } from '../_shared/code-block';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport type ChatMessageRole = 'user' | 'assistant' | 'system';\nexport type ChatMessageStatus = 'sending' | 'sent' | 'error' | 'edited';\n\nexport interface ChatMessageAvatar {\n name?: string;\n src?: string;\n /**\n * Optional custom avatar node. When provided, it REPLACES the built-in\n * `<Avatar>` (initials / image) for this message. Used by the Alia\n * pattern to render a Sparkles identity tile instead of an avatar, and\n * by consumers that want to swap in a user-icon chip, brand glyph, etc.\n * The caller is responsible for accessible labelling on the custom node\n * — ChatMessage's own `aria-label` already announces the role/time, so\n * purely decorative nodes can be `aria-hidden`.\n */\n slot?: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst rowVariants = cva(\n 'ds:flex ds:w-full ds:items-start ds:gap-[var(--spacing-sm)]',\n {\n variants: {\n role: {\n user: 'ds:flex-row-reverse',\n assistant: 'ds:flex-row',\n system: 'ds:flex-col ds:items-center ds:text-center',\n },\n },\n defaultVariants: { role: 'assistant' },\n },\n);\n\nconst bubbleVariants = cva(\n [\n // Cap at 42rem on wide surfaces; on narrow docks (Alia sidebar ≈22rem)\n // leave room for the avatar column (size-8 = 32px = --spacing-xl) +\n // `gap-sm` (8px = --spacing-sm) so avatars don't clip off the inline\n // edge when the row is width-constrained.\n 'ds:relative ds:max-w-[min(42rem,calc(100%-var(--spacing-xl)-var(--spacing-sm)))]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'type-body',\n 'ds:break-words',\n ].join(' '),\n {\n variants: {\n role: {\n user: 'ds:bg-[color:var(--primary)] ds:text-[color:var(--primary-foreground)] ds:rounded-[var(--radius-md)] ds:rounded-ee-[var(--radius-sm)]',\n assistant:\n 'ds:bg-muted/40 ds:text-foreground ds:rounded-[var(--radius-md)] ds:rounded-es-[var(--radius-sm)]',\n system:\n 'ds:bg-transparent ds:text-[color:var(--muted-foreground)] type-body-sm ds:italic',\n },\n },\n defaultVariants: { role: 'assistant' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Safe markdown-ish (bold, inline code, line-breaks, links as text) */\n/* No dangerouslySetInnerHTML. */\n/* ------------------------------------------------------------------ */\n\ntype Token =\n | { type: 'text'; value: string }\n | { type: 'bold'; value: string }\n | { type: 'code'; value: string }\n | { type: 'br' }\n | { type: 'link'; label: string; href: string };\n\nconst SAFE_SCHEMES = /^(https?:|mailto:)/i;\n\nfunction tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let remaining = input;\n const pattern = /\\*\\*([^*]+)\\*\\*|`([^`]+)`|\\[([^\\]]+)\\]\\(([^)]+)\\)|\\n/;\n while (remaining.length > 0) {\n const match = pattern.exec(remaining);\n if (!match) {\n tokens.push({ type: 'text', value: remaining });\n break;\n }\n if (match.index > 0) {\n tokens.push({ type: 'text', value: remaining.slice(0, match.index) });\n }\n if (match[1] !== undefined) {\n tokens.push({ type: 'bold', value: match[1] });\n } else if (match[2] !== undefined) {\n tokens.push({ type: 'code', value: match[2] });\n } else if (match[3] !== undefined && match[4] !== undefined) {\n tokens.push({ type: 'link', label: match[3], href: match[4] });\n } else {\n tokens.push({ type: 'br' });\n }\n remaining = remaining.slice(match.index + match[0].length);\n }\n return tokens;\n}\n\nfunction renderInline(input: string): ReactNode {\n return tokenize(input).map((tok, i) => {\n if (tok.type === 'bold') return <strong key={i}>{tok.value}</strong>;\n if (tok.type === 'code') {\n return (\n <code\n key={i}\n dir=\"ltr\"\n className=\"ds:rounded-[var(--radius-sm)] ds:bg-muted/30 ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:font-[family-name:var(--font-mono)]\"\n >\n {tok.value}\n </code>\n );\n }\n if (tok.type === 'br') return <br key={i} />;\n if (tok.type === 'link') {\n if (!SAFE_SCHEMES.test(tok.href)) {\n // Unsafe scheme (javascript:, data:) — render as inert text.\n return <Fragment key={i}>{tok.label}</Fragment>;\n }\n return (\n <a\n key={i}\n href={tok.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"ds:underline ds:underline-offset-2 ds:hover:opacity-80\"\n >\n {tok.label}\n </a>\n );\n }\n return <Fragment key={i}>{tok.value}</Fragment>;\n });\n}\n\n/**\n * Render a message body: split fenced code blocks out to `<CodeBlock>` and run\n * the inline tokenizer over the surrounding text runs.\n */\nfunction renderBody(input: string): ReactNode {\n return splitCodeFences(input).map((seg, i) => {\n if (seg.type === 'code') {\n return <CodeBlock key={i} code={seg.value} language={seg.lang} />;\n }\n return <Fragment key={i}>{renderInline(seg.value)}</Fragment>;\n });\n}\n\n/* ------------------------------------------------------------------ */\n/* ChatMessage */\n/* ------------------------------------------------------------------ */\n\ntype NativeProps = Omit<HTMLAttributes<HTMLElement>, 'content' | 'role'>;\n\nexport interface ChatMessageProps\n extends NativeProps, VariantProps<typeof bubbleVariants> {\n role: ChatMessageRole;\n content: string;\n avatar?: ChatMessageAvatar;\n timestamp?: Date | number | string;\n status?: ChatMessageStatus;\n /** Parse a small, safe subset of markdown. Never renders raw HTML. */\n renderMarkdown?: boolean;\n /** Invoked when the retry button is activated (error status only). */\n onRetry?: () => void;\n /**\n * Optional action row rendered beneath the message body + timestamp,\n * aligned with the message (e.g. the Alia pattern's Copy / Download\n * buttons on assistant messages). Default off → renders nothing.\n */\n actions?: ReactNode;\n /**\n * Custom body node rendered verbatim INSTEAD of `content`. When set, the\n * markdown tokenizer (`renderBody`) is skipped and the node is rendered\n * directly inside the bubble. `content` is still required (used for the\n * aria-label context and consumer copy / download). Default off.\n */\n body?: ReactNode;\n}\n\nexport const ChatMessage = forwardRef<HTMLElement, ChatMessageProps>(\n (\n {\n role,\n content,\n avatar,\n timestamp,\n status,\n renderMarkdown = false,\n onRetry,\n actions,\n body,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n\n // Local format — used for the aria-label interpolation only. Visible\n // label is rendered by `<Timestamp>` below, which computes the same\n // locale-aware HH:MM internally.\n const formattedTime = useMemo(() => {\n if (!timestamp) return null;\n const date = timestamp instanceof Date ? timestamp : new Date(timestamp);\n if (Number.isNaN(date.getTime())) return null;\n return new Intl.DateTimeFormat(i18n.language, {\n hour: '2-digit',\n minute: '2-digit',\n }).format(date);\n }, [timestamp, i18n.language]);\n\n const roleLabel = t(`chat.message.role.${role}`);\n const messageLabel = formattedTime\n ? t('chat.message.label', { role: roleLabel, time: formattedTime })\n : t('chat.message.labelNoTime', { role: roleLabel });\n\n const resolvedBody =\n body ?? (renderMarkdown ? renderBody(content) : content);\n\n const statusIcon = (() => {\n if (!status || status === 'edited') return null;\n if (status === 'sending')\n return <Clock aria-hidden=\"true\" className=\"ds:size-3.5\" />;\n if (status === 'sent')\n return <Check aria-hidden=\"true\" className=\"ds:size-3.5\" />;\n return (\n <AlertCircle\n aria-hidden=\"true\"\n className=\"ds:size-3.5 ds:text-[color:var(--destructive)]\"\n />\n );\n })();\n\n const statusText = status ? t(`chat.message.status.${status}`) : null;\n\n return (\n <article\n ref={ref}\n aria-label={messageLabel}\n data-component=\"chat-message\"\n className={[\n rowVariants({ role, className }),\n // Entrance: fade + slide up on mount. `--animation-duration` is 0ms\n // under `prefers-reduced-motion` and `.theme-accessible`, so both\n // collapse the animation to an instant state change automatically.\n 'ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:slide-in-from-bottom-2',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n ].join(' ')}\n {...rest}\n >\n {role !== 'system' && avatar ? (\n avatar.slot ? (\n // Consumer-supplied avatar node (e.g. Alia's Sparkles tile).\n avatar.slot\n ) : (\n // Allow-list the src: LLM-supplied values can carry\n // `javascript:` / `data:text/html` / `data:image/svg+xml` and so\n // are scrubbed here before reaching <Avatar>. Fallback to initials.\n <Avatar\n name={avatar.name}\n src={safeImageSrc(avatar.src)}\n size=\"sm\"\n />\n )\n ) : null}\n\n <div\n className={[\n // min-w-0 allows this flex item to shrink below its content's\n // natural width — without it, a single unbreakable token (URL,\n // CJK run, hash) can force the bubble wider than the parent\n // and spill outside narrow containers like the Alia sidebar.\n 'ds:flex ds:flex-col ds:min-w-0',\n role === 'user'\n ? 'ds:items-end'\n : role === 'assistant'\n ? 'ds:items-start'\n : 'ds:items-center',\n ].join(' ')}\n >\n <div\n dir=\"auto\"\n className={[\n bubbleVariants({ role }),\n // `break-words` (from bubbleVariants) handles soft hyphens;\n // `overflow-wrap: anywhere` is the last-resort break for\n // URLs, hashes, or CJK runs that would otherwise push the\n // bubble wider than its parent in narrow docks like Alia.\n 'ds:[overflow-wrap:anywhere]',\n ].join(' ')}\n >\n {resolvedBody}\n </div>\n\n {(formattedTime || statusText) && role !== 'system' ? (\n <div\n className={[\n 'ds:mt-[var(--spacing-xs)] ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'type-meta ds:text-[color:var(--muted-foreground)]',\n ].join(' ')}\n >\n {timestamp ? (\n <Timestamp\n value={timestamp}\n format=\"absolute\"\n absoluteFormat={{ hour: '2-digit', minute: '2-digit' }}\n dir=\"ltr\"\n />\n ) : null}\n {statusIcon ? (\n // `key={status}` re-mounts the span on every status change so\n // `animate-in` re-runs — gives the sending → sent → error\n // swap a subtle cross-fade instead of an abrupt pop.\n <span\n key={status}\n className={[\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:motion-safe:animate-in ds:motion-safe:fade-in-0',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n ].join(' ')}\n >\n {statusIcon}\n <span className=\"ds:sr-only\">{statusText}</span>\n </span>\n ) : null}\n {status === 'error' && onRetry ? (\n <Button\n intent=\"ghost\"\n size=\"sm\"\n onClick={onRetry}\n startIcon={<RotateCcw />}\n >\n {t('chat.message.retry')}\n </Button>\n ) : null}\n </div>\n ) : null}\n {actions ? (\n <div className=\"ds:mt-[var(--spacing-xs)] ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {actions}\n </div>\n ) : null}\n </div>\n </article>\n );\n },\n);\n\nChatMessage.displayName = 'ChatMessage';\n"],"names":["rowVariants","cva","bubbleVariants","SAFE_SCHEMES","tokenize","input","tokens","remaining","pattern","match","renderInline","tok","i","jsx","Fragment","renderBody","splitCodeFences","seg","CodeBlock","ChatMessage","forwardRef","role","content","avatar","timestamp","status","renderMarkdown","onRetry","actions","body","className","rest","ref","t","i18n","useTranslation","formattedTime","useMemo","date","roleLabel","messageLabel","resolvedBody","statusIcon","Clock","Check","AlertCircle","statusText","jsxs","Avatar","safeImageSrc","Timestamp","Button","RotateCcw"],"mappings":"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"}
|