@alfadocs/ui-kit-debug 1.45.0 → 1.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/{actions-cell-renderer-BXBy9c0f.js → actions-cell-renderer-B5m9lwgC.js} +2 -2
- package/dist/_chunks/{actions-cell-renderer-BXBy9c0f.js.map → actions-cell-renderer-B5m9lwgC.js.map} +1 -1
- package/dist/_chunks/ai-credits-notice-xszqOZTC.js +90 -0
- package/dist/_chunks/ai-credits-notice-xszqOZTC.js.map +1 -0
- package/dist/_chunks/ai-credits-notice.agent-C9L7orrP.js +17 -0
- package/dist/_chunks/ai-credits-notice.agent-C9L7orrP.js.map +1 -0
- package/dist/_chunks/{ai-consent-banner-D7I2U-cz.js → ai-permission-notice-D7I2U-cz.js} +1 -1
- package/dist/_chunks/ai-permission-notice-D7I2U-cz.js.map +1 -0
- package/dist/_chunks/ai-sparkle-D23NT8Z_.js +45 -0
- package/dist/_chunks/ai-sparkle-D23NT8Z_.js.map +1 -0
- package/dist/_chunks/{anamnesis-summary-rows-DQUqwWc1.js → anamnesis-summary-rows-DI-UX5r6.js} +2 -2
- package/dist/_chunks/{anamnesis-summary-rows-DQUqwWc1.js.map → anamnesis-summary-rows-DI-UX5r6.js.map} +1 -1
- package/dist/_chunks/{appointment-card-TgR_2GKS.js → appointment-card-DluZy8Iv.js} +2 -2
- package/dist/_chunks/{appointment-card-TgR_2GKS.js.map → appointment-card-DluZy8Iv.js.map} +1 -1
- package/dist/_chunks/{appointment-peek-abiR0T9e.js → appointment-peek-BsfCpiJs.js} +3 -3
- package/dist/_chunks/{appointment-peek-abiR0T9e.js.map → appointment-peek-BsfCpiJs.js.map} +1 -1
- package/dist/_chunks/{appointment-timeline-CCnyUYKz.js → appointment-timeline-Cs5f9viN.js} +3 -3
- package/dist/_chunks/{appointment-timeline-CCnyUYKz.js.map → appointment-timeline-Cs5f9viN.js.map} +1 -1
- package/dist/_chunks/{appointment-tray-N0yEI8UF.js → appointment-tray-CLrGGnKR.js} +2 -2
- package/dist/_chunks/{appointment-tray-N0yEI8UF.js.map → appointment-tray-CLrGGnKR.js.map} +1 -1
- package/dist/_chunks/baby-Dku-Xvg9.js +23 -0
- package/dist/_chunks/baby-Dku-Xvg9.js.map +1 -0
- package/dist/_chunks/{balance-badge-cell-o6LldMUA.js → balance-badge-cell-YGrYdrvR.js} +3 -3
- package/dist/_chunks/{balance-badge-cell-o6LldMUA.js.map → balance-badge-cell-YGrYdrvR.js.map} +1 -1
- package/dist/_chunks/booking-C4MwImkS.js +3362 -0
- package/dist/_chunks/booking-C4MwImkS.js.map +1 -0
- package/dist/_chunks/button-group-CA1tmu39.js +325 -0
- package/dist/_chunks/button-group-CA1tmu39.js.map +1 -0
- package/dist/_chunks/{calendar-U6N0F99w.js → calendar-OzSeTb4V.js} +2 -2
- package/dist/_chunks/{calendar-U6N0F99w.js.map → calendar-OzSeTb4V.js.map} +1 -1
- package/dist/_chunks/{calendar-event-card-DKUnT9Be.js → calendar-event-card-B6N5h1dO.js} +57 -48
- package/dist/_chunks/{calendar-event-card-DKUnT9Be.js.map → calendar-event-card-B6N5h1dO.js.map} +1 -1
- package/dist/_chunks/calendar-workspace-DDnQmiIL.js +12427 -0
- package/dist/_chunks/calendar-workspace-DDnQmiIL.js.map +1 -0
- package/dist/_chunks/{chart-PF2krCZC.js → chart-D8ucl8hH.js} +2 -2
- package/dist/_chunks/{chart-PF2krCZC.js.map → chart-D8ucl8hH.js.map} +1 -1
- package/dist/_chunks/{data-table-CcAx_I1w.js → data-table-DnKOmEVw.js} +2 -2
- package/dist/_chunks/{data-table-CcAx_I1w.js.map → data-table-DnKOmEVw.js.map} +1 -1
- package/dist/_chunks/{editable-currency-cell-renderer-Psb6XKHR.js → editable-currency-cell-renderer-OUkUv7U4.js} +2 -2
- package/dist/_chunks/{editable-currency-cell-renderer-Psb6XKHR.js.map → editable-currency-cell-renderer-OUkUv7U4.js.map} +1 -1
- package/dist/_chunks/{face-scheme-Bm6pe7R8.js → face-scheme-mIhwrQXt.js} +3 -3
- package/dist/_chunks/{face-scheme-Bm6pe7R8.js.map → face-scheme-mIhwrQXt.js.map} +1 -1
- package/dist/_chunks/{file-manager-BfLQxF5t.js → file-manager-DOcJGIx2.js} +4 -4
- package/dist/_chunks/{file-manager-BfLQxF5t.js.map → file-manager-DOcJGIx2.js.map} +1 -1
- package/dist/_chunks/{freemium-paywall-Cz-O9lQD.js → freemium-paywall-BaW5ODc9.js} +2 -2
- package/dist/_chunks/{freemium-paywall-Cz-O9lQD.js.map → freemium-paywall-BaW5ODc9.js.map} +1 -1
- package/dist/_chunks/{header-settings-CTe45iDy.js → header-settings-BEfx_-TF.js} +2 -2
- package/dist/_chunks/{header-settings-CTe45iDy.js.map → header-settings-BEfx_-TF.js.map} +1 -1
- package/dist/_chunks/{help-me-write-templates-GUeEn3Ff.js → help-me-write-templates-DHIwa4xR.js} +205 -199
- package/dist/_chunks/help-me-write-templates-DHIwa4xR.js.map +1 -0
- package/dist/_chunks/{hover-card-BMJBVqIf.js → hover-card-nUae8NPJ.js} +67 -62
- package/dist/_chunks/{hover-card-BMJBVqIf.js.map → hover-card-nUae8NPJ.js.map} +1 -1
- package/dist/_chunks/{icon-button-group-DkkdIygu.js → icon-button-group-DZKC6KGf.js} +181 -168
- package/dist/_chunks/icon-button-group-DZKC6KGf.js.map +1 -0
- package/dist/_chunks/kit-extensions-DuoFF1R3.js +94 -0
- package/dist/_chunks/kit-extensions-DuoFF1R3.js.map +1 -0
- package/dist/_chunks/{marketplace-app-shell-DdwPj03y.js → marketplace-app-shell-PB89Dkk_.js} +2 -2
- package/dist/_chunks/{marketplace-app-shell-DdwPj03y.js.map → marketplace-app-shell-PB89Dkk_.js.map} +1 -1
- package/dist/_chunks/{notes-panel-Dkk9QPPX.js → notes-panel-CHbDDMx8.js} +83 -73
- package/dist/_chunks/notes-panel-CHbDDMx8.js.map +1 -0
- package/dist/_chunks/{patient-details-C8ImUrVg.js → patient-details-yrgkSeEY.js} +2 -2
- package/dist/_chunks/{patient-details-C8ImUrVg.js.map → patient-details-yrgkSeEY.js.map} +1 -1
- package/dist/_chunks/{patient-field-row-BRSOKvme.js → patient-field-row-DCMkFGqI.js} +3 -3
- package/dist/_chunks/patient-field-row-DCMkFGqI.js.map +1 -0
- package/dist/_chunks/{patient-summary-card-BhmKB2KR.js → patient-summary-card-CmEFflGS.js} +59 -45
- package/dist/_chunks/patient-summary-card-CmEFflGS.js.map +1 -0
- package/dist/_chunks/payment-form-DqJFiplX.js +881 -0
- package/dist/_chunks/payment-form-DqJFiplX.js.map +1 -0
- package/dist/_chunks/{phone-input-BsZIoE36.js → phone-input-IWrGOCwm.js} +40 -39
- package/dist/_chunks/{phone-input-BsZIoE36.js.map → phone-input-IWrGOCwm.js.map} +1 -1
- package/dist/_chunks/rich-text-editor-BwDV2XkZ.js +4153 -0
- package/dist/_chunks/rich-text-editor-BwDV2XkZ.js.map +1 -0
- package/dist/_chunks/{stepper-accordion-DmVykr5F.js → stepper-accordion-jMR8NaOB.js} +2 -1
- package/dist/_chunks/{stepper-accordion-DmVykr5F.js.map → stepper-accordion-jMR8NaOB.js.map} +1 -1
- package/dist/_chunks/{tasks-panel-CpcikOeY.js → tasks-panel-DncuBPIZ.js} +2 -2
- package/dist/_chunks/{tasks-panel-CpcikOeY.js.map → tasks-panel-DncuBPIZ.js.map} +1 -1
- package/dist/_chunks/{theme-toggle-bI0pgDDv.js → theme-toggle-BP0XRGMM.js} +2 -2
- package/dist/_chunks/{theme-toggle-bI0pgDDv.js.map → theme-toggle-BP0XRGMM.js.map} +1 -1
- package/dist/_chunks/use-ai-sparkle-Cf4yVTLB.js +76 -0
- package/dist/_chunks/use-ai-sparkle-Cf4yVTLB.js.map +1 -0
- package/dist/_chunks/{workflow-status-xeaJTzD3.js → workflow-status-CuJAOuKL.js} +43 -42
- package/dist/_chunks/{workflow-status-xeaJTzD3.js.map → workflow-status-CuJAOuKL.js.map} +1 -1
- package/dist/agent-catalog.json +36 -7
- package/dist/agent-i18n/en.json +3 -3
- package/dist/components/_shared/field-value.d.ts.map +1 -1
- package/dist/components/ai-credits-notice/ai-credits-notice.agent.d.ts +3 -0
- package/dist/components/ai-credits-notice/ai-credits-notice.agent.d.ts.map +1 -0
- package/dist/components/ai-credits-notice/ai-credits-notice.d.ts +48 -0
- package/dist/components/ai-credits-notice/ai-credits-notice.d.ts.map +1 -0
- package/dist/components/ai-credits-notice/index.d.ts +4 -0
- package/dist/components/ai-credits-notice/index.d.ts.map +1 -0
- package/dist/components/ai-credits-notice/index.js +7 -0
- package/dist/components/ai-credits-notice/index.js.map +1 -0
- package/dist/components/{ai-consent-banner/ai-consent-banner.agent.d.ts → ai-permission-notice/ai-permission-notice.agent.d.ts} +2 -2
- package/dist/components/ai-permission-notice/ai-permission-notice.agent.d.ts.map +1 -0
- package/dist/components/{ai-consent-banner/ai-consent-banner.d.ts → ai-permission-notice/ai-permission-notice.d.ts} +1 -1
- package/dist/components/ai-permission-notice/ai-permission-notice.d.ts.map +1 -0
- package/dist/components/ai-permission-notice/index.d.ts +4 -0
- package/dist/components/ai-permission-notice/index.d.ts.map +1 -0
- package/dist/components/{ai-consent-banner → ai-permission-notice}/index.js +1 -1
- package/dist/components/ai-sparkle/ai-sparkle.d.ts +3 -3
- package/dist/components/ai-sparkle/ai-sparkle.d.ts.map +1 -1
- package/dist/components/ai-sparkle/index.js +1 -1
- package/dist/components/appointment-card/index.js +2 -2
- package/dist/components/appointment-peek/index.js +1 -1
- package/dist/components/appointment-timeline/index.js +1 -1
- package/dist/components/booking/booking-types.d.ts +60 -1
- package/dist/components/booking/booking-types.d.ts.map +1 -1
- package/dist/components/booking/booking.agent.d.ts.map +1 -1
- package/dist/components/booking/booking.d.ts +1 -1
- package/dist/components/booking/booking.d.ts.map +1 -1
- package/dist/components/booking/details-form.d.ts +5 -1
- package/dist/components/booking/details-form.d.ts.map +1 -1
- package/dist/components/booking/index.d.ts +1 -1
- package/dist/components/booking/index.d.ts.map +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/booking/payment.d.ts +9 -0
- package/dist/components/booking/payment.d.ts.map +1 -0
- package/dist/components/booking/use-booking-payment.d.ts +14 -0
- package/dist/components/booking/use-booking-payment.d.ts.map +1 -0
- package/dist/components/button-group/button-group.d.ts.map +1 -1
- package/dist/components/button-group/index.js +1 -1
- package/dist/components/calendar/index.js +1 -1
- package/dist/components/calendar-event-card/calendar-event-card.d.ts.map +1 -1
- package/dist/components/calendar-event-card/index.js +1 -1
- package/dist/components/chart/index.js +1 -1
- package/dist/components/data-table/index.js +3 -3
- package/dist/components/face-scheme/index.js +1 -1
- package/dist/components/file-manager/index.js +1 -1
- package/dist/components/freemium-paywall/index.js +1 -1
- package/dist/components/header-settings/index.js +1 -1
- package/dist/components/hover-card/hover-card.d.ts +4 -0
- package/dist/components/hover-card/hover-card.d.ts.map +1 -1
- package/dist/components/hover-card/index.d.ts +1 -1
- package/dist/components/hover-card/index.d.ts.map +1 -1
- package/dist/components/hover-card/index.js +3 -2
- package/dist/components/icon-button-group/icon-button-group.d.ts.map +1 -1
- package/dist/components/icon-button-group/index.js +1 -1
- package/dist/components/index.d.ts +2 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/notes-panel/notes-panel.d.ts +10 -0
- package/dist/components/notes-panel/notes-panel.d.ts.map +1 -1
- package/dist/components/patient-details/index.js +1 -1
- package/dist/components/patient-summary-card/index.js +1 -1
- package/dist/components/patient-summary-card/patient-summary-card.d.ts.map +1 -1
- package/dist/components/patient-table/index.js +1 -1
- package/dist/components/payment-form/index.d.ts +1 -1
- package/dist/components/payment-form/index.d.ts.map +1 -1
- package/dist/components/payment-form/index.js +1 -1
- package/dist/components/payment-form/payment-form.d.ts +35 -3
- package/dist/components/payment-form/payment-form.d.ts.map +1 -1
- package/dist/components/phone-input/index.js +1 -1
- package/dist/components/phone-input/phone-input.d.ts.map +1 -1
- package/dist/components/rich-text-editor/editor-extensions.d.ts +54 -0
- package/dist/components/rich-text-editor/editor-extensions.d.ts.map +1 -0
- package/dist/components/rich-text-editor/editor-toolbar.d.ts +2 -1
- package/dist/components/rich-text-editor/editor-toolbar.d.ts.map +1 -1
- package/dist/components/rich-text-editor/help-me-write-overlay.d.ts +4 -0
- package/dist/components/rich-text-editor/help-me-write-overlay.d.ts.map +1 -1
- package/dist/components/rich-text-editor/index.d.ts +2 -0
- package/dist/components/rich-text-editor/index.d.ts.map +1 -1
- package/dist/components/rich-text-editor/index.js +6 -4
- package/dist/components/rich-text-editor/index.js.map +1 -1
- package/dist/components/rich-text-editor/kit-extensions.d.ts +4 -0
- package/dist/components/rich-text-editor/kit-extensions.d.ts.map +1 -0
- package/dist/components/rich-text-editor/rich-text-editor.d.ts +18 -2
- package/dist/components/rich-text-editor/rich-text-editor.d.ts.map +1 -1
- package/dist/components/stepper-accordion/index.js +1 -1
- package/dist/components/stepper-accordion/stepper-accordion.d.ts.map +1 -1
- package/dist/components/tasks-panel/index.js +1 -1
- package/dist/components/theme-toggle/index.js +1 -1
- package/dist/components/workflow-status/index.js +1 -1
- package/dist/components/workflow-status/workflow-status.d.ts.map +1 -1
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +51 -53
- package/dist/hooks/use-ai-sparkle.d.ts +7 -25
- package/dist/hooks/use-ai-sparkle.d.ts.map +1 -1
- package/dist/host-compat.css +2 -2
- package/dist/i18n/locales/ar.d.ts +67 -1
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +69 -3
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +67 -1
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +69 -3
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +67 -1
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +69 -3
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +67 -1
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +69 -3
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +67 -1
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +69 -3
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +67 -1
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +69 -3
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +67 -1
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +69 -3
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +67 -1
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +69 -3
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +67 -1
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +69 -3
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +67 -1
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +69 -3
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +67 -1
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +69 -3
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +67 -1
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +69 -3
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +67 -1
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +69 -3
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +67 -1
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +69 -3
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +67 -1
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +69 -3
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +67 -1
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +69 -3
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +67 -1
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +69 -3
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +67 -1
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +69 -3
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +648 -641
- package/dist/index.js.map +1 -1
- package/dist/locales/ar.json +69 -3
- package/dist/locales/de.json +69 -3
- package/dist/locales/el.json +69 -3
- package/dist/locales/en.json +69 -3
- package/dist/locales/es.json +69 -3
- package/dist/locales/fr.json +69 -3
- package/dist/locales/hi.json +69 -3
- package/dist/locales/it.json +69 -3
- package/dist/locales/ja.json +69 -3
- package/dist/locales/nl.json +69 -3
- package/dist/locales/pl.json +69 -3
- package/dist/locales/pt.json +69 -3
- package/dist/locales/ro.json +69 -3
- package/dist/locales/ru.json +69 -3
- package/dist/locales/sq.json +69 -3
- package/dist/locales/sv.json +69 -3
- package/dist/locales/tr.json +69 -3
- package/dist/locales/zh.json +69 -3
- package/dist/patterns/anamnesis/index.js +1 -1
- package/dist/patterns/calendar/calendar-appointment-details.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar-appointment-details.sections.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar-bookings-panel.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar-editor-fields.d.ts +33 -0
- package/dist/patterns/calendar/calendar-editor-fields.d.ts.map +1 -0
- package/dist/patterns/calendar/calendar-sticky-offset.d.ts +20 -0
- package/dist/patterns/calendar/calendar-sticky-offset.d.ts.map +1 -0
- package/dist/patterns/calendar/calendar-task-editor.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar-workspace.d.ts +6 -4
- package/dist/patterns/calendar/calendar-workspace.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.data.d.ts +26 -0
- package/dist/patterns/calendar/calendar.data.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.journey.d.ts +1 -1
- package/dist/patterns/calendar/calendar.journey.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.sheets.d.ts +16 -5
- package/dist/patterns/calendar/calendar.sheets.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.surface.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.types.d.ts +25 -9
- package/dist/patterns/calendar/calendar.types.d.ts.map +1 -1
- package/dist/patterns/calendar/index.js +1 -1
- package/dist/patterns/help-me-write-templates/help-me-write-templates.d.ts +11 -2
- package/dist/patterns/help-me-write-templates/help-me-write-templates.d.ts.map +1 -1
- package/dist/patterns/help-me-write-templates/index.js +1 -1
- package/dist/patterns/marketplace-app-shell/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +14 -4
- package/dist/_chunks/ai-consent-banner-D7I2U-cz.js.map +0 -1
- package/dist/_chunks/ai-sparkle-DXeP_6a0.js +0 -52
- package/dist/_chunks/ai-sparkle-DXeP_6a0.js.map +0 -1
- package/dist/_chunks/booking-D43ASl8y.js +0 -3034
- package/dist/_chunks/booking-D43ASl8y.js.map +0 -1
- package/dist/_chunks/button-group-R32U7SyV.js +0 -307
- package/dist/_chunks/button-group-R32U7SyV.js.map +0 -1
- package/dist/_chunks/calendar-workspace-B7KvZ1_D.js +0 -12161
- package/dist/_chunks/calendar-workspace-B7KvZ1_D.js.map +0 -1
- package/dist/_chunks/help-me-write-templates-GUeEn3Ff.js.map +0 -1
- package/dist/_chunks/icon-button-group-DkkdIygu.js.map +0 -1
- package/dist/_chunks/notes-panel-Dkk9QPPX.js.map +0 -1
- package/dist/_chunks/patient-field-row-BRSOKvme.js.map +0 -1
- package/dist/_chunks/patient-summary-card-BhmKB2KR.js.map +0 -1
- package/dist/_chunks/payment-form-BHMDqW9C.js +0 -767
- package/dist/_chunks/payment-form-BHMDqW9C.js.map +0 -1
- package/dist/_chunks/rich-text-editor-BrAvNajV.js +0 -3779
- package/dist/_chunks/rich-text-editor-BrAvNajV.js.map +0 -1
- package/dist/_chunks/use-ai-sparkle-CyQSRTCe.js +0 -103
- package/dist/_chunks/use-ai-sparkle-CyQSRTCe.js.map +0 -1
- package/dist/components/ai-consent-banner/ai-consent-banner.agent.d.ts.map +0 -1
- package/dist/components/ai-consent-banner/ai-consent-banner.d.ts.map +0 -1
- package/dist/components/ai-consent-banner/index.d.ts +0 -4
- package/dist/components/ai-consent-banner/index.d.ts.map +0 -1
- /package/dist/components/{ai-consent-banner → ai-permission-notice}/index.js.map +0 -0
|
@@ -176,6 +176,7 @@ const K = [
|
|
|
176
176
|
value: w(n),
|
|
177
177
|
onValueChange: I,
|
|
178
178
|
collapsible: !1,
|
|
179
|
+
role: "group",
|
|
179
180
|
"aria-label": V,
|
|
180
181
|
id: x,
|
|
181
182
|
"data-component": "stepper-accordion",
|
|
@@ -247,4 +248,4 @@ oe.displayName = "StepperAccordion";
|
|
|
247
248
|
export {
|
|
248
249
|
oe as S
|
|
249
250
|
};
|
|
250
|
-
//# sourceMappingURL=stepper-accordion-
|
|
251
|
+
//# sourceMappingURL=stepper-accordion-jMR8NaOB.js.map
|
package/dist/_chunks/{stepper-accordion-DmVykr5F.js.map → stepper-accordion-jMR8NaOB.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stepper-accordion-DmVykr5F.js","sources":["../../src/components/_shared/stepper.ts","../../src/components/stepper-accordion/stepper-accordion.tsx"],"sourcesContent":["// Shared types + state machine for the two stepper variants:\n// - src/components/stepper-progress (lightweight progress bar + caption)\n// - src/components/stepper-accordion (vertical disclosure wizard)\n//\n// Both components consume `StepSpec` and the `stateForStep` helper so the\n// four-state machine (upcoming | current | completed | error) stays in one\n// place. Rename or removal is a MAJOR per src/docs/13-maintainability.mdx.\n\n/**\n * Consumer-supplied override for a step.\n *\n * - `completed` — the step holds a value; render the tick and let the user\n * back in to change it.\n * - `error` — the step's own validation failed; always wins.\n * - `unlocked` (1.11.0) — the step has been *reached* but holds no value of\n * its own. It renders exactly like an upcoming step, but the user may open\n * it. Added for flows whose final step can never report itself \"completed\"\n * because its validity belongs to a form inside it: without this, moving\n * the cursor backwards left that step HTML-`disabled` and unreachable.\n *\n * `'completed'` and `'error'` behave exactly as before, so consumers passing\n * either (or nothing) are unaffected. A consumer that reads this union back\n * in an exhaustive `switch` needs a case for `'unlocked'`; `StepState` — the\n * union such a switch usually runs on — is deliberately untouched.\n */\nexport type StepStatus = 'completed' | 'error' | 'unlocked';\n\nexport type StepState = 'upcoming' | 'current' | 'completed' | 'error';\n\nexport interface StepSpec {\n /** Visible step label — comes from the consumer, already translated. */\n label: string;\n /** Optional secondary line (kept short; shown in accordion + progress captions). */\n description?: string;\n /**\n * Consumer-explicit status override. `error` always wins; `completed` is\n * honoured only for steps at or beyond the active index so the active step\n * always keeps `current` (otherwise a consumer pre-setting `completed` on\n * every step would silently mask the current position). `unlocked` changes\n * reachability only — see `stepIsReachable` — and never the rendered state.\n */\n status?: StepStatus;\n}\n\nexport function stateForStep(\n index: number,\n activeStep: number,\n status?: StepStatus,\n): StepState {\n if (status === 'error') return 'error';\n if (index === activeStep) return 'current';\n if (status === 'completed') return 'completed';\n if (index < activeStep) return 'completed';\n // `unlocked` deliberately falls through: it is a reachability hint, not a\n // visual state, so the returned `StepState` union is unchanged and any\n // exhaustive switch a consumer already wrote keeps compiling.\n return 'upcoming';\n}\n\n/**\n * May the user open this step?\n *\n * Everything at or before the cursor is reachable, as is any step the\n * consumer has explicitly marked `completed`, `error` or `unlocked`.\n * Steps ahead of the cursor with no status stay locked, exactly as before.\n */\nexport function stepIsReachable(\n index: number,\n activeStep: number,\n status?: StepStatus,\n): boolean {\n if (status !== undefined) return true;\n return index <= activeStep;\n}\n","import {\n forwardRef,\n useImperativeHandle,\n useMemo,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport * as AccordionPrimitive from '@radix-ui/react-accordion';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { ChevronDown, Lock } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport {\n stateForStep,\n stepIsReachable,\n type StepSpec,\n type StepState,\n} from '../_shared/stepper';\n\n/* -------------------------------------------------------------------- */\n/* StepperAccordion */\n/* */\n/* Vertical disclosure wizard. The current step is expanded inline; */\n/* completed steps collapse to a one-line summary with an \"Edit\" hint */\n/* that re-opens them; upcoming steps are locked. Built on Radix */\n/* Accordion in controlled-single mode with collapsible=false so the */\n/* current panel always stays open. */\n/* -------------------------------------------------------------------- */\n\nconst STEP_VALUE_PREFIX = 'step-';\nconst makeValue = (index: number) => `${STEP_VALUE_PREFIX}${index}`;\nconst indexFromValue = (value: string): number =>\n Number(value.slice(STEP_VALUE_PREFIX.length));\n\n/* -------------------------------------------------------------------- */\n/* Indicator — shared with progress bar visual tone but sized for the */\n/* vertical wizard's dense header row. */\n/* -------------------------------------------------------------------- */\n\nconst iconDrawClasses = [\n 'ds:[stroke-dasharray:1] ds:[stroke-dashoffset:1]',\n 'ds:animate-[stepper-icon-draw_var(--animation-duration)_var(--ease-out)_forwards]',\n 'ds:motion-reduce:animate-none ds:motion-reduce:[stroke-dashoffset:0]',\n].join(' ');\n\nfunction CheckGlyph() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"ds:size-4\"\n >\n <path pathLength=\"1\" d=\"M5 12l5 5L20 7\" className={iconDrawClasses} />\n </svg>\n );\n}\n\nfunction CrossGlyph() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"ds:size-4\"\n >\n <path pathLength=\"1\" d=\"M6 6l12 12\" className={iconDrawClasses} />\n <path pathLength=\"1\" d=\"M18 6l-12 12\" className={iconDrawClasses} />\n </svg>\n );\n}\n\nconst indicatorClasses = [\n 'ds:inline-flex ds:shrink-0 ds:items-center ds:justify-center',\n 'ds:min-w-[var(--min-target-size)] ds:min-h-[var(--min-target-size)]',\n 'ds:size-[var(--min-target-size)]',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:text-[var(--font-size-sm)] ds:font-[var(--font-weight-semibold)]',\n 'ds:border ds:border-[var(--border)]',\n 'ds:transition-[background-color,border-color,color]',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n].join(' ');\n\nconst indicatorVariants = cva(indicatorClasses, {\n variants: {\n state: {\n upcoming: 'ds:bg-[var(--background)] ds:text-[var(--muted-foreground)]',\n current: [\n 'ds:border-[var(--primary)] ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)]',\n 'ds:animate-[stepper-indicator-pop_var(--animation-duration)_var(--ease-out)_both]',\n 'ds:motion-reduce:animate-none',\n ].join(' '),\n completed:\n 'ds:border-[var(--primary)] ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)]',\n error: [\n 'ds:border-[var(--destructive)] ds:bg-[var(--destructive)] ds:text-[var(--destructive-foreground)]',\n 'ds:animate-[stepper-indicator-pop_var(--animation-duration)_var(--ease-out)_both]',\n 'ds:motion-reduce:animate-none',\n ].join(' '),\n },\n },\n});\n\n/* -------------------------------------------------------------------- */\n/* Item / trigger / content variants */\n/* -------------------------------------------------------------------- */\n\nconst itemVariants = cva(\n [\n 'ds:group/item ds:overflow-hidden ds:rounded-[var(--radius-md)]',\n 'ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2 ds:bg-[var(--card)]',\n 'ds:data-[state=open]:border-[var(--primary)]',\n 'ds:transition-[border-color] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n tone: {\n neutral: '',\n error: 'ds:data-[state=open]:border-[var(--destructive)]',\n },\n },\n defaultVariants: { tone: 'neutral' },\n },\n);\n\nconst triggerClasses = [\n 'ds:flex ds:w-full ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:text-start',\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',\n 'ds:transition-[background-color] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n 'ds:hover:enabled:bg-[var(--muted)]/40',\n].join(' ');\n\nconst labelClasses = (state: StepState) =>\n [\n 'type-body-sm',\n state === 'current' || state === 'error'\n ? 'ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)]'\n : state === 'completed'\n ? 'ds:text-[var(--foreground)]'\n : 'ds:text-[var(--muted-foreground)]',\n ].join(' ');\n\nconst descriptionClasses = [\n 'type-meta ds:text-[var(--muted-foreground)]',\n 'ds:mt-[var(--spacing-xs)]',\n].join(' ');\n\nconst hintClasses = [\n 'type-meta',\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:text-[var(--muted-foreground)]',\n].join(' ');\n\nconst chevronClasses = [\n 'ds:size-4 ds:shrink-0 ds:text-[var(--muted-foreground)]',\n 'ds:transition-transform ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n 'ds:group-data-[state=open]/item:rotate-180',\n].join(' ');\n\nconst summaryClasses = [\n 'type-meta ds:text-[var(--muted-foreground)]',\n 'ds:ps-[calc(var(--min-target-size)+var(--spacing-md)+var(--spacing-sm))]',\n 'ds:pe-[var(--spacing-md)] ds:pb-[var(--spacing-sm)]',\n 'ds:group-data-[state=open]/item:hidden',\n].join(' ');\n\nconst contentClasses = [\n 'ds:overflow-hidden',\n 'ds:data-[state=open]:animate-[accordion-down_var(--animation-duration)_var(--ease-out)]',\n 'ds:data-[state=closed]:animate-[accordion-up_var(--animation-duration)_var(--ease-in)]',\n].join(' ');\n\nconst contentInnerClasses = [\n 'ds:ps-[calc(var(--min-target-size)+var(--spacing-md)+var(--spacing-sm))]',\n 'ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-md)]',\n].join(' ');\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\nexport interface AccordionStepSpec extends StepSpec {\n /** Form content rendered inside the expanded panel. */\n content: ReactNode;\n /**\n * One-line summary shown under the header when the step is completed\n * and its panel is collapsed. Typically a preview of the captured\n * data — \"Mario Rossi · 12/03/1985\".\n */\n summary?: ReactNode;\n}\n\nconst rootVariants = cva('ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]', {\n variants: {},\n});\n\nexport interface StepperAccordionProps\n extends\n Omit<\n ComponentPropsWithoutRef<typeof AccordionPrimitive.Root>,\n 'type' | 'value' | 'defaultValue' | 'onValueChange' | 'collapsible'\n >,\n VariantProps<typeof rootVariants> {\n /** Active step (0-indexed). The matching panel is the one that is open. */\n activeStep: number;\n /** Step specs — each one provides its own content + optional summary. */\n steps: AccordionStepSpec[];\n /**\n * Fires when the user re-opens a completed step. Upcoming steps cannot\n * be activated — their triggers are disabled. The current step cannot\n * be collapsed (Radix `collapsible=false`).\n */\n onStepChange?: (index: number) => void;\n /** Override the default `aria-label` on the list wrapper. */\n 'aria-label'?: string;\n /**\n * Consumer-supplied instance id, surfaced as `data-component-id` so an\n * agent / UI bridge can address this instance.\n */\n id?: string;\n}\n\n/**\n * Imperative handle for agent-readiness. Routes state mutations through\n * the consumer's `onStepChange`, never mutating directly.\n */\nexport interface StepperAccordionHandle {\n getCurrentStep: () => number;\n getTotalSteps: () => number;\n /** Indices of currently-open panels — singleton under Radix `type=\"single\"`. */\n getOpenSteps: () => number[];\n gotoStep: (step: number) => void;\n next: () => void;\n previous: () => void;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nconst StepperAccordion = forwardRef<\n StepperAccordionHandle,\n StepperAccordionProps\n>(\n (\n {\n activeStep,\n steps,\n onStepChange,\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const total = steps.length;\n const clampedActive = Math.max(0, Math.min(activeStep, total - 1));\n const label = ariaLabel ?? t('navigation.stepper.label');\n const editCopy = t('navigation.stepper.edit');\n const openCopy = t('navigation.stepper.open');\n const lockedCopy = t('navigation.stepper.locked');\n const completedCopy = t('navigation.stepper.completed');\n const errorCopy = t('navigation.stepper.error');\n\n const handleValueChange = (value: string) => {\n // `collapsible=false` prevents empty-string values in practice, but the\n // primitive's type still allows one — guard anyway.\n if (!value) return;\n const index = indexFromValue(value);\n if (Number.isFinite(index) && index !== clampedActive) {\n onStepChange?.(index);\n }\n };\n\n const handle = useMemo<StepperAccordionHandle>(\n () => ({\n getCurrentStep: () => clampedActive,\n getTotalSteps: () => total,\n getOpenSteps: () => [clampedActive],\n gotoStep: (step: number) => {\n if (!onStepChange) return;\n const clamped = Math.max(0, Math.min(step, Math.max(total - 1, 0)));\n if (clamped !== clampedActive) onStepChange(clamped);\n },\n next: () => {\n if (!onStepChange) return;\n if (clampedActive < total - 1) onStepChange(clampedActive + 1);\n },\n previous: () => {\n if (!onStepChange) return;\n if (clampedActive > 0) onStepChange(clampedActive - 1);\n },\n }),\n [clampedActive, total, onStepChange],\n );\n useImperativeHandle(ref, () => handle, [handle]);\n\n return (\n <AccordionPrimitive.Root\n type=\"single\"\n value={makeValue(clampedActive)}\n onValueChange={handleValueChange}\n collapsible={false}\n aria-label={label}\n id={id}\n data-component=\"stepper-accordion\"\n data-component-id={id}\n className={rootVariants({ className })}\n {...rest}\n >\n {steps.map((spec, index) => {\n const state = stateForStep(index, clampedActive, spec.status);\n const isCurrent = state === 'current' || state === 'error';\n const isUpcoming = state === 'upcoming';\n // An `unlocked` step renders as `upcoming` but stays reachable —\n // only a step that is BOTH upcoming and unreachable is locked.\n const isLocked =\n isUpcoming && !stepIsReachable(index, clampedActive, spec.status);\n const itemTone = state === 'error' ? 'error' : 'neutral';\n const stepN = t('navigation.stepper.stepN', { n: index + 1 });\n\n const indicatorContent = (() => {\n if (state === 'completed') {\n return (\n <>\n <CheckGlyph />\n <span className=\"ds:sr-only\">{completedCopy}</span>\n </>\n );\n }\n if (state === 'error') {\n return (\n <>\n <CrossGlyph />\n <span className=\"ds:sr-only\">{errorCopy}</span>\n </>\n );\n }\n return <span>{index + 1}</span>;\n })();\n\n const hint = (() => {\n if (state === 'completed') {\n return <span className={hintClasses}>{editCopy}</span>;\n }\n if (isLocked) {\n return (\n <span className={hintClasses}>\n <Lock aria-hidden=\"true\" className=\"ds:size-3\" />\n {lockedCopy}\n </span>\n );\n }\n if (isUpcoming) {\n // Reachable but empty — say so, otherwise the row reads\n // identically to a locked one and nothing signals it opens.\n return <span className={hintClasses}>{openCopy}</span>;\n }\n return null;\n })();\n\n return (\n <AccordionPrimitive.Item\n key={index}\n value={makeValue(index)}\n data-step-id={String(index)}\n className={itemVariants({ tone: itemTone })}\n >\n <AccordionPrimitive.Header className=\"ds:flex\">\n <AccordionPrimitive.Trigger\n // Locked steps (upcoming, and not marked reachable by a\n // `completed` / `error` / `unlocked` status) are *HTML*-\n // disabled — they must not be\n // reachable by Tab or by Radix's arrow-key navigation ring\n // (Radix filters `item.ref.current?.disabled`, which is\n // the HTML attribute). Current is only *ARIA*-disabled so\n // keyboard users can Tab to it as a heading anchor and\n // hear \"current step\"; Radix's `collapsible=false` makes\n // the click a no-op regardless. Setting `disabled` at the\n // Trigger rather than the Item because `...triggerProps`\n // spreads after Collapsible writes its own `disabled`\n // from context, so the Item-level disabled gets overridden.\n disabled={isLocked}\n aria-disabled={isCurrent || undefined}\n // The hint is rendered text, but `aria-label` overrides\n // element content wholesale — so the affordance has to be\n // appended here too or AT hears none of it.\n aria-label={\n state === 'completed'\n ? `${stepN}, ${editCopy}`\n : isUpcoming && !isLocked\n ? `${stepN}, ${openCopy}`\n : stepN\n }\n aria-current={isCurrent ? 'step' : undefined}\n className={triggerClasses}\n >\n <span\n aria-hidden=\"true\"\n className={indicatorVariants({ state })}\n >\n {indicatorContent}\n </span>\n <span className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col\">\n <span className={labelClasses(state)}>{spec.label}</span>\n {spec.description ? (\n <span className={descriptionClasses}>\n {spec.description}\n </span>\n ) : null}\n </span>\n {hint}\n {isCurrent ? null : (\n <ChevronDown\n aria-hidden=\"true\"\n className={chevronClasses}\n />\n )}\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n {spec.summary && state === 'completed' ? (\n <div className={summaryClasses}>{spec.summary}</div>\n ) : null}\n <AccordionPrimitive.Content className={contentClasses}>\n <div className={contentInnerClasses}>{spec.content}</div>\n </AccordionPrimitive.Content>\n </AccordionPrimitive.Item>\n );\n })}\n </AccordionPrimitive.Root>\n );\n },\n);\nStepperAccordion.displayName = 'StepperAccordion';\n\nexport { StepperAccordion };\n"],"names":["stateForStep","index","activeStep","status","stepIsReachable","STEP_VALUE_PREFIX","makeValue","indexFromValue","value","iconDrawClasses","CheckGlyph","jsx","CrossGlyph","jsxs","indicatorClasses","indicatorVariants","cva","itemVariants","triggerClasses","labelClasses","state","descriptionClasses","hintClasses","chevronClasses","summaryClasses","contentClasses","contentInnerClasses","rootVariants","StepperAccordion","forwardRef","steps","onStepChange","ariaLabel","id","className","rest","ref","t","useTranslation","total","clampedActive","label","editCopy","openCopy","lockedCopy","completedCopy","errorCopy","handleValueChange","handle","useMemo","step","clamped","useImperativeHandle","AccordionPrimitive","spec","isCurrent","isUpcoming","isLocked","itemTone","stepN","indicatorContent","Fragment","hint","Lock","ChevronDown"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stepper-accordion-jMR8NaOB.js","sources":["../../src/components/_shared/stepper.ts","../../src/components/stepper-accordion/stepper-accordion.tsx"],"sourcesContent":["// Shared types + state machine for the two stepper variants:\n// - src/components/stepper-progress (lightweight progress bar + caption)\n// - src/components/stepper-accordion (vertical disclosure wizard)\n//\n// Both components consume `StepSpec` and the `stateForStep` helper so the\n// four-state machine (upcoming | current | completed | error) stays in one\n// place. Rename or removal is a MAJOR per src/docs/13-maintainability.mdx.\n\n/**\n * Consumer-supplied override for a step.\n *\n * - `completed` — the step holds a value; render the tick and let the user\n * back in to change it.\n * - `error` — the step's own validation failed; always wins.\n * - `unlocked` (1.11.0) — the step has been *reached* but holds no value of\n * its own. It renders exactly like an upcoming step, but the user may open\n * it. Added for flows whose final step can never report itself \"completed\"\n * because its validity belongs to a form inside it: without this, moving\n * the cursor backwards left that step HTML-`disabled` and unreachable.\n *\n * `'completed'` and `'error'` behave exactly as before, so consumers passing\n * either (or nothing) are unaffected. A consumer that reads this union back\n * in an exhaustive `switch` needs a case for `'unlocked'`; `StepState` — the\n * union such a switch usually runs on — is deliberately untouched.\n */\nexport type StepStatus = 'completed' | 'error' | 'unlocked';\n\nexport type StepState = 'upcoming' | 'current' | 'completed' | 'error';\n\nexport interface StepSpec {\n /** Visible step label — comes from the consumer, already translated. */\n label: string;\n /** Optional secondary line (kept short; shown in accordion + progress captions). */\n description?: string;\n /**\n * Consumer-explicit status override. `error` always wins; `completed` is\n * honoured only for steps at or beyond the active index so the active step\n * always keeps `current` (otherwise a consumer pre-setting `completed` on\n * every step would silently mask the current position). `unlocked` changes\n * reachability only — see `stepIsReachable` — and never the rendered state.\n */\n status?: StepStatus;\n}\n\nexport function stateForStep(\n index: number,\n activeStep: number,\n status?: StepStatus,\n): StepState {\n if (status === 'error') return 'error';\n if (index === activeStep) return 'current';\n if (status === 'completed') return 'completed';\n if (index < activeStep) return 'completed';\n // `unlocked` deliberately falls through: it is a reachability hint, not a\n // visual state, so the returned `StepState` union is unchanged and any\n // exhaustive switch a consumer already wrote keeps compiling.\n return 'upcoming';\n}\n\n/**\n * May the user open this step?\n *\n * Everything at or before the cursor is reachable, as is any step the\n * consumer has explicitly marked `completed`, `error` or `unlocked`.\n * Steps ahead of the cursor with no status stay locked, exactly as before.\n */\nexport function stepIsReachable(\n index: number,\n activeStep: number,\n status?: StepStatus,\n): boolean {\n if (status !== undefined) return true;\n return index <= activeStep;\n}\n","import {\n forwardRef,\n useImperativeHandle,\n useMemo,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport * as AccordionPrimitive from '@radix-ui/react-accordion';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { ChevronDown, Lock } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport {\n stateForStep,\n stepIsReachable,\n type StepSpec,\n type StepState,\n} from '../_shared/stepper';\n\n/* -------------------------------------------------------------------- */\n/* StepperAccordion */\n/* */\n/* Vertical disclosure wizard. The current step is expanded inline; */\n/* completed steps collapse to a one-line summary with an \"Edit\" hint */\n/* that re-opens them; upcoming steps are locked. Built on Radix */\n/* Accordion in controlled-single mode with collapsible=false so the */\n/* current panel always stays open. */\n/* -------------------------------------------------------------------- */\n\nconst STEP_VALUE_PREFIX = 'step-';\nconst makeValue = (index: number) => `${STEP_VALUE_PREFIX}${index}`;\nconst indexFromValue = (value: string): number =>\n Number(value.slice(STEP_VALUE_PREFIX.length));\n\n/* -------------------------------------------------------------------- */\n/* Indicator — shared with progress bar visual tone but sized for the */\n/* vertical wizard's dense header row. */\n/* -------------------------------------------------------------------- */\n\nconst iconDrawClasses = [\n 'ds:[stroke-dasharray:1] ds:[stroke-dashoffset:1]',\n 'ds:animate-[stepper-icon-draw_var(--animation-duration)_var(--ease-out)_forwards]',\n 'ds:motion-reduce:animate-none ds:motion-reduce:[stroke-dashoffset:0]',\n].join(' ');\n\nfunction CheckGlyph() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"ds:size-4\"\n >\n <path pathLength=\"1\" d=\"M5 12l5 5L20 7\" className={iconDrawClasses} />\n </svg>\n );\n}\n\nfunction CrossGlyph() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"ds:size-4\"\n >\n <path pathLength=\"1\" d=\"M6 6l12 12\" className={iconDrawClasses} />\n <path pathLength=\"1\" d=\"M18 6l-12 12\" className={iconDrawClasses} />\n </svg>\n );\n}\n\nconst indicatorClasses = [\n 'ds:inline-flex ds:shrink-0 ds:items-center ds:justify-center',\n 'ds:min-w-[var(--min-target-size)] ds:min-h-[var(--min-target-size)]',\n 'ds:size-[var(--min-target-size)]',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:text-[var(--font-size-sm)] ds:font-[var(--font-weight-semibold)]',\n 'ds:border ds:border-[var(--border)]',\n 'ds:transition-[background-color,border-color,color]',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n].join(' ');\n\nconst indicatorVariants = cva(indicatorClasses, {\n variants: {\n state: {\n upcoming: 'ds:bg-[var(--background)] ds:text-[var(--muted-foreground)]',\n current: [\n 'ds:border-[var(--primary)] ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)]',\n 'ds:animate-[stepper-indicator-pop_var(--animation-duration)_var(--ease-out)_both]',\n 'ds:motion-reduce:animate-none',\n ].join(' '),\n completed:\n 'ds:border-[var(--primary)] ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)]',\n error: [\n 'ds:border-[var(--destructive)] ds:bg-[var(--destructive)] ds:text-[var(--destructive-foreground)]',\n 'ds:animate-[stepper-indicator-pop_var(--animation-duration)_var(--ease-out)_both]',\n 'ds:motion-reduce:animate-none',\n ].join(' '),\n },\n },\n});\n\n/* -------------------------------------------------------------------- */\n/* Item / trigger / content variants */\n/* -------------------------------------------------------------------- */\n\nconst itemVariants = cva(\n [\n 'ds:group/item ds:overflow-hidden ds:rounded-[var(--radius-md)]',\n 'ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2 ds:bg-[var(--card)]',\n 'ds:data-[state=open]:border-[var(--primary)]',\n 'ds:transition-[border-color] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n tone: {\n neutral: '',\n error: 'ds:data-[state=open]:border-[var(--destructive)]',\n },\n },\n defaultVariants: { tone: 'neutral' },\n },\n);\n\nconst triggerClasses = [\n 'ds:flex ds:w-full ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:text-start',\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',\n 'ds:transition-[background-color] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n 'ds:hover:enabled:bg-[var(--muted)]/40',\n].join(' ');\n\nconst labelClasses = (state: StepState) =>\n [\n 'type-body-sm',\n state === 'current' || state === 'error'\n ? 'ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)]'\n : state === 'completed'\n ? 'ds:text-[var(--foreground)]'\n : 'ds:text-[var(--muted-foreground)]',\n ].join(' ');\n\nconst descriptionClasses = [\n 'type-meta ds:text-[var(--muted-foreground)]',\n 'ds:mt-[var(--spacing-xs)]',\n].join(' ');\n\nconst hintClasses = [\n 'type-meta',\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:text-[var(--muted-foreground)]',\n].join(' ');\n\nconst chevronClasses = [\n 'ds:size-4 ds:shrink-0 ds:text-[var(--muted-foreground)]',\n 'ds:transition-transform ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n 'ds:group-data-[state=open]/item:rotate-180',\n].join(' ');\n\nconst summaryClasses = [\n 'type-meta ds:text-[var(--muted-foreground)]',\n 'ds:ps-[calc(var(--min-target-size)+var(--spacing-md)+var(--spacing-sm))]',\n 'ds:pe-[var(--spacing-md)] ds:pb-[var(--spacing-sm)]',\n 'ds:group-data-[state=open]/item:hidden',\n].join(' ');\n\nconst contentClasses = [\n 'ds:overflow-hidden',\n 'ds:data-[state=open]:animate-[accordion-down_var(--animation-duration)_var(--ease-out)]',\n 'ds:data-[state=closed]:animate-[accordion-up_var(--animation-duration)_var(--ease-in)]',\n].join(' ');\n\nconst contentInnerClasses = [\n 'ds:ps-[calc(var(--min-target-size)+var(--spacing-md)+var(--spacing-sm))]',\n 'ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-md)]',\n].join(' ');\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\nexport interface AccordionStepSpec extends StepSpec {\n /** Form content rendered inside the expanded panel. */\n content: ReactNode;\n /**\n * One-line summary shown under the header when the step is completed\n * and its panel is collapsed. Typically a preview of the captured\n * data — \"Mario Rossi · 12/03/1985\".\n */\n summary?: ReactNode;\n}\n\nconst rootVariants = cva('ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]', {\n variants: {},\n});\n\nexport interface StepperAccordionProps\n extends\n Omit<\n ComponentPropsWithoutRef<typeof AccordionPrimitive.Root>,\n 'type' | 'value' | 'defaultValue' | 'onValueChange' | 'collapsible'\n >,\n VariantProps<typeof rootVariants> {\n /** Active step (0-indexed). The matching panel is the one that is open. */\n activeStep: number;\n /** Step specs — each one provides its own content + optional summary. */\n steps: AccordionStepSpec[];\n /**\n * Fires when the user re-opens a completed step. Upcoming steps cannot\n * be activated — their triggers are disabled. The current step cannot\n * be collapsed (Radix `collapsible=false`).\n */\n onStepChange?: (index: number) => void;\n /** Override the default `aria-label` on the list wrapper. */\n 'aria-label'?: string;\n /**\n * Consumer-supplied instance id, surfaced as `data-component-id` so an\n * agent / UI bridge can address this instance.\n */\n id?: string;\n}\n\n/**\n * Imperative handle for agent-readiness. Routes state mutations through\n * the consumer's `onStepChange`, never mutating directly.\n */\nexport interface StepperAccordionHandle {\n getCurrentStep: () => number;\n getTotalSteps: () => number;\n /** Indices of currently-open panels — singleton under Radix `type=\"single\"`. */\n getOpenSteps: () => number[];\n gotoStep: (step: number) => void;\n next: () => void;\n previous: () => void;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nconst StepperAccordion = forwardRef<\n StepperAccordionHandle,\n StepperAccordionProps\n>(\n (\n {\n activeStep,\n steps,\n onStepChange,\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const total = steps.length;\n const clampedActive = Math.max(0, Math.min(activeStep, total - 1));\n const label = ariaLabel ?? t('navigation.stepper.label');\n const editCopy = t('navigation.stepper.edit');\n const openCopy = t('navigation.stepper.open');\n const lockedCopy = t('navigation.stepper.locked');\n const completedCopy = t('navigation.stepper.completed');\n const errorCopy = t('navigation.stepper.error');\n\n const handleValueChange = (value: string) => {\n // `collapsible=false` prevents empty-string values in practice, but the\n // primitive's type still allows one — guard anyway.\n if (!value) return;\n const index = indexFromValue(value);\n if (Number.isFinite(index) && index !== clampedActive) {\n onStepChange?.(index);\n }\n };\n\n const handle = useMemo<StepperAccordionHandle>(\n () => ({\n getCurrentStep: () => clampedActive,\n getTotalSteps: () => total,\n getOpenSteps: () => [clampedActive],\n gotoStep: (step: number) => {\n if (!onStepChange) return;\n const clamped = Math.max(0, Math.min(step, Math.max(total - 1, 0)));\n if (clamped !== clampedActive) onStepChange(clamped);\n },\n next: () => {\n if (!onStepChange) return;\n if (clampedActive < total - 1) onStepChange(clampedActive + 1);\n },\n previous: () => {\n if (!onStepChange) return;\n if (clampedActive > 0) onStepChange(clampedActive - 1);\n },\n }),\n [clampedActive, total, onStepChange],\n );\n useImperativeHandle(ref, () => handle, [handle]);\n\n return (\n <AccordionPrimitive.Root\n type=\"single\"\n value={makeValue(clampedActive)}\n onValueChange={handleValueChange}\n collapsible={false}\n // Radix renders a plain div, and aria-label is prohibited on the\n // generic role. `group` lets the label name the set of steps.\n role=\"group\"\n aria-label={label}\n id={id}\n data-component=\"stepper-accordion\"\n data-component-id={id}\n className={rootVariants({ className })}\n {...rest}\n >\n {steps.map((spec, index) => {\n const state = stateForStep(index, clampedActive, spec.status);\n const isCurrent = state === 'current' || state === 'error';\n const isUpcoming = state === 'upcoming';\n // An `unlocked` step renders as `upcoming` but stays reachable —\n // only a step that is BOTH upcoming and unreachable is locked.\n const isLocked =\n isUpcoming && !stepIsReachable(index, clampedActive, spec.status);\n const itemTone = state === 'error' ? 'error' : 'neutral';\n const stepN = t('navigation.stepper.stepN', { n: index + 1 });\n\n const indicatorContent = (() => {\n if (state === 'completed') {\n return (\n <>\n <CheckGlyph />\n <span className=\"ds:sr-only\">{completedCopy}</span>\n </>\n );\n }\n if (state === 'error') {\n return (\n <>\n <CrossGlyph />\n <span className=\"ds:sr-only\">{errorCopy}</span>\n </>\n );\n }\n return <span>{index + 1}</span>;\n })();\n\n const hint = (() => {\n if (state === 'completed') {\n return <span className={hintClasses}>{editCopy}</span>;\n }\n if (isLocked) {\n return (\n <span className={hintClasses}>\n <Lock aria-hidden=\"true\" className=\"ds:size-3\" />\n {lockedCopy}\n </span>\n );\n }\n if (isUpcoming) {\n // Reachable but empty — say so, otherwise the row reads\n // identically to a locked one and nothing signals it opens.\n return <span className={hintClasses}>{openCopy}</span>;\n }\n return null;\n })();\n\n return (\n <AccordionPrimitive.Item\n key={index}\n value={makeValue(index)}\n data-step-id={String(index)}\n className={itemVariants({ tone: itemTone })}\n >\n <AccordionPrimitive.Header className=\"ds:flex\">\n <AccordionPrimitive.Trigger\n // Locked steps (upcoming, and not marked reachable by a\n // `completed` / `error` / `unlocked` status) are *HTML*-\n // disabled — they must not be\n // reachable by Tab or by Radix's arrow-key navigation ring\n // (Radix filters `item.ref.current?.disabled`, which is\n // the HTML attribute). Current is only *ARIA*-disabled so\n // keyboard users can Tab to it as a heading anchor and\n // hear \"current step\"; Radix's `collapsible=false` makes\n // the click a no-op regardless. Setting `disabled` at the\n // Trigger rather than the Item because `...triggerProps`\n // spreads after Collapsible writes its own `disabled`\n // from context, so the Item-level disabled gets overridden.\n disabled={isLocked}\n aria-disabled={isCurrent || undefined}\n // The hint is rendered text, but `aria-label` overrides\n // element content wholesale — so the affordance has to be\n // appended here too or AT hears none of it.\n aria-label={\n state === 'completed'\n ? `${stepN}, ${editCopy}`\n : isUpcoming && !isLocked\n ? `${stepN}, ${openCopy}`\n : stepN\n }\n aria-current={isCurrent ? 'step' : undefined}\n className={triggerClasses}\n >\n <span\n aria-hidden=\"true\"\n className={indicatorVariants({ state })}\n >\n {indicatorContent}\n </span>\n <span className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col\">\n <span className={labelClasses(state)}>{spec.label}</span>\n {spec.description ? (\n <span className={descriptionClasses}>\n {spec.description}\n </span>\n ) : null}\n </span>\n {hint}\n {isCurrent ? null : (\n <ChevronDown\n aria-hidden=\"true\"\n className={chevronClasses}\n />\n )}\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n {spec.summary && state === 'completed' ? (\n <div className={summaryClasses}>{spec.summary}</div>\n ) : null}\n <AccordionPrimitive.Content className={contentClasses}>\n <div className={contentInnerClasses}>{spec.content}</div>\n </AccordionPrimitive.Content>\n </AccordionPrimitive.Item>\n );\n })}\n </AccordionPrimitive.Root>\n );\n },\n);\nStepperAccordion.displayName = 'StepperAccordion';\n\nexport { StepperAccordion };\n"],"names":["stateForStep","index","activeStep","status","stepIsReachable","STEP_VALUE_PREFIX","makeValue","indexFromValue","value","iconDrawClasses","CheckGlyph","jsx","CrossGlyph","jsxs","indicatorClasses","indicatorVariants","cva","itemVariants","triggerClasses","labelClasses","state","descriptionClasses","hintClasses","chevronClasses","summaryClasses","contentClasses","contentInnerClasses","rootVariants","StepperAccordion","forwardRef","steps","onStepChange","ariaLabel","id","className","rest","ref","t","useTranslation","total","clampedActive","label","editCopy","openCopy","lockedCopy","completedCopy","errorCopy","handleValueChange","handle","useMemo","step","clamped","useImperativeHandle","AccordionPrimitive","spec","isCurrent","isUpcoming","isLocked","itemTone","stepN","indicatorContent","Fragment","hint","Lock","ChevronDown"],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import { useTranslation as _t } from "react-i18next";
|
|
|
5
5
|
import { B as Dt } from "./badge-BudgzTe_.js";
|
|
6
6
|
import { B as oe } from "./button-CaUe1uyd.js";
|
|
7
7
|
import { I as ne } from "./icon-button-CehAeZoP.js";
|
|
8
|
-
import { B as xe } from "./button-group-
|
|
8
|
+
import { B as xe } from "./button-group-CA1tmu39.js";
|
|
9
9
|
import { P as Rt } from "./panel-header-D_mTdhUp.js";
|
|
10
10
|
import { S as Ne } from "./select-CLSUnKjF.js";
|
|
11
11
|
import { S as Tt } from "./switch-OILsBLWo.js";
|
|
@@ -841,4 +841,4 @@ export {
|
|
|
841
841
|
ns as T,
|
|
842
842
|
Gt as t
|
|
843
843
|
};
|
|
844
|
-
//# sourceMappingURL=tasks-panel-
|
|
844
|
+
//# sourceMappingURL=tasks-panel-DncuBPIZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks-panel-CpcikOeY.js","sources":["../../node_modules/lucide-react/dist/esm/icons/coins.mjs","../../node_modules/lucide-react/dist/esm/icons/gem.mjs","../../node_modules/lucide-react/dist/esm/icons/megaphone.mjs","../../node_modules/lucide-react/dist/esm/icons/tag.mjs","../../src/components/tasks-panel/tasks-panel.agent.ts","../../src/components/tasks-panel/tasks-panel.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M13.744 17.736a6 6 0 1 1-7.48-7.48\", key: \"bq4yh3\" }],\n [\"path\", { d: \"M15 6h1v4\", key: \"11y1tn\" }],\n [\"path\", { d: \"m6.134 14.768.866-.5 2 3.464\", key: \"17snzx\" }],\n [\"circle\", { cx: \"16\", cy: \"8\", r: \"6\", key: \"14bfc9\" }]\n];\nconst Coins = createLucideIcon(\"coins\", __iconNode);\n\nexport { __iconNode, Coins as default };\n//# sourceMappingURL=coins.mjs.map\n","/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10.5 3 8 9l4 13 4-13-2.5-6\", key: \"b3dvk1\" }],\n [\n \"path\",\n {\n d: \"M17 3a2 2 0 0 1 1.6.8l3 4a2 2 0 0 1 .013 2.382l-7.99 10.986a2 2 0 0 1-3.247 0l-7.99-10.986A2 2 0 0 1 2.4 7.8l2.998-3.997A2 2 0 0 1 7 3z\",\n key: \"7w4byz\"\n }\n ],\n [\"path\", { d: \"M2 9h20\", key: \"16fsjt\" }]\n];\nconst Gem = createLucideIcon(\"gem\", __iconNode);\n\nexport { __iconNode, Gem as default };\n//# sourceMappingURL=gem.mjs.map\n","/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M11 6a13 13 0 0 0 8.4-2.8A1 1 0 0 1 21 4v12a1 1 0 0 1-1.6.8A13 13 0 0 0 11 14H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2z\",\n key: \"q8bfy3\"\n }\n ],\n [\"path\", { d: \"M6 14a12 12 0 0 0 2.4 7.2 2 2 0 0 0 3.2-2.4A8 8 0 0 1 10 14\", key: \"1853fq\" }],\n [\"path\", { d: \"M8 6v8\", key: \"15ugcq\" }]\n];\nconst Megaphone = createLucideIcon(\"megaphone\", __iconNode);\n\nexport { __iconNode, Megaphone as default };\n//# sourceMappingURL=megaphone.mjs.map\n","/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z\",\n key: \"vktsd0\"\n }\n ],\n [\"circle\", { cx: \"7.5\", cy: \"7.5\", r: \".5\", fill: \"currentColor\", key: \"kqv944\" }]\n];\nconst Tag = createLucideIcon(\"tag\", __iconNode);\n\nexport { __iconNode, Tag as default };\n//# sourceMappingURL=tag.mjs.map\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — TasksPanel. */\n/* */\n/* Rail Tasks surface: read task ids + status (never note / patient), */\n/* activate a row, toggle done / dismiss a task, re-anchor the scroll on */\n/* the overdue bucket, and drive the filter bar — all through the curated */\n/* handle. In-page within the rail panel (no open/close — the rail owns */\n/* panel open state). Mirrors taskTrayAgent's safety mapping (select=read, */\n/* toggle_done=write, dismiss=destructive) plus AppointmentTimeline's */\n/* scroll capability; the stateful filter bar adds the `filter` capability */\n/* backed by `set_filter`. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { TasksPanelHandle } from './tasks-panel';\n\nexport const tasksPanelAgent: AgentAdapter<TasksPanelHandle> = {\n id: 'tasks-panel',\n // 'pick' backs select_item (non-persisting activation, matching\n // AppointmentTimeline); 'dismiss' backs dismiss; 'scroll' backs\n // jump_to_overdue (re-anchors the viewport); 'filter' backs set_filter (the\n // status / type / assignee / overdue filter bar is genuinely stateful);\n // 'view_change' backs change_scope (the patient ↔ mine segment); 'paginate'\n // backs load_more (append the next page of tasks).\n capabilities: [\n 'pick',\n 'dismiss',\n 'scroll',\n 'filter',\n 'view_change',\n 'paginate',\n ],\n state: {\n items: {\n type: 'Array<{ id: string; status: string }>',\n descriptionKey: 'ui.agent.tasksPanel.state.items',\n description:\n 'Currently-rendered tasks. Ids + status only — never task note / patient.',\n read: (handle) => handle.getItems(),\n },\n },\n actions: {\n select_item: {\n safety: 'read',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.tasksPanel.actions.selectItem',\n description: 'Activate the task with the given id.',\n invoke: (handle, args: { id: string }) => {\n handle.selectItem(args.id);\n },\n },\n toggle_done: {\n safety: 'write',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n descriptionKey: 'ui.agent.tasksPanel.actions.toggleDone',\n description: 'Request the host to toggle the done state of a task.',\n invoke: (handle, args: { id: string }) => {\n handle.toggleDone(args.id);\n },\n },\n dismiss: {\n safety: 'destructive',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.tasksPanel.actions.dismiss',\n description:\n 'Request the host to dismiss / remove the task with the given id.',\n invoke: (handle, args: { id: string }) => {\n handle.dismiss(args.id);\n },\n },\n jump_to_overdue: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.tasksPanel.actions.jumpToOverdue',\n description: 'Re-anchor the panel scroll on the overdue tasks.',\n invoke: (handle) => {\n handle.jumpToOverdue();\n },\n },\n set_filter: {\n safety: 'read',\n argsType:\n \"{ status?: 'todo' | 'done' | 'all'; type?: string | null; assignee?: string | null; overdueOnly?: boolean }\",\n argsSchema: {\n type: 'object',\n properties: {\n status: { type: 'string', enum: ['todo', 'done', 'all'] },\n type: { type: ['string', 'null'] },\n assignee: { type: ['string', 'null'] },\n overdueOnly: { type: 'boolean' },\n },\n },\n idempotent: true,\n descriptionKey: 'ui.agent.tasksPanel.actions.setFilter',\n description:\n 'Set the task filters (status segment, type, assignee, overdue-only). Omitted keys are left unchanged.',\n invoke: (\n handle,\n args: {\n status?: 'todo' | 'done' | 'all';\n type?: string | null;\n assignee?: string | null;\n overdueOnly?: boolean;\n },\n ) => {\n handle.setFilter(args);\n },\n },\n change_scope: {\n safety: 'read',\n argsType: \"{ scope: 'patient' | 'mine' }\",\n argsSchema: {\n type: 'object',\n properties: { scope: { type: 'string', enum: ['patient', 'mine'] } },\n required: ['scope'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.tasksPanel.actions.changeScope',\n description:\n \"Switch the task scope segment between this patient ('patient') and the operator's own tasks ('mine'). The host re-feeds the items.\",\n invoke: (handle, args: { scope: 'patient' | 'mine' }) => {\n handle.changeScope(args.scope);\n },\n },\n load_more: {\n safety: 'read',\n // Requests the host to append the next page — not idempotent (each call\n // advances the page) and reaches the host data source.\n openWorld: true,\n descriptionKey: 'ui.agent.tasksPanel.actions.loadMore',\n description: 'Request the host to append the next page of tasks.',\n invoke: (handle) => {\n handle.loadMore();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'tasks-panel',\n description: 'Marks the TasksPanel wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific panel from the agent.',\n },\n item: {\n attr: 'data-task-id',\n description:\n 'Stable task id emitted on each rendered TaskCard inside the panel.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n Coins,\n Gem,\n ClipboardCheck,\n Megaphone,\n Pencil,\n Plus,\n Tag,\n X,\n} from 'lucide-react';\nimport { Badge, type BadgeProps } from '../badge';\nimport { Button } from '../button';\nimport { IconButton } from '../button/icon-button';\nimport { ButtonGroup } from '../button-group';\nimport { PanelHeader } from '../panel-header';\nimport { Select } from '../select';\nimport { Switch } from '../switch';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { TaskCard, type TaskItem } from '../task-card';\nimport { useCheckAnimation } from '../../hooks/use-check-animation';\nimport { useExitTransition } from '../../hooks/use-exit-transition';\nimport { REFLOW_ROW_CLASS, useListReflow } from '../../hooks/use-list-reflow';\nimport { useTheme } from '../../hooks/use-theme';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { tasksPanelAgent } from './tasks-panel.agent';\n\n/* -------------------------------------------------------------------- */\n/* TasksPanel */\n/* */\n/* The Tasks tool for the Control Room rail — the next surface after */\n/* AppointmentTimeline (Appointments) and NotesPanel (Notes). It is the */\n/* rail equivalent of the in-page TaskTray: a fill-mode panel that owns */\n/* its own scroll, groups a flat task list into DUE-DATE buckets */\n/* (Overdue / Today / Tomorrow / This week / Later, with Done sunk to */\n/* the bottom), pins a filter header + per-bucket headers, and fades at */\n/* each scroll edge. Unlike AppointmentTimeline it does NOT scroll a */\n/* continuous calendar stream — platform tasks are a bounded, date-ASC */\n/* list — so there is no bidirectional infinite scroll or today-anchor, */\n/* only an optional one-way `onLoadMore`. */\n/* */\n/* Each row reuses TaskCard (no reinvention); the panel adds a coloured */\n/* type Badge (the platform's primary per-task signal) + elevation via */\n/* the card's className. All visible text flows through */\n/* useTranslation('ui') against `tasksPanel.*`; only ids + status reach */\n/* the agent adapter (no PHI). */\n/* -------------------------------------------------------------------- */\n\n/* How close (px) to the bottom edge before `onLoadMore` fires. */\nconst EDGE_LOAD_THRESHOLD = 96;\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\n/** Which set of tasks the panel shows — the host owns the actual feed. */\nexport type TasksPanelScope = 'patient' | 'mine';\n\n/** Status segment value. Mirrors the platform `done` filter (default `todo`). */\nexport type TasksPanelStatusFilter = 'todo' | 'done' | 'all';\n\n/**\n * Panel-local extension of the card's `TaskItem`. The extra fields here drive\n * bucketing + filtering; the row's display fields (the typed link via\n * `linkType` + `linkedLabel`, the `assigneeLabel`, `dueLabel`) live on\n * `TaskItem` and are rendered by `TaskCard` itself. The host maps the platform\n * `DoctorReminder` → this shape — composing `title` (a summary, NOT the bare\n * type), `note`, the linked entity, the assignee, and `dueLabel`.\n */\nexport interface TasksPanelItem extends TaskItem {\n /** ISO-8601 due/scheduled instant (platform `DoctorReminder.date`). Buckets + orders the list. */\n dueIso: string;\n /** System or custom task-type key (`recall` | `payment` | `collection` | `other` | `custom-*`). Drives the type filter + badge. */\n type?: string;\n /**\n * Localised type label, required for CUSTOM types (the panel resolves system\n * keys itself). Falls back to the system label for the four known keys.\n */\n typeLabel?: string;\n /**\n * Assignee id (the platform `practiceUser`). Omit ⇒ unassigned; give pool\n * tasks a shared sentinel value (e.g. `'unassigned'`) if you want the pool\n * itself filterable. Drives the assignee FILTER (exact match); the displayed\n * name is `TaskItem.assigneeLabel`.\n */\n assignee?: string;\n /** Provenance — manual vs workflow-created. Filter only. */\n createdBy?: 'user' | 'workflow';\n}\n\n/** Curated imperative handle — identifiers + structural state only, no PHI. */\nexport interface TasksPanelHandle {\n getItems: () => Array<{ id: string; status: string }>;\n selectItem: (id: string) => void;\n toggleDone: (id: string) => void;\n dismiss: (id: string) => void;\n jumpToOverdue: () => void;\n setFilter: (next: {\n status?: TasksPanelStatusFilter;\n type?: string | null;\n assignee?: string | null;\n overdueOnly?: boolean;\n }) => void;\n /** Switch the task scope segment (patient ↔ mine). The host re-feeds items. */\n changeScope: (next: TasksPanelScope) => void;\n /** Request the host to append the next page of tasks (mirrors onLoadMore). */\n loadMore: () => void;\n}\n\ninterface FilterOption {\n /** Stable value passed back through the matching `on…Change`. */\n value: string;\n /** Localised label. */\n label: string;\n}\n\nexport interface TasksPanelProps extends Omit<\n HTMLAttributes<HTMLElement>,\n 'onClick' | 'id' | 'title'\n> {\n /** Stable instance id, surfaced as `data-component-id`. */\n id?: string;\n /** Tasks to render — any order; bucketed + sorted internally (due ASC, Done last). */\n items: TasksPanelItem[];\n /** ISO-8601 \"now\" anchor — buckets + overdue compute against it. Defaults to the current instant; stories pass a fixed value. */\n nowIso?: string;\n /** Panel heading. Defaults to the localised \"Tasks\". */\n title?: string;\n /** Visual density forwarded to each TaskCard. Defaults to `sm`, matching the note and appointment rows. */\n size?: 'xs' | 'sm' | 'md';\n /** Fires when a row is activated. */\n onOpenTask?: (item: TasksPanelItem) => void;\n /** Fires when the host should toggle a task's done state. */\n onToggleDone?: (item: TasksPanelItem) => void;\n /** Fires when the host should open the task editor. Omit to hide the per-row edit action. */\n onEditTask?: (item: TasksPanelItem) => void;\n /** Fires when the host should dismiss / remove a task. Omit to hide the per-row dismiss action. */\n onDismissTask?: (item: TasksPanelItem) => void;\n /** Fires when the header \"Add\" affordance is activated. Omit to hide it. */\n onAddTask?: () => void;\n /**\n * Read-only mode — hides every write affordance (toggle / edit / dismiss /\n * add). Mirrors the platform gating writes behind `practice_task_edit`.\n */\n readOnly?: boolean;\n /**\n * Per-row trailing action toolbar, forwarded to each TaskCard's `actions`\n * slot. Overrides the default toggle / edit / dismiss buttons (the type Badge\n * is always prepended by the panel). Ignored when `readOnly`.\n */\n renderItemActions?: (item: TasksPanelItem) => ReactNode;\n\n /* ----- Scope (host-driven feed switch) ----- */\n /** Controlled scope segment. */\n scope?: TasksPanelScope;\n /** Uncontrolled initial scope. Default `'patient'` when both scopes are available, else the only one. */\n defaultScope?: TasksPanelScope;\n /** Fires when the user switches scope — the host re-feeds `items`. */\n onScopeChange?: (next: TasksPanelScope) => void;\n /** Which scopes the segment offers. Omit ⇒ no scope segment (single-scope panel). */\n availableScopes?: TasksPanelScope[];\n\n /* ----- One-way pagination ----- */\n /** Load the next page — fired when the bottom edge is reached and via the footer button. */\n onLoadMore?: () => void;\n /** Whether more tasks exist. Defaults to `true` when `onLoadMore` is set. */\n hasMore?: boolean;\n /** Show the bottom loading row while the next page is fetched. */\n loadingMore?: boolean;\n /** Full-panel initial loading state (skeleton rows in the body). */\n loading?: boolean;\n /** Error surface — `true` for the default error EmptyState, or a custom node. */\n error?: boolean | ReactNode;\n\n /* ----- Filters (mirror platform TaskFilterType) ----- */\n /** Show the filter header (status segment + type / assignee selects + overdue toggle). Default `true`. */\n showFilters?: boolean;\n /** Controlled status segment. */\n statusFilter?: TasksPanelStatusFilter;\n /** Uncontrolled initial status segment. Default `'todo'` (the platform default). */\n defaultStatusFilter?: TasksPanelStatusFilter;\n onStatusFilterChange?: (next: TasksPanelStatusFilter) => void;\n /** Task types for the type filter. Omit ⇒ no type filter. */\n typeOptions?: FilterOption[];\n /** Controlled type filter (`null`/empty ⇒ all). */\n typeFilter?: string | null;\n onTypeFilterChange?: (next: string | null) => void;\n /** Assignees for the assignee filter. Pass an explicit Unassigned option if wanted. Omit ⇒ no assignee filter. */\n assigneeOptions?: FilterOption[];\n /** Controlled assignee filter (`null`/empty ⇒ anyone). */\n assigneeFilter?: string | null;\n onAssigneeFilterChange?: (next: string | null) => void;\n /** Controlled overdue-only toggle. */\n overdueOnly?: boolean;\n /** Uncontrolled initial overdue-only state. Default `false`. */\n defaultOverdueOnly?: boolean;\n onOverdueOnlyChange?: (next: boolean) => void;\n\n /* ----- Empty ----- */\n emptyTitle?: string;\n emptyDescription?: string;\n /** CTA wired into the first-use empty state (e.g. Create task). */\n emptyAction?: { label: string; onClick: () => void };\n\n /** Accessible name for the panel region (defaults to `title`). */\n 'aria-label'?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* CVA */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva(\n [\n 'ds:flex ds:flex-col ds:h-full ds:min-h-0',\n 'ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n ].join(' '),\n {\n variants: { size: { xs: '', sm: '', md: '' } },\n defaultVariants: { size: 'sm' },\n },\n);\n\n/* Scroll region with a block-axis fade mask — identical technique to\n AppointmentTimeline, single-direction load. Disabled under reduced-motion,\n the accessible theme, and forced-colors. */\nconst scrollRegionClasses = [\n 'ds:flex-1 ds:min-h-0 ds:overflow-y-auto',\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-md)]',\n 'ds:px-[var(--spacing-md)] ds:py-[var(--spacing-xs)]',\n 'ds:[--tpl-mask-top:black] ds:[--tpl-mask-bottom:black]',\n 'ds:data-[fade-top=true]:[--tpl-mask-top:transparent]',\n 'ds:data-[fade-bottom=true]:[--tpl-mask-bottom:transparent]',\n 'ds:[mask-image:linear-gradient(to_bottom,var(--tpl-mask-top)_0,black_var(--tpl-fade-distance,var(--spacing-lg)),black_calc(100%-var(--tpl-fade-distance,var(--spacing-lg))),var(--tpl-mask-bottom)_100%)]',\n 'ds:motion-reduce:[mask-image:none]',\n 'ds:[.theme-accessible_&]:[mask-image:none]',\n 'ds:forced-colors:[mask-image:none]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:[outline-offset:-2px]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n].join(' ');\n\n/* Elevation for each reused TaskCard row: the same `--shadow-card` as the\n elevated Card that NotesPanel note rows use, so tasks and notes read as one\n family. TaskCard owns its own border + radius. The scroll region clips\n `overflow-x`, so its inline gutter is `--spacing-md` to fit the shadow. */\nconst rowElevationClass = [\n 'ds:shadow-[var(--shadow-card)] ds:bg-[color:var(--card)]',\n // Declared at rest, not only while leaving: a transition added at the\n // same moment as the value it animates has nothing to move from.\n 'ds:transition-opacity ds:duration-[var(--animation-duration)]',\n 'ds:ease-[var(--ease-out)] ds:motion-reduce:transition-none',\n].join(' ');\n\n/* A row on its way out. It keeps its space until the host drops it, so the\n list settles once rather than twice. */\nconst rowLeavingClass = 'ds:opacity-0';\n\n/* Length of the tick path below, so the dash can be drawn from nothing. */\nconst TICK_LENGTH = 12;\n\n/* The leading done control. A checkbox, not a status glyph: the row can be\n completed here, which is where people reach first. */\nfunction TaskDoneCheckbox({\n item,\n label,\n labelChecked,\n reduceMotion,\n onToggle,\n}: {\n item: TasksPanelItem;\n label: string;\n labelChecked: string;\n reduceMotion?: boolean;\n onToggle: (item: TasksPanelItem) => void;\n}) {\n const { checked, drawing, toggle } = useCheckAnimation({\n checked: item.status === 'done',\n reduceMotion,\n });\n const tone = checked\n ? // `--accent` is magenta-700 in light, the step that clears AA there.\n 'ds:text-[color:var(--accent)]'\n : item.priority === 'high'\n ? 'ds:text-[color:var(--destructive)]'\n : 'ds:text-[color:var(--muted-foreground)]';\n return (\n <button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={checked}\n aria-label={checked ? labelChecked : label}\n data-action=\"toggle-done\"\n data-drawing={drawing ? '' : undefined}\n onClick={() => {\n toggle();\n onToggle(item);\n }}\n className={`ds:group/check ds:flex ds:items-center ds:justify-center ds:rounded-[var(--radius-sm)] ds:p-[var(--spacing-2xs)] ds:hover:bg-[color:var(--muted)]/40 ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[color:var(--ring)] ds:forced-colors:focus-visible:outline-[CanvasText] ${tone}`}\n >\n <svg\n viewBox=\"0 0 18 18\"\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:transition-transform ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)] ds:group-data-[drawing]/check:scale-110 ds:motion-reduce:transition-none\"\n >\n <rect\n x=\"1.5\"\n y=\"1.5\"\n width=\"15\"\n height=\"15\"\n rx=\"4\"\n className=\"ds:fill-none ds:stroke-current ds:[stroke-width:1.5]\"\n />\n {/* The tick is drawn by retracting its dash, so it sweeps on rather\n than appearing whole. */}\n <path\n d=\"M5 9.25 L7.75 12 L13 6.25\"\n strokeDashoffset={checked ? 0 : TICK_LENGTH}\n className=\"ds:fill-none ds:stroke-current ds:[stroke-width:2] ds:[stroke-linecap:round] ds:[stroke-linejoin:round] ds:[stroke-dasharray:12] ds:transition-[stroke-dashoffset] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)] ds:motion-reduce:transition-none\"\n />\n </svg>\n </button>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* Type → Badge variant + icon (system keys only; custom ⇒ neutral) */\n/* -------------------------------------------------------------------- */\n\nconst SYSTEM_TYPE_META: Record<\n string,\n { variant: NonNullable<BadgeProps['variant']>; Icon: typeof Tag }\n> = {\n recall: { variant: 'info', Icon: Megaphone },\n payment: { variant: 'warning', Icon: Gem },\n collection: { variant: 'error', Icon: Coins },\n other: { variant: 'neutral', Icon: Tag },\n};\n\n/* -------------------------------------------------------------------- */\n/* Due-bucket grouping */\n/* -------------------------------------------------------------------- */\n\ntype BucketKey =\n | 'overdue'\n | 'today'\n | 'tomorrow'\n | 'thisWeek'\n | 'later'\n | 'done';\n\nconst BUCKET_ORDER: BucketKey[] = [\n 'overdue',\n 'today',\n 'tomorrow',\n 'thisWeek',\n 'later',\n 'done',\n];\n\ninterface Bucket {\n key: BucketKey;\n items: TasksPanelItem[];\n}\n\nfunction startOfDay(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\n}\n\n/** Boundary timestamps the buckets + the overdue notion are computed against. */\nfunction dayBoundaries(now: Date) {\n const today = startOfDay(now);\n const tomorrow = new Date(today);\n tomorrow.setDate(today.getDate() + 1);\n const dayAfter = new Date(today);\n dayAfter.setDate(today.getDate() + 2);\n // Monday-based week — start of NEXT week is the upper bound of \"This week\".\n const dow = (today.getDay() + 6) % 7;\n const nextWeek = new Date(today);\n nextWeek.setDate(today.getDate() + (7 - dow));\n return {\n startOfToday: +today,\n startOfTomorrow: +tomorrow,\n startOfDayAfter: +dayAfter,\n startOfNextWeek: +nextWeek,\n };\n}\n\nfunction bucketFor(item: TasksPanelItem, now: Date): BucketKey {\n if (item.status === 'done') return 'done';\n const { startOfToday, startOfTomorrow, startOfDayAfter, startOfNextWeek } =\n dayBoundaries(now);\n const due = +new Date(item.dueIso);\n if (due < startOfToday) return 'overdue';\n if (due < startOfTomorrow) return 'today';\n if (due < startOfDayAfter) return 'tomorrow';\n if (due < startOfNextWeek) return 'thisWeek';\n return 'later';\n}\n\n/** A task is overdue when it is not done and due before tomorrow (platform notion). */\nfunction isOverdue(item: TasksPanelItem, now: Date): boolean {\n if (item.status === 'done') return false;\n return +new Date(item.dueIso) < dayBoundaries(now).startOfTomorrow;\n}\n\nfunction groupByDueBucket(items: TasksPanelItem[], now: Date): Bucket[] {\n const map = new Map<BucketKey, TasksPanelItem[]>();\n for (const item of items) {\n const key = bucketFor(item, now);\n const list = map.get(key);\n if (list) list.push(item);\n else map.set(key, [item]);\n }\n const buckets: Bucket[] = [];\n for (const key of BUCKET_ORDER) {\n const list = map.get(key);\n if (!list || list.length === 0) continue;\n // Due ASC (most-overdue-first), mirroring the platform's ORDER BY date ASC.\n list.sort((a, b) => +new Date(a.dueIso) - +new Date(b.dueIso));\n buckets.push({ key, items: list });\n }\n return buckets;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const TasksPanel = forwardRef<HTMLElement, TasksPanelProps>(\n (\n {\n id,\n items,\n nowIso,\n title,\n size = 'sm',\n onOpenTask,\n onToggleDone,\n onEditTask,\n onDismissTask,\n onAddTask,\n readOnly = false,\n renderItemActions,\n scope,\n defaultScope,\n onScopeChange,\n availableScopes,\n onLoadMore,\n hasMore,\n loadingMore = false,\n loading = false,\n error = false,\n showFilters = true,\n statusFilter,\n defaultStatusFilter,\n onStatusFilterChange,\n typeOptions,\n typeFilter,\n onTypeFilterChange,\n assigneeOptions,\n assigneeFilter,\n onAssigneeFilterChange,\n overdueOnly,\n defaultOverdueOnly,\n onOverdueOnlyChange,\n emptyTitle,\n emptyDescription,\n emptyAction,\n className,\n 'aria-label': ariaLabel,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const headingId = useId();\n const overdueSwitchId = useId();\n const heading = title ?? t('tasksPanel.title');\n\n // Static key lookups — every label is a literal `t()` call so the i18n\n // coverage gate can see each key (template-literal keys are invisible to it).\n const statusLabels: Record<TasksPanelStatusFilter, string> = {\n todo: t('tasksPanel.status.todo'),\n done: t('tasksPanel.status.done'),\n all: t('tasksPanel.status.all'),\n };\n const scopeLabels: Record<TasksPanelScope, string> = {\n patient: t('tasksPanel.scope.patient'),\n mine: t('tasksPanel.scope.mine'),\n };\n const bucketLabels: Record<BucketKey, string> = {\n overdue: t('tasksPanel.buckets.overdue'),\n today: t('tasksPanel.buckets.today'),\n tomorrow: t('tasksPanel.buckets.tomorrow'),\n thisWeek: t('tasksPanel.buckets.thisWeek'),\n later: t('tasksPanel.buckets.later'),\n done: t('tasksPanel.buckets.done'),\n };\n const systemTypeLabels: Record<string, string> = {\n recall: t('tasksPanel.types.recall'),\n payment: t('tasksPanel.types.payment'),\n collection: t('tasksPanel.types.collection'),\n other: t('tasksPanel.types.other'),\n };\n\n const now = useMemo(\n () => (nowIso ? new Date(nowIso) : new Date()),\n [nowIso],\n );\n\n /* ----- Controlled / uncontrolled filter + scope state ----- */\n const [scopeState, setScopeState] = useState<TasksPanelScope>(\n defaultScope ?? availableScopes?.[0] ?? 'patient',\n );\n const currentScope = scope ?? scopeState;\n const changeScope = useCallback(\n (next: TasksPanelScope) => {\n if (scope === undefined) setScopeState(next);\n onScopeChange?.(next);\n },\n [scope, onScopeChange],\n );\n\n const [statusState, setStatusState] = useState<TasksPanelStatusFilter>(\n defaultStatusFilter ?? 'todo',\n );\n const currentStatus = statusFilter ?? statusState;\n const changeStatus = useCallback(\n (next: TasksPanelStatusFilter) => {\n if (statusFilter === undefined) setStatusState(next);\n onStatusFilterChange?.(next);\n },\n [statusFilter, onStatusFilterChange],\n );\n\n const [typeState, setTypeState] = useState<string | null>(null);\n const currentType = typeFilter !== undefined ? typeFilter : typeState;\n const changeType = useCallback(\n (next: string | null) => {\n if (typeFilter === undefined) setTypeState(next);\n onTypeFilterChange?.(next);\n },\n [typeFilter, onTypeFilterChange],\n );\n\n const [assigneeState, setAssigneeState] = useState<string | null>(null);\n const currentAssignee =\n assigneeFilter !== undefined ? assigneeFilter : assigneeState;\n const changeAssignee = useCallback(\n (next: string | null) => {\n if (assigneeFilter === undefined) setAssigneeState(next);\n onAssigneeFilterChange?.(next);\n },\n [assigneeFilter, onAssigneeFilterChange],\n );\n\n const [overdueState, setOverdueState] = useState<boolean>(\n defaultOverdueOnly ?? false,\n );\n const currentOverdueOnly = overdueOnly ?? overdueState;\n const changeOverdueOnly = useCallback(\n (next: boolean) => {\n if (overdueOnly === undefined) setOverdueState(next);\n onOverdueOnlyChange?.(next);\n },\n [overdueOnly, onOverdueOnlyChange],\n );\n\n const clearFilters = useCallback(() => {\n changeStatus('todo');\n changeType(null);\n changeAssignee(null);\n changeOverdueOnly(false);\n }, [changeStatus, changeType, changeAssignee, changeOverdueOnly]);\n\n /* ----- Filter → bucket ----- */\n const visible = useMemo(() => {\n return items.filter((item) => {\n const isDone = item.status === 'done';\n if (currentStatus === 'todo' && isDone) return false;\n if (currentStatus === 'done' && !isDone) return false;\n if (currentType && item.type !== currentType) return false;\n if (currentAssignee) {\n const assignee = item.assignee ?? '';\n if (assignee !== currentAssignee) return false;\n }\n if (currentOverdueOnly && !isOverdue(item, now)) return false;\n return true;\n });\n }, [\n items,\n currentStatus,\n currentType,\n currentAssignee,\n currentOverdueOnly,\n now,\n ]);\n\n const buckets = useMemo(\n () => groupByDueBucket(visible, now),\n [visible, now],\n );\n\n /* ----- Scroll region: edge fades + one-way load-more ----- */\n const scrollRef = useRef<HTMLDivElement>(null);\n const overdueHeaderRef = useRef<HTMLElement | null>(null);\n const [fadeTop, setFadeTop] = useState(false);\n const [fadeBottom, setFadeBottom] = useState(false);\n\n const updateEdges = useCallback(() => {\n const region = scrollRef.current;\n if (!region) return;\n const { scrollTop, scrollHeight, clientHeight } = region;\n setFadeTop(scrollTop > 1);\n setFadeBottom(scrollTop + clientHeight < scrollHeight - 1);\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n updateEdges();\n }, [buckets, updateEdges]);\n\n useIsomorphicLayoutEffect(() => {\n const region = scrollRef.current;\n if (!region || typeof ResizeObserver === 'undefined') return undefined;\n const observer = new ResizeObserver(updateEdges);\n observer.observe(region);\n return () => observer.disconnect();\n }, [updateEdges]);\n\n const moreAvailable = hasMore ?? !!onLoadMore;\n const handleScroll = useCallback(() => {\n updateEdges();\n const region = scrollRef.current;\n if (!region) return;\n const { scrollTop, scrollHeight, clientHeight } = region;\n if (\n onLoadMore &&\n moreAvailable &&\n !loadingMore &&\n scrollHeight - scrollTop - clientHeight <= EDGE_LOAD_THRESHOLD\n ) {\n onLoadMore();\n }\n }, [updateEdges, onLoadMore, moreAvailable, loadingMore]);\n\n /* The accessible theme zeroes `--animation-duration`, so its CSS plays\n nothing — the JS must agree, or a row would sit still for the delay\n and then vanish anyway. `undefined` leaves the media query in charge. */\n const { resolvedTheme } = useTheme();\n const reduceMotion = resolvedTheme.endsWith('-accessible') || undefined;\n\n /* Closing the gap a removed row leaves: the rows below slide up rather\n than jumping, so the eye keeps its place in the list. */\n const { containerRef: reflowRef } = useListReflow<HTMLDivElement>({\n key: visible.map((item) => item.id).join(),\n reduceMotion,\n });\n\n /* A row leaves on two paths, which want different timing: a completed\n row waits for its tick to finish drawing, a dismissed one goes at\n once. Either way the fade runs before the host is told. */\n const doneExit = useExitTransition({ delayMs: 200, reduceMotion });\n const dismissExit = useExitTransition({ reduceMotion });\n const isLeaving = (id: string): boolean =>\n doneExit.isLeaving(id) || dismissExit.isLeaving(id);\n\n const handleToggleDone = (item: TasksPanelItem): void => {\n if (!onToggleDone) return;\n const done = item.status === 'done';\n // Only fade when the row will actually leave the filtered list —\n // otherwise it would fade out and pop straight back in.\n const willLeave =\n (currentStatus === 'todo' && !done) ||\n (currentStatus === 'done' && done);\n if (willLeave) doneExit.leave(item.id, () => onToggleDone(item));\n else onToggleDone(item);\n };\n\n const handleDismiss = (item: TasksPanelItem): void => {\n if (!onDismissTask) return;\n dismissExit.leave(item.id, () => onDismissTask(item));\n };\n\n const jumpToOverdue = useCallback(() => {\n const region = scrollRef.current;\n const el = overdueHeaderRef.current;\n if (!region || !el) {\n region?.scrollTo({ top: 0 });\n return;\n }\n const delta =\n el.getBoundingClientRect().top - region.getBoundingClientRect().top;\n region.scrollTo({ top: region.scrollTop + delta });\n }, []);\n\n /* ----- Agent handle ----- */\n const itemsRef = useRef<TasksPanelItem[]>(items);\n itemsRef.current = items;\n const innerRef = useRef<HTMLElement>(null);\n useImperativeHandle(ref, () => innerRef.current as HTMLElement, []);\n\n const handle = useMemo<TasksPanelHandle>(\n () => ({\n getItems: () =>\n itemsRef.current.map((i) => ({\n id: i.id,\n status: i.status ?? 'open',\n })),\n selectItem: (targetId) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onOpenTask?.(found);\n },\n toggleDone: (targetId) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) handleToggleDone(found);\n },\n dismiss: (targetId) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) handleDismiss(found);\n },\n jumpToOverdue,\n setFilter: (next) => {\n if (next.status !== undefined) changeStatus(next.status);\n if (next.type !== undefined) changeType(next.type);\n if (next.assignee !== undefined) changeAssignee(next.assignee);\n if (next.overdueOnly !== undefined)\n changeOverdueOnly(next.overdueOnly);\n },\n changeScope,\n loadMore: () => onLoadMore?.(),\n }),\n [\n onOpenTask,\n onToggleDone,\n onDismissTask,\n jumpToOverdue,\n changeStatus,\n changeType,\n changeAssignee,\n changeOverdueOnly,\n changeScope,\n onLoadMore,\n ],\n );\n useAgentRegistration(tasksPanelAgent, handle, id);\n\n /* ----- Row rendering ----- */\n const renderTypeBadge = (item: TasksPanelItem): ReactNode => {\n if (!item.type) return null;\n const meta = SYSTEM_TYPE_META[item.type];\n const variant = meta?.variant ?? 'neutral';\n const Icon = meta?.Icon ?? Tag;\n const label = item.typeLabel ?? systemTypeLabels[item.type] ?? item.type;\n return (\n <Badge\n variant={variant}\n size=\"sm\"\n leading={<Icon aria-hidden=\"true\" />}\n >\n {label}\n </Badge>\n );\n };\n\n const defaultActions = (item: TasksPanelItem): ReactNode => {\n if (readOnly) return null;\n return (\n <>\n {onEditTask ? (\n <IconButton\n icon={<Pencil />}\n intent=\"ghost\"\n size=\"sm\"\n aria-label={t('tasksPanel.edit')}\n onClick={() => onEditTask(item)}\n />\n ) : null}\n {onDismissTask ? (\n <IconButton\n icon={<X />}\n intent=\"ghost\"\n size=\"sm\"\n aria-label={t('tasksPanel.dismiss')}\n onClick={() => handleDismiss(item)}\n />\n ) : null}\n </>\n );\n };\n\n const renderRowActions = (item: TasksPanelItem): ReactNode => {\n const custom = !readOnly ? renderItemActions?.(item) : null;\n const trailing = custom ?? defaultActions(item);\n const badge = renderTypeBadge(item);\n if (!badge && !trailing) return undefined;\n return (\n <>\n {badge}\n {trailing}\n </>\n );\n };\n\n /* ----- Body branches ----- */\n const isFirstUseEmpty = !loading && !error && items.length === 0;\n const isFilteredEmpty =\n !loading && !error && items.length > 0 && visible.length === 0;\n\n const skeletonRow = (key: string) => (\n <div\n key={key}\n aria-hidden=\"true\"\n className=\"ds:px-[var(--spacing-sm)] ds:py-[var(--spacing-xs)]\"\n >\n <Skeleton variant=\"rectangular\" height=\"3.5rem\" />\n </div>\n );\n\n let body: ReactNode;\n if (error) {\n body = (\n <div className=\"ds:flex-1 ds:min-h-0 ds:p-[var(--spacing-md)]\">\n {typeof error === 'boolean' ? (\n <EmptyState\n variant=\"error\"\n size=\"sm\"\n title={t('tasksPanel.error.title')}\n description={t('tasksPanel.error.description')}\n />\n ) : (\n error\n )}\n </div>\n );\n } else if (loading) {\n body = (\n <div className=\"ds:flex-1 ds:min-h-0 ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {[0, 1, 2, 3].map((i) => skeletonRow(`skeleton-${i}`))}\n </div>\n );\n } else if (isFirstUseEmpty) {\n body = (\n <div className=\"ds:flex-1 ds:min-h-0 ds:p-[var(--spacing-md)]\">\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={emptyTitle ?? t('tasksPanel.empty.title')}\n description={emptyDescription ?? t('tasksPanel.empty.description')}\n primaryAction={emptyAction}\n />\n </div>\n );\n } else if (isFilteredEmpty) {\n body = (\n <div className=\"ds:flex-1 ds:min-h-0 ds:p-[var(--spacing-md)]\">\n <EmptyState\n variant=\"no-results\"\n size=\"sm\"\n title={t('tasksPanel.filteredEmpty.title')}\n description={t('tasksPanel.filteredEmpty.description')}\n primaryAction={{\n label: t('tasksPanel.filteredEmpty.clear'),\n onClick: clearFilters,\n }}\n />\n </div>\n );\n } else {\n body = (\n <div\n ref={(node) => {\n scrollRef.current = node;\n reflowRef.current = node;\n }}\n // The scroll region must be keyboard-focusable so arrow / Home / End\n // can drive it (axe scrollable-region-focusable).\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n tabIndex={0}\n onScroll={handleScroll}\n data-fade-top={fadeTop ? 'true' : undefined}\n data-fade-bottom={fadeBottom ? 'true' : undefined}\n className={scrollRegionClasses}\n >\n <ol className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-md)] ds:p-0\">\n {buckets.map((bucket) => (\n <li\n key={bucket.key}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\"\n >\n <BucketHeader\n bucketKey={bucket.key}\n count={bucket.items.length}\n label={bucketLabels[bucket.key]}\n headerRef={\n bucket.key === 'overdue' ? overdueHeaderRef : undefined\n }\n reflowId={`bucket-${bucket.key}`}\n leaving={bucket.items.every((row) => isLeaving(row.id))}\n />\n <ul className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-0\">\n {bucket.items.map((item) => (\n <TaskCard\n key={item.id}\n item={item}\n size={size}\n onActivate={\n onOpenTask ? () => onOpenTask(item) : undefined\n }\n actions={renderRowActions(item)}\n leading={\n onToggleDone && !readOnly ? (\n <TaskDoneCheckbox\n item={item}\n label={t('tasksPanel.markDone')}\n labelChecked={t('tasksPanel.markNotDone')}\n reduceMotion={reduceMotion}\n onToggle={handleToggleDone}\n />\n ) : undefined\n }\n className={`${rowElevationClass} ${REFLOW_ROW_CLASS}${\n isLeaving(item.id) ? ` ${rowLeavingClass}` : ''\n }`}\n data-leaving={isLeaving(item.id) ? '' : undefined}\n data-reflow-id={item.id}\n data-task-id={item.id}\n />\n ))}\n </ul>\n </li>\n ))}\n </ol>\n {loadingMore ? skeletonRow('loading-more') : null}\n {!loadingMore && moreAvailable && onLoadMore ? (\n <div className=\"ds:flex ds:justify-center ds:py-[var(--spacing-sm)]\">\n <Button intent=\"ghost\" size=\"sm\" onClick={onLoadMore}>\n {t('tasksPanel.loadMore')}\n </Button>\n </div>\n ) : null}\n </div>\n );\n }\n\n /* ----- Filter header ----- */\n const showScopeSegment = (availableScopes?.length ?? 0) > 1;\n const statusValues: TasksPanelStatusFilter[] = ['todo', 'done', 'all'];\n\n // Add-task affordance lives in the PanelHeader action cluster (inline-end of\n // the title row); the rail injects the favourite / close after it.\n const headerActions =\n onAddTask && !readOnly ? (\n <IconButton\n icon={<Plus />}\n intent=\"outline\"\n size=\"sm\"\n aria-label={t('tasksPanel.add')}\n onClick={onAddTask}\n />\n ) : undefined;\n\n // Scope segment + filter controls share the PanelHeader filters row, stacked\n // so the scope segment keeps its own line above the filter cluster.\n const headerFilters =\n showScopeSegment || showFilters ? (\n <div className=\"ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {showScopeSegment ? (\n <ButtonGroup label={t('tasksPanel.scope.label')}>\n {availableScopes!.map((value) => {\n const active = currentScope === value;\n return (\n <Button\n key={value}\n intent={active ? 'primary' : 'outline'}\n size=\"sm\"\n aria-pressed={active}\n onClick={() => changeScope(value)}\n >\n {scopeLabels[value]}\n </Button>\n );\n })}\n </ButtonGroup>\n ) : null}\n\n {showFilters ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n <ButtonGroup label={t('tasksPanel.status.label')}>\n {statusValues.map((value) => {\n const active = currentStatus === value;\n return (\n <Button\n key={value}\n intent={active ? 'primary' : 'outline'}\n size=\"sm\"\n aria-pressed={active}\n onClick={() => changeStatus(value)}\n >\n {statusLabels[value]}\n </Button>\n );\n })}\n </ButtonGroup>\n\n {typeOptions && typeOptions.length > 0 ? (\n <Select\n size=\"sm\"\n clearable\n aria-label={t('tasksPanel.type.label')}\n placeholder={t('tasksPanel.type.placeholder')}\n options={typeOptions}\n value={currentType ?? ''}\n onValueChange={(value) => changeType(value || null)}\n />\n ) : null}\n\n {assigneeOptions && assigneeOptions.length > 0 ? (\n <Select\n size=\"sm\"\n clearable\n aria-label={t('tasksPanel.assignee.label')}\n placeholder={t('tasksPanel.assignee.placeholder')}\n options={assigneeOptions}\n value={currentAssignee ?? ''}\n onValueChange={(value) => changeAssignee(value || null)}\n />\n ) : null}\n\n <Switch\n id={overdueSwitchId}\n size=\"sm\"\n label={t('tasksPanel.overdueOnly')}\n checked={currentOverdueOnly}\n onCheckedChange={changeOverdueOnly}\n />\n </div>\n ) : null}\n </div>\n ) : undefined;\n\n return (\n <section\n ref={innerRef}\n data-component=\"tasks-panel\"\n data-component-id={id}\n aria-labelledby={ariaLabel ? undefined : headingId}\n aria-label={ariaLabel}\n className={rootVariants({ size, className })}\n {...rest}\n >\n <PanelHeader\n title={heading}\n icon={<ClipboardCheck />}\n headingId={headingId}\n actions={headerActions}\n filters={headerFilters}\n />\n\n {body}\n </section>\n );\n },\n);\n\nTasksPanel.displayName = 'TasksPanel';\n\n/* -------------------------------------------------------------------- */\n/* Bucket header — sticky label per due bucket */\n/* -------------------------------------------------------------------- */\n\ninterface BucketHeaderProps {\n bucketKey: BucketKey;\n count: number;\n label: string;\n headerRef?: React.MutableRefObject<HTMLElement | null>;\n /** Tracked by `useListReflow` so the header travels with its rows. */\n reflowId?: string;\n /** The bucket's last row is on its way out, so the header goes too. */\n leaving?: boolean;\n}\n\nfunction BucketHeader({\n bucketKey,\n count,\n label,\n headerRef,\n reflowId,\n leaving = false,\n}: BucketHeaderProps): ReactNode {\n // Overdue is tinted destructive, Today brand (+ a decorative leading dot);\n // both clear AA on the --card surface in every theme (verified via axe on the\n // stories). z-[2] sits ABOVE the reused TaskCard's z-[1] action overlay so the\n // sticky header is never painted under a card scrolling beneath it.\n const tone =\n bucketKey === 'overdue'\n ? 'ds:text-[color:var(--destructive)] ds:font-semibold'\n : bucketKey === 'today'\n ? 'ds:text-[color:var(--primary)] ds:font-semibold'\n : 'ds:text-[color:var(--muted-foreground)]';\n return (\n <div\n ref={headerRef as React.Ref<HTMLDivElement>}\n data-bucket={bucketKey}\n data-reflow-id={reflowId}\n data-leaving={leaving ? '' : undefined}\n className={[\n 'ds:sticky ds:top-0 ds:z-[2] ds:bg-[color:var(--card)] ds:py-[var(--spacing-2xs)]',\n 'ds:flex ds:items-center ds:gap-[var(--spacing-2xs)] type-eyebrow',\n // A header travels with its bucket, and leaves with it: a heading\n // left standing over nothing, or snapping while its rows glide,\n // reads as two lists rather than one.\n REFLOW_ROW_CLASS,\n 'ds:transition-opacity ds:duration-[var(--animation-duration)]',\n 'ds:ease-[var(--ease-out)] ds:motion-reduce:transition-none',\n leaving ? rowLeavingClass : '',\n tone,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {bucketKey === 'today' ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:size-1.5 ds:shrink-0 ds:rounded-[var(--radius-full)] ds:bg-[color:var(--primary)]\"\n />\n ) : null}\n {label}\n <span className=\"ds:text-[color:var(--muted-foreground)]\">\n {`(${count})`}\n </span>\n </div>\n );\n}\n\n/** Re-export of the size variant union for downstream typing. */\nexport type TasksPanelSize = NonNullable<\n VariantProps<typeof rootVariants>['size']\n>;\n"],"names":["__iconNode","Coins","createLucideIcon","Gem","Megaphone","Tag","tasksPanelAgent","handle","args","EDGE_LOAD_THRESHOLD","rootVariants","cva","scrollRegionClasses","rowElevationClass","rowLeavingClass","TICK_LENGTH","TaskDoneCheckbox","item","label","labelChecked","reduceMotion","onToggle","checked","drawing","toggle","useCheckAnimation","tone","jsx","jsxs","SYSTEM_TYPE_META","BUCKET_ORDER","startOfDay","d","dayBoundaries","now","today","tomorrow","dayAfter","dow","nextWeek","bucketFor","startOfToday","startOfTomorrow","startOfDayAfter","startOfNextWeek","due","isOverdue","groupByDueBucket","items","map","key","list","buckets","a","b","TasksPanel","forwardRef","id","nowIso","title","size","onOpenTask","onToggleDone","onEditTask","onDismissTask","onAddTask","readOnly","renderItemActions","scope","defaultScope","onScopeChange","availableScopes","onLoadMore","hasMore","loadingMore","loading","error","showFilters","statusFilter","defaultStatusFilter","onStatusFilterChange","typeOptions","typeFilter","onTypeFilterChange","assigneeOptions","assigneeFilter","onAssigneeFilterChange","overdueOnly","defaultOverdueOnly","onOverdueOnlyChange","emptyTitle","emptyDescription","emptyAction","className","ariaLabel","rest","ref","t","useTranslation","headingId","useId","overdueSwitchId","heading","statusLabels","scopeLabels","bucketLabels","systemTypeLabels","useMemo","scopeState","setScopeState","useState","currentScope","changeScope","useCallback","next","statusState","setStatusState","currentStatus","changeStatus","typeState","setTypeState","currentType","changeType","assigneeState","setAssigneeState","currentAssignee","changeAssignee","overdueState","setOverdueState","currentOverdueOnly","changeOverdueOnly","clearFilters","visible","isDone","scrollRef","useRef","overdueHeaderRef","fadeTop","setFadeTop","fadeBottom","setFadeBottom","updateEdges","region","scrollTop","scrollHeight","clientHeight","useIsomorphicLayoutEffect","observer","moreAvailable","handleScroll","resolvedTheme","useTheme","reflowRef","useListReflow","doneExit","useExitTransition","dismissExit","isLeaving","handleToggleDone","done","handleDismiss","jumpToOverdue","el","delta","itemsRef","innerRef","useImperativeHandle","i","targetId","found","useAgentRegistration","renderTypeBadge","meta","variant","Icon","Badge","defaultActions","Fragment","IconButton","Pencil","X","renderRowActions","trailing","badge","isFirstUseEmpty","isFilteredEmpty","skeletonRow","Skeleton","body","EmptyState","node","bucket","BucketHeader","row","TaskCard","REFLOW_ROW_CLASS","Button","showScopeSegment","statusValues","headerActions","Plus","headerFilters","ButtonGroup","value","active","Select","Switch","PanelHeader","ClipboardCheck","bucketKey","count","headerRef","reflowId","leaving"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
|
|
1
|
+
{"version":3,"file":"tasks-panel-DncuBPIZ.js","sources":["../../node_modules/lucide-react/dist/esm/icons/coins.mjs","../../node_modules/lucide-react/dist/esm/icons/gem.mjs","../../node_modules/lucide-react/dist/esm/icons/megaphone.mjs","../../node_modules/lucide-react/dist/esm/icons/tag.mjs","../../src/components/tasks-panel/tasks-panel.agent.ts","../../src/components/tasks-panel/tasks-panel.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M13.744 17.736a6 6 0 1 1-7.48-7.48\", key: \"bq4yh3\" }],\n [\"path\", { d: \"M15 6h1v4\", key: \"11y1tn\" }],\n [\"path\", { d: \"m6.134 14.768.866-.5 2 3.464\", key: \"17snzx\" }],\n [\"circle\", { cx: \"16\", cy: \"8\", r: \"6\", key: \"14bfc9\" }]\n];\nconst Coins = createLucideIcon(\"coins\", __iconNode);\n\nexport { __iconNode, Coins as default };\n//# sourceMappingURL=coins.mjs.map\n","/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10.5 3 8 9l4 13 4-13-2.5-6\", key: \"b3dvk1\" }],\n [\n \"path\",\n {\n d: \"M17 3a2 2 0 0 1 1.6.8l3 4a2 2 0 0 1 .013 2.382l-7.99 10.986a2 2 0 0 1-3.247 0l-7.99-10.986A2 2 0 0 1 2.4 7.8l2.998-3.997A2 2 0 0 1 7 3z\",\n key: \"7w4byz\"\n }\n ],\n [\"path\", { d: \"M2 9h20\", key: \"16fsjt\" }]\n];\nconst Gem = createLucideIcon(\"gem\", __iconNode);\n\nexport { __iconNode, Gem as default };\n//# sourceMappingURL=gem.mjs.map\n","/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M11 6a13 13 0 0 0 8.4-2.8A1 1 0 0 1 21 4v12a1 1 0 0 1-1.6.8A13 13 0 0 0 11 14H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2z\",\n key: \"q8bfy3\"\n }\n ],\n [\"path\", { d: \"M6 14a12 12 0 0 0 2.4 7.2 2 2 0 0 0 3.2-2.4A8 8 0 0 1 10 14\", key: \"1853fq\" }],\n [\"path\", { d: \"M8 6v8\", key: \"15ugcq\" }]\n];\nconst Megaphone = createLucideIcon(\"megaphone\", __iconNode);\n\nexport { __iconNode, Megaphone as default };\n//# sourceMappingURL=megaphone.mjs.map\n","/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z\",\n key: \"vktsd0\"\n }\n ],\n [\"circle\", { cx: \"7.5\", cy: \"7.5\", r: \".5\", fill: \"currentColor\", key: \"kqv944\" }]\n];\nconst Tag = createLucideIcon(\"tag\", __iconNode);\n\nexport { __iconNode, Tag as default };\n//# sourceMappingURL=tag.mjs.map\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — TasksPanel. */\n/* */\n/* Rail Tasks surface: read task ids + status (never note / patient), */\n/* activate a row, toggle done / dismiss a task, re-anchor the scroll on */\n/* the overdue bucket, and drive the filter bar — all through the curated */\n/* handle. In-page within the rail panel (no open/close — the rail owns */\n/* panel open state). Mirrors taskTrayAgent's safety mapping (select=read, */\n/* toggle_done=write, dismiss=destructive) plus AppointmentTimeline's */\n/* scroll capability; the stateful filter bar adds the `filter` capability */\n/* backed by `set_filter`. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { TasksPanelHandle } from './tasks-panel';\n\nexport const tasksPanelAgent: AgentAdapter<TasksPanelHandle> = {\n id: 'tasks-panel',\n // 'pick' backs select_item (non-persisting activation, matching\n // AppointmentTimeline); 'dismiss' backs dismiss; 'scroll' backs\n // jump_to_overdue (re-anchors the viewport); 'filter' backs set_filter (the\n // status / type / assignee / overdue filter bar is genuinely stateful);\n // 'view_change' backs change_scope (the patient ↔ mine segment); 'paginate'\n // backs load_more (append the next page of tasks).\n capabilities: [\n 'pick',\n 'dismiss',\n 'scroll',\n 'filter',\n 'view_change',\n 'paginate',\n ],\n state: {\n items: {\n type: 'Array<{ id: string; status: string }>',\n descriptionKey: 'ui.agent.tasksPanel.state.items',\n description:\n 'Currently-rendered tasks. Ids + status only — never task note / patient.',\n read: (handle) => handle.getItems(),\n },\n },\n actions: {\n select_item: {\n safety: 'read',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.tasksPanel.actions.selectItem',\n description: 'Activate the task with the given id.',\n invoke: (handle, args: { id: string }) => {\n handle.selectItem(args.id);\n },\n },\n toggle_done: {\n safety: 'write',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n descriptionKey: 'ui.agent.tasksPanel.actions.toggleDone',\n description: 'Request the host to toggle the done state of a task.',\n invoke: (handle, args: { id: string }) => {\n handle.toggleDone(args.id);\n },\n },\n dismiss: {\n safety: 'destructive',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.tasksPanel.actions.dismiss',\n description:\n 'Request the host to dismiss / remove the task with the given id.',\n invoke: (handle, args: { id: string }) => {\n handle.dismiss(args.id);\n },\n },\n jump_to_overdue: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.tasksPanel.actions.jumpToOverdue',\n description: 'Re-anchor the panel scroll on the overdue tasks.',\n invoke: (handle) => {\n handle.jumpToOverdue();\n },\n },\n set_filter: {\n safety: 'read',\n argsType:\n \"{ status?: 'todo' | 'done' | 'all'; type?: string | null; assignee?: string | null; overdueOnly?: boolean }\",\n argsSchema: {\n type: 'object',\n properties: {\n status: { type: 'string', enum: ['todo', 'done', 'all'] },\n type: { type: ['string', 'null'] },\n assignee: { type: ['string', 'null'] },\n overdueOnly: { type: 'boolean' },\n },\n },\n idempotent: true,\n descriptionKey: 'ui.agent.tasksPanel.actions.setFilter',\n description:\n 'Set the task filters (status segment, type, assignee, overdue-only). Omitted keys are left unchanged.',\n invoke: (\n handle,\n args: {\n status?: 'todo' | 'done' | 'all';\n type?: string | null;\n assignee?: string | null;\n overdueOnly?: boolean;\n },\n ) => {\n handle.setFilter(args);\n },\n },\n change_scope: {\n safety: 'read',\n argsType: \"{ scope: 'patient' | 'mine' }\",\n argsSchema: {\n type: 'object',\n properties: { scope: { type: 'string', enum: ['patient', 'mine'] } },\n required: ['scope'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.tasksPanel.actions.changeScope',\n description:\n \"Switch the task scope segment between this patient ('patient') and the operator's own tasks ('mine'). The host re-feeds the items.\",\n invoke: (handle, args: { scope: 'patient' | 'mine' }) => {\n handle.changeScope(args.scope);\n },\n },\n load_more: {\n safety: 'read',\n // Requests the host to append the next page — not idempotent (each call\n // advances the page) and reaches the host data source.\n openWorld: true,\n descriptionKey: 'ui.agent.tasksPanel.actions.loadMore',\n description: 'Request the host to append the next page of tasks.',\n invoke: (handle) => {\n handle.loadMore();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'tasks-panel',\n description: 'Marks the TasksPanel wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific panel from the agent.',\n },\n item: {\n attr: 'data-task-id',\n description:\n 'Stable task id emitted on each rendered TaskCard inside the panel.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n Coins,\n Gem,\n ClipboardCheck,\n Megaphone,\n Pencil,\n Plus,\n Tag,\n X,\n} from 'lucide-react';\nimport { Badge, type BadgeProps } from '../badge';\nimport { Button } from '../button';\nimport { IconButton } from '../button/icon-button';\nimport { ButtonGroup } from '../button-group';\nimport { PanelHeader } from '../panel-header';\nimport { Select } from '../select';\nimport { Switch } from '../switch';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { TaskCard, type TaskItem } from '../task-card';\nimport { useCheckAnimation } from '../../hooks/use-check-animation';\nimport { useExitTransition } from '../../hooks/use-exit-transition';\nimport { REFLOW_ROW_CLASS, useListReflow } from '../../hooks/use-list-reflow';\nimport { useTheme } from '../../hooks/use-theme';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { tasksPanelAgent } from './tasks-panel.agent';\n\n/* -------------------------------------------------------------------- */\n/* TasksPanel */\n/* */\n/* The Tasks tool for the Control Room rail — the next surface after */\n/* AppointmentTimeline (Appointments) and NotesPanel (Notes). It is the */\n/* rail equivalent of the in-page TaskTray: a fill-mode panel that owns */\n/* its own scroll, groups a flat task list into DUE-DATE buckets */\n/* (Overdue / Today / Tomorrow / This week / Later, with Done sunk to */\n/* the bottom), pins a filter header + per-bucket headers, and fades at */\n/* each scroll edge. Unlike AppointmentTimeline it does NOT scroll a */\n/* continuous calendar stream — platform tasks are a bounded, date-ASC */\n/* list — so there is no bidirectional infinite scroll or today-anchor, */\n/* only an optional one-way `onLoadMore`. */\n/* */\n/* Each row reuses TaskCard (no reinvention); the panel adds a coloured */\n/* type Badge (the platform's primary per-task signal) + elevation via */\n/* the card's className. All visible text flows through */\n/* useTranslation('ui') against `tasksPanel.*`; only ids + status reach */\n/* the agent adapter (no PHI). */\n/* -------------------------------------------------------------------- */\n\n/* How close (px) to the bottom edge before `onLoadMore` fires. */\nconst EDGE_LOAD_THRESHOLD = 96;\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\n/** Which set of tasks the panel shows — the host owns the actual feed. */\nexport type TasksPanelScope = 'patient' | 'mine';\n\n/** Status segment value. Mirrors the platform `done` filter (default `todo`). */\nexport type TasksPanelStatusFilter = 'todo' | 'done' | 'all';\n\n/**\n * Panel-local extension of the card's `TaskItem`. The extra fields here drive\n * bucketing + filtering; the row's display fields (the typed link via\n * `linkType` + `linkedLabel`, the `assigneeLabel`, `dueLabel`) live on\n * `TaskItem` and are rendered by `TaskCard` itself. The host maps the platform\n * `DoctorReminder` → this shape — composing `title` (a summary, NOT the bare\n * type), `note`, the linked entity, the assignee, and `dueLabel`.\n */\nexport interface TasksPanelItem extends TaskItem {\n /** ISO-8601 due/scheduled instant (platform `DoctorReminder.date`). Buckets + orders the list. */\n dueIso: string;\n /** System or custom task-type key (`recall` | `payment` | `collection` | `other` | `custom-*`). Drives the type filter + badge. */\n type?: string;\n /**\n * Localised type label, required for CUSTOM types (the panel resolves system\n * keys itself). Falls back to the system label for the four known keys.\n */\n typeLabel?: string;\n /**\n * Assignee id (the platform `practiceUser`). Omit ⇒ unassigned; give pool\n * tasks a shared sentinel value (e.g. `'unassigned'`) if you want the pool\n * itself filterable. Drives the assignee FILTER (exact match); the displayed\n * name is `TaskItem.assigneeLabel`.\n */\n assignee?: string;\n /** Provenance — manual vs workflow-created. Filter only. */\n createdBy?: 'user' | 'workflow';\n}\n\n/** Curated imperative handle — identifiers + structural state only, no PHI. */\nexport interface TasksPanelHandle {\n getItems: () => Array<{ id: string; status: string }>;\n selectItem: (id: string) => void;\n toggleDone: (id: string) => void;\n dismiss: (id: string) => void;\n jumpToOverdue: () => void;\n setFilter: (next: {\n status?: TasksPanelStatusFilter;\n type?: string | null;\n assignee?: string | null;\n overdueOnly?: boolean;\n }) => void;\n /** Switch the task scope segment (patient ↔ mine). The host re-feeds items. */\n changeScope: (next: TasksPanelScope) => void;\n /** Request the host to append the next page of tasks (mirrors onLoadMore). */\n loadMore: () => void;\n}\n\ninterface FilterOption {\n /** Stable value passed back through the matching `on…Change`. */\n value: string;\n /** Localised label. */\n label: string;\n}\n\nexport interface TasksPanelProps extends Omit<\n HTMLAttributes<HTMLElement>,\n 'onClick' | 'id' | 'title'\n> {\n /** Stable instance id, surfaced as `data-component-id`. */\n id?: string;\n /** Tasks to render — any order; bucketed + sorted internally (due ASC, Done last). */\n items: TasksPanelItem[];\n /** ISO-8601 \"now\" anchor — buckets + overdue compute against it. Defaults to the current instant; stories pass a fixed value. */\n nowIso?: string;\n /** Panel heading. Defaults to the localised \"Tasks\". */\n title?: string;\n /** Visual density forwarded to each TaskCard. Defaults to `sm`, matching the note and appointment rows. */\n size?: 'xs' | 'sm' | 'md';\n /** Fires when a row is activated. */\n onOpenTask?: (item: TasksPanelItem) => void;\n /** Fires when the host should toggle a task's done state. */\n onToggleDone?: (item: TasksPanelItem) => void;\n /** Fires when the host should open the task editor. Omit to hide the per-row edit action. */\n onEditTask?: (item: TasksPanelItem) => void;\n /** Fires when the host should dismiss / remove a task. Omit to hide the per-row dismiss action. */\n onDismissTask?: (item: TasksPanelItem) => void;\n /** Fires when the header \"Add\" affordance is activated. Omit to hide it. */\n onAddTask?: () => void;\n /**\n * Read-only mode — hides every write affordance (toggle / edit / dismiss /\n * add). Mirrors the platform gating writes behind `practice_task_edit`.\n */\n readOnly?: boolean;\n /**\n * Per-row trailing action toolbar, forwarded to each TaskCard's `actions`\n * slot. Overrides the default toggle / edit / dismiss buttons (the type Badge\n * is always prepended by the panel). Ignored when `readOnly`.\n */\n renderItemActions?: (item: TasksPanelItem) => ReactNode;\n\n /* ----- Scope (host-driven feed switch) ----- */\n /** Controlled scope segment. */\n scope?: TasksPanelScope;\n /** Uncontrolled initial scope. Default `'patient'` when both scopes are available, else the only one. */\n defaultScope?: TasksPanelScope;\n /** Fires when the user switches scope — the host re-feeds `items`. */\n onScopeChange?: (next: TasksPanelScope) => void;\n /** Which scopes the segment offers. Omit ⇒ no scope segment (single-scope panel). */\n availableScopes?: TasksPanelScope[];\n\n /* ----- One-way pagination ----- */\n /** Load the next page — fired when the bottom edge is reached and via the footer button. */\n onLoadMore?: () => void;\n /** Whether more tasks exist. Defaults to `true` when `onLoadMore` is set. */\n hasMore?: boolean;\n /** Show the bottom loading row while the next page is fetched. */\n loadingMore?: boolean;\n /** Full-panel initial loading state (skeleton rows in the body). */\n loading?: boolean;\n /** Error surface — `true` for the default error EmptyState, or a custom node. */\n error?: boolean | ReactNode;\n\n /* ----- Filters (mirror platform TaskFilterType) ----- */\n /** Show the filter header (status segment + type / assignee selects + overdue toggle). Default `true`. */\n showFilters?: boolean;\n /** Controlled status segment. */\n statusFilter?: TasksPanelStatusFilter;\n /** Uncontrolled initial status segment. Default `'todo'` (the platform default). */\n defaultStatusFilter?: TasksPanelStatusFilter;\n onStatusFilterChange?: (next: TasksPanelStatusFilter) => void;\n /** Task types for the type filter. Omit ⇒ no type filter. */\n typeOptions?: FilterOption[];\n /** Controlled type filter (`null`/empty ⇒ all). */\n typeFilter?: string | null;\n onTypeFilterChange?: (next: string | null) => void;\n /** Assignees for the assignee filter. Pass an explicit Unassigned option if wanted. Omit ⇒ no assignee filter. */\n assigneeOptions?: FilterOption[];\n /** Controlled assignee filter (`null`/empty ⇒ anyone). */\n assigneeFilter?: string | null;\n onAssigneeFilterChange?: (next: string | null) => void;\n /** Controlled overdue-only toggle. */\n overdueOnly?: boolean;\n /** Uncontrolled initial overdue-only state. Default `false`. */\n defaultOverdueOnly?: boolean;\n onOverdueOnlyChange?: (next: boolean) => void;\n\n /* ----- Empty ----- */\n emptyTitle?: string;\n emptyDescription?: string;\n /** CTA wired into the first-use empty state (e.g. Create task). */\n emptyAction?: { label: string; onClick: () => void };\n\n /** Accessible name for the panel region (defaults to `title`). */\n 'aria-label'?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* CVA */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva(\n [\n 'ds:flex ds:flex-col ds:h-full ds:min-h-0',\n 'ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n ].join(' '),\n {\n variants: { size: { xs: '', sm: '', md: '' } },\n defaultVariants: { size: 'sm' },\n },\n);\n\n/* Scroll region with a block-axis fade mask — identical technique to\n AppointmentTimeline, single-direction load. Disabled under reduced-motion,\n the accessible theme, and forced-colors. */\nconst scrollRegionClasses = [\n 'ds:flex-1 ds:min-h-0 ds:overflow-y-auto',\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-md)]',\n 'ds:px-[var(--spacing-md)] ds:py-[var(--spacing-xs)]',\n 'ds:[--tpl-mask-top:black] ds:[--tpl-mask-bottom:black]',\n 'ds:data-[fade-top=true]:[--tpl-mask-top:transparent]',\n 'ds:data-[fade-bottom=true]:[--tpl-mask-bottom:transparent]',\n 'ds:[mask-image:linear-gradient(to_bottom,var(--tpl-mask-top)_0,black_var(--tpl-fade-distance,var(--spacing-lg)),black_calc(100%-var(--tpl-fade-distance,var(--spacing-lg))),var(--tpl-mask-bottom)_100%)]',\n 'ds:motion-reduce:[mask-image:none]',\n 'ds:[.theme-accessible_&]:[mask-image:none]',\n 'ds:forced-colors:[mask-image:none]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:[outline-offset:-2px]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n].join(' ');\n\n/* Elevation for each reused TaskCard row: the same `--shadow-card` as the\n elevated Card that NotesPanel note rows use, so tasks and notes read as one\n family. TaskCard owns its own border + radius. The scroll region clips\n `overflow-x`, so its inline gutter is `--spacing-md` to fit the shadow. */\nconst rowElevationClass = [\n 'ds:shadow-[var(--shadow-card)] ds:bg-[color:var(--card)]',\n // Declared at rest, not only while leaving: a transition added at the\n // same moment as the value it animates has nothing to move from.\n 'ds:transition-opacity ds:duration-[var(--animation-duration)]',\n 'ds:ease-[var(--ease-out)] ds:motion-reduce:transition-none',\n].join(' ');\n\n/* A row on its way out. It keeps its space until the host drops it, so the\n list settles once rather than twice. */\nconst rowLeavingClass = 'ds:opacity-0';\n\n/* Length of the tick path below, so the dash can be drawn from nothing. */\nconst TICK_LENGTH = 12;\n\n/* The leading done control. A checkbox, not a status glyph: the row can be\n completed here, which is where people reach first. */\nfunction TaskDoneCheckbox({\n item,\n label,\n labelChecked,\n reduceMotion,\n onToggle,\n}: {\n item: TasksPanelItem;\n label: string;\n labelChecked: string;\n reduceMotion?: boolean;\n onToggle: (item: TasksPanelItem) => void;\n}) {\n const { checked, drawing, toggle } = useCheckAnimation({\n checked: item.status === 'done',\n reduceMotion,\n });\n const tone = checked\n ? // `--accent` is magenta-700 in light, the step that clears AA there.\n 'ds:text-[color:var(--accent)]'\n : item.priority === 'high'\n ? 'ds:text-[color:var(--destructive)]'\n : 'ds:text-[color:var(--muted-foreground)]';\n return (\n <button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={checked}\n aria-label={checked ? labelChecked : label}\n data-action=\"toggle-done\"\n data-drawing={drawing ? '' : undefined}\n onClick={() => {\n toggle();\n onToggle(item);\n }}\n className={`ds:group/check ds:flex ds:items-center ds:justify-center ds:rounded-[var(--radius-sm)] ds:p-[var(--spacing-2xs)] ds:hover:bg-[color:var(--muted)]/40 ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[color:var(--ring)] ds:forced-colors:focus-visible:outline-[CanvasText] ${tone}`}\n >\n <svg\n viewBox=\"0 0 18 18\"\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:transition-transform ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)] ds:group-data-[drawing]/check:scale-110 ds:motion-reduce:transition-none\"\n >\n <rect\n x=\"1.5\"\n y=\"1.5\"\n width=\"15\"\n height=\"15\"\n rx=\"4\"\n className=\"ds:fill-none ds:stroke-current ds:[stroke-width:1.5]\"\n />\n {/* The tick is drawn by retracting its dash, so it sweeps on rather\n than appearing whole. */}\n <path\n d=\"M5 9.25 L7.75 12 L13 6.25\"\n strokeDashoffset={checked ? 0 : TICK_LENGTH}\n className=\"ds:fill-none ds:stroke-current ds:[stroke-width:2] ds:[stroke-linecap:round] ds:[stroke-linejoin:round] ds:[stroke-dasharray:12] ds:transition-[stroke-dashoffset] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)] ds:motion-reduce:transition-none\"\n />\n </svg>\n </button>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* Type → Badge variant + icon (system keys only; custom ⇒ neutral) */\n/* -------------------------------------------------------------------- */\n\nconst SYSTEM_TYPE_META: Record<\n string,\n { variant: NonNullable<BadgeProps['variant']>; Icon: typeof Tag }\n> = {\n recall: { variant: 'info', Icon: Megaphone },\n payment: { variant: 'warning', Icon: Gem },\n collection: { variant: 'error', Icon: Coins },\n other: { variant: 'neutral', Icon: Tag },\n};\n\n/* -------------------------------------------------------------------- */\n/* Due-bucket grouping */\n/* -------------------------------------------------------------------- */\n\ntype BucketKey =\n | 'overdue'\n | 'today'\n | 'tomorrow'\n | 'thisWeek'\n | 'later'\n | 'done';\n\nconst BUCKET_ORDER: BucketKey[] = [\n 'overdue',\n 'today',\n 'tomorrow',\n 'thisWeek',\n 'later',\n 'done',\n];\n\ninterface Bucket {\n key: BucketKey;\n items: TasksPanelItem[];\n}\n\nfunction startOfDay(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\n}\n\n/** Boundary timestamps the buckets + the overdue notion are computed against. */\nfunction dayBoundaries(now: Date) {\n const today = startOfDay(now);\n const tomorrow = new Date(today);\n tomorrow.setDate(today.getDate() + 1);\n const dayAfter = new Date(today);\n dayAfter.setDate(today.getDate() + 2);\n // Monday-based week — start of NEXT week is the upper bound of \"This week\".\n const dow = (today.getDay() + 6) % 7;\n const nextWeek = new Date(today);\n nextWeek.setDate(today.getDate() + (7 - dow));\n return {\n startOfToday: +today,\n startOfTomorrow: +tomorrow,\n startOfDayAfter: +dayAfter,\n startOfNextWeek: +nextWeek,\n };\n}\n\nfunction bucketFor(item: TasksPanelItem, now: Date): BucketKey {\n if (item.status === 'done') return 'done';\n const { startOfToday, startOfTomorrow, startOfDayAfter, startOfNextWeek } =\n dayBoundaries(now);\n const due = +new Date(item.dueIso);\n if (due < startOfToday) return 'overdue';\n if (due < startOfTomorrow) return 'today';\n if (due < startOfDayAfter) return 'tomorrow';\n if (due < startOfNextWeek) return 'thisWeek';\n return 'later';\n}\n\n/** A task is overdue when it is not done and due before tomorrow (platform notion). */\nfunction isOverdue(item: TasksPanelItem, now: Date): boolean {\n if (item.status === 'done') return false;\n return +new Date(item.dueIso) < dayBoundaries(now).startOfTomorrow;\n}\n\nfunction groupByDueBucket(items: TasksPanelItem[], now: Date): Bucket[] {\n const map = new Map<BucketKey, TasksPanelItem[]>();\n for (const item of items) {\n const key = bucketFor(item, now);\n const list = map.get(key);\n if (list) list.push(item);\n else map.set(key, [item]);\n }\n const buckets: Bucket[] = [];\n for (const key of BUCKET_ORDER) {\n const list = map.get(key);\n if (!list || list.length === 0) continue;\n // Due ASC (most-overdue-first), mirroring the platform's ORDER BY date ASC.\n list.sort((a, b) => +new Date(a.dueIso) - +new Date(b.dueIso));\n buckets.push({ key, items: list });\n }\n return buckets;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const TasksPanel = forwardRef<HTMLElement, TasksPanelProps>(\n (\n {\n id,\n items,\n nowIso,\n title,\n size = 'sm',\n onOpenTask,\n onToggleDone,\n onEditTask,\n onDismissTask,\n onAddTask,\n readOnly = false,\n renderItemActions,\n scope,\n defaultScope,\n onScopeChange,\n availableScopes,\n onLoadMore,\n hasMore,\n loadingMore = false,\n loading = false,\n error = false,\n showFilters = true,\n statusFilter,\n defaultStatusFilter,\n onStatusFilterChange,\n typeOptions,\n typeFilter,\n onTypeFilterChange,\n assigneeOptions,\n assigneeFilter,\n onAssigneeFilterChange,\n overdueOnly,\n defaultOverdueOnly,\n onOverdueOnlyChange,\n emptyTitle,\n emptyDescription,\n emptyAction,\n className,\n 'aria-label': ariaLabel,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const headingId = useId();\n const overdueSwitchId = useId();\n const heading = title ?? t('tasksPanel.title');\n\n // Static key lookups — every label is a literal `t()` call so the i18n\n // coverage gate can see each key (template-literal keys are invisible to it).\n const statusLabels: Record<TasksPanelStatusFilter, string> = {\n todo: t('tasksPanel.status.todo'),\n done: t('tasksPanel.status.done'),\n all: t('tasksPanel.status.all'),\n };\n const scopeLabels: Record<TasksPanelScope, string> = {\n patient: t('tasksPanel.scope.patient'),\n mine: t('tasksPanel.scope.mine'),\n };\n const bucketLabels: Record<BucketKey, string> = {\n overdue: t('tasksPanel.buckets.overdue'),\n today: t('tasksPanel.buckets.today'),\n tomorrow: t('tasksPanel.buckets.tomorrow'),\n thisWeek: t('tasksPanel.buckets.thisWeek'),\n later: t('tasksPanel.buckets.later'),\n done: t('tasksPanel.buckets.done'),\n };\n const systemTypeLabels: Record<string, string> = {\n recall: t('tasksPanel.types.recall'),\n payment: t('tasksPanel.types.payment'),\n collection: t('tasksPanel.types.collection'),\n other: t('tasksPanel.types.other'),\n };\n\n const now = useMemo(\n () => (nowIso ? new Date(nowIso) : new Date()),\n [nowIso],\n );\n\n /* ----- Controlled / uncontrolled filter + scope state ----- */\n const [scopeState, setScopeState] = useState<TasksPanelScope>(\n defaultScope ?? availableScopes?.[0] ?? 'patient',\n );\n const currentScope = scope ?? scopeState;\n const changeScope = useCallback(\n (next: TasksPanelScope) => {\n if (scope === undefined) setScopeState(next);\n onScopeChange?.(next);\n },\n [scope, onScopeChange],\n );\n\n const [statusState, setStatusState] = useState<TasksPanelStatusFilter>(\n defaultStatusFilter ?? 'todo',\n );\n const currentStatus = statusFilter ?? statusState;\n const changeStatus = useCallback(\n (next: TasksPanelStatusFilter) => {\n if (statusFilter === undefined) setStatusState(next);\n onStatusFilterChange?.(next);\n },\n [statusFilter, onStatusFilterChange],\n );\n\n const [typeState, setTypeState] = useState<string | null>(null);\n const currentType = typeFilter !== undefined ? typeFilter : typeState;\n const changeType = useCallback(\n (next: string | null) => {\n if (typeFilter === undefined) setTypeState(next);\n onTypeFilterChange?.(next);\n },\n [typeFilter, onTypeFilterChange],\n );\n\n const [assigneeState, setAssigneeState] = useState<string | null>(null);\n const currentAssignee =\n assigneeFilter !== undefined ? assigneeFilter : assigneeState;\n const changeAssignee = useCallback(\n (next: string | null) => {\n if (assigneeFilter === undefined) setAssigneeState(next);\n onAssigneeFilterChange?.(next);\n },\n [assigneeFilter, onAssigneeFilterChange],\n );\n\n const [overdueState, setOverdueState] = useState<boolean>(\n defaultOverdueOnly ?? false,\n );\n const currentOverdueOnly = overdueOnly ?? overdueState;\n const changeOverdueOnly = useCallback(\n (next: boolean) => {\n if (overdueOnly === undefined) setOverdueState(next);\n onOverdueOnlyChange?.(next);\n },\n [overdueOnly, onOverdueOnlyChange],\n );\n\n const clearFilters = useCallback(() => {\n changeStatus('todo');\n changeType(null);\n changeAssignee(null);\n changeOverdueOnly(false);\n }, [changeStatus, changeType, changeAssignee, changeOverdueOnly]);\n\n /* ----- Filter → bucket ----- */\n const visible = useMemo(() => {\n return items.filter((item) => {\n const isDone = item.status === 'done';\n if (currentStatus === 'todo' && isDone) return false;\n if (currentStatus === 'done' && !isDone) return false;\n if (currentType && item.type !== currentType) return false;\n if (currentAssignee) {\n const assignee = item.assignee ?? '';\n if (assignee !== currentAssignee) return false;\n }\n if (currentOverdueOnly && !isOverdue(item, now)) return false;\n return true;\n });\n }, [\n items,\n currentStatus,\n currentType,\n currentAssignee,\n currentOverdueOnly,\n now,\n ]);\n\n const buckets = useMemo(\n () => groupByDueBucket(visible, now),\n [visible, now],\n );\n\n /* ----- Scroll region: edge fades + one-way load-more ----- */\n const scrollRef = useRef<HTMLDivElement>(null);\n const overdueHeaderRef = useRef<HTMLElement | null>(null);\n const [fadeTop, setFadeTop] = useState(false);\n const [fadeBottom, setFadeBottom] = useState(false);\n\n const updateEdges = useCallback(() => {\n const region = scrollRef.current;\n if (!region) return;\n const { scrollTop, scrollHeight, clientHeight } = region;\n setFadeTop(scrollTop > 1);\n setFadeBottom(scrollTop + clientHeight < scrollHeight - 1);\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n updateEdges();\n }, [buckets, updateEdges]);\n\n useIsomorphicLayoutEffect(() => {\n const region = scrollRef.current;\n if (!region || typeof ResizeObserver === 'undefined') return undefined;\n const observer = new ResizeObserver(updateEdges);\n observer.observe(region);\n return () => observer.disconnect();\n }, [updateEdges]);\n\n const moreAvailable = hasMore ?? !!onLoadMore;\n const handleScroll = useCallback(() => {\n updateEdges();\n const region = scrollRef.current;\n if (!region) return;\n const { scrollTop, scrollHeight, clientHeight } = region;\n if (\n onLoadMore &&\n moreAvailable &&\n !loadingMore &&\n scrollHeight - scrollTop - clientHeight <= EDGE_LOAD_THRESHOLD\n ) {\n onLoadMore();\n }\n }, [updateEdges, onLoadMore, moreAvailable, loadingMore]);\n\n /* The accessible theme zeroes `--animation-duration`, so its CSS plays\n nothing — the JS must agree, or a row would sit still for the delay\n and then vanish anyway. `undefined` leaves the media query in charge. */\n const { resolvedTheme } = useTheme();\n const reduceMotion = resolvedTheme.endsWith('-accessible') || undefined;\n\n /* Closing the gap a removed row leaves: the rows below slide up rather\n than jumping, so the eye keeps its place in the list. */\n const { containerRef: reflowRef } = useListReflow<HTMLDivElement>({\n key: visible.map((item) => item.id).join(),\n reduceMotion,\n });\n\n /* A row leaves on two paths, which want different timing: a completed\n row waits for its tick to finish drawing, a dismissed one goes at\n once. Either way the fade runs before the host is told. */\n const doneExit = useExitTransition({ delayMs: 200, reduceMotion });\n const dismissExit = useExitTransition({ reduceMotion });\n const isLeaving = (id: string): boolean =>\n doneExit.isLeaving(id) || dismissExit.isLeaving(id);\n\n const handleToggleDone = (item: TasksPanelItem): void => {\n if (!onToggleDone) return;\n const done = item.status === 'done';\n // Only fade when the row will actually leave the filtered list —\n // otherwise it would fade out and pop straight back in.\n const willLeave =\n (currentStatus === 'todo' && !done) ||\n (currentStatus === 'done' && done);\n if (willLeave) doneExit.leave(item.id, () => onToggleDone(item));\n else onToggleDone(item);\n };\n\n const handleDismiss = (item: TasksPanelItem): void => {\n if (!onDismissTask) return;\n dismissExit.leave(item.id, () => onDismissTask(item));\n };\n\n const jumpToOverdue = useCallback(() => {\n const region = scrollRef.current;\n const el = overdueHeaderRef.current;\n if (!region || !el) {\n region?.scrollTo({ top: 0 });\n return;\n }\n const delta =\n el.getBoundingClientRect().top - region.getBoundingClientRect().top;\n region.scrollTo({ top: region.scrollTop + delta });\n }, []);\n\n /* ----- Agent handle ----- */\n const itemsRef = useRef<TasksPanelItem[]>(items);\n itemsRef.current = items;\n const innerRef = useRef<HTMLElement>(null);\n useImperativeHandle(ref, () => innerRef.current as HTMLElement, []);\n\n const handle = useMemo<TasksPanelHandle>(\n () => ({\n getItems: () =>\n itemsRef.current.map((i) => ({\n id: i.id,\n status: i.status ?? 'open',\n })),\n selectItem: (targetId) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onOpenTask?.(found);\n },\n toggleDone: (targetId) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) handleToggleDone(found);\n },\n dismiss: (targetId) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) handleDismiss(found);\n },\n jumpToOverdue,\n setFilter: (next) => {\n if (next.status !== undefined) changeStatus(next.status);\n if (next.type !== undefined) changeType(next.type);\n if (next.assignee !== undefined) changeAssignee(next.assignee);\n if (next.overdueOnly !== undefined)\n changeOverdueOnly(next.overdueOnly);\n },\n changeScope,\n loadMore: () => onLoadMore?.(),\n }),\n [\n onOpenTask,\n onToggleDone,\n onDismissTask,\n jumpToOverdue,\n changeStatus,\n changeType,\n changeAssignee,\n changeOverdueOnly,\n changeScope,\n onLoadMore,\n ],\n );\n useAgentRegistration(tasksPanelAgent, handle, id);\n\n /* ----- Row rendering ----- */\n const renderTypeBadge = (item: TasksPanelItem): ReactNode => {\n if (!item.type) return null;\n const meta = SYSTEM_TYPE_META[item.type];\n const variant = meta?.variant ?? 'neutral';\n const Icon = meta?.Icon ?? Tag;\n const label = item.typeLabel ?? systemTypeLabels[item.type] ?? item.type;\n return (\n <Badge\n variant={variant}\n size=\"sm\"\n leading={<Icon aria-hidden=\"true\" />}\n >\n {label}\n </Badge>\n );\n };\n\n const defaultActions = (item: TasksPanelItem): ReactNode => {\n if (readOnly) return null;\n return (\n <>\n {onEditTask ? (\n <IconButton\n icon={<Pencil />}\n intent=\"ghost\"\n size=\"sm\"\n aria-label={t('tasksPanel.edit')}\n onClick={() => onEditTask(item)}\n />\n ) : null}\n {onDismissTask ? (\n <IconButton\n icon={<X />}\n intent=\"ghost\"\n size=\"sm\"\n aria-label={t('tasksPanel.dismiss')}\n onClick={() => handleDismiss(item)}\n />\n ) : null}\n </>\n );\n };\n\n const renderRowActions = (item: TasksPanelItem): ReactNode => {\n const custom = !readOnly ? renderItemActions?.(item) : null;\n const trailing = custom ?? defaultActions(item);\n const badge = renderTypeBadge(item);\n if (!badge && !trailing) return undefined;\n return (\n <>\n {badge}\n {trailing}\n </>\n );\n };\n\n /* ----- Body branches ----- */\n const isFirstUseEmpty = !loading && !error && items.length === 0;\n const isFilteredEmpty =\n !loading && !error && items.length > 0 && visible.length === 0;\n\n const skeletonRow = (key: string) => (\n <div\n key={key}\n aria-hidden=\"true\"\n className=\"ds:px-[var(--spacing-sm)] ds:py-[var(--spacing-xs)]\"\n >\n <Skeleton variant=\"rectangular\" height=\"3.5rem\" />\n </div>\n );\n\n let body: ReactNode;\n if (error) {\n body = (\n <div className=\"ds:flex-1 ds:min-h-0 ds:p-[var(--spacing-md)]\">\n {typeof error === 'boolean' ? (\n <EmptyState\n variant=\"error\"\n size=\"sm\"\n title={t('tasksPanel.error.title')}\n description={t('tasksPanel.error.description')}\n />\n ) : (\n error\n )}\n </div>\n );\n } else if (loading) {\n body = (\n <div className=\"ds:flex-1 ds:min-h-0 ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {[0, 1, 2, 3].map((i) => skeletonRow(`skeleton-${i}`))}\n </div>\n );\n } else if (isFirstUseEmpty) {\n body = (\n <div className=\"ds:flex-1 ds:min-h-0 ds:p-[var(--spacing-md)]\">\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={emptyTitle ?? t('tasksPanel.empty.title')}\n description={emptyDescription ?? t('tasksPanel.empty.description')}\n primaryAction={emptyAction}\n />\n </div>\n );\n } else if (isFilteredEmpty) {\n body = (\n <div className=\"ds:flex-1 ds:min-h-0 ds:p-[var(--spacing-md)]\">\n <EmptyState\n variant=\"no-results\"\n size=\"sm\"\n title={t('tasksPanel.filteredEmpty.title')}\n description={t('tasksPanel.filteredEmpty.description')}\n primaryAction={{\n label: t('tasksPanel.filteredEmpty.clear'),\n onClick: clearFilters,\n }}\n />\n </div>\n );\n } else {\n body = (\n <div\n ref={(node) => {\n scrollRef.current = node;\n reflowRef.current = node;\n }}\n // The scroll region must be keyboard-focusable so arrow / Home / End\n // can drive it (axe scrollable-region-focusable).\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n tabIndex={0}\n onScroll={handleScroll}\n data-fade-top={fadeTop ? 'true' : undefined}\n data-fade-bottom={fadeBottom ? 'true' : undefined}\n className={scrollRegionClasses}\n >\n <ol className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-md)] ds:p-0\">\n {buckets.map((bucket) => (\n <li\n key={bucket.key}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\"\n >\n <BucketHeader\n bucketKey={bucket.key}\n count={bucket.items.length}\n label={bucketLabels[bucket.key]}\n headerRef={\n bucket.key === 'overdue' ? overdueHeaderRef : undefined\n }\n reflowId={`bucket-${bucket.key}`}\n leaving={bucket.items.every((row) => isLeaving(row.id))}\n />\n <ul className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-0\">\n {bucket.items.map((item) => (\n <TaskCard\n key={item.id}\n item={item}\n size={size}\n onActivate={\n onOpenTask ? () => onOpenTask(item) : undefined\n }\n actions={renderRowActions(item)}\n leading={\n onToggleDone && !readOnly ? (\n <TaskDoneCheckbox\n item={item}\n label={t('tasksPanel.markDone')}\n labelChecked={t('tasksPanel.markNotDone')}\n reduceMotion={reduceMotion}\n onToggle={handleToggleDone}\n />\n ) : undefined\n }\n className={`${rowElevationClass} ${REFLOW_ROW_CLASS}${\n isLeaving(item.id) ? ` ${rowLeavingClass}` : ''\n }`}\n data-leaving={isLeaving(item.id) ? '' : undefined}\n data-reflow-id={item.id}\n data-task-id={item.id}\n />\n ))}\n </ul>\n </li>\n ))}\n </ol>\n {loadingMore ? skeletonRow('loading-more') : null}\n {!loadingMore && moreAvailable && onLoadMore ? (\n <div className=\"ds:flex ds:justify-center ds:py-[var(--spacing-sm)]\">\n <Button intent=\"ghost\" size=\"sm\" onClick={onLoadMore}>\n {t('tasksPanel.loadMore')}\n </Button>\n </div>\n ) : null}\n </div>\n );\n }\n\n /* ----- Filter header ----- */\n const showScopeSegment = (availableScopes?.length ?? 0) > 1;\n const statusValues: TasksPanelStatusFilter[] = ['todo', 'done', 'all'];\n\n // Add-task affordance lives in the PanelHeader action cluster (inline-end of\n // the title row); the rail injects the favourite / close after it.\n const headerActions =\n onAddTask && !readOnly ? (\n <IconButton\n icon={<Plus />}\n intent=\"outline\"\n size=\"sm\"\n aria-label={t('tasksPanel.add')}\n onClick={onAddTask}\n />\n ) : undefined;\n\n // Scope segment + filter controls share the PanelHeader filters row, stacked\n // so the scope segment keeps its own line above the filter cluster.\n const headerFilters =\n showScopeSegment || showFilters ? (\n <div className=\"ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {showScopeSegment ? (\n <ButtonGroup label={t('tasksPanel.scope.label')}>\n {availableScopes!.map((value) => {\n const active = currentScope === value;\n return (\n <Button\n key={value}\n intent={active ? 'primary' : 'outline'}\n size=\"sm\"\n aria-pressed={active}\n onClick={() => changeScope(value)}\n >\n {scopeLabels[value]}\n </Button>\n );\n })}\n </ButtonGroup>\n ) : null}\n\n {showFilters ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n <ButtonGroup label={t('tasksPanel.status.label')}>\n {statusValues.map((value) => {\n const active = currentStatus === value;\n return (\n <Button\n key={value}\n intent={active ? 'primary' : 'outline'}\n size=\"sm\"\n aria-pressed={active}\n onClick={() => changeStatus(value)}\n >\n {statusLabels[value]}\n </Button>\n );\n })}\n </ButtonGroup>\n\n {typeOptions && typeOptions.length > 0 ? (\n <Select\n size=\"sm\"\n clearable\n aria-label={t('tasksPanel.type.label')}\n placeholder={t('tasksPanel.type.placeholder')}\n options={typeOptions}\n value={currentType ?? ''}\n onValueChange={(value) => changeType(value || null)}\n />\n ) : null}\n\n {assigneeOptions && assigneeOptions.length > 0 ? (\n <Select\n size=\"sm\"\n clearable\n aria-label={t('tasksPanel.assignee.label')}\n placeholder={t('tasksPanel.assignee.placeholder')}\n options={assigneeOptions}\n value={currentAssignee ?? ''}\n onValueChange={(value) => changeAssignee(value || null)}\n />\n ) : null}\n\n <Switch\n id={overdueSwitchId}\n size=\"sm\"\n label={t('tasksPanel.overdueOnly')}\n checked={currentOverdueOnly}\n onCheckedChange={changeOverdueOnly}\n />\n </div>\n ) : null}\n </div>\n ) : undefined;\n\n return (\n <section\n ref={innerRef}\n data-component=\"tasks-panel\"\n data-component-id={id}\n aria-labelledby={ariaLabel ? undefined : headingId}\n aria-label={ariaLabel}\n className={rootVariants({ size, className })}\n {...rest}\n >\n <PanelHeader\n title={heading}\n icon={<ClipboardCheck />}\n headingId={headingId}\n actions={headerActions}\n filters={headerFilters}\n />\n\n {body}\n </section>\n );\n },\n);\n\nTasksPanel.displayName = 'TasksPanel';\n\n/* -------------------------------------------------------------------- */\n/* Bucket header — sticky label per due bucket */\n/* -------------------------------------------------------------------- */\n\ninterface BucketHeaderProps {\n bucketKey: BucketKey;\n count: number;\n label: string;\n headerRef?: React.MutableRefObject<HTMLElement | null>;\n /** Tracked by `useListReflow` so the header travels with its rows. */\n reflowId?: string;\n /** The bucket's last row is on its way out, so the header goes too. */\n leaving?: boolean;\n}\n\nfunction BucketHeader({\n bucketKey,\n count,\n label,\n headerRef,\n reflowId,\n leaving = false,\n}: BucketHeaderProps): ReactNode {\n // Overdue is tinted destructive, Today brand (+ a decorative leading dot);\n // both clear AA on the --card surface in every theme (verified via axe on the\n // stories). z-[2] sits ABOVE the reused TaskCard's z-[1] action overlay so the\n // sticky header is never painted under a card scrolling beneath it.\n const tone =\n bucketKey === 'overdue'\n ? 'ds:text-[color:var(--destructive)] ds:font-semibold'\n : bucketKey === 'today'\n ? 'ds:text-[color:var(--primary)] ds:font-semibold'\n : 'ds:text-[color:var(--muted-foreground)]';\n return (\n <div\n ref={headerRef as React.Ref<HTMLDivElement>}\n data-bucket={bucketKey}\n data-reflow-id={reflowId}\n data-leaving={leaving ? '' : undefined}\n className={[\n 'ds:sticky ds:top-0 ds:z-[2] ds:bg-[color:var(--card)] ds:py-[var(--spacing-2xs)]',\n 'ds:flex ds:items-center ds:gap-[var(--spacing-2xs)] type-eyebrow',\n // A header travels with its bucket, and leaves with it: a heading\n // left standing over nothing, or snapping while its rows glide,\n // reads as two lists rather than one.\n REFLOW_ROW_CLASS,\n 'ds:transition-opacity ds:duration-[var(--animation-duration)]',\n 'ds:ease-[var(--ease-out)] ds:motion-reduce:transition-none',\n leaving ? rowLeavingClass : '',\n tone,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {bucketKey === 'today' ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:size-1.5 ds:shrink-0 ds:rounded-[var(--radius-full)] ds:bg-[color:var(--primary)]\"\n />\n ) : null}\n {label}\n <span className=\"ds:text-[color:var(--muted-foreground)]\">\n {`(${count})`}\n </span>\n </div>\n );\n}\n\n/** Re-export of the size variant union for downstream typing. */\nexport type TasksPanelSize = NonNullable<\n VariantProps<typeof rootVariants>['size']\n>;\n"],"names":["__iconNode","Coins","createLucideIcon","Gem","Megaphone","Tag","tasksPanelAgent","handle","args","EDGE_LOAD_THRESHOLD","rootVariants","cva","scrollRegionClasses","rowElevationClass","rowLeavingClass","TICK_LENGTH","TaskDoneCheckbox","item","label","labelChecked","reduceMotion","onToggle","checked","drawing","toggle","useCheckAnimation","tone","jsx","jsxs","SYSTEM_TYPE_META","BUCKET_ORDER","startOfDay","d","dayBoundaries","now","today","tomorrow","dayAfter","dow","nextWeek","bucketFor","startOfToday","startOfTomorrow","startOfDayAfter","startOfNextWeek","due","isOverdue","groupByDueBucket","items","map","key","list","buckets","a","b","TasksPanel","forwardRef","id","nowIso","title","size","onOpenTask","onToggleDone","onEditTask","onDismissTask","onAddTask","readOnly","renderItemActions","scope","defaultScope","onScopeChange","availableScopes","onLoadMore","hasMore","loadingMore","loading","error","showFilters","statusFilter","defaultStatusFilter","onStatusFilterChange","typeOptions","typeFilter","onTypeFilterChange","assigneeOptions","assigneeFilter","onAssigneeFilterChange","overdueOnly","defaultOverdueOnly","onOverdueOnlyChange","emptyTitle","emptyDescription","emptyAction","className","ariaLabel","rest","ref","t","useTranslation","headingId","useId","overdueSwitchId","heading","statusLabels","scopeLabels","bucketLabels","systemTypeLabels","useMemo","scopeState","setScopeState","useState","currentScope","changeScope","useCallback","next","statusState","setStatusState","currentStatus","changeStatus","typeState","setTypeState","currentType","changeType","assigneeState","setAssigneeState","currentAssignee","changeAssignee","overdueState","setOverdueState","currentOverdueOnly","changeOverdueOnly","clearFilters","visible","isDone","scrollRef","useRef","overdueHeaderRef","fadeTop","setFadeTop","fadeBottom","setFadeBottom","updateEdges","region","scrollTop","scrollHeight","clientHeight","useIsomorphicLayoutEffect","observer","moreAvailable","handleScroll","resolvedTheme","useTheme","reflowRef","useListReflow","doneExit","useExitTransition","dismissExit","isLeaving","handleToggleDone","done","handleDismiss","jumpToOverdue","el","delta","itemsRef","innerRef","useImperativeHandle","i","targetId","found","useAgentRegistration","renderTypeBadge","meta","variant","Icon","Badge","defaultActions","Fragment","IconButton","Pencil","X","renderRowActions","trailing","badge","isFirstUseEmpty","isFilteredEmpty","skeletonRow","Skeleton","body","EmptyState","node","bucket","BucketHeader","row","TaskCard","REFLOW_ROW_CLASS","Button","showScopeSegment","statusValues","headerActions","Plus","headerFilters","ButtonGroup","value","active","Select","Switch","PanelHeader","ClipboardCheck","bucketKey","count","headerRef","reflowId","leaving"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
|
|
@@ -3,7 +3,7 @@ import { forwardRef as M, useRef as k, useImperativeHandle as N, useMemo as _, u
|
|
|
3
3
|
import { c as P } from "./index-D2ZczOXr.js";
|
|
4
4
|
import { useTranslation as g } from "react-i18next";
|
|
5
5
|
import { I as y } from "./icon-button-CehAeZoP.js";
|
|
6
|
-
import { I as j } from "./icon-button-group-
|
|
6
|
+
import { I as j } from "./icon-button-group-DZKC6KGf.js";
|
|
7
7
|
import { S as K } from "./switch-OILsBLWo.js";
|
|
8
8
|
import { D as o } from "./dropdown-menu-DU-Hrf33.js";
|
|
9
9
|
import { u as x } from "./use-theme-CAuo6EYT.js";
|
|
@@ -364,4 +364,4 @@ export {
|
|
|
364
364
|
F as T,
|
|
365
365
|
D as t
|
|
366
366
|
};
|
|
367
|
-
//# sourceMappingURL=theme-toggle-
|
|
367
|
+
//# sourceMappingURL=theme-toggle-BP0XRGMM.js.map
|