themelia-react-ui 2.0.5 → 2.0.6
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/CHANGELOG.md +76 -0
- package/MIGRATION.md +119 -0
- package/README.md +13 -6
- package/dist/{accordion-B9MHG0cT.js → accordion-0tQUZ20r.js} +7 -7
- package/dist/accordion-0tQUZ20r.js.map +1 -0
- package/dist/{action-menu-Dr8K-ghE.js → action-menu-C0gjzLyE.js} +7 -7
- package/dist/{action-menu-Dr8K-ghE.js.map → action-menu-C0gjzLyE.js.map} +1 -1
- package/dist/{ai-artifact-C58tQcBy.js → ai-artifact-CGGpQryR.js} +172 -157
- package/dist/ai-artifact-CGGpQryR.js.map +1 -0
- package/dist/{app-shell-B_IuNWOo.js → app-shell-EHuuRDGy.js} +5 -5
- package/dist/{app-shell-B_IuNWOo.js.map → app-shell-EHuuRDGy.js.map} +1 -1
- package/dist/{attachment-Dg_69lPS.js → attachment-BCpA4e7i.js} +8 -8
- package/dist/{attachment-Dg_69lPS.js.map → attachment-BCpA4e7i.js.map} +1 -1
- package/dist/{auth-DTkkshS8.js → auth-B0girIk_.js} +15 -15
- package/dist/auth-B0girIk_.js.map +1 -0
- package/dist/{avatar-CeZaFmNH.js → avatar-B9Jnp-T-.js} +3 -3
- package/dist/{avatar-CeZaFmNH.js.map → avatar-B9Jnp-T-.js.map} +1 -1
- package/dist/{badge-xIiV_E7f.js → badge-wWauMgAt.js} +3 -3
- package/dist/{badge-xIiV_E7f.js.map → badge-wWauMgAt.js.map} +1 -1
- package/dist/base/accordion.js +1 -1
- package/dist/base/action-menu.js +1 -1
- package/dist/base/attachment.js +1 -1
- package/dist/base/avatar.js +1 -1
- package/dist/base/badge.js +1 -1
- package/dist/base/batch-action-bar.js +1 -1
- package/dist/base/buttons.js +1 -1
- package/dist/base/cards.js +2 -2
- package/dist/base/carousel.js +3 -3
- package/dist/base/cascader.js +1 -1
- package/dist/base/chart.js +1 -1
- package/dist/base/choice-inputs.js +2 -2
- package/dist/base/code-block.js +1 -1
- package/dist/base/combobox.js +1 -1
- package/dist/base/command.js +1 -1
- package/dist/base/copyable.js +1 -1
- package/dist/base/date-pickers.js +2 -2
- package/dist/base/display.js +6 -6
- package/dist/base/feedback.js +4 -4
- package/dist/base/forms-numeric.js +1 -1
- package/dist/base/forms.js +2 -2
- package/dist/base/inline-edit.js +8 -8
- package/dist/base/item.js +1 -1
- package/dist/base/media-gallery.js +1 -1
- package/dist/base/metadata-list.js +1 -1
- package/dist/base/navigation.js +6 -6
- package/dist/base/popover-menu.js +1 -1
- package/dist/base/popover.js +1 -1
- package/dist/base/qr-code.js +1 -1
- package/dist/base/repeaters.js +195 -188
- package/dist/base/repeaters.js.map +1 -1
- package/dist/base/sheet.js +1 -1
- package/dist/base/sidebar.js +2 -2
- package/dist/base/signature-pad.js +7 -7
- package/dist/base/skeleton.js +1 -1
- package/dist/base/spinner.js +5 -5
- package/dist/base/spinner.js.map +1 -1
- package/dist/base/structure.js +1 -1
- package/dist/base/table.js +1 -1
- package/dist/base/text-inputs.js +2 -2
- package/dist/base/toaster.js +1 -1
- package/dist/base/tree.js +1 -1
- package/dist/base/upload-queue.js +1 -1
- package/dist/base/upload.js +3 -3
- package/dist/base/value-inputs.js +1 -1
- package/dist/{batch-action-bar-Cb8cuvyy.js → batch-action-bar-BoqWIIpV.js} +5 -5
- package/dist/{batch-action-bar-Cb8cuvyy.js.map → batch-action-bar-BoqWIIpV.js.map} +1 -1
- package/dist/blocks/admin.js +17 -17
- package/dist/blocks/ai.js +227 -221
- package/dist/blocks/ai.js.map +1 -1
- package/dist/blocks/analytics/usage-card.js +1 -1
- package/dist/blocks/analytics.js +424 -449
- package/dist/blocks/analytics.js.map +1 -1
- package/dist/blocks/collaboration.js +1 -1
- package/dist/blocks/commerce/receipt.js +1 -1
- package/dist/blocks/commerce.js +225 -220
- package/dist/blocks/commerce.js.map +1 -1
- package/dist/blocks/data-display.js +2 -2
- package/dist/blocks/onboarding.js +5 -5
- package/dist/blocks/planning.js +11 -11
- package/dist/blocks/timelines.js +1 -1
- package/dist/{breadcrumbs-J-K2kl4c.js → breadcrumbs-Bp9Ke7kd.js} +4 -4
- package/dist/breadcrumbs-Bp9Ke7kd.js.map +1 -0
- package/dist/{button-S2Cubiiz.js → button-ChBovTx0.js} +2 -2
- package/dist/{button-S2Cubiiz.js.map → button-ChBovTx0.js.map} +1 -1
- package/dist/{buttons-BedGfygC.js → buttons-DeW0bQeK.js} +6 -6
- package/dist/{buttons-BedGfygC.js.map → buttons-DeW0bQeK.js.map} +1 -1
- package/dist/{cards-rNX1M4Xn.js → cards-CNXnmvV5.js} +8 -8
- package/dist/{cards-rNX1M4Xn.js.map → cards-CNXnmvV5.js.map} +1 -1
- package/dist/{cascader-B1MiqkBq.js → cascader-CrAl9zD5.js} +15 -15
- package/dist/{cascader-B1MiqkBq.js.map → cascader-CrAl9zD5.js.map} +1 -1
- package/dist/{chart-Darg_0Kv.js → chart-I7ROnsl8.js} +5 -5
- package/dist/{chart-Darg_0Kv.js.map → chart-I7ROnsl8.js.map} +1 -1
- package/dist/{checkbox-fflqmODR.js → checkbox-MoyHIAPs.js} +3 -3
- package/dist/{checkbox-fflqmODR.js.map → checkbox-MoyHIAPs.js.map} +1 -1
- package/dist/{choice-inputs-zUgBZfE4.js → choice-inputs-DHGtx0QV.js} +122 -110
- package/dist/choice-inputs-DHGtx0QV.js.map +1 -0
- package/dist/{code-block-BzmM9Eig.js → code-block-BSJyq9e-.js} +7 -7
- package/dist/{code-block-BzmM9Eig.js.map → code-block-BSJyq9e-.js.map} +1 -1
- package/dist/{collapsible-BkAI_XD4.js → collapsible-BzJ91LUG.js} +3 -3
- package/dist/{collapsible-BkAI_XD4.js.map → collapsible-BzJ91LUG.js.map} +1 -1
- package/dist/{collection-content-gDh1v6O4.js → collection-content-CSnwtOTH.js} +3 -3
- package/dist/{collection-content-gDh1v6O4.js.map → collection-content-CSnwtOTH.js.map} +1 -1
- package/dist/{combobox-BEx0vJgF.js → combobox-Bcvu5J8O.js} +11 -10
- package/dist/{combobox-BEx0vJgF.js.map → combobox-Bcvu5J8O.js.map} +1 -1
- package/dist/combobox-C2JiSQPc.js +915 -0
- package/dist/combobox-C2JiSQPc.js.map +1 -0
- package/dist/{command-CrlPIL6m.js → command-9e52NPgK.js} +6 -6
- package/dist/{command-CrlPIL6m.js.map → command-9e52NPgK.js.map} +1 -1
- package/dist/{comments-Dmpp0YIc.js → comments-BsgErEqd.js} +33 -28
- package/dist/comments-BsgErEqd.js.map +1 -0
- package/dist/components/base/choice-inputs/choice-types.d.ts +4 -0
- package/dist/components/base/choice-inputs/pill-radio-group.d.ts +7 -6
- package/dist/components/base/combobox/combobox-field.d.ts +2 -2
- package/dist/components/base/date-pickers/date-picker-internals.d.ts +3 -1
- package/dist/components/base/date-pickers/datepicker.types.d.ts +10 -4
- package/dist/components/base/date-pickers/time-picker.d.ts +17 -3
- package/dist/components/base/feedback/state-display.d.ts +5 -1
- package/dist/components/base/feedback/state-display.strings.d.ts +9 -0
- package/dist/components/base/forms/form-field.d.ts +7 -2
- package/dist/components/base/forms-numeric/coordinates-input.d.ts +4 -1
- package/dist/components/base/forms-numeric/decimal-input.d.ts +2 -2
- package/dist/components/base/forms-numeric/dimensions-input.d.ts +4 -1
- package/dist/components/base/forms-numeric/numeric-composite-field.d.ts +12 -0
- package/dist/components/base/forms-numeric/weight-input.d.ts +6 -1
- package/dist/components/base/navigation/language-switcher.d.ts +12 -4
- package/dist/components/base/repeaters/key-value-editor.d.ts +2 -1
- package/dist/components/base/sidebar/sidebar.d.ts +2 -0
- package/dist/components/base/upload/avatar-upload.d.ts +2 -1
- package/dist/components/base/upload/image-upload.d.ts +2 -1
- package/dist/components/blocks/ai/ai-citation/types.d.ts +2 -0
- package/dist/components/blocks/ai/ai-reasoning/types.d.ts +2 -0
- package/dist/components/blocks/ai/ai-sources/types.d.ts +2 -0
- package/dist/components/blocks/ai/ai-tool-call/types.d.ts +2 -0
- package/dist/components/blocks/analytics/metric/metric.d.ts +4 -0
- package/dist/components/blocks/analytics/metric-comparison/metric-comparison.d.ts +2 -0
- package/dist/components/blocks/analytics/metric-grid/metric-grid.d.ts +4 -5
- package/dist/components/blocks/analytics/types.d.ts +2 -2
- package/dist/components/blocks/commerce/order-status/types.d.ts +4 -0
- package/dist/components/blocks/data-display/empty-state/empty-state.types.d.ts +4 -3
- package/dist/components/features/activities/activities.types.d.ts +18 -11
- package/dist/components/features/activities/hooks/use-activity-resources.d.ts +2 -1
- package/dist/components/features/ai-chat/hooks/use-ai-chat-scroll.d.ts +1 -1
- package/dist/components/features/appointment-calendar/appointment-calendar.d.ts +1 -1
- package/dist/components/features/appointment-calendar/appointment-calendar.types.d.ts +4 -2
- package/dist/components/features/combobox/async-resource-combobox.d.ts +2 -2
- package/dist/components/features/combobox/combobox.d.ts +2 -2
- package/dist/components/features/combobox/hooks/use-combobox-core.d.ts +2 -1
- package/dist/components/features/combobox/hooks/use-combobox-state.d.ts +1 -0
- package/dist/components/features/combobox/hooks/use-load-more.d.ts +1 -0
- package/dist/components/features/combobox/types.d.ts +37 -8
- package/dist/components/features/email-composer/types.d.ts +3 -1
- package/dist/components/features/filters/facets/date-facet.d.ts +4 -2
- package/dist/components/features/filters/facets/range-facet.d.ts +12 -0
- package/dist/components/features/filters/filters.types.d.ts +3 -3
- package/dist/components/features/filters/partials/date-filter-content.d.ts +3 -2
- package/dist/components/features/filters/partials/filter-popover-content.d.ts +4 -2
- package/dist/components/features/filters/partials/range-filter-content.d.ts +12 -0
- package/dist/components/features/filters/utils/filter-utils.d.ts +5 -1
- package/dist/components/features/media-library/hooks/use-media-library.d.ts +1 -1
- package/dist/components/features/media-library/media-library.d.ts +1 -1
- package/dist/components/features/media-library/media-library.strings.d.ts +6 -0
- package/dist/components/features/media-library/media-library.types.d.ts +36 -8
- package/dist/components/features/media-library/partials/media-library-partials.d.ts +3 -3
- package/dist/components/features/mentions/hooks/use-mentions.d.ts +16 -1
- package/dist/components/features/mentions/partials/mention-inline-suggestions.d.ts +5 -1
- package/dist/components/features/mentions/utils/split-html-by-mentions.d.ts +1 -7
- package/dist/components/features/overlays/hooks/use-overlay-visibility.d.ts +2 -2
- package/dist/components/features/products/products.types.d.ts +2 -2
- package/dist/components/features/questionnaire/questionnaire.types.d.ts +3 -0
- package/dist/components/features/resource/resource.d.ts +1 -1
- package/dist/components/features/resource/resource.types.d.ts +2 -0
- package/dist/components/features/rich-text-editor/form-rich-text-editor.d.ts +1 -1
- package/dist/components/features/rich-text-editor/partials/caret-helpers.d.ts +1 -1
- package/dist/components/features/rich-text-editor/partials/editor-field-aria.d.ts +14 -0
- package/dist/components/features/rich-text-editor/partials/rich-text-editor-toolbar.d.ts +3 -1
- package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +1 -1
- package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +17 -3
- package/dist/components/features/schema-form/hooks/use-schema-form.d.ts +5 -1
- package/dist/components/features/schema-form/partials/schema-form-field.d.ts +3 -1
- package/dist/components/features/schema-form/schema-form.utils.d.ts +1 -1
- package/dist/components/features/suggestions/suggestions.types.d.ts +1 -1
- package/dist/components/features/table/data-table.d.ts +1 -1
- package/dist/components/features/table/index.d.ts +1 -0
- package/dist/components/features/table/table-body.d.ts +1 -1
- package/dist/components/features/table/table-helpers.d.ts +6 -3
- package/dist/components/features/table/table.strings.d.ts +3 -0
- package/dist/components/features/table/table.types.d.ts +17 -1
- package/dist/components/layout/header/header.types.d.ts +3 -2
- package/dist/components/layout/layout.types.d.ts +5 -3
- package/dist/components/layout/navigation/side-nav.d.ts +3 -2
- package/dist/components/layout/normalize-layout-path.d.ts +1 -0
- package/dist/components/layout/settings/settings.d.ts +1 -1
- package/dist/components/layout/sidebar/app-sidebar.d.ts +1 -1
- package/dist/components/layout/sidebar/sidebar-navigation-rail.d.ts +3 -1
- package/dist/components/layout/sidebar/sidebar.context.d.ts +1 -0
- package/dist/components/layout/sidebar/sidebar.types.d.ts +2 -0
- package/dist/components/primitives/link.d.ts +3 -2
- package/dist/components/primitives/money.d.ts +1 -1
- package/dist/components/primitives/number.d.ts +1 -1
- package/dist/components/typography/rich-text/rich-text-tree.d.ts +7 -5
- package/dist/{containers-CIxwbZt5.js → containers-CSdc32h9.js} +2 -2
- package/dist/{containers-CIxwbZt5.js.map → containers-CSdc32h9.js.map} +1 -1
- package/dist/{copyable-DIznBqiT.js → copyable-3fdHfMR3.js} +4 -4
- package/dist/{copyable-DIznBqiT.js.map → copyable-3fdHfMR3.js.map} +1 -1
- package/dist/{data-display-BdgCAw8T.js → data-display-Cmj-xZYl.js} +16 -15
- package/dist/data-display-Cmj-xZYl.js.map +1 -0
- package/dist/{date-Cq8ioE4o.js → date-Br0FicVv.js} +4 -4
- package/dist/{date-Cq8ioE4o.js.map → date-Br0FicVv.js.map} +1 -1
- package/dist/date-picker-CyQlFYsP.js +1617 -0
- package/dist/date-picker-CyQlFYsP.js.map +1 -0
- package/dist/date-pickers-tj2MXmXd.js +185 -0
- package/dist/date-pickers-tj2MXmXd.js.map +1 -0
- package/dist/{display-KsZLw9Ov.js → display-CT_N2a3w.js} +7 -7
- package/dist/{display-KsZLw9Ov.js.map → display-CT_N2a3w.js.map} +1 -1
- package/dist/{dropdown-menu-CLs8Lihj.js → dropdown-menu-C08iIugv.js} +6 -6
- package/dist/{dropdown-menu-CLs8Lihj.js.map → dropdown-menu-C08iIugv.js.map} +1 -1
- package/dist/features/activities.js +283 -270
- package/dist/features/activities.js.map +1 -1
- package/dist/features/ai-chat.js +40 -27
- package/dist/features/ai-chat.js.map +1 -1
- package/dist/features/appointment-calendar.js +126 -126
- package/dist/features/appointment-calendar.js.map +1 -1
- package/dist/features/async-preview.js +9 -9
- package/dist/features/combobox.js +1 -1
- package/dist/features/comments.js +1 -1
- package/dist/features/data-view.js +10 -10
- package/dist/features/email-composer.js +24 -19
- package/dist/features/email-composer.js.map +1 -1
- package/dist/features/event-calendar.js +129 -125
- package/dist/features/event-calendar.js.map +1 -1
- package/dist/features/filters.js +2 -2
- package/dist/features/global-search.js +16 -20
- package/dist/features/global-search.js.map +1 -1
- package/dist/features/kanban.js +18 -28
- package/dist/features/kanban.js.map +1 -1
- package/dist/features/map/style.css +15 -0
- package/dist/features/map.js +331 -314
- package/dist/features/map.js.map +1 -1
- package/dist/features/media-library.js +1044 -866
- package/dist/features/media-library.js.map +1 -1
- package/dist/features/mentions.js +2 -2
- package/dist/features/overlays.js +1 -1
- package/dist/features/products.js +978 -964
- package/dist/features/products.js.map +1 -1
- package/dist/features/questionnaire.js +159 -152
- package/dist/features/questionnaire.js.map +1 -1
- package/dist/features/resource-assignment.js +8 -8
- package/dist/features/resource.js +74 -71
- package/dist/features/resource.js.map +1 -1
- package/dist/features/rich-text-editor.js +28 -19
- package/dist/features/rich-text-editor.js.map +1 -1
- package/dist/features/schema-form.js +297 -256
- package/dist/features/schema-form.js.map +1 -1
- package/dist/features/suggestions.js +57 -50
- package/dist/features/suggestions.js.map +1 -1
- package/dist/features/sync.js +3 -3
- package/dist/features/table.js +1 -1
- package/dist/features/theme-tweaker.js +400 -399
- package/dist/features/theme-tweaker.js.map +1 -1
- package/dist/feedback-Dzo1xtAU.js +246 -0
- package/dist/feedback-Dzo1xtAU.js.map +1 -0
- package/dist/{field-affordance-recipes-DWcNcOjh.js → field-affordance-recipes-D6H7tVJi.js} +2 -2
- package/dist/{field-affordance-recipes-DWcNcOjh.js.map → field-affordance-recipes-D6H7tVJi.js.map} +1 -1
- package/dist/field-control-attributes-B6i335wr.js +18 -0
- package/dist/field-control-attributes-B6i335wr.js.map +1 -0
- package/dist/{field-state-recipes-BVA2CWHo.js → field-state-recipes-7sza8QbC.js} +4 -2
- package/dist/{field-state-recipes-BVA2CWHo.js.map → field-state-recipes-7sza8QbC.js.map} +1 -1
- package/dist/{filters-DzgSJpMK.js → filters-Dl80yYtN.js} +763 -605
- package/dist/filters-Dl80yYtN.js.map +1 -0
- package/dist/form-field-CAPdwdnZ.js +74 -0
- package/dist/form-field-CAPdwdnZ.js.map +1 -0
- package/dist/{form-sizing-Bs2qFUeE.js → form-sizing-CgcrUbLU.js} +2 -2
- package/dist/{form-sizing-Bs2qFUeE.js.map → form-sizing-CgcrUbLU.js.map} +1 -1
- package/dist/{forms-C0RGnJTe.js → forms-B3W8CH7-.js} +8 -8
- package/dist/{forms-C0RGnJTe.js.map → forms-B3W8CH7-.js.map} +1 -1
- package/dist/forms-numeric-CwjQJe-O.js +991 -0
- package/dist/forms-numeric-CwjQJe-O.js.map +1 -0
- package/dist/{header-DMMxG__r.js → header-ZIIsRKxP.js} +113 -113
- package/dist/header-ZIIsRKxP.js.map +1 -0
- package/dist/hooks/use-files.d.ts +2 -0
- package/dist/{hooks-DB6CJ4MR.js → hooks-BitHSh-Y.js} +3 -3
- package/dist/{hooks-DB6CJ4MR.js.map → hooks-BitHSh-Y.js.map} +1 -1
- package/dist/{icon-badge-DZF-YjQp.js → icon-badge-npxF1SLX.js} +2 -2
- package/dist/{icon-badge-DZF-YjQp.js.map → icon-badge-npxF1SLX.js.map} +1 -1
- package/dist/index.js +1 -1
- package/dist/{input-CvyDQlY7.js → input-7KAc7XQL.js} +6 -6
- package/dist/{input-CvyDQlY7.js.map → input-7KAc7XQL.js.map} +1 -1
- package/dist/{input-DMBwAZmr.js → input-DIREVYHs.js} +3 -3
- package/dist/{input-DMBwAZmr.js.map → input-DIREVYHs.js.map} +1 -1
- package/dist/{interaction-recipes-XR9ZpVYL.js → interaction-recipes-4wZ2tvfb.js} +2 -2
- package/dist/{interaction-recipes-XR9ZpVYL.js.map → interaction-recipes-4wZ2tvfb.js.map} +1 -1
- package/dist/{item-DjCcM18E.js → item-FfWnaYST.js} +99 -98
- package/dist/item-FfWnaYST.js.map +1 -0
- package/dist/layout/app-shell.js +1 -1
- package/dist/layout/auth.js +1 -1
- package/dist/layout/containers.js +1 -1
- package/dist/layout/header.js +1 -1
- package/dist/layout/hooks.js +1 -1
- package/dist/layout/navigation.js +1 -1
- package/dist/layout/page.js +1 -1
- package/dist/layout/settings.js +1 -1
- package/dist/layout/sidebar.js +2 -2
- package/dist/layout/workspace.js +1 -1
- package/dist/layout.js +11 -11
- package/dist/layout.types-E_GAApzO.js +30 -0
- package/dist/layout.types-E_GAApzO.js.map +1 -0
- package/dist/lib/field-control-attributes.d.ts +11 -0
- package/dist/lib/field-state-recipes.d.ts +2 -0
- package/dist/lib/format.d.ts +1 -0
- package/dist/lib/surface-recipes.d.ts +1 -1
- package/dist/lib/token-merge.generated.d.ts +6 -6
- package/dist/lib/utils.js +1 -1
- package/dist/{media-gallery-C-vChPmE.js → media-gallery-C81DAnKI.js} +6 -6
- package/dist/{media-gallery-C-vChPmE.js.map → media-gallery-C81DAnKI.js.map} +1 -1
- package/dist/{mentions-0_4nWuI-.js → mentions-qOnedSt4.js} +236 -167
- package/dist/mentions-qOnedSt4.js.map +1 -0
- package/dist/message-BJHnn43M.js +135 -0
- package/dist/message-BJHnn43M.js.map +1 -0
- package/dist/{metadata-list-C3MkU-Om.js → metadata-list-XkqZ_UXH.js} +11 -11
- package/dist/{metadata-list-C3MkU-Om.js.map → metadata-list-XkqZ_UXH.js.map} +1 -1
- package/dist/{navigation-DaRjthVk.js → navigation-BgtPJAhi.js} +119 -119
- package/dist/navigation-BgtPJAhi.js.map +1 -0
- package/dist/{navigation-C90-oQFq.js → navigation-Bt-v7rWP.js} +52 -46
- package/dist/navigation-Bt-v7rWP.js.map +1 -0
- package/dist/normalize-layout-path-BmEgg6fu.js +14 -0
- package/dist/normalize-layout-path-BmEgg6fu.js.map +1 -0
- package/dist/{number-CRU3kGuk.js → number-CYqBcrSj.js} +78 -86
- package/dist/number-CYqBcrSj.js.map +1 -0
- package/dist/{overflow-tab-bar-IVFVQFV6.js → overflow-tab-bar-BQCA2Zn2.js} +7 -7
- package/dist/{overflow-tab-bar-IVFVQFV6.js.map → overflow-tab-bar-BQCA2Zn2.js.map} +1 -1
- package/dist/{overlays-BSgCtM2v.js → overlays-CC8zI3Du.js} +264 -260
- package/dist/overlays-CC8zI3Du.js.map +1 -0
- package/dist/{page-DUUKDAjo.js → page-BoQ1VaFJ.js} +13 -13
- package/dist/{page-DUUKDAjo.js.map → page-BoQ1VaFJ.js.map} +1 -1
- package/dist/{page-header-commands-7P3sfE9u.js → page-header-commands-DIKspJfx.js} +4 -4
- package/dist/{page-header-commands-7P3sfE9u.js.map → page-header-commands-DIKspJfx.js.map} +1 -1
- package/dist/{pagination-CgCjElfu.js → pagination-Br8TdV9A.js} +4 -4
- package/dist/{pagination-CgCjElfu.js.map → pagination-Br8TdV9A.js.map} +1 -1
- package/dist/{popover-B85RenIl.js → popover-k8TdUcAt.js} +10 -10
- package/dist/popover-k8TdUcAt.js.map +1 -0
- package/dist/{popover-menu-DlnQ2zlR.js → popover-menu-yn-o0kyA.js} +7 -7
- package/dist/{popover-menu-DlnQ2zlR.js.map → popover-menu-yn-o0kyA.js.map} +1 -1
- package/dist/{popover.recipes-DdiEp0rd.js → popover.recipes-DJ0AkUan.js} +2 -2
- package/dist/{popover.recipes-DdiEp0rd.js.map → popover.recipes-DJ0AkUan.js.map} +1 -1
- package/dist/{portal-recipes-BpsV_iRw.js → portal-recipes-DyUXqUtD.js} +2 -2
- package/dist/{portal-recipes-BpsV_iRw.js.map → portal-recipes-DyUXqUtD.js.map} +1 -1
- package/dist/{primitives-ByWgGUgt.js → primitives-BkkQjYl7.js} +22 -17
- package/dist/primitives-BkkQjYl7.js.map +1 -0
- package/dist/primitives.js +4 -4
- package/dist/{progress-BJhQP9WX.js → progress-DZFXXzPs.js} +4 -4
- package/dist/{progress-BJhQP9WX.js.map → progress-DZFXXzPs.js.map} +1 -1
- package/dist/{receipt-tOc7B3hw.js → receipt-C7LhOg7Q.js} +6 -6
- package/dist/{receipt-tOc7B3hw.js.map → receipt-C7LhOg7Q.js.map} +1 -1
- package/dist/rich-text-BnTzZjIo.js +45 -0
- package/dist/rich-text-BnTzZjIo.js.map +1 -0
- package/dist/rich-text-editor-CAurDwT5.js +1273 -0
- package/dist/rich-text-editor-CAurDwT5.js.map +1 -0
- package/dist/{rich-text-editor-toolbar-laT3tpBT.js → rich-text-editor-toolbar-DbXig7Jk.js} +36 -35
- package/dist/rich-text-editor-toolbar-DbXig7Jk.js.map +1 -0
- package/dist/rich-text-tree-BqyQ_7-R.js +66 -0
- package/dist/rich-text-tree-BqyQ_7-R.js.map +1 -0
- package/dist/{sanitize-html-DsQmI48u.js → sanitize-html-BWkH4dLM.js} +29 -16
- package/dist/sanitize-html-BWkH4dLM.js.map +1 -0
- package/dist/{scroll-area-B0dB2cBi.js → scroll-area-Bj6CRUif.js} +2 -2
- package/dist/{scroll-area-B0dB2cBi.js.map → scroll-area-Bj6CRUif.js.map} +1 -1
- package/dist/{separator-Bb17I4pu.js → separator-B9ewiCGO.js} +2 -2
- package/dist/{separator-Bb17I4pu.js.map → separator-B9ewiCGO.js.map} +1 -1
- package/dist/{separator-Ct_WSWTJ.js → separator-DM6gs2vu.js} +3 -3
- package/dist/{separator-Ct_WSWTJ.js.map → separator-DM6gs2vu.js.map} +1 -1
- package/dist/services/actions.js +1 -1
- package/dist/settings-DZPHgpx4.js +155 -0
- package/dist/settings-DZPHgpx4.js.map +1 -0
- package/dist/{sheet-BGPERY55.js → sheet-C4DHsgLk.js} +6 -6
- package/dist/{sheet-BGPERY55.js.map → sheet-C4DHsgLk.js.map} +1 -1
- package/dist/sidebar-C8BnDwTH.js +709 -0
- package/dist/sidebar-C8BnDwTH.js.map +1 -0
- package/dist/{sidebar-f9gRWXIR.js → sidebar-CmD6a-HK.js} +16 -13
- package/dist/sidebar-CmD6a-HK.js.map +1 -0
- package/dist/{skeleton-BapcJd9C.js → skeleton-DDgdhmu9.js} +5 -5
- package/dist/{skeleton-BapcJd9C.js.map → skeleton-DDgdhmu9.js.map} +1 -1
- package/dist/{smart-card-CW0hjetE.js → smart-card-B6vLxqa_.js} +8 -8
- package/dist/{smart-card-CW0hjetE.js.map → smart-card-B6vLxqa_.js.map} +1 -1
- package/dist/{structure-DuxKl954.js → structure-DZJ2wbAU.js} +2 -2
- package/dist/{structure-DuxKl954.js.map → structure-DZJ2wbAU.js.map} +1 -1
- package/dist/style.css +1 -1
- package/dist/{surface-recipes-BKRVW8Os.js → surface-recipes-C8mNycaY.js} +2 -2
- package/dist/{surface-recipes-BKRVW8Os.js.map → surface-recipes-C8mNycaY.js.map} +1 -1
- package/dist/{table-CFOWY9pQ.js → table-CBonSdTp.js} +534 -486
- package/dist/table-CBonSdTp.js.map +1 -0
- package/dist/{table-B4TE7iOV.js → table-CXSPHH25.js} +75 -71
- package/dist/table-CXSPHH25.js.map +1 -0
- package/dist/{tabs-e7ko9S2o.js → tabs-C4Kr_hCr.js} +50 -49
- package/dist/tabs-C4Kr_hCr.js.map +1 -0
- package/dist/{text-inputs-B1culiSK.js → text-inputs-jdkS3ReG.js} +9 -9
- package/dist/{text-inputs-B1culiSK.js.map → text-inputs-jdkS3ReG.js.map} +1 -1
- package/dist/{timelines-D3Sl9ueq.js → timelines-CoPwdJP0.js} +10 -10
- package/dist/{timelines-D3Sl9ueq.js.map → timelines-CoPwdJP0.js.map} +1 -1
- package/dist/{tooltip-8wz5S_Zr.js → tooltip-31NwIpTo.js} +4 -4
- package/dist/{tooltip-8wz5S_Zr.js.map → tooltip-31NwIpTo.js.map} +1 -1
- package/dist/{tree-CzUJHnFs.js → tree-CeYVzdFE.js} +6 -6
- package/dist/{tree-CzUJHnFs.js.map → tree-CeYVzdFE.js.map} +1 -1
- package/dist/typography/rich-text.js +1 -1
- package/dist/{typography-BQnine1k.js → typography-C7-YMW1S.js} +2 -2
- package/dist/{typography-BQnine1k.js.map → typography-C7-YMW1S.js.map} +1 -1
- package/dist/typography.js +1 -1
- package/dist/{upload-BOW6U2tI.js → upload-Hdm5gObf.js} +303 -291
- package/dist/upload-Hdm5gObf.js.map +1 -0
- package/dist/{upload-queue-qUXn1ykN.js → upload-queue-D0sYPuqo.js} +8 -8
- package/dist/{upload-queue-qUXn1ykN.js.map → upload-queue-D0sYPuqo.js.map} +1 -1
- package/dist/{usage-card-BeSLY0i0.js → usage-card-9s8hLDfn.js} +9 -9
- package/dist/{usage-card-BeSLY0i0.js.map → usage-card-9s8hLDfn.js.map} +1 -1
- package/dist/{utils-B6kKb8jB.js → utils-DhuoqFy4.js} +31 -37
- package/dist/utils-DhuoqFy4.js.map +1 -0
- package/dist/{value-inputs-skdVB2zh.js → value-inputs-D3aPgq9H.js} +15 -15
- package/dist/{value-inputs-skdVB2zh.js.map → value-inputs-D3aPgq9H.js.map} +1 -1
- package/dist/{value-typography-uAmWUAL1.js → value-typography-uSzzG9Gf.js} +32 -26
- package/dist/value-typography-uSzzG9Gf.js.map +1 -0
- package/dist/{workspace-DHeHv0qw.js → workspace-CC8Vchiu.js} +12 -12
- package/dist/{workspace-DHeHv0qw.js.map → workspace-CC8Vchiu.js.map} +1 -1
- package/docs/consumer-skill/examples/edit.tsx +3 -3
- package/docs/consumer-skill/references/agents-md.md +19 -19
- package/docs/consumer-skill/references/analytics.md +15 -0
- package/docs/consumer-skill/references/component-contracts.json +14724 -13057
- package/docs/consumer-skill/references/composition.md +21 -4
- package/docs/consumer-skill/references/design-contract.md +1 -0
- package/docs/consumer-skill/references/installation.md +51 -8
- package/docs/consumer-skill/references/integration.md +24 -1
- package/docs/consumer-skill/references/public-api.json +172 -34
- package/docs/consumer-skill/references/review.md +51 -11
- package/docs/consumer-skill/references/rhf-workflows.md +72 -0
- package/docs/consumer-skill/references/theming.md +7 -2
- package/docs/consumer-skill/references/tokens.json +1 -1
- package/docs/consumer-skill/scripts/composition-policy.mjs +144 -30
- package/docs/consumer-skill/scripts/setup-skills.mjs +46 -9
- package/package.json +4 -2
- package/templates/admin-shell-template.tsx +1 -2
- package/templates/customers-template.tsx +18 -16
- package/dist/accordion-B9MHG0cT.js.map +0 -1
- package/dist/ai-artifact-C58tQcBy.js.map +0 -1
- package/dist/auth-DTkkshS8.js.map +0 -1
- package/dist/breadcrumbs-J-K2kl4c.js.map +0 -1
- package/dist/choice-inputs-zUgBZfE4.js.map +0 -1
- package/dist/combobox-BwzoXFSG.js +0 -884
- package/dist/combobox-BwzoXFSG.js.map +0 -1
- package/dist/comments-Dmpp0YIc.js.map +0 -1
- package/dist/data-display-BdgCAw8T.js.map +0 -1
- package/dist/date-picker-RlIzKom_.js +0 -1551
- package/dist/date-picker-RlIzKom_.js.map +0 -1
- package/dist/date-pickers-DY-CpXS1.js +0 -179
- package/dist/date-pickers-DY-CpXS1.js.map +0 -1
- package/dist/feedback-Dm4izqFn.js +0 -240
- package/dist/feedback-Dm4izqFn.js.map +0 -1
- package/dist/filters-DzgSJpMK.js.map +0 -1
- package/dist/form-field-BriWAXyg.js +0 -63
- package/dist/form-field-BriWAXyg.js.map +0 -1
- package/dist/forms-numeric-DIhghX1Q.js +0 -910
- package/dist/forms-numeric-DIhghX1Q.js.map +0 -1
- package/dist/header-DMMxG__r.js.map +0 -1
- package/dist/item-DjCcM18E.js.map +0 -1
- package/dist/layout.types-Cn7aUzJp.js +0 -20
- package/dist/layout.types-Cn7aUzJp.js.map +0 -1
- package/dist/mentions-0_4nWuI-.js.map +0 -1
- package/dist/message-g8p7eVtN.js +0 -128
- package/dist/message-g8p7eVtN.js.map +0 -1
- package/dist/navigation-C90-oQFq.js.map +0 -1
- package/dist/navigation-DaRjthVk.js.map +0 -1
- package/dist/number-CRU3kGuk.js.map +0 -1
- package/dist/overlays-BSgCtM2v.js.map +0 -1
- package/dist/popover-B85RenIl.js.map +0 -1
- package/dist/primitives-ByWgGUgt.js.map +0 -1
- package/dist/rich-text-Dth5E882.js +0 -78
- package/dist/rich-text-Dth5E882.js.map +0 -1
- package/dist/rich-text-editor-C1fOjBTd.js +0 -1195
- package/dist/rich-text-editor-C1fOjBTd.js.map +0 -1
- package/dist/rich-text-editor-toolbar-laT3tpBT.js.map +0 -1
- package/dist/safe-image-src-C6kQSMBZ.js +0 -17
- package/dist/safe-image-src-C6kQSMBZ.js.map +0 -1
- package/dist/sanitize-html-DsQmI48u.js.map +0 -1
- package/dist/settings-Bar5wiSo.js +0 -167
- package/dist/settings-Bar5wiSo.js.map +0 -1
- package/dist/sidebar-D-JYMMbY.js +0 -686
- package/dist/sidebar-D-JYMMbY.js.map +0 -1
- package/dist/sidebar-f9gRWXIR.js.map +0 -1
- package/dist/table-B4TE7iOV.js.map +0 -1
- package/dist/table-CFOWY9pQ.js.map +0 -1
- package/dist/tabs-e7ko9S2o.js.map +0 -1
- package/dist/upload-BOW6U2tI.js.map +0 -1
- package/dist/utils-B6kKb8jB.js.map +0 -1
- package/dist/value-typography-uAmWUAL1.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-artifact-CGGpQryR.js","names":["_Fragment","_Fragment","STATUS_VARIANT","_Fragment","NumberValue","_Fragment","_Fragment","_Fragment","cn","Button","Text","DisplayLabel","TextLink","focusRecipes","Stack","toneRecipes","Card","compositionRhythm","interactionRecipes","SecondaryValue","Duration","Number$1","IconBadge","Badge","AttachmentFileIcon","AttachmentTitle","AttachmentDescription","AttachmentActions","AttachmentMedia","AttachmentContent","AttachmentProgress","Attachment","Message","CodeBlock","Fragment$1","useCopyFeedback","copied","setCopied","useState","failed","setFailed","mounted","useRef","attempt","timer","useEffect","source","request","text","error","onCopyError","defaultAiMessageBubbleStrings","AiMessageBubble","stringsProp","strings","useStrings","copyText","plainText","children","renderedAvatar","avatar","role","User","Bot","avatarLabel","showActions","onCopy","onRegenerate","authorName","className","loading","copy","Copy","RotateCcw","defaultAiToolCallStrings","STATUS_BADGE","DurationValue","label","ms","AiToolCall","IconComponent","expandedProp","detailsId","useId","internalExpanded","setInternalExpanded","defaultExpanded","expanded","setExpanded","next","onExpandedChange","labelByStatus","statusBadge","status","hasDetails","args","result","finished","MonoValue","name","durationMs","jsx","ChevronDown","ChevronRight","DetailBlock","tone","AiShimmer","paused","style","duration","defaultAiCodeBlockStrings","AiCodeBlock","props","defaultAiAttachmentStrings","AiAttachment","Icon","showProgress","errored","progress","thumbnailUrl","AlertCircle","meta","onRemove","X","defaultAiAgentStrings","STATUS_VARIANT$1","AiAgent","icon","variant","live","StatusPill","subtitle","trailing","defaultAiConfirmationStrings","TONE","AiConfirmation","toneCfg","title","description","details","onReject","rejectLabel","onApprove","approveLabel","Check","defaultAiSourcesStrings","interpolate","template","v","params","k","m","AiSources","mergeStrings","labelId","listId","titleText","sources","AvatarStrip","maxAvatars","AvatarStack","SourceRow","idx","onSelect","visible","max","overflow","visual","s","SourceFavicon","i","visitLabel","src","Globe","titleId","interactive","rowClassName","rowContent","index","ExternalLink","defaultAiReasoningStrings","renderThoughtFor","durationParts","seconds","AiReasoning","bodyId","streaming","expandWhileStreaming","headerLabel","durationSeconds","Brain","defaultAiChainOfThoughtStrings","STATUS_VISUAL","Circle","Loader2","AiChainOfThought","hideHeader","steps","step","isLast","defaultAiTaskStrings","STATUS_ICON","XCircle","MinusCircle","STATUS_VARIANT","AiTask","columns","someItem","task","hasStatusBadge","item","TRAILING_COLUMNS","TaskRow","test","child","hasChildren","open","setOpen","density","depth","mutedTitle","indent","defaultAiArtifactStrings","AiArtifact","FileText","actions","ActionIcon","action","onDownload","Download","onOpen","collapsed"],"sources":["../src/components/blocks/ai/use-copy-feedback.ts","../src/components/blocks/ai/ai-message-bubble/types.ts","../src/components/blocks/ai/ai-message-bubble/ai-message-bubble.tsx","../src/components/blocks/ai/ai-tool-call/types.ts","../src/components/blocks/ai/ai-tool-call/ai-tool-call.tsx","../src/components/blocks/ai/ai-shimmer/ai-shimmer.tsx","../src/components/blocks/ai/ai-code-block/types.ts","../src/components/blocks/ai/ai-code-block/ai-code-block.tsx","../src/components/blocks/ai/ai-attachment/types.ts","../src/components/blocks/ai/ai-attachment/ai-attachment.tsx","../src/components/blocks/ai/ai-agent/types.ts","../src/components/blocks/ai/ai-agent/ai-agent.tsx","../src/components/blocks/ai/ai-confirmation/types.ts","../src/components/blocks/ai/ai-confirmation/ai-confirmation.tsx","../src/components/blocks/ai/ai-sources/types.ts","../src/components/blocks/ai/ai-sources/ai-sources.tsx","../src/components/blocks/ai/ai-reasoning/types.ts","../src/components/blocks/ai/ai-reasoning/ai-reasoning.tsx","../src/components/blocks/ai/ai-chain-of-thought/types.ts","../src/components/blocks/ai/ai-chain-of-thought/ai-chain-of-thought.tsx","../src/components/blocks/ai/ai-task/types.ts","../src/components/blocks/ai/ai-task/ai-task.tsx","../src/components/blocks/ai/ai-artifact/types.ts","../src/components/blocks/ai/ai-artifact/ai-artifact.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\n/** Shared clipboard lifecycle for AI surfaces; callbacks and text stay per mount. */\nexport function useCopyFeedback(onCopyError?: (error: unknown) => void, source?: string) {\n\tconst [copied, setCopied] = useState(false);\n\tconst [failed, setFailed] = useState(false);\n\tconst mounted = useRef(false);\n\tconst attempt = useRef(0);\n\tconst timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n\tuseEffect(() => {\n\t\tmounted.current = true;\n\t\tsetCopied(false);\n\t\tsetFailed(false);\n\t\treturn () => {\n\t\t\tmounted.current = false;\n\t\t\tattempt.current += 1;\n\t\t\tclearTimeout(timer.current);\n\t\t};\n\t}, [source]);\n\n\tconst copy = async (text: string) => {\n\t\tconst request = ++attempt.current;\n\t\tclearTimeout(timer.current);\n\t\tsetCopied(false);\n\t\tsetFailed(false);\n\t\ttry {\n\t\t\tif (typeof navigator === 'undefined' || !navigator.clipboard?.writeText) {\n\t\t\t\tthrow new Error('Clipboard unavailable');\n\t\t\t}\n\t\t\tawait navigator.clipboard.writeText(text);\n\t\t} catch (error) {\n\t\t\tif (mounted.current && request === attempt.current) {\n\t\t\t\tsetFailed(true);\n\t\t\t\tonCopyError?.(error);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tif (!mounted.current || request !== attempt.current) return false;\n\t\tsetCopied(true);\n\t\ttimer.current = setTimeout(() => setCopied(false), 1500);\n\t\treturn true;\n\t};\n\n\treturn { copied, failed, copy };\n}\n","import type { ReactNode } from 'react';\nimport type { StringsProp } from '../../../../lib/strings';\n\nexport type AiMessageRole = 'assistant' | 'user' | 'system';\n\nexport interface AiMessageBubbleStrings {\n\t/** Optional localized loading announcement. */\n\tloading?: string;\n\tcopyAria: string;\n /** Failure feedback, additive for existing string dictionaries. */\n copyError?: string;\n\tcopied: string;\n\tregenerateAria: string;\n}\n\nexport const defaultAiMessageBubbleStrings: AiMessageBubbleStrings = {\n copyError: 'Could not copy. Please try again.',\n\tcopyAria: 'Copy message',\n\tcopied: 'Copied',\n\tregenerateAria: 'Regenerate response',\n};\n\nexport interface AiMessageBubbleProps {\n\trole?: AiMessageRole;\n\t/** Leading avatar. */\n\tavatar?: ReactNode;\n\tavatarLabel?: string;\n\tauthorName?: ReactNode;\n\t/** Formatted time for the entry. */\n\ttimestamp?: ReactNode;\n\tchildren?: ReactNode;\n\t/** Plain-text version of the message content; used for the copy action. */\n\tplainText?: string;\n\tloading?: boolean;\n\t/** Fired when an entry is copied. */\n\tonCopy?: () => void;\n\tonRegenerate?: () => void;\n\t/** Merged onto the outermost node. */\n\t/** Called when the clipboard is unavailable or the write fails. */\n onCopyError?: (error: unknown) => void;\n className?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiMessageBubbleStrings>;\n}\n","import { Bot, Copy, RotateCcw, User } from 'lucide-react';\nimport { Button } from '../../../base/buttons';\nimport { IconBadge } from '../../../base/display';\nimport { Message } from '../../collaboration/message';\nimport { Text } from '../../../typography';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\nimport { useCopyFeedback } from '../use-copy-feedback';\nimport { defaultAiMessageBubbleStrings, type AiMessageBubbleProps } from './types';\n/** AI-specific copy/regenerate actions on the generic message presentation owner. */\nexport function AiMessageBubble({ role = 'assistant', avatar, avatarLabel, authorName, timestamp, children, plainText, loading = false, onCopy, onRegenerate, onCopyError, className, strings: stringsProp }: AiMessageBubbleProps) {\n const strings = useStrings(defaultAiMessageBubbleStrings, stringsProp);\n const copyText = plainText ?? (typeof children === 'string' ? children : '');\n const { copied, failed, copy } = useCopyFeedback(onCopyError, copyText);\n const Icon = role === 'user' ? User : Bot;\n // The default author mark is the shared compact avatar disc; a label names it as an image.\n const renderedAvatar = avatar ?? <IconBadge icon={Icon} tone=\"neutral\" size=\"sm\" aria-label={avatarLabel} />;\n const showActions = (onCopy !== undefined || plainText || onRegenerate) && role === 'assistant';\n return <Message align={role === 'user' ? 'end' : 'start'} tone={role === 'user' ? 'primary' : role === 'system' ? 'muted' : 'surface'} avatar={renderedAvatar} author={authorName} timestamp={timestamp} loading={loading} strings={{ loading: strings.loading }} className={cn('ai-message-bubble--component', className)} actions={showActions ? <>\n <Button type=\"button\" tone=\"secondary\" buttonStyle=\"ghost\" size=\"sm\" iconOnly aria-label={strings.copyAria} disabled={!copyText || loading} onClick={async () => { if (copyText && await copy(copyText)) onCopy?.(); }}><Copy aria-hidden=\"true\" className=\"size-icon-md\" /></Button>\n {copied && <Text size=\"xs\" type=\"success\">{strings.copied}</Text>}\n {onRegenerate && <Button type=\"button\" tone=\"secondary\" buttonStyle=\"ghost\" size=\"sm\" iconOnly aria-label={strings.regenerateAria} onClick={onRegenerate}><RotateCcw aria-hidden=\"true\" className=\"size-icon-md\" /></Button>}\n {failed && <Text role=\"alert\" size=\"xs\" type=\"error\">{strings.copyError ?? defaultAiMessageBubbleStrings.copyError}</Text>}\n </> : undefined}>{children}</Message>;\n}\nAiMessageBubble.displayName = 'AiMessageBubble';\n","import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport type { StringsProp } from '../../../../lib/strings';\n\nexport type AiToolCallStatus = 'pending' | 'running' | 'success' | 'error';\n\nexport interface AiToolCallStrings {\n\tpending: string;\n\trunning: string;\n\tsuccess: string;\n\terror: string;\n\t/** Supplied overrides describe how to open the details. */\n\texpand: string;\n\t/** Supplied overrides describe how to close the details. */\n\tcollapse: string;\n\targs: string;\n\tresult: string;\n\tdurationLabel: string;\n\t/** Label before the elapsed time of a call that is still queued or running. Additive. */\n\telapsedLabel?: string;\n}\n\nexport const defaultAiToolCallStrings: AiToolCallStrings = {\n\tpending: 'Queued',\n\trunning: 'Running',\n\tsuccess: 'Success',\n\terror: 'Failed',\n\texpand: 'Show details',\n\tcollapse: 'Hide details',\n\targs: 'Arguments',\n\tresult: 'Result',\n\tdurationLabel: 'Took',\n\telapsedLabel: 'Elapsed',\n};\n\nexport interface AiToolCallProps {\n\t/** Display name. */\n\tname: string;\n\tstatus: AiToolCallStatus;\n\t/** Leading glyph. */\n\ticon?: LucideIcon;\n\targs?: ReactNode;\n\tresult?: ReactNode;\n\terror?: ReactNode;\n\t/** Duration in ms; rendered as \"Took 1.2s\", or \"Elapsed 1.2s\" while the call is queued or running. */\n\tdurationMs?: number;\n\t/** Expanded state, for controlled use. */\n\texpanded?: boolean;\n\t/** Initial expanded state, for uncontrolled use. */\n\tdefaultExpanded?: boolean;\n\t/** Fired whenever the disclosure state changes. */\n\tonExpandedChange?: (expanded: boolean) => void;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiToolCallStrings>;\n}\n","/**\n * AiToolCall — collapsible trace for a model-invoked tool / function. Header\n * shows the tool name, status pill, and an expand/collapse toggle. Expanded\n * content reveals JSON-style `args` and `result` blocks (or an error block\n * when status is `error`) plus an optional duration. Use to surface tool-use\n * transparency in chat / agent UIs. Strings overridable for i18n.\n */\nimport {\n\tuseId,\n\tuseState,\n\ttype ReactNode } from 'react';\nimport { ChevronDown, ChevronRight } from 'lucide-react';\nimport { Badge } from '../../../base/badge';\nimport { Button } from '../../../base/buttons';\nimport { Card } from '../../../base/cards';\nimport { IconBadge,\n} from '../../../base/display';\nimport { Stack } from '../../../base/structure';\nimport { Duration, MonoValue, SecondaryValue } from '../../../primitives';\nimport { DisplayLabel } from '../../../typography';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport {\n\tdefaultAiToolCallStrings,\n\ttype AiToolCallProps,\n\ttype AiToolCallStatus,\n} from './types';\nimport { interactionRecipes } from '../../../../lib/interaction-recipes';\nimport { toneRecipes } from '../../../../lib/tone-recipes';\n\n// The badge text states the status; only a running call adds the shared live dot.\n// Primary is reserved for the main command, so a running call reads as info.\nconst STATUS_BADGE: Record<\n\tAiToolCallStatus,\n\t{ tone: 'secondary' | 'info' | 'success' | 'destructive'; live?: boolean }\n> = {\n\tpending: { tone: 'secondary' },\n\trunning: { tone: 'info', live: true },\n\tsuccess: { tone: 'success' },\n\terror: { tone: 'destructive' },\n};\n\nfunction DurationValue({ label, ms }: { label: string; ms: number }) {\n\treturn (\n\t\t<span className=\"inline-flex shrink-0 items-baseline gap-space-xs\">\n\t\t\t<SecondaryValue size=\"xs\">\n\t\t\t\t{label}\n\t\t\t</SecondaryValue>\n\t\t\t<Duration\n\t\t\t\tvalue={ms}\n\t\t\t\tfrom=\"milliseconds\"\n\t\t\t\tmaxParts={1}\n\t\t\t\tsize=\"xs\"\n\t\t\t\talign=\"left\"\n\t\t\t\ttype=\"secondary\"\n\t\t\t\tmaximumFractionDigits={ms < 10_000 ? 1 : 0}\n\t\t\t/>\n\t\t</span>\n\t);\n}\n\nexport function AiToolCall({\n\tname,\n\tstatus,\n\ticon: IconComponent,\n\targs,\n\tresult,\n\terror,\n\tdurationMs,\n\texpanded: expandedProp,\n\tdefaultExpanded = false,\n\tonExpandedChange,\n\tclassName,\n\tstrings: stringsProp,\n}: AiToolCallProps) {\n\tconst strings = useStrings(defaultAiToolCallStrings, stringsProp);\n\tconst detailsId = useId();\n\tconst [internalExpanded, setInternalExpanded] = useState(defaultExpanded);\n\tconst expanded = expandedProp ?? internalExpanded;\n\tconst setExpanded = (next: boolean) => {\n\t\tif (expandedProp === undefined) setInternalExpanded(next);\n\t\tonExpandedChange?.(next);\n\t};\n\tconst labelByStatus: Record<AiToolCallStatus, string> = {\n\t\tpending: strings.pending,\n\t\trunning: strings.running,\n\t\tsuccess: strings.success,\n\t\terror: strings.error,\n\t};\n\tconst statusBadge = STATUS_BADGE[status];\n\n\tconst hasDetails = Boolean(args || result || error);\n\t// A finished call states how long it took; one still queued or running\n\t// states the time elapsed so far.\n\tconst finished = status === 'success' || status === 'error';\n\n\treturn (\n\t\t// The public Card owns the frame and its `@container/card` query root; the\n\t\t// trigger and details own their insets. An error swaps the frame to the\n\t\t// destructive edge and wash.\n\t\t<Card\n\t\t\tsurface=\"card\"\n\t\t\tpadding=\"none\"\n\t\t\tclassName={cn('ai-tool-call--component',\n\t\t\t\tstatus === 'error' && cn(toneRecipes.destructive.edge, toneRecipes.destructive.wash),\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Button\n\t\t\t\ttype=\"button\"\n\t\t\t\ttone=\"secondary\"\n\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\tsize=\"md\"\n\t\t\t\tonClick={() => hasDetails && setExpanded(!expanded)}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'ai-tool-call--trigger h-auto min-h-0 w-full flex-wrap justify-start gap-space-md whitespace-normal rounded-none px-space-lg py-space-md text-left @md/card:flex-nowrap',\n\t\t\t\t\thasDetails ? `cursor-pointer ${interactionRecipes.rowHover}` : 'cursor-default',\n\t\t\t\t)}\n\t\t\t\taria-expanded={hasDetails ? expanded : undefined}\n\t\t\t\taria-controls={hasDetails ? detailsId : undefined}\n\t\t\t\taria-description={hasDetails ? (expanded ? stringsProp?.collapse : stringsProp?.expand) : undefined}\n\t\t\t>\n\t\t\t\t{/* No default glyph: the monospace tool name identifies the call. */}\n\t\t\t\t{!!IconComponent && <IconBadge icon={IconComponent} tone=\"neutral\" size=\"md\" shape=\"square\" />}\n\t\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t\t<MonoValue type=\"inherit\" className=\"truncate\">\n\t\t\t\t\t\t{name}\n\t\t\t\t\t</MonoValue>\n\t\t\t\t</div>\n\t\t\t\t<span className=\"ai-tool-call--meta order-last flex w-full flex-wrap items-center gap-space-sm @md/card:order-none @md/card:w-auto @md/card:flex-nowrap\">\n\t\t\t\t\t<Badge tone={statusBadge.tone} dot={statusBadge.live} pulse={statusBadge.live}>\n\t\t\t\t\t\t{labelByStatus[status]}\n\t\t\t\t\t</Badge>\n\t\t\t\t\t{!!durationMs && (\n\t\t\t\t\t\t<DurationValue\n\t\t\t\t\t\t\tlabel={finished ? strings.durationLabel : (strings.elapsedLabel ?? defaultAiToolCallStrings.elapsedLabel ?? strings.durationLabel)}\n\t\t\t\t\t\t\tms={durationMs}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</span>\n\t\t\t\t{/* A call without details keeps the disclosure column, so its status and\n\t\t\t\t duration end on the same edge as a stack of expandable siblings. */}\n\t\t\t\t{hasDetails ? (\n\t\t\t\t\texpanded ? (\n\t\t\t\t\t\t<ChevronDown className=\"size-icon-md shrink-0 text-muted-foreground\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ChevronRight className=\"size-icon-md shrink-0 text-muted-foreground\" />\n\t\t\t\t\t)\n\t\t\t\t) : (\n\t\t\t\t\t<span aria-hidden=\"true\" className=\"ai-tool-call--affordance hidden size-icon-md shrink-0 @md/card:block\" />\n\t\t\t\t)}\n\t\t\t</Button>\n\n\t\t\t{hasDetails && (\n\t\t\t\t<Stack id={detailsId} hidden={!expanded} gap=\"md\" className={cn(\n\t\t\t\t\t'ai-tool-call--details border-t border-border/60 bg-muted/30 px-space-lg py-space-md',\n\t\t\t\t\t!expanded && 'hidden',\n\t\t\t\t)}>\n\t\t\t\t\t{expanded && <>\n\t\t\t\t\t\t{!!args && <DetailBlock label={strings.args}>{args}</DetailBlock>}\n\t\t\t\t\t\t{status === 'error' && !!error ? (\n\t\t\t\t\t\t\t<DetailBlock label={strings.error} tone=\"destructive\">{error}</DetailBlock>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t!!result && <DetailBlock label={strings.result}>{result}</DetailBlock>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</>}\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t</Card>\n\t);\n}\n\nAiToolCall.displayName = 'AiToolCall';\n\nfunction DetailBlock({\n\tlabel,\n\tchildren,\n\ttone = 'neutral',\n}: {\n\t/** Display label. */\n\tlabel: string;\n\tchildren: ReactNode;\n\ttone?: 'neutral' | 'destructive';\n}) {\n\treturn (\n\t\t<Stack gap=\"sm\" className=\"ai-tool-call--detail-block\">\n\t\t\t<DisplayLabel>\n\t\t\t\t{label}\n\t\t\t</DisplayLabel>\n\t\t\t<pre\n\t\t\t\ttabIndex={0}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'box-border m-0 max-w-full overflow-x-auto rounded-radius bg-card text-card-foreground px-space-md py-space-md font-mono text-xs leading-relaxed',\n\t\t\t\t\ttone === 'destructive' && cn(toneRecipes.destructive.ink, toneRecipes.destructive.wash),\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</pre>\n\t\t</Stack>\n\t);\n}\n","/**\n * AiShimmer — gradient text shimmer for streaming / loading copy. Renders\n * children with a moving highlight band that draws the eye while a model is\n * thinking. Use anywhere a static \"Loading…\" feels too inert: agent typing,\n * tool warm-up, awaiting first token.\n */\nimport type { CSSProperties } from 'react';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport type { AiShimmerProps } from './types';\n\nexport function AiShimmer({\n\tchildren = 'Thinking…',\n\tpaused = false,\n\tduration = 2.4,\n\tsize,\n\tclassName,\n}: AiShimmerProps) {\n\tif (paused) {\n\t\treturn (\n\t\t\t<Text tag=\"span\" type=\"secondary\" size={size} weight=\"medium\" className={cn('ai-shimmer--component', className)}>\n\t\t\t\t{children}\n\t\t\t</Text>\n\t\t);\n\t}\n\n\t// `CSSProperties` has no index signature for custom properties, which is the\n\t// only reason this needed a cast. Widening the annotation states the intent\n\t// — one known custom property — instead of switching the key off.\n\tconst style: CSSProperties & Record<'--ai-shimmer-duration', string> = {\n\t\t'--ai-shimmer-duration': `${duration}s`,\n\t};\n\n\treturn (\n\t\t<Text\n\t\t\ttag=\"span\"\n\t\t\tsize={size}\n\t\t\tweight=\"medium\"\n\t\t\tdata-ai-shimmer\n\t\t\trole=\"status\"\n\t\t\taria-live=\"polite\"\n\t\t\tclassName={cn(\n\t\t\t\t'ai-shimmer--component inline-block bg-clip-text text-transparent',\n\t\t\t\t// foreground -> muted -> foreground gradient swept across\n\t\t\t\t'bg-[linear-gradient(110deg,var(--ai-shimmer-base,var(--muted-foreground))_30%,var(--ai-shimmer-highlight,var(--foreground))_50%,var(--ai-shimmer-base,var(--muted-foreground))_70%)]',\n\t\t\t\t'bg-[length:200%_100%]',\n\t\t\t\t'animate-[ai-shimmer-sweep_var(--ai-shimmer-duration,2.4s)_linear_infinite] motion-reduce:animate-none',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={style}\n\t\t>\n\t\t\t{children}\n\t\t</Text>\n\t);\n}\n\nAiShimmer.displayName = 'AiShimmer';\n","import type { ReactNode } from 'react';\nimport type { StringsProp } from '../../../../lib/strings';\n\nexport interface AiCodeBlockStrings {\n\tcopy: string;\n\tcopied: string;\n\tcopyAria: string;\n /** Failure feedback, additive for existing string dictionaries. */\n copyError?: string;\n\t/** Header label when no language is provided. */\n\tdefaultLanguageLabel: string;\n}\n\nexport const defaultAiCodeBlockStrings: AiCodeBlockStrings = {\n\tcopy: 'Copy',\n\tcopied: 'Copied',\n copyError: 'Could not copy. Please try again.',\n\tcopyAria: 'Copy code',\n\tdefaultLanguageLabel: 'Code',\n};\n\nexport interface AiCodeBlockProps {\n\t/** The code to render. Pre-formatted text. */\n\tcode: string;\n\t/** Display label for the language (e.g. \"TypeScript\", \"shell\"). */\n\tlanguage?: string;\n\t/** Optional filename rendered in the header next to the language label. */\n\tfilename?: string;\n\t/** Render with line numbers. */\n\tshowLineNumbers?: boolean;\n\t/** Highlight specific 1-indexed line numbers. */\n\thighlightLines?: ReadonlyArray<number>;\n\t/** Hide the header strip entirely. */\n\thideHeader?: boolean;\n\t/** Force max-height before scroll. */\n\tmaxHeight?: number | string;\n\t/** Trailing slot inside the header (e.g. extra action button). */\n\theaderActions?: ReactNode;\n\t/** Fired when the user copies (after the navigator.clipboard write). */\n\tonCopy?: () => void;\n\t/** Merged onto the outermost node. */\n\t/** Called when the clipboard is unavailable or the write fails. */\n onCopyError?: (error: unknown) => void;\n className?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiCodeBlockStrings>;\n}\n","import { CodeBlock } from '../../../base/code-block';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\nimport { defaultAiCodeBlockStrings, type AiCodeBlockProps } from './types';\n/** Compatibility adapter; the generic code display owns layout and copying. */\nexport function AiCodeBlock({ strings: stringsProp, className, onCopy, ...props }: AiCodeBlockProps) {\n const strings = useStrings(defaultAiCodeBlockStrings, stringsProp);\n return <CodeBlock {...props} className={cn('ai-code-block--component', className)} onCopy={onCopy ? () => onCopy() : undefined} strings={{ copyAria: strings.copyAria, copied: strings.copied, copyError: strings.copyError, defaultLanguageLabel: strings.defaultLanguageLabel }} />;\n}\nAiCodeBlock.displayName = 'AiCodeBlock';\n","import type { LucideIcon } from 'lucide-react';\nimport type { StringsProp } from '../../../../lib/strings';\n\nexport type AiAttachmentKind = 'image' | 'document' | 'audio' | 'video' | 'code' | 'archive' | 'generic';\n\nexport interface AiAttachmentStrings {\n\tremoveAria: string;\n\topenAria: string;\n\tuploadProgressAria: string;\n\t/** Text feedback when the attachment cannot be used. */\n\terror?: string;\n}\n\nexport const defaultAiAttachmentStrings: AiAttachmentStrings = {\n\tremoveAria: 'Remove attachment',\n\topenAria: 'Open attachment',\n\tuploadProgressAria: 'Upload progress',\n\terror: 'Failed',\n};\n\nexport interface AiAttachmentProps {\n\t/** Filename / display label. */\n\tname: string;\n\t/** Optional secondary label — formatted size, file extension, etc. */\n\tmeta?: string;\n\t/** Pre-categorized kind. Defaults to \"generic\" — drives the fallback icon. */\n\tkind?: AiAttachmentKind;\n\t/** Override the auto-picked kind icon. */\n\ticon?: LucideIcon;\n\t/** When set, renders the chip as a thumbnail tile with this image. */\n\tthumbnailUrl?: string;\n\t/** Show a small loading bar (in-flight upload). */\n\tprogress?: number; // 0..1\n\t/** Show as errored — overrides progress. */\n\terrored?: boolean;\n\t/** Open / download callback (clicking the chip body). */\n\tonOpen?: () => void;\n\t/** Render a remove (×) action. */\n\tonRemove?: () => void;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiAttachmentStrings>;\n}\n","/** Compatibility presentation for staged AI files; Attachment owns the file anatomy. */\nimport { AlertCircle, X } from 'lucide-react';\nimport { Attachment, AttachmentMedia, AttachmentContent, AttachmentTitle, AttachmentDescription, AttachmentActions, AttachmentProgress, AttachmentFileIcon } from '../../../base/attachment';\nimport { Button } from '../../../base/buttons';\nimport { Text } from '../../../typography';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\nimport { defaultAiAttachmentStrings, type AiAttachmentProps } from './types';\n\nexport function AiAttachment({ name, meta, kind = 'generic', icon: Icon, thumbnailUrl, progress, errored = false, onOpen, onRemove, className, strings: stringsProp }: AiAttachmentProps) {\n const strings = useStrings(defaultAiAttachmentStrings, stringsProp);\n const showProgress = !errored && typeof progress === 'number' && progress >= 0 && progress < 1;\n return <Attachment name={name} layout=\"compact\" status={errored ? 'error' : showProgress ? 'uploading' : undefined} onOpen={onOpen} strings={{ preview: () => strings.openAria }} className={cn('ai-attachment--component inline-flex w-auto', className)}>\n <AttachmentMedia variant={thumbnailUrl ? 'image' : 'icon'}>\n {thumbnailUrl ? <img src={thumbnailUrl} alt=\"\" /> : errored ? <AlertCircle aria-hidden=\"true\" /> : Icon ? <Icon aria-hidden=\"true\" /> : <AttachmentFileIcon name={name} kind={kind} />}\n </AttachmentMedia>\n <AttachmentContent>\n <AttachmentTitle title={name}>{name}</AttachmentTitle>\n {meta && <AttachmentDescription clamp={1}>{meta}</AttachmentDescription>}\n {errored && <AttachmentDescription clamp=\"none\"><Text tag=\"span\" size=\"xs\" type=\"error\" role=\"alert\">{strings.error ?? defaultAiAttachmentStrings.error}</Text></AttachmentDescription>}\n {showProgress && <AttachmentProgress value={Math.round((progress ?? 0) * 100)} size=\"sm\" aria-label={strings.uploadProgressAria} />}\n </AttachmentContent>\n {onRemove && <AttachmentActions><Button type=\"button\" tone=\"secondary\" buttonStyle=\"ghost\" size=\"sm\" iconOnly aria-label={strings.removeAria} onClick={onRemove}><X aria-hidden=\"true\" className=\"size-icon-sm\" /></Button></AttachmentActions>}\n </Attachment>;\n}\nAiAttachment.displayName = 'AiAttachment';\n","import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport type { StringsProp } from '../../../../lib/strings';\n\nexport type AiAgentStatus = 'idle' | 'thinking' | 'working' | 'done' | 'error' | 'offline';\n\nexport interface AiAgentStrings {\n\tstatusLabels: Record<AiAgentStatus, string>;\n}\n\nexport const defaultAiAgentStrings: AiAgentStrings = {\n\tstatusLabels: {\n\t\tidle: 'Idle',\n\t\tthinking: 'Thinking',\n\t\tworking: 'Working',\n\t\tdone: 'Done',\n\t\terror: 'Error',\n\t\toffline: 'Offline',\n\t},\n};\n\nexport interface AiAgentProps {\n\t/** Display name (e.g. \"Atlas\", \"Claude\"). */\n\tname: string;\n\t/** Avatar / mark — typically an icon or short emoji. */\n\ticon?: LucideIcon;\n\t/** Override avatar with arbitrary content (image, gradient mark, etc.). */\n\tavatar?: ReactNode;\n\t/** Short blurb / model identifier rendered under the name. */\n\tsubtitle?: ReactNode;\n\t/** Tone color for the avatar wash. */\n\ttone?: 'primary' | 'success' | 'warning' | 'destructive' | 'info' | 'neutral';\n\t/** Live status displayed as a pill next to the name. */\n\tstatus?: AiAgentStatus;\n\t/** Density variant — `inline` is a single-line chip, `card` is a tile. */\n\tvariant?: 'inline' | 'card';\n\t/** Trailing slot — typically actions, badges. */\n\ttrailing?: ReactNode;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiAgentStrings>;\n}\n","/**\n * AiAgent — identity card for an AI persona / model. Renders avatar (icon\n * or custom), name, optional subtitle (model id, role), and a live status\n * pill. `variant='inline'` is a one-line chip (header strips, breadcrumbs);\n * `variant='card'` is a small tile (model picker, agent dock).\n */\nimport { Bot, type LucideIcon } from 'lucide-react';\nimport { Badge } from '../../../base/badge';\nimport { Card } from '../../../base/cards';\nimport { IconBadge } from '../../../base/display';\nimport { Text } from '../../../typography';\nimport { useStrings } from '../../../../lib/strings';\nimport { Stack } from '../../../base/structure';\nimport { cn } from '../../../../lib/utils';\n\nimport {\n\tdefaultAiAgentStrings,\n\ttype AiAgentProps,\n\ttype AiAgentStatus,\n} from './types';\n\n// Live states use the info status tone; primary is reserved for the main command.\nconst STATUS_VARIANT: Record<\n\tAiAgentStatus,\n\t'secondary' | 'info' | 'success' | 'warning' | 'destructive'\n> = {\n\tidle: 'secondary',\n\tthinking: 'info',\n\tworking: 'info',\n\tdone: 'success',\n\terror: 'destructive',\n\toffline: 'secondary',\n};\n\nexport function AiAgent({\n\tname,\n\ticon,\n\tavatar,\n\tsubtitle,\n\ttone = 'primary',\n\tstatus,\n\tvariant = 'inline',\n\ttrailing,\n\tclassName,\n\tstrings: stringsProp,\n}: AiAgentProps) {\n\tconst strings = useStrings(defaultAiAgentStrings, stringsProp);\n\tconst Icon: LucideIcon = icon ?? Bot;\n\n\t// The tile takes the default avatar disc; the one-line chip takes the compact one.\n\tconst renderedAvatar =\n\t\tavatar ?? <IconBadge icon={Icon} tone={tone} size={variant === 'card' ? 'md' : 'sm'} />;\n\n\t// Live states pulse the Badge's own status dot.\n\tconst live = status === 'thinking' || status === 'working';\n\tconst StatusPill = !!status && (\n\t\t<Badge tone={STATUS_VARIANT[status]} dot pulse={live}>\n\t\t\t{strings.statusLabels[status]}\n\t\t</Badge>\n\t);\n\n\tif (variant === 'card') {\n\t\t// The public Card owns the tile's frame and compact inset.\n\t\treturn (\n\t\t\t<Card surface=\"card\" padding=\"sm\" className={cn('ai-agent--component', className)}>\n\t\t\t<Stack direction=\"horizontal\" align=\"center\" gap=\"lg\">\n\t\t\t\t{renderedAvatar}\n\t\t\t\t\t<Stack gap=\"dense\" className=\"min-w-0 flex-1\">\n\t\t\t\t\t<div className=\"flex items-center gap-space-md\">\n\t\t\t\t\t\t<Text type=\"inherit\" weight=\"semibold\" className=\"truncate\">\n\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t{StatusPill}\n\t\t\t\t\t</div>\n\t\t\t\t\t{!!subtitle && (\n\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"line-clamp-1\">\n\t\t\t\t\t\t\t{subtitle}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t{!!trailing && <div className=\"ml-auto flex items-center gap-space-xs\">{trailing}</div>}\n\t\t\t</Stack>\n\t\t\t</Card>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={cn('ai-agent--component', 'inline-flex items-center gap-space-md', className)}>\n\t\t\t{renderedAvatar}\n\t\t\t<Stack direction=\"horizontal\" align=\"center\" gap=\"md\" className=\"min-w-0\">\n\t\t\t\t<Text type=\"inherit\" weight=\"medium\" className=\"truncate\">\n\t\t\t\t\t{name}\n\t\t\t\t</Text>\n\t\t\t\t{!!subtitle && (\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"truncate\">\n\t\t\t\t\t\t{subtitle}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t\t{StatusPill}\n\t\t\t</Stack>\n\t\t\t{!!trailing && <div className=\"ml-1 flex items-center gap-space-xs\">{trailing}</div>}\n\t\t</div>\n\t);\n}\n\nAiAgent.displayName = 'AiAgent';\n","import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport type { StringsProp } from '../../../../lib/strings';\nimport type { SemanticTone } from '../../../../lib/component-vocabulary';\n\nexport type AiConfirmationTone = Extract<\n\tSemanticTone,\n\t'neutral' | 'destructive' | 'warning' | 'info' | 'primary'\n>;\n\nexport interface AiConfirmationStrings {\n\tapprove: string;\n\treject: string;\n\tpending: string;\n\tapproved: string;\n\trejected: string;\n}\n\nexport const defaultAiConfirmationStrings: AiConfirmationStrings = {\n\tapprove: 'Approve',\n\treject: 'Reject',\n\tpending: 'Awaiting your approval',\n\tapproved: 'Approved',\n\trejected: 'Rejected',\n};\n\nexport type AiConfirmationStatus = 'pending' | 'approved' | 'rejected';\n\nexport interface AiConfirmationProps {\n\t/** Title — short, action-oriented (e.g. \"Run npm install\"). */\n\ttitle: ReactNode;\n\t/** Body description / details. */\n\tdescription?: ReactNode;\n\t/** Decorative icon. */\n\ticon?: LucideIcon;\n\t/** Semantic color intent. */\n\ttone?: AiConfirmationTone;\n\t/** Current status — when set, the action row is replaced with a result pill. */\n\tstatus?: AiConfirmationStatus;\n\t/** Approve callback. */\n\tonApprove?: () => void;\n\t/** Reject callback. */\n\tonReject?: () => void;\n\t/** Override the approve button label. */\n\tapproveLabel?: ReactNode;\n\t/** Override the reject button label. */\n\trejectLabel?: ReactNode;\n\t/** Render a \"details\" expandable area. */\n\tdetails?: ReactNode;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiConfirmationStrings>;\n}\n","import {compositionRhythm} from '../../../base/structure/composition.recipes';\n/**\n * AiConfirmation — inline approval prompt rendered in-stream when an agent\n * needs user permission before taking a side-effecting action (run command,\n * call write API, charge a card). Carries title, description, icon, optional\n * details, and an approve/reject pair. After resolution, the action row\n * collapses into a status pill.\n */\nimport { Check, X } from 'lucide-react';\nimport { Button } from '../../../base/buttons';\nimport { Card } from '../../../base/cards';\nimport { IconBadge,\n} from '../../../base/display';\nimport { Text } from '../../../typography';\nimport { useStrings } from '../../../../lib/strings';\nimport { Stack } from '../../../base/structure';\nimport { cn } from '../../../../lib/utils';\n\nimport {\n\tdefaultAiConfirmationStrings,\n\ttype AiConfirmationProps,\n\ttype AiConfirmationTone,\n} from './types';\nimport { toneRecipes } from '../../../../lib/tone-recipes';\n\n// Neutral keeps the Card's own frame; a risk tone swaps it for that tone's edge and wash.\nconst TONE: Record<\n\tAiConfirmationTone,\n\t{ ring?: string; icon: 'neutral' | 'primary' | 'success' | 'warning' | 'destructive' | 'info' }\n> = {\n\tneutral: { icon: 'neutral' },\n\tdestructive: { ring: `${toneRecipes.destructive.edge} ${toneRecipes.destructive.wash}`, icon: 'destructive' },\n\twarning: { ring: `${toneRecipes.warning.edge} ${toneRecipes.warning.wash}`, icon: 'warning' },\n\tinfo: { ring: `${toneRecipes.info.edge} ${toneRecipes.info.wash}`, icon: 'info' },\n\tprimary: { ring: `${toneRecipes.primary.edge} ${toneRecipes.primary.wash}`, icon: 'primary' },\n};\n\nexport function AiConfirmation({\n\ttitle,\n\tdescription,\n\ticon,\n\ttone = 'neutral',\n\tstatus = 'pending',\n\tonApprove,\n\tonReject,\n\tapproveLabel,\n\trejectLabel,\n\tdetails,\n\tclassName,\n\tstrings: stringsProp,\n}: AiConfirmationProps) {\n\tconst strings = useStrings(defaultAiConfirmationStrings, stringsProp);\n\t// No default glyph: the title states the action and the tone states the risk.\n\tconst Icon = icon;\n\tconst toneCfg = TONE[tone];\n\n\t// The public Card owns the frame, its compact inset and the `@container/card`\n\t// query root. Header, details and the action row are spaced by the Stack gaps.\n\treturn (\n\t\t<Card\n\t\t\trole=\"region\"\n\t\t\taria-live=\"polite\"\n\t\t\tsurface=\"card\"\n\t\t\tpadding=\"sm\"\n\t\t\tclassName={cn('ai-confirmation--component', toneCfg.ring, className)}\n\t\t>\n\t\t\t<Stack gap=\"lg\">\n\t\t\t<div className=\"ai-confirmation--header flex items-start gap-space-lg\">\n\t\t\t\t{!!Icon && <IconBadge icon={Icon} tone={toneCfg.icon} size=\"md\" shape=\"square\" />}\n\t\t\t\t<Stack gap=\"md\" className=\"min-w-0 flex-1\">\n\t\t\t\t\t<Stack gap=\"normal\">\n\t\t\t\t\t<Text type=\"inherit\" weight=\"semibold\">{title}</Text>\n\t\t\t\t\t{!!description && (\n\t\t\t\t\t\t<Text type=\"secondary\">\n\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t\t{!!details && <div className=\"ai-confirmation--details min-w-0\">{details}</div>}\n\t\t\t\t</Stack>\n\t\t\t</div>\n\n\t\t\t{status === 'pending' ? (\n\t\t\t\t<div className=\"ai-confirmation--footer flex flex-col items-stretch gap-space-md @sm/card:flex-row @sm/card:items-center @sm/card:justify-between\">\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t{strings.pending}\n\t\t\t\t\t</Text>\n\t\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" justify=\"end\" gap={compositionRhythm.commands} className=\"ai-confirmation--actions\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\tonClick={onReject}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{rejectLabel ?? strings.reject}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\ttone={tone === 'destructive' ? 'destructive' : 'primary'}\n\t\t\t\t\t\t\tonClick={onApprove}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{approveLabel ?? strings.approve}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</Stack>\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div className=\"ai-confirmation--footer flex items-center gap-space-md\">\n\t\t\t\t\t{status === 'approved' ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Check aria-hidden=\"true\" className=\"size-icon-md text-success\" />\n\t\t\t\t\t\t\t<Text size=\"xs\" type=\"success\" weight=\"medium\">\n\t\t\t\t\t\t\t\t{strings.approved}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<X aria-hidden=\"true\" className=\"size-icon-md text-muted-foreground\" />\n\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" weight=\"medium\">\n\t\t\t\t\t\t\t\t{strings.rejected}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t</Stack>\n\t\t</Card>\n\t);\n}\n\nAiConfirmation.displayName = 'AiConfirmation';\n","import type { ReactNode } from 'react';\nimport type { StringsProp } from '../../../../lib/strings';\n\nexport interface AiSourceItem {\n\t/** Stable identity for this entry. */\n\tid: string;\n\t/** Surface title. */\n\ttitle: ReactNode;\n\turl?: string;\n\t/** Hostname / publisher / \"doc-section\" — rendered under the title. */\n\tpublisher?: string;\n\t/** Favicon / logo URL — rendered as a small avatar; falls back to a globe. */\n\tfaviconUrl?: string;\n\t/** Optional short snippet shown only in the expanded variant. */\n\tsnippet?: ReactNode;\n}\n\nexport interface AiSourcesStrings {\n\t/** Header title — `{{count}}` placeholder for the source count. */\n\ttitle: string;\n\t/** Supplied overrides describe how to open the source list. */\n\texpand: string;\n\t/** Supplied overrides describe how to close the source list. */\n\tcollapse: string;\n\tvisit: string;\n}\n\nexport const defaultAiSourcesStrings: AiSourcesStrings = {\n\ttitle: '{{count}} sources',\n\texpand: 'Show all sources',\n\tcollapse: 'Hide sources',\n\tvisit: 'Visit source',\n};\n\nexport type AiSourcesVariant = 'list' | 'avatars';\n\nexport interface AiSourcesProps {\n\t/** Source list. Order is significant — index drives the displayed number. */\n\tsources: ReadonlyArray<AiSourceItem>;\n\t/** `list` is a vertical row layout; `avatars` is a stacked-favicons strip. */\n\tvariant?: AiSourcesVariant;\n\t/** Number of sources rendered in the avatar strip before the \"+N\" overflow. */\n\tmaxAvatars?: number;\n\t/** Expanded state, for controlled use in the list variant. */\n\texpanded?: boolean;\n\t/** Render the list expanded by default (only applies to `list` variant). */\n\tdefaultExpanded?: boolean;\n\t/** Fired whenever the disclosure state changes. */\n\tonExpandedChange?: (expanded: boolean) => void;\n\t/** Click handler — preferred over `url` for SPA routing. */\n\tonSelect?: (source: AiSourceItem, index: number) => void;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiSourcesStrings>;\n}\n","/**\n * AiSources — light-weight source list rendered under streamed content. Two\n * shapes: `list` is a vertical stack of source rows (favicon + title + host);\n * `avatars` is a compact stacked-favicon strip used when space is tight (chat\n * footer, side panel header). For richer \"expandable\" footnote-style sources\n * with relevance bars and snippets, see `<AiCitation>`.\n */\nimport { useEffect, useId, useState } from 'react';\nimport { ChevronDown, ChevronRight, ExternalLink, Globe } from 'lucide-react';\nimport { Button } from '../../../base/buttons';\nimport { Card } from '../../../base/cards';\nimport { Stack } from '../../../base/structure';\nimport { Number as NumberValue, SecondaryValue } from '../../../primitives';\nimport { Text, TextLink } from '../../../typography';\nimport { mergeStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { defaultAiSourcesStrings, type AiSourceItem, type AiSourcesProps } from './types';\nimport { focusRecipes } from '../../../../lib/focus-recipes';\nimport { interactionRecipes } from '../../../../lib/interaction-recipes';\nimport { IconBadge } from '../../../base/display';\n\nfunction interpolate(template: string, params: Record<string, string | number>): string {\n\treturn template.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (m, k) => {\n\t\tconst v = params[k];\n\t\treturn v === undefined ? m : String(v);\n\t});\n}\n\nexport function AiSources({\n\tsources,\n\tvariant = 'list',\n\tmaxAvatars = 5,\n\texpanded: expandedProp,\n\tdefaultExpanded = false,\n\tonExpandedChange,\n\tonSelect,\n\tclassName,\n\tstrings: stringsProp,\n}: AiSourcesProps) {\n\tconst strings = mergeStrings(defaultAiSourcesStrings, stringsProp);\n\tconst labelId = useId();\n\tconst listId = useId();\n\tconst [internalExpanded, setInternalExpanded] = useState(defaultExpanded);\n\tconst expanded = expandedProp ?? internalExpanded;\n\tconst setExpanded = (next: boolean) => {\n\t\tif (expandedProp === undefined) setInternalExpanded(next);\n\t\tonExpandedChange?.(next);\n\t};\n\tconst titleText = interpolate(strings.title, { count: sources.length });\n\n\tif (variant === 'avatars') {\n\t\treturn (\n\t\t\t<AvatarStrip\n\t\t\t\tsources={sources}\n\t\t\t\tmax={maxAvatars}\n\t\t\t\ttitle={titleText}\n\t\t\t\tvisitLabel={strings.visit}\n\t\t\t\tonSelect={onSelect}\n\t\t\t\tclassName={cn('ai-sources--component', className)}\n\t\t\t/>\n\t\t);\n\t}\n\n\t// The public Card owns the frame; the trigger and list own their compact insets.\n\treturn (\n\t\t<Card surface=\"card\" padding=\"none\" className={cn('ai-sources--component', className)}>\n\t\t\t<Button\n\t\t\t\ttype=\"button\"\n\t\t\t\ttone=\"secondary\"\n\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\tsize=\"md\"\n\t\t\t\tonClick={() => setExpanded(!expanded)}\n\t\t\t\taria-expanded={expanded}\n\t\t\t\taria-controls={listId}\n\t\t\t\taria-labelledby={labelId}\n\t\t\t\taria-description={expanded ? stringsProp?.collapse : stringsProp?.expand}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'ai-sources--trigger h-auto min-h-0 w-full justify-start gap-space-md px-surface-xs py-row-y text-left',\n\t\t\t\t\t`rounded-radius ${interactionRecipes.rowHover}`,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<AvatarStack sources={sources.slice(0, 4)} />\n\t\t\t\t<Text id={labelId} tag=\"span\" type=\"inherit\" weight=\"medium\" className=\"flex-1\">\n\t\t\t\t\t{titleText}\n\t\t\t\t</Text>\n\t\t\t\t{expanded ? (\n\t\t\t\t\t<ChevronDown className=\"size-icon-md text-muted-foreground\" />\n\t\t\t\t) : (\n\t\t\t\t\t<ChevronRight className=\"size-icon-md text-muted-foreground\" />\n\t\t\t\t)}\n\t\t\t</Button>\n\n\t\t\t<div id={listId} hidden={!expanded} className=\"ai-sources--list border-t border-border/60 px-surface-xs py-row-y\">\n\t\t\t\t{expanded && (\n\t\t\t\t\t<Stack render={<ol />} gap=\"2xs\" className=\"m-0 list-none p-0 font-sans\">\n\t\t\t\t\t\t{sources.map((source, idx) => (\n\t\t\t\t\t\t\t<SourceRow\n\t\t\t\t\t\t\t\tkey={source.id}\n\t\t\t\t\t\t\t\tsource={source}\n\t\t\t\t\t\t\t\tindex={idx + 1}\n\t\t\t\t\t\t\t\tonSelect={onSelect ? () => onSelect(source, idx) : undefined}\n\t\t\t\t\t\t\t\tvisitLabel={strings.visit}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</Card>\n\t);\n}\n\nAiSources.displayName = 'AiSources';\n\nfunction AvatarStrip({\n\tsources,\n\tmax,\n\ttitle,\n\tvisitLabel,\n\tonSelect,\n\tclassName,\n}: {\n\tsources: ReadonlyArray<AiSourceItem>;\n\tmax: number;\n\ttitle: string;\n\tvisitLabel: string;\n\tonSelect?: (source: AiSourceItem, index: number) => void;\n\tclassName?: string;\n}) {\n\tconst visible = sources.slice(0, max);\n\tconst overflow = sources.length - visible.length;\n\treturn (\n\t\t<div className={cn('inline-flex items-center gap-space-md', className)}>\n\t\t\t<AvatarStack sources={visible} onSelect={onSelect} visitLabel={visitLabel} overflow={overflow} />\n\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t{title}\n\t\t\t</Text>\n\t\t</div>\n\t);\n}\n\nfunction AvatarStack({\n\tsources,\n\tonSelect,\n\tvisitLabel,\n\toverflow = 0,\n}: {\n\tsources: ReadonlyArray<AiSourceItem>;\n\tonSelect?: (source: AiSourceItem, index: number) => void;\n\tvisitLabel?: string;\n\t/** Sources beyond the visible avatars, counted as the stack's last disc. */\n\toverflow?: number;\n}) {\n\treturn (\n\t\t<div className={cn('flex items-center', onSelect ? 'gap-space-2xs' : '-space-x-space-sm')}>\n\t\t\t{sources.map((s, i) => {\n\t\t\t\tconst visual = (\n\t\t\t\t\t<span\n\t\t\t\t\t\tkey={s.id}\n\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\ttitle={typeof s.title === 'string' ? s.title : undefined}\n\t\t\t\t\t\tclassName=\"inline-flex size-icon-lg items-center justify-center overflow-hidden rounded-full border border-card bg-muted text-muted-foreground ring-1 ring-border/60\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<SourceFavicon src={s.faviconUrl} />\n\t\t\t\t\t</span>\n\t\t\t\t);\n\t\t\t\tif (onSelect) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={s.id}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => onSelect(s, i)}\n\t\t\t\t\t\t\taria-label={typeof s.title === 'string' ? `${visitLabel}: ${s.title}` : visitLabel}\n\t\t\t\t\t\t\tclassName={`${interactionRecipes.nativeButtonReset} inline-flex size-action-xs shrink-0 items-center justify-center rounded-radius focus-visible:outline-none ${focusRecipes.edge}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{visual}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn visual;\n\t\t\t})}\n\t\t\t{/* The hidden count belongs to the stack it extends, not to the label after it. */}\n\t\t\t{overflow > 0 && (\n\t\t\t\t<span className=\"ai-sources--overflow inline-flex size-icon-lg items-center justify-center overflow-hidden rounded-full border border-card bg-muted text-muted-foreground ring-1 ring-border/60\">\n\t\t\t\t\t<SecondaryValue size=\"xxs\" className=\"tabular-nums\">\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<NumberValue value={overflow} size=\"xxs\" type=\"secondary\" align=\"left\" />\n\t\t\t\t\t</SecondaryValue>\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nfunction SourceFavicon({ src }: { src?: string }) {\n\tconst [failed, setFailed] = useState(false);\n\n\tuseEffect(() => {\n\t\tsetFailed(false);\n\t}, [src]);\n\n\tif (!src || failed) {\n\t\treturn <Globe className=\"size-icon-sm\" />;\n\t}\n\n\treturn <img src={src} alt=\"\" className=\"size-full object-cover\" onError={() => setFailed(true)} />;\n}\n\nfunction SourceRow({\n\tsource,\n\tindex,\n\tonSelect,\n\tvisitLabel,\n}: {\n\tsource: AiSourceItem;\n\tindex: number;\n\tonSelect?: () => void;\n\tvisitLabel: string;\n}) {\n\tconst titleId = useId();\n\tconst interactive = Boolean(source.url || onSelect);\n\tconst rowClassName = cn(\n\t\tinteractionRecipes.nativeButtonReset,\n\t\t'group flex w-full items-start gap-space-lg rounded-radius px-row-x py-row-y-sm text-left text-foreground',\n\t\tinteractive && `${interactionRecipes.rowHover} focus-visible:outline-none ${focusRecipes.edge}`,\n\t);\n\tconst rowContent = (\n\t\t<>\n\t\t\t{/* The source number stays readable: it is how a citation names its source. */}\n\t\t\t<IconBadge tone=\"neutral\" size=\"sm\" aria-hidden={false} className=\"shrink-0\">\n\t\t\t\t<NumberValue value={index} size=\"xs\" weight=\"semibold\" type=\"secondary\" align=\"center\" />\n\t\t\t</IconBadge>\n\t\t\t<Stack gap=\"dense\" className=\"min-w-0 flex-1\">\n\t\t\t\t<Text id={titleId} type=\"inherit\" weight=\"medium\" className=\"truncate\">\n\t\t\t\t\t{source.title}\n\t\t\t\t\t{!!source.url && (\n\t\t\t\t\t\t<ExternalLink className=\"ml-1 inline size-icon-sm text-muted-foreground align-baseline\" />\n\t\t\t\t\t)}\n\t\t\t\t</Text>\n\t\t\t\t{!!source.publisher && (\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"truncate\">\n\t\t\t\t\t\t{source.publisher}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t\t{!!source.snippet && (\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"line-clamp-2\">\n\t\t\t\t\t\t{source.snippet}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</>\n\t);\n\n\treturn (\n\t\t<li>\n\t\t\t{source.url && !onSelect ? (\n\t\t\t\t<TextLink\n\t\t\t\t\thref={source.url}\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\tunderline={false}\n\t\t\t\t\tclassName={rowClassName}\n\t\t\t\t\taria-labelledby={titleId}\n\t\t\t\t\taria-description={visitLabel}\n\t\t\t\t>\n\t\t\t\t\t{rowContent}\n\t\t\t\t</TextLink>\n\t\t\t) : onSelect ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={onSelect}\n\t\t\t\t\tclassName={cn(rowClassName, 'h-auto justify-start whitespace-normal')}\n\t\t\t\t\taria-labelledby={titleId}\n\t\t\t\t\taria-description={source.url ? visitLabel : undefined}\n\t\t\t\t>\n\t\t\t\t\t{rowContent}\n\t\t\t\t</button>\n\t\t\t) : (\n\t\t\t\t<span className={rowClassName}>{rowContent}</span>\n\t\t\t)}\n\t\t</li>\n\t);\n}\n","import type { ReactNode } from 'react';\nimport type { StringsProp } from '../../../../lib/strings';\n\nexport interface AiReasoningStrings {\n\t/** Header label when collapsed and reasoning is in progress. */\n\tthinking: string;\n\t/** Header label when reasoning is complete. Use `{{duration}}` for the formatted elapsed time. */\n\tthoughtFor: string;\n\t/** Header label when no duration is available. */\n\tthoughtDone: string;\n\t/** Supplied overrides describe how to open the reasoning trace. */\n\texpandAria: string;\n\t/** Supplied overrides describe how to close the reasoning trace. */\n\tcollapseAria: string;\n}\n\nexport const defaultAiReasoningStrings: AiReasoningStrings = {\n\tthinking: 'Thinking…',\n\tthoughtFor: 'Thought for {{duration}}',\n\tthoughtDone: 'Reasoning complete',\n\texpandAria: 'Expand reasoning',\n\tcollapseAria: 'Collapse reasoning',\n};\n\nexport interface AiReasoningProps {\n\t/** Reasoning trace — typically streamed plaintext. */\n\tchildren?: ReactNode;\n\t/** Show the live \"Thinking…\" header with shimmer. */\n\tstreaming?: boolean;\n\t/** Total elapsed time in seconds — shown in the collapsed-done header. */\n\tdurationSeconds?: number;\n\t/** Auto-expand while streaming. */\n\texpandWhileStreaming?: boolean;\n\t/** Initial expanded state. */\n\tdefaultExpanded?: boolean;\n\t/** Controlled expanded state. */\n\texpanded?: boolean;\n\tonExpandedChange?: (expanded: boolean) => void;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiReasoningStrings>;\n}\n","/**\n * AiReasoning — collapsible \"thinking\" trace shown above the assistant's\n * final answer. While `streaming` is true the header runs the shimmer label\n * and the body is auto-expanded; once streaming ends, the header switches\n * to a localized duration summary and the body collapses to a peek.\n *\n * Accept the trace as `children` so the consumer can stream raw text, JSX\n * blocks (substeps, code), or Markdown via their own renderer.\n */\nimport { useEffect, useId, useState, type ReactNode } from 'react';\nimport { Brain, ChevronDown, ChevronRight } from 'lucide-react';\nimport { Button } from '../../../base/buttons';\nimport { Duration } from '../../../primitives';\nimport { Text } from '../../../typography';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { AiShimmer } from '../ai-shimmer/ai-shimmer';\nimport { defaultAiReasoningStrings, type AiReasoningProps } from './types';\nimport { interactionRecipes } from '../../../../lib/interaction-recipes';\n\nfunction renderThoughtFor(template: string, seconds: number): ReactNode {\n\tconst durationParts = template.split(/\\{\\{\\s*duration\\s*\\}\\}/);\n\tif (durationParts.length === 1) return template;\n\n\treturn (\n\t\t<>\n\t\t\t{durationParts[0]}\n\t\t\t<Duration value={seconds} maxParts={1} align=\"left\" />\n\t\t\t{durationParts.slice(1).join('{{duration}}')}\n\t\t</>\n\t);\n}\n\nexport function AiReasoning({\n\tchildren,\n\tstreaming = false,\n\tdurationSeconds,\n\texpandWhileStreaming = true,\n\tdefaultExpanded = false,\n\texpanded: expandedProp,\n\tonExpandedChange,\n\tclassName,\n\tstrings: stringsProp,\n}: AiReasoningProps) {\n\tconst strings = useStrings(defaultAiReasoningStrings, stringsProp);\n\tconst labelId = useId();\n\tconst bodyId = useId();\n\tconst [internalExpanded, setInternalExpanded] = useState(defaultExpanded);\n\tconst expanded = expandedProp ?? internalExpanded;\n\tconst setExpanded = (next: boolean) => {\n\t\tif (expandedProp === undefined) setInternalExpanded(next);\n\t\tonExpandedChange?.(next);\n\t};\n\n\tuseEffect(() => {\n\t\tif (streaming && expandWhileStreaming && !expanded) {\n\t\t\tsetExpanded(true);\n\t\t}\n\t\tif (!streaming && expandWhileStreaming && expanded && !defaultExpanded && expandedProp === undefined) {\n\t\t\t// auto-collapse only once when streaming flips off and consumer hasn't pinned state\n\t\t\tsetExpanded(false);\n\t\t}\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [streaming]);\n\n\tconst headerLabel: ReactNode = streaming ? (\n\t\t<AiShimmer>{strings.thinking}</AiShimmer>\n\t) : durationSeconds !== undefined ? (\n\t\t<Text tag=\"span\" type=\"inherit\" weight=\"medium\">\n\t\t\t{renderThoughtFor(strings.thoughtFor, durationSeconds)}\n\t\t</Text>\n\t) : (\n\t\t<Text tag=\"span\" type=\"inherit\" weight=\"medium\">\n\t\t\t{strings.thoughtDone}\n\t\t</Text>\n\t);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn('ai-reasoning--component', \n\t\t\t\t'overflow-hidden rounded-radius border border-border/60 bg-muted/30',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Button\n\t\t\t\ttype=\"button\"\n\t\t\t\ttone=\"secondary\"\n\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\tsize=\"md\"\n\t\t\t\tonClick={() => setExpanded(!expanded)}\n\t\t\t\taria-expanded={expanded}\n\t\t\t\taria-controls={bodyId}\n\t\t\t\taria-labelledby={labelId}\n\t\t\t\taria-description={expanded ? stringsProp?.collapseAria : stringsProp?.expandAria}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'ai-reasoning--trigger h-auto min-h-0 w-full justify-start gap-space-md rounded-none px-surface-xs py-row-y text-left',\n\t\t\t\t\tinteractionRecipes.rowHover,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<Brain className=\"size-icon-md text-muted-foreground\" />\n\t\t\t\t<span id={labelId} className=\"flex-1\">{headerLabel}</span>\n\t\t\t\t{expanded ? (\n\t\t\t\t\t<ChevronDown className=\"size-icon-md text-muted-foreground\" />\n\t\t\t\t) : (\n\t\t\t\t\t<ChevronRight className=\"size-icon-md text-muted-foreground\" />\n\t\t\t\t)}\n\t\t\t</Button>\n\n\t\t\t<div id={bodyId} hidden={!expanded} className=\"ai-reasoning--body border-t border-border/60 p-surface-xs\">\n\t\t\t\t{expanded && (typeof children === 'string' ? (\n\t\t\t\t\t<Text type=\"secondary\" lineHeight=\"relaxed\" className=\"whitespace-pre-wrap\">\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</Text>\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"whitespace-pre-wrap\">{children}</div>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nAiReasoning.displayName = 'AiReasoning';\n","import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport type { StringsProp } from '../../../../lib/strings';\n\nexport type AiChainStepStatus = 'pending' | 'active' | 'completed' | 'failed';\n\nexport interface AiChainStep {\n\t/** Stable identity for this entry. */\n\tid: string;\n\t/** Surface title. */\n\ttitle: ReactNode;\n\t/** Optional rationale rendered under the title. */\n\tdescription?: ReactNode;\n\t/** Step status — drives the marker style. */\n\tstatus?: AiChainStepStatus;\n\t/** Custom icon override for the step marker. */\n\ticon?: LucideIcon;\n\t/** Free-form children rendered inside the step body (substeps, code, …). */\n\tbody?: ReactNode;\n}\n\nexport interface AiChainOfThoughtStrings {\n\t/** Surface title. */\n\ttitle: string;\n\tstreamingHint: string;\n}\n\nexport const defaultAiChainOfThoughtStrings: AiChainOfThoughtStrings = {\n\ttitle: 'Reasoning',\n\tstreamingHint: 'Working through the steps…',\n};\n\nexport interface AiChainOfThoughtProps {\n\t/** Step list — order is significant. */\n\tsteps: ReadonlyArray<AiChainStep>;\n\t/** Hide the header strip. */\n\thideHeader?: boolean;\n\t/** Show the streaming hint under the header. */\n\tstreaming?: boolean;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiChainOfThoughtStrings>;\n}\n","/**\n * AiChainOfThought — vertical timeline of reasoning steps an agent took (or\n * is taking) to reach a conclusion. Status-aware markers; per-step body slot\n * for nested content (tool calls, code, sub-steps). Pair with `AiReasoning`\n * (free-form trace) when the model emits structured plan steps.\n */\nimport { AlertCircle, Check, Circle, Loader2, type LucideIcon } from 'lucide-react';\nimport { Card } from '../../../base/cards';\nimport { IconBadge, type IconBadgeTone } from '../../../base/display';\nimport { Stack } from '../../../base/structure';\nimport { DisplayLabel, Text } from '../../../typography';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { AiShimmer } from '../ai-shimmer/ai-shimmer';\nimport {\n\tdefaultAiChainOfThoughtStrings,\n\ttype AiChainOfThoughtProps,\n\ttype AiChainStepStatus,\n} from './types';\n\n// Each status is one IconBadge recipe: pending is a quiet neutral disc, the\n// active step takes the primary tint, and settled steps fill solid.\nconst STATUS_VISUAL: Record<\n\tAiChainStepStatus,\n\t{ icon: LucideIcon; tone: IconBadgeTone; solid?: boolean; spin?: boolean }\n> = {\n\tpending: { icon: Circle, tone: 'neutral' },\n\tactive: { icon: Loader2, tone: 'primary', spin: true },\n\tcompleted: { icon: Check, tone: 'success', solid: true },\n\tfailed: { icon: AlertCircle, tone: 'destructive', solid: true },\n};\n\nexport function AiChainOfThought({\n\tsteps,\n\thideHeader = false,\n\tstreaming = false,\n\tclassName,\n\tstrings: stringsProp,\n}: AiChainOfThoughtProps) {\n\tconst strings = useStrings(defaultAiChainOfThoughtStrings, stringsProp);\n\n\treturn (\n\t\t// The public Card owns the frame and its one inset; the header flows into\n\t\t// the steps by the Stack gap rather than sitting on a rule of its own.\n\t\t<Card surface=\"card\" className={cn('ai-chain-of-thought--component', className)}>\n\t\t\t<Stack gap=\"lg\">\n\t\t\t{!hideHeader && (\n\t\t\t\t<div className=\"ai-chain-of-thought--header\">\n\t\t\t\t<Stack direction=\"horizontal\" gap=\"sm\" wrap={false}>\n\t\t\t\t\t<DisplayLabel>\n\t\t\t\t\t\t{strings.title}\n\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t{streaming && (\n\t\t\t\t\t\t<AiShimmer size=\"xs\" className=\"ml-auto\">\n\t\t\t\t\t\t\t{strings.streamingHint}\n\t\t\t\t\t\t</AiShimmer>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<ol className=\"ai-chain-of-thought--body m-0 list-none p-0 font-sans\">\n\t\t\t\t{steps.map((step, idx) => {\n\t\t\t\t\tconst status: AiChainStepStatus = step.status ?? 'pending';\n\t\t\t\t\tconst visual = STATUS_VISUAL[status];\n\t\t\t\t\tconst Icon = step.icon ?? visual.icon;\n\t\t\t\t\tconst isLast = idx === steps.length - 1;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<li key={step.id} className=\"ai-chain-of-thought--step flex gap-space-lg\">\n\t\t\t\t\t\t\t{/* The marker column stretches to the step's full height, so the\n\t\t\t\t\t\t\t rail runs from this disc to the next one whatever the disc size. */}\n\t\t\t\t\t\t\t<span aria-hidden className=\"ai-chain-of-thought--marker flex shrink-0 flex-col items-center\">\n\t\t\t\t\t\t\t\t<IconBadge tone={visual.tone} solid={visual.solid} size=\"sm\">\n\t\t\t\t\t\t\t\t\t<Icon className={cn(visual.spin && 'animate-spin')} />\n\t\t\t\t\t\t\t\t</IconBadge>\n\t\t\t\t\t\t\t\t{!isLast && <span className=\"ai-chain-of-thought--rail w-px flex-1 bg-border/60\" />}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{/* The step's bottom inset is the space the rail crosses to the next disc. */}\n\t\t\t\t\t\t\t<Stack gap=\"md\" className={cn('min-w-0 flex-1', !isLast && 'pb-space-lg')}>\n\t\t\t\t\t\t\t\t<Stack gap=\"dense\">\n\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\tweight={status === 'active' ? 'semibold' : 'medium'}\n\t\t\t\t\t\t\t\t\ttype={status === 'pending' ? 'secondary' : 'inherit'}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{step.title}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t{!!step.description && (\n\t\t\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t\t\t\t\t{step.description}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t{!!step.body && (\n\t\t\t\t\t\t\t\t\t<div className=\"ai-chain-of-thought--step-body min-w-0\">{step.body}</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</ol>\n\t\t\t</Stack>\n\t\t</Card>\n\t);\n}\n\nAiChainOfThought.displayName = 'AiChainOfThought';\n","import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport type { StringsProp } from '../../../../lib/strings';\n\nexport type AiTaskStatus = 'queued' | 'running' | 'completed' | 'failed' | 'cancelled' | 'skipped';\n\nexport interface AiTaskItem {\n\t/** Stable identity for this entry. */\n\tid: string;\n\t/** Surface title. */\n\ttitle: ReactNode;\n\t/** Status — drives the marker pill and icon. */\n\tstatus?: AiTaskStatus;\n\t/** Optional sub-task list rendered nested. */\n\tchildren?: ReadonlyArray<AiTaskItem>;\n\t/** Decorative icon override. */\n\ticon?: LucideIcon;\n\t/** Right-aligned slot — duration, byte count, etc. */\n\trightSlot?: ReactNode;\n\t/** Free-form body rendered under the title (logs, code, …). */\n\tbody?: ReactNode;\n}\n\nexport interface AiTaskStrings {\n\tstatusLabels: Record<AiTaskStatus, string>;\n\tcollapseSubtasks: string;\n\texpandSubtasks: string;\n}\n\nexport const defaultAiTaskStrings: AiTaskStrings = {\n\tstatusLabels: {\n\t\tqueued: 'Queued',\n\t\trunning: 'Running',\n\t\tcompleted: 'Done',\n\t\tfailed: 'Failed',\n\t\tcancelled: 'Cancelled',\n\t\tskipped: 'Skipped',\n\t},\n\tcollapseSubtasks: 'Collapse subtasks',\n\texpandSubtasks: 'Expand subtasks',\n};\n\nexport interface AiTaskProps {\n\t/** Top-level task. */\n\ttask: AiTaskItem;\n\t/** Compact = single row with collapsible children; expanded = always show. */\n\tdensity?: 'compact' | 'expanded';\n\t/** Indentation width per nesting level (px). */\n\tindent?: number;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiTaskStrings>;\n}\n","/**\n * AiTask — single task (with optional sub-tasks) used by agent surfaces to\n * surface long-running plans: scaffolding, package installs, multi-file\n * edits. Each row carries a status marker, a title, and optional body /\n * right-slot. Children render nested under the parent and are auto-\n * collapsed by default in the `compact` density.\n */\nimport { useState } from 'react';\nimport {\n\tAlertCircle,\n\tCheck,\n\tChevronDown,\n\tChevronRight,\n\tCircle,\n\tLoader2,\n\tMinusCircle,\n\tXCircle,\n\ttype LucideIcon,\n} from 'lucide-react';\nimport { Badge } from '../../../base/badge';\nimport { Button } from '../../../base/buttons';\nimport { Card } from '../../../base/cards';\nimport { Text } from '../../../typography';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport {\n\tdefaultAiTaskStrings,\n\ttype AiTaskItem,\n\ttype AiTaskProps,\n\ttype AiTaskStatus,\n} from './types';\n\nconst STATUS_ICON: Record<AiTaskStatus, { icon: LucideIcon; cls: string; spin?: boolean }> = {\n\tqueued: { icon: Circle, cls: 'text-muted-foreground' },\n\trunning: { icon: Loader2, cls: 'text-primary-accent', spin: true },\n\tcompleted: { icon: Check, cls: 'text-success' },\n\tfailed: { icon: AlertCircle, cls: 'text-destructive' },\n\tcancelled: { icon: XCircle, cls: 'text-muted-foreground' },\n\tskipped: { icon: MinusCircle, cls: 'text-muted-foreground' },\n};\n\n// A running task states a live status (info); primary is reserved for the main command.\nconst STATUS_VARIANT: Record<\n\tAiTaskStatus,\n\t'secondary' | 'info' | 'success' | 'destructive' | 'warning'\n> = {\n\tqueued: 'secondary',\n\trunning: 'info',\n\tcompleted: 'success',\n\tfailed: 'destructive',\n\tcancelled: 'secondary',\n\tskipped: 'secondary',\n};\n\nexport function AiTask({\n\ttask,\n\tdensity = 'compact',\n\tindent = 18,\n\tclassName,\n\tstrings: stringsProp,\n}: AiTaskProps) {\n\tconst strings = useStrings(defaultAiTaskStrings, stringsProp);\n\tconst columns = { status: someItem(task, (item) => hasStatusBadge(item.status ?? 'queued')), slot: someItem(task, (item) => item.rightSlot != null && item.rightSlot !== false) };\n\t// The public Card owns the frame; rows own their own inset, so the card adds none.\n\t// Every row is a subgrid of one task grid, so the status badges and the trailing\n\t// slot (duration, size) each keep one column edge whatever their siblings hold.\n\treturn (\n\t\t<Card surface=\"card\" padding=\"none\" className={cn('ai-task--component', className)}>\n\t\t\t<div className={cn('ai-task--rows grid gap-x-space-md', TRAILING_COLUMNS[Number(columns.status) + Number(columns.slot)])}>\n\t\t\t\t<TaskRow\n\t\t\t\t\titem={task}\n\t\t\t\t\tdepth={0}\n\t\t\t\t\tdensity={density}\n\t\t\t\t\tindent={indent}\n\t\t\t\t\tcolumns={columns}\n\t\t\t\t\tstrings={strings}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</Card>\n\t);\n}\n\n/** The status glyph already states a finished row; only other states add a badge. */\nfunction hasStatusBadge(status: AiTaskStatus): boolean {\n\treturn status !== 'completed';\n}\n\nfunction someItem(item: AiTaskItem, test: (item: AiTaskItem) => boolean): boolean {\n\treturn test(item) || !!item.children?.some((child) => someItem(child, test));\n}\n\nconst TRAILING_COLUMNS = ['grid-cols-1', 'grid-cols-[minmax(0,1fr)_auto]', 'grid-cols-[minmax(0,1fr)_auto_auto]'] as const;\n\nAiTask.displayName = 'AiTask';\n\nfunction TaskRow({\n\titem,\n\tdepth,\n\tdensity,\n\tindent,\n\tcolumns,\n\tstrings,\n}: {\n\titem: AiTaskItem;\n\tdepth: number;\n\tdensity: 'compact' | 'expanded';\n\tindent: number;\n\tcolumns: { status: boolean; slot: boolean };\n\tstrings: ReturnType<typeof useStrings<typeof defaultAiTaskStrings>>;\n}) {\n\tconst status: AiTaskStatus = item.status ?? 'queued';\n\tconst visual = STATUS_ICON[status];\n\tconst Icon = item.icon ?? visual.icon;\n\tconst hasChildren = !!item.children?.length;\n\tconst [open, setOpen] = useState(density === 'expanded' || depth === 0 ? true : false);\n\n\t// Muted rows read secondary through the Text role; a cancelled title is also struck through.\n\tconst mutedTitle = status === 'queued' || status === 'cancelled' || status === 'skipped';\n\n\treturn (\n\t\t<>\n\t\t\t{/* The row spans the task grid: a lead cell, then the shared status and\n\t\t\t trailing-slot columns. The lead keeps two tracks (disclosure + status\n\t\t\t glyph, then title) and the body sits under the title. Every first line\n\t\t\t reserves the disclosure height, so the trailing cells centre on it. */}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'ai-task--row col-span-full grid grid-cols-subgrid items-start px-row-x py-row-y',\n\t\t\t\t\tdepth > 0 && 'border-t border-border/60',\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"ai-task--lead grid min-w-0 grid-cols-[auto_minmax(0,1fr)] items-center gap-x-space-md gap-y-space-md\"\n\t\t\t\t\tstyle={depth > 0 ? { paddingInlineStart: `${depth * indent}px` } : undefined}\n\t\t\t\t>\n\t\t\t\t\t<span className=\"ai-task--marker flex min-h-action-sm items-center gap-space-md\">\n\t\t\t\t\t\t{hasChildren ? (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\tonClick={() => setOpen((v) => !v)}\n\t\t\t\t\t\t\t\taria-expanded={open}\n\t\t\t\t\t\t\t\taria-label={open ? strings.collapseSubtasks : strings.expandSubtasks}\n\t\t\t\t\t\t\t\tclassName=\"ai-task--toggle\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{open ? (\n\t\t\t\t\t\t\t\t\t<ChevronDown aria-hidden=\"true\" className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<ChevronRight aria-hidden=\"true\" className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t// Nested leaves keep the disclosure track so sibling status glyphs align.\n\t\t\t\t\t\t\tdepth > 0 && <span aria-hidden className=\"w-action-sm shrink-0\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tclassName={cn('size-icon-md shrink-0', visual.cls, visual.spin && 'animate-spin')}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</span>\n\t\t\t\t\t<Text\n\t\t\t\t\t\tweight={status === 'running' ? 'semibold' : 'medium'}\n\t\t\t\t\t\ttype={mutedTitle ? 'secondary' : 'inherit'}\n\t\t\t\t\t\tclassName={cn('ai-task--title min-w-0 truncate', status === 'cancelled' && 'line-through')}\n\t\t\t\t\t>\n\t\t\t\t\t\t{item.title}\n\t\t\t\t\t</Text>\n\t\t\t\t\t{!!item.body && <div className=\"ai-task--body col-start-2 min-w-0\">{item.body}</div>}\n\t\t\t\t</div>\n\t\t\t\t{columns.status && (\n\t\t\t\t\t<span className=\"ai-task--status flex min-h-action-sm items-center justify-end\">\n\t\t\t\t\t\t{hasStatusBadge(status) ? (\n\t\t\t\t\t\t\t<Badge tone={STATUS_VARIANT[status]}>\n\t\t\t\t\t\t\t\t{strings.statusLabels[status]}\n\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"sr-only\">{strings.statusLabels[status]}</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t{!columns.status && !hasStatusBadge(status) && (\n\t\t\t\t\t<span className=\"sr-only\">{strings.statusLabels[status]}</span>\n\t\t\t\t)}\n\t\t\t\t{columns.slot && (\n\t\t\t\t\t<span className=\"ai-task--slot flex min-h-action-sm items-center justify-end tabular-nums text-muted-foreground\">\n\t\t\t\t\t\t{item.rightSlot}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{hasChildren && open && (\n\t\t\t\t<div className=\"ai-task--children col-span-full grid grid-cols-subgrid\">\n\t\t\t\t\t{item.children!.map((child) => (\n\t\t\t\t\t\t<TaskRow\n\t\t\t\t\t\t\tkey={child.id}\n\t\t\t\t\t\t\titem={child}\n\t\t\t\t\t\t\tdepth={depth + 1}\n\t\t\t\t\t\t\tdensity={density}\n\t\t\t\t\t\t\tindent={indent}\n\t\t\t\t\t\t\tcolumns={columns}\n\t\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</>\n\t);\n}\n","import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport type { StringsProp } from '../../../../lib/strings';\n\nexport interface AiArtifactStrings {\n\topenAria: string;\n\tcopy: string;\n\tcopied: string;\n\tcopyAria: string;\n /** Failure feedback, additive for existing string dictionaries. */\n copyError?: string;\n\tdownloadAria: string;\n\texpandAria: string;\n}\n\nexport const defaultAiArtifactStrings: AiArtifactStrings = {\n\topenAria: 'Open artifact',\n\tcopy: 'Copy',\n\tcopied: 'Copied',\n copyError: 'Could not copy. Please try again.',\n\tcopyAria: 'Copy artifact',\n\tdownloadAria: 'Download artifact',\n\texpandAria: 'Expand artifact',\n};\n\nexport interface AiArtifactAction {\n\t/** Stable identity for this entry. */\n\tid: string;\n\t/** Display label. */\n\tlabel: string;\n\t/** Leading glyph. */\n\ticon?: LucideIcon;\n\t/** Fired when an entry is activated. */\n\tonSelect?: () => void;\n}\n\nexport interface AiArtifactProps {\n\t/** Title — typically the artifact name (e.g. \"App.tsx\", \"design-spec.md\"). */\n\ttitle: ReactNode;\n\t/** Subtitle — typically the kind / language (\"React component\", \"Markdown\"). */\n\tsubtitle?: ReactNode;\n\t/** Icon override for the leading badge. */\n\ticon?: LucideIcon;\n\t/** Plain text content used by the default copy action. */\n\tcopyText?: string;\n\t/** Body content — preview, code, sandbox iframe, etc. */\n\tchildren?: ReactNode;\n\t/** Hide the body and render the artifact as a clickable preview-only chip. */\n\tcollapsed?: boolean;\n\t/** Click handler for the whole header (e.g. open in side panel). */\n\tonOpen?: () => void;\n\t/** Custom actions in the header. */\n\tactions?: ReadonlyArray<AiArtifactAction>;\n\t/** Provide a download handler — adds a download button. */\n\tonDownload?: () => void;\n\t/** Merged onto the outermost node. */\n\t/** Called when the clipboard is unavailable or the write fails. */\n onCopyError?: (error: unknown) => void;\n className?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<AiArtifactStrings>;\n}\n","import { useCopyFeedback } from '../use-copy-feedback';\n/**\n * AiArtifact — generic shell for a model-produced asset (code file, document,\n * design spec, sandbox preview, …). Header carries a leading icon, title /\n * subtitle, and an action toolbar (open, copy, download, custom actions).\n * Body slot accepts the preview itself: `<AiCodeBlock>`, an `<iframe>`, an\n * `<AiPackageInfo>`, etc.\n */\n\nimport {\n\tCheck,\n\tCopy,\n\tDownload,\n\tExternalLink,\n\tFileText,\n\ttype LucideIcon,\n\t} from 'lucide-react';\nimport { Button } from '../../../base/buttons';\nimport { Card } from '../../../base/cards';\nimport { IconBadge,\n} from '../../../base/display';\nimport { Text } from '../../../typography';\nimport { useStrings } from '../../../../lib/strings';\nimport { Stack } from '../../../base/structure';\nimport { cn } from '../../../../lib/utils';\n\nimport { defaultAiArtifactStrings, type AiArtifactProps } from './types';\n\nexport function AiArtifact({\n\ttitle,\n\tsubtitle,\n\ticon,\n\tcopyText,\n\tchildren,\n\tcollapsed = false,\n\tonOpen,\n\tactions,\n\tonDownload,\n\tonCopyError,\n\tclassName,\n\tstrings: stringsProp,\n}: AiArtifactProps) {\n\tconst strings = useStrings(defaultAiArtifactStrings, stringsProp);\n\tconst Icon: LucideIcon = icon ?? FileText;\n\tconst { copied, failed, copy } = useCopyFeedback(onCopyError, copyText);\n\n\tconst handleCopy = async () => {\n\t\tif (copyText) await copy(copyText);\n\t};\n\n\treturn (\n\t\t// The public Card owns the frame; the header band and the flush preview body\n\t\t// own their own insets, so the card adds none.\n\t\t<Card surface=\"card\" padding=\"none\" className={cn('ai-artifact--component', className)}>\n\t\t\t<div className=\"ai-artifact--header @container/ai-artifact-header border-b border-border/60 bg-muted/50 p-surface\">\n\t\t\t<Stack direction=\"horizontal\" align=\"center\" gap=\"lg\">\n\t\t\t\t<div className=\"ai-artifact--identity flex min-w-0 basis-full items-center gap-space-lg @sm/ai-artifact-header:flex-1 @sm/ai-artifact-header:basis-0\">\n\t\t\t\t<IconBadge icon={Icon} tone=\"neutral\" size=\"md\" shape=\"square\" />\n\t\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t\t<Text type=\"inherit\" weight=\"semibold\" className=\"break-words\">\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</Text>\n\t\t\t\t\t{!!subtitle && (\n\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"break-words\">\n\t\t\t\t\t\t\t{subtitle}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"ai-artifact--actions flex flex-wrap items-center gap-space-xs\">\n\t\t\t\t\t{actions?.map((action) => {\n\t\t\t\t\t\tconst ActionIcon = action.icon;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tkey={action.id}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\tonClick={action.onSelect}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{!!ActionIcon && <ActionIcon className=\"size-icon-md\" />}\n\t\t\t\t\t\t\t\t{action.label}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t\t{!!copyText && (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\taria-label={strings.copyAria}\n\t\t\t\t\t\t\tonClick={handleCopy}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{copied ? (\n\t\t\t\t\t\t\t\t<Check className=\"size-icon-md text-success\" />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<Copy className=\"size-icon-md\" />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!onDownload && (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\taria-label={strings.downloadAria}\n\t\t\t\t\t\t\tonClick={onDownload}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Download className=\"size-icon-md\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!onOpen && (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\taria-label={strings.openAria}\n\t\t\t\t\t\t\tonClick={onOpen}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ExternalLink className=\"size-icon-md\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</Stack>\n\t\t\t</div>\n\t\t\t{/* The artifact card is the frame: a direct code preview joins it flush\n\t\t\t (joined-edge reset) instead of drawing a second bordered box inside. */}\n\t\t\t{!collapsed && !!children && <div className=\"ai-artifact--body min-w-0 [&>.code-block--component]:rounded-none [&>.code-block--component]:border-0\">{children}</div>}\n\n\t\t\t{failed && <div className=\"px-control py-row-y\"><Text role=\"alert\" size=\"xs\" type=\"error\">{strings.copyError ?? defaultAiArtifactStrings.copyError}</Text></div>}\n\t\t</Card>\n\t);\n}\n\nAiArtifact.displayName = 'AiArtifact';\n"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { a as e, r as t } from "./ui-provider-C-74NVLc.js";
|
|
3
|
-
import { t as n } from "./utils-
|
|
4
|
-
import { t as r } from "./structure-
|
|
3
|
+
import { t as n } from "./utils-DhuoqFy4.js";
|
|
4
|
+
import { t as r } from "./structure-DZJ2wbAU.js";
|
|
5
5
|
import { t as i } from "./composition.recipes-COdiFhxB.js";
|
|
6
6
|
import { t as a } from "./layer-recipes-CCpklYME.js";
|
|
7
|
-
import { S as o } from "./sidebar-
|
|
8
|
-
import { i as s, r as c } from "./containers-
|
|
7
|
+
import { S as o } from "./sidebar-CmD6a-HK.js";
|
|
8
|
+
import { i as s, r as c } from "./containers-CSdc32h9.js";
|
|
9
9
|
import { n as l } from "./header.recipes-BigdJjw1.js";
|
|
10
10
|
import { Fragment as u, jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
11
11
|
//#region src/components/layout/app-shell/shell-regions.tsx
|
|
@@ -318,4 +318,4 @@ function b(e) {
|
|
|
318
318
|
//#endregion
|
|
319
319
|
export { g as i, y as n, _ as r, b as t };
|
|
320
320
|
|
|
321
|
-
//# sourceMappingURL=app-shell-
|
|
321
|
+
//# sourceMappingURL=app-shell-EHuuRDGy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-shell-B_IuNWOo.js","names":["_Fragment","HEADER_THEME_CLASS","_Fragment","_Fragment","useThemeScopeHost","ThemeScopeHostProvider","cn","Stack","compositionClasses","layerRecipes","SidebarRegion","Container","PageViewport","headerInlineDividerAlignment","shellContentSurface","ShellRegionGrid","hasPrimary","sidebar","hasSecondary","secondarySidebar","hasAside","aside","hasRegions","right","side","stackedPrimary","inlinePrimary","presentation","inlineCluster","columns","primary","primaryWidth","sidebarClassName","secondary","secondaryWidth","secondarySidebarClassName","supporting","asideWidth","asideClassName","main","mainClassName","className","Fragment","HEADER_THEME_CLASS$1","TopbarSidebarLayout","Content","props","headerStyle","headerHeight","sidebarWidth","style","resolvedSidebarTrigger","slots","sidebarTrigger","headerScope","resolvedLogo","logo","resolvedHeaderActions","headerActions","resolvedSidebar","resolvedContent","children","isInset","contentSurface","contentNode","contentClassName","headerTheme","sidebarSide","mobileSidebarMode","sidebarPresentation","headerClassName","headerInnerClassName","secondarySidebarWidth","bodyClassName","SidebarInsetLayout","shellStyle","resolvedTrigger","surface","frameAlignedRegion","toolbarNode","toolbar","toolbarClassName","mainNode","HEADER_THEME_CLASS","StackedLayout","resolvedNav","nav","contentWidth","event","viewport","action","insets","left","subheaderClassName","AppLayout","_variant","shell","variant"],"sources":["../src/components/layout/app-shell/shell-regions.tsx","../src/components/layout/app-shell/topbar-sidebar-layout.tsx","../src/components/layout/app-shell/sidebar-inset-layout.tsx","../src/components/layout/app-shell/stacked-layout.tsx","../src/components/layout/app-shell/app-layout.tsx"],"sourcesContent":["import type {ReactNode} from 'react';\nimport {SidebarRegion} from '../../base/sidebar';\nimport {cn} from '../../../lib/utils';\nimport {layerRecipes} from '../../../lib/layer-recipes';\nimport type {AppShellSidebarPresentation} from './app-shell.types';\n\n/** One surface recipe; the shell frames the page while Page owns its insets. */\nexport const shellContentSurface = {\n plain: 'bg-background text-foreground',\n inset: 'bg-card text-card-foreground md:m-space-md md:overflow-hidden md:rounded-surface md:border md:border-border md:shadow-sm',\n} as const;\n\ninterface ShellRegionGridProps {\n children: ReactNode;\n sidebar?: ReactNode;\n secondarySidebar?: ReactNode;\n aside?: ReactNode;\n side?: 'left' | 'right';\n primaryWidth?: string;\n secondaryWidth?: string;\n asideWidth?: string;\n presentation?: AppShellSidebarPresentation;\n inlinePrimary?: boolean;\n className?: string;\n mainClassName?: string;\n sidebarClassName?: string;\n secondarySidebarClassName?: string;\n asideClassName?: string;\n}\n\n/** Optional auto tracks collapse independently; the page always owns the flexible track. */\nexport function ShellRegionGrid({children,sidebar,secondarySidebar,aside,side='left',primaryWidth,secondaryWidth,asideWidth,presentation='panel',inlinePrimary=false,className,mainClassName,sidebarClassName,secondarySidebarClassName,asideClassName}: ShellRegionGridProps) {\n const hasPrimary = Boolean(sidebar), hasSecondary = Boolean(secondarySidebar), hasAside = Boolean(aside);\n const hasRegions = hasPrimary || hasSecondary || hasAside;\n const right = side === 'right';\n const stackedPrimary = inlinePrimary && presentation !== 'rail';\n // Inline dual navigation retains a usable page canvas. On narrow hosts the\n // body pans horizontally beneath the persistent rail instead of crushing text.\n const inlineCluster = inlinePrimary && presentation === 'rail' && hasSecondary;\n const columns = !hasRegions ? 'grid-cols-1'\n : inlineCluster ? right ? 'grid-cols-[auto_minmax(20rem,1fr)_auto_auto]' : 'grid-cols-[auto_auto_minmax(20rem,1fr)_auto]'\n : right ? 'grid-cols-[auto_minmax(0,1fr)_auto_auto]' : 'grid-cols-[auto_auto_minmax(0,1fr)_auto]';\n const primary = hasPrimary && <SidebarRegion panelId=\"primary\" dockAt={inlinePrimary || presentation === 'rail' ? 0 : 768} presentation={presentation} side={side} width={primaryWidth}\n className={cn('row-start-1', right ? 'col-start-4' : 'col-start-1', inlineCluster && ['sticky', right ? 'right-0' : 'left-0', layerRecipes.sticky], stackedPrimary && (right ? 'max-md:col-start-1 max-md:row-start-2' : 'max-md:col-start-1'),sidebarClassName)}>{sidebar}</SidebarRegion>;\n // Beside a persistent area rail the contextual sidebar is the full navigation\n // panel, so it docks, and becomes a drawer, at the primary panel's threshold.\n const secondaryDockAt = inlinePrimary ? 0 : hasPrimary && presentation === 'rail' ? 768 : 1024;\n const secondary = hasSecondary && <SidebarRegion panelId=\"secondary\" dockAt={secondaryDockAt} side={side} width={secondaryWidth} className={cn('row-start-1',right ? 'col-start-3' : 'col-start-2',secondarySidebarClassName)}>{secondarySidebar}</SidebarRegion>;\n const supporting = hasAside && <SidebarRegion panelId=\"aside\" dockAt={1440} side={right ? 'left' : 'right'} width={asideWidth} className={cn('row-start-1',right ? 'col-start-1' : 'col-start-4',asideClassName)}>{aside}</SidebarRegion>;\n const main = <div className={cn('shell-regions--main row-start-1 flex min-h-0 min-w-0 flex-col', hasRegions && (right ? 'col-start-2' : 'col-start-3'),stackedPrimary && (right ? 'max-md:col-start-1' : 'max-md:col-start-1 max-md:row-start-2'),mainClassName)}>{children}</div>;\n return <div data-shell-regions=\"\" className={cn('shell-regions--component grid min-h-0 min-w-0 flex-1 [direction:ltr] ltr:[&>*]:[direction:ltr] rtl:[&>*]:[direction:rtl]', inlineCluster && 'overflow-x-auto overflow-y-hidden overscroll-x-contain', columns,stackedPrimary && 'max-md:grid-cols-1',className)}>\n {right ? <>{supporting}{main}{secondary}{primary}</> : <>{primary}{secondary}{main}{supporting}</>}\n </div>;\n}\n","/**\n * TopbarSidebarLayout — header-first app shell with a two-column body.\n *\n * This shell is intentionally separate from the default shadcn sidebar layout:\n * the logo belongs in the header, while the sidebar and content occupy the\n * remaining page height below the header.\n */\nimport { cn } from '../../../lib/utils';\nimport { ThemeScopeHostProvider, useThemeScopeHost } from '../../../lib/theme-scope';\n\nimport { Stack } from '../../base/structure';\nimport {compositionClasses} from '../../base/structure/composition.recipes';\nimport { PageViewport } from '../containers';\nimport { headerInlineDividerAlignment } from '../header/header.recipes';\nimport {ShellRegionGrid, shellContentSurface} from './shell-regions';\n\nimport type {\n\tTopbarSidebarLayoutProps,\n\tTopbarSidebarLayoutStyle,\n} from './app-shell.types';\n\n/**\n * Header theme is just a token scope. `.light` / `.dark` remap the shadcn\n * palette for the header subtree (see css/themes/shadcn.default.css), so header\n * partials use ordinary tokens (`bg-background`, `text-foreground`, `bg-accent`\n * …) and invert against the header surface automatically — no header-specific\n * color variables required. Omitted, the header follows the active theme;\n * `light` keeps the header light even on a dark page; `dark` gives a dark topbar\n * on a light page.\n */\nconst HEADER_THEME_CLASS: Record<NonNullable<TopbarSidebarLayoutProps['headerTheme']>, string> = {\n\tlight: 'light',\n\tdark: 'dark',\n};\n\nexport function TopbarSidebarLayout({\n\tchildren,\n\theaderTheme,\n\tcontentSurface = 'plain',\n\tsidebarSide = 'left',\n\tmobileSidebarMode = 'drawer',\n\theaderHeight,\n\tsidebarWidth, secondarySidebarWidth, asideWidth, sidebarPresentation, secondarySidebarClassName, asideClassName,\n\tsidebarTrigger,\n\tlogo,\n\theaderActions,\n\tsidebar,\n\tslots,\n\tcontentAs: Content = 'main',\n\tclassName,\n\theaderClassName,\n\theaderInnerClassName,\n\tbodyClassName,\n\tsidebarClassName,\n\tcontentClassName,\n\tstyle,\n\t...props\n}: TopbarSidebarLayoutProps) {\n\tconst headerStyle = {\n\t\t...(headerHeight ? { '--shell-header-height': headerHeight } : null),\n\t\t...(sidebarWidth ? { '--shell-sidebar-width': sidebarWidth } : null),\n\t\t...style,\n\t} as TopbarSidebarLayoutStyle;\n\tconst resolvedSidebarTrigger = slots?.sidebarTrigger ?? sidebarTrigger;\n\tconst headerScope = useThemeScopeHost<HTMLElement>();\n\tconst resolvedLogo = slots?.logo ?? logo;\n\tconst resolvedHeaderActions = slots?.headerActions ?? headerActions;\n\tconst resolvedSidebar = slots?.sidebar ?? sidebar;\n\tconst resolvedContent = slots?.content ?? children;\n\tconst isInset = contentSurface === 'inset';\n\tconst contentNode = (\n\t\t<PageViewport\n\t\t\trender={<Content />}\n\t\t\tclassName={cn(\n\t\t\t\t'topbar-sidebar-layout--content', !isInset && 'bg-background',\n\t\t\t\tcontentClassName,\n\t\t\t)}\n\t\t>\n\t\t\t{resolvedContent}\n\t\t</PageViewport>\n\t);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'topbar-sidebar-layout--component @container/app-shell box-border isolate flex min-h-svh min-w-0 w-full flex-col overflow-hidden bg-background font-sans text-foreground',\n\t\t\t\t'shell-sidebar-vars', isInset && 'bg-sidebar',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={headerStyle}\n\t\t\tdata-header-theme={headerTheme ?? 'inherit'}\n\t\t\tdata-sidebar-side={sidebarSide}\n\t\t\tdata-mobile-sidebar-mode={mobileSidebarMode}\n\t\t\tdata-content-surface={contentSurface}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ThemeScopeHostProvider value={headerScope.context}>\n\t\t\t<header\n\t\t\t\tref={headerScope.attachHost}\n\t\t\t\tdata-theme-scope=\"\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'topbar-sidebar-layout--header box-border z-40 flex min-h-shell-header shrink-0 items-center border-b border-border bg-background py-space-sm text-foreground',\n\t\t\t\t\t// Above docked navigation the header aligns with the sidebar's inset; once\n\t\t\t\t\t// the panel becomes a drawer it aligns with the page gutter beneath it. A\n\t\t\t\t\t// persistent rail stays docked, so its header keeps the sidebar inset.\n\t\t\t\t\tsidebarPresentation === 'rail' ? 'px-surface-xs' : 'px-surface-lg @3xl/app-shell:px-surface-xs',\n\t\t\t\t\theaderInlineDividerAlignment,\n\t\t\t\t\theaderTheme && HEADER_THEME_CLASS[headerTheme],\n\t\t\t\t\theaderClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" gap=\"md\" wrap\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'topbar-sidebar-layout--header-inner min-h-action w-full min-w-0',\n\t\t\t\t\t\theaderInnerClassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{slots?.header ?? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{!!resolvedSidebarTrigger && (\n\t\t\t\t\t\t\t\t<div className=\"topbar-sidebar-layout--sidebar-trigger flex shrink-0 items-center\">\n\t\t\t\t\t\t\t\t\t{resolvedSidebarTrigger}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!!resolvedLogo && (\n\t\t\t\t\t\t\t\t<div className=\"topbar-sidebar-layout--logo flex min-w-0 shrink-0 items-center\">\n\t\t\t\t\t\t\t\t\t{resolvedLogo}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!!slots?.headerStart && (\n\t\t\t\t\t\t\t\t<div className=\"topbar-sidebar-layout--header-start flex min-w-0 items-center\">\n\t\t\t\t\t\t\t\t\t{slots.headerStart}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!!slots?.headerCenter && (\n\t\t\t\t\t\t\t\t<div className=\"topbar-sidebar-layout--header-center hidden min-w-0 flex-1 items-center @3xl/app-shell:flex\">\n\t\t\t\t\t\t\t\t\t{slots.headerCenter}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!!(resolvedHeaderActions || slots?.headerEnd) && (\n\t\t\t\t\t\t\t\t<div className=\"topbar-sidebar-layout--header-trailing ms-auto flex min-w-0 max-w-full flex-wrap items-center justify-end gap-space-sm @3xl/app-shell:gap-space-md [&>*]:max-w-full\">\n\t\t\t\t\t\t\t\t\t{!!resolvedHeaderActions && (\n\t\t\t\t\t\t\t\t\t\t<div className={cn('topbar-sidebar-layout--header-actions flex min-w-0 max-w-full flex-wrap items-center [&>*]:max-w-full', compositionClasses.commands)}>\n\t\t\t\t\t\t\t\t\t\t\t{resolvedHeaderActions}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{!!slots?.headerEnd && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"topbar-sidebar-layout--header-end flex min-w-0 max-w-full flex-wrap items-center gap-space-sm @3xl/app-shell:gap-space-md [&>*]:max-w-full\">\n\t\t\t\t\t\t\t\t\t\t\t{slots.headerEnd}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t</header>\n\t\t\t</ThemeScopeHostProvider>\n\n\t\t\t<ShellRegionGrid side={sidebarSide} sidebar={resolvedSidebar} secondarySidebar={slots?.secondarySidebar} aside={slots?.aside}\n\t\t\t\tprimaryWidth={sidebarWidth} secondaryWidth={secondarySidebarWidth} asideWidth={asideWidth} presentation={sidebarPresentation}\n\t\t\t\tinlinePrimary={mobileSidebarMode === 'inline'}\n\t\t\t\tclassName={cn('topbar-sidebar-layout--body', bodyClassName)}\n\t\t\t\tmainClassName={cn('topbar-sidebar-layout--main', shellContentSurface[contentSurface])}\n\t\t\t\tsidebarClassName={cn('topbar-sidebar-layout--sidebar min-h-0 min-w-0 overflow-hidden text-sidebar-foreground', isInset ? 'bg-transparent' : 'bg-sidebar', sidebarClassName)}\n\t\t\t\tsecondarySidebarClassName={cn('topbar-sidebar-layout--secondary-sidebar min-h-0 min-w-0 overflow-hidden text-sidebar-foreground', secondarySidebarClassName)}\n\t\t\t\tasideClassName={cn('topbar-sidebar-layout--aside min-h-0 min-w-0 overflow-hidden text-sidebar-foreground', asideClassName)}>\n\t\t\t\t{contentNode}\n\t\t\t</ShellRegionGrid>\n\t\t</div>\n\t);\n}\n","/**\n * SidebarInsetLayout — sidebar-first app shell with no global header.\n *\n * The counterpart to `TopbarSidebarLayout`. There the header spans the page and\n * owns the logo, with the sidebar below it; here the sidebar owns the full page\n * height and the logo sits inside it, so the content column carries only a slim\n * toolbar of its own. This is the shape shadcn's dashboard uses, and it is the\n * one to reach for when navigation should read as the primary frame.\n *\n * `toolbar={false}` removes even that row, for a shell with no header chrome.\n */\nimport { cn } from '../../../lib/utils';\n\nimport { Stack } from '../../base/structure';\nimport { PageViewport } from '../containers';\nimport { headerInlineDividerAlignment } from '../header/header.recipes';\nimport {ShellRegionGrid, shellContentSurface} from './shell-regions';\n\nimport type {\n\tSidebarInsetLayoutProps,\n\tTopbarSidebarLayoutStyle,\n} from './app-shell.types';\n\nexport function SidebarInsetLayout({\n\tchildren,\n\tsidebarSide = 'left',\n\tsurface = 'inset',\n\tmobileSidebarMode = 'drawer',\n\ttoolbar = true,\n\tsidebarWidth, secondarySidebarWidth, asideWidth, sidebarPresentation, secondarySidebarClassName, asideClassName,\n\tsidebar,\n\tsidebarTrigger,\n\tslots,\n\tcontentAs: Content = 'main',\n\tclassName,\n\tsidebarClassName,\n\ttoolbarClassName,\n\tcontentClassName,\n\tstyle,\n\t...props\n}: SidebarInsetLayoutProps) {\n\tconst shellStyle = {\n\t\t...(sidebarWidth ? { '--shell-sidebar-width': sidebarWidth } : null),\n\t\t...style,\n\t} as TopbarSidebarLayoutStyle;\n\n\tconst resolvedSidebar = slots?.sidebar ?? sidebar;\n\tconst resolvedTrigger = slots?.sidebarTrigger ?? sidebarTrigger;\n\tconst resolvedContent = slots?.content ?? children;\n\tconst isInset = surface === 'inset';\n\t// Docked navigation beside the inset frame starts where the frame does (its\n\t// margin plus edge), so the sidebar's header rule lines up with the toolbar's.\n\t// A floating sidebar already insets itself by the same amount.\n\tconst frameAlignedRegion = isInset && 'md:border-t md:border-transparent md:pt-space-md md:has-[[data-variant=floating]]:border-t-0 md:has-[[data-variant=floating]]:pt-0';\n\n\n\tconst toolbarNode = toolbar ? (\n\t\t<header\n\t\t\tclassName={cn(\n\t\t\t\t'sidebar-inset-layout--toolbar @container/toolbar box-border flex min-h-shell-header shrink-0 items-center gap-space-md px-surface-lg py-space-sm',\n\t\t\t\theaderInlineDividerAlignment,\n\t\t\t\t// The toolbar and scrolling body share one surface boundary.\n\t\t\t\t'border-b border-border',\n\t\t\t\ttoolbarClassName,\n\t\t\t)}\n\t\t>\n\t\t\t{slots?.toolbar ?? (\n\t\t\t\t<Stack\n\t\t\t\t\tdirection=\"horizontal\"\n\t\t\t\t\talign=\"center\"\n\t\t\t\t\tgap=\"md\" wrap\n\t\t\t\t\tclassName=\"sidebar-inset-layout--toolbar-inner min-h-action w-full min-w-0\"\n\t\t\t\t>\n\t\t\t\t\t{!!resolvedTrigger && (\n\t\t\t\t\t\t<div className=\"sidebar-inset-layout--sidebar-trigger flex shrink-0 items-center\">\n\t\t\t\t\t\t\t{resolvedTrigger}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!slots?.toolbarStart && (\n\t\t\t\t\t\t<div className=\"sidebar-inset-layout--toolbar-start flex min-w-0 flex-1 basis-24 items-center [&>*]:min-w-0 [&>*]:max-w-full\">\n\t\t\t\t\t\t\t{slots.toolbarStart}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!slots?.toolbarEnd && (\n\t\t\t\t\t\t<div className=\"sidebar-inset-layout--toolbar-end ms-auto flex min-w-0 max-w-full flex-wrap items-center justify-end gap-space-sm [&>*]:max-w-full\">\n\t\t\t\t\t\t\t{slots.toolbarEnd}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t</header>\n\t) : null;\n\n\tconst mainNode = (\n\t\t<div className={cn('sidebar-inset-layout--main flex min-h-0 min-w-0 flex-1 flex-col', shellContentSurface[isInset ? 'inset' : 'plain'])}>\n\t\t\t{toolbarNode}\n\t\t\t<PageViewport\n\t\t\t\trender={<Content />}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'sidebar-inset-layout--content',\n\t\t\t\t\tcontentClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{resolvedContent}\n\t\t\t</PageViewport>\n\t\t</div>\n\t);\n\n\treturn (\n\t\t<div className={cn('sidebar-inset-layout--component box-border isolate flex min-h-svh min-w-0 w-full overflow-hidden font-sans text-foreground shell-sidebar-vars', isInset ? 'bg-sidebar' : 'bg-background', className)}\n\t\t\tstyle={shellStyle} data-sidebar-side={sidebarSide} data-surface={surface} data-mobile-sidebar-mode={mobileSidebarMode} {...props}>\n\t\t\t<ShellRegionGrid side={sidebarSide} sidebar={resolvedSidebar} secondarySidebar={slots?.secondarySidebar} aside={slots?.aside}\n\t\t\t\tprimaryWidth={sidebarWidth} secondaryWidth={secondarySidebarWidth} asideWidth={asideWidth} presentation={sidebarPresentation}\n\t\t\t\tinlinePrimary={mobileSidebarMode === 'inline'}\n\t\t\t\tsidebarClassName={cn('sidebar-inset-layout--sidebar min-h-0 min-w-0 overflow-hidden text-sidebar-foreground', isInset ? 'bg-transparent' : 'bg-sidebar', frameAlignedRegion, sidebarClassName)}\n\t\t\t\tsecondarySidebarClassName={cn('sidebar-inset-layout--secondary-sidebar min-h-0 min-w-0 overflow-hidden text-sidebar-foreground', frameAlignedRegion, secondarySidebarClassName)}\n\t\t\t\tasideClassName={cn('sidebar-inset-layout--aside min-h-0 min-w-0 overflow-hidden text-sidebar-foreground', asideClassName)}>\n\t\t\t\t{mainNode}\n\t\t\t</ShellRegionGrid>\n\t\t</div>\n\t);\n}\n","/**\n * StackedLayout — header-only app shell with horizontal navigation.\n *\n * The third shape alongside `TopbarSidebarLayout` (header over sidebar) and\n * `SidebarInsetLayout` (sidebar owns the page). Here there is no sidebar at all:\n * primary navigation runs across the header and the page stacks beneath it.\n *\n * Reach for this when the navigation is shallow enough to fit a row — settings,\n * marketing consoles, single-resource tools — where a sidebar would be mostly\n * empty. `contentWidth=\"contained\"` holds the page to a reading measure;\n * `\"full\"` lets dashboards span. Header flow follows the shell width: below\n * 64rem navigation owns a full row; wider shells, with room for logo, links\n * and account controls together, place it beside the logo.\n */\nimport { cn } from '../../../lib/utils';\nimport { ThemeScopeHostProvider, useThemeScopeHost } from '../../../lib/theme-scope';\n\nimport { Stack } from '../../base/structure';\nimport { Container, PageViewport } from '../containers';\nimport { headerInlineDividerAlignment } from '../header/header.recipes';\nimport {ShellRegionGrid} from './shell-regions';\n\nimport type {\n\tStackedLayoutProps,\n\tTopbarSidebarLayoutStyle,\n} from './app-shell.types';\n\n/** Same token-scope trick as `TopbarSidebarLayout` — see its note. Omitted, the header follows the active theme. */\nconst HEADER_THEME_CLASS: Record<NonNullable<StackedLayoutProps['headerTheme']>, string> = {\n\tlight: 'light',\n\tdark: 'dark',\n};\n\nexport function StackedLayout({\n\tchildren,\n\theaderTheme,\n\tcontentWidth = 'contained',\n\theaderHeight, asideWidth, asideClassName,\n\tlogo,\n\tnav,\n\tslots,\n\tcontentAs: Content = 'main',\n\tclassName,\n\theaderClassName,\n\tsubheaderClassName,\n\tcontentClassName,\n\tstyle,\n\t...props\n}: StackedLayoutProps) {\n\tconst shellStyle = {\n\t\t...(headerHeight ? { '--shell-header-height': headerHeight } : null),\n\t\t...style,\n\t} as TopbarSidebarLayoutStyle;\n\n\tconst headerScope = useThemeScopeHost<HTMLElement>();\n\tconst resolvedLogo = slots?.logo ?? logo;\n\tconst resolvedNav = slots?.nav ?? nav;\n\tconst resolvedContent = slots?.content ?? children;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'stacked-layout--component @container/stacked-shell box-border isolate flex min-h-svh min-w-0 w-full flex-col bg-background font-sans text-foreground',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={shellStyle}\n\t\t\tdata-header-theme={headerTheme ?? 'inherit'}\n\t\t\tdata-content-width={contentWidth}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ThemeScopeHostProvider value={headerScope.context}>\n\t\t\t<header\n\t\t\t\tref={headerScope.attachHost}\n\t\t\t\tdata-theme-scope=\"\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'stacked-layout--header box-border z-40 flex shrink-0 items-center border-b border-border bg-background px-surface py-space-sm text-foreground @5xl/stacked-shell:min-h-shell-header @5xl/stacked-shell:py-0',\n\t\t\t\t\theaderInlineDividerAlignment,\n\t\t\t\t\theaderTheme && HEADER_THEME_CLASS[headerTheme],\n\t\t\t\t\theaderClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<Stack\n\t\t\t\t\tdirection=\"horizontal\"\n\t\t\t\t\talign=\"center\"\n\t\t\t\t\tgap=\"lg\"\n\t\t\t\t\twrap\n\t\t\t\t\t// The shell width owns header adaptation, including narrow parents\n\t\t\t\t\t// on wide viewports. Children keep their identity across both flows.\n\t\t\t\t\tclassName=\"stacked-layout--header-inner min-h-action w-full min-w-0 @5xl/stacked-shell:flex-nowrap @5xl/stacked-shell:gap-space-2xl\"\n\t\t\t\t>\n\t\t\t\t\t{slots?.header ?? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{!!resolvedLogo && (\n\t\t\t\t\t\t\t\t<div className=\"stacked-layout--logo flex min-w-0 shrink-0 items-center @5xl/stacked-shell:order-1\">\n\t\t\t\t\t\t\t\t\t{resolvedLogo}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!!resolvedNav && (\n\t\t\t\t\t\t\t\t// This shell has no sidebar, so hiding the nav in narrow shells left\n\t\t\t\t\t\t\t\t// the app with no navigation at all — logo and account menu\n\t\t\t\t\t\t\t\t// only. Instead it drops to its own full-width row and scrolls\n\t\t\t\t\t\t\t\t// horizontally, and returns inline when its parent is wide enough.\n\t\t\t\t\t\t\t\t//\n\t\t\t\t\t\t\t\t// Rendered once, not duplicated per breakpoint: a second copy\n\t\t\t\t\t\t\t\t// would put every nav link in the accessibility tree twice.\n\t\t\t\t\t\t\t\t//\n\t\t\t\t\t\t\t\t// Keep navigation intrinsic and single-line inside its scroller.\n\t\t\t\t\t\t\t\t// The shared inset reserves room for outer focus rings on every side.\n\t\t\t\t\t\t\t\t<nav\n\t\t\t\t\t\t\t\t\tonFocusCapture={(event) => {\n\t\t\t\t\t\t\t\t\t\t// Native focus can leave a partially visible action clipped.\n\t\t\t\t\t\t\t\t\t\t// Reveal only within this horizontal owner; preserve page scroll.\n\t\t\t\t\t\t\t\t\t\tconst nav = event.currentTarget;\n\t\t\t\t\t\t\t\t\t\t// React portal focus bubbles through its logical nav ancestry.\n\t\t\t\t\t\t\t\t\t\tif (!nav.contains(event.target)) return;\n\t\t\t\t\t\t\t\t\t\tconst viewport = nav.getBoundingClientRect();\n\t\t\t\t\t\t\t\t\t\tconst action = event.target.getBoundingClientRect();\n\t\t\t\t\t\t\t\t\t\tconst insets = getComputedStyle(nav);\n\t\t\t\t\t\t\t\t\t\tconst left = viewport.left + (parseFloat(insets.paddingLeft) || 0);\n\t\t\t\t\t\t\t\t\t\tconst right = viewport.right - (parseFloat(insets.paddingRight) || 0);\n\t\t\t\t\t\t\t\t\t\tif (action.left < left) nav.scrollLeft += action.left - left;\n\t\t\t\t\t\t\t\t\t\telse if (action.right > right) nav.scrollLeft += action.right - right;\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tclassName=\"stacked-layout--nav order-last flex w-full min-w-0 flex-nowrap items-center overflow-x-auto p-space-sm @5xl/stacked-shell:order-2 @5xl/stacked-shell:w-auto @5xl/stacked-shell:flex-1 [&>*]:shrink-0 [&>*]:flex-nowrap\">\n\t\t\t\t\t\t\t\t\t{resolvedNav}\n\t\t\t\t\t\t\t\t</nav>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!!slots?.headerEnd && (\n\t\t\t\t\t\t\t\t<div className=\"stacked-layout--header-end ms-auto flex min-w-0 max-w-full flex-wrap items-center justify-end gap-space-sm @5xl/stacked-shell:order-3 @5xl/stacked-shell:gap-space-md [&>*]:max-w-full\">\n\t\t\t\t\t\t\t\t\t{slots.headerEnd}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t</header>\n\t\t\t</ThemeScopeHostProvider>\n\n\t\t\t{!!slots?.subheader && (\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'stacked-layout--subheader shrink-0 border-b border-border bg-background px-surface',\n\t\t\t\t\t\tsubheaderClassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{slots.subheader}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<ShellRegionGrid aside={slots?.aside} asideWidth={asideWidth} asideClassName={cn('stacked-layout--aside min-h-0 min-w-0 overflow-hidden text-sidebar-foreground',asideClassName)}>\n\t\t\t<PageViewport\n\t\t\t\trender={<Content />}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'stacked-layout--content bg-background',\n\t\t\t\t\tcontentClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{contentWidth === 'contained' ? (\n\t\t\t\t\t<Container maxWidth=\"2xl\" gutter=\"lg\" className=\"stacked-layout--measure\">\n\t\t\t\t\t\t{resolvedContent}\n\t\t\t\t\t</Container>\n\t\t\t\t) : (\n\t\t\t\t\tresolvedContent\n\t\t\t\t)}\n\t\t\t</PageViewport>\n\t\t\t</ShellRegionGrid>\n\t\t</div>\n\t);\n}\n","import { cn } from '../../../lib/utils';\nimport { SidebarInsetLayout } from './sidebar-inset-layout';\nimport { StackedLayout } from './stacked-layout';\nimport { TopbarSidebarLayout } from './topbar-sidebar-layout';\nimport type { SidebarInsetLayoutProps, StackedLayoutProps, TopbarSidebarLayoutProps } from './app-shell.types';\n\n/** Presets select chrome; each underlying shell retains its own typed slots and behavior. */\nexport type AppLayoutProps =\n | (Omit<TopbarSidebarLayoutProps, 'headerTheme'> & {variant?: 'light-header' | 'dark-header'})\n | (Omit<SidebarInsetLayoutProps, 'surface'> & {variant: 'sidebar' | 'inset'})\n | (StackedLayoutProps & {variant: 'stacked'});\n\nexport type AppLayoutVariant = NonNullable<AppLayoutProps['variant']>;\n\n/** Five ready compositions using three shell owners, with one page viewport. */\nexport function AppLayout(props: AppLayoutProps) {\n const presentation = {'data-app-layout': props.variant ?? 'light-header', className: cn('app-layout--component', props.className)};\n switch (props.variant) {\n case 'stacked': {\n const {variant: _variant, ...shell} = props;\n return <StackedLayout {...shell} {...presentation} />;\n }\n case 'sidebar':\n case 'inset': {\n const {variant, ...shell} = props;\n return <SidebarInsetLayout {...shell} {...presentation} surface={variant === 'sidebar' ? 'flush' : 'inset'} />;\n }\n default: {\n // An omitted variant keeps the header on the active theme; light/dark scope it on request.\n const {variant, ...shell} = props;\n return <TopbarSidebarLayout {...shell} {...presentation} headerTheme={variant === 'dark-header' ? 'dark' : variant === 'light-header' ? 'light' : undefined} />;\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app-shell-EHuuRDGy.js","names":["_Fragment","HEADER_THEME_CLASS","_Fragment","_Fragment","useThemeScopeHost","ThemeScopeHostProvider","cn","Stack","compositionClasses","layerRecipes","SidebarRegion","Container","PageViewport","headerInlineDividerAlignment","shellContentSurface","ShellRegionGrid","hasPrimary","sidebar","hasSecondary","secondarySidebar","hasAside","aside","hasRegions","right","side","stackedPrimary","inlinePrimary","presentation","inlineCluster","columns","primary","primaryWidth","sidebarClassName","secondary","secondaryWidth","secondarySidebarClassName","supporting","asideWidth","asideClassName","main","mainClassName","className","Fragment","HEADER_THEME_CLASS$1","TopbarSidebarLayout","Content","props","headerStyle","headerHeight","sidebarWidth","style","resolvedSidebarTrigger","slots","sidebarTrigger","headerScope","resolvedLogo","logo","resolvedHeaderActions","headerActions","resolvedSidebar","resolvedContent","children","isInset","contentSurface","contentNode","contentClassName","headerTheme","sidebarSide","mobileSidebarMode","sidebarPresentation","headerClassName","headerInnerClassName","secondarySidebarWidth","bodyClassName","SidebarInsetLayout","shellStyle","resolvedTrigger","surface","frameAlignedRegion","toolbarNode","toolbar","toolbarClassName","mainNode","HEADER_THEME_CLASS","StackedLayout","resolvedNav","nav","contentWidth","event","viewport","action","insets","left","subheaderClassName","AppLayout","_variant","shell","variant"],"sources":["../src/components/layout/app-shell/shell-regions.tsx","../src/components/layout/app-shell/topbar-sidebar-layout.tsx","../src/components/layout/app-shell/sidebar-inset-layout.tsx","../src/components/layout/app-shell/stacked-layout.tsx","../src/components/layout/app-shell/app-layout.tsx"],"sourcesContent":["import type {ReactNode} from 'react';\nimport {SidebarRegion} from '../../base/sidebar';\nimport {cn} from '../../../lib/utils';\nimport {layerRecipes} from '../../../lib/layer-recipes';\nimport type {AppShellSidebarPresentation} from './app-shell.types';\n\n/** One surface recipe; the shell frames the page while Page owns its insets. */\nexport const shellContentSurface = {\n plain: 'bg-background text-foreground',\n inset: 'bg-card text-card-foreground md:m-space-md md:overflow-hidden md:rounded-surface md:border md:border-border md:shadow-sm',\n} as const;\n\ninterface ShellRegionGridProps {\n children: ReactNode;\n sidebar?: ReactNode;\n secondarySidebar?: ReactNode;\n aside?: ReactNode;\n side?: 'left' | 'right';\n primaryWidth?: string;\n secondaryWidth?: string;\n asideWidth?: string;\n presentation?: AppShellSidebarPresentation;\n inlinePrimary?: boolean;\n className?: string;\n mainClassName?: string;\n sidebarClassName?: string;\n secondarySidebarClassName?: string;\n asideClassName?: string;\n}\n\n/** Optional auto tracks collapse independently; the page always owns the flexible track. */\nexport function ShellRegionGrid({children,sidebar,secondarySidebar,aside,side='left',primaryWidth,secondaryWidth,asideWidth,presentation='panel',inlinePrimary=false,className,mainClassName,sidebarClassName,secondarySidebarClassName,asideClassName}: ShellRegionGridProps) {\n const hasPrimary = Boolean(sidebar), hasSecondary = Boolean(secondarySidebar), hasAside = Boolean(aside);\n const hasRegions = hasPrimary || hasSecondary || hasAside;\n const right = side === 'right';\n const stackedPrimary = inlinePrimary && presentation !== 'rail';\n // Inline dual navigation retains a usable page canvas. On narrow hosts the\n // body pans horizontally beneath the persistent rail instead of crushing text.\n const inlineCluster = inlinePrimary && presentation === 'rail' && hasSecondary;\n const columns = !hasRegions ? 'grid-cols-1'\n : inlineCluster ? right ? 'grid-cols-[auto_minmax(20rem,1fr)_auto_auto]' : 'grid-cols-[auto_auto_minmax(20rem,1fr)_auto]'\n : right ? 'grid-cols-[auto_minmax(0,1fr)_auto_auto]' : 'grid-cols-[auto_auto_minmax(0,1fr)_auto]';\n const primary = hasPrimary && <SidebarRegion panelId=\"primary\" dockAt={inlinePrimary || presentation === 'rail' ? 0 : 768} presentation={presentation} side={side} width={primaryWidth}\n className={cn('row-start-1', right ? 'col-start-4' : 'col-start-1', inlineCluster && ['sticky', right ? 'right-0' : 'left-0', layerRecipes.sticky], stackedPrimary && (right ? 'max-md:col-start-1 max-md:row-start-2' : 'max-md:col-start-1'),sidebarClassName)}>{sidebar}</SidebarRegion>;\n // Beside a persistent area rail the contextual sidebar is the full navigation\n // panel, so it docks, and becomes a drawer, at the primary panel's threshold.\n const secondaryDockAt = inlinePrimary ? 0 : hasPrimary && presentation === 'rail' ? 768 : 1024;\n const secondary = hasSecondary && <SidebarRegion panelId=\"secondary\" dockAt={secondaryDockAt} side={side} width={secondaryWidth} className={cn('row-start-1',right ? 'col-start-3' : 'col-start-2',secondarySidebarClassName)}>{secondarySidebar}</SidebarRegion>;\n const supporting = hasAside && <SidebarRegion panelId=\"aside\" dockAt={1440} side={right ? 'left' : 'right'} width={asideWidth} className={cn('row-start-1',right ? 'col-start-1' : 'col-start-4',asideClassName)}>{aside}</SidebarRegion>;\n const main = <div className={cn('shell-regions--main row-start-1 flex min-h-0 min-w-0 flex-col', hasRegions && (right ? 'col-start-2' : 'col-start-3'),stackedPrimary && (right ? 'max-md:col-start-1' : 'max-md:col-start-1 max-md:row-start-2'),mainClassName)}>{children}</div>;\n return <div data-shell-regions=\"\" className={cn('shell-regions--component grid min-h-0 min-w-0 flex-1 [direction:ltr] ltr:[&>*]:[direction:ltr] rtl:[&>*]:[direction:rtl]', inlineCluster && 'overflow-x-auto overflow-y-hidden overscroll-x-contain', columns,stackedPrimary && 'max-md:grid-cols-1',className)}>\n {right ? <>{supporting}{main}{secondary}{primary}</> : <>{primary}{secondary}{main}{supporting}</>}\n </div>;\n}\n","/**\n * TopbarSidebarLayout — header-first app shell with a two-column body.\n *\n * This shell is intentionally separate from the default shadcn sidebar layout:\n * the logo belongs in the header, while the sidebar and content occupy the\n * remaining page height below the header.\n */\nimport { cn } from '../../../lib/utils';\nimport { ThemeScopeHostProvider, useThemeScopeHost } from '../../../lib/theme-scope';\n\nimport { Stack } from '../../base/structure';\nimport {compositionClasses} from '../../base/structure/composition.recipes';\nimport { PageViewport } from '../containers';\nimport { headerInlineDividerAlignment } from '../header/header.recipes';\nimport {ShellRegionGrid, shellContentSurface} from './shell-regions';\n\nimport type {\n\tTopbarSidebarLayoutProps,\n\tTopbarSidebarLayoutStyle,\n} from './app-shell.types';\n\n/**\n * Header theme is just a token scope. `.light` / `.dark` remap the shadcn\n * palette for the header subtree (see css/themes/shadcn.default.css), so header\n * partials use ordinary tokens (`bg-background`, `text-foreground`, `bg-accent`\n * …) and invert against the header surface automatically — no header-specific\n * color variables required. Omitted, the header follows the active theme;\n * `light` keeps the header light even on a dark page; `dark` gives a dark topbar\n * on a light page.\n */\nconst HEADER_THEME_CLASS: Record<NonNullable<TopbarSidebarLayoutProps['headerTheme']>, string> = {\n\tlight: 'light',\n\tdark: 'dark',\n};\n\nexport function TopbarSidebarLayout({\n\tchildren,\n\theaderTheme,\n\tcontentSurface = 'plain',\n\tsidebarSide = 'left',\n\tmobileSidebarMode = 'drawer',\n\theaderHeight,\n\tsidebarWidth, secondarySidebarWidth, asideWidth, sidebarPresentation, secondarySidebarClassName, asideClassName,\n\tsidebarTrigger,\n\tlogo,\n\theaderActions,\n\tsidebar,\n\tslots,\n\tcontentAs: Content = 'main',\n\tclassName,\n\theaderClassName,\n\theaderInnerClassName,\n\tbodyClassName,\n\tsidebarClassName,\n\tcontentClassName,\n\tstyle,\n\t...props\n}: TopbarSidebarLayoutProps) {\n\tconst headerStyle = {\n\t\t...(headerHeight ? { '--shell-header-height': headerHeight } : null),\n\t\t...(sidebarWidth ? { '--shell-sidebar-width': sidebarWidth } : null),\n\t\t...style,\n\t} as TopbarSidebarLayoutStyle;\n\tconst resolvedSidebarTrigger = slots?.sidebarTrigger ?? sidebarTrigger;\n\tconst headerScope = useThemeScopeHost<HTMLElement>();\n\tconst resolvedLogo = slots?.logo ?? logo;\n\tconst resolvedHeaderActions = slots?.headerActions ?? headerActions;\n\tconst resolvedSidebar = slots?.sidebar ?? sidebar;\n\tconst resolvedContent = slots?.content ?? children;\n\tconst isInset = contentSurface === 'inset';\n\tconst contentNode = (\n\t\t<PageViewport\n\t\t\trender={<Content />}\n\t\t\tclassName={cn(\n\t\t\t\t'topbar-sidebar-layout--content', !isInset && 'bg-background',\n\t\t\t\tcontentClassName,\n\t\t\t)}\n\t\t>\n\t\t\t{resolvedContent}\n\t\t</PageViewport>\n\t);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'topbar-sidebar-layout--component @container/app-shell box-border isolate flex min-h-svh min-w-0 w-full flex-col overflow-hidden bg-background font-sans text-foreground',\n\t\t\t\t'shell-sidebar-vars', isInset && 'bg-sidebar',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={headerStyle}\n\t\t\tdata-header-theme={headerTheme ?? 'inherit'}\n\t\t\tdata-sidebar-side={sidebarSide}\n\t\t\tdata-mobile-sidebar-mode={mobileSidebarMode}\n\t\t\tdata-content-surface={contentSurface}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ThemeScopeHostProvider value={headerScope.context}>\n\t\t\t<header\n\t\t\t\tref={headerScope.attachHost}\n\t\t\t\tdata-theme-scope=\"\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'topbar-sidebar-layout--header box-border z-40 flex min-h-shell-header shrink-0 items-center border-b border-border bg-background py-space-sm text-foreground',\n\t\t\t\t\t// Above docked navigation the header aligns with the sidebar's inset; once\n\t\t\t\t\t// the panel becomes a drawer it aligns with the page gutter beneath it. A\n\t\t\t\t\t// persistent rail stays docked, so its header keeps the sidebar inset.\n\t\t\t\t\tsidebarPresentation === 'rail' ? 'px-surface-xs' : 'px-surface-lg @3xl/app-shell:px-surface-xs',\n\t\t\t\t\theaderInlineDividerAlignment,\n\t\t\t\t\theaderTheme && HEADER_THEME_CLASS[headerTheme],\n\t\t\t\t\theaderClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" gap=\"md\" wrap\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'topbar-sidebar-layout--header-inner min-h-action w-full min-w-0',\n\t\t\t\t\t\theaderInnerClassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{slots?.header ?? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{!!resolvedSidebarTrigger && (\n\t\t\t\t\t\t\t\t<div className=\"topbar-sidebar-layout--sidebar-trigger flex shrink-0 items-center\">\n\t\t\t\t\t\t\t\t\t{resolvedSidebarTrigger}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!!resolvedLogo && (\n\t\t\t\t\t\t\t\t<div className=\"topbar-sidebar-layout--logo flex min-w-0 shrink-0 items-center\">\n\t\t\t\t\t\t\t\t\t{resolvedLogo}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!!slots?.headerStart && (\n\t\t\t\t\t\t\t\t<div className=\"topbar-sidebar-layout--header-start flex min-w-0 items-center\">\n\t\t\t\t\t\t\t\t\t{slots.headerStart}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!!slots?.headerCenter && (\n\t\t\t\t\t\t\t\t<div className=\"topbar-sidebar-layout--header-center hidden min-w-0 flex-1 items-center @3xl/app-shell:flex\">\n\t\t\t\t\t\t\t\t\t{slots.headerCenter}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!!(resolvedHeaderActions || slots?.headerEnd) && (\n\t\t\t\t\t\t\t\t<div className=\"topbar-sidebar-layout--header-trailing ms-auto flex min-w-0 max-w-full flex-wrap items-center justify-end gap-space-sm @3xl/app-shell:gap-space-md [&>*]:max-w-full\">\n\t\t\t\t\t\t\t\t\t{!!resolvedHeaderActions && (\n\t\t\t\t\t\t\t\t\t\t<div className={cn('topbar-sidebar-layout--header-actions flex min-w-0 max-w-full flex-wrap items-center [&>*]:max-w-full', compositionClasses.commands)}>\n\t\t\t\t\t\t\t\t\t\t\t{resolvedHeaderActions}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{!!slots?.headerEnd && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"topbar-sidebar-layout--header-end flex min-w-0 max-w-full flex-wrap items-center gap-space-sm @3xl/app-shell:gap-space-md [&>*]:max-w-full\">\n\t\t\t\t\t\t\t\t\t\t\t{slots.headerEnd}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t</header>\n\t\t\t</ThemeScopeHostProvider>\n\n\t\t\t<ShellRegionGrid side={sidebarSide} sidebar={resolvedSidebar} secondarySidebar={slots?.secondarySidebar} aside={slots?.aside}\n\t\t\t\tprimaryWidth={sidebarWidth} secondaryWidth={secondarySidebarWidth} asideWidth={asideWidth} presentation={sidebarPresentation}\n\t\t\t\tinlinePrimary={mobileSidebarMode === 'inline'}\n\t\t\t\tclassName={cn('topbar-sidebar-layout--body', bodyClassName)}\n\t\t\t\tmainClassName={cn('topbar-sidebar-layout--main', shellContentSurface[contentSurface])}\n\t\t\t\tsidebarClassName={cn('topbar-sidebar-layout--sidebar min-h-0 min-w-0 overflow-hidden text-sidebar-foreground', isInset ? 'bg-transparent' : 'bg-sidebar', sidebarClassName)}\n\t\t\t\tsecondarySidebarClassName={cn('topbar-sidebar-layout--secondary-sidebar min-h-0 min-w-0 overflow-hidden text-sidebar-foreground', secondarySidebarClassName)}\n\t\t\t\tasideClassName={cn('topbar-sidebar-layout--aside min-h-0 min-w-0 overflow-hidden text-sidebar-foreground', asideClassName)}>\n\t\t\t\t{contentNode}\n\t\t\t</ShellRegionGrid>\n\t\t</div>\n\t);\n}\n","/**\n * SidebarInsetLayout — sidebar-first app shell with no global header.\n *\n * The counterpart to `TopbarSidebarLayout`. There the header spans the page and\n * owns the logo, with the sidebar below it; here the sidebar owns the full page\n * height and the logo sits inside it, so the content column carries only a slim\n * toolbar of its own. This is the shape shadcn's dashboard uses, and it is the\n * one to reach for when navigation should read as the primary frame.\n *\n * `toolbar={false}` removes even that row, for a shell with no header chrome.\n */\nimport { cn } from '../../../lib/utils';\n\nimport { Stack } from '../../base/structure';\nimport { PageViewport } from '../containers';\nimport { headerInlineDividerAlignment } from '../header/header.recipes';\nimport {ShellRegionGrid, shellContentSurface} from './shell-regions';\n\nimport type {\n\tSidebarInsetLayoutProps,\n\tTopbarSidebarLayoutStyle,\n} from './app-shell.types';\n\nexport function SidebarInsetLayout({\n\tchildren,\n\tsidebarSide = 'left',\n\tsurface = 'inset',\n\tmobileSidebarMode = 'drawer',\n\ttoolbar = true,\n\tsidebarWidth, secondarySidebarWidth, asideWidth, sidebarPresentation, secondarySidebarClassName, asideClassName,\n\tsidebar,\n\tsidebarTrigger,\n\tslots,\n\tcontentAs: Content = 'main',\n\tclassName,\n\tsidebarClassName,\n\ttoolbarClassName,\n\tcontentClassName,\n\tstyle,\n\t...props\n}: SidebarInsetLayoutProps) {\n\tconst shellStyle = {\n\t\t...(sidebarWidth ? { '--shell-sidebar-width': sidebarWidth } : null),\n\t\t...style,\n\t} as TopbarSidebarLayoutStyle;\n\n\tconst resolvedSidebar = slots?.sidebar ?? sidebar;\n\tconst resolvedTrigger = slots?.sidebarTrigger ?? sidebarTrigger;\n\tconst resolvedContent = slots?.content ?? children;\n\tconst isInset = surface === 'inset';\n\t// Docked navigation beside the inset frame starts where the frame does (its\n\t// margin plus edge), so the sidebar's header rule lines up with the toolbar's.\n\t// A floating sidebar already insets itself by the same amount.\n\tconst frameAlignedRegion = isInset && 'md:border-t md:border-transparent md:pt-space-md md:has-[[data-variant=floating]]:border-t-0 md:has-[[data-variant=floating]]:pt-0';\n\n\n\tconst toolbarNode = toolbar ? (\n\t\t<header\n\t\t\tclassName={cn(\n\t\t\t\t'sidebar-inset-layout--toolbar @container/toolbar box-border flex min-h-shell-header shrink-0 items-center gap-space-md px-surface-lg py-space-sm',\n\t\t\t\theaderInlineDividerAlignment,\n\t\t\t\t// The toolbar and scrolling body share one surface boundary.\n\t\t\t\t'border-b border-border',\n\t\t\t\ttoolbarClassName,\n\t\t\t)}\n\t\t>\n\t\t\t{slots?.toolbar ?? (\n\t\t\t\t<Stack\n\t\t\t\t\tdirection=\"horizontal\"\n\t\t\t\t\talign=\"center\"\n\t\t\t\t\tgap=\"md\" wrap\n\t\t\t\t\tclassName=\"sidebar-inset-layout--toolbar-inner min-h-action w-full min-w-0\"\n\t\t\t\t>\n\t\t\t\t\t{!!resolvedTrigger && (\n\t\t\t\t\t\t<div className=\"sidebar-inset-layout--sidebar-trigger flex shrink-0 items-center\">\n\t\t\t\t\t\t\t{resolvedTrigger}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!slots?.toolbarStart && (\n\t\t\t\t\t\t<div className=\"sidebar-inset-layout--toolbar-start flex min-w-0 flex-1 basis-24 items-center [&>*]:min-w-0 [&>*]:max-w-full\">\n\t\t\t\t\t\t\t{slots.toolbarStart}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!slots?.toolbarEnd && (\n\t\t\t\t\t\t<div className=\"sidebar-inset-layout--toolbar-end ms-auto flex min-w-0 max-w-full flex-wrap items-center justify-end gap-space-sm [&>*]:max-w-full\">\n\t\t\t\t\t\t\t{slots.toolbarEnd}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t</header>\n\t) : null;\n\n\tconst mainNode = (\n\t\t<div className={cn('sidebar-inset-layout--main flex min-h-0 min-w-0 flex-1 flex-col', shellContentSurface[isInset ? 'inset' : 'plain'])}>\n\t\t\t{toolbarNode}\n\t\t\t<PageViewport\n\t\t\t\trender={<Content />}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'sidebar-inset-layout--content',\n\t\t\t\t\tcontentClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{resolvedContent}\n\t\t\t</PageViewport>\n\t\t</div>\n\t);\n\n\treturn (\n\t\t<div className={cn('sidebar-inset-layout--component box-border isolate flex min-h-svh min-w-0 w-full overflow-hidden font-sans text-foreground shell-sidebar-vars', isInset ? 'bg-sidebar' : 'bg-background', className)}\n\t\t\tstyle={shellStyle} data-sidebar-side={sidebarSide} data-surface={surface} data-mobile-sidebar-mode={mobileSidebarMode} {...props}>\n\t\t\t<ShellRegionGrid side={sidebarSide} sidebar={resolvedSidebar} secondarySidebar={slots?.secondarySidebar} aside={slots?.aside}\n\t\t\t\tprimaryWidth={sidebarWidth} secondaryWidth={secondarySidebarWidth} asideWidth={asideWidth} presentation={sidebarPresentation}\n\t\t\t\tinlinePrimary={mobileSidebarMode === 'inline'}\n\t\t\t\tsidebarClassName={cn('sidebar-inset-layout--sidebar min-h-0 min-w-0 overflow-hidden text-sidebar-foreground', isInset ? 'bg-transparent' : 'bg-sidebar', frameAlignedRegion, sidebarClassName)}\n\t\t\t\tsecondarySidebarClassName={cn('sidebar-inset-layout--secondary-sidebar min-h-0 min-w-0 overflow-hidden text-sidebar-foreground', frameAlignedRegion, secondarySidebarClassName)}\n\t\t\t\tasideClassName={cn('sidebar-inset-layout--aside min-h-0 min-w-0 overflow-hidden text-sidebar-foreground', asideClassName)}>\n\t\t\t\t{mainNode}\n\t\t\t</ShellRegionGrid>\n\t\t</div>\n\t);\n}\n","/**\n * StackedLayout — header-only app shell with horizontal navigation.\n *\n * The third shape alongside `TopbarSidebarLayout` (header over sidebar) and\n * `SidebarInsetLayout` (sidebar owns the page). Here there is no sidebar at all:\n * primary navigation runs across the header and the page stacks beneath it.\n *\n * Reach for this when the navigation is shallow enough to fit a row — settings,\n * marketing consoles, single-resource tools — where a sidebar would be mostly\n * empty. `contentWidth=\"contained\"` holds the page to a reading measure;\n * `\"full\"` lets dashboards span. Header flow follows the shell width: below\n * 64rem navigation owns a full row; wider shells, with room for logo, links\n * and account controls together, place it beside the logo.\n */\nimport { cn } from '../../../lib/utils';\nimport { ThemeScopeHostProvider, useThemeScopeHost } from '../../../lib/theme-scope';\n\nimport { Stack } from '../../base/structure';\nimport { Container, PageViewport } from '../containers';\nimport { headerInlineDividerAlignment } from '../header/header.recipes';\nimport {ShellRegionGrid} from './shell-regions';\n\nimport type {\n\tStackedLayoutProps,\n\tTopbarSidebarLayoutStyle,\n} from './app-shell.types';\n\n/** Same token-scope trick as `TopbarSidebarLayout` — see its note. Omitted, the header follows the active theme. */\nconst HEADER_THEME_CLASS: Record<NonNullable<StackedLayoutProps['headerTheme']>, string> = {\n\tlight: 'light',\n\tdark: 'dark',\n};\n\nexport function StackedLayout({\n\tchildren,\n\theaderTheme,\n\tcontentWidth = 'contained',\n\theaderHeight, asideWidth, asideClassName,\n\tlogo,\n\tnav,\n\tslots,\n\tcontentAs: Content = 'main',\n\tclassName,\n\theaderClassName,\n\tsubheaderClassName,\n\tcontentClassName,\n\tstyle,\n\t...props\n}: StackedLayoutProps) {\n\tconst shellStyle = {\n\t\t...(headerHeight ? { '--shell-header-height': headerHeight } : null),\n\t\t...style,\n\t} as TopbarSidebarLayoutStyle;\n\n\tconst headerScope = useThemeScopeHost<HTMLElement>();\n\tconst resolvedLogo = slots?.logo ?? logo;\n\tconst resolvedNav = slots?.nav ?? nav;\n\tconst resolvedContent = slots?.content ?? children;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'stacked-layout--component @container/stacked-shell box-border isolate flex min-h-svh min-w-0 w-full flex-col bg-background font-sans text-foreground',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={shellStyle}\n\t\t\tdata-header-theme={headerTheme ?? 'inherit'}\n\t\t\tdata-content-width={contentWidth}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ThemeScopeHostProvider value={headerScope.context}>\n\t\t\t<header\n\t\t\t\tref={headerScope.attachHost}\n\t\t\t\tdata-theme-scope=\"\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'stacked-layout--header box-border z-40 flex shrink-0 items-center border-b border-border bg-background px-surface py-space-sm text-foreground @5xl/stacked-shell:min-h-shell-header @5xl/stacked-shell:py-0',\n\t\t\t\t\theaderInlineDividerAlignment,\n\t\t\t\t\theaderTheme && HEADER_THEME_CLASS[headerTheme],\n\t\t\t\t\theaderClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<Stack\n\t\t\t\t\tdirection=\"horizontal\"\n\t\t\t\t\talign=\"center\"\n\t\t\t\t\tgap=\"lg\"\n\t\t\t\t\twrap\n\t\t\t\t\t// The shell width owns header adaptation, including narrow parents\n\t\t\t\t\t// on wide viewports. Children keep their identity across both flows.\n\t\t\t\t\tclassName=\"stacked-layout--header-inner min-h-action w-full min-w-0 @5xl/stacked-shell:flex-nowrap @5xl/stacked-shell:gap-space-2xl\"\n\t\t\t\t>\n\t\t\t\t\t{slots?.header ?? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{!!resolvedLogo && (\n\t\t\t\t\t\t\t\t<div className=\"stacked-layout--logo flex min-w-0 shrink-0 items-center @5xl/stacked-shell:order-1\">\n\t\t\t\t\t\t\t\t\t{resolvedLogo}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!!resolvedNav && (\n\t\t\t\t\t\t\t\t// This shell has no sidebar, so hiding the nav in narrow shells left\n\t\t\t\t\t\t\t\t// the app with no navigation at all — logo and account menu\n\t\t\t\t\t\t\t\t// only. Instead it drops to its own full-width row and scrolls\n\t\t\t\t\t\t\t\t// horizontally, and returns inline when its parent is wide enough.\n\t\t\t\t\t\t\t\t//\n\t\t\t\t\t\t\t\t// Rendered once, not duplicated per breakpoint: a second copy\n\t\t\t\t\t\t\t\t// would put every nav link in the accessibility tree twice.\n\t\t\t\t\t\t\t\t//\n\t\t\t\t\t\t\t\t// Keep navigation intrinsic and single-line inside its scroller.\n\t\t\t\t\t\t\t\t// The shared inset reserves room for outer focus rings on every side.\n\t\t\t\t\t\t\t\t<nav\n\t\t\t\t\t\t\t\t\tonFocusCapture={(event) => {\n\t\t\t\t\t\t\t\t\t\t// Native focus can leave a partially visible action clipped.\n\t\t\t\t\t\t\t\t\t\t// Reveal only within this horizontal owner; preserve page scroll.\n\t\t\t\t\t\t\t\t\t\tconst nav = event.currentTarget;\n\t\t\t\t\t\t\t\t\t\t// React portal focus bubbles through its logical nav ancestry.\n\t\t\t\t\t\t\t\t\t\tif (!nav.contains(event.target)) return;\n\t\t\t\t\t\t\t\t\t\tconst viewport = nav.getBoundingClientRect();\n\t\t\t\t\t\t\t\t\t\tconst action = event.target.getBoundingClientRect();\n\t\t\t\t\t\t\t\t\t\tconst insets = getComputedStyle(nav);\n\t\t\t\t\t\t\t\t\t\tconst left = viewport.left + (parseFloat(insets.paddingLeft) || 0);\n\t\t\t\t\t\t\t\t\t\tconst right = viewport.right - (parseFloat(insets.paddingRight) || 0);\n\t\t\t\t\t\t\t\t\t\tif (action.left < left) nav.scrollLeft += action.left - left;\n\t\t\t\t\t\t\t\t\t\telse if (action.right > right) nav.scrollLeft += action.right - right;\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tclassName=\"stacked-layout--nav order-last flex w-full min-w-0 flex-nowrap items-center overflow-x-auto p-space-sm @5xl/stacked-shell:order-2 @5xl/stacked-shell:w-auto @5xl/stacked-shell:flex-1 [&>*]:shrink-0 [&>*]:flex-nowrap\">\n\t\t\t\t\t\t\t\t\t{resolvedNav}\n\t\t\t\t\t\t\t\t</nav>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!!slots?.headerEnd && (\n\t\t\t\t\t\t\t\t<div className=\"stacked-layout--header-end ms-auto flex min-w-0 max-w-full flex-wrap items-center justify-end gap-space-sm @5xl/stacked-shell:order-3 @5xl/stacked-shell:gap-space-md [&>*]:max-w-full\">\n\t\t\t\t\t\t\t\t\t{slots.headerEnd}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t</header>\n\t\t\t</ThemeScopeHostProvider>\n\n\t\t\t{!!slots?.subheader && (\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'stacked-layout--subheader shrink-0 border-b border-border bg-background px-surface',\n\t\t\t\t\t\tsubheaderClassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{slots.subheader}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<ShellRegionGrid aside={slots?.aside} asideWidth={asideWidth} asideClassName={cn('stacked-layout--aside min-h-0 min-w-0 overflow-hidden text-sidebar-foreground',asideClassName)}>\n\t\t\t<PageViewport\n\t\t\t\trender={<Content />}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'stacked-layout--content bg-background',\n\t\t\t\t\tcontentClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{contentWidth === 'contained' ? (\n\t\t\t\t\t<Container maxWidth=\"2xl\" gutter=\"lg\" className=\"stacked-layout--measure\">\n\t\t\t\t\t\t{resolvedContent}\n\t\t\t\t\t</Container>\n\t\t\t\t) : (\n\t\t\t\t\tresolvedContent\n\t\t\t\t)}\n\t\t\t</PageViewport>\n\t\t\t</ShellRegionGrid>\n\t\t</div>\n\t);\n}\n","import { cn } from '../../../lib/utils';\nimport { SidebarInsetLayout } from './sidebar-inset-layout';\nimport { StackedLayout } from './stacked-layout';\nimport { TopbarSidebarLayout } from './topbar-sidebar-layout';\nimport type { SidebarInsetLayoutProps, StackedLayoutProps, TopbarSidebarLayoutProps } from './app-shell.types';\n\n/** Presets select chrome; each underlying shell retains its own typed slots and behavior. */\nexport type AppLayoutProps =\n | (Omit<TopbarSidebarLayoutProps, 'headerTheme'> & {variant?: 'light-header' | 'dark-header'})\n | (Omit<SidebarInsetLayoutProps, 'surface'> & {variant: 'sidebar' | 'inset'})\n | (StackedLayoutProps & {variant: 'stacked'});\n\nexport type AppLayoutVariant = NonNullable<AppLayoutProps['variant']>;\n\n/** Five ready compositions using three shell owners, with one page viewport. */\nexport function AppLayout(props: AppLayoutProps) {\n const presentation = {'data-app-layout': props.variant ?? 'light-header', className: cn('app-layout--component', props.className)};\n switch (props.variant) {\n case 'stacked': {\n const {variant: _variant, ...shell} = props;\n return <StackedLayout {...shell} {...presentation} />;\n }\n case 'sidebar':\n case 'inset': {\n const {variant, ...shell} = props;\n return <SidebarInsetLayout {...shell} {...presentation} surface={variant === 'sidebar' ? 'flush' : 'inset'} />;\n }\n default: {\n // An omitted variant keeps the header on the active theme; light/dark scope it on request.\n const {variant, ...shell} = props;\n return <TopbarSidebarLayout {...shell} {...presentation} headerTheme={variant === 'dark-header' ? 'dark' : variant === 'light-header' ? 'light' : undefined} />;\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useStrings as e } from "./lib/strings.js";
|
|
3
|
-
import { t } from "./utils-
|
|
4
|
-
import { n } from "./buttons-
|
|
5
|
-
import { c as r } from "./typography-
|
|
3
|
+
import { t } from "./utils-DhuoqFy4.js";
|
|
4
|
+
import { n } from "./buttons-DeW0bQeK.js";
|
|
5
|
+
import { c as r } from "./typography-C7-YMW1S.js";
|
|
6
6
|
import { t as i } from "./focus-recipes-B653VaLq.js";
|
|
7
|
-
import { t as a } from "./progress-
|
|
8
|
-
import { t as o } from "./interaction-recipes-
|
|
9
|
-
import { i as s } from "./primitives-
|
|
10
|
-
import { c, i as l, n as u, r as d, t as f, u as p } from "./item-
|
|
7
|
+
import { t as a } from "./progress-DZFXXzPs.js";
|
|
8
|
+
import { t as o } from "./interaction-recipes-4wZ2tvfb.js";
|
|
9
|
+
import { i as s } from "./primitives-BkkQjYl7.js";
|
|
10
|
+
import { c, i as l, n as u, r as d, t as f, u as p } from "./item-FfWnaYST.js";
|
|
11
11
|
import { forwardRef as m } from "react";
|
|
12
12
|
import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
13
13
|
import { Archive as v, AudioLines as y, Download as b, Eye as x, FileCode as S, FileText as C, ImageIcon as w, Video as T, X as E } from "lucide-react";
|
|
@@ -243,4 +243,4 @@ R.displayName = "Attachment";
|
|
|
243
243
|
//#endregion
|
|
244
244
|
export { j as a, P as c, F as i, A as l, I as n, M as o, N as r, L as s, R as t, O as u };
|
|
245
245
|
|
|
246
|
-
//# sourceMappingURL=attachment-
|
|
246
|
+
//# sourceMappingURL=attachment-BCpA4e7i.js.map
|