@alfadocs/ui-kit-debug 1.61.0 → 1.62.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-CZWGQFKV.js → actions-cell-renderer-BXCpK2_0.js} +3 -3
- package/dist/_chunks/{actions-cell-renderer-CZWGQFKV.js.map → actions-cell-renderer-BXCpK2_0.js.map} +1 -1
- package/dist/_chunks/{agenda-card-DauvvKX6.js → agenda-card-DR9gDdKp.js} +2 -2
- package/dist/_chunks/{agenda-card-DauvvKX6.js.map → agenda-card-DR9gDdKp.js.map} +1 -1
- package/dist/_chunks/{agenda-tray-DU7O5Z7R.js → agenda-tray-DGB1Zup-.js} +3 -3
- package/dist/_chunks/{agenda-tray-DU7O5Z7R.js.map → agenda-tray-DGB1Zup-.js.map} +1 -1
- package/dist/_chunks/{ai-credits-notice-MBgQXxsx.js → ai-credits-notice-pK9BOmEz.js} +2 -2
- package/dist/_chunks/{ai-credits-notice-MBgQXxsx.js.map → ai-credits-notice-pK9BOmEz.js.map} +1 -1
- package/dist/_chunks/{ai-permission-notice-BJHutKLE.js → ai-permission-notice-DpRmZ9Q3.js} +4 -4
- package/dist/_chunks/{ai-permission-notice-BJHutKLE.js.map → ai-permission-notice-DpRmZ9Q3.js.map} +1 -1
- package/dist/_chunks/{ai-prompt-input-Dzos37rf.js → ai-prompt-input-DSGSe4LH.js} +2 -2
- package/dist/_chunks/{ai-prompt-input-Dzos37rf.js.map → ai-prompt-input-DSGSe4LH.js.map} +1 -1
- package/dist/_chunks/{alert-BhCstf2h.js → alert-DdDpOi-P.js} +2 -2
- package/dist/_chunks/{alert-BhCstf2h.js.map → alert-DdDpOi-P.js.map} +1 -1
- package/dist/_chunks/{alia-sidebar-CU3mVL9J.js → alia-sidebar-qe0quZkB.js} +6 -6
- package/dist/_chunks/{alia-sidebar-CU3mVL9J.js.map → alia-sidebar-qe0quZkB.js.map} +1 -1
- package/dist/_chunks/{anamnesis-card-VjJOUl-t.js → anamnesis-card-CsUBOG32.js} +3 -3
- package/dist/_chunks/{anamnesis-card-VjJOUl-t.js.map → anamnesis-card-CsUBOG32.js.map} +1 -1
- package/dist/_chunks/{anamnesis-summary-card-cCj7LPh3.js → anamnesis-summary-card-CMzBLTiN.js} +3 -3
- package/dist/_chunks/{anamnesis-summary-card-cCj7LPh3.js.map → anamnesis-summary-card-CMzBLTiN.js.map} +1 -1
- package/dist/_chunks/{anamnesis-summary-rows-C5F08WT6.js → anamnesis-summary-rows-DFWws7mM.js} +11 -11
- package/dist/_chunks/{anamnesis-summary-rows-C5F08WT6.js.map → anamnesis-summary-rows-DFWws7mM.js.map} +1 -1
- package/dist/_chunks/{antenatal-schedule-timeline-CfNFrej5.js → antenatal-schedule-timeline-DuaAQj1m.js} +2 -2
- package/dist/_chunks/{antenatal-schedule-timeline-CfNFrej5.js.map → antenatal-schedule-timeline-DuaAQj1m.js.map} +1 -1
- package/dist/_chunks/app-frame-DUPEwu4E.js +179 -0
- package/dist/_chunks/app-frame-DUPEwu4E.js.map +1 -0
- package/dist/_chunks/app-frame-context-CPszhDDb.js +10 -0
- package/dist/_chunks/app-frame-context-CPszhDDb.js.map +1 -0
- package/dist/_chunks/{appointment-card-BXQUZlAJ.js → appointment-card-CL32sux-.js} +3 -3
- package/dist/_chunks/{appointment-card-BXQUZlAJ.js.map → appointment-card-CL32sux-.js.map} +1 -1
- package/dist/_chunks/{appointment-peek-BvzXHYiD.js → appointment-peek-B5mcDcXt.js} +3 -3
- package/dist/_chunks/{appointment-peek-BvzXHYiD.js.map → appointment-peek-B5mcDcXt.js.map} +1 -1
- package/dist/_chunks/{appointment-timeline-r-q97cec.js → appointment-timeline-DaHKV81s.js} +4 -4
- package/dist/_chunks/{appointment-timeline-r-q97cec.js.map → appointment-timeline-DaHKV81s.js.map} +1 -1
- package/dist/_chunks/{appointment-tray-DF_R9ldY.js → appointment-tray-qtpJt8e0.js} +3 -3
- package/dist/_chunks/{appointment-tray-DF_R9ldY.js.map → appointment-tray-qtpJt8e0.js.map} +1 -1
- package/dist/_chunks/{audio-recorder-Cssm6jVh.js → audio-recorder-DR-u1qbl.js} +3 -3
- package/dist/_chunks/{audio-recorder-Cssm6jVh.js.map → audio-recorder-DR-u1qbl.js.map} +1 -1
- package/dist/_chunks/{auth-form-parts-CravOf0L.js → auth-form-parts-Cmb41LSQ.js} +2 -2
- package/dist/_chunks/{auth-form-parts-CravOf0L.js.map → auth-form-parts-Cmb41LSQ.js.map} +1 -1
- package/dist/_chunks/{badge-hnBt8o7n.js → badge-BUk4RjTS.js} +2 -2
- package/dist/_chunks/{badge-hnBt8o7n.js.map → badge-BUk4RjTS.js.map} +1 -1
- package/dist/_chunks/{balance-badge-cell-DMG06b2C.js → balance-badge-cell-F7p_ZKEg.js} +5 -5
- package/dist/_chunks/{balance-badge-cell-DMG06b2C.js.map → balance-badge-cell-F7p_ZKEg.js.map} +1 -1
- package/dist/_chunks/{bishop-score-DxfkcxiV.js → bishop-score-CaNTrikJ.js} +2 -2
- package/dist/_chunks/{bishop-score-DxfkcxiV.js.map → bishop-score-CaNTrikJ.js.map} +1 -1
- package/dist/_chunks/{bmi-calculator-B4kgPqt5.js → bmi-calculator-DjmQ04Ch.js} +4 -4
- package/dist/_chunks/{bmi-calculator-B4kgPqt5.js.map → bmi-calculator-DjmQ04Ch.js.map} +1 -1
- package/dist/_chunks/{booking-CXaqmdF7.js → booking-CGhOtxad.js} +8 -8
- package/dist/_chunks/{booking-CXaqmdF7.js.map → booking-CGhOtxad.js.map} +1 -1
- package/dist/_chunks/{button-group-Cfpyu6pc.js → button-group-DCOJhvm3.js} +3 -3
- package/dist/_chunks/{button-group-Cfpyu6pc.js.map → button-group-DCOJhvm3.js.map} +1 -1
- package/dist/_chunks/{calendar-DNTVaK6b.js → calendar-DCr65Kt1.js} +3 -3
- package/dist/_chunks/{calendar-DNTVaK6b.js.map → calendar-DCr65Kt1.js.map} +1 -1
- package/dist/_chunks/{calendar-workspace-UL5xcpWa.js → calendar-workspace-Dvfl9Vf6.js} +29 -29
- package/dist/_chunks/{calendar-workspace-UL5xcpWa.js.map → calendar-workspace-Dvfl9Vf6.js.map} +1 -1
- package/dist/_chunks/{care-plan-card-DFQbU_Gd.js → care-plan-card-BU3p5cLr.js} +3 -3
- package/dist/_chunks/{care-plan-card-DFQbU_Gd.js.map → care-plan-card-BU3p5cLr.js.map} +1 -1
- package/dist/_chunks/{care-plan-entry-card-bj784KRk.js → care-plan-entry-card-DPJcP34v.js} +4 -4
- package/dist/_chunks/{care-plan-entry-card-bj784KRk.js.map → care-plan-entry-card-DPJcP34v.js.map} +1 -1
- package/dist/_chunks/{care-plan-header-DDhyAfVK.js → care-plan-header-CgFjQLBd.js} +3 -3
- package/dist/_chunks/{care-plan-header-DDhyAfVK.js.map → care-plan-header-CgFjQLBd.js.map} +1 -1
- package/dist/_chunks/{carousel.agent-Csn24G1k.js → carousel.agent-BaRsN-8H.js} +2 -2
- package/dist/_chunks/{carousel.agent-Csn24G1k.js.map → carousel.agent-BaRsN-8H.js.map} +1 -1
- package/dist/_chunks/chart-DgYHN8Xq.js +991 -0
- package/dist/_chunks/chart-DgYHN8Xq.js.map +1 -0
- package/dist/_chunks/{chat-input-Ck34Pnmp.js → chat-input-HtTbUUD6.js} +2 -2
- package/dist/_chunks/{chat-input-Ck34Pnmp.js.map → chat-input-HtTbUUD6.js.map} +1 -1
- package/dist/_chunks/{chat-message-DU0X3Xnl.js → chat-message-fRLZ95O5.js} +2 -2
- package/dist/_chunks/{chat-message-DU0X3Xnl.js.map → chat-message-fRLZ95O5.js.map} +1 -1
- package/dist/_chunks/{checkbox--ndmyokr.js → checkbox-BjDv-r3o.js} +2 -2
- package/dist/_chunks/{checkbox--ndmyokr.js.map → checkbox-BjDv-r3o.js.map} +1 -1
- package/dist/_chunks/{checkbox-group-B0oZHNT3.js → checkbox-group-Cw2H5qaq.js} +2 -2
- package/dist/_chunks/{checkbox-group-B0oZHNT3.js.map → checkbox-group-Cw2H5qaq.js.map} +1 -1
- package/dist/_chunks/{clinical-note-card-L6FVM9Gx.js → clinical-note-card-BgURrgL5.js} +3 -3
- package/dist/_chunks/{clinical-note-card-L6FVM9Gx.js.map → clinical-note-card-BgURrgL5.js.map} +1 -1
- package/dist/_chunks/{code-block-DiC4bg-o.js → code-block-vwEv1jEa.js} +2 -2
- package/dist/_chunks/{code-block-DiC4bg-o.js.map → code-block-vwEv1jEa.js.map} +1 -1
- package/dist/_chunks/{connection-status-BAnuwayz.js → connection-status--wYsgreh.js} +3 -3
- package/dist/_chunks/{connection-status-BAnuwayz.js.map → connection-status--wYsgreh.js.map} +1 -1
- package/dist/_chunks/{contact-profile-card-JTRbnbxy.js → contact-profile-card-VTCAmQqj.js} +3 -3
- package/dist/_chunks/{contact-profile-card-JTRbnbxy.js.map → contact-profile-card-VTCAmQqj.js.map} +1 -1
- package/dist/_chunks/control-room-rail-DUerqHeo.js +416 -0
- package/dist/_chunks/control-room-rail-DUerqHeo.js.map +1 -0
- package/dist/_chunks/{cycle-calculator-BuFi6ZJa.js → cycle-calculator-D-rwX9Pj.js} +2 -2
- package/dist/_chunks/{cycle-calculator-BuFi6ZJa.js.map → cycle-calculator-D-rwX9Pj.js.map} +1 -1
- package/dist/_chunks/{dashboard-grid-DRnhIlT-.js → dashboard-grid-B2MB7SRS.js} +627 -603
- package/dist/_chunks/dashboard-grid-B2MB7SRS.js.map +1 -0
- package/dist/_chunks/{data-table-DAPkhyXO.js → data-table-m7GbLJZy.js} +6 -6
- package/dist/_chunks/{data-table-DAPkhyXO.js.map → data-table-m7GbLJZy.js.map} +1 -1
- package/dist/_chunks/{data-table-tabs-2t0cdk0h.js → data-table-tabs-BfrnefV5.js} +3 -3
- package/dist/_chunks/{data-table-tabs-2t0cdk0h.js.map → data-table-tabs-BfrnefV5.js.map} +1 -1
- package/dist/_chunks/{dependent-selector-DgaAQc-c.js → dependent-selector-DBr1AhLg.js} +3 -3
- package/dist/_chunks/{dependent-selector-DgaAQc-c.js.map → dependent-selector-DBr1AhLg.js.map} +1 -1
- package/dist/_chunks/{description-list-CFEw__MT.js → description-list-Q8640NHu.js} +2 -2
- package/dist/_chunks/{description-list-CFEw__MT.js.map → description-list-Q8640NHu.js.map} +1 -1
- package/dist/_chunks/{dev-bypass-button-dTuUuzsT.js → dev-bypass-button--CPzzRSj.js} +2 -2
- package/dist/_chunks/{dev-bypass-button-dTuUuzsT.js.map → dev-bypass-button--CPzzRSj.js.map} +1 -1
- package/dist/_chunks/{document-preview-DYX669jE.js → document-preview-B1dQm292.js} +4 -4
- package/dist/_chunks/{document-preview-DYX669jE.js.map → document-preview-B1dQm292.js.map} +1 -1
- package/dist/_chunks/{document-scanner-C41n4pNq.js → document-scanner-CVPVLK7z.js} +2 -2
- package/dist/_chunks/{document-scanner-C41n4pNq.js.map → document-scanner-CVPVLK7z.js.map} +1 -1
- package/dist/_chunks/{due-date-calculator-yYvX8Ww_.js → due-date-calculator-DTfxFJCM.js} +5 -5
- package/dist/_chunks/{due-date-calculator-yYvX8Ww_.js.map → due-date-calculator-DTfxFJCM.js.map} +1 -1
- package/dist/_chunks/{editable-currency-cell-renderer-6LDFAWUE.js → editable-currency-cell-renderer-1ijmzNWh.js} +4 -4
- package/dist/_chunks/{editable-currency-cell-renderer-6LDFAWUE.js.map → editable-currency-cell-renderer-1ijmzNWh.js.map} +1 -1
- package/dist/_chunks/{editable-description-D9FsTi8e.js → editable-description-ChGNdYY8.js} +2 -2
- package/dist/_chunks/{editable-description-D9FsTi8e.js.map → editable-description-ChGNdYY8.js.map} +1 -1
- package/dist/_chunks/{editor-overlay-BYkcaLCj.js → editor-overlay-CpVO1-Kk.js} +2 -2
- package/dist/_chunks/{editor-overlay-BYkcaLCj.js.map → editor-overlay-CpVO1-Kk.js.map} +1 -1
- package/dist/_chunks/{entity-summary-oD_63dlz.js → entity-summary-DXIr5_x2.js} +4 -4
- package/dist/_chunks/{entity-summary-oD_63dlz.js.map → entity-summary-DXIr5_x2.js.map} +1 -1
- package/dist/_chunks/{error-summary-BhM8FEkl.js → error-summary-DrUfuKu1.js} +2 -2
- package/dist/_chunks/{error-summary-BhM8FEkl.js.map → error-summary-DrUfuKu1.js.map} +1 -1
- package/dist/_chunks/{face-scheme-C-5V3MsY.js → face-scheme-DAD-mXzM.js} +4 -4
- package/dist/_chunks/{face-scheme-C-5V3MsY.js.map → face-scheme-DAD-mXzM.js.map} +1 -1
- package/dist/_chunks/{fetal-weight-CHv2winC.js → fetal-weight-DycD_Vqr.js} +2 -2
- package/dist/_chunks/{fetal-weight-CHv2winC.js.map → fetal-weight-DycD_Vqr.js.map} +1 -1
- package/dist/_chunks/{field-array-dSkD_ePA.js → field-array-BJYc1xSu.js} +2 -2
- package/dist/_chunks/{field-array-dSkD_ePA.js.map → field-array-BJYc1xSu.js.map} +1 -1
- package/dist/_chunks/{file-manager-C8bdHsYy.js → file-manager-G0t8MWbE.js} +6 -6
- package/dist/_chunks/{file-manager-C8bdHsYy.js.map → file-manager-G0t8MWbE.js.map} +1 -1
- package/dist/_chunks/{fiscal-code-input-BSWwda0C.js → fiscal-code-input-DwHb2nVW.js} +2 -2
- package/dist/_chunks/{fiscal-code-input-BSWwda0C.js.map → fiscal-code-input-DwHb2nVW.js.map} +1 -1
- package/dist/_chunks/{forgot-password-form-CGWV5Q1-.js → forgot-password-form-CgZkEvZy.js} +4 -4
- package/dist/_chunks/{forgot-password-form-CGWV5Q1-.js.map → forgot-password-form-CgZkEvZy.js.map} +1 -1
- package/dist/_chunks/{freemium-paywall-DjjVPC-5.js → freemium-paywall-r-z48YaT.js} +2 -2
- package/dist/_chunks/{freemium-paywall-DjjVPC-5.js.map → freemium-paywall-r-z48YaT.js.map} +1 -1
- package/dist/_chunks/{gestational-age-calculator-BLccWS_4.js → gestational-age-calculator-BnCAL5a-.js} +5 -5
- package/dist/_chunks/{gestational-age-calculator-BLccWS_4.js.map → gestational-age-calculator-BnCAL5a-.js.map} +1 -1
- package/dist/_chunks/{hcg-doubling-CnrY2OVu.js → hcg-doubling-DVDiqFyp.js} +2 -2
- package/dist/_chunks/{hcg-doubling-CnrY2OVu.js.map → hcg-doubling-DVDiqFyp.js.map} +1 -1
- package/dist/_chunks/{header-BVHAt7Fi.js → header-_TppWBpK.js} +2 -2
- package/dist/_chunks/{header-BVHAt7Fi.js.map → header-_TppWBpK.js.map} +1 -1
- package/dist/_chunks/{header-settings-C200bKyp.js → header-settings-BSH9Gk0J.js} +3 -3
- package/dist/_chunks/{header-settings-C200bKyp.js.map → header-settings-BSH9Gk0J.js.map} +1 -1
- package/dist/_chunks/{heatmap-CRMr7VWC.js → heatmap-Bb0-M88T.js} +4 -4
- package/dist/_chunks/{heatmap-CRMr7VWC.js.map → heatmap-Bb0-M88T.js.map} +1 -1
- package/dist/_chunks/{help-me-write-templates-C9T8-DcT.js → help-me-write-templates-DFmqnsAa.js} +4 -4
- package/dist/_chunks/{help-me-write-templates-C9T8-DcT.js.map → help-me-write-templates-DFmqnsAa.js.map} +1 -1
- package/dist/_chunks/{hover-card-DbTmj-ea.js → hover-card-CTNhQXWS.js} +2 -2
- package/dist/_chunks/{hover-card-DbTmj-ea.js.map → hover-card-CTNhQXWS.js.map} +1 -1
- package/dist/_chunks/{icon-button-dNE6ENLn.js → icon-button-C_1TgRiK.js} +2 -2
- package/dist/_chunks/{icon-button-dNE6ENLn.js.map → icon-button-C_1TgRiK.js.map} +1 -1
- package/dist/_chunks/{icon-button-group-Du8IvZek.js → icon-button-group-NIHji7_y.js} +2 -2
- package/dist/_chunks/{icon-button-group-Du8IvZek.js.map → icon-button-group-NIHji7_y.js.map} +1 -1
- package/dist/_chunks/{icon-picker-D5NdDbCL.js → icon-picker-Dq4O32K8.js} +2 -2
- package/dist/_chunks/{icon-picker-D5NdDbCL.js.map → icon-picker-Dq4O32K8.js.map} +1 -1
- package/dist/_chunks/{info-tip-DObdz3w3.js → info-tip-cYszyg6h.js} +2 -2
- package/dist/_chunks/{info-tip-DObdz3w3.js.map → info-tip-cYszyg6h.js.map} +1 -1
- package/dist/_chunks/{key-value-pair-BNYHAZwD.js → key-value-pair-BscGwZsJ.js} +2 -2
- package/dist/_chunks/{key-value-pair-BNYHAZwD.js.map → key-value-pair-BscGwZsJ.js.map} +1 -1
- package/dist/_chunks/{kit-extensions-DI2nHVNw.js → kit-extensions-RnddkrXn.js} +6 -6
- package/dist/_chunks/{kit-extensions-DI2nHVNw.js.map → kit-extensions-RnddkrXn.js.map} +1 -1
- package/dist/_chunks/{link-cell-renderer-DvhzS6lu.js → link-cell-renderer-dtEYlxi2.js} +6 -6
- package/dist/_chunks/{link-cell-renderer-DvhzS6lu.js.map → link-cell-renderer-dtEYlxi2.js.map} +1 -1
- package/dist/_chunks/{locale-picker-Bu4YE5b2.js → locale-picker-CeveTnDK.js} +3 -3
- package/dist/_chunks/{locale-picker-Bu4YE5b2.js.map → locale-picker-CeveTnDK.js.map} +1 -1
- package/dist/_chunks/{login-dev-card-DwWWHclZ.js → login-dev-card-PnADNcI9.js} +3 -3
- package/dist/_chunks/{login-dev-card-DwWWHclZ.js.map → login-dev-card-PnADNcI9.js.map} +1 -1
- package/dist/_chunks/{marketplace-app-shell-p6hPgVwy.js → marketplace-app-shell-C-2e4eCD.js} +139 -136
- package/dist/_chunks/marketplace-app-shell-C-2e4eCD.js.map +1 -0
- package/dist/_chunks/{message-card-CvZlo3Fn.js → message-card-A3mJNqfy.js} +2 -2
- package/dist/_chunks/{message-card-CvZlo3Fn.js.map → message-card-A3mJNqfy.js.map} +1 -1
- package/dist/_chunks/{message-tray-DrS_LOed.js → message-tray-Ft6vSr71.js} +3 -3
- package/dist/_chunks/{message-tray-DrS_LOed.js.map → message-tray-Ft6vSr71.js.map} +1 -1
- package/dist/_chunks/{multi-select-BT23EnSA.js → multi-select-CMaAQQgb.js} +2 -2
- package/dist/_chunks/{multi-select-BT23EnSA.js.map → multi-select-CMaAQQgb.js.map} +1 -1
- package/dist/_chunks/{note-attachment-Bt2cddsZ.js → note-attachment-DoVWvjWR.js} +2 -2
- package/dist/_chunks/{note-attachment-Bt2cddsZ.js.map → note-attachment-DoVWvjWR.js.map} +1 -1
- package/dist/_chunks/{note-timeline-CX9nAgAR.js → note-timeline-B7l3t5DZ.js} +2 -2
- package/dist/_chunks/{note-timeline-CX9nAgAR.js.map → note-timeline-B7l3t5DZ.js.map} +1 -1
- package/dist/_chunks/{notes-panel-6TElt7jQ.js → notes-panel-CTmvrqQn.js} +7 -7
- package/dist/_chunks/{notes-panel-6TElt7jQ.js.map → notes-panel-CTmvrqQn.js.map} +1 -1
- package/dist/_chunks/{notification-card-Qrs52HIA.js → notification-card-c2oX8j3F.js} +2 -2
- package/dist/_chunks/{notification-card-Qrs52HIA.js.map → notification-card-c2oX8j3F.js.map} +1 -1
- package/dist/_chunks/{notification-tray-DRm1z97G.js → notification-tray-BR3seWA7.js} +3 -3
- package/dist/_chunks/{notification-tray-DRm1z97G.js.map → notification-tray-BR3seWA7.js.map} +1 -1
- package/dist/_chunks/{operator-hero-C_Khr5IU.js → operator-hero-3_RG4Dkj.js} +2 -2
- package/dist/_chunks/{operator-hero-C_Khr5IU.js.map → operator-hero-3_RG4Dkj.js.map} +1 -1
- package/dist/_chunks/{optical-prescription-DLIAhJ6f.js → optical-prescription-CxfMsbxi.js} +2 -2
- package/dist/_chunks/{optical-prescription-DLIAhJ6f.js.map → optical-prescription-CxfMsbxi.js.map} +1 -1
- package/dist/_chunks/{panel-header-D_mTdhUp.js → panel-header-BJkaUwnl.js} +2 -2
- package/dist/_chunks/{panel-header-D_mTdhUp.js.map → panel-header-BJkaUwnl.js.map} +1 -1
- package/dist/_chunks/{panel-subview-CjZgdWwO.js → panel-subview-yP4qIbKS.js} +3 -3
- package/dist/_chunks/{panel-subview-CjZgdWwO.js.map → panel-subview-yP4qIbKS.js.map} +1 -1
- package/dist/_chunks/{patient-details-BjqKBY2x.js → patient-details-BNDS69Zx.js} +4 -4
- package/dist/_chunks/{patient-details-BjqKBY2x.js.map → patient-details-BNDS69Zx.js.map} +1 -1
- package/dist/_chunks/{patient-field-row-BiI0BPPK.js → patient-field-row-BLBi-PjO.js} +7 -7
- package/dist/_chunks/{patient-field-row-BiI0BPPK.js.map → patient-field-row-BLBi-PjO.js.map} +1 -1
- package/dist/_chunks/{patient-search-B5R7FyFO.js → patient-search-DOnDUVsl.js} +2 -2
- package/dist/_chunks/{patient-search-B5R7FyFO.js.map → patient-search-DOnDUVsl.js.map} +1 -1
- package/dist/_chunks/{patient-summary-card-BOgnWKRV.js → patient-summary-card-T9umuZJF.js} +8 -8
- package/dist/_chunks/{patient-summary-card-BOgnWKRV.js.map → patient-summary-card-T9umuZJF.js.map} +1 -1
- package/dist/_chunks/{payment-automation-upsell-39d5ykBi.js → payment-automation-upsell-C8MEu0t6.js} +4 -4
- package/dist/_chunks/{payment-automation-upsell-39d5ykBi.js.map → payment-automation-upsell-C8MEu0t6.js.map} +1 -1
- package/dist/_chunks/{payment-form-v6zZuV1_.js → payment-form-i90DUuNK.js} +2 -2
- package/dist/_chunks/{payment-form-v6zZuV1_.js.map → payment-form-i90DUuNK.js.map} +1 -1
- package/dist/_chunks/{payment-request-card-E3G4aVt6.js → payment-request-card-BmzNMY2a.js} +4 -4
- package/dist/_chunks/{payment-request-card-E3G4aVt6.js.map → payment-request-card-BmzNMY2a.js.map} +1 -1
- package/dist/_chunks/{pdf-viewer-CNQxa4tv.js → pdf-viewer-DJ9VN7cu.js} +2 -2
- package/dist/_chunks/{pdf-viewer-CNQxa4tv.js.map → pdf-viewer-DJ9VN7cu.js.map} +1 -1
- package/dist/_chunks/{periodontal-chart-BZ1d6S36.js → periodontal-chart-DCcOEYC6.js} +2 -2
- package/dist/_chunks/{periodontal-chart-BZ1d6S36.js.map → periodontal-chart-DCcOEYC6.js.map} +1 -1
- package/dist/_chunks/{periodontal-chart-card-BE5hiQnn.js → periodontal-chart-card-CxdjXFb3.js} +3 -3
- package/dist/_chunks/{periodontal-chart-card-BE5hiQnn.js.map → periodontal-chart-card-CxdjXFb3.js.map} +1 -1
- package/dist/_chunks/{periodontal-diagnosis-6wybid_W.js → periodontal-diagnosis-B9YmmVmM.js} +5 -5
- package/dist/_chunks/{periodontal-diagnosis-6wybid_W.js.map → periodontal-diagnosis-B9YmmVmM.js.map} +1 -1
- package/dist/_chunks/{periodontal-risk-chart-CgLwBj5c.js → periodontal-risk-chart-CPy7CNFe.js} +2 -2
- package/dist/_chunks/{periodontal-risk-chart-CgLwBj5c.js.map → periodontal-risk-chart-CPy7CNFe.js.map} +1 -1
- package/dist/_chunks/{permission-matrix-DuTkUHxe.js → permission-matrix-BoQjENGV.js} +3 -3
- package/dist/_chunks/{permission-matrix-DuTkUHxe.js.map → permission-matrix-BoQjENGV.js.map} +1 -1
- package/dist/_chunks/{popover-DQr_tljb.js → popover-4ZVtH_At.js} +2 -2
- package/dist/_chunks/{popover-DQr_tljb.js.map → popover-4ZVtH_At.js.map} +1 -1
- package/dist/_chunks/{practice-profile-hero-DPbvYfCs.js → practice-profile-hero-Dfc0F60y.js} +2 -2
- package/dist/_chunks/{practice-profile-hero-DPbvYfCs.js.map → practice-profile-hero-Dfc0F60y.js.map} +1 -1
- package/dist/_chunks/{practice-results-Cktx7KaC.js → practice-results-B8L9ZmtR.js} +4 -4
- package/dist/_chunks/{practice-results-Cktx7KaC.js.map → practice-results-B8L9ZmtR.js.map} +1 -1
- package/dist/_chunks/{pregnancy-dating-26fcvhAx.js → pregnancy-dating-D2XTELiw.js} +5 -5
- package/dist/_chunks/{pregnancy-dating-26fcvhAx.js.map → pregnancy-dating-D2XTELiw.js.map} +1 -1
- package/dist/_chunks/{pregnancy-weight-gain-D8q1IUCT.js → pregnancy-weight-gain-BVvyL-j1.js} +4 -4
- package/dist/_chunks/{pregnancy-weight-gain-D8q1IUCT.js.map → pregnancy-weight-gain-BVvyL-j1.js.map} +1 -1
- package/dist/_chunks/{privacy-lock-BpVgSgMb.js → privacy-lock-CEYJ8ehu.js} +2 -2
- package/dist/_chunks/{privacy-lock-BpVgSgMb.js.map → privacy-lock-CEYJ8ehu.js.map} +1 -1
- package/dist/_chunks/{privacy-mask-BfMC57ST.js → privacy-mask-Ch7743uk.js} +2 -2
- package/dist/_chunks/{privacy-mask-BfMC57ST.js.map → privacy-mask-Ch7743uk.js.map} +1 -1
- package/dist/_chunks/{product-hub-panel-CH4B49ij.js → product-hub-panel-D-UELdo0.js} +2 -2
- package/dist/_chunks/{product-hub-panel-CH4B49ij.js.map → product-hub-panel-D-UELdo0.js.map} +1 -1
- package/dist/_chunks/{public-header.agent-BHTDKMsw.js → public-header.agent-DXRA7ebK.js} +3 -3
- package/dist/_chunks/{public-header.agent-BHTDKMsw.js.map → public-header.agent-DXRA7ebK.js.map} +1 -1
- package/dist/_chunks/{radio-BBbMdbE_.js → radio-BZQs6_36.js} +2 -2
- package/dist/_chunks/{radio-BBbMdbE_.js.map → radio-BZQs6_36.js.map} +1 -1
- package/dist/_chunks/{radio-group-DicxWJXP.js → radio-group-ChIKyeSJ.js} +3 -3
- package/dist/_chunks/{radio-group-DicxWJXP.js.map → radio-group-ChIKyeSJ.js.map} +1 -1
- package/dist/_chunks/{radiograph-panel.agent-DR0gOeSc.js → radiograph-panel.agent-DDNUo4Ul.js} +4 -4
- package/dist/_chunks/{radiograph-panel.agent-DR0gOeSc.js.map → radiograph-panel.agent-DDNUo4Ul.js.map} +1 -1
- package/dist/_chunks/{registration-form-B8IeB9kd.js → registration-form-BQyT_kBX.js} +5 -5
- package/dist/_chunks/{registration-form-B8IeB9kd.js.map → registration-form-BQyT_kBX.js.map} +1 -1
- package/dist/_chunks/{resource-chip-DQeCJzJf.js → resource-chip-DB5jDwUO.js} +2 -2
- package/dist/_chunks/{resource-chip-DQeCJzJf.js.map → resource-chip-DB5jDwUO.js.map} +1 -1
- package/dist/_chunks/{reviews-panel-CHzDqerd.js → reviews-panel-AvsVgtJu.js} +3 -3
- package/dist/_chunks/{reviews-panel-CHzDqerd.js.map → reviews-panel-AvsVgtJu.js.map} +1 -1
- package/dist/_chunks/{rich-text-editor-BRuTo2hm.js → rich-text-editor-M2gT_E7f.js} +9 -9
- package/dist/_chunks/{rich-text-editor-BRuTo2hm.js.map → rich-text-editor-M2gT_E7f.js.map} +1 -1
- package/dist/_chunks/{sheet-CqvPYNLn.js → sheet-D2PfJl8n.js} +2 -2
- package/dist/_chunks/{sheet-CqvPYNLn.js.map → sheet-D2PfJl8n.js.map} +1 -1
- package/dist/_chunks/{sidebar-C9Zof0z1.js → sidebar-BS24EnYd.js} +2 -2
- package/dist/_chunks/{sidebar-C9Zof0z1.js.map → sidebar-BS24EnYd.js.map} +1 -1
- package/dist/_chunks/{sign-document-D4iHS_Ug.js → sign-document-CY7xTXbm.js} +2 -2
- package/dist/_chunks/{sign-document-D4iHS_Ug.js.map → sign-document-CY7xTXbm.js.map} +1 -1
- package/dist/_chunks/{signature-request-BH7yKI01.js → signature-request-BMCHy2ZO.js} +5 -5
- package/dist/_chunks/{signature-request-BH7yKI01.js.map → signature-request-BMCHy2ZO.js.map} +1 -1
- package/dist/_chunks/{signature-status-chip-DP3qRijv.js → signature-status-chip-pIoQjvH8.js} +3 -3
- package/dist/_chunks/{signature-status-chip-DP3qRijv.js.map → signature-status-chip-pIoQjvH8.js.map} +1 -1
- package/dist/_chunks/{signed-out-frame-eaOWHpDr.js → signed-out-frame-D5DzqATh.js} +3 -3
- package/dist/_chunks/{signed-out-frame-eaOWHpDr.js.map → signed-out-frame-D5DzqATh.js.map} +1 -1
- package/dist/_chunks/{slot-grid-DELa2Nwz.js → slot-grid-dj5f6R2w.js} +2 -2
- package/dist/_chunks/{slot-grid-DELa2Nwz.js.map → slot-grid-dj5f6R2w.js.map} +1 -1
- package/dist/_chunks/{stat-DmjGfXND.js → stat-D2PNJujA.js} +2 -2
- package/dist/_chunks/stat-D2PNJujA.js.map +1 -0
- package/dist/_chunks/{streaming-text-bPDoG7Y3.js → streaming-text-zFViGexf.js} +2 -2
- package/dist/_chunks/{streaming-text-bPDoG7Y3.js.map → streaming-text-zFViGexf.js.map} +1 -1
- package/dist/_chunks/{tab-bar-5GppbMGc.js → tab-bar-BEODTG6k.js} +2 -2
- package/dist/_chunks/{tab-bar-5GppbMGc.js.map → tab-bar-BEODTG6k.js.map} +1 -1
- package/dist/_chunks/{tag-CS5cXpfx.js → tag-DOZGz0fT.js} +2 -2
- package/dist/_chunks/{tag-CS5cXpfx.js.map → tag-DOZGz0fT.js.map} +1 -1
- package/dist/_chunks/{task-card-zaTU1rQa.js → task-card-BS7Uqevr.js} +2 -2
- package/dist/_chunks/{task-card-zaTU1rQa.js.map → task-card-BS7Uqevr.js.map} +1 -1
- package/dist/_chunks/{task-editor-CgGcg-2c.js → task-editor-DoiOzNiC.js} +9 -9
- package/dist/_chunks/{task-editor-CgGcg-2c.js.map → task-editor-DoiOzNiC.js.map} +1 -1
- package/dist/_chunks/{task-tray-DGMwogWu.js → task-tray-eQU4KJcA.js} +3 -3
- package/dist/_chunks/{task-tray-DGMwogWu.js.map → task-tray-eQU4KJcA.js.map} +1 -1
- package/dist/_chunks/{tasks-panel-xGtiEdcj.js → tasks-panel-8nLwBw6P.js} +7 -7
- package/dist/_chunks/{tasks-panel-xGtiEdcj.js.map → tasks-panel-8nLwBw6P.js.map} +1 -1
- package/dist/_chunks/{theme-toggle-_cfYEK73.js → theme-toggle-Ctb77x6O.js} +3 -3
- package/dist/_chunks/{theme-toggle-_cfYEK73.js.map → theme-toggle-Ctb77x6O.js.map} +1 -1
- package/dist/_chunks/{toast-CNUydTgT.js → toast-6T519aLz.js} +2 -2
- package/dist/_chunks/{toast-CNUydTgT.js.map → toast-6T519aLz.js.map} +1 -1
- package/dist/_chunks/tool-rail-C-03rH2I.js +973 -0
- package/dist/_chunks/tool-rail-C-03rH2I.js.map +1 -0
- package/dist/_chunks/tooltip-uEBdD1-5.js +178 -0
- package/dist/_chunks/tooltip-uEBdD1-5.js.map +1 -0
- package/dist/_chunks/{tooth-scheme-05DsRMA5.js → tooth-scheme-Dkh4JwzT.js} +2 -2
- package/dist/_chunks/{tooth-scheme-05DsRMA5.js.map → tooth-scheme-Dkh4JwzT.js.map} +1 -1
- package/dist/_chunks/{transcript-panel-CjsiDB1K.js → transcript-panel-XudW5l6l.js} +2 -2
- package/dist/_chunks/{transcript-panel-CjsiDB1K.js.map → transcript-panel-XudW5l6l.js.map} +1 -1
- package/dist/_chunks/{treatment-receipt-BSVOfStA.js → treatment-receipt-BdJ36vNP.js} +3 -3
- package/dist/_chunks/{treatment-receipt-BSVOfStA.js.map → treatment-receipt-BdJ36vNP.js.map} +1 -1
- package/dist/_chunks/{use-appointment-details-read-BGVthJFx.js → use-appointment-details-read-Gu0ehyxj.js} +16 -16
- package/dist/_chunks/{use-appointment-details-read-BGVthJFx.js.map → use-appointment-details-read-Gu0ehyxj.js.map} +1 -1
- package/dist/_chunks/use-edge-resize-CBtem0j2.js +171 -0
- package/dist/_chunks/use-edge-resize-CBtem0j2.js.map +1 -0
- package/dist/_chunks/{voice-control-panel-DyKEaFxt.js → voice-control-panel-C0BfY23Y.js} +4 -4
- package/dist/_chunks/{voice-control-panel-DyKEaFxt.js.map → voice-control-panel-C0BfY23Y.js.map} +1 -1
- package/dist/_chunks/{warning-stack-CAL9xVo1.js → warning-stack-HYWAytZV.js} +3 -3
- package/dist/_chunks/{warning-stack-CAL9xVo1.js.map → warning-stack-HYWAytZV.js.map} +1 -1
- package/dist/_chunks/{widget-picker-CkhoG4Rj.js → widget-picker-DlNPGcnu.js} +2 -2
- package/dist/_chunks/{widget-picker-CkhoG4Rj.js.map → widget-picker-DlNPGcnu.js.map} +1 -1
- package/dist/_chunks/{workflow-map-BUYG1oXU.js → workflow-map-C2B2qIr1.js} +5 -5
- package/dist/_chunks/{workflow-map-BUYG1oXU.js.map → workflow-map-C2B2qIr1.js.map} +1 -1
- package/dist/agent-catalog.json +13 -1
- package/dist/agent-i18n/en.json +10 -0
- package/dist/components/_shared/use-apex-legend-scroll.d.ts +7 -0
- package/dist/components/_shared/use-apex-legend-scroll.d.ts.map +1 -0
- package/dist/components/agenda-card/index.js +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/alert/index.js +1 -1
- package/dist/components/anamnesis-card/index.js +1 -1
- package/dist/components/anamnesis-summary-card/index.js +1 -1
- package/dist/components/app-frame/app-frame-context.d.ts +19 -0
- package/dist/components/app-frame/app-frame-context.d.ts.map +1 -0
- package/dist/components/app-frame/app-frame.d.ts +3 -0
- package/dist/components/app-frame/app-frame.d.ts.map +1 -1
- package/dist/components/app-frame/index.d.ts +2 -0
- package/dist/components/app-frame/index.d.ts.map +1 -1
- package/dist/components/app-frame/index.js +4 -2
- package/dist/components/app-frame/index.js.map +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/badge/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/index.js +1 -1
- package/dist/components/button-group/index.js +1 -1
- package/dist/components/calendar/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 +3 -1
- package/dist/components/chart/chart.d.ts.map +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/checkbox/index.js +1 -1
- package/dist/components/checkbox-group/index.js +1 -1
- package/dist/components/clinical-note-card/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/control-room-context.d.ts +10 -4
- package/dist/components/control-room-rail/control-room-context.d.ts.map +1 -1
- package/dist/components/control-room-rail/control-room-rail.agent.d.ts.map +1 -1
- package/dist/components/control-room-rail/control-room-rail.d.ts.map +1 -1
- package/dist/components/control-room-rail/index.js +1 -1
- package/dist/components/cycle-calculator/index.js +1 -1
- package/dist/components/dashboard-grid/dashboard-grid.d.ts.map +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/dependent-selector/index.js +1 -1
- package/dist/components/description-list/index.js +1 -1
- package/dist/components/dev-bypass-button/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/due-date-calculator/index.js +2 -2
- package/dist/components/editable-description/index.js +1 -1
- package/dist/components/editor-overlay/index.js +1 -1
- package/dist/components/entity-summary/index.js +1 -1
- package/dist/components/error-summary/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/fiscal-code-input/index.js +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/index.js +1 -1
- package/dist/components/heatmap/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/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/message-card/index.js +1 -1
- package/dist/components/message-tray/index.js +1 -1
- package/dist/components/multi-select/index.js +1 -1
- package/dist/components/note-timeline/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/index.js +1 -1
- package/dist/components/optical-prescription/index.js +1 -1
- package/dist/components/panel-header/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-search/index.js +1 -1
- package/dist/components/patient-summary-card/index.js +1 -1
- package/dist/components/patient-table/index.js +1 -1
- package/dist/components/payment-card/index.js +1 -1
- package/dist/components/payment-form/index.js +1 -1
- package/dist/components/pdf-viewer/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/periodontal-diagnosis/index.js +1 -1
- package/dist/components/periodontal-risk-chart/index.js +1 -1
- package/dist/components/permission-matrix/index.js +1 -1
- package/dist/components/popover/index.js +1 -1
- package/dist/components/practice-profile-hero/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/radio/index.js +1 -1
- package/dist/components/radio-group/index.js +2 -2
- package/dist/components/radiograph-panel/index.js +1 -1
- package/dist/components/resource-chip/index.js +1 -1
- package/dist/components/reviews-panel/index.js +1 -1
- package/dist/components/rich-text-editor/index.js +2 -2
- package/dist/components/sheet/index.js +1 -1
- package/dist/components/sidebar/index.js +1 -1
- package/dist/components/sign-document/index.js +1 -1
- package/dist/components/signature-status-chip/index.js +1 -1
- package/dist/components/slot-grid/index.js +1 -1
- package/dist/components/stat/index.js +1 -1
- package/dist/components/stat/stat.d.ts +7 -2
- package/dist/components/stat/stat.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/tag/index.js +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/tool-rail/index.js +1 -1
- package/dist/components/tool-rail/tool-rail.agent.d.ts.map +1 -1
- package/dist/components/tool-rail/tool-rail.d.ts +7 -0
- package/dist/components/tool-rail/tool-rail.d.ts.map +1 -1
- package/dist/components/tooltip/index.js +1 -1
- package/dist/components/tooltip/tooltip.d.ts.map +1 -1
- package/dist/components/tooth-scheme/index.js +1 -1
- package/dist/components/transcript-panel/index.js +1 -1
- package/dist/components/treatment-receipt/index.js +1 -1
- package/dist/components/voice-control-panel/index.js +1 -1
- package/dist/components/warning-stack/index.js +1 -1
- package/dist/components/widget-picker/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/use-edge-resize.d.ts +5 -1
- package/dist/hooks/use-edge-resize.d.ts.map +1 -1
- package/dist/index.js +778 -776
- package/dist/index.js.map +1 -1
- package/dist/patterns/alia-assistant/index.js +1 -1
- package/dist/patterns/anamnesis/index.js +1 -1
- package/dist/patterns/calendar/index.js +1 -1
- package/dist/patterns/forgot-password-form/index.js +1 -1
- package/dist/patterns/help-me-write-templates/index.js +1 -1
- package/dist/patterns/login-form/index.js +1 -1
- package/dist/patterns/marketplace-app-shell/index.js +1 -1
- package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts +3 -0
- package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts.map +1 -1
- package/dist/patterns/payment-automation-upsell/index.js +1 -1
- package/dist/patterns/registration-form/index.js +1 -1
- package/dist/patterns/signature-request/index.js +1 -1
- package/dist/patterns/signed-out-frame/index.js +1 -1
- package/dist/tokens.css +8 -1
- package/package.json +1 -1
- package/dist/_chunks/app-frame-CqmDh2v5.js +0 -134
- package/dist/_chunks/app-frame-CqmDh2v5.js.map +0 -1
- package/dist/_chunks/chart-D7PbNO_M.js +0 -920
- package/dist/_chunks/chart-D7PbNO_M.js.map +0 -1
- package/dist/_chunks/control-room-rail-BbBEIdws.js +0 -379
- package/dist/_chunks/control-room-rail-BbBEIdws.js.map +0 -1
- package/dist/_chunks/dashboard-grid-DRnhIlT-.js.map +0 -1
- package/dist/_chunks/marketplace-app-shell-p6hPgVwy.js.map +0 -1
- package/dist/_chunks/stat-DmjGfXND.js.map +0 -1
- package/dist/_chunks/tool-rail-Blgibz0a.js +0 -816
- package/dist/_chunks/tool-rail-Blgibz0a.js.map +0 -1
- package/dist/_chunks/tooltip-Cp-PLePW.js +0 -119
- package/dist/_chunks/tooltip-Cp-PLePW.js.map +0 -1
- package/dist/_chunks/use-edge-resize-DHbyQwu8.js +0 -149
- package/dist/_chunks/use-edge-resize-DHbyQwu8.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"marketplace-app-shell-p6hPgVwy.js","sources":["../../src/brand/product-lockup/product-lockup.tsx","../../src/patterns/marketplace-app-shell/marketplace-app-shell.tsx"],"sourcesContent":["import { forwardRef, type ComponentPropsWithoutRef } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { Logo } from '../../components/logo/logo';\nimport { AlfadocsLogoMark, AlfadocsLogoNeg } from '../logo-asset';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\n// Outer lockup row. ~4px logical gap between the wordmark and the product\n// name (`--spacing-xs`), centre-aligned so the name's cap height sits\n// against the wordmark's letterforms.\nconst lockup = cva('ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]');\n\n// The product name. Marketing serif (Fraunces, `--font-serif`) — permitted\n// here because this file lives under `src/brand/`, never in `src/components/`\n// or `src/patterns/` (constraint 10). Sized to ~95% of the wordmark height so\n// its cap height matches the logo letterforms across every size and theme\n// (the `--logo-size-*` tokens shift up in the accessible themes; the calc\n// keeps the name proportional for free).\nconst productName = cva(\n [\n 'ds:[font-family:var(--font-serif)]',\n 'ds:font-semibold',\n 'ds:leading-none',\n 'ds:tracking-[0.01em]',\n 'ds:whitespace-nowrap',\n // Forced-colors: drop the transparent text-fill and paint the label\n // as solid CanvasText so it never disappears under Windows HCM —\n // a gradient/transparent fill has no meaning there.\n 'ds:forced-colors:text-[CanvasText]',\n 'ds:forced-colors:[-webkit-text-fill-color:CanvasText]',\n ],\n {\n variants: {\n size: {\n sm: 'ds:text-[calc(var(--logo-size-sm)*0.95)]',\n md: 'ds:text-[calc(var(--logo-size-md)*0.95)]',\n lg: 'ds:text-[calc(var(--logo-size-lg)*0.95)]',\n xl: 'ds:text-[calc(var(--logo-size-xl)*0.95)]',\n },\n tone: {\n // Brand gradient filled into the glyphs via background-clip:text.\n // `--gradient-wordmark` rides the theme aliases, so it stays\n // AA-safe and adapts per theme on its own (and flattens to a solid\n // ink in the accessible / forced-colors blocks — see tokens).\n gradient: [\n 'ds:italic',\n 'ds:bg-[image:var(--gradient-wordmark)]',\n 'ds:bg-clip-text',\n 'ds:text-transparent',\n 'ds:[-webkit-text-fill-color:transparent]',\n ],\n // Monochrome: solid currentColor ink, upright, no gradient — for\n // print, single-colour work, and coloured chrome (e.g. app-shell\n // headers) where the lockup must ride the surrounding ink.\n solid: 'ds:text-current',\n },\n },\n defaultVariants: { size: 'md', tone: 'gradient' },\n },\n);\n\n// Maker lockup root. Sets a single `--lockup-unit` custom property to the\n// matching `--logo-size-*` token; every maker sub-element (mark, name, the\n// \"by Alfadocs\" tag) sizes off `var(--lockup-unit)`, so there's one per-size\n// source of truth that shifts up with the accessible themes for free.\n// `whitespace-nowrap` keeps \"[mark] Name by Alfadocs\" on one line.\nconst makerRoot = cva('ds:whitespace-nowrap', {\n variants: {\n size: {\n sm: 'ds:[--lockup-unit:var(--logo-size-sm)]',\n md: 'ds:[--lockup-unit:var(--logo-size-md)]',\n lg: 'ds:[--lockup-unit:var(--logo-size-lg)]',\n xl: 'ds:[--lockup-unit:var(--logo-size-xl)]',\n },\n },\n defaultVariants: { size: 'md' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\ntype LockupSize = NonNullable<VariantProps<typeof productName>['size']>;\n\nexport type ProductLockupProps = {\n /**\n * The product name. Passed verbatim (product names are not translated).\n *\n * - `variant=\"standard\"` (default): renders as \"Alfadocs <name>\" with the\n * wordmark; accessible name is `Alfadocs <name>`.\n * - `variant=\"maker\"`: renders as \"[mark] <name> by Alfadocs\"; accessible\n * name is `<name> by Alfadocs`.\n */\n name: string;\n /**\n * Which lockup composition to use.\n *\n * - `'standard'` (default) — Alfadocs wordmark + product name (\"Alfadocs\n * Builders\"). Use for **internal** Alfadocs products (Alfadocs Builders,\n * Alfadocs API) where the product is part of the Alfadocs family.\n * - `'maker'` — \"<name> by Alfadocs\" with the four-pillar mark and the name\n * as the prominent element. Use for **external** marketplace extensions\n * (\"Scribe by Alfadocs\") where the extension's own name leads and\n * \"by Alfadocs\" is the maker attribution.\n */\n variant?: 'standard' | 'maker';\n /**\n * Render the name as a solid `--foreground` ink, upright (no gradient, no\n * italic), and pair it with the monochrome wordmark. Use for print,\n * single-colour reproductions, or any constrained context where the\n * gradient/serif treatment is inappropriate.\n */\n monochrome?: boolean;\n /**\n * Ink resolution. `'auto'` (default) uses the lockup's intended ink\n * (`--foreground` for monochrome). `'inherit'` makes the whole lockup ride\n * `currentColor` — use it with `monochrome` on a coloured brand surface (a\n * tinted header or split-login panel) so the wordmark + name both take the\n * surface's text colour rather than clashing with a fixed `--foreground`.\n */\n tone?: 'auto' | 'inherit';\n /** Lockup size. Drives both the wordmark and the name's cap height. */\n size?: LockupSize;\n className?: string;\n} & Omit<\n ComponentPropsWithoutRef<'span'>,\n 'role' | 'aria-label' | 'aria-hidden' | 'children' | 'className'\n>;\n\n/* ------------------------------------------------------------------ */\n/* ProductLockup */\n/* ------------------------------------------------------------------ */\n\n/**\n * Pairs a product name with the Alfadocs brand. Two compositions:\n *\n * - `variant=\"standard\"` (default) — the Alfadocs wordmark + product name\n * (\"Alfadocs Builders\"). For internal Alfadocs products. Exposed to\n * assistive tech as a single `img` named `Alfadocs <name>`.\n * - `variant=\"maker\"` — \"[mark] <name> by Alfadocs\". For external marketplace\n * extensions where the extension's name leads. Exposed as a single `img`\n * named `<name> by Alfadocs`.\n *\n * In both cases the inner wordmark/mark and the visible name are decorative so\n * the brand isn't announced twice. Every marketplace app should use this\n * rather than hand-rolling a wordmark + typed span.\n */\nexport const ProductLockup = forwardRef<HTMLSpanElement, ProductLockupProps>(\n (\n {\n name,\n variant = 'standard',\n monochrome = false,\n tone = 'auto',\n size = 'md',\n className,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n if (import.meta.env.DEV && !name.trim()) {\n console.warn(\n '[ProductLockup] `name` is empty — the lockup will render the bare wordmark with no product name. Pass the product name (e.g. \"Builders\").',\n );\n }\n\n if (variant === 'maker') {\n // Ink matrix mirrors the standard variant's tone/monochrome model:\n // - tone=\"inherit\": every element rides currentColor (no explicit ink),\n // for coloured surfaces.\n // - monochrome (tone auto): foreground ink, with the attribution muted.\n // - default (colour, tone auto): the name + mark take --primary; the\n // wordmark lettering stays --foreground; the attribution is muted.\n const inherit = tone === 'inherit';\n const markInk = inherit\n ? ''\n : monochrome\n ? 'ds:text-[color:var(--foreground)]'\n : 'ds:text-[color:var(--primary)]';\n const nameInk = inherit\n ? ''\n : monochrome\n ? 'ds:text-[color:var(--foreground)]'\n : 'ds:text-[color:var(--primary)]';\n const byInk = inherit ? '' : 'ds:text-[color:var(--muted-foreground)]';\n const letteringInk = inherit ? '' : 'ds:text-[color:var(--foreground)]';\n\n return (\n <span\n ref={ref}\n role=\"img\"\n aria-label={t('productLockup.makerLabel', { name: name.trim() })}\n className={makerRoot({ size, className })}\n data-component=\"product-lockup\"\n {...props}\n >\n {/* Pillar mark sized close to the app name (≈0.88 of the serif em),\n vertically centred on it. Inline (not flex) so the maker tag can\n use vertical-align. */}\n <AlfadocsLogoMark\n aria-hidden\n className={`ds:inline-block ds:align-middle ds:me-[var(--spacing-sm)] ds:h-[calc(var(--lockup-unit)*0.88)] ds:w-auto ds:forced-colors:text-[CanvasText] ${markInk}`}\n />\n <span\n aria-hidden\n className={`ds:align-middle ds:[font-family:var(--font-serif)] ds:font-semibold ds:italic ds:leading-none ds:tracking-[0.01em] ${nameInk} ds:text-[calc(var(--lockup-unit)*0.95)]`}\n >\n {name}\n </span>\n {/* Maker tag — superscript style, its top aligned to the app name's\n cap-height via vertical-align: text-top. */}\n <span\n aria-hidden\n className={`ds:align-text-top ds:ms-[var(--spacing-sm)] ds:inline-flex ds:items-baseline ds:gap-[var(--spacing-2xs)] ${byInk}`}\n >\n <Trans\n ns=\"ui\"\n t={t}\n i18nKey=\"productLockup.attribution\"\n components={{\n text: (\n <span className=\"ds:text-[calc(var(--lockup-unit)*0.4)] ds:leading-none\" />\n ),\n brand: (\n <AlfadocsLogoNeg\n aria-hidden\n viewBox=\"168 0 637 125\"\n className={`ds:h-[calc(var(--lockup-unit)*0.45)] ds:w-auto ds:forced-colors:text-[CanvasText] ${letteringInk}`}\n />\n ),\n }}\n />\n </span>\n </span>\n );\n }\n\n return (\n <span\n ref={ref}\n role=\"img\"\n aria-label={`Alfadocs ${name}`.trim()}\n className={lockup({ className })}\n data-component=\"product-lockup\"\n {...props}\n >\n <Logo\n variant={monochrome ? 'monochrome' : 'wordmark'}\n tone={tone}\n size={size}\n decorative\n />\n <span\n aria-hidden\n className={productName({\n size,\n tone: monochrome ? 'solid' : 'gradient',\n })}\n >\n {name}\n </span>\n </span>\n );\n },\n);\nProductLockup.displayName = 'ProductLockup';\n","/**\n * Marketplace App Shell — the standard chrome for an app built on top of\n * AlfaDocs (the kind a partner scaffolds with Claude Code, Lovable, etc.).\n *\n * It is a thin, opinionated composition of kit primitives: an `AppFrame` with\n * a branded `Header` (the maker `ProductLockup` — \"<Product> by Alfadocs\" —\n * rendered `monochrome` so it rides the header's ink; maker is the lockup\n * style for external marketplace extensions), a `Sidebar` for app\n * navigation, `HeaderSettings` (theme/locale/accessibility), and a bare-avatar\n * account menu (fullscreen + sign-out) matching the main app shell. An\n * optional `endSidebar` docks a tool rail (for example Alia) on the inline-end.\n * `sidebarContent`, `sidebarHeader` and `sidebarActions` let the host build\n * the sidebar from the kit's Sidebar parts instead of the flat `nav`.\n * `ConnectWithAlfadocs` is the matching pre-auth screen, with the full-colour\n * maker lockup and `SignInWithAlfadocsButton`.\n *\n * Like `AliaSidebar`, this pattern ships a RUNTIME component (surfaced via\n * `src/patterns/index.ts` and the library bundle) because consuming apps mount\n * it in production rather than copying the source.\n *\n * Auth is intentionally decoupled: the shell takes the signed-in `user` and an\n * `onSignOut` callback as props, and `ConnectWithAlfadocs` takes a `status` +\n * `onConnect`. Wire them to `@alfadocs/auth/react`'s `useAlfadocsAuth()` in the\n * consuming app — the kit never touches OAuth or secrets (those live in the\n * server-side `@alfadocs/auth` BFF).\n *\n * All user-visible copy is consumer-provided (props) so each app localises in\n * its own i18n; the only kit-owned strings reuse existing translated `ui.*`\n * keys (sidebar label, skip link, menu button).\n */\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { cva } from 'class-variance-authority';\nimport { LogOut, Maximize2 } from 'lucide-react';\n\nimport { AppFrame } from '../../components/app-frame';\nimport { Avatar } from '../../components/avatar';\nimport { Alert } from '../../components/alert';\nimport { Card } from '../../components/card';\nimport { DropdownMenu } from '../../components/dropdown-menu';\nimport { TabBar } from '../../components/tab-bar';\nimport {\n Header,\n HeaderBrand,\n HeaderCenter,\n HeaderEnd,\n HeaderMenuButton,\n HeaderSkipLink,\n HeaderStart,\n} from '../../components/header';\nimport { HeaderSettings } from '../../components/header-settings';\nimport { ProductLockup } from '../../brand/product-lockup';\nimport { SignInWithAlfadocsButton } from '../../components/sign-in-with-alfadocs-button';\nimport {\n Sidebar,\n SidebarBody,\n SidebarCloseTrigger,\n SidebarCollapseTrigger,\n SidebarHeader,\n SidebarItem,\n SidebarItemBadge,\n SidebarItemIcon,\n SidebarItemLabel,\n SidebarSectionsToggle,\n useSidebar,\n type SidebarItemMove,\n type SidebarMode,\n} from '../../components/sidebar';\nimport { NavigationDismissContext } from '../../components/_shared/navigation-dismiss';\nimport { ThemeRoot } from '../../components/theme-root';\nimport { TooltipProvider } from '../../components/tooltip';\nimport { useTheme } from '../../hooks/use-theme';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useMediaQuery } from '../../hooks/use-media-query';\n\n// Below AppFrame's `md` (768px, --breakpoint-md), where it hides the rail.\nconst PHONE_QUERY = '(max-width: 767.98px)';\n\n/* ------------------------------------------------------------------ */\n/* Public API */\n/* ------------------------------------------------------------------ */\n\nexport interface MarketplaceNavItem {\n id: string;\n /** Pre-translated label — apps localise their own nav copy. */\n label: string;\n href: string;\n /** Optional leading icon (a lucide-react element or equivalent). */\n icon?: ReactNode;\n /** Optional unseen-item count rendered as a pill badge. */\n badgeCount?: number;\n /** Mark the item as the current page (`aria-current='page'`). */\n isActive?: boolean;\n /**\n * Optional click handler threaded onto the nav link's `<a>`. The lightweight\n * alternative to `renderLink`: intercept a same-origin click (call\n * `event.preventDefault()`) and route client-side without a full page load —\n * no router `<Link>` needed. Applies to both the standalone sidebar item and\n * the embedded tab. When `renderLink` is supplied it's handed through to the\n * consumer's link element instead.\n */\n onClick?: (event: MouseEvent<HTMLAnchorElement>) => void;\n}\n\n/**\n * Props the shell hands to `renderLink` for each nav item. The consumer returns\n * their router's `<Link to={href}>` carrying the same `className` (the kit's\n * active styling) and `aria-current` (`'page'` on the active item) so a tab /\n * sidebar-item click is a client-side route change, not a full page reload.\n */\nexport interface MarketplaceRenderLinkProps {\n /** The item's destination — feed it to your router's `to` / `href`. */\n href: string;\n /** The kit's classes — apply verbatim to the link element. */\n className?: string;\n /** Icon + label + badge — render as the link's children. */\n children: ReactNode;\n /** `'page'` on the active item, otherwise omitted — forward to the link. */\n 'aria-current'?: 'page';\n /**\n * The item's stable id, as the agent / automation DOM hook. Spread it onto\n * your router link so the item stays addressable by `[data-tab-id]` — see\n * PRS §26 §6. Only supplied on the bottom-tab-bar path.\n */\n 'data-tab-id'?: string;\n}\n\n/**\n * Render a nav item through the consumer's router instead of the kit's own\n * `<a>`. Returned by the consumer; the shell forwards `href`, the kit's\n * `className`, the item children, and `aria-current` so the active styling and\n * the `aria-current=\"page\"` marker survive a client-side route change.\n */\nexport type MarketplaceRenderLink = (\n props: MarketplaceRenderLinkProps,\n) => ReactNode;\n\nexport interface MarketplaceAppUser {\n /** Display name — drives the avatar initials + the account-menu header. */\n name: string;\n /** Optional email shown under the name in the account menu. */\n email?: string;\n /** Optional avatar image URL. */\n avatarSrc?: string;\n}\n\nexport interface MarketplaceAppShellLabels {\n /** Accessible name for the account-menu trigger, e.g. \"Account menu\". */\n accountMenu: string;\n /** The sign-out menu item, e.g. \"Sign out\". */\n signOut: string;\n /**\n * Optional fullscreen menu item label, e.g. \"Toggle fullscreen\". The item\n * renders whenever `onToggleFullscreen` is supplied; when this label is\n * omitted it falls back to the translated `ui.*` \"Toggle fullscreen\" string.\n */\n fullscreen?: string;\n}\n\nexport interface MarketplaceAppShellProps {\n /** Extension name — renders as the maker lockup \"<productName> by Alfadocs\". */\n productName: string;\n /** Link target for the brand lockup. Default `'/'`. */\n productHref?: string;\n /**\n * Nav items, in order. Standalone ignores them when `sidebarContent` is set;\n * the embedded tab strip always uses them. Never-embedded apps can pass `[]`.\n */\n nav: MarketplaceNavItem[];\n /**\n * Standalone sidebar body built from the kit's Sidebar parts. When set, even\n * to `null`, it replaces the flat `nav` in every mode, inside the shell's own\n * `SidebarBody` and `<nav>`. Ignored in `'embedded'`.\n */\n sidebarContent?: ReactNode;\n /**\n * Extra standalone sidebar header content, such as an inline `SearchBar`,\n * below the collapse trigger and any `sidebarActions`. Hidden in the icon\n * rail. Ignored in `'embedded'`.\n */\n sidebarHeader?: ReactNode;\n /**\n * Header tools, usually `SidebarHeaderAction`s, in the collapse trigger's\n * row after it (and after the sections toggle), above `sidebarHeader`.\n * Stacked under the expand button in the icon rail; beside the close\n * button in the phone overlay. Ignored in `'embedded'`.\n */\n sidebarActions?: ReactNode;\n /**\n * Adds `SidebarSectionsToggle` to that row, right after the collapse\n * trigger: it folds or unfolds every section in `sidebarContent`, and hides\n * itself while there are none. @default false\n */\n sidebarSectionsToggle?: boolean;\n /**\n * One call when the sections toggle folds or unfolds every section, with\n * their `sectionId`s, in place of each section's `onOpenChange`; see\n * `Sidebar`'s `onSetAllSectionsOpen`.\n */\n onSetAllSidebarSectionsOpen?: (open: boolean, sectionIds: string[]) => void;\n /**\n * Lets users move `sidebarContent` items between sections, by drag and drop\n * or keyboard; see `Sidebar`'s `onMoveItem`. Apply each move and re-render.\n * Off when omitted, in the icon rail, and in `'embedded'`.\n */\n onMoveSidebarItem?: (move: SidebarItemMove) => void;\n /**\n * Render nav items (and the brand lockup) through the consumer's router so a\n * tab / item click is a client-side route change with **no full-page reload\n * or session flash**. Wire it to your router's `<Link>`:\n *\n * ```tsx\n * import { Link } from '@tanstack/react-router';\n * <MarketplaceAppShell\n * nav={nav}\n * renderLink={({ href, className, children, ...rest }) => (\n * <Link to={href} className={className} {...rest}>{children}</Link>\n * )}\n * />\n * ```\n *\n * Threaded to the standalone sidebar items, the embedded top tab strip, and\n * the brand lockup. The kit forwards the same `className` + `aria-current` so\n * the active styling and the `aria-current=\"page\"` marker survive in both\n * modes. Omit it to render the plain `<a href>` exactly as before — non-routed\n * consumers are byte-for-byte unaffected. A per-item `onClick` (a\n * click-interceptor shim) is the lighter alternative when you don't want to\n * thread a router `<Link>`.\n */\n renderLink?: MarketplaceRenderLink;\n /** The signed-in user shown in the account menu. */\n user: MarketplaceAppUser;\n /** Consumer-localised chrome labels owned by the shell. */\n labels: MarketplaceAppShellLabels;\n /** Fires when the user picks \"Sign out\". Wire to `useAlfadocsAuth().signOut`. */\n onSignOut?: () => void;\n /** Fires when the user toggles fullscreen. Omit to hide the fullscreen item. */\n onToggleFullscreen?: () => void;\n /**\n * Force the sidebar into a specific mode. Leave it undefined and the shell\n * uses the menu-button drawer below `md` by itself, and the user's saved\n * mode (expanded unless they collapsed it) above.\n */\n sidebarState?: SidebarMode;\n /**\n * Render a collapse/expand toggle in the sidebar header, letting the user\n * shrink the standalone sidebar (the flat `nav` or your `sidebarContent`)\n * to an icon rail. The chosen mode persists\n * per-user (the underlying `Sidebar` stores it) and survives reloads. Opt-in\n * so existing consumers are unaffected; ignored when `sidebarState` forces a\n * mode or in the `'embedded'` variant (no sidebar). @default false\n */\n collapsibleSidebar?: boolean;\n /** Override the accessible name of the `<main>` landmark. */\n mainAriaLabel?: string;\n /**\n * Chrome variant. `'standalone'` (default) renders the full shell — branded\n * Header, Sidebar, and account menu. `'embedded'` is for apps running INSIDE\n * the AlfaDocs platform iframe (consumers detect this with\n * `window !== window.top`): it drops the Header, Sidebar, account menu, and\n * product lockup — the platform already brands and identifies the session\n * around the iframe — and renders the `nav` items as a single slim top tab\n * strip. `onSignOut`, `onToggleFullscreen`, `productName`, `productHref`,\n * `sidebarState`, `sidebarContent` and `sidebarHeader` are ignored in\n * `'embedded'`; the `<main>` landmark, `mainAriaLabel`, the skip link and\n * `endSidebar` are kept.\n */\n variant?: 'standalone' | 'embedded';\n /** Inline-end panel (e.g. a `ControlRoomRail`) forwarded to `AppFrame` in both variants.\n * Hidden below `md`: keep it mounted and add `AliaPopout` there. In `'embedded'` it\n * pins the tab strip and scrolls `<main>` beside it; omitted, embedded is unchanged. */\n endSidebar?: ReactNode;\n /** Children render inside the main content region. */\n children: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Internals */\n/* ------------------------------------------------------------------ */\n\nfunction formatBadgeCount(count: number): string {\n return count > 99 ? '99+' : String(count);\n}\n\nfunction AccountMenu({\n user,\n labels,\n onSignOut,\n onToggleFullscreen,\n}: {\n user: MarketplaceAppUser;\n labels: MarketplaceAppShellLabels;\n onSignOut?: () => void;\n onToggleFullscreen?: () => void;\n}) {\n const { t } = useTranslation('ui');\n // Default to the translated `ui.*` label so a consumer that wires\n // `onToggleFullscreen` but omits the label still gets a localised item.\n const fullscreenLabel =\n labels.fullscreen ?? t('marketplaceAppShell.settings.fullscreen');\n return (\n // Non-modal: an account menu shouldn't inert/aria-hide the whole shell\n // behind it (which leaves the still-focusable chrome inside an\n // aria-hidden region — an `aria-hidden-focus` violation).\n <DropdownMenu.Root modal={false}>\n <DropdownMenu.Trigger asChild>\n {/* Bare avatar circle — matches the main app shell's account\n trigger. The name lives inside the menu, not beside the avatar. */}\n <button\n type=\"button\"\n aria-label={labels.accountMenu}\n data-testid=\"marketplace-account-trigger\"\n className=\"ds:inline-flex ds:items-center ds:justify-center ds:shrink-0 ds:size-10 ds:rounded-[var(--radius-full)] ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)] ds:forced-colors:focus-visible:outline-[CanvasText]\"\n >\n <span aria-hidden=\"true\">\n <Avatar name={user.name} src={user.avatarSrc} size=\"md\" />\n </span>\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\" collisionPadding={16}>\n {/* GitHub-style identity header — small avatar + name + secondary\n line, matching the main app shell's account menu. */}\n <DropdownMenu.Label>\n <span className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span aria-hidden=\"true\">\n <Avatar name={user.name} src={user.avatarSrc} size=\"sm\" />\n </span>\n <span className=\"ds:flex ds:flex-col ds:min-w-0\">\n <span className=\"type-label ds:text-[color:var(--foreground)] ds:truncate\">\n {user.name}\n </span>\n {user.email ? (\n <span className=\"type-meta ds:truncate\">{user.email}</span>\n ) : null}\n </span>\n </span>\n </DropdownMenu.Label>\n {onToggleFullscreen ? (\n <>\n <DropdownMenu.Separator />\n <DropdownMenu.Item\n startIcon={<Maximize2 aria-hidden />}\n onSelect={onToggleFullscreen}\n data-testid=\"marketplace-fullscreen\"\n >\n {fullscreenLabel}\n </DropdownMenu.Item>\n </>\n ) : null}\n <DropdownMenu.Separator />\n <DropdownMenu.Item\n startIcon={<LogOut aria-hidden />}\n onSelect={onSignOut}\n data-testid=\"marketplace-sign-out\"\n >\n {labels.signOut}\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n}\n\nfunction MarketplaceSidebarNav({\n nav,\n renderLink,\n}: {\n nav: MarketplaceNavItem[];\n renderLink?: MarketplaceRenderLink;\n}) {\n return (\n <SidebarBody>\n {nav.map((item) => {\n const badge =\n typeof item.badgeCount === 'number' && item.badgeCount > 0\n ? item.badgeCount\n : undefined;\n const inner = (\n <>\n {item.icon ? <SidebarItemIcon>{item.icon}</SidebarItemIcon> : null}\n <SidebarItemLabel>{item.label}</SidebarItemLabel>\n {badge !== undefined ? (\n <SidebarItemBadge>{formatBadgeCount(badge)}</SidebarItemBadge>\n ) : null}\n </>\n );\n\n // Consumer-router mode: render the item through Radix `Slot`\n // (`SidebarItem asChild`) so the consumer's `<Link>` takes over the\n // anchor while keeping the kit's item styling + `aria-current=\"page\"`.\n // Clicking routes client-side — no full-page reload.\n if (renderLink) {\n return (\n <SidebarItem key={item.id} asChild isActive={item.isActive}>\n {renderLink({\n href: item.href,\n children: inner,\n 'aria-current': item.isActive ? 'page' : undefined,\n })}\n </SidebarItem>\n );\n }\n\n // Default: plain anchor — byte-identical to before when no per-item\n // `onClick` is supplied (it's omitted entirely, not passed as\n // undefined, so the rendered `<a>` is unchanged).\n return (\n <SidebarItem\n key={item.id}\n href={item.href}\n aria-label={item.label}\n isActive={item.isActive}\n {...(item.onClick ? { onClick: item.onClick } : {})}\n >\n {inner}\n </SidebarItem>\n );\n })}\n </SidebarBody>\n );\n}\n\n// The tool row: the collapse trigger, the sections toggle, then the host's\n// actions; the drawer ends it with the close button. The rail stacks it.\n// One tree in every mode, so the collapse trigger keeps focus.\nconst sidebarHeaderStackVariants = cva(\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]',\n {\n variants: {\n mode: {\n expanded: 'ds:min-w-0 ds:flex-1',\n icon: 'ds:items-center',\n overlay: 'ds:min-w-0 ds:flex-1',\n },\n },\n defaultVariants: { mode: 'expanded' },\n },\n);\nconst sidebarHeaderRowVariants = cva(\n // Wraps rather than push a tool off the edge at the accessible size. Empty\n // when the sections toggle, alone in it, finds no section.\n 'ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)] ds:empty:hidden',\n {\n variants: {\n mode: {\n expanded: '',\n icon: 'ds:flex-col',\n overlay: 'ds:justify-end',\n },\n },\n defaultVariants: { mode: 'expanded' },\n },\n);\n\nconst hasNode = (node: ReactNode) =>\n node !== undefined && node !== null && typeof node !== 'boolean';\n\nfunction MarketplaceSidebarHeader({\n collapseTrigger,\n sectionsToggle,\n actions,\n content,\n}: {\n collapseTrigger: boolean;\n sectionsToggle: boolean;\n actions: ReactNode;\n content: ReactNode;\n}) {\n const { mode } = useSidebar();\n const hasActions = hasNode(actions);\n const overlay = mode === 'overlay';\n // SidebarCollapseTrigger renders nothing in the overlay, so skip it there.\n const showTrigger = collapseTrigger && !overlay;\n const showContent = hasNode(content) && mode !== 'icon';\n const showRow = showTrigger || sectionsToggle || hasActions || overlay;\n if (!showRow && !showContent) return null;\n return (\n // With nothing below it, an empty row hides the whole band too.\n <SidebarHeader\n className={\n showContent\n ? undefined\n : 'ds:has-[[data-sidebar-header-row]:empty]:hidden'\n }\n >\n <div className={sidebarHeaderStackVariants({ mode })}>\n {showRow ? (\n <div\n data-sidebar-header-row=\"\"\n className={sidebarHeaderRowVariants({ mode })}\n >\n {showTrigger ? <SidebarCollapseTrigger /> : null}\n {sectionsToggle ? <SidebarSectionsToggle /> : null}\n {hasActions ? actions : null}\n {overlay ? <SidebarCloseTrigger /> : null}\n </div>\n ) : null}\n {showContent ? content : null}\n </div>\n </SidebarHeader>\n );\n}\n\n/* CVA for the chrome variant — drives the `<main>` surface; the structural\n header/sidebar-vs-tab-strip difference is conditional in the render.\n\n The `standalone` `<main>` gets its content inset from AppFrame's own\n `mainVariants({ padded: true })` (`--spacing-md` on every logical side), so\n this variant only carries the canvas colour there. The `embedded` `<main>`\n is a plain element (no AppFrame), so it has to supply its own inset:\n `--spacing-md` inline + block-end to match the standalone inset, and a\n larger `--spacing-lg` block-start so content clears the floating tab strip's\n pill instead of butting up against it. All logical — RTL mirrors for free. */\nconst EMBEDDED_CONTENT_INSET = [\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-lg)] ds:pb-[var(--spacing-md)]',\n].join(' ');\n\nconst shellMainVariants = cva('ds:bg-[color:var(--app-shell-background)]', {\n variants: {\n variant: {\n standalone: '',\n embedded: `ds:flex-1 ${EMBEDDED_CONTENT_INSET}`,\n },\n },\n defaultVariants: { variant: 'standalone' },\n});\n\n// Embedded with an end panel: the strip sits in AppFrame's header slot, so it\n// carries the shell canvas itself rather than AppFrame's `--background`.\nconst EMBEDDED_DOCKED_CHROME =\n 'ds:shrink-0 ds:bg-[color:var(--app-shell-background)]';\n\n/**\n * Embedded chrome: the slim floating tab strip (no Header / Sidebar / account\n * menu) for apps running inside the AlfaDocs platform iframe. It's the shared\n * {@link TabBar} fed the shell's nav items — the platform brands and identifies\n * the session around the iframe, so the strip is the only chrome. The\n * `MarketplaceNavItem` shape is structurally a `TabBarItem`, so the nav passes\n * straight through.\n */\nfunction EmbeddedTabStrip({\n nav,\n ariaLabel,\n renderLink,\n}: {\n nav: MarketplaceNavItem[];\n ariaLabel: string;\n renderLink?: MarketplaceRenderLink;\n}) {\n // Adapt the shell's `renderLink` to TabBar's `renderLink` signature — TabBar\n // also offers the per-item `onClick`, but in consumer-router mode the\n // `<Link>` owns navigation (matching the standalone sidebar), so we forward\n // only `href` / `className` / `children` / `aria-current`. With `renderLink`\n // omitted, TabBar renders its own plain `<a href>` exactly as before, and a\n // per-item `onClick` rides through `nav` → `TabBarItem` untouched.\n const tabRenderLink = renderLink\n ? ({\n href,\n className,\n children,\n 'aria-current': ariaCurrent,\n 'data-tab-id': tabId,\n }: {\n href: string;\n className: string;\n children: ReactNode;\n 'aria-current'?: 'page';\n 'data-tab-id'?: string;\n }) =>\n renderLink({\n href,\n className,\n children,\n 'aria-current': ariaCurrent,\n // Forward the agent DOM hook — without it a consumer-router tab is\n // invisible to `[data-tab-id]` lookups (PRS §26 §6).\n 'data-tab-id': tabId,\n })\n : undefined;\n\n return (\n <TabBar\n items={nav}\n ariaLabel={ariaLabel}\n {...(tabRenderLink ? { renderLink: tabRenderLink } : {})}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* MarketplaceAppShell */\n/* ------------------------------------------------------------------ */\n\nexport const MarketplaceAppShell = forwardRef<\n HTMLDivElement,\n MarketplaceAppShellProps\n>(\n (\n {\n productName,\n productHref = '/',\n nav,\n renderLink,\n user,\n labels,\n onSignOut,\n onToggleFullscreen,\n sidebarState,\n collapsibleSidebar = false,\n sidebarContent,\n sidebarHeader,\n sidebarActions,\n sidebarSectionsToggle = false,\n onSetAllSidebarSectionsOpen,\n onMoveSidebarItem,\n mainAriaLabel,\n variant = 'standalone',\n endSidebar,\n children,\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n\n // The brand lockup as a consumer-router link: when `renderLink` is\n // supplied, the brand anchor routes client-side too (no session flash when\n // jumping home). The maker lockup's \"<productName> by Alfadocs\" supplies\n // the link's accessible name, matching the default `HeaderBrand` anchor.\n const headerBrand = renderLink ? (\n <HeaderBrand asChild>\n {renderLink({\n href: productHref,\n children: (\n <ProductLockup\n name={productName}\n size=\"md\"\n monochrome\n variant=\"maker\"\n />\n ),\n })}\n </HeaderBrand>\n ) : (\n <HeaderBrand\n href={productHref}\n logo={\n <ProductLockup\n name={productName}\n size=\"md\"\n monochrome\n variant=\"maker\"\n />\n }\n />\n );\n\n // Only wrap in a nested ThemeRoot when the user has an\n // explicit theme/accessibility override, so we don't clobber the consuming\n // app's (or Storybook's) outer theme cascade.\n const { theme: themePref, accessibility, resolvedTheme } = useTheme();\n const hasExplicitOverride =\n themePref !== 'system' || accessibility !== 'system';\n const themeBase = resolvedTheme.startsWith('dark') ? 'dark' : 'light';\n const themeAccessible = resolvedTheme.endsWith('-accessible');\n\n // Below `md` AppFrame hides the docked sidebar and HeaderMenuButton\n // shows, so the shell switches to the drawer there by itself. An explicit\n // `sidebarState` wins; above `md` the user's saved mode stays.\n const isPhone = useMediaQuery(PHONE_QUERY);\n const effectiveSidebarState =\n sidebarState ?? (isPhone ? ('overlay' as const) : undefined);\n const [sidebarOpen, setSidebarOpen] = useState(false);\n const closeSidebar = useCallback(() => setSidebarOpen(false), []);\n\n // Leaving the drawer (a phone turned to landscape past `md`) shuts it,\n // so it never reopens, taking focus, on the way back.\n useEffect(() => {\n if (effectiveSidebarState !== 'overlay') setSidebarOpen(false);\n }, [effectiveSidebarState]);\n\n // The drawer closes when the route changes, however the host changed it:\n // the URL, or the item marked current. No router needed. The flat `nav`\n // says which item that is; custom content is read from the open drawer.\n const sidebarRef = useRef<HTMLElement>(null);\n const routeRef = useRef<{\n open: boolean;\n url: string;\n current: string | null;\n } | null>(null);\n const navCurrent =\n sidebarContent === undefined\n ? (nav.find((item) => item.isActive)?.id ?? '')\n : undefined;\n useIsomorphicLayoutEffect(() => {\n const url = window.location.href;\n let current: string | null = navCurrent ?? null;\n if (navCurrent === undefined && sidebarRef.current) {\n const node = sidebarRef.current.querySelector('[aria-current=\"page\"]');\n current = node?.getAttribute('href') ?? node?.textContent ?? '';\n }\n const previous = routeRef.current;\n routeRef.current = { open: sidebarOpen, url, current };\n if (!previous?.open || !sidebarOpen) return;\n // A side not read (the drawer's portal mounts a commit late) says\n // nothing about the route, so only two real readings are compared.\n const changedItem =\n previous.current !== null &&\n current !== null &&\n previous.current !== current;\n if (previous.url !== url || changedItem) setSidebarOpen(false);\n });\n useEffect(() => {\n if (!sidebarOpen) return undefined;\n window.addEventListener('popstate', closeSidebar);\n window.addEventListener('hashchange', closeSidebar);\n return () => {\n window.removeEventListener('popstate', closeSidebar);\n window.removeEventListener('hashchange', closeSidebar);\n };\n }, [sidebarOpen, closeSidebar]);\n\n const shell = (\n <TooltipProvider>\n <AppFrame\n mainAriaLabel={mainAriaLabel}\n mainClassName={shellMainVariants({ variant: 'standalone' })}\n header={\n <Header>\n <HeaderStart>\n <HeaderSkipLink href=\"#main-content\" />\n <HeaderMenuButton onMenuOpen={() => setSidebarOpen(true)} />\n {headerBrand}\n </HeaderStart>\n <HeaderCenter />\n <HeaderEnd>\n <HeaderSettings size=\"sm\" />\n <AccountMenu\n user={user}\n labels={labels}\n onSignOut={onSignOut}\n onToggleFullscreen={onToggleFullscreen}\n />\n </HeaderEnd>\n </Header>\n }\n sidebar={\n <Sidebar\n ref={sidebarRef}\n {...(effectiveSidebarState !== undefined\n ? { state: effectiveSidebarState }\n : { defaultState: 'expanded' as const })}\n open={sidebarOpen}\n onOpenChange={setSidebarOpen}\n onMoveItem={onMoveSidebarItem}\n onSetAllSectionsOpen={onSetAllSidebarSectionsOpen}\n // A link tapped in the phone drawer navigates, so the drawer\n // closes, whether the link is the flat nav's or the host's.\n onClick={(event) => {\n if (\n event.target instanceof Element &&\n event.target.closest('a[href]')\n ) {\n closeSidebar();\n }\n }}\n aria-label={t('navigation.sidebar.label')}\n data-testid=\"marketplace-app-shell-sidebar\"\n >\n {/* So does a pick that navigates without a link, such as a\n SearchBar result. */}\n <NavigationDismissContext.Provider value={closeSidebar}>\n <MarketplaceSidebarHeader\n collapseTrigger={\n collapsibleSidebar && effectiveSidebarState === undefined\n }\n sectionsToggle={sidebarSectionsToggle}\n actions={sidebarActions}\n content={sidebarHeader}\n />\n {sidebarContent !== undefined ? (\n <SidebarBody>{sidebarContent}</SidebarBody>\n ) : (\n <MarketplaceSidebarNav nav={nav} renderLink={renderLink} />\n )}\n </NavigationDismissContext.Provider>\n </Sidebar>\n }\n endSidebar={endSidebar}\n >\n {children}\n </AppFrame>\n </TooltipProvider>\n );\n\n const embeddedChrome = (\n <>\n <HeaderSkipLink href=\"#main-content\" />\n <EmbeddedTabStrip\n nav={nav}\n ariaLabel={t('navigation.sidebar.label')}\n renderLink={renderLink}\n />\n </>\n );\n\n // An end panel needs a height-bounded row to dock in, which AppFrame owns.\n // The inset moves inside its scroll area, so `<main>` reads as it does\n // without the panel. No sidebar: the tab strip stays the only nav.\n const embeddedDocked = (\n <TooltipProvider>\n <AppFrame\n mainAriaLabel={mainAriaLabel}\n mainClassName={shellMainVariants({ variant: 'standalone' })}\n padded={false}\n header={\n <div className={EMBEDDED_DOCKED_CHROME}>{embeddedChrome}</div>\n }\n sidebar={null}\n endSidebar={endSidebar}\n >\n <div className={EMBEDDED_CONTENT_INSET}>{children}</div>\n </AppFrame>\n </TooltipProvider>\n );\n\n const embedded = (\n // The shell owns the warm-grey canvas; TabBar's strip is transparent and\n // floats its pill on it, and `<main>` continues the same surface.\n <div className=\"ds:flex ds:min-h-dvh ds:flex-col ds:bg-[color:var(--app-shell-background)]\">\n {embeddedChrome}\n <main\n id=\"main-content\"\n tabIndex={-1}\n aria-label={\n mainAriaLabel ?? t('navigation.main.label', 'Main content')\n }\n className={shellMainVariants({ variant: 'embedded' })}\n >\n {children}\n </main>\n </div>\n );\n\n const content =\n variant === 'embedded' ? (endSidebar ? embeddedDocked : embedded) : shell;\n\n if (!hasExplicitOverride) {\n return (\n <div\n ref={ref}\n className=\"ds:contents\"\n data-component=\"marketplace-app-shell\"\n >\n {content}\n </div>\n );\n }\n\n return (\n <ThemeRoot\n ref={ref}\n theme={themeBase}\n accessible={themeAccessible}\n className=\"ds:contents\"\n data-component=\"marketplace-app-shell\"\n >\n {content}\n </ThemeRoot>\n );\n },\n);\n\nMarketplaceAppShell.displayName = 'MarketplaceAppShell';\n\n/* ------------------------------------------------------------------ */\n/* ConnectWithAlfadocs */\n/* ------------------------------------------------------------------ */\n\nexport type ConnectStatus = 'idle' | 'connecting' | 'error';\n\nexport interface ConnectWithAlfadocsProps {\n /** Product name shown next to the wordmark at the top of the card. */\n productName: string;\n /** Heading, e.g. \"Connect your AlfaDocs account\". */\n title: string;\n /** Supporting copy below the heading. */\n description: ReactNode;\n /** The connect button label, e.g. \"Connect with AlfaDocs\". */\n connectLabel: string;\n /** Connection lifecycle. `connecting` shows a loading button; `error` shows the alert. */\n status?: ConnectStatus;\n /** Error message shown (as an alert) when `status === 'error'`. */\n error?: ReactNode;\n /** Fires when the connect button is pressed. Wire to `useAlfadocsAuth().connect`. */\n onConnect?: () => void;\n /** Optional footer content below the button (e.g. a \"what's this?\" link). */\n footer?: ReactNode;\n /**\n * Visual layout. `'card'` (default) is the centred card on the warm-grey\n * canvas — unchanged. `'split'` adds, at `lg:` and up, a two-panel desktop\n * layout: a brand panel on the inline-start and the connect card on the\n * inline-end. Below `lg:`, `'split'` collapses to exactly the card layout —\n * so it falls back gracefully inside iframes / embeds that never reach\n * desktop width. Use `'split'` for full-page desktop logins.\n */\n layout?: 'card' | 'split';\n /**\n * Optional content shown under the lockup in the `'split'` brand panel (a\n * tagline, value props, an illustration). Ignored in `'card'` and below `lg:`.\n */\n brandPanel?: ReactNode;\n className?: string;\n}\n\n/* Split-layout CVAs (lg+ two-panel; collapses to the centred card below lg). */\nconst connectRootVariants = cva(\n 'ds:flex ds:min-h-dvh ds:bg-[color:var(--app-shell-background)]',\n {\n variants: {\n layout: {\n card: '',\n split: 'ds:flex-col ds:lg:flex-row',\n },\n },\n defaultVariants: { layout: 'card' },\n },\n);\n\nconst connectCardWidthVariants = cva('ds:w-full', {\n variants: {\n layout: {\n card: 'ds:max-w-[400px]',\n split: 'ds:max-w-[400px] ds:lg:max-w-[480px]',\n },\n },\n defaultVariants: { layout: 'card' },\n});\n\n// The card's own lockup hides at lg+ in `split` (the brand panel shows it there).\nconst connectCardLockupVariants = cva('', {\n variants: {\n layout: { card: '', split: 'ds:lg:hidden' },\n },\n defaultVariants: { layout: 'card' },\n});\n\n/**\n * The pre-auth \"Connect with AlfaDocs\" screen. Centred white card on the\n * warm-grey canvas with the AlfaDocs wordmark + product name, copy, an error\n * slot, and the primary connect CTA. An opt-in `layout=\"split\"` adds a desktop\n * two-panel brand layout (lg+). Presentational — `onConnect` should call\n * `useAlfadocsAuth().connect()`, which redirects the browser to the server-side\n * BFF that runs the real OAuth2 + PKCE flow.\n */\nexport const ConnectWithAlfadocs = forwardRef<\n HTMLDivElement,\n ConnectWithAlfadocsProps\n>(\n (\n {\n productName,\n title,\n description,\n connectLabel,\n status = 'idle',\n error,\n onConnect,\n footer,\n layout = 'card',\n brandPanel,\n className,\n },\n ref,\n ) => {\n return (\n <div\n ref={ref}\n data-component=\"connect-with-alfadocs\"\n className={`${connectRootVariants({ layout })} ${className ?? ''}`}\n >\n {layout === 'split' ? (\n // Desktop brand panel (lg+ only): a bold `--primary` surface with the\n // monochrome lockup riding the `--primary-foreground` ink, plus an\n // optional `brandPanel` slot. Decorative — the card carries the real\n // heading + CTA, and shows its own lockup below `lg:`.\n <div className=\"ds:hidden ds:lg:flex ds:lg:w-[55%] ds:flex-col ds:items-center ds:justify-center ds:gap-[var(--spacing-lg)] ds:bg-[color:var(--primary)] ds:text-[color:var(--primary-foreground)] ds:ps-[var(--spacing-2xl)] ds:pe-[var(--spacing-2xl)] ds:pt-[var(--spacing-2xl)] ds:pb-[var(--spacing-2xl)] ds:text-start\">\n <ProductLockup\n name={productName}\n size=\"lg\"\n monochrome\n tone=\"inherit\"\n variant=\"maker\"\n />\n {brandPanel ? (\n <div className=\"type-body ds:max-w-[28rem] ds:text-start\">\n {brandPanel}\n </div>\n ) : null}\n </div>\n ) : null}\n <div className=\"ds:flex ds:flex-1 ds:items-center ds:justify-center ds:p-[var(--spacing-lg)]\">\n <Card className={connectCardWidthVariants({ layout })}>\n <Card.Body className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-lg)] ds:text-center\">\n <ProductLockup\n name={productName}\n size=\"lg\"\n variant=\"maker\"\n className={connectCardLockupVariants({ layout })}\n />\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <h1 className=\"type-title-card\">{title}</h1>\n <p className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {description}\n </p>\n </div>\n {status === 'error' && error ? (\n <Alert variant=\"error\" className=\"ds:w-full ds:text-start\">\n {error}\n </Alert>\n ) : null}\n <SignInWithAlfadocsButton\n intent=\"primary\"\n className=\"ds:w-full\"\n loading={status === 'connecting'}\n onClick={onConnect}\n label={connectLabel}\n data-testid=\"connect-with-alfadocs-button\"\n />\n {footer ? (\n <div className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {footer}\n </div>\n ) : null}\n </Card.Body>\n </Card>\n </div>\n </div>\n );\n },\n);\n\nConnectWithAlfadocs.displayName = 'ConnectWithAlfadocs';\n"],"names":["lockup","cva","productName","makerRoot","ProductLockup","forwardRef","name","variant","monochrome","tone","size","className","props","ref","t","useTranslation","inherit","markInk","nameInk","byInk","letteringInk","jsxs","jsx","AlfadocsLogoMark","Trans","AlfadocsLogoNeg","Logo","PHONE_QUERY","formatBadgeCount","count","AccountMenu","user","labels","onSignOut","onToggleFullscreen","fullscreenLabel","DropdownMenu","Avatar","Fragment","Maximize2","LogOut","MarketplaceSidebarNav","nav","renderLink","SidebarBody","item","badge","inner","SidebarItemIcon","SidebarItemLabel","SidebarItemBadge","SidebarItem","sidebarHeaderStackVariants","sidebarHeaderRowVariants","hasNode","node","MarketplaceSidebarHeader","collapseTrigger","sectionsToggle","actions","content","mode","useSidebar","hasActions","overlay","showTrigger","showContent","showRow","SidebarHeader","SidebarCollapseTrigger","SidebarSectionsToggle","SidebarCloseTrigger","EMBEDDED_CONTENT_INSET","shellMainVariants","EMBEDDED_DOCKED_CHROME","EmbeddedTabStrip","ariaLabel","tabRenderLink","href","children","ariaCurrent","tabId","TabBar","MarketplaceAppShell","productHref","sidebarState","collapsibleSidebar","sidebarContent","sidebarHeader","sidebarActions","sidebarSectionsToggle","onSetAllSidebarSectionsOpen","onMoveSidebarItem","mainAriaLabel","endSidebar","headerBrand","HeaderBrand","themePref","accessibility","resolvedTheme","useTheme","hasExplicitOverride","themeBase","themeAccessible","isPhone","useMediaQuery","effectiveSidebarState","sidebarOpen","setSidebarOpen","useState","closeSidebar","useCallback","useEffect","sidebarRef","useRef","routeRef","navCurrent","_a","useIsomorphicLayoutEffect","url","current","previous","changedItem","shell","TooltipProvider","AppFrame","Header","HeaderStart","HeaderSkipLink","HeaderMenuButton","HeaderCenter","HeaderEnd","HeaderSettings","Sidebar","event","NavigationDismissContext","embeddedChrome","embeddedDocked","embedded","ThemeRoot","connectRootVariants","connectCardWidthVariants","connectCardLockupVariants","ConnectWithAlfadocs","title","description","connectLabel","status","error","onConnect","footer","layout","brandPanel","Card","Alert","SignInWithAlfadocsButton"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stat-DmjGfXND.js","sources":["../../src/components/stat/stat.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useId,\n useMemo,\n useRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useCountUp } from '../../hooks/use-count-up';\n\n/* ------------------------------------------------------------------ */\n/* CVA — stat root */\n/* ------------------------------------------------------------------ */\n\n// `h-full` lets Stats grow to fill a flex / grid parent's cell, so a\n// row paired with taller cards (BenefitCard, Card, etc.) reads as a\n// matching set instead of mismatched heights. In a non-stretching\n// parent (block flow, inline) it's a no-op — block-size defers to\n// content as before. The flex-col inside still pins label/icon row\n// at the top and the number below, so growing the card adds the\n// extra space below the number instead of inserting it between\n// label and value.\nconst statVariants = cva('ds:flex ds:flex-col ds:h-full', {\n variants: {\n variant: {\n default: 'ds:gap-[var(--spacing-xs)]',\n outlined: [\n 'ds:gap-[var(--spacing-xs)]',\n 'ds:border ds:border-[color:var(--border)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n ].join(' '),\n // White card surface with the shared card shadow + border —\n // matches `Card variant=\"elevated\"` and `BenefitCard.elevated`\n // tokens (`--card`, `--card-border`, `--shadow-card`,\n // `--radius-lg`) so a grid of elevated Stats reads as a set of\n // shaded panels without nesting a Card around each one. The\n // border is essential in dark mode: shadow alone on a dark\n // surface loses contrast and the card boundary disappears.\n // `--surface-border-width` bumps it to 2px in the accessible themes,\n // matching Card / BenefitCard's 0.31.5 accessibility uplift.\n elevated: [\n 'ds:gap-[var(--spacing-xs)]',\n 'ds:bg-[var(--card)]',\n 'ds:text-[var(--card-foreground)]',\n 'ds:[:where(&)]:border-[length:var(--surface-border-width,var(--border-width-sm))] ds:border-[color:var(--card-border)]',\n 'ds:shadow-[var(--shadow-card)]',\n 'ds:rounded-[var(--radius-lg)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n // Forced-colors: UA strips shadow, so render a border as the\n // separation cue — mirrors Card's forced-colors behaviour.\n 'ds:forced-colors:border ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n compact: 'ds:gap-[var(--spacing-none)]',\n },\n size: {\n sm: '',\n md: '',\n lg: '',\n },\n align: {\n start: 'ds:items-start ds:text-start',\n center: 'ds:items-center ds:text-center',\n end: 'ds:items-end ds:text-end',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n align: 'start',\n },\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA — value element */\n/* ------------------------------------------------------------------ */\n\nconst valueVariants = cva('type-metric', {\n variants: {\n size: {\n sm: 'ds:[--type-metric-size:var(--font-size-xl)]',\n md: 'ds:[--type-metric-size:var(--font-size-3xl)]',\n lg: 'ds:[--type-metric-size:var(--font-size-5xl)]',\n },\n variant: {\n default: '',\n outlined: '',\n elevated: '',\n compact: '',\n },\n // Colour of the headline metric value. Defaults to `--foreground`\n // (the existing render). `primary` / `accent` are the brand intents\n // — use for hero / marketing stats where the number IS the visual\n // marker. `success` / `destructive` / `info` / `warning` map to the\n // semantic tokens for KPI tiles that want to signal status via the\n // value colour itself (e.g. revenue green, debt red). The trend\n // chevron and the label colour are independent of this prop.\n intent: {\n foreground: 'ds:text-[var(--foreground)]',\n primary: 'ds:text-[var(--primary)]',\n accent: 'ds:text-[var(--accent)]',\n success: 'ds:text-[var(--success)]',\n destructive: 'ds:text-[var(--destructive)]',\n info: 'ds:text-[var(--info)]',\n warning: 'ds:text-[var(--warning)]',\n },\n },\n compoundVariants: [\n {\n variant: 'compact',\n size: 'sm',\n className: 'ds:[--type-metric-size:var(--font-size-lg)]',\n },\n {\n variant: 'compact',\n size: 'md',\n className: 'ds:[--type-metric-size:var(--font-size-xl)]',\n },\n {\n variant: 'compact',\n size: 'lg',\n className: 'ds:[--type-metric-size:var(--font-size-2xl)]',\n },\n ],\n defaultVariants: {\n size: 'md',\n variant: 'default',\n intent: 'foreground',\n },\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA — trend element */\n/* ------------------------------------------------------------------ */\n\nconst trendVariants = cva(\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-label',\n {\n variants: {\n // Whether the change is good news, not which way it went: with\n // `trendPolarity=\"lower-is-better\"` a fall is `better`.\n tone: {\n better: 'ds:text-[var(--success)]',\n worse: 'ds:text-[var(--destructive)]',\n neutral: 'ds:text-[var(--muted-foreground)]',\n },\n },\n defaultVariants: {\n tone: 'neutral',\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* StatTrend (internal — not exported) */\n/* ------------------------------------------------------------------ */\n\n/** Which way is good news for a metric's trend. */\nexport type StatTrendPolarity = 'higher-is-better' | 'lower-is-better';\n\ninterface StatTrendProps {\n trend: 'up' | 'down' | 'flat';\n delta: number | string;\n deltaFormat?: 'decimal' | 'percent';\n locale?: string;\n polarity?: StatTrendPolarity;\n}\n\nconst ARROW = { up: '↑', down: '↓', flat: '→' } as const;\nconst TREND_KEY = {\n up: 'stat.trend.up',\n down: 'stat.trend.down',\n flat: 'stat.trend.flat',\n} as const;\n\nfunction StatTrend({\n trend,\n delta,\n deltaFormat = 'decimal',\n locale,\n polarity = 'higher-is-better',\n}: StatTrendProps) {\n const { t, i18n } = useTranslation('ui');\n\n const formattedDelta =\n typeof delta === 'string'\n ? delta\n : new Intl.NumberFormat(locale ?? i18n.language, {\n style: deltaFormat === 'percent' ? 'percent' : 'decimal',\n }).format(deltaFormat === 'percent' ? delta / 100 : delta);\n\n // The arrow follows the number; the colour and the spoken \"better\" or\n // \"worse\" follow the polarity, so the meaning never rests on colour.\n const tone =\n trend === 'flat'\n ? 'neutral'\n : (trend === 'up') === (polarity === 'higher-is-better')\n ? 'better'\n : 'worse';\n\n return (\n <span className={trendVariants({ tone })} data-trend-tone={tone}>\n <span aria-hidden=\"true\">{ARROW[trend]}</span>\n <span className=\"ds:sr-only\">{t(TREND_KEY[trend])}</span>\n {formattedDelta}\n {tone === 'neutral' ? null : (\n <span className=\"ds:sr-only\">\n {' '}\n {t(tone === 'better' ? 'stat.trend.better' : 'stat.trend.worse')}\n </span>\n )}\n </span>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Parse a string value into a numeric target for the count-up */\n/* ------------------------------------------------------------------ */\n\ntype ParsedValue = {\n /** Numeric target for the count-up. */\n target: number;\n /** Leading sign captured from the input string (e.g. \"+\" / \"-\"). */\n sign: '' | '+' | '-';\n /** Trailing shorthand suffix (e.g. \"K\" / \"M\" / \"B\") to re-append. */\n suffix: string;\n};\n\n/**\n * Strip locale-aware separators, a leading sign, and the K/M/B\n * shorthand suffix from a pre-formatted string so the count-up has a\n * pure numeric target to animate towards. Returns `null` for any input\n * that can't be parsed — the caller short-circuits to static rendering\n * in that case.\n */\nfunction parseStatValue(raw: string, locale: string): ParsedValue | null {\n const trimmed = raw.trim();\n if (trimmed === '') return null;\n\n // Capture leading sign so we can re-attach it every frame. Stat's\n // marketing usage (\"+500.000\", \"-12\") often relies on it.\n let sign: '' | '+' | '-' = '';\n let body = trimmed;\n if (body.startsWith('+')) {\n sign = '+';\n body = body.slice(1).trimStart();\n } else if (body.startsWith('-') || body.startsWith('−')) {\n // Hyphen-minus or the typographic minus sign — both treated as -.\n sign = '-';\n body = body.slice(1).trimStart();\n }\n\n // Trailing K / M / B shorthand (case-insensitive). Re-append verbatim\n // so \"+1.5K\" renders as \"+1.5K\" at every frame.\n let suffix = '';\n const suffixMatch = body.match(/[KMB]$/i);\n if (suffixMatch) {\n suffix = suffixMatch[0];\n body = body.slice(0, -1).trimEnd();\n }\n\n // Discover the locale's group + decimal glyphs from a probe value.\n // formatToParts is the canonical way; we fall back to `.` decimal /\n // `,` group if Intl can't tell us (no-locale envs).\n let group = '';\n let decimal = '.';\n try {\n const probe = new Intl.NumberFormat(locale).formatToParts(12345.6);\n for (const part of probe) {\n if (part.type === 'group') group = part.value;\n else if (part.type === 'decimal') decimal = part.value;\n }\n } catch {\n /* swallow — defaults already set */\n }\n\n // Heuristic for input strings that look like JS-native decimals\n // (e.g. `\"1500.25\"`) regardless of the requested locale: if the body\n // is a clean US-style decimal AND the fraction after the `.` is NOT\n // a three-digit thousands group in a locale that uses `.` as the\n // group separator, treat it as a direct numeric literal. This covers\n // the common case where a caller types `value=\"1500.25\"` and expects\n // the count-up to land on 1500.25 even though the output locale is\n // it-IT (which uses `.` for thousands).\n const usStyleMatch = body.match(/^(\\d+)\\.(\\d+)$/);\n if (usStyleMatch) {\n const fractionLen = usStyleMatch[2].length;\n if (!(fractionLen === 3 && group === '.')) {\n const direct = Number.parseFloat(body);\n if (Number.isFinite(direct)) {\n return { target: direct, sign, suffix };\n }\n }\n }\n\n // Strip every group separator we discovered, then normalise the\n // decimal separator to `.` so JS can parseFloat the result.\n // Note: when the locale's group separator is empty (e.g. some\n // numbering systems) the replace is a no-op.\n let normalised = body;\n if (group !== '') {\n normalised = normalised.split(group).join('');\n }\n if (decimal !== '.') {\n normalised = normalised.split(decimal).join('.');\n }\n\n // Defence-in-depth: strip whitespace plus NBSP (U+00A0) and NARROW\n // NO-BREAK SPACE (U+202F) that some locales (fr-FR, it-IT) use as\n // thousand separators. Hex escapes keep this source ASCII-clean.\n normalised = normalised.replace(/[\\s\\u00A0\\u202F]/g, '');\n\n const numeric = Number.parseFloat(normalised);\n if (!Number.isFinite(numeric)) return null;\n\n return { target: numeric, sign, suffix };\n}\n\n/* ------------------------------------------------------------------ */\n/* StatProps */\n/* ------------------------------------------------------------------ */\n\nexport interface StatProps\n extends HTMLAttributes<HTMLDivElement>, VariantProps<typeof statVariants> {\n /** Metric label rendered above the value. */\n label: string;\n /** Numeric or pre-formatted string value. */\n value: number | string;\n /** Number formatting style. Omit to use default decimal formatting. */\n format?: 'decimal' | 'currency' | 'percent';\n /** ISO 4217 currency code — required when format=\"currency\". */\n currency?: string;\n /** BCP 47 locale override. Defaults to the active i18n language. */\n locale?: string;\n /** Trend direction. Requires `delta` to render the trend row. */\n trend?: 'up' | 'down' | 'flat';\n /** Trend delta magnitude, e.g. 12 for \"↑ 12%\". */\n delta?: number | string;\n /**\n * Which way is good news. `higher-is-better` (default) shows a rise in\n * the success colour; `lower-is-better` (a no-show or cancellation rate,\n * a waiting time) shows a fall in it instead. The arrow always points the\n * way the number moved, and screen readers hear \"better\" or \"worse\".\n */\n trendPolarity?: StatTrendPolarity;\n /** Number formatting style for the delta. Default \"decimal\". */\n deltaFormat?: 'decimal' | 'percent';\n /** Optional leading icon rendered at the start of the label row. */\n icon?: ReactNode;\n /**\n * Colour of the headline value. Defaults to `foreground`. Brand\n * intents (`primary`, `accent`) are for hero / marketing stats where\n * the number is the visual marker. Semantic intents\n * (`success`, `destructive`, `info`, `warning`) signal status via\n * the value colour itself — e.g. revenue green, debt red on KPI\n * tiles. Trend chevron and label colour are independent.\n */\n intent?:\n | 'foreground'\n | 'primary'\n | 'accent'\n | 'success'\n | 'destructive'\n | 'info'\n | 'warning';\n /** Renders animated skeleton placeholders instead of content. */\n loading?: boolean;\n /**\n * Animate the numeric value from 0 (or from the captured leading\n * sign) to the final value when the Stat first scrolls into view.\n * Default `false`. Marketing surfaces opt in; dashboards leave it\n * off so live metrics render immediately.\n */\n animate?: boolean;\n /**\n * When `true`, the count-up re-plays every time the Stat scrolls\n * out of view and back in. Default `false` — animate once per\n * element per session, matching the booking-website hero pattern.\n * Ignored under `prefers-reduced-motion: reduce`.\n */\n animateOnEveryView?: boolean;\n /** Animation duration in milliseconds. Default 1600. */\n animateDurationMs?: number;\n /**\n * BCP 47 locale used for the per-frame count-up formatting. Falls\n * back to `locale`, then to the active i18n language.\n */\n animateLocale?: string;\n /**\n * Override the locale's thousand / decimal glyphs for the count-up.\n * Wins over locale defaults. Pass partial overrides — `decimal`\n * alone is valid; the unspecified separator stays at the locale\n * default.\n */\n animateSeparators?: {\n thousand?: string;\n decimal?: string;\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Stat */\n/* ------------------------------------------------------------------ */\n\nexport const Stat = forwardRef<HTMLDivElement, StatProps>(\n (\n {\n label,\n value,\n format,\n currency,\n locale,\n trend,\n trendPolarity,\n delta,\n deltaFormat = 'decimal',\n icon,\n loading = false,\n animate = false,\n animateOnEveryView = false,\n animateDurationMs = 1600,\n animateLocale,\n animateSeparators,\n variant = 'default',\n size = 'md',\n align = 'start',\n intent = 'foreground',\n className,\n ...props\n },\n ref,\n ) => {\n const { i18n } = useTranslation('ui');\n const labelId = useId();\n const lang = locale ?? i18n.language;\n\n /* -------------------------------------------------- */\n /* Static formatting — the value as it would appear */\n /* in the non-animated (or post-animation) state. */\n /* -------------------------------------------------- */\n\n const formatValue = useCallback((): string => {\n if (typeof value === 'string') return value;\n\n switch (format) {\n case 'currency':\n return new Intl.NumberFormat(lang, {\n style: 'currency',\n currency: currency ?? 'USD',\n }).format(value);\n case 'percent':\n return new Intl.NumberFormat(lang, { style: 'percent' }).format(\n value,\n );\n case 'decimal':\n return new Intl.NumberFormat(lang, { style: 'decimal' }).format(\n value,\n );\n default:\n return new Intl.NumberFormat(lang).format(value);\n }\n }, [value, format, lang, currency]);\n\n const staticValue = formatValue();\n\n /* -------------------------------------------------- */\n /* Parse the value into a numeric target for the */\n /* count-up. Numeric values use `value` directly; */\n /* string values are stripped of sign / shorthand / */\n /* locale separators and re-decorated each frame. */\n /* -------------------------------------------------- */\n\n const animationLocale = animateLocale ?? lang;\n const hasWarnedRef = useRef<boolean>(false);\n\n const parsed = useMemo<ParsedValue | null>(() => {\n if (!animate) return null;\n if (typeof value === 'number') {\n // Numeric: target is the number itself; no sign / suffix to\n // re-attach.\n return Number.isFinite(value)\n ? { target: value, sign: '', suffix: '' }\n : null;\n }\n return parseStatValue(value, animationLocale);\n }, [animate, value, animationLocale]);\n\n // Dev-mode warning when an animate-flagged Stat has an unparseable\n // string value. Render static, no throw — one warn per component.\n if (\n animate &&\n typeof value === 'string' &&\n parsed === null &&\n import.meta.env.DEV &&\n !hasWarnedRef.current\n ) {\n hasWarnedRef.current = true;\n console.warn(\n `Stat: value=\"${value}\" couldn't be parsed for the count-up animation. Rendering static.`,\n );\n }\n\n const shouldAnimate = animate && parsed !== null;\n\n /* -------------------------------------------------- */\n /* Wire the hook unconditionally — rules-of-hooks. */\n /* When `shouldAnimate` is false the hook still runs */\n /* but `to === from` so it's a no-op visually. */\n /* -------------------------------------------------- */\n\n const target = parsed?.target ?? 0;\n const sign = parsed?.sign ?? '';\n const suffix = parsed?.suffix ?? '';\n\n // Wrap the count-up formatter so the captured sign + suffix are\n // re-applied every frame. The hook hands us the locale-formatted\n // magnitude; we own the decoration around it.\n const formatter = useCallback(\n (n: number) => {\n // Use the absolute value for the magnitude so the captured\n // sign is the sole source of the rendered sign. Negative\n // numbers passed in (e.g. `to: -12`) come through unsigned;\n // we re-apply via `sign`. Always force `useGrouping: true` so\n // ICU's locale-default `min2` doesn't suppress the thousand\n // glyph on 4-digit values like 1.000 (it-IT). The user wrote\n // a stat value — they want it grouped.\n const magnitudeNF = (() => {\n try {\n return new Intl.NumberFormat(animationLocale, {\n useGrouping: true,\n });\n } catch {\n return null;\n }\n })();\n\n let magnitudeStr: string;\n if (magnitudeNF) {\n if (animateSeparators) {\n // Hand-build the grouped magnitude so we don't depend on\n // ICU's locale-by-locale grouping defaults (which differ\n // between engines and can drop the group at 4-digit\n // thresholds even with `useGrouping: true`). Locale only\n // influences sign handling, which we apply separately.\n const abs = Math.abs(n);\n const intPart = Math.trunc(abs);\n const fracPart = abs - intPart;\n const groupGlyph = animateSeparators.thousand ?? '';\n const intStr = String(intPart).replace(\n /\\B(?=(\\d{3})+(?!\\d))/g,\n groupGlyph,\n );\n if (fracPart === 0) {\n magnitudeStr = intStr;\n } else {\n const fracStr = fracPart.toFixed(6).replace(/0+$/, '').slice(2);\n const decimalGlyph = animateSeparators.decimal ?? '.';\n magnitudeStr = fracStr ? intStr + decimalGlyph + fracStr : intStr;\n }\n } else {\n magnitudeStr = magnitudeNF.format(Math.abs(n));\n }\n } else {\n magnitudeStr = String(Math.abs(n));\n }\n\n // Re-derive the sign every frame: the captured sign wins, but\n // a negative `to` with no leading sign in the source still\n // renders with a leading \"-\" so the final formatted output\n // matches locale conventions.\n let resolvedSign: string = sign;\n if (sign === '' && n < 0) resolvedSign = '-';\n\n return `${resolvedSign}${magnitudeStr}${suffix}`;\n },\n [animationLocale, animateSeparators, sign, suffix],\n );\n\n const countUp = useCountUp({\n to: target,\n from: 0,\n durationMs: animateDurationMs,\n startOnVisible: true,\n retriggerOnReEntry: animateOnEveryView,\n // `formatter` is the only path we use — it owns both the locale\n // formatting and the sign/suffix re-application.\n formatter,\n });\n\n /* -------------------------------------------------- */\n /* Loading state */\n /* -------------------------------------------------- */\n\n if (loading) {\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-busy=\"true\"\n aria-label={label}\n data-component=\"stat\"\n className={statVariants({ variant, size, align, className })}\n {...props}\n >\n <div className=\"ds:h-[var(--skeleton-label-h)] ds:w-[var(--skeleton-label-w)] ds:animate-pulse ds:rounded-[var(--radius-sm)] ds:bg-[var(--muted)]\" />\n <div className=\"ds:h-[var(--skeleton-value-h)] ds:w-[var(--skeleton-value-w)] ds:animate-pulse ds:rounded-[var(--radius-sm)] ds:bg-[var(--muted)]\" />\n </div>\n );\n }\n\n /* -------------------------------------------------- */\n /* Render */\n /* -------------------------------------------------- */\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-labelledby={labelId}\n data-component=\"stat\"\n className={statVariants({ variant, size, align, className })}\n {...props}\n >\n <span className=\"ds:inline-flex ds:items-center\">\n {icon && (\n <span\n aria-hidden=\"true\"\n className={[\n 'ds:me-[var(--spacing-xs)] ds:inline-flex ds:shrink-0',\n // Accent tint on the leading icon. The icon is decorative\n // (aria-hidden), so magenta-500's 3.2:1 contrast on white\n // is acceptable here — the Stat label + value still\n // carry the accessible name at `--foreground`.\n 'ds:text-[color:var(--accent)]',\n 'ds:forced-colors:text-[CanvasText]',\n ].join(' ')}\n >\n {icon}\n </span>\n )}\n <span\n id={labelId}\n className=\"type-label ds:text-[var(--muted-foreground)]\"\n >\n {label}\n </span>\n </span>\n {shouldAnimate ? (\n // The animated number is wrapped in an `aria-live=\"off\"` span\n // so screen readers don't announce every interpolated frame.\n // The `role=\"group\"` ancestor (with `aria-labelledby` pointing\n // at the label) carries the final accessible reading — the\n // animated frames are decorative only.\n <span\n ref={countUp.ref}\n aria-live=\"off\"\n className={valueVariants({ size, variant, intent })}\n >\n {countUp.value}\n </span>\n ) : (\n <span className={valueVariants({ size, variant, intent })}>\n {staticValue}\n </span>\n )}\n {trend != null && delta != null && (\n <StatTrend\n trend={trend}\n delta={delta}\n deltaFormat={deltaFormat}\n locale={locale}\n polarity={trendPolarity}\n />\n )}\n </div>\n );\n },\n);\n\nStat.displayName = 'Stat';\n"],"names":["statVariants","cva","valueVariants","trendVariants","ARROW","TREND_KEY","StatTrend","trend","delta","deltaFormat","locale","polarity","t","i18n","useTranslation","formattedDelta","tone","jsxs","jsx","parseStatValue","raw","trimmed","sign","body","suffix","suffixMatch","group","decimal","probe","part","usStyleMatch","direct","normalised","numeric","Stat","forwardRef","label","value","format","currency","trendPolarity","icon","loading","animate","animateOnEveryView","animateDurationMs","animateLocale","animateSeparators","variant","size","align","intent","className","props","ref","labelId","useId","lang","staticValue","useCallback","animationLocale","useRef","parsed","useMemo","shouldAnimate","target","formatter","n","magnitudeNF","magnitudeStr","abs","intPart","fracPart","groupGlyph","intStr","fracStr","decimalGlyph","resolvedSign","countUp","useCountUp"],"mappings":"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"}
|