@alfadocs/ui-kit-debug 1.50.0 → 1.51.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/{actions-cell-renderer-DMittsR3.js → actions-cell-renderer-DBI33cMp.js} +4 -4
- package/dist/_chunks/{actions-cell-renderer-DMittsR3.js.map → actions-cell-renderer-DBI33cMp.js.map} +1 -1
- package/dist/_chunks/{agenda-tray-BhZASyJm.js → agenda-tray-CGhEEnFE.js} +3 -3
- package/dist/_chunks/{agenda-tray-BhZASyJm.js.map → agenda-tray-CGhEEnFE.js.map} +1 -1
- package/dist/_chunks/{ai-credits-notice-C-kz_RrY.js → ai-credits-notice-C9K_ley1.js} +3 -3
- package/dist/_chunks/{ai-credits-notice-C-kz_RrY.js.map → ai-credits-notice-C9K_ley1.js.map} +1 -1
- package/dist/_chunks/{ai-permission-notice-BRZeS3mT.js → ai-permission-notice-DMG1o4Qa.js} +2 -2
- package/dist/_chunks/{ai-permission-notice-BRZeS3mT.js.map → ai-permission-notice-DMG1o4Qa.js.map} +1 -1
- package/dist/_chunks/{ai-prompt-input-CxvnXsAs.js → ai-prompt-input-ucwO-z8g.js} +2 -2
- package/dist/_chunks/{ai-prompt-input-CxvnXsAs.js.map → ai-prompt-input-ucwO-z8g.js.map} +1 -1
- package/dist/_chunks/{alia-sidebar-Dx-oeOV2.js → alia-sidebar-K3gaNH94.js} +7 -7
- package/dist/_chunks/{alia-sidebar-Dx-oeOV2.js.map → alia-sidebar-K3gaNH94.js.map} +1 -1
- package/dist/_chunks/{anamnesis-card-D8Si-2GV.js → anamnesis-card-CPjry4ur.js} +2 -2
- package/dist/_chunks/{anamnesis-card-D8Si-2GV.js.map → anamnesis-card-CPjry4ur.js.map} +1 -1
- package/dist/_chunks/{anamnesis-summary-rows-CZirLRuv.js → anamnesis-summary-rows-D9LZZHLw.js} +9 -9
- package/dist/_chunks/{anamnesis-summary-rows-CZirLRuv.js.map → anamnesis-summary-rows-D9LZZHLw.js.map} +1 -1
- package/dist/_chunks/{appointment-card-BgLpE6T5.js → appointment-card-DETaIfBb.js} +2 -2
- package/dist/_chunks/{appointment-card-BgLpE6T5.js.map → appointment-card-DETaIfBb.js.map} +1 -1
- package/dist/_chunks/{appointment-peek-Dk11UOVW.js → appointment-peek-B79v56Zc.js} +4 -4
- package/dist/_chunks/{appointment-peek-Dk11UOVW.js.map → appointment-peek-B79v56Zc.js.map} +1 -1
- package/dist/_chunks/{appointment-timeline-wQ-PdkFV.js → appointment-timeline-tyJJPgVU.js} +5 -5
- package/dist/_chunks/{appointment-timeline-wQ-PdkFV.js.map → appointment-timeline-tyJJPgVU.js.map} +1 -1
- package/dist/_chunks/{appointment-tray-D7Gt6m8x.js → appointment-tray-Dq4zto_L.js} +4 -4
- package/dist/_chunks/{appointment-tray-D7Gt6m8x.js.map → appointment-tray-Dq4zto_L.js.map} +1 -1
- package/dist/_chunks/{audio-recorder-DZBtAvLH.js → audio-recorder-Ddlp5rVg.js} +3 -3
- package/dist/_chunks/{audio-recorder-DZBtAvLH.js.map → audio-recorder-Ddlp5rVg.js.map} +1 -1
- package/dist/_chunks/{balance-badge-cell-klaxFNL_.js → balance-badge-cell-BCEsdEOe.js} +4 -4
- package/dist/_chunks/{balance-badge-cell-klaxFNL_.js.map → balance-badge-cell-BCEsdEOe.js.map} +1 -1
- package/dist/_chunks/{bishop-score-BMLRvXYF.js → bishop-score-1NAiZh0K.js} +2 -2
- package/dist/_chunks/{bishop-score-BMLRvXYF.js.map → bishop-score-1NAiZh0K.js.map} +1 -1
- package/dist/_chunks/{bmi-calculator-DUhRyyrA.js → bmi-calculator-ZzzPZhhI.js} +2 -2
- package/dist/_chunks/{bmi-calculator-DUhRyyrA.js.map → bmi-calculator-ZzzPZhhI.js.map} +1 -1
- package/dist/_chunks/{booking-Cdzd8kyY.js → booking-DmyX24Ls.js} +5 -5
- package/dist/_chunks/{booking-Cdzd8kyY.js.map → booking-DmyX24Ls.js.map} +1 -1
- package/dist/_chunks/{button-18oBsI3n.js → button-CYPx2xFq.js} +38 -36
- package/dist/_chunks/button-CYPx2xFq.js.map +1 -0
- package/dist/_chunks/{button-group-BSDqso_C.js → button-group-t9RrsCS6.js} +3 -3
- package/dist/_chunks/{button-group-BSDqso_C.js.map → button-group-t9RrsCS6.js.map} +1 -1
- package/dist/_chunks/{calendar-zpE9qTM4.js → calendar-aqzmITxw.js} +543 -508
- package/dist/_chunks/calendar-aqzmITxw.js.map +1 -0
- package/dist/_chunks/{calendar-event-card-DplPh1wv.js → calendar-event-card-DyFSIehr.js} +148 -145
- package/dist/_chunks/{calendar-event-card-DplPh1wv.js.map → calendar-event-card-DyFSIehr.js.map} +1 -1
- package/dist/_chunks/calendar-workspace-BqoPkCUp.js +10597 -0
- package/dist/_chunks/calendar-workspace-BqoPkCUp.js.map +1 -0
- package/dist/_chunks/{care-plan-card-ciBaaguw.js → care-plan-card-amX33mMF.js} +2 -2
- package/dist/_chunks/{care-plan-card-ciBaaguw.js.map → care-plan-card-amX33mMF.js.map} +1 -1
- package/dist/_chunks/{care-plan-entry-card-D7A0whiZ.js → care-plan-entry-card-DNkEucjN.js} +2 -2
- package/dist/_chunks/{care-plan-entry-card-D7A0whiZ.js.map → care-plan-entry-card-DNkEucjN.js.map} +1 -1
- package/dist/_chunks/{care-plan-header-DKV1gLqv.js → care-plan-header-CJi853Rf.js} +2 -2
- package/dist/_chunks/{care-plan-header-DKV1gLqv.js.map → care-plan-header-CJi853Rf.js.map} +1 -1
- package/dist/_chunks/{carousel.agent-DqDGR2yH.js → carousel.agent-2EhJsAtl.js} +2 -2
- package/dist/_chunks/{carousel.agent-DqDGR2yH.js.map → carousel.agent-2EhJsAtl.js.map} +1 -1
- package/dist/_chunks/{chart-VjuXDXOZ.js → chart-B2HnwMP5.js} +3 -3
- package/dist/_chunks/{chart-VjuXDXOZ.js.map → chart-B2HnwMP5.js.map} +1 -1
- package/dist/_chunks/{chat-input-BVho_SqP.js → chat-input-CHUsUFOD.js} +2 -2
- package/dist/_chunks/{chat-input-BVho_SqP.js.map → chat-input-CHUsUFOD.js.map} +1 -1
- package/dist/_chunks/{chat-message-B4ihjNy3.js → chat-message-DTcRGhNo.js} +3 -3
- package/dist/_chunks/{chat-message-B4ihjNy3.js.map → chat-message-DTcRGhNo.js.map} +1 -1
- package/dist/_chunks/{code-block-C_eNHWaa.js → code-block-BrwcZNPq.js} +2 -2
- package/dist/_chunks/{code-block-C_eNHWaa.js.map → code-block-BrwcZNPq.js.map} +1 -1
- package/dist/_chunks/{connection-status-Cfux3TvH.js → connection-status-DMheLE65.js} +3 -3
- package/dist/_chunks/{connection-status-Cfux3TvH.js.map → connection-status-DMheLE65.js.map} +1 -1
- package/dist/_chunks/{contact-profile-card-Dj4NgBL-.js → contact-profile-card-zQLGGFKG.js} +2 -2
- package/dist/_chunks/{contact-profile-card-Dj4NgBL-.js.map → contact-profile-card-zQLGGFKG.js.map} +1 -1
- package/dist/_chunks/{control-room-rail-DAO0qfOI.js → control-room-rail-5iuM3jcm.js} +3 -3
- package/dist/_chunks/{control-room-rail-DAO0qfOI.js.map → control-room-rail-5iuM3jcm.js.map} +1 -1
- package/dist/_chunks/{copy-field-Cm4y5Bff.js → copy-field-C-KvrgOG.js} +2 -2
- package/dist/_chunks/{copy-field-Cm4y5Bff.js.map → copy-field-C-KvrgOG.js.map} +1 -1
- package/dist/_chunks/{cycle-calculator-B9lBRNiZ.js → cycle-calculator-DQMCeEzn.js} +2 -2
- package/dist/_chunks/{cycle-calculator-B9lBRNiZ.js.map → cycle-calculator-DQMCeEzn.js.map} +1 -1
- package/dist/_chunks/{dashboard-grid-uX7x1ePj.js → dashboard-grid-H7uph3HO.js} +2 -2
- package/dist/_chunks/{dashboard-grid-uX7x1ePj.js.map → dashboard-grid-H7uph3HO.js.map} +1 -1
- package/dist/_chunks/{data-table-CrI3_bjH.js → data-table-C4yPR89K.js} +7 -7
- package/dist/_chunks/{data-table-CrI3_bjH.js.map → data-table-C4yPR89K.js.map} +1 -1
- package/dist/_chunks/{data-table-tabs-CzYYKp2_.js → data-table-tabs-Dd_O1nPY.js} +3 -3
- package/dist/_chunks/{data-table-tabs-CzYYKp2_.js.map → data-table-tabs-Dd_O1nPY.js.map} +1 -1
- package/dist/_chunks/{description-list-1A2DEbE6.js → description-list-DOPu69Jg.js} +2 -2
- package/dist/_chunks/{description-list-1A2DEbE6.js.map → description-list-DOPu69Jg.js.map} +1 -1
- package/dist/_chunks/{document-preview-Od2Hz4z5.js → document-preview-Dzh1YAz8.js} +3 -3
- package/dist/_chunks/{document-preview-Od2Hz4z5.js.map → document-preview-Dzh1YAz8.js.map} +1 -1
- package/dist/_chunks/{document-scanner-p0aGlzCy.js → document-scanner-BSVwMR4V.js} +2 -2
- package/dist/_chunks/{document-scanner-p0aGlzCy.js.map → document-scanner-BSVwMR4V.js.map} +1 -1
- package/dist/_chunks/dropdown-menu-DIzxr_lp.js +594 -0
- package/dist/_chunks/dropdown-menu-DIzxr_lp.js.map +1 -0
- package/dist/_chunks/{due-date-calculator-BVqJaxzd.js → due-date-calculator-DUjw4w5O.js} +2 -2
- package/dist/_chunks/{due-date-calculator-BVqJaxzd.js.map → due-date-calculator-DUjw4w5O.js.map} +1 -1
- package/dist/_chunks/{editable-currency-cell-renderer-D_G2Ap61.js → editable-currency-cell-renderer-Cch3RIJL.js} +3 -3
- package/dist/_chunks/{editable-currency-cell-renderer-D_G2Ap61.js.map → editable-currency-cell-renderer-Cch3RIJL.js.map} +1 -1
- package/dist/_chunks/{editable-description-B4NVdjvd.js → editable-description-CRQib91p.js} +3 -3
- package/dist/_chunks/{editable-description-B4NVdjvd.js.map → editable-description-CRQib91p.js.map} +1 -1
- package/dist/_chunks/{editor-overlay-BDiBvQmL.js → editor-overlay-DsA7vR5C.js} +2 -2
- package/dist/_chunks/{editor-overlay-BDiBvQmL.js.map → editor-overlay-DsA7vR5C.js.map} +1 -1
- package/dist/_chunks/{empty-state-DTBZ1ENT.js → empty-state-Ck1wVWdN.js} +2 -2
- package/dist/_chunks/{empty-state-DTBZ1ENT.js.map → empty-state-Ck1wVWdN.js.map} +1 -1
- package/dist/_chunks/{entity-summary-CFJfBdVP.js → entity-summary-Cvs21xPr.js} +3 -3
- package/dist/_chunks/{entity-summary-CFJfBdVP.js.map → entity-summary-Cvs21xPr.js.map} +1 -1
- package/dist/_chunks/{error-boundary-BxTqEXqj.js → error-boundary-C_HAzVLO.js} +2 -2
- package/dist/_chunks/{error-boundary-BxTqEXqj.js.map → error-boundary-C_HAzVLO.js.map} +1 -1
- package/dist/_chunks/{face-scheme-fku-RShg.js → face-scheme-DVZZTuXT.js} +5 -5
- package/dist/_chunks/{face-scheme-fku-RShg.js.map → face-scheme-DVZZTuXT.js.map} +1 -1
- package/dist/_chunks/{fetal-weight-B69yOS9W.js → fetal-weight-B-lO-948.js} +2 -2
- package/dist/_chunks/{fetal-weight-B69yOS9W.js.map → fetal-weight-B-lO-948.js.map} +1 -1
- package/dist/_chunks/{field-array-lIXrFWS0.js → field-array-B3IDOct8.js} +3 -3
- package/dist/_chunks/{field-array-lIXrFWS0.js.map → field-array-B3IDOct8.js.map} +1 -1
- package/dist/_chunks/{file-manager-C6QQPQV5.js → file-manager-COUb-w8j.js} +7 -7
- package/dist/_chunks/{file-manager-C6QQPQV5.js.map → file-manager-COUb-w8j.js.map} +1 -1
- package/dist/_chunks/{finished-terminal-B2oqXO0Y.js → finished-terminal-BrAWwfOw.js} +2 -2
- package/dist/_chunks/{finished-terminal-B2oqXO0Y.js.map → finished-terminal-BrAWwfOw.js.map} +1 -1
- package/dist/_chunks/{fiscal-code-input-BEF8eKIG.js → fiscal-code-input-CwUwhUZy.js} +2 -2
- package/dist/_chunks/{fiscal-code-input-BEF8eKIG.js.map → fiscal-code-input-CwUwhUZy.js.map} +1 -1
- package/dist/_chunks/floating-action-button-pojvb9gG.js.map +1 -1
- package/dist/_chunks/{freemium-paywall-B6JITu4l.js → freemium-paywall-DiPJrL18.js} +2 -2
- package/dist/_chunks/{freemium-paywall-B6JITu4l.js.map → freemium-paywall-DiPJrL18.js.map} +1 -1
- package/dist/_chunks/{gestational-age-calculator-DsGN6_HS.js → gestational-age-calculator-BVPtrWKf.js} +2 -2
- package/dist/_chunks/{gestational-age-calculator-DsGN6_HS.js.map → gestational-age-calculator-BVPtrWKf.js.map} +1 -1
- package/dist/_chunks/{hcg-doubling-D2SH-e7t.js → hcg-doubling-CPktiA3H.js} +2 -2
- package/dist/_chunks/{hcg-doubling-D2SH-e7t.js.map → hcg-doubling-CPktiA3H.js.map} +1 -1
- package/dist/_chunks/{header-CCjp5GvE.js → header-C8NbLgVq.js} +2 -2
- package/dist/_chunks/{header-CCjp5GvE.js.map → header-C8NbLgVq.js.map} +1 -1
- package/dist/_chunks/header-settings-D0M3WNTS.js +305 -0
- package/dist/_chunks/header-settings-D0M3WNTS.js.map +1 -0
- package/dist/_chunks/{help-me-write-templates-DQtT1qs_.js → help-me-write-templates-CYAKuXZ3.js} +5 -5
- package/dist/_chunks/{help-me-write-templates-DQtT1qs_.js.map → help-me-write-templates-CYAKuXZ3.js.map} +1 -1
- package/dist/_chunks/{hover-card-BplP5SzQ.js → hover-card-BM0vNmq4.js} +2 -2
- package/dist/_chunks/{hover-card-BplP5SzQ.js.map → hover-card-BM0vNmq4.js.map} +1 -1
- package/dist/_chunks/{icon-button-CY7GU_Se.js → icon-button-JAXAkqWC.js} +2 -2
- package/dist/_chunks/icon-button-JAXAkqWC.js.map +1 -0
- package/dist/_chunks/{icon-button-group-B_426QN_.js → icon-button-group-ud2BLmxe.js} +3 -3
- package/dist/_chunks/{icon-button-group-B_426QN_.js.map → icon-button-group-ud2BLmxe.js.map} +1 -1
- package/dist/_chunks/{icon-picker-ZLebyB0U.js → icon-picker-B1PwkUHy.js} +3 -3
- package/dist/_chunks/{icon-picker-ZLebyB0U.js.map → icon-picker-B1PwkUHy.js.map} +1 -1
- package/dist/_chunks/{image-cropper-_HiNN79d.js → image-cropper-DM6hpXUw.js} +2 -2
- package/dist/_chunks/{image-cropper-_HiNN79d.js.map → image-cropper-DM6hpXUw.js.map} +1 -1
- package/dist/_chunks/{info-tip-laBxZhKu.js → info-tip-CywkQ1NX.js} +2 -2
- package/dist/_chunks/{info-tip-laBxZhKu.js.map → info-tip-CywkQ1NX.js.map} +1 -1
- package/dist/_chunks/{insert-result-CSuPQyKL.js → insert-result-Fu9AHxR6.js} +2 -2
- package/dist/_chunks/{insert-result-CSuPQyKL.js.map → insert-result-Fu9AHxR6.js.map} +1 -1
- package/dist/_chunks/{key-value-pair-Dcdl3Gni.js → key-value-pair-BL1J3_Km.js} +2 -2
- package/dist/_chunks/{key-value-pair-Dcdl3Gni.js.map → key-value-pair-BL1J3_Km.js.map} +1 -1
- package/dist/_chunks/{kit-extensions-BTJSnM_H.js → kit-extensions-B9Qn6VIc.js} +6 -6
- package/dist/_chunks/{kit-extensions-BTJSnM_H.js.map → kit-extensions-B9Qn6VIc.js.map} +1 -1
- package/dist/_chunks/{link-cell-renderer-CkNbUsBM.js → link-cell-renderer-BcW3F1j9.js} +2 -2
- package/dist/_chunks/{link-cell-renderer-CkNbUsBM.js.map → link-cell-renderer-BcW3F1j9.js.map} +1 -1
- package/dist/_chunks/{locale-picker-DGkQmhV9.js → locale-picker-Z42P8T-i.js} +218 -213
- package/dist/_chunks/locale-picker-Z42P8T-i.js.map +1 -0
- package/dist/_chunks/{map-view-Bb7ClKSF.js → map-view-DxYPJjM9.js} +2 -2
- package/dist/_chunks/{map-view-Bb7ClKSF.js.map → map-view-DxYPJjM9.js.map} +1 -1
- package/dist/_chunks/{marketplace-app-shell-1uKqs4gD.js → marketplace-app-shell-rTTvWRrE.js} +6 -6
- package/dist/_chunks/{marketplace-app-shell-1uKqs4gD.js.map → marketplace-app-shell-rTTvWRrE.js.map} +1 -1
- package/dist/_chunks/{message-card-C2zsvyj0.js → message-card-CUBPPn4Z.js} +3 -3
- package/dist/_chunks/{message-card-C2zsvyj0.js.map → message-card-CUBPPn4Z.js.map} +1 -1
- package/dist/_chunks/{message-tray-CMlmxdH2.js → message-tray-uy3DAIbn.js} +4 -4
- package/dist/_chunks/{message-tray-CMlmxdH2.js.map → message-tray-uy3DAIbn.js.map} +1 -1
- package/dist/_chunks/{muscle-scheme-Co0NIgbU.js → muscle-scheme-CH-vQ7Ch.js} +2 -2
- package/dist/_chunks/{muscle-scheme-Co0NIgbU.js.map → muscle-scheme-CH-vQ7Ch.js.map} +1 -1
- package/dist/_chunks/{notes-panel-xxpFt-I1.js → notes-panel-Dka4Z2M7.js} +4 -4
- package/dist/_chunks/{notes-panel-xxpFt-I1.js.map → notes-panel-Dka4Z2M7.js.map} +1 -1
- package/dist/_chunks/{notification-card-DDzBCi8l.js → notification-card-Hy8w3UWx.js} +3 -3
- package/dist/_chunks/{notification-card-DDzBCi8l.js.map → notification-card-Hy8w3UWx.js.map} +1 -1
- package/dist/_chunks/{notification-tray-PnH2PBlZ.js → notification-tray-VuV3XXB8.js} +4 -4
- package/dist/_chunks/{notification-tray-PnH2PBlZ.js.map → notification-tray-VuV3XXB8.js.map} +1 -1
- package/dist/_chunks/{optical-prescription-DUufWXfZ.js → optical-prescription-C2n6d0HO.js} +2 -2
- package/dist/_chunks/{optical-prescription-DUufWXfZ.js.map → optical-prescription-C2n6d0HO.js.map} +1 -1
- package/dist/_chunks/{panel-subview-CzHutkA8.js → panel-subview-DAY-ToM3.js} +2 -2
- package/dist/_chunks/{panel-subview-CzHutkA8.js.map → panel-subview-DAY-ToM3.js.map} +1 -1
- package/dist/_chunks/{patient-details-tTlvrJSU.js → patient-details-D9sAM3qh.js} +3 -3
- package/dist/_chunks/{patient-details-tTlvrJSU.js.map → patient-details-D9sAM3qh.js.map} +1 -1
- package/dist/_chunks/{patient-field-row-DElFbpKc.js → patient-field-row-CT04C_lZ.js} +277 -257
- package/dist/_chunks/patient-field-row-CT04C_lZ.js.map +1 -0
- package/dist/_chunks/{patient-search-DgXdGkhK.js → patient-search-DkIukAMQ.js} +3 -3
- package/dist/_chunks/{patient-search-DgXdGkhK.js.map → patient-search-DkIukAMQ.js.map} +1 -1
- package/dist/_chunks/{patient-summary-card-DQ__6DR-.js → patient-summary-card-DI0BH-Fe.js} +5 -5
- package/dist/_chunks/{patient-summary-card-DQ__6DR-.js.map → patient-summary-card-DI0BH-Fe.js.map} +1 -1
- package/dist/_chunks/{payment-automation-upsell-ugi4np1l.js → payment-automation-upsell-vQBIyUky.js} +2 -2
- package/dist/_chunks/{payment-automation-upsell-ugi4np1l.js.map → payment-automation-upsell-vQBIyUky.js.map} +1 -1
- package/dist/_chunks/{payment-request-card-DMJB57Tv.js → payment-request-card-BSaJzhxz.js} +3 -3
- package/dist/_chunks/{payment-request-card-DMJB57Tv.js.map → payment-request-card-BSaJzhxz.js.map} +1 -1
- package/dist/_chunks/{periodontal-chart-DbGzKDj7.js → periodontal-chart-BcTcOc79.js} +2 -2
- package/dist/_chunks/{periodontal-chart-DbGzKDj7.js.map → periodontal-chart-BcTcOc79.js.map} +1 -1
- package/dist/_chunks/{periodontal-chart-card-DvHyP47v.js → periodontal-chart-card-NS_nToBf.js} +2 -2
- package/dist/_chunks/{periodontal-chart-card-DvHyP47v.js.map → periodontal-chart-card-NS_nToBf.js.map} +1 -1
- package/dist/_chunks/{popover-Dvb40vPH.js → popover-SASSeAdY.js} +2 -2
- package/dist/_chunks/{popover-Dvb40vPH.js.map → popover-SASSeAdY.js.map} +1 -1
- package/dist/_chunks/{practice-results-EKRiqWtQ.js → practice-results-C3ifcObw.js} +6 -6
- package/dist/_chunks/{practice-results-EKRiqWtQ.js.map → practice-results-C3ifcObw.js.map} +1 -1
- package/dist/_chunks/{pregnancy-dating-lfjjZVZH.js → pregnancy-dating-CpJ3iYvD.js} +2 -2
- package/dist/_chunks/{pregnancy-dating-lfjjZVZH.js.map → pregnancy-dating-CpJ3iYvD.js.map} +1 -1
- package/dist/_chunks/{pregnancy-weight-gain-WpNt-S0q.js → pregnancy-weight-gain-kDOhA2vZ.js} +2 -2
- package/dist/_chunks/{pregnancy-weight-gain-WpNt-S0q.js.map → pregnancy-weight-gain-kDOhA2vZ.js.map} +1 -1
- package/dist/_chunks/{privacy-lock-D6gq0GDg.js → privacy-lock-CEyvNpC8.js} +3 -3
- package/dist/_chunks/{privacy-lock-D6gq0GDg.js.map → privacy-lock-CEyvNpC8.js.map} +1 -1
- package/dist/_chunks/{privacy-mask-BC5lw2zB.js → privacy-mask-TzMlEu3Q.js} +2 -2
- package/dist/_chunks/{privacy-mask-BC5lw2zB.js.map → privacy-mask-TzMlEu3Q.js.map} +1 -1
- package/dist/_chunks/{product-hub-panel-CKeSCSeE.js → product-hub-panel-b70i9Hi1.js} +3 -3
- package/dist/_chunks/{product-hub-panel-CKeSCSeE.js.map → product-hub-panel-b70i9Hi1.js.map} +1 -1
- package/dist/_chunks/{public-header.agent-B9wDmUeB.js → public-header.agent-D0ApOrmx.js} +3 -3
- package/dist/_chunks/{public-header.agent-B9wDmUeB.js.map → public-header.agent-D0ApOrmx.js.map} +1 -1
- package/dist/_chunks/{radiograph-panel.agent-TmyIvTOa.js → radiograph-panel.agent-jhwaIW8U.js} +4 -4
- package/dist/_chunks/{radiograph-panel.agent-TmyIvTOa.js.map → radiograph-panel.agent-jhwaIW8U.js.map} +1 -1
- package/dist/_chunks/resource-chip-DQeCJzJf.js +143 -0
- package/dist/_chunks/resource-chip-DQeCJzJf.js.map +1 -0
- package/dist/_chunks/{reviews-panel-BdwFp_0c.js → reviews-panel-B5QC4FIp.js} +4 -4
- package/dist/_chunks/{reviews-panel-BdwFp_0c.js.map → reviews-panel-B5QC4FIp.js.map} +1 -1
- package/dist/_chunks/{rich-text-editor-y6ML0KeV.js → rich-text-editor-DoBXdwmx.js} +930 -943
- package/dist/_chunks/rich-text-editor-DoBXdwmx.js.map +1 -0
- package/dist/_chunks/{session-countdown-ACJyTXH2.js → session-countdown-26XB5u38.js} +2 -2
- package/dist/_chunks/{session-countdown-ACJyTXH2.js.map → session-countdown-26XB5u38.js.map} +1 -1
- package/dist/_chunks/{sheet-D0Lh0KR2.js → sheet-CwhNzxbr.js} +2 -2
- package/dist/_chunks/{sheet-D0Lh0KR2.js.map → sheet-CwhNzxbr.js.map} +1 -1
- package/dist/_chunks/{sign-in-with-alfadocs-button-CDyJAIzW.js → sign-in-with-alfadocs-button-jxbze77L.js} +2 -2
- package/dist/_chunks/{sign-in-with-alfadocs-button-CDyJAIzW.js.map → sign-in-with-alfadocs-button-jxbze77L.js.map} +1 -1
- package/dist/_chunks/{signature-request-BUGeG8oD.js → signature-request-BorHf3CY.js} +4 -4
- package/dist/_chunks/{signature-request-BUGeG8oD.js.map → signature-request-BorHf3CY.js.map} +1 -1
- package/dist/_chunks/{slot-grid-4fWH3Euk.js → slot-grid-xgf2UKLS.js} +4 -4
- package/dist/_chunks/{slot-grid-4fWH3Euk.js.map → slot-grid-xgf2UKLS.js.map} +1 -1
- package/dist/_chunks/social-sign-in-button-dlpPI5l7.js.map +1 -1
- package/dist/_chunks/{streaming-text-eRiizArc.js → streaming-text-Cos2fVTw.js} +2 -2
- package/dist/_chunks/{streaming-text-eRiizArc.js.map → streaming-text-Cos2fVTw.js.map} +1 -1
- package/dist/_chunks/{tab-bar-BHFf6knq.js → tab-bar-BrkMUW0c.js} +2 -2
- package/dist/_chunks/{tab-bar-BHFf6knq.js.map → tab-bar-BrkMUW0c.js.map} +1 -1
- package/dist/_chunks/tabs-tK22Mz7r.js +413 -0
- package/dist/_chunks/tabs-tK22Mz7r.js.map +1 -0
- package/dist/_chunks/{task-card-jaOhnj_q.js → task-card-CLpHmqEY.js} +2 -2
- package/dist/_chunks/{task-card-jaOhnj_q.js.map → task-card-CLpHmqEY.js.map} +1 -1
- package/dist/_chunks/{task-editor-DlvTwAfv.js → task-editor-B4UGsU7l.js} +6 -6
- package/dist/_chunks/{task-editor-DlvTwAfv.js.map → task-editor-B4UGsU7l.js.map} +1 -1
- package/dist/_chunks/{task-tray-HHyxi9ga.js → task-tray-dsmYgjVb.js} +4 -4
- package/dist/_chunks/{task-tray-HHyxi9ga.js.map → task-tray-dsmYgjVb.js.map} +1 -1
- package/dist/_chunks/{tasks-panel-DbSjq_mz.js → tasks-panel-CwwVw491.js} +6 -6
- package/dist/_chunks/{tasks-panel-DbSjq_mz.js.map → tasks-panel-CwwVw491.js.map} +1 -1
- package/dist/_chunks/{theme-toggle-LUBxlNDm.js → theme-toggle-jyoyhbJL.js} +4 -4
- package/dist/_chunks/{theme-toggle-LUBxlNDm.js.map → theme-toggle-jyoyhbJL.js.map} +1 -1
- package/dist/_chunks/{toast-CT8hjr9r.js → toast-FijDyPnv.js} +2 -2
- package/dist/_chunks/{toast-CT8hjr9r.js.map → toast-FijDyPnv.js.map} +1 -1
- package/dist/_chunks/{token-insert-menu-klwbxVKh.js → token-insert-menu-Cjf99IdN.js} +3 -3
- package/dist/_chunks/{token-insert-menu-klwbxVKh.js.map → token-insert-menu-Cjf99IdN.js.map} +1 -1
- package/dist/_chunks/{tool-rail-DEeX4PdN.js → tool-rail-DphMl1hX.js} +2 -2
- package/dist/_chunks/{tool-rail-DEeX4PdN.js.map → tool-rail-DphMl1hX.js.map} +1 -1
- package/dist/_chunks/{tooth-scheme-BkjhkI8g.js → tooth-scheme-BaCJnyg9.js} +663 -718
- package/dist/_chunks/tooth-scheme-BaCJnyg9.js.map +1 -0
- package/dist/_chunks/{unit-converter-Dp_KDxE6.js → unit-converter-CGpOgarU.js} +2 -2
- package/dist/_chunks/{unit-converter-Dp_KDxE6.js.map → unit-converter-CGpOgarU.js.map} +1 -1
- package/dist/_chunks/{use-appointment-details-read-5-hV-2xA.js → use-appointment-details-read-uEnJLVfA.js} +14 -14
- package/dist/_chunks/{use-appointment-details-read-5-hV-2xA.js.map → use-appointment-details-read-uEnJLVfA.js.map} +1 -1
- package/dist/_chunks/wallet-pay-button--dnR6NfJ.js.map +1 -1
- package/dist/_chunks/{warning-stack-CEgYkI1z.js → warning-stack-7Hffm7K1.js} +3 -3
- package/dist/_chunks/{warning-stack-CEgYkI1z.js.map → warning-stack-7Hffm7K1.js.map} +1 -1
- package/dist/_chunks/{workflow-map-qGkQTNvS.js → workflow-map-Jfe9L9Wt.js} +6 -6
- package/dist/_chunks/{workflow-map-qGkQTNvS.js.map → workflow-map-Jfe9L9Wt.js.map} +1 -1
- package/dist/_chunks/{workflow-status-ClHfz4Kr.js → workflow-status-jHfsIDzi.js} +2 -2
- package/dist/_chunks/{workflow-status-ClHfz4Kr.js.map → workflow-status-jHfsIDzi.js.map} +1 -1
- package/dist/agent-catalog.json +103 -38
- package/dist/agent-i18n/en.json +7 -4
- package/dist/components/_shared/entity-card/entity-card.d.ts +1 -1
- package/dist/components/_shared/field-visibility-cog.d.ts.map +1 -1
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/ai-credits-notice/index.js +1 -1
- package/dist/components/ai-permission-notice/index.js +1 -1
- package/dist/components/ai-prompt-input/index.js +1 -1
- package/dist/components/anamnesis-card/index.js +1 -1
- package/dist/components/anamnesis-summary-card/anamnesis-summary-card.d.ts +1 -1
- package/dist/components/appointment-card/index.js +2 -2
- package/dist/components/appointment-details-panel/index.js +1 -1
- package/dist/components/appointment-peek/index.js +1 -1
- package/dist/components/appointment-timeline/index.js +1 -1
- package/dist/components/audio-recorder/index.js +1 -1
- package/dist/components/bishop-score/index.js +1 -1
- package/dist/components/bmi-calculator/index.js +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/button/button.d.ts +11 -0
- package/dist/components/button/button.d.ts.map +1 -1
- package/dist/components/button/icon-button.d.ts +4 -0
- package/dist/components/button/icon-button.d.ts.map +1 -1
- package/dist/components/button/index.js +2 -2
- package/dist/components/button-group/index.js +1 -1
- package/dist/components/calendar/calendar.d.ts +11 -3
- package/dist/components/calendar/calendar.d.ts.map +1 -1
- package/dist/components/calendar/index.js +1 -1
- package/dist/components/calendar-event-card/calendar-event-card.d.ts +6 -0
- package/dist/components/calendar-event-card/calendar-event-card.d.ts.map +1 -1
- package/dist/components/calendar-event-card/index.js +1 -1
- package/dist/components/care-plan-card/index.js +1 -1
- package/dist/components/care-plan-entry-card/index.js +1 -1
- package/dist/components/care-plan-header/index.js +1 -1
- package/dist/components/carousel/index.js +1 -1
- package/dist/components/chart/chart.d.ts +1 -1
- package/dist/components/chart/index.js +1 -1
- package/dist/components/chat-input/index.js +1 -1
- package/dist/components/chat-message/index.js +1 -1
- package/dist/components/connection-status/index.js +1 -1
- package/dist/components/contact-profile-card/index.js +1 -1
- package/dist/components/control-room-rail/index.js +1 -1
- package/dist/components/copy-field/index.js +1 -1
- package/dist/components/cycle-calculator/index.js +1 -1
- package/dist/components/dashboard-grid/index.js +1 -1
- package/dist/components/data-table/index.js +4 -4
- package/dist/components/data-table-tabs/index.js +1 -1
- package/dist/components/description-list/index.js +1 -1
- package/dist/components/document-preview/index.js +1 -1
- package/dist/components/document-scanner/index.js +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.agent.d.ts.map +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.d.ts +52 -2
- package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/dropdown-menu/index.d.ts +1 -1
- package/dist/components/dropdown-menu/index.d.ts.map +1 -1
- package/dist/components/dropdown-menu/index.js +1 -1
- package/dist/components/due-date-calculator/index.js +1 -1
- package/dist/components/editable-description/index.js +1 -1
- package/dist/components/editor-overlay/index.js +1 -1
- package/dist/components/empty-state/index.js +1 -1
- package/dist/components/entity-summary/index.js +1 -1
- package/dist/components/error-boundary/index.js +1 -1
- package/dist/components/face-scheme/index.js +1 -1
- package/dist/components/fetal-weight/index.js +1 -1
- package/dist/components/field-array/index.js +1 -1
- package/dist/components/file-manager/index.js +1 -1
- package/dist/components/finished-terminal/index.js +1 -1
- package/dist/components/fiscal-code-input/index.js +1 -1
- package/dist/components/floating-action-button/floating-action-button.d.ts.map +1 -1
- package/dist/components/freemium-paywall/index.js +1 -1
- package/dist/components/gestational-age-calculator/index.js +1 -1
- package/dist/components/hcg-doubling/index.js +1 -1
- package/dist/components/header/index.js +1 -1
- package/dist/components/header-settings/header-settings.d.ts +3 -3
- package/dist/components/header-settings/header-settings.d.ts.map +1 -1
- package/dist/components/header-settings/index.js +1 -1
- package/dist/components/hover-card/index.js +1 -1
- package/dist/components/icon-button/index.js +1 -1
- package/dist/components/icon-button-group/index.js +1 -1
- package/dist/components/icon-picker/index.js +1 -1
- package/dist/components/image-cropper/index.js +1 -1
- package/dist/components/info-tip/index.js +1 -1
- package/dist/components/key-value-pair/index.js +1 -1
- package/dist/components/locale-picker/index.js +1 -1
- package/dist/components/locale-picker/locale-picker.d.ts +7 -0
- package/dist/components/locale-picker/locale-picker.d.ts.map +1 -1
- package/dist/components/map-view/index.js +1 -1
- package/dist/components/message-card/index.js +1 -1
- package/dist/components/message-tray/index.js +1 -1
- package/dist/components/muscle-scheme/index.js +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/notification-card/index.js +1 -1
- package/dist/components/notification-tray/index.js +1 -1
- package/dist/components/operator-hero/operator-hero.d.ts +1 -1
- package/dist/components/optical-prescription/index.js +1 -1
- package/dist/components/panel-subview/index.js +1 -1
- package/dist/components/patient-details/index.js +1 -1
- package/dist/components/patient-details/patient-details.d.ts +1 -1
- package/dist/components/patient-search/index.js +1 -1
- package/dist/components/patient-summary-card/index.js +1 -1
- package/dist/components/patient-summary-card/patient-summary-card.d.ts +1 -1
- package/dist/components/patient-table/index.js +1 -1
- package/dist/components/payment-card/index.js +1 -1
- package/dist/components/periodontal-chart/index.js +1 -1
- package/dist/components/periodontal-chart-card/index.js +1 -1
- package/dist/components/popover/index.js +1 -1
- package/dist/components/practice-results/index.js +1 -1
- package/dist/components/pregnancy-dating/index.js +1 -1
- package/dist/components/pregnancy-weight-gain/index.js +1 -1
- package/dist/components/privacy-lock/index.js +1 -1
- package/dist/components/product-hub-tray/index.js +1 -1
- package/dist/components/public-header/index.js +1 -1
- package/dist/components/radiograph-panel/index.js +1 -1
- package/dist/components/resource-chip/index.d.ts +1 -1
- package/dist/components/resource-chip/index.d.ts.map +1 -1
- package/dist/components/resource-chip/index.js +3 -2
- package/dist/components/resource-chip/resource-chip.d.ts +20 -0
- package/dist/components/resource-chip/resource-chip.d.ts.map +1 -1
- package/dist/components/reviews-panel/index.js +1 -1
- package/dist/components/rich-text-editor/editor-toolbar.d.ts.map +1 -1
- package/dist/components/rich-text-editor/index.js +2 -2
- package/dist/components/session-countdown/index.js +1 -1
- package/dist/components/sheet/index.js +1 -1
- package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
- package/dist/components/skeleton-scheme/index.js +1 -1
- package/dist/components/slot-grid/index.js +1 -1
- package/dist/components/social-sign-in-button/social-sign-in-button.d.ts.map +1 -1
- package/dist/components/streaming-text/index.js +1 -1
- package/dist/components/tab-bar/index.js +1 -1
- package/dist/components/tabs/index.js +1 -1
- package/dist/components/tabs/tabs.d.ts.map +1 -1
- package/dist/components/task-card/index.js +1 -1
- package/dist/components/task-editor/index.js +1 -1
- package/dist/components/task-tray/index.js +1 -1
- package/dist/components/tasks-panel/index.js +1 -1
- package/dist/components/theme-toggle/index.js +1 -1
- package/dist/components/toast/index.js +1 -1
- package/dist/components/token-insert-menu/index.js +1 -1
- package/dist/components/tool-rail/index.js +1 -1
- package/dist/components/tooth-scheme/index.js +1 -1
- package/dist/components/tooth-scheme/tooth-scheme.d.ts +2 -2
- package/dist/components/tooth-scheme/tooth-scheme.d.ts.map +1 -1
- package/dist/components/unit-converter/index.js +1 -1
- package/dist/components/wallet-pay-button/wallet-pay-button.d.ts.map +1 -1
- package/dist/components/warning-stack/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/components/workflow/workflow-card.d.ts +1 -1
- package/dist/components/workflow-status/index.js +1 -1
- package/dist/i18n/locales/ar.d.ts +5 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +5 -0
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +5 -0
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +5 -0
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +5 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +5 -0
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +5 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +5 -0
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +5 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +5 -0
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +5 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +5 -0
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +5 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +5 -0
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +5 -0
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +5 -0
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +5 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +5 -0
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +5 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +5 -0
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +5 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +5 -0
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +5 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +5 -0
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +5 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +5 -0
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +5 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +5 -0
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +5 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +5 -0
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +5 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +5 -0
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +5 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +5 -0
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +5 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +5 -0
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +478 -477
- package/dist/locales/ar.json +5 -0
- package/dist/locales/de.json +5 -0
- package/dist/locales/el.json +5 -0
- package/dist/locales/en.json +5 -0
- package/dist/locales/es.json +5 -0
- package/dist/locales/fr.json +5 -0
- package/dist/locales/hi.json +5 -0
- package/dist/locales/it.json +5 -0
- package/dist/locales/ja.json +5 -0
- package/dist/locales/nl.json +5 -0
- package/dist/locales/pl.json +5 -0
- package/dist/locales/pt.json +5 -0
- package/dist/locales/ro.json +5 -0
- package/dist/locales/ru.json +5 -0
- package/dist/locales/sq.json +5 -0
- package/dist/locales/sv.json +5 -0
- package/dist/locales/tr.json +5 -0
- package/dist/locales/zh.json +5 -0
- package/dist/patterns/alia-assistant/index.js +1 -1
- package/dist/patterns/anamnesis/index.js +1 -1
- package/dist/patterns/calendar/calendar.sheets.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.surface.d.ts +4 -1
- package/dist/patterns/calendar/calendar.surface.d.ts.map +1 -1
- package/dist/patterns/calendar/index.js +1 -1
- package/dist/patterns/help-me-write-templates/index.js +1 -1
- package/dist/patterns/marketplace-app-shell/index.js +1 -1
- package/dist/patterns/payment-automation-upsell/index.js +1 -1
- package/dist/patterns/signature-request/index.js +1 -1
- package/dist/tokens.css +2 -1
- package/package.json +1 -1
- package/dist/_chunks/button-18oBsI3n.js.map +0 -1
- package/dist/_chunks/calendar-workspace-CWRH4x15.js +0 -10577
- package/dist/_chunks/calendar-workspace-CWRH4x15.js.map +0 -1
- package/dist/_chunks/calendar-zpE9qTM4.js.map +0 -1
- package/dist/_chunks/dropdown-menu-C8PaW3lR.js +0 -369
- package/dist/_chunks/dropdown-menu-C8PaW3lR.js.map +0 -1
- package/dist/_chunks/header-settings-ZXa6hXuu.js +0 -335
- package/dist/_chunks/header-settings-ZXa6hXuu.js.map +0 -1
- package/dist/_chunks/icon-button-CY7GU_Se.js.map +0 -1
- package/dist/_chunks/locale-picker-DGkQmhV9.js.map +0 -1
- package/dist/_chunks/patient-field-row-DElFbpKc.js.map +0 -1
- package/dist/_chunks/resource-chip-DYTG0IQQ.js +0 -83
- package/dist/_chunks/resource-chip-DYTG0IQQ.js.map +0 -1
- package/dist/_chunks/rich-text-editor-y6ML0KeV.js.map +0 -1
- package/dist/_chunks/tabs-CFsuMQ5H.js +0 -409
- package/dist/_chunks/tabs-CFsuMQ5H.js.map +0 -1
- package/dist/_chunks/tooth-scheme-BkjhkI8g.js.map +0 -1
package/dist/_chunks/{calendar-event-card-DplPh1wv.js.map → calendar-event-card-DyFSIehr.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calendar-event-card-DplPh1wv.js","sources":["../../src/components/_shared/contrast-warning.ts","../../src/components/calendar-event-card/calendar-event-card.tsx"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* Shared contrast guardrail — Calendar + CalendarEventCard */\n/* */\n/* The consuming app supplies runtime hex pairs at several surfaces: */\n/* - event.backgroundColor / event.textColor (+ event.borderColor) */\n/* - modeBannerColor / modeBannerTextColor */\n/* - resource.color / resource.shortTitleTextColor */\n/* */\n/* When the text half of the pair is also a hex (i.e. both halves come */\n/* from the caller), we can validate them synchronously and warn the */\n/* consuming-app developer during DEV if the pair fails WCAG AA normal */\n/* text (4.5:1). When only the background half is supplied, */\n/* `resolveInk` derives a provably AA-safe black/white ink for it. */\n/* Every helper is a no-op in production builds. */\n/* ------------------------------------------------------------------ */\n\n/* Module-level dedup set — keyed on the (bg, fg, context) tuple so the\n same bad pair moving around the calendar only warns once per session.\n Exposed via `resetContrastWarnings()` for test isolation. */\nconst warnedTuples = new Set<string>();\n\n/** Reset the dedup set — intended for use between tests. */\nexport function resetContrastWarnings(): void {\n warnedTuples.clear();\n}\n\n/**\n * Parse a 3-char or 6-char `#RRGGBB` hex string into a linear sRGB\n * triple in the [0,1] range. Returns `null` for any input the caller\n * can't parse (malformed prefix, bad length, non-hex characters) —\n * the helper stays silent in that case rather than emitting noise.\n */\nfunction parseHex(hex: string): [number, number, number] | null {\n if (typeof hex !== 'string') return null;\n const trimmed = hex.trim();\n if (!trimmed.startsWith('#')) return null;\n const body = trimmed.slice(1);\n let r: number;\n let g: number;\n let b: number;\n if (body.length === 3) {\n if (!/^[0-9a-f]{3}$/i.test(body)) return null;\n r = parseInt(body[0] + body[0], 16);\n g = parseInt(body[1] + body[1], 16);\n b = parseInt(body[2] + body[2], 16);\n } else if (body.length === 6) {\n if (!/^[0-9a-f]{6}$/i.test(body)) return null;\n r = parseInt(body.slice(0, 2), 16);\n g = parseInt(body.slice(2, 4), 16);\n b = parseInt(body.slice(4, 6), 16);\n } else {\n return null;\n }\n return [r / 255, g / 255, b / 255];\n}\n\n/**\n * WCAG 2.1 relative luminance. Each channel is gamma-corrected then\n * weighted against the CIE photopic sensitivity of the human eye.\n * https://www.w3.org/TR/WCAG21/#dfn-relative-luminance\n */\nfunction relativeLuminance([r, g, b]: [number, number, number]): number {\n const lin = (c: number): number =>\n c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n return 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b);\n}\n\n/**\n * WCAG 2.1 contrast ratio. Always returns a value in [1, 21]; the\n * relative-luminance lighter-over-darker convention is applied here.\n */\nfunction contrastRatio(\n bg: [number, number, number],\n fg: [number, number, number],\n): number {\n const l1 = relativeLuminance(bg);\n const l2 = relativeLuminance(fg);\n const lighter = Math.max(l1, l2);\n const darker = Math.min(l1, l2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * DEV-only WCAG AA guardrail for caller-supplied hex pairs.\n *\n * - No-op when `import.meta.env.DEV` is false.\n * - No-op when either half of the pair is missing (the \"fg missing →\n * inherits DS token\" case is a docs concern; the DS token isn't a\n * hex at runtime so we can't check it here).\n * - No-op when either hex can't be parsed (silent — not the helper's\n * concern to police malformed input).\n * - Deduplicated by `(bgHex, fgHex, contextLabel)` tuple so moving a\n * ratio-bad event around the calendar doesn't spam the console.\n *\n * @param bgHex - Caller-supplied background hex (e.g. `'#c2185b'`)\n * @param fgHex - Caller-supplied foreground hex (e.g. `'#ffffff'`)\n * @param contextLabel - Short description for the warning (e.g. `'event e1'`).\n */\nexport function warnLowContrast(\n bgHex: string | undefined,\n fgHex: string | undefined,\n contextLabel: string,\n): void {\n if (!import.meta.env.DEV) return;\n if (!bgHex || !fgHex) return;\n\n const bg = parseHex(bgHex);\n const fg = parseHex(fgHex);\n if (!bg || !fg) return;\n\n const ratio = contrastRatio(bg, fg);\n if (ratio >= 4.5) return;\n\n const key = `${bgHex}|${fgHex}|${contextLabel}`;\n if (warnedTuples.has(key)) return;\n warnedTuples.add(key);\n\n /* `bg` parsed successfully above, so `resolveInk(bgHex)` is guaranteed\n to produce a compliant ink — the omit-textColor hint is always valid\n at this point. */\n console.warn(\n `[Calendar] Low contrast on ${contextLabel}: ${bgHex} / ${fgHex} (ratio ${ratio.toFixed(\n 2,\n )}, target 4.5). Pass a matching textColor/fgHex, pick a higher-contrast background, or omit textColor to let the kit choose a compliant ink.`,\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Ink derivation — bg-only caller colours */\n/* ------------------------------------------------------------------ */\n\nexport type EventInk = 'on-light' | 'on-dark';\n\n/**\n * Pick the ink for an arbitrary opaque bg hex. Returns `null` when the\n * input can't be parsed (`#rgb` / `#rrggbb` only).\n *\n * The threshold 0.1791 is the relative luminance at which\n * `contrast(bg, #fff) === contrast(bg, #000)`; the better of the two\n * always yields ≥ 4.58:1 (the minimum, at a mid-grey ≈ `#757575`) —\n * provably WCAG AA-safe for any opaque background.\n */\nexport function resolveInk(bgHex: string): EventInk | null {\n const bg = parseHex(bgHex);\n if (!bg) return null;\n // threshold where contrast(bg, #fff) === contrast(bg, #000)\n return relativeLuminance(bg) > 0.1791 ? 'on-light' : 'on-dark';\n}\n\n/**\n * DEV-only, one-shot warning for a caller `backgroundColor` the kit can't\n * parse (`rgb(…)`, keywords, malformed hex). The browser can still paint\n * it, but the text falls back to the token default and contrast can't be\n * verified. Deduplicated by `(bgHex, contextLabel)`.\n */\nexport function warnUnparseableBackground(\n bgHex: string,\n contextLabel: string,\n): void {\n if (!import.meta.env.DEV) return;\n if (parseHex(bgHex)) return;\n\n const key = `unparseable|${bgHex}|${contextLabel}`;\n if (warnedTuples.has(key)) return;\n warnedTuples.add(key);\n\n console.warn(\n `[Calendar] Unparseable backgroundColor on ${contextLabel}: \"${bgHex}\". ` +\n `Expected #rgb or #rrggbb — contrast cannot be verified and the text ` +\n `colour falls back to the token default.`,\n );\n}\n\n/**\n * DEV-only, one-shot warning for a near-white `backgroundColor`\n * (relative luminance > 0.9) supplied without a `borderColor` — the\n * event may be invisible against the calendar grid. The kit warns, it\n * does not repaint (delineation is decorative under WCAG 1.4.11 and the\n * consumer owns the picker colour). Deduplicated by `(bgHex, contextLabel)`.\n */\nexport function warnLowDelineation(bgHex: string, contextLabel: string): void {\n if (!import.meta.env.DEV) return;\n\n const bg = parseHex(bgHex);\n if (!bg) return;\n if (relativeLuminance(bg) <= 0.9) return;\n\n const key = `delineation|${bgHex}|${contextLabel}`;\n if (warnedTuples.has(key)) return;\n warnedTuples.add(key);\n\n console.warn(\n `[Calendar] Light backgroundColor without borderColor on ${contextLabel}: ` +\n `${bgHex} may be invisible against the grid — pass a borderColor ` +\n `(the platform convention sends a light-grey border for white backgrounds).`,\n );\n}\n","/* ------------------------------------------------------------------ */\n/* CalendarEventCard — the single painted surface of a calendar event. */\n/* */\n/* Colour model (platform parity): the caller's picker hex */\n/* (backgroundColor / textColor / borderColor) is the ONLY thing that */\n/* paints the card. `status` never paints the surface — it selects an */\n/* icon and (for `cancelled`) a line-through. When no picker colour */\n/* is supplied the surface falls back to the theme's --primary / */\n/* --primary-foreground pair. */\n/* */\n/* Non-interactive by design: inside FullCalendar the outer harness */\n/* anchor owns click/drag/focus; standalone consumers wrap the card in */\n/* their own button/link. No onClick in the contract. */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef } from 'react';\nimport type { CSSProperties, HTMLAttributes } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { cva } from 'class-variance-authority';\nimport {\n ThumbsUp,\n Clock,\n Stethoscope,\n Check,\n Ban,\n UserX,\n Globe,\n TriangleAlert,\n HeartPulse,\n Euro,\n Video,\n Repeat,\n EyeOff,\n ClipboardCheck,\n type LucideIcon,\n} from 'lucide-react';\n// Type-only import — erased at build, no runtime cycle with calendar.tsx's\n// runtime import of this card. Do NOT convert to a value import.\nimport type { CalendarEventStatus } from '../calendar/calendar';\nimport {\n warnLowContrast,\n resolveInk,\n warnUnparseableBackground,\n warnLowDelineation,\n} from '../_shared/contrast-warning';\n\n/* ------------------------------------------------------------------ */\n/* Status lookups */\n/* ------------------------------------------------------------------ */\n\nexport const STATUS_ICON: Record<CalendarEventStatus, LucideIcon> = {\n confirmed: ThumbsUp,\n waiting: Clock,\n in_care: Stethoscope,\n done: Check,\n cancelled: Ban,\n absent: UserX,\n};\n\n/* Status → i18n key lookup. Kept as a literal object (not a template)\n so static-analysis extractors can find every key. Keys already exist\n in all 18 locale bundles — do not add new ones here. */\n/* Indicator DISC — option D of the design review: each glyph in a small\n circle on the plain card surface (hairline border + row-lift shadow)\n with the SEMANTIC colour as icon ink. Chip-grade contrast on any\n picker colour without a plate; ink tokens mirror Badge's variants so\n the vocabulary stays one system. */\nconst INDICATOR_DISC_BASE =\n 'ds:shrink-0 ds:items-center ds:justify-center ds:rounded-[var(--radius-full)] ds:bg-[color:var(--card)] ds:border ds:border-[color:var(--border)] ds:shadow-[var(--shadow-sm)]';\n\n/* DETAILS-PENDING bar — the Skeleton component's own classes, inlined on\n a <span>: Skeleton renders a <div>, which cannot live inside the card's\n inline text cell. Decorative (aria-hidden) because the composed\n aria-label already carries the localised \"loading details\" word. */\nconst PENDING_BAR_CLASS =\n 'ds:inline-block ds:h-3 ds:w-[6ch] ds:align-middle ds:rounded-[var(--radius-sm)] ds:bg-[var(--muted)] ds:animate-[skeleton-pulse_calc(var(--animation-duration)*8)_ease-in-out_infinite] ds:motion-reduce:animate-none ds:forced-colors:bg-[GrayText] ds:forced-colors:outline ds:forced-colors:outline-1 ds:forced-colors:outline-[CanvasText] ds:forced-colors:animate-none';\n\ntype IndicatorTone = 'success' | 'info' | 'warning' | 'error' | 'accent';\n\nconst INDICATOR_DISC_TONE: Record<IndicatorTone, string> = {\n success: 'ds:text-[color:var(--success-foreground)]',\n info: 'ds:text-[color:var(--info-foreground)]',\n warning: 'ds:text-[color:var(--warning-foreground)]',\n error: 'ds:text-[color:var(--error-foreground)]',\n // Same AA-clearing accent mix Badge's accentSoft uses for its ink.\n accent:\n 'ds:text-[color:color-mix(in_srgb,var(--accent)_40%,var(--foreground))]',\n};\n\n/* Status → disc tone — the same semantic mapping as the accent bar. */\nconst STATUS_DISC_TONE: Record<CalendarEventStatus, IndicatorTone> = {\n confirmed: 'success',\n waiting: 'info',\n in_care: 'accent',\n done: 'success',\n cancelled: 'error',\n absent: 'warning',\n};\n\nexport const STATUS_LABEL_KEYS: Record<CalendarEventStatus, string> = {\n confirmed: 'calendar.status.confirmed',\n waiting: 'calendar.status.waiting',\n in_care: 'calendar.status.inCare',\n done: 'calendar.status.done',\n cancelled: 'calendar.status.cancelled',\n absent: 'calendar.status.absent',\n};\n\nexport const EVENT_FLAGS = [\n {\n field: 'hasUnassignedPatient',\n Icon: TriangleAlert,\n labelKey: 'calendarWorkspace.details.indicators.unassignedPatient',\n tone: 'warning',\n },\n {\n field: 'hasHighlightedAnamnesis',\n Icon: HeartPulse,\n labelKey: 'calendarWorkspace.details.indicators.anamnesis',\n tone: 'accent',\n },\n {\n field: 'hasBillableAmount',\n Icon: Euro,\n labelKey: 'calendarWorkspace.details.indicators.billable',\n tone: 'warning',\n },\n {\n field: 'isBookedOnline',\n Icon: Globe,\n labelKey: 'calendarWorkspace.details.indicators.bookedOnline',\n tone: 'info',\n },\n {\n field: 'isTelehealth',\n Icon: Video,\n labelKey: 'calendarWorkspace.details.indicators.telehealth',\n tone: 'info',\n },\n {\n field: 'isRecurring',\n Icon: Repeat,\n labelKey: 'calendarWorkspace.details.indicators.recurring',\n tone: 'info',\n },\n] as const;\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst calendarEventCardVariants = cva(\n [\n // FullCalendar supplies the box. The card is the `eventcard` size\n // container: the `ds:eventcard-*` tier variants (declared in\n // src/styles.css) read its width and height to prioritise identity,\n // then treatment, time and markers.\n 'calendar-event-card ds:relative ds:block ds:[container-name:eventcard]',\n 'ds:w-full',\n 'ds:ps-[var(--spacing-2xs)] ds:pe-[var(--spacing-2xs)]',\n 'ds:rounded-[var(--radius-sm)]',\n // The type-role alias, so the text (and with it every em tier\n // threshold) grows one step under .theme-accessible.\n 'ds:text-[length:var(--type-body-sm-size)]',\n 'ds:font-[var(--font-weight-medium)]',\n 'ds:leading-tight ds:text-start',\n 'ds:overflow-hidden',\n // kept verbatim from the former base (inert on a non-focusable div\n // inside FC; harmless)\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n // SINGLE PAINTED SURFACE — always present, never conditional. One\n // declaration per paint channel; value chain = \"caller custom prop,\n // else token\". This structurally eliminates the CVA-vs-override\n // specificity race (the old double-paint bug) — stylesheet order\n // becomes irrelevant.\n 'ds:[background-color:var(--calendar-event-bg,var(--primary))]',\n 'ds:[color:var(--calendar-event-text,var(--primary-foreground))]',\n 'ds:border ds:[border-color:var(--calendar-event-border,transparent)]',\n ].join(' '),\n {\n variants: {\n layout: {\n // Timed grids: FullCalendar supplies a definite block size. A\n // standalone card with no height falls back to two lines.\n grid: [\n 'ds:h-full ds:[container-type:size] ds:[min-block-size:0]',\n 'ds:[contain-intrinsic-block-size:calc(var(--type-body-sm-size)*var(--calendar-event-line-height)*2)]',\n ].join(' '),\n // Month cells: exactly one line.\n month: [\n 'calendar-event-card--month ds:[container-type:size]',\n 'ds:[block-size:calc(var(--type-body-sm-size)*var(--calendar-event-line-height)_+_var(--spacing-2xs))]',\n ].join(' '),\n // Lists and timelines size from content: width tiers only.\n flow: [\n 'calendar-event-card--flow ds:[container-type:inline-size]',\n 'ds:[min-block-size:calc(var(--type-body-sm-size)*var(--calendar-event-line-height))]',\n ].join(' '),\n },\n // Do not add colour classes to this axis — status is icon + aria\n // only; a unit test asserts identical computed background\n // across all six statuses.\n status: {\n none: '',\n confirmed: '',\n waiting: '',\n in_care: '',\n done: '',\n cancelled: 'ds:line-through',\n absent: '',\n },\n bookedOnline: {\n // class name kept as a stable inert DOM hook; the stripe paint\n // lives here (moved from fullcalendar-theme.css) so it works in\n // the card's own stories, outside .fc-theme-alfadocs.\n // currentcolor = resolved ink, so stripes stay visible over any\n // picker colour.\n true: 'event-booked-online ds:bg-[image:repeating-linear-gradient(45deg,transparent,transparent_4px,color-mix(in_srgb,currentcolor_10%,transparent)_4px,color-mix(in_srgb,currentcolor_10%,transparent)_8px)]',\n false: '',\n },\n // Task treatment: CUSTOM-PROPERTY assignments only — the consuming\n // background-color / color / border-color declarations stay in the\n // base above, so this cannot re-open the CVA-vs-override specificity\n // race, and a caller's inline picker hex (set as the same custom\n // properties via `style`) still wins. `border-dashed` is a\n // border-style declaration — no property collision either.\n kind: {\n // The appointment's COLOUR IDENTITY edge — a thick start border\n // in the event colour, platform-agenda style, so the colour\n // reads even on sliver-height cards. Tasks keep the 1px edge:\n // muted to-dos carry no colour identity.\n appointment: 'ds:border-s-4',\n // Draft treatment — an appointment being COMPOSED, not yet saved\n // (the slot a user just picked, mirrored on the grid while the\n // editor is open). Same custom-property-only discipline as\n // `task`: dashed outline over a light primary tint, so the\n // placeholder reads as pending rather than as a booked slot.\n draft: [\n 'ds:border-dashed',\n 'ds:[--calendar-event-bg:color-mix(in_srgb,var(--primary)_10%,var(--card))]',\n 'ds:[--calendar-event-text:var(--foreground)]',\n 'ds:[--calendar-event-border:var(--primary)]',\n ].join(' '),\n // Details pending — the block IS a booked appointment, so it\n // keeps the colour-identity edge and assigns no paint of its own.\n // Only the NAME is missing; the bar above stands in for it.\n 'pending-details': 'ds:border-s-4',\n task: [\n 'ds:border-dashed',\n 'ds:[--calendar-event-bg:var(--muted)]',\n 'ds:[--calendar-event-text:var(--muted-foreground)]',\n 'ds:[--calendar-event-border:color-mix(in_srgb,currentcolor_45%,transparent)]',\n ].join(' '),\n },\n // Tinted colour scheme — the chip-family look: the picker colour\n // becomes a SOLID BORDER over a light tint of itself (theme-aware\n // via color-mix with --card), text on the theme's foreground\n // tokens. Custom-property assignments only — the painted\n // declarations stay in the base. The runtime hex arrives as\n // `--calendar-event-accent` (inline). Never combined with the task\n // variant: the component forces `solid` for tasks so exactly one\n // class-level assignment of each property exists per render.\n colorStyle: {\n solid: '',\n tinted: [\n 'ds:[--calendar-event-bg:color-mix(in_srgb,var(--calendar-event-accent,var(--primary))_12%,var(--card))]',\n 'ds:[--calendar-event-text:var(--foreground)]',\n 'ds:[--calendar-event-border:var(--calendar-event-accent,var(--primary))]',\n ].join(' '),\n },\n },\n defaultVariants: {\n layout: 'grid',\n status: 'none',\n bookedOnline: false,\n kind: 'appointment',\n colorStyle: 'solid',\n },\n },\n);\n\n/* Card slots. The `event-card-*` class names are inert DOM hooks for tests\n and hosts; every style is a `ds:` utility. Tier variants apply to timed\n grids; month and flow replace the ones they override (see each slot). */\n\nconst cardContent = [\n 'event-card-content ds:grid ds:grid-cols-[minmax(0,1fr)_auto] ds:items-start',\n 'ds:gap-x-[var(--spacing-2xs)] ds:leading-[var(--calendar-event-line-height)]',\n // Stretch, so a secondary line is as wide as the card and a long word\n // wraps inside it rather than running past the edge.\n 'ds:eventcard-narrow:flex ds:eventcard-narrow:flex-col ds:eventcard-narrow:items-stretch',\n // A 15-minute compact tile: the meta size on a tight line.\n 'ds:eventcard-tiny:text-[length:var(--type-meta-size)] ds:eventcard-tiny:leading-[var(--calendar-event-compact-line-height)]',\n].join(' ');\n\nconst cardHeading = [\n 'event-card-heading ds:flex ds:items-baseline ds:gap-[var(--spacing-2xs)] ds:min-w-0',\n 'ds:eventcard-narrow:w-full',\n 'ds:eventcard-narrow-tall:flex-col ds:eventcard-narrow-tall:items-stretch ds:eventcard-narrow-tall:gap-0',\n].join(' ');\n\nconst cardName = cva(\n [\n 'event-card-name ds:min-w-0 ds:flex-1 ds:font-[var(--font-weight-semibold)]',\n // Wrap at spaces first; break inside a word only when it cannot fit.\n 'ds:wrap-break-word',\n 'ds:eventcard-narrow:pe-[var(--spacing-xs)]',\n ].join(' '),\n {\n variants: {\n layout: {\n grid: [\n 'ds:line-clamp-1 ds:eventcard-h3:line-clamp-2',\n // Tall slivers: the name runs down the card.\n 'ds:eventcard-sliver-tall:block ds:eventcard-sliver-tall:[writing-mode:vertical-rl] ds:eventcard-sliver-tall:[text-orientation:mixed]',\n 'ds:eventcard-sliver-tall:whitespace-nowrap ds:eventcard-sliver-tall:text-ellipsis ds:eventcard-sliver-tall:flex-none ds:eventcard-sliver-tall:pe-0',\n 'ds:eventcard-sliver-tall:[max-inline-size:calc(100cqmax_-_var(--spacing-md))]',\n 'ds:eventcard-sliver-h2:line-clamp-2 ds:eventcard-sliver-h2:pe-0',\n // Too thin for a legible line: colour and the priority marker.\n 'ds:eventcard-hairline:hidden',\n ].join(' '),\n month: 'ds:line-clamp-1',\n flow: 'ds:line-clamp-2',\n },\n // Room for the one-line \"marker +N\" cluster that sits over the end:\n // sized in em of the card text, like the cluster it clears.\n hiddenMarkers: {\n true: 'ds:eventcard-narrow-count:pe-[2.25em]',\n false: '',\n },\n },\n },\n);\n\n/* With a surname to show, slivers swap the full title for it. */\nconst cardFullTitle = cva('event-card-full-title', {\n variants: {\n hasShortTitle: { true: 'ds:eventcard-sliver:hidden', false: '' },\n },\n});\n\nconst cardKindIcon =\n 'event-card-kind-icon ds:inline ds:size-[1em] ds:me-[var(--spacing-2xs)] ds:align-text-bottom';\n\nconst cardTime = cva(\n 'event-card-time ds:hidden ds:shrink-0 ds:whitespace-nowrap ds:text-[length:var(--type-meta-size)]',\n {\n variants: {\n layout: {\n // Wide cards, and tall cards from 112px, show the time; tall narrow\n // cards put the start under the name.\n grid: 'ds:eventcard-w176:inline ds:eventcard-tall:inline ds:eventcard-narrow-tall:block',\n month: 'ds:eventcard-w176:inline',\n flow: 'ds:eventcard-w176:inline',\n },\n },\n },\n);\n\nconst cardStart = cva('event-card-start', {\n variants: {\n layout: {\n grid: 'ds:eventcard-w256:hidden',\n month: '',\n flow: 'ds:eventcard-w256:hidden',\n },\n },\n});\n\nconst cardRange = cva('event-card-range', {\n variants: {\n layout: {\n grid: 'ds:hidden ds:eventcard-w256:inline',\n month: 'ds:hidden',\n flow: 'ds:hidden ds:eventcard-w256:inline',\n },\n },\n});\n\nconst secondaryLine =\n 'ds:col-span-full ds:overflow-hidden ds:text-[length:var(--type-meta-size)] ds:wrap-break-word';\n\nconst cardSuffix = cva(`event-card-suffix ${secondaryLine}`, {\n variants: {\n layout: {\n grid: [\n 'ds:hidden ds:eventcard-h2:line-clamp-1',\n 'ds:eventcard-narrow:order-2 ds:eventcard-narrow-h2:hidden ds:eventcard-narrow-h5:line-clamp-1',\n 'ds:eventcard-sliver:hidden ds:eventcard-h7-mid:line-clamp-2',\n ].join(' '),\n month: 'ds:hidden',\n flow: 'ds:line-clamp-1 ds:eventcard-narrow:order-2',\n },\n },\n});\n\nconst cardContext = cva(`event-card-context ${secondaryLine}`, {\n variants: {\n layout: {\n grid: 'ds:hidden ds:eventcard-narrow:order-3 ds:eventcard-context:line-clamp-1',\n month: 'ds:hidden',\n flow: 'ds:hidden',\n },\n },\n});\n\n/* One-line narrow cards: the cluster sits over the end of the name. */\nconst NARROW_OVERLAY_MARKERS =\n 'ds:eventcard-narrow:absolute ds:eventcard-narrow:end-0 ds:eventcard-narrow:[inset-block-end:0] ds:eventcard-narrow:gap-0';\n\nconst cardMarkers = cva(\n 'event-card-markers ds:flex ds:items-center ds:gap-[var(--spacing-2xs)] ds:col-[2] ds:row-[1]',\n {\n variants: {\n layout: {\n grid: [\n NARROW_OVERLAY_MARKERS,\n 'ds:eventcard-narrow-h2:static ds:eventcard-narrow-h2:gap-[var(--spacing-2xs)] ds:eventcard-narrow-h2:order-1',\n 'ds:eventcard-tall:row-auto ds:eventcard-tall:col-span-full',\n ].join(' '),\n month: NARROW_OVERLAY_MARKERS,\n // Lists and timelines have no height tiers, so a narrow flow card\n // keeps its markers in the column, between name and treatment,\n // instead of laying them over the treatment line. The row wraps so\n // a slim card's dot never falls off the edge.\n flow: 'ds:eventcard-narrow:order-1 ds:eventcard-narrow:flex-wrap',\n },\n },\n },\n);\n\n/* Marker visibility by priority rank: the first always shows; later ones\n join as the card widens, and all show on tall wide cards. Month shows\n the first only. */\nconst cardMarker = cva(\n `event-card-marker ${INDICATOR_DISC_BASE} ds:size-[1em] ds:[&_svg]:size-[0.75em] ds:eventcard-narrow:size-[0.75em] ds:eventcard-narrow-h2:size-[1em]`,\n {\n variants: {\n rank: {\n first: 'ds:inline-flex',\n second: 'ds:hidden',\n third: 'ds:hidden',\n rest: 'ds:hidden',\n },\n layout: { grid: '', month: '', flow: '' },\n },\n compoundVariants: [\n {\n layout: ['grid', 'flow'],\n rank: 'second',\n class: 'ds:eventcard-w256:inline-flex',\n },\n {\n layout: ['grid', 'flow'],\n rank: 'third',\n class: 'ds:eventcard-w352:inline-flex',\n },\n {\n layout: ['grid', 'flow'],\n rank: ['second', 'third', 'rest'],\n class: 'ds:eventcard-tall-wide:inline-flex',\n },\n ],\n },\n);\n\nconst MARKER_RANK = ['first', 'second', 'third'] as const;\n\n/* \"+N\" after the first `capacity` markers; at most one shows per tier. */\nconst cardMore = cva(\n 'event-card-more ds:text-[length:var(--type-meta-size)] ds:whitespace-nowrap',\n {\n variants: {\n capacity: {\n 1: 'event-card-more-1',\n 2: 'event-card-more-2 ds:hidden',\n 3: 'event-card-more-3 ds:hidden',\n },\n layout: { grid: '', month: '', flow: '' },\n },\n compoundVariants: [\n { layout: 'month', capacity: 1, class: 'ds:inline' },\n {\n layout: 'grid',\n capacity: 1,\n class: [\n 'ds:inline ds:eventcard-w256:hidden ds:eventcard-narrow:hidden',\n 'ds:eventcard-narrow-count:inline ds:eventcard-narrow-h2:inline ds:eventcard-tall-wide:hidden',\n ].join(' '),\n },\n // Flow keeps narrow markers in the column, with room to count from\n // 64px; slimmer flow cards fall back to the dot.\n {\n layout: 'flow',\n capacity: 1,\n class:\n 'ds:inline ds:@max-[64px]/eventcard:hidden ds:eventcard-w256:hidden',\n },\n {\n layout: ['grid', 'flow'],\n capacity: 2,\n class:\n 'ds:eventcard-w256:inline ds:eventcard-w352:hidden ds:eventcard-tall-wide:hidden',\n },\n {\n layout: ['grid', 'flow'],\n capacity: 3,\n class: 'ds:eventcard-w352:inline ds:eventcard-tall-wide:hidden',\n },\n ],\n },\n);\n\n/* The sliver cue: a dot saying \"more markers than shown\", where \"+N\" does\n not fit. Rendered only when markers are actually hidden. Month always\n counts, so it has none. */\nconst sliverCue = cva(\n 'event-card-sliver-cue ds:hidden ds:items-center ds:text-[length:var(--type-meta-size)]',\n {\n variants: {\n layout: {\n grid: 'ds:eventcard-narrow:flex ds:eventcard-narrow-count:hidden ds:eventcard-narrow-h2:hidden',\n month: '',\n flow: 'ds:@max-[64px]/eventcard:flex',\n },\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Props */\n/* ------------------------------------------------------------------ */\n\n/**\n * The single painted surface of a calendar event.\n *\n * Colour model (platform parity): the caller's picker hex\n * (`backgroundColor` / `textColor` / `borderColor`) is the ONLY thing that\n * paints the card. `status` never paints the surface — it selects an icon\n * and (for `cancelled`) a line-through.\n *\n * Non-interactive by design: inside FullCalendar the outer harness anchor\n * owns click/drag/focus; standalone consumers wrap the card in their own\n * button/link. No onClick in the contract.\n */\nexport interface CalendarEventCardProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'title'\n> {\n /**\n * Primary line. Pass the ALREADY-MASKED title when privacy applies — the\n * card never receives a name it must not render, so it cannot leak it\n * (visually or via the composed aria-label).\n */\n title: string;\n /** Optional surname/short form for slivers. Ignored when privacyMasked. */\n shortTitle?: string;\n /** Localised start time for narrow cards. No parsing of rangeText. */\n startText?: string;\n /** Month keeps one line; flow preserves intrinsic height in lists/timelines. */\n layout?: 'grid' | 'month' | 'flow';\n /** Opposite resource axis: operator initials or chair, on tall cards. */\n contextLabel?: string;\n /**\n * Secondary description, clamped to the lines the card can hold. Note: the\n * Calendar's privacy mode does NOT mask the suffix (current behaviour,\n * preserved deliberately).\n */\n suffix?: string;\n /**\n * Pre-formatted, localised time range (e.g. \"09:00 – 09:45\"). The\n * Calendar adapter computes it via Intl.DateTimeFormat.formatRange.\n * Included in the composed aria-label whenever present (even when the\n * visual time line is suppressed via showTime/allDay — matches today's\n * Calendar behaviour byte-for-byte).\n */\n rangeText?: string;\n /**\n * Gates the VISUAL time line only (aria keeps rangeText). Mirrors\n * CalendarProps.showTime. @default true\n */\n showTime?: boolean;\n /**\n * All-day events suppress the visual time line (aria keeps rangeText).\n * @default false\n */\n allDay?: boolean;\n\n /**\n * Lifecycle state (6-state, matches the platform DoctorAppointment\n * lifecycle) → status icon + line-through for `cancelled` +\n * localised label in the aria-label. NEVER paints the\n * card surface.\n */\n status?: CalendarEventStatus;\n\n /**\n * Runtime hex (#rgb or #rrggbb) from the consumer's colour picker — THE\n * painted surface. Injected as `--calendar-event-bg` via the sanctioned\n * inline custom-property pattern (23-constraints §inline-style exception).\n */\n backgroundColor?: string;\n /**\n * Runtime hex paired with backgroundColor. When omitted while\n * backgroundColor is set, the card auto-derives black/white ink by\n * luminance (provably WCAG AA ≥ 4.58:1 for any opaque colour).\n */\n textColor?: string;\n /**\n * Runtime hex border for delineating light surfaces. The platform sends\n * '#cccccc' when backgroundColor is '#ffffff' and omits it otherwise.\n * Falls back to transparent; appointments have a 4px start edge and\n * a 1px border elsewhere (tasks and drafts have 1px on every side), so toggling never shifts layout and event boundaries\n * survive forced-colors / Windows High Contrast for free.\n */\n borderColor?: string;\n\n /* Indicator icons — names identical to CalendarEvent fields (1:1 map). */\n /** Globe icon + diagonal stripe overlay. */\n isBookedOnline?: boolean;\n /** AlertTriangle icon. */\n hasUnassignedPatient?: boolean;\n /** HeartPulse icon. */\n hasHighlightedAnamnesis?: boolean;\n /** Euro icon. */\n hasBillableAmount?: boolean;\n /** Video icon. */\n isTelehealth?: boolean;\n /**\n * Repeat icon — this event belongs to a REPEATING SERIES. Set it on\n * every occurrence, not only the first: the flag answers \"will moving\n * or deleting this touch other appointments?\", which is true of a\n * modified occurrence too. Series ROLE (which row owns the rule) is a\n * separate concern — see `CalendarEvent.isRecurrenceParent`.\n */\n isRecurring?: boolean;\n /**\n * Task treatment — a calendar-scheduled to-do renders distinctly from an\n * appointment: dashed outline (derived from the resolved ink when no\n * `borderColor` is supplied), muted default surface (an explicit\n * `backgroundColor`/`textColor` still wins), a leading clipboard glyph,\n * and a localised \"task\" word appended to the accessible name. Emitted as\n * `data-kind=\"task\"` for DOM hooks.\n */\n isTask?: boolean;\n /**\n * Draft treatment — a placeholder for an appointment being composed:\n * the slot the user just picked, mirrored on the grid while the editor\n * is open. Dashed outline over a light primary tint, with a localised\n * \"draft\" word appended to the accessible name. Emitted as\n * `data-kind=\"draft\"`. Takes precedence over `isTask`, and like a task\n * it forces the solid paint path so exactly one class-level assignment\n * of each paint custom property exists per render.\n */\n isDraft?: boolean;\n /**\n * Details-pending treatment — a REAL booked appointment an\n * occupancy-first host drew from the slot it occupies while it still\n * fetches whose it is. The card keeps its colour and size and renders an\n * `aria-hidden` skeleton bar where the title goes, with the localised\n * \"loading details\" word in the accessible name and\n * `data-kind=\"pending-details\"` as the hook. Wins over `isDraft`/`isTask`.\n */\n detailsPending?: boolean;\n /**\n * Colour scheme for the picker colour. `'solid'` (default) is the\n * platform model — the hex paints the whole surface, ink auto-derived.\n * `'tinted'` is the chip-family scheme: the hex becomes a SOLID BORDER\n * over a light tint of itself (theme-aware via color-mix with `--card`),\n * with text on the theme's foreground tokens — `textColor` and\n * `borderColor` are ignored under it. Tasks keep their muted dashed\n * treatment regardless.\n */\n colorStyle?: 'solid' | 'tinted';\n\n /**\n * Resource title (chair/operator) woven into the composed aria-label\n * only — never rendered visually. The Calendar adapter resolves\n * resourceId → title before passing it.\n */\n resourceLabel?: string;\n /**\n * The title is a privacy MASK (the Calendar's privacy mode swapped the\n * patient name for `privacyModeTitle`). Renders a crossed-out-eye glyph\n * beside the mask so the redaction is legible as deliberate, with its\n * own breathing room after the time.\n */\n privacyMasked?: boolean;\n /**\n * Stable event id → emitted as `data-event-id` (Calendar.focusEvent\n * targets it) and used as the contrast-warning dedup context.\n */\n eventId?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const CalendarEventCard = forwardRef<\n HTMLDivElement,\n CalendarEventCardProps\n>(\n (\n {\n title,\n shortTitle,\n startText,\n layout = 'grid',\n contextLabel,\n suffix,\n rangeText,\n showTime = true,\n allDay = false,\n status,\n backgroundColor,\n textColor,\n borderColor,\n isBookedOnline = false,\n hasUnassignedPatient,\n hasHighlightedAnamnesis,\n hasBillableAmount,\n isTelehealth,\n isRecurring,\n isTask = false,\n isDraft = false,\n detailsPending = false,\n colorStyle = 'solid',\n resourceLabel,\n privacyMasked = false,\n eventId,\n className,\n style,\n 'aria-label': ariaLabelProp,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n\n const markers = [\n ...(status\n ? [\n {\n id: 'status',\n Icon: STATUS_ICON[status],\n label: t(STATUS_LABEL_KEYS[status]),\n tone: STATUS_DISC_TONE[status],\n },\n ]\n : []),\n ...EVENT_FLAGS.filter(({ field }) =>\n Boolean(\n {\n hasUnassignedPatient,\n hasHighlightedAnamnesis,\n hasBillableAmount,\n isBookedOnline,\n isTelehealth,\n isRecurring,\n }[field],\n ),\n ).map(({ field, Icon, labelKey, tone }) => ({\n id: field,\n Icon,\n label: t(labelKey),\n tone,\n })),\n ];\n const statusLabel = status ? t(STATUS_LABEL_KEYS[status]) : undefined;\n const kindLabel = detailsPending\n ? t('calendar.eventKind.pendingDetails')\n : isDraft\n ? t('calendar.eventKind.draft')\n : isTask\n ? t('calendar.eventKind.task')\n : undefined;\n\n /* Accessible name — the Calendar's historical composition, with the\n localised \"task\" word appended for task cards so screen-reader users\n get the same appointment-vs-task distinction the dashed outline and\n clipboard glyph carry visually. An explicit consumer-supplied\n aria-label wins. rangeText is always included when present, even when\n the visual time line is hidden. */\n const ariaLabel =\n ariaLabelProp ??\n [\n title,\n rangeText,\n suffix,\n resourceLabel,\n contextLabel,\n statusLabel,\n kindLabel,\n ...markers\n .filter((marker) => marker.id !== 'status')\n .map((marker) => marker.label),\n ]\n .filter(Boolean)\n .join(', ');\n\n const kind = detailsPending\n ? 'pending-details'\n : isDraft\n ? 'draft'\n : isTask\n ? 'task'\n : 'appointment';\n\n /* Tasks force the solid path — their muted variant owns the paint\n custom properties, so the tinted class must never co-assign them. */\n const tinted = !isTask && !isDraft && colorStyle === 'tinted';\n\n /* Ink derivation — solid scheme only, when the caller paints the\n surface without pairing a text colour. */\n const ink =\n !tinted && !textColor && backgroundColor\n ? resolveInk(backgroundColor)\n : null;\n\n /* DEV-only guardrails — every helper no-ops in production and dedupes\n per session, so calling during render is safe. The tinted scheme\n paints text on theme tokens over a 12% tint, so the solid-scheme\n pair checks don't apply there. */\n const warnContext = eventId ? `event ${eventId}` : 'calendar-event-card';\n if (!tinted) {\n warnLowContrast(backgroundColor, textColor, warnContext);\n if (backgroundColor && !textColor) {\n // no-ops when the hex is parseable (i.e. when resolveInk succeeded)\n warnUnparseableBackground(backgroundColor, warnContext);\n }\n if (backgroundColor && !borderColor) {\n // no-ops unless the background is near-white (luminance > 0.9)\n warnLowDelineation(backgroundColor, warnContext);\n }\n }\n\n /* Per-event colour override: the consuming app passes runtime hex from\n its colour picker. 23-constraints permits inline `style` only as a\n CSS custom-property setter for runtime values that can't be\n enumerated at build time — the consuming background-color / color /\n border-color declarations live in the CVA base as Tailwind arbitrary\n values with token fallbacks. */\n const colourOverrides: CSSProperties | undefined = tinted\n ? backgroundColor\n ? ({ '--calendar-event-accent': backgroundColor } as CSSProperties)\n : undefined\n : backgroundColor || textColor || borderColor\n ? ({\n ...(backgroundColor\n ? { '--calendar-event-bg': backgroundColor }\n : {}),\n ...(textColor\n ? { '--calendar-event-text': textColor }\n : ink === 'on-light'\n ? { '--calendar-event-text': 'var(--event-ink-on-light)' }\n : ink === 'on-dark'\n ? { '--calendar-event-text': 'var(--event-ink-on-dark)' }\n : {}),\n ...(borderColor ? { '--calendar-event-border': borderColor } : {}),\n } as CSSProperties)\n : undefined;\n\n const mergedStyle: CSSProperties | undefined =\n style || colourOverrides ? { ...style, ...colourOverrides } : undefined;\n\n /* A surname for slivers, never under privacy. */\n const showShortTitle = Boolean(\n !privacyMasked && shortTitle?.trim() && shortTitle !== title,\n );\n\n return (\n <div\n ref={ref}\n role=\"group\"\n {...rest}\n className={calendarEventCardVariants({\n layout,\n status: status ?? 'none',\n bookedOnline: isBookedOnline,\n kind,\n colorStyle: tinted ? 'tinted' : 'solid',\n className,\n })}\n // eslint-disable-next-line react/forbid-dom-props -- caller-supplied event bg/text/border hex injected via CSS variables (23-constraints §inline-style exception)\n style={mergedStyle}\n aria-label={ariaLabel}\n data-component=\"calendar-event-card\"\n data-event-id={eventId}\n data-kind={kind}\n data-status={status ?? 'none'}\n data-contrast={\n tinted ? 'tinted' : textColor ? 'custom' : (ink ?? 'default')\n }\n >\n <span className={cardContent} aria-hidden=\"true\">\n <span className={cardHeading}>\n <span\n className={cardName({\n layout,\n hiddenMarkers: markers.length > 1,\n })}\n >\n {detailsPending ? (\n <span aria-hidden=\"true\" className={PENDING_BAR_CLASS} />\n ) : (\n <>\n {isTask ? <ClipboardCheck className={cardKindIcon} /> : null}\n {privacyMasked ? <EyeOff className={cardKindIcon} /> : null}\n <span\n className={cardFullTitle({\n hasShortTitle: showShortTitle,\n })}\n >\n {title}\n </span>\n {showShortTitle ? (\n <span className=\"event-card-short-title ds:hidden ds:eventcard-sliver:inline\">\n {shortTitle}\n </span>\n ) : null}\n </>\n )}\n </span>\n {showTime && !allDay && rangeText ? (\n <span className={cardTime({ layout })}>\n {startText ? (\n <>\n <span className={cardStart({ layout })}>{startText}</span>\n <span className={cardRange({ layout })}>{rangeText}</span>\n </>\n ) : (\n rangeText\n )}\n </span>\n ) : null}\n </span>\n {suffix ? (\n <span className={cardSuffix({ layout })}>{suffix}</span>\n ) : null}\n {contextLabel ? (\n <span className={cardContext({ layout })}>{contextLabel}</span>\n ) : null}\n {markers.length > 0 ? (\n <span className={cardMarkers({ layout })}>\n {markers.map(({ id, Icon, tone }, index) => (\n <span\n key={id}\n data-marker={id}\n aria-hidden=\"true\"\n className={cardMarker({\n rank: MARKER_RANK[index] ?? 'rest',\n layout,\n className: INDICATOR_DISC_TONE[tone],\n })}\n >\n <Icon aria-hidden=\"true\" />\n </span>\n ))}\n {([1, 2, 3] as const).map((capacity) =>\n markers.length > capacity ? (\n <span\n key={capacity}\n className={cardMore({ capacity, layout })}\n >\n {t('calendar.card.more', {\n number: markers.length - capacity,\n })}\n </span>\n ) : null,\n )}\n {markers.length > 1 && layout !== 'month' ? (\n <span className={sliverCue({ layout })}>·</span>\n ) : null}\n </span>\n ) : null}\n </span>\n </div>\n );\n },\n);\nCalendarEventCard.displayName = 'CalendarEventCard';\n"],"names":["parseHex","hex","trimmed","body","r","g","b","relativeLuminance","lin","c","warnLowContrast","bgHex","fgHex","contextLabel","resolveInk","bg","STATUS_ICON","ThumbsUp","Clock","Stethoscope","Check","Ban","UserX","INDICATOR_DISC_BASE","PENDING_BAR_CLASS","INDICATOR_DISC_TONE","STATUS_DISC_TONE","STATUS_LABEL_KEYS","EVENT_FLAGS","TriangleAlert","HeartPulse","Euro","Globe","Video","Repeat","calendarEventCardVariants","cva","cardContent","cardHeading","cardName","cardFullTitle","cardKindIcon","cardTime","cardStart","cardRange","secondaryLine","cardSuffix","cardContext","NARROW_OVERLAY_MARKERS","cardMarkers","cardMarker","MARKER_RANK","cardMore","sliverCue","CalendarEventCard","forwardRef","title","shortTitle","startText","layout","suffix","rangeText","showTime","allDay","status","backgroundColor","textColor","borderColor","isBookedOnline","hasUnassignedPatient","hasHighlightedAnamnesis","hasBillableAmount","isTelehealth","isRecurring","isTask","isDraft","detailsPending","colorStyle","resourceLabel","privacyMasked","eventId","className","style","ariaLabelProp","rest","ref","t","useTranslation","markers","field","Icon","labelKey","tone","statusLabel","kindLabel","ariaLabel","marker","kind","tinted","ink","colourOverrides","mergedStyle","showShortTitle","jsx","jsxs","Fragment","ClipboardCheck","EyeOff","id","index","capacity"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"calendar-event-card-DyFSIehr.js","sources":["../../src/components/_shared/contrast-warning.ts","../../src/components/calendar-event-card/calendar-event-card.tsx"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* Shared contrast guardrail — Calendar + CalendarEventCard */\n/* */\n/* The consuming app supplies runtime hex pairs at several surfaces: */\n/* - event.backgroundColor / event.textColor (+ event.borderColor) */\n/* - modeBannerColor / modeBannerTextColor */\n/* - resource.color / resource.shortTitleTextColor */\n/* */\n/* When the text half of the pair is also a hex (i.e. both halves come */\n/* from the caller), we can validate them synchronously and warn the */\n/* consuming-app developer during DEV if the pair fails WCAG AA normal */\n/* text (4.5:1). When only the background half is supplied, */\n/* `resolveInk` derives a provably AA-safe black/white ink for it. */\n/* Every helper is a no-op in production builds. */\n/* ------------------------------------------------------------------ */\n\n/* Module-level dedup set — keyed on the (bg, fg, context) tuple so the\n same bad pair moving around the calendar only warns once per session.\n Exposed via `resetContrastWarnings()` for test isolation. */\nconst warnedTuples = new Set<string>();\n\n/** Reset the dedup set — intended for use between tests. */\nexport function resetContrastWarnings(): void {\n warnedTuples.clear();\n}\n\n/**\n * Parse a 3-char or 6-char `#RRGGBB` hex string into a linear sRGB\n * triple in the [0,1] range. Returns `null` for any input the caller\n * can't parse (malformed prefix, bad length, non-hex characters) —\n * the helper stays silent in that case rather than emitting noise.\n */\nfunction parseHex(hex: string): [number, number, number] | null {\n if (typeof hex !== 'string') return null;\n const trimmed = hex.trim();\n if (!trimmed.startsWith('#')) return null;\n const body = trimmed.slice(1);\n let r: number;\n let g: number;\n let b: number;\n if (body.length === 3) {\n if (!/^[0-9a-f]{3}$/i.test(body)) return null;\n r = parseInt(body[0] + body[0], 16);\n g = parseInt(body[1] + body[1], 16);\n b = parseInt(body[2] + body[2], 16);\n } else if (body.length === 6) {\n if (!/^[0-9a-f]{6}$/i.test(body)) return null;\n r = parseInt(body.slice(0, 2), 16);\n g = parseInt(body.slice(2, 4), 16);\n b = parseInt(body.slice(4, 6), 16);\n } else {\n return null;\n }\n return [r / 255, g / 255, b / 255];\n}\n\n/**\n * WCAG 2.1 relative luminance. Each channel is gamma-corrected then\n * weighted against the CIE photopic sensitivity of the human eye.\n * https://www.w3.org/TR/WCAG21/#dfn-relative-luminance\n */\nfunction relativeLuminance([r, g, b]: [number, number, number]): number {\n const lin = (c: number): number =>\n c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n return 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b);\n}\n\n/**\n * WCAG 2.1 contrast ratio. Always returns a value in [1, 21]; the\n * relative-luminance lighter-over-darker convention is applied here.\n */\nfunction contrastRatio(\n bg: [number, number, number],\n fg: [number, number, number],\n): number {\n const l1 = relativeLuminance(bg);\n const l2 = relativeLuminance(fg);\n const lighter = Math.max(l1, l2);\n const darker = Math.min(l1, l2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * DEV-only WCAG AA guardrail for caller-supplied hex pairs.\n *\n * - No-op when `import.meta.env.DEV` is false.\n * - No-op when either half of the pair is missing (the \"fg missing →\n * inherits DS token\" case is a docs concern; the DS token isn't a\n * hex at runtime so we can't check it here).\n * - No-op when either hex can't be parsed (silent — not the helper's\n * concern to police malformed input).\n * - Deduplicated by `(bgHex, fgHex, contextLabel)` tuple so moving a\n * ratio-bad event around the calendar doesn't spam the console.\n *\n * @param bgHex - Caller-supplied background hex (e.g. `'#c2185b'`)\n * @param fgHex - Caller-supplied foreground hex (e.g. `'#ffffff'`)\n * @param contextLabel - Short description for the warning (e.g. `'event e1'`).\n */\nexport function warnLowContrast(\n bgHex: string | undefined,\n fgHex: string | undefined,\n contextLabel: string,\n): void {\n if (!import.meta.env.DEV) return;\n if (!bgHex || !fgHex) return;\n\n const bg = parseHex(bgHex);\n const fg = parseHex(fgHex);\n if (!bg || !fg) return;\n\n const ratio = contrastRatio(bg, fg);\n if (ratio >= 4.5) return;\n\n const key = `${bgHex}|${fgHex}|${contextLabel}`;\n if (warnedTuples.has(key)) return;\n warnedTuples.add(key);\n\n /* `bg` parsed successfully above, so `resolveInk(bgHex)` is guaranteed\n to produce a compliant ink — the omit-textColor hint is always valid\n at this point. */\n console.warn(\n `[Calendar] Low contrast on ${contextLabel}: ${bgHex} / ${fgHex} (ratio ${ratio.toFixed(\n 2,\n )}, target 4.5). Pass a matching textColor/fgHex, pick a higher-contrast background, or omit textColor to let the kit choose a compliant ink.`,\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Ink derivation — bg-only caller colours */\n/* ------------------------------------------------------------------ */\n\nexport type EventInk = 'on-light' | 'on-dark';\n\n/**\n * Pick the ink for an arbitrary opaque bg hex. Returns `null` when the\n * input can't be parsed (`#rgb` / `#rrggbb` only).\n *\n * The threshold 0.1791 is the relative luminance at which\n * `contrast(bg, #fff) === contrast(bg, #000)`; the better of the two\n * always yields ≥ 4.58:1 (the minimum, at a mid-grey ≈ `#757575`) —\n * provably WCAG AA-safe for any opaque background.\n */\nexport function resolveInk(bgHex: string): EventInk | null {\n const bg = parseHex(bgHex);\n if (!bg) return null;\n // threshold where contrast(bg, #fff) === contrast(bg, #000)\n return relativeLuminance(bg) > 0.1791 ? 'on-light' : 'on-dark';\n}\n\n/**\n * DEV-only, one-shot warning for a caller `backgroundColor` the kit can't\n * parse (`rgb(…)`, keywords, malformed hex). The browser can still paint\n * it, but the text falls back to the token default and contrast can't be\n * verified. Deduplicated by `(bgHex, contextLabel)`.\n */\nexport function warnUnparseableBackground(\n bgHex: string,\n contextLabel: string,\n): void {\n if (!import.meta.env.DEV) return;\n if (parseHex(bgHex)) return;\n\n const key = `unparseable|${bgHex}|${contextLabel}`;\n if (warnedTuples.has(key)) return;\n warnedTuples.add(key);\n\n console.warn(\n `[Calendar] Unparseable backgroundColor on ${contextLabel}: \"${bgHex}\". ` +\n `Expected #rgb or #rrggbb — contrast cannot be verified and the text ` +\n `colour falls back to the token default.`,\n );\n}\n\n/**\n * DEV-only, one-shot warning for a near-white `backgroundColor`\n * (relative luminance > 0.9) supplied without a `borderColor` — the\n * event may be invisible against the calendar grid. The kit warns, it\n * does not repaint (delineation is decorative under WCAG 1.4.11 and the\n * consumer owns the picker colour). Deduplicated by `(bgHex, contextLabel)`.\n */\nexport function warnLowDelineation(bgHex: string, contextLabel: string): void {\n if (!import.meta.env.DEV) return;\n\n const bg = parseHex(bgHex);\n if (!bg) return;\n if (relativeLuminance(bg) <= 0.9) return;\n\n const key = `delineation|${bgHex}|${contextLabel}`;\n if (warnedTuples.has(key)) return;\n warnedTuples.add(key);\n\n console.warn(\n `[Calendar] Light backgroundColor without borderColor on ${contextLabel}: ` +\n `${bgHex} may be invisible against the grid — pass a borderColor ` +\n `(the platform convention sends a light-grey border for white backgrounds).`,\n );\n}\n","/* ------------------------------------------------------------------ */\n/* CalendarEventCard — the single painted surface of a calendar event. */\n/* */\n/* Colour model (platform parity): the caller's picker hex */\n/* (backgroundColor / textColor / borderColor) is the ONLY thing that */\n/* paints the card. `status` never paints the surface — it selects an */\n/* icon and (for `cancelled`) a line-through. When no picker colour */\n/* is supplied the surface falls back to the theme's --primary / */\n/* --primary-foreground pair. */\n/* */\n/* Non-interactive by design: inside FullCalendar the outer harness */\n/* anchor owns click/drag/focus; standalone consumers wrap the card in */\n/* their own button/link. No onClick in the contract. */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef } from 'react';\nimport type { CSSProperties, HTMLAttributes } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { cva } from 'class-variance-authority';\nimport {\n ThumbsUp,\n Clock,\n Stethoscope,\n Check,\n Ban,\n UserX,\n Globe,\n TriangleAlert,\n HeartPulse,\n Euro,\n Video,\n Repeat,\n EyeOff,\n ClipboardCheck,\n type LucideIcon,\n} from 'lucide-react';\n// Type-only import — erased at build, no runtime cycle with calendar.tsx's\n// runtime import of this card. Do NOT convert to a value import.\nimport type { CalendarEventStatus } from '../calendar/calendar';\nimport {\n warnLowContrast,\n resolveInk,\n warnUnparseableBackground,\n warnLowDelineation,\n} from '../_shared/contrast-warning';\n\n/* ------------------------------------------------------------------ */\n/* Status lookups */\n/* ------------------------------------------------------------------ */\n\nexport const STATUS_ICON: Record<CalendarEventStatus, LucideIcon> = {\n confirmed: ThumbsUp,\n waiting: Clock,\n in_care: Stethoscope,\n done: Check,\n cancelled: Ban,\n absent: UserX,\n};\n\n/* Status → i18n key lookup. Kept as a literal object (not a template)\n so static-analysis extractors can find every key. Keys already exist\n in all 18 locale bundles — do not add new ones here. */\n/* Indicator DISC — option D of the design review: each glyph in a small\n circle on the plain card surface (hairline border + row-lift shadow)\n with the SEMANTIC colour as icon ink. Chip-grade contrast on any\n picker colour without a plate; ink tokens mirror Badge's variants so\n the vocabulary stays one system. */\nconst INDICATOR_DISC_BASE =\n 'ds:shrink-0 ds:items-center ds:justify-center ds:rounded-[var(--radius-full)] ds:bg-[color:var(--card)] ds:border ds:border-[color:var(--border)] ds:shadow-[var(--shadow-sm)]';\n\n/* DETAILS-PENDING bar — the Skeleton component's own classes, inlined on\n a <span>: Skeleton renders a <div>, which cannot live inside the card's\n inline text cell. Decorative (aria-hidden) because the composed\n aria-label already carries the localised \"loading details\" word. */\nconst PENDING_BAR_CLASS =\n 'ds:inline-block ds:h-3 ds:w-[6ch] ds:align-middle ds:rounded-[var(--radius-sm)] ds:bg-[var(--muted)] ds:animate-[skeleton-pulse_calc(var(--animation-duration)*8)_ease-in-out_infinite] ds:motion-reduce:animate-none ds:forced-colors:bg-[GrayText] ds:forced-colors:outline ds:forced-colors:outline-1 ds:forced-colors:outline-[CanvasText] ds:forced-colors:animate-none';\n\ntype IndicatorTone = 'success' | 'info' | 'warning' | 'error' | 'accent';\n\nconst INDICATOR_DISC_TONE: Record<IndicatorTone, string> = {\n success: 'ds:text-[color:var(--success-foreground)]',\n info: 'ds:text-[color:var(--info-foreground)]',\n warning: 'ds:text-[color:var(--warning-foreground)]',\n error: 'ds:text-[color:var(--error-foreground)]',\n // Same AA-clearing accent mix Badge's accentSoft uses for its ink.\n accent:\n 'ds:text-[color:color-mix(in_srgb,var(--accent)_40%,var(--foreground))]',\n};\n\n/* Status → disc tone — the same semantic mapping as the accent bar. */\nconst STATUS_DISC_TONE: Record<CalendarEventStatus, IndicatorTone> = {\n confirmed: 'success',\n waiting: 'info',\n in_care: 'accent',\n done: 'success',\n cancelled: 'error',\n absent: 'warning',\n};\n\nexport const STATUS_LABEL_KEYS: Record<CalendarEventStatus, string> = {\n confirmed: 'calendar.status.confirmed',\n waiting: 'calendar.status.waiting',\n in_care: 'calendar.status.inCare',\n done: 'calendar.status.done',\n cancelled: 'calendar.status.cancelled',\n absent: 'calendar.status.absent',\n};\n\nexport const EVENT_FLAGS = [\n {\n field: 'hasUnassignedPatient',\n Icon: TriangleAlert,\n labelKey: 'calendarWorkspace.details.indicators.unassignedPatient',\n tone: 'warning',\n },\n {\n field: 'hasHighlightedAnamnesis',\n Icon: HeartPulse,\n labelKey: 'calendarWorkspace.details.indicators.anamnesis',\n tone: 'accent',\n },\n {\n field: 'hasBillableAmount',\n Icon: Euro,\n labelKey: 'calendarWorkspace.details.indicators.billable',\n tone: 'warning',\n },\n {\n field: 'isBookedOnline',\n Icon: Globe,\n labelKey: 'calendarWorkspace.details.indicators.bookedOnline',\n tone: 'info',\n },\n {\n field: 'isTelehealth',\n Icon: Video,\n labelKey: 'calendarWorkspace.details.indicators.telehealth',\n tone: 'info',\n },\n {\n field: 'isRecurring',\n Icon: Repeat,\n labelKey: 'calendarWorkspace.details.indicators.recurring',\n tone: 'info',\n },\n] as const;\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst calendarEventCardVariants = cva(\n [\n // FullCalendar supplies the box. The card is the `eventcard` size\n // container: the `ds:eventcard-*` tier variants (declared in\n // src/styles.css) read its width and height to prioritise identity,\n // then treatment, time and markers.\n 'calendar-event-card ds:relative ds:block ds:[container-name:eventcard]',\n 'ds:w-full',\n 'ds:ps-[var(--spacing-2xs)] ds:pe-[var(--spacing-2xs)]',\n 'ds:rounded-[var(--radius-sm)]',\n // The type-role alias, so the text (and with it every em tier\n // threshold) grows one step under .theme-accessible.\n 'ds:text-[length:var(--type-body-sm-size)]',\n 'ds:font-[var(--font-weight-medium)]',\n 'ds:leading-tight ds:text-start',\n 'ds:overflow-hidden',\n // kept verbatim from the former base (inert on a non-focusable div\n // inside FC; harmless)\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n // SINGLE PAINTED SURFACE — always present, never conditional. One\n // declaration per paint channel; value chain = \"caller custom prop,\n // else token\". This structurally eliminates the CVA-vs-override\n // specificity race (the old double-paint bug) — stylesheet order\n // becomes irrelevant.\n 'ds:[background-color:var(--calendar-event-bg,var(--primary))]',\n 'ds:[color:var(--calendar-event-text,var(--primary-foreground))]',\n 'ds:border ds:[border-color:var(--calendar-event-border,transparent)]',\n ].join(' '),\n {\n variants: {\n layout: {\n // Timed grids: FullCalendar supplies a definite block size. A\n // standalone card with no height falls back to two lines.\n grid: [\n 'ds:h-full ds:[container-type:size] ds:[min-block-size:0]',\n 'ds:[contain-intrinsic-block-size:calc(var(--type-body-sm-size)*var(--calendar-event-line-height)*2)]',\n ].join(' '),\n // Month cells: exactly one line.\n month: [\n 'calendar-event-card--month ds:[container-type:size]',\n 'ds:[block-size:calc(var(--type-body-sm-size)*var(--calendar-event-line-height)_+_var(--spacing-2xs))]',\n ].join(' '),\n // Lists and timelines size from content: width tiers only.\n flow: [\n 'calendar-event-card--flow ds:[container-type:inline-size]',\n 'ds:[min-block-size:calc(var(--type-body-sm-size)*var(--calendar-event-line-height))]',\n ].join(' '),\n },\n // Do not add colour classes to this axis — status is icon + aria\n // only; a unit test asserts identical computed background\n // across all six statuses.\n status: {\n none: '',\n confirmed: '',\n waiting: '',\n in_care: '',\n done: '',\n cancelled: 'ds:line-through',\n absent: '',\n },\n bookedOnline: {\n // class name kept as a stable inert DOM hook; the stripe paint\n // lives here (moved from fullcalendar-theme.css) so it works in\n // the card's own stories, outside .fc-theme-alfadocs.\n // currentcolor = resolved ink, so stripes stay visible over any\n // picker colour.\n true: 'event-booked-online ds:bg-[image:repeating-linear-gradient(45deg,transparent,transparent_4px,color-mix(in_srgb,currentcolor_10%,transparent)_4px,color-mix(in_srgb,currentcolor_10%,transparent)_8px)]',\n false: '',\n },\n // Task treatment: CUSTOM-PROPERTY assignments only — the consuming\n // background-color / color / border-color declarations stay in the\n // base above, so this cannot re-open the CVA-vs-override specificity\n // race, and a caller's inline picker hex (set as the same custom\n // properties via `style`) still wins. `border-dashed` is a\n // border-style declaration — no property collision either.\n kind: {\n // The appointment's COLOUR IDENTITY edge — a thick start border\n // in the event colour, platform-agenda style, so the colour\n // reads even on sliver-height cards. Tasks keep the 1px edge:\n // muted to-dos carry no colour identity.\n appointment: 'ds:border-s-4',\n // Draft treatment — an appointment being COMPOSED, not yet saved\n // (the slot a user just picked, mirrored on the grid while the\n // editor is open). Same custom-property-only discipline as\n // `task`: dashed outline over a light primary tint, so the\n // placeholder reads as pending rather than as a booked slot.\n draft: [\n 'ds:border-dashed',\n 'ds:[--calendar-event-bg:color-mix(in_srgb,var(--primary)_10%,var(--card))]',\n 'ds:[--calendar-event-text:var(--foreground)]',\n 'ds:[--calendar-event-border:var(--primary)]',\n ].join(' '),\n // Details pending — the block IS a booked appointment, so it\n // keeps the colour-identity edge and assigns no paint of its own.\n // Only the NAME is missing; the bar above stands in for it.\n 'pending-details': 'ds:border-s-4',\n task: [\n 'ds:border-dashed',\n 'ds:[--calendar-event-bg:var(--muted)]',\n 'ds:[--calendar-event-text:var(--muted-foreground)]',\n 'ds:[--calendar-event-border:color-mix(in_srgb,currentcolor_45%,transparent)]',\n ].join(' '),\n },\n // Tinted colour scheme — the chip-family look: the picker colour\n // becomes a SOLID BORDER over a light tint of itself (theme-aware\n // via color-mix with --card), text on the theme's foreground\n // tokens. Custom-property assignments only — the painted\n // declarations stay in the base. The runtime hex arrives as\n // `--calendar-event-accent` (inline). Never combined with the task\n // variant: the component forces `solid` for tasks so exactly one\n // class-level assignment of each property exists per render.\n colorStyle: {\n solid: '',\n tinted: [\n 'ds:[--calendar-event-bg:color-mix(in_srgb,var(--calendar-event-accent,var(--primary))_12%,var(--card))]',\n 'ds:[--calendar-event-text:var(--foreground)]',\n 'ds:[--calendar-event-border:var(--calendar-event-accent,var(--primary))]',\n ].join(' '),\n },\n },\n defaultVariants: {\n layout: 'grid',\n status: 'none',\n bookedOnline: false,\n kind: 'appointment',\n colorStyle: 'solid',\n },\n },\n);\n\n/* Card slots. The `event-card-*` class names are inert DOM hooks for tests\n and hosts; every style is a `ds:` utility. Tier variants apply to timed\n grids; month and flow replace the ones they override (see each slot). */\n\nconst cardContent = [\n 'event-card-content ds:grid ds:grid-cols-[minmax(0,1fr)_auto] ds:items-start',\n 'ds:gap-x-[var(--spacing-2xs)] ds:leading-[var(--calendar-event-line-height)]',\n // Stretch, so a secondary line is as wide as the card and a long word\n // wraps inside it rather than running past the edge.\n 'ds:eventcard-narrow:flex ds:eventcard-narrow:flex-col ds:eventcard-narrow:items-stretch',\n // A 15-minute compact tile: the meta size on a tight line.\n 'ds:eventcard-tiny:text-[length:var(--type-meta-size)] ds:eventcard-tiny:leading-[var(--calendar-event-compact-line-height)]',\n].join(' ');\n\nconst cardHeading = [\n 'event-card-heading ds:flex ds:items-baseline ds:gap-[var(--spacing-2xs)] ds:min-w-0',\n 'ds:eventcard-narrow:w-full',\n 'ds:eventcard-narrow-tall:flex-col ds:eventcard-narrow-tall:items-stretch ds:eventcard-narrow-tall:gap-0',\n].join(' ');\n\nconst cardName = cva(\n [\n 'event-card-name ds:min-w-0 ds:flex-1 ds:font-[var(--font-weight-semibold)]',\n // Wrap at spaces first; break inside a word only when it cannot fit.\n 'ds:wrap-break-word',\n 'ds:eventcard-narrow:pe-[var(--spacing-xs)]',\n ].join(' '),\n {\n variants: {\n layout: {\n grid: [\n 'ds:line-clamp-1 ds:eventcard-h3:line-clamp-2',\n // Tall slivers: the name runs down the card.\n 'ds:eventcard-sliver-tall:block ds:eventcard-sliver-tall:[writing-mode:vertical-rl] ds:eventcard-sliver-tall:[text-orientation:mixed]',\n 'ds:eventcard-sliver-tall:whitespace-nowrap ds:eventcard-sliver-tall:text-ellipsis ds:eventcard-sliver-tall:flex-none ds:eventcard-sliver-tall:pe-0',\n 'ds:eventcard-sliver-tall:[max-inline-size:calc(100cqmax_-_var(--spacing-md))]',\n 'ds:eventcard-sliver-h2:line-clamp-2 ds:eventcard-sliver-h2:pe-0',\n // Too thin for a legible line: colour and the priority marker.\n 'ds:eventcard-hairline:hidden',\n ].join(' '),\n month: 'ds:line-clamp-1',\n flow: 'ds:line-clamp-2',\n },\n // Room for the one-line \"marker +N\" cluster that sits over the end:\n // sized in em of the card text, like the cluster it clears.\n hiddenMarkers: {\n true: 'ds:eventcard-narrow-count:pe-[2.25em]',\n false: '',\n },\n },\n },\n);\n\n/* With a surname to show, slivers swap the full title for it. */\nconst cardFullTitle = cva('event-card-full-title', {\n variants: {\n hasShortTitle: { true: 'ds:eventcard-sliver:hidden', false: '' },\n },\n});\n\nconst cardKindIcon =\n 'event-card-kind-icon ds:inline ds:size-[1em] ds:me-[var(--spacing-2xs)] ds:align-text-bottom';\n\nconst cardTime = cva(\n 'event-card-time ds:hidden ds:shrink-0 ds:whitespace-nowrap ds:text-[length:var(--type-meta-size)]',\n {\n variants: {\n layout: {\n // Wide cards, and tall cards from 112px, show the time; tall narrow\n // cards put the start under the name.\n grid: 'ds:eventcard-w176:inline ds:eventcard-tall:inline ds:eventcard-narrow-tall:block',\n month: 'ds:eventcard-w176:inline',\n flow: 'ds:eventcard-w176:inline',\n },\n },\n },\n);\n\nconst cardStart = cva('event-card-start', {\n variants: {\n layout: {\n grid: 'ds:eventcard-w256:hidden',\n month: '',\n flow: 'ds:eventcard-w256:hidden',\n },\n },\n});\n\nconst cardRange = cva('event-card-range', {\n variants: {\n layout: {\n grid: 'ds:hidden ds:eventcard-w256:inline',\n month: 'ds:hidden',\n flow: 'ds:hidden ds:eventcard-w256:inline',\n },\n },\n});\n\nconst secondaryLine =\n 'ds:col-span-full ds:overflow-hidden ds:text-[length:var(--type-meta-size)] ds:wrap-break-word';\n\nconst cardSuffix = cva(`event-card-suffix ${secondaryLine}`, {\n variants: {\n layout: {\n grid: [\n 'ds:hidden ds:eventcard-h2:line-clamp-1',\n 'ds:eventcard-narrow:order-2 ds:eventcard-narrow-h2:hidden ds:eventcard-narrow-h5:line-clamp-1',\n 'ds:eventcard-sliver:hidden ds:eventcard-h7-mid:line-clamp-2',\n ].join(' '),\n month: 'ds:hidden',\n flow: 'ds:line-clamp-1 ds:eventcard-narrow:order-2',\n },\n },\n});\n\nconst cardContext = cva(`event-card-context ${secondaryLine}`, {\n variants: {\n layout: {\n grid: 'ds:hidden ds:eventcard-narrow:order-3 ds:eventcard-context:line-clamp-1',\n month: 'ds:hidden',\n flow: 'ds:hidden',\n },\n },\n});\n\n/* One-line narrow cards: the cluster sits over the end of the name. */\nconst NARROW_OVERLAY_MARKERS =\n 'ds:eventcard-narrow:absolute ds:eventcard-narrow:end-0 ds:eventcard-narrow:[inset-block-end:0] ds:eventcard-narrow:gap-0';\n\nconst cardMarkers = cva(\n 'event-card-markers ds:flex ds:items-center ds:gap-[var(--spacing-2xs)] ds:col-[2] ds:row-[1]',\n {\n variants: {\n layout: {\n grid: [\n NARROW_OVERLAY_MARKERS,\n 'ds:eventcard-narrow-h2:static ds:eventcard-narrow-h2:gap-[var(--spacing-2xs)] ds:eventcard-narrow-h2:order-1',\n 'ds:eventcard-tall:row-auto ds:eventcard-tall:col-span-full',\n ].join(' '),\n month: NARROW_OVERLAY_MARKERS,\n // Lists and timelines have no height tiers, so a narrow flow card\n // keeps its markers in the column, between name and treatment,\n // instead of laying them over the treatment line. The row wraps so\n // a slim card's dot never falls off the edge.\n flow: 'ds:eventcard-narrow:order-1 ds:eventcard-narrow:flex-wrap',\n },\n },\n },\n);\n\n/* Marker visibility by priority rank: the first always shows; later ones\n join as the card widens, and all show on tall wide cards. Month shows\n the first only. */\nconst cardMarker = cva(\n `event-card-marker ${INDICATOR_DISC_BASE} ds:size-[1em] ds:[&_svg]:size-[0.75em] ds:eventcard-narrow:size-[0.75em] ds:eventcard-narrow-h2:size-[1em]`,\n {\n variants: {\n rank: {\n first: 'ds:inline-flex',\n second: 'ds:hidden',\n third: 'ds:hidden',\n rest: 'ds:hidden',\n },\n layout: { grid: '', month: '', flow: '' },\n },\n compoundVariants: [\n {\n layout: ['grid', 'flow'],\n rank: 'second',\n class: 'ds:eventcard-w256:inline-flex',\n },\n {\n layout: ['grid', 'flow'],\n rank: 'third',\n class: 'ds:eventcard-w352:inline-flex',\n },\n {\n layout: ['grid', 'flow'],\n rank: ['second', 'third', 'rest'],\n class: 'ds:eventcard-tall-wide:inline-flex',\n },\n ],\n },\n);\n\nconst MARKER_RANK = ['first', 'second', 'third'] as const;\n\n/* \"+N\" after the first `capacity` markers; at most one shows per tier. */\nconst cardMore = cva(\n 'event-card-more ds:text-[length:var(--type-meta-size)] ds:whitespace-nowrap',\n {\n variants: {\n capacity: {\n 1: 'event-card-more-1',\n 2: 'event-card-more-2 ds:hidden',\n 3: 'event-card-more-3 ds:hidden',\n },\n layout: { grid: '', month: '', flow: '' },\n },\n compoundVariants: [\n { layout: 'month', capacity: 1, class: 'ds:inline' },\n {\n layout: 'grid',\n capacity: 1,\n class: [\n 'ds:inline ds:eventcard-w256:hidden ds:eventcard-narrow:hidden',\n 'ds:eventcard-narrow-count:inline ds:eventcard-narrow-h2:inline ds:eventcard-tall-wide:hidden',\n ].join(' '),\n },\n // Flow keeps narrow markers in the column, with room to count from\n // 64px; slimmer flow cards fall back to the dot.\n {\n layout: 'flow',\n capacity: 1,\n class:\n 'ds:inline ds:@max-[64px]/eventcard:hidden ds:eventcard-w256:hidden',\n },\n {\n layout: ['grid', 'flow'],\n capacity: 2,\n class:\n 'ds:eventcard-w256:inline ds:eventcard-w352:hidden ds:eventcard-tall-wide:hidden',\n },\n {\n layout: ['grid', 'flow'],\n capacity: 3,\n class: 'ds:eventcard-w352:inline ds:eventcard-tall-wide:hidden',\n },\n ],\n },\n);\n\n/* The sliver cue: a dot saying \"more markers than shown\", where \"+N\" does\n not fit. Rendered only when markers are actually hidden. Month always\n counts, so it has none. */\nconst sliverCue = cva(\n 'event-card-sliver-cue ds:hidden ds:items-center ds:text-[length:var(--type-meta-size)]',\n {\n variants: {\n layout: {\n grid: 'ds:eventcard-narrow:flex ds:eventcard-narrow-count:hidden ds:eventcard-narrow-h2:hidden',\n month: '',\n flow: 'ds:@max-[64px]/eventcard:flex',\n },\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Props */\n/* ------------------------------------------------------------------ */\n\n/**\n * The single painted surface of a calendar event.\n *\n * Colour model (platform parity): the caller's picker hex\n * (`backgroundColor` / `textColor` / `borderColor`) is the ONLY thing that\n * paints the card. `status` never paints the surface — it selects an icon\n * and (for `cancelled`) a line-through.\n *\n * Non-interactive by design: inside FullCalendar the outer harness anchor\n * owns click/drag/focus; standalone consumers wrap the card in their own\n * button/link. No onClick in the contract.\n */\nexport interface CalendarEventCardProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'title'\n> {\n /**\n * Primary line. Pass the ALREADY-MASKED title when privacy applies — the\n * card never receives a name it must not render, so it cannot leak it\n * (visually or via the composed aria-label).\n */\n title: string;\n /** Optional surname/short form for slivers. Ignored when privacyMasked. */\n shortTitle?: string;\n /** Localised start time for narrow cards. No parsing of rangeText. */\n startText?: string;\n /** Month keeps one line; flow preserves intrinsic height in lists/timelines. */\n layout?: 'grid' | 'month' | 'flow';\n /** Opposite resource axis: operator initials or chair, on tall cards. */\n contextLabel?: string;\n /**\n * Full name behind `contextLabel`, used in the accessible name instead of\n * it, so initials such as \"DA\" are not read out letter by letter. Never\n * rendered visually.\n */\n contextName?: string;\n /**\n * Secondary description, clamped to the lines the card can hold. Note: the\n * Calendar's privacy mode does NOT mask the suffix (current behaviour,\n * preserved deliberately).\n */\n suffix?: string;\n /**\n * Pre-formatted, localised time range (e.g. \"09:00 – 09:45\"). The\n * Calendar adapter computes it via Intl.DateTimeFormat.formatRange.\n * Included in the composed aria-label whenever present (even when the\n * visual time line is suppressed via showTime/allDay — matches today's\n * Calendar behaviour byte-for-byte).\n */\n rangeText?: string;\n /**\n * Gates the VISUAL time line only (aria keeps rangeText). Mirrors\n * CalendarProps.showTime. @default true\n */\n showTime?: boolean;\n /**\n * All-day events suppress the visual time line (aria keeps rangeText).\n * @default false\n */\n allDay?: boolean;\n\n /**\n * Lifecycle state (6-state, matches the platform DoctorAppointment\n * lifecycle) → status icon + line-through for `cancelled` +\n * localised label in the aria-label. NEVER paints the\n * card surface.\n */\n status?: CalendarEventStatus;\n\n /**\n * Runtime hex (#rgb or #rrggbb) from the consumer's colour picker — THE\n * painted surface. Injected as `--calendar-event-bg` via the sanctioned\n * inline custom-property pattern (23-constraints §inline-style exception).\n */\n backgroundColor?: string;\n /**\n * Runtime hex paired with backgroundColor. When omitted while\n * backgroundColor is set, the card auto-derives black/white ink by\n * luminance (provably WCAG AA ≥ 4.58:1 for any opaque colour).\n */\n textColor?: string;\n /**\n * Runtime hex border for delineating light surfaces. The platform sends\n * '#cccccc' when backgroundColor is '#ffffff' and omits it otherwise.\n * Falls back to transparent; appointments have a 4px start edge and\n * a 1px border elsewhere (tasks and drafts have 1px on every side), so toggling never shifts layout and event boundaries\n * survive forced-colors / Windows High Contrast for free.\n */\n borderColor?: string;\n\n /* Indicator icons — names identical to CalendarEvent fields (1:1 map). */\n /** Globe icon + diagonal stripe overlay. */\n isBookedOnline?: boolean;\n /** AlertTriangle icon. */\n hasUnassignedPatient?: boolean;\n /** HeartPulse icon. */\n hasHighlightedAnamnesis?: boolean;\n /** Euro icon. */\n hasBillableAmount?: boolean;\n /** Video icon. */\n isTelehealth?: boolean;\n /**\n * Repeat icon — this event belongs to a REPEATING SERIES. Set it on\n * every occurrence, not only the first: the flag answers \"will moving\n * or deleting this touch other appointments?\", which is true of a\n * modified occurrence too. Series ROLE (which row owns the rule) is a\n * separate concern — see `CalendarEvent.isRecurrenceParent`.\n */\n isRecurring?: boolean;\n /**\n * Task treatment — a calendar-scheduled to-do renders distinctly from an\n * appointment: dashed outline (derived from the resolved ink when no\n * `borderColor` is supplied), muted default surface (an explicit\n * `backgroundColor`/`textColor` still wins), a leading clipboard glyph,\n * and a localised \"task\" word appended to the accessible name. Emitted as\n * `data-kind=\"task\"` for DOM hooks.\n */\n isTask?: boolean;\n /**\n * Draft treatment — a placeholder for an appointment being composed:\n * the slot the user just picked, mirrored on the grid while the editor\n * is open. Dashed outline over a light primary tint, with a localised\n * \"draft\" word appended to the accessible name. Emitted as\n * `data-kind=\"draft\"`. Takes precedence over `isTask`, and like a task\n * it forces the solid paint path so exactly one class-level assignment\n * of each paint custom property exists per render.\n */\n isDraft?: boolean;\n /**\n * Details-pending treatment — a REAL booked appointment an\n * occupancy-first host drew from the slot it occupies while it still\n * fetches whose it is. The card keeps its colour and size and renders an\n * `aria-hidden` skeleton bar where the title goes, with the localised\n * \"loading details\" word in the accessible name and\n * `data-kind=\"pending-details\"` as the hook. Wins over `isDraft`/`isTask`.\n */\n detailsPending?: boolean;\n /**\n * Colour scheme for the picker colour. `'solid'` (default) is the\n * platform model — the hex paints the whole surface, ink auto-derived.\n * `'tinted'` is the chip-family scheme: the hex becomes a SOLID BORDER\n * over a light tint of itself (theme-aware via color-mix with `--card`),\n * with text on the theme's foreground tokens — `textColor` and\n * `borderColor` are ignored under it. Tasks keep their muted dashed\n * treatment regardless.\n */\n colorStyle?: 'solid' | 'tinted';\n\n /**\n * Resource title (chair/operator) woven into the composed aria-label\n * only — never rendered visually. The Calendar adapter resolves\n * resourceId → title before passing it.\n */\n resourceLabel?: string;\n /**\n * The title is a privacy MASK (the Calendar's privacy mode swapped the\n * patient name for `privacyModeTitle`). Renders a crossed-out-eye glyph\n * beside the mask so the redaction is legible as deliberate, with its\n * own breathing room after the time.\n */\n privacyMasked?: boolean;\n /**\n * Stable event id → emitted as `data-event-id` (Calendar.focusEvent\n * targets it) and used as the contrast-warning dedup context.\n */\n eventId?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const CalendarEventCard = forwardRef<\n HTMLDivElement,\n CalendarEventCardProps\n>(\n (\n {\n title,\n shortTitle,\n startText,\n layout = 'grid',\n contextLabel,\n contextName,\n suffix,\n rangeText,\n showTime = true,\n allDay = false,\n status,\n backgroundColor,\n textColor,\n borderColor,\n isBookedOnline = false,\n hasUnassignedPatient,\n hasHighlightedAnamnesis,\n hasBillableAmount,\n isTelehealth,\n isRecurring,\n isTask = false,\n isDraft = false,\n detailsPending = false,\n colorStyle = 'solid',\n resourceLabel,\n privacyMasked = false,\n eventId,\n className,\n style,\n 'aria-label': ariaLabelProp,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n\n const markers = [\n ...(status\n ? [\n {\n id: 'status',\n Icon: STATUS_ICON[status],\n label: t(STATUS_LABEL_KEYS[status]),\n tone: STATUS_DISC_TONE[status],\n },\n ]\n : []),\n ...EVENT_FLAGS.filter(({ field }) =>\n Boolean(\n {\n hasUnassignedPatient,\n hasHighlightedAnamnesis,\n hasBillableAmount,\n isBookedOnline,\n isTelehealth,\n isRecurring,\n }[field],\n ),\n ).map(({ field, Icon, labelKey, tone }) => ({\n id: field,\n Icon,\n label: t(labelKey),\n tone,\n })),\n ];\n const statusLabel = status ? t(STATUS_LABEL_KEYS[status]) : undefined;\n const kindLabel = detailsPending\n ? t('calendar.eventKind.pendingDetails')\n : isDraft\n ? t('calendar.eventKind.draft')\n : isTask\n ? t('calendar.eventKind.task')\n : undefined;\n\n /* Accessible name — the Calendar's historical composition, with the\n localised \"task\" word appended for task cards so screen-reader users\n get the same appointment-vs-task distinction the dashed outline and\n clipboard glyph carry visually. An explicit consumer-supplied\n aria-label wins. rangeText is always included when present, even when\n the visual time line is hidden. */\n const ariaLabel =\n ariaLabelProp ??\n [\n title,\n rangeText,\n suffix,\n resourceLabel,\n // A blank name falls back to the visible label rather than\n // silencing the context altogether.\n contextName?.trim() ? contextName : contextLabel,\n statusLabel,\n kindLabel,\n ...markers\n .filter((marker) => marker.id !== 'status')\n .map((marker) => marker.label),\n ]\n .filter(Boolean)\n .join(', ');\n\n const kind = detailsPending\n ? 'pending-details'\n : isDraft\n ? 'draft'\n : isTask\n ? 'task'\n : 'appointment';\n\n /* Tasks force the solid path — their muted variant owns the paint\n custom properties, so the tinted class must never co-assign them. */\n const tinted = !isTask && !isDraft && colorStyle === 'tinted';\n\n /* Ink derivation — solid scheme only, when the caller paints the\n surface without pairing a text colour. */\n const ink =\n !tinted && !textColor && backgroundColor\n ? resolveInk(backgroundColor)\n : null;\n\n /* DEV-only guardrails — every helper no-ops in production and dedupes\n per session, so calling during render is safe. The tinted scheme\n paints text on theme tokens over a 12% tint, so the solid-scheme\n pair checks don't apply there. */\n const warnContext = eventId ? `event ${eventId}` : 'calendar-event-card';\n if (!tinted) {\n warnLowContrast(backgroundColor, textColor, warnContext);\n if (backgroundColor && !textColor) {\n // no-ops when the hex is parseable (i.e. when resolveInk succeeded)\n warnUnparseableBackground(backgroundColor, warnContext);\n }\n if (backgroundColor && !borderColor) {\n // no-ops unless the background is near-white (luminance > 0.9)\n warnLowDelineation(backgroundColor, warnContext);\n }\n }\n\n /* Per-event colour override: the consuming app passes runtime hex from\n its colour picker. 23-constraints permits inline `style` only as a\n CSS custom-property setter for runtime values that can't be\n enumerated at build time — the consuming background-color / color /\n border-color declarations live in the CVA base as Tailwind arbitrary\n values with token fallbacks. */\n const colourOverrides: CSSProperties | undefined = tinted\n ? backgroundColor\n ? ({ '--calendar-event-accent': backgroundColor } as CSSProperties)\n : undefined\n : backgroundColor || textColor || borderColor\n ? ({\n ...(backgroundColor\n ? { '--calendar-event-bg': backgroundColor }\n : {}),\n ...(textColor\n ? { '--calendar-event-text': textColor }\n : ink === 'on-light'\n ? { '--calendar-event-text': 'var(--event-ink-on-light)' }\n : ink === 'on-dark'\n ? { '--calendar-event-text': 'var(--event-ink-on-dark)' }\n : {}),\n ...(borderColor ? { '--calendar-event-border': borderColor } : {}),\n } as CSSProperties)\n : undefined;\n\n const mergedStyle: CSSProperties | undefined =\n style || colourOverrides ? { ...style, ...colourOverrides } : undefined;\n\n /* A surname for slivers, never under privacy. */\n const showShortTitle = Boolean(\n !privacyMasked && shortTitle?.trim() && shortTitle !== title,\n );\n\n return (\n <div\n ref={ref}\n role=\"group\"\n {...rest}\n className={calendarEventCardVariants({\n layout,\n status: status ?? 'none',\n bookedOnline: isBookedOnline,\n kind,\n colorStyle: tinted ? 'tinted' : 'solid',\n className,\n })}\n // eslint-disable-next-line react/forbid-dom-props -- caller-supplied event bg/text/border hex injected via CSS variables (23-constraints §inline-style exception)\n style={mergedStyle}\n aria-label={ariaLabel}\n data-component=\"calendar-event-card\"\n data-event-id={eventId}\n data-kind={kind}\n data-status={status ?? 'none'}\n data-contrast={\n tinted ? 'tinted' : textColor ? 'custom' : (ink ?? 'default')\n }\n >\n <span className={cardContent} aria-hidden=\"true\">\n <span className={cardHeading}>\n <span\n className={cardName({\n layout,\n hiddenMarkers: markers.length > 1,\n })}\n >\n {detailsPending ? (\n <span aria-hidden=\"true\" className={PENDING_BAR_CLASS} />\n ) : (\n <>\n {isTask ? <ClipboardCheck className={cardKindIcon} /> : null}\n {privacyMasked ? <EyeOff className={cardKindIcon} /> : null}\n <span\n className={cardFullTitle({\n hasShortTitle: showShortTitle,\n })}\n >\n {title}\n </span>\n {showShortTitle ? (\n <span className=\"event-card-short-title ds:hidden ds:eventcard-sliver:inline\">\n {shortTitle}\n </span>\n ) : null}\n </>\n )}\n </span>\n {showTime && !allDay && rangeText ? (\n <span className={cardTime({ layout })}>\n {startText ? (\n <>\n <span className={cardStart({ layout })}>{startText}</span>\n <span className={cardRange({ layout })}>{rangeText}</span>\n </>\n ) : (\n rangeText\n )}\n </span>\n ) : null}\n </span>\n {suffix ? (\n <span className={cardSuffix({ layout })}>{suffix}</span>\n ) : null}\n {contextLabel ? (\n <span className={cardContext({ layout })}>{contextLabel}</span>\n ) : null}\n {markers.length > 0 ? (\n <span className={cardMarkers({ layout })}>\n {markers.map(({ id, Icon, tone }, index) => (\n <span\n key={id}\n data-marker={id}\n aria-hidden=\"true\"\n className={cardMarker({\n rank: MARKER_RANK[index] ?? 'rest',\n layout,\n className: INDICATOR_DISC_TONE[tone],\n })}\n >\n <Icon aria-hidden=\"true\" />\n </span>\n ))}\n {([1, 2, 3] as const).map((capacity) =>\n markers.length > capacity ? (\n <span\n key={capacity}\n className={cardMore({ capacity, layout })}\n >\n {t('calendar.card.more', {\n number: markers.length - capacity,\n })}\n </span>\n ) : null,\n )}\n {markers.length > 1 && layout !== 'month' ? (\n <span className={sliverCue({ layout })}>·</span>\n ) : null}\n </span>\n ) : null}\n </span>\n </div>\n );\n },\n);\nCalendarEventCard.displayName = 'CalendarEventCard';\n"],"names":["parseHex","hex","trimmed","body","r","g","b","relativeLuminance","lin","c","warnLowContrast","bgHex","fgHex","contextLabel","resolveInk","bg","STATUS_ICON","ThumbsUp","Clock","Stethoscope","Check","Ban","UserX","INDICATOR_DISC_BASE","PENDING_BAR_CLASS","INDICATOR_DISC_TONE","STATUS_DISC_TONE","STATUS_LABEL_KEYS","EVENT_FLAGS","TriangleAlert","HeartPulse","Euro","Globe","Video","Repeat","calendarEventCardVariants","cva","cardContent","cardHeading","cardName","cardFullTitle","cardKindIcon","cardTime","cardStart","cardRange","secondaryLine","cardSuffix","cardContext","NARROW_OVERLAY_MARKERS","cardMarkers","cardMarker","MARKER_RANK","cardMore","sliverCue","CalendarEventCard","forwardRef","title","shortTitle","startText","layout","contextName","suffix","rangeText","showTime","allDay","status","backgroundColor","textColor","borderColor","isBookedOnline","hasUnassignedPatient","hasHighlightedAnamnesis","hasBillableAmount","isTelehealth","isRecurring","isTask","isDraft","detailsPending","colorStyle","resourceLabel","privacyMasked","eventId","className","style","ariaLabelProp","rest","ref","t","useTranslation","markers","field","Icon","labelKey","tone","statusLabel","kindLabel","ariaLabel","marker","kind","tinted","ink","colourOverrides","mergedStyle","showShortTitle","jsx","jsxs","Fragment","ClipboardCheck","EyeOff","id","index","capacity"],"mappings":"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"}
|