@alfadocs/ui-kit-debug 1.103.1 → 1.105.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/{ai-credits-exhausted-notice-CwZnSACy.js → ai-credits-exhausted-notice-Lws3113e.js} +2 -2
- package/dist/_chunks/{ai-credits-exhausted-notice-CwZnSACy.js.map → ai-credits-exhausted-notice-Lws3113e.js.map} +1 -1
- package/dist/_chunks/{ai-permission-notice-VNh3W57L.js → ai-permission-notice-BkgcGmu8.js} +2 -2
- package/dist/_chunks/{ai-permission-notice-VNh3W57L.js.map → ai-permission-notice-BkgcGmu8.js.map} +1 -1
- package/dist/_chunks/{alert-9kEwDza3.js → alert-C4WKViaS.js} +59 -50
- package/dist/_chunks/alert-C4WKViaS.js.map +1 -0
- package/dist/_chunks/{anamnesis-summary-rows-B9HqOGd7.js → anamnesis-summary-rows-QhbDdY7b.js} +4 -4
- package/dist/_chunks/{anamnesis-summary-rows-B9HqOGd7.js.map → anamnesis-summary-rows-QhbDdY7b.js.map} +1 -1
- package/dist/_chunks/{audio-recorder-BOm2FgEu.js → audio-recorder-BlDozxdU.js} +2 -2
- package/dist/_chunks/{audio-recorder-BOm2FgEu.js.map → audio-recorder-BlDozxdU.js.map} +1 -1
- package/dist/_chunks/{auth-form-parts-B3GWChvG.js → auth-form-parts-DVHfqnp6.js} +2 -2
- package/dist/_chunks/{auth-form-parts-B3GWChvG.js.map → auth-form-parts-DVHfqnp6.js.map} +1 -1
- package/dist/_chunks/{balance-badge-cell-DGFm2jfP.js → balance-badge-cell-wJ6cTD_h.js} +3 -3
- package/dist/_chunks/{balance-badge-cell-DGFm2jfP.js.map → balance-badge-cell-wJ6cTD_h.js.map} +1 -1
- package/dist/_chunks/{calendar-appointment-editor-dialog-DqyATSh3.js → calendar-appointment-editor-dialog-D8DblVjW.js} +8 -8
- package/dist/_chunks/{calendar-appointment-editor-dialog-DqyATSh3.js.map → calendar-appointment-editor-dialog-D8DblVjW.js.map} +1 -1
- package/dist/_chunks/{care-plan-card-YWKV8Kjq.js → care-plan-card-DMjlYlFc.js} +2 -2
- package/dist/_chunks/{care-plan-card-YWKV8Kjq.js.map → care-plan-card-DMjlYlFc.js.map} +1 -1
- package/dist/_chunks/{care-plan-entry-card-CApivtMW.js → care-plan-entry-card-3hguBW45.js} +2 -2
- package/dist/_chunks/{care-plan-entry-card-CApivtMW.js.map → care-plan-entry-card-3hguBW45.js.map} +1 -1
- package/dist/_chunks/{contact-profile-card-uExd3pKC.js → contact-profile-card-CAL66GaH.js} +120 -111
- package/dist/_chunks/contact-profile-card-CAL66GaH.js.map +1 -0
- package/dist/_chunks/{data-table-C5uN4ato.js → data-table-zXBxFYpJ.js} +761 -715
- package/dist/_chunks/data-table-zXBxFYpJ.js.map +1 -0
- package/dist/_chunks/{date-range-picker-B_j4VQlV.js → date-range-picker-DCADIR8o.js} +2 -2
- package/dist/_chunks/{date-range-picker-B_j4VQlV.js.map → date-range-picker-DCADIR8o.js.map} +1 -1
- package/dist/_chunks/{date-time-picker-cwsWiB4q.js → date-time-picker-CT2bC7-A.js} +2 -2
- package/dist/_chunks/{date-time-picker-cwsWiB4q.js.map → date-time-picker-CT2bC7-A.js.map} +1 -1
- package/dist/_chunks/{document-preview-U8H6tnDJ.js → document-preview-BalyZqnn.js} +2 -2
- package/dist/_chunks/{document-preview-U8H6tnDJ.js.map → document-preview-BalyZqnn.js.map} +1 -1
- package/dist/_chunks/{document-scanner-Bf3VUp00.js → document-scanner-5p-Uu8dy.js} +2 -2
- package/dist/_chunks/{document-scanner-Bf3VUp00.js.map → document-scanner-5p-Uu8dy.js.map} +1 -1
- package/dist/_chunks/{entity-summary-BKfR4Vws.js → entity-summary-BbqqYqF1.js} +2 -2
- package/dist/_chunks/{entity-summary-BKfR4Vws.js.map → entity-summary-BbqqYqF1.js.map} +1 -1
- package/dist/_chunks/{error-summary-mGxIyDAY.js → error-summary-DxNhwf_G.js} +2 -2
- package/dist/_chunks/{error-summary-mGxIyDAY.js.map → error-summary-DxNhwf_G.js.map} +1 -1
- package/dist/_chunks/{face-scheme-DdVLQ5dP.js → face-scheme-e2M2HJGz.js} +2 -2
- package/dist/_chunks/{face-scheme-DdVLQ5dP.js.map → face-scheme-e2M2HJGz.js.map} +1 -1
- package/dist/_chunks/{file-manager-CnGBVX_q.js → file-manager-BDKe59sg.js} +2 -2
- package/dist/_chunks/{file-manager-CnGBVX_q.js.map → file-manager-BDKe59sg.js.map} +1 -1
- package/dist/_chunks/{forgot-password-form-CeTb5p-x.js → forgot-password-form-vfCO2-Tt.js} +4 -4
- package/dist/_chunks/{forgot-password-form-CeTb5p-x.js.map → forgot-password-form-vfCO2-Tt.js.map} +1 -1
- package/dist/_chunks/{freemium-paywall-CM0zQSDE.js → freemium-paywall-BDeq9QWR.js} +2 -2
- package/dist/_chunks/{freemium-paywall-CM0zQSDE.js.map → freemium-paywall-BDeq9QWR.js.map} +1 -1
- package/dist/_chunks/{gestational-age-calculator-CXcDKQqC.js → gestational-age-calculator-AnaH00nk.js} +2 -2
- package/dist/_chunks/{gestational-age-calculator-CXcDKQqC.js.map → gestational-age-calculator-AnaH00nk.js.map} +1 -1
- package/dist/_chunks/{hcg-doubling-BJFR3onB.js → hcg-doubling-DdyUt4gz.js} +2 -2
- package/dist/_chunks/{hcg-doubling-BJFR3onB.js.map → hcg-doubling-DdyUt4gz.js.map} +1 -1
- package/dist/_chunks/{heatmap-Cz0Krieg.js → heatmap-D4qqpCEj.js} +1550 -1547
- package/dist/_chunks/{heatmap-Cz0Krieg.js.map → heatmap-D4qqpCEj.js.map} +1 -1
- package/dist/_chunks/{help-me-write-templates-ra5a__Yy.js → help-me-write-templates-YmceSxf5.js} +3 -3
- package/dist/_chunks/{help-me-write-templates-ra5a__Yy.js.map → help-me-write-templates-YmceSxf5.js.map} +1 -1
- package/dist/_chunks/info-tip-C-MPkShR.js +266 -0
- package/dist/_chunks/info-tip-C-MPkShR.js.map +1 -0
- package/dist/_chunks/{kit-extensions-C4o_tFN4.js → kit-extensions-BOnTM4Yf.js} +3 -3
- package/dist/_chunks/{kit-extensions-C4o_tFN4.js.map → kit-extensions-BOnTM4Yf.js.map} +1 -1
- package/dist/_chunks/{link-cell-renderer-BRek9kz7.js → link-cell-renderer-C8vfCOEp.js} +2 -2
- package/dist/_chunks/{link-cell-renderer-BRek9kz7.js.map → link-cell-renderer-C8vfCOEp.js.map} +1 -1
- package/dist/_chunks/{login-dev-card-D5BV5j1i.js → login-dev-card-Cz1Clugq.js} +3 -3
- package/dist/_chunks/{login-dev-card-D5BV5j1i.js.map → login-dev-card-Cz1Clugq.js.map} +1 -1
- package/dist/_chunks/{marketplace-app-shell-BsctSegT.js → marketplace-app-shell-C-4QF6mp.js} +2 -2
- package/dist/_chunks/{marketplace-app-shell-BsctSegT.js.map → marketplace-app-shell-C-4QF6mp.js.map} +1 -1
- package/dist/_chunks/{notes-panel-BjTpaz8d.js → notes-panel-SlzUL8in.js} +4 -4
- package/dist/_chunks/{notes-panel-BjTpaz8d.js.map → notes-panel-SlzUL8in.js.map} +1 -1
- package/dist/_chunks/{notice-group-DkYzKyAZ.js → notice-group-B-trhof8.js} +3 -3
- package/dist/_chunks/{notice-group-DkYzKyAZ.js.map → notice-group-B-trhof8.js.map} +1 -1
- package/dist/_chunks/{patient-details-BXM3dRKb.js → patient-details-wMgTFtpp.js} +2 -2
- package/dist/_chunks/{patient-details-BXM3dRKb.js.map → patient-details-wMgTFtpp.js.map} +1 -1
- package/dist/_chunks/{patient-field-row--dCDO5oB.js → patient-field-row-Bhm2Ig1P.js} +2 -2
- package/dist/_chunks/{patient-field-row--dCDO5oB.js.map → patient-field-row-Bhm2Ig1P.js.map} +1 -1
- package/dist/_chunks/{patient-summary-card-DB7fv-Tr.js → patient-summary-card-DMdPPG3n.js} +2 -2
- package/dist/_chunks/{patient-summary-card-DB7fv-Tr.js.map → patient-summary-card-DMdPPG3n.js.map} +1 -1
- package/dist/_chunks/{payment-automation-upsell-BPF0c-5D.js → payment-automation-upsell-u5EuFyCY.js} +2 -2
- package/dist/_chunks/{payment-automation-upsell-BPF0c-5D.js.map → payment-automation-upsell-u5EuFyCY.js.map} +1 -1
- package/dist/_chunks/{payment-form-PBuh8PIa.js → payment-form-C-s1x-bU.js} +2 -2
- package/dist/_chunks/{payment-form-PBuh8PIa.js.map → payment-form-C-s1x-bU.js.map} +1 -1
- package/dist/_chunks/{pdf-viewer-DlceXkfW.js → pdf-viewer-BnBKdx0y.js} +2 -2
- package/dist/_chunks/{pdf-viewer-DlceXkfW.js.map → pdf-viewer-BnBKdx0y.js.map} +1 -1
- package/dist/_chunks/{practice-profile-hero-BAvGdQmt.js → practice-profile-hero-Bb4YyxHA.js} +31 -29
- package/dist/_chunks/practice-profile-hero-Bb4YyxHA.js.map +1 -0
- package/dist/_chunks/{practice-results-ChBP9x2r.js → practice-results-BXz01sti.js} +485 -445
- package/dist/_chunks/practice-results-BXz01sti.js.map +1 -0
- package/dist/_chunks/{pregnancy-dating-D0Kf9s7s.js → pregnancy-dating-D6dLkMpl.js} +2 -2
- package/dist/_chunks/{pregnancy-dating-D0Kf9s7s.js.map → pregnancy-dating-D6dLkMpl.js.map} +1 -1
- package/dist/_chunks/{progress-notice-DiHWZ8Ms.js → progress-notice-F7ao70ZP.js} +2 -2
- package/dist/_chunks/{progress-notice-DiHWZ8Ms.js.map → progress-notice-F7ao70ZP.js.map} +1 -1
- package/dist/_chunks/{radiograph-panel.agent-BQ95uFCd.js → radiograph-panel.agent-0ngF2sGS.js} +2 -2
- package/dist/_chunks/{radiograph-panel.agent-BQ95uFCd.js.map → radiograph-panel.agent-0ngF2sGS.js.map} +1 -1
- package/dist/_chunks/{registration-form-JzzTomhd.js → registration-form-CEJRUS9G.js} +3 -3
- package/dist/_chunks/{registration-form-JzzTomhd.js.map → registration-form-CEJRUS9G.js.map} +1 -1
- package/dist/_chunks/{reserved.agent-BxD0gnbt.js → reserved.agent-C-C9cvO5.js} +2 -2
- package/dist/_chunks/{reserved.agent-BxD0gnbt.js.map → reserved.agent-C-C9cvO5.js.map} +1 -1
- package/dist/_chunks/{reset-password-form-DDdGEoIL.js → reset-password-form-B0acanDD.js} +4 -4
- package/dist/_chunks/{reset-password-form-DDdGEoIL.js.map → reset-password-form-B0acanDD.js.map} +1 -1
- package/dist/_chunks/{rich-text-editor-F04przIt.js → rich-text-editor-C3nANKZt.js} +2 -2
- package/dist/_chunks/{rich-text-editor-F04przIt.js.map → rich-text-editor-C3nANKZt.js.map} +1 -1
- package/dist/_chunks/{send-registration-link-form-DHCQpA4C.js → send-registration-link-form-Nn0jf65G.js} +3 -3
- package/dist/_chunks/{send-registration-link-form-DHCQpA4C.js.map → send-registration-link-form-Nn0jf65G.js.map} +1 -1
- package/dist/_chunks/{sign-document-B5qZhthO.js → sign-document-CQZVzfpk.js} +2 -2
- package/dist/_chunks/{sign-document-B5qZhthO.js.map → sign-document-CQZVzfpk.js.map} +1 -1
- package/dist/_chunks/{signature-request-DB6kePIm.js → signature-request-DtLph5Z4.js} +3 -3
- package/dist/_chunks/{signature-request-DB6kePIm.js.map → signature-request-DtLph5Z4.js.map} +1 -1
- package/dist/_chunks/stat-group-DSNnzkbW.js +107 -0
- package/dist/_chunks/stat-group-DSNnzkbW.js.map +1 -0
- package/dist/_chunks/{switch-D--x7n6h.js → switch-DO6uC4HJ.js} +40 -36
- package/dist/_chunks/switch-DO6uC4HJ.js.map +1 -0
- package/dist/_chunks/{task-editor-BiPGFXtB.js → task-editor-CmXcj6cC.js} +4 -4
- package/dist/_chunks/{task-editor-BiPGFXtB.js.map → task-editor-CmXcj6cC.js.map} +1 -1
- package/dist/_chunks/{tasks-panel-iVeuu9a8.js → tasks-panel-CFo5uIHx.js} +3 -3
- package/dist/_chunks/{tasks-panel-iVeuu9a8.js.map → tasks-panel-CFo5uIHx.js.map} +1 -1
- package/dist/_chunks/{theme-toggle-jZRbAidE.js → theme-toggle-Czq3K9jB.js} +2 -2
- package/dist/_chunks/{theme-toggle-jZRbAidE.js.map → theme-toggle-Czq3K9jB.js.map} +1 -1
- package/dist/_chunks/{time-picker-DSt-ns5F.js → time-picker-DDr5vhwQ.js} +344 -332
- package/dist/_chunks/time-picker-DDr5vhwQ.js.map +1 -0
- package/dist/_chunks/{tooth-scheme-Bd7xECuj.js → tooth-scheme-C-ALCHaV.js} +2 -2
- package/dist/_chunks/{tooth-scheme-Bd7xECuj.js.map → tooth-scheme-C-ALCHaV.js.map} +1 -1
- package/dist/_chunks/{use-appointment-details-read-CmqGGYCy.js → use-appointment-details-read-VI26Z-pc.js} +3 -3
- package/dist/_chunks/{use-appointment-details-read-CmqGGYCy.js.map → use-appointment-details-read-VI26Z-pc.js.map} +1 -1
- package/dist/_chunks/{voice-control-panel-BGJjUwnY.js → voice-control-panel-B0TUZAiP.js} +3 -3
- package/dist/_chunks/{voice-control-panel-BGJjUwnY.js.map → voice-control-panel-B0TUZAiP.js.map} +1 -1
- package/dist/_chunks/{warning-stack-3S7e2q07.js → warning-stack-Dx7cpj10.js} +2 -2
- package/dist/_chunks/{warning-stack-3S7e2q07.js.map → warning-stack-Dx7cpj10.js.map} +1 -1
- package/dist/_chunks/week-availability-CsTiwtYj.js +318 -0
- package/dist/_chunks/week-availability-CsTiwtYj.js.map +1 -0
- package/dist/_chunks/weekly-hours-editor-BsVsgeOc.js +252 -0
- package/dist/_chunks/weekly-hours-editor-BsVsgeOc.js.map +1 -0
- package/dist/_chunks/{workflow-map-B1jf6QaB.js → workflow-map-DWk-rZse.js} +2 -2
- package/dist/_chunks/{workflow-map-B1jf6QaB.js.map → workflow-map-DWk-rZse.js.map} +1 -1
- package/dist/_chunks/{workflow-webhook-action-B_52rH7O.js → workflow-webhook-action-DILFqAVd.js} +2 -2
- package/dist/_chunks/{workflow-webhook-action-B_52rH7O.js.map → workflow-webhook-action-DILFqAVd.js.map} +1 -1
- package/dist/ag-grid.css +5 -1
- package/dist/agent-catalog.json +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/alert/alert.d.ts.map +1 -1
- package/dist/components/alert/index.js +1 -1
- package/dist/components/appointment-details-panel/index.js +1 -1
- package/dist/components/audio-recorder/index.js +1 -1
- package/dist/components/booking/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/contact-profile-card/contact-profile-card.d.ts +8 -0
- package/dist/components/contact-profile-card/contact-profile-card.d.ts.map +1 -1
- package/dist/components/contact-profile-card/index.js +1 -1
- package/dist/components/data-table/data-table.d.ts +6 -0
- package/dist/components/data-table/data-table.d.ts.map +1 -1
- package/dist/components/data-table/header-min-width.d.ts +21 -0
- package/dist/components/data-table/header-min-width.d.ts.map +1 -0
- package/dist/components/data-table/index.js +2 -2
- package/dist/components/date-range-picker/index.js +1 -1
- package/dist/components/date-time-picker/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/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/file-manager/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/heatmap/heatmap.d.ts +5 -0
- package/dist/components/heatmap/heatmap.d.ts.map +1 -1
- package/dist/components/heatmap/index.js +1 -1
- package/dist/components/index.d.ts +3 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/info-tip/index.js +1 -1
- package/dist/components/info-tip/info-tip.d.ts +10 -0
- package/dist/components/info-tip/info-tip.d.ts.map +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/notice-group/index.js +1 -1
- package/dist/components/patient-details/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-form/index.js +1 -1
- package/dist/components/pdf-viewer/index.js +1 -1
- package/dist/components/practice-profile-hero/index.js +1 -1
- package/dist/components/practice-profile-hero/practice-profile-hero.d.ts +7 -0
- package/dist/components/practice-profile-hero/practice-profile-hero.d.ts.map +1 -1
- package/dist/components/practice-results/index.js +1 -1
- package/dist/components/practice-results/practice-results.d.ts +13 -0
- package/dist/components/practice-results/practice-results.d.ts.map +1 -1
- package/dist/components/pregnancy-dating/index.js +1 -1
- package/dist/components/progress-notice/index.js +1 -1
- package/dist/components/radiograph-panel/index.js +1 -1
- package/dist/components/rich-text-editor/index.js +2 -2
- package/dist/components/sign-document/index.js +1 -1
- package/dist/components/stat-group/index.d.ts +3 -0
- package/dist/components/stat-group/index.d.ts.map +1 -0
- package/dist/components/stat-group/index.js +8 -0
- package/dist/components/stat-group/index.js.map +1 -0
- package/dist/components/stat-group/stat-group.d.ts +23 -0
- package/dist/components/stat-group/stat-group.d.ts.map +1 -0
- package/dist/components/switch/index.js +1 -1
- package/dist/components/switch/switch.d.ts +2 -0
- package/dist/components/switch/switch.d.ts.map +1 -1
- package/dist/components/task-editor/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/time-picker/index.js +1 -1
- package/dist/components/time-picker/time-picker.d.ts.map +1 -1
- package/dist/components/tooth-scheme/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/week-availability/index.d.ts +3 -0
- package/dist/components/week-availability/index.d.ts.map +1 -0
- package/dist/components/week-availability/index.js +10 -0
- package/dist/components/week-availability/index.js.map +1 -0
- package/dist/components/week-availability/week-availability.d.ts +68 -0
- package/dist/components/week-availability/week-availability.d.ts.map +1 -0
- package/dist/components/weekly-hours-editor/index.d.ts +3 -0
- package/dist/components/weekly-hours-editor/index.d.ts.map +1 -0
- package/dist/components/weekly-hours-editor/index.js +9 -0
- package/dist/components/weekly-hours-editor/index.js.map +1 -0
- package/dist/components/weekly-hours-editor/weekly-hours-editor.d.ts +42 -0
- package/dist/components/weekly-hours-editor/weekly-hours-editor.d.ts.map +1 -0
- package/dist/components/workflow/index.js +1 -1
- package/dist/core.css +1 -1
- package/dist/i18n/locales/ar.d.ts +34 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +34 -0
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +34 -0
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +34 -0
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +34 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +34 -0
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +34 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +34 -0
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +34 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +34 -0
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +34 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +34 -0
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +34 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +34 -0
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +34 -0
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +34 -0
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +34 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +34 -0
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +34 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +34 -0
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +34 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +34 -0
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +34 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +34 -0
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +34 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +34 -0
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +34 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +34 -0
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +34 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +34 -0
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +34 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +34 -0
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +34 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +34 -0
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +34 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +34 -0
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +885 -867
- package/dist/index.js.map +1 -1
- package/dist/locales/ar.json +34 -0
- package/dist/locales/de.json +34 -0
- package/dist/locales/el.json +34 -0
- package/dist/locales/en.json +34 -0
- package/dist/locales/es.json +34 -0
- package/dist/locales/fr.json +34 -0
- package/dist/locales/hi.json +34 -0
- package/dist/locales/it.json +34 -0
- package/dist/locales/ja.json +34 -0
- package/dist/locales/nl.json +34 -0
- package/dist/locales/pl.json +34 -0
- package/dist/locales/pt.json +34 -0
- package/dist/locales/ro.json +34 -0
- package/dist/locales/ru.json +34 -0
- package/dist/locales/sq.json +34 -0
- package/dist/locales/sv.json +34 -0
- package/dist/locales/tr.json +34 -0
- package/dist/locales/zh.json +34 -0
- 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 +2 -2
- package/dist/patterns/login-form/index.js +1 -1
- package/dist/patterns/marketplace-app-shell/index.js +1 -1
- package/dist/patterns/payment-automation-upsell/index.js +1 -1
- package/dist/patterns/registration-form/index.js +1 -1
- package/dist/patterns/reset-password-form/index.js +1 -1
- package/dist/patterns/send-registration-link-form/index.js +1 -1
- package/dist/patterns/signature-request/index.js +1 -1
- package/dist/patterns/workflow-webhook-action/index.js +1 -1
- package/dist/tokens.css +3 -1
- package/package.json +13 -1
- package/dist/_chunks/alert-9kEwDza3.js.map +0 -1
- package/dist/_chunks/contact-profile-card-uExd3pKC.js.map +0 -1
- package/dist/_chunks/data-table-C5uN4ato.js.map +0 -1
- package/dist/_chunks/info-tip-1Xsq9GLi.js +0 -230
- package/dist/_chunks/info-tip-1Xsq9GLi.js.map +0 -1
- package/dist/_chunks/practice-profile-hero-BAvGdQmt.js.map +0 -1
- package/dist/_chunks/practice-results-ChBP9x2r.js.map +0 -1
- package/dist/_chunks/switch-D--x7n6h.js.map +0 -1
- package/dist/_chunks/time-picker-DSt-ns5F.js.map +0 -1
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
import { jsxs as d, jsx as t } from "react/jsx-runtime";
|
|
2
|
-
import { forwardRef as E, useState as F, useRef as o, useEffect as M, useMemo as O } from "react";
|
|
3
|
-
import { c as H } from "./index-D2ZczOXr.js";
|
|
4
|
-
import { useTranslation as V } from "react-i18next";
|
|
5
|
-
import { P as l } from "./popover-CN5IsOeS.js";
|
|
6
|
-
import { L as q } from "./link-DtCfnLnF.js";
|
|
7
|
-
import { S as B } from "./scroll-area-CY5SLYNw.js";
|
|
8
|
-
import { c as G } from "./compose-refs-C0k0tdqF.js";
|
|
9
|
-
import { u as J } from "./registry-DvAUVLHh.js";
|
|
10
|
-
import { I as Q } from "./info-CGn22peZ.js";
|
|
11
|
-
const U = {
|
|
12
|
-
id: "info-tip",
|
|
13
|
-
capabilities: ["open", "close"],
|
|
14
|
-
state: {
|
|
15
|
-
isOpen: {
|
|
16
|
-
type: "boolean",
|
|
17
|
-
descriptionKey: "ui.agent.infoTip.state.isOpen",
|
|
18
|
-
description: "True when the info tip card is currently open.",
|
|
19
|
-
read: (n) => n.getIsOpen()
|
|
20
|
-
}
|
|
21
|
-
},
|
|
22
|
-
actions: {
|
|
23
|
-
open: {
|
|
24
|
-
safety: "read",
|
|
25
|
-
idempotent: !0,
|
|
26
|
-
descriptionKey: "ui.agent.infoTip.actions.open",
|
|
27
|
-
description: "Open the info tip card (including its formula and Learn more link, when set).",
|
|
28
|
-
invoke: (n) => {
|
|
29
|
-
n.open();
|
|
30
|
-
}
|
|
31
|
-
},
|
|
32
|
-
close: {
|
|
33
|
-
safety: "read",
|
|
34
|
-
idempotent: !0,
|
|
35
|
-
descriptionKey: "ui.agent.infoTip.actions.close",
|
|
36
|
-
description: "Close the info tip card.",
|
|
37
|
-
invoke: (n) => {
|
|
38
|
-
n.close();
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
|
-
domHooks: {
|
|
43
|
-
root: {
|
|
44
|
-
attr: "data-component",
|
|
45
|
-
value: "info-tip",
|
|
46
|
-
description: "Marks the InfoTip trigger button."
|
|
47
|
-
},
|
|
48
|
-
instanceId: {
|
|
49
|
-
attr: "data-component-id",
|
|
50
|
-
sourceProp: "id",
|
|
51
|
-
description: "Sourced from the id prop on InfoTip."
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}, W = H(
|
|
55
|
-
[
|
|
56
|
-
"ds:relative ds:inline-flex ds:shrink-0 ds:items-center ds:justify-center",
|
|
57
|
-
"ds:rounded-[var(--radius-full)]",
|
|
58
|
-
"ds:bg-[var(--card)]",
|
|
59
|
-
"ds:text-[var(--accent)]",
|
|
60
|
-
// Single ring: the Lucide Info glyph draws its own accent circle, so the
|
|
61
|
-
// trigger carries NO CSS border of its own (a border would read as a
|
|
62
|
-
// second, concentric ring). The white circle comes from `bg-card` showing
|
|
63
|
-
// through the glyph, lifted by the drop shadow.
|
|
64
|
-
"ds:shadow-[var(--shadow-sm)]",
|
|
65
|
-
"ds:cursor-pointer",
|
|
66
|
-
"ds:transition-[color,box-shadow] ds:motion-reduce:transition-none",
|
|
67
|
-
"ds:hover:text-[var(--accent-hover)] ds:hover:shadow-[var(--shadow-md)]",
|
|
68
|
-
"ds:data-[state=open]:text-[var(--accent-hover)] ds:data-[state=open]:shadow-[var(--shadow-md)]",
|
|
69
|
-
"ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]",
|
|
70
|
-
"ds:forced-colors:focus-visible:outline-[CanvasText]"
|
|
71
|
-
].join(" "),
|
|
72
|
-
{
|
|
73
|
-
variants: {
|
|
74
|
-
size: {
|
|
75
|
-
// Both diameters sit below `--min-target-size` (44/48px), so each
|
|
76
|
-
// re-uses IconButton's invisible `::before` hit-area expansion to a
|
|
77
|
-
// full touch target on touch / small screens. From the `sm:`
|
|
78
|
-
// breakpoint up the pointer is precise, so the expansion relaxes —
|
|
79
|
-
// but the interactive target must never fall below WCAG 2.5.8's 24px:
|
|
80
|
-
// • md (24px visual) already meets the 24px floor, so its `::before`
|
|
81
|
-
// is hidden on desktop and the 24px circle IS the target.
|
|
82
|
-
// • sm (20px visual) would fall to 20px if hidden — below the floor
|
|
83
|
-
// — so instead of hiding, its `::before` shrinks to a persistent
|
|
84
|
-
// `--spacing-lg` (24px) minimum that holds on desktop too.
|
|
85
|
-
sm: 'ds:w-5 ds:h-5 ds:before:absolute ds:before:inset-x-[calc((var(--min-target-size)-100%)/-2)] ds:before:inset-y-[calc((var(--min-target-size)-100%)/-2)] ds:before:content-[""] ds:sm:before:inset-x-[calc((var(--spacing-lg)-100%)/-2)] ds:sm:before:inset-y-[calc((var(--spacing-lg)-100%)/-2)]',
|
|
86
|
-
md: 'ds:w-6 ds:h-6 ds:before:absolute ds:before:inset-x-[calc((var(--min-target-size)-100%)/-2)] ds:before:inset-y-[calc((var(--min-target-size)-100%)/-2)] ds:before:content-[""] ds:sm:before:hidden'
|
|
87
|
-
}
|
|
88
|
-
},
|
|
89
|
-
defaultVariants: {
|
|
90
|
-
size: "md"
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
), X = E(
|
|
94
|
-
({
|
|
95
|
-
content: n,
|
|
96
|
-
heading: r,
|
|
97
|
-
size: u = "md",
|
|
98
|
-
cardSize: D,
|
|
99
|
-
side: z = "top",
|
|
100
|
-
align: C = "center",
|
|
101
|
-
"aria-label": L,
|
|
102
|
-
id: g,
|
|
103
|
-
className: S,
|
|
104
|
-
formula: b,
|
|
105
|
-
learnMoreHref: y,
|
|
106
|
-
learnMoreLabel: A,
|
|
107
|
-
onLearnMore: K
|
|
108
|
-
}, x) => {
|
|
109
|
-
const { t: m } = V("ui"), [f, p] = F(!1), i = o(f);
|
|
110
|
-
M(() => {
|
|
111
|
-
i.current = f;
|
|
112
|
-
}, [f]);
|
|
113
|
-
const P = O(
|
|
114
|
-
() => ({
|
|
115
|
-
getIsOpen: () => i.current,
|
|
116
|
-
open: () => p(!0),
|
|
117
|
-
close: () => p(!1)
|
|
118
|
-
}),
|
|
119
|
-
[]
|
|
120
|
-
);
|
|
121
|
-
J(U, P, g);
|
|
122
|
-
const v = o(null), T = () => {
|
|
123
|
-
v.current = i.current;
|
|
124
|
-
}, w = y != null, k = o(null), j = O(
|
|
125
|
-
() => G(x, k),
|
|
126
|
-
[x]
|
|
127
|
-
), I = o(null), R = o(null), N = o(null), h = L ?? m("infoTip.triggerLabel", "More information");
|
|
128
|
-
return /* @__PURE__ */ d(l, { openOn: "hover-or-click", open: f, onOpenChange: p, children: [
|
|
129
|
-
/* @__PURE__ */ t(
|
|
130
|
-
l.Trigger,
|
|
131
|
-
{
|
|
132
|
-
ref: j,
|
|
133
|
-
"aria-label": h,
|
|
134
|
-
className: W({ size: u, className: S }),
|
|
135
|
-
"data-component": "info-tip",
|
|
136
|
-
"data-component-id": g,
|
|
137
|
-
onPointerDown: T,
|
|
138
|
-
onKeyDown: (e) => {
|
|
139
|
-
(e.key === "Enter" || e.key === " ") && T();
|
|
140
|
-
const s = N.current, a = (s == null ? void 0 : s.tabIndex) === 0, c = a ? s : I.current;
|
|
141
|
-
(w || a) && e.key === "Tab" && !e.shiftKey && i.current && c && (e.preventDefault(), c.focus());
|
|
142
|
-
},
|
|
143
|
-
onClick: (e) => {
|
|
144
|
-
const s = v.current;
|
|
145
|
-
v.current = null, s === !1 && i.current && e.preventDefault();
|
|
146
|
-
},
|
|
147
|
-
children: /* @__PURE__ */ t(
|
|
148
|
-
Q,
|
|
149
|
-
{
|
|
150
|
-
"aria-hidden": "true",
|
|
151
|
-
className: u === "sm" ? "ds:size-5" : "ds:size-6"
|
|
152
|
-
}
|
|
153
|
-
)
|
|
154
|
-
}
|
|
155
|
-
),
|
|
156
|
-
/* @__PURE__ */ d(
|
|
157
|
-
l.Content,
|
|
158
|
-
{
|
|
159
|
-
ref: R,
|
|
160
|
-
side: z,
|
|
161
|
-
align: C,
|
|
162
|
-
size: D ?? (u === "sm" ? "sm" : "md"),
|
|
163
|
-
className: "ds:flex ds:flex-col ds:max-h-[var(--radix-popover-content-available-height)]",
|
|
164
|
-
"aria-label": r == null ? h : void 0,
|
|
165
|
-
onOpenAutoFocus: (e) => e.preventDefault(),
|
|
166
|
-
onCloseAutoFocus: (e) => e.preventDefault(),
|
|
167
|
-
onEscapeKeyDown: (e) => {
|
|
168
|
-
var a, c;
|
|
169
|
-
const s = document.activeElement;
|
|
170
|
-
s && ((a = R.current) != null && a.contains(s)) && (e.preventDefault(), (c = k.current) == null || c.focus(), p(!1));
|
|
171
|
-
},
|
|
172
|
-
children: [
|
|
173
|
-
r != null && /* @__PURE__ */ t(l.Heading, { children: r }),
|
|
174
|
-
/* @__PURE__ */ t(l.Description, { className: "ds:flex ds:min-h-0 ds:flex-col", children: /* @__PURE__ */ d(
|
|
175
|
-
B,
|
|
176
|
-
{
|
|
177
|
-
ref: N,
|
|
178
|
-
type: "native",
|
|
179
|
-
"aria-label": typeof r == "string" ? r : h,
|
|
180
|
-
className: "ds:min-h-[3lh]",
|
|
181
|
-
children: [
|
|
182
|
-
n,
|
|
183
|
-
b != null && /* @__PURE__ */ d(
|
|
184
|
-
"div",
|
|
185
|
-
{
|
|
186
|
-
"data-slot": "formula",
|
|
187
|
-
className: "type-body-sm ds:mt-[var(--spacing-sm)] ds:rounded-[var(--radius-sm)] ds:bg-[var(--muted)] ds:px-[var(--spacing-sm)] ds:py-[var(--spacing-xs)] ds:text-[var(--foreground)] ds:tabular-nums",
|
|
188
|
-
children: [
|
|
189
|
-
/* @__PURE__ */ d("span", { className: "ds:sr-only", children: [
|
|
190
|
-
m("infoTip.formula", "Formula"),
|
|
191
|
-
":",
|
|
192
|
-
" "
|
|
193
|
-
] }),
|
|
194
|
-
b
|
|
195
|
-
]
|
|
196
|
-
}
|
|
197
|
-
)
|
|
198
|
-
]
|
|
199
|
-
}
|
|
200
|
-
) }),
|
|
201
|
-
w && /* @__PURE__ */ t(
|
|
202
|
-
"div",
|
|
203
|
-
{
|
|
204
|
-
"data-slot": "footer",
|
|
205
|
-
className: "ds:mt-[var(--spacing-sm)] ds:flex ds:justify-end",
|
|
206
|
-
children: /* @__PURE__ */ t(
|
|
207
|
-
q,
|
|
208
|
-
{
|
|
209
|
-
ref: I,
|
|
210
|
-
href: y,
|
|
211
|
-
onClick: K,
|
|
212
|
-
weight: "strong",
|
|
213
|
-
className: "type-body-sm",
|
|
214
|
-
children: A ?? m("infoTip.learnMore", "Learn more")
|
|
215
|
-
}
|
|
216
|
-
)
|
|
217
|
-
}
|
|
218
|
-
)
|
|
219
|
-
]
|
|
220
|
-
}
|
|
221
|
-
)
|
|
222
|
-
] });
|
|
223
|
-
}
|
|
224
|
-
);
|
|
225
|
-
X.displayName = "InfoTip";
|
|
226
|
-
export {
|
|
227
|
-
X as I,
|
|
228
|
-
U as i
|
|
229
|
-
};
|
|
230
|
-
//# sourceMappingURL=info-tip-1Xsq9GLi.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"info-tip-1Xsq9GLi.js","sources":["../../src/components/info-tip/info-tip.agent.ts","../../src/components/info-tip/info-tip.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { InfoTipHandle } from './info-tip';\n\nexport const infoTipAgent: AgentAdapter<InfoTipHandle> = {\n id: 'info-tip',\n capabilities: ['open', 'close'],\n state: {\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.infoTip.state.isOpen',\n description: 'True when the info tip card is currently open.',\n read: (handle) => handle.getIsOpen(),\n },\n },\n actions: {\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.infoTip.actions.open',\n description:\n 'Open the info tip card (including its formula and Learn more link, when set).',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.infoTip.actions.close',\n description: 'Close the info tip card.',\n invoke: (handle) => {\n handle.close();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'info-tip',\n description: 'Marks the InfoTip trigger button.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop on InfoTip.',\n },\n },\n};\n","import {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Info } from 'lucide-react';\nimport { Popover } from '../popover';\nimport { Link } from '../link';\nimport { ScrollArea } from '../scroll-area';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { useAgentRegistration } from '../../agent';\nimport { infoTipAgent } from './info-tip.agent';\n\n/* -------------------------------------------------------------------- */\n/* Trigger — a small circular, branded affordance: card surface inside */\n/* the circle, accent ring + accent \"i\" glyph, and a soft drop shadow. */\n/* The accent alias is safe here: `--accent` resolves to magenta-700 in */\n/* light mode (the AA-safe interactive step) and the dark accent on dark */\n/* surfaces — never reference a raw magenta ramp step. */\n/* -------------------------------------------------------------------- */\n\nconst infoTipTriggerVariants = cva(\n [\n 'ds:relative ds:inline-flex ds:shrink-0 ds:items-center ds:justify-center',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:bg-[var(--card)]',\n 'ds:text-[var(--accent)]',\n // Single ring: the Lucide Info glyph draws its own accent circle, so the\n // trigger carries NO CSS border of its own (a border would read as a\n // second, concentric ring). The white circle comes from `bg-card` showing\n // through the glyph, lifted by the drop shadow.\n 'ds:shadow-[var(--shadow-sm)]',\n 'ds:cursor-pointer',\n 'ds:transition-[color,box-shadow] ds:motion-reduce:transition-none',\n 'ds:hover:text-[var(--accent-hover)] ds:hover:shadow-[var(--shadow-md)]',\n 'ds:data-[state=open]:text-[var(--accent-hover)] ds:data-[state=open]:shadow-[var(--shadow-md)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n {\n variants: {\n size: {\n // Both diameters sit below `--min-target-size` (44/48px), so each\n // re-uses IconButton's invisible `::before` hit-area expansion to a\n // full touch target on touch / small screens. From the `sm:`\n // breakpoint up the pointer is precise, so the expansion relaxes —\n // but the interactive target must never fall below WCAG 2.5.8's 24px:\n // • md (24px visual) already meets the 24px floor, so its `::before`\n // is hidden on desktop and the 24px circle IS the target.\n // • sm (20px visual) would fall to 20px if hidden — below the floor\n // — so instead of hiding, its `::before` shrinks to a persistent\n // `--spacing-lg` (24px) minimum that holds on desktop too.\n sm: 'ds:w-5 ds:h-5 ds:before:absolute ds:before:inset-x-[calc((var(--min-target-size)-100%)/-2)] ds:before:inset-y-[calc((var(--min-target-size)-100%)/-2)] ds:before:content-[\"\"] ds:sm:before:inset-x-[calc((var(--spacing-lg)-100%)/-2)] ds:sm:before:inset-y-[calc((var(--spacing-lg)-100%)/-2)]',\n md: 'ds:w-6 ds:h-6 ds:before:absolute ds:before:inset-x-[calc((var(--min-target-size)-100%)/-2)] ds:before:inset-y-[calc((var(--min-target-size)-100%)/-2)] ds:before:content-[\"\"] ds:sm:before:hidden',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\n// Curated agent-readiness handle — see info-tip.agent.ts.\nexport interface InfoTipHandle {\n getIsOpen: () => boolean;\n open: () => void;\n close: () => void;\n}\n\nexport interface InfoTipProps {\n /** Body of the tip — explanatory text shown in the floating card. */\n content: ReactNode;\n /** Optional heading rendered above the body. */\n heading?: ReactNode;\n /**\n * Trigger diameter. Also sets the floating card width unless `cardSize`\n * is given: `sm` → `--popover-size-sm`, `md` → `--popover-size-md`.\n */\n size?: 'sm' | 'md';\n /**\n * Width of the floating card, when it should differ from the trigger size:\n * `sm` → `--popover-size-sm`, `md` → `--popover-size-md`, `lg` →\n * `--popover-size-lg`. Defaults to the width that matches `size`, so a\n * small trigger can open a wider card for a longer explanation.\n */\n cardSize?: 'sm' | 'md' | 'lg';\n /** Logical side the card opens on. Default `'top'`. */\n side?: 'start' | 'top' | 'end' | 'bottom';\n /** Alignment along the side axis. Default `'center'`. */\n align?: 'start' | 'center' | 'end';\n /**\n * Accessible name for the trigger. Defaults to the translated\n * \"More information\" chrome string.\n */\n 'aria-label'?: string;\n /**\n * Opaque instance id — emitted as `data-component-id` on the trigger and\n * used to register the instance with the host agent registry.\n */\n id?: string;\n /** Extra classes merged onto the trigger button. */\n className?: string;\n /**\n * A formula written in words, shown below `content` in a quiet block, e.g.\n * \"Net revenue = invoices issued − credit notes\". It is part of the card's\n * description, so screen readers hear it.\n */\n formula?: ReactNode;\n /**\n * When set, the card gains a footer \"Learn more\" link to this URL and\n * becomes interactive: Tab from the open trigger moves to the link,\n * Shift+Tab returns, Escape closes and refocuses the trigger. Without it the\n * card is explanatory text and focus stays on the trigger, unless the text\n * is long enough to scroll: then Tab reaches the text so it can be scrolled.\n */\n learnMoreHref?: string;\n /** Link text. Defaults to the translated \"Learn more\" chrome string. */\n learnMoreLabel?: string;\n /**\n * Called when the link is activated. An SPA can call `event.preventDefault()`\n * and route client-side; the anchor keeps its real `href` either way.\n */\n onLearnMore?: (event: ReactMouseEvent<HTMLAnchorElement>) => void;\n}\n\n/**\n * InfoTip — a deliberate, branded \"more information\" affordance: a small\n * circular trigger that reveals an explanatory card on hover **and** click\n * (click also serves touch devices). Composes the kit Popover in\n * `openOn=\"hover-or-click\"` mode — hover intent, keyboard focus, Escape and\n * focus-return are all handled by the Popover/Radix layer.\n */\nexport const InfoTip = forwardRef<HTMLButtonElement, InfoTipProps>(\n (\n {\n content,\n heading,\n size = 'md',\n cardSize,\n side = 'top',\n align = 'center',\n 'aria-label': ariaLabelProp,\n id,\n className,\n formula,\n learnMoreHref,\n learnMoreLabel,\n onLearnMore,\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const [open, setOpen] = useState(false);\n\n // Agent handle.\n const openRef = useRef(open);\n useEffect(() => {\n openRef.current = open;\n }, [open]);\n\n const agentHandle = useMemo<InfoTipHandle>(\n () => ({\n getIsOpen: () => openRef.current,\n open: () => setOpen(true),\n close: () => setOpen(false),\n }),\n [],\n );\n useAgentRegistration(infoTipAgent, agentHandle, id);\n\n // Press bookkeeping. In hover-or-click mode the Popover opens as soon as\n // the trigger receives focus — which happens on pointerdown, BEFORE the\n // click event that Radix uses to toggle. Without intervention every\n // click/tap on a closed tip opens it (focus) and instantly toggles it\n // closed again (click). So each press (pointerdown, or Enter/Space)\n // snapshots the open state and the click handler consumes it: if the\n // press itself opened the card, swallow Radix's toggle so the card stays\n // open; if it was already open, let the toggle close it.\n //\n // `null` means \"no press recorded for this click\" — an orphan click\n // (programmatic .click(), or assistive tech dispatching click with no\n // pointer/key event). Those must fall through to Radix's default toggle\n // rather than read a stale snapshot, so the guard treats `null` as\n // \"don't suppress\" and every click clears the snapshot back to `null`.\n const pressStateRef = useRef<boolean | null>(null);\n const handlePressStart = () => {\n pressStateRef.current = openRef.current;\n };\n\n const hasLink = learnMoreHref != null;\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const composedTriggerRef = useMemo(\n () => composeRefs<HTMLButtonElement>(ref, triggerRef),\n [ref],\n );\n const linkRef = useRef<HTMLAnchorElement | null>(null);\n const contentRef = useRef<HTMLDivElement | null>(null);\n // A long tip is capped at the height the viewport leaves it and its text\n // scrolls in a ScrollArea, which is a tab stop only while it can scroll.\n const scrollRef = useRef<HTMLDivElement | null>(null);\n\n const ariaLabel =\n ariaLabelProp ?? t('infoTip.triggerLabel', 'More information');\n\n return (\n <Popover openOn=\"hover-or-click\" open={open} onOpenChange={setOpen}>\n <Popover.Trigger\n ref={composedTriggerRef}\n aria-label={ariaLabel}\n className={infoTipTriggerVariants({ size, className })}\n data-component=\"info-tip\"\n data-component-id={id}\n onPointerDown={handlePressStart}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n handlePressStart();\n }\n // The card is portalled, so native Tab order would skip it. Tab\n // from the open trigger goes to the scrolling text when it\n // overflows, otherwise straight to the link.\n const scroll = scrollRef.current;\n const scrollable = scroll?.tabIndex === 0;\n const next = scrollable ? scroll : linkRef.current;\n if (\n (hasLink || scrollable) &&\n event.key === 'Tab' &&\n !event.shiftKey &&\n openRef.current &&\n next\n ) {\n event.preventDefault();\n next.focus();\n }\n }}\n onClick={(event) => {\n // Consume this click's press snapshot. A genuine pointer/keyboard\n // press recorded `false`/`true` on press-start; an orphan click\n // with no preceding pointerdown/keydown finds `null` and is left\n // to Radix's default toggle.\n const wasOpenAtPressStart = pressStateRef.current;\n pressStateRef.current = null;\n if (wasOpenAtPressStart === false && openRef.current) {\n // This press opened the card via focus — keep it open and\n // skip Radix's click toggle.\n event.preventDefault();\n }\n }}\n >\n <Info\n aria-hidden=\"true\"\n // Fills the circle so the glyph's own ring IS the trigger's\n // visible edge and the drop shadow hugs it.\n className={size === 'sm' ? 'ds:size-5' : 'ds:size-6'}\n />\n </Popover.Trigger>\n <Popover.Content\n ref={contentRef}\n side={side}\n align={align}\n size={cardSize ?? (size === 'sm' ? 'sm' : 'md')}\n // Never taller than the space the viewport leaves; the text scrolls.\n // The card itself does not clip, so its arrow stays visible.\n className=\"ds:flex ds:flex-col ds:max-h-[var(--radix-popover-content-available-height)]\"\n // The card is a Radix `role=\"dialog\"` surface, which axe requires\n // to have an accessible name (aria-dialog-name). With a heading,\n // Popover wires aria-labelledby; without one, fall back to the\n // trigger's label.\n aria-label={heading == null ? ariaLabel : undefined}\n // Toggletip focus contract: the card is explanatory text, never\n // interactive, so focus stays on the trigger for the whole\n // open/close cycle. Preventing the open move also keeps Escape\n // reliable — if Radix pulled focus into the card, closing would\n // refocus the trigger and re-fire the hover-mode focus handler,\n // reopening the card it just closed. Preventing the close move\n // keeps an unhover-close from stealing focus mid-task.\n //\n // With a learn-more link, or text long enough to scroll, the card\n // is interactive, but the same contract holds: focus is never\n // pulled in on open, only Tab moves it to the text or the link. Escape from inside the card is handled below so\n // focus returns to the trigger without re-firing its focus-open.\n onOpenAutoFocus={(event) => event.preventDefault()}\n onCloseAutoFocus={(event) => event.preventDefault()}\n onEscapeKeyDown={(event) => {\n // Focus anywhere inside the card (the link, or the card itself\n // after a click on its text) goes back to the trigger.\n const active = document.activeElement;\n if (active && contentRef.current?.contains(active)) {\n event.preventDefault();\n triggerRef.current?.focus();\n setOpen(false);\n }\n }}\n >\n {heading != null && <Popover.Heading>{heading}</Popover.Heading>}\n <Popover.Description className=\"ds:flex ds:min-h-0 ds:flex-col\">\n <ScrollArea\n ref={scrollRef}\n type=\"native\"\n aria-label={typeof heading === 'string' ? heading : ariaLabel}\n // At high zoom the heading and link keep their height; the text\n // keeps at least three lines rather than collapsing to nothing.\n className=\"ds:min-h-[3lh]\"\n >\n {content}\n {formula != null && (\n <div\n data-slot=\"formula\"\n className=\"type-body-sm ds:mt-[var(--spacing-sm)] ds:rounded-[var(--radius-sm)] ds:bg-[var(--muted)] ds:px-[var(--spacing-sm)] ds:py-[var(--spacing-xs)] ds:text-[var(--foreground)] ds:tabular-nums\"\n >\n <span className=\"ds:sr-only\">\n {t('infoTip.formula', 'Formula')}:{' '}\n </span>\n {formula}\n </div>\n )}\n </ScrollArea>\n </Popover.Description>\n {hasLink && (\n <div\n data-slot=\"footer\"\n className=\"ds:mt-[var(--spacing-sm)] ds:flex ds:justify-end\"\n >\n <Link\n ref={linkRef}\n href={learnMoreHref}\n onClick={onLearnMore}\n weight=\"strong\"\n className=\"type-body-sm\"\n >\n {learnMoreLabel ?? t('infoTip.learnMore', 'Learn more')}\n </Link>\n </div>\n )}\n </Popover.Content>\n </Popover>\n );\n },\n);\n\nInfoTip.displayName = 'InfoTip';\n"],"names":["infoTipAgent","handle","infoTipTriggerVariants","cva","InfoTip","forwardRef","content","heading","size","cardSize","side","align","ariaLabelProp","id","className","formula","learnMoreHref","learnMoreLabel","onLearnMore","ref","t","useTranslation","open","setOpen","useState","openRef","useRef","useEffect","agentHandle","useMemo","useAgentRegistration","pressStateRef","handlePressStart","hasLink","triggerRef","composedTriggerRef","composeRefs","linkRef","contentRef","scrollRef","ariaLabel","Popover","jsx","event","scroll","scrollable","next","wasOpenAtPressStart","Info","jsxs","active","_a","_b","ScrollArea","Link"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"practice-profile-hero-BAvGdQmt.js","sources":["../../src/components/practice-profile-hero/practice-profile-hero.agent.ts","../../src/components/practice-profile-hero/practice-profile-hero.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { PracticeProfileHeroHandle } from './practice-profile-hero';\n\nexport const practiceProfileHeroAgent: AgentAdapter<PracticeProfileHeroHandle> =\n {\n id: 'practice-profile-hero',\n // Purely observable hero region — no interactive affordances and no\n // imperative actions on the handle (getName / getHasCover are read-only\n // projections).\n capabilities: [],\n state: {\n name: {\n type: 'string',\n descriptionKey: 'ui.agent.practiceProfileHero.state.name',\n description: 'Practice display name currently rendered.',\n read: (handle) => handle.getName(),\n },\n hasCover: {\n type: 'boolean',\n descriptionKey: 'ui.agent.practiceProfileHero.state.hasCover',\n description:\n 'Whether a cover-image strip is rendered. Structural flag only — never the image URL or any PHI.',\n read: (handle) => handle.getHasCover(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'practice-profile-hero',\n description: 'Marks the PracticeProfileHero root region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n };\n","import {\n forwardRef,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { Avatar } from '../avatar/avatar';\nimport { Badge } from '../badge/badge';\nimport { Card } from '../card/card';\nimport { Rating } from '../rating/rating';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { practiceProfileHeroAgent } from './practice-profile-hero.agent';\n\n/* -------------------------------------------------------------------- */\n/* PracticeProfileHero */\n/* */\n/* The practice-page counterpart to `<OperatorHero>` — the top-of-page */\n/* hero for a practice profile (booking site `/p/<seoUrl>`, marketplace */\n/* practice views). Differences from the operator hero: */\n/* */\n/* - Optional cover strip: renders ONLY when `coverImageUrl` is set. */\n/* A practice without a configured cover image gets no strip at all */\n/* — never an empty brand-gradient band eating page space. */\n/* - Larger avatar at desktop widths (3xl), stepped down to xl and */\n/* stacked above the text on small viewports so the practice name, */\n/* tagline and rating keep the full line width on phones. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* CVA */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva('ds:w-full ds:text-[color:var(--foreground)]', {\n variants: {\n // Matches the kit's other `surface` props (Booking, ReviewsPanel,\n // OperatorHero). `'elevated'` wraps in `<Card>`.\n surface: {\n flat: '',\n elevated: '',\n },\n },\n defaultVariants: {\n surface: 'elevated',\n },\n});\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\nexport interface PracticeProfileHeroBadge {\n /** Display key — i18n is up to the consumer. */\n key: string;\n /** Display label. */\n label: string;\n /** Badge variant — falls back to `neutral`. */\n variant?: 'neutral' | 'info' | 'success' | 'warning' | 'error';\n}\n\nexport interface PracticeProfileHeroRating {\n /** Mean rating, 0–5. */\n value: number;\n /** Total number of reviews. */\n count: number;\n}\n\nexport interface PracticeProfileHeroHandle {\n getName: () => string;\n /** Structural flag — whether a cover strip is rendered. No PHI. */\n getHasCover: () => boolean;\n}\n\nexport interface PracticeProfileHeroProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'children'\n> {\n /** Practice display name. Rendered as the H1 heading. */\n name: string;\n /** Slogan / tagline subtitle (e.g. \"15 anni di esperienza nel cuore di Brera\"). */\n tagline?: string;\n /**\n * Optional practice photo / logo URL. The kit always renders an\n * `<Avatar>` — when `imageUrl` is missing the avatar falls back to\n * initials.\n */\n imageUrl?: string;\n /**\n * Text alternative for the photo's `<img>`, for image search and crawlers.\n * Pass the practice name. Leave it out and the photo stays decorative\n * (`alt=\"\"`), as before. Added in 1.91.0.\n */\n imageAlt?: string;\n /**\n * Optional cover image painted as a full-width strip above the body.\n * The strip renders ONLY when this is set — a practice without a cover\n * image gets no strip (and no empty gradient band). While the image\n * loads, the brand gradient shows in the strip. If it fails to load\n * (404, 401, not an image), the strip goes, as if no cover had been\n * passed, and `data-has-cover` reads `\"false\"`. A different URL tries\n * again.\n */\n coverImageUrl?: string;\n /** Rating summary — when present, renders a Rating + numeric breakdown line. */\n rating?: PracticeProfileHeroRating;\n /**\n * Optional badge row beneath the rating. Use sparingly — 1–3 chips\n * suit the hero's density; longer lists belong in `<ContactProfileCard>`.\n */\n badges?: PracticeProfileHeroBadge[];\n\n /* ----- Slots ----- */\n\n /**\n * Rendered at the inline-end of the heading row (right side on LTR)\n * from `sm` up. The heading row wraps, so on a phone the action drops\n * onto its own line, starts flush with the practice name, and is free\n * to shrink into the column rather than overflow it.\n *\n * Use for a \"Book an appointment\" `<Button>` or a share action.\n */\n actionSlot?: ReactNode;\n\n /* ----- Styling ----- */\n\n /**\n * `elevated` (default) wraps in `<Card variant=\"elevated\">`. `flat`\n * drops the Card — use inside another card / sheet.\n */\n surface?: 'flat' | 'elevated';\n\n /* ----- a11y ----- */\n\n 'aria-label'?: string;\n id?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const PracticeProfileHero = forwardRef<\n HTMLDivElement,\n PracticeProfileHeroProps\n>(\n (\n {\n name,\n tagline,\n imageUrl,\n imageAlt,\n coverImageUrl,\n rating,\n badges,\n actionSlot,\n surface = 'elevated',\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const headingId = useId();\n\n // HTP-6708. A CSS background cannot report a failed load, so the URL\n // is probed with an Image (the browser serves both from one request).\n // The strip reserves its height while the image loads, with the brand\n // gradient showing: a cover that loads causes no layout shift, and one\n // that fails removes the strip in a single step. The outcome is kept\n // per URL, so a new URL starts loading again and is retried.\n const [coverOutcome, setCoverOutcome] = useState<{\n url: string;\n status: 'loaded' | 'error';\n } | null>(null);\n const coverStatus =\n coverImageUrl && coverOutcome?.url === coverImageUrl\n ? coverOutcome.status\n : 'loading';\n useEffect(() => {\n if (!coverImageUrl || typeof Image === 'undefined') return undefined;\n let current = true;\n const probe = new Image();\n probe.onload = () => {\n if (current) setCoverOutcome({ url: coverImageUrl, status: 'loaded' });\n };\n probe.onerror = () => {\n if (current) setCoverOutcome({ url: coverImageUrl, status: 'error' });\n };\n probe.src = coverImageUrl;\n return () => {\n current = false;\n probe.onload = null;\n probe.onerror = null;\n };\n }, [coverImageUrl]);\n const hasCover = Boolean(coverImageUrl) && coverStatus !== 'error';\n\n // Memoised so the registry doesn't see a fresh handle identity (and\n // fire unregister+register) on every render — mirrors Booking.\n const agentHandle = useMemo(\n () => ({ getName: () => name, getHasCover: () => hasCover }),\n [name, hasCover],\n );\n useAgentRegistration(practiceProfileHeroAgent, agentHandle, id);\n\n // Cover image URL lands as a component-scoped CSS custom property set\n // imperatively on a ref — mirrors the Avatar `--avatar-color-override`\n // idiom so no `style={{…}}` attribute lands on the JSX (constraint §4).\n const coverRef = useRef<HTMLDivElement>(null);\n useIsomorphicLayoutEffect(() => {\n const el = coverRef.current;\n if (!el) return;\n if (coverImageUrl) {\n el.style.setProperty(\n '--practice-profile-hero-cover',\n `url(\"${coverImageUrl.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\")`,\n );\n } else {\n el.style.removeProperty('--practice-profile-hero-cover');\n }\n // `hasCover`: the strip can come back (a new URL after a failure),\n // and the new element needs the property too.\n }, [coverImageUrl, hasCover]);\n\n const cover = hasCover ? (\n <div\n ref={coverRef}\n aria-hidden=\"true\"\n data-slot=\"cover\"\n data-state={coverStatus}\n className={[\n 'ds:h-32 ds:sm:h-40 ds:w-full',\n // Cover image layered over the brand gradient — the gradient is\n // the visible underlay while the image streams in. A failed image\n // removes the strip (see above). The `none` fallback keeps the\n // declaration valid before the layout effect sets the custom\n // property (SSR / first paint).\n 'ds:bg-[image:var(--practice-profile-hero-cover,none),var(--gradient-hero-brand)]',\n 'ds:bg-cover ds:bg-center',\n ].join(' ')}\n />\n ) : null;\n\n // Decorative unless the caller wrote alt text for a photo that shows.\n const photoHidden = !(imageUrl && imageAlt);\n\n const body = (\n <div\n className={[\n // Phones: stacked column, smaller avatar — the practice name,\n // tagline and rating keep the full line width instead of being\n // squeezed beside a 3xl avatar. sm+: classic row layout.\n 'ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-md)]',\n 'ds:sm:flex-row ds:sm:gap-[var(--spacing-lg)]',\n ].join(' ')}\n >\n {/* Responsive avatar — `ds:hidden` removes the inactive size from\n both the layout and the accessibility tree. Without `imageAlt`\n both renders are aria-hidden: the H1 right beside them already\n carries the practice name, so the avatar is decorative. With\n `imageAlt` (and a photo) the photo is reachable and its alt is\n what a screen reader reads (HTP-7074). */}\n {/* HTP-6712: the practice photo is a 4:3 rounded rectangle, filled\n and cropped from the centre. It keeps the old circle's height\n (64px on phones, 192px from sm), so the hero does not grow. */}\n <div className=\"ds:shrink-0 ds:sm:hidden\">\n <Avatar\n size=\"xl\"\n shape=\"rounded\"\n ratio=\"4:3\"\n width={85}\n height={64}\n name={name}\n src={imageUrl}\n alt={imageAlt}\n aria-hidden={photoHidden ? 'true' : undefined}\n />\n </div>\n <div className=\"ds:hidden ds:shrink-0 ds:sm:block\">\n <Avatar\n size=\"3xl\"\n shape=\"rounded\"\n ratio=\"4:3\"\n width={256}\n height={192}\n name={name}\n src={imageUrl}\n alt={imageAlt}\n aria-hidden={photoHidden ? 'true' : undefined}\n />\n </div>\n <div className=\"ds:flex ds:w-full ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-start ds:gap-[var(--spacing-md)]\">\n {/* The practice's own words (name, tagline) keep the direction\n they were typed in, not the page's: `dir=\"auto\"`. */}\n <h1\n id={headingId}\n dir=\"auto\"\n className=\"type-title-page ds:m-0 ds:text-[color:var(--foreground)]\"\n >\n {name}\n </h1>\n {actionSlot ? (\n // `ms-auto` + `shrink-0` are the desktop contract, and both are\n // wrong once the row wraps on a phone: they stranded the action\n // at the inline-end of a start-aligned stack and stopped a wide\n // control fitting the column. Hence `sm:` and up only.\n <div className=\"ds:flex ds:min-w-0 ds:items-center ds:gap-[var(--spacing-xs)] ds:sm:ms-auto ds:sm:shrink-0\">\n {actionSlot}\n </div>\n ) : null}\n </div>\n {tagline ? (\n <p\n dir=\"auto\"\n className=\"type-body ds:m-0 ds:text-[color:var(--foreground)]\"\n >\n {tagline}\n </p>\n ) : null}\n {rating ? (\n // Rating owns the whole line: locale-formatted value, plural-\n // aware review count, and a single role=\"img\" announcement.\n <Rating\n value={rating.value}\n max={5}\n size=\"md\"\n reviews={{ count: rating.count }}\n />\n ) : null}\n {badges && badges.length > 0 ? (\n <div\n role=\"list\"\n className=\"ds:mt-[var(--spacing-2xs)] ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-2xs)]\"\n >\n {badges.map((badge) => (\n <Badge\n key={badge.key}\n variant={badge.variant ?? 'neutral'}\n role=\"listitem\"\n >\n {badge.label}\n </Badge>\n ))}\n </div>\n ) : null}\n </div>\n </div>\n );\n\n return (\n <div\n ref={ref}\n role=\"region\"\n // A consumer-supplied aria-label wins; otherwise the region is\n // named by the practice-name H1 via aria-labelledby.\n aria-label={ariaLabel}\n aria-labelledby={ariaLabel ? undefined : headingId}\n data-component=\"practice-profile-hero\"\n data-component-id={id}\n data-has-cover={hasCover ? 'true' : 'false'}\n id={id}\n className={rootVariants({ surface, className })}\n {...rest}\n >\n {surface === 'elevated' ? (\n <Card variant=\"elevated\">\n {cover}\n <Card.Body>{body}</Card.Body>\n </Card>\n ) : (\n <>\n {cover}\n <div className=\"ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]\">\n {body}\n </div>\n </>\n )}\n </div>\n );\n },\n);\n\nPracticeProfileHero.displayName = 'PracticeProfileHero';\n"],"names":["practiceProfileHeroAgent","handle","rootVariants","cva","PracticeProfileHero","forwardRef","name","tagline","imageUrl","imageAlt","coverImageUrl","rating","badges","actionSlot","surface","ariaLabel","id","className","rest","ref","headingId","useId","coverOutcome","setCoverOutcome","useState","coverStatus","useEffect","current","probe","hasCover","agentHandle","useMemo","useAgentRegistration","coverRef","useRef","useIsomorphicLayoutEffect","el","cover","jsx","photoHidden","body","jsxs","Avatar","Rating","badge","Badge","Card","Fragment"],"mappings":"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"}
|