@alfadocs/ui-kit-debug 1.96.0 → 1.97.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/{address-autocomplete-DR4Xn23Z.js → address-autocomplete-DC-H-MZw.js} +2 -2
- package/dist/_chunks/{address-autocomplete-DR4Xn23Z.js.map → address-autocomplete-DC-H-MZw.js.map} +1 -1
- package/dist/_chunks/{address-fields-qxQkGwPf.js → address-fields-D5Ije0S2.js} +7 -7
- package/dist/_chunks/{address-fields-qxQkGwPf.js.map → address-fields-D5Ije0S2.js.map} +1 -1
- package/dist/_chunks/{agenda-card-BhY342MA.js → agenda-card-bRQ4j6U6.js} +2 -2
- package/dist/_chunks/{agenda-card-BhY342MA.js.map → agenda-card-bRQ4j6U6.js.map} +1 -1
- package/dist/_chunks/{agenda-tray-BmxBGEci.js → agenda-tray-CzE3E8GU.js} +2 -2
- package/dist/_chunks/{agenda-tray-BmxBGEci.js.map → agenda-tray-CzE3E8GU.js.map} +1 -1
- package/dist/_chunks/{alia-sidebar-ovRX_oti.js → alia-sidebar-B5mu44g2.js} +3 -3
- package/dist/_chunks/{alia-sidebar-ovRX_oti.js.map → alia-sidebar-B5mu44g2.js.map} +1 -1
- package/dist/_chunks/{anamnesis-summary-rows-CdRUXoaA.js → anamnesis-summary-rows-B9HqOGd7.js} +4 -4
- package/dist/_chunks/{anamnesis-summary-rows-CdRUXoaA.js.map → anamnesis-summary-rows-B9HqOGd7.js.map} +1 -1
- package/dist/_chunks/{appointment-card-Csx4544A.js → appointment-card-zPr0brha.js} +3 -3
- package/dist/_chunks/{appointment-card-Csx4544A.js.map → appointment-card-zPr0brha.js.map} +1 -1
- package/dist/_chunks/{appointment-peek-CcDCWb-F.js → appointment-peek-xFTBany4.js} +3 -3
- package/dist/_chunks/{appointment-peek-CcDCWb-F.js.map → appointment-peek-xFTBany4.js.map} +1 -1
- package/dist/_chunks/{appointment-timeline-DW6FN6u8.js → appointment-timeline-AKkVx9AN.js} +2 -2
- package/dist/_chunks/{appointment-timeline-DW6FN6u8.js.map → appointment-timeline-AKkVx9AN.js.map} +1 -1
- package/dist/_chunks/{appointment-tray-CZfXwHWz.js → appointment-tray-B8qQBW65.js} +2 -2
- package/dist/_chunks/{appointment-tray-CZfXwHWz.js.map → appointment-tray-B8qQBW65.js.map} +1 -1
- package/dist/_chunks/{aspect-ratio-DeSNzASA.js → aspect-ratio-B-6cyOpm.js} +13 -13
- package/dist/_chunks/aspect-ratio-B-6cyOpm.js.map +1 -0
- package/dist/_chunks/{autocomplete-BXMcNoa3.js → autocomplete-D10ydpgi.js} +2 -2
- package/dist/_chunks/{autocomplete-BXMcNoa3.js.map → autocomplete-D10ydpgi.js.map} +1 -1
- package/dist/_chunks/{avatar-a6042Ox2.js → avatar-BoqdWsNe.js} +2 -2
- package/dist/_chunks/avatar-BoqdWsNe.js.map +1 -0
- package/dist/_chunks/{balance-badge-cell-DcBmtijD.js → balance-badge-cell-DaZokVZY.js} +3 -3
- package/dist/_chunks/{balance-badge-cell-DcBmtijD.js.map → balance-badge-cell-DaZokVZY.js.map} +1 -1
- package/dist/_chunks/{breadcrumb-Bn29NCnf.js → breadcrumb-zxa_PNhF.js} +2 -2
- package/dist/_chunks/breadcrumb-zxa_PNhF.js.map +1 -0
- package/dist/_chunks/{calendar-CmiMS4FJ.js → calendar-DVe5eArk.js} +2 -2
- package/dist/_chunks/{calendar-CmiMS4FJ.js.map → calendar-DVe5eArk.js.map} +1 -1
- package/dist/_chunks/{calendar-appointment-editor-dialog-BOZ5wk96.js → calendar-appointment-editor-dialog-26LEMx0q.js} +12 -12
- package/dist/_chunks/{calendar-appointment-editor-dialog-BOZ5wk96.js.map → calendar-appointment-editor-dialog-26LEMx0q.js.map} +1 -1
- package/dist/_chunks/{chat-message-LRO_6Ee3.js → chat-message-CkBCAcwn.js} +2 -2
- package/dist/_chunks/{chat-message-LRO_6Ee3.js.map → chat-message-CkBCAcwn.js.map} +1 -1
- package/dist/_chunks/{city-input-CA59CjnV.js → city-input-DXipzTfZ.js} +3 -3
- package/dist/_chunks/{city-input-CA59CjnV.js.map → city-input-DXipzTfZ.js.map} +1 -1
- package/dist/_chunks/{clinical-note-card-CWHFnCmY.js → clinical-note-card--juv_ELr.js} +2 -2
- package/dist/_chunks/{clinical-note-card-CWHFnCmY.js.map → clinical-note-card--juv_ELr.js.map} +1 -1
- package/dist/_chunks/{combobox-D-gpgEDy.js → combobox-duuDRI1t.js} +2 -2
- package/dist/_chunks/{combobox-D-gpgEDy.js.map → combobox-duuDRI1t.js.map} +1 -1
- package/dist/_chunks/{command-palette-B3dVqm9D.js → command-palette-DxQBU4wH.js} +3 -3
- package/dist/_chunks/command-palette-DxQBU4wH.js.map +1 -0
- package/dist/_chunks/{contact-profile-card-jBf9U4At.js → contact-profile-card-QPUgGu-t.js} +57 -57
- package/dist/_chunks/contact-profile-card-QPUgGu-t.js.map +1 -0
- package/dist/_chunks/{copy-field-hgVSc51W.js → copy-field-BaYEDJ9f.js} +24 -24
- package/dist/_chunks/copy-field-BaYEDJ9f.js.map +1 -0
- package/dist/_chunks/{country-select-BfmX9y5i.js → country-select-CUuGOAoZ.js} +2 -2
- package/dist/_chunks/{country-select-BfmX9y5i.js.map → country-select-CUuGOAoZ.js.map} +1 -1
- package/dist/_chunks/{data-table-xUDjZS_O.js → data-table-C4UT4L9B.js} +3 -3
- package/dist/_chunks/{data-table-xUDjZS_O.js.map → data-table-C4UT4L9B.js.map} +1 -1
- package/dist/_chunks/{data-table-tabs-CcgU2lr5.js → data-table-tabs-Db7zToFD.js} +2 -2
- package/dist/_chunks/{data-table-tabs-CcgU2lr5.js.map → data-table-tabs-Db7zToFD.js.map} +1 -1
- package/dist/_chunks/{dependent-selector-CyNi7M_f.js → dependent-selector-DRN0P0Kr.js} +2 -2
- package/dist/_chunks/{dependent-selector-CyNi7M_f.js.map → dependent-selector-DRN0P0Kr.js.map} +1 -1
- package/dist/_chunks/{document-preview-DWIQryMW.js → document-preview-U8H6tnDJ.js} +2 -2
- package/dist/_chunks/{document-preview-DWIQryMW.js.map → document-preview-U8H6tnDJ.js.map} +1 -1
- package/dist/_chunks/{document-scanner-BQP0Rqrt.js → document-scanner-Bf3VUp00.js} +24 -24
- package/dist/_chunks/document-scanner-Bf3VUp00.js.map +1 -0
- package/dist/_chunks/{editable-currency-cell-renderer-BEaj2NT_.js → editable-currency-cell-renderer-BUdFMh67.js} +2 -2
- package/dist/_chunks/{editable-currency-cell-renderer-BEaj2NT_.js.map → editable-currency-cell-renderer-BUdFMh67.js.map} +1 -1
- package/dist/_chunks/{email-input-C7THAwh2.js → email-input-BEO3vonE.js} +2 -2
- package/dist/_chunks/{email-input-C7THAwh2.js.map → email-input-BEO3vonE.js.map} +1 -1
- package/dist/_chunks/{entity-summary-BJdfIsk_.js → entity-summary-B4p8zP1J.js} +2 -2
- package/dist/_chunks/{entity-summary-BJdfIsk_.js.map → entity-summary-B4p8zP1J.js.map} +1 -1
- package/dist/_chunks/{face-scheme-BmygzbZr.js → face-scheme-DdVLQ5dP.js} +3 -3
- package/dist/_chunks/{face-scheme-BmygzbZr.js.map → face-scheme-DdVLQ5dP.js.map} +1 -1
- package/dist/_chunks/{file-manager-Ba_TcfCj.js → file-manager-B4K2j7jB.js} +4 -4
- package/dist/_chunks/{file-manager-Ba_TcfCj.js.map → file-manager-B4K2j7jB.js.map} +1 -1
- package/dist/_chunks/{fiscal-code-input-BzWmNDnl.js → fiscal-code-input-BBvU7sAo.js} +2 -2
- package/dist/_chunks/{fiscal-code-input-BzWmNDnl.js.map → fiscal-code-input-BBvU7sAo.js.map} +1 -1
- package/dist/_chunks/{forgot-password-form-BCk4rGIh.js → forgot-password-form-CeTb5p-x.js} +2 -2
- package/dist/_chunks/{forgot-password-form-BCk4rGIh.js.map → forgot-password-form-CeTb5p-x.js.map} +1 -1
- package/dist/_chunks/{header-settings-C2D74i4g.js → header-settings-Df9q1uHt.js} +2 -2
- package/dist/_chunks/{header-settings-C2D74i4g.js.map → header-settings-Df9q1uHt.js.map} +1 -1
- package/dist/_chunks/{heatmap-C9tEvqEm.js → heatmap-B2Z1_kDn.js} +2 -2
- package/dist/_chunks/{heatmap-C9tEvqEm.js.map → heatmap-B2Z1_kDn.js.map} +1 -1
- package/dist/_chunks/{help-me-write-templates-BJSf24xS.js → help-me-write-templates-ra5a__Yy.js} +2 -2
- package/dist/_chunks/{help-me-write-templates-BJSf24xS.js.map → help-me-write-templates-ra5a__Yy.js.map} +1 -1
- package/dist/_chunks/{iban-input-B9L2QDHh.js → iban-input-DuTwKok5.js} +2 -2
- package/dist/_chunks/{iban-input-B9L2QDHh.js.map → iban-input-DuTwKok5.js.map} +1 -1
- package/dist/_chunks/{icon-picker-DQMG9L6M.js → icon-picker-BmU6gpZT.js} +2 -2
- package/dist/_chunks/{icon-picker-DQMG9L6M.js.map → icon-picker-BmU6gpZT.js.map} +1 -1
- package/dist/_chunks/{input-surface-iBmxVBfr.js → input-surface-BMffm2Vd.js} +4 -4
- package/dist/_chunks/{input-surface-iBmxVBfr.js.map → input-surface-BMffm2Vd.js.map} +1 -1
- package/dist/_chunks/{link-cell-renderer-OmvrkUeN.js → link-cell-renderer-DKMgD-2v.js} +4 -4
- package/dist/_chunks/{link-cell-renderer-OmvrkUeN.js.map → link-cell-renderer-DKMgD-2v.js.map} +1 -1
- package/dist/_chunks/{locale-picker-B1NAHW4U.js → locale-picker-C86h8Yt1.js} +2 -2
- package/dist/_chunks/{locale-picker-B1NAHW4U.js.map → locale-picker-C86h8Yt1.js.map} +1 -1
- package/dist/_chunks/{login-dev-card-DcfcFJrm.js → login-dev-card-D5BV5j1i.js} +4 -4
- package/dist/_chunks/{login-dev-card-DcfcFJrm.js.map → login-dev-card-D5BV5j1i.js.map} +1 -1
- package/dist/_chunks/{map-view--c9bJDRw.js → map-view-V7etHnyF.js} +2 -2
- package/dist/_chunks/map-view-V7etHnyF.js.map +1 -0
- package/dist/_chunks/{marketplace-app-shell-DDZI-uBl.js → marketplace-app-shell-D2qgIuXX.js} +4 -4
- package/dist/_chunks/{marketplace-app-shell-DDZI-uBl.js.map → marketplace-app-shell-D2qgIuXX.js.map} +1 -1
- package/dist/_chunks/{message-card-B6SduXJv.js → message-card-BzJEITml.js} +2 -2
- package/dist/_chunks/{message-card-B6SduXJv.js.map → message-card-BzJEITml.js.map} +1 -1
- package/dist/_chunks/{message-tray-18_TrLCy.js → message-tray-DiPgJbOb.js} +2 -2
- package/dist/_chunks/{message-tray-18_TrLCy.js.map → message-tray-DiPgJbOb.js.map} +1 -1
- package/dist/_chunks/{multi-select-i5MFRpXg.js → multi-select-Df3R8lv_.js} +30 -30
- package/dist/_chunks/multi-select-Df3R8lv_.js.map +1 -0
- package/dist/_chunks/{navigation-menu-DbaSlvdO.js → navigation-menu-1MrpIVkY.js} +3 -3
- package/dist/_chunks/navigation-menu-1MrpIVkY.js.map +1 -0
- package/dist/_chunks/{notes-panel-DfjF83IK.js → notes-panel-BbNLYcdv.js} +3 -3
- package/dist/_chunks/{notes-panel-DfjF83IK.js.map → notes-panel-BbNLYcdv.js.map} +1 -1
- package/dist/_chunks/{operator-hero-N_ziNGFF.js → operator-hero-BcuPTzS_.js} +2 -2
- package/dist/_chunks/{operator-hero-N_ziNGFF.js.map → operator-hero-BcuPTzS_.js.map} +1 -1
- package/dist/_chunks/{pagination-DvKGrsXu.js → pagination-C7N_NiRN.js} +2 -2
- package/dist/_chunks/{pagination-DvKGrsXu.js.map → pagination-C7N_NiRN.js.map} +1 -1
- package/dist/_chunks/{password-input-BokZ_rnT.js → password-input-SJGHFdOO.js} +2 -2
- package/dist/_chunks/{password-input-BokZ_rnT.js.map → password-input-SJGHFdOO.js.map} +1 -1
- package/dist/_chunks/{patient-details-DGHkAErB.js → patient-details-DoIOWP6j.js} +3 -3
- package/dist/_chunks/{patient-details-DGHkAErB.js.map → patient-details-DoIOWP6j.js.map} +1 -1
- package/dist/_chunks/{patient-field-row-BVK4y98C.js → patient-field-row--dCDO5oB.js} +9 -9
- package/dist/_chunks/{patient-field-row-BVK4y98C.js.map → patient-field-row--dCDO5oB.js.map} +1 -1
- package/dist/_chunks/{patient-search-CL6dtBIq.js → patient-search-DJy0IZSx.js} +2 -2
- package/dist/_chunks/{patient-search-CL6dtBIq.js.map → patient-search-DJy0IZSx.js.map} +1 -1
- package/dist/_chunks/{patient-summary-card-DXz07c2X.js → patient-summary-card-CL04aq8h.js} +3 -3
- package/dist/_chunks/{patient-summary-card-DXz07c2X.js.map → patient-summary-card-CL04aq8h.js.map} +1 -1
- package/dist/_chunks/{payment-automation-upsell-CZk6f8aK.js → payment-automation-upsell-BPF0c-5D.js} +2 -2
- package/dist/_chunks/{payment-automation-upsell-CZk6f8aK.js.map → payment-automation-upsell-BPF0c-5D.js.map} +1 -1
- package/dist/_chunks/{pdf-viewer-gAsNUsA8.js → pdf-viewer-DlceXkfW.js} +267 -286
- package/dist/_chunks/pdf-viewer-DlceXkfW.js.map +1 -0
- package/dist/_chunks/{phone-input-DJ4BN8tG.js → phone-input-BL8Sj6OG.js} +3 -3
- package/dist/_chunks/phone-input-BL8Sj6OG.js.map +1 -0
- package/dist/_chunks/{postal-code-input-CfZOnIkW.js → postal-code-input-dJdSAVkP.js} +2 -2
- package/dist/_chunks/{postal-code-input-CfZOnIkW.js.map → postal-code-input-dJdSAVkP.js.map} +1 -1
- package/dist/_chunks/{practice-profile-hero-DKmnB-M0.js → practice-profile-hero-B8vykoci.js} +2 -2
- package/dist/_chunks/{practice-profile-hero-DKmnB-M0.js.map → practice-profile-hero-B8vykoci.js.map} +1 -1
- package/dist/_chunks/{practice-results-ZOVlrb43.js → practice-results-U-5kpnJa.js} +3 -3
- package/dist/_chunks/{practice-results-ZOVlrb43.js.map → practice-results-U-5kpnJa.js.map} +1 -1
- package/dist/_chunks/{province-select-D64whw0m.js → province-select-cVOlwEc5.js} +2 -2
- package/dist/_chunks/{province-select-D64whw0m.js.map → province-select-cVOlwEc5.js.map} +1 -1
- package/dist/_chunks/{public-footer-BiPiU_lk.js → public-footer-t6gx6sjn.js} +163 -152
- package/dist/_chunks/public-footer-t6gx6sjn.js.map +1 -0
- package/dist/_chunks/{registration-form-K4j2tdLt.js → registration-form-JzzTomhd.js} +5 -5
- package/dist/_chunks/{registration-form-K4j2tdLt.js.map → registration-form-JzzTomhd.js.map} +1 -1
- package/dist/_chunks/{reserved.agent-TRbKB39d.js → reserved.agent-CB-92Vi9.js} +8 -8
- package/dist/_chunks/{reserved.agent-TRbKB39d.js.map → reserved.agent-CB-92Vi9.js.map} +1 -1
- package/dist/_chunks/{reset-password-form-C6XLV7SI.js → reset-password-form-DDdGEoIL.js} +3 -3
- package/dist/_chunks/{reset-password-form-C6XLV7SI.js.map → reset-password-form-DDdGEoIL.js.map} +1 -1
- package/dist/_chunks/{rich-text-editor-CJfT08It.js → rich-text-editor-F04przIt.js} +2 -2
- package/dist/_chunks/{rich-text-editor-CJfT08It.js.map → rich-text-editor-F04przIt.js.map} +1 -1
- package/dist/_chunks/{search-bar-mA4bPe3t.js → search-bar-CQ9_V3EJ.js} +2 -2
- package/dist/_chunks/{search-bar-mA4bPe3t.js.map → search-bar-CQ9_V3EJ.js.map} +1 -1
- package/dist/_chunks/{search-input-BAlDd05M.js → search-input-CRAMo1CA.js} +2 -2
- package/dist/_chunks/{search-input-BAlDd05M.js.map → search-input-CRAMo1CA.js.map} +1 -1
- package/dist/_chunks/{send-registration-link-form-yLSfcaPk.js → send-registration-link-form-DHCQpA4C.js} +3 -3
- package/dist/_chunks/{send-registration-link-form-yLSfcaPk.js.map → send-registration-link-form-DHCQpA4C.js.map} +1 -1
- package/dist/_chunks/{sidebar-BS24EnYd.js → sidebar-2VsPlNkZ.js} +3 -3
- package/dist/_chunks/sidebar-2VsPlNkZ.js.map +1 -0
- package/dist/_chunks/{sign-document-BiOTs1P4.js → sign-document-B5qZhthO.js} +10 -10
- package/dist/_chunks/sign-document-B5qZhthO.js.map +1 -0
- package/dist/_chunks/{signature-capture-Chqh62Pc.js → signature-capture-BJc7kfqi.js} +2 -2
- package/dist/_chunks/signature-capture-BJc7kfqi.js.map +1 -0
- package/dist/_chunks/{signature-field-Y01UB5DA.js → signature-field-DjabvRZm.js} +28 -34
- package/dist/_chunks/{signature-field-Y01UB5DA.js.map → signature-field-DjabvRZm.js.map} +1 -1
- package/dist/_chunks/{signature-request-CLtMgQKi.js → signature-request-CQ0torGq.js} +2 -2
- package/dist/_chunks/{signature-request-CLtMgQKi.js.map → signature-request-CQ0torGq.js.map} +1 -1
- package/dist/_chunks/{signed-out-frame-CRwVTCjY.js → signed-out-frame-BcQE00H1.js} +2 -2
- package/dist/_chunks/{signed-out-frame-CRwVTCjY.js.map → signed-out-frame-BcQE00H1.js.map} +1 -1
- package/dist/_chunks/{stat-Dno2ZihS.js → stat-BFKZV50y.js} +137 -117
- package/dist/_chunks/stat-BFKZV50y.js.map +1 -0
- package/dist/_chunks/{state-backed-text-input-Cgh4ms3p.js → state-backed-text-input-DVETOhSS.js} +2 -2
- package/dist/_chunks/{state-backed-text-input-Cgh4ms3p.js.map → state-backed-text-input-DVETOhSS.js.map} +1 -1
- package/dist/_chunks/{stepper-accordion-DDTSOUHc.js → stepper-accordion-CYjrmRte.js} +44 -44
- package/dist/_chunks/stepper-accordion-CYjrmRte.js.map +1 -0
- package/dist/_chunks/{task-editor-qXfMbHsy.js → task-editor-BiPGFXtB.js} +3 -3
- package/dist/_chunks/{task-editor-qXfMbHsy.js.map → task-editor-BiPGFXtB.js.map} +1 -1
- package/dist/_chunks/{text-input-CaG9ApoE.js → text-input-B6iAgCr3.js} +2 -2
- package/dist/_chunks/{text-input-CaG9ApoE.js.map → text-input-B6iAgCr3.js.map} +1 -1
- package/dist/_chunks/{timeline-B32dylRJ.js → timeline-tn5QQJdS.js} +2 -2
- package/dist/_chunks/{timeline-B32dylRJ.js.map → timeline-tn5QQJdS.js.map} +1 -1
- package/dist/_chunks/{transcript-panel-CoHHpcFg.js → transcript-panel-A781Pkzr.js} +2 -2
- package/dist/_chunks/{transcript-panel-CoHHpcFg.js.map → transcript-panel-A781Pkzr.js.map} +1 -1
- package/dist/_chunks/{use-appointment-details-read-UXXvBeGZ.js → use-appointment-details-read-BbIoPWO6.js} +5 -5
- package/dist/_chunks/{use-appointment-details-read-UXXvBeGZ.js.map → use-appointment-details-read-BbIoPWO6.js.map} +1 -1
- package/dist/_chunks/{widget-picker-B9HpT2Tb.js → widget-picker-DNYIqRT1.js} +2 -2
- package/dist/_chunks/{widget-picker-B9HpT2Tb.js.map → widget-picker-DNYIqRT1.js.map} +1 -1
- package/dist/_chunks/{workflow-map-flsvqQ3L.js → workflow-map-k-dQkpe7.js} +20 -20
- package/dist/_chunks/{workflow-map-flsvqQ3L.js.map → workflow-map-k-dQkpe7.js.map} +1 -1
- package/dist/_chunks/{workflow-status-HQ6ziE46.js → workflow-status-9wb7iWUd.js} +2 -2
- package/dist/_chunks/{workflow-status-HQ6ziE46.js.map → workflow-status-9wb7iWUd.js.map} +1 -1
- package/dist/_chunks/{workflow-webhook-action-BD-6UyOs.js → workflow-webhook-action-B_52rH7O.js} +3 -3
- package/dist/_chunks/{workflow-webhook-action-BD-6UyOs.js.map → workflow-webhook-action-B_52rH7O.js.map} +1 -1
- package/dist/agent-catalog.json +1 -1
- package/dist/components/_shared/input-surface.d.ts +3 -3
- package/dist/components/address-autocomplete/index.js +1 -1
- package/dist/components/address-fields/index.js +1 -1
- package/dist/components/agenda-card/index.js +1 -1
- package/dist/components/agenda-tray/index.js +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/aspect-ratio/index.js +1 -1
- package/dist/components/autocomplete/index.js +1 -1
- package/dist/components/avatar/index.js +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/breadcrumb/index.js +1 -1
- package/dist/components/calendar/index.js +1 -1
- package/dist/components/chat-message/index.js +1 -1
- package/dist/components/city-input/index.js +1 -1
- package/dist/components/clinical-note-card/index.js +1 -1
- package/dist/components/combobox/index.js +1 -1
- package/dist/components/command-palette/index.js +1 -1
- package/dist/components/contact-profile-card/index.js +1 -1
- package/dist/components/copy-field/index.js +1 -1
- package/dist/components/country-select/index.js +1 -1
- package/dist/components/data-table/index.js +3 -3
- package/dist/components/data-table-tabs/index.js +1 -1
- package/dist/components/dependent-selector/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/email-input/index.js +1 -1
- package/dist/components/entity-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/fiscal-code-input/index.js +1 -1
- package/dist/components/header-settings/index.js +1 -1
- package/dist/components/heatmap/index.js +1 -1
- package/dist/components/iban-input/index.js +1 -1
- package/dist/components/icon-picker/index.js +1 -1
- package/dist/components/locale-picker/index.js +1 -1
- package/dist/components/map-view/index.js +1 -1
- package/dist/components/message-card/index.js +1 -1
- package/dist/components/message-tray/index.js +1 -1
- package/dist/components/multi-select/index.js +1 -1
- package/dist/components/navigation-menu/index.js +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/operator-hero/index.js +1 -1
- package/dist/components/pagination/index.js +1 -1
- package/dist/components/password-input/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/pdf-viewer/index.js +1 -1
- package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +1 -1
- package/dist/components/phone-input/index.js +1 -1
- package/dist/components/postal-code-input/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/province-select/index.js +1 -1
- package/dist/components/public-footer/index.js +1 -1
- package/dist/components/public-footer/public-footer.d.ts.map +1 -1
- package/dist/components/rich-text-editor/index.js +1 -1
- package/dist/components/search-bar/index.js +1 -1
- package/dist/components/search-input/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-capture/index.js +1 -1
- package/dist/components/signature-field/index.js +1 -1
- package/dist/components/signature-field/signature-field.d.ts.map +1 -1
- package/dist/components/stat/index.js +1 -1
- package/dist/components/stat/stat.d.ts +8 -0
- package/dist/components/stat/stat.d.ts.map +1 -1
- package/dist/components/stepper-accordion/index.js +1 -1
- package/dist/components/task-editor/index.js +1 -1
- package/dist/components/text-input/index.js +1 -1
- package/dist/components/timeline/index.js +1 -1
- package/dist/components/transcript-panel/index.js +1 -1
- package/dist/components/widget-picker/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/components/workflow-status/index.js +1 -1
- package/dist/core.css +1 -1
- package/dist/host-compat.css +13 -1
- package/dist/index.js +88 -88
- 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/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/signed-out-frame/index.js +1 -1
- package/dist/patterns/workflow-webhook-action/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +1 -1
- package/dist/_chunks/aspect-ratio-DeSNzASA.js.map +0 -1
- package/dist/_chunks/avatar-a6042Ox2.js.map +0 -1
- package/dist/_chunks/breadcrumb-Bn29NCnf.js.map +0 -1
- package/dist/_chunks/command-palette-B3dVqm9D.js.map +0 -1
- package/dist/_chunks/contact-profile-card-jBf9U4At.js.map +0 -1
- package/dist/_chunks/copy-field-hgVSc51W.js.map +0 -1
- package/dist/_chunks/document-scanner-BQP0Rqrt.js.map +0 -1
- package/dist/_chunks/map-view--c9bJDRw.js.map +0 -1
- package/dist/_chunks/multi-select-i5MFRpXg.js.map +0 -1
- package/dist/_chunks/navigation-menu-DbaSlvdO.js.map +0 -1
- package/dist/_chunks/pdf-viewer-gAsNUsA8.js.map +0 -1
- package/dist/_chunks/phone-input-DJ4BN8tG.js.map +0 -1
- package/dist/_chunks/public-footer-BiPiU_lk.js.map +0 -1
- package/dist/_chunks/sidebar-BS24EnYd.js.map +0 -1
- package/dist/_chunks/sign-document-BiOTs1P4.js.map +0 -1
- package/dist/_chunks/signature-capture-Chqh62Pc.js.map +0 -1
- package/dist/_chunks/stat-Dno2ZihS.js.map +0 -1
- package/dist/_chunks/stepper-accordion-DDTSOUHc.js.map +0 -1
|
@@ -2,7 +2,7 @@ import { jsxs as t, jsx as e } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef as P, useId as z, useRef as j } from "react";
|
|
3
3
|
import { c as I } from "./index-D2ZczOXr.js";
|
|
4
4
|
import { useTranslation as T } from "react-i18next";
|
|
5
|
-
import { A as V } from "./avatar-
|
|
5
|
+
import { A as V } from "./avatar-BoqdWsNe.js";
|
|
6
6
|
import { B } from "./badge-BUk4RjTS.js";
|
|
7
7
|
import { C as K } from "./card-C85_Ndhb.js";
|
|
8
8
|
import { R as S } from "./rating-CGYpg5dj.js";
|
|
@@ -218,4 +218,4 @@ export {
|
|
|
218
218
|
F as O,
|
|
219
219
|
q as o
|
|
220
220
|
};
|
|
221
|
-
//# sourceMappingURL=operator-hero-
|
|
221
|
+
//# sourceMappingURL=operator-hero-BcuPTzS_.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operator-hero-N_ziNGFF.js","sources":["../../src/components/operator-hero/operator-hero.agent.ts","../../src/components/operator-hero/operator-hero.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { OperatorHeroHandle } from './operator-hero';\n\nexport const operatorHeroAgent: AgentAdapter<OperatorHeroHandle> = {\n id: 'operator-hero',\n // Purely observable hero region — no interactive affordances and no\n // imperative actions on the handle (getName / getHasColor are read-only\n // projections). The previous `view_change` capability had no backing\n // action and is removed.\n capabilities: [],\n state: {\n name: {\n type: 'string',\n descriptionKey: 'ui.agent.operatorHero.state.name',\n description: 'Operator display name currently rendered.',\n read: (handle) => handle.getName(),\n },\n hasColor: {\n type: 'boolean',\n descriptionKey: 'ui.agent.operatorHero.state.hasColor',\n description:\n 'Whether a calendar-colour identity dot is rendered. Structural flag only — never the colour id or any PHI.',\n read: (handle) => handle.getHasColor(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'operator-hero',\n description: 'Marks the OperatorHero 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 useId,\n useRef,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Avatar } from '../avatar/avatar';\nimport { Badge } from '../badge/badge';\nimport { Card } from '../card/card';\nimport { Rating } from '../rating/rating';\nimport { formatRating } from '../_shared/format-number';\nimport { colorIdToToken } from '../_shared/entity-card';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { operatorHeroAgent } from './operator-hero.agent';\n\n/* -------------------------------------------------------------------- */\n/* OperatorHero */\n/* */\n/* The operator-page counterpart to the consumer-side `<PracticeHero>` */\n/* / `<PracticeProfileHero>` pattern. Differences from the practice */\n/* hero (per the spec): */\n/* */\n/* - Avatar instead of a full hero image background */\n/* - Ratings + reviews summary rendered inline */\n/* - Slightly shorter vertically — no cover strip, denser padding */\n/* */\n/* Use case: individual operator profile page (`/dentista/<slug>/ */\n/* operatori/<name>`), pair with `<ContactProfileCard>` below to fill */\n/* in the operator's contact + profession info. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* CVA */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva('ds:w-full ds:text-[color:var(--foreground)]', {\n variants: {\n // Density toggle. Default `comfortable` matches the practice hero's\n // visual weight minus the cover strip. `compact` is for embedded\n // surfaces (booking aside, ROI Dashboard practice panel) where the\n // hero needs to fit in <12rem vertical.\n density: {\n comfortable: '',\n compact: '',\n },\n // Matches the kit's other `surface` props (Booking, ReviewsPanel,\n // ContactProfileCard). `'elevated'` wraps in `<Card>`.\n surface: {\n flat: '',\n elevated: '',\n },\n },\n defaultVariants: {\n density: 'comfortable',\n surface: 'elevated',\n },\n});\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\nexport interface OperatorHeroBadge {\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 OperatorHeroRating {\n /** Mean rating, 0–5. */\n value: number;\n /** Total number of reviews. */\n count: number;\n}\n\nexport interface OperatorHeroHandle {\n getName: () => string;\n /** Structural flag — whether a calendar-colour dot is rendered. No PHI. */\n getHasColor: () => boolean;\n}\n\nexport interface OperatorHeroProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'children'\n> {\n /** Operator's display name. Rendered as the H1 heading. */\n name: string;\n /**\n * Optional calendar-colour identity for the operator. AlfaDocs assigns each\n * operator a numeric colour id; when present, a small colour dot is rendered\n * next to the name, tinted via `colorIdToToken(colorId)` (a `var(--…)` palette\n * token — never a literal). The id itself is a structural identifier, not PHI.\n */\n colorId?: string;\n /** Specialty / tagline subtitle (e.g. \"Dermatologa · 12 anni di esperienza\"). */\n tagline?: string;\n /**\n * Optional photo / avatar URL. The kit always renders an `<Avatar>` —\n * when `imageUrl` is missing the avatar falls back to initials.\n */\n imageUrl?: string;\n /**\n * Text alternative for the photo's `<img>`, for image search and crawlers.\n * Pass the professional's name. Leave it out and the photo stays decorative\n * (`alt=\"\"`), as before. Added in 1.91.0.\n */\n imageAlt?: string;\n /** Rating summary — when present, renders a Rating + numeric breakdown line. */\n rating?: OperatorHeroRating;\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?: OperatorHeroBadge[];\n\n /* ----- Slots ----- */\n\n /**\n * At the inline-end of the name row when the content column is 480px\n * or wider; on its own line above the name, at the inline-start, when\n * narrower. Use for a \"Book with this operator\" `<Button>` or a \"Back to\n * practice\" link.\n */\n actionSlot?: ReactNode;\n\n /* ----- Styling ----- */\n\n /**\n * `comfortable` (default) — matches the practice hero's visual\n * weight minus the cover strip. `compact` halves the vertical\n * padding for embedded surfaces.\n */\n density?: 'comfortable' | 'compact';\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 OperatorHero = forwardRef<HTMLDivElement, OperatorHeroProps>(\n (\n {\n name,\n colorId,\n tagline,\n imageUrl,\n imageAlt,\n rating,\n badges,\n actionSlot,\n density = 'comfortable',\n surface = 'elevated',\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation('ui');\n const headingId = useId();\n const resolvedAriaLabel = ariaLabel ?? t('operatorHero.regionLabel');\n\n // Calendar-colour dot. Tint via 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 hasColor = colorId !== undefined && colorId !== null;\n const dotRef = useRef<HTMLSpanElement>(null);\n\n useAgentRegistration(\n operatorHeroAgent,\n { getName: () => name, getHasColor: () => hasColor },\n id,\n );\n useIsomorphicLayoutEffect(() => {\n const el = dotRef.current;\n if (!el) return;\n if (hasColor) {\n el.style.setProperty('--operator-hero-color', colorIdToToken(colorId));\n } else {\n el.style.removeProperty('--operator-hero-color');\n }\n }, [hasColor, colorId]);\n\n // Same figure as the practice hero's Rating (\"4,9\" in Italian, \"5\"\n // for a whole score), so the visible line, this label and the\n // inner Rating's label all agree.\n const ratingValue = rating\n ? formatRating(rating.value, i18n.language)\n : undefined;\n const ratingLabel = rating\n ? t('operatorHero.ratingLabel', {\n value: ratingValue,\n count: rating.count,\n })\n : undefined;\n\n // Padding scales with density. Comfortable matches the practice\n // hero's `pt-xl pb-md` minus the cover strip; compact halves it.\n const bodyPaddingClass =\n density === 'comfortable'\n ? 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]'\n : 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]';\n\n // Avatar size keys off density: its height. Comfortable = 2xl\n // (128px) to read as the page hero, compact = xl (64px) for embedded\n // use. The 3:4 photo is three quarters as wide.\n const avatarSize = density === 'comfortable' ? '2xl' : 'xl';\n\n // Heading scale tracks density too. Comfortable uses the kit's\n // page-title token; compact drops to title-card so the operator\n // name doesn't dominate an embedded surface.\n const headingClass =\n density === 'comfortable' ? 'type-title-page' : 'type-title-card';\n\n const inner = (\n <div\n className={[\n 'ds:flex ds:items-start ds:gap-[var(--spacing-lg)]',\n bodyPaddingClass,\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n ].join(' ')}\n >\n {/* HTP-6712: the professional's photo is a 3:4 rounded rectangle,\n cropped towards the top so the face stays in. Same height as\n the old circle (128px, compact 64px). */}\n <Avatar\n size={avatarSize}\n shape=\"rounded\"\n ratio=\"3:4\"\n name={name}\n src={imageUrl}\n alt={imageAlt}\n className=\"ds:shrink-0\"\n />\n <div className=\"ds:@container/ohero ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-xs)]\">\n {/* HTP-7126: below 480px of column width the name and an action\n no longer fit side by side, so the action sits on its own\n line above the name, at the start (`order-first`). The DOM\n keeps the heading first at every width, so a screen reader\n hears the same order as before. From 480px the action is back\n at the end of the name row. A container query in px (rem would\n follow the host's root font-size), not a viewport one: the\n hero can sit in a narrow column on a wide screen. From 480px the\n action is capped at half the row, so a long label wraps in\n its half and the name keeps the other half. */}\n <div className=\"ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)] ds:@[480px]/ohero:flex-row ds:@[480px]/ohero:flex-nowrap ds:@[480px]/ohero:gap-[var(--spacing-md)]\">\n <h1\n id={headingId}\n className={`${headingClass} ds:m-0 ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:text-[color:var(--foreground)] ds:@[480px]/ohero:min-w-0 ds:@[480px]/ohero:flex-1`}\n >\n {hasColor ? (\n <span\n ref={dotRef}\n role=\"img\"\n aria-label={t('operatorHero.colorLabel', 'Calendar colour')}\n className=\"ds:inline-block ds:size-[var(--spacing-sm)] ds:shrink-0 ds:rounded-[var(--radius-full)] ds:bg-[var(--operator-hero-color)]\"\n />\n ) : null}\n {/* Practice-written name and tagline keep the direction they\n were typed in. The name gets its own span: `dir` on the\n flex h1 would move the colour dot too. */}\n <span dir=\"auto\">{name}</span>\n </h1>\n {actionSlot ? (\n <div className=\"ds:order-first ds:flex ds:shrink-0 ds:items-center ds:gap-[var(--spacing-xs)] ds:@[480px]/ohero:order-none ds:@[480px]/ohero:ms-auto ds:@[480px]/ohero:min-w-0 ds:@[480px]/ohero:max-w-[50%] ds:@[480px]/ohero:shrink\">\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 // One image with one name (\"4,9 out of 5 stars. Reviews: 7.\"):\n // a name on a div without a role is ignored by screen readers,\n // which then read the stars and \"4,9 · 7\" with no \"reviews\".\n <div\n role=\"img\"\n className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\"\n aria-label={ratingLabel}\n >\n {/* Decorative: the group above carries the one name. */}\n <Rating\n value={rating.value}\n max={5}\n size={density === 'comfortable' ? 'md' : 'sm'}\n decorative\n />\n <span className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {ratingValue} · {rating.count}\n </span>\n </div>\n ) : null}\n {badges && badges.length > 0 ? (\n <div\n role=\"list\"\n className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-2xs)] ds:mt-[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 aria-label={resolvedAriaLabel}\n aria-labelledby={headingId}\n data-component=\"operator-hero\"\n data-component-id={id}\n data-density={density}\n id={id}\n className={rootVariants({ surface, density, className })}\n {...rest}\n >\n {surface === 'elevated' ? (\n <Card variant=\"elevated\">{inner}</Card>\n ) : (\n inner\n )}\n </div>\n );\n },\n);\n\nOperatorHero.displayName = 'OperatorHero';\n\nexport type OperatorHeroDensity = NonNullable<\n VariantProps<typeof rootVariants>['density']\n>;\n"],"names":["operatorHeroAgent","handle","rootVariants","cva","OperatorHero","forwardRef","name","colorId","tagline","imageUrl","imageAlt","rating","badges","actionSlot","density","surface","ariaLabel","id","className","rest","ref","t","i18n","useTranslation","headingId","useId","resolvedAriaLabel","hasColor","dotRef","useRef","useAgentRegistration","useIsomorphicLayoutEffect","el","colorIdToToken","ratingValue","formatRating","ratingLabel","bodyPaddingClass","avatarSize","headingClass","inner","jsxs","jsx","Avatar","Rating","badge","Badge","Card"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"operator-hero-BcuPTzS_.js","sources":["../../src/components/operator-hero/operator-hero.agent.ts","../../src/components/operator-hero/operator-hero.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { OperatorHeroHandle } from './operator-hero';\n\nexport const operatorHeroAgent: AgentAdapter<OperatorHeroHandle> = {\n id: 'operator-hero',\n // Purely observable hero region — no interactive affordances and no\n // imperative actions on the handle (getName / getHasColor are read-only\n // projections). The previous `view_change` capability had no backing\n // action and is removed.\n capabilities: [],\n state: {\n name: {\n type: 'string',\n descriptionKey: 'ui.agent.operatorHero.state.name',\n description: 'Operator display name currently rendered.',\n read: (handle) => handle.getName(),\n },\n hasColor: {\n type: 'boolean',\n descriptionKey: 'ui.agent.operatorHero.state.hasColor',\n description:\n 'Whether a calendar-colour identity dot is rendered. Structural flag only — never the colour id or any PHI.',\n read: (handle) => handle.getHasColor(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'operator-hero',\n description: 'Marks the OperatorHero 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 useId,\n useRef,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Avatar } from '../avatar/avatar';\nimport { Badge } from '../badge/badge';\nimport { Card } from '../card/card';\nimport { Rating } from '../rating/rating';\nimport { formatRating } from '../_shared/format-number';\nimport { colorIdToToken } from '../_shared/entity-card';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { operatorHeroAgent } from './operator-hero.agent';\n\n/* -------------------------------------------------------------------- */\n/* OperatorHero */\n/* */\n/* The operator-page counterpart to the consumer-side `<PracticeHero>` */\n/* / `<PracticeProfileHero>` pattern. Differences from the practice */\n/* hero (per the spec): */\n/* */\n/* - Avatar instead of a full hero image background */\n/* - Ratings + reviews summary rendered inline */\n/* - Slightly shorter vertically — no cover strip, denser padding */\n/* */\n/* Use case: individual operator profile page (`/dentista/<slug>/ */\n/* operatori/<name>`), pair with `<ContactProfileCard>` below to fill */\n/* in the operator's contact + profession info. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* CVA */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva('ds:w-full ds:text-[color:var(--foreground)]', {\n variants: {\n // Density toggle. Default `comfortable` matches the practice hero's\n // visual weight minus the cover strip. `compact` is for embedded\n // surfaces (booking aside, ROI Dashboard practice panel) where the\n // hero needs to fit in <12rem vertical.\n density: {\n comfortable: '',\n compact: '',\n },\n // Matches the kit's other `surface` props (Booking, ReviewsPanel,\n // ContactProfileCard). `'elevated'` wraps in `<Card>`.\n surface: {\n flat: '',\n elevated: '',\n },\n },\n defaultVariants: {\n density: 'comfortable',\n surface: 'elevated',\n },\n});\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\nexport interface OperatorHeroBadge {\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 OperatorHeroRating {\n /** Mean rating, 0–5. */\n value: number;\n /** Total number of reviews. */\n count: number;\n}\n\nexport interface OperatorHeroHandle {\n getName: () => string;\n /** Structural flag — whether a calendar-colour dot is rendered. No PHI. */\n getHasColor: () => boolean;\n}\n\nexport interface OperatorHeroProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'children'\n> {\n /** Operator's display name. Rendered as the H1 heading. */\n name: string;\n /**\n * Optional calendar-colour identity for the operator. AlfaDocs assigns each\n * operator a numeric colour id; when present, a small colour dot is rendered\n * next to the name, tinted via `colorIdToToken(colorId)` (a `var(--…)` palette\n * token — never a literal). The id itself is a structural identifier, not PHI.\n */\n colorId?: string;\n /** Specialty / tagline subtitle (e.g. \"Dermatologa · 12 anni di esperienza\"). */\n tagline?: string;\n /**\n * Optional photo / avatar URL. The kit always renders an `<Avatar>` —\n * when `imageUrl` is missing the avatar falls back to initials.\n */\n imageUrl?: string;\n /**\n * Text alternative for the photo's `<img>`, for image search and crawlers.\n * Pass the professional's name. Leave it out and the photo stays decorative\n * (`alt=\"\"`), as before. Added in 1.91.0.\n */\n imageAlt?: string;\n /** Rating summary — when present, renders a Rating + numeric breakdown line. */\n rating?: OperatorHeroRating;\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?: OperatorHeroBadge[];\n\n /* ----- Slots ----- */\n\n /**\n * At the inline-end of the name row when the content column is 480px\n * or wider; on its own line above the name, at the inline-start, when\n * narrower. Use for a \"Book with this operator\" `<Button>` or a \"Back to\n * practice\" link.\n */\n actionSlot?: ReactNode;\n\n /* ----- Styling ----- */\n\n /**\n * `comfortable` (default) — matches the practice hero's visual\n * weight minus the cover strip. `compact` halves the vertical\n * padding for embedded surfaces.\n */\n density?: 'comfortable' | 'compact';\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 OperatorHero = forwardRef<HTMLDivElement, OperatorHeroProps>(\n (\n {\n name,\n colorId,\n tagline,\n imageUrl,\n imageAlt,\n rating,\n badges,\n actionSlot,\n density = 'comfortable',\n surface = 'elevated',\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation('ui');\n const headingId = useId();\n const resolvedAriaLabel = ariaLabel ?? t('operatorHero.regionLabel');\n\n // Calendar-colour dot. Tint via 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 hasColor = colorId !== undefined && colorId !== null;\n const dotRef = useRef<HTMLSpanElement>(null);\n\n useAgentRegistration(\n operatorHeroAgent,\n { getName: () => name, getHasColor: () => hasColor },\n id,\n );\n useIsomorphicLayoutEffect(() => {\n const el = dotRef.current;\n if (!el) return;\n if (hasColor) {\n el.style.setProperty('--operator-hero-color', colorIdToToken(colorId));\n } else {\n el.style.removeProperty('--operator-hero-color');\n }\n }, [hasColor, colorId]);\n\n // Same figure as the practice hero's Rating (\"4,9\" in Italian, \"5\"\n // for a whole score), so the visible line, this label and the\n // inner Rating's label all agree.\n const ratingValue = rating\n ? formatRating(rating.value, i18n.language)\n : undefined;\n const ratingLabel = rating\n ? t('operatorHero.ratingLabel', {\n value: ratingValue,\n count: rating.count,\n })\n : undefined;\n\n // Padding scales with density. Comfortable matches the practice\n // hero's `pt-xl pb-md` minus the cover strip; compact halves it.\n const bodyPaddingClass =\n density === 'comfortable'\n ? 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]'\n : 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]';\n\n // Avatar size keys off density: its height. Comfortable = 2xl\n // (128px) to read as the page hero, compact = xl (64px) for embedded\n // use. The 3:4 photo is three quarters as wide.\n const avatarSize = density === 'comfortable' ? '2xl' : 'xl';\n\n // Heading scale tracks density too. Comfortable uses the kit's\n // page-title token; compact drops to title-card so the operator\n // name doesn't dominate an embedded surface.\n const headingClass =\n density === 'comfortable' ? 'type-title-page' : 'type-title-card';\n\n const inner = (\n <div\n className={[\n 'ds:flex ds:items-start ds:gap-[var(--spacing-lg)]',\n bodyPaddingClass,\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n ].join(' ')}\n >\n {/* HTP-6712: the professional's photo is a 3:4 rounded rectangle,\n cropped towards the top so the face stays in. Same height as\n the old circle (128px, compact 64px). */}\n <Avatar\n size={avatarSize}\n shape=\"rounded\"\n ratio=\"3:4\"\n name={name}\n src={imageUrl}\n alt={imageAlt}\n className=\"ds:shrink-0\"\n />\n <div className=\"ds:@container/ohero ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-xs)]\">\n {/* HTP-7126: below 480px of column width the name and an action\n no longer fit side by side, so the action sits on its own\n line above the name, at the start (`order-first`). The DOM\n keeps the heading first at every width, so a screen reader\n hears the same order as before. From 480px the action is back\n at the end of the name row. A container query in px (rem would\n follow the host's root font-size), not a viewport one: the\n hero can sit in a narrow column on a wide screen. From 480px the\n action is capped at half the row, so a long label wraps in\n its half and the name keeps the other half. */}\n <div className=\"ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)] ds:@[480px]/ohero:flex-row ds:@[480px]/ohero:flex-nowrap ds:@[480px]/ohero:gap-[var(--spacing-md)]\">\n <h1\n id={headingId}\n className={`${headingClass} ds:m-0 ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:text-[color:var(--foreground)] ds:@[480px]/ohero:min-w-0 ds:@[480px]/ohero:flex-1`}\n >\n {hasColor ? (\n <span\n ref={dotRef}\n role=\"img\"\n aria-label={t('operatorHero.colorLabel', 'Calendar colour')}\n className=\"ds:inline-block ds:size-[var(--spacing-sm)] ds:shrink-0 ds:rounded-[var(--radius-full)] ds:bg-[var(--operator-hero-color)]\"\n />\n ) : null}\n {/* Practice-written name and tagline keep the direction they\n were typed in. The name gets its own span: `dir` on the\n flex h1 would move the colour dot too. */}\n <span dir=\"auto\">{name}</span>\n </h1>\n {actionSlot ? (\n <div className=\"ds:order-first ds:flex ds:shrink-0 ds:items-center ds:gap-[var(--spacing-xs)] ds:@[480px]/ohero:order-none ds:@[480px]/ohero:ms-auto ds:@[480px]/ohero:min-w-0 ds:@[480px]/ohero:max-w-[50%] ds:@[480px]/ohero:shrink\">\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 // One image with one name (\"4,9 out of 5 stars. Reviews: 7.\"):\n // a name on a div without a role is ignored by screen readers,\n // which then read the stars and \"4,9 · 7\" with no \"reviews\".\n <div\n role=\"img\"\n className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\"\n aria-label={ratingLabel}\n >\n {/* Decorative: the group above carries the one name. */}\n <Rating\n value={rating.value}\n max={5}\n size={density === 'comfortable' ? 'md' : 'sm'}\n decorative\n />\n <span className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {ratingValue} · {rating.count}\n </span>\n </div>\n ) : null}\n {badges && badges.length > 0 ? (\n <div\n role=\"list\"\n className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-2xs)] ds:mt-[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 aria-label={resolvedAriaLabel}\n aria-labelledby={headingId}\n data-component=\"operator-hero\"\n data-component-id={id}\n data-density={density}\n id={id}\n className={rootVariants({ surface, density, className })}\n {...rest}\n >\n {surface === 'elevated' ? (\n <Card variant=\"elevated\">{inner}</Card>\n ) : (\n inner\n )}\n </div>\n );\n },\n);\n\nOperatorHero.displayName = 'OperatorHero';\n\nexport type OperatorHeroDensity = NonNullable<\n VariantProps<typeof rootVariants>['density']\n>;\n"],"names":["operatorHeroAgent","handle","rootVariants","cva","OperatorHero","forwardRef","name","colorId","tagline","imageUrl","imageAlt","rating","badges","actionSlot","density","surface","ariaLabel","id","className","rest","ref","t","i18n","useTranslation","headingId","useId","resolvedAriaLabel","hasColor","dotRef","useRef","useAgentRegistration","useIsomorphicLayoutEffect","el","colorIdToToken","ratingValue","formatRating","ratingLabel","bodyPaddingClass","avatarSize","headingClass","inner","jsxs","jsx","Avatar","Rating","badge","Badge","Card"],"mappings":"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"}
|
|
@@ -393,7 +393,7 @@ const ue = [
|
|
|
393
393
|
"ds:text-[var(--foreground)]",
|
|
394
394
|
"ds:min-h-[var(--min-target-size)] ds:min-w-[6rem]",
|
|
395
395
|
"ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]",
|
|
396
|
-
"ds:text-[var(--font-size-sm)]",
|
|
396
|
+
"ds:text-[length:var(--font-size-sm)]",
|
|
397
397
|
"ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid",
|
|
398
398
|
"ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]"
|
|
399
399
|
].join(" "), ve = [
|
|
@@ -488,4 +488,4 @@ export {
|
|
|
488
488
|
me as g,
|
|
489
489
|
ce as p
|
|
490
490
|
};
|
|
491
|
-
//# sourceMappingURL=pagination-
|
|
491
|
+
//# sourceMappingURL=pagination-C7N_NiRN.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination-DvKGrsXu.js","sources":["../../src/components/pagination/pagination.agent.ts","../../src/components/pagination/pagination.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { PaginationHandle } from './pagination';\n\nexport const paginationAgent: AgentAdapter<PaginationHandle> = {\n id: 'pagination',\n capabilities: ['paginate', 'range_navigate'],\n state: {\n currentPage: {\n type: 'number',\n descriptionKey: 'ui.agent.pagination.state.currentPage',\n description: 'Current page index (1-based).',\n read: (handle) => handle.getCurrentPage(),\n },\n totalPages: {\n type: 'number',\n descriptionKey: 'ui.agent.pagination.state.totalPages',\n description: 'Total number of pages.',\n read: (handle) => handle.getTotalPages(),\n },\n },\n actions: {\n go_to_page: {\n safety: 'read',\n argsType: '{ page: number }',\n argsSchema: {\n type: 'object',\n properties: {\n page: {\n type: 'integer',\n minimum: 1,\n description: '1-indexed target page.',\n },\n },\n required: ['page'],\n },\n idempotent: true,\n errors: ['Page is out of range (clamped to [1, totalPages]).'],\n examples: [{ args: { page: 3 } }],\n descriptionKey: 'ui.agent.pagination.actions.goToPage',\n description: 'Navigate to a specific 1-indexed page.',\n invoke: (handle, args: { page: number }) => {\n handle.goToPage(args.page);\n },\n },\n next: {\n safety: 'read',\n descriptionKey: 'ui.agent.pagination.actions.next',\n description: 'Advance to the next page.',\n invoke: (handle) => {\n handle.next();\n },\n },\n previous: {\n safety: 'read',\n descriptionKey: 'ui.agent.pagination.actions.previous',\n description: 'Step back to the previous page.',\n invoke: (handle) => {\n handle.previous();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'pagination' },\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 useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport { MENU_ROW_HIGHLIGHT } from '../_shared/menu-row';\nimport { PopupRegion } from '../_shared/popup-region';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useAgentRegistration } from '../../agent';\nimport { paginationAgent } from './pagination.agent';\nimport * as RadixSelect from '@radix-ui/react-select';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n Ellipsis,\n Check,\n} from 'lucide-react';\n\n/* -------------------------------------------------------------------- */\n/* Sizes */\n/* -------------------------------------------------------------------- */\n\ntype PaginationSize = 'sm' | 'md' | 'lg';\n\nconst buttonBase = [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:border ds:border-transparent',\n 'ds:font-[var(--font-weight-medium)]',\n 'ds:text-[var(--foreground)]',\n 'ds:select-none',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:bg-[var(--muted)]/20',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n 'ds:aria-disabled:cursor-not-allowed ds:aria-disabled:opacity-50',\n].join(' ');\n\nconst paginationButtonVariants = cva(buttonBase, {\n variants: {\n size: {\n sm: 'ds:min-w-[var(--min-target-size)] ds:min-h-[var(--min-target-size)] ds:text-[length:var(--font-size-sm)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n md: 'ds:min-w-[var(--min-target-size)] ds:min-h-[var(--min-target-size)] ds:text-[length:var(--font-size-base)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n lg: 'ds:min-w-[3rem] ds:min-h-[3rem] ds:text-[length:var(--font-size-lg)] ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n },\n active: {\n true: 'ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)] ds:font-[var(--font-weight-bold)] ds:outline ds:outline-1 ds:outline-[var(--primary)] ds:hover:bg-[var(--primary-hover)]',\n false: '',\n },\n },\n defaultVariants: { size: 'md', active: false },\n});\n\n/* -------------------------------------------------------------------- */\n/* Range helper */\n/* -------------------------------------------------------------------- */\n\ntype PageToken = number | 'ellipsis-start' | 'ellipsis-end';\n\nfunction range(start: number, end: number): number[] {\n const out: number[] = [];\n for (let i = start; i <= end; i++) out.push(i);\n return out;\n}\n\nexport function buildPageRange(\n current: number,\n totalPages: number,\n siblingCount = 1,\n boundaryCount = 1,\n): PageToken[] {\n if (totalPages <= 0) return [];\n // Clamp to sensible minima so extreme consumer inputs don't surface\n // ranges like `[1, 3, 5]` with no ellipsis between boundaries.\n siblingCount = Math.max(0, siblingCount);\n boundaryCount = Math.max(1, boundaryCount);\n const totalNumbers = boundaryCount * 2 + siblingCount * 2 + 3;\n if (totalNumbers >= totalPages) return range(1, totalPages);\n\n const startPages = range(1, boundaryCount);\n const endPages = range(totalPages - boundaryCount + 1, totalPages);\n\n const siblingStart = Math.max(\n Math.min(\n current - siblingCount,\n totalPages - boundaryCount - siblingCount * 2 - 1,\n ),\n boundaryCount + 2,\n );\n const siblingEnd = Math.min(\n Math.max(current + siblingCount, boundaryCount + siblingCount * 2 + 2),\n endPages[0] - 2,\n );\n\n const tokens: PageToken[] = [...startPages];\n\n if (siblingStart > boundaryCount + 2) tokens.push('ellipsis-start');\n else if (boundaryCount + 1 < totalPages - boundaryCount)\n tokens.push(boundaryCount + 1);\n\n tokens.push(...range(siblingStart, siblingEnd));\n\n if (siblingEnd < totalPages - boundaryCount - 1) tokens.push('ellipsis-end');\n else if (totalPages - boundaryCount > boundaryCount)\n tokens.push(totalPages - boundaryCount);\n\n tokens.push(...endPages);\n return tokens;\n}\n\n/* -------------------------------------------------------------------- */\n/* Root */\n/* -------------------------------------------------------------------- */\n\n// Curated agent-readiness handle — see pagination.agent.ts.\nexport interface PaginationHandle {\n getCurrentPage: () => number;\n getTotalPages: () => number;\n goToPage: (page: number) => void;\n next: () => void;\n previous: () => void;\n}\n\nexport interface PaginationProps extends ComponentPropsWithoutRef<'nav'> {\n /** Total number of pages. */\n totalPages: number;\n /** Controlled current page (1-indexed). */\n page?: number;\n /** Default current page for uncontrolled use. */\n defaultPage?: number;\n /** Fires when the current page changes. */\n onPageChange?: (page: number) => void;\n /** Siblings shown on either side of the active page. @default 1 */\n siblingCount?: number;\n /** Boundary pages kept at each end. @default 1 */\n boundaryCount?: number;\n /** Visual size. @default 'md' */\n size?: PaginationSize;\n /** Show \"first\"/\"last\" chevrons alongside prev/next. @default false */\n showEndpoints?: boolean;\n /** Horizontal alignment of the pagination within its container. @default 'center' */\n align?: 'start' | 'center' | 'end';\n /** Optional page-size select config. */\n pageSize?: {\n value: number;\n options?: number[];\n onChange: (size: number) => void;\n };\n /** Use `Intl.NumberFormat` for page numbers (Arabic-Indic digits, etc.). */\n useLocaleDigits?: boolean;\n /** Locale override for digit formatting. */\n locale?: string;\n}\n\nconst Pagination = forwardRef<HTMLElement, PaginationProps>(\n (\n {\n totalPages,\n page: controlledPage,\n defaultPage = 1,\n onPageChange,\n siblingCount = 1,\n boundaryCount = 1,\n size = 'md',\n showEndpoints = false,\n align = 'center',\n pageSize,\n useLocaleDigits = false,\n locale,\n className,\n id,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation('ui');\n\n const [currentPageRaw, setCurrentPage] = useControllableState<number>({\n value: controlledPage,\n defaultValue: defaultPage,\n onChange: onPageChange,\n });\n const currentPage = currentPageRaw ?? defaultPage;\n\n useEffect(() => {\n if (controlledPage !== undefined && defaultPage !== 1) {\n console.warn(\n '[Pagination] Both `page` and `defaultPage` were supplied. The `page` prop wins; remove `defaultPage` for controlled usage.',\n );\n }\n }, [controlledPage, defaultPage]);\n\n const handleChange = useCallback(\n (next: number) => {\n const clamped = Math.min(Math.max(next, 1), Math.max(1, totalPages));\n setCurrentPage(clamped);\n },\n [setCurrentPage, totalPages],\n );\n\n const formatNumber = useCallback(\n (n: number) => {\n if (!useLocaleDigits) return String(n);\n try {\n return new Intl.NumberFormat(locale ?? i18n.language).format(n);\n } catch {\n return String(n);\n }\n },\n [i18n.language, locale, useLocaleDigits],\n );\n\n const tokens = useMemo(\n () =>\n buildPageRange(currentPage, totalPages, siblingCount, boundaryCount),\n [currentPage, totalPages, siblingCount, boundaryCount],\n );\n\n const atFirst = currentPage <= 1;\n const atLast = currentPage >= totalPages;\n\n // Agent handle — refs for fresh reads.\n const pageRef = useRef(currentPage);\n useEffect(() => {\n pageRef.current = currentPage;\n }, [currentPage]);\n const totalRef = useRef(totalPages);\n useEffect(() => {\n totalRef.current = totalPages;\n }, [totalPages]);\n\n const agentHandle = useMemo<PaginationHandle>(\n () => ({\n getCurrentPage: () => pageRef.current,\n getTotalPages: () => totalRef.current,\n goToPage: (next) => handleChange(next),\n next: () => handleChange(pageRef.current + 1),\n previous: () => handleChange(pageRef.current - 1),\n }),\n [handleChange],\n );\n useAgentRegistration(paginationAgent, agentHandle, id);\n\n const justifyClass =\n align === 'start'\n ? 'ds:justify-start'\n : align === 'end'\n ? 'ds:justify-end'\n : 'ds:justify-center';\n\n return (\n <nav\n ref={ref}\n aria-label={t('navigation.pagination.label')}\n id={id}\n data-component=\"pagination\"\n data-component-id={id}\n className={[\n 'ds:flex ds:items-center',\n justifyClass,\n 'ds:gap-[var(--spacing-sm)]',\n 'ds:flex-wrap',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n <PaginationList size={size}>\n {showEndpoints ? (\n <PaginationItem>\n <PaginationEndpoint\n type=\"first\"\n size={size}\n disabled={atFirst}\n onClick={() => handleChange(1)}\n />\n </PaginationItem>\n ) : null}\n <PaginationItem>\n <PaginationPrevious\n size={size}\n disabled={atFirst}\n onClick={() => handleChange(currentPage - 1)}\n />\n </PaginationItem>\n {tokens.map((token, i) => {\n if (token === 'ellipsis-start' || token === 'ellipsis-end') {\n return (\n <PaginationItem key={`e-${i}`}>\n <PaginationEllipsis />\n </PaginationItem>\n );\n }\n return (\n <PaginationItem key={`p-${token}`}>\n <PaginationLink\n size={size}\n isActive={token === currentPage}\n aria-label={t('navigation.pagination.pageN', { n: token })}\n onClick={() => handleChange(token)}\n >\n {formatNumber(token)}\n </PaginationLink>\n </PaginationItem>\n );\n })}\n <PaginationItem>\n <PaginationNext\n size={size}\n disabled={atLast}\n onClick={() => handleChange(currentPage + 1)}\n />\n </PaginationItem>\n {showEndpoints ? (\n <PaginationItem>\n <PaginationEndpoint\n type=\"last\"\n size={size}\n disabled={atLast}\n onClick={() => handleChange(totalPages)}\n />\n </PaginationItem>\n ) : null}\n </PaginationList>\n {pageSize ? (\n <PageSizeSelect\n size={size}\n value={pageSize.value}\n options={pageSize.options ?? [10, 25, 50, 100]}\n onChange={pageSize.onChange}\n formatNumber={formatNumber}\n />\n ) : null}\n </nav>\n );\n },\n);\nPagination.displayName = 'Pagination';\n\n/* -------------------------------------------------------------------- */\n/* List + item */\n/* -------------------------------------------------------------------- */\n\nexport interface PaginationListProps extends ComponentPropsWithoutRef<'ul'> {\n size?: PaginationSize;\n}\n\nconst PaginationList = forwardRef<HTMLUListElement, PaginationListProps>(\n ({ children, className, ...rest }, ref) => (\n <ul\n ref={ref}\n className={[\n 'ds:flex ds:items-center',\n 'ds:gap-[var(--spacing-xs)]',\n 'ds:m-0 ds:ps-0',\n 'ds:list-none',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {children}\n </ul>\n ),\n);\nPaginationList.displayName = 'PaginationList';\n\nexport type PaginationItemProps = ComponentPropsWithoutRef<'li'>;\n\nconst PaginationItem = forwardRef<HTMLLIElement, PaginationItemProps>(\n ({ children, className, ...rest }, ref) => (\n <li ref={ref} className={className} {...rest}>\n {children}\n </li>\n ),\n);\nPaginationItem.displayName = 'PaginationItem';\n\n/* -------------------------------------------------------------------- */\n/* Link */\n/* -------------------------------------------------------------------- */\n\nexport interface PaginationLinkProps\n extends\n Omit<ComponentPropsWithoutRef<'button'>, 'size'>,\n VariantProps<typeof paginationButtonVariants> {\n isActive?: boolean;\n size?: PaginationSize;\n}\n\nconst PaginationLink = forwardRef<HTMLButtonElement, PaginationLinkProps>(\n ({ isActive = false, size = 'md', className, children, ...rest }, ref) => (\n <button\n ref={ref}\n type=\"button\"\n aria-current={isActive ? 'page' : undefined}\n className={paginationButtonVariants({\n size,\n active: isActive,\n className,\n })}\n {...rest}\n >\n {children}\n </button>\n ),\n);\nPaginationLink.displayName = 'PaginationLink';\n\n/* -------------------------------------------------------------------- */\n/* Previous / Next / Endpoint buttons */\n/* -------------------------------------------------------------------- */\n\ninterface NavButtonProps {\n size?: PaginationSize;\n disabled?: boolean;\n onClick?: () => void;\n}\n\nconst chevronClasses = 'ds:size-4 ds:rtl:-scale-x-100';\n\nconst PaginationPrevious = forwardRef<HTMLButtonElement, NavButtonProps>(\n ({ size = 'md', disabled, onClick }, ref) => {\n const { t } = useTranslation('ui');\n const label = t('navigation.pagination.previous');\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label={label}\n aria-disabled={disabled || undefined}\n disabled={disabled}\n onClick={onClick}\n className={paginationButtonVariants({ size })}\n >\n <ChevronLeft aria-hidden=\"true\" className={chevronClasses} />\n </button>\n );\n },\n);\nPaginationPrevious.displayName = 'PaginationPrevious';\n\nconst PaginationNext = forwardRef<HTMLButtonElement, NavButtonProps>(\n ({ size = 'md', disabled, onClick }, ref) => {\n const { t } = useTranslation('ui');\n const label = t('navigation.pagination.next');\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label={label}\n aria-disabled={disabled || undefined}\n disabled={disabled}\n onClick={onClick}\n className={paginationButtonVariants({ size })}\n >\n <ChevronRight aria-hidden=\"true\" className={chevronClasses} />\n </button>\n );\n },\n);\nPaginationNext.displayName = 'PaginationNext';\n\ninterface EndpointProps extends NavButtonProps {\n type: 'first' | 'last';\n}\n\nconst PaginationEndpoint = forwardRef<HTMLButtonElement, EndpointProps>(\n ({ type, size = 'md', disabled, onClick }, ref) => {\n const { t } = useTranslation('ui');\n const label =\n type === 'first'\n ? t('navigation.pagination.first')\n : t('navigation.pagination.last');\n const Icon = type === 'first' ? ChevronsLeft : ChevronsRight;\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label={label}\n aria-disabled={disabled || undefined}\n disabled={disabled}\n onClick={onClick}\n className={paginationButtonVariants({ size })}\n >\n <Icon aria-hidden=\"true\" className={chevronClasses} />\n </button>\n );\n },\n);\nPaginationEndpoint.displayName = 'PaginationEndpoint';\n\n/* -------------------------------------------------------------------- */\n/* Ellipsis */\n/* -------------------------------------------------------------------- */\n\nexport type PaginationEllipsisProps = ComponentPropsWithoutRef<'span'>;\n\nconst PaginationEllipsis = forwardRef<HTMLSpanElement, PaginationEllipsisProps>(\n ({ className, ...rest }, ref) => (\n <span\n ref={ref}\n aria-hidden=\"true\"\n role=\"presentation\"\n className={[\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:min-w-[var(--min-target-size)] ds:min-h-[var(--min-target-size)]',\n 'ds:text-[var(--muted-foreground)]',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n <Ellipsis aria-hidden=\"true\" className=\"ds:size-4\" />\n </span>\n ),\n);\nPaginationEllipsis.displayName = 'PaginationEllipsis';\n\n/* -------------------------------------------------------------------- */\n/* Page-size select */\n/* -------------------------------------------------------------------- */\n\ninterface PageSizeSelectProps {\n size: PaginationSize;\n value: number;\n options: number[];\n onChange: (size: number) => void;\n formatNumber: (n: number) => string;\n}\n\n// The trigger is a field: its edge is the 3:1 `--control-border`, like\n// Select's. The listbox below keeps the soft `--border`.\nconst selectTriggerClasses = [\n 'ds:inline-flex ds:items-center ds:justify-between ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-sm)] ds:border ds:border-[color:var(--control-border)] ds:bg-[var(--background)]',\n 'ds:text-[var(--foreground)]',\n 'ds:min-h-[var(--min-target-size)] ds:min-w-[6rem]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:text-[var(--font-size-sm)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n].join(' ');\n\nconst selectContentClasses = [\n 'ds:z-[var(--z-dropdown)] ds:overflow-hidden',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[var(--border)]',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:animate-in ds:fade-in ds:zoom-in-95 ds:motion-reduce:animate-none',\n].join(' ');\n\nconst selectItemClasses = [\n 'ds:relative ds:flex ds:cursor-pointer ds:items-center',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:ps-[var(--spacing-xl)] ds:pe-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:text-[var(--foreground)] ds:outline-none ds:select-none',\n MENU_ROW_HIGHLIGHT.highlighted,\n 'ds:data-[disabled]:pointer-events-none ds:data-[disabled]:opacity-50',\n].join(' ');\n\nfunction PageSizeSelect({\n value,\n options,\n onChange,\n formatNumber,\n}: PageSizeSelectProps) {\n const { t } = useTranslation('ui');\n const labelId = useId();\n const [open, setOpen] = useState(false);\n return (\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span\n id={labelId}\n className=\"type-label ds:text-[var(--muted-foreground)]\"\n >\n {t('navigation.pagination.rowsPerPage')}\n </span>\n <RadixSelect.Root\n value={String(value)}\n onValueChange={(v) => onChange(Number(v))}\n open={open}\n onOpenChange={setOpen}\n >\n <RadixSelect.Trigger\n aria-labelledby={labelId}\n className={selectTriggerClasses}\n >\n <RadixSelect.Value />\n <RadixSelect.Icon asChild>\n <ChevronRight\n aria-hidden=\"true\"\n className=\"ds:size-3 ds:rotate-90\"\n />\n </RadixSelect.Icon>\n </RadixSelect.Trigger>\n <RadixSelect.Portal>\n {/* Named after the label, so axe `region` passes while open. */}\n <PopupRegion open={open}>\n {(popupRef) => (\n <RadixSelect.Content\n ref={popupRef}\n className={selectContentClasses}\n position=\"popper\"\n >\n <RadixSelect.Viewport className=\"ds:p-[var(--spacing-xs)]\">\n {options.map((o) => (\n <RadixSelect.Item\n key={o}\n value={String(o)}\n className={selectItemClasses}\n >\n <RadixSelect.ItemIndicator className=\"ds:absolute ds:inline-flex ds:items-center ds:justify-center ds:start-[var(--spacing-sm)]\">\n <Check aria-hidden=\"true\" className=\"ds:size-3.5\" />\n </RadixSelect.ItemIndicator>\n <RadixSelect.ItemText>\n {formatNumber(o)}\n </RadixSelect.ItemText>\n </RadixSelect.Item>\n ))}\n </RadixSelect.Viewport>\n </RadixSelect.Content>\n )}\n </PopupRegion>\n </RadixSelect.Portal>\n </RadixSelect.Root>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* Exports */\n/* -------------------------------------------------------------------- */\n\nexport {\n Pagination,\n PaginationList,\n PaginationItem,\n PaginationLink,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n};\n"],"names":["paginationAgent","handle","args","buttonBase","paginationButtonVariants","cva","range","start","end","out","i","buildPageRange","current","totalPages","siblingCount","boundaryCount","startPages","endPages","siblingStart","siblingEnd","tokens","Pagination","forwardRef","controlledPage","defaultPage","onPageChange","size","showEndpoints","align","pageSize","useLocaleDigits","locale","className","id","rest","ref","t","i18n","useTranslation","currentPageRaw","setCurrentPage","useControllableState","currentPage","useEffect","handleChange","useCallback","next","clamped","formatNumber","n","useMemo","atFirst","atLast","pageRef","useRef","totalRef","agentHandle","useAgentRegistration","justifyClass","jsxs","PaginationList","PaginationItem","jsx","PaginationEndpoint","PaginationPrevious","token","PaginationEllipsis","PaginationLink","PaginationNext","PageSizeSelect","children","isActive","chevronClasses","disabled","onClick","label","ChevronLeft","ChevronRight","type","Icon","ChevronsLeft","ChevronsRight","Ellipsis","selectTriggerClasses","selectContentClasses","selectItemClasses","MENU_ROW_HIGHLIGHT","value","options","onChange","labelId","useId","open","setOpen","useState","RadixSelect","v","PopupRegion","popupRef","o","Check"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pagination-C7N_NiRN.js","sources":["../../src/components/pagination/pagination.agent.ts","../../src/components/pagination/pagination.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { PaginationHandle } from './pagination';\n\nexport const paginationAgent: AgentAdapter<PaginationHandle> = {\n id: 'pagination',\n capabilities: ['paginate', 'range_navigate'],\n state: {\n currentPage: {\n type: 'number',\n descriptionKey: 'ui.agent.pagination.state.currentPage',\n description: 'Current page index (1-based).',\n read: (handle) => handle.getCurrentPage(),\n },\n totalPages: {\n type: 'number',\n descriptionKey: 'ui.agent.pagination.state.totalPages',\n description: 'Total number of pages.',\n read: (handle) => handle.getTotalPages(),\n },\n },\n actions: {\n go_to_page: {\n safety: 'read',\n argsType: '{ page: number }',\n argsSchema: {\n type: 'object',\n properties: {\n page: {\n type: 'integer',\n minimum: 1,\n description: '1-indexed target page.',\n },\n },\n required: ['page'],\n },\n idempotent: true,\n errors: ['Page is out of range (clamped to [1, totalPages]).'],\n examples: [{ args: { page: 3 } }],\n descriptionKey: 'ui.agent.pagination.actions.goToPage',\n description: 'Navigate to a specific 1-indexed page.',\n invoke: (handle, args: { page: number }) => {\n handle.goToPage(args.page);\n },\n },\n next: {\n safety: 'read',\n descriptionKey: 'ui.agent.pagination.actions.next',\n description: 'Advance to the next page.',\n invoke: (handle) => {\n handle.next();\n },\n },\n previous: {\n safety: 'read',\n descriptionKey: 'ui.agent.pagination.actions.previous',\n description: 'Step back to the previous page.',\n invoke: (handle) => {\n handle.previous();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'pagination' },\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 useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport { MENU_ROW_HIGHLIGHT } from '../_shared/menu-row';\nimport { PopupRegion } from '../_shared/popup-region';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useAgentRegistration } from '../../agent';\nimport { paginationAgent } from './pagination.agent';\nimport * as RadixSelect from '@radix-ui/react-select';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n Ellipsis,\n Check,\n} from 'lucide-react';\n\n/* -------------------------------------------------------------------- */\n/* Sizes */\n/* -------------------------------------------------------------------- */\n\ntype PaginationSize = 'sm' | 'md' | 'lg';\n\nconst buttonBase = [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:border ds:border-transparent',\n 'ds:font-[var(--font-weight-medium)]',\n 'ds:text-[var(--foreground)]',\n 'ds:select-none',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:bg-[var(--muted)]/20',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n 'ds:aria-disabled:cursor-not-allowed ds:aria-disabled:opacity-50',\n].join(' ');\n\nconst paginationButtonVariants = cva(buttonBase, {\n variants: {\n size: {\n sm: 'ds:min-w-[var(--min-target-size)] ds:min-h-[var(--min-target-size)] ds:text-[length:var(--font-size-sm)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n md: 'ds:min-w-[var(--min-target-size)] ds:min-h-[var(--min-target-size)] ds:text-[length:var(--font-size-base)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n lg: 'ds:min-w-[3rem] ds:min-h-[3rem] ds:text-[length:var(--font-size-lg)] ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n },\n active: {\n true: 'ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)] ds:font-[var(--font-weight-bold)] ds:outline ds:outline-1 ds:outline-[var(--primary)] ds:hover:bg-[var(--primary-hover)]',\n false: '',\n },\n },\n defaultVariants: { size: 'md', active: false },\n});\n\n/* -------------------------------------------------------------------- */\n/* Range helper */\n/* -------------------------------------------------------------------- */\n\ntype PageToken = number | 'ellipsis-start' | 'ellipsis-end';\n\nfunction range(start: number, end: number): number[] {\n const out: number[] = [];\n for (let i = start; i <= end; i++) out.push(i);\n return out;\n}\n\nexport function buildPageRange(\n current: number,\n totalPages: number,\n siblingCount = 1,\n boundaryCount = 1,\n): PageToken[] {\n if (totalPages <= 0) return [];\n // Clamp to sensible minima so extreme consumer inputs don't surface\n // ranges like `[1, 3, 5]` with no ellipsis between boundaries.\n siblingCount = Math.max(0, siblingCount);\n boundaryCount = Math.max(1, boundaryCount);\n const totalNumbers = boundaryCount * 2 + siblingCount * 2 + 3;\n if (totalNumbers >= totalPages) return range(1, totalPages);\n\n const startPages = range(1, boundaryCount);\n const endPages = range(totalPages - boundaryCount + 1, totalPages);\n\n const siblingStart = Math.max(\n Math.min(\n current - siblingCount,\n totalPages - boundaryCount - siblingCount * 2 - 1,\n ),\n boundaryCount + 2,\n );\n const siblingEnd = Math.min(\n Math.max(current + siblingCount, boundaryCount + siblingCount * 2 + 2),\n endPages[0] - 2,\n );\n\n const tokens: PageToken[] = [...startPages];\n\n if (siblingStart > boundaryCount + 2) tokens.push('ellipsis-start');\n else if (boundaryCount + 1 < totalPages - boundaryCount)\n tokens.push(boundaryCount + 1);\n\n tokens.push(...range(siblingStart, siblingEnd));\n\n if (siblingEnd < totalPages - boundaryCount - 1) tokens.push('ellipsis-end');\n else if (totalPages - boundaryCount > boundaryCount)\n tokens.push(totalPages - boundaryCount);\n\n tokens.push(...endPages);\n return tokens;\n}\n\n/* -------------------------------------------------------------------- */\n/* Root */\n/* -------------------------------------------------------------------- */\n\n// Curated agent-readiness handle — see pagination.agent.ts.\nexport interface PaginationHandle {\n getCurrentPage: () => number;\n getTotalPages: () => number;\n goToPage: (page: number) => void;\n next: () => void;\n previous: () => void;\n}\n\nexport interface PaginationProps extends ComponentPropsWithoutRef<'nav'> {\n /** Total number of pages. */\n totalPages: number;\n /** Controlled current page (1-indexed). */\n page?: number;\n /** Default current page for uncontrolled use. */\n defaultPage?: number;\n /** Fires when the current page changes. */\n onPageChange?: (page: number) => void;\n /** Siblings shown on either side of the active page. @default 1 */\n siblingCount?: number;\n /** Boundary pages kept at each end. @default 1 */\n boundaryCount?: number;\n /** Visual size. @default 'md' */\n size?: PaginationSize;\n /** Show \"first\"/\"last\" chevrons alongside prev/next. @default false */\n showEndpoints?: boolean;\n /** Horizontal alignment of the pagination within its container. @default 'center' */\n align?: 'start' | 'center' | 'end';\n /** Optional page-size select config. */\n pageSize?: {\n value: number;\n options?: number[];\n onChange: (size: number) => void;\n };\n /** Use `Intl.NumberFormat` for page numbers (Arabic-Indic digits, etc.). */\n useLocaleDigits?: boolean;\n /** Locale override for digit formatting. */\n locale?: string;\n}\n\nconst Pagination = forwardRef<HTMLElement, PaginationProps>(\n (\n {\n totalPages,\n page: controlledPage,\n defaultPage = 1,\n onPageChange,\n siblingCount = 1,\n boundaryCount = 1,\n size = 'md',\n showEndpoints = false,\n align = 'center',\n pageSize,\n useLocaleDigits = false,\n locale,\n className,\n id,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation('ui');\n\n const [currentPageRaw, setCurrentPage] = useControllableState<number>({\n value: controlledPage,\n defaultValue: defaultPage,\n onChange: onPageChange,\n });\n const currentPage = currentPageRaw ?? defaultPage;\n\n useEffect(() => {\n if (controlledPage !== undefined && defaultPage !== 1) {\n console.warn(\n '[Pagination] Both `page` and `defaultPage` were supplied. The `page` prop wins; remove `defaultPage` for controlled usage.',\n );\n }\n }, [controlledPage, defaultPage]);\n\n const handleChange = useCallback(\n (next: number) => {\n const clamped = Math.min(Math.max(next, 1), Math.max(1, totalPages));\n setCurrentPage(clamped);\n },\n [setCurrentPage, totalPages],\n );\n\n const formatNumber = useCallback(\n (n: number) => {\n if (!useLocaleDigits) return String(n);\n try {\n return new Intl.NumberFormat(locale ?? i18n.language).format(n);\n } catch {\n return String(n);\n }\n },\n [i18n.language, locale, useLocaleDigits],\n );\n\n const tokens = useMemo(\n () =>\n buildPageRange(currentPage, totalPages, siblingCount, boundaryCount),\n [currentPage, totalPages, siblingCount, boundaryCount],\n );\n\n const atFirst = currentPage <= 1;\n const atLast = currentPage >= totalPages;\n\n // Agent handle — refs for fresh reads.\n const pageRef = useRef(currentPage);\n useEffect(() => {\n pageRef.current = currentPage;\n }, [currentPage]);\n const totalRef = useRef(totalPages);\n useEffect(() => {\n totalRef.current = totalPages;\n }, [totalPages]);\n\n const agentHandle = useMemo<PaginationHandle>(\n () => ({\n getCurrentPage: () => pageRef.current,\n getTotalPages: () => totalRef.current,\n goToPage: (next) => handleChange(next),\n next: () => handleChange(pageRef.current + 1),\n previous: () => handleChange(pageRef.current - 1),\n }),\n [handleChange],\n );\n useAgentRegistration(paginationAgent, agentHandle, id);\n\n const justifyClass =\n align === 'start'\n ? 'ds:justify-start'\n : align === 'end'\n ? 'ds:justify-end'\n : 'ds:justify-center';\n\n return (\n <nav\n ref={ref}\n aria-label={t('navigation.pagination.label')}\n id={id}\n data-component=\"pagination\"\n data-component-id={id}\n className={[\n 'ds:flex ds:items-center',\n justifyClass,\n 'ds:gap-[var(--spacing-sm)]',\n 'ds:flex-wrap',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n <PaginationList size={size}>\n {showEndpoints ? (\n <PaginationItem>\n <PaginationEndpoint\n type=\"first\"\n size={size}\n disabled={atFirst}\n onClick={() => handleChange(1)}\n />\n </PaginationItem>\n ) : null}\n <PaginationItem>\n <PaginationPrevious\n size={size}\n disabled={atFirst}\n onClick={() => handleChange(currentPage - 1)}\n />\n </PaginationItem>\n {tokens.map((token, i) => {\n if (token === 'ellipsis-start' || token === 'ellipsis-end') {\n return (\n <PaginationItem key={`e-${i}`}>\n <PaginationEllipsis />\n </PaginationItem>\n );\n }\n return (\n <PaginationItem key={`p-${token}`}>\n <PaginationLink\n size={size}\n isActive={token === currentPage}\n aria-label={t('navigation.pagination.pageN', { n: token })}\n onClick={() => handleChange(token)}\n >\n {formatNumber(token)}\n </PaginationLink>\n </PaginationItem>\n );\n })}\n <PaginationItem>\n <PaginationNext\n size={size}\n disabled={atLast}\n onClick={() => handleChange(currentPage + 1)}\n />\n </PaginationItem>\n {showEndpoints ? (\n <PaginationItem>\n <PaginationEndpoint\n type=\"last\"\n size={size}\n disabled={atLast}\n onClick={() => handleChange(totalPages)}\n />\n </PaginationItem>\n ) : null}\n </PaginationList>\n {pageSize ? (\n <PageSizeSelect\n size={size}\n value={pageSize.value}\n options={pageSize.options ?? [10, 25, 50, 100]}\n onChange={pageSize.onChange}\n formatNumber={formatNumber}\n />\n ) : null}\n </nav>\n );\n },\n);\nPagination.displayName = 'Pagination';\n\n/* -------------------------------------------------------------------- */\n/* List + item */\n/* -------------------------------------------------------------------- */\n\nexport interface PaginationListProps extends ComponentPropsWithoutRef<'ul'> {\n size?: PaginationSize;\n}\n\nconst PaginationList = forwardRef<HTMLUListElement, PaginationListProps>(\n ({ children, className, ...rest }, ref) => (\n <ul\n ref={ref}\n className={[\n 'ds:flex ds:items-center',\n 'ds:gap-[var(--spacing-xs)]',\n 'ds:m-0 ds:ps-0',\n 'ds:list-none',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {children}\n </ul>\n ),\n);\nPaginationList.displayName = 'PaginationList';\n\nexport type PaginationItemProps = ComponentPropsWithoutRef<'li'>;\n\nconst PaginationItem = forwardRef<HTMLLIElement, PaginationItemProps>(\n ({ children, className, ...rest }, ref) => (\n <li ref={ref} className={className} {...rest}>\n {children}\n </li>\n ),\n);\nPaginationItem.displayName = 'PaginationItem';\n\n/* -------------------------------------------------------------------- */\n/* Link */\n/* -------------------------------------------------------------------- */\n\nexport interface PaginationLinkProps\n extends\n Omit<ComponentPropsWithoutRef<'button'>, 'size'>,\n VariantProps<typeof paginationButtonVariants> {\n isActive?: boolean;\n size?: PaginationSize;\n}\n\nconst PaginationLink = forwardRef<HTMLButtonElement, PaginationLinkProps>(\n ({ isActive = false, size = 'md', className, children, ...rest }, ref) => (\n <button\n ref={ref}\n type=\"button\"\n aria-current={isActive ? 'page' : undefined}\n className={paginationButtonVariants({\n size,\n active: isActive,\n className,\n })}\n {...rest}\n >\n {children}\n </button>\n ),\n);\nPaginationLink.displayName = 'PaginationLink';\n\n/* -------------------------------------------------------------------- */\n/* Previous / Next / Endpoint buttons */\n/* -------------------------------------------------------------------- */\n\ninterface NavButtonProps {\n size?: PaginationSize;\n disabled?: boolean;\n onClick?: () => void;\n}\n\nconst chevronClasses = 'ds:size-4 ds:rtl:-scale-x-100';\n\nconst PaginationPrevious = forwardRef<HTMLButtonElement, NavButtonProps>(\n ({ size = 'md', disabled, onClick }, ref) => {\n const { t } = useTranslation('ui');\n const label = t('navigation.pagination.previous');\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label={label}\n aria-disabled={disabled || undefined}\n disabled={disabled}\n onClick={onClick}\n className={paginationButtonVariants({ size })}\n >\n <ChevronLeft aria-hidden=\"true\" className={chevronClasses} />\n </button>\n );\n },\n);\nPaginationPrevious.displayName = 'PaginationPrevious';\n\nconst PaginationNext = forwardRef<HTMLButtonElement, NavButtonProps>(\n ({ size = 'md', disabled, onClick }, ref) => {\n const { t } = useTranslation('ui');\n const label = t('navigation.pagination.next');\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label={label}\n aria-disabled={disabled || undefined}\n disabled={disabled}\n onClick={onClick}\n className={paginationButtonVariants({ size })}\n >\n <ChevronRight aria-hidden=\"true\" className={chevronClasses} />\n </button>\n );\n },\n);\nPaginationNext.displayName = 'PaginationNext';\n\ninterface EndpointProps extends NavButtonProps {\n type: 'first' | 'last';\n}\n\nconst PaginationEndpoint = forwardRef<HTMLButtonElement, EndpointProps>(\n ({ type, size = 'md', disabled, onClick }, ref) => {\n const { t } = useTranslation('ui');\n const label =\n type === 'first'\n ? t('navigation.pagination.first')\n : t('navigation.pagination.last');\n const Icon = type === 'first' ? ChevronsLeft : ChevronsRight;\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label={label}\n aria-disabled={disabled || undefined}\n disabled={disabled}\n onClick={onClick}\n className={paginationButtonVariants({ size })}\n >\n <Icon aria-hidden=\"true\" className={chevronClasses} />\n </button>\n );\n },\n);\nPaginationEndpoint.displayName = 'PaginationEndpoint';\n\n/* -------------------------------------------------------------------- */\n/* Ellipsis */\n/* -------------------------------------------------------------------- */\n\nexport type PaginationEllipsisProps = ComponentPropsWithoutRef<'span'>;\n\nconst PaginationEllipsis = forwardRef<HTMLSpanElement, PaginationEllipsisProps>(\n ({ className, ...rest }, ref) => (\n <span\n ref={ref}\n aria-hidden=\"true\"\n role=\"presentation\"\n className={[\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:min-w-[var(--min-target-size)] ds:min-h-[var(--min-target-size)]',\n 'ds:text-[var(--muted-foreground)]',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n <Ellipsis aria-hidden=\"true\" className=\"ds:size-4\" />\n </span>\n ),\n);\nPaginationEllipsis.displayName = 'PaginationEllipsis';\n\n/* -------------------------------------------------------------------- */\n/* Page-size select */\n/* -------------------------------------------------------------------- */\n\ninterface PageSizeSelectProps {\n size: PaginationSize;\n value: number;\n options: number[];\n onChange: (size: number) => void;\n formatNumber: (n: number) => string;\n}\n\n// The trigger is a field: its edge is the 3:1 `--control-border`, like\n// Select's. The listbox below keeps the soft `--border`.\nconst selectTriggerClasses = [\n 'ds:inline-flex ds:items-center ds:justify-between ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-sm)] ds:border ds:border-[color:var(--control-border)] ds:bg-[var(--background)]',\n 'ds:text-[var(--foreground)]',\n 'ds:min-h-[var(--min-target-size)] ds:min-w-[6rem]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:text-[length:var(--font-size-sm)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n].join(' ');\n\nconst selectContentClasses = [\n 'ds:z-[var(--z-dropdown)] ds:overflow-hidden',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[var(--border)]',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:animate-in ds:fade-in ds:zoom-in-95 ds:motion-reduce:animate-none',\n].join(' ');\n\nconst selectItemClasses = [\n 'ds:relative ds:flex ds:cursor-pointer ds:items-center',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:ps-[var(--spacing-xl)] ds:pe-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:text-[var(--foreground)] ds:outline-none ds:select-none',\n MENU_ROW_HIGHLIGHT.highlighted,\n 'ds:data-[disabled]:pointer-events-none ds:data-[disabled]:opacity-50',\n].join(' ');\n\nfunction PageSizeSelect({\n value,\n options,\n onChange,\n formatNumber,\n}: PageSizeSelectProps) {\n const { t } = useTranslation('ui');\n const labelId = useId();\n const [open, setOpen] = useState(false);\n return (\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span\n id={labelId}\n className=\"type-label ds:text-[var(--muted-foreground)]\"\n >\n {t('navigation.pagination.rowsPerPage')}\n </span>\n <RadixSelect.Root\n value={String(value)}\n onValueChange={(v) => onChange(Number(v))}\n open={open}\n onOpenChange={setOpen}\n >\n <RadixSelect.Trigger\n aria-labelledby={labelId}\n className={selectTriggerClasses}\n >\n <RadixSelect.Value />\n <RadixSelect.Icon asChild>\n <ChevronRight\n aria-hidden=\"true\"\n className=\"ds:size-3 ds:rotate-90\"\n />\n </RadixSelect.Icon>\n </RadixSelect.Trigger>\n <RadixSelect.Portal>\n {/* Named after the label, so axe `region` passes while open. */}\n <PopupRegion open={open}>\n {(popupRef) => (\n <RadixSelect.Content\n ref={popupRef}\n className={selectContentClasses}\n position=\"popper\"\n >\n <RadixSelect.Viewport className=\"ds:p-[var(--spacing-xs)]\">\n {options.map((o) => (\n <RadixSelect.Item\n key={o}\n value={String(o)}\n className={selectItemClasses}\n >\n <RadixSelect.ItemIndicator className=\"ds:absolute ds:inline-flex ds:items-center ds:justify-center ds:start-[var(--spacing-sm)]\">\n <Check aria-hidden=\"true\" className=\"ds:size-3.5\" />\n </RadixSelect.ItemIndicator>\n <RadixSelect.ItemText>\n {formatNumber(o)}\n </RadixSelect.ItemText>\n </RadixSelect.Item>\n ))}\n </RadixSelect.Viewport>\n </RadixSelect.Content>\n )}\n </PopupRegion>\n </RadixSelect.Portal>\n </RadixSelect.Root>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* Exports */\n/* -------------------------------------------------------------------- */\n\nexport {\n Pagination,\n PaginationList,\n PaginationItem,\n PaginationLink,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n};\n"],"names":["paginationAgent","handle","args","buttonBase","paginationButtonVariants","cva","range","start","end","out","i","buildPageRange","current","totalPages","siblingCount","boundaryCount","startPages","endPages","siblingStart","siblingEnd","tokens","Pagination","forwardRef","controlledPage","defaultPage","onPageChange","size","showEndpoints","align","pageSize","useLocaleDigits","locale","className","id","rest","ref","t","i18n","useTranslation","currentPageRaw","setCurrentPage","useControllableState","currentPage","useEffect","handleChange","useCallback","next","clamped","formatNumber","n","useMemo","atFirst","atLast","pageRef","useRef","totalRef","agentHandle","useAgentRegistration","justifyClass","jsxs","PaginationList","PaginationItem","jsx","PaginationEndpoint","PaginationPrevious","token","PaginationEllipsis","PaginationLink","PaginationNext","PageSizeSelect","children","isActive","chevronClasses","disabled","onClick","label","ChevronLeft","ChevronRight","type","Icon","ChevronsLeft","ChevronsRight","Ellipsis","selectTriggerClasses","selectContentClasses","selectItemClasses","MENU_ROW_HIGHLIGHT","value","options","onChange","labelId","useId","open","setOpen","useState","RadixSelect","v","PopupRegion","popupRef","o","Check"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { jsxs as p, jsx as a } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef as Me, useContext as Pe, useId as Re, useRef as L, useState as f, useReducer as Ae, useCallback as n, useEffect as Fe, useMemo as _ } from "react";
|
|
3
3
|
import { c as z } from "./index-D2ZczOXr.js";
|
|
4
4
|
import { useTranslation as $e } from "react-i18next";
|
|
5
|
-
import { T as Oe } from "./text-input-
|
|
5
|
+
import { T as Oe } from "./text-input-B6iAgCr3.js";
|
|
6
6
|
import { u as _e, F as Be } from "./form-field-context-DtiROUJV.js";
|
|
7
7
|
import { c as Ce } from "./compose-refs-C0k0tdqF.js";
|
|
8
8
|
import { u as q } from "./use-isomorphic-layout-effect-BGfaCOP1.js";
|
|
@@ -466,4 +466,4 @@ ss.displayName = "PasswordInput";
|
|
|
466
466
|
export {
|
|
467
467
|
ss as P
|
|
468
468
|
};
|
|
469
|
-
//# sourceMappingURL=password-input-
|
|
469
|
+
//# sourceMappingURL=password-input-SJGHFdOO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password-input-BokZ_rnT.js","sources":["../../src/components/password-input/password-input.agent.ts","../../src/components/password-input/password-input.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — PasswordInput. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { PasswordInputHandle } from './password-input';\n\nexport const passwordInputAgent: AgentAdapter<PasswordInputHandle> = {\n id: 'password-input',\n capabilities: ['set_value'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.passwordInput.state.value',\n description:\n 'Current password value. Never log or persist this off-device.',\n read: (handle) => handle.getValue(),\n },\n isEmpty: {\n type: 'boolean',\n descriptionKey: 'ui.agent.passwordInput.state.isEmpty',\n description: 'Whether the input has no value.',\n read: (handle) => handle.getValue() === '',\n },\n isRevealed: {\n type: 'boolean',\n descriptionKey: 'ui.agent.passwordInput.state.isRevealed',\n description: 'Whether the password is currently shown in plain text.',\n read: (handle) => handle.isRevealed(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: string }',\n argsSchema: {\n type: 'object',\n properties: {\n value: {\n type: 'string',\n description:\n 'New password. Sensitive — never log or persist off-device.',\n },\n },\n required: ['value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.passwordInput.actions.setValue',\n description: 'Replace the password value.',\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n clear: {\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.passwordInput.actions.clear',\n description: 'Empty the input. Loses any typed value.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n focus: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.passwordInput.actions.focus',\n description: 'Move keyboard focus to the input.',\n invoke: (handle) => {\n handle.focus();\n },\n },\n toggle_visibility: {\n // Pure ephemeral UI state — flips the mask on/off, no data change.\n safety: 'read',\n descriptionKey: 'ui.agent.passwordInput.actions.toggleVisibility',\n description: 'Toggle between masked and plain-text display.',\n invoke: (handle) => {\n handle.toggleVisibility();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'password-input',\n description: 'Marks the PasswordInput wrapper.',\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 useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useReducer,\n useRef,\n useState,\n type ChangeEvent,\n type CompositionEvent,\n type FocusEvent,\n type KeyboardEvent,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { TriangleAlert, Check, Circle, Eye, EyeOff } from 'lucide-react';\nimport { TextInput, type TextInputProps } from '../text-input';\nimport {\n FormFieldContext,\n useFormField,\n} from '../form-field/form-field-context';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent';\nimport { passwordInputAgent } from './password-input.agent';\n\n/** Agent-readiness curated handle for PasswordInput. */\nexport interface PasswordInputHandle {\n getValue: () => string;\n setValue: (value: string) => void;\n clear: () => void;\n focus: () => void;\n isRevealed: () => boolean;\n toggleVisibility: () => void;\n}\n\ntype Strength = 0 | 1 | 2 | 3;\n\ntype SizeKey = NonNullable<TextInputProps['size']>;\n\nconst iconSizeClassBySize: Record<SizeKey, string> = {\n sm: 'ds:size-4',\n md: 'ds:size-[18px]',\n lg: 'ds:size-5',\n};\n\nconst toggleVariants = cva(\n [\n 'ds:absolute ds:inset-y-0 ds:end-0 ds:ps-2 ds:pe-3',\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:text-muted-foreground ds:hover:text-foreground',\n 'ds:bg-transparent ds:border-0 ds:cursor-pointer',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:min-w-[var(--min-target-size)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n ].join(' '),\n);\n\nconst strengthTrackVariants = cva(\n 'ds:h-1 ds:w-full ds:overflow-hidden ds:rounded-[var(--radius-full)] ds:bg-muted',\n);\n\nconst strengthBarVariants = cva(\n [\n 'ds:h-full ds:rounded-[var(--radius-full)]',\n 'ds:transition-all ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n level: {\n 0: 'ds:w-1/4 ds:bg-destructive',\n 1: 'ds:w-1/2 ds:bg-warning',\n 2: 'ds:w-3/4 ds:bg-success',\n 3: 'ds:w-full ds:bg-success',\n },\n },\n defaultVariants: { level: 0 },\n },\n);\n\nconst strengthLabelByLevel: Record<\n Strength,\n 'weak' | 'fair' | 'good' | 'strong'\n> = {\n 0: 'weak',\n 1: 'fair',\n 2: 'good',\n 3: 'strong',\n};\n\nconst requirementRowVariants = cva(\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-meta',\n {\n variants: {\n met: {\n true: 'ds:text-success',\n false: 'ds:text-muted-foreground',\n },\n },\n defaultVariants: { met: false },\n },\n);\n\n// Sits between a rule and its state in the text a screen reader is given.\nconst REQUIREMENT_STATE_SEPARATOR = ' \\u2014 ';\n\n/** A rule whose state the user's last edit changed. */\ninterface RequirementChange {\n id: string;\n label: string;\n met: boolean;\n}\n\n/**\n * One row in the live requirements checklist. Consumers either build\n * these inline or pull a pre-built set from `usePasswordRequirements`.\n */\nexport interface PasswordRequirement {\n /** Stable id — keyed render + a11y. */\n id: string;\n /** Already-translated label. The consumer owns the wording. */\n label: string;\n /** Predicate against the current value. Pure, runs on every keystroke. */\n test: (value: string) => boolean;\n}\n\nexport interface PasswordInputProps\n extends\n Omit<TextInputProps, 'type' | 'endAdornment' | 'startAdornment'>,\n VariantProps<typeof strengthBarVariants> {\n /** Callback when reveal state changes (for analytics). */\n onRevealChange?: (revealed: boolean) => void;\n /** Show the strength meter below the input. */\n showStrength?: boolean;\n /** Strength score: 0 = weak, 1 = fair, 2 = good, 3 = strong. */\n strength?: Strength;\n /**\n * Live requirements checklist rendered between the input and the\n * strength meter / caps-lock notice. Each row's predicate runs on\n * every keystroke and the row's `data-state` flips between `\"met\"`\n * and `\"unmet\"`. The rule labels describe the input\n * (`aria-describedby`), so the rules are read on focus. When typing\n * changes a rule, a polite live region announces that whole row, rule\n * and state; nothing is announced on mount or when the value changes\n * from outside (the host or an agent). A controlled field is checked\n * against the `value` the host commits.\n *\n * Tip: hoist or `useMemo` the array — inlining it in JSX makes the\n * predicate-results memo bust every render. The kit's\n * `usePasswordRequirements` helper already does this.\n */\n requirements?: ReadonlyArray<PasswordRequirement>;\n /**\n * When `true` AND `strength` is not provided, derive a 0–3 score\n * from the proportion of `requirements` satisfied. Lets consumers\n * get the strength bar \"for free\" once they declare requirements.\n */\n deriveStrength?: boolean;\n /**\n * Autocomplete hint. Defaults to 'current-password'.\n * Use 'new-password' for registration/change-password forms.\n */\n autoComplete?: 'current-password' | 'new-password' | (string & {});\n}\n\nexport const PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\n (\n {\n onRevealChange,\n showStrength = false,\n strength,\n requirements,\n deriveStrength = false,\n autoComplete,\n size = 'md',\n disabled,\n name,\n id,\n onKeyDown,\n onKeyUp,\n onBlur,\n onInput,\n onChange,\n onCompositionStart,\n onCompositionEnd,\n defaultValue,\n value,\n className,\n 'aria-describedby': describedByProp,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const ctx = useFormField();\n const inFormField = useContext(FormFieldContext) !== null;\n const effectiveDisabled = ctx.disabled || disabled;\n const requirementsId = useId();\n\n const innerInputRef = useRef<HTMLInputElement | null>(null);\n const composedRef = composeRefs(ref, innerInputRef);\n\n const [revealed, setRevealed] = useState(false);\n const [capsLock, setCapsLock] = useState(false);\n\n // The DOM input stays uncontrolled even when the host controls the\n // value: React copies a controlled value into the `value` attribute\n // on every render, and a password must never sit in the markup. A\n // host's `value` is written to the DOM property instead (see below).\n const isControlled = value !== undefined;\n const controlledValue = isControlled ? String(value) : undefined;\n\n // Track the value internally so the requirements checklist can\n // re-evaluate its predicates without forcing consumers to lift the\n // input into controlled state. A controlled caller's `value` wins: the\n // rules are checked against what the host committed, not what was\n // typed, so a host that rejects or rewrites an edit stays in step.\n const [internalValue, setInternalValue] = useState<string>(() =>\n typeof defaultValue === 'string' ? defaultValue : '',\n );\n const currentValue = controlledValue ?? internalValue;\n\n // As React does for a controlled input, put the host's value in the DOM\n // after every render (so a silent password-manager fill is emptied), but\n // not mid-composition: the host has not been told of that edit yet.\n // Each onChange asks for a render, so a refused edit is put back.\n const [, requestSync] = useReducer((count: number) => count + 1, 0);\n const composingRef = useRef(false);\n useIsomorphicLayoutEffect(() => {\n const node = innerInputRef.current;\n if (\n node &&\n controlledValue !== undefined &&\n !composingRef.current &&\n node.value !== controlledValue\n ) {\n // A plain assignment keeps React's change tracking in step.\n node.value = controlledValue;\n }\n });\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n onChange?.(event);\n if (isControlled) requestSync();\n },\n [isControlled, onChange],\n );\n\n const handleCompositionStart = useCallback(\n (event: CompositionEvent<HTMLInputElement>) => {\n composingRef.current = true;\n onCompositionStart?.(event);\n },\n [onCompositionStart],\n );\n\n // Runs before TextInput reports the finished edit, so the render that\n // edit asks for writes the host's value again.\n const handleCompositionEnd = useCallback(\n (event: CompositionEvent<HTMLInputElement>) => {\n composingRef.current = false;\n onCompositionEnd?.(event);\n },\n [onCompositionEnd],\n );\n\n // `edit` gets a new identity on each real edit. The effect below\n // announces the rules that edit changed; a value that changes any\n // other way (the host, an agent) empties the announcer instead, and\n // removals are not announced.\n const [edit, setEdit] = useState<object | null>(null);\n const handledEditRef = useRef(edit);\n const checkedValueRef = useRef(currentValue);\n const [changes, setChanges] = useState<ReadonlyArray<RequirementChange>>(\n [],\n );\n\n useEffect(() => {\n const typed = edit !== handledEditRef.current;\n handledEditRef.current = edit;\n const previous = checkedValueRef.current;\n if (currentValue === previous) return;\n checkedValueRef.current = currentValue;\n if (!typed) {\n setChanges((prev) => (prev.length > 0 ? [] : prev));\n return;\n }\n const changed = (requirements ?? []).flatMap((req) => {\n const met = req.test(currentValue);\n return met === req.test(previous)\n ? []\n : [{ id: req.id, label: req.label, met }];\n });\n if (changed.length > 0) setChanges(changed);\n }, [currentValue, edit, requirements]);\n\n // Derive the event type from the `onInput` prop itself so the handler\n // typechecks under both React 18 (`FormEvent`) and React 19 (`InputEvent`)\n // type definitions without pinning to either.\n const handleInput = useCallback(\n (event: Parameters<NonNullable<typeof onInput>>[0]) => {\n setInternalValue(event.currentTarget.value);\n // A person's edit is an InputEvent; an agent or script write\n // dispatches a bare Event, which is not announced.\n if ('inputType' in event.nativeEvent) setEdit({});\n onInput?.(event);\n },\n [onInput],\n );\n\n const writeValueToInput = useCallback((next: string) => {\n const node = innerInputRef.current;\n if (!node) return;\n const prototype = Object.getPrototypeOf(node) as HTMLInputElement;\n const setter = Object.getOwnPropertyDescriptor(prototype, 'value')?.set;\n setter?.call(node, next);\n node.dispatchEvent(new Event('input', { bubbles: true }));\n node.dispatchEvent(new Event('change', { bubbles: true }));\n }, []);\n\n const handleToggle = useCallback(() => {\n setRevealed((prev) => {\n const next = !prev;\n onRevealChange?.(next);\n return next;\n });\n }, [onRevealChange]);\n\n const detectCaps = useCallback((event: KeyboardEvent<HTMLInputElement>) => {\n if (typeof event.getModifierState === 'function') {\n setCapsLock(event.getModifierState('CapsLock'));\n }\n }, []);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n detectCaps(event);\n onKeyDown?.(event);\n },\n [detectCaps, onKeyDown],\n );\n\n const handleKeyUp = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n detectCaps(event);\n onKeyUp?.(event);\n },\n [detectCaps, onKeyUp],\n );\n\n const handleBlur = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n setCapsLock(false);\n // Leave nothing stale behind for a reader browsing the page.\n setChanges((prev) => (prev.length > 0 ? [] : prev));\n onBlur?.(event);\n },\n [onBlur],\n );\n\n const agentHandle = useMemo<PasswordInputHandle>(\n () => ({\n getValue: () => innerInputRef.current?.value ?? '',\n setValue: (next) => writeValueToInput(next),\n clear: () => writeValueToInput(''),\n focus: () => innerInputRef.current?.focus(),\n isRevealed: () => revealed,\n toggleVisibility: () => {\n setRevealed((prev) => {\n const next = !prev;\n onRevealChange?.(next);\n return next;\n });\n },\n }),\n [onRevealChange, revealed, writeValueToInput],\n );\n useAgentRegistration(passwordInputAgent, agentHandle, id);\n\n const iconSizeClass = iconSizeClassBySize[size];\n // One fixed name; `aria-pressed` carries the state. Flipping the name\n // as well would read \"Hide password, pressed\" once it is shown.\n const toggleLabel = t('inputs.password.toggleShow', 'Show password');\n\n // The id the input really has, for the toggle's `aria-controls`: read\n // from the DOM, because outside a FormField and with no `id` TextInput\n // makes its own. The known id covers the first render.\n const [renderedInputId, setRenderedInputId] = useState<string>();\n useIsomorphicLayoutEffect(() => {\n setRenderedInputId(innerInputRef.current?.id || undefined);\n });\n const inputId = renderedInputId ?? id ?? (inFormField ? ctx.id : undefined);\n\n const requirementStateText = (met: boolean) =>\n met\n ? t('inputs.password.requirements.met', 'met')\n : t('inputs.password.requirements.unmet', 'not yet met');\n\n // Evaluate each requirement against the current value. Cheap by\n // construction — predicates are pure regex/length checks supplied\n // by the consumer; the kit doesn't memoise per-row because the\n // map is O(n) over a handful of rules and React would re-render\n // the row anyway when its `data-state` flips.\n const requirementResults = useMemo(\n () =>\n requirements?.map((req) => ({\n ...req,\n met: req.test(currentValue),\n })) ?? null,\n [requirements, currentValue],\n );\n\n // Derive a 0–3 score from the satisfied proportion when the\n // consumer hasn't supplied an explicit `strength`. Formula:\n // `floor((satisfied / total) * 4)`, clamped to 3 so a fully-met\n // checklist matches the explicit \"strong\" level. With zero\n // requirements we fall back to 0 — meaningless on its own but\n // never displayed since `showStrength` is what controls the bar.\n const derivedStrength: Strength = useMemo(() => {\n if (!deriveStrength || !requirementResults?.length) return 0;\n const satisfied = requirementResults.filter((r) => r.met).length;\n const total = requirementResults.length;\n return Math.min(3, Math.floor((satisfied / total) * 4)) as Strength;\n }, [deriveStrength, requirementResults]);\n\n const effectiveStrength: Strength =\n strength !== undefined ? strength : deriveStrength ? derivedStrength : 0;\n const strengthKey = strengthLabelByLevel[effectiveStrength];\n const strengthText = t(\n `inputs.password.strength.${strengthKey}`,\n strengthKey.charAt(0).toUpperCase() + strengthKey.slice(1),\n );\n\n const hasRequirements = Boolean(requirementResults?.length);\n // The input is described by the rule labels only, never their state:\n // NVDA re-reads a focused field's whole description when it changes.\n const requirementLabelId = (index: number) => `${requirementsId}-${index}`;\n // TextInput spreads props last, so a bare `aria-describedby` would\n // replace the FormField's help and error ids: merge them here.\n const describedBy =\n [\n ...new Set(\n [\n ctx.describedBy,\n describedByProp,\n ...(requirementResults ?? []).map((_, index) =>\n requirementLabelId(index),\n ),\n ]\n .join(' ')\n .split(' ')\n .filter(Boolean),\n ),\n ].join(' ') || undefined;\n\n return (\n <div\n data-component=\"password-input\"\n data-component-id={id}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n <div className=\"ds:relative\">\n <TextInput\n ref={composedRef}\n id={id}\n type={revealed ? 'text' : 'password'}\n autoComplete={autoComplete ?? 'current-password'}\n name={name ?? 'password'}\n spellCheck={false}\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n size={size}\n disabled={effectiveDisabled}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n onBlur={handleBlur}\n onInput={handleInput}\n onChange={handleChange}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n defaultValue={isControlled ? undefined : defaultValue}\n endAdornment={\n <span aria-hidden=\"true\" className=\"ds:block ds:size-4\" />\n }\n className={className}\n {...rest}\n aria-describedby={describedBy}\n />\n <button\n type=\"button\"\n aria-pressed={revealed}\n aria-label={toggleLabel}\n // Two password fields give two \"Show password\" buttons: the\n // field's label tells them apart.\n aria-describedby={inFormField ? `${ctx.id}-label` : undefined}\n aria-controls={inputId}\n disabled={effectiveDisabled}\n onClick={handleToggle}\n className={toggleVariants()}\n >\n {revealed ? (\n <EyeOff aria-hidden=\"true\" className={iconSizeClass} />\n ) : (\n <Eye aria-hidden=\"true\" className={iconSizeClass} />\n )}\n </button>\n </div>\n\n {requirementResults && requirementResults.length > 0 ? (\n // `role=\"list\"` / `role=\"listitem\"` are set explicitly even\n // though they're the implicit roles on <ul>/<li> — Safari\n // VoiceOver strips the implicit list role when CSS sets\n // `list-style: none` (which `ds:list-none` does), so the\n // redundancy is load-bearing for AT, not a lint nit.\n //\n // Not a live region. Each label describes the input; the\n // `.ds:sr-only` suffix gives the row's state when the list is\n // read. Changes are announced by the status element below.\n // eslint-disable-next-line jsx-a11y/no-redundant-roles\n <ul\n role=\"list\"\n data-component=\"password-requirements\"\n className=\"ds:list-none ds:m-0 ds:p-0 ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\"\n >\n {requirementResults.map((req, index) => (\n // eslint-disable-next-line jsx-a11y/no-redundant-roles\n <li\n key={req.id}\n role=\"listitem\"\n data-state={req.met ? 'met' : 'unmet'}\n className={requirementRowVariants({ met: req.met })}\n >\n {req.met ? (\n <Check\n aria-hidden=\"true\"\n className=\"ds:size-3.5 ds:text-success ds:shrink-0\"\n />\n ) : (\n <Circle\n aria-hidden=\"true\"\n className=\"ds:size-3.5 ds:shrink-0\"\n />\n )}\n <span id={requirementLabelId(index)}>{req.label}</span>\n <span className=\"ds:sr-only\">\n {REQUIREMENT_STATE_SEPARATOR}\n {requirementStateText(req.met)}\n </span>\n </li>\n ))}\n </ul>\n ) : null}\n\n {hasRequirements ? (\n // Announces the rows the user's last edit changed, each as a\n // whole: one text node per row, so a flip re-reads the rule\n // with its state. Empty until the user types.\n <div\n aria-live=\"polite\"\n data-slot=\"password-requirements-status\"\n className=\"ds:sr-only\"\n >\n {changes.map((change) => (\n <span key={change.id} aria-atomic=\"true\" className=\"ds:block\">\n {`${change.label}${REQUIREMENT_STATE_SEPARATOR}${requirementStateText(change.met)}`}\n </span>\n ))}\n </div>\n ) : null}\n\n {capsLock ? (\n <span\n role=\"status\"\n aria-live=\"polite\"\n className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-meta ds:text-warning\"\n >\n <TriangleAlert aria-hidden=\"true\" className=\"ds:size-3.5\" />\n {t('inputs.password.capsLock', 'Caps Lock is on')}\n </span>\n ) : null}\n\n {showStrength ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <div\n role=\"progressbar\"\n aria-valuenow={effectiveStrength}\n aria-valuemin={0}\n aria-valuemax={3}\n aria-label={t(\n 'inputs.password.strengthLabel',\n 'Password strength',\n )}\n aria-valuetext={strengthText}\n className={strengthTrackVariants()}\n >\n <div\n className={strengthBarVariants({ level: effectiveStrength })}\n />\n </div>\n <span\n aria-hidden=\"true\"\n className=\"type-meta ds:text-muted-foreground\"\n >\n {strengthText}\n </span>\n </div>\n ) : null}\n </div>\n );\n },\n);\n\nPasswordInput.displayName = 'PasswordInput';\n"],"names":["passwordInputAgent","handle","args","iconSizeClassBySize","toggleVariants","cva","strengthTrackVariants","strengthBarVariants","strengthLabelByLevel","requirementRowVariants","REQUIREMENT_STATE_SEPARATOR","PasswordInput","forwardRef","onRevealChange","showStrength","strength","requirements","deriveStrength","autoComplete","size","disabled","name","id","onKeyDown","onKeyUp","onBlur","onInput","onChange","onCompositionStart","onCompositionEnd","defaultValue","value","className","describedByProp","rest","ref","t","useTranslation","ctx","useFormField","inFormField","useContext","FormFieldContext","effectiveDisabled","requirementsId","useId","innerInputRef","useRef","composedRef","composeRefs","revealed","setRevealed","useState","capsLock","setCapsLock","isControlled","controlledValue","internalValue","setInternalValue","currentValue","requestSync","useReducer","count","composingRef","useIsomorphicLayoutEffect","node","handleChange","useCallback","event","handleCompositionStart","handleCompositionEnd","edit","setEdit","handledEditRef","checkedValueRef","changes","setChanges","useEffect","typed","previous","prev","changed","req","met","handleInput","writeValueToInput","next","prototype","setter","_a","handleToggle","detectCaps","handleKeyDown","handleKeyUp","handleBlur","agentHandle","useMemo","useAgentRegistration","iconSizeClass","toggleLabel","renderedInputId","setRenderedInputId","inputId","requirementStateText","requirementResults","derivedStrength","satisfied","r","total","effectiveStrength","strengthKey","strengthText","hasRequirements","requirementLabelId","index","describedBy","_","jsxs","jsx","TextInput","EyeOff","Eye","Check","Circle","change","TriangleAlert"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"password-input-SJGHFdOO.js","sources":["../../src/components/password-input/password-input.agent.ts","../../src/components/password-input/password-input.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — PasswordInput. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { PasswordInputHandle } from './password-input';\n\nexport const passwordInputAgent: AgentAdapter<PasswordInputHandle> = {\n id: 'password-input',\n capabilities: ['set_value'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.passwordInput.state.value',\n description:\n 'Current password value. Never log or persist this off-device.',\n read: (handle) => handle.getValue(),\n },\n isEmpty: {\n type: 'boolean',\n descriptionKey: 'ui.agent.passwordInput.state.isEmpty',\n description: 'Whether the input has no value.',\n read: (handle) => handle.getValue() === '',\n },\n isRevealed: {\n type: 'boolean',\n descriptionKey: 'ui.agent.passwordInput.state.isRevealed',\n description: 'Whether the password is currently shown in plain text.',\n read: (handle) => handle.isRevealed(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: string }',\n argsSchema: {\n type: 'object',\n properties: {\n value: {\n type: 'string',\n description:\n 'New password. Sensitive — never log or persist off-device.',\n },\n },\n required: ['value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.passwordInput.actions.setValue',\n description: 'Replace the password value.',\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n clear: {\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.passwordInput.actions.clear',\n description: 'Empty the input. Loses any typed value.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n focus: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.passwordInput.actions.focus',\n description: 'Move keyboard focus to the input.',\n invoke: (handle) => {\n handle.focus();\n },\n },\n toggle_visibility: {\n // Pure ephemeral UI state — flips the mask on/off, no data change.\n safety: 'read',\n descriptionKey: 'ui.agent.passwordInput.actions.toggleVisibility',\n description: 'Toggle between masked and plain-text display.',\n invoke: (handle) => {\n handle.toggleVisibility();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'password-input',\n description: 'Marks the PasswordInput wrapper.',\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 useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useReducer,\n useRef,\n useState,\n type ChangeEvent,\n type CompositionEvent,\n type FocusEvent,\n type KeyboardEvent,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { TriangleAlert, Check, Circle, Eye, EyeOff } from 'lucide-react';\nimport { TextInput, type TextInputProps } from '../text-input';\nimport {\n FormFieldContext,\n useFormField,\n} from '../form-field/form-field-context';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent';\nimport { passwordInputAgent } from './password-input.agent';\n\n/** Agent-readiness curated handle for PasswordInput. */\nexport interface PasswordInputHandle {\n getValue: () => string;\n setValue: (value: string) => void;\n clear: () => void;\n focus: () => void;\n isRevealed: () => boolean;\n toggleVisibility: () => void;\n}\n\ntype Strength = 0 | 1 | 2 | 3;\n\ntype SizeKey = NonNullable<TextInputProps['size']>;\n\nconst iconSizeClassBySize: Record<SizeKey, string> = {\n sm: 'ds:size-4',\n md: 'ds:size-[18px]',\n lg: 'ds:size-5',\n};\n\nconst toggleVariants = cva(\n [\n 'ds:absolute ds:inset-y-0 ds:end-0 ds:ps-2 ds:pe-3',\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:text-muted-foreground ds:hover:text-foreground',\n 'ds:bg-transparent ds:border-0 ds:cursor-pointer',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:min-w-[var(--min-target-size)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n ].join(' '),\n);\n\nconst strengthTrackVariants = cva(\n 'ds:h-1 ds:w-full ds:overflow-hidden ds:rounded-[var(--radius-full)] ds:bg-muted',\n);\n\nconst strengthBarVariants = cva(\n [\n 'ds:h-full ds:rounded-[var(--radius-full)]',\n 'ds:transition-all ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n level: {\n 0: 'ds:w-1/4 ds:bg-destructive',\n 1: 'ds:w-1/2 ds:bg-warning',\n 2: 'ds:w-3/4 ds:bg-success',\n 3: 'ds:w-full ds:bg-success',\n },\n },\n defaultVariants: { level: 0 },\n },\n);\n\nconst strengthLabelByLevel: Record<\n Strength,\n 'weak' | 'fair' | 'good' | 'strong'\n> = {\n 0: 'weak',\n 1: 'fair',\n 2: 'good',\n 3: 'strong',\n};\n\nconst requirementRowVariants = cva(\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-meta',\n {\n variants: {\n met: {\n true: 'ds:text-success',\n false: 'ds:text-muted-foreground',\n },\n },\n defaultVariants: { met: false },\n },\n);\n\n// Sits between a rule and its state in the text a screen reader is given.\nconst REQUIREMENT_STATE_SEPARATOR = ' \\u2014 ';\n\n/** A rule whose state the user's last edit changed. */\ninterface RequirementChange {\n id: string;\n label: string;\n met: boolean;\n}\n\n/**\n * One row in the live requirements checklist. Consumers either build\n * these inline or pull a pre-built set from `usePasswordRequirements`.\n */\nexport interface PasswordRequirement {\n /** Stable id — keyed render + a11y. */\n id: string;\n /** Already-translated label. The consumer owns the wording. */\n label: string;\n /** Predicate against the current value. Pure, runs on every keystroke. */\n test: (value: string) => boolean;\n}\n\nexport interface PasswordInputProps\n extends\n Omit<TextInputProps, 'type' | 'endAdornment' | 'startAdornment'>,\n VariantProps<typeof strengthBarVariants> {\n /** Callback when reveal state changes (for analytics). */\n onRevealChange?: (revealed: boolean) => void;\n /** Show the strength meter below the input. */\n showStrength?: boolean;\n /** Strength score: 0 = weak, 1 = fair, 2 = good, 3 = strong. */\n strength?: Strength;\n /**\n * Live requirements checklist rendered between the input and the\n * strength meter / caps-lock notice. Each row's predicate runs on\n * every keystroke and the row's `data-state` flips between `\"met\"`\n * and `\"unmet\"`. The rule labels describe the input\n * (`aria-describedby`), so the rules are read on focus. When typing\n * changes a rule, a polite live region announces that whole row, rule\n * and state; nothing is announced on mount or when the value changes\n * from outside (the host or an agent). A controlled field is checked\n * against the `value` the host commits.\n *\n * Tip: hoist or `useMemo` the array — inlining it in JSX makes the\n * predicate-results memo bust every render. The kit's\n * `usePasswordRequirements` helper already does this.\n */\n requirements?: ReadonlyArray<PasswordRequirement>;\n /**\n * When `true` AND `strength` is not provided, derive a 0–3 score\n * from the proportion of `requirements` satisfied. Lets consumers\n * get the strength bar \"for free\" once they declare requirements.\n */\n deriveStrength?: boolean;\n /**\n * Autocomplete hint. Defaults to 'current-password'.\n * Use 'new-password' for registration/change-password forms.\n */\n autoComplete?: 'current-password' | 'new-password' | (string & {});\n}\n\nexport const PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\n (\n {\n onRevealChange,\n showStrength = false,\n strength,\n requirements,\n deriveStrength = false,\n autoComplete,\n size = 'md',\n disabled,\n name,\n id,\n onKeyDown,\n onKeyUp,\n onBlur,\n onInput,\n onChange,\n onCompositionStart,\n onCompositionEnd,\n defaultValue,\n value,\n className,\n 'aria-describedby': describedByProp,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const ctx = useFormField();\n const inFormField = useContext(FormFieldContext) !== null;\n const effectiveDisabled = ctx.disabled || disabled;\n const requirementsId = useId();\n\n const innerInputRef = useRef<HTMLInputElement | null>(null);\n const composedRef = composeRefs(ref, innerInputRef);\n\n const [revealed, setRevealed] = useState(false);\n const [capsLock, setCapsLock] = useState(false);\n\n // The DOM input stays uncontrolled even when the host controls the\n // value: React copies a controlled value into the `value` attribute\n // on every render, and a password must never sit in the markup. A\n // host's `value` is written to the DOM property instead (see below).\n const isControlled = value !== undefined;\n const controlledValue = isControlled ? String(value) : undefined;\n\n // Track the value internally so the requirements checklist can\n // re-evaluate its predicates without forcing consumers to lift the\n // input into controlled state. A controlled caller's `value` wins: the\n // rules are checked against what the host committed, not what was\n // typed, so a host that rejects or rewrites an edit stays in step.\n const [internalValue, setInternalValue] = useState<string>(() =>\n typeof defaultValue === 'string' ? defaultValue : '',\n );\n const currentValue = controlledValue ?? internalValue;\n\n // As React does for a controlled input, put the host's value in the DOM\n // after every render (so a silent password-manager fill is emptied), but\n // not mid-composition: the host has not been told of that edit yet.\n // Each onChange asks for a render, so a refused edit is put back.\n const [, requestSync] = useReducer((count: number) => count + 1, 0);\n const composingRef = useRef(false);\n useIsomorphicLayoutEffect(() => {\n const node = innerInputRef.current;\n if (\n node &&\n controlledValue !== undefined &&\n !composingRef.current &&\n node.value !== controlledValue\n ) {\n // A plain assignment keeps React's change tracking in step.\n node.value = controlledValue;\n }\n });\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n onChange?.(event);\n if (isControlled) requestSync();\n },\n [isControlled, onChange],\n );\n\n const handleCompositionStart = useCallback(\n (event: CompositionEvent<HTMLInputElement>) => {\n composingRef.current = true;\n onCompositionStart?.(event);\n },\n [onCompositionStart],\n );\n\n // Runs before TextInput reports the finished edit, so the render that\n // edit asks for writes the host's value again.\n const handleCompositionEnd = useCallback(\n (event: CompositionEvent<HTMLInputElement>) => {\n composingRef.current = false;\n onCompositionEnd?.(event);\n },\n [onCompositionEnd],\n );\n\n // `edit` gets a new identity on each real edit. The effect below\n // announces the rules that edit changed; a value that changes any\n // other way (the host, an agent) empties the announcer instead, and\n // removals are not announced.\n const [edit, setEdit] = useState<object | null>(null);\n const handledEditRef = useRef(edit);\n const checkedValueRef = useRef(currentValue);\n const [changes, setChanges] = useState<ReadonlyArray<RequirementChange>>(\n [],\n );\n\n useEffect(() => {\n const typed = edit !== handledEditRef.current;\n handledEditRef.current = edit;\n const previous = checkedValueRef.current;\n if (currentValue === previous) return;\n checkedValueRef.current = currentValue;\n if (!typed) {\n setChanges((prev) => (prev.length > 0 ? [] : prev));\n return;\n }\n const changed = (requirements ?? []).flatMap((req) => {\n const met = req.test(currentValue);\n return met === req.test(previous)\n ? []\n : [{ id: req.id, label: req.label, met }];\n });\n if (changed.length > 0) setChanges(changed);\n }, [currentValue, edit, requirements]);\n\n // Derive the event type from the `onInput` prop itself so the handler\n // typechecks under both React 18 (`FormEvent`) and React 19 (`InputEvent`)\n // type definitions without pinning to either.\n const handleInput = useCallback(\n (event: Parameters<NonNullable<typeof onInput>>[0]) => {\n setInternalValue(event.currentTarget.value);\n // A person's edit is an InputEvent; an agent or script write\n // dispatches a bare Event, which is not announced.\n if ('inputType' in event.nativeEvent) setEdit({});\n onInput?.(event);\n },\n [onInput],\n );\n\n const writeValueToInput = useCallback((next: string) => {\n const node = innerInputRef.current;\n if (!node) return;\n const prototype = Object.getPrototypeOf(node) as HTMLInputElement;\n const setter = Object.getOwnPropertyDescriptor(prototype, 'value')?.set;\n setter?.call(node, next);\n node.dispatchEvent(new Event('input', { bubbles: true }));\n node.dispatchEvent(new Event('change', { bubbles: true }));\n }, []);\n\n const handleToggle = useCallback(() => {\n setRevealed((prev) => {\n const next = !prev;\n onRevealChange?.(next);\n return next;\n });\n }, [onRevealChange]);\n\n const detectCaps = useCallback((event: KeyboardEvent<HTMLInputElement>) => {\n if (typeof event.getModifierState === 'function') {\n setCapsLock(event.getModifierState('CapsLock'));\n }\n }, []);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n detectCaps(event);\n onKeyDown?.(event);\n },\n [detectCaps, onKeyDown],\n );\n\n const handleKeyUp = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n detectCaps(event);\n onKeyUp?.(event);\n },\n [detectCaps, onKeyUp],\n );\n\n const handleBlur = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n setCapsLock(false);\n // Leave nothing stale behind for a reader browsing the page.\n setChanges((prev) => (prev.length > 0 ? [] : prev));\n onBlur?.(event);\n },\n [onBlur],\n );\n\n const agentHandle = useMemo<PasswordInputHandle>(\n () => ({\n getValue: () => innerInputRef.current?.value ?? '',\n setValue: (next) => writeValueToInput(next),\n clear: () => writeValueToInput(''),\n focus: () => innerInputRef.current?.focus(),\n isRevealed: () => revealed,\n toggleVisibility: () => {\n setRevealed((prev) => {\n const next = !prev;\n onRevealChange?.(next);\n return next;\n });\n },\n }),\n [onRevealChange, revealed, writeValueToInput],\n );\n useAgentRegistration(passwordInputAgent, agentHandle, id);\n\n const iconSizeClass = iconSizeClassBySize[size];\n // One fixed name; `aria-pressed` carries the state. Flipping the name\n // as well would read \"Hide password, pressed\" once it is shown.\n const toggleLabel = t('inputs.password.toggleShow', 'Show password');\n\n // The id the input really has, for the toggle's `aria-controls`: read\n // from the DOM, because outside a FormField and with no `id` TextInput\n // makes its own. The known id covers the first render.\n const [renderedInputId, setRenderedInputId] = useState<string>();\n useIsomorphicLayoutEffect(() => {\n setRenderedInputId(innerInputRef.current?.id || undefined);\n });\n const inputId = renderedInputId ?? id ?? (inFormField ? ctx.id : undefined);\n\n const requirementStateText = (met: boolean) =>\n met\n ? t('inputs.password.requirements.met', 'met')\n : t('inputs.password.requirements.unmet', 'not yet met');\n\n // Evaluate each requirement against the current value. Cheap by\n // construction — predicates are pure regex/length checks supplied\n // by the consumer; the kit doesn't memoise per-row because the\n // map is O(n) over a handful of rules and React would re-render\n // the row anyway when its `data-state` flips.\n const requirementResults = useMemo(\n () =>\n requirements?.map((req) => ({\n ...req,\n met: req.test(currentValue),\n })) ?? null,\n [requirements, currentValue],\n );\n\n // Derive a 0–3 score from the satisfied proportion when the\n // consumer hasn't supplied an explicit `strength`. Formula:\n // `floor((satisfied / total) * 4)`, clamped to 3 so a fully-met\n // checklist matches the explicit \"strong\" level. With zero\n // requirements we fall back to 0 — meaningless on its own but\n // never displayed since `showStrength` is what controls the bar.\n const derivedStrength: Strength = useMemo(() => {\n if (!deriveStrength || !requirementResults?.length) return 0;\n const satisfied = requirementResults.filter((r) => r.met).length;\n const total = requirementResults.length;\n return Math.min(3, Math.floor((satisfied / total) * 4)) as Strength;\n }, [deriveStrength, requirementResults]);\n\n const effectiveStrength: Strength =\n strength !== undefined ? strength : deriveStrength ? derivedStrength : 0;\n const strengthKey = strengthLabelByLevel[effectiveStrength];\n const strengthText = t(\n `inputs.password.strength.${strengthKey}`,\n strengthKey.charAt(0).toUpperCase() + strengthKey.slice(1),\n );\n\n const hasRequirements = Boolean(requirementResults?.length);\n // The input is described by the rule labels only, never their state:\n // NVDA re-reads a focused field's whole description when it changes.\n const requirementLabelId = (index: number) => `${requirementsId}-${index}`;\n // TextInput spreads props last, so a bare `aria-describedby` would\n // replace the FormField's help and error ids: merge them here.\n const describedBy =\n [\n ...new Set(\n [\n ctx.describedBy,\n describedByProp,\n ...(requirementResults ?? []).map((_, index) =>\n requirementLabelId(index),\n ),\n ]\n .join(' ')\n .split(' ')\n .filter(Boolean),\n ),\n ].join(' ') || undefined;\n\n return (\n <div\n data-component=\"password-input\"\n data-component-id={id}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n <div className=\"ds:relative\">\n <TextInput\n ref={composedRef}\n id={id}\n type={revealed ? 'text' : 'password'}\n autoComplete={autoComplete ?? 'current-password'}\n name={name ?? 'password'}\n spellCheck={false}\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n size={size}\n disabled={effectiveDisabled}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n onBlur={handleBlur}\n onInput={handleInput}\n onChange={handleChange}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n defaultValue={isControlled ? undefined : defaultValue}\n endAdornment={\n <span aria-hidden=\"true\" className=\"ds:block ds:size-4\" />\n }\n className={className}\n {...rest}\n aria-describedby={describedBy}\n />\n <button\n type=\"button\"\n aria-pressed={revealed}\n aria-label={toggleLabel}\n // Two password fields give two \"Show password\" buttons: the\n // field's label tells them apart.\n aria-describedby={inFormField ? `${ctx.id}-label` : undefined}\n aria-controls={inputId}\n disabled={effectiveDisabled}\n onClick={handleToggle}\n className={toggleVariants()}\n >\n {revealed ? (\n <EyeOff aria-hidden=\"true\" className={iconSizeClass} />\n ) : (\n <Eye aria-hidden=\"true\" className={iconSizeClass} />\n )}\n </button>\n </div>\n\n {requirementResults && requirementResults.length > 0 ? (\n // `role=\"list\"` / `role=\"listitem\"` are set explicitly even\n // though they're the implicit roles on <ul>/<li> — Safari\n // VoiceOver strips the implicit list role when CSS sets\n // `list-style: none` (which `ds:list-none` does), so the\n // redundancy is load-bearing for AT, not a lint nit.\n //\n // Not a live region. Each label describes the input; the\n // `.ds:sr-only` suffix gives the row's state when the list is\n // read. Changes are announced by the status element below.\n // eslint-disable-next-line jsx-a11y/no-redundant-roles\n <ul\n role=\"list\"\n data-component=\"password-requirements\"\n className=\"ds:list-none ds:m-0 ds:p-0 ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\"\n >\n {requirementResults.map((req, index) => (\n // eslint-disable-next-line jsx-a11y/no-redundant-roles\n <li\n key={req.id}\n role=\"listitem\"\n data-state={req.met ? 'met' : 'unmet'}\n className={requirementRowVariants({ met: req.met })}\n >\n {req.met ? (\n <Check\n aria-hidden=\"true\"\n className=\"ds:size-3.5 ds:text-success ds:shrink-0\"\n />\n ) : (\n <Circle\n aria-hidden=\"true\"\n className=\"ds:size-3.5 ds:shrink-0\"\n />\n )}\n <span id={requirementLabelId(index)}>{req.label}</span>\n <span className=\"ds:sr-only\">\n {REQUIREMENT_STATE_SEPARATOR}\n {requirementStateText(req.met)}\n </span>\n </li>\n ))}\n </ul>\n ) : null}\n\n {hasRequirements ? (\n // Announces the rows the user's last edit changed, each as a\n // whole: one text node per row, so a flip re-reads the rule\n // with its state. Empty until the user types.\n <div\n aria-live=\"polite\"\n data-slot=\"password-requirements-status\"\n className=\"ds:sr-only\"\n >\n {changes.map((change) => (\n <span key={change.id} aria-atomic=\"true\" className=\"ds:block\">\n {`${change.label}${REQUIREMENT_STATE_SEPARATOR}${requirementStateText(change.met)}`}\n </span>\n ))}\n </div>\n ) : null}\n\n {capsLock ? (\n <span\n role=\"status\"\n aria-live=\"polite\"\n className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-meta ds:text-warning\"\n >\n <TriangleAlert aria-hidden=\"true\" className=\"ds:size-3.5\" />\n {t('inputs.password.capsLock', 'Caps Lock is on')}\n </span>\n ) : null}\n\n {showStrength ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <div\n role=\"progressbar\"\n aria-valuenow={effectiveStrength}\n aria-valuemin={0}\n aria-valuemax={3}\n aria-label={t(\n 'inputs.password.strengthLabel',\n 'Password strength',\n )}\n aria-valuetext={strengthText}\n className={strengthTrackVariants()}\n >\n <div\n className={strengthBarVariants({ level: effectiveStrength })}\n />\n </div>\n <span\n aria-hidden=\"true\"\n className=\"type-meta ds:text-muted-foreground\"\n >\n {strengthText}\n </span>\n </div>\n ) : null}\n </div>\n );\n },\n);\n\nPasswordInput.displayName = 'PasswordInput';\n"],"names":["passwordInputAgent","handle","args","iconSizeClassBySize","toggleVariants","cva","strengthTrackVariants","strengthBarVariants","strengthLabelByLevel","requirementRowVariants","REQUIREMENT_STATE_SEPARATOR","PasswordInput","forwardRef","onRevealChange","showStrength","strength","requirements","deriveStrength","autoComplete","size","disabled","name","id","onKeyDown","onKeyUp","onBlur","onInput","onChange","onCompositionStart","onCompositionEnd","defaultValue","value","className","describedByProp","rest","ref","t","useTranslation","ctx","useFormField","inFormField","useContext","FormFieldContext","effectiveDisabled","requirementsId","useId","innerInputRef","useRef","composedRef","composeRefs","revealed","setRevealed","useState","capsLock","setCapsLock","isControlled","controlledValue","internalValue","setInternalValue","currentValue","requestSync","useReducer","count","composingRef","useIsomorphicLayoutEffect","node","handleChange","useCallback","event","handleCompositionStart","handleCompositionEnd","edit","setEdit","handledEditRef","checkedValueRef","changes","setChanges","useEffect","typed","previous","prev","changed","req","met","handleInput","writeValueToInput","next","prototype","setter","_a","handleToggle","detectCaps","handleKeyDown","handleKeyUp","handleBlur","agentHandle","useMemo","useAgentRegistration","iconSizeClass","toggleLabel","renderedInputId","setRenderedInputId","inputId","requirementStateText","requirementResults","derivedStrength","satisfied","r","total","effectiveStrength","strengthKey","strengthText","hasRequirements","requirementLabelId","index","describedBy","_","jsxs","jsx","TextInput","EyeOff","Eye","Check","Circle","change","TriangleAlert"],"mappings":"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"}
|
|
@@ -2,13 +2,13 @@ import { jsx as e, jsxs as r } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef as X, useId as T, useMemo as Z, Fragment as $ } from "react";
|
|
3
3
|
import { c as j } from "./index-D2ZczOXr.js";
|
|
4
4
|
import { useTranslation as A } from "react-i18next";
|
|
5
|
-
import { A as ee } from "./avatar-
|
|
5
|
+
import { A as ee } from "./avatar-BoqdWsNe.js";
|
|
6
6
|
import { C as f } from "./card-C85_Ndhb.js";
|
|
7
7
|
import { C as ie, b as te, a as se } from "./collapsible-DVPM46bq.js";
|
|
8
8
|
import { D as ae } from "./description-list-BxzDN9o2.js";
|
|
9
9
|
import { P as de } from "./panel-header-CbtlTe85.js";
|
|
10
10
|
import { u as re } from "./registry-DvAUVLHh.js";
|
|
11
|
-
import { u as ne, F as le, r as oe, P as ce } from "./patient-field-row
|
|
11
|
+
import { u as ne, F as le, r as oe, P as ce } from "./patient-field-row--dCDO5oB.js";
|
|
12
12
|
import { C as pe } from "./clipboard-list-rSzfIYZB.js";
|
|
13
13
|
const me = {
|
|
14
14
|
id: "patient-details",
|
|
@@ -368,4 +368,4 @@ export {
|
|
|
368
368
|
ue as P,
|
|
369
369
|
me as p
|
|
370
370
|
};
|
|
371
|
-
//# sourceMappingURL=patient-details-
|
|
371
|
+
//# sourceMappingURL=patient-details-DoIOWP6j.js.map
|