themelia-react-ui 2.0.0 → 2.0.1
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 +351 -0
- package/README.md +26 -13
- package/dist/{accordion-CQXVcd7Q.js → accordion-B6a3vVgA.js} +84 -82
- package/dist/accordion-B6a3vVgA.js.map +1 -0
- package/dist/action-menu-TzCoSlwL.js +280 -0
- package/dist/action-menu-TzCoSlwL.js.map +1 -0
- package/dist/{affordance-geometry.generated-CCIXb2A1.js → affordance-geometry.generated-B5iu-Mkr.js} +3 -2
- package/dist/affordance-geometry.generated-B5iu-Mkr.js.map +1 -0
- package/dist/{ai-artifact-2PQ2fItc.js → ai-artifact-BMJdv-6q.js} +379 -376
- package/dist/ai-artifact-BMJdv-6q.js.map +1 -0
- package/dist/{app-shell-BE_j8-AT.js → app-shell-ZK5RWdo6.js} +4 -4
- package/dist/{app-shell-BE_j8-AT.js.map → app-shell-ZK5RWdo6.js.map} +1 -1
- package/dist/attachment-BtfhGm8i.js +245 -0
- package/dist/attachment-BtfhGm8i.js.map +1 -0
- package/dist/{auth-M3vGMgDR.js → auth-CYxKfo69.js} +237 -235
- package/dist/auth-CYxKfo69.js.map +1 -0
- package/dist/{avatar-djdaaQ_s.js → avatar-BBnEJIx8.js} +66 -65
- package/dist/avatar-BBnEJIx8.js.map +1 -0
- package/dist/badge-MrKVNzW9.js +93 -0
- package/dist/badge-MrKVNzW9.js.map +1 -0
- 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 +3 -0
- package/dist/base/buttons.js +2 -3
- package/dist/base/cards.js +2 -2
- package/dist/base/carousel.js +13 -13
- package/dist/base/carousel.js.map +1 -1
- package/dist/base/cascader.js +103 -115
- package/dist/base/cascader.js.map +1 -1
- package/dist/base/chart.js +1 -1
- package/dist/base/choice-inputs.js +3 -3
- 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 +7 -7
- package/dist/base/feedback.js +3 -3
- package/dist/base/forms-numeric.js +1 -1
- package/dist/base/forms.js +2 -2
- package/dist/base/inline-edit.js +17 -17
- package/dist/base/inline-edit.js.map +1 -1
- package/dist/base/item.js +1 -1
- package/dist/base/media-gallery.js +1 -1
- package/dist/base/metadata-list.js +3 -0
- package/dist/base/navigation.js +7 -7
- 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 +171 -170
- package/dist/base/repeaters.js.map +1 -1
- package/dist/base/sheet.js +1 -1
- package/dist/base/sidebar.js +1 -1
- package/dist/base/signature-pad.js +147 -137
- package/dist/base/signature-pad.js.map +1 -1
- package/dist/base/skeleton.js +1 -1
- package/dist/base/spinner.js +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 +2 -2
- 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 +2 -2
- package/dist/batch-action-bar-BZGDG-Si.js +104 -0
- package/dist/batch-action-bar-BZGDG-Si.js.map +1 -0
- package/dist/blocks/admin.js +173 -171
- package/dist/blocks/admin.js.map +1 -1
- package/dist/blocks/ai.js +266 -263
- package/dist/blocks/ai.js.map +1 -1
- package/dist/blocks/analytics/usage-card.js +1 -1
- package/dist/blocks/analytics.js +440 -438
- 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 +1945 -1266
- package/dist/blocks/commerce.js.map +1 -1
- package/dist/blocks/data-display.js +3 -2
- package/dist/blocks/onboarding.js +50 -49
- package/dist/blocks/onboarding.js.map +1 -1
- package/dist/blocks/planning.js +25 -25
- package/dist/blocks/planning.js.map +1 -1
- package/dist/blocks/timelines.js +1 -1
- package/dist/breadcrumbs-D5t7I023.js +129 -0
- package/dist/breadcrumbs-D5t7I023.js.map +1 -0
- package/dist/{button-R9CCoH7A.js → button-QYwiyhD2.js} +15 -14
- package/dist/button-QYwiyhD2.js.map +1 -0
- package/dist/{button-BS3KDg00.js → buttons-SbIcm1HJ.js} +200 -213
- package/dist/buttons-SbIcm1HJ.js.map +1 -0
- package/dist/{cards-QoJ4syG9.js → cards-CiiHpKYd.js} +8 -8
- package/dist/cards-CiiHpKYd.js.map +1 -0
- package/dist/{chart-DwYRKKc-.js → chart-QfrARkXl.js} +5 -5
- package/dist/{chart-DwYRKKc-.js.map → chart-QfrARkXl.js.map} +1 -1
- package/dist/checkbox-DhB6K0bK.js +36 -0
- package/dist/checkbox-DhB6K0bK.js.map +1 -0
- package/dist/choice-inputs-t6w3ATNz.js +766 -0
- package/dist/choice-inputs-t6w3ATNz.js.map +1 -0
- package/dist/code-block-Dgbu-CU3.js +185 -0
- package/dist/code-block-Dgbu-CU3.js.map +1 -0
- package/dist/{collapsible-oMUGM4tr.js → collapsible-D8AEGU1-.js} +4 -4
- package/dist/{collapsible-oMUGM4tr.js.map → collapsible-D8AEGU1-.js.map} +1 -1
- package/dist/{collection-content-Ys-OZOkY.js → collection-content-uK16Grv0.js} +3 -3
- package/dist/{collection-content-Ys-OZOkY.js.map → collection-content-uK16Grv0.js.map} +1 -1
- package/dist/{combobox-6dvVny2q.js → combobox-2Ic8N9bL.js} +74 -68
- package/dist/combobox-2Ic8N9bL.js.map +1 -0
- package/dist/{combobox-CB7039j7.js → combobox-DLl0bfiq.js} +307 -305
- package/dist/combobox-DLl0bfiq.js.map +1 -0
- package/dist/{command-kPMPjIxJ.js → command-kNR20o7x.js} +7 -7
- package/dist/{command-kPMPjIxJ.js.map → command-kNR20o7x.js.map} +1 -1
- package/dist/{comments-You0Bzbr.js → comments-BpDuCUUu.js} +341 -339
- package/dist/comments-BpDuCUUu.js.map +1 -0
- package/dist/components/base/action-menu/action-menu.d.ts +21 -4
- package/dist/components/base/action-menu/action-menu.recipes.d.ts +21 -0
- package/dist/components/base/action-menu/index.d.ts +1 -0
- package/dist/components/base/badge/badge.recipes.d.ts +4 -4
- package/dist/components/base/batch-action-bar/batch-action-bar.d.ts +50 -0
- package/dist/components/base/batch-action-bar/batch-action-bar.strings.d.ts +20 -0
- package/dist/components/base/batch-action-bar/index.d.ts +8 -0
- package/dist/components/base/buttons/button-group.recipes.d.ts +1 -1
- package/dist/components/base/buttons/button.recipes.d.ts +2 -2
- package/dist/components/base/choice-inputs/checkbox.d.ts +2 -2
- package/dist/components/base/choice-inputs/choice-types.d.ts +18 -6
- package/dist/components/base/display/alert-dialog.d.ts +6 -5
- package/dist/components/base/display/dialog.d.ts +4 -8
- package/dist/components/base/display/icon-badge/icon-badge.d.ts +1 -1
- package/dist/components/base/forms/form-sizing.d.ts +15 -12
- package/dist/components/base/metadata-list/index.d.ts +12 -0
- package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-list.d.ts +28 -25
- package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-value.d.ts +2 -2
- package/dist/components/base/navigation/index.d.ts +1 -1
- package/dist/components/base/navigation/page-header/index.d.ts +1 -0
- package/dist/components/base/navigation/page-header/page-header-commands.d.ts +73 -0
- package/dist/components/base/navigation/page-header/page-header.d.ts +26 -3
- package/dist/components/base/sheet/sheet.d.ts +4 -8
- package/dist/components/base/signature-pad/signature-pad.types.d.ts +5 -1
- package/dist/components/base/signature-pad/signature-pad.utils.d.ts +11 -3
- package/dist/components/base/text-inputs/field-clear-button.d.ts +6 -0
- package/dist/components/base/upload/upload.recipes.d.ts +25 -3
- package/dist/components/base/value-inputs/index.d.ts +5 -5
- package/dist/components/base/value-inputs/tags-input.d.ts +36 -12
- package/dist/components/blocks/commerce/address-card/address-card.d.ts +1 -1
- package/dist/components/blocks/commerce/address-card/types.d.ts +2 -1
- package/dist/components/blocks/commerce/cart-summary/cart-summary.d.ts +3 -1
- package/dist/components/blocks/commerce/cart-summary/index.d.ts +2 -2
- package/dist/components/blocks/commerce/cart-summary/types.d.ts +6 -1
- package/dist/components/blocks/commerce/discount-stack/discount-stack.d.ts +3 -1
- package/dist/components/blocks/commerce/discount-stack/index.d.ts +2 -2
- package/dist/components/blocks/commerce/discount-stack/types.d.ts +16 -4
- package/dist/components/blocks/commerce/fulfillment-group/fulfillment-group.d.ts +5 -0
- package/dist/components/blocks/commerce/fulfillment-group/index.d.ts +2 -0
- package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +43 -0
- package/dist/components/blocks/commerce/index.d.ts +13 -5
- package/dist/components/blocks/commerce/invoice-header/invoice-header.d.ts +1 -1
- package/dist/components/blocks/commerce/invoice-header/types.d.ts +4 -2
- package/dist/components/blocks/commerce/invoice-mini/invoice-mini.d.ts +1 -1
- package/dist/components/blocks/commerce/invoice-mini/types.d.ts +2 -1
- package/dist/components/blocks/commerce/order-customer/index.d.ts +2 -0
- package/dist/components/blocks/commerce/order-customer/order-customer.d.ts +5 -0
- package/dist/components/blocks/commerce/order-customer/types.d.ts +48 -0
- package/dist/components/blocks/commerce/order-header/index.d.ts +2 -0
- package/dist/components/blocks/commerce/order-header/order-header.d.ts +5 -0
- package/dist/components/blocks/commerce/order-header/types.d.ts +37 -0
- package/dist/components/blocks/commerce/order-line-item/index.d.ts +2 -0
- package/dist/components/blocks/commerce/order-line-item/order-line-item.d.ts +5 -0
- package/dist/components/blocks/commerce/order-line-item/types.d.ts +46 -0
- package/dist/components/blocks/commerce/order-summary/index.d.ts +2 -0
- package/dist/components/blocks/commerce/order-summary/order-summary.d.ts +5 -0
- package/dist/components/blocks/commerce/order-summary/types.d.ts +42 -0
- package/dist/components/blocks/commerce/order-transactions/index.d.ts +2 -0
- package/dist/components/blocks/commerce/order-transactions/order-transactions.d.ts +5 -0
- package/dist/components/blocks/commerce/order-transactions/types.d.ts +46 -0
- package/dist/components/blocks/commerce/payment-method/index.d.ts +2 -2
- package/dist/components/blocks/commerce/payment-method/payment-method.d.ts +9 -1
- package/dist/components/blocks/commerce/payment-method/types.d.ts +12 -1
- package/dist/components/blocks/commerce/refund-status/index.d.ts +2 -2
- package/dist/components/blocks/commerce/refund-status/refund-status.d.ts +3 -1
- package/dist/components/blocks/commerce/refund-status/types.d.ts +6 -3
- package/dist/components/blocks/commerce/shared/address-lines.d.ts +21 -0
- package/dist/components/blocks/commerce/shared/line-thumbnail.d.ts +9 -0
- package/dist/components/blocks/commerce/shared/order-status.d.ts +51 -0
- package/dist/components/blocks/commerce/shipment-tracking/shipment-tracking.d.ts +1 -1
- package/dist/components/blocks/commerce/shipment-tracking/types.d.ts +27 -6
- package/dist/components/blocks/commerce/summary-panel/amount-row.d.ts +2 -0
- package/dist/components/blocks/commerce/summary-panel/index.d.ts +3 -0
- package/dist/components/blocks/commerce/summary-panel/summary-panel.d.ts +2 -0
- package/dist/components/blocks/commerce/summary-panel/types.d.ts +26 -0
- package/dist/components/blocks/commerce/tax-breakdown/tax-breakdown.d.ts +1 -1
- package/dist/components/blocks/commerce/tax-breakdown/types.d.ts +2 -1
- package/dist/components/blocks/data-display/metadata/index.d.ts +30 -4
- package/dist/components/features/activities/partials/activity-row.d.ts +6 -2
- package/dist/components/features/activities/partials/tone-tokens.d.ts +0 -6
- package/dist/components/features/global-search/partials/global-search-group-heading.d.ts +15 -0
- package/dist/components/features/global-search/partials/tone-palettes.d.ts +0 -5
- package/dist/components/features/kanban/kanban.d.ts +1 -1
- package/dist/components/features/kanban/kanban.strings.d.ts +1 -1
- package/dist/components/features/kanban/kanban.types.d.ts +2 -2
- package/dist/components/features/media-library/hooks/use-media-library.d.ts +1 -1
- package/dist/components/features/media-library/index.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 +4 -0
- package/dist/components/features/media-library/media-library.types.d.ts +74 -1
- package/dist/components/features/media-library/partials/media-library-partials.d.ts +3 -3
- package/dist/components/features/mentions/partials/mention-kind-toggles.d.ts +16 -0
- package/dist/components/features/overlays/alert-dialog.d.ts +1 -1
- package/dist/components/features/overlays/dialog.d.ts +1 -1
- package/dist/components/features/overlays/index.d.ts +1 -1
- package/dist/components/features/overlays/overlay-tone-icon.d.ts +3 -3
- package/dist/components/features/overlays/overlays.types.d.ts +20 -0
- package/dist/components/features/products/components/product-contract-overview.d.ts +5 -0
- package/dist/components/features/products/components/product-details-card.d.ts +5 -0
- package/dist/components/features/products/components/product-operations-card.d.ts +5 -0
- package/dist/components/features/products/components/product-option-action-menu.d.ts +5 -0
- package/dist/components/features/products/components/product-options-summary.d.ts +5 -0
- package/dist/components/features/products/components/product-policies-card.d.ts +5 -0
- package/dist/components/features/products/components/product-quote-preview-card.d.ts +5 -0
- package/dist/components/features/products/components/product-readiness-card.d.ts +5 -0
- package/dist/components/features/products/components/product-structure-card.d.ts +5 -0
- package/dist/components/features/products/components/product-variant-action-menu.d.ts +23 -1
- package/dist/components/features/products/products.types.d.ts +9 -2
- package/dist/components/features/resource/index.d.ts +1 -1
- package/dist/components/features/resource/resource.d.ts +1 -1
- package/dist/components/features/resource/resource.types.d.ts +34 -6
- package/dist/components/features/rich-text-editor/index.d.ts +2 -1
- package/dist/components/features/rich-text-editor/partials/image-nodes.d.ts +13 -0
- package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +66 -0
- package/dist/components/features/rich-text-editor/partials/inline-reference-node.d.ts +19 -0
- 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.strings.d.ts +14 -0
- package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +45 -0
- package/dist/components/features/rich-text-editor/use-rich-text-images.d.ts +18 -0
- package/dist/components/features/sync/index.d.ts +26 -3
- package/dist/components/features/table/data-table.d.ts +1 -1
- package/dist/components/features/table/table.types.d.ts +32 -7
- package/dist/components/layout/page/index.d.ts +1 -1
- package/dist/components/layout/page/page.types.d.ts +33 -36
- package/dist/components/layout/page/partials/page-actions.d.ts +1 -0
- package/dist/components/layout/page/partials/page-header.d.ts +1 -1
- package/dist/components/layout/settings/settings.d.ts +16 -2
- package/dist/components/layout/workspace/workspace.types.d.ts +21 -4
- package/dist/components/typography/rich-text/index.d.ts +1 -1
- package/dist/components/typography/rich-text/rich-text-tree.d.ts +19 -0
- package/dist/components/typography/rich-text/rich-text.d.ts +16 -0
- package/dist/components/typography/text-link.d.ts +4 -3
- package/dist/components/ui/checkbox.d.ts +4 -3
- package/dist/components/ui/overlay.recipes.d.ts +0 -9
- package/dist/components/ui/switch.d.ts +2 -2
- package/dist/{containers-D_L4mTVb.js → containers-DmWiJa2I.js} +36 -35
- package/dist/containers-DmWiJa2I.js.map +1 -0
- package/dist/{copyable-DDjTeW_j.js → copyable-B3Gwgdqc.js} +6 -6
- package/dist/{copyable-DDjTeW_j.js.map → copyable-B3Gwgdqc.js.map} +1 -1
- package/dist/data-display-DafIvCl5.js +960 -0
- package/dist/data-display-DafIvCl5.js.map +1 -0
- package/dist/{date-uf3z37Nm.js → date-BgK3bTdo.js} +5 -5
- package/dist/{date-uf3z37Nm.js.map → date-BgK3bTdo.js.map} +1 -1
- package/dist/date-picker-CF-DtUpF.js +1529 -0
- package/dist/date-picker-CF-DtUpF.js.map +1 -0
- package/dist/{date-pickers-CnFCb0n2.js → date-pickers-BmzxJl5l.js} +19 -19
- package/dist/{date-pickers-CnFCb0n2.js.map → date-pickers-BmzxJl5l.js.map} +1 -1
- package/dist/{display-DrdvPwF0.js → display-DsQTVzMz.js} +88 -87
- package/dist/display-DsQTVzMz.js.map +1 -0
- package/dist/{dropdown-menu-CURh59jb.js → dropdown-menu-E2qmdC7o.js} +7 -7
- package/dist/{dropdown-menu-CURh59jb.js.map → dropdown-menu-E2qmdC7o.js.map} +1 -1
- package/dist/features/activities.js +414 -501
- package/dist/features/activities.js.map +1 -1
- package/dist/features/ai-chat.js +170 -169
- package/dist/features/ai-chat.js.map +1 -1
- package/dist/features/async-preview.js +8 -8
- package/dist/features/async-preview.js.map +1 -1
- package/dist/features/combobox.js +1 -1
- package/dist/features/comments.js +1 -1
- package/dist/features/data-view.js +139 -138
- package/dist/features/data-view.js.map +1 -1
- package/dist/features/email-composer/engine.js +1 -1
- package/dist/features/email-composer.js +73 -71
- package/dist/features/email-composer.js.map +1 -1
- package/dist/features/event-calendar.js +278 -275
- package/dist/features/event-calendar.js.map +1 -1
- package/dist/features/filters.js +1 -1
- package/dist/features/global-search.js +307 -310
- package/dist/features/global-search.js.map +1 -1
- package/dist/features/kanban.js +95 -97
- package/dist/features/kanban.js.map +1 -1
- package/dist/features/map.js +56 -57
- package/dist/features/map.js.map +1 -1
- package/dist/features/media-library.js +918 -825
- package/dist/features/media-library.js.map +1 -1
- package/dist/features/mentions.js +1 -1
- package/dist/features/overlays.js +1 -1
- package/dist/features/products.js +1115 -1122
- package/dist/features/products.js.map +1 -1
- package/dist/features/questionnaire.js +202 -194
- package/dist/features/questionnaire.js.map +1 -1
- package/dist/features/resource-assignment.js +25 -25
- package/dist/features/resource-assignment.js.map +1 -1
- package/dist/features/resource.js +77 -69
- package/dist/features/resource.js.map +1 -1
- package/dist/features/rich-text-editor.js +30 -11
- package/dist/features/rich-text-editor.js.map +1 -1
- package/dist/features/schema-form.js +33 -33
- package/dist/features/schema-form.js.map +1 -1
- package/dist/features/suggestions.js +3 -3
- package/dist/features/sync.js +3 -3
- package/dist/features/table.js +1 -1
- package/dist/features/theme-tweaker.js +397 -396
- package/dist/features/theme-tweaker.js.map +1 -1
- package/dist/{feedback-C7nR0UtT.js → feedback-qNuMBtRH.js} +84 -83
- package/dist/feedback-qNuMBtRH.js.map +1 -0
- package/dist/{field-affordance-recipes-CkOCdE2y.js → field-affordance-recipes-qQeIf4lG.js} +8 -6
- package/dist/field-affordance-recipes-qQeIf4lG.js.map +1 -0
- package/dist/field-state-recipes-BVA2CWHo.js +12 -0
- package/dist/field-state-recipes-BVA2CWHo.js.map +1 -0
- package/dist/{filters-Da-gNPsE.js → filters-BkHH53uv.js} +565 -563
- package/dist/filters-BkHH53uv.js.map +1 -0
- package/dist/focus-recipes-B653VaLq.js +12 -0
- package/dist/focus-recipes-B653VaLq.js.map +1 -0
- package/dist/{form-field-VZRULhUK.js → form-field-DUt4UxSV.js} +4 -4
- package/dist/{form-field-VZRULhUK.js.map → form-field-DUt4UxSV.js.map} +1 -1
- package/dist/{form-sizing-uWP4lzVh.js → form-sizing-By94KzXE.js} +19 -15
- package/dist/form-sizing-By94KzXE.js.map +1 -0
- package/dist/{forms-DDeEnXSY.js → forms-Bzha-Y3B.js} +22 -22
- package/dist/{forms-DDeEnXSY.js.map → forms-Bzha-Y3B.js.map} +1 -1
- package/dist/{forms-numeric-D3CO60IF.js → forms-numeric-C0bvjRPZ.js} +265 -264
- package/dist/forms-numeric-C0bvjRPZ.js.map +1 -0
- package/dist/{header-2ycNqGOR.js → header-BOefOKd1.js} +47 -51
- package/dist/header-BOefOKd1.js.map +1 -0
- package/dist/{hooks-DQ5SPwZw.js → hooks-9k_TtmKh.js} +2 -2
- package/dist/{hooks-DQ5SPwZw.js.map → hooks-9k_TtmKh.js.map} +1 -1
- package/dist/{http-CdEIHyQf.js → http-D_6rOnzU.js} +2 -2
- package/dist/{http-CdEIHyQf.js.map → http-D_6rOnzU.js.map} +1 -1
- package/dist/icon-badge-CAuKupo9.js +55 -0
- package/dist/icon-badge-CAuKupo9.js.map +1 -0
- package/dist/index.js +7 -7
- package/dist/input-DWhBBBww.js +262 -0
- package/dist/input-DWhBBBww.js.map +1 -0
- package/dist/{input-BoLm9Hks.js → input-Ddi_LSYv.js} +3 -3
- package/dist/{input-BoLm9Hks.js.map → input-Ddi_LSYv.js.map} +1 -1
- package/dist/interaction-recipes-CHr0dJUs.js +24 -0
- package/dist/interaction-recipes-CHr0dJUs.js.map +1 -0
- package/dist/{item-xzh8Df65.js → item-DEmDiTlD.js} +98 -97
- package/dist/item-DEmDiTlD.js.map +1 -0
- package/dist/layer-recipes-CCpklYME.js +13 -0
- package/dist/layer-recipes-CCpklYME.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 +10 -10
- package/dist/lib/affordance-geometry.generated.d.ts +1 -0
- package/dist/lib/field-affordance-recipes.d.ts +6 -1
- package/dist/lib/field-state-recipes.d.ts +9 -8
- package/dist/lib/focus-recipes.d.ts +24 -0
- package/dist/lib/interaction-recipes.d.ts +35 -0
- package/dist/lib/layer-recipes.d.ts +19 -0
- package/dist/lib/motion-recipes.d.ts +1 -0
- package/dist/lib/overlay-anatomy-recipes.d.ts +1 -0
- package/dist/lib/safe-image-src.d.ts +10 -0
- package/dist/lib/sanitize-html.d.ts +15 -3
- package/dist/lib/surface-recipes.d.ts +47 -7
- package/dist/lib/token-merge.generated.d.ts +9 -6
- package/dist/lib/tone-recipes.d.ts +79 -0
- package/dist/lib/ui-provider/hooks.d.ts +2 -1
- package/dist/lib/ui-provider/index.d.ts +2 -2
- package/dist/lib/ui-provider/types.d.ts +9 -0
- package/dist/lib/utils.js +1 -1
- package/dist/media-gallery-DcTtAaeC.js +203 -0
- package/dist/media-gallery-DcTtAaeC.js.map +1 -0
- package/dist/mentions-D-uyCh01.js +568 -0
- package/dist/mentions-D-uyCh01.js.map +1 -0
- package/dist/{message-YfFmbXNP.js → message-CdHgIWKf.js} +5 -5
- package/dist/{message-YfFmbXNP.js.map → message-CdHgIWKf.js.map} +1 -1
- package/dist/metadata-list-X5rYAKSB.js +394 -0
- package/dist/metadata-list-X5rYAKSB.js.map +1 -0
- package/dist/{motion-recipes-B6jKXEcN.js → motion-recipes-ChBg4HBq.js} +3 -2
- package/dist/{motion-recipes-B6jKXEcN.js.map → motion-recipes-ChBg4HBq.js.map} +1 -1
- package/dist/navigation-D3KwXmaq.js +145 -0
- package/dist/navigation-D3KwXmaq.js.map +1 -0
- package/dist/navigation-HJf5zxlH.js +268 -0
- package/dist/navigation-HJf5zxlH.js.map +1 -0
- package/dist/{navigation-row-recipes-DlU-4QYO.js → navigation-row-recipes-BVowojQw.js} +2 -2
- package/dist/{navigation-row-recipes-DlU-4QYO.js.map → navigation-row-recipes-BVowojQw.js.map} +1 -1
- package/dist/{number-CKRBYmZK.js → number-DMhe-Vsk.js} +5 -5
- package/dist/{number-CKRBYmZK.js.map → number-DMhe-Vsk.js.map} +1 -1
- package/dist/overflow-tab-bar-sQHXLlwQ.js +280 -0
- package/dist/overflow-tab-bar-sQHXLlwQ.js.map +1 -0
- package/dist/overlay.recipes-8GHqmlb4.js +6 -0
- package/dist/overlay.recipes-8GHqmlb4.js.map +1 -0
- package/dist/overlays-I0axtYA6.js +999 -0
- package/dist/overlays-I0axtYA6.js.map +1 -0
- package/dist/page-B5dTH9gE.js +224 -0
- package/dist/page-B5dTH9gE.js.map +1 -0
- package/dist/page-header-commands-DjzFEq3E.js +126 -0
- package/dist/page-header-commands-DjzFEq3E.js.map +1 -0
- package/dist/{pagination-Cm0jqa3I.js → pagination-3bPA_a6K.js} +15 -15
- package/dist/{pagination-Cm0jqa3I.js.map → pagination-3bPA_a6K.js.map} +1 -1
- package/dist/{popover-Dcv_9jxr.js → popover-Di55PyAI.js} +8 -8
- package/dist/popover-Di55PyAI.js.map +1 -0
- package/dist/{popover-menu-DnRFKnHP.js → popover-menu-B71Tn2Qz.js} +6 -6
- package/dist/{popover-menu-DnRFKnHP.js.map → popover-menu-B71Tn2Qz.js.map} +1 -1
- package/dist/{popover.recipes-wmbvL8Ah.js → popover.recipes-Bdyhj2db.js} +2 -2
- package/dist/{popover.recipes-wmbvL8Ah.js.map → popover.recipes-Bdyhj2db.js.map} +1 -1
- package/dist/{primitives-BHrwQXFC.js → primitives-B-CkiEMU.js} +5 -5
- package/dist/{primitives-BHrwQXFC.js.map → primitives-B-CkiEMU.js.map} +1 -1
- package/dist/primitives.js +4 -4
- package/dist/{progress-Br9WTFya.js → progress-rnS8-uAW.js} +9 -9
- package/dist/{progress-Br9WTFya.js.map → progress-rnS8-uAW.js.map} +1 -1
- package/dist/{receipt-CV89q1fs.js → receipt-D0oswZ0p.js} +6 -6
- package/dist/{receipt-CV89q1fs.js.map → receipt-D0oswZ0p.js.map} +1 -1
- package/dist/rich-text-DvGulsNJ.js +78 -0
- package/dist/rich-text-DvGulsNJ.js.map +1 -0
- package/dist/rich-text-editor-sMU_Scqm.js +1204 -0
- package/dist/rich-text-editor-sMU_Scqm.js.map +1 -0
- package/dist/rich-text-editor.recipes-CadiF_Uu.js +88 -0
- package/dist/rich-text-editor.recipes-CadiF_Uu.js.map +1 -0
- package/dist/rich-text-editor.strings-CB59ekH2.js +38 -0
- package/dist/rich-text-editor.strings-CB59ekH2.js.map +1 -0
- package/dist/safe-image-src-C6kQSMBZ.js +17 -0
- package/dist/safe-image-src-C6kQSMBZ.js.map +1 -0
- package/dist/sanitize-html-DsQmI48u.js +92 -0
- package/dist/sanitize-html-DsQmI48u.js.map +1 -0
- package/dist/scroll-area-Bt_vXY2b.js +48 -0
- package/dist/scroll-area-Bt_vXY2b.js.map +1 -0
- package/dist/{separator-Do5GWDYi.js → separator-C8DlRGwF.js} +3 -3
- package/dist/{separator-Do5GWDYi.js.map → separator-C8DlRGwF.js.map} +1 -1
- package/dist/{separator-BMEvwnSX.js → separator-CYHnjsAb.js} +2 -2
- package/dist/{separator-BMEvwnSX.js.map → separator-CYHnjsAb.js.map} +1 -1
- package/dist/services/actions/action-adapters.d.ts +18 -0
- package/dist/services/actions/index.d.ts +1 -1
- package/dist/services/actions.js +16 -4
- package/dist/services/actions.js.map +1 -1
- package/dist/settings-CQW3b-Cu.js +170 -0
- package/dist/settings-CQW3b-Cu.js.map +1 -0
- package/dist/sheet-4SEvVYzA.js +210 -0
- package/dist/sheet-4SEvVYzA.js.map +1 -0
- package/dist/{sidebar-Crc9M9JV.js → sidebar-C7WWR29L.js} +180 -179
- package/dist/sidebar-C7WWR29L.js.map +1 -0
- package/dist/{sidebar-Cb8WzOvE.js → sidebar-d7Dg80ln.js} +16 -16
- package/dist/sidebar-d7Dg80ln.js.map +1 -0
- package/dist/{skeleton-DVMXr15h.js → skeleton-Cz890JZF.js} +9 -9
- package/dist/{skeleton-DVMXr15h.js.map → skeleton-Cz890JZF.js.map} +1 -1
- package/dist/smart-card-lFKxn5Hu.js +595 -0
- package/dist/smart-card-lFKxn5Hu.js.map +1 -0
- package/dist/{spinner-CmTAbEp0.js → spinner-fa3h1Aif.js} +7 -7
- package/dist/{spinner-CmTAbEp0.js.map → spinner-fa3h1Aif.js.map} +1 -1
- package/dist/{structure-hzCW-XsV.js → structure-DC2dygdA.js} +2 -2
- package/dist/{structure-hzCW-XsV.js.map → structure-DC2dygdA.js.map} +1 -1
- package/dist/style.css +1 -1
- package/dist/surface-recipes-BKRVW8Os.js +43 -0
- package/dist/surface-recipes-BKRVW8Os.js.map +1 -0
- package/dist/{table-D6zKeYQX.js → table-CIKyLUsy.js} +59 -58
- package/dist/table-CIKyLUsy.js.map +1 -0
- package/dist/table-CrcLN9Io.js +1458 -0
- package/dist/table-CrcLN9Io.js.map +1 -0
- package/dist/{tabs-Dk8E_knt.js → tabs-DwBJfjxX.js} +58 -57
- package/dist/tabs-DwBJfjxX.js.map +1 -0
- package/dist/{text-inputs-BFpku0Qd.js → text-inputs-aaK9wcDT.js} +74 -79
- package/dist/text-inputs-aaK9wcDT.js.map +1 -0
- package/dist/theme.css +3 -3
- package/dist/{timelines-CxuAFIc2.js → timelines-C_SBwHNP.js} +153 -150
- package/dist/timelines-C_SBwHNP.js.map +1 -0
- package/dist/tone-recipes-CPoExcTE.js +70 -0
- package/dist/tone-recipes-CPoExcTE.js.map +1 -0
- package/dist/tooltip-CsfgrfS7.js +111 -0
- package/dist/tooltip-CsfgrfS7.js.map +1 -0
- package/dist/{tree-BotPlyiD.js → tree-BiKhg8AY.js} +68 -66
- package/dist/tree-BiKhg8AY.js.map +1 -0
- package/dist/typography/rich-text.js +1 -1
- package/dist/typography-DTRkE9zL.js +117 -0
- package/dist/typography-DTRkE9zL.js.map +1 -0
- package/dist/typography.js +1 -1
- package/dist/{ui-provider-D2_TeLqw.js → ui-provider-1D_NSYzO.js} +11 -3
- package/dist/ui-provider-1D_NSYzO.js.map +1 -0
- package/dist/ui-provider.js +3 -3
- package/dist/{upload-B0WHW7ak.js → upload-BO8-CLN6.js} +209 -209
- package/dist/upload-BO8-CLN6.js.map +1 -0
- package/dist/{upload-queue-BHZ_wBfd.js → upload-queue-EOC8g1gf.js} +109 -111
- package/dist/upload-queue-EOC8g1gf.js.map +1 -0
- package/dist/upload.recipes-BbxTqrCT.js +61 -0
- package/dist/upload.recipes-BbxTqrCT.js.map +1 -0
- package/dist/{usage-card-U0YBLTNT.js → usage-card-obRaBskq.js} +46 -46
- package/dist/{usage-card-U0YBLTNT.js.map → usage-card-obRaBskq.js.map} +1 -1
- package/dist/{utils-Cospvlj1.js → utils-l5LpDw2z.js} +56 -24
- package/dist/utils-l5LpDw2z.js.map +1 -0
- package/dist/value-inputs-TAYMX111.js +947 -0
- package/dist/value-inputs-TAYMX111.js.map +1 -0
- package/dist/{value-typography-Deb3yQZg.js → value-typography-b8wpz1eX.js} +2 -2
- package/dist/{value-typography-Deb3yQZg.js.map → value-typography-b8wpz1eX.js.map} +1 -1
- package/dist/workspace-DH0v0KcB.js +407 -0
- package/dist/workspace-DH0v0KcB.js.map +1 -0
- package/docs/consumer-skill/SKILL.md +19 -20
- package/docs/consumer-skill/examples/app-layout.tsx +1 -1
- package/docs/consumer-skill/examples/composition.tsx +3 -3
- package/docs/consumer-skill/examples/detail.tsx +59 -12
- package/docs/consumer-skill/examples/edit.tsx +1 -1
- package/docs/consumer-skill/examples/receipt.tsx +2 -2
- package/docs/consumer-skill/examples/scoped-directory.tsx +1 -1
- package/docs/consumer-skill/examples/website.tsx +1 -1
- package/docs/consumer-skill/references/agents-md.md +33 -0
- package/docs/consumer-skill/references/analytics.md +1 -1
- package/docs/consumer-skill/references/composition.md +51 -8
- package/docs/consumer-skill/references/design-contract.md +12 -3
- package/docs/consumer-skill/references/installation.md +11 -1
- package/docs/consumer-skill/references/public-api.json +847 -447
- package/docs/consumer-skill/references/review.md +25 -5
- package/docs/consumer-skill/references/theming.md +8 -4
- package/docs/consumer-skill/references/tokens.json +1 -1
- package/docs/consumer-skill/references/workflows.md +29 -10
- package/docs/consumer-skill/scripts/composition-policy.mjs +41 -11
- package/docs/consumer-skill/scripts/surface-policy.mjs +139 -5
- package/package.json +10 -2
- package/dist/accordion-CQXVcd7Q.js.map +0 -1
- package/dist/action-menu-BTpyPWJ2.js +0 -264
- package/dist/action-menu-BTpyPWJ2.js.map +0 -1
- package/dist/affordance-geometry.generated-CCIXb2A1.js.map +0 -1
- package/dist/ai-artifact-2PQ2fItc.js.map +0 -1
- package/dist/attachment-q69dlt5Y.js +0 -244
- package/dist/attachment-q69dlt5Y.js.map +0 -1
- package/dist/auth-M3vGMgDR.js.map +0 -1
- package/dist/avatar-djdaaQ_s.js.map +0 -1
- package/dist/badge-0tATj-tW.js +0 -92
- package/dist/badge-0tATj-tW.js.map +0 -1
- package/dist/breadcrumbs-BG_FfMK4.js +0 -128
- package/dist/breadcrumbs-BG_FfMK4.js.map +0 -1
- package/dist/button-BS3KDg00.js.map +0 -1
- package/dist/button-R9CCoH7A.js.map +0 -1
- package/dist/buttons-DS0ZIwJ_.js +0 -99
- package/dist/buttons-DS0ZIwJ_.js.map +0 -1
- package/dist/cards-QoJ4syG9.js.map +0 -1
- package/dist/checkbox-B7ygNTYp.js +0 -35
- package/dist/checkbox-B7ygNTYp.js.map +0 -1
- package/dist/choice-inputs-DrJ17tpL.js +0 -752
- package/dist/choice-inputs-DrJ17tpL.js.map +0 -1
- package/dist/code-block-CD0B7M93.js +0 -183
- package/dist/code-block-CD0B7M93.js.map +0 -1
- package/dist/combobox-6dvVny2q.js.map +0 -1
- package/dist/combobox-CB7039j7.js.map +0 -1
- package/dist/comments-You0Bzbr.js.map +0 -1
- package/dist/components/layout/page/partials/page-header-commands.d.ts +0 -13
- package/dist/containers-D_L4mTVb.js.map +0 -1
- package/dist/data-display-3xWQUnMA.js +0 -1335
- package/dist/data-display-3xWQUnMA.js.map +0 -1
- package/dist/date-picker-DrDFj8Lo.js +0 -1527
- package/dist/date-picker-DrDFj8Lo.js.map +0 -1
- package/dist/display-DrdvPwF0.js.map +0 -1
- package/dist/feedback-C7nR0UtT.js.map +0 -1
- package/dist/field-affordance-recipes-CkOCdE2y.js.map +0 -1
- package/dist/field-state-recipes-C-MFBX_8.js +0 -11
- package/dist/field-state-recipes-C-MFBX_8.js.map +0 -1
- package/dist/filters-Da-gNPsE.js.map +0 -1
- package/dist/form-sizing-uWP4lzVh.js.map +0 -1
- package/dist/forms-numeric-D3CO60IF.js.map +0 -1
- package/dist/header-2ycNqGOR.js.map +0 -1
- package/dist/icon-badge-DKlaKXoo.js +0 -53
- package/dist/icon-badge-DKlaKXoo.js.map +0 -1
- package/dist/input-DhQdBnV3.js +0 -255
- package/dist/input-DhQdBnV3.js.map +0 -1
- package/dist/item-xzh8Df65.js.map +0 -1
- package/dist/media-gallery-DQUQ0m3O.js +0 -201
- package/dist/media-gallery-DQUQ0m3O.js.map +0 -1
- package/dist/mentions-DwnO1hh4.js +0 -564
- package/dist/mentions-DwnO1hh4.js.map +0 -1
- package/dist/navigation-Cbp5V8gG.js +0 -264
- package/dist/navigation-Cbp5V8gG.js.map +0 -1
- package/dist/navigation-Cs1npsPm.js +0 -300
- package/dist/navigation-Cs1npsPm.js.map +0 -1
- package/dist/overlay.recipes-CNO2S9V6.js +0 -34
- package/dist/overlay.recipes-CNO2S9V6.js.map +0 -1
- package/dist/overlays-DhZO7N-I.js +0 -994
- package/dist/overlays-DhZO7N-I.js.map +0 -1
- package/dist/page-C6R_8jFt.js +0 -325
- package/dist/page-C6R_8jFt.js.map +0 -1
- package/dist/page-header-hUTzcRZX.js +0 -112
- package/dist/page-header-hUTzcRZX.js.map +0 -1
- package/dist/popover-Dcv_9jxr.js.map +0 -1
- package/dist/rich-text-editor-CF8QYt5p.js +0 -574
- package/dist/rich-text-editor-CF8QYt5p.js.map +0 -1
- package/dist/rich-text-editor.recipes-CnrbmTS1.js +0 -81
- package/dist/rich-text-editor.recipes-CnrbmTS1.js.map +0 -1
- package/dist/rich-text-editor.strings-BpnIQgMl.js +0 -25
- package/dist/rich-text-editor.strings-BpnIQgMl.js.map +0 -1
- package/dist/rich-text-j-FGAeZW.js +0 -32
- package/dist/rich-text-j-FGAeZW.js.map +0 -1
- package/dist/sanitize-html-BG9FGe-j.js +0 -64
- package/dist/sanitize-html-BG9FGe-j.js.map +0 -1
- package/dist/scroll-area-DRdr16Pt.js +0 -47
- package/dist/scroll-area-DRdr16Pt.js.map +0 -1
- package/dist/settings-DHk0L2MF.js +0 -161
- package/dist/settings-DHk0L2MF.js.map +0 -1
- package/dist/sheet-DRFNY1_D.js +0 -207
- package/dist/sheet-DRFNY1_D.js.map +0 -1
- package/dist/sidebar-Cb8WzOvE.js.map +0 -1
- package/dist/sidebar-Crc9M9JV.js.map +0 -1
- package/dist/smart-card-Bek-TwUp.js +0 -599
- package/dist/smart-card-Bek-TwUp.js.map +0 -1
- package/dist/surface-recipes-DOdoBXGm.js +0 -28
- package/dist/surface-recipes-DOdoBXGm.js.map +0 -1
- package/dist/table-D6zKeYQX.js.map +0 -1
- package/dist/table-Dn4XSrSB.js +0 -1444
- package/dist/table-Dn4XSrSB.js.map +0 -1
- package/dist/tabs-Dk8E_knt.js.map +0 -1
- package/dist/text-inputs-BFpku0Qd.js.map +0 -1
- package/dist/timelines-CxuAFIc2.js.map +0 -1
- package/dist/tree-BotPlyiD.js.map +0 -1
- package/dist/typography-CAr3dQhX.js +0 -116
- package/dist/typography-CAr3dQhX.js.map +0 -1
- package/dist/ui-provider-D2_TeLqw.js.map +0 -1
- package/dist/upload-B0WHW7ak.js.map +0 -1
- package/dist/upload-queue-BHZ_wBfd.js.map +0 -1
- package/dist/use-file-drop-target-BX7GnhoQ.js +0 -39
- package/dist/use-file-drop-target-BX7GnhoQ.js.map +0 -1
- package/dist/utils-Cospvlj1.js.map +0 -1
- package/dist/value-inputs-CjfzGMsN.js +0 -854
- package/dist/value-inputs-CjfzGMsN.js.map +0 -1
- package/dist/workspace-YoFjXi6i.js +0 -394
- package/dist/workspace-YoFjXi6i.js.map +0 -1
- /package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-list.strings.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activities.js","names":["_Fragment","_Fragment","useDatesConfig","cn","Text","TextLink","Button","Grid","Stack","ActionMenu","Badge","EmptyState","CommentComposer","CommentItem","useComments","MentionContent","Fragment$1","defaultEventConfig","CircleDot","defaultActivityEventConfig","Plus","Pencil","FileEdit","Trash2","Ban","Sparkles","ArrowLeftRight","UserPlus","UserMinus","Mail","MailCheck","MailOpen","MailX","MessageSquare","Check","ShieldCheck","Heart","ShoppingBag","Star","Flag","LinkIcon","AlertTriangle","resolveEventConfig","map","event","defaultActivitiesStrings","interpolate","template","v","params","key","match","defaultDateGroupLabel","iso","strings","date","isValid","isToday","isYesterday","locale","format","useActivityFeed","expandedMap","setExpandedMap","useState","isControlled","expandedIds","keyed","useMemo","seen","activities","keyBase","activity","occurrence","groups","groupByDate","out","currentLabel","currentItems","labelFor","formatDateGroupLabel","item","label","defaultExpandedSet","next","defaultExpandedIds","controlledExpandedSet","setExpanded","useCallback","currentIds","expandedByDefault","value","id","nextIds","current","onExpandedIdsChange","isExpanded","toggleExpanded","expandAll","k","collapseAll","useActivityResources","registry","setRegistry","resources","seedRef","useRef","onChangeRef","onResourcesChange","emit","register","config","update","existing","partial","remove","setAll","reset","ref","actionToneToMenuVariant","tone","ActivityActionsMenu","actions","menuActions","action","onAction","ChangeValue","hasOld","change","hasNew","ActivityChanges","changes","className","ActivityDateLabel","first","ActivityEmptyState","hint","Activity","ACTIVITY_TONE","TONE_TO_BADGE_TONE","ActivityResourceTag","palette","Icon","fallbackText","resource","interactive","onClick","inner","chipClass","ActorNode","display","currentUserId","actorId","youLabel","text","actor","href","onActorClick","renderSegments","segments","index","segment","Fragment","props","renderFallback","fallbackHeadline","actorName","before","after","ActivityHeadline","ActivityMarker","density","last","ActivityMetadataPreview","visible","metadata","hiddenCount","moreLabel","ActivityMetadataGrid","ActivityRow","eventConfig","hasChanges","hasMetadata","hasResources","hasDetails","hasCustomDetails","customDetails","hasDetailPanel","hasDescription","showSecondaryRow","showRichBody","panelIsCollapsible","detailsCollapsible","showDetailPanel","expanded","showMetadataPreview","inlineActions","headlineNode","headlineOverride","markerNode","markerOverride","markerClassName","onActivityClick","hasNestedInteractive","onResourceClick","keyboardInteractive","rowSpacing","contentPadding","itemSpacing","rowClassName","contentClassName","sourceLabel","relativeTime","absoluteTime","onExpandedChange","hideChangesLabel","showChangesLabel","jsx","ChevronDown","ChevronRight","actionsLabel","cfg","getResourceConfig","res","ActionIcon","detailsClassName","defaultFormatAbsolute","resolveRowClassName","resolveTone","eventTone","ActivityFeed","eventConfigOverride","stringsProp","_getEventLabel","useStrings","eventConfigMap","dates","resolvedLocale","feed","fmtRelative","formatRelativeTime","fmtAbsolute","formatAbsoluteTime","loading","slots","totalRendered","acc","g","renderedSoFar","isFirstGroup","gi","group","isFirstInGroup","ii","isLast","eventCfg","getSourceLabel","sourceLabelTrimmed","actionsForActivity","ctx","customRow","onActivityExpandedChange","rowClassNames","sortEntries","arr","entries","ta","a","tb","b","order","toActivityTone","toActor","hasRenderableNode","resolveEventClassName","entry","mapEventToActivity","description","ActivityLog","activityStringsProp","activityStrings","formatRelative","configuredFormatter","parsed","parseISO","formatDistanceToNow","composerState","composer","sorted","eventRowClassNames","classNames","composerBlock","composerPosition","eventDetailsCollapsible","source","eventEntry","onEventAction","actionId","onEventExpandedChange","custom","renderers","commentEntry","MessageCircle","onCommentDelete","onCommentPinToggle","onCommentReact","onCommentReply","renderEventDetails","bare","title","ariaLabel","defaultKind","record","kind","toActivityLogEntry","accessors","timestamp","comment","createActivityEventAdapter"],"sources":["../../src/components/features/activities/activities.config.ts","../../src/components/features/activities/activities.strings.ts","../../src/components/features/activities/hooks/use-activity-feed.ts","../../src/components/features/activities/hooks/use-activity-resources.ts","../../src/components/features/activities/partials/activity-actions-menu.tsx","../../src/components/features/activities/partials/activity-changes.tsx","../../src/components/features/activities/partials/activity-date-label.tsx","../../src/components/features/activities/partials/activity-empty-state.tsx","../../src/components/features/activities/partials/tone-tokens.ts","../../src/components/features/activities/partials/activity-resource-tag.tsx","../../src/components/features/activities/partials/activity-headline.tsx","../../src/components/features/activities/partials/activity-marker.tsx","../../src/components/features/activities/partials/activity-row.tsx","../../src/components/features/activities/activities-feed.tsx","../../src/components/features/activities/activity-log.tsx","../../src/components/features/activities/activity-event-adapter.ts"],"sourcesContent":["/**\n * Default per-event configuration. Consumers override individual events by\n * spreading this map and overwriting the keys they care about, e.g.:\n *\n * import { defaultActivityEventConfig } from '.';\n *\n * const eventConfig = {\n * ...defaultActivityEventConfig,\n * order_refunded: { icon: Receipt, tone: 'warning', label: 'Refunded' },\n * };\n *\n * The mass `eventConfig` prop on `<ActivityFeed />` is shallow-merged on top\n * of these defaults, so any unspecified event falls back to the library\n * default and ultimately to the neutral `defaultEvent` entry below.\n */\nimport {\n\tAlertTriangle,\n\tArrowLeftRight,\n\tBan,\n\tCheck,\n\tCircleDot,\n\tFileEdit,\n\tFlag,\n\tHeart,\n\tLinkIcon,\n\tMail,\n\tMailCheck,\n\tMailOpen,\n\tMailX,\n\tMessageSquare,\n\tPencil,\n\tPlus,\n\tShieldCheck,\n\tShoppingBag,\n\tSparkles,\n\tStar,\n\tTrash2,\n\tUserMinus,\n\tUserPlus,\n} from 'lucide-react';\n\nimport type { ActivityEventConfig, ActivityEventConfigMap } from './activities.types';\n\n/** Neutral fallback used when an event has no entry in the registry. */\nexport const defaultEventConfig: ActivityEventConfig = {\n\ticon: CircleDot,\n\ttone: 'neutral',\n};\n\nexport const defaultActivityEventConfig: ActivityEventConfigMap = {\n\t// Lifecycle\n\tcreated: { icon: Plus, tone: 'success', label: 'Created' },\n\tupdated: { icon: Pencil, tone: 'neutral', label: 'Updated' },\n\tedited: { icon: FileEdit, tone: 'neutral', label: 'Edited' },\n\tdeleted: { icon: Trash2, tone: 'destructive', label: 'Deleted' },\n\tcancelled: { icon: Ban, tone: 'destructive', label: 'Cancelled' },\n\trestored: { icon: Sparkles, tone: 'success', label: 'Restored' },\n\n\t// Status transitions\n\tstatus_changed: { icon: ArrowLeftRight, tone: 'neutral', label: 'Status changed' },\n\tstatus_transition: { icon: ArrowLeftRight, tone: 'neutral', label: 'Status changed' },\n\tstatus_override: { icon: ArrowLeftRight, tone: 'warning', label: 'Status overridden' },\n\n\t// People\n\tassigned: { icon: UserPlus, tone: 'neutral', label: 'Assigned' },\n\tunassigned: { icon: UserMinus, tone: 'neutral', label: 'Unassigned' },\n\n\t// Mail\n\tmail_sent: { icon: Mail, tone: 'neutral', label: 'Email sent' },\n\tmail_delivered: { icon: MailCheck, tone: 'success', label: 'Email delivered' },\n\tmail_opened: { icon: MailOpen, tone: 'neutral', label: 'Email opened' },\n\tmail_clicked: { icon: MailOpen, tone: 'neutral', label: 'Email clicked' },\n\tmail_bounced: { icon: MailX, tone: 'destructive', label: 'Email bounced' },\n\tmail_failed: { icon: MailX, tone: 'destructive', label: 'Email failed' },\n\n\t// Comments\n\tcomment_created: { icon: MessageSquare, tone: 'neutral', label: 'Comment posted' },\n\tcomment_deleted: { icon: MessageSquare, tone: 'destructive', label: 'Comment deleted' },\n\n\t// Commerce\n\tpaid: { icon: Check, tone: 'success', label: 'Paid' },\n\trefunded: { icon: ArrowLeftRight, tone: 'warning', label: 'Refunded' },\n\tconfirmed: { icon: ShieldCheck, tone: 'success', label: 'Confirmed' },\n\tfavorited: { icon: Heart, tone: 'neutral', label: 'Favorited' },\n\tordered: { icon: ShoppingBag, tone: 'neutral', label: 'Order placed' },\n\n\t// Publishing\n\tpublished: { icon: Star, tone: 'success', label: 'Published' },\n\tflagged: { icon: Flag, tone: 'warning', label: 'Flagged' },\n\tlinked: { icon: LinkIcon, tone: 'neutral', label: 'Linked' },\n\n\t// Failures\n\tfailed: { icon: AlertTriangle, tone: 'destructive', label: 'Failed' },\n\thealth_check_failed: { icon: AlertTriangle, tone: 'destructive', label: 'Health check failed' },\n};\n\n/** Resolve `eventConfig[event]` with override + default fallback. */\nexport function resolveEventConfig(\n\tevent: string,\n\tmap: ActivityEventConfigMap,\n): ActivityEventConfig {\n\treturn map[event] ?? defaultEventConfig;\n}\n","/**\n * Strings for the Activities feature. Consumers override via the `strings`\n * prop on `<ActivityFeed>` / `<ActivityLog>`. Values are deep-merged\n * over these defaults — `sources` and `events` merge one level deep so a\n * consumer can override a single source/event label without rewriting the\n * whole map.\n */\nexport interface ActivitiesStrings {\n\t/** Activity surface title — usually \"Activity\". */\n\ttitle: string;\n\t/** Empty-state copy. */\n\tempty: string;\n\t/** Loading-state copy. */\n\tloading: string;\n\t/** Date-group label for today. */\n\ttoday: string;\n\t/** Date-group label for yesterday. */\n\tyesterday: string;\n\t/** Fallback label for activities without a timestamp. */\n\tundated: string;\n\t/** Replacement for actor name when `actorId === currentUserId`. */\n\tyou: string;\n\t/** Detail toggle label — collapsed state. */\n\tshowChanges: string;\n\t/** Detail toggle label — expanded state. */\n\thideChanges: string;\n\t/** aria-label for the actions menu trigger. */\n\tactionsLabel: string;\n\t/** Generic \"more\" affordance label. */\n\tmoreLabel: string;\n\t/** Map of `source` → display label. */\n\tsources: Record<string, string>;\n\t/** Map of `event` → display label. Used as a fallback for headlines. */\n\tevents: Record<string, string>;\n}\n\nexport const defaultActivitiesStrings: ActivitiesStrings = {\n\ttitle: 'Activity',\n\tempty: 'No activity yet.',\n\tloading: 'Loading activity…',\n\ttoday: 'Today',\n\tyesterday: 'Yesterday',\n\tundated: 'Undated',\n\tyou: 'You',\n\tshowChanges: 'Show details',\n\thideChanges: 'Hide details',\n\tactionsLabel: 'Activity actions',\n\tmoreLabel: 'more',\n\tsources: {\n\t\tcomment: 'Comment',\n\t\tmail: 'Mail',\n\t\tbooking_log: 'Booking log',\n\t\tactivity_log: '',\n\t\tsystem: 'System',\n\t},\n\tevents: {},\n};\n\n/** Replace `{{key}}` tokens with values from `params`. */\nexport function interpolate(\n\ttemplate: string,\n\tparams: Record<string, string | number>,\n): string {\n\treturn template.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (match, key) => {\n\t\tconst v = params[key];\n\t\treturn v === undefined ? match : String(v);\n\t});\n}\n","/**\n * useActivityFeed — headless state machine for the Activities feature.\n *\n * Returns date-grouped activities with stable React keys, plus the expand /\n * collapse map for change-detail rows. Consumers wanting a fully custom UI\n * can call this hook directly and bypass `<ActivityFeed />`.\n */\nimport { format, isToday, isValid, isYesterday, type Locale } from 'date-fns';\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { ActivitiesStrings } from '../activities.strings';\nimport type { ActivityItem } from '../activities.types';\n\nexport interface ActivityKeyedItem<TData = unknown> {\n\tactivity: ActivityItem<TData>;\n\tkey: string;\n}\n\nexport interface ActivityDateGroup<TData = unknown> {\n\t/** Display label. */\n\tlabel: string;\n\titems: ActivityKeyedItem<TData>[];\n}\n\nexport interface UseActivityFeedOptions<TData = unknown> {\n\tactivities: ReadonlyArray<ActivityItem<TData>>;\n\tgroupByDate?: boolean;\n\texpandedByDefault?: boolean;\n\tdefaultExpandedIds?: ReadonlyArray<string>;\n\texpandedIds?: ReadonlyArray<string>;\n\tonExpandedIdsChange?: (ids: string[]) => void;\n\tlocale?: Locale;\n\t/** Overrides this surface's own copy. */\n\tstrings: ActivitiesStrings;\n\tformatDateGroupLabel?: (\n\t\tiso: string | null,\n\t\t/** Overrides this surface's own copy. */\n\t\tstrings: ActivitiesStrings,\n\t) => string;\n}\n\nexport interface UseActivityFeedReturn<TData = unknown> {\n\tgroups: ActivityDateGroup<TData>[];\n\t/** Total number of records across all pages. */\n\ttotal: number;\n\tisExpanded: (id: string) => boolean;\n\ttoggleExpanded: (id: string) => void;\n\tsetExpanded: (id: string, value: boolean) => void;\n\texpandAll: () => void;\n\tcollapseAll: () => void;\n}\n\nfunction defaultDateGroupLabel(\n\tiso: string | null,\n\tstrings: ActivitiesStrings,\n\tlocale?: Locale,\n): string {\n\tif (!iso) return strings.undated;\n\tconst date = new Date(iso);\n\tif (!isValid(date)) return strings.undated;\n\tif (isToday(date)) return strings.today;\n\tif (isYesterday(date)) return strings.yesterday;\n\ttry {\n\t\t// A sentence-style long date without an ordinal (\"September 24, 2026\"),\n\t\t// localized through the configured date-fns locale's code.\n\t\treturn new Intl.DateTimeFormat(locale?.code ?? 'en-US', { dateStyle: 'long' }).format(date);\n\t} catch {\n\t\ttry {\n\t\t\treturn format(date, 'PP', locale ? { locale } : undefined);\n\t\t} catch {\n\t\t\treturn iso;\n\t\t}\n\t}\n}\n\nexport function useActivityFeed<TData = unknown>({\n\tactivities,\n\tgroupByDate = true,\n\texpandedByDefault = false,\n\tdefaultExpandedIds,\n\texpandedIds,\n\tonExpandedIdsChange,\n\tlocale,\n\tstrings,\n\tformatDateGroupLabel,\n}: UseActivityFeedOptions<TData>): UseActivityFeedReturn<TData> {\n\tconst [expandedMap, setExpandedMap] = useState<Record<string, boolean>>({});\n\tconst isControlled = expandedIds !== undefined;\n\n\tconst keyed = useMemo<ActivityKeyedItem<TData>[]>(() => {\n\t\tconst seen = new Map<string, number>();\n\t\treturn activities.map((activity) => {\n\t\t\tconst baseId = String(activity.id ?? '').trim();\n\t\t\tconst createdAt = String(activity.createdAt ?? '').trim();\n\t\t\tconst event = String(activity.event ?? '').trim();\n\t\t\tconst source = String(activity.source ?? '').trim();\n\t\t\tconst keyBase = [baseId, createdAt, event, source].join(':');\n\t\t\tconst occurrence = (seen.get(keyBase) ?? 0) + 1;\n\t\t\tseen.set(keyBase, occurrence);\n\t\t\treturn { activity, key: `${keyBase}:${occurrence}` };\n\t\t});\n\t}, [activities]);\n\n\tconst groups = useMemo<ActivityDateGroup<TData>[]>(() => {\n\t\tif (!groupByDate) {\n\t\t\treturn keyed.length > 0 ? [{ label: '', items: keyed }] : [];\n\t\t}\n\t\tconst out: ActivityDateGroup<TData>[] = [];\n\t\tlet currentLabel = '__init__';\n\t\tlet currentItems: ActivityKeyedItem<TData>[] = [];\n\n\t\tconst labelFor = (iso: string | null) =>\n\t\t\tformatDateGroupLabel\n\t\t\t\t? formatDateGroupLabel(iso, strings)\n\t\t\t\t: defaultDateGroupLabel(iso, strings, locale);\n\n\t\tfor (const item of keyed) {\n\t\t\tconst iso = item.activity.createdAt ?? null;\n\t\t\tconst label = labelFor(iso);\n\t\t\tif (label !== currentLabel) {\n\t\t\t\tif (currentItems.length > 0) {\n\t\t\t\t\tout.push({ label: currentLabel, items: currentItems });\n\t\t\t\t}\n\t\t\t\tcurrentLabel = label;\n\t\t\t\tcurrentItems = [item];\n\t\t\t} else {\n\t\t\t\tcurrentItems.push(item);\n\t\t\t}\n\t\t}\n\t\tif (currentItems.length > 0) {\n\t\t\tout.push({ label: currentLabel, items: currentItems });\n\t\t}\n\t\treturn out;\n\t}, [keyed, groupByDate, locale, strings, formatDateGroupLabel]);\n\n\tconst defaultExpandedSet = useMemo(() => {\n\t\tconst next = new Set(defaultExpandedIds ?? []);\n\t\tfor (const item of keyed) {\n\t\t\tif (item.activity.defaultExpanded === true) {\n\t\t\t\tnext.add(item.activity.id);\n\t\t\t}\n\t\t}\n\t\treturn next;\n\t}, [keyed, defaultExpandedIds]);\n\n\tconst controlledExpandedSet = useMemo(\n\t\t() => new Set(expandedIds ?? []),\n\t\t[expandedIds],\n\t);\n\n\tconst setExpanded = useCallback((id: string, value: boolean) => {\n\t\tconst currentIds = isControlled\n\t\t\t? Array.from(controlledExpandedSet)\n\t\t\t: keyed\n\t\t\t\t\t.filter((item) =>\n\t\t\t\t\t\texpandedMap[item.activity.id] ??\n\t\t\t\t\t\t\t(defaultExpandedSet.has(item.activity.id) || expandedByDefault),\n\t\t\t\t\t)\n\t\t\t\t\t.map((item) => item.activity.id);\n\t\tconst next = new Set(currentIds);\n\t\tif (value) next.add(id);\n\t\telse next.delete(id);\n\t\tconst nextIds = Array.from(next);\n\t\tif (!isControlled) {\n\t\t\tsetExpandedMap((current) => ({ ...current, [id]: value }));\n\t\t}\n\t\tonExpandedIdsChange?.(nextIds);\n\t}, [\n\t\tcontrolledExpandedSet,\n\t\tdefaultExpandedSet,\n\t\texpandedByDefault,\n\t\texpandedMap,\n\t\tisControlled,\n\t\tkeyed,\n\t\tonExpandedIdsChange,\n\t]);\n\n\tconst isExpanded = useCallback(\n\t\t(id: string) => {\n\t\t\tif (isControlled) return controlledExpandedSet.has(id);\n\t\t\treturn expandedMap[id] ?? (defaultExpandedSet.has(id) || expandedByDefault);\n\t\t},\n\t\t[\n\t\t\tcontrolledExpandedSet,\n\t\t\tdefaultExpandedSet,\n\t\t\texpandedByDefault,\n\t\t\texpandedMap,\n\t\t\tisControlled,\n\t\t],\n\t);\n\n\tconst toggleExpanded = useCallback((id: string) => {\n\t\tsetExpanded(id, !isExpanded(id));\n\t}, [isExpanded, setExpanded]);\n\n\tconst expandAll = useCallback(() => {\n\t\tconst next: Record<string, boolean> = {};\n\t\tfor (const k of keyed) next[k.activity.id] = true;\n\t\tif (!isControlled) setExpandedMap(next);\n\t\tonExpandedIdsChange?.(keyed.map((k) => k.activity.id));\n\t}, [isControlled, keyed, onExpandedIdsChange]);\n\n\tconst collapseAll = useCallback(() => {\n\t\tconst next: Record<string, boolean> = {};\n\t\tfor (const k of keyed) next[k.activity.id] = false;\n\t\tif (!isControlled) setExpandedMap(next);\n\t\tonExpandedIdsChange?.([]);\n\t}, [isControlled, keyed, onExpandedIdsChange]);\n\n\treturn {\n\t\tgroups,\n\t\ttotal: keyed.length,\n\t\tisExpanded,\n\t\ttoggleExpanded,\n\t\tsetExpanded,\n\t\texpandAll,\n\t\tcollapseAll,\n\t};\n}\n","/**\n * useActivityResources — registry hook for the rich-resource feature.\n *\n * The registry maps `key → ActivityResourceConfig`. Activity items reference\n * resources by `key`; the row renderer looks up the live config so badges,\n * icons, and links can be edited globally without touching individual rows.\n *\n * The hook re-seeds whenever the `resources` prop reference changes and emits\n * the full registry on every mutation via `onResourcesChange`. Wire that\n * callback to localStorage / a backend mutation to persist the user's\n * resource customisations across sessions.\n */\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type {\n\tActivityResourceConfig,\n\tActivityResourceRef,\n} from '../activities.types';\n\nexport type ActivityResourceRegistry = Readonly<\n\tRecord<string, ActivityResourceConfig>\n>;\n\nexport interface UseActivityResourcesOptions {\n\tresources?: ActivityResourceRegistry;\n\tonResourcesChange?: (registry: ActivityResourceRegistry) => void;\n}\n\nexport interface UseActivityResourcesReturn {\n\tregistry: ActivityResourceRegistry;\n\t/** Look up a resource by ref or key. */\n\tget: (\n\t\tref: ActivityResourceRef | string,\n\t) => ActivityResourceConfig | undefined;\n\t/** Replace a resource entry wholesale (or insert new). */\n\tregister: (key: string, config: ActivityResourceConfig) => void;\n\t/** Shallow-merge a partial update over an existing entry. */\n\tupdate: (key: string, partial: Partial<ActivityResourceConfig>) => void;\n\t/** Remove an entry. */\n\tremove: (key: string) => void;\n\t/** Replace the entire registry. */\n\tsetAll: (registry: ActivityResourceRegistry) => void;\n\t/** Reset to the original `resources` prop (or empty if none). */\n\treset: () => void;\n}\n\nexport function useActivityResources({\n\tresources,\n\tonResourcesChange,\n}: UseActivityResourcesOptions = {}): UseActivityResourcesReturn {\n\tconst [registry, setRegistry] = useState<ActivityResourceRegistry>(\n\t\t() => resources ?? {},\n\t);\n\n\tconst seedRef = useRef(resources);\n\tuseEffect(() => {\n\t\tif (resources !== seedRef.current) {\n\t\t\tseedRef.current = resources;\n\t\t\tsetRegistry(resources ?? {});\n\t\t}\n\t}, [resources]);\n\n\tconst onChangeRef = useRef(onResourcesChange);\n\tuseEffect(() => {\n\t\tonChangeRef.current = onResourcesChange;\n\t}, [onResourcesChange]);\n\n\tconst emit = useCallback((next: ActivityResourceRegistry) => {\n\t\tonChangeRef.current?.(next);\n\t}, []);\n\n\tconst register = useCallback(\n\t\t(key: string, config: ActivityResourceConfig) => {\n\t\t\tsetRegistry((current) => {\n\t\t\t\tconst next = { ...current, [key]: config };\n\t\t\t\temit(next);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[emit],\n\t);\n\n\tconst update = useCallback(\n\t\t(key: string, partial: Partial<ActivityResourceConfig>) => {\n\t\t\tsetRegistry((current) => {\n\t\t\t\tconst existing = current[key];\n\t\t\t\tif (!existing) return current;\n\t\t\t\tconst next = {\n\t\t\t\t\t...current,\n\t\t\t\t\t[key]: { ...existing, ...partial },\n\t\t\t\t};\n\t\t\t\temit(next);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[emit],\n\t);\n\n\tconst remove = useCallback(\n\t\t(key: string) => {\n\t\t\tsetRegistry((current) => {\n\t\t\t\tif (!(key in current)) return current;\n\t\t\t\tconst next = { ...current };\n\t\t\t\tdelete next[key];\n\t\t\t\temit(next);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[emit],\n\t);\n\n\tconst setAll = useCallback(\n\t\t(next: ActivityResourceRegistry) => {\n\t\t\tsetRegistry(next);\n\t\t\temit(next);\n\t\t},\n\t\t[emit],\n\t);\n\n\tconst reset = useCallback(() => {\n\t\tconst next = seedRef.current ?? {};\n\t\tsetRegistry(next);\n\t\temit(next);\n\t}, [emit]);\n\n\tconst get = useCallback(\n\t\t(ref: ActivityResourceRef | string) => {\n\t\t\tconst key = typeof ref === 'string' ? ref : ref.key;\n\t\t\treturn registry[key];\n\t\t},\n\t\t[registry],\n\t);\n\n\treturn { registry, get, register, update, remove, setAll, reset };\n}\n","/**\n * ActivityActionsMenu — inline overflow menu rendered on rich rows.\n *\n * Backed by the shared ActionMenu surface; each item fires the activity's\n * per-row `onClick` and forwards `actionId` through `onAction` so consumers\n * can route actions centrally.\n */\nimport {\n\tActionMenu,\n\ttype ActionMenuAction,\n} from '../../../base/action-menu';\n\nimport type { ActivityAction, ActivityItem } from '../activities.types';\n\nexport interface ActivityActionsMenuProps<TData = unknown> {\n\t/** The feed entry this row renders. */\n\tactivity: ActivityItem<TData>;\n\t/** Overflow menu for the surface as a whole. */\n\tactions: readonly ActivityAction<TData>[];\n\tonAction?: (actionId: string, activity: ActivityItem<TData>) => void;\n\t/** Display label. */\n\tlabel: string;\n}\n\nfunction actionToneToMenuVariant(tone: ActivityAction['tone']) {\n\tif (tone === 'destructive') return 'destructive';\n\tif (tone === 'primary' || tone === 'secondary') return tone;\n\treturn undefined;\n}\n\nexport function ActivityActionsMenu<TData = unknown>({\n\tactivity,\n\tactions,\n\tonAction,\n\tlabel,\n}: ActivityActionsMenuProps<TData>) {\n\tif (actions.length === 0) return null;\n\tconst menuActions: ActionMenuAction[] = actions.map((action) => ({\n\t\tid: action.id,\n\t\ticon: action.icon,\n\t\tlabel: action.label,\n\t\thref: action.href,\n\t\tdisabled: action.disabled,\n\t\tvariant: actionToneToMenuVariant(action.tone),\n\t\tonClick: () => {\n\t\t\taction.onClick?.(activity);\n\t\t\tonAction?.(action.id, activity);\n\t\t},\n\t}));\n\n\treturn (\n\t\t<ActionMenu\n\t\t\tactions={menuActions}\n\t\t\tsrText={label}\n\t\t\talign=\"end\"\n\t\t\tdensity=\"table\"\n\t\t\tcloseOnSelect\n\t\t\tlabelVisibility=\"hidden\"\n\t\t\tbuttonProps={{\n\t\t\t\tsize: 'sm',\n\t\t\t\ticonOnly: true,\n\t\t\t\tclassName: 'activity-actions-menu--component size-action-sm text-muted-foreground',\n\t\t\t}}\n\t\t/>\n\t);\n}\n","/**\n * ActivityChanges — collapsible old → new diff block.\n *\n * Each entry shows the attribute label, the previous value (line-through, on\n * a destructive tint), an arrow, and the new value (on a success tint). When\n * neither old nor new is set, falls back to `description`.\n */\nimport { Stack } from '../../../base/structure';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport type { ActivityChange } from '../activities.types';\n\nexport interface ActivityChangesProps {\n\t/** Field changes recorded by this activity. */\n\tchanges: readonly ActivityChange[];\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nfunction ChangeValue({ change }: { change: ActivityChange }) {\n\tconst hasOld = change.old !== null && change.old !== undefined;\n\tconst hasNew = change.new !== null && change.new !== undefined;\n\n\tif (!hasOld && !hasNew) {\n\t\treturn (\n\t\t\t<Text tag=\"span\">\n\t\t\t\t{change.description}\n\t\t\t</Text>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Text tag=\"span\" className=\"inline-flex flex-wrap items-baseline gap-space-xs\">\n\t\t\t{!!hasOld && (\n\t\t\t\t\t<Text\n\t\t\t\t\ttag=\"span\"\n\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\tclassName=\"rounded bg-destructive/10 text-destructive line-through px-1 py-px\"\n\t\t\t\t>\n\t\t\t\t\t{change.old}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t\t{hasOld && hasNew && (\n\t\t\t\t<Text tag=\"span\" size=\"inherit\" type=\"secondary\">\n\t\t\t\t\t→\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t\t{!!hasNew && (\n\t\t\t\t<Text\n\t\t\t\t\ttag=\"span\"\n\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\tclassName=\"rounded bg-success/15 text-success px-1 py-px\"\n\t\t\t\t>\n\t\t\t\t\t{change.new}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t</Text>\n\t);\n}\n\nexport function ActivityChanges({ changes, className }: ActivityChangesProps) {\n\tif (changes.length === 0) return null;\n\treturn (\n\t\t<div className={cn(\n\t\t\t\t'activity-changes--component',\n\t\t\t\t'rounded-radius border border-border/60 bg-muted/30 p-surface-xs',\n\t\t\t\tclassName,\n\t\t\t)}>\n\t\t<Stack gap=\"sm\">\n\t\t\t{changes.map((change) => (\n\t\t\t\t<div\n\t\t\t\t\tkey={`${change.key}-${change.label}`}\n\t\t\t\t\tclassName=\"flex items-baseline gap-space-md\"\n\t\t\t\t>\n\t\t\t\t\t<Text\n\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{change.label}\n\t\t\t\t\t</Text>\n\t\t\t\t\t<ChangeValue change={change} />\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</Stack>\n\t\t</div>\n\t);\n}\n","/**\n * ActivityDateLabel — label rendered above each date group.\n *\n * Consumers can override via `slots.renderDateLabel`. Default: the shared\n * small secondary text role in sentence case, with measured top margin\n * between groups.\n */\nimport { Text } from '../../../typography';\nimport { Stack } from '../../../base/structure';\nimport { cn } from '../../../../lib/utils';\n\nexport interface ActivityDateLabelProps {\n\t/** Display label. */\n\tlabel: string;\n\t/** Whether this is the first row, so the timeline rail starts here. */\n\tfirst: boolean;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nexport function ActivityDateLabel({\n\tlabel,\n\tfirst,\n\tclassName,\n}: ActivityDateLabelProps) {\n\tif (label === '') return null;\n\treturn (\n\t\t<Stack gap=\"none\"\n\t\t\tclassName={cn(\n\t\t\t\t'activity-date-label--component',\n\t\t\t\t!first && 'mt-space-md',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Text size=\"xs\" type=\"secondary\" weight=\"medium\">{label}</Text>\n\t\t</Stack>\n\t);\n}\n","/**\n * ActivityEmptyState — neutral empty surface used when no activities are\n * available. Consumers replace via `slots.empty`.\n */\nimport { Activity } from 'lucide-react';\n\nimport { EmptyState } from '../../../blocks/data-display';\nimport { cn } from '../../../../lib/utils';\n\nexport interface ActivityEmptyStateProps {\n\t/** Surface title. */\n\ttitle: string;\n\t/** Short guidance shown beneath the control. */\n\thint?: string;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nexport function ActivityEmptyState({\n\ttitle,\n\thint,\n\tclassName,\n}: ActivityEmptyStateProps) {\n\treturn (\n\t\t<EmptyState\n\t\t\ttitle={title}\n\t\t\tdescription={hint ?? false}\n\t\t\tmedia={<Activity className=\"size-icon\" aria-hidden=\"true\" />}\n\t\t\tmediaVariant=\"icon-soft\"\n\t\t\tpadding=\"md\"\n\t\t\tclassName={cn('activity-empty-state--component', className)}\n\t\t/>\n\t);\n}\n","/**\n * Tone palettes shared by the marker, headline status segments, and the\n * resource tag. Tones map to semantic shadcn tokens — never to raw colours —\n * so a consumer rebrand at `:root` flows through the activities feature\n * automatically.\n */\nimport type { ActivityTone } from '../activities.types';\nimport type { BadgeTone } from '../../../base/badge';\n\nexport interface ActivityToneStyle {\n\t/** Filled background — used by the rich icon marker. */\n\tbg: string;\n\t/** Foreground text colour matching the bg. */\n\tfg: string;\n\t/** Solid colour used by the compact dot. */\n\tdot: string;\n\t/** Border tint used by the connector line. */\n\tline: string;\n\t/** Background for chips / tags. */\n\tchipBg: string;\n\t/** Text colour for chips / tags. */\n\tchipFg: string;\n}\n\nexport const ACTIVITY_TONE: Record<ActivityTone, ActivityToneStyle> = {\n\tprimary: {\n\t\tbg: 'bg-primary/10',\n\t\tfg: 'text-primary-accent',\n\t\tdot: 'bg-primary',\n\t\tline: 'bg-primary/30',\n\t\tchipBg: 'bg-primary/5',\n\t\tchipFg: 'text-primary-accent',\n\t},\n\tsuccess: {\n\t\tbg: 'bg-success/10',\n\t\tfg: 'text-success',\n\t\tdot: 'bg-success',\n\t\tline: 'bg-success/30',\n\t\tchipBg: 'bg-success/10',\n\t\tchipFg: 'text-success',\n\t},\n\twarning: {\n\t\tbg: 'bg-warning/10',\n\t\tfg: 'text-warning-accent',\n\t\tdot: 'bg-warning',\n\t\tline: 'bg-warning/30',\n\t\tchipBg: 'bg-warning/10',\n\t\tchipFg: 'text-warning-accent',\n\t},\n\tdestructive: {\n\t\tbg: 'bg-destructive/10',\n\t\tfg: 'text-destructive',\n\t\tdot: 'bg-destructive',\n\t\tline: 'bg-destructive/30',\n\t\tchipBg: 'bg-destructive/10',\n\t\tchipFg: 'text-destructive',\n\t},\n\tinfo: {\n\t\tbg: 'bg-info/10',\n\t\tfg: 'text-info',\n\t\tdot: 'bg-info',\n\t\tline: 'bg-info/30',\n\t\tchipBg: 'bg-info/10',\n\t\tchipFg: 'text-info',\n\t},\n\tneutral: {\n\t\tbg: 'bg-muted',\n\t\tfg: 'text-muted-foreground',\n\t\tdot: 'bg-muted-foreground/60',\n\t\tline: 'bg-border',\n\t\tchipBg: 'bg-muted',\n\t\tchipFg: 'text-muted-foreground',\n\t},\n\tsecondary: {\n\t\tbg: 'bg-muted',\n\t\tfg: 'text-muted-foreground',\n\t\tdot: 'bg-muted-foreground/60',\n\t\tline: 'bg-border',\n\t\tchipBg: 'bg-muted',\n\t\tchipFg: 'text-muted-foreground',\n\t},\n};\n\n/** Map an activity tone onto the closest base/Badge variant. */\nexport const TONE_TO_BADGE_TONE: Record<ActivityTone, BadgeTone> = {\n\tprimary: 'primary',\n\tsuccess: 'success',\n\twarning: 'warning',\n\tdestructive: 'destructive',\n\tinfo: 'info',\n\tneutral: 'secondary',\n\tsecondary: 'secondary',\n};\n","/**\n * ActivityResourceTag — chip rendering for a registered resource.\n *\n * The resource registry stores per-key `ActivityResourceConfig` (label, icon,\n * tone, badge, tags). This component renders those as a single inline chip\n * suitable for embedding into a headline. Falls back gracefully when the\n * registry has no entry — uses the segment's text/label.\n */\nimport { CircleDot } from 'lucide-react';\nimport { cn } from '../../../../lib/utils';\n\nimport { Badge } from '../../../base/badge';\nimport { Button } from '../../../base/buttons';\nimport { Text } from '../../../typography';\n\nimport type {\n\tActivityResourceConfig,\n\tActivityResourceRef,\n\tActivityTone,\n} from '../activities.types';\n\nimport { ACTIVITY_TONE, TONE_TO_BADGE_TONE } from './tone-tokens';\n\nexport interface ActivityResourceTagProps {\n\t/** The referenced resource. */\n\tresource: ActivityResourceRef;\n\t/** Configuration for this surface. */\n\tconfig?: ActivityResourceConfig;\n\t/** Fallback label if neither config nor segment text are present. */\n\tfallbackText?: string;\n\tonClick?: () => void;\n}\n\nexport function ActivityResourceTag({\n\tresource,\n\tconfig,\n\tfallbackText,\n\tonClick,\n}: ActivityResourceTagProps) {\n\tconst tone: ActivityTone = config?.tone ?? 'neutral';\n\tconst palette = ACTIVITY_TONE[tone];\n\tconst Icon = config?.icon ?? CircleDot;\n\tconst label = config?.label ?? fallbackText ?? resource.label ?? resource.key;\n\tconst interactive = typeof onClick === 'function';\n\n\tconst inner = (\n\t\t<>\n\t\t\t<Icon className={cn('size-icon-sm shrink-0', palette.fg)} />\n\t\t\t<Text tag=\"span\" weight=\"medium\" lineHeight=\"none\" className={palette.chipFg}>\n\t\t\t\t{label}\n\t\t\t</Text>\n\t\t\t{!!config?.tags && config.tags.length > 0 && (\n\t\t\t\t<Text\n\t\t\t\t\ttag=\"span\"\n\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\tclassName=\"border-l border-border pl-space-sm\"\n\t\t\t\t>\n\t\t\t\t\t{config.tags.join(' · ')}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t\t{!!config?.badge && (\n\t\t\t\t<Badge\n\t\t\t\t\tinline\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\ttone={TONE_TO_BADGE_TONE[config.badge.tone ?? 'neutral']}\n\t\t\t\t\tclassName=\"ml-space-2xs\"\n\t\t\t\t>\n\t\t\t\t\t{config.badge.label}\n\t\t\t\t</Badge>\n\t\t\t)}\n\t\t</>\n\t);\n\n\tconst chipClass = cn(\n\t\t'inline-flex items-center gap-space-xs rounded-full px-space-sm py-px align-baseline',\n\t\t'border border-border/50 shadow-none',\n\t\tpalette.chipBg,\n\t\tinteractive &&\n\t\t\t'cursor-pointer transition-colors hover:bg-foreground/5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n\t);\n\n\tif (interactive) {\n\t\treturn (\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=\"sm\"\n\t\t\t\tonClick={(e) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tonClick?.();\n\t\t\t\t}}\n\t\t\t\tclassName={cn('activity-resource-tag--component gap-space-xs align-baseline', palette.chipBg)}\n\t\t\t\ttitle={config?.note}\n\t\t\t>\n\t\t\t\t{inner}\n\t\t\t</Button>\n\t\t);\n\t}\n\n\treturn (\n\t\t<span className={cn('activity-resource-tag--component', chipClass)} title={config?.note}>\n\t\t\t{inner}\n\t\t</span>\n\t);\n}\n","/**\n * ActivityHeadline — segment renderer for the headline line.\n *\n * Renders typed segments (`actor` / `field` / `value` / `status` / `resource`\n * / `text`) into mixed inline content with proper typography and tone.\n *\n * When no segments are provided, falls back to splitting `headline` around\n * the actor's name so the actor still becomes interactive when possible.\n */\nimport { Fragment, type ReactNode } from 'react';\n\nimport { Badge } from '../../../base/badge';\nimport { Button } from '../../../base/buttons';\nimport { Text, TextLink } from '../../../typography';\n\nimport type {\n\tActivityActor,\n\tActivityHeadlineSegment,\n\tActivityItem,\n\tActivityResourceConfig,\n\tActivityResourceRef,\n} from '../activities.types';\nimport { ActivityResourceTag } from './activity-resource-tag';\nimport { TONE_TO_BADGE_TONE } from './tone-tokens';\n\nexport interface ActivityHeadlineProps<TData = unknown> {\n\t/** The feed entry this row renders. */\n\tactivity: ActivityItem<TData>;\n\t/** Id of the viewing user, used to say “you” instead of their name. */\n\tcurrentUserId?: string;\n\t/** Copy substituted for the current user's own name. */\n\tyouLabel: string;\n\tonActorClick?: (actor: ActivityActor, activity: ActivityItem<TData>) => void;\n\tonResourceClick?: (\n\t\t/** The referenced resource. */\n\t\tresource: ActivityResourceRef,\n\t\t/** Configuration for this surface. */\n\t\tconfig: ActivityResourceConfig | undefined,\n\t\t/** The feed entry this row renders. */\n\t\tactivity: ActivityItem<TData>,\n\t) => void;\n\t/** Live registry lookup for resource segments. */\n\tgetResourceConfig?: (\n\t\tref: ActivityResourceRef,\n\t) => ActivityResourceConfig | undefined;\n}\n\nfunction ActorNode<TData>({\n\tactorId,\n\ttext,\n\thref,\n\tactivity,\n\tyouLabel,\n\tcurrentUserId,\n\tonActorClick,\n}: {\n\tactorId?: string;\n\ttext: string;\n\thref?: string;\n\t/** The feed entry this row renders. */\n\tactivity: ActivityItem<TData>;\n\t/** Copy substituted for the current user's own name. */\n\tyouLabel: string;\n\t/** Id of the viewing user, used to say “you” instead of their name. */\n\tcurrentUserId?: string;\n\tonActorClick?: (actor: ActivityActor, activity: ActivityItem<TData>) => void;\n}) {\n\tconst isYou =\n\t\tcurrentUserId !== undefined &&\n\t\tactorId !== undefined &&\n\t\tcurrentUserId === actorId;\n\tconst display = isYou ? youLabel : text;\n\tconst actor: ActivityActor = activity.actor ?? { id: actorId, name: text };\n\n\tif (href) {\n\t\treturn (\n\t\t\t<TextLink\n\t\t\t\thref={href}\n\t\t\t\tsize=\"inherit\"\n\t\t\t\tunderline={false}\n\t\t\t\tonClick={(e) => {\n\t\t\t\t\tif (onActorClick) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tonActorClick(actor, activity);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tclassName=\"font-semibold text-foreground underline-offset-2 hover:underline\"\n\t\t\t>\n\t\t\t\t{display}\n\t\t\t</TextLink>\n\t\t);\n\t}\n\n\tif (onActorClick) {\n\t\treturn (\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=\"sm\"\n\t\t\t\tonClick={(e) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tonActorClick(actor, activity);\n\t\t\t\t}}\n\t\t\t\tclassName=\"h-auto min-h-0 rounded-inner px-0 py-0 text-foreground underline-offset-2 hover:underline\"\n\t\t\t>\n\t\t\t\t<Text tag=\"span\" weight=\"semibold\">{display}</Text>\n\t\t\t</Button>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Text tag=\"span\" weight=\"semibold\">\n\t\t\t{display}\n\t\t</Text>\n\t);\n}\n\nfunction renderSegments<TData>(\n\tsegments: readonly ActivityHeadlineSegment[],\n\tprops: ActivityHeadlineProps<TData>,\n): ReactNode {\n\treturn segments.map((segment, index) => {\n\t\tconst key = `seg-${index}-${segment.type}`;\n\t\tswitch (segment.type) {\n\t\t\tcase 'actor':\n\t\t\t\treturn (\n\t\t\t\t\t<Fragment key={key}>\n\t\t\t\t\t\t<ActorNode<TData>\n\t\t\t\t\t\t\tactorId={segment.actorId}\n\t\t\t\t\t\t\ttext={segment.text}\n\t\t\t\t\t\t\thref={segment.href}\n\t\t\t\t\t\t\tactivity={props.activity}\n\t\t\t\t\t\t\tyouLabel={props.youLabel}\n\t\t\t\t\t\t\tcurrentUserId={props.currentUserId}\n\t\t\t\t\t\t\tonActorClick={props.onActorClick}\n\t\t\t\t\t\t/>{' '}\n\t\t\t\t\t</Fragment>\n\t\t\t\t);\n\t\t\tcase 'field':\n\t\t\tcase 'value':\n\t\t\t\treturn (\n\t\t\t\t\t<Fragment key={key}>\n\t\t\t\t\t\t<Text tag=\"span\" weight=\"semibold\">\n\t\t\t\t\t\t\t{segment.text}\n\t\t\t\t\t\t</Text>{' '}\n\t\t\t\t\t</Fragment>\n\t\t\t\t);\n\t\t\tcase 'status':\n\t\t\t\treturn (\n\t\t\t\t\t<Fragment key={key}>\n\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\tinline\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\ttone={TONE_TO_BADGE_TONE[segment.tone ?? 'neutral']}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{segment.text}\n\t\t\t\t\t\t</Badge>{' '}\n\t\t\t\t\t</Fragment>\n\t\t\t\t);\n\t\t\tcase 'resource': {\n\t\t\t\tconst config = props.getResourceConfig?.(segment.resource);\n\t\t\t\treturn (\n\t\t\t\t\t<Fragment key={key}>\n\t\t\t\t\t\t<ActivityResourceTag\n\t\t\t\t\t\t\tresource={segment.resource}\n\t\t\t\t\t\t\tconfig={config}\n\t\t\t\t\t\t\tfallbackText={segment.text}\n\t\t\t\t\t\t\tonClick={\n\t\t\t\t\t\t\t\tprops.onResourceClick\n\t\t\t\t\t\t\t\t\t? () =>\n\t\t\t\t\t\t\t\t\t\t\tprops.onResourceClick?.(\n\t\t\t\t\t\t\t\t\t\t\t\tsegment.resource,\n\t\t\t\t\t\t\t\t\t\t\t\tconfig,\n\t\t\t\t\t\t\t\t\t\t\t\tprops.activity,\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>{' '}\n\t\t\t\t\t</Fragment>\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase 'text':\n\t\t\tdefault:\n\t\t\t\treturn (\n\t\t\t\t\t<Fragment key={key}>\n\t\t\t\t\t\t<Text tag=\"span\">\n\t\t\t\t\t\t\t{segment.text}\n\t\t\t\t\t\t</Text>{' '}\n\t\t\t\t\t</Fragment>\n\t\t\t\t);\n\t\t}\n\t});\n}\n\nfunction renderFallback<TData>(props: ActivityHeadlineProps<TData>): ReactNode {\n\tconst { activity } = props;\n\tconst fallbackHeadline =\n\t\tactivity.headline ?? activity.event;\n\tconst actorName = activity.actor?.name;\n\tif (!actorName || !fallbackHeadline.includes(actorName)) {\n\t\treturn (\n\t\t\t<Text tag=\"span\">\n\t\t\t\t{fallbackHeadline}\n\t\t\t</Text>\n\t\t);\n\t}\n\tconst [before, ...after] = fallbackHeadline.split(actorName);\n\treturn (\n\t\t<>\n\t\t\t{!!before && (\n\t\t\t\t<Text tag=\"span\">\n\t\t\t\t\t{before}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t\t<ActorNode<TData>\n\t\t\t\tactorId={activity.actor?.id}\n\t\t\t\ttext={actorName}\n\t\t\t\thref={activity.actor?.href}\n\t\t\t\tactivity={activity}\n\t\t\t\tyouLabel={props.youLabel}\n\t\t\t\tcurrentUserId={props.currentUserId}\n\t\t\t\tonActorClick={props.onActorClick}\n\t\t\t/>\n\t\t\t{after.length > 0 && (\n\t\t\t\t<Text tag=\"span\">\n\t\t\t\t\t{after.join(actorName)}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t</>\n\t);\n}\n\nexport function ActivityHeadline<TData = unknown>(\n\tprops: ActivityHeadlineProps<TData>,\n) {\n\tconst segments = props.activity.segments;\n\tif (segments && segments.length > 0) {\n\t\treturn (\n\t\t\t<span className=\"activity-headline--component leading-snug [&>span]:leading-snug\">\n\t\t\t\t{renderSegments<TData>(segments, props)}\n\t\t\t</span>\n\t\t);\n\t}\n\treturn <span className=\"activity-headline--component leading-snug\">{renderFallback<TData>(props)}</span>;\n}\n","/**\n * ActivityMarker — left-edge visual for a row.\n *\n * Density mapping:\n * - `compact` → small tone-coloured dot\n * - `default` → 22px tone-tinted square with the event icon\n * - `rich` → 28px tone-tinted circle with the event icon\n *\n * Always renders the connector line beneath unless `last` is true.\n */\nimport type { LucideIcon } from 'lucide-react';\nimport { cn } from '../../../../lib/utils';\n\nimport type { ActivityDensity, ActivityTone } from '../activities.types';\n\nimport { ACTIVITY_TONE } from './tone-tokens';\n\nexport interface ActivityMarkerProps {\n\t/** Leading glyph. */\n\ticon: LucideIcon;\n\t/** Semantic tone driving the entry's colour. */\n\ttone: ActivityTone;\n\t/** Row spacing. */\n\tdensity: ActivityDensity;\n\t/** Whether this is the final row, so the timeline rail stops here. */\n\tlast: boolean;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nexport function ActivityMarker({\n\ticon: Icon,\n\ttone,\n\tdensity,\n\tlast,\n\tclassName,\n}: ActivityMarkerProps) {\n\tconst palette = ACTIVITY_TONE[tone];\n\n\tif (density === 'compact') {\n\t\treturn (\n\t\t\t<div className={cn('activity-marker--component flex flex-col items-center', className)}>\n\t\t\t\t<span\n\t\t\t\t\taria-hidden\n\t\t\t\t\tclassName={cn('mt-1.5 size-2 shrink-0 rounded-full', palette.dot)}\n\t\t\t\t/>\n\t\t\t\t{!last && (\n\t\t\t\t\t<span aria-hidden className={cn('mt-1 w-px flex-1', palette.line)} />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (density === 'rich') {\n\t\treturn (\n\t\t\t<div className={cn('activity-marker--component flex flex-col items-center', className)}>\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'flex size-7 shrink-0 items-center justify-center rounded-full ring-1 ring-border/60',\n\t\t\t\t\t\tpalette.bg,\n\t\t\t\t\t\tpalette.fg,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Icon className=\"size-icon-md\" />\n\t\t\t\t</span>\n\t\t\t\t{!last && (\n\t\t\t\t\t<span aria-hidden className={cn('mt-1 w-px flex-1', palette.line)} />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={cn('activity-marker--component flex flex-col items-center', className)}>\n\t\t\t<span\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'flex size-icon-lg shrink-0 items-center justify-center rounded-full',\n\t\t\t\t\tpalette.bg,\n\t\t\t\t\tpalette.fg,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<Icon className=\"size-icon-sm\" />\n\t\t\t</span>\n\t\t\t{!last && (\n\t\t\t\t<span aria-hidden className={cn('mt-1 w-px flex-1', palette.line)} />\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * ActivityRow — single row layout used by `<ActivityFeed />`.\n *\n * Composes the marker, headline, optional description, metadata preview,\n * source badge, timestamp, and (rich-only) the change-detail block plus\n * action menu. Per-density layout follows the design-system rules:\n * compact (dot, single line) / default (icon, headline + meta line) /\n * rich (icon, full header + body + actions).\n */\nimport { ChevronDown, ChevronRight } from 'lucide-react';\nimport { Fragment, type ReactNode } from 'react';\n\nimport { Badge } from '../../../base/badge';\nimport { Button } from '../../../base/buttons';\nimport { Grid, Stack } from '../../../base/structure';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport type {\n\t\tActivityAction,\n\t\tActivityActor,\n\t\tActivityDensity,\n\t\tActivityEventConfig,\n\t\tActivityItemSpacing,\n\t\tActivityItem,\n\t\tActivityResourceConfig,\n\t\tActivityResourceRef,\n\t\tActivityTone,\n} from '../activities.types';\n\nimport { ActivityActionsMenu } from './activity-actions-menu';\nimport { ActivityChanges } from './activity-changes';\nimport { ActivityHeadline } from './activity-headline';\nimport { ActivityMarker } from './activity-marker';\nimport { ActivityResourceTag } from './activity-resource-tag';\n\nfunction ActivityMetadataPreview({\n\t\tmetadata,\n\t\tmoreLabel,\n}: {\n\t\tmetadata: NonNullable<ActivityItem['metadata']>;\n\t\tmoreLabel: string;\n}) {\n\t\tconst visible = metadata.slice(0, 3);\n\t\tconst hiddenCount = metadata.length - visible.length;\n\n\t\treturn (\n\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" wrap gap=\"sm\" className=\"activity-row--metadata-preview mt-space-xs min-w-0 gap-y-space-2xs\">\n\t\t\t\t\t\t{visible.map((item, index) => (\n\t\t\t\t\t\t\t\t<Fragment key={item.label}>\n\t\t\t\t\t<Text\n\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\tclassName=\"inline-flex min-w-0 items-baseline gap-space-xs leading-snug\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"discrete\" className=\"shrink-0\">\n\t\t\t\t\t\t\t{item.label}:{' '}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" className=\"min-w-0 truncate\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{item.value}\n\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t{index < visible.length - 1 && (\n\t\t\t\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"discrete\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"leading-snug\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{' · '}\n\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</Fragment>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t{hiddenCount > 0 && (\n\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\ttype=\"discrete\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"leading-snug\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t+{hiddenCount} {moreLabel}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t);\n}\n\nfunction ActivityMetadataGrid({\n\t\tmetadata,\n}: {\n\t\tmetadata: NonNullable<ActivityItem['metadata']>;\n}) {\n\t\treturn (\n\t\t\t\t<Grid columns={{ base: 1, sm: 2 }} gap=\"md\" className=\"activity-row--metadata\">\n\t\t\t\t\t\t{metadata.map((item) => (\n\t\t\t\t\t\t\t\t<Stack gap=\"dense\"\n\t\t\t\t\t\t\t\t\t\tkey={item.label}\n\t\t\t\t\t\t\t\t\t\tclassName=\"min-w-0\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\t\t\ttag=\"div\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"discrete\"\n\t\t\t\t\t\t\t\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"leading-snug\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\t\t\ttag=\"div\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"min-w-0 break-words leading-snug\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{item.value}\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t))}\n\t\t\t\t</Grid>\n\t\t);\n}\n\nexport interface ActivityRowProps<TData = unknown> {\n\t\t/** The feed entry this row renders. */\n\t\tactivity: ActivityItem<TData>;\n\t\t/** Row spacing. */\n\t\tdensity: ActivityDensity;\n\t\t/** Vertical rhythm between rows. */\n\t\titemSpacing: ActivityItemSpacing;\n\t\t/** Icon, tone, and copy for this activity type. */\n\t\teventConfig: ActivityEventConfig;\n\t\t/** Semantic tone driving the entry's colour. */\n\t\ttone: ActivityTone;\n\t\t/** Whether this is the final row, so the timeline rail stops here. */\n\t\tlast: boolean;\n\t\t/** Whether the row's details are open. */\n\t\texpanded: boolean;\n\t\tonExpandedChange: (expanded: boolean) => void;\n\t\t/** Lets the row expand to show its details. */\n\t\tdetailsCollapsible?: boolean;\n\t\t/** Formatted relative time, e.g. \"2 hours ago\". */\n\t\trelativeTime: string | null;\n\t\t/** Formatted exact timestamp, shown on hover. */\n\t\tabsoluteTime: string | null;\n\t\t/** Where the activity originated — an app, integration, or API. */\n\t\tsourceLabel: string | null;\n\t\t/** Copy substituted for the current user's own name. */\n\t\tyouLabel: string;\n\t\t/** Control that reveals the change list. */\n\t\tshowChangesLabel: string;\n\t\t/** Control that collapses the change list. */\n\t\thideChangesLabel: string;\n\t\t/** Control that reveals the remaining changes. */\n\t\tmoreLabel: string;\n\t\t/** Accessible name for the row's overflow trigger. */\n\t\tactionsLabel: string;\n\t\t/** Id of the viewing user, used to say \"you\" instead of their name. */\n\t\tcurrentUserId?: string;\n\t\t/** Overflow menu for the surface as a whole. */\n\t\tactions: readonly ActivityAction<TData>[];\n\t\tonActivityClick?: (activity: ActivityItem<TData>) => void;\n\t\tonActorClick?: (actor: ActivityActor, activity: ActivityItem<TData>) => void;\n\t\tonResourceClick?: (\n\t\t\t\t/** The referenced resource. */\n\t\t\t\tresource: ActivityResourceRef,\n\t\t\t\t/** Configuration for this surface. */\n\t\t\t\tconfig: ActivityResourceConfig | undefined,\n\t\t\t\t/** The feed entry this row renders. */\n\t\t\t\tactivity: ActivityItem<TData>,\n\t\t) => void;\n\t\tonAction?: (actionId: string, activity: ActivityItem<TData>) => void;\n\t\t/** Resolves icon and link details for a referenced resource. */\n\t\tgetResourceConfig?: (\n\t\t\t\tref: ActivityResourceRef,\n\t\t) => ActivityResourceConfig | undefined;\n\t\t/** Slot override for the headline only. */\n\t\theadlineOverride?: ReactNode;\n\t\t/** Slot override for the marker only. */\n\t\tmarkerOverride?: ReactNode;\n\t\t/** Extra row detail content rendered inside the rich detail panel. */\n\t\tcustomDetails?: ReactNode;\n\t\t/** Merged onto the row. */\n\t\trowClassName?: string;\n\t\t/** Merged onto the marker. */\n\t\tmarkerClassName?: string;\n\t\t/** Merged onto the content. */\n\t\tcontentClassName?: string;\n\t\t/** Merged onto the details. */\n\t\tdetailsClassName?: string;\n}\n\nexport function ActivityRow<TData = unknown>(props: ActivityRowProps<TData>) {\n\t\tconst {\n\t\t\t\tactivity,\n\t\t\t\tdensity,\n\t\t\t\titemSpacing,\n\t\t\t\teventConfig,\n\t\t\t\ttone,\n\t\t\t\tlast,\n\t\t\t\texpanded,\n\t\t\t\tonExpandedChange,\n\t\t\t\tdetailsCollapsible,\n\t\t\t\trelativeTime,\n\t\t\t\tabsoluteTime,\n\t\t\t\tsourceLabel,\n\t\t\t\tyouLabel,\n\t\t\t\tshowChangesLabel,\n\t\t\t\thideChangesLabel,\n\t\t\t\tmoreLabel,\n\t\t\t\tactionsLabel,\n\t\t\t\tcurrentUserId,\n\t\t\t\tactions,\n\t\t\t\tonActivityClick,\n\t\t\t\tonActorClick,\n\t\t\t\tonResourceClick,\n\t\t\t\tonAction,\n\t\t\t\tgetResourceConfig,\n\t\t\t\theadlineOverride,\n\t\t\t\tmarkerOverride,\n\t\t\t\tcustomDetails,\n\t\t\t\trowClassName,\n\t\t\t\tmarkerClassName,\n\t\t\t\tcontentClassName,\n\t\t\t\tdetailsClassName,\n\t\t} = props;\n\n\t\tconst Icon = activity.iconOverride ?? eventConfig.icon;\n\t\tconst hasChanges = (activity.changes?.length ?? 0) > 0;\n\t\tconst metadata = activity.metadata ?? [];\n\t\tconst hasMetadata = metadata.length > 0;\n\t\tconst hasResources = (activity.resources?.length ?? 0) > 0;\n\t\tconst hasDetails =\n\t\t\t\tactivity.details !== undefined &&\n\t\t\t\tactivity.details !== null &&\n\t\t\t\tactivity.details !== false;\n\t\tconst hasCustomDetails =\n\t\t\t\tcustomDetails !== undefined &&\n\t\t\t\tcustomDetails !== null &&\n\t\t\t\tcustomDetails !== false;\n\t\tconst hasDetailPanel = hasMetadata || hasChanges || hasDetails || hasCustomDetails;\n\t\tconst hasDescription =\n\t\t\t\tactivity.description !== undefined &&\n\t\t\t\tactivity.description !== null &&\n\t\t\t\tactivity.description !== '';\n\t\tconst showSecondaryRow = density !== 'compact';\n\t\tconst showRichBody = density === 'rich';\n\t\tconst panelIsCollapsible = detailsCollapsible ?? (hasMetadata || hasChanges);\n\t\tconst showDetailPanel = showRichBody && hasDetailPanel && (!panelIsCollapsible || expanded);\n\t\tconst showMetadataPreview = showRichBody && hasMetadata && panelIsCollapsible && !expanded;\n\t\tconst inlineActions = actions.filter((action) => action.presentation === 'inline');\n\t\tconst menuActions = actions.filter((action) => action.presentation !== 'inline');\n\n\t\tconst headlineNode =\n\t\t\t\theadlineOverride ??\n\t\t\t\t(\n\t\t\t\t\t\t<ActivityHeadline<TData>\n\t\t\t\t\t\t\t\tactivity={activity}\n\t\t\t\t\t\t\t\tcurrentUserId={currentUserId}\n\t\t\t\t\t\t\t\tyouLabel={youLabel}\n\t\t\t\t\t\t\t\tonActorClick={onActorClick}\n\t\t\t\t\t\t\t\tonResourceClick={onResourceClick}\n\t\t\t\t\t\t\t\tgetResourceConfig={getResourceConfig}\n\t\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\tconst markerNode =\n\t\t\t\tmarkerOverride ?? (\n\t\t\t\t\t\t<ActivityMarker\n\t\t\t\t\t\t\t\ticon={Icon}\n\t\t\t\t\t\t\t\ttone={tone}\n\t\t\t\t\t\t\t\tdensity={density}\n\t\t\t\t\t\t\t\tlast={last}\n\t\t\t\t\t\t\t\tclassName={markerClassName}\n\t\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\tconst interactive = typeof onActivityClick === 'function';\n\t\tconst hasNestedInteractive = (\n\t\t\t\thasChanges ||\n\t\t\t\thasResources ||\n\t\t\t\tmenuActions.length > 0 ||\n\t\t\t\tinlineActions.length > 0 ||\n\t\t\t\ttypeof onActorClick === 'function' ||\n\t\t\t\ttypeof onResourceClick === 'function'\n\t\t);\n\t\tconst keyboardInteractive = interactive && !hasNestedInteractive;\n\n\t\tconst rowSpacing =\n\t\t\t\tdensity === 'rich'\n\t\t\t\t\t\t? 'gap-space-md py-space-xs'\n\t\t\t\t\t\t: density === 'compact'\n\t\t\t\t\t\t\t\t? 'gap-space-sm py-space-2xs'\n\t\t\t\t\t\t\t\t: 'gap-space-md py-space-2xs';\n\t\tconst contentPadding = !last\n\t\t\t\t? itemSpacing === 'compact'\n\t\t\t\t\t\t? 'pb-space-sm'\n\t\t\t\t\t\t: itemSpacing === 'relaxed'\n\t\t\t\t\t\t\t\t? 'pb-space-xl'\n\t\t\t\t\t\t\t\t: 'pb-space-md'\n\t\t\t\t: '';\n\n\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'activity-row--component relative flex',\n\t\t\t\t\t\t\t\trowSpacing,\n\t\t\t\t\t\t\t\tinteractive && 'cursor-pointer rounded-radius hover:bg-muted/40',\n\t\t\t\t\t\t\t\trowClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tonClick={interactive ? () => onActivityClick?.(activity) : undefined}\n\t\t\t\t\t\trole={keyboardInteractive ? 'button' : undefined}\n\t\t\t\t\t\ttabIndex={keyboardInteractive ? 0 : undefined}\n\t\t\t\t\t\tonKeyDown={\n\t\t\t\t\t\t\t\tkeyboardInteractive\n\t\t\t\t\t\t\t\t\t\t? (e) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonActivityClick?.(activity);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t\t{markerNode}\n\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'activity-row--content min-w-0 flex-1',\n\t\t\t\t\t\t\t\t\t\tcontentPadding,\n\t\t\t\t\t\t\t\t\t\tcontentClassName,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Stack gap=\"dense\">\n\t\t\t\t\t\t\t\t<div className=\"activity-row--summary grid min-w-0 grid-cols-1 items-start gap-x-space-lg gap-y-space-sm sm:grid-cols-[minmax(0,1fr)_max-content]\">\n\t\t\t\t\t<Stack gap=\"dense\" className=\"min-w-0\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"activity-row--headline flex min-w-0 flex-wrap items-center gap-x-space-sm gap-y-space-xs\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlineHeight=\"snug\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"min-w-0 break-words [overflow-wrap:anywhere]\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{headlineNode}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{!!sourceLabel && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Badge inline size=\"sm\" tone=\"secondary\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{sourceLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t\t{showMetadataPreview && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ActivityMetadataPreview\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmetadata={metadata}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmoreLabel={moreLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</Stack>\n\n\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"xs\" justify={{ base: 'between', sm: 'end' }} wrap={false} className=\"activity-row--trailing w-full shrink-0 justify-self-start sm:w-auto sm:justify-self-end\">\n\t\t\t\t\t\t\t\t\t\t\t\t{!!relativeTime && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"whitespace-nowrap tabular-nums leading-snug\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle={absoluteTime ?? undefined}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{relativeTime}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t{showRichBody && hasDetailPanel && panelIsCollapsible && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"size-action-sm text-muted-foreground\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonExpandedChange(!expanded);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle={expanded ? hideChangesLabel : showChangesLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={expanded ? hideChangesLabel : showChangesLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-expanded={expanded}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{expanded ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ChevronDown className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ChevronRight className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t{showRichBody && menuActions.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ActivityActionsMenu<TData>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tactivity={activity}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tactions={menuActions}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonAction={onAction}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlabel={actionsLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t{!!showSecondaryRow && hasDescription && (\n\t\t\t\t\t\t\t\t\t\t<Text tag=\"div\" type=\"secondary\" className=\"max-w-3xl leading-relaxed\">\n\t\t\t\t\t\t\t\t\t\t\t\t{activity.description}\n\t\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\n\t\t\t\t\t\t\t\t{!!showRichBody && hasResources && activity.resources && (\n\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"xs\" className=\"mt-space-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t{activity.resources.map((res) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst cfg = getResourceConfig?.(res);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ActivityResourceTag\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={res.key}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tresource={res}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconfig={cfg}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonResourceClick\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? () =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonResourceClick(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tres,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcfg,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tactivity,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{showRichBody && inlineActions.length > 0 && (\n\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"xs\" className=\"activity-row--inline-actions mt-space-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t{inlineActions.map((action) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst ActionIcon = action.icon;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={action.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttone={action.tone === 'destructive' ? 'destructive' : 'secondary'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"outline\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ticon={ActionIcon}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={action.disabled}\n\t\t\t\t\t\t\t\t\tclassName=\"h-auto min-h-action-sm px-control-sm py-space-xs\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonAction?.(action.id, activity);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\taction.onClick?.(activity);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{action.label}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{showDetailPanel && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"mt-space-sm\">\n\t\t\t\t\t\t<div className={cn(\n\t\t\t\t\t\t\t'activity-row--details',\n\t\t\t\t\t\t\tdetailsClassName,\n\t\t\t\t\t\t)}>\n\t\t\t\t\t\t<Stack gap=\"md\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{hasMetadata && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ActivityMetadataGrid metadata={metadata} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{hasChanges && activity.changes && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ActivityChanges\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tchanges={activity.changes}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"border-0 bg-transparent p-0\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{hasDetails && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"activity-row--details-body\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{activity.details}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{hasCustomDetails && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"activity-row--details-custom\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{customDetails}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t);\n}\n","/**\n * ActivityFeed — framework-agnostic activity timeline.\n *\n * Composition seams:\n * - `strings` — deep-partial override of every label\n * - `eventConfig` — mass-configurable per-event icon/tone/labels\n * - `slots` — replace any region (row / headline / marker /\n * dateLabel / empty / loading / header / footer)\n * - `slots.renderRow` — full per-row override\n * - `accessors` — formatRelative/Absolute, getEventLabel, …\n * - `actionsForActivity` — surface a per-row action menu (rich density)\n * - `resources` + `onResourcesChange` — registry-driven rich resource\n * tags (icons, badges, links, tags) with save\n * and restore semantics for the consumer\n *\n * Headless usage:\n * - Call `useActivityFeed({ activities, ... })` directly to drive a\n * completely custom UI against the same grouping/expand state machine.\n * - Call `useActivityResources({ resources, onResourcesChange })` to\n * drive the registry independently.\n *\n * Framework-agnostic:\n * - No router import, no i18n SDK import. Wire actor / resource navigation\n * via callbacks at the call site.\n */\nimport { format, isValid, type Locale } from 'date-fns';\nimport { useMemo, type ReactNode } from 'react';\n\nimport { Stack } from '../../base/structure';\nimport { Text } from '../../typography';\nimport { useStrings } from '../../../lib/strings';\nimport { useDatesConfig } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\n\nimport {\n\tdefaultActivityEventConfig,\n\tresolveEventConfig,\n} from './activities.config';\nimport {\n\tdefaultActivitiesStrings,\n} from './activities.strings';\nimport type {\n\tActivityAction,\n\tActivityFeedProps,\n\tActivityItem,\n\tActivityRowClassNameValue,\n\tActivityRenderRowContext,\n\tActivityTone,\n} from './activities.types';\nimport { useActivityFeed } from './hooks/use-activity-feed';\nimport { useActivityResources } from './hooks/use-activity-resources';\nimport {\n\tActivityDateLabel,\n\tActivityEmptyState,\n\tActivityRow,\n} from './partials';\n\nfunction defaultFormatAbsolute(iso: string, locale?: Locale): string {\n\ttry {\n\t\tconst date = new Date(iso);\n\t\treturn isValid(date) ? format(date, 'PP p', locale ? { locale } : undefined) : iso;\n\t} catch {\n\t\treturn iso;\n\t}\n}\n\nfunction resolveRowClassName<TData>(\n\tvalue: ActivityRowClassNameValue<TData> | undefined,\n\tactivity: ActivityItem<TData>,\n) {\n\treturn typeof value === 'function' ? value(activity) : value;\n}\n\nfunction resolveTone<TData>(\n\tactivity: ActivityItem<TData>,\n\teventTone: ActivityTone,\n): ActivityTone {\n\treturn activity.toneOverride ?? eventTone;\n}\n\nexport function ActivityFeed<TData = unknown>(props: ActivityFeedProps<TData>) {\n\tconst {\n\t\tactivities = [],\n\t\tdensity = 'default',\n\t\titemSpacing = 'relaxed',\n\t\tgroupByDate = true,\n\t\texpandedByDefault = false,\n\t\tdetailsCollapsible,\n\t\tdefaultExpandedIds,\n\t\texpandedIds,\n\t\tonExpandedIdsChange,\n\t\tcurrentUserId,\n\t\tloading = false,\n\t\teventConfig: eventConfigOverride,\n\t\tstrings: stringsProp,\n\t\tslots,\n\t\trowClassNames,\n\t\tclassName,\n\t\tlocale,\n\t\t// accessors\n\t\tformatRelativeTime,\n\t\tformatAbsoluteTime,\n\t\tformatDateGroupLabel,\n\t\tgetEventLabel: _getEventLabel,\n\t\tgetSourceLabel,\n\t\tactionsForActivity,\n\t\t// callbacks\n\t\tonActivityClick,\n\t\tonActorClick,\n\t\tonResourceClick,\n\t\tonAction,\n\t\tonActivityExpandedChange,\n\t\t// resources\n\t\tresources,\n\t\tonResourcesChange,\n\t} = props;\n\n\tconst strings = useStrings(defaultActivitiesStrings, stringsProp);\n\n\tconst eventConfigMap = useMemo(\n\t\t() => ({ ...defaultActivityEventConfig, ...eventConfigOverride }),\n\t\t[eventConfigOverride],\n\t);\n\n\tconst registry = useActivityResources({\n\t\tresources,\n\t\tonResourcesChange,\n\t});\n\n\tconst dates = useDatesConfig();\n\tconst resolvedLocale = locale ?? dates.locale;\n\tconst feed = useActivityFeed<TData>({\n\t\tactivities,\n\t\tgroupByDate,\n\t\texpandedByDefault,\n\t\tdefaultExpandedIds,\n\t\texpandedIds,\n\t\tonExpandedIdsChange,\n\t\tlocale: resolvedLocale,\n\t\tstrings,\n\t\tformatDateGroupLabel,\n\t});\n\n\tconst fmtRelative = formatRelativeTime ?? dates.formatRelativeTime ?? ((iso: string) => iso);\n\tconst fmtAbsolute = formatAbsoluteTime ?? ((iso: string) => defaultFormatAbsolute(iso, resolvedLocale));\n\n\tif (loading) {\n\t\treturn (\n\t\t\t<div className={cn('activities-feed--component', 'px-space-md py-space-xl', className)}>\n\t\t\t\t{slots?.loading ?? (\n\t\t\t\t\t<Text type=\"secondary\" align=\"center\">\n\t\t\t\t\t\t{strings.loading}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (activities.length === 0) {\n\t\treturn (\n\t\t\t<div className={cn('activities-feed--component', 'px-space-md py-space-md', className)}>\n\t\t\t\t{slots?.empty ?? <ActivityEmptyState title={strings.empty} />}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst totalRendered = feed.groups.reduce((acc, g) => acc + g.items.length, 0);\n\tlet renderedSoFar = 0;\n\n\treturn (\n\t\t<Stack gap=\"xl\" className={cn('activities-feed--component', className)}>\n\t\t\t{!!slots?.header && <div>{slots.header}</div>}\n\n\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t{feed.groups.map((group, gi) => {\n\t\t\t\t\tconst isFirstGroup = gi === 0;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={`${group.label}-${gi}`} className={cn(isFirstGroup ? '' : 'mt-1')}>\n\t\t\t\t\t\t\t{slots?.renderDateLabel\n\t\t\t\t\t\t\t\t? slots.renderDateLabel(group.label, isFirstGroup)\n\t\t\t\t\t\t\t\t: (\n\t\t\t\t\t\t\t\t\t<ActivityDateLabel\n\t\t\t\t\t\t\t\t\t\tlabel={group.label}\n\t\t\t\t\t\t\t\t\t\tfirst={isFirstGroup}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t<div className={cn('flex flex-col', !!group.label && 'mt-space-md')}>\n\t\t\t\t\t\t\t\t{group.items.map((keyed, ii) => {\n\t\t\t\t\t\t\t\t\tconst activity = keyed.activity;\n\t\t\t\t\t\t\t\t\tconst isFirstInGroup = ii === 0;\n\t\t\t\t\t\t\t\t\tconst isLast =\n\t\t\t\t\t\t\t\t\t\t++renderedSoFar === totalRendered;\n\t\t\t\t\t\t\t\t\tconst eventCfg = resolveEventConfig(\n\t\t\t\t\t\t\t\t\t\tactivity.event,\n\t\t\t\t\t\t\t\t\t\teventConfigMap,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tconst tone = resolveTone(activity, eventCfg.tone);\n\t\t\t\t\t\t\t\t\tconst relativeTime = activity.timestamp\n\t\t\t\t\t\t\t\t\t\t?? (activity.createdAt\n\t\t\t\t\t\t\t\t\t\t\t? fmtRelative(activity.createdAt)\n\t\t\t\t\t\t\t\t\t\t\t: null);\n\t\t\t\t\t\t\t\t\tconst absoluteTime = activity.createdAt\n\t\t\t\t\t\t\t\t\t\t? fmtAbsolute(activity.createdAt)\n\t\t\t\t\t\t\t\t\t\t: null;\n\t\t\t\t\t\t\t\t\tconst sourceLabel = activity.source\n\t\t\t\t\t\t\t\t\t\t? (getSourceLabel?.(activity.source)\n\t\t\t\t\t\t\t\t\t\t\t\t?? strings.sources[activity.source]\n\t\t\t\t\t\t\t\t\t\t\t\t?? eventCfg.sourceLabel\n\t\t\t\t\t\t\t\t\t\t\t\t?? null)\n\t\t\t\t\t\t\t\t\t\t: eventCfg.sourceLabel ?? null;\n\t\t\t\t\t\t\t\t\tconst sourceLabelTrimmed =\n\t\t\t\t\t\t\t\t\t\tsourceLabel && sourceLabel.trim().length > 0\n\t\t\t\t\t\t\t\t\t\t\t? sourceLabel\n\t\t\t\t\t\t\t\t\t\t\t: null;\n\t\t\t\t\t\t\t\t\tconst actions: readonly ActivityAction<TData>[] =\n\t\t\t\t\t\t\t\t\t\tactionsForActivity?.(activity) ?? [];\n\n\t\t\t\t\t\t\t\t\tconst ctx: ActivityRenderRowContext<TData> = {\n\t\t\t\t\t\t\t\t\t\tdensity,\n\t\t\t\t\t\t\t\t\t\tisLast,\n\t\t\t\t\t\t\t\t\t\tisFirstInGroup,\n\t\t\t\t\t\t\t\t\t\tactivity,\n\t\t\t\t\t\t\t\t\t\teventConfig: eventCfg,\n\t\t\t\t\t\t\t\t\t\ttone,\n\t\t\t\t\t\t\t\t\t\trelativeTime,\n\t\t\t\t\t\t\t\t\t\tabsoluteTime,\n\t\t\t\t\t\t\t\t\t\tsourceLabel: sourceLabelTrimmed,\n\t\t\t\t\t\t\t\t\t\texpanded: feed.isExpanded(activity.id),\n\t\t\t\t\t\t\t\t\t\titemSpacing,\n\t\t\t\t\t\t\t\t\t\tsetExpanded: (expanded) =>\n\t\t\t\t\t\t\t\t\t\t\tfeed.setExpanded(activity.id, expanded),\n\t\t\t\t\t\t\t\t\t\ttoggleExpanded: () =>\n\t\t\t\t\t\t\t\t\t\t\tfeed.toggleExpanded(activity.id),\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\tconst customDetails =\n\t\t\t\t\t\t\t\t\t\tslots?.renderDetails?.(activity, ctx);\n\n\t\t\t\t\t\t\t\t\tconst customRow = slots?.renderRow?.(activity, ctx);\n\t\t\t\t\t\t\t\t\tif (customRow !== undefined) {\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<div key={keyed.key}>{customRow}</div>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tconst headlineOverride =\n\t\t\t\t\t\t\t\t\t\tslots?.renderHeadline?.(activity, ctx);\n\t\t\t\t\t\t\t\t\tconst markerOverride =\n\t\t\t\t\t\t\t\t\t\tslots?.renderMarker?.(activity, ctx);\n\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<ActivityRow<TData>\n\t\t\t\t\t\t\t\t\t\t\tkey={keyed.key}\n\t\t\t\t\t\t\t\t\t\t\tactivity={activity}\n\t\t\t\t\t\t\t\t\t\t\tdensity={density}\n\t\t\t\t\t\t\t\t\t\t\titemSpacing={itemSpacing}\n\t\t\t\t\t\t\t\t\t\t\teventConfig={eventCfg}\n\t\t\t\t\t\t\t\t\t\t\ttone={tone}\n\t\t\t\t\t\t\t\t\t\t\tlast={isLast}\n\t\t\t\t\t\t\t\t\t\t\texpanded={ctx.expanded}\n\t\t\t\t\t\t\t\t\t\t\tonExpandedChange={(expanded) => {\n\t\t\t\t\t\t\t\t\t\t\t\tfeed.setExpanded(activity.id, expanded);\n\t\t\t\t\t\t\t\t\t\t\t\tonActivityExpandedChange?.(activity, expanded);\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tdetailsCollapsible={activity.collapsible ?? detailsCollapsible}\n\t\t\t\t\t\t\t\t\t\t\trelativeTime={relativeTime}\n\t\t\t\t\t\t\t\t\t\t\tabsoluteTime={absoluteTime}\n\t\t\t\t\t\t\t\t\t\t\tsourceLabel={sourceLabelTrimmed}\n\t\t\t\t\t\t\t\t\t\t\tyouLabel={strings.you}\n\t\t\t\t\t\t\t\t\t\t\tshowChangesLabel={strings.showChanges}\n\t\t\t\t\t\t\t\t\t\t\thideChangesLabel={strings.hideChanges}\n\t\t\t\t\t\t\t\t\t\t\tmoreLabel={strings.moreLabel}\n\t\t\t\t\t\t\t\t\t\t\tactionsLabel={strings.actionsLabel}\n\t\t\t\t\t\t\t\t\t\t\tcurrentUserId={currentUserId}\n\t\t\t\t\t\t\t\t\t\t\tactions={actions}\n\t\t\t\t\t\t\t\t\t\t\tonActivityClick={onActivityClick}\n\t\t\t\t\t\t\t\t\t\t\tonActorClick={onActorClick}\n\t\t\t\t\t\t\t\t\t\t\tonResourceClick={onResourceClick}\n\t\t\t\t\t\t\t\t\t\t\tonAction={onAction}\n\t\t\t\t\t\t\t\t\t\t\tgetResourceConfig={(ref) =>\n\t\t\t\t\t\t\t\t\t\t\t\tregistry.get(ref)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\theadlineOverride={\n\t\t\t\t\t\t\t\t\t\t\t\theadlineOverride as ReactNode | undefined\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tmarkerOverride={\n\t\t\t\t\t\t\t\t\t\t\t\tmarkerOverride as ReactNode | undefined\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tcustomDetails={customDetails}\n\t\t\t\t\t\t\t\t\t\t\trowClassName={resolveRowClassName(rowClassNames?.row, activity)}\n\t\t\t\t\t\t\t\t\t\t\tmarkerClassName={resolveRowClassName(rowClassNames?.marker, activity)}\n\t\t\t\t\t\t\t\t\t\t\tcontentClassName={resolveRowClassName(rowClassNames?.content, activity)}\n\t\t\t\t\t\t\t\t\t\t\tdetailsClassName={resolveRowClassName(rowClassNames?.details, activity)}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\n\t\t\t{!!slots?.footer && <div>{slots.footer}</div>}\n\t\t</Stack>\n\t);\n}\n\nActivityFeed.displayName = 'ActivityFeed';\n","/**\n * ActivityLog — canonical mixed-source activity surface.\n *\n * This is the single feature implementation for comments, audit events,\n * system events, domain events, inline mentions, composer chrome, row actions,\n * and collapsible details. `ActivityFeed` remains the lower-level activity-row\n * primitive inside this feature; consumers needing the full mixed log should\n * mount `ActivityLog`.\n */\nimport { MessageCircle } from 'lucide-react';\nimport { formatDistanceToNow, isValid, parseISO } from 'date-fns';\nimport { useCallback, useMemo, type ReactNode } from 'react';\n\nimport {\n\tCommentComposer,\n\tCommentItem,\n\ttype CommentUser,\n\tuseComments,\n} from '../comments';\nimport { MentionContent } from '../mentions';\nimport { useStrings } from '../../../lib/strings';\nimport { useDatesConfig } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\nimport { Text } from '../../typography';\nimport { Stack } from '../../base/structure';\n\nimport { ActivityFeed } from './activities-feed';\nimport { defaultActivitiesStrings } from './activities.strings';\nimport type {\n\tActivityAction,\n\tActivityFeedSlots,\n\tActivityItem,\n\tActivityLogActivityEntry,\n\tActivityLogClassNameValue,\n\tActivityLogEntry,\n\tActivityLogProps,\n\tActivityLogRenderer,\n\tActivityRowClassNames,\n\tActivityTone,\n} from './activities.types';\nimport { ActivityMarker } from './partials/activity-marker';\n\nfunction sortEntries<T extends { timestamp?: string }>(\n\tentries: ReadonlyArray<T>,\n\torder: 'asc' | 'desc',\n): ReadonlyArray<T> {\n\tconst arr = [...entries];\n\tarr.sort((a, b) => {\n\t\tconst ta = a.timestamp ? new Date(a.timestamp).getTime() : 0;\n\t\tconst tb = b.timestamp ? new Date(b.timestamp).getTime() : 0;\n\t\treturn order === 'asc' ? ta - tb : tb - ta;\n\t});\n\treturn arr;\n}\n\nfunction toActivityTone(tone: ActivityLogActivityEntry['tone']): ActivityTone {\n\treturn tone ?? 'secondary';\n}\n\nfunction toActor(actor: ActivityLogActivityEntry['actor']) {\n\tif (!actor) return undefined;\n\treturn typeof actor === 'string' ? { name: actor } : actor;\n}\n\nfunction hasRenderableNode(value: ReactNode): boolean {\n\treturn value !== null && value !== undefined && value !== false;\n}\n\nfunction resolveEventClassName<\n\tTUser extends CommentUser,\n\tTMeta,\n\tTResource extends string,\n>(\n\tvalue: ActivityLogClassNameValue<TResource> | undefined,\n\tentry: ActivityLogEntry<TUser, TMeta, TResource> | undefined,\n) {\n\tif (!value || !entry || entry.kind === 'comment') return undefined;\n\treturn typeof value === 'function'\n\t\t? value(entry as ActivityLogActivityEntry<TResource>)\n\t\t: value;\n}\n\nfunction mapEventToActivity<TResource extends string>(\n\tentry: ActivityLogActivityEntry<TResource>,\n\tresources: ActivityLogProps<CommentUser, unknown, TResource>['resources'],\n): ActivityItem<ActivityLogActivityEntry<TResource>> {\n\tconst actor = toActor(entry.actor);\n\tconst description =\n\t\tentry.descriptionHtml ? (\n\t\t\t<MentionContent\n\t\t\t\thtml={entry.descriptionHtml}\n\t\t\t\tmentions={entry.mentions}\n\t\t\t\tresources={resources}\n\t\t\t/>\n\t\t) : entry.description;\n\n\treturn {\n\t\tid: entry.id,\n\t\tevent: entry.event ?? entry.kind,\n\t\t// Only a consumer-supplied label earns a source chip; `kind` is internal.\n\t\tsource: typeof entry.label === 'string' ? entry.label : undefined,\n\t\tactor,\n\t\tcreatedAt: entry.timestamp,\n\t\ttimestamp: undefined,\n\t\ticonOverride: entry.icon,\n\t\ttoneOverride: toActivityTone(entry.tone),\n\t\theadline: typeof entry.headline === 'string' ? entry.headline : undefined,\n\t\tdescription,\n\t\tmetadata: entry.metadata,\n\t\tchanges: entry.changes,\n\t\tdetails: entry.details,\n\t\tcollapsible: entry.collapsible,\n\t\tdefaultExpanded: entry.defaultExpanded,\n\t\tdata: entry,\n\t\tsegments:\n\t\t\tentry.action || entry.target || entry.label || !entry.headline\n\t\t\t\t? [\n\t\t\t\t\t\t...(actor\n\t\t\t\t\t\t\t? [{ type: 'actor' as const, text: actor.name, actorId: actor.id }]\n\t\t\t\t\t\t\t: []),\n\t\t\t\t\t\t...(entry.action\n\t\t\t\t\t\t\t? [{ type: 'text' as const, text: entry.action }]\n\t\t\t\t\t\t\t: []),\n\t\t\t\t\t\t...(hasRenderableNode(entry.target)\n\t\t\t\t\t\t\t? [{ type: 'value' as const, text: String(entry.target) }]\n\t\t\t\t\t\t\t: []),\n\t\t\t\t\t\t...(!actor && !entry.action && !entry.target && entry.headline\n\t\t\t\t\t\t\t? [{ type: 'text' as const, text: String(entry.headline) }]\n\t\t\t\t\t\t\t: []),\n\t\t\t\t\t]\n\t\t\t\t: undefined,\n\t};\n}\n\nexport function ActivityLog<\n\tTUser extends CommentUser = CommentUser,\n\tTMeta = unknown,\n\tTResource extends string = string,\n>(props: ActivityLogProps<TUser, TMeta, TResource>) {\n\tconst {\n\t\tentries,\n\t\torder = 'desc',\n\t\titemSpacing = 'relaxed',\n\t\tresources,\n\t\tonResourceSearch,\n\t\tcanModerate,\n\t\tonCommentDelete,\n\t\tonCommentReact,\n\t\tonCommentReply,\n\t\tonCommentPinToggle,\n\t\tstrings,\n\t\tactivityStrings: activityStringsProp,\n\t\trenderers,\n\t\trenderEventDetails,\n\t\teventDetailsCollapsible = true,\n\t\tdefaultExpandedIds,\n\t\texpandedIds,\n\t\tonExpandedIdsChange,\n\t\tonEventExpandedChange,\n\t\tonEventAction,\n\t\tclassNames,\n\t\tcomposer,\n\t\tbare = false,\n\t\ttitle,\n\t\tgetMediaUrl,\n\t\tgetMediaName,\n\t\tgetStatusLabel,\n\t\tformatRelativeTime,\n\t\tclassName,\n\t} = props;\n\n\tconst activityStrings = useStrings(defaultActivitiesStrings, activityStringsProp);\n\tconst dates = useDatesConfig();\n\tconst formatRelative = useCallback(\n\t\t(iso: string) => {\n\t\t\tconst configuredFormatter =\n\t\t\t\tformatRelativeTime ?? dates.formatRelativeTime;\n\t\t\tif (configuredFormatter) return configuredFormatter(iso);\n\n\t\t\tconst parsed = parseISO(iso);\n\t\t\tif (!isValid(parsed)) return iso;\n\t\t\tconst locale = dates.locale;\n\t\t\treturn formatDistanceToNow(parsed, {\n\t\t\t\taddSuffix: true,\n\t\t\t\t...(locale ? { locale } : {}),\n\t\t\t});\n\t\t},\n\t\t[dates.formatRelativeTime, dates.locale, formatRelativeTime],\n\t);\n\n\tconst composerState = useComments<CommentUser, unknown, TResource>({\n\t\tonSubmit: composer?.onSubmit,\n\t\tonAfterMutate: composer?.onAfterMutate,\n\t\tonError: composer?.onError,\n\t});\n\n\tconst sorted = useMemo(\n\t\t() => sortEntries(entries, order),\n\t\t[entries, order],\n\t);\n\n\tconst activities = useMemo(\n\t\t() =>\n\t\t\tsorted.map((entry) => {\n\t\t\t\tif (entry.kind === 'comment') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: entry.id,\n\t\t\t\t\t\tevent: 'comment',\n\t\t\t\t\t\tsource: 'comment',\n\t\t\t\t\t\tcreatedAt: entry.timestamp,\n\t\t\t\t\t\tdata: entry,\n\t\t\t\t\t} satisfies ActivityItem<ActivityLogEntry<TUser, TMeta, TResource>>;\n\t\t\t\t}\n\t\t\t\treturn mapEventToActivity(\n\t\t\t\t\tentry as ActivityLogActivityEntry<TResource>,\n\t\t\t\t\tresources,\n\t\t\t\t) as ActivityItem<ActivityLogEntry<TUser, TMeta, TResource>>;\n\t\t\t}),\n\t\t[resources, sorted],\n\t);\n\n\tconst eventRowClassNames = useMemo<\n\t\tActivityRowClassNames<ActivityLogEntry<TUser, TMeta, TResource>>\n\t>(\n\t\t() => ({\n\t\t\trow: (activity) => resolveEventClassName(classNames?.eventRow, activity.data),\n\t\t\tmarker: (activity) => resolveEventClassName(classNames?.eventMarker, activity.data),\n\t\t\tcontent: (activity) => resolveEventClassName(classNames?.eventContent, activity.data),\n\t\t\tdetails: (activity) => resolveEventClassName(classNames?.eventDetails, activity.data),\n\t\t}),\n\t\t[classNames],\n\t);\n\n\tconst composerBlock = composer?.enabled ? (\n\t\t<div className=\"activity-log--composer\">\n\t\t\t<CommentComposer<TResource>\n\t\t\t\tcontext={composer.context}\n\t\t\t\tcanComment\n\t\t\t\tsubmitting={composerState.isSubmitting}\n\t\t\t\terrors={composerState.formErrors}\n\t\t\t\tresetKey={composerState.resetKey}\n\t\t\t\tonSubmit={composerState.submit}\n\t\t\t\tresources={resources}\n\t\t\t\tonResourceSearch={onResourceSearch}\n\t\t\t\tstrings={strings}\n\t\t\t\tplaceholder={composer.placeholder}\n\t\t\t\tautoFocus={composer.autoFocus}\n\t\t\t\tinlineSubmit={composer.inlineSubmit ?? false}\n\t\t\t/>\n\t\t</div>\n\t) : null;\n\tconst composerPosition = composer?.position ?? 'top';\n\n\tconst actionsForActivity = (\n\t\tactivity: ActivityItem<ActivityLogEntry<TUser, TMeta, TResource>>,\n\t): readonly ActivityAction<ActivityLogEntry<TUser, TMeta, TResource>>[] => {\n\t\tconst entry = activity.data;\n\t\tif (!entry || entry.kind === 'comment') return [];\n\t\tconst eventEntry = entry as ActivityLogActivityEntry<TResource>;\n\t\treturn (eventEntry.actions ?? []).map((action) => ({\n\t\t\tid: action.id,\n\t\t\tlabel: action.label,\n\t\t\ticon: action.icon,\n\t\t\thref: action.href,\n\t\t\tdisabled: action.disabled,\n\t\t\ttone: action.tone,\n\t\t\tpresentation: action.presentation,\n\t\t\tonClick: () => action.onSelect?.(eventEntry),\n\t\t}));\n\t};\n\n\tconst slots: ActivityFeedSlots<ActivityLogEntry<TUser, TMeta, TResource>> = {\n\t\theader: composerPosition === 'top' ? composerBlock : undefined,\n\t\tfooter: composerPosition === 'bottom' ? composerBlock : undefined,\n\t\trenderRow: (activity, ctx) => {\n\t\t\tconst entry = activity.data;\n\t\t\tif (!entry) return undefined;\n\t\t\tconst custom = renderers?.[entry.kind] as\n\t\t\t\t| ActivityLogRenderer<TUser, TMeta, TResource>\n\t\t\t\t| undefined;\n\t\t\tif (custom) {\n\t\t\t\treturn custom(entry, {\n\t\t\t\t\tresources,\n\t\t\t\t\taccessors: {\n\t\t\t\t\t\tgetMediaUrl,\n\t\t\t\t\t\tgetMediaName,\n\t\t\t\t\t\tgetStatusLabel,\n\t\t\t\t\t\tformatRelativeTime: formatRelative,\n\t\t\t\t\t},\n\t\t\t\t\tstrings,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (entry.kind !== 'comment') return undefined;\n\t\t\tconst commentEntry = entry as Extract<\n\t\t\t\tActivityLogEntry<TUser, TMeta, TResource>,\n\t\t\t\t{ kind: 'comment' }\n\t\t\t>;\n\t\t\treturn (\n\t\t\t\t<Stack\n\t\t\t\t\tdirection=\"horizontal\"\n\t\t\t\t\tgap=\"md\"\n\t\t\t\t\talign=\"stretch\"\n\t\t\t\t\twrap={false}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'activity-log--comment-row relative py-space-xs',\n\t\t\t\t\t\t!ctx.isLast && (\n\t\t\t\t\t\t\tctx.itemSpacing === 'compact'\n\t\t\t\t\t\t\t\t? 'pb-space-sm'\n\t\t\t\t\t\t\t\t: ctx.itemSpacing === 'relaxed'\n\t\t\t\t\t\t\t\t\t? 'pb-space-xl'\n\t\t\t\t\t\t\t\t\t: 'pb-space-md'\n\t\t\t\t\t\t),\n\t\t\t\t\t)}\n\t\t\t\t\tdata-event-id={commentEntry.id}\n\t\t\t\t>\n\t\t\t\t\t<ActivityMarker\n\t\t\t\t\t\ticon={MessageCircle}\n\t\t\t\t\t\ttone=\"neutral\"\n\t\t\t\t\t\tdensity={ctx.density}\n\t\t\t\t\t\tlast={ctx.isLast}\n\t\t\t\t\t/>\n\t\t\t\t\t<div className=\"activity-log--comment min-w-0 flex-1\">\n\t\t\t\t\t\t<CommentItem<TUser, TMeta, TResource>\n\t\t\t\t\t\t\tcomment={commentEntry.comment}\n\t\t\t\t\t\t\tcanModerate={canModerate}\n\t\t\t\t\t\t\tonDelete={onCommentDelete}\n\t\t\t\t\t\t\tonPinToggle={onCommentPinToggle}\n\t\t\t\t\t\t\tonReact={onCommentReact}\n\t\t\t\t\t\t\tonReply={onCommentReply}\n\t\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t\t\tresources={resources}\n\t\t\t\t\t\t\tgetMediaUrl={getMediaUrl}\n\t\t\t\t\t\t\tgetMediaName={getMediaName}\n\t\t\t\t\t\t\tgetStatusLabel={getStatusLabel}\n\t\t\t\t\t\t\tformatRelativeTime={formatRelative}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</Stack>\n\t\t\t);\n\t\t},\n\t\trenderDetails: (activity, ctx) => {\n\t\t\tconst entry = activity.data;\n\t\t\tif (!entry || entry.kind === 'comment') return null;\n\t\t\treturn renderEventDetails?.(\n\t\t\t\tentry as ActivityLogActivityEntry<TResource>,\n\t\t\t\t{\n\t\t\t\t\texpanded: ctx.expanded,\n\t\t\t\t\tsetExpanded: ctx.setExpanded,\n\t\t\t\t\trelativeTime: ctx.relativeTime,\n\t\t\t\t\tisLast: ctx.isLast,\n\t\t\t\t\tresources,\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t};\n\n\tconst inner = (\n\t\t<ActivityFeed<ActivityLogEntry<TUser, TMeta, TResource>>\n\t\t\tactivities={activities}\n\t\t\tdensity=\"rich\"\n\t\t\titemSpacing={itemSpacing}\n\t\t\tgroupByDate\n\t\t\tresources={{}}\n\t\t\tstrings={activityStringsProp}\n\t\t\tdetailsCollapsible={eventDetailsCollapsible}\n\t\t\tdefaultExpandedIds={defaultExpandedIds}\n\t\t\texpandedIds={expandedIds}\n\t\t\tonExpandedIdsChange={onExpandedIdsChange}\n\t\t\tformatRelativeTime={formatRelative}\n\t\t\tgetSourceLabel={(source) => activityStrings.sources[source] ?? source}\n\t\t\tactionsForActivity={actionsForActivity}\n\t\t\trowClassNames={eventRowClassNames}\n\t\t\tonAction={(actionId, activity) => {\n\t\t\t\tconst entry = activity.data;\n\t\t\t\tif (entry && entry.kind !== 'comment') {\n\t\t\t\t\tonEventAction?.(actionId, entry as ActivityLogActivityEntry<TResource>);\n\t\t\t\t}\n\t\t\t}}\n\t\t\tonActivityExpandedChange={(activity, expanded) => {\n\t\t\t\tconst entry = activity.data;\n\t\t\t\tif (entry && entry.kind !== 'comment') {\n\t\t\t\t\tonEventExpandedChange?.(\n\t\t\t\t\t\tentry as ActivityLogActivityEntry<TResource>,\n\t\t\t\t\t\texpanded,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}}\n\t\t\tslots={slots}\n\t\t\tclassName={cn(\n\t\t\t\t'activity-log--component',\n\t\t\t\tclassNames?.list,\n\t\t\t\tbare && className,\n\t\t\t)}\n\t\t/>\n\t);\n\n\tif (bare) {\n\t\treturn inner;\n\t}\n\n\tconst label = title ?? activityStrings.title;\n\tconst ariaLabel = typeof label === 'string' ? label : undefined;\n\n\treturn (\n\t\t<Stack\n\t\t\trender={<section />}\n\t\t\tgap=\"lg\"\n\t\t\tdata-component=\"activity-log\"\n\t\t\tdata-slot=\"activity-log\"\n\t\t\tclassName={cn('activity-log--component', className)}\n\t\t\taria-label={ariaLabel}\n\t\t>\n\t\t\t{!!label && (\n\t\t\t\t<Text weight=\"semibold\">\n\t\t\t\t\t{label}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t\t{inner}\n\t\t</Stack>\n\t);\n}\n\nActivityLog.displayName = 'ActivityLog';\n","/**\n * ActivityEventAdapter — map raw event-like records into ActivityLog entries.\n *\n * This is intentionally pure and framework-agnostic. Consumers pass accessors\n * for their domain shape; the package returns the canonical ActivityLogEntry\n * shape used by the timeline.\n */\nimport type {\n\tActivityActor,\n\tActivityChange,\n\tActivityLogActivityEntry,\n\tActivityLogCommentEntry,\n\tActivityLogEntry,\n\tActivityLogEventAction,\n\tActivityTone,\n} from './activities.types';\nimport type { CommentData, CommentUser } from '../comments';\nimport type { Mention } from '../mentions';\nimport type { ReactNode } from 'react';\n\nexport interface ActivityEventAdapterAccessors<\n\tTRaw,\n\tTUser extends CommentUser = CommentUser,\n\tTMeta = unknown,\n\tTResource extends string = string,\n> {\n\tid: (record: TRaw) => string;\n\ttimestamp: (record: TRaw) => string;\n\tkind?: (record: TRaw) => ActivityLogEntry<TUser, TMeta, TResource>['kind'];\n\tevent?: (record: TRaw) => string | undefined;\n\tactor?: (record: TRaw) => string | ActivityActor | undefined;\n\ttitle?: (record: TRaw) => ReactNode;\n\taction?: (record: TRaw) => string | undefined;\n\ttarget?: (record: TRaw) => ReactNode;\n\tdescription?: (record: TRaw) => ReactNode;\n\tdescriptionHtml?: (record: TRaw) => string | undefined;\n\tmentions?: (record: TRaw) => ReadonlyArray<Mention<TResource>> | undefined;\n\tsource?: (record: TRaw) => ReactNode;\n\tstatus?: (record: TRaw) => ReactNode;\n\ttone?: (record: TRaw) => ActivityTone | undefined;\n\tmetadata?: (record: TRaw) => ReadonlyArray<{ label: string; value: ReactNode }> | undefined;\n\tchanges?: (record: TRaw) => readonly ActivityChange[] | undefined;\n\tdetails?: (record: TRaw) => ReactNode;\n\trowActions?: (record: TRaw) => ReadonlyArray<ActivityLogEventAction<TResource>> | undefined;\n\tcomment?: (record: TRaw) => CommentData<TUser, TMeta, TResource> | undefined;\n\tdata?: (record: TRaw) => unknown;\n}\n\nfunction defaultKind<TRaw>(record: TRaw) {\n\tif (typeof record === 'object' && record !== null && 'kind' in record) {\n\t\tconst kind = (record as { kind?: unknown }).kind;\n\t\tif (typeof kind === 'string') return kind;\n\t}\n\treturn 'event';\n}\n\nexport function toActivityLogEntry<\n\tTRaw,\n\tTUser extends CommentUser = CommentUser,\n\tTMeta = unknown,\n\tTResource extends string = string,\n>(\n\trecord: TRaw,\n\taccessors: ActivityEventAdapterAccessors<TRaw, TUser, TMeta, TResource>,\n): ActivityLogEntry<TUser, TMeta, TResource> {\n\tconst kind = accessors.kind?.(record) ?? defaultKind(record);\n\tconst id = accessors.id(record);\n\tconst timestamp = accessors.timestamp(record);\n\tconst comment = accessors.comment?.(record);\n\n\tif (kind === 'comment' && comment) {\n\t\treturn {\n\t\t\tid,\n\t\t\tkind: 'comment',\n\t\t\ttimestamp,\n\t\t\tcomment,\n\t\t} satisfies ActivityLogCommentEntry<TUser, TMeta, TResource>;\n\t}\n\n\treturn {\n\t\tid,\n\t\tkind: typeof kind === 'string' ? kind : 'event',\n\t\ttimestamp,\n\t\tevent: accessors.event?.(record),\n\t\tactor: accessors.actor?.(record),\n\t\taction: accessors.action?.(record),\n\t\ttarget: accessors.target?.(record) ?? accessors.status?.(record),\n\t\tlabel: accessors.source?.(record),\n\t\theadline: accessors.title?.(record),\n\t\tdescription: accessors.description?.(record),\n\t\tdescriptionHtml: accessors.descriptionHtml?.(record),\n\t\tmentions: accessors.mentions?.(record),\n\t\ttone: accessors.tone?.(record),\n\t\tmetadata: accessors.metadata?.(record),\n\t\tchanges: accessors.changes?.(record),\n\t\tdetails: accessors.details?.(record),\n\t\tactions: accessors.rowActions?.(record),\n\t\tdata: accessors.data?.(record) ?? record,\n\t} satisfies ActivityLogActivityEntry<TResource>;\n}\n\nexport function createActivityEventAdapter<\n\tTRaw,\n\tTUser extends CommentUser = CommentUser,\n\tTMeta = unknown,\n\tTResource extends string = string,\n>(\n\taccessors: ActivityEventAdapterAccessors<TRaw, TUser, TMeta, TResource>,\n) {\n\treturn (record: TRaw) =>\n\t\ttoActivityLogEntry<TRaw, TUser, TMeta, TResource>(record, accessors);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA4CA,IAAaiB,KAA0C;CACtD,MAAMC;CACN,MAAM;AACP,GAEaC,KAAqD;CAEjE,SAAS;EAAE,MAAMC;EAAM,MAAM;EAAW,OAAO;CAAU;CACzD,SAAS;EAAE,MAAMC;EAAQ,MAAM;EAAW,OAAO;CAAU;CAC3D,QAAQ;EAAE,MAAMC;EAAU,MAAM;EAAW,OAAO;CAAS;CAC3D,SAAS;EAAE,MAAMC;EAAQ,MAAM;EAAe,OAAO;CAAU;CAC/D,WAAW;EAAE,MAAMC;EAAK,MAAM;EAAe,OAAO;CAAY;CAChE,UAAU;EAAE,MAAMC;EAAU,MAAM;EAAW,OAAO;CAAW;CAG/D,gBAAgB;EAAE,MAAMC;EAAgB,MAAM;EAAW,OAAO;CAAiB;CACjF,mBAAmB;EAAE,MAAMA;EAAgB,MAAM;EAAW,OAAO;CAAiB;CACpF,iBAAiB;EAAE,MAAMA;EAAgB,MAAM;EAAW,OAAO;CAAoB;CAGrF,UAAU;EAAE,MAAMC;EAAU,MAAM;EAAW,OAAO;CAAW;CAC/D,YAAY;EAAE,MAAMC;EAAW,MAAM;EAAW,OAAO;CAAa;CAGpE,WAAW;EAAE,MAAMC;EAAM,MAAM;EAAW,OAAO;CAAa;CAC9D,gBAAgB;EAAE,MAAMC;EAAW,MAAM;EAAW,OAAO;CAAkB;CAC7E,aAAa;EAAE,MAAMC;EAAU,MAAM;EAAW,OAAO;CAAe;CACtE,cAAc;EAAE,MAAMA;EAAU,MAAM;EAAW,OAAO;CAAgB;CACxE,cAAc;EAAE,MAAMC;EAAO,MAAM;EAAe,OAAO;CAAgB;CACzE,aAAa;EAAE,MAAMA;EAAO,MAAM;EAAe,OAAO;CAAe;CAGvE,iBAAiB;EAAE,MAAMC;EAAe,MAAM;EAAW,OAAO;CAAiB;CACjF,iBAAiB;EAAE,MAAMA;EAAe,MAAM;EAAe,OAAO;CAAkB;CAGtF,MAAM;EAAE,MAAMC;EAAO,MAAM;EAAW,OAAO;CAAO;CACpD,UAAU;EAAE,MAAMR;EAAgB,MAAM;EAAW,OAAO;CAAW;CACrE,WAAW;EAAE,MAAMS;EAAa,MAAM;EAAW,OAAO;CAAY;CACpE,WAAW;EAAE,MAAMC;EAAO,MAAM;EAAW,OAAO;CAAY;CAC9D,SAAS;EAAE,MAAMC;EAAa,MAAM;EAAW,OAAO;CAAe;CAGrE,WAAW;EAAE,MAAMC;EAAM,MAAM;EAAW,OAAO;CAAY;CAC7D,SAAS;EAAE,MAAMC;EAAM,MAAM;EAAW,OAAO;CAAU;CACzD,QAAQ;EAAE,MAAMC;EAAU,MAAM;EAAW,OAAO;CAAS;CAG3D,QAAQ;EAAE,MAAMC;EAAe,MAAM;EAAe,OAAO;CAAS;CACpE,qBAAqB;EAAE,MAAMA;EAAe,MAAM;EAAe,OAAO;CAAsB;AAC/F;AAGA,SAAgBC,EACf,GACA,GACsB;CACtB,OAAOC,EAAIC,MAAU3B;AACtB;;;AClEA,IAAa4B,KAA8C;CAC1D,OAAO;CACP,OAAO;CACP,SAAS;CACT,OAAO;CACP,WAAW;CACX,SAAS;CACT,KAAK;CACL,aAAa;CACb,aAAa;CACb,cAAc;CACd,WAAW;CACX,SAAS;EACR,SAAS;EACT,MAAM;EACN,aAAa;EACb,cAAc;EACd,QAAQ;CACT;CACA,QAAQ,CAAC;AACV;AAGA,SAAgBC,GACf,GACA,GACS;CACT,OAAOC,EAAS,QAAQ,yBAAyB,GAAO,MAAQ;EAC/D,IAAMC,IAAIC,EAAOC;EACjB,OAAOF,MAAM,KAAA,IAAYG,IAAQ,OAAOH,CAAC;CAC1C,CAAC;AACF;;;ACfA,SAASI,GACR,GACA,GACA,GACS;CACT,IAAI,CAACC,GAAK,OAAOC,EAAQ;CACzB,IAAMC,IAAO,IAAI,KAAKF,CAAG;CACzB,IAAI,CAACG,EAAQD,CAAI,GAAG,OAAOD,EAAQ;CACnC,IAAIG,EAAQF,CAAI,GAAG,OAAOD,EAAQ;CAClC,IAAII,EAAYH,CAAI,GAAG,OAAOD,EAAQ;CACtC,IAAI;EAGH,OAAO,IAAI,KAAK,eAAeK,GAAQ,QAAQ,SAAS,EAAE,WAAW,OAAO,CAAC,CAAC,CAAC,OAAOJ,CAAI;CAC3F,QAAQ;EACP,IAAI;GACH,OAAOK,EAAOL,GAAM,MAAMI,IAAS,EAAE,UAAO,IAAI,KAAA,CAAS;EAC1D,QAAQ;GACP,OAAON;EACR;CACD;AACD;AAEA,SAAgBQ,GAAiC,EAChD,eACA,iBAAc,IACd,uBAAoB,IACpB,uBACA,gBACA,wBACA,WACA,YACA,2BAC+D;CAC/D,IAAM,CAACC,GAAaC,KAAkBC,EAAkC,CAAC,CAAC,GACpEC,IAAeC,MAAgB,KAAA,GAE/BC,IAAQC,QAA0C;EACvD,IAAMC,oBAAO,IAAI,IAAoB;EACrC,OAAOC,EAAW,KAAK,MAAa;GAKnC,IAAMC,IAAU;IAJD,OAAOC,EAAS,MAAM,EAAE,CAAC,CAAC,KAIxB;IAHC,OAAOA,EAAS,aAAa,EAAE,CAAC,CAAC,KAG1B;IAFX,OAAOA,EAAS,SAAS,EAAE,CAAC,CAAC,KAEP;IADrB,OAAOA,EAAS,UAAU,EAAE,CAAC,CAAC,KACF;GAAM,CAAC,CAAC,KAAK,GAAG,GACrDC,KAAcJ,EAAK,IAAIE,CAAO,KAAK,KAAK;GAE9C,OADAF,EAAK,IAAIE,GAASE,CAAU,GACrB;IAAE;IAAU,KAAK,GAAGF,EAAQ,GAAGE;GAAa;EACpD,CAAC;CACF,GAAG,CAACH,CAAU,CAAC,GAETI,IAASN,QAA0C;EACxD,IAAI,CAACO,GACJ,OAAOR,EAAM,SAAS,IAAI,CAAC;GAAE,OAAO;GAAI,OAAOA;EAAM,CAAC,IAAI,CAAC;EAE5D,IAAMS,IAAkC,CAAC,GACrCC,IAAe,YACfC,IAA2C,CAAC,GAE1CC,KAAY,MACjBC,IACGA,EAAqB3B,GAAKC,CAAO,IACjCF,GAAsBC,GAAKC,GAASK,CAAM;EAE9C,KAAK,IAAMsB,KAAQd,GAAO;GAEzB,IAAMe,IAAQH,EADFE,EAAK,SAAS,aAAa,IACb;GAC1B,AAAIC,MAAUL,IAObC,EAAa,KAAKG,CAAI,KANlBH,EAAa,SAAS,KACzBF,EAAI,KAAK;IAAE,OAAOC;IAAc,OAAOC;GAAa,CAAC,GAEtD,IAAeI,GACf,IAAe,CAACD,CAAI;EAItB;EAIA,OAHIH,EAAa,SAAS,KACzBF,EAAI,KAAK;GAAE,OAAOC;GAAc,OAAOC;EAAa,CAAC,GAE/CF;CACR,GAAG;EAACT;EAAOQ;EAAahB;EAAQL;EAAS0B;CAAoB,CAAC,GAExDG,IAAqBf,QAAc;EACxC,IAAMgB,IAAO,IAAI,IAAIC,KAAsB,CAAC,CAAC;EAC7C,KAAK,IAAMJ,KAAQd,GAClB,AAAIc,EAAK,SAAS,oBAAoB,MACrCG,EAAK,IAAIH,EAAK,SAAS,EAAE;EAG3B,OAAOG;CACR,GAAG,CAACjB,GAAOkB,CAAkB,CAAC,GAExBC,IAAwBlB,QACvB,IAAI,IAAIF,KAAe,CAAC,CAAC,GAC/B,CAACA,CAAW,CACb,GAEMqB,IAAcC,GAAa,GAAY,MAAmB;EAC/D,IAAMC,IAAaxB,IAChB,MAAM,KAAKqB,CAAqB,IAChCnB,EACC,QAAQ,MACRL,EAAYmB,EAAK,SAAS,QACxBE,EAAmB,IAAIF,EAAK,SAAS,EAAE,KAAKS,EAC/C,CAAC,CACA,KAAK,MAAST,EAAK,SAAS,EAAE,GAC5BG,IAAO,IAAI,IAAIK,CAAU;EAC/B,AAAIE,IAAOP,EAAK,IAAIQ,CAAE,IACjBR,EAAK,OAAOQ,CAAE;EACnB,IAAMC,IAAU,MAAM,KAAKT,CAAI;EAI/B,AAHKnB,KACJF,GAAgB,OAAa;GAAE,GAAG+B;IAAUF,IAAKD;EAAM,EAAE,GAE1DI,IAAsBF,CAAO;CAC9B,GAAG;EACFP;EACAH;EACAO;EACA5B;EACAG;EACAE;EACA4B;CACD,CAAC,GAEKC,IAAaR,GACjB,MACIvB,IAAqBqB,EAAsB,IAAIM,CAAE,IAC9C9B,EAAY8B,OAAQT,EAAmB,IAAIS,CAAE,KAAKF,IAE1D;EACCJ;EACAH;EACAO;EACA5B;EACAG;CACD,CACD,GAEMgC,IAAiBT,GAAa,MAAe;EAClD,EAAYI,GAAI,CAACI,EAAWJ,CAAE,CAAC;CAChC,GAAG,CAACI,GAAYT,CAAW,CAAC,GAEtBW,IAAYV,QAAkB;EACnC,IAAMJ,IAAgC,CAAC;EACvC,KAAK,IAAMe,KAAKhC,GAAO,EAAKgC,EAAE,SAAS,MAAM;EAE7C,AADKlC,KAAcF,EAAeqB,CAAI,GACtCW,IAAsB5B,EAAM,KAAK,MAAMgC,EAAE,SAAS,EAAE,CAAC;CACtD,GAAG;EAAClC;EAAcE;EAAO4B;CAAmB,CAAC,GAEvCK,IAAcZ,QAAkB;EACrC,IAAMJ,IAAgC,CAAC;EACvC,KAAK,IAAMe,KAAKhC,GAAO,EAAKgC,EAAE,SAAS,MAAM;EAE7C,AADKlC,KAAcF,EAAeqB,CAAI,GACtCW,IAAsB,CAAC,CAAC;CACzB,GAAG;EAAC9B;EAAcE;EAAO4B;CAAmB,CAAC;CAE7C,OAAO;EACN;EACA,OAAO5B,EAAM;EACb;EACA;EACA;EACA;EACA;CACD;AACD;;;AC5KA,SAAgBkC,GAAqB,EACpC,cACA,yBACgC,CAAC,GAA+B;CAChE,IAAM,CAACC,GAAUC,KAAevC,QACzBwC,KAAa,CAAC,CACrB,GAEMC,IAAUC,EAAOF,CAAS;CAChC,QAAgB;EACf,AAAIA,MAAcC,EAAQ,YACzB,EAAQ,UAAUD,GAClBD,EAAYC,KAAa,CAAC,CAAC;CAE7B,GAAG,CAACA,CAAS,CAAC;CAEd,IAAMG,IAAcD,EAAOE,CAAiB;CAC5C,QAAgB;EACf,EAAY,UAAUA;CACvB,GAAG,CAACA,CAAiB,CAAC;CAEtB,IAAMC,IAAOrB,GAAa,MAAmC;EAC5D,EAAY,UAAUJ,CAAI;CAC3B,GAAG,CAAC,CAAC,GAEC0B,IAAWtB,GACf,GAAa,MAAmC;EAChD,GAAa,MAAY;GACxB,IAAMJ,IAAO;IAAE,GAAGU;KAAU5C,IAAM6D;GAAO;GAEzC,OADAF,EAAKzB,CAAI,GACFA;EACR,CAAC;CACF,GACA,CAACyB,CAAI,CACN,GAEMG,IAASxB,GACb,GAAa,MAA6C;EAC1D,GAAa,MAAY;GACxB,IAAMyB,IAAWnB,EAAQ5C;GACzB,IAAI,CAAC+D,GAAU,OAAOnB;GACtB,IAAMV,IAAO;IACZ,GAAGU;KACF5C,IAAM;KAAE,GAAG+D;KAAU,GAAGC;IAAQ;GAClC;GAEA,OADAL,EAAKzB,CAAI,GACFA;EACR,CAAC;CACF,GACA,CAACyB,CAAI,CACN,GAEMM,IAAS3B,GACb,MAAgB;EAChB,GAAa,MAAY;GACxB,IAAI,EAAEtC,KAAO4C,IAAU,OAAOA;GAC9B,IAAMV,IAAO,EAAE,GAAGU,EAAQ;GAG1B,OAFA,OAAOV,EAAKlC,IACZ2D,EAAKzB,CAAI,GACFA;EACR,CAAC;CACF,GACA,CAACyB,CAAI,CACN,GAEMO,IAAS5B,GACb,MAAmC;EAEnC,AADAe,EAAYnB,CAAI,GAChByB,EAAKzB,CAAI;CACV,GACA,CAACyB,CAAI,CACN,GAEMQ,IAAQ7B,QAAkB;EAC/B,IAAMJ,IAAOqB,EAAQ,WAAW,CAAC;EAEjC,AADAF,EAAYnB,CAAI,GAChByB,EAAKzB,CAAI;CACV,GAAG,CAACyB,CAAI,CAAC;CAUT,OAAO;EAAE;EAAU,KARPrB,GACV,MAAsC;GACtC,IAAMtC,IAAM,OAAOoE,KAAQ,WAAWA,IAAMA,EAAI;GAChD,OAAOhB,EAASpD;EACjB,GACA,CAACoD,CAAQ,CAGS;EAAK;EAAU;EAAQ;EAAQ;EAAQ;CAAM;AACjE;;;AC9GA,SAASiB,GAAwB,GAA8B;CAC9D,IAAIC,MAAS,eAAe,OAAO;CACnC,IAAIA,MAAS,aAAaA,MAAS,aAAa,OAAOA;AAExD;AAEA,SAAgBC,GAAqC,EACpD,aACA,YACA,aACA,YACmC;CACnC,IAAIC,EAAQ,WAAW,GAAG,OAAO;CACjC,IAAMC,IAAkCD,EAAQ,KAAK,OAAY;EAChE,IAAIE,EAAO;EACX,MAAMA,EAAO;EACb,OAAOA,EAAO;EACd,MAAMA,EAAO;EACb,UAAUA,EAAO;EACjB,SAASL,GAAwBK,EAAO,IAAI;EAC5C,eAAe;GAEd,AADAA,EAAO,UAAUpD,CAAQ,GACzBqD,IAAWD,EAAO,IAAIpD,CAAQ;EAC/B;CACD,EAAE;CAEF,OACC,kBAAC/D,GAAD;EACC,SAASkH;EACT,QAAQzC;EACR,OAAM;EACN,SAAQ;EACR,eAAA;EACA,iBAAgB;EAChB,aAAa;GACZ,MAAM;GACN,UAAU;GACV,WAAW;EACZ;CACA,CAAA;AAEH;;;AC7CA,SAAS4C,GAAY,EAAE,aAAsC;CAC5D,IAAMC,IAASC,EAAO,QAAQ,QAAQA,EAAO,QAAQ,KAAA,GAC/CC,IAASD,EAAO,QAAQ,QAAQA,EAAO,QAAQ,KAAA;CAUrD,OARI,CAACD,KAAU,CAACE,IAEd,kBAAC7H,GAAD;EAAM,KAAI;EACR,UAAA4H,EAAO;CACH,CAAA,IAKP,kBAAC5H,GAAD;EAAM,KAAI;EAAO,WAAU;EAA3B,UAAA;GACE,CAAC,CAAC2H,KACD,kBAAC3H,GAAD;IACA,KAAI;IACJ,MAAK;IACL,WAAU;IAET,UAAA4H,EAAO;GACH,CAAA;GAEND,KAAUE,KACV,kBAAC7H,GAAD;IAAM,KAAI;IAAO,MAAK;IAAU,MAAK;IAAY,UAAA;GAE3C,CAAA;GAEN,CAAC,CAAC6H,KACF,kBAAC7H,GAAD;IACC,KAAI;IACJ,MAAK;IACL,WAAU;IAET,UAAA4H,EAAO;GACH,CAAA;EAEF;;AAER;AAEA,SAAgBE,GAAgB,EAAE,YAAS,gBAAmC;CAE7E,OADIC,EAAQ,WAAW,IAAU,OAEhC,kBAAC,OAAD;EAAK,WAAWhI,EACd,+BACA,mEACAiI,CACD;EACD,UAAA,kBAAC5H,GAAD;GAAO,KAAI;GACT,UAAA2H,EAAQ,KAAK,MACb,kBAAC,OAAD;IAEC,WAAU;IAFX,UAAA,CAIC,kBAAC/H,GAAD;KACC,MAAK;KACL,MAAK;KACL,QAAO;KACP,WAAU;KAET,UAAA4H,EAAO;IACH,CAAA,GACN,kBAACF,IAAD,EAAqB,UAAS,CAAA,CAC1B;GAZC,GAAA,GAAGE,EAAO,IAAI,GAAGA,EAAO,OAYzB,CACL;EACK,CAAA;CACF,CAAA;AAEP;;;ACrEA,SAAgBK,GAAkB,EACjC,UACA,UACA,gBAC0B;CAE1B,OADInD,MAAU,KAAW,OAExB,kBAAC1E,GAAD;EAAO,KAAI;EACV,WAAWL,EACV,kCACA,CAACmI,KAAS,eACVF,CACD;EAEA,UAAA,kBAAChI,GAAD;GAAM,MAAK;GAAK,MAAK;GAAY,QAAO;GAAU,UAAA8E;EAAY,CAAA;CACxD,CAAA;AAET;;;ACnBA,SAAgBqD,GAAmB,EAClC,UACA,SACA,gBAC2B;CAC3B,OACC,kBAAC5H,GAAD;EACQ;EACP,aAAa6H,KAAQ;EACrB,OAAO,kBAACC,GAAD;GAAU,WAAU;GAAY,eAAY;EAAQ,CAAA;EAC3D,cAAa;EACb,SAAQ;EACR,WAAWtI,EAAG,mCAAmCiI,CAAS;CAC1D,CAAA;AAEH;;;ACTA,IAAaM,KAAyD;CACrE,SAAS;EACR,IAAI;EACJ,IAAI;EACJ,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ;CACT;CACA,SAAS;EACR,IAAI;EACJ,IAAI;EACJ,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ;CACT;CACA,SAAS;EACR,IAAI;EACJ,IAAI;EACJ,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ;CACT;CACA,aAAa;EACZ,IAAI;EACJ,IAAI;EACJ,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ;CACT;CACA,MAAM;EACL,IAAI;EACJ,IAAI;EACJ,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ;CACT;CACA,SAAS;EACR,IAAI;EACJ,IAAI;EACJ,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ;CACT;CACA,WAAW;EACV,IAAI;EACJ,IAAI;EACJ,KAAK;EACL,MAAM;EACN,QAAQ;EACR,QAAQ;CACT;AACD,GAGaC,KAAsD;CAClE,SAAS;CACT,SAAS;CACT,SAAS;CACT,aAAa;CACb,MAAM;CACN,SAAS;CACT,WAAW;AACZ;;;AC3DA,SAAgBC,GAAoB,EACnC,aACA,WACA,iBACA,cAC4B;CAE5B,IAAMC,IAAUH,GADW3B,GAAQ,QAAQ,YAErC+B,IAAO/B,GAAQ,QAAQ7F,GACvBgE,IAAQ6B,GAAQ,SAASgC,KAAgBC,EAAS,SAASA,EAAS,KACpEC,IAAc,OAAOC,KAAY,YAEjCC,IACL,kBAAAnJ,GAAA,EAAA,UAAA;EACC,kBAAC8I,GAAD,EAAM,WAAW3I,EAAG,yBAAyB0I,EAAQ,EAAE,EAAI,CAAA;EAC3D,kBAACzI,GAAD;GAAM,KAAI;GAAO,QAAO;GAAS,YAAW;GAAO,WAAWyI,EAAQ;GACpE,UAAA3D;EACI,CAAA;EACL,CAAC,CAAC6B,GAAQ,QAAQA,EAAO,KAAK,SAAS,KACvC,kBAAC3G,GAAD;GACC,KAAI;GACJ,MAAK;GACL,MAAK;GACL,WAAU;GAET,UAAA2G,EAAO,KAAK,KAAK,KAAK;EAClB,CAAA;EAEN,CAAC,CAACA,GAAQ,SACV,kBAACrG,GAAD;GACC,QAAA;GACA,MAAK;GACL,MAAMiI,GAAmB5B,EAAO,MAAM,QAAQ;GAC9C,WAAU;GAET,UAAAA,EAAO,MAAM;EACR,CAAA;CAEP,EAAA,CAAA,GAGGqC,IAAYjJ,EACjB,uFACA,uCACA0I,EAAQ,QACRI,KACC,gIACF;CAqBA,OAnBIA,IAEF,kBAAC3I,GAAD;EACC,MAAK;EACL,MAAK;EACL,aAAY;EACZ,MAAK;EACL,UAAU,MAAM;GAEf,AADA,EAAE,gBAAgB,GAClB4I,IAAU;EACX;EACA,WAAW/I,EAAG,gEAAgE0I,EAAQ,MAAM;EAC5F,OAAO9B,GAAQ;EAEd,UAAAoC;CACM,CAAA,IAKT,kBAAC,QAAD;EAAM,WAAWhJ,EAAG,oCAAoCiJ,CAAS;EAAG,OAAOrC,GAAQ;EACjF,UAAAoC;CACI,CAAA;AAER;;;AC3DA,SAASE,GAAiB,EACzB,YACA,SACA,SACA,aACA,aACA,kBACA,mBAYE;CAKF,IAAMC,IAHLC,MAAkB,KAAA,KAClBC,MAAY,KAAA,KACZD,MAAkBC,IACKC,IAAWC,GAC7BC,IAAuBnF,EAAS,SAAS;EAAE,IAAIgF;EAAS,MAAME;CAAK;CAwCzE,OAtCIE,IAEF,kBAACvJ,GAAD;EACO;EACN,MAAK;EACL,WAAW;EACX,UAAU,MAAM;GACf,AAAIwJ,MACH,EAAE,eAAe,GACjB,EAAE,gBAAgB,GAClBA,EAAaF,GAAOnF,CAAQ;EAE9B;EACA,WAAU;EAET,UAAA8E;CACQ,CAAA,IAIRO,IAEF,kBAACvJ,GAAD;EACC,MAAK;EACL,MAAK;EACL,aAAY;EACZ,MAAK;EACL,UAAU,MAAM;GAEf,AADA,EAAE,gBAAgB,GAClBuJ,EAAaF,GAAOnF,CAAQ;EAC7B;EACA,WAAU;EAEV,UAAA,kBAACpE,GAAD;GAAM,KAAI;GAAO,QAAO;GAAY,UAAAkJ;EAAc,CAAA;CAC3C,CAAA,IAKT,kBAAClJ,GAAD;EAAM,KAAI;EAAO,QAAO;EACtB,UAAAkJ;CACI,CAAA;AAER;AAEA,SAASQ,GACR,GACA,GACY;CACZ,OAAOC,EAAS,KAAK,GAAS,MAAU;EACvC,IAAM7G,IAAM,OAAO8G,EAAM,GAAGC,EAAQ;EACpC,QAAQA,EAAQ,MAAhB;GACC,KAAK,SACJ,OACC,kBAACC,GAAD,EAAA,UAAA,CACC,kBAACb,IAAD;IACC,SAASY,EAAQ;IACjB,MAAMA,EAAQ;IACd,MAAMA,EAAQ;IACd,UAAUE,EAAM;IAChB,UAAUA,EAAM;IAChB,eAAeA,EAAM;IACrB,cAAcA,EAAM;GACpB,CAAA,GAAE,GACM,EAAA,GAVKjH,CAUL;GAEZ,KAAK;GACL,KAAK,SACJ,OACC,kBAACgH,GAAD,EAAA,UAAA,CACC,kBAAC9J,GAAD;IAAM,KAAI;IAAO,QAAO;IACtB,UAAA6J,EAAQ;GACJ,CAAA,GAAE,GACC,EAAA,GAJK/G,CAIL;GAEZ,KAAK,UACJ,OACC,kBAACgH,GAAD,EAAA,UAAA,CACC,kBAACxJ,GAAD;IACC,QAAA;IACA,MAAK;IACL,MAAMiI,GAAmBsB,EAAQ,QAAQ;IAExC,UAAAA,EAAQ;GACH,CAAA,GAAE,GACA,EAAA,GARK/G,CAQL;GAEZ,KAAK,YAAY;IAChB,IAAM6D,IAASoD,EAAM,oBAAoBF,EAAQ,QAAQ;IACzD,OACC,kBAACC,GAAD,EAAA,UAAA,CACC,kBAACtB,IAAD;KACC,UAAUqB,EAAQ;KACV;KACR,cAAcA,EAAQ;KACtB,SACCE,EAAM,wBAEHA,EAAM,kBACLF,EAAQ,UACRlD,GACAoD,EAAM,QACP,IACA,KAAA;IAEJ,CAAA,GAAE,GACM,EAAA,GAhBKjH,CAgBL;GAEZ;GAEA,SACC,OACC,kBAACgH,GAAD,EAAA,UAAA,CACC,kBAAC9J,GAAD;IAAM,KAAI;IACR,UAAA6J,EAAQ;GACJ,CAAA,GAAE,GACC,EAAA,GAJK/G,CAIL;EAEb;CACD,CAAC;AACF;AAEA,SAASkH,GAAsB,GAAgD;CAC9E,IAAM,EAAE,gBAAaD,GACfE,IACL7F,EAAS,YAAYA,EAAS,OACzB8F,IAAY9F,EAAS,OAAO;CAClC,IAAI,CAAC8F,KAAa,CAACD,EAAiB,SAASC,CAAS,GACrD,OACC,kBAAClK,GAAD;EAAM,KAAI;EACR,UAAAiK;CACI,CAAA;CAGR,IAAM,CAACE,GAAQ,GAAGC,KAASH,EAAiB,MAAMC,CAAS;CAC3D,OACC,kBAAArK,GAAA,EAAA,UAAA;EACE,CAAC,CAACsK,KACF,kBAACnK,GAAD;GAAM,KAAI;GACR,UAAAmK;EACI,CAAA;EAEP,kBAAClB,IAAD;GACC,SAAS7E,EAAS,OAAO;GACzB,MAAM8F;GACN,MAAM9F,EAAS,OAAO;GACZ;GACV,UAAU2F,EAAM;GAChB,eAAeA,EAAM;GACrB,cAAcA,EAAM;EACpB,CAAA;EACAK,EAAM,SAAS,KACf,kBAACpK,GAAD;GAAM,KAAI;GACR,UAAAoK,EAAM,KAAKF,CAAS;EAChB,CAAA;CAEN,EAAA,CAAA;AAEJ;AAEA,SAAgBG,GACf,GACC;CACD,IAAMV,IAAWI,EAAM,SAAS;CAQhC,OAPIJ,KAAYA,EAAS,SAAS,IAEhC,kBAAC,QAAD;EAAM,WAAU;EACd,UAAAD,GAAsBC,GAAUI,CAAK;CACjC,CAAA,IAGD,kBAAC,QAAD;EAAM,WAAU;EAA6C,UAAAC,GAAsBD,CAAK;CAAQ,CAAA;AACxG;;;ACxNA,SAAgBO,GAAe,EAC9B,MAAM5B,GACN,SACA,YACA,SACA,gBACuB;CACvB,IAAMD,IAAUH,GAAclB;CAmC9B,OAjCImD,MAAY,YAEd,kBAAC,OAAD;EAAK,WAAWxK,EAAG,yDAAyDiI,CAAS;EAArF,UAAA,CACC,kBAAC,QAAD;GACC,eAAA;GACA,WAAWjI,EAAG,uCAAuC0I,EAAQ,GAAG;EAChE,CAAA,GACA,CAAC+B,KACD,kBAAC,QAAD;GAAM,eAAA;GAAY,WAAWzK,EAAG,oBAAoB0I,EAAQ,IAAI;EAAI,CAAA,CAEjE;MAIH8B,MAAY,SAEd,kBAAC,OAAD;EAAK,WAAWxK,EAAG,yDAAyDiI,CAAS;EAArF,UAAA,CACC,kBAAC,QAAD;GACC,WAAWjI,EACV,uFACA0I,EAAQ,IACRA,EAAQ,EACT;GAEA,UAAA,kBAACC,GAAD,EAAM,WAAU,eAAgB,CAAA;EAC3B,CAAA,GACL,CAAC8B,KACD,kBAAC,QAAD;GAAM,eAAA;GAAY,WAAWzK,EAAG,oBAAoB0I,EAAQ,IAAI;EAAI,CAAA,CAEjE;MAKN,kBAAC,OAAD;EAAK,WAAW1I,EAAG,yDAAyDiI,CAAS;EAArF,UAAA,CACC,kBAAC,QAAD;GACC,WAAWjI,EACV,uEACA0I,EAAQ,IACRA,EAAQ,EACT;GAEA,UAAA,kBAACC,GAAD,EAAM,WAAU,eAAgB,CAAA;EAC3B,CAAA,GACL,CAAC8B,KACD,kBAAC,QAAD;GAAM,eAAA;GAAY,WAAWzK,EAAG,oBAAoB0I,EAAQ,IAAI;EAAI,CAAA,CAEjE;;AAEP;;;ACpDA,SAASgC,GAAwB,EAC/B,aACA,gBAIC;CACD,IAAMC,IAAUC,EAAS,MAAM,GAAG,CAAC,GAC7BC,IAAcD,EAAS,SAASD,EAAQ;CAE9C,OACE,kBAACtK,GAAD;EAAO,WAAU;EAAa,OAAM;EAAS,MAAA;EAAK,KAAI;EAAK,WAAU;EAArE,UAAA,CACGsK,EAAQ,KAAK,GAAM,MAClB,kBAACZ,GAAD,EAAA,UAAA,CACH,kBAAC9J,GAAD;GACC,KAAI;GACJ,MAAK;GACL,WAAU;GAHX,UAAA,CAKC,kBAACA,GAAD;IAAM,KAAI;IAAO,MAAK;IAAK,MAAK;IAAW,WAAU;IAArD,UAAA;KACE6E,EAAK;KAAM;KAAE;IACT;GACN,CAAA,GAAA,kBAAC7E,GAAD;IAAM,KAAI;IAAO,MAAK;IAAU,WAAU;IACjC,UAAA6E,EAAK;GACF,CAAA,CACF;EACL,CAAA,GAAA+E,IAAQc,EAAQ,SAAS,KACxB,kBAAC1K,GAAD;GACE,KAAI;GACJ,MAAK;GACL,MAAK;GACL,WAAU;GACV,eAAY;GAEX,UAAA;EACG,CAAA,CAEA,EAAA,GAxBK6E,EAAK,KAwBV,CACX,GACA+F,IAAc,KACb,kBAAC5K,GAAD;GACE,KAAI;GACJ,MAAK;GACL,MAAK;GACL,WAAU;GAJZ,UAAA;IAKC;IACG4K;IAAY;IAAEC;GACZ;EAEH,CAAA,CAAA;;AAEX;AAEA,SAASC,GAAqB,EAC5B,eAGC;CACD,OACE,kBAAC3K,GAAD;EAAM,SAAS;GAAE,MAAM;GAAG,IAAI;EAAE;EAAG,KAAI;EAAK,WAAU;EACnD,UAAAwK,EAAS,KAAK,MACb,kBAACvK,GAAD;GAAO,KAAI;GAET,WAAU;GAFZ,UAAA,CAIE,kBAACJ,GAAD;IACE,KAAI;IACJ,MAAK;IACL,MAAK;IACL,QAAO;IACP,WAAU;IAET,UAAA6E,EAAK;GACF,CAAA,GACN,kBAAC7E,GAAD;IACE,KAAI;IACJ,WAAU;IAET,UAAA6E,EAAK;GACF,CAAA,CACD;EAlBA,GAAAA,EAAK,KAkBL,CACR;CACG,CAAA;AAEV;AAuEA,SAAgBkG,GAA6B,GAAgC;CAC3E,IAAM,EACJ,aACA,YACA,gBACA,gBACA,SACA,SACA,aACA,qBACA,uBACA,iBACA,iBACA,gBACA,aACA,qBACA,qBACA,cACA,iBACA,kBACA,YACA,oBACA,iBACA,oBACA,aACA,sBACA,qBACA,mBACA,kBACA,iBACA,oBACA,qBACA,yBACEhB,GAEErB,IAAOtE,EAAS,gBAAgB4G,EAAY,MAC5CC,KAAc7G,EAAS,SAAS,UAAU,KAAK,GAC/CuG,IAAWvG,EAAS,YAAY,CAAC,GACjC8G,IAAcP,EAAS,SAAS,GAChCQ,KAAgB/G,EAAS,WAAW,UAAU,KAAK,GACnDgH,IACJhH,EAAS,YAAY,KAAA,KACrBA,EAAS,YAAY,QACrBA,EAAS,YAAY,IACjBiH,IACJC,KACkB,QAClBA,MAAkB,IACdC,IAAiBL,KAAeD,KAAcG,KAAcC,GAC5DG,KACJpH,EAAS,gBAAgB,KAAA,KACzBA,EAAS,gBAAgB,QACzBA,EAAS,gBAAgB,IACrBqH,IAAmBlB,MAAY,WAC/BmB,IAAenB,MAAY,QAC3BoB,IAAqBC,MAAuBV,KAAeD,IAC3DY,IAAkBH,KAAgBH,MAAmB,CAACI,KAAsBG,IAC5EC,IAAsBL,KAAgBR,KAAeS,KAAsB,CAACG,GAC5EE,IAAgB1E,EAAQ,QAAQ,MAAWE,EAAO,iBAAiB,QAAQ,GAC3ED,KAAcD,EAAQ,QAAQ,MAAWE,EAAO,iBAAiB,QAAQ,GAEzEyE,KACJC,KAEE,kBAAC7B,IAAD;EACY;EACK;EACL;EACI;EACG;EACE;CACpB,CAAA,GAGC8B,KACJC,KACE,kBAAC9B,IAAD;EACE,MAAM5B;EACA;EACG;EACH;EACN,WAAW2D;CACZ,CAAA,GAGCxD,IAAc,OAAOyD,KAAoB,YACzCC,KACJtB,KACAE,KACA5D,GAAY,SAAS,KACrByE,EAAc,SAAS,KACvB,OAAOvC,KAAiB,cACxB,OAAO+C,KAAoB,YAEvBC,KAAsB5D,KAAe,CAAC0D,IAEtCG,KACJnC,MAAY,SACR,6BACAA,MAAY,YACV,8BACA,6BACFoC,KAAkBnC,IAMpB,KALAoC,MAAgB,YACd,gBACAA,MAAgB,YACd,gBACA;CAGR,OACE,kBAAC,OAAD;EACE,WAAW7M,EACT,yCACA2M,IACA7D,KAAe,mDACfgE,CACF;EACA,SAAShE,UAAoByD,IAAkBlI,CAAQ,IAAI,KAAA;EAC3D,MAAMqI,KAAsB,WAAW,KAAA;EACvC,UAAUA,KAAsB,IAAI,KAAA;EACpC,WACEA,MACK,MAAM;GACL,CAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,eAAe,GACjBH,IAAkBlI,CAAQ;EAE/B,IACC,KAAA;EAlBR,UAAA,CAqBG+H,IAED,kBAAC,OAAD;GACE,WAAWpM,EACT,wCACA4M,IACAG,CACF;GALF,UAAA;IAOE,kBAAC1M,GAAD;KAAO,KAAI;KAAX,UAAA,CACA,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACH,kBAACA,GAAD;OAAO,KAAI;OAAQ,WAAU;OAA7B,UAAA,CACO,kBAAC,OAAD;QAAK,WAAU;QAAf,UAAA,CACE,kBAACJ,GAAD;SACE,KAAI;SACJ,MAAK;SACL,YAAW;SACX,WAAU;SAET,UAAAiM;QACG,CAAA,GACL,CAAC,CAACc,KACH,kBAACzM,GAAD;SAAO,QAAA;SAAO,MAAK;SAAK,MAAK;SACxB,UAAAyM;QACI,CAAA,CAEb;OAEG,CAAA,GAAAhB,KACC,kBAACtB,IAAD;QACY;QACC;OACZ,CAAA,CAEE;MAEZ,CAAA,GAAA,kBAACrK,GAAD;OAAO,WAAU;OAAa,KAAI;OAAK,SAAS;QAAE,MAAM;QAAW,IAAI;OAAM;OAAG,MAAM;OAAO,WAAU;OAAvG,UAAA;QACQ,CAAC,CAAC4M,KACD,kBAAChN,GAAD;SACE,MAAK;SACL,MAAK;SACL,WAAU;SACV,OAAOiN,KAAgB,KAAA;SAEtB,UAAAD;QACG,CAAA;QAEPtB,KAAgBH,KAAkBI,KACjC,kBAACzL,GAAD;SACE,MAAK;SACL,MAAK;SAAK,UAAA;SACV,MAAK;SACL,aAAY;SACZ,WAAU;SACV,UAAU,MAAM;UAEd,AADA,EAAE,gBAAgB,GAClBgN,EAAiB,CAACpB,CAAQ;SAC5B;SACA,OAAOA,IAAWqB,IAAmBC;SACrC,cAAYtB,IAAWqB,IAAmBC;SAC1C,iBAAetB;SAEd,UACCuB,EADDvB,IACEwB,KAEAC,IAFD,EAAa,WAAU,eAAgB,CAEC;QAEpC,CAAA;QAET7B,KAAgBnE,GAAY,SAAS,KACpC,kBAACF,IAAD;SACY;SACV,SAASE;SACC;SACV,OAAOiG;QACR,CAAA;OAEH;MACC,CAAA,CAAA;KAEJ,CAAA,GAAA,CAAC,CAAC/B,KAAoBD,MACrB,kBAACxL,GAAD;MAAM,KAAI;MAAM,MAAK;MAAY,WAAU;MACxC,UAAAoE,EAAS;KACN,CAAA,CAED;;IAEN,CAAC,CAACsH,KAAgBP,KAAgB/G,EAAS,aAC/C,kBAAChE,GAAD;KAAO,WAAU;KAAa,KAAI;KAAK,WAAU;KACzC,UAAAgE,EAAS,UAAU,KAAK,MAAQ;MAC/B,IAAMqJ,IAAMC,IAAoBC,CAAG;MACnC,OACE,kBAACnF,IAAD;OAEE,UAAUmF;OACV,QAAQF;OACR,SACEjB,UAEMA,EACEmB,GACAF,GACArJ,CACF,IACF,KAAA;MAEP,GAbMuJ,EAAI,GAaV;KAEL,CAAC;IACD,CAAA;IAGHjC,KAAgBM,EAAc,SAAS,KAC3C,kBAAC5L,GAAD;KAAO,WAAU;KAAa,KAAI;KAAK,WAAU;KACzC,UAAA4L,EAAc,KAAK,MAAW;MAC7B,IAAM4B,IAAapG,EAAO;MAC1B,OACE,kBAACtH,GAAD;OAEE,MAAK;OACL,MAAK;OACP,MAAMsH,EAAO,SAAS,gBAAgB,gBAAgB;OACpD,aAAY;OACZ,MAAMoG;OACN,UAAUpG,EAAO;OAC1B,WAAU;OACD,UAAU,MAAU;QAGlB,AAFAhF,EAAM,gBAAgB,GACtBiF,IAAWD,EAAO,IAAIpD,CAAQ,GAC9BoD,EAAO,UAAUpD,CAAQ;OAC3B;OAEC,UAAAoD,EAAO;MACF,GAfDA,EAAO,EAeN;KAEZ,CAAC;IACD,CAAA;IAGHqE,KACC,kBAAC,OAAD;KAAK,WAAU;KACnB,UAAA,kBAAC,OAAD;MAAK,WAAW9L,EACf,yBACA8N,EACD;MACA,UAAA,kBAACzN,GAAD;OAAO,KAAI;OAAX,UAAA;QACS8K,KACC,kBAACJ,IAAD,EAAgC,YAAW,CAAA;QAE5CG,KAAc7G,EAAS,WACtB,kBAAC0D,IAAD;SACE,SAAS1D,EAAS;SAClB,WAAU;QACX,CAAA;QAEFgH,KACC,kBAAC,OAAD;SAAK,WAAU;SACZ,UAAAhH,EAAS;QACf,CAAA;QAEEiH,KACC,kBAAC,OAAD;SAAK,WAAU;SACZ,UAAAC;QACE,CAAA;OAER;;KACF,CAAA;IACI,CAAA;GAEJ;EACF,CAAA,CAAA;;AAET;;;ACtbA,SAASwC,GAAsB,GAAa,GAAyB;CACpE,IAAI;EACH,IAAM3K,IAAO,IAAI,KAAKF,CAAG;EACzB,OAAOG,EAAQD,CAAI,IAAIK,EAAOL,GAAM,QAAQI,IAAS,EAAE,UAAO,IAAI,KAAA,CAAS,IAAIN;CAChF,QAAQ;EACP,OAAOA;CACR;AACD;AAEA,SAAS8K,GACR,GACA,GACC;CACD,OAAO,OAAOxI,KAAU,aAAaA,EAAMnB,CAAQ,IAAImB;AACxD;AAEA,SAASyI,GACR,GACA,GACe;CACf,OAAO5J,EAAS,gBAAgB6J;AACjC;AAEA,SAAgBC,GAA8B,GAAiC;CAC9E,IAAM,EACL,gBAAa,CAAC,GACd,aAAU,WACV,iBAAc,WACd,iBAAc,IACd,uBAAoB,IACpB,uBACA,uBACA,gBACA,wBACA,kBACA,aAAU,IACV,aAAaC,GACb,SAASC,GACT,UACA,kBACA,cACA,WAEA,uBACA,uBACA,yBACA,eAAeC,IACf,oBACA,uBAEA,oBACA,iBACA,oBACA,aACA,6BAEA,cACA,yBACGtE,GAEE7G,IAAUoL,EAAW7L,IAA0B2L,CAAW,GAE1DG,KAAiBvK,SACf;EAAE,GAAGjD;EAA4B,GAAGoN;CAAoB,IAC/D,CAACA,CAAmB,CACrB,GAEMjI,IAAWD,GAAqB;EACrC;EACA;CACD,CAAC,GAEKuI,IAAQ1O,EAAe,GACvB2O,IAAiBlL,KAAUiL,EAAM,QACjCE,IAAOjL,GAAuB;EACnC;EACA;EACA;EACA;EACA;EACA;EACA,QAAQgL;EACR;EACA;CACD,CAAC,GAEKE,IAAcC,KAAsBJ,EAAM,wBAAwB,MAAgBvL,IAClF4L,IAAcC,OAAwB,MAAgBhB,GAAsB7K,GAAKwL,CAAc;CAErG,IAAIM,GACH,OACC,kBAAC,OAAD;EAAK,WAAWhP,EAAG,8BAA8B,2BAA2BiI,CAAS;EACnF,UAAAgH,GAAO,WACP,kBAAChP,GAAD;GAAM,MAAK;GAAY,OAAM;GAC3B,UAAAkD,EAAQ;EACJ,CAAA;CAEH,CAAA;CAIP,IAAIgB,EAAW,WAAW,GACzB,OACC,kBAAC,OAAD;EAAK,WAAWnE,EAAG,8BAA8B,2BAA2BiI,CAAS;EACnF,UAAAgH,GAAO,SAAS,kBAAC7G,IAAD,EAAoB,OAAOjF,EAAQ,MAAQ,CAAA;CACxD,CAAA;CAIP,IAAM+L,IAAgBP,EAAK,OAAO,QAAQ,GAAK,MAAMQ,IAAMC,EAAE,MAAM,QAAQ,CAAC,GACxEC,IAAgB;CAEpB,OACC,kBAAChP,GAAD;EAAO,KAAI;EAAK,WAAWL,EAAG,8BAA8BiI,CAAS;EAArE,UAAA;GACE,CAAC,CAACgH,GAAO,UAAU,kBAAC,OAAD,EAAA,UAAMA,EAAM,OAAY,CAAA;GAE5C,kBAAC,OAAD;IAAK,WAAU;IACb,UAAAN,EAAK,OAAO,KAAK,GAAO,MAAO;KAC/B,IAAMW,IAAeC,MAAO;KAC5B,OACC,kBAAC,OAAD;MAAkC,WAAWvP,EAAGsP,IAAe,KAAK,MAAM;MAA1E,UAAA,CACEL,GAAO,kBACLA,EAAM,gBAAgBO,EAAM,OAAOF,CAAY,IAEhD,kBAACpH,IAAD;OACC,OAAOsH,EAAM;OACb,OAAOF;MACP,CAAA,GAGH,kBAAC,OAAD;OAAK,WAAWtP,EAAG,iBAAiB,CAAC,CAACwP,EAAM,SAAS,aAAa;OAChE,UAAAA,EAAM,MAAM,KAAK,GAAO,MAAO;QAC/B,IAAMnL,IAAWL,EAAM,UACjByL,IAAiBC,MAAO,GACxBC,IACL,EAAEN,MAAkBH,GACfU,IAAWrN,EAChB8B,EAAS,OACTmK,EACD,GACMnH,IAAO4G,GAAY5J,GAAUuL,EAAS,IAAI,GAC1C3C,IAAe5I,EAAS,cACzBA,EAAS,YACVuK,EAAYvK,EAAS,SAAS,IAC9B,OACE6I,IAAe7I,EAAS,YAC3ByK,EAAYzK,EAAS,SAAS,IAC9B,MACG2I,IAAc3I,EAAS,SACzBwL,KAAiBxL,EAAS,MAAM,KAC9BlB,EAAQ,QAAQkB,EAAS,WACzBuL,EAAS,eACT,OACHA,EAAS,eAAe,MACrBE,IACL9C,KAAeA,EAAY,KAAK,CAAC,CAAC,SAAS,IACxCA,IACA,MACEzF,IACLwI,IAAqB1L,CAAQ,KAAK,CAAC,GAE9B2L,IAAuC;SAC5C;SACA;SACA;SACA;SACA,aAAaJ;SACb;SACA;SACA;SACA,aAAaE;SACb,UAAUnB,EAAK,WAAWtK,EAAS,EAAE;SACrC;SACA,cAAc,MACbsK,EAAK,YAAYtK,EAAS,IAAI0H,CAAQ;SACvC,sBACC4C,EAAK,eAAetK,EAAS,EAAE;QACjC,GACMkH,IACL0D,GAAO,gBAAgB5K,GAAU2L,CAAG,GAE/BC,IAAYhB,GAAO,YAAY5K,GAAU2L,CAAG;QAClD,IAAIC,MAAc,KAAA,GACjB,OACC,kBAAC,OAAD,EAAA,UAAsBA,EAAe,GAA3BjM,EAAM,GAAqB;QAIvC,IAAMmI,IACL8C,GAAO,iBAAiB5K,GAAU2L,CAAG,GAChC3D,IACL4C,GAAO,eAAe5K,GAAU2L,CAAG;QAEpC,OACC,kBAAChF,IAAD;SAEW;SACD;SACI;SACb,aAAa4E;SACP;SACN,MAAMD;SACN,UAAUK,EAAI;SACd,mBAAmB,MAAa;UAE/B,AADArB,EAAK,YAAYtK,EAAS,IAAI0H,CAAQ,GACtCmE,IAA2B7L,GAAU0H,CAAQ;SAC9C;SACA,oBAAoB1H,EAAS,eAAewH;SAC9B;SACA;SACd,aAAaiE;SACb,UAAU3M,EAAQ;SAClB,kBAAkBA,EAAQ;SAC1B,kBAAkBA,EAAQ;SAC1B,WAAWA,EAAQ;SACnB,cAAcA,EAAQ;SACP;SACN;SACQ;SACH;SACG;SACP;SACV,oBAAoB,MACnBgD,EAAS,IAAIgB,CAAG;SAGhB;SAGA;SAEc;SACf,cAAc6G,GAAoBmC,GAAe,KAAK9L,CAAQ;SAC9D,iBAAiB2J,GAAoBmC,GAAe,QAAQ9L,CAAQ;SACpE,kBAAkB2J,GAAoBmC,GAAe,SAAS9L,CAAQ;SACtE,kBAAkB2J,GAAoBmC,GAAe,SAAS9L,CAAQ;QACtE,GAzCKL,EAAM,GAyCX;OAEH,CAAC;MACG,CAAA,CACD;KAxHK,GAAA,GAAGwL,EAAM,MAAM,GAAGD,GAwHvB;IAEP,CAAC;GACG,CAAA;GAEJ,CAAC,CAACN,GAAO,UAAU,kBAAC,OAAD,EAAA,UAAMA,EAAM,OAAY,CAAA;EACtC;;AAET;AAEA,GAAa,cAAc;;;ACzQ3B,SAASmB,GACR,GACA,GACmB;CACnB,IAAMC,IAAM,CAAC,GAAGC,CAAO;CAMvB,OALAD,EAAI,MAAM,GAAG,MAAM;EAClB,IAAME,IAAKC,EAAE,YAAY,IAAI,KAAKA,EAAE,SAAS,CAAC,CAAC,QAAQ,IAAI,GACrDC,IAAKC,EAAE,YAAY,IAAI,KAAKA,EAAE,SAAS,CAAC,CAAC,QAAQ,IAAI;EAC3D,OAAOC,MAAU,QAAQJ,IAAKE,IAAKA,IAAKF;CACzC,CAAC,GACMF;AACR;AAEA,SAASO,GAAe,GAAsD;CAC7E,OAAOvJ,KAAQ;AAChB;AAEA,SAASwJ,GAAQ,GAA0C;CAC1D,IAAKrH,GACL,OAAO,OAAOA,KAAU,WAAW,EAAE,MAAMA,EAAM,IAAIA;AACtD;AAEA,SAASsH,GAAkB,GAA2B;CACrD,OAAOtL,KAAU,QAA+BA,MAAU;AAC3D;AAEA,SAASuL,EAKR,GACA,GACC;CACD,IAAKvL,KAAUwL,KAASA,EAAM,SAAS,WACvC,OAAO,OAAOxL,KAAU,aACrBA,EAAMwL,CAA4C,IAClDxL;AACJ;AAEA,SAASyL,GACR,GACA,GACoD;CACpD,IAAMzH,IAAQqH,GAAQG,EAAM,KAAK,GAC3BE,IACLF,EAAM,kBACL,kBAACpQ,GAAD;EACC,MAAMoQ,EAAM;EACZ,UAAUA,EAAM;EACL;CACX,CAAA,IACEA,EAAM;CAEX,OAAO;EACN,IAAIA,EAAM;EACV,OAAOA,EAAM,SAASA,EAAM;EAE5B,QAAQ,OAAOA,EAAM,SAAU,WAAWA,EAAM,QAAQ,KAAA;EACxD;EACA,WAAWA,EAAM;EACjB,WAAW,KAAA;EACX,cAAcA,EAAM;EACpB,cAAcJ,GAAeI,EAAM,IAAI;EACvC,UAAU,OAAOA,EAAM,YAAa,WAAWA,EAAM,WAAW,KAAA;EAChE;EACA,UAAUA,EAAM;EAChB,SAASA,EAAM;EACf,SAASA,EAAM;EACf,aAAaA,EAAM;EACnB,iBAAiBA,EAAM;EACvB,MAAMA;EACN,UACCA,EAAM,UAAUA,EAAM,UAAUA,EAAM,SAAS,CAACA,EAAM,WACnD;GACA,GAAIxH,IACD,CAAC;IAAE,MAAM;IAAkB,MAAMA,EAAM;IAAM,SAASA,EAAM;GAAG,CAAC,IAChE,CAAC;GACJ,GAAIwH,EAAM,SACP,CAAC;IAAE,MAAM;IAAiB,MAAMA,EAAM;GAAO,CAAC,IAC9C,CAAC;GACJ,GAAIF,GAAkBE,EAAM,MAAM,IAC/B,CAAC;IAAE,MAAM;IAAkB,MAAM,OAAOA,EAAM,MAAM;GAAE,CAAC,IACvD,CAAC;GACJ,GAAI,CAACxH,KAAS,CAACwH,EAAM,UAAU,CAACA,EAAM,UAAUA,EAAM,WACnD,CAAC;IAAE,MAAM;IAAiB,MAAM,OAAOA,EAAM,QAAQ;GAAE,CAAC,IACxD,CAAC;EACL,IACC,KAAA;CACL;AACD;AAEA,SAAgBG,GAId,GAAkD;CACnD,IAAM,EACL,YACA,WAAQ,QACR,iBAAc,WACd,cACA,qBACA,gBACA,oBACA,mBACA,mBACA,uBACA,YACA,iBAAiBC,GACjB,cACA,uBACA,6BAA0B,IAC1B,uBACA,iBACA,yBACA,0BACA,kBACA,eACA,aACA,UAAO,IACP,UACA,gBACA,iBACA,mBACA,uBACA,iBACGpH,GAEEqH,IAAkB9C,EAAW7L,IAA0B0O,CAAmB,GAC1E3C,IAAQ1O,EAAe,GACvBuR,IAAiBjM,GACrB,MAAgB;EAChB,IAAMkM,IACL1C,KAAsBJ,EAAM;EAC7B,IAAI8C,GAAqB,OAAOA,EAAoBrO,CAAG;EAEvD,IAAMsO,IAASC,GAASvO,CAAG;EAC3B,IAAI,CAACG,EAAQmO,CAAM,GAAG,OAAOtO;EAC7B,IAAMM,IAASiL,EAAM;EACrB,OAAOiD,EAAoBF,GAAQ;GAClC,WAAW;GACX,GAAIhO,IAAS,EAAE,UAAO,IAAI,CAAC;EAC5B,CAAC;CACF,GACA;EAACiL,EAAM;EAAoBA,EAAM;EAAQI;CAAkB,CAC5D,GAEM8C,IAAgBhR,EAA6C;EAClE,UAAUiR,GAAU;EACpB,eAAeA,GAAU;EACzB,SAASA,GAAU;CACpB,CAAC,GAEKC,IAAS5N,QACRmM,GAAYE,GAASK,CAAK,GAChC,CAACL,GAASK,CAAK,CAChB,GAEMxM,IAAaF,QAEjB4N,EAAO,KAAK,MACPb,EAAM,SAAS,YACX;EACN,IAAIA,EAAM;EACV,OAAO;EACP,QAAQ;EACR,WAAWA,EAAM;EACjB,MAAMA;CACP,IAEMC,GACND,GACA3K,CACD,CACA,GACF,CAACA,GAAWwL,CAAM,CACnB,GAEMC,KAAqB7N,SAGnB;EACN,MAAM,MAAa8M,EAAsBgB,GAAY,UAAU1N,EAAS,IAAI;EAC5E,SAAS,MAAa0M,EAAsBgB,GAAY,aAAa1N,EAAS,IAAI;EAClF,UAAU,MAAa0M,EAAsBgB,GAAY,cAAc1N,EAAS,IAAI;EACpF,UAAU,MAAa0M,EAAsBgB,GAAY,cAAc1N,EAAS,IAAI;CACrF,IACA,CAAC0N,CAAU,CACZ,GAEMC,IAAgBJ,GAAU,UAC/B,kBAAC,OAAD;EAAK,WAAU;EACd,UAAA,kBAACnR,GAAD;GACC,SAASmR,EAAS;GAClB,YAAA;GACA,YAAYD,EAAc;GAC1B,QAAQA,EAAc;GACtB,UAAUA,EAAc;GACxB,UAAUA,EAAc;GACb;GACO;GACT;GACT,aAAaC,EAAS;GACtB,WAAWA,EAAS;GACpB,cAAcA,EAAS,gBAAgB;EACvC,CAAA;CACG,CAAA,IACF,MACEK,IAAmBL,GAAU,YAAY,OA0GzC5I,IACL,kBAACmF,IAAD;EACa;EACZ,SAAQ;EACK;EACb,aAAA;EACA,WAAW,CAAC;EACZ,SAASiD;EACT,oBAAoBc;EACA;EACP;EACQ;EACrB,oBAAoBZ;EACpB,iBAAiB,MAAWD,EAAgB,QAAQc,MAAWA;EAC3C,qBArHrB,MAC0E;GAC1E,IAAMnB,IAAQ3M,EAAS;GACvB,IAAI,CAAC2M,KAASA,EAAM,SAAS,WAAW,OAAO,CAAC;GAChD,IAAMoB,IAAapB;GACnB,QAAQoB,EAAW,WAAW,CAAC,EAAA,CAAG,KAAK,OAAY;IAClD,IAAI3K,EAAO;IACX,OAAOA,EAAO;IACd,MAAMA,EAAO;IACb,MAAMA,EAAO;IACb,UAAUA,EAAO;IACjB,MAAMA,EAAO;IACb,cAAcA,EAAO;IACrB,eAAeA,EAAO,WAAW2K,CAAU;GAC5C,EAAE;EACH;EAuGE,eAAeN;EACf,WAAW,GAAU,MAAa;GACjC,IAAMd,IAAQ3M,EAAS;GACvB,AAAI2M,KAASA,EAAM,SAAS,aAC3BqB,IAAgBC,GAAUtB,CAA4C;EAExE;EACA,2BAA2B,GAAU,MAAa;GACjD,IAAMA,IAAQ3M,EAAS;GACvB,AAAI2M,KAASA,EAAM,SAAS,aAC3BuB,IACCvB,GACAjF,CACD;EAEF;EACO,OAAA;GApHR,QAAQkG,MAAqB,QAAQD,IAAgB,KAAA;GACrD,QAAQC,MAAqB,WAAWD,IAAgB,KAAA;GACxD,YAAY,GAAU,MAAQ;IAC7B,IAAMhB,IAAQ3M,EAAS;IACvB,IAAI,CAAC2M,GAAO;IACZ,IAAMwB,IAASC,IAAYzB,EAAM;IAGjC,IAAIwB,GACH,OAAOA,EAAOxB,GAAO;KACpB;KACA,WAAW;MACV;MACA;MACA;MACA,oBAAoBM;KACrB;KACA;IACD,CAAC;IAGF,IAAIN,EAAM,SAAS,WAAW;IAC9B,IAAM0B,IAAe1B;IAIrB,OACC,kBAAC3Q,GAAD;KACC,WAAU;KACV,KAAI;KACJ,OAAM;KACN,MAAM;KACN,WAAWL,EACV,kDACA,CAACgQ,EAAI,WACJA,EAAI,gBAAgB,YACjB,gBACAA,EAAI,gBAAgB,YACnB,gBACA,cAEN;KACA,iBAAe0C,EAAa;KAf7B,UAAA,CAiBC,kBAACnI,IAAD;MACC,MAAMoI;MACN,MAAK;MACL,SAAS3C,EAAI;MACb,MAAMA,EAAI;KACV,CAAA,GACD,kBAAC,OAAD;MAAK,WAAU;MACd,UAAA,kBAACtP,GAAD;OACC,SAASgS,EAAa;OACT;OACb,UAAUE;OACV,aAAaC;OACb,SAASC;OACT,SAASC;OACA;OACE;OACE;OACC;OACE;OAChB,oBAAoBzB;MACpB,CAAA;KACG,CAAA,CACC;;GAET;GACA,gBAAgB,GAAU,MAAQ;IACjC,IAAMN,IAAQ3M,EAAS;IAEvB,OADI,CAAC2M,KAASA,EAAM,SAAS,YAAkB,OACxCgC,IACNhC,GACA;KACC,UAAUhB,EAAI;KACd,aAAaA,EAAI;KACjB,cAAcA,EAAI;KAClB,QAAQA,EAAI;KACZ;IACD,CACD;GACD;EAkCQ;EACP,WAAWhQ,EACV,2BACA+R,GAAY,MACZkB,KAAQhL,CACT;CACA,CAAA;CAGF,IAAIgL,GACH,OAAOjK;CAGR,IAAMjE,IAAQmO,KAAS7B,EAAgB,OACjC8B,KAAY,OAAOpO,KAAU,WAAWA,IAAQ,KAAA;CAEtD,OACC,kBAAC1E,GAAD;EACC,QAAQ,kBAAC,WAAD,CAAU,CAAA;EAClB,KAAI;EACJ,kBAAe;EACf,aAAU;EACV,WAAWL,EAAG,2BAA2BiI,CAAS;EAClD,cAAYkL;EANb,UAAA,CAQE,CAAC,CAACpO,KACF,kBAAC9E,GAAD;GAAM,QAAO;GACX,UAAA8E;EACI,CAAA,GAENiE,CACK;;AAET;AAEA,GAAY,cAAc;;;ACvX1B,SAASoK,GAAkB,GAAc;CACxC,IAAI,OAAOC,KAAW,YAAYA,KAAmB,UAAUA,GAAQ;EACtE,IAAMC,IAAQD,EAA8B;EAC5C,IAAI,OAAOC,KAAS,UAAU,OAAOA;CACtC;CACA,OAAO;AACR;AAEA,SAAgBC,GAMf,GACA,GAC4C;CAC5C,IAAMD,IAAOE,EAAU,OAAOH,CAAM,KAAKD,GAAYC,CAAM,GACrD5N,IAAK+N,EAAU,GAAGH,CAAM,GACxBI,IAAYD,EAAU,UAAUH,CAAM,GACtCK,IAAUF,EAAU,UAAUH,CAAM;CAW1C,OATIC,MAAS,aAAaI,IAClB;EACN;EACA,MAAM;EACN;EACA;CACD,IAGM;EACN;EACA,MAAM,OAAOJ,KAAS,WAAWA,IAAO;EACxC;EACA,OAAOE,EAAU,QAAQH,CAAM;EAC/B,OAAOG,EAAU,QAAQH,CAAM;EAC/B,QAAQG,EAAU,SAASH,CAAM;EACjC,QAAQG,EAAU,SAASH,CAAM,KAAKG,EAAU,SAASH,CAAM;EAC/D,OAAOG,EAAU,SAASH,CAAM;EAChC,UAAUG,EAAU,QAAQH,CAAM;EAClC,aAAaG,EAAU,cAAcH,CAAM;EAC3C,iBAAiBG,EAAU,kBAAkBH,CAAM;EACnD,UAAUG,EAAU,WAAWH,CAAM;EACrC,MAAMG,EAAU,OAAOH,CAAM;EAC7B,UAAUG,EAAU,WAAWH,CAAM;EACrC,SAASG,EAAU,UAAUH,CAAM;EACnC,SAASG,EAAU,UAAUH,CAAM;EACnC,SAASG,EAAU,aAAaH,CAAM;EACtC,MAAMG,EAAU,OAAOH,CAAM,KAAKA;CACnC;AACD;AAEA,SAAgBM,GAMf,GACC;CACD,QAAQ,MACPJ,GAAkDF,GAAQG,CAAS;AACrE"}
|
|
1
|
+
{"version":3,"file":"activities.js","names":["_Fragment","_Fragment","useDatesConfig","cn","Button","Text","TextLink","Grid","Stack","toneRecipes","markRecipes","ActionMenu","interactionRecipes","Badge","EmptyState","CommentComposer","CommentItem","useComments","MentionContent","Fragment$1","defaultEventConfig","CircleDot","defaultActivityEventConfig","Plus","Pencil","FileEdit","Trash2","Ban","Sparkles","ArrowLeftRight","UserPlus","UserMinus","Mail","MailCheck","MailOpen","MailX","MessageSquare","Check","ShieldCheck","Heart","ShoppingBag","Star","Flag","LinkIcon","AlertTriangle","resolveEventConfig","map","event","defaultActivitiesStrings","interpolate","template","v","params","key","match","defaultDateGroupLabel","iso","strings","date","isValid","isToday","isYesterday","locale","format","useActivityFeed","expandedMap","setExpandedMap","useState","isControlled","expandedIds","keyed","useMemo","seen","activities","keyBase","activity","occurrence","groups","groupByDate","out","currentLabel","currentItems","labelFor","formatDateGroupLabel","item","label","defaultExpandedSet","next","defaultExpandedIds","controlledExpandedSet","setExpanded","useCallback","currentIds","expandedByDefault","value","id","nextIds","current","onExpandedIdsChange","isExpanded","toggleExpanded","expandAll","k","collapseAll","useActivityResources","registry","setRegistry","resources","seedRef","useRef","onChangeRef","onResourcesChange","emit","register","config","update","existing","partial","remove","setAll","reset","ref","actionToneToMenuTone","tone","ActivityActionsMenu","actions","menuActions","action","onAction","ChangeValue","hasOld","change","hasNew","ActivityChanges","changes","className","ActivityDateLabel","first","ActivityEmptyState","hint","Activity","toned","neutral","ACTIVITY_TONE","TONE_TO_BADGE_TONE","ActivityResourceTag","palette","Icon","fallbackText","resource","interactive","onClick","inner","chipClass","ActorNode","display","currentUserId","actorId","youLabel","text","actor","href","onActorClick","renderSegments","segments","index","segment","Fragment","props","renderFallback","fallbackHeadline","actorName","before","after","ActivityHeadline","ActivityMarker","density","last","ActivityMetadataGrid","metadata","ActivityRow","eventConfig","hasChanges","hasMetadata","hasResources","hasDetails","hasCustomDetails","customDetails","hasDetailPanel","hasDescription","showSecondaryRow","showRichBody","panelIsCollapsible","detailsCollapsible","showDetailPanel","expanded","showSecondaryDetail","inlineActions","headlineNode","headlineOverride","markerNode","markerOverride","markerClassName","onActivityClick","hasNestedInteractive","onResourceClick","keyboardInteractive","rowSpacing","contentPadding","itemSpacing","rowClassName","contentClassName","sourceLabel","relativeTime","absoluteTime","onExpandedChange","hideChangesLabel","showChangesLabel","jsx","ChevronDown","ChevronRight","actionsLabel","cfg","getResourceConfig","res","detailsClassName","ActionIcon","defaultFormatAbsolute","resolveRowClassName","resolveTone","eventTone","ActivityFeed","eventConfigOverride","stringsProp","_getEventLabel","useStrings","eventConfigMap","dates","resolvedLocale","feed","fmtRelative","formatRelativeTime","fmtAbsolute","formatAbsoluteTime","loading","slots","totalRendered","acc","g","renderedSoFar","isFirstGroup","gi","group","isFirstInGroup","ii","isLast","eventCfg","getSourceLabel","sourceLabelTrimmed","actionsForActivity","ctx","customRow","onActivityExpandedChange","rowClassNames","sortEntries","arr","entries","ta","a","tb","b","order","toActivityTone","toActor","hasRenderableNode","resolveEventClassName","entry","mapEventToActivity","description","ActivityLog","activityStringsProp","activityStrings","formatRelative","configuredFormatter","parsed","parseISO","formatDistanceToNow","composerState","composer","sorted","eventRowClassNames","classNames","composerBlock","composerPosition","eventDetailsCollapsible","source","eventEntry","onEventAction","actionId","onEventExpandedChange","custom","renderers","commentEntry","MessageCircle","onCommentDelete","onCommentPinToggle","onCommentReact","onCommentReply","renderEventDetails","bare","title","ariaLabel","defaultKind","record","kind","toActivityLogEntry","accessors","timestamp","comment","createActivityEventAdapter"],"sources":["../../src/components/features/activities/activities.config.ts","../../src/components/features/activities/activities.strings.ts","../../src/components/features/activities/hooks/use-activity-feed.ts","../../src/components/features/activities/hooks/use-activity-resources.ts","../../src/components/features/activities/partials/activity-actions-menu.tsx","../../src/components/features/activities/partials/activity-changes.tsx","../../src/components/features/activities/partials/activity-date-label.tsx","../../src/components/features/activities/partials/activity-empty-state.tsx","../../src/components/features/activities/partials/tone-tokens.ts","../../src/components/features/activities/partials/activity-resource-tag.tsx","../../src/components/features/activities/partials/activity-headline.tsx","../../src/components/features/activities/partials/activity-marker.tsx","../../src/components/features/activities/partials/activity-row.tsx","../../src/components/features/activities/activities-feed.tsx","../../src/components/features/activities/activity-log.tsx","../../src/components/features/activities/activity-event-adapter.ts"],"sourcesContent":["/**\n * Default per-event configuration. Consumers override individual events by\n * spreading this map and overwriting the keys they care about, e.g.:\n *\n * import { defaultActivityEventConfig } from '.';\n *\n * const eventConfig = {\n * ...defaultActivityEventConfig,\n * order_refunded: { icon: Receipt, tone: 'warning', label: 'Refunded' },\n * };\n *\n * The mass `eventConfig` prop on `<ActivityFeed />` is shallow-merged on top\n * of these defaults, so any unspecified event falls back to the library\n * default and ultimately to the neutral `defaultEvent` entry below.\n */\nimport {\n\tAlertTriangle,\n\tArrowLeftRight,\n\tBan,\n\tCheck,\n\tCircleDot,\n\tFileEdit,\n\tFlag,\n\tHeart,\n\tLinkIcon,\n\tMail,\n\tMailCheck,\n\tMailOpen,\n\tMailX,\n\tMessageSquare,\n\tPencil,\n\tPlus,\n\tShieldCheck,\n\tShoppingBag,\n\tSparkles,\n\tStar,\n\tTrash2,\n\tUserMinus,\n\tUserPlus,\n} from 'lucide-react';\n\nimport type { ActivityEventConfig, ActivityEventConfigMap } from './activities.types';\n\n/** Neutral fallback used when an event has no entry in the registry. */\nexport const defaultEventConfig: ActivityEventConfig = {\n\ticon: CircleDot,\n\ttone: 'neutral',\n};\n\nexport const defaultActivityEventConfig: ActivityEventConfigMap = {\n\t// Lifecycle\n\tcreated: { icon: Plus, tone: 'success', label: 'Created' },\n\tupdated: { icon: Pencil, tone: 'neutral', label: 'Updated' },\n\tedited: { icon: FileEdit, tone: 'neutral', label: 'Edited' },\n\tdeleted: { icon: Trash2, tone: 'destructive', label: 'Deleted' },\n\tcancelled: { icon: Ban, tone: 'destructive', label: 'Cancelled' },\n\trestored: { icon: Sparkles, tone: 'success', label: 'Restored' },\n\n\t// Status transitions\n\tstatus_changed: { icon: ArrowLeftRight, tone: 'neutral', label: 'Status changed' },\n\tstatus_transition: { icon: ArrowLeftRight, tone: 'neutral', label: 'Status changed' },\n\tstatus_override: { icon: ArrowLeftRight, tone: 'warning', label: 'Status overridden' },\n\n\t// People\n\tassigned: { icon: UserPlus, tone: 'neutral', label: 'Assigned' },\n\tunassigned: { icon: UserMinus, tone: 'neutral', label: 'Unassigned' },\n\n\t// Mail\n\tmail_sent: { icon: Mail, tone: 'neutral', label: 'Email sent' },\n\tmail_delivered: { icon: MailCheck, tone: 'success', label: 'Email delivered' },\n\tmail_opened: { icon: MailOpen, tone: 'neutral', label: 'Email opened' },\n\tmail_clicked: { icon: MailOpen, tone: 'neutral', label: 'Email clicked' },\n\tmail_bounced: { icon: MailX, tone: 'destructive', label: 'Email bounced' },\n\tmail_failed: { icon: MailX, tone: 'destructive', label: 'Email failed' },\n\n\t// Comments\n\tcomment_created: { icon: MessageSquare, tone: 'neutral', label: 'Comment posted' },\n\tcomment_deleted: { icon: MessageSquare, tone: 'destructive', label: 'Comment deleted' },\n\n\t// Commerce\n\tpaid: { icon: Check, tone: 'success', label: 'Paid' },\n\trefunded: { icon: ArrowLeftRight, tone: 'warning', label: 'Refunded' },\n\tconfirmed: { icon: ShieldCheck, tone: 'success', label: 'Confirmed' },\n\tfavorited: { icon: Heart, tone: 'neutral', label: 'Favorited' },\n\tordered: { icon: ShoppingBag, tone: 'neutral', label: 'Order placed' },\n\n\t// Publishing\n\tpublished: { icon: Star, tone: 'success', label: 'Published' },\n\tflagged: { icon: Flag, tone: 'warning', label: 'Flagged' },\n\tlinked: { icon: LinkIcon, tone: 'neutral', label: 'Linked' },\n\n\t// Failures\n\tfailed: { icon: AlertTriangle, tone: 'destructive', label: 'Failed' },\n\thealth_check_failed: { icon: AlertTriangle, tone: 'destructive', label: 'Health check failed' },\n};\n\n/** Resolve `eventConfig[event]` with override + default fallback. */\nexport function resolveEventConfig(\n\tevent: string,\n\tmap: ActivityEventConfigMap,\n): ActivityEventConfig {\n\treturn map[event] ?? defaultEventConfig;\n}\n","/**\n * Strings for the Activities feature. Consumers override via the `strings`\n * prop on `<ActivityFeed>` / `<ActivityLog>`. Values are deep-merged\n * over these defaults — `sources` and `events` merge one level deep so a\n * consumer can override a single source/event label without rewriting the\n * whole map.\n */\nexport interface ActivitiesStrings {\n\t/** Activity surface title — usually \"Activity\". */\n\ttitle: string;\n\t/** Empty-state copy. */\n\tempty: string;\n\t/** Loading-state copy. */\n\tloading: string;\n\t/** Date-group label for today. */\n\ttoday: string;\n\t/** Date-group label for yesterday. */\n\tyesterday: string;\n\t/** Fallback label for activities without a timestamp. */\n\tundated: string;\n\t/** Replacement for actor name when `actorId === currentUserId`. */\n\tyou: string;\n\t/** Detail toggle label — collapsed state. */\n\tshowChanges: string;\n\t/** Detail toggle label — expanded state. */\n\thideChanges: string;\n\t/** aria-label for the actions menu trigger. */\n\tactionsLabel: string;\n\t/** Generic \"more\" affordance label. */\n\tmoreLabel: string;\n\t/** Map of `source` → display label. */\n\tsources: Record<string, string>;\n\t/** Map of `event` → display label. Used as a fallback for headlines. */\n\tevents: Record<string, string>;\n}\n\nexport const defaultActivitiesStrings: ActivitiesStrings = {\n\ttitle: 'Activity',\n\tempty: 'No activity yet.',\n\tloading: 'Loading activity…',\n\ttoday: 'Today',\n\tyesterday: 'Yesterday',\n\tundated: 'Undated',\n\tyou: 'You',\n\tshowChanges: 'Show details',\n\thideChanges: 'Hide details',\n\tactionsLabel: 'Activity actions',\n\tmoreLabel: 'more',\n\tsources: {\n\t\tcomment: 'Comment',\n\t\tmail: 'Mail',\n\t\tbooking_log: 'Booking log',\n\t\tactivity_log: '',\n\t\tsystem: 'System',\n\t},\n\tevents: {},\n};\n\n/** Replace `{{key}}` tokens with values from `params`. */\nexport function interpolate(\n\ttemplate: string,\n\tparams: Record<string, string | number>,\n): string {\n\treturn template.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (match, key) => {\n\t\tconst v = params[key];\n\t\treturn v === undefined ? match : String(v);\n\t});\n}\n","/**\n * useActivityFeed — headless state machine for the Activities feature.\n *\n * Returns date-grouped activities with stable React keys, plus the expand /\n * collapse map for change-detail rows. Consumers wanting a fully custom UI\n * can call this hook directly and bypass `<ActivityFeed />`.\n */\nimport { format, isToday, isValid, isYesterday, type Locale } from 'date-fns';\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { ActivitiesStrings } from '../activities.strings';\nimport type { ActivityItem } from '../activities.types';\n\nexport interface ActivityKeyedItem<TData = unknown> {\n\tactivity: ActivityItem<TData>;\n\tkey: string;\n}\n\nexport interface ActivityDateGroup<TData = unknown> {\n\t/** Display label. */\n\tlabel: string;\n\titems: ActivityKeyedItem<TData>[];\n}\n\nexport interface UseActivityFeedOptions<TData = unknown> {\n\tactivities: ReadonlyArray<ActivityItem<TData>>;\n\tgroupByDate?: boolean;\n\texpandedByDefault?: boolean;\n\tdefaultExpandedIds?: ReadonlyArray<string>;\n\texpandedIds?: ReadonlyArray<string>;\n\tonExpandedIdsChange?: (ids: string[]) => void;\n\tlocale?: Locale;\n\t/** Overrides this surface's own copy. */\n\tstrings: ActivitiesStrings;\n\tformatDateGroupLabel?: (\n\t\tiso: string | null,\n\t\t/** Overrides this surface's own copy. */\n\t\tstrings: ActivitiesStrings,\n\t) => string;\n}\n\nexport interface UseActivityFeedReturn<TData = unknown> {\n\tgroups: ActivityDateGroup<TData>[];\n\t/** Total number of records across all pages. */\n\ttotal: number;\n\tisExpanded: (id: string) => boolean;\n\ttoggleExpanded: (id: string) => void;\n\tsetExpanded: (id: string, value: boolean) => void;\n\texpandAll: () => void;\n\tcollapseAll: () => void;\n}\n\nfunction defaultDateGroupLabel(\n\tiso: string | null,\n\tstrings: ActivitiesStrings,\n\tlocale?: Locale,\n): string {\n\tif (!iso) return strings.undated;\n\tconst date = new Date(iso);\n\tif (!isValid(date)) return strings.undated;\n\tif (isToday(date)) return strings.today;\n\tif (isYesterday(date)) return strings.yesterday;\n\ttry {\n\t\t// A sentence-style long date without an ordinal (\"September 24, 2026\"),\n\t\t// localized through the configured date-fns locale's code.\n\t\treturn new Intl.DateTimeFormat(locale?.code ?? 'en-US', { dateStyle: 'long' }).format(date);\n\t} catch {\n\t\ttry {\n\t\t\treturn format(date, 'PP', locale ? { locale } : undefined);\n\t\t} catch {\n\t\t\treturn iso;\n\t\t}\n\t}\n}\n\nexport function useActivityFeed<TData = unknown>({\n\tactivities,\n\tgroupByDate = true,\n\texpandedByDefault = false,\n\tdefaultExpandedIds,\n\texpandedIds,\n\tonExpandedIdsChange,\n\tlocale,\n\tstrings,\n\tformatDateGroupLabel,\n}: UseActivityFeedOptions<TData>): UseActivityFeedReturn<TData> {\n\tconst [expandedMap, setExpandedMap] = useState<Record<string, boolean>>({});\n\tconst isControlled = expandedIds !== undefined;\n\n\tconst keyed = useMemo<ActivityKeyedItem<TData>[]>(() => {\n\t\tconst seen = new Map<string, number>();\n\t\treturn activities.map((activity) => {\n\t\t\tconst baseId = String(activity.id ?? '').trim();\n\t\t\tconst createdAt = String(activity.createdAt ?? '').trim();\n\t\t\tconst event = String(activity.event ?? '').trim();\n\t\t\tconst source = String(activity.source ?? '').trim();\n\t\t\tconst keyBase = [baseId, createdAt, event, source].join(':');\n\t\t\tconst occurrence = (seen.get(keyBase) ?? 0) + 1;\n\t\t\tseen.set(keyBase, occurrence);\n\t\t\treturn { activity, key: `${keyBase}:${occurrence}` };\n\t\t});\n\t}, [activities]);\n\n\tconst groups = useMemo<ActivityDateGroup<TData>[]>(() => {\n\t\tif (!groupByDate) {\n\t\t\treturn keyed.length > 0 ? [{ label: '', items: keyed }] : [];\n\t\t}\n\t\tconst out: ActivityDateGroup<TData>[] = [];\n\t\tlet currentLabel = '__init__';\n\t\tlet currentItems: ActivityKeyedItem<TData>[] = [];\n\n\t\tconst labelFor = (iso: string | null) =>\n\t\t\tformatDateGroupLabel\n\t\t\t\t? formatDateGroupLabel(iso, strings)\n\t\t\t\t: defaultDateGroupLabel(iso, strings, locale);\n\n\t\tfor (const item of keyed) {\n\t\t\tconst iso = item.activity.createdAt ?? null;\n\t\t\tconst label = labelFor(iso);\n\t\t\tif (label !== currentLabel) {\n\t\t\t\tif (currentItems.length > 0) {\n\t\t\t\t\tout.push({ label: currentLabel, items: currentItems });\n\t\t\t\t}\n\t\t\t\tcurrentLabel = label;\n\t\t\t\tcurrentItems = [item];\n\t\t\t} else {\n\t\t\t\tcurrentItems.push(item);\n\t\t\t}\n\t\t}\n\t\tif (currentItems.length > 0) {\n\t\t\tout.push({ label: currentLabel, items: currentItems });\n\t\t}\n\t\treturn out;\n\t}, [keyed, groupByDate, locale, strings, formatDateGroupLabel]);\n\n\tconst defaultExpandedSet = useMemo(() => {\n\t\tconst next = new Set(defaultExpandedIds ?? []);\n\t\tfor (const item of keyed) {\n\t\t\tif (item.activity.defaultExpanded === true) {\n\t\t\t\tnext.add(item.activity.id);\n\t\t\t}\n\t\t}\n\t\treturn next;\n\t}, [keyed, defaultExpandedIds]);\n\n\tconst controlledExpandedSet = useMemo(\n\t\t() => new Set(expandedIds ?? []),\n\t\t[expandedIds],\n\t);\n\n\tconst setExpanded = useCallback((id: string, value: boolean) => {\n\t\tconst currentIds = isControlled\n\t\t\t? Array.from(controlledExpandedSet)\n\t\t\t: keyed\n\t\t\t\t\t.filter((item) =>\n\t\t\t\t\t\texpandedMap[item.activity.id] ??\n\t\t\t\t\t\t\t(defaultExpandedSet.has(item.activity.id) || expandedByDefault),\n\t\t\t\t\t)\n\t\t\t\t\t.map((item) => item.activity.id);\n\t\tconst next = new Set(currentIds);\n\t\tif (value) next.add(id);\n\t\telse next.delete(id);\n\t\tconst nextIds = Array.from(next);\n\t\tif (!isControlled) {\n\t\t\tsetExpandedMap((current) => ({ ...current, [id]: value }));\n\t\t}\n\t\tonExpandedIdsChange?.(nextIds);\n\t}, [\n\t\tcontrolledExpandedSet,\n\t\tdefaultExpandedSet,\n\t\texpandedByDefault,\n\t\texpandedMap,\n\t\tisControlled,\n\t\tkeyed,\n\t\tonExpandedIdsChange,\n\t]);\n\n\tconst isExpanded = useCallback(\n\t\t(id: string) => {\n\t\t\tif (isControlled) return controlledExpandedSet.has(id);\n\t\t\treturn expandedMap[id] ?? (defaultExpandedSet.has(id) || expandedByDefault);\n\t\t},\n\t\t[\n\t\t\tcontrolledExpandedSet,\n\t\t\tdefaultExpandedSet,\n\t\t\texpandedByDefault,\n\t\t\texpandedMap,\n\t\t\tisControlled,\n\t\t],\n\t);\n\n\tconst toggleExpanded = useCallback((id: string) => {\n\t\tsetExpanded(id, !isExpanded(id));\n\t}, [isExpanded, setExpanded]);\n\n\tconst expandAll = useCallback(() => {\n\t\tconst next: Record<string, boolean> = {};\n\t\tfor (const k of keyed) next[k.activity.id] = true;\n\t\tif (!isControlled) setExpandedMap(next);\n\t\tonExpandedIdsChange?.(keyed.map((k) => k.activity.id));\n\t}, [isControlled, keyed, onExpandedIdsChange]);\n\n\tconst collapseAll = useCallback(() => {\n\t\tconst next: Record<string, boolean> = {};\n\t\tfor (const k of keyed) next[k.activity.id] = false;\n\t\tif (!isControlled) setExpandedMap(next);\n\t\tonExpandedIdsChange?.([]);\n\t}, [isControlled, keyed, onExpandedIdsChange]);\n\n\treturn {\n\t\tgroups,\n\t\ttotal: keyed.length,\n\t\tisExpanded,\n\t\ttoggleExpanded,\n\t\tsetExpanded,\n\t\texpandAll,\n\t\tcollapseAll,\n\t};\n}\n","/**\n * useActivityResources — registry hook for the rich-resource feature.\n *\n * The registry maps `key → ActivityResourceConfig`. Activity items reference\n * resources by `key`; the row renderer looks up the live config so badges,\n * icons, and links can be edited globally without touching individual rows.\n *\n * The hook re-seeds whenever the `resources` prop reference changes and emits\n * the full registry on every mutation via `onResourcesChange`. Wire that\n * callback to localStorage / a backend mutation to persist the user's\n * resource customisations across sessions.\n */\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type {\n\tActivityResourceConfig,\n\tActivityResourceRef,\n} from '../activities.types';\n\nexport type ActivityResourceRegistry = Readonly<\n\tRecord<string, ActivityResourceConfig>\n>;\n\nexport interface UseActivityResourcesOptions {\n\tresources?: ActivityResourceRegistry;\n\tonResourcesChange?: (registry: ActivityResourceRegistry) => void;\n}\n\nexport interface UseActivityResourcesReturn {\n\tregistry: ActivityResourceRegistry;\n\t/** Look up a resource by ref or key. */\n\tget: (\n\t\tref: ActivityResourceRef | string,\n\t) => ActivityResourceConfig | undefined;\n\t/** Replace a resource entry wholesale (or insert new). */\n\tregister: (key: string, config: ActivityResourceConfig) => void;\n\t/** Shallow-merge a partial update over an existing entry. */\n\tupdate: (key: string, partial: Partial<ActivityResourceConfig>) => void;\n\t/** Remove an entry. */\n\tremove: (key: string) => void;\n\t/** Replace the entire registry. */\n\tsetAll: (registry: ActivityResourceRegistry) => void;\n\t/** Reset to the original `resources` prop (or empty if none). */\n\treset: () => void;\n}\n\nexport function useActivityResources({\n\tresources,\n\tonResourcesChange,\n}: UseActivityResourcesOptions = {}): UseActivityResourcesReturn {\n\tconst [registry, setRegistry] = useState<ActivityResourceRegistry>(\n\t\t() => resources ?? {},\n\t);\n\n\tconst seedRef = useRef(resources);\n\tuseEffect(() => {\n\t\tif (resources !== seedRef.current) {\n\t\t\tseedRef.current = resources;\n\t\t\tsetRegistry(resources ?? {});\n\t\t}\n\t}, [resources]);\n\n\tconst onChangeRef = useRef(onResourcesChange);\n\tuseEffect(() => {\n\t\tonChangeRef.current = onResourcesChange;\n\t}, [onResourcesChange]);\n\n\tconst emit = useCallback((next: ActivityResourceRegistry) => {\n\t\tonChangeRef.current?.(next);\n\t}, []);\n\n\tconst register = useCallback(\n\t\t(key: string, config: ActivityResourceConfig) => {\n\t\t\tsetRegistry((current) => {\n\t\t\t\tconst next = { ...current, [key]: config };\n\t\t\t\temit(next);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[emit],\n\t);\n\n\tconst update = useCallback(\n\t\t(key: string, partial: Partial<ActivityResourceConfig>) => {\n\t\t\tsetRegistry((current) => {\n\t\t\t\tconst existing = current[key];\n\t\t\t\tif (!existing) return current;\n\t\t\t\tconst next = {\n\t\t\t\t\t...current,\n\t\t\t\t\t[key]: { ...existing, ...partial },\n\t\t\t\t};\n\t\t\t\temit(next);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[emit],\n\t);\n\n\tconst remove = useCallback(\n\t\t(key: string) => {\n\t\t\tsetRegistry((current) => {\n\t\t\t\tif (!(key in current)) return current;\n\t\t\t\tconst next = { ...current };\n\t\t\t\tdelete next[key];\n\t\t\t\temit(next);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[emit],\n\t);\n\n\tconst setAll = useCallback(\n\t\t(next: ActivityResourceRegistry) => {\n\t\t\tsetRegistry(next);\n\t\t\temit(next);\n\t\t},\n\t\t[emit],\n\t);\n\n\tconst reset = useCallback(() => {\n\t\tconst next = seedRef.current ?? {};\n\t\tsetRegistry(next);\n\t\temit(next);\n\t}, [emit]);\n\n\tconst get = useCallback(\n\t\t(ref: ActivityResourceRef | string) => {\n\t\t\tconst key = typeof ref === 'string' ? ref : ref.key;\n\t\t\treturn registry[key];\n\t\t},\n\t\t[registry],\n\t);\n\n\treturn { registry, get, register, update, remove, setAll, reset };\n}\n","/**\n * ActivityActionsMenu — inline overflow menu rendered on rich rows.\n *\n * Backed by the shared ActionMenu surface; each item fires the activity's\n * per-row `onClick` and forwards `actionId` through `onAction` so consumers\n * can route actions centrally.\n */\nimport {\n\tActionMenu,\n\ttype ActionMenuAction,\n} from '../../../base/action-menu';\n\nimport type { ActivityAction, ActivityItem } from '../activities.types';\n\nexport interface ActivityActionsMenuProps<TData = unknown> {\n\t/** The feed entry this row renders. */\n\tactivity: ActivityItem<TData>;\n\t/** Overflow menu for the surface as a whole. */\n\tactions: readonly ActivityAction<TData>[];\n\tonAction?: (actionId: string, activity: ActivityItem<TData>) => void;\n\t/** Display label. */\n\tlabel: string;\n}\n\nfunction actionToneToMenuTone(tone: ActivityAction['tone']) {\n\tif (tone === 'destructive') return 'destructive';\n\tif (tone === 'primary' || tone === 'secondary') return tone;\n\treturn undefined;\n}\n\nexport function ActivityActionsMenu<TData = unknown>({\n\tactivity,\n\tactions,\n\tonAction,\n\tlabel,\n}: ActivityActionsMenuProps<TData>) {\n\tif (actions.length === 0) return null;\n\tconst menuActions: ActionMenuAction[] = actions.map((action) => ({\n\t\tid: action.id,\n\t\ticon: action.icon,\n\t\tlabel: action.label,\n\t\thref: action.href,\n\t\tdisabled: action.disabled,\n\t\ttone: actionToneToMenuTone(action.tone),\n\t\tonClick: () => {\n\t\t\taction.onClick?.(activity);\n\t\t\tonAction?.(action.id, activity);\n\t\t},\n\t}));\n\n\treturn (\n\t\t<ActionMenu\n\t\t\tactions={menuActions}\n\t\t\tsrText={label}\n\t\t\talign=\"end\"\n\t\t\tdensity=\"table\"\n\t\t\tcloseOnSelect\n\t\t\t// The row's trailing controls share one compact size with the expand toggle beside it.\n\t\t\tbuttonProps={{ size: 'sm', className: 'activity-actions-menu--component' }}\n\t\t/>\n\t);\n}\n","/**\n * ActivityChanges — collapsible old → new diff block.\n *\n * Each entry shows the attribute label, the previous value (line-through, on\n * a destructive tint), an arrow, and the new value (on a success tint). When\n * neither old nor new is set, falls back to `description`.\n */\nimport { Stack } from '../../../base/structure';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport type { ActivityChange } from '../activities.types';\nimport { markRecipes } from '../../../../lib/tone-recipes';\n\nexport interface ActivityChangesProps {\n\t/** Field changes recorded by this activity. */\n\tchanges: readonly ActivityChange[];\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nfunction ChangeValue({ change }: { change: ActivityChange }) {\n\tconst hasOld = change.old !== null && change.old !== undefined;\n\tconst hasNew = change.new !== null && change.new !== undefined;\n\n\tif (!hasOld && !hasNew) {\n\t\treturn (\n\t\t\t<Text tag=\"span\">\n\t\t\t\t{change.description}\n\t\t\t</Text>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Text tag=\"span\" className=\"inline-flex flex-wrap items-baseline gap-space-xs\">\n\t\t\t{!!hasOld && (\n\t\t\t\t\t<Text\n\t\t\t\t\ttag=\"span\"\n\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\tclassName={markRecipes.removed}\n\t\t\t\t>\n\t\t\t\t\t{change.old}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t\t{hasOld && hasNew && (\n\t\t\t\t<Text tag=\"span\" size=\"inherit\" type=\"secondary\">\n\t\t\t\t\t→\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t\t{!!hasNew && (\n\t\t\t\t<Text\n\t\t\t\t\ttag=\"span\"\n\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\tclassName={markRecipes.added}\n\t\t\t\t>\n\t\t\t\t\t{change.new}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t</Text>\n\t);\n}\n\nexport function ActivityChanges({ changes, className }: ActivityChangesProps) {\n\tif (changes.length === 0) return null;\n\treturn (\n\t\t<div className={cn(\n\t\t\t\t'activity-changes--component',\n\t\t\t\t'rounded-radius border border-border/60 bg-muted/30 p-surface-xs',\n\t\t\t\tclassName,\n\t\t\t)}>\n\t\t<Stack gap=\"sm\">\n\t\t\t{changes.map((change) => (\n\t\t\t\t<div\n\t\t\t\t\tkey={`${change.key}-${change.label}`}\n\t\t\t\t\tclassName=\"flex items-baseline gap-space-md\"\n\t\t\t\t>\n\t\t\t\t\t<Text\n\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{change.label}\n\t\t\t\t\t</Text>\n\t\t\t\t\t<ChangeValue change={change} />\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</Stack>\n\t\t</div>\n\t);\n}\n","/**\n * ActivityDateLabel — label rendered above each date group.\n *\n * Consumers can override via `slots.renderDateLabel`. Default: the shared\n * small secondary text role in sentence case, with measured top margin\n * between groups.\n */\nimport { Text } from '../../../typography';\nimport { Stack } from '../../../base/structure';\nimport { cn } from '../../../../lib/utils';\n\nexport interface ActivityDateLabelProps {\n\t/** Display label. */\n\tlabel: string;\n\t/** Whether this is the first row, so the timeline rail starts here. */\n\tfirst: boolean;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nexport function ActivityDateLabel({\n\tlabel,\n\tfirst,\n\tclassName,\n}: ActivityDateLabelProps) {\n\tif (label === '') return null;\n\treturn (\n\t\t<Stack gap=\"none\"\n\t\t\tclassName={cn(\n\t\t\t\t'activity-date-label--component',\n\t\t\t\t!first && 'mt-space-md',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Text size=\"xs\" type=\"secondary\" weight=\"medium\">{label}</Text>\n\t\t</Stack>\n\t);\n}\n","/**\n * ActivityEmptyState — neutral empty surface used when no activities are\n * available. Consumers replace via `slots.empty`.\n */\nimport { Activity } from 'lucide-react';\n\nimport { EmptyState } from '../../../blocks/data-display';\nimport { cn } from '../../../../lib/utils';\n\nexport interface ActivityEmptyStateProps {\n\t/** Surface title. */\n\ttitle: string;\n\t/** Short guidance shown beneath the control. */\n\thint?: string;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nexport function ActivityEmptyState({\n\ttitle,\n\thint,\n\tclassName,\n}: ActivityEmptyStateProps) {\n\treturn (\n\t\t<EmptyState\n\t\t\ttitle={title}\n\t\t\tdescription={hint ?? false}\n\t\t\tmedia={<Activity className=\"size-icon\" aria-hidden=\"true\" />}\n\t\t\tmediaVariant=\"icon-soft\"\n\t\t\tpadding=\"md\"\n\t\t\tclassName={cn('activity-empty-state--component', className)}\n\t\t/>\n\t);\n}\n","/**\n * Tone palettes shared by the marker, headline status segments, and the\n * resource tag. Each status tone takes the shared tint scale (tint, ink, solid,\n * line) from src/lib/tone-recipes.ts, so a consumer rebrand at `:root` flows\n * through the activities feature and its tiles match every other toned chip.\n */\nimport { toneRecipes, type ToneRecipeName } from '../../../../lib/tone-recipes';\nimport type { ActivityTone } from '../activities.types';\nimport type { BadgeTone } from '../../../base/badge';\n\nexport interface ActivityToneStyle {\n\t/** Filled background — used by the rich icon marker. */\n\tbg: string;\n\t/** Foreground text colour matching the bg. */\n\tfg: string;\n\t/** Solid colour used by the compact dot. */\n\tdot: string;\n\t/** Border tint used by the connector line. */\n\tline: string;\n\t/** Background for chips / tags. */\n\tchipBg: string;\n\t/** Text colour for chips / tags. */\n\tchipFg: string;\n}\n\nconst toned = (tone: ToneRecipeName): ActivityToneStyle => ({\n\tbg: toneRecipes[tone].tint,\n\tfg: toneRecipes[tone].ink,\n\tdot: toneRecipes[tone].solid,\n\tline: toneRecipes[tone].line,\n\tchipBg: toneRecipes[tone].tint,\n\tchipFg: toneRecipes[tone].ink,\n});\n\nconst neutral: ActivityToneStyle = {\n\tbg: 'bg-muted',\n\tfg: 'text-muted-foreground',\n\tdot: 'bg-muted-foreground',\n\tline: 'bg-border',\n\tchipBg: 'bg-muted',\n\tchipFg: 'text-muted-foreground',\n};\n\nexport const ACTIVITY_TONE: Record<ActivityTone, ActivityToneStyle> = {\n\tprimary: toned('primary'),\n\tsuccess: toned('success'),\n\twarning: toned('warning'),\n\tdestructive: toned('destructive'),\n\tinfo: toned('info'),\n\tneutral,\n\tsecondary: neutral,\n};\n\n/** Map an activity tone onto the closest base/Badge variant. */\nexport const TONE_TO_BADGE_TONE: Record<ActivityTone, BadgeTone> = {\n\tprimary: 'primary',\n\tsuccess: 'success',\n\twarning: 'warning',\n\tdestructive: 'destructive',\n\tinfo: 'info',\n\tneutral: 'secondary',\n\tsecondary: 'secondary',\n};\n","/**\n * ActivityResourceTag — chip rendering for a registered resource.\n *\n * The resource registry stores per-key `ActivityResourceConfig` (label, icon,\n * tone, badge, tags). This component renders those as a single inline chip\n * suitable for embedding into a headline. Falls back gracefully when the\n * registry has no entry — uses the segment's text/label.\n */\nimport { CircleDot } from 'lucide-react';\nimport { cn } from '../../../../lib/utils';\n\nimport { Badge } from '../../../base/badge';\nimport { Button } from '../../../base/buttons';\nimport { Text } from '../../../typography';\n\nimport type {\n\tActivityResourceConfig,\n\tActivityResourceRef,\n\tActivityTone,\n} from '../activities.types';\n\nimport { ACTIVITY_TONE, TONE_TO_BADGE_TONE } from './tone-tokens';\n\nexport interface ActivityResourceTagProps {\n\t/** The referenced resource. */\n\tresource: ActivityResourceRef;\n\t/** Configuration for this surface. */\n\tconfig?: ActivityResourceConfig;\n\t/** Fallback label if neither config nor segment text are present. */\n\tfallbackText?: string;\n\tonClick?: () => void;\n}\n\nexport function ActivityResourceTag({\n\tresource,\n\tconfig,\n\tfallbackText,\n\tonClick,\n}: ActivityResourceTagProps) {\n\tconst tone: ActivityTone = config?.tone ?? 'neutral';\n\tconst palette = ACTIVITY_TONE[tone];\n\tconst Icon = config?.icon ?? CircleDot;\n\tconst label = config?.label ?? fallbackText ?? resource.label ?? resource.key;\n\tconst interactive = typeof onClick === 'function';\n\n\tconst inner = (\n\t\t<>\n\t\t\t<Icon className={cn('size-icon-sm shrink-0', palette.fg)} />\n\t\t\t<Text tag=\"span\" weight=\"medium\" lineHeight=\"none\" className={palette.chipFg}>\n\t\t\t\t{label}\n\t\t\t</Text>\n\t\t\t{!!config?.tags && config.tags.length > 0 && (\n\t\t\t\t<Text\n\t\t\t\t\ttag=\"span\"\n\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\tclassName=\"border-l border-border pl-space-sm\"\n\t\t\t\t>\n\t\t\t\t\t{config.tags.join(' · ')}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t\t{!!config?.badge && (\n\t\t\t\t<Badge\n\t\t\t\t\tinline\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\ttone={TONE_TO_BADGE_TONE[config.badge.tone ?? 'neutral']}\n\t\t\t\t\tclassName=\"ml-space-2xs\"\n\t\t\t\t>\n\t\t\t\t\t{config.badge.label}\n\t\t\t\t</Badge>\n\t\t\t)}\n\t\t</>\n\t);\n\n\tconst chipClass = cn(\n\t\t'inline-flex items-center gap-space-xs rounded-full px-space-sm py-px align-baseline',\n\t\t'border border-border shadow-none',\n\t\tpalette.chipBg,\n\t\tinteractive &&\n\t\t\t'cursor-pointer transition-colors',\n\t);\n\n\tif (interactive) {\n\t\treturn (\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=\"sm\"\n\t\t\t\tonClick={(e) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tonClick?.();\n\t\t\t\t}}\n\t\t\t\tclassName={cn('activity-resource-tag--component gap-space-xs align-baseline', palette.chipBg)}\n\t\t\t\ttitle={config?.note}\n\t\t\t>\n\t\t\t\t{inner}\n\t\t\t</Button>\n\t\t);\n\t}\n\n\treturn (\n\t\t<span className={cn('activity-resource-tag--component', chipClass)} title={config?.note}>\n\t\t\t{inner}\n\t\t</span>\n\t);\n}\n","/**\n * ActivityHeadline — segment renderer for the headline line.\n *\n * Renders typed segments (`actor` / `field` / `value` / `status` / `resource`\n * / `text`) into mixed inline content with proper typography and tone.\n *\n * When no segments are provided, falls back to splitting `headline` around\n * the actor's name so the actor still becomes interactive when possible.\n */\nimport { Fragment, type ReactNode } from 'react';\n\nimport { Badge } from '../../../base/badge';\nimport { Button } from '../../../base/buttons';\nimport { Text, TextLink } from '../../../typography';\n\nimport type {\n\tActivityActor,\n\tActivityHeadlineSegment,\n\tActivityItem,\n\tActivityResourceConfig,\n\tActivityResourceRef,\n} from '../activities.types';\nimport { ActivityResourceTag } from './activity-resource-tag';\nimport { TONE_TO_BADGE_TONE } from './tone-tokens';\n\nexport interface ActivityHeadlineProps<TData = unknown> {\n\t/** The feed entry this row renders. */\n\tactivity: ActivityItem<TData>;\n\t/** Id of the viewing user, used to say “you” instead of their name. */\n\tcurrentUserId?: string;\n\t/** Copy substituted for the current user's own name. */\n\tyouLabel: string;\n\tonActorClick?: (actor: ActivityActor, activity: ActivityItem<TData>) => void;\n\tonResourceClick?: (\n\t\t/** The referenced resource. */\n\t\tresource: ActivityResourceRef,\n\t\t/** Configuration for this surface. */\n\t\tconfig: ActivityResourceConfig | undefined,\n\t\t/** The feed entry this row renders. */\n\t\tactivity: ActivityItem<TData>,\n\t) => void;\n\t/** Live registry lookup for resource segments. */\n\tgetResourceConfig?: (\n\t\tref: ActivityResourceRef,\n\t) => ActivityResourceConfig | undefined;\n}\n\nfunction ActorNode<TData>({\n\tactorId,\n\ttext,\n\thref,\n\tactivity,\n\tyouLabel,\n\tcurrentUserId,\n\tonActorClick,\n}: {\n\tactorId?: string;\n\ttext: string;\n\thref?: string;\n\t/** The feed entry this row renders. */\n\tactivity: ActivityItem<TData>;\n\t/** Copy substituted for the current user's own name. */\n\tyouLabel: string;\n\t/** Id of the viewing user, used to say “you” instead of their name. */\n\tcurrentUserId?: string;\n\tonActorClick?: (actor: ActivityActor, activity: ActivityItem<TData>) => void;\n}) {\n\tconst isYou =\n\t\tcurrentUserId !== undefined &&\n\t\tactorId !== undefined &&\n\t\tcurrentUserId === actorId;\n\tconst display = isYou ? youLabel : text;\n\tconst actor: ActivityActor = activity.actor ?? { id: actorId, name: text };\n\n\tif (href) {\n\t\treturn (\n\t\t\t<TextLink\n\t\t\t\thref={href}\n\t\t\t\tsize=\"inherit\"\n\t\t\t\tunderline={false}\n\t\t\t\tonClick={(e) => {\n\t\t\t\t\tif (onActorClick) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tonActorClick(actor, activity);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tclassName=\"font-semibold text-foreground underline-offset-2 hover:underline\"\n\t\t\t>\n\t\t\t\t{display}\n\t\t\t</TextLink>\n\t\t);\n\t}\n\n\tif (onActorClick) {\n\t\treturn (\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=\"sm\"\n\t\t\t\tonClick={(e) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tonActorClick(actor, activity);\n\t\t\t\t}}\n\t\t\t\tclassName=\"h-auto min-h-0 rounded-inner px-0 py-0 text-foreground underline-offset-2 hover:underline\"\n\t\t\t>\n\t\t\t\t<Text tag=\"span\" weight=\"semibold\">{display}</Text>\n\t\t\t</Button>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Text tag=\"span\" weight=\"semibold\">\n\t\t\t{display}\n\t\t</Text>\n\t);\n}\n\nfunction renderSegments<TData>(\n\tsegments: readonly ActivityHeadlineSegment[],\n\tprops: ActivityHeadlineProps<TData>,\n): ReactNode {\n\treturn segments.map((segment, index) => {\n\t\tconst key = `seg-${index}-${segment.type}`;\n\t\tswitch (segment.type) {\n\t\t\tcase 'actor':\n\t\t\t\treturn (\n\t\t\t\t\t<Fragment key={key}>\n\t\t\t\t\t\t<ActorNode<TData>\n\t\t\t\t\t\t\tactorId={segment.actorId}\n\t\t\t\t\t\t\ttext={segment.text}\n\t\t\t\t\t\t\thref={segment.href}\n\t\t\t\t\t\t\tactivity={props.activity}\n\t\t\t\t\t\t\tyouLabel={props.youLabel}\n\t\t\t\t\t\t\tcurrentUserId={props.currentUserId}\n\t\t\t\t\t\t\tonActorClick={props.onActorClick}\n\t\t\t\t\t\t/>{' '}\n\t\t\t\t\t</Fragment>\n\t\t\t\t);\n\t\t\tcase 'field':\n\t\t\tcase 'value':\n\t\t\t\treturn (\n\t\t\t\t\t<Fragment key={key}>\n\t\t\t\t\t\t<Text tag=\"span\" weight=\"semibold\">\n\t\t\t\t\t\t\t{segment.text}\n\t\t\t\t\t\t</Text>{' '}\n\t\t\t\t\t</Fragment>\n\t\t\t\t);\n\t\t\tcase 'status':\n\t\t\t\treturn (\n\t\t\t\t\t<Fragment key={key}>\n\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\tinline\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\ttone={TONE_TO_BADGE_TONE[segment.tone ?? 'neutral']}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{segment.text}\n\t\t\t\t\t\t</Badge>{' '}\n\t\t\t\t\t</Fragment>\n\t\t\t\t);\n\t\t\tcase 'resource': {\n\t\t\t\tconst config = props.getResourceConfig?.(segment.resource);\n\t\t\t\treturn (\n\t\t\t\t\t<Fragment key={key}>\n\t\t\t\t\t\t<ActivityResourceTag\n\t\t\t\t\t\t\tresource={segment.resource}\n\t\t\t\t\t\t\tconfig={config}\n\t\t\t\t\t\t\tfallbackText={segment.text}\n\t\t\t\t\t\t\tonClick={\n\t\t\t\t\t\t\t\tprops.onResourceClick\n\t\t\t\t\t\t\t\t\t? () =>\n\t\t\t\t\t\t\t\t\t\t\tprops.onResourceClick?.(\n\t\t\t\t\t\t\t\t\t\t\t\tsegment.resource,\n\t\t\t\t\t\t\t\t\t\t\t\tconfig,\n\t\t\t\t\t\t\t\t\t\t\t\tprops.activity,\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>{' '}\n\t\t\t\t\t</Fragment>\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase 'text':\n\t\t\tdefault:\n\t\t\t\treturn (\n\t\t\t\t\t<Fragment key={key}>\n\t\t\t\t\t\t<Text tag=\"span\">\n\t\t\t\t\t\t\t{segment.text}\n\t\t\t\t\t\t</Text>{' '}\n\t\t\t\t\t</Fragment>\n\t\t\t\t);\n\t\t}\n\t});\n}\n\nfunction renderFallback<TData>(props: ActivityHeadlineProps<TData>): ReactNode {\n\tconst { activity } = props;\n\tconst fallbackHeadline =\n\t\tactivity.headline ?? activity.event;\n\tconst actorName = activity.actor?.name;\n\tif (!actorName || !fallbackHeadline.includes(actorName)) {\n\t\treturn (\n\t\t\t<Text tag=\"span\">\n\t\t\t\t{fallbackHeadline}\n\t\t\t</Text>\n\t\t);\n\t}\n\tconst [before, ...after] = fallbackHeadline.split(actorName);\n\treturn (\n\t\t<>\n\t\t\t{!!before && (\n\t\t\t\t<Text tag=\"span\">\n\t\t\t\t\t{before}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t\t<ActorNode<TData>\n\t\t\t\tactorId={activity.actor?.id}\n\t\t\t\ttext={actorName}\n\t\t\t\thref={activity.actor?.href}\n\t\t\t\tactivity={activity}\n\t\t\t\tyouLabel={props.youLabel}\n\t\t\t\tcurrentUserId={props.currentUserId}\n\t\t\t\tonActorClick={props.onActorClick}\n\t\t\t/>\n\t\t\t{after.length > 0 && (\n\t\t\t\t<Text tag=\"span\">\n\t\t\t\t\t{after.join(actorName)}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t</>\n\t);\n}\n\nexport function ActivityHeadline<TData = unknown>(\n\tprops: ActivityHeadlineProps<TData>,\n) {\n\tconst segments = props.activity.segments;\n\tif (segments && segments.length > 0) {\n\t\treturn (\n\t\t\t<span className=\"activity-headline--component leading-snug [&>span]:leading-snug\">\n\t\t\t\t{renderSegments<TData>(segments, props)}\n\t\t\t</span>\n\t\t);\n\t}\n\treturn <span className=\"activity-headline--component leading-snug\">{renderFallback<TData>(props)}</span>;\n}\n","/**\n * ActivityMarker — left-edge visual for a row.\n *\n * Density mapping:\n * - `compact` → small tone-coloured dot\n * - `default` → 22px tone-tinted square with the event icon\n * - `rich` → 28px tone-tinted circle with the event icon\n *\n * Always renders the connector line beneath unless `last` is true.\n */\nimport type { LucideIcon } from 'lucide-react';\nimport { cn } from '../../../../lib/utils';\n\nimport type { ActivityDensity, ActivityTone } from '../activities.types';\n\nimport { ACTIVITY_TONE } from './tone-tokens';\n\nexport interface ActivityMarkerProps {\n\t/** Leading glyph. */\n\ticon: LucideIcon;\n\t/** Semantic tone driving the entry's colour. */\n\ttone: ActivityTone;\n\t/** Row spacing. */\n\tdensity: ActivityDensity;\n\t/** Whether this is the final row, so the timeline rail stops here. */\n\tlast: boolean;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nexport function ActivityMarker({\n\ticon: Icon,\n\ttone,\n\tdensity,\n\tlast,\n\tclassName,\n}: ActivityMarkerProps) {\n\tconst palette = ACTIVITY_TONE[tone];\n\n\tif (density === 'compact') {\n\t\treturn (\n\t\t\t<div className={cn('activity-marker--component flex flex-col items-center', className)}>\n\t\t\t\t<span\n\t\t\t\t\taria-hidden\n\t\t\t\t\tclassName={cn('mt-1.5 size-2 shrink-0 rounded-full', palette.dot)}\n\t\t\t\t/>\n\t\t\t\t{!last && (\n\t\t\t\t\t<span aria-hidden className={cn('mt-1 w-px flex-1', palette.line)} />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (density === 'rich') {\n\t\treturn (\n\t\t\t<div className={cn('activity-marker--component flex flex-col items-center', className)}>\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'flex size-7 shrink-0 items-center justify-center rounded-full ring-1 ring-border/60',\n\t\t\t\t\t\tpalette.bg,\n\t\t\t\t\t\tpalette.fg,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Icon className=\"size-icon-md\" />\n\t\t\t\t</span>\n\t\t\t\t{!last && (\n\t\t\t\t\t<span aria-hidden className={cn('mt-1 w-px flex-1', palette.line)} />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={cn('activity-marker--component flex flex-col items-center', className)}>\n\t\t\t<span\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'flex size-icon-lg shrink-0 items-center justify-center rounded-full',\n\t\t\t\t\tpalette.bg,\n\t\t\t\t\tpalette.fg,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<Icon className=\"size-icon-sm\" />\n\t\t\t</span>\n\t\t\t{!last && (\n\t\t\t\t<span aria-hidden className={cn('mt-1 w-px flex-1', palette.line)} />\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * ActivityRow — single row layout used by `<ActivityFeed />`.\n *\n * Composes the marker, headline, optional description, source badge,\n * timestamp, and (rich-only) the change-detail block plus action menu.\n * Per-density layout follows the design-system rules:\n * compact (dot, single line) / default (icon, headline + meta line) /\n * rich (icon, full header + body + actions).\n *\n * A rich row with a collapsible detail panel opens compact: the headline line\n * and description only. Its secondary detail — metadata, changes, details,\n * resource chips and inline actions — appears together behind the existing\n * details disclosure, so the feed scans as a list of events, not of panels.\n */\nimport { ChevronDown, ChevronRight } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport { Badge } from '../../../base/badge';\nimport { Button } from '../../../base/buttons';\nimport { Grid, Stack } from '../../../base/structure';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport type {\n\t\tActivityAction,\n\t\tActivityActor,\n\t\tActivityDensity,\n\t\tActivityEventConfig,\n\t\tActivityItemSpacing,\n\t\tActivityItem,\n\t\tActivityResourceConfig,\n\t\tActivityResourceRef,\n\t\tActivityTone,\n} from '../activities.types';\n\nimport { ActivityActionsMenu } from './activity-actions-menu';\nimport { ActivityChanges } from './activity-changes';\nimport { ActivityHeadline } from './activity-headline';\nimport { ActivityMarker } from './activity-marker';\nimport { ActivityResourceTag } from './activity-resource-tag';\nimport { interactionRecipes } from '../../../../lib/interaction-recipes';\n\nfunction ActivityMetadataGrid({\n\t\tmetadata,\n}: {\n\t\tmetadata: NonNullable<ActivityItem['metadata']>;\n}) {\n\t\treturn (\n\t\t\t\t<Grid columns={{ base: 1, sm: 2 }} gap=\"md\" className=\"activity-row--metadata\">\n\t\t\t\t\t\t{metadata.map((item) => (\n\t\t\t\t\t\t\t\t<Stack gap=\"dense\"\n\t\t\t\t\t\t\t\t\t\tkey={item.label}\n\t\t\t\t\t\t\t\t\t\tclassName=\"min-w-0\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\t\t\ttag=\"div\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"discrete\"\n\t\t\t\t\t\t\t\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"leading-snug\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\t\t\ttag=\"div\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"min-w-0 break-words leading-snug\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{item.value}\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t))}\n\t\t\t\t</Grid>\n\t\t);\n}\n\nexport interface ActivityRowProps<TData = unknown> {\n\t\t/** The feed entry this row renders. */\n\t\tactivity: ActivityItem<TData>;\n\t\t/** Row spacing. */\n\t\tdensity: ActivityDensity;\n\t\t/** Vertical rhythm between rows. */\n\t\titemSpacing: ActivityItemSpacing;\n\t\t/** Icon, tone, and copy for this activity type. */\n\t\teventConfig: ActivityEventConfig;\n\t\t/** Semantic tone driving the entry's colour. */\n\t\ttone: ActivityTone;\n\t\t/** Whether this is the final row, so the timeline rail stops here. */\n\t\tlast: boolean;\n\t\t/** Whether the row's details are open. */\n\t\texpanded: boolean;\n\t\tonExpandedChange: (expanded: boolean) => void;\n\t\t/** Lets the row expand to show its details. */\n\t\tdetailsCollapsible?: boolean;\n\t\t/** Formatted relative time, e.g. \"2 hours ago\". */\n\t\trelativeTime: string | null;\n\t\t/** Formatted exact timestamp, shown on hover. */\n\t\tabsoluteTime: string | null;\n\t\t/** Where the activity originated — an app, integration, or API. */\n\t\tsourceLabel: string | null;\n\t\t/** Copy substituted for the current user's own name. */\n\t\tyouLabel: string;\n\t\t/** Control that reveals the change list. */\n\t\tshowChangesLabel: string;\n\t\t/** Control that collapses the change list. */\n\t\thideChangesLabel: string;\n\t\t/**\n\t\t * Copy for remaining metadata in the former collapsed preview.\n\t\t * @deprecated Collapsed rows no longer preview metadata; the full list\n\t\t * appears behind the details disclosure. Accepted for compatibility.\n\t\t */\n\t\tmoreLabel: string;\n\t\t/** Accessible name for the row's overflow trigger. */\n\t\tactionsLabel: string;\n\t\t/** Id of the viewing user, used to say \"you\" instead of their name. */\n\t\tcurrentUserId?: string;\n\t\t/** Overflow menu for the surface as a whole. */\n\t\tactions: readonly ActivityAction<TData>[];\n\t\tonActivityClick?: (activity: ActivityItem<TData>) => void;\n\t\tonActorClick?: (actor: ActivityActor, activity: ActivityItem<TData>) => void;\n\t\tonResourceClick?: (\n\t\t\t\t/** The referenced resource. */\n\t\t\t\tresource: ActivityResourceRef,\n\t\t\t\t/** Configuration for this surface. */\n\t\t\t\tconfig: ActivityResourceConfig | undefined,\n\t\t\t\t/** The feed entry this row renders. */\n\t\t\t\tactivity: ActivityItem<TData>,\n\t\t) => void;\n\t\tonAction?: (actionId: string, activity: ActivityItem<TData>) => void;\n\t\t/** Resolves icon and link details for a referenced resource. */\n\t\tgetResourceConfig?: (\n\t\t\t\tref: ActivityResourceRef,\n\t\t) => ActivityResourceConfig | undefined;\n\t\t/** Slot override for the headline only. */\n\t\theadlineOverride?: ReactNode;\n\t\t/** Slot override for the marker only. */\n\t\tmarkerOverride?: ReactNode;\n\t\t/** Extra row detail content rendered inside the rich detail panel. */\n\t\tcustomDetails?: ReactNode;\n\t\t/** Merged onto the row. */\n\t\trowClassName?: string;\n\t\t/** Merged onto the marker. */\n\t\tmarkerClassName?: string;\n\t\t/** Merged onto the content. */\n\t\tcontentClassName?: string;\n\t\t/** Merged onto the details. */\n\t\tdetailsClassName?: string;\n}\n\nexport function ActivityRow<TData = unknown>(props: ActivityRowProps<TData>) {\n\t\tconst {\n\t\t\t\tactivity,\n\t\t\t\tdensity,\n\t\t\t\titemSpacing,\n\t\t\t\teventConfig,\n\t\t\t\ttone,\n\t\t\t\tlast,\n\t\t\t\texpanded,\n\t\t\t\tonExpandedChange,\n\t\t\t\tdetailsCollapsible,\n\t\t\t\trelativeTime,\n\t\t\t\tabsoluteTime,\n\t\t\t\tsourceLabel,\n\t\t\t\tyouLabel,\n\t\t\t\tshowChangesLabel,\n\t\t\t\thideChangesLabel,\n\t\t\t\tactionsLabel,\n\t\t\t\tcurrentUserId,\n\t\t\t\tactions,\n\t\t\t\tonActivityClick,\n\t\t\t\tonActorClick,\n\t\t\t\tonResourceClick,\n\t\t\t\tonAction,\n\t\t\t\tgetResourceConfig,\n\t\t\t\theadlineOverride,\n\t\t\t\tmarkerOverride,\n\t\t\t\tcustomDetails,\n\t\t\t\trowClassName,\n\t\t\t\tmarkerClassName,\n\t\t\t\tcontentClassName,\n\t\t\t\tdetailsClassName,\n\t\t} = props;\n\n\t\tconst Icon = activity.iconOverride ?? eventConfig.icon;\n\t\tconst hasChanges = (activity.changes?.length ?? 0) > 0;\n\t\tconst metadata = activity.metadata ?? [];\n\t\tconst hasMetadata = metadata.length > 0;\n\t\tconst hasResources = (activity.resources?.length ?? 0) > 0;\n\t\tconst hasDetails =\n\t\t\t\tactivity.details !== undefined &&\n\t\t\t\tactivity.details !== null &&\n\t\t\t\tactivity.details !== false;\n\t\tconst hasCustomDetails =\n\t\t\t\tcustomDetails !== undefined &&\n\t\t\t\tcustomDetails !== null &&\n\t\t\t\tcustomDetails !== false;\n\t\tconst hasDetailPanel = hasMetadata || hasChanges || hasDetails || hasCustomDetails;\n\t\tconst hasDescription =\n\t\t\t\tactivity.description !== undefined &&\n\t\t\t\tactivity.description !== null &&\n\t\t\t\tactivity.description !== '';\n\t\tconst showSecondaryRow = density !== 'compact';\n\t\tconst showRichBody = density === 'rich';\n\t\tconst panelIsCollapsible = detailsCollapsible ?? (hasMetadata || hasChanges);\n\t\tconst showDetailPanel = showRichBody && hasDetailPanel && (!panelIsCollapsible || expanded);\n\t\t// Resource chips and inline actions are secondary detail too: they follow\n\t\t// the panel's disclosure whenever the row offers one.\n\t\tconst showSecondaryDetail = showRichBody && (!(hasDetailPanel && panelIsCollapsible) || expanded);\n\t\tconst inlineActions = actions.filter((action) => action.presentation === 'inline');\n\t\tconst menuActions = actions.filter((action) => action.presentation !== 'inline');\n\n\t\tconst headlineNode =\n\t\t\t\theadlineOverride ??\n\t\t\t\t(\n\t\t\t\t\t\t<ActivityHeadline<TData>\n\t\t\t\t\t\t\t\tactivity={activity}\n\t\t\t\t\t\t\t\tcurrentUserId={currentUserId}\n\t\t\t\t\t\t\t\tyouLabel={youLabel}\n\t\t\t\t\t\t\t\tonActorClick={onActorClick}\n\t\t\t\t\t\t\t\tonResourceClick={onResourceClick}\n\t\t\t\t\t\t\t\tgetResourceConfig={getResourceConfig}\n\t\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\tconst markerNode =\n\t\t\t\tmarkerOverride ?? (\n\t\t\t\t\t\t<ActivityMarker\n\t\t\t\t\t\t\t\ticon={Icon}\n\t\t\t\t\t\t\t\ttone={tone}\n\t\t\t\t\t\t\t\tdensity={density}\n\t\t\t\t\t\t\t\tlast={last}\n\t\t\t\t\t\t\t\tclassName={markerClassName}\n\t\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\tconst interactive = typeof onActivityClick === 'function';\n\t\tconst hasNestedInteractive = (\n\t\t\t\thasChanges ||\n\t\t\t\thasResources ||\n\t\t\t\tmenuActions.length > 0 ||\n\t\t\t\tinlineActions.length > 0 ||\n\t\t\t\ttypeof onActorClick === 'function' ||\n\t\t\t\ttypeof onResourceClick === 'function'\n\t\t);\n\t\tconst keyboardInteractive = interactive && !hasNestedInteractive;\n\n\t\tconst rowSpacing =\n\t\t\t\tdensity === 'rich'\n\t\t\t\t\t\t? 'gap-space-md py-space-xs'\n\t\t\t\t\t\t: density === 'compact'\n\t\t\t\t\t\t\t\t? 'gap-space-sm py-space-2xs'\n\t\t\t\t\t\t\t\t: 'gap-space-md py-space-2xs';\n\t\tconst contentPadding = !last\n\t\t\t\t? itemSpacing === 'compact'\n\t\t\t\t\t\t? 'pb-space-sm'\n\t\t\t\t\t\t: itemSpacing === 'relaxed'\n\t\t\t\t\t\t\t\t? 'pb-space-xl'\n\t\t\t\t\t\t\t\t: 'pb-space-md'\n\t\t\t\t: '';\n\n\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'activity-row--component relative flex',\n\t\t\t\t\t\t\t\trowSpacing,\n\t\t\t\t\t\t\t\tinteractive && `cursor-pointer rounded-inner ${interactionRecipes.rowHover}`,\n\t\t\t\t\t\t\t\trowClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tonClick={interactive ? () => onActivityClick?.(activity) : undefined}\n\t\t\t\t\t\trole={keyboardInteractive ? 'button' : undefined}\n\t\t\t\t\t\ttabIndex={keyboardInteractive ? 0 : undefined}\n\t\t\t\t\t\tonKeyDown={\n\t\t\t\t\t\t\t\tkeyboardInteractive\n\t\t\t\t\t\t\t\t\t\t? (e) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonActivityClick?.(activity);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t\t{markerNode}\n\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'activity-row--content min-w-0 flex-1',\n\t\t\t\t\t\t\t\t\t\tcontentPadding,\n\t\t\t\t\t\t\t\t\t\tcontentClassName,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Stack gap=\"dense\">\n\t\t\t\t\t\t\t\t<div className=\"activity-row--summary grid min-w-0 grid-cols-1 items-start gap-x-space-lg gap-y-space-sm sm:grid-cols-[minmax(0,1fr)_max-content]\">\n\t\t\t\t\t<Stack gap=\"dense\" className=\"min-w-0\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"activity-row--headline flex min-w-0 flex-wrap items-center gap-x-space-sm gap-y-space-xs\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlineHeight=\"snug\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"min-w-0 break-words [overflow-wrap:anywhere]\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{headlineNode}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{!!sourceLabel && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Badge inline size=\"sm\" tone=\"secondary\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{sourceLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</Stack>\n\n\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"xs\" justify={{ base: 'between', sm: 'end' }} wrap={false} className=\"activity-row--trailing w-full shrink-0 justify-self-start sm:w-auto sm:justify-self-end\">\n\t\t\t\t\t\t\t\t\t\t\t\t{!!relativeTime && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"whitespace-nowrap tabular-nums leading-snug\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle={absoluteTime ?? undefined}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{relativeTime}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t{showRichBody && hasDetailPanel && panelIsCollapsible && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"size-action-sm text-muted-foreground\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonExpandedChange(!expanded);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle={expanded ? hideChangesLabel : showChangesLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={expanded ? hideChangesLabel : showChangesLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-expanded={expanded}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{expanded ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ChevronDown className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ChevronRight className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t{showRichBody && menuActions.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ActivityActionsMenu<TData>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tactivity={activity}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tactions={menuActions}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonAction={onAction}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlabel={actionsLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t{!!showSecondaryRow && hasDescription && (\n\t\t\t\t\t\t\t\t\t\t<Text tag=\"div\" type=\"secondary\" className=\"max-w-3xl leading-relaxed\">\n\t\t\t\t\t\t\t\t\t\t\t\t{activity.description}\n\t\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\n\t\t\t\t\t\t\t\t{showSecondaryDetail && hasResources && activity.resources && (\n\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"xs\" className=\"mt-space-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t{activity.resources.map((res) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst cfg = getResourceConfig?.(res);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ActivityResourceTag\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={res.key}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tresource={res}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconfig={cfg}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonResourceClick\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? () =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonResourceClick(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tres,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcfg,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tactivity,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{showDetailPanel && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"mt-space-sm\">\n\t\t\t\t\t\t<div className={cn(\n\t\t\t\t\t\t\t'activity-row--details',\n\t\t\t\t\t\t\tdetailsClassName,\n\t\t\t\t\t\t)}>\n\t\t\t\t\t\t<Stack gap=\"md\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{hasMetadata && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ActivityMetadataGrid metadata={metadata} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{hasChanges && activity.changes && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ActivityChanges\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tchanges={activity.changes}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"border-0 bg-transparent p-0\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{hasDetails && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"activity-row--details-body\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{activity.details}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{hasCustomDetails && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"activity-row--details-custom\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{customDetails}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{showSecondaryDetail && inlineActions.length > 0 && (\n\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"xs\" className=\"activity-row--inline-actions mt-space-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t{inlineActions.map((action) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst ActionIcon = action.icon;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={action.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttone={action.tone === 'destructive' ? 'destructive' : 'secondary'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"outline\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ticon={ActionIcon}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={action.disabled}\n\t\t\t\t\t\t\t\t\tclassName=\"h-auto min-h-action-sm px-control-sm py-space-xs\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonAction?.(action.id, activity);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\taction.onClick?.(activity);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{action.label}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t);\n}\n","/**\n * ActivityFeed — framework-agnostic activity timeline.\n *\n * Composition seams:\n * - `strings` — deep-partial override of every label\n * - `eventConfig` — mass-configurable per-event icon/tone/labels\n * - `slots` — replace any region (row / headline / marker /\n * dateLabel / empty / loading / header / footer)\n * - `slots.renderRow` — full per-row override\n * - `accessors` — formatRelative/Absolute, getEventLabel, …\n * - `actionsForActivity` — surface a per-row action menu (rich density)\n * - `resources` + `onResourcesChange` — registry-driven rich resource\n * tags (icons, badges, links, tags) with save\n * and restore semantics for the consumer\n *\n * Headless usage:\n * - Call `useActivityFeed({ activities, ... })` directly to drive a\n * completely custom UI against the same grouping/expand state machine.\n * - Call `useActivityResources({ resources, onResourcesChange })` to\n * drive the registry independently.\n *\n * Framework-agnostic:\n * - No router import, no i18n SDK import. Wire actor / resource navigation\n * via callbacks at the call site.\n */\nimport { format, isValid, type Locale } from 'date-fns';\nimport { useMemo, type ReactNode } from 'react';\n\nimport { Stack } from '../../base/structure';\nimport { Text } from '../../typography';\nimport { useStrings } from '../../../lib/strings';\nimport { useDatesConfig } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\n\nimport {\n\tdefaultActivityEventConfig,\n\tresolveEventConfig,\n} from './activities.config';\nimport {\n\tdefaultActivitiesStrings,\n} from './activities.strings';\nimport type {\n\tActivityAction,\n\tActivityFeedProps,\n\tActivityItem,\n\tActivityRowClassNameValue,\n\tActivityRenderRowContext,\n\tActivityTone,\n} from './activities.types';\nimport { useActivityFeed } from './hooks/use-activity-feed';\nimport { useActivityResources } from './hooks/use-activity-resources';\nimport {\n\tActivityDateLabel,\n\tActivityEmptyState,\n\tActivityRow,\n} from './partials';\n\nfunction defaultFormatAbsolute(iso: string, locale?: Locale): string {\n\ttry {\n\t\tconst date = new Date(iso);\n\t\treturn isValid(date) ? format(date, 'PP p', locale ? { locale } : undefined) : iso;\n\t} catch {\n\t\treturn iso;\n\t}\n}\n\nfunction resolveRowClassName<TData>(\n\tvalue: ActivityRowClassNameValue<TData> | undefined,\n\tactivity: ActivityItem<TData>,\n) {\n\treturn typeof value === 'function' ? value(activity) : value;\n}\n\nfunction resolveTone<TData>(\n\tactivity: ActivityItem<TData>,\n\teventTone: ActivityTone,\n): ActivityTone {\n\treturn activity.toneOverride ?? eventTone;\n}\n\nexport function ActivityFeed<TData = unknown>(props: ActivityFeedProps<TData>) {\n\tconst {\n\t\tactivities = [],\n\t\tdensity = 'default',\n\t\titemSpacing = 'relaxed',\n\t\tgroupByDate = true,\n\t\texpandedByDefault = false,\n\t\tdetailsCollapsible,\n\t\tdefaultExpandedIds,\n\t\texpandedIds,\n\t\tonExpandedIdsChange,\n\t\tcurrentUserId,\n\t\tloading = false,\n\t\teventConfig: eventConfigOverride,\n\t\tstrings: stringsProp,\n\t\tslots,\n\t\trowClassNames,\n\t\tclassName,\n\t\tlocale,\n\t\t// accessors\n\t\tformatRelativeTime,\n\t\tformatAbsoluteTime,\n\t\tformatDateGroupLabel,\n\t\tgetEventLabel: _getEventLabel,\n\t\tgetSourceLabel,\n\t\tactionsForActivity,\n\t\t// callbacks\n\t\tonActivityClick,\n\t\tonActorClick,\n\t\tonResourceClick,\n\t\tonAction,\n\t\tonActivityExpandedChange,\n\t\t// resources\n\t\tresources,\n\t\tonResourcesChange,\n\t} = props;\n\n\tconst strings = useStrings(defaultActivitiesStrings, stringsProp);\n\n\tconst eventConfigMap = useMemo(\n\t\t() => ({ ...defaultActivityEventConfig, ...eventConfigOverride }),\n\t\t[eventConfigOverride],\n\t);\n\n\tconst registry = useActivityResources({\n\t\tresources,\n\t\tonResourcesChange,\n\t});\n\n\tconst dates = useDatesConfig();\n\tconst resolvedLocale = locale ?? dates.locale;\n\tconst feed = useActivityFeed<TData>({\n\t\tactivities,\n\t\tgroupByDate,\n\t\texpandedByDefault,\n\t\tdefaultExpandedIds,\n\t\texpandedIds,\n\t\tonExpandedIdsChange,\n\t\tlocale: resolvedLocale,\n\t\tstrings,\n\t\tformatDateGroupLabel,\n\t});\n\n\tconst fmtRelative = formatRelativeTime ?? dates.formatRelativeTime ?? ((iso: string) => iso);\n\tconst fmtAbsolute = formatAbsoluteTime ?? ((iso: string) => defaultFormatAbsolute(iso, resolvedLocale));\n\n\tif (loading) {\n\t\treturn (\n\t\t\t<div className={cn('activities-feed--component', 'px-space-md py-space-xl', className)}>\n\t\t\t\t{slots?.loading ?? (\n\t\t\t\t\t<Text type=\"secondary\" align=\"center\">\n\t\t\t\t\t\t{strings.loading}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (activities.length === 0) {\n\t\treturn (\n\t\t\t<div className={cn('activities-feed--component', 'px-space-md py-space-md', className)}>\n\t\t\t\t{slots?.empty ?? <ActivityEmptyState title={strings.empty} />}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst totalRendered = feed.groups.reduce((acc, g) => acc + g.items.length, 0);\n\tlet renderedSoFar = 0;\n\n\treturn (\n\t\t<Stack gap=\"xl\" className={cn('activities-feed--component', className)}>\n\t\t\t{!!slots?.header && <div>{slots.header}</div>}\n\n\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t{feed.groups.map((group, gi) => {\n\t\t\t\t\tconst isFirstGroup = gi === 0;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={`${group.label}-${gi}`} className={cn(isFirstGroup ? '' : 'mt-1')}>\n\t\t\t\t\t\t\t{slots?.renderDateLabel\n\t\t\t\t\t\t\t\t? slots.renderDateLabel(group.label, isFirstGroup)\n\t\t\t\t\t\t\t\t: (\n\t\t\t\t\t\t\t\t\t<ActivityDateLabel\n\t\t\t\t\t\t\t\t\t\tlabel={group.label}\n\t\t\t\t\t\t\t\t\t\tfirst={isFirstGroup}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t<div className={cn('flex flex-col', !!group.label && 'mt-space-md')}>\n\t\t\t\t\t\t\t\t{group.items.map((keyed, ii) => {\n\t\t\t\t\t\t\t\t\tconst activity = keyed.activity;\n\t\t\t\t\t\t\t\t\tconst isFirstInGroup = ii === 0;\n\t\t\t\t\t\t\t\t\tconst isLast =\n\t\t\t\t\t\t\t\t\t\t++renderedSoFar === totalRendered;\n\t\t\t\t\t\t\t\t\tconst eventCfg = resolveEventConfig(\n\t\t\t\t\t\t\t\t\t\tactivity.event,\n\t\t\t\t\t\t\t\t\t\teventConfigMap,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tconst tone = resolveTone(activity, eventCfg.tone);\n\t\t\t\t\t\t\t\t\tconst relativeTime = activity.timestamp\n\t\t\t\t\t\t\t\t\t\t?? (activity.createdAt\n\t\t\t\t\t\t\t\t\t\t\t? fmtRelative(activity.createdAt)\n\t\t\t\t\t\t\t\t\t\t\t: null);\n\t\t\t\t\t\t\t\t\tconst absoluteTime = activity.createdAt\n\t\t\t\t\t\t\t\t\t\t? fmtAbsolute(activity.createdAt)\n\t\t\t\t\t\t\t\t\t\t: null;\n\t\t\t\t\t\t\t\t\tconst sourceLabel = activity.source\n\t\t\t\t\t\t\t\t\t\t? (getSourceLabel?.(activity.source)\n\t\t\t\t\t\t\t\t\t\t\t\t?? strings.sources[activity.source]\n\t\t\t\t\t\t\t\t\t\t\t\t?? eventCfg.sourceLabel\n\t\t\t\t\t\t\t\t\t\t\t\t?? null)\n\t\t\t\t\t\t\t\t\t\t: eventCfg.sourceLabel ?? null;\n\t\t\t\t\t\t\t\t\tconst sourceLabelTrimmed =\n\t\t\t\t\t\t\t\t\t\tsourceLabel && sourceLabel.trim().length > 0\n\t\t\t\t\t\t\t\t\t\t\t? sourceLabel\n\t\t\t\t\t\t\t\t\t\t\t: null;\n\t\t\t\t\t\t\t\t\tconst actions: readonly ActivityAction<TData>[] =\n\t\t\t\t\t\t\t\t\t\tactionsForActivity?.(activity) ?? [];\n\n\t\t\t\t\t\t\t\t\tconst ctx: ActivityRenderRowContext<TData> = {\n\t\t\t\t\t\t\t\t\t\tdensity,\n\t\t\t\t\t\t\t\t\t\tisLast,\n\t\t\t\t\t\t\t\t\t\tisFirstInGroup,\n\t\t\t\t\t\t\t\t\t\tactivity,\n\t\t\t\t\t\t\t\t\t\teventConfig: eventCfg,\n\t\t\t\t\t\t\t\t\t\ttone,\n\t\t\t\t\t\t\t\t\t\trelativeTime,\n\t\t\t\t\t\t\t\t\t\tabsoluteTime,\n\t\t\t\t\t\t\t\t\t\tsourceLabel: sourceLabelTrimmed,\n\t\t\t\t\t\t\t\t\t\texpanded: feed.isExpanded(activity.id),\n\t\t\t\t\t\t\t\t\t\titemSpacing,\n\t\t\t\t\t\t\t\t\t\tsetExpanded: (expanded) =>\n\t\t\t\t\t\t\t\t\t\t\tfeed.setExpanded(activity.id, expanded),\n\t\t\t\t\t\t\t\t\t\ttoggleExpanded: () =>\n\t\t\t\t\t\t\t\t\t\t\tfeed.toggleExpanded(activity.id),\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\tconst customDetails =\n\t\t\t\t\t\t\t\t\t\tslots?.renderDetails?.(activity, ctx);\n\n\t\t\t\t\t\t\t\t\tconst customRow = slots?.renderRow?.(activity, ctx);\n\t\t\t\t\t\t\t\t\tif (customRow !== undefined) {\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<div key={keyed.key}>{customRow}</div>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tconst headlineOverride =\n\t\t\t\t\t\t\t\t\t\tslots?.renderHeadline?.(activity, ctx);\n\t\t\t\t\t\t\t\t\tconst markerOverride =\n\t\t\t\t\t\t\t\t\t\tslots?.renderMarker?.(activity, ctx);\n\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<ActivityRow<TData>\n\t\t\t\t\t\t\t\t\t\t\tkey={keyed.key}\n\t\t\t\t\t\t\t\t\t\t\tactivity={activity}\n\t\t\t\t\t\t\t\t\t\t\tdensity={density}\n\t\t\t\t\t\t\t\t\t\t\titemSpacing={itemSpacing}\n\t\t\t\t\t\t\t\t\t\t\teventConfig={eventCfg}\n\t\t\t\t\t\t\t\t\t\t\ttone={tone}\n\t\t\t\t\t\t\t\t\t\t\tlast={isLast}\n\t\t\t\t\t\t\t\t\t\t\texpanded={ctx.expanded}\n\t\t\t\t\t\t\t\t\t\t\tonExpandedChange={(expanded) => {\n\t\t\t\t\t\t\t\t\t\t\t\tfeed.setExpanded(activity.id, expanded);\n\t\t\t\t\t\t\t\t\t\t\t\tonActivityExpandedChange?.(activity, expanded);\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tdetailsCollapsible={activity.collapsible ?? detailsCollapsible}\n\t\t\t\t\t\t\t\t\t\t\trelativeTime={relativeTime}\n\t\t\t\t\t\t\t\t\t\t\tabsoluteTime={absoluteTime}\n\t\t\t\t\t\t\t\t\t\t\tsourceLabel={sourceLabelTrimmed}\n\t\t\t\t\t\t\t\t\t\t\tyouLabel={strings.you}\n\t\t\t\t\t\t\t\t\t\t\tshowChangesLabel={strings.showChanges}\n\t\t\t\t\t\t\t\t\t\t\thideChangesLabel={strings.hideChanges}\n\t\t\t\t\t\t\t\t\t\t\tmoreLabel={strings.moreLabel}\n\t\t\t\t\t\t\t\t\t\t\tactionsLabel={strings.actionsLabel}\n\t\t\t\t\t\t\t\t\t\t\tcurrentUserId={currentUserId}\n\t\t\t\t\t\t\t\t\t\t\tactions={actions}\n\t\t\t\t\t\t\t\t\t\t\tonActivityClick={onActivityClick}\n\t\t\t\t\t\t\t\t\t\t\tonActorClick={onActorClick}\n\t\t\t\t\t\t\t\t\t\t\tonResourceClick={onResourceClick}\n\t\t\t\t\t\t\t\t\t\t\tonAction={onAction}\n\t\t\t\t\t\t\t\t\t\t\tgetResourceConfig={(ref) =>\n\t\t\t\t\t\t\t\t\t\t\t\tregistry.get(ref)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\theadlineOverride={\n\t\t\t\t\t\t\t\t\t\t\t\theadlineOverride as ReactNode | undefined\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tmarkerOverride={\n\t\t\t\t\t\t\t\t\t\t\t\tmarkerOverride as ReactNode | undefined\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tcustomDetails={customDetails}\n\t\t\t\t\t\t\t\t\t\t\trowClassName={resolveRowClassName(rowClassNames?.row, activity)}\n\t\t\t\t\t\t\t\t\t\t\tmarkerClassName={resolveRowClassName(rowClassNames?.marker, activity)}\n\t\t\t\t\t\t\t\t\t\t\tcontentClassName={resolveRowClassName(rowClassNames?.content, activity)}\n\t\t\t\t\t\t\t\t\t\t\tdetailsClassName={resolveRowClassName(rowClassNames?.details, activity)}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\n\t\t\t{!!slots?.footer && <div>{slots.footer}</div>}\n\t\t</Stack>\n\t);\n}\n\nActivityFeed.displayName = 'ActivityFeed';\n","/**\n * ActivityLog — canonical mixed-source activity surface.\n *\n * This is the single feature implementation for comments, audit events,\n * system events, domain events, inline mentions, composer chrome, row actions,\n * and collapsible details. `ActivityFeed` remains the lower-level activity-row\n * primitive inside this feature; consumers needing the full mixed log should\n * mount `ActivityLog`.\n */\nimport { MessageCircle } from 'lucide-react';\nimport { formatDistanceToNow, isValid, parseISO } from 'date-fns';\nimport { useCallback, useMemo, type ReactNode } from 'react';\n\nimport {\n\tCommentComposer,\n\tCommentItem,\n\ttype CommentUser,\n\tuseComments,\n} from '../comments';\nimport { MentionContent } from '../mentions';\nimport { useStrings } from '../../../lib/strings';\nimport { useDatesConfig } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\nimport { Text } from '../../typography';\nimport { Stack } from '../../base/structure';\n\nimport { ActivityFeed } from './activities-feed';\nimport { defaultActivitiesStrings } from './activities.strings';\nimport type {\n\tActivityAction,\n\tActivityFeedSlots,\n\tActivityItem,\n\tActivityLogActivityEntry,\n\tActivityLogClassNameValue,\n\tActivityLogEntry,\n\tActivityLogProps,\n\tActivityLogRenderer,\n\tActivityRowClassNames,\n\tActivityTone,\n} from './activities.types';\nimport { ActivityMarker } from './partials/activity-marker';\n\nfunction sortEntries<T extends { timestamp?: string }>(\n\tentries: ReadonlyArray<T>,\n\torder: 'asc' | 'desc',\n): ReadonlyArray<T> {\n\tconst arr = [...entries];\n\tarr.sort((a, b) => {\n\t\tconst ta = a.timestamp ? new Date(a.timestamp).getTime() : 0;\n\t\tconst tb = b.timestamp ? new Date(b.timestamp).getTime() : 0;\n\t\treturn order === 'asc' ? ta - tb : tb - ta;\n\t});\n\treturn arr;\n}\n\nfunction toActivityTone(tone: ActivityLogActivityEntry['tone']): ActivityTone {\n\treturn tone ?? 'secondary';\n}\n\nfunction toActor(actor: ActivityLogActivityEntry['actor']) {\n\tif (!actor) return undefined;\n\treturn typeof actor === 'string' ? { name: actor } : actor;\n}\n\nfunction hasRenderableNode(value: ReactNode): boolean {\n\treturn value !== null && value !== undefined && value !== false;\n}\n\nfunction resolveEventClassName<\n\tTUser extends CommentUser,\n\tTMeta,\n\tTResource extends string,\n>(\n\tvalue: ActivityLogClassNameValue<TResource> | undefined,\n\tentry: ActivityLogEntry<TUser, TMeta, TResource> | undefined,\n) {\n\tif (!value || !entry || entry.kind === 'comment') return undefined;\n\treturn typeof value === 'function'\n\t\t? value(entry as ActivityLogActivityEntry<TResource>)\n\t\t: value;\n}\n\nfunction mapEventToActivity<TResource extends string>(\n\tentry: ActivityLogActivityEntry<TResource>,\n\tresources: ActivityLogProps<CommentUser, unknown, TResource>['resources'],\n): ActivityItem<ActivityLogActivityEntry<TResource>> {\n\tconst actor = toActor(entry.actor);\n\tconst description =\n\t\tentry.descriptionHtml ? (\n\t\t\t<MentionContent\n\t\t\t\thtml={entry.descriptionHtml}\n\t\t\t\tmentions={entry.mentions}\n\t\t\t\tresources={resources}\n\t\t\t/>\n\t\t) : entry.description;\n\n\treturn {\n\t\tid: entry.id,\n\t\tevent: entry.event ?? entry.kind,\n\t\t// Only a consumer-supplied label earns a source chip; `kind` is internal.\n\t\tsource: typeof entry.label === 'string' ? entry.label : undefined,\n\t\tactor,\n\t\tcreatedAt: entry.timestamp,\n\t\ttimestamp: undefined,\n\t\ticonOverride: entry.icon,\n\t\ttoneOverride: toActivityTone(entry.tone),\n\t\theadline: typeof entry.headline === 'string' ? entry.headline : undefined,\n\t\tdescription,\n\t\tmetadata: entry.metadata,\n\t\tchanges: entry.changes,\n\t\tdetails: entry.details,\n\t\tcollapsible: entry.collapsible,\n\t\tdefaultExpanded: entry.defaultExpanded,\n\t\tdata: entry,\n\t\tsegments:\n\t\t\tentry.action || entry.target || entry.label || !entry.headline\n\t\t\t\t? [\n\t\t\t\t\t\t...(actor\n\t\t\t\t\t\t\t? [{ type: 'actor' as const, text: actor.name, actorId: actor.id }]\n\t\t\t\t\t\t\t: []),\n\t\t\t\t\t\t...(entry.action\n\t\t\t\t\t\t\t? [{ type: 'text' as const, text: entry.action }]\n\t\t\t\t\t\t\t: []),\n\t\t\t\t\t\t...(hasRenderableNode(entry.target)\n\t\t\t\t\t\t\t? [{ type: 'value' as const, text: String(entry.target) }]\n\t\t\t\t\t\t\t: []),\n\t\t\t\t\t\t...(!actor && !entry.action && !entry.target && entry.headline\n\t\t\t\t\t\t\t? [{ type: 'text' as const, text: String(entry.headline) }]\n\t\t\t\t\t\t\t: []),\n\t\t\t\t\t]\n\t\t\t\t: undefined,\n\t};\n}\n\nexport function ActivityLog<\n\tTUser extends CommentUser = CommentUser,\n\tTMeta = unknown,\n\tTResource extends string = string,\n>(props: ActivityLogProps<TUser, TMeta, TResource>) {\n\tconst {\n\t\tentries,\n\t\torder = 'desc',\n\t\titemSpacing = 'relaxed',\n\t\tresources,\n\t\tonResourceSearch,\n\t\tcanModerate,\n\t\tonCommentDelete,\n\t\tonCommentReact,\n\t\tonCommentReply,\n\t\tonCommentPinToggle,\n\t\tstrings,\n\t\tactivityStrings: activityStringsProp,\n\t\trenderers,\n\t\trenderEventDetails,\n\t\teventDetailsCollapsible = true,\n\t\tdefaultExpandedIds,\n\t\texpandedIds,\n\t\tonExpandedIdsChange,\n\t\tonEventExpandedChange,\n\t\tonEventAction,\n\t\tclassNames,\n\t\tcomposer,\n\t\tbare = false,\n\t\ttitle,\n\t\tgetMediaUrl,\n\t\tgetMediaName,\n\t\tgetStatusLabel,\n\t\tformatRelativeTime,\n\t\tclassName,\n\t} = props;\n\n\tconst activityStrings = useStrings(defaultActivitiesStrings, activityStringsProp);\n\tconst dates = useDatesConfig();\n\tconst formatRelative = useCallback(\n\t\t(iso: string) => {\n\t\t\tconst configuredFormatter =\n\t\t\t\tformatRelativeTime ?? dates.formatRelativeTime;\n\t\t\tif (configuredFormatter) return configuredFormatter(iso);\n\n\t\t\tconst parsed = parseISO(iso);\n\t\t\tif (!isValid(parsed)) return iso;\n\t\t\tconst locale = dates.locale;\n\t\t\treturn formatDistanceToNow(parsed, {\n\t\t\t\taddSuffix: true,\n\t\t\t\t...(locale ? { locale } : {}),\n\t\t\t});\n\t\t},\n\t\t[dates.formatRelativeTime, dates.locale, formatRelativeTime],\n\t);\n\n\tconst composerState = useComments<CommentUser, unknown, TResource>({\n\t\tonSubmit: composer?.onSubmit,\n\t\tonAfterMutate: composer?.onAfterMutate,\n\t\tonError: composer?.onError,\n\t});\n\n\tconst sorted = useMemo(\n\t\t() => sortEntries(entries, order),\n\t\t[entries, order],\n\t);\n\n\tconst activities = useMemo(\n\t\t() =>\n\t\t\tsorted.map((entry) => {\n\t\t\t\tif (entry.kind === 'comment') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: entry.id,\n\t\t\t\t\t\tevent: 'comment',\n\t\t\t\t\t\tsource: 'comment',\n\t\t\t\t\t\tcreatedAt: entry.timestamp,\n\t\t\t\t\t\tdata: entry,\n\t\t\t\t\t} satisfies ActivityItem<ActivityLogEntry<TUser, TMeta, TResource>>;\n\t\t\t\t}\n\t\t\t\treturn mapEventToActivity(\n\t\t\t\t\tentry as ActivityLogActivityEntry<TResource>,\n\t\t\t\t\tresources,\n\t\t\t\t) as ActivityItem<ActivityLogEntry<TUser, TMeta, TResource>>;\n\t\t\t}),\n\t\t[resources, sorted],\n\t);\n\n\tconst eventRowClassNames = useMemo<\n\t\tActivityRowClassNames<ActivityLogEntry<TUser, TMeta, TResource>>\n\t>(\n\t\t() => ({\n\t\t\trow: (activity) => resolveEventClassName(classNames?.eventRow, activity.data),\n\t\t\tmarker: (activity) => resolveEventClassName(classNames?.eventMarker, activity.data),\n\t\t\tcontent: (activity) => resolveEventClassName(classNames?.eventContent, activity.data),\n\t\t\tdetails: (activity) => resolveEventClassName(classNames?.eventDetails, activity.data),\n\t\t}),\n\t\t[classNames],\n\t);\n\n\tconst composerBlock = composer?.enabled ? (\n\t\t<div className=\"activity-log--composer\">\n\t\t\t<CommentComposer<TResource>\n\t\t\t\tcontext={composer.context}\n\t\t\t\tcanComment\n\t\t\t\tsubmitting={composerState.isSubmitting}\n\t\t\t\terrors={composerState.formErrors}\n\t\t\t\tresetKey={composerState.resetKey}\n\t\t\t\tonSubmit={composerState.submit}\n\t\t\t\tresources={resources}\n\t\t\t\tonResourceSearch={onResourceSearch}\n\t\t\t\tstrings={strings}\n\t\t\t\tplaceholder={composer.placeholder}\n\t\t\t\tautoFocus={composer.autoFocus}\n\t\t\t\tinlineSubmit={composer.inlineSubmit ?? false}\n\t\t\t/>\n\t\t</div>\n\t) : null;\n\tconst composerPosition = composer?.position ?? 'top';\n\n\tconst actionsForActivity = (\n\t\tactivity: ActivityItem<ActivityLogEntry<TUser, TMeta, TResource>>,\n\t): readonly ActivityAction<ActivityLogEntry<TUser, TMeta, TResource>>[] => {\n\t\tconst entry = activity.data;\n\t\tif (!entry || entry.kind === 'comment') return [];\n\t\tconst eventEntry = entry as ActivityLogActivityEntry<TResource>;\n\t\treturn (eventEntry.actions ?? []).map((action) => ({\n\t\t\tid: action.id,\n\t\t\tlabel: action.label,\n\t\t\ticon: action.icon,\n\t\t\thref: action.href,\n\t\t\tdisabled: action.disabled,\n\t\t\ttone: action.tone,\n\t\t\tpresentation: action.presentation,\n\t\t\tonClick: () => action.onSelect?.(eventEntry),\n\t\t}));\n\t};\n\n\tconst slots: ActivityFeedSlots<ActivityLogEntry<TUser, TMeta, TResource>> = {\n\t\theader: composerPosition === 'top' ? composerBlock : undefined,\n\t\tfooter: composerPosition === 'bottom' ? composerBlock : undefined,\n\t\trenderRow: (activity, ctx) => {\n\t\t\tconst entry = activity.data;\n\t\t\tif (!entry) return undefined;\n\t\t\tconst custom = renderers?.[entry.kind] as\n\t\t\t\t| ActivityLogRenderer<TUser, TMeta, TResource>\n\t\t\t\t| undefined;\n\t\t\tif (custom) {\n\t\t\t\treturn custom(entry, {\n\t\t\t\t\tresources,\n\t\t\t\t\taccessors: {\n\t\t\t\t\t\tgetMediaUrl,\n\t\t\t\t\t\tgetMediaName,\n\t\t\t\t\t\tgetStatusLabel,\n\t\t\t\t\t\tformatRelativeTime: formatRelative,\n\t\t\t\t\t},\n\t\t\t\t\tstrings,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (entry.kind !== 'comment') return undefined;\n\t\t\tconst commentEntry = entry as Extract<\n\t\t\t\tActivityLogEntry<TUser, TMeta, TResource>,\n\t\t\t\t{ kind: 'comment' }\n\t\t\t>;\n\t\t\treturn (\n\t\t\t\t<Stack\n\t\t\t\t\tdirection=\"horizontal\"\n\t\t\t\t\tgap=\"md\"\n\t\t\t\t\talign=\"stretch\"\n\t\t\t\t\twrap={false}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'activity-log--comment-row relative py-space-xs',\n\t\t\t\t\t\t!ctx.isLast && (\n\t\t\t\t\t\t\tctx.itemSpacing === 'compact'\n\t\t\t\t\t\t\t\t? 'pb-space-sm'\n\t\t\t\t\t\t\t\t: ctx.itemSpacing === 'relaxed'\n\t\t\t\t\t\t\t\t\t? 'pb-space-xl'\n\t\t\t\t\t\t\t\t\t: 'pb-space-md'\n\t\t\t\t\t\t),\n\t\t\t\t\t)}\n\t\t\t\t\tdata-event-id={commentEntry.id}\n\t\t\t\t>\n\t\t\t\t\t<ActivityMarker\n\t\t\t\t\t\ticon={MessageCircle}\n\t\t\t\t\t\ttone=\"neutral\"\n\t\t\t\t\t\tdensity={ctx.density}\n\t\t\t\t\t\tlast={ctx.isLast}\n\t\t\t\t\t/>\n\t\t\t\t\t<div className=\"activity-log--comment min-w-0 flex-1\">\n\t\t\t\t\t\t<CommentItem<TUser, TMeta, TResource>\n\t\t\t\t\t\t\tcomment={commentEntry.comment}\n\t\t\t\t\t\t\tcanModerate={canModerate}\n\t\t\t\t\t\t\tonDelete={onCommentDelete}\n\t\t\t\t\t\t\tonPinToggle={onCommentPinToggle}\n\t\t\t\t\t\t\tonReact={onCommentReact}\n\t\t\t\t\t\t\tonReply={onCommentReply}\n\t\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t\t\tresources={resources}\n\t\t\t\t\t\t\tgetMediaUrl={getMediaUrl}\n\t\t\t\t\t\t\tgetMediaName={getMediaName}\n\t\t\t\t\t\t\tgetStatusLabel={getStatusLabel}\n\t\t\t\t\t\t\tformatRelativeTime={formatRelative}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</Stack>\n\t\t\t);\n\t\t},\n\t\trenderDetails: (activity, ctx) => {\n\t\t\tconst entry = activity.data;\n\t\t\tif (!entry || entry.kind === 'comment') return null;\n\t\t\treturn renderEventDetails?.(\n\t\t\t\tentry as ActivityLogActivityEntry<TResource>,\n\t\t\t\t{\n\t\t\t\t\texpanded: ctx.expanded,\n\t\t\t\t\tsetExpanded: ctx.setExpanded,\n\t\t\t\t\trelativeTime: ctx.relativeTime,\n\t\t\t\t\tisLast: ctx.isLast,\n\t\t\t\t\tresources,\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t};\n\n\tconst inner = (\n\t\t<ActivityFeed<ActivityLogEntry<TUser, TMeta, TResource>>\n\t\t\tactivities={activities}\n\t\t\tdensity=\"rich\"\n\t\t\titemSpacing={itemSpacing}\n\t\t\tgroupByDate\n\t\t\tresources={{}}\n\t\t\tstrings={activityStringsProp}\n\t\t\tdetailsCollapsible={eventDetailsCollapsible}\n\t\t\tdefaultExpandedIds={defaultExpandedIds}\n\t\t\texpandedIds={expandedIds}\n\t\t\tonExpandedIdsChange={onExpandedIdsChange}\n\t\t\tformatRelativeTime={formatRelative}\n\t\t\tgetSourceLabel={(source) => activityStrings.sources[source] ?? source}\n\t\t\tactionsForActivity={actionsForActivity}\n\t\t\trowClassNames={eventRowClassNames}\n\t\t\tonAction={(actionId, activity) => {\n\t\t\t\tconst entry = activity.data;\n\t\t\t\tif (entry && entry.kind !== 'comment') {\n\t\t\t\t\tonEventAction?.(actionId, entry as ActivityLogActivityEntry<TResource>);\n\t\t\t\t}\n\t\t\t}}\n\t\t\tonActivityExpandedChange={(activity, expanded) => {\n\t\t\t\tconst entry = activity.data;\n\t\t\t\tif (entry && entry.kind !== 'comment') {\n\t\t\t\t\tonEventExpandedChange?.(\n\t\t\t\t\t\tentry as ActivityLogActivityEntry<TResource>,\n\t\t\t\t\t\texpanded,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}}\n\t\t\tslots={slots}\n\t\t\tclassName={cn(\n\t\t\t\t'activity-log--component',\n\t\t\t\tclassNames?.list,\n\t\t\t\tbare && className,\n\t\t\t)}\n\t\t/>\n\t);\n\n\tif (bare) {\n\t\treturn inner;\n\t}\n\n\tconst label = title ?? activityStrings.title;\n\tconst ariaLabel = typeof label === 'string' ? label : undefined;\n\n\treturn (\n\t\t<Stack\n\t\t\trender={<section />}\n\t\t\tgap=\"lg\"\n\t\t\tdata-component=\"activity-log\"\n\t\t\tdata-slot=\"activity-log\"\n\t\t\tclassName={cn('activity-log--component', className)}\n\t\t\taria-label={ariaLabel}\n\t\t>\n\t\t\t{!!label && (\n\t\t\t\t<Text weight=\"semibold\">\n\t\t\t\t\t{label}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t\t{inner}\n\t\t</Stack>\n\t);\n}\n\nActivityLog.displayName = 'ActivityLog';\n","/**\n * ActivityEventAdapter — map raw event-like records into ActivityLog entries.\n *\n * This is intentionally pure and framework-agnostic. Consumers pass accessors\n * for their domain shape; the package returns the canonical ActivityLogEntry\n * shape used by the timeline.\n */\nimport type {\n\tActivityActor,\n\tActivityChange,\n\tActivityLogActivityEntry,\n\tActivityLogCommentEntry,\n\tActivityLogEntry,\n\tActivityLogEventAction,\n\tActivityTone,\n} from './activities.types';\nimport type { CommentData, CommentUser } from '../comments';\nimport type { Mention } from '../mentions';\nimport type { ReactNode } from 'react';\n\nexport interface ActivityEventAdapterAccessors<\n\tTRaw,\n\tTUser extends CommentUser = CommentUser,\n\tTMeta = unknown,\n\tTResource extends string = string,\n> {\n\tid: (record: TRaw) => string;\n\ttimestamp: (record: TRaw) => string;\n\tkind?: (record: TRaw) => ActivityLogEntry<TUser, TMeta, TResource>['kind'];\n\tevent?: (record: TRaw) => string | undefined;\n\tactor?: (record: TRaw) => string | ActivityActor | undefined;\n\ttitle?: (record: TRaw) => ReactNode;\n\taction?: (record: TRaw) => string | undefined;\n\ttarget?: (record: TRaw) => ReactNode;\n\tdescription?: (record: TRaw) => ReactNode;\n\tdescriptionHtml?: (record: TRaw) => string | undefined;\n\tmentions?: (record: TRaw) => ReadonlyArray<Mention<TResource>> | undefined;\n\tsource?: (record: TRaw) => ReactNode;\n\tstatus?: (record: TRaw) => ReactNode;\n\ttone?: (record: TRaw) => ActivityTone | undefined;\n\tmetadata?: (record: TRaw) => ReadonlyArray<{ label: string; value: ReactNode }> | undefined;\n\tchanges?: (record: TRaw) => readonly ActivityChange[] | undefined;\n\tdetails?: (record: TRaw) => ReactNode;\n\trowActions?: (record: TRaw) => ReadonlyArray<ActivityLogEventAction<TResource>> | undefined;\n\tcomment?: (record: TRaw) => CommentData<TUser, TMeta, TResource> | undefined;\n\tdata?: (record: TRaw) => unknown;\n}\n\nfunction defaultKind<TRaw>(record: TRaw) {\n\tif (typeof record === 'object' && record !== null && 'kind' in record) {\n\t\tconst kind = (record as { kind?: unknown }).kind;\n\t\tif (typeof kind === 'string') return kind;\n\t}\n\treturn 'event';\n}\n\nexport function toActivityLogEntry<\n\tTRaw,\n\tTUser extends CommentUser = CommentUser,\n\tTMeta = unknown,\n\tTResource extends string = string,\n>(\n\trecord: TRaw,\n\taccessors: ActivityEventAdapterAccessors<TRaw, TUser, TMeta, TResource>,\n): ActivityLogEntry<TUser, TMeta, TResource> {\n\tconst kind = accessors.kind?.(record) ?? defaultKind(record);\n\tconst id = accessors.id(record);\n\tconst timestamp = accessors.timestamp(record);\n\tconst comment = accessors.comment?.(record);\n\n\tif (kind === 'comment' && comment) {\n\t\treturn {\n\t\t\tid,\n\t\t\tkind: 'comment',\n\t\t\ttimestamp,\n\t\t\tcomment,\n\t\t} satisfies ActivityLogCommentEntry<TUser, TMeta, TResource>;\n\t}\n\n\treturn {\n\t\tid,\n\t\tkind: typeof kind === 'string' ? kind : 'event',\n\t\ttimestamp,\n\t\tevent: accessors.event?.(record),\n\t\tactor: accessors.actor?.(record),\n\t\taction: accessors.action?.(record),\n\t\ttarget: accessors.target?.(record) ?? accessors.status?.(record),\n\t\tlabel: accessors.source?.(record),\n\t\theadline: accessors.title?.(record),\n\t\tdescription: accessors.description?.(record),\n\t\tdescriptionHtml: accessors.descriptionHtml?.(record),\n\t\tmentions: accessors.mentions?.(record),\n\t\ttone: accessors.tone?.(record),\n\t\tmetadata: accessors.metadata?.(record),\n\t\tchanges: accessors.changes?.(record),\n\t\tdetails: accessors.details?.(record),\n\t\tactions: accessors.rowActions?.(record),\n\t\tdata: accessors.data?.(record) ?? record,\n\t} satisfies ActivityLogActivityEntry<TResource>;\n}\n\nexport function createActivityEventAdapter<\n\tTRaw,\n\tTUser extends CommentUser = CommentUser,\n\tTMeta = unknown,\n\tTResource extends string = string,\n>(\n\taccessors: ActivityEventAdapterAccessors<TRaw, TUser, TMeta, TResource>,\n) {\n\treturn (record: TRaw) =>\n\t\ttoActivityLogEntry<TRaw, TUser, TMeta, TResource>(record, accessors);\n}\n"],"mappings":"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"}
|