@alfadocs/ui-kit-debug 1.45.0 → 1.46.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-D43ASl8y.js → booking-B7gA9gFB.js} +279 -296
- package/dist/_chunks/booking-B7gA9gFB.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-B7KvZ1_D.js → calendar-workspace-BB-BZT7W.js} +3002 -2912
- package/dist/_chunks/calendar-workspace-BB-BZT7W.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/{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-DUj1htsH.js} +2 -2
- package/dist/_chunks/{patient-details-C8ImUrVg.js.map → patient-details-DUj1htsH.js.map} +1 -1
- package/dist/_chunks/{patient-field-row-BRSOKvme.js → patient-field-row-CO0WR7yA.js} +2 -2
- package/dist/_chunks/patient-field-row-CO0WR7yA.js.map +1 -0
- package/dist/_chunks/{patient-summary-card-BhmKB2KR.js → patient-summary-card-DNzdYjxE.js} +59 -45
- package/dist/_chunks/patient-summary-card-DNzdYjxE.js.map +1 -0
- package/dist/_chunks/rich-text-editor-BwDV2XkZ.js +4153 -0
- package/dist/_chunks/rich-text-editor-BwDV2XkZ.js.map +1 -0
- 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 +32 -4
- package/dist/agent-i18n/en.json +1 -1
- 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/index.js +1 -1
- 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/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/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/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 +31 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +33 -2
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +31 -0
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +33 -2
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +31 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +33 -2
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +31 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +33 -2
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +31 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +33 -2
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +31 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +33 -2
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +31 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +33 -2
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +31 -0
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +33 -2
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +31 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +33 -2
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +31 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +33 -2
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +31 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +33 -2
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +31 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +33 -2
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +31 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +33 -2
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +31 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +33 -2
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +31 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +33 -2
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +31 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +33 -2
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +31 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +33 -2
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +31 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +33 -2
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +646 -639
- package/dist/index.js.map +1 -1
- package/dist/locales/ar.json +33 -2
- package/dist/locales/de.json +33 -2
- package/dist/locales/el.json +33 -2
- package/dist/locales/en.json +33 -2
- package/dist/locales/es.json +33 -2
- package/dist/locales/fr.json +33 -2
- package/dist/locales/hi.json +33 -2
- package/dist/locales/it.json +33 -2
- package/dist/locales/ja.json +33 -2
- package/dist/locales/nl.json +33 -2
- package/dist/locales/pl.json +33 -2
- package/dist/locales/pt.json +33 -2
- package/dist/locales/ro.json +33 -2
- package/dist/locales/ru.json +33 -2
- package/dist/locales/sq.json +33 -2
- package/dist/locales/sv.json +33 -2
- package/dist/locales/tr.json +33 -2
- package/dist/locales/zh.json +33 -2
- 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-workspace.d.ts +6 -4
- package/dist/patterns/calendar/calendar-workspace.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.data.d.ts +9 -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 +3 -1
- 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.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.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/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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-button-group-DZKC6KGf.js","sources":["../../src/components/icon-button-group/icon-button-group.tsx"],"sourcesContent":["import {\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n useCallback,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Ellipsis } from 'lucide-react';\nimport { IconButton, type IconButtonProps } from '../button/icon-button';\nimport type { ButtonProps } from '../button/button';\nimport { DropdownMenu } from '../dropdown-menu';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { usePriorityOverflow } from '../../hooks/use-priority-overflow';\n\ntype ButtonIntent = NonNullable<ButtonProps['intent']>;\n\n/**\n * A bare boolean `inert` JSX prop is unsafe across this kit's peer range\n * (`^18.2.0 || ^19.0.0`; the devDependency pins React 19.2.0, so neither\n * Storybook nor CI exercises React 18 here). React 18 doesn't recognise\n * `inert` as a boolean HTML attribute and drops a bare `true` silently —\n * which is what the platform (react-dom 18.3.1) hit, leaving these\n * `aria-hidden` measurement/trigger clones focusable and clickable.\n * Passing a non-boolean value like `inert=\"\"` instead makes it WORSE on\n * React 19: it recognises `inert` as boolean and explicitly warns\n * \"Received an empty string for a non-boolean attribute `inert`... will\n * treat the attribute as if it were false\", dropping it there too — see\n * the full comment on `forceInert` in `button-group.tsx` (this is the\n * same component shape, duplicated here for the same reason).\n */\nfunction forceInert<T extends HTMLElement>(node: T | null): void {\n if (node) node.inert = true;\n}\n\n// Intentionally does NOT compose `@radix-ui/react-toggle-group`. Radix\n// ToggleGroup's render shape makes it hard to layer shared-border chrome\n// across children (first-child / last-child / internal-divider CSS), and\n// the three-mode + three-role matrix (group / toolbar / radiogroup × momentary\n// / toggle-single / toggle-multi) is broader than Radix's single / multi\n// contract. The roving-tabindex implementation below mirrors Radix's pattern\n// so keyboard semantics stay consistent. See 05-accessibility.mdx for the\n// WAI-ARIA toolbar / radiogroup references.\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst iconButtonGroupVariants = cva(\n [\n 'ds:inline-flex ds:isolate',\n // Hairline border around the group unifies the children into one\n // visual unit. Internal child dividers are drawn via the per-child\n // class list below.\n 'ds:border ds:border-border',\n 'ds:rounded-[var(--radius-md)]',\n // Ensure the focus ring of a pressed child sits above its siblings.\n 'ds:[&>*]:relative ds:[&>*:focus-visible]:z-10',\n ].join(' '),\n {\n variants: {\n orientation: {\n horizontal: [\n 'ds:flex-row',\n // Flatten internal corners on children so the outer radius owns\n // the rounded edges.\n 'ds:[&>*:not(:first-child)]:rounded-s-none',\n 'ds:[&>*:not(:last-child)]:rounded-e-none',\n // Internal divider — logical so it flips in RTL.\n 'ds:[&>*:not(:first-child)]:border-s',\n 'ds:[&>*:not(:first-child)]:border-border',\n // The children already own an outer border (from IconButton's\n // own border in secondary/outline variants). Collapse the doubled\n // border so we don't get a 2px seam.\n 'ds:[&>*]:border-0',\n ].join(' '),\n vertical: [\n 'ds:flex-col',\n // Vertical groups flow block-wise. Reading direction doesn't\n // invert vertical stacks in any locale this DS targets, so the\n // physical `rounded-t/b` is intentional.\n 'ds:[&>*:not(:first-child)]:rounded-t-none',\n 'ds:[&>*:not(:last-child)]:rounded-b-none',\n 'ds:[&>*:not(:first-child)]:border-t',\n 'ds:[&>*:not(:first-child)]:border-border',\n 'ds:[&>*]:border-0',\n ].join(' '),\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n },\n);\n\n// Hidden measurement rows: laid out (so widths are real) but invisible,\n// non-interactive and out of the a11y tree. Never display:none.\nconst MEASURE_ROW_CLASSES =\n 'ds:absolute ds:start-0 ds:top-0 ds:invisible ds:pointer-events-none';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type IconButtonGroupRole = 'group' | 'toolbar' | 'radiogroup';\nexport type IconButtonGroupMode =\n | 'momentary'\n | 'toggle-single'\n | 'toggle-multi';\n\ntype SharedPropsBase = {\n /** Forwarded to every child that does not set its own `size`. */\n size?: 'sm' | 'md' | 'lg';\n orientation?: 'horizontal' | 'vertical';\n /** Disables every child. Uses `aria-disabled` on children (not the HTML\n * attribute) so each child still takes focus — matches WAI-ARIA toolbar\n * guidance. Visual disabled styling picks up the `aria-disabled:*`\n * variant declared on the Button base class. */\n disabled?: boolean;\n /** Intent applied to every child that does not set its own `intent`.\n * Defaults to `outline` — grouped icon buttons are peers, not a row\n * of solid-primary CTAs. */\n intent?: ButtonIntent;\n /** `'menu'` keeps the strip on one line whatever the container width:\n * children that stop fitting move into a dropdown behind an ellipsis\n * trigger, preserving toggle semantics (radio / checkbox items). The\n * group then fills its container's inline size. Horizontal only.\n * Children set `data-overflow-pin` to always stay in the strip. */\n overflow?: 'none' | 'menu';\n children: ReactNode;\n};\n\n// At least one of `aria-label` / `aria-labelledby` must be present. This\n// discriminated pair makes the TypeScript compiler reject a group with\n// neither — see the a11y acceptance criteria in the user story.\ntype AccessibleNameProps =\n | { 'aria-label': string; 'aria-labelledby'?: never }\n | { 'aria-label'?: never; 'aria-labelledby': string };\n\ntype SharedProps = SharedPropsBase & AccessibleNameProps;\n\n// Role + mode combinations are not all valid. Encoded via a discriminated\n// union so the compiler rejects nonsensical pairings (e.g. a multi-select\n// radiogroup).\ntype GroupRoleProps =\n | { role?: 'group'; mode?: 'momentary' | 'toggle-single' | 'toggle-multi' }\n | { role: 'toolbar'; mode?: 'momentary' | 'toggle-single' | 'toggle-multi' }\n | { role: 'radiogroup'; mode: 'toggle-single' };\n\ntype MomentaryProps = SharedProps & {\n mode?: 'momentary';\n value?: never;\n defaultValue?: never;\n onValueChange?: never;\n};\n\ntype ToggleSingleProps = SharedProps & {\n mode: 'toggle-single';\n value?: string;\n defaultValue?: string;\n onValueChange?: (next: string) => void;\n};\n\ntype ToggleMultiProps = SharedProps & {\n mode: 'toggle-multi';\n value?: string[];\n defaultValue?: string[];\n onValueChange?: (next: string[]) => void;\n};\n\nexport type IconButtonGroupProps = (\n | MomentaryProps\n | ToggleSingleProps\n | ToggleMultiProps\n) &\n GroupRoleProps &\n Omit<HTMLAttributes<HTMLDivElement>, 'role' | 'onChange' | 'children'> &\n VariantProps<typeof iconButtonGroupVariants>;\n\n/* ------------------------------------------------------------------ */\n/* IconButtonGroup */\n/* ------------------------------------------------------------------ */\n\nexport const IconButtonGroup = forwardRef<HTMLDivElement, IconButtonGroupProps>(\n (props, ref) => {\n const {\n size,\n orientation = 'horizontal',\n role = 'group',\n mode = 'momentary',\n disabled = false,\n intent = 'outline',\n overflow = 'none',\n className,\n children,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n // Controlled-value props are consumed via `props as …` below; strip them\n // here so they never spread onto the root <div> (React would warn that\n // `onValueChange` is an unknown DOM event handler).\n value: _value,\n defaultValue: _defaultValue,\n onValueChange: _onValueChange,\n ...rest\n } = props as IconButtonGroupProps & { className?: string };\n const { t } = useTranslation();\n\n if (import.meta.env.DEV && !ariaLabel && !ariaLabelledBy) {\n console.warn(\n 'IconButtonGroup: `aria-label` or `aria-labelledby` is required for accessibility.',\n );\n }\n if (\n import.meta.env.DEV &&\n overflow === 'menu' &&\n orientation === 'vertical'\n ) {\n console.warn(\n 'IconButtonGroup: overflow=\"menu\" is horizontal-only; falling back to overflow=\"none\".',\n );\n }\n const overflowEnabled = overflow === 'menu' && orientation !== 'vertical';\n\n /* ---- Controlled / uncontrolled value for toggle modes --------- */\n const [internalValue, setInternalValue] = useState<string | string[]>(\n () => {\n if (mode === 'toggle-single') {\n const p = props as ToggleSingleProps;\n return p.defaultValue ?? '';\n }\n if (mode === 'toggle-multi') {\n const p = props as ToggleMultiProps;\n return p.defaultValue ?? [];\n }\n return '';\n },\n );\n\n const resolvedValue: string | string[] = (() => {\n if (mode === 'toggle-single') {\n const p = props as ToggleSingleProps;\n return p.value !== undefined ? p.value : internalValue;\n }\n if (mode === 'toggle-multi') {\n const p = props as ToggleMultiProps;\n return p.value !== undefined ? p.value : internalValue;\n }\n return '';\n })();\n\n const commitValue = useCallback(\n (next: string | string[]) => {\n if (mode === 'toggle-single') {\n const p = props as ToggleSingleProps;\n if (p.value === undefined) setInternalValue(next as string);\n p.onValueChange?.(next as string);\n } else if (mode === 'toggle-multi') {\n const p = props as ToggleMultiProps;\n if (p.value === undefined) setInternalValue(next as string[]);\n p.onValueChange?.(next as string[]);\n }\n },\n [mode, props],\n );\n\n /* ---- Roving tabindex state — only active in toolbar / radiogroup - */\n const rovingTabindex = role === 'toolbar' || role === 'radiogroup';\n const buttonsRef = useRef<Array<HTMLButtonElement | null>>([]);\n const [focusIndex, setFocusIndex] = useState(0);\n\n const registerIndex = useCallback(\n (index: number, el: HTMLButtonElement | null) => {\n buttonsRef.current[index] = el;\n },\n [],\n );\n\n const rootRef = useRef<HTMLDivElement | null>(null);\n const [isRTL, setIsRTL] = useState(false);\n // `useLayoutEffect` so the direction is correct BEFORE the first paint\n // (otherwise a user pressing an arrow key on the first frame after mount\n // would hit the default-LTR mapping even in an RTL document).\n useIsomorphicLayoutEffect(() => {\n if (typeof window === 'undefined') return;\n const node = rootRef.current;\n if (!node) return;\n // Read the computed direction from the group's own wrapper so a\n // scoped `dir='rtl'` on any ancestor (not just <html>) flips arrow\n // navigation. `getComputedStyle` walks up automatically.\n const dir = window.getComputedStyle(node).direction;\n setIsRTL(dir === 'rtl');\n }, []);\n\n /* ---- Arrow-key navigation for roving tabindex ----------------- */\n const handleRootKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (!rovingTabindex) return;\n const count = buttonsRef.current.filter(Boolean).length;\n if (count === 0) return;\n\n const forwardKey =\n orientation === 'vertical'\n ? 'ArrowDown'\n : isRTL\n ? 'ArrowLeft'\n : 'ArrowRight';\n const backwardKey =\n orientation === 'vertical'\n ? 'ArrowUp'\n : isRTL\n ? 'ArrowRight'\n : 'ArrowLeft';\n\n let next: number | null = null;\n if (event.key === forwardKey) next = (focusIndex + 1) % count;\n else if (event.key === backwardKey)\n next = (focusIndex - 1 + count) % count;\n else if (event.key === 'Home') next = 0;\n else if (event.key === 'End') next = count - 1;\n\n if (next === null) return;\n // Skip over disabled children.\n const maxAttempts = count;\n let attempts = 0;\n let candidate = next;\n while (attempts < maxAttempts) {\n const el = buttonsRef.current[candidate];\n if (\n el &&\n el.getAttribute('aria-disabled') !== 'true' &&\n !el.disabled\n ) {\n break;\n }\n candidate =\n event.key === backwardKey || event.key === 'End'\n ? (candidate - 1 + count) % count\n : (candidate + 1) % count;\n attempts += 1;\n }\n event.preventDefault();\n setFocusIndex(candidate);\n buttonsRef.current[candidate]?.focus();\n // WAI-ARIA radiogroup pattern: arrow keys MOVE focus AND CHANGE\n // the selected radio in one action. toolbar pattern (and plain\n // group) only moves focus.\n if (role === 'radiogroup' && mode === 'toggle-single') {\n const child = childArrayRef.current[candidate];\n if (child && typeof child === 'object' && 'props' in child) {\n const cValue = (child as ReactElement<{ value?: string }>).props\n .value;\n // Same guard as the click path: re-committing the already\n // selected value is a no-op, so Home/End on the selected radio\n // never fires a spurious onValueChange.\n if (cValue && cValue !== resolvedValue) commitValue(cValue);\n }\n }\n },\n [\n rovingTabindex,\n orientation,\n isRTL,\n focusIndex,\n role,\n mode,\n commitValue,\n resolvedValue,\n ],\n );\n\n /* ---- Overflow bookkeeping (menu mode only) --------------------- */\n type OverflowChildProps = IconButtonProps & {\n value?: string;\n 'data-overflow-pin'?: boolean | 'true' | '';\n };\n const allElements = overflowEnabled\n ? (Children.toArray(children).filter(isValidElement) as Array<\n ReactElement<OverflowChildProps>\n >)\n : [];\n const mirrorLabel = (child: ReactElement<OverflowChildProps>) => {\n const aria = child.props['aria-label'];\n if (typeof aria === 'string') return aria;\n return typeof child.props.tooltip === 'string'\n ? child.props.tooltip\n : null;\n };\n const warnedRef = useRef(false);\n const pinnedFlags = allElements.map((child) => {\n const explicit = child.props['data-overflow-pin'] !== undefined;\n const mirrorable = mirrorLabel(child) !== null;\n if (\n import.meta.env.DEV &&\n !explicit &&\n !mirrorable &&\n !warnedRef.current\n ) {\n warnedRef.current = true;\n console.warn(\n 'IconButtonGroup: a child without aria-label / tooltip cannot move into the overflow menu — it stays pinned in the strip.',\n );\n }\n return explicit || !mirrorable;\n });\n\n const { containerRef, fullRowRef, triggerProbeRef, visible, overflowing } =\n usePriorityOverflow({\n enabled: overflowEnabled,\n count: allElements.length,\n pinned: pinnedFlags,\n });\n // `fullRowRef`/`triggerProbeRef` are already stable (`useCallback([])`\n // inside the hook), so wrapping them keeps a stable identity too —\n // required so the ref callback fires once per mount rather than on\n // every render. See `forceInert` above.\n const fullRowInertRef = useCallback(\n (node: HTMLDivElement | null) => {\n forceInert(node);\n fullRowRef(node);\n },\n [fullRowRef],\n );\n const triggerProbeInertRef = useCallback(\n (node: HTMLSpanElement | null) => {\n forceInert(node);\n triggerProbeRef(node);\n },\n [triggerProbeRef],\n );\n\n const triggerNodeRef = useRef<HTMLButtonElement | null>(null);\n\n /* ---- Build enhanced children ---------------------------------- */\n const childArray = overflowEnabled\n ? allElements.filter((_, i) => visible[i])\n : Children.toArray(children);\n if (overflowEnabled) {\n buttonsRef.current.length = childArray.length + (overflowing ? 1 : 0);\n }\n // Mirror into a ref so the keydown handler (referenced from Memo deps)\n // can read the latest child list without inflating the dep array.\n const childArrayRef = useRef<ReturnType<typeof Children.toArray>>([]);\n childArrayRef.current = childArray;\n\n // APG radiogroup pattern: Tab must land on the CHECKED radio, not the\n // first one. Keep the roving tab stop pinned to the selected child —\n // covers initial mount (checked child not first) and controlled value\n // changes. Arrow/click interactions already align focusIndex with the\n // selection, so this effect is a no-op for them.\n const checkedIndex =\n role === 'radiogroup' && mode === 'toggle-single'\n ? childArray.findIndex(\n (child) =>\n isValidElement(child) &&\n (child as ReactElement<{ value?: string }>).props.value ===\n resolvedValue,\n )\n : -1;\n useEffect(() => {\n if (checkedIndex >= 0) setFocusIndex(checkedIndex);\n }, [checkedIndex]);\n\n const visibleCount = childArray.length;\n // Clamp the roving focus when items move into the menu; hand real focus\n // to the trigger only when the focused node was the one that left.\n useEffect(() => {\n if (!rovingTabindex || !overflowEnabled) return;\n const total = visibleCount + (overflowing ? 1 : 0);\n if (total > 0 && focusIndex >= total) {\n setFocusIndex(total - 1);\n if (document.activeElement === document.body) {\n triggerNodeRef.current?.focus();\n }\n }\n }, [\n rovingTabindex,\n overflowEnabled,\n visibleCount,\n overflowing,\n focusIndex,\n ]);\n\n /* The roving tabindex seeds at 0, but an HTML-disabled child takes\n no tabindex at all — if the first children are disabled (a Save\n that is not yet committable, say) Tab could not enter the group\n and its remaining buttons became unreachable. Seed on the first\n child that can actually hold focus; the arrow keys already skip\n disabled children the same way. */\n /* `loading` counts: Button renders `disabled={disabled || loading}`,\n so a leading loading child takes no tab stop either. */\n const childIsDisabled = (child: unknown): boolean => {\n if (!isValidElement(child)) return false;\n const props = (\n child as ReactElement<{\n disabled?: boolean;\n loading?: boolean;\n }>\n ).props;\n return props.disabled === true || props.loading === true;\n };\n const firstFocusable = childArray.findIndex((c) => !childIsDisabled(c));\n const effectiveFocusIndex = !childIsDisabled(childArray[focusIndex])\n ? focusIndex\n : firstFocusable !== -1\n ? firstFocusable\n : /* Every visible child is disabled: the overflow trigger is the\n only thing left that can hold focus. Without this the group\n has no tab stop at all and the menu is unreachable. */\n overflowing\n ? visibleCount\n : focusIndex;\n\n const enhanced = childArray.map((child, index) => {\n if (!isValidElement(child)) {\n if (import.meta.env.DEV) {\n console.warn(\n 'IconButtonGroup: children should be <IconButton> elements.',\n );\n }\n return child;\n }\n\n const childEl = child as ReactElement<\n IconButtonProps & {\n value?: string;\n asChild?: boolean;\n children?: ReactNode;\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n }\n >;\n\n // DEV-time sanity: warn if we got something that isn't an IconButton.\n // `React.cloneElement` would still work, but IconButton-specific\n // props (::before target size, forwarded tooltip) wouldn't apply.\n // `asChild` wrappers (e.g. DropdownMenu.Trigger) are fine when they\n // Slot-merge the cloned props onto their own IconButton child, as are\n // components that declare a static `rendersIconButton` marker (the\n // DataTable toolbar leaves — each renders one IconButton trigger and\n // forwards ref/tabIndex/onFocus to it).\n if (import.meta.env.DEV && childEl.type !== IconButton) {\n const slotChild =\n childEl.props.asChild === true ? childEl.props.children : null;\n const wrapsIconButton =\n isValidElement(slotChild) && slotChild.type === IconButton;\n const rendersIconButton =\n (childEl.type as { rendersIconButton?: boolean })\n .rendersIconButton === true;\n if (!wrapsIconButton && !rendersIconButton) {\n console.warn(\n 'IconButtonGroup: each child should be a DS <IconButton>. Other elements break target-size + focus-ring contracts.',\n );\n }\n }\n\n const childValue = childEl.props.value;\n\n // Compute aria-pressed / aria-checked for toggle modes.\n const { ariaPressed, ariaChecked } = computeToggleAria(\n mode,\n role,\n childValue,\n resolvedValue,\n );\n\n const groupDisabled = disabled === true;\n const childDisabled = childEl.props.disabled === true;\n\n // Click handling — wrap so aria-disabled (group-level) blocks\n // activation, then forward to the child's own onClick.\n const wrappedOnClick: React.MouseEventHandler<HTMLButtonElement> = (\n event,\n ) => {\n // aria-disabled is advisory; the native click still fires. Block\n // it explicitly when the GROUP (not the child) is disabled.\n if (groupDisabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n // Forward to the child's own handler first so consumers can run\n // analytics / preventDefault.\n childEl.props.onClick?.(event);\n if (event.defaultPrevented) return;\n if (!childValue) return;\n if (mode === 'toggle-single') {\n // Contract: exactly one pressed. Clicking the pressed one is a\n // no-op. This matches Radix ToggleGroup type='single' and the\n // radiogroup pattern.\n if (resolvedValue === childValue) return;\n commitValue(childValue);\n } else if (mode === 'toggle-multi') {\n const list = resolvedValue as string[];\n const next = list.includes(childValue)\n ? list.filter((v) => v !== childValue)\n : [...list, childValue];\n commitValue(next);\n }\n };\n\n // cloneElement's typed overload rejects `ref` as a prop, so we\n // build the override bag as `unknown` and cast to the element's\n // prop type. React at runtime routes `ref` via its usual channel.\n const setMergedRef = (node: HTMLButtonElement | null) => {\n registerIndex(index, node);\n const originalRef = (\n childEl as unknown as { ref?: React.Ref<HTMLButtonElement> }\n ).ref;\n if (typeof originalRef === 'function') originalRef(node);\n else if (\n originalRef !== null &&\n originalRef !== undefined &&\n typeof originalRef === 'object'\n ) {\n (\n originalRef as React.MutableRefObject<HTMLButtonElement | null>\n ).current = node;\n }\n };\n\n // Per the user story: group-level disabled injects `aria-disabled`\n // so the child stays focusable; child-level `disabled` still uses\n // the HTML attribute (child's own contract). When both are true\n // we leave the HTML disabled in place (strictest cue wins).\n const ariaDisabled = groupDisabled && !childDisabled ? true : undefined;\n\n // If the group is disabled OR we are in a toggle mode, we need the\n // wrapped click handler. In pure momentary mode with no group\n // disable, the child's own onClick is passed through unchanged.\n const needsWrappedClick = mode !== 'momentary' || groupDisabled;\n\n const overrides = {\n intent: childEl.props.intent ?? intent,\n size: childEl.props.size ?? size,\n disabled: childDisabled,\n 'aria-disabled': ariaDisabled,\n onClick: needsWrappedClick ? wrappedOnClick : childEl.props.onClick,\n 'aria-pressed': ariaPressed,\n 'aria-checked': ariaChecked,\n // When the group is a radiogroup, children must be `role=\"radio\"`\n // so screen readers announce them as radio buttons and so\n // `getByRole('radio')` works in tests. The button element is\n // re-purposed as a radio; `aria-checked` above carries the state.\n role: role === 'radiogroup' ? 'radio' : undefined,\n tabIndex: rovingTabindex\n ? index === effectiveFocusIndex\n ? 0\n : -1\n : undefined,\n onFocus: (ev: React.FocusEvent<HTMLButtonElement>) => {\n if (rovingTabindex) setFocusIndex(index);\n childEl.props.onFocus?.(ev);\n },\n ref: setMergedRef,\n } as unknown as Partial<IconButtonProps>;\n\n return cloneElement(childEl, overrides);\n });\n\n const mergedRootRef = (node: HTMLDivElement | null) => {\n rootRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref && typeof ref === 'object') {\n (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }\n };\n\n if (!overflowEnabled) {\n return (\n <div\n ref={mergedRootRef}\n role={role}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-orientation={role === 'toolbar' ? orientation : undefined}\n onKeyDown={handleRootKeyDown}\n className={iconButtonGroupVariants({ orientation, className })}\n data-component=\"icon-button-group\"\n {...rest}\n >\n {enhanced}\n </div>\n );\n }\n\n /* ---- Menu path: measurement rows + strip + ellipsis trigger ---- */\n const moreLabel = t('buttonGroup.more', 'More options');\n const groupDisabled = disabled === true;\n const overflowItems = allElements\n .map((childEl, i) => ({ childEl, i }))\n .filter(({ i }) => !visible[i]);\n\n let menuContent: ReactNode = null;\n if (mode === 'toggle-single') {\n menuContent = (\n <DropdownMenu.RadioGroup\n value={resolvedValue as string}\n onValueChange={(v) => {\n if (!groupDisabled && v !== resolvedValue) commitValue(v);\n }}\n >\n {overflowItems.map(({ childEl, i }) => (\n <DropdownMenu.RadioItem\n key={childEl.key ?? i}\n value={childEl.props.value ?? ''}\n disabled={groupDisabled || childEl.props.disabled === true}\n >\n {mirrorLabel(childEl)}\n </DropdownMenu.RadioItem>\n ))}\n </DropdownMenu.RadioGroup>\n );\n } else if (mode === 'toggle-multi') {\n menuContent = overflowItems.map(({ childEl, i }) => {\n const v = childEl.props.value;\n const list = resolvedValue as string[];\n const checked = v ? list.includes(v) : false;\n return (\n <DropdownMenu.CheckboxItem\n key={childEl.key ?? i}\n checked={checked}\n disabled={groupDisabled || childEl.props.disabled === true}\n onCheckedChange={() => {\n if (groupDisabled || !v) return;\n commitValue(checked ? list.filter((x) => x !== v) : [...list, v]);\n }}\n >\n {mirrorLabel(childEl)}\n </DropdownMenu.CheckboxItem>\n );\n });\n } else {\n menuContent = overflowItems.map(({ childEl, i }) => (\n <DropdownMenu.Item\n key={childEl.key ?? i}\n startIcon={childEl.props.icon}\n disabled={groupDisabled || childEl.props.disabled === true}\n onSelect={(event) => {\n childEl.props.onClick?.(\n event as unknown as React.MouseEvent<HTMLButtonElement>,\n );\n }}\n >\n {mirrorLabel(childEl)}\n </DropdownMenu.Item>\n ));\n }\n\n const trigger = overflowing ? (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n icon={<Ellipsis />}\n intent={intent}\n size={size}\n aria-label={moreLabel}\n ref={(node: HTMLButtonElement | null) => {\n triggerNodeRef.current = node;\n registerIndex(visibleCount, node);\n }}\n tabIndex={\n rovingTabindex\n ? effectiveFocusIndex === visibleCount\n ? 0\n : -1\n : undefined\n }\n onFocus={\n rovingTabindex ? () => setFocusIndex(visibleCount) : undefined\n }\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">{menuContent}</DropdownMenu.Content>\n </DropdownMenu.Root>\n ) : null;\n\n const stripClasses = iconButtonGroupVariants({ orientation });\n // A radiogroup may own only radios, so its trigger sits beside the strip;\n // toolbar / group keep the trigger inside as the last joined control.\n const triggerInside = role !== 'radiogroup';\n const stripDiv = (\n <div\n role={role}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-orientation={role === 'toolbar' ? orientation : undefined}\n onKeyDown={triggerInside ? handleRootKeyDown : undefined}\n className={`${stripClasses} ds:max-w-full`}\n >\n {enhanced}\n {triggerInside ? trigger : null}\n </div>\n );\n\n return (\n <div\n ref={mergedRootRef}\n data-component=\"icon-button-group\"\n className={[\n 'ds:relative ds:block ds:w-full ds:min-w-0 ds:overflow-x-clip',\n className ?? '',\n ]\n .join(' ')\n .trim()}\n {...rest}\n >\n <div ref={containerRef} className=\"ds:block ds:w-full ds:min-w-0\">\n <div\n ref={fullRowInertRef}\n aria-hidden=\"true\"\n inert\n className={`${MEASURE_ROW_CLASSES} ${stripClasses}`}\n >\n {allElements.map((childEl, i) =>\n cloneElement(childEl, {\n key: childEl.key ?? i,\n intent: childEl.props.intent ?? intent,\n size: childEl.props.size ?? size,\n tabIndex: -1,\n ref: null,\n } as Partial<OverflowChildProps>),\n )}\n </div>\n <span\n ref={triggerProbeInertRef}\n aria-hidden=\"true\"\n inert\n className={MEASURE_ROW_CLASSES}\n >\n <IconButton\n icon={<Ellipsis />}\n intent={intent}\n size={size}\n aria-label={moreLabel}\n tabIndex={-1}\n />\n </span>\n {triggerInside ? (\n stripDiv\n ) : (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions -- non-focusable wrapper; arrow-key roving bubbles up from the focusable IconButtons in the strip and the overflow trigger\n <div\n className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\"\n onKeyDown={handleRootKeyDown}\n >\n {stripDiv}\n {trigger}\n </div>\n )}\n </div>\n </div>\n );\n },\n);\n\nIconButtonGroup.displayName = 'IconButtonGroup';\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction computeToggleAria(\n mode: IconButtonGroupMode,\n role: IconButtonGroupRole,\n childValue: string | undefined,\n resolvedValue: string | string[],\n): { ariaPressed?: boolean; ariaChecked?: boolean } {\n if (mode === 'momentary' || !childValue) return {};\n\n const isActive =\n mode === 'toggle-multi'\n ? (resolvedValue as string[]).includes(childValue)\n : resolvedValue === childValue;\n\n // radiogroup uses aria-checked; toolbar/group use aria-pressed.\n if (role === 'radiogroup') {\n return { ariaChecked: isActive };\n }\n return { ariaPressed: isActive };\n}\n"],"names":["forceInert","node","iconButtonGroupVariants","cva","MEASURE_ROW_CLASSES","IconButtonGroup","forwardRef","props","ref","size","orientation","role","mode","disabled","intent","overflow","className","children","ariaLabel","ariaLabelledBy","_value","_defaultValue","_onValueChange","rest","t","useTranslation","overflowEnabled","internalValue","setInternalValue","useState","resolvedValue","p","commitValue","useCallback","next","_a","_b","rovingTabindex","buttonsRef","useRef","focusIndex","setFocusIndex","registerIndex","index","el","rootRef","isRTL","setIsRTL","useIsomorphicLayoutEffect","dir","handleRootKeyDown","event","count","forwardKey","backwardKey","maxAttempts","attempts","candidate","child","childArrayRef","cValue","allElements","Children","isValidElement","mirrorLabel","aria","pinnedFlags","explicit","mirrorable","containerRef","fullRowRef","triggerProbeRef","visible","overflowing","usePriorityOverflow","fullRowInertRef","triggerProbeInertRef","triggerNodeRef","childArray","_","i","checkedIndex","useEffect","visibleCount","total","childIsDisabled","firstFocusable","c","effectiveFocusIndex","enhanced","childEl","childValue","ariaPressed","ariaChecked","computeToggleAria","groupDisabled","childDisabled","wrappedOnClick","list","v","setMergedRef","originalRef","ariaDisabled","needsWrappedClick","overrides","ev","cloneElement","mergedRootRef","jsx","moreLabel","overflowItems","menuContent","DropdownMenu","checked","x","trigger","jsxs","IconButton","Ellipsis","stripClasses","triggerInside","stripDiv","isActive"],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { createElement as e } from "react";
|
|
2
|
+
import { P as i } from "./pregnancy-dating-DcyV9ZRD.js";
|
|
3
|
+
import { P as o } from "./pregnancy-weight-gain-Bfq4Kwt5.js";
|
|
4
|
+
import { G as r } from "./gestational-age-calculator-CwbecTul.js";
|
|
5
|
+
import { C as c } from "./cycle-calculator-BH2StWoT.js";
|
|
6
|
+
import { F as s } from "./fetal-weight-wx4ycKc6.js";
|
|
7
|
+
import { c as a } from "./createLucideIcon-DhHxpK9K.js";
|
|
8
|
+
import { B as n } from "./baby-Dku-Xvg9.js";
|
|
9
|
+
import { H as d } from "./heart--qCA4ffe.js";
|
|
10
|
+
/**
|
|
11
|
+
* @license lucide-react v1.22.0 - ISC
|
|
12
|
+
*
|
|
13
|
+
* This source code is licensed under the ISC license.
|
|
14
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
15
|
+
*/
|
|
16
|
+
const l = [
|
|
17
|
+
[
|
|
18
|
+
"path",
|
|
19
|
+
{ d: "M12.127 22H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v5.125", key: "vxdnp4" }
|
|
20
|
+
],
|
|
21
|
+
[
|
|
22
|
+
"path",
|
|
23
|
+
{
|
|
24
|
+
d: "M14.62 18.8A2.25 2.25 0 1 1 18 15.836a2.25 2.25 0 1 1 3.38 2.966l-2.626 2.856a.998.998 0 0 1-1.507 0z",
|
|
25
|
+
key: "15cy7q"
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
["path", { d: "M16 2v4", key: "4m81vk" }],
|
|
29
|
+
["path", { d: "M3 10h18", key: "8toen8" }],
|
|
30
|
+
["path", { d: "M8 2v4", key: "1cmpym" }]
|
|
31
|
+
], p = a("calendar-heart", l);
|
|
32
|
+
/**
|
|
33
|
+
* @license lucide-react v1.22.0 - ISC
|
|
34
|
+
*
|
|
35
|
+
* This source code is licensed under the ISC license.
|
|
36
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
37
|
+
*/
|
|
38
|
+
const k = [
|
|
39
|
+
["path", { d: "M12 3v18", key: "108xh3" }],
|
|
40
|
+
["path", { d: "m19 8 3 8a5 5 0 0 1-6 0zV7", key: "zcdpyk" }],
|
|
41
|
+
["path", { d: "M3 7h1a17 17 0 0 0 8-2 17 17 0 0 0 8 2h1", key: "1yorad" }],
|
|
42
|
+
["path", { d: "m5 8 3 8a5 5 0 0 1-6 0zV7", key: "eua70x" }],
|
|
43
|
+
["path", { d: "M7 21h10", key: "1b0cd5" }]
|
|
44
|
+
], g = a("scale", k), I = [
|
|
45
|
+
{
|
|
46
|
+
id: "pregnancy-dating",
|
|
47
|
+
label: "insert.title.pregnancyDating",
|
|
48
|
+
icon: e(p),
|
|
49
|
+
kind: "panel",
|
|
50
|
+
contexts: ["note", "diagnosis"],
|
|
51
|
+
source: { kind: "kit" },
|
|
52
|
+
render: ({ insert: t }) => e(i, { onInsert: t })
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
id: "pregnancy-weight-gain",
|
|
56
|
+
label: "insert.title.weightGain",
|
|
57
|
+
icon: e(n),
|
|
58
|
+
kind: "panel",
|
|
59
|
+
contexts: ["note", "diagnosis"],
|
|
60
|
+
source: { kind: "kit" },
|
|
61
|
+
render: ({ insert: t }) => e(o, { onInsert: t })
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: "gestational-age-calculator",
|
|
65
|
+
label: "insert.title.gestationalAge",
|
|
66
|
+
icon: e(n),
|
|
67
|
+
kind: "panel",
|
|
68
|
+
contexts: ["note", "diagnosis"],
|
|
69
|
+
source: { kind: "kit" },
|
|
70
|
+
render: ({ insert: t }) => e(r, { onInsert: t })
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
id: "cycle-calculator",
|
|
74
|
+
label: "insert.title.cycle",
|
|
75
|
+
icon: e(d),
|
|
76
|
+
kind: "panel",
|
|
77
|
+
contexts: ["note", "diagnosis"],
|
|
78
|
+
source: { kind: "kit" },
|
|
79
|
+
render: ({ insert: t }) => e(c, { onInsert: t })
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
id: "fetal-weight",
|
|
83
|
+
label: "insert.title.fetalWeight",
|
|
84
|
+
icon: e(g),
|
|
85
|
+
kind: "panel",
|
|
86
|
+
contexts: ["note", "diagnosis"],
|
|
87
|
+
source: { kind: "kit" },
|
|
88
|
+
render: ({ insert: t }) => e(s, { onInsert: t })
|
|
89
|
+
}
|
|
90
|
+
];
|
|
91
|
+
export {
|
|
92
|
+
I as k
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=kit-extensions-DuoFF1R3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kit-extensions-DuoFF1R3.js","sources":["../../node_modules/lucide-react/dist/esm/icons/calendar-heart.mjs","../../node_modules/lucide-react/dist/esm/icons/scale.mjs","../../src/components/rich-text-editor/kit-extensions.ts"],"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 [\n \"path\",\n { d: \"M12.127 22H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v5.125\", key: \"vxdnp4\" }\n ],\n [\n \"path\",\n {\n d: \"M14.62 18.8A2.25 2.25 0 1 1 18 15.836a2.25 2.25 0 1 1 3.38 2.966l-2.626 2.856a.998.998 0 0 1-1.507 0z\",\n key: \"15cy7q\"\n }\n ],\n [\"path\", { d: \"M16 2v4\", key: \"4m81vk\" }],\n [\"path\", { d: \"M3 10h18\", key: \"8toen8\" }],\n [\"path\", { d: \"M8 2v4\", key: \"1cmpym\" }]\n];\nconst CalendarHeart = createLucideIcon(\"calendar-heart\", __iconNode);\n\nexport { __iconNode, CalendarHeart as default };\n//# sourceMappingURL=calendar-heart.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: \"M12 3v18\", key: \"108xh3\" }],\n [\"path\", { d: \"m19 8 3 8a5 5 0 0 1-6 0zV7\", key: \"zcdpyk\" }],\n [\"path\", { d: \"M3 7h1a17 17 0 0 0 8-2 17 17 0 0 0 8 2h1\", key: \"1yorad\" }],\n [\"path\", { d: \"m5 8 3 8a5 5 0 0 1-6 0zV7\", key: \"eua70x\" }],\n [\"path\", { d: \"M7 21h10\", key: \"1b0cd5\" }]\n];\nconst Scale = createLucideIcon(\"scale\", __iconNode);\n\nexport { __iconNode, Scale as default };\n//# sourceMappingURL=scale.mjs.map\n","import { createElement } from 'react';\nimport { Baby, CalendarHeart, Heart, Scale } from 'lucide-react';\nimport { PregnancyDating } from '../pregnancy-dating';\nimport { PregnancyWeightGain } from '../pregnancy-weight-gain';\nimport { GestationalAgeCalculator } from '../gestational-age-calculator';\nimport { CycleCalculator } from '../cycle-calculator';\nimport { FetalWeight } from '../fetal-weight';\nimport type { EditorExtension } from './editor-extensions';\n\n/** Labels are resolved by the editor's useTranslation, including live locale changes. */\nexport const kitEditorExtensions: EditorExtension[] = [\n {\n id: 'pregnancy-dating',\n label: 'insert.title.pregnancyDating',\n icon: createElement(CalendarHeart),\n kind: 'panel',\n contexts: ['note', 'diagnosis'],\n source: { kind: 'kit' },\n render: ({ insert }) =>\n createElement(PregnancyDating, { onInsert: insert }),\n },\n {\n id: 'pregnancy-weight-gain',\n label: 'insert.title.weightGain',\n icon: createElement(Baby),\n kind: 'panel',\n contexts: ['note', 'diagnosis'],\n source: { kind: 'kit' },\n render: ({ insert }) =>\n createElement(PregnancyWeightGain, { onInsert: insert }),\n },\n {\n id: 'gestational-age-calculator',\n label: 'insert.title.gestationalAge',\n icon: createElement(Baby),\n kind: 'panel',\n contexts: ['note', 'diagnosis'],\n source: { kind: 'kit' },\n render: ({ insert }) =>\n createElement(GestationalAgeCalculator, { onInsert: insert }),\n },\n {\n id: 'cycle-calculator',\n label: 'insert.title.cycle',\n icon: createElement(Heart),\n kind: 'panel',\n contexts: ['note', 'diagnosis'],\n source: { kind: 'kit' },\n render: ({ insert }) =>\n createElement(CycleCalculator, { onInsert: insert }),\n },\n {\n id: 'fetal-weight',\n label: 'insert.title.fetalWeight',\n icon: createElement(Scale),\n kind: 'panel',\n contexts: ['note', 'diagnosis'],\n source: { kind: 'kit' },\n render: ({ insert }) => createElement(FetalWeight, { onInsert: insert }),\n },\n];\n"],"names":["__iconNode","CalendarHeart","createLucideIcon","Scale","kitEditorExtensions","createElement","insert","PregnancyDating","Baby","PregnancyWeightGain","GestationalAgeCalculator","Heart","CycleCalculator","FetalWeight"],"mappings":";;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMA,IAAa;AAAA,EACjB;AAAA,IACE;AAAA,IACA,EAAE,GAAG,qEAAqE,KAAK,SAAQ;AAAA,EAC3F;AAAA,EACE;AAAA,IACE;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,KAAK;AAAA,IACX;AAAA,EACA;AAAA,EACE,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAQ,CAAE;AAAA,EACxC,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAAA,EACzC,CAAC,QAAQ,EAAE,GAAG,UAAU,KAAK,SAAQ,CAAE;AACzC,GACMC,IAAgBC,EAAiB,kBAAkBF,CAAU;ACzBnE;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMA,IAAa;AAAA,EACjB,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAAA,EACzC,CAAC,QAAQ,EAAE,GAAG,8BAA8B,KAAK,SAAQ,CAAE;AAAA,EAC3D,CAAC,QAAQ,EAAE,GAAG,4CAA4C,KAAK,SAAQ,CAAE;AAAA,EACzE,CAAC,QAAQ,EAAE,GAAG,6BAA6B,KAAK,SAAQ,CAAE;AAAA,EAC1D,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAC3C,GACMG,IAAQD,EAAiB,SAASF,CAAU,GCNrCI,IAAyC;AAAA,EACpD;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAMC,EAAcJ,CAAa;AAAA,IACjC,MAAM;AAAA,IACN,UAAU,CAAC,QAAQ,WAAW;AAAA,IAC9B,QAAQ,EAAE,MAAM,MAAA;AAAA,IAChB,QAAQ,CAAC,EAAE,QAAAK,EAAA,MACTD,EAAcE,GAAiB,EAAE,UAAUD,EAAA,CAAQ;AAAA,EAAA;AAAA,EAEvD;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAMD,EAAcG,CAAI;AAAA,IACxB,MAAM;AAAA,IACN,UAAU,CAAC,QAAQ,WAAW;AAAA,IAC9B,QAAQ,EAAE,MAAM,MAAA;AAAA,IAChB,QAAQ,CAAC,EAAE,QAAAF,EAAA,MACTD,EAAcI,GAAqB,EAAE,UAAUH,EAAA,CAAQ;AAAA,EAAA;AAAA,EAE3D;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAMD,EAAcG,CAAI;AAAA,IACxB,MAAM;AAAA,IACN,UAAU,CAAC,QAAQ,WAAW;AAAA,IAC9B,QAAQ,EAAE,MAAM,MAAA;AAAA,IAChB,QAAQ,CAAC,EAAE,QAAAF,EAAA,MACTD,EAAcK,GAA0B,EAAE,UAAUJ,EAAA,CAAQ;AAAA,EAAA;AAAA,EAEhE;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAMD,EAAcM,CAAK;AAAA,IACzB,MAAM;AAAA,IACN,UAAU,CAAC,QAAQ,WAAW;AAAA,IAC9B,QAAQ,EAAE,MAAM,MAAA;AAAA,IAChB,QAAQ,CAAC,EAAE,QAAAL,EAAA,MACTD,EAAcO,GAAiB,EAAE,UAAUN,EAAA,CAAQ;AAAA,EAAA;AAAA,EAEvD;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAMD,EAAcF,CAAK;AAAA,IACzB,MAAM;AAAA,IACN,UAAU,CAAC,QAAQ,WAAW;AAAA,IAC9B,QAAQ,EAAE,MAAM,MAAA;AAAA,IAChB,QAAQ,CAAC,EAAE,QAAAG,EAAA,MAAaD,EAAcQ,GAAa,EAAE,UAAUP,EAAA,CAAQ;AAAA,EAAA;AAE3E;","x_google_ignoreList":[0,1]}
|
package/dist/_chunks/{marketplace-app-shell-DdwPj03y.js → marketplace-app-shell-PB89Dkk_.js}
RENAMED
|
@@ -9,7 +9,7 @@ import { C as w } from "./card-DPmk26CL.js";
|
|
|
9
9
|
import { D as m } from "./dropdown-menu-DU-Hrf33.js";
|
|
10
10
|
import { T as q } from "./tab-bar-Cw9UK18Z.js";
|
|
11
11
|
import { a as A, H as G, g as J, f as z, e as K, c as Q, d as U } from "./header-3o9o9v_T.js";
|
|
12
|
-
import { H as X } from "./header-settings-
|
|
12
|
+
import { H as X } from "./header-settings-BEfx_-TF.js";
|
|
13
13
|
import { S as Y } from "./sign-in-with-alfadocs-button-DWwBJtyE.js";
|
|
14
14
|
import { S as Z, g as _, b as aa, a as ea, j as sa, k as ta, i as ra, h as I } from "./sidebar-DbZXLl8h.js";
|
|
15
15
|
import { T as na } from "./theme-root-BOO73p5t.js";
|
|
@@ -529,4 +529,4 @@ export {
|
|
|
529
529
|
ka as M,
|
|
530
530
|
g as P
|
|
531
531
|
};
|
|
532
|
-
//# sourceMappingURL=marketplace-app-shell-
|
|
532
|
+
//# sourceMappingURL=marketplace-app-shell-PB89Dkk_.js.map
|
package/dist/_chunks/{marketplace-app-shell-DdwPj03y.js.map → marketplace-app-shell-PB89Dkk_.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"marketplace-app-shell-DdwPj03y.js","sources":["../../src/brand/product-lockup/product-lockup.tsx","../../src/patterns/marketplace-app-shell/marketplace-app-shell.tsx"],"sourcesContent":["import { forwardRef, type ComponentPropsWithoutRef } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Logo } from '../../components/logo/logo';\nimport { AlfadocsLogoMark, AlfadocsLogoNeg } from '../logo-asset';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\n// Outer lockup row. ~4px logical gap between the wordmark and the product\n// name (`--spacing-xs`), centre-aligned so the name's cap height sits\n// against the wordmark's letterforms.\nconst lockup = cva('ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]');\n\n// The product name. Marketing serif (Fraunces, `--font-serif`) — permitted\n// here because this file lives under `src/brand/`, never in `src/components/`\n// or `src/patterns/` (constraint 10). Sized to ~95% of the wordmark height so\n// its cap height matches the logo letterforms across every size and theme\n// (the `--logo-size-*` tokens shift up in the accessible themes; the calc\n// keeps the name proportional for free).\nconst productName = cva(\n [\n 'ds:[font-family:var(--font-serif)]',\n 'ds:font-semibold',\n 'ds:leading-none',\n 'ds:tracking-[0.01em]',\n 'ds:whitespace-nowrap',\n // Forced-colors: drop the transparent text-fill and paint the label\n // as solid CanvasText so it never disappears under Windows HCM —\n // a gradient/transparent fill has no meaning there.\n 'ds:forced-colors:text-[CanvasText]',\n 'ds:forced-colors:[-webkit-text-fill-color:CanvasText]',\n ],\n {\n variants: {\n size: {\n sm: 'ds:text-[calc(var(--logo-size-sm)*0.95)]',\n md: 'ds:text-[calc(var(--logo-size-md)*0.95)]',\n lg: 'ds:text-[calc(var(--logo-size-lg)*0.95)]',\n xl: 'ds:text-[calc(var(--logo-size-xl)*0.95)]',\n },\n tone: {\n // Brand gradient filled into the glyphs via background-clip:text.\n // `--gradient-wordmark` rides the theme aliases, so it stays\n // AA-safe and adapts per theme on its own (and flattens to a solid\n // ink in the accessible / forced-colors blocks — see tokens).\n gradient: [\n 'ds:italic',\n 'ds:bg-[image:var(--gradient-wordmark)]',\n 'ds:bg-clip-text',\n 'ds:text-transparent',\n 'ds:[-webkit-text-fill-color:transparent]',\n ],\n // Monochrome: solid currentColor ink, upright, no gradient — for\n // print, single-colour work, and coloured chrome (e.g. app-shell\n // headers) where the lockup must ride the surrounding ink.\n solid: 'ds:text-current',\n },\n },\n defaultVariants: { size: 'md', tone: 'gradient' },\n },\n);\n\n// Maker lockup root. Sets a single `--lockup-unit` custom property to the\n// matching `--logo-size-*` token; every maker sub-element (mark, name, the\n// \"by Alfadocs\" tag) sizes off `var(--lockup-unit)`, so there's one per-size\n// source of truth that shifts up with the accessible themes for free.\n// `whitespace-nowrap` keeps \"[mark] Name by Alfadocs\" on one line.\nconst makerRoot = cva('ds:whitespace-nowrap', {\n variants: {\n size: {\n sm: 'ds:[--lockup-unit:var(--logo-size-sm)]',\n md: 'ds:[--lockup-unit:var(--logo-size-md)]',\n lg: 'ds:[--lockup-unit:var(--logo-size-lg)]',\n xl: 'ds:[--lockup-unit:var(--logo-size-xl)]',\n },\n },\n defaultVariants: { size: 'md' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\ntype LockupSize = NonNullable<VariantProps<typeof productName>['size']>;\n\nexport type ProductLockupProps = {\n /**\n * The product name. Passed verbatim (product names are not translated).\n *\n * - `variant=\"standard\"` (default): renders as \"Alfadocs <name>\" with the\n * wordmark; accessible name is `Alfadocs <name>`.\n * - `variant=\"maker\"`: renders as \"[mark] <name> by Alfadocs\"; accessible\n * name is `<name> by Alfadocs`.\n */\n name: string;\n /**\n * Which lockup composition to use.\n *\n * - `'standard'` (default) — Alfadocs wordmark + product name (\"Alfadocs\n * Builders\"). Use for **internal** Alfadocs products (Alfadocs Builders,\n * Alfadocs API) where the product is part of the Alfadocs family.\n * - `'maker'` — \"<name> by Alfadocs\" with the four-pillar mark and the name\n * as the prominent element. Use for **external** marketplace extensions\n * (\"Scribe by Alfadocs\") where the extension's own name leads and\n * \"by Alfadocs\" is the maker attribution.\n */\n variant?: 'standard' | 'maker';\n /**\n * Render the name as a solid `--foreground` ink, upright (no gradient, no\n * italic), and pair it with the monochrome wordmark. Use for print,\n * single-colour reproductions, or any constrained context where the\n * gradient/serif treatment is inappropriate.\n */\n monochrome?: boolean;\n /**\n * Ink resolution. `'auto'` (default) uses the lockup's intended ink\n * (`--foreground` for monochrome). `'inherit'` makes the whole lockup ride\n * `currentColor` — use it with `monochrome` on a coloured brand surface (a\n * tinted header or split-login panel) so the wordmark + name both take the\n * surface's text colour rather than clashing with a fixed `--foreground`.\n */\n tone?: 'auto' | 'inherit';\n /** Lockup size. Drives both the wordmark and the name's cap height. */\n size?: LockupSize;\n className?: string;\n} & Omit<\n ComponentPropsWithoutRef<'span'>,\n 'role' | 'aria-label' | 'aria-hidden' | 'children' | 'className'\n>;\n\n/* ------------------------------------------------------------------ */\n/* ProductLockup */\n/* ------------------------------------------------------------------ */\n\n/**\n * Pairs a product name with the Alfadocs brand. Two compositions:\n *\n * - `variant=\"standard\"` (default) — the Alfadocs wordmark + product name\n * (\"Alfadocs Builders\"). For internal Alfadocs products. Exposed to\n * assistive tech as a single `img` named `Alfadocs <name>`.\n * - `variant=\"maker\"` — \"[mark] <name> by Alfadocs\". For external marketplace\n * extensions where the extension's name leads. Exposed as a single `img`\n * named `<name> by Alfadocs`.\n *\n * In both cases the inner wordmark/mark and the visible name are decorative so\n * the brand isn't announced twice. Every marketplace app should use this\n * rather than hand-rolling a wordmark + typed span.\n */\nexport const ProductLockup = forwardRef<HTMLSpanElement, ProductLockupProps>(\n (\n {\n name,\n variant = 'standard',\n monochrome = false,\n tone = 'auto',\n size = 'md',\n className,\n ...props\n },\n ref,\n ) => {\n if (import.meta.env.DEV && !name.trim()) {\n console.warn(\n '[ProductLockup] `name` is empty — the lockup will render the bare wordmark with no product name. Pass the product name (e.g. \"Builders\").',\n );\n }\n\n if (variant === 'maker') {\n // Ink matrix mirrors the standard variant's tone/monochrome model:\n // - tone=\"inherit\": every element rides currentColor (no explicit ink),\n // for coloured surfaces.\n // - monochrome (tone auto): foreground ink, with the attribution muted.\n // - default (colour, tone auto): the name + mark take --primary; the\n // wordmark lettering stays --foreground; the attribution is muted.\n const inherit = tone === 'inherit';\n const markInk = inherit\n ? ''\n : monochrome\n ? 'ds:text-[color:var(--foreground)]'\n : 'ds:text-[color:var(--primary)]';\n const nameInk = inherit\n ? ''\n : monochrome\n ? 'ds:text-[color:var(--foreground)]'\n : 'ds:text-[color:var(--primary)]';\n const byInk = inherit ? '' : 'ds:text-[color:var(--muted-foreground)]';\n const letteringInk = inherit ? '' : 'ds:text-[color:var(--foreground)]';\n\n return (\n <span\n ref={ref}\n role=\"img\"\n aria-label={`${name} by Alfadocs`.trim()}\n className={makerRoot({ size, className })}\n data-component=\"product-lockup\"\n {...props}\n >\n {/* Pillar mark sized close to the app name (≈0.88 of the serif em),\n vertically centred on it. Inline (not flex) so the maker tag can\n use vertical-align. */}\n <AlfadocsLogoMark\n aria-hidden\n className={`ds:inline-block ds:align-middle ds:me-[var(--spacing-sm)] ds:h-[calc(var(--lockup-unit)*0.88)] ds:w-auto ds:forced-colors:text-[CanvasText] ${markInk}`}\n />\n <span\n aria-hidden\n className={`ds:align-middle ds:[font-family:var(--font-serif)] ds:font-semibold ds:italic ds:leading-none ds:tracking-[0.01em] ${nameInk} ds:text-[calc(var(--lockup-unit)*0.95)]`}\n >\n {name}\n </span>\n {/* Maker tag — superscript style, its top aligned to the app name's\n cap-height via vertical-align: text-top. */}\n <span\n aria-hidden\n className={`ds:align-text-top ds:ms-[var(--spacing-sm)] ds:inline-flex ds:items-baseline ds:gap-[var(--spacing-2xs)] ${byInk}`}\n >\n <span className=\"ds:text-[calc(var(--lockup-unit)*0.4)] ds:leading-none\">\n by\n </span>\n {/* Real Alfadocs wordmark SVG. The Neg SVG's first <g> is the\n \"Alfadocs\" lettering; the second <g> is the four-pillar mark\n (x≈3–146). viewBox=\"168 0 637 125\" windows to the lettering\n only — no mark, no hand-typed wordmark. */}\n <AlfadocsLogoNeg\n aria-hidden\n viewBox=\"168 0 637 125\"\n className={`ds:h-[calc(var(--lockup-unit)*0.45)] ds:w-auto ds:forced-colors:text-[CanvasText] ${letteringInk}`}\n />\n </span>\n </span>\n );\n }\n\n return (\n <span\n ref={ref}\n role=\"img\"\n aria-label={`Alfadocs ${name}`.trim()}\n className={lockup({ className })}\n data-component=\"product-lockup\"\n {...props}\n >\n <Logo\n variant={monochrome ? 'monochrome' : 'wordmark'}\n tone={tone}\n size={size}\n decorative\n />\n <span\n aria-hidden\n className={productName({\n size,\n tone: monochrome ? 'solid' : 'gradient',\n })}\n >\n {name}\n </span>\n </span>\n );\n },\n);\nProductLockup.displayName = 'ProductLockup';\n","/**\n * Marketplace App Shell — the standard chrome for an app built on top of\n * AlfaDocs (the kind a partner scaffolds with Claude Code, Lovable, etc.).\n *\n * It is a thin, opinionated composition of kit primitives: an `AppFrame` with\n * a branded `Header` (the maker `ProductLockup` — \"<Product> by Alfadocs\" —\n * rendered `monochrome` so it rides the header's ink; maker is the lockup\n * style for external marketplace extensions), a `Sidebar` for app\n * navigation, `HeaderSettings` (theme/locale/accessibility), and a bare-avatar\n * account menu (fullscreen + sign-out) matching the main app shell.\n * `ConnectWithAlfadocs` is the matching pre-auth screen, with the full-colour\n * maker lockup and `SignInWithAlfadocsButton`.\n *\n * Like `AliaSidebar`, this pattern ships a RUNTIME component (surfaced via\n * `src/patterns/index.ts` and the library bundle) because consuming apps mount\n * it in production rather than copying the source.\n *\n * Auth is intentionally decoupled: the shell takes the signed-in `user` and an\n * `onSignOut` callback as props, and `ConnectWithAlfadocs` takes a `status` +\n * `onConnect`. Wire them to `@alfadocs/auth/react`'s `useAlfadocsAuth()` in the\n * consuming app — the kit never touches OAuth or secrets (those live in the\n * server-side `@alfadocs/auth` BFF).\n *\n * All user-visible copy is consumer-provided (props) so each app localises in\n * its own i18n; the only kit-owned strings reuse existing translated `ui.*`\n * keys (sidebar label, skip link, menu button).\n */\nimport { forwardRef, useState, type MouseEvent, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { cva } from 'class-variance-authority';\nimport { LogOut, Maximize2 } from 'lucide-react';\n\nimport { AppFrame } from '../../components/app-frame';\nimport { Avatar } from '../../components/avatar';\nimport { Alert } from '../../components/alert';\nimport { Card } from '../../components/card';\nimport { DropdownMenu } from '../../components/dropdown-menu';\nimport { TabBar } from '../../components/tab-bar';\nimport {\n Header,\n HeaderBrand,\n HeaderCenter,\n HeaderEnd,\n HeaderMenuButton,\n HeaderSkipLink,\n HeaderStart,\n} from '../../components/header';\nimport { HeaderSettings } from '../../components/header-settings';\nimport { ProductLockup } from '../../brand/product-lockup';\nimport { SignInWithAlfadocsButton } from '../../components/sign-in-with-alfadocs-button';\nimport {\n Sidebar,\n SidebarBody,\n SidebarCollapseTrigger,\n SidebarHeader,\n SidebarItem,\n SidebarItemBadge,\n SidebarItemIcon,\n SidebarItemLabel,\n type SidebarMode,\n} from '../../components/sidebar';\nimport { ThemeRoot } from '../../components/theme-root';\nimport { TooltipProvider } from '../../components/tooltip';\nimport { useTheme } from '../../hooks/use-theme';\n\n/* ------------------------------------------------------------------ */\n/* Public API */\n/* ------------------------------------------------------------------ */\n\nexport interface MarketplaceNavItem {\n id: string;\n /** Pre-translated label — apps localise their own nav copy. */\n label: string;\n href: string;\n /** Optional leading icon (a lucide-react element or equivalent). */\n icon?: ReactNode;\n /** Optional unseen-item count rendered as a pill badge. */\n badgeCount?: number;\n /** Mark the item as the current page (`aria-current='page'`). */\n isActive?: boolean;\n /**\n * Optional click handler threaded onto the nav link's `<a>`. The lightweight\n * alternative to `renderLink`: intercept a same-origin click (call\n * `event.preventDefault()`) and route client-side without a full page load —\n * no router `<Link>` needed. Applies to both the standalone sidebar item and\n * the embedded tab. When `renderLink` is supplied it's handed through to the\n * consumer's link element instead.\n */\n onClick?: (event: MouseEvent<HTMLAnchorElement>) => void;\n}\n\n/**\n * Props the shell hands to `renderLink` for each nav item. The consumer returns\n * their router's `<Link to={href}>` carrying the same `className` (the kit's\n * active styling) and `aria-current` (`'page'` on the active item) so a tab /\n * sidebar-item click is a client-side route change, not a full page reload.\n */\nexport interface MarketplaceRenderLinkProps {\n /** The item's destination — feed it to your router's `to` / `href`. */\n href: string;\n /** The kit's classes — apply verbatim to the link element. */\n className?: string;\n /** Icon + label + badge — render as the link's children. */\n children: ReactNode;\n /** `'page'` on the active item, otherwise omitted — forward to the link. */\n 'aria-current'?: 'page';\n /**\n * The item's stable id, as the agent / automation DOM hook. Spread it onto\n * your router link so the item stays addressable by `[data-tab-id]` — see\n * PRS §26 §6. Only supplied on the bottom-tab-bar path.\n */\n 'data-tab-id'?: string;\n}\n\n/**\n * Render a nav item through the consumer's router instead of the kit's own\n * `<a>`. Returned by the consumer; the shell forwards `href`, the kit's\n * `className`, the item children, and `aria-current` so the active styling and\n * the `aria-current=\"page\"` marker survive a client-side route change.\n */\nexport type MarketplaceRenderLink = (\n props: MarketplaceRenderLinkProps,\n) => ReactNode;\n\nexport interface MarketplaceAppUser {\n /** Display name — drives the avatar initials + the account-menu header. */\n name: string;\n /** Optional email shown under the name in the account menu. */\n email?: string;\n /** Optional avatar image URL. */\n avatarSrc?: string;\n}\n\nexport interface MarketplaceAppShellLabels {\n /** Accessible name for the account-menu trigger, e.g. \"Account menu\". */\n accountMenu: string;\n /** The sign-out menu item, e.g. \"Sign out\". */\n signOut: string;\n /**\n * Optional fullscreen menu item label, e.g. \"Toggle fullscreen\". The item\n * renders whenever `onToggleFullscreen` is supplied; when this label is\n * omitted it falls back to the translated `ui.*` \"Toggle fullscreen\" string.\n */\n fullscreen?: string;\n}\n\nexport interface MarketplaceAppShellProps {\n /** Extension name — renders as the maker lockup \"<productName> by Alfadocs\". */\n productName: string;\n /** Link target for the brand lockup. Default `'/'`. */\n productHref?: string;\n /** Sidebar nav items, in order. */\n nav: MarketplaceNavItem[];\n /**\n * Render nav items (and the brand lockup) through the consumer's router so a\n * tab / item click is a client-side route change with **no full-page reload\n * or session flash**. Wire it to your router's `<Link>`:\n *\n * ```tsx\n * import { Link } from '@tanstack/react-router';\n * <MarketplaceAppShell\n * nav={nav}\n * renderLink={({ href, className, children, ...rest }) => (\n * <Link to={href} className={className} {...rest}>{children}</Link>\n * )}\n * />\n * ```\n *\n * Threaded to the standalone sidebar items, the embedded top tab strip, and\n * the brand lockup. The kit forwards the same `className` + `aria-current` so\n * the active styling and the `aria-current=\"page\"` marker survive in both\n * modes. Omit it to render the plain `<a href>` exactly as before — non-routed\n * consumers are byte-for-byte unaffected. A per-item `onClick` (a\n * click-interceptor shim) is the lighter alternative when you don't want to\n * thread a router `<Link>`.\n */\n renderLink?: MarketplaceRenderLink;\n /** The signed-in user shown in the account menu. */\n user: MarketplaceAppUser;\n /** Consumer-localised chrome labels owned by the shell. */\n labels: MarketplaceAppShellLabels;\n /** Fires when the user picks \"Sign out\". Wire to `useAlfadocsAuth().signOut`. */\n onSignOut?: () => void;\n /** Fires when the user toggles fullscreen. Omit to hide the fullscreen item. */\n onToggleFullscreen?: () => void;\n /**\n * Force the sidebar into a specific mode. Apps typically flip to `'overlay'`\n * on narrow viewports and leave this undefined elsewhere (defaults to\n * `'expanded'`).\n */\n sidebarState?: SidebarMode;\n /**\n * Render a collapse/expand toggle in the sidebar header, letting the user\n * shrink the standalone sidebar to an icon rail. The chosen mode persists\n * per-user (the underlying `Sidebar` stores it) and survives reloads. Opt-in\n * so existing consumers are unaffected; ignored when `sidebarState` forces a\n * mode or in the `'embedded'` variant (no sidebar). @default false\n */\n collapsibleSidebar?: boolean;\n /** Override the accessible name of the `<main>` landmark. */\n mainAriaLabel?: string;\n /**\n * Chrome variant. `'standalone'` (default) renders the full shell — branded\n * Header, Sidebar, and account menu. `'embedded'` is for apps running INSIDE\n * the AlfaDocs platform iframe (consumers detect this with\n * `window !== window.top`): it drops the Header, Sidebar, account menu, and\n * product lockup — the platform already brands and identifies the session\n * around the iframe — and renders the `nav` items as a single slim top tab\n * strip. `onSignOut`, `onToggleFullscreen`, `productName`, `productHref`, and\n * `sidebarState` are ignored in `'embedded'`; the `<main>` landmark,\n * `mainAriaLabel`, and the skip link are kept.\n */\n variant?: 'standalone' | 'embedded';\n /** Children render inside the main content region. */\n children: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Internals */\n/* ------------------------------------------------------------------ */\n\nfunction formatBadgeCount(count: number): string {\n return count > 99 ? '99+' : String(count);\n}\n\nfunction AccountMenu({\n user,\n labels,\n onSignOut,\n onToggleFullscreen,\n}: {\n user: MarketplaceAppUser;\n labels: MarketplaceAppShellLabels;\n onSignOut?: () => void;\n onToggleFullscreen?: () => void;\n}) {\n const { t } = useTranslation();\n // Default to the translated `ui.*` label so a consumer that wires\n // `onToggleFullscreen` but omits the label still gets a localised item.\n const fullscreenLabel =\n labels.fullscreen ?? t('marketplaceAppShell.settings.fullscreen');\n return (\n // Non-modal: an account menu shouldn't inert/aria-hide the whole shell\n // behind it (which leaves the still-focusable chrome inside an\n // aria-hidden region — an `aria-hidden-focus` violation).\n <DropdownMenu.Root modal={false}>\n <DropdownMenu.Trigger asChild>\n {/* Bare avatar circle — matches the main app shell's account\n trigger. The name lives inside the menu, not beside the avatar. */}\n <button\n type=\"button\"\n aria-label={labels.accountMenu}\n data-testid=\"marketplace-account-trigger\"\n className=\"ds:inline-flex ds:items-center ds:justify-center ds:shrink-0 ds:size-10 ds:rounded-[var(--radius-full)] ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)] ds:forced-colors:focus-visible:outline-[CanvasText]\"\n >\n <span aria-hidden=\"true\">\n <Avatar name={user.name} src={user.avatarSrc} size=\"md\" />\n </span>\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\" collisionPadding={16}>\n {/* GitHub-style identity header — small avatar + name + secondary\n line, matching the main app shell's account menu. */}\n <DropdownMenu.Label>\n <span className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span aria-hidden=\"true\">\n <Avatar name={user.name} src={user.avatarSrc} size=\"sm\" />\n </span>\n <span className=\"ds:flex ds:flex-col ds:min-w-0\">\n <span className=\"type-label ds:text-[color:var(--foreground)] ds:truncate\">\n {user.name}\n </span>\n {user.email ? (\n <span className=\"type-meta ds:truncate\">{user.email}</span>\n ) : null}\n </span>\n </span>\n </DropdownMenu.Label>\n {onToggleFullscreen ? (\n <>\n <DropdownMenu.Separator />\n <DropdownMenu.Item\n startIcon={<Maximize2 aria-hidden />}\n onSelect={onToggleFullscreen}\n data-testid=\"marketplace-fullscreen\"\n >\n {fullscreenLabel}\n </DropdownMenu.Item>\n </>\n ) : null}\n <DropdownMenu.Separator />\n <DropdownMenu.Item\n startIcon={<LogOut aria-hidden />}\n onSelect={onSignOut}\n data-testid=\"marketplace-sign-out\"\n >\n {labels.signOut}\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n}\n\nfunction MarketplaceSidebarNav({\n nav,\n renderLink,\n}: {\n nav: MarketplaceNavItem[];\n renderLink?: MarketplaceRenderLink;\n}) {\n return (\n <SidebarBody>\n {nav.map((item) => {\n const badge =\n typeof item.badgeCount === 'number' && item.badgeCount > 0\n ? item.badgeCount\n : undefined;\n const inner = (\n <>\n {item.icon ? <SidebarItemIcon>{item.icon}</SidebarItemIcon> : null}\n <SidebarItemLabel>{item.label}</SidebarItemLabel>\n {badge !== undefined ? (\n <SidebarItemBadge>{formatBadgeCount(badge)}</SidebarItemBadge>\n ) : null}\n </>\n );\n\n // Consumer-router mode: render the item through Radix `Slot`\n // (`SidebarItem asChild`) so the consumer's `<Link>` takes over the\n // anchor while keeping the kit's item styling + `aria-current=\"page\"`.\n // Clicking routes client-side — no full-page reload.\n if (renderLink) {\n return (\n <SidebarItem key={item.id} asChild isActive={item.isActive}>\n {renderLink({\n href: item.href,\n children: inner,\n 'aria-current': item.isActive ? 'page' : undefined,\n })}\n </SidebarItem>\n );\n }\n\n // Default: plain anchor — byte-identical to before when no per-item\n // `onClick` is supplied (it's omitted entirely, not passed as\n // undefined, so the rendered `<a>` is unchanged).\n return (\n <SidebarItem\n key={item.id}\n href={item.href}\n aria-label={item.label}\n isActive={item.isActive}\n {...(item.onClick ? { onClick: item.onClick } : {})}\n >\n {inner}\n </SidebarItem>\n );\n })}\n </SidebarBody>\n );\n}\n\n/* CVA for the chrome variant — drives the `<main>` surface; the structural\n header/sidebar-vs-tab-strip difference is conditional in the render.\n\n The `standalone` `<main>` gets its content inset from AppFrame's own\n `mainVariants({ padded: true })` (`--spacing-md` on every logical side), so\n this variant only carries the canvas colour there. The `embedded` `<main>`\n is a plain element (no AppFrame), so it has to supply its own inset:\n `--spacing-md` inline + block-end to match the standalone inset, and a\n larger `--spacing-lg` block-start so content clears the floating tab strip's\n pill instead of butting up against it. All logical — RTL mirrors for free. */\nconst shellMainVariants = cva('ds:bg-[color:var(--app-shell-background)]', {\n variants: {\n variant: {\n standalone: '',\n embedded: [\n 'ds:flex-1',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-lg)] ds:pb-[var(--spacing-md)]',\n ].join(' '),\n },\n },\n defaultVariants: { variant: 'standalone' },\n});\n\n/**\n * Embedded chrome: the slim floating tab strip (no Header / Sidebar / account\n * menu) for apps running inside the AlfaDocs platform iframe. It's the shared\n * {@link TabBar} fed the shell's nav items — the platform brands and identifies\n * the session around the iframe, so the strip is the only chrome. The\n * `MarketplaceNavItem` shape is structurally a `TabBarItem`, so the nav passes\n * straight through.\n */\nfunction EmbeddedTabStrip({\n nav,\n ariaLabel,\n renderLink,\n}: {\n nav: MarketplaceNavItem[];\n ariaLabel: string;\n renderLink?: MarketplaceRenderLink;\n}) {\n // Adapt the shell's `renderLink` to TabBar's `renderLink` signature — TabBar\n // also offers the per-item `onClick`, but in consumer-router mode the\n // `<Link>` owns navigation (matching the standalone sidebar), so we forward\n // only `href` / `className` / `children` / `aria-current`. With `renderLink`\n // omitted, TabBar renders its own plain `<a href>` exactly as before, and a\n // per-item `onClick` rides through `nav` → `TabBarItem` untouched.\n const tabRenderLink = renderLink\n ? ({\n href,\n className,\n children,\n 'aria-current': ariaCurrent,\n 'data-tab-id': tabId,\n }: {\n href: string;\n className: string;\n children: ReactNode;\n 'aria-current'?: 'page';\n 'data-tab-id'?: string;\n }) =>\n renderLink({\n href,\n className,\n children,\n 'aria-current': ariaCurrent,\n // Forward the agent DOM hook — without it a consumer-router tab is\n // invisible to `[data-tab-id]` lookups (PRS §26 §6).\n 'data-tab-id': tabId,\n })\n : undefined;\n\n return (\n <TabBar\n items={nav}\n ariaLabel={ariaLabel}\n {...(tabRenderLink ? { renderLink: tabRenderLink } : {})}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* MarketplaceAppShell */\n/* ------------------------------------------------------------------ */\n\nexport const MarketplaceAppShell = forwardRef<\n HTMLDivElement,\n MarketplaceAppShellProps\n>(\n (\n {\n productName,\n productHref = '/',\n nav,\n renderLink,\n user,\n labels,\n onSignOut,\n onToggleFullscreen,\n sidebarState,\n collapsibleSidebar = false,\n mainAriaLabel,\n variant = 'standalone',\n children,\n },\n ref,\n ) => {\n const { t } = useTranslation();\n\n // The brand lockup as a consumer-router link: when `renderLink` is\n // supplied, the brand anchor routes client-side too (no session flash when\n // jumping home). The maker lockup's \"<productName> by Alfadocs\" supplies\n // the link's accessible name, matching the default `HeaderBrand` anchor.\n const headerBrand = renderLink ? (\n <HeaderBrand asChild>\n {renderLink({\n href: productHref,\n children: (\n <ProductLockup\n name={productName}\n size=\"md\"\n monochrome\n variant=\"maker\"\n />\n ),\n })}\n </HeaderBrand>\n ) : (\n <HeaderBrand\n href={productHref}\n logo={\n <ProductLockup\n name={productName}\n size=\"md\"\n monochrome\n variant=\"maker\"\n />\n }\n />\n );\n\n // Only wrap in a nested ThemeRoot when the user has an\n // explicit theme/accessibility override, so we don't clobber the consuming\n // app's (or Storybook's) outer theme cascade.\n const { theme: themePref, accessibility, resolvedTheme } = useTheme();\n const hasExplicitOverride =\n themePref !== 'system' || accessibility !== 'system';\n const themeBase = resolvedTheme.startsWith('dark') ? 'dark' : 'light';\n const themeAccessible = resolvedTheme.endsWith('-accessible');\n\n // Narrow-viewport overlay: HeaderMenuButton only renders below `md`.\n const [sidebarOpen, setSidebarOpen] = useState(false);\n\n const shell = (\n <TooltipProvider>\n <AppFrame\n mainAriaLabel={mainAriaLabel}\n mainClassName={shellMainVariants({ variant: 'standalone' })}\n header={\n <Header>\n <HeaderStart>\n <HeaderSkipLink href=\"#main-content\" />\n <HeaderMenuButton onMenuOpen={() => setSidebarOpen(true)} />\n {headerBrand}\n </HeaderStart>\n <HeaderCenter />\n <HeaderEnd>\n <HeaderSettings size=\"sm\" />\n <AccountMenu\n user={user}\n labels={labels}\n onSignOut={onSignOut}\n onToggleFullscreen={onToggleFullscreen}\n />\n </HeaderEnd>\n </Header>\n }\n sidebar={\n <Sidebar\n {...(sidebarState !== undefined\n ? { state: sidebarState }\n : { defaultState: 'expanded' as const })}\n open={sidebarOpen}\n onOpenChange={setSidebarOpen}\n aria-label={t('navigation.sidebar.label')}\n data-testid=\"marketplace-app-shell-sidebar\"\n >\n {collapsibleSidebar && sidebarState === undefined ? (\n // No justify override: SidebarHeader centres its child in the\n // icon rail (`justify-center`) and left-aligns it when expanded,\n // matching the nav icons below. `justify-end` here would win over\n // the icon-mode centring and offset the toggle in the rail.\n <SidebarHeader>\n <SidebarCollapseTrigger />\n </SidebarHeader>\n ) : null}\n <MarketplaceSidebarNav nav={nav} renderLink={renderLink} />\n </Sidebar>\n }\n >\n {children}\n </AppFrame>\n </TooltipProvider>\n );\n\n const embedded = (\n // The shell owns the warm-grey canvas; TabBar's strip is transparent and\n // floats its pill on it, and `<main>` continues the same surface.\n <div className=\"ds:flex ds:min-h-dvh ds:flex-col ds:bg-[color:var(--app-shell-background)]\">\n <HeaderSkipLink href=\"#main-content\" />\n <EmbeddedTabStrip\n nav={nav}\n ariaLabel={t('navigation.sidebar.label')}\n renderLink={renderLink}\n />\n <main\n id=\"main-content\"\n tabIndex={-1}\n aria-label={\n mainAriaLabel ?? t('navigation.main.label', 'Main content')\n }\n className={shellMainVariants({ variant: 'embedded' })}\n >\n {children}\n </main>\n </div>\n );\n\n const content = variant === 'embedded' ? embedded : shell;\n\n if (!hasExplicitOverride) {\n return (\n <div\n ref={ref}\n className=\"ds:contents\"\n data-component=\"marketplace-app-shell\"\n >\n {content}\n </div>\n );\n }\n\n return (\n <ThemeRoot\n ref={ref}\n theme={themeBase}\n accessible={themeAccessible}\n className=\"ds:contents\"\n data-component=\"marketplace-app-shell\"\n >\n {content}\n </ThemeRoot>\n );\n },\n);\n\nMarketplaceAppShell.displayName = 'MarketplaceAppShell';\n\n/* ------------------------------------------------------------------ */\n/* ConnectWithAlfadocs */\n/* ------------------------------------------------------------------ */\n\nexport type ConnectStatus = 'idle' | 'connecting' | 'error';\n\nexport interface ConnectWithAlfadocsProps {\n /** Product name shown next to the wordmark at the top of the card. */\n productName: string;\n /** Heading, e.g. \"Connect your AlfaDocs account\". */\n title: string;\n /** Supporting copy below the heading. */\n description: ReactNode;\n /** The connect button label, e.g. \"Connect with AlfaDocs\". */\n connectLabel: string;\n /** Connection lifecycle. `connecting` shows a loading button; `error` shows the alert. */\n status?: ConnectStatus;\n /** Error message shown (as an alert) when `status === 'error'`. */\n error?: ReactNode;\n /** Fires when the connect button is pressed. Wire to `useAlfadocsAuth().connect`. */\n onConnect?: () => void;\n /** Optional footer content below the button (e.g. a \"what's this?\" link). */\n footer?: ReactNode;\n /**\n * Visual layout. `'card'` (default) is the centred card on the warm-grey\n * canvas — unchanged. `'split'` adds, at `lg:` and up, a two-panel desktop\n * layout: a brand panel on the inline-start and the connect card on the\n * inline-end. Below `lg:`, `'split'` collapses to exactly the card layout —\n * so it falls back gracefully inside iframes / embeds that never reach\n * desktop width. Use `'split'` for full-page desktop logins.\n */\n layout?: 'card' | 'split';\n /**\n * Optional content shown under the lockup in the `'split'` brand panel (a\n * tagline, value props, an illustration). Ignored in `'card'` and below `lg:`.\n */\n brandPanel?: ReactNode;\n className?: string;\n}\n\n/* Split-layout CVAs (lg+ two-panel; collapses to the centred card below lg). */\nconst connectRootVariants = cva(\n 'ds:flex ds:min-h-dvh ds:bg-[color:var(--app-shell-background)]',\n {\n variants: {\n layout: {\n card: '',\n split: 'ds:flex-col ds:lg:flex-row',\n },\n },\n defaultVariants: { layout: 'card' },\n },\n);\n\nconst connectCardWidthVariants = cva('ds:w-full', {\n variants: {\n layout: {\n card: 'ds:max-w-[400px]',\n split: 'ds:max-w-[400px] ds:lg:max-w-[480px]',\n },\n },\n defaultVariants: { layout: 'card' },\n});\n\n// The card's own lockup hides at lg+ in `split` (the brand panel shows it there).\nconst connectCardLockupVariants = cva('', {\n variants: {\n layout: { card: '', split: 'ds:lg:hidden' },\n },\n defaultVariants: { layout: 'card' },\n});\n\n/**\n * The pre-auth \"Connect with AlfaDocs\" screen. Centred white card on the\n * warm-grey canvas with the AlfaDocs wordmark + product name, copy, an error\n * slot, and the primary connect CTA. An opt-in `layout=\"split\"` adds a desktop\n * two-panel brand layout (lg+). Presentational — `onConnect` should call\n * `useAlfadocsAuth().connect()`, which redirects the browser to the server-side\n * BFF that runs the real OAuth2 + PKCE flow.\n */\nexport const ConnectWithAlfadocs = forwardRef<\n HTMLDivElement,\n ConnectWithAlfadocsProps\n>(\n (\n {\n productName,\n title,\n description,\n connectLabel,\n status = 'idle',\n error,\n onConnect,\n footer,\n layout = 'card',\n brandPanel,\n className,\n },\n ref,\n ) => {\n return (\n <div\n ref={ref}\n data-component=\"connect-with-alfadocs\"\n className={`${connectRootVariants({ layout })} ${className ?? ''}`}\n >\n {layout === 'split' ? (\n // Desktop brand panel (lg+ only): a bold `--primary` surface with the\n // monochrome lockup riding the `--primary-foreground` ink, plus an\n // optional `brandPanel` slot. Decorative — the card carries the real\n // heading + CTA, and shows its own lockup below `lg:`.\n <div className=\"ds:hidden ds:lg:flex ds:lg:w-[55%] ds:flex-col ds:items-center ds:justify-center ds:gap-[var(--spacing-lg)] ds:bg-[color:var(--primary)] ds:text-[color:var(--primary-foreground)] ds:ps-[var(--spacing-2xl)] ds:pe-[var(--spacing-2xl)] ds:pt-[var(--spacing-2xl)] ds:pb-[var(--spacing-2xl)] ds:text-start\">\n <ProductLockup\n name={productName}\n size=\"lg\"\n monochrome\n tone=\"inherit\"\n variant=\"maker\"\n />\n {brandPanel ? (\n <div className=\"type-body ds:max-w-[28rem] ds:text-start\">\n {brandPanel}\n </div>\n ) : null}\n </div>\n ) : null}\n <div className=\"ds:flex ds:flex-1 ds:items-center ds:justify-center ds:p-[var(--spacing-lg)]\">\n <Card className={connectCardWidthVariants({ layout })}>\n <Card.Body className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-lg)] ds:text-center\">\n <ProductLockup\n name={productName}\n size=\"lg\"\n variant=\"maker\"\n className={connectCardLockupVariants({ layout })}\n />\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <h1 className=\"type-title-card\">{title}</h1>\n <p className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {description}\n </p>\n </div>\n {status === 'error' && error ? (\n <Alert variant=\"error\" className=\"ds:w-full ds:text-start\">\n {error}\n </Alert>\n ) : null}\n <SignInWithAlfadocsButton\n intent=\"primary\"\n className=\"ds:w-full\"\n loading={status === 'connecting'}\n onClick={onConnect}\n label={connectLabel}\n data-testid=\"connect-with-alfadocs-button\"\n />\n {footer ? (\n <div className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {footer}\n </div>\n ) : null}\n </Card.Body>\n </Card>\n </div>\n </div>\n );\n },\n);\n\nConnectWithAlfadocs.displayName = 'ConnectWithAlfadocs';\n"],"names":["lockup","cva","productName","makerRoot","ProductLockup","forwardRef","name","variant","monochrome","tone","size","className","props","ref","inherit","markInk","nameInk","byInk","letteringInk","jsxs","jsx","AlfadocsLogoMark","AlfadocsLogoNeg","Logo","formatBadgeCount","count","AccountMenu","user","labels","onSignOut","onToggleFullscreen","t","useTranslation","fullscreenLabel","DropdownMenu","Avatar","Fragment","Maximize2","LogOut","MarketplaceSidebarNav","nav","renderLink","SidebarBody","item","badge","inner","SidebarItemIcon","SidebarItemLabel","SidebarItemBadge","SidebarItem","shellMainVariants","EmbeddedTabStrip","ariaLabel","tabRenderLink","href","children","ariaCurrent","tabId","TabBar","MarketplaceAppShell","productHref","sidebarState","collapsibleSidebar","mainAriaLabel","headerBrand","HeaderBrand","themePref","accessibility","resolvedTheme","useTheme","hasExplicitOverride","themeBase","themeAccessible","sidebarOpen","setSidebarOpen","useState","shell","TooltipProvider","AppFrame","Header","HeaderStart","HeaderSkipLink","HeaderMenuButton","HeaderCenter","HeaderEnd","HeaderSettings","Sidebar","SidebarHeader","SidebarCollapseTrigger","embedded","content","ThemeRoot","connectRootVariants","connectCardWidthVariants","connectCardLockupVariants","ConnectWithAlfadocs","title","description","connectLabel","status","error","onConnect","footer","layout","brandPanel","Card","Alert","SignInWithAlfadocsButton"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"marketplace-app-shell-PB89Dkk_.js","sources":["../../src/brand/product-lockup/product-lockup.tsx","../../src/patterns/marketplace-app-shell/marketplace-app-shell.tsx"],"sourcesContent":["import { forwardRef, type ComponentPropsWithoutRef } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Logo } from '../../components/logo/logo';\nimport { AlfadocsLogoMark, AlfadocsLogoNeg } from '../logo-asset';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\n// Outer lockup row. ~4px logical gap between the wordmark and the product\n// name (`--spacing-xs`), centre-aligned so the name's cap height sits\n// against the wordmark's letterforms.\nconst lockup = cva('ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]');\n\n// The product name. Marketing serif (Fraunces, `--font-serif`) — permitted\n// here because this file lives under `src/brand/`, never in `src/components/`\n// or `src/patterns/` (constraint 10). Sized to ~95% of the wordmark height so\n// its cap height matches the logo letterforms across every size and theme\n// (the `--logo-size-*` tokens shift up in the accessible themes; the calc\n// keeps the name proportional for free).\nconst productName = cva(\n [\n 'ds:[font-family:var(--font-serif)]',\n 'ds:font-semibold',\n 'ds:leading-none',\n 'ds:tracking-[0.01em]',\n 'ds:whitespace-nowrap',\n // Forced-colors: drop the transparent text-fill and paint the label\n // as solid CanvasText so it never disappears under Windows HCM —\n // a gradient/transparent fill has no meaning there.\n 'ds:forced-colors:text-[CanvasText]',\n 'ds:forced-colors:[-webkit-text-fill-color:CanvasText]',\n ],\n {\n variants: {\n size: {\n sm: 'ds:text-[calc(var(--logo-size-sm)*0.95)]',\n md: 'ds:text-[calc(var(--logo-size-md)*0.95)]',\n lg: 'ds:text-[calc(var(--logo-size-lg)*0.95)]',\n xl: 'ds:text-[calc(var(--logo-size-xl)*0.95)]',\n },\n tone: {\n // Brand gradient filled into the glyphs via background-clip:text.\n // `--gradient-wordmark` rides the theme aliases, so it stays\n // AA-safe and adapts per theme on its own (and flattens to a solid\n // ink in the accessible / forced-colors blocks — see tokens).\n gradient: [\n 'ds:italic',\n 'ds:bg-[image:var(--gradient-wordmark)]',\n 'ds:bg-clip-text',\n 'ds:text-transparent',\n 'ds:[-webkit-text-fill-color:transparent]',\n ],\n // Monochrome: solid currentColor ink, upright, no gradient — for\n // print, single-colour work, and coloured chrome (e.g. app-shell\n // headers) where the lockup must ride the surrounding ink.\n solid: 'ds:text-current',\n },\n },\n defaultVariants: { size: 'md', tone: 'gradient' },\n },\n);\n\n// Maker lockup root. Sets a single `--lockup-unit` custom property to the\n// matching `--logo-size-*` token; every maker sub-element (mark, name, the\n// \"by Alfadocs\" tag) sizes off `var(--lockup-unit)`, so there's one per-size\n// source of truth that shifts up with the accessible themes for free.\n// `whitespace-nowrap` keeps \"[mark] Name by Alfadocs\" on one line.\nconst makerRoot = cva('ds:whitespace-nowrap', {\n variants: {\n size: {\n sm: 'ds:[--lockup-unit:var(--logo-size-sm)]',\n md: 'ds:[--lockup-unit:var(--logo-size-md)]',\n lg: 'ds:[--lockup-unit:var(--logo-size-lg)]',\n xl: 'ds:[--lockup-unit:var(--logo-size-xl)]',\n },\n },\n defaultVariants: { size: 'md' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\ntype LockupSize = NonNullable<VariantProps<typeof productName>['size']>;\n\nexport type ProductLockupProps = {\n /**\n * The product name. Passed verbatim (product names are not translated).\n *\n * - `variant=\"standard\"` (default): renders as \"Alfadocs <name>\" with the\n * wordmark; accessible name is `Alfadocs <name>`.\n * - `variant=\"maker\"`: renders as \"[mark] <name> by Alfadocs\"; accessible\n * name is `<name> by Alfadocs`.\n */\n name: string;\n /**\n * Which lockup composition to use.\n *\n * - `'standard'` (default) — Alfadocs wordmark + product name (\"Alfadocs\n * Builders\"). Use for **internal** Alfadocs products (Alfadocs Builders,\n * Alfadocs API) where the product is part of the Alfadocs family.\n * - `'maker'` — \"<name> by Alfadocs\" with the four-pillar mark and the name\n * as the prominent element. Use for **external** marketplace extensions\n * (\"Scribe by Alfadocs\") where the extension's own name leads and\n * \"by Alfadocs\" is the maker attribution.\n */\n variant?: 'standard' | 'maker';\n /**\n * Render the name as a solid `--foreground` ink, upright (no gradient, no\n * italic), and pair it with the monochrome wordmark. Use for print,\n * single-colour reproductions, or any constrained context where the\n * gradient/serif treatment is inappropriate.\n */\n monochrome?: boolean;\n /**\n * Ink resolution. `'auto'` (default) uses the lockup's intended ink\n * (`--foreground` for monochrome). `'inherit'` makes the whole lockup ride\n * `currentColor` — use it with `monochrome` on a coloured brand surface (a\n * tinted header or split-login panel) so the wordmark + name both take the\n * surface's text colour rather than clashing with a fixed `--foreground`.\n */\n tone?: 'auto' | 'inherit';\n /** Lockup size. Drives both the wordmark and the name's cap height. */\n size?: LockupSize;\n className?: string;\n} & Omit<\n ComponentPropsWithoutRef<'span'>,\n 'role' | 'aria-label' | 'aria-hidden' | 'children' | 'className'\n>;\n\n/* ------------------------------------------------------------------ */\n/* ProductLockup */\n/* ------------------------------------------------------------------ */\n\n/**\n * Pairs a product name with the Alfadocs brand. Two compositions:\n *\n * - `variant=\"standard\"` (default) — the Alfadocs wordmark + product name\n * (\"Alfadocs Builders\"). For internal Alfadocs products. Exposed to\n * assistive tech as a single `img` named `Alfadocs <name>`.\n * - `variant=\"maker\"` — \"[mark] <name> by Alfadocs\". For external marketplace\n * extensions where the extension's name leads. Exposed as a single `img`\n * named `<name> by Alfadocs`.\n *\n * In both cases the inner wordmark/mark and the visible name are decorative so\n * the brand isn't announced twice. Every marketplace app should use this\n * rather than hand-rolling a wordmark + typed span.\n */\nexport const ProductLockup = forwardRef<HTMLSpanElement, ProductLockupProps>(\n (\n {\n name,\n variant = 'standard',\n monochrome = false,\n tone = 'auto',\n size = 'md',\n className,\n ...props\n },\n ref,\n ) => {\n if (import.meta.env.DEV && !name.trim()) {\n console.warn(\n '[ProductLockup] `name` is empty — the lockup will render the bare wordmark with no product name. Pass the product name (e.g. \"Builders\").',\n );\n }\n\n if (variant === 'maker') {\n // Ink matrix mirrors the standard variant's tone/monochrome model:\n // - tone=\"inherit\": every element rides currentColor (no explicit ink),\n // for coloured surfaces.\n // - monochrome (tone auto): foreground ink, with the attribution muted.\n // - default (colour, tone auto): the name + mark take --primary; the\n // wordmark lettering stays --foreground; the attribution is muted.\n const inherit = tone === 'inherit';\n const markInk = inherit\n ? ''\n : monochrome\n ? 'ds:text-[color:var(--foreground)]'\n : 'ds:text-[color:var(--primary)]';\n const nameInk = inherit\n ? ''\n : monochrome\n ? 'ds:text-[color:var(--foreground)]'\n : 'ds:text-[color:var(--primary)]';\n const byInk = inherit ? '' : 'ds:text-[color:var(--muted-foreground)]';\n const letteringInk = inherit ? '' : 'ds:text-[color:var(--foreground)]';\n\n return (\n <span\n ref={ref}\n role=\"img\"\n aria-label={`${name} by Alfadocs`.trim()}\n className={makerRoot({ size, className })}\n data-component=\"product-lockup\"\n {...props}\n >\n {/* Pillar mark sized close to the app name (≈0.88 of the serif em),\n vertically centred on it. Inline (not flex) so the maker tag can\n use vertical-align. */}\n <AlfadocsLogoMark\n aria-hidden\n className={`ds:inline-block ds:align-middle ds:me-[var(--spacing-sm)] ds:h-[calc(var(--lockup-unit)*0.88)] ds:w-auto ds:forced-colors:text-[CanvasText] ${markInk}`}\n />\n <span\n aria-hidden\n className={`ds:align-middle ds:[font-family:var(--font-serif)] ds:font-semibold ds:italic ds:leading-none ds:tracking-[0.01em] ${nameInk} ds:text-[calc(var(--lockup-unit)*0.95)]`}\n >\n {name}\n </span>\n {/* Maker tag — superscript style, its top aligned to the app name's\n cap-height via vertical-align: text-top. */}\n <span\n aria-hidden\n className={`ds:align-text-top ds:ms-[var(--spacing-sm)] ds:inline-flex ds:items-baseline ds:gap-[var(--spacing-2xs)] ${byInk}`}\n >\n <span className=\"ds:text-[calc(var(--lockup-unit)*0.4)] ds:leading-none\">\n by\n </span>\n {/* Real Alfadocs wordmark SVG. The Neg SVG's first <g> is the\n \"Alfadocs\" lettering; the second <g> is the four-pillar mark\n (x≈3–146). viewBox=\"168 0 637 125\" windows to the lettering\n only — no mark, no hand-typed wordmark. */}\n <AlfadocsLogoNeg\n aria-hidden\n viewBox=\"168 0 637 125\"\n className={`ds:h-[calc(var(--lockup-unit)*0.45)] ds:w-auto ds:forced-colors:text-[CanvasText] ${letteringInk}`}\n />\n </span>\n </span>\n );\n }\n\n return (\n <span\n ref={ref}\n role=\"img\"\n aria-label={`Alfadocs ${name}`.trim()}\n className={lockup({ className })}\n data-component=\"product-lockup\"\n {...props}\n >\n <Logo\n variant={monochrome ? 'monochrome' : 'wordmark'}\n tone={tone}\n size={size}\n decorative\n />\n <span\n aria-hidden\n className={productName({\n size,\n tone: monochrome ? 'solid' : 'gradient',\n })}\n >\n {name}\n </span>\n </span>\n );\n },\n);\nProductLockup.displayName = 'ProductLockup';\n","/**\n * Marketplace App Shell — the standard chrome for an app built on top of\n * AlfaDocs (the kind a partner scaffolds with Claude Code, Lovable, etc.).\n *\n * It is a thin, opinionated composition of kit primitives: an `AppFrame` with\n * a branded `Header` (the maker `ProductLockup` — \"<Product> by Alfadocs\" —\n * rendered `monochrome` so it rides the header's ink; maker is the lockup\n * style for external marketplace extensions), a `Sidebar` for app\n * navigation, `HeaderSettings` (theme/locale/accessibility), and a bare-avatar\n * account menu (fullscreen + sign-out) matching the main app shell.\n * `ConnectWithAlfadocs` is the matching pre-auth screen, with the full-colour\n * maker lockup and `SignInWithAlfadocsButton`.\n *\n * Like `AliaSidebar`, this pattern ships a RUNTIME component (surfaced via\n * `src/patterns/index.ts` and the library bundle) because consuming apps mount\n * it in production rather than copying the source.\n *\n * Auth is intentionally decoupled: the shell takes the signed-in `user` and an\n * `onSignOut` callback as props, and `ConnectWithAlfadocs` takes a `status` +\n * `onConnect`. Wire them to `@alfadocs/auth/react`'s `useAlfadocsAuth()` in the\n * consuming app — the kit never touches OAuth or secrets (those live in the\n * server-side `@alfadocs/auth` BFF).\n *\n * All user-visible copy is consumer-provided (props) so each app localises in\n * its own i18n; the only kit-owned strings reuse existing translated `ui.*`\n * keys (sidebar label, skip link, menu button).\n */\nimport { forwardRef, useState, type MouseEvent, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { cva } from 'class-variance-authority';\nimport { LogOut, Maximize2 } from 'lucide-react';\n\nimport { AppFrame } from '../../components/app-frame';\nimport { Avatar } from '../../components/avatar';\nimport { Alert } from '../../components/alert';\nimport { Card } from '../../components/card';\nimport { DropdownMenu } from '../../components/dropdown-menu';\nimport { TabBar } from '../../components/tab-bar';\nimport {\n Header,\n HeaderBrand,\n HeaderCenter,\n HeaderEnd,\n HeaderMenuButton,\n HeaderSkipLink,\n HeaderStart,\n} from '../../components/header';\nimport { HeaderSettings } from '../../components/header-settings';\nimport { ProductLockup } from '../../brand/product-lockup';\nimport { SignInWithAlfadocsButton } from '../../components/sign-in-with-alfadocs-button';\nimport {\n Sidebar,\n SidebarBody,\n SidebarCollapseTrigger,\n SidebarHeader,\n SidebarItem,\n SidebarItemBadge,\n SidebarItemIcon,\n SidebarItemLabel,\n type SidebarMode,\n} from '../../components/sidebar';\nimport { ThemeRoot } from '../../components/theme-root';\nimport { TooltipProvider } from '../../components/tooltip';\nimport { useTheme } from '../../hooks/use-theme';\n\n/* ------------------------------------------------------------------ */\n/* Public API */\n/* ------------------------------------------------------------------ */\n\nexport interface MarketplaceNavItem {\n id: string;\n /** Pre-translated label — apps localise their own nav copy. */\n label: string;\n href: string;\n /** Optional leading icon (a lucide-react element or equivalent). */\n icon?: ReactNode;\n /** Optional unseen-item count rendered as a pill badge. */\n badgeCount?: number;\n /** Mark the item as the current page (`aria-current='page'`). */\n isActive?: boolean;\n /**\n * Optional click handler threaded onto the nav link's `<a>`. The lightweight\n * alternative to `renderLink`: intercept a same-origin click (call\n * `event.preventDefault()`) and route client-side without a full page load —\n * no router `<Link>` needed. Applies to both the standalone sidebar item and\n * the embedded tab. When `renderLink` is supplied it's handed through to the\n * consumer's link element instead.\n */\n onClick?: (event: MouseEvent<HTMLAnchorElement>) => void;\n}\n\n/**\n * Props the shell hands to `renderLink` for each nav item. The consumer returns\n * their router's `<Link to={href}>` carrying the same `className` (the kit's\n * active styling) and `aria-current` (`'page'` on the active item) so a tab /\n * sidebar-item click is a client-side route change, not a full page reload.\n */\nexport interface MarketplaceRenderLinkProps {\n /** The item's destination — feed it to your router's `to` / `href`. */\n href: string;\n /** The kit's classes — apply verbatim to the link element. */\n className?: string;\n /** Icon + label + badge — render as the link's children. */\n children: ReactNode;\n /** `'page'` on the active item, otherwise omitted — forward to the link. */\n 'aria-current'?: 'page';\n /**\n * The item's stable id, as the agent / automation DOM hook. Spread it onto\n * your router link so the item stays addressable by `[data-tab-id]` — see\n * PRS §26 §6. Only supplied on the bottom-tab-bar path.\n */\n 'data-tab-id'?: string;\n}\n\n/**\n * Render a nav item through the consumer's router instead of the kit's own\n * `<a>`. Returned by the consumer; the shell forwards `href`, the kit's\n * `className`, the item children, and `aria-current` so the active styling and\n * the `aria-current=\"page\"` marker survive a client-side route change.\n */\nexport type MarketplaceRenderLink = (\n props: MarketplaceRenderLinkProps,\n) => ReactNode;\n\nexport interface MarketplaceAppUser {\n /** Display name — drives the avatar initials + the account-menu header. */\n name: string;\n /** Optional email shown under the name in the account menu. */\n email?: string;\n /** Optional avatar image URL. */\n avatarSrc?: string;\n}\n\nexport interface MarketplaceAppShellLabels {\n /** Accessible name for the account-menu trigger, e.g. \"Account menu\". */\n accountMenu: string;\n /** The sign-out menu item, e.g. \"Sign out\". */\n signOut: string;\n /**\n * Optional fullscreen menu item label, e.g. \"Toggle fullscreen\". The item\n * renders whenever `onToggleFullscreen` is supplied; when this label is\n * omitted it falls back to the translated `ui.*` \"Toggle fullscreen\" string.\n */\n fullscreen?: string;\n}\n\nexport interface MarketplaceAppShellProps {\n /** Extension name — renders as the maker lockup \"<productName> by Alfadocs\". */\n productName: string;\n /** Link target for the brand lockup. Default `'/'`. */\n productHref?: string;\n /** Sidebar nav items, in order. */\n nav: MarketplaceNavItem[];\n /**\n * Render nav items (and the brand lockup) through the consumer's router so a\n * tab / item click is a client-side route change with **no full-page reload\n * or session flash**. Wire it to your router's `<Link>`:\n *\n * ```tsx\n * import { Link } from '@tanstack/react-router';\n * <MarketplaceAppShell\n * nav={nav}\n * renderLink={({ href, className, children, ...rest }) => (\n * <Link to={href} className={className} {...rest}>{children}</Link>\n * )}\n * />\n * ```\n *\n * Threaded to the standalone sidebar items, the embedded top tab strip, and\n * the brand lockup. The kit forwards the same `className` + `aria-current` so\n * the active styling and the `aria-current=\"page\"` marker survive in both\n * modes. Omit it to render the plain `<a href>` exactly as before — non-routed\n * consumers are byte-for-byte unaffected. A per-item `onClick` (a\n * click-interceptor shim) is the lighter alternative when you don't want to\n * thread a router `<Link>`.\n */\n renderLink?: MarketplaceRenderLink;\n /** The signed-in user shown in the account menu. */\n user: MarketplaceAppUser;\n /** Consumer-localised chrome labels owned by the shell. */\n labels: MarketplaceAppShellLabels;\n /** Fires when the user picks \"Sign out\". Wire to `useAlfadocsAuth().signOut`. */\n onSignOut?: () => void;\n /** Fires when the user toggles fullscreen. Omit to hide the fullscreen item. */\n onToggleFullscreen?: () => void;\n /**\n * Force the sidebar into a specific mode. Apps typically flip to `'overlay'`\n * on narrow viewports and leave this undefined elsewhere (defaults to\n * `'expanded'`).\n */\n sidebarState?: SidebarMode;\n /**\n * Render a collapse/expand toggle in the sidebar header, letting the user\n * shrink the standalone sidebar to an icon rail. The chosen mode persists\n * per-user (the underlying `Sidebar` stores it) and survives reloads. Opt-in\n * so existing consumers are unaffected; ignored when `sidebarState` forces a\n * mode or in the `'embedded'` variant (no sidebar). @default false\n */\n collapsibleSidebar?: boolean;\n /** Override the accessible name of the `<main>` landmark. */\n mainAriaLabel?: string;\n /**\n * Chrome variant. `'standalone'` (default) renders the full shell — branded\n * Header, Sidebar, and account menu. `'embedded'` is for apps running INSIDE\n * the AlfaDocs platform iframe (consumers detect this with\n * `window !== window.top`): it drops the Header, Sidebar, account menu, and\n * product lockup — the platform already brands and identifies the session\n * around the iframe — and renders the `nav` items as a single slim top tab\n * strip. `onSignOut`, `onToggleFullscreen`, `productName`, `productHref`, and\n * `sidebarState` are ignored in `'embedded'`; the `<main>` landmark,\n * `mainAriaLabel`, and the skip link are kept.\n */\n variant?: 'standalone' | 'embedded';\n /** Children render inside the main content region. */\n children: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Internals */\n/* ------------------------------------------------------------------ */\n\nfunction formatBadgeCount(count: number): string {\n return count > 99 ? '99+' : String(count);\n}\n\nfunction AccountMenu({\n user,\n labels,\n onSignOut,\n onToggleFullscreen,\n}: {\n user: MarketplaceAppUser;\n labels: MarketplaceAppShellLabels;\n onSignOut?: () => void;\n onToggleFullscreen?: () => void;\n}) {\n const { t } = useTranslation();\n // Default to the translated `ui.*` label so a consumer that wires\n // `onToggleFullscreen` but omits the label still gets a localised item.\n const fullscreenLabel =\n labels.fullscreen ?? t('marketplaceAppShell.settings.fullscreen');\n return (\n // Non-modal: an account menu shouldn't inert/aria-hide the whole shell\n // behind it (which leaves the still-focusable chrome inside an\n // aria-hidden region — an `aria-hidden-focus` violation).\n <DropdownMenu.Root modal={false}>\n <DropdownMenu.Trigger asChild>\n {/* Bare avatar circle — matches the main app shell's account\n trigger. The name lives inside the menu, not beside the avatar. */}\n <button\n type=\"button\"\n aria-label={labels.accountMenu}\n data-testid=\"marketplace-account-trigger\"\n className=\"ds:inline-flex ds:items-center ds:justify-center ds:shrink-0 ds:size-10 ds:rounded-[var(--radius-full)] ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)] ds:forced-colors:focus-visible:outline-[CanvasText]\"\n >\n <span aria-hidden=\"true\">\n <Avatar name={user.name} src={user.avatarSrc} size=\"md\" />\n </span>\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\" collisionPadding={16}>\n {/* GitHub-style identity header — small avatar + name + secondary\n line, matching the main app shell's account menu. */}\n <DropdownMenu.Label>\n <span className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span aria-hidden=\"true\">\n <Avatar name={user.name} src={user.avatarSrc} size=\"sm\" />\n </span>\n <span className=\"ds:flex ds:flex-col ds:min-w-0\">\n <span className=\"type-label ds:text-[color:var(--foreground)] ds:truncate\">\n {user.name}\n </span>\n {user.email ? (\n <span className=\"type-meta ds:truncate\">{user.email}</span>\n ) : null}\n </span>\n </span>\n </DropdownMenu.Label>\n {onToggleFullscreen ? (\n <>\n <DropdownMenu.Separator />\n <DropdownMenu.Item\n startIcon={<Maximize2 aria-hidden />}\n onSelect={onToggleFullscreen}\n data-testid=\"marketplace-fullscreen\"\n >\n {fullscreenLabel}\n </DropdownMenu.Item>\n </>\n ) : null}\n <DropdownMenu.Separator />\n <DropdownMenu.Item\n startIcon={<LogOut aria-hidden />}\n onSelect={onSignOut}\n data-testid=\"marketplace-sign-out\"\n >\n {labels.signOut}\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n}\n\nfunction MarketplaceSidebarNav({\n nav,\n renderLink,\n}: {\n nav: MarketplaceNavItem[];\n renderLink?: MarketplaceRenderLink;\n}) {\n return (\n <SidebarBody>\n {nav.map((item) => {\n const badge =\n typeof item.badgeCount === 'number' && item.badgeCount > 0\n ? item.badgeCount\n : undefined;\n const inner = (\n <>\n {item.icon ? <SidebarItemIcon>{item.icon}</SidebarItemIcon> : null}\n <SidebarItemLabel>{item.label}</SidebarItemLabel>\n {badge !== undefined ? (\n <SidebarItemBadge>{formatBadgeCount(badge)}</SidebarItemBadge>\n ) : null}\n </>\n );\n\n // Consumer-router mode: render the item through Radix `Slot`\n // (`SidebarItem asChild`) so the consumer's `<Link>` takes over the\n // anchor while keeping the kit's item styling + `aria-current=\"page\"`.\n // Clicking routes client-side — no full-page reload.\n if (renderLink) {\n return (\n <SidebarItem key={item.id} asChild isActive={item.isActive}>\n {renderLink({\n href: item.href,\n children: inner,\n 'aria-current': item.isActive ? 'page' : undefined,\n })}\n </SidebarItem>\n );\n }\n\n // Default: plain anchor — byte-identical to before when no per-item\n // `onClick` is supplied (it's omitted entirely, not passed as\n // undefined, so the rendered `<a>` is unchanged).\n return (\n <SidebarItem\n key={item.id}\n href={item.href}\n aria-label={item.label}\n isActive={item.isActive}\n {...(item.onClick ? { onClick: item.onClick } : {})}\n >\n {inner}\n </SidebarItem>\n );\n })}\n </SidebarBody>\n );\n}\n\n/* CVA for the chrome variant — drives the `<main>` surface; the structural\n header/sidebar-vs-tab-strip difference is conditional in the render.\n\n The `standalone` `<main>` gets its content inset from AppFrame's own\n `mainVariants({ padded: true })` (`--spacing-md` on every logical side), so\n this variant only carries the canvas colour there. The `embedded` `<main>`\n is a plain element (no AppFrame), so it has to supply its own inset:\n `--spacing-md` inline + block-end to match the standalone inset, and a\n larger `--spacing-lg` block-start so content clears the floating tab strip's\n pill instead of butting up against it. All logical — RTL mirrors for free. */\nconst shellMainVariants = cva('ds:bg-[color:var(--app-shell-background)]', {\n variants: {\n variant: {\n standalone: '',\n embedded: [\n 'ds:flex-1',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-lg)] ds:pb-[var(--spacing-md)]',\n ].join(' '),\n },\n },\n defaultVariants: { variant: 'standalone' },\n});\n\n/**\n * Embedded chrome: the slim floating tab strip (no Header / Sidebar / account\n * menu) for apps running inside the AlfaDocs platform iframe. It's the shared\n * {@link TabBar} fed the shell's nav items — the platform brands and identifies\n * the session around the iframe, so the strip is the only chrome. The\n * `MarketplaceNavItem` shape is structurally a `TabBarItem`, so the nav passes\n * straight through.\n */\nfunction EmbeddedTabStrip({\n nav,\n ariaLabel,\n renderLink,\n}: {\n nav: MarketplaceNavItem[];\n ariaLabel: string;\n renderLink?: MarketplaceRenderLink;\n}) {\n // Adapt the shell's `renderLink` to TabBar's `renderLink` signature — TabBar\n // also offers the per-item `onClick`, but in consumer-router mode the\n // `<Link>` owns navigation (matching the standalone sidebar), so we forward\n // only `href` / `className` / `children` / `aria-current`. With `renderLink`\n // omitted, TabBar renders its own plain `<a href>` exactly as before, and a\n // per-item `onClick` rides through `nav` → `TabBarItem` untouched.\n const tabRenderLink = renderLink\n ? ({\n href,\n className,\n children,\n 'aria-current': ariaCurrent,\n 'data-tab-id': tabId,\n }: {\n href: string;\n className: string;\n children: ReactNode;\n 'aria-current'?: 'page';\n 'data-tab-id'?: string;\n }) =>\n renderLink({\n href,\n className,\n children,\n 'aria-current': ariaCurrent,\n // Forward the agent DOM hook — without it a consumer-router tab is\n // invisible to `[data-tab-id]` lookups (PRS §26 §6).\n 'data-tab-id': tabId,\n })\n : undefined;\n\n return (\n <TabBar\n items={nav}\n ariaLabel={ariaLabel}\n {...(tabRenderLink ? { renderLink: tabRenderLink } : {})}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* MarketplaceAppShell */\n/* ------------------------------------------------------------------ */\n\nexport const MarketplaceAppShell = forwardRef<\n HTMLDivElement,\n MarketplaceAppShellProps\n>(\n (\n {\n productName,\n productHref = '/',\n nav,\n renderLink,\n user,\n labels,\n onSignOut,\n onToggleFullscreen,\n sidebarState,\n collapsibleSidebar = false,\n mainAriaLabel,\n variant = 'standalone',\n children,\n },\n ref,\n ) => {\n const { t } = useTranslation();\n\n // The brand lockup as a consumer-router link: when `renderLink` is\n // supplied, the brand anchor routes client-side too (no session flash when\n // jumping home). The maker lockup's \"<productName> by Alfadocs\" supplies\n // the link's accessible name, matching the default `HeaderBrand` anchor.\n const headerBrand = renderLink ? (\n <HeaderBrand asChild>\n {renderLink({\n href: productHref,\n children: (\n <ProductLockup\n name={productName}\n size=\"md\"\n monochrome\n variant=\"maker\"\n />\n ),\n })}\n </HeaderBrand>\n ) : (\n <HeaderBrand\n href={productHref}\n logo={\n <ProductLockup\n name={productName}\n size=\"md\"\n monochrome\n variant=\"maker\"\n />\n }\n />\n );\n\n // Only wrap in a nested ThemeRoot when the user has an\n // explicit theme/accessibility override, so we don't clobber the consuming\n // app's (or Storybook's) outer theme cascade.\n const { theme: themePref, accessibility, resolvedTheme } = useTheme();\n const hasExplicitOverride =\n themePref !== 'system' || accessibility !== 'system';\n const themeBase = resolvedTheme.startsWith('dark') ? 'dark' : 'light';\n const themeAccessible = resolvedTheme.endsWith('-accessible');\n\n // Narrow-viewport overlay: HeaderMenuButton only renders below `md`.\n const [sidebarOpen, setSidebarOpen] = useState(false);\n\n const shell = (\n <TooltipProvider>\n <AppFrame\n mainAriaLabel={mainAriaLabel}\n mainClassName={shellMainVariants({ variant: 'standalone' })}\n header={\n <Header>\n <HeaderStart>\n <HeaderSkipLink href=\"#main-content\" />\n <HeaderMenuButton onMenuOpen={() => setSidebarOpen(true)} />\n {headerBrand}\n </HeaderStart>\n <HeaderCenter />\n <HeaderEnd>\n <HeaderSettings size=\"sm\" />\n <AccountMenu\n user={user}\n labels={labels}\n onSignOut={onSignOut}\n onToggleFullscreen={onToggleFullscreen}\n />\n </HeaderEnd>\n </Header>\n }\n sidebar={\n <Sidebar\n {...(sidebarState !== undefined\n ? { state: sidebarState }\n : { defaultState: 'expanded' as const })}\n open={sidebarOpen}\n onOpenChange={setSidebarOpen}\n aria-label={t('navigation.sidebar.label')}\n data-testid=\"marketplace-app-shell-sidebar\"\n >\n {collapsibleSidebar && sidebarState === undefined ? (\n // No justify override: SidebarHeader centres its child in the\n // icon rail (`justify-center`) and left-aligns it when expanded,\n // matching the nav icons below. `justify-end` here would win over\n // the icon-mode centring and offset the toggle in the rail.\n <SidebarHeader>\n <SidebarCollapseTrigger />\n </SidebarHeader>\n ) : null}\n <MarketplaceSidebarNav nav={nav} renderLink={renderLink} />\n </Sidebar>\n }\n >\n {children}\n </AppFrame>\n </TooltipProvider>\n );\n\n const embedded = (\n // The shell owns the warm-grey canvas; TabBar's strip is transparent and\n // floats its pill on it, and `<main>` continues the same surface.\n <div className=\"ds:flex ds:min-h-dvh ds:flex-col ds:bg-[color:var(--app-shell-background)]\">\n <HeaderSkipLink href=\"#main-content\" />\n <EmbeddedTabStrip\n nav={nav}\n ariaLabel={t('navigation.sidebar.label')}\n renderLink={renderLink}\n />\n <main\n id=\"main-content\"\n tabIndex={-1}\n aria-label={\n mainAriaLabel ?? t('navigation.main.label', 'Main content')\n }\n className={shellMainVariants({ variant: 'embedded' })}\n >\n {children}\n </main>\n </div>\n );\n\n const content = variant === 'embedded' ? embedded : shell;\n\n if (!hasExplicitOverride) {\n return (\n <div\n ref={ref}\n className=\"ds:contents\"\n data-component=\"marketplace-app-shell\"\n >\n {content}\n </div>\n );\n }\n\n return (\n <ThemeRoot\n ref={ref}\n theme={themeBase}\n accessible={themeAccessible}\n className=\"ds:contents\"\n data-component=\"marketplace-app-shell\"\n >\n {content}\n </ThemeRoot>\n );\n },\n);\n\nMarketplaceAppShell.displayName = 'MarketplaceAppShell';\n\n/* ------------------------------------------------------------------ */\n/* ConnectWithAlfadocs */\n/* ------------------------------------------------------------------ */\n\nexport type ConnectStatus = 'idle' | 'connecting' | 'error';\n\nexport interface ConnectWithAlfadocsProps {\n /** Product name shown next to the wordmark at the top of the card. */\n productName: string;\n /** Heading, e.g. \"Connect your AlfaDocs account\". */\n title: string;\n /** Supporting copy below the heading. */\n description: ReactNode;\n /** The connect button label, e.g. \"Connect with AlfaDocs\". */\n connectLabel: string;\n /** Connection lifecycle. `connecting` shows a loading button; `error` shows the alert. */\n status?: ConnectStatus;\n /** Error message shown (as an alert) when `status === 'error'`. */\n error?: ReactNode;\n /** Fires when the connect button is pressed. Wire to `useAlfadocsAuth().connect`. */\n onConnect?: () => void;\n /** Optional footer content below the button (e.g. a \"what's this?\" link). */\n footer?: ReactNode;\n /**\n * Visual layout. `'card'` (default) is the centred card on the warm-grey\n * canvas — unchanged. `'split'` adds, at `lg:` and up, a two-panel desktop\n * layout: a brand panel on the inline-start and the connect card on the\n * inline-end. Below `lg:`, `'split'` collapses to exactly the card layout —\n * so it falls back gracefully inside iframes / embeds that never reach\n * desktop width. Use `'split'` for full-page desktop logins.\n */\n layout?: 'card' | 'split';\n /**\n * Optional content shown under the lockup in the `'split'` brand panel (a\n * tagline, value props, an illustration). Ignored in `'card'` and below `lg:`.\n */\n brandPanel?: ReactNode;\n className?: string;\n}\n\n/* Split-layout CVAs (lg+ two-panel; collapses to the centred card below lg). */\nconst connectRootVariants = cva(\n 'ds:flex ds:min-h-dvh ds:bg-[color:var(--app-shell-background)]',\n {\n variants: {\n layout: {\n card: '',\n split: 'ds:flex-col ds:lg:flex-row',\n },\n },\n defaultVariants: { layout: 'card' },\n },\n);\n\nconst connectCardWidthVariants = cva('ds:w-full', {\n variants: {\n layout: {\n card: 'ds:max-w-[400px]',\n split: 'ds:max-w-[400px] ds:lg:max-w-[480px]',\n },\n },\n defaultVariants: { layout: 'card' },\n});\n\n// The card's own lockup hides at lg+ in `split` (the brand panel shows it there).\nconst connectCardLockupVariants = cva('', {\n variants: {\n layout: { card: '', split: 'ds:lg:hidden' },\n },\n defaultVariants: { layout: 'card' },\n});\n\n/**\n * The pre-auth \"Connect with AlfaDocs\" screen. Centred white card on the\n * warm-grey canvas with the AlfaDocs wordmark + product name, copy, an error\n * slot, and the primary connect CTA. An opt-in `layout=\"split\"` adds a desktop\n * two-panel brand layout (lg+). Presentational — `onConnect` should call\n * `useAlfadocsAuth().connect()`, which redirects the browser to the server-side\n * BFF that runs the real OAuth2 + PKCE flow.\n */\nexport const ConnectWithAlfadocs = forwardRef<\n HTMLDivElement,\n ConnectWithAlfadocsProps\n>(\n (\n {\n productName,\n title,\n description,\n connectLabel,\n status = 'idle',\n error,\n onConnect,\n footer,\n layout = 'card',\n brandPanel,\n className,\n },\n ref,\n ) => {\n return (\n <div\n ref={ref}\n data-component=\"connect-with-alfadocs\"\n className={`${connectRootVariants({ layout })} ${className ?? ''}`}\n >\n {layout === 'split' ? (\n // Desktop brand panel (lg+ only): a bold `--primary` surface with the\n // monochrome lockup riding the `--primary-foreground` ink, plus an\n // optional `brandPanel` slot. Decorative — the card carries the real\n // heading + CTA, and shows its own lockup below `lg:`.\n <div className=\"ds:hidden ds:lg:flex ds:lg:w-[55%] ds:flex-col ds:items-center ds:justify-center ds:gap-[var(--spacing-lg)] ds:bg-[color:var(--primary)] ds:text-[color:var(--primary-foreground)] ds:ps-[var(--spacing-2xl)] ds:pe-[var(--spacing-2xl)] ds:pt-[var(--spacing-2xl)] ds:pb-[var(--spacing-2xl)] ds:text-start\">\n <ProductLockup\n name={productName}\n size=\"lg\"\n monochrome\n tone=\"inherit\"\n variant=\"maker\"\n />\n {brandPanel ? (\n <div className=\"type-body ds:max-w-[28rem] ds:text-start\">\n {brandPanel}\n </div>\n ) : null}\n </div>\n ) : null}\n <div className=\"ds:flex ds:flex-1 ds:items-center ds:justify-center ds:p-[var(--spacing-lg)]\">\n <Card className={connectCardWidthVariants({ layout })}>\n <Card.Body className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-lg)] ds:text-center\">\n <ProductLockup\n name={productName}\n size=\"lg\"\n variant=\"maker\"\n className={connectCardLockupVariants({ layout })}\n />\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <h1 className=\"type-title-card\">{title}</h1>\n <p className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {description}\n </p>\n </div>\n {status === 'error' && error ? (\n <Alert variant=\"error\" className=\"ds:w-full ds:text-start\">\n {error}\n </Alert>\n ) : null}\n <SignInWithAlfadocsButton\n intent=\"primary\"\n className=\"ds:w-full\"\n loading={status === 'connecting'}\n onClick={onConnect}\n label={connectLabel}\n data-testid=\"connect-with-alfadocs-button\"\n />\n {footer ? (\n <div className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {footer}\n </div>\n ) : null}\n </Card.Body>\n </Card>\n </div>\n </div>\n );\n },\n);\n\nConnectWithAlfadocs.displayName = 'ConnectWithAlfadocs';\n"],"names":["lockup","cva","productName","makerRoot","ProductLockup","forwardRef","name","variant","monochrome","tone","size","className","props","ref","inherit","markInk","nameInk","byInk","letteringInk","jsxs","jsx","AlfadocsLogoMark","AlfadocsLogoNeg","Logo","formatBadgeCount","count","AccountMenu","user","labels","onSignOut","onToggleFullscreen","t","useTranslation","fullscreenLabel","DropdownMenu","Avatar","Fragment","Maximize2","LogOut","MarketplaceSidebarNav","nav","renderLink","SidebarBody","item","badge","inner","SidebarItemIcon","SidebarItemLabel","SidebarItemBadge","SidebarItem","shellMainVariants","EmbeddedTabStrip","ariaLabel","tabRenderLink","href","children","ariaCurrent","tabId","TabBar","MarketplaceAppShell","productHref","sidebarState","collapsibleSidebar","mainAriaLabel","headerBrand","HeaderBrand","themePref","accessibility","resolvedTheme","useTheme","hasExplicitOverride","themeBase","themeAccessible","sidebarOpen","setSidebarOpen","useState","shell","TooltipProvider","AppFrame","Header","HeaderStart","HeaderSkipLink","HeaderMenuButton","HeaderCenter","HeaderEnd","HeaderSettings","Sidebar","SidebarHeader","SidebarCollapseTrigger","embedded","content","ThemeRoot","connectRootVariants","connectCardWidthVariants","connectCardLockupVariants","ConnectWithAlfadocs","title","description","connectLabel","status","error","onConnect","footer","layout","brandPanel","Card","Alert","SignInWithAlfadocsButton"],"mappings":"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"}
|