themelia-react-ui 1.0.0 → 1.0.2
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 +190 -1
- package/README.md +92 -13
- package/dist/{accordion-BRWh3BM1.js → accordion-BRTcsp8J.js} +8 -8
- package/dist/accordion-BRTcsp8J.js.map +1 -0
- package/dist/{action-menu-Cx3SdfbN.js → action-menu-Drxw_vJk.js} +36 -36
- package/dist/action-menu-Drxw_vJk.js.map +1 -0
- package/dist/affordance-geometry.generated-CL84ZN9A.js +63 -0
- package/dist/affordance-geometry.generated-CL84ZN9A.js.map +1 -0
- package/dist/{ai-artifact-DkOArd3-.js → ai-artifact-DLVdK0Py.js} +151 -155
- package/dist/ai-artifact-DLVdK0Py.js.map +1 -0
- package/dist/{app-shell-BH_bGcE2.js → app-shell-C_fKpljx.js} +11 -10
- package/dist/app-shell-C_fKpljx.js.map +1 -0
- package/dist/{attachment-DsLgNHXt.js → attachment-DbjUWsP0.js} +12 -12
- package/dist/{attachment-DsLgNHXt.js.map → attachment-DbjUWsP0.js.map} +1 -1
- package/dist/auth-CAQcasMV.js +723 -0
- package/dist/auth-CAQcasMV.js.map +1 -0
- package/dist/{avatar-CsnWaYmt.js → avatar-Bu2HhitA.js} +76 -71
- package/dist/avatar-Bu2HhitA.js.map +1 -0
- package/dist/{badge-BZXZT9wd.js → badge-CzId1Wlm.js} +4 -4
- package/dist/{badge-BZXZT9wd.js.map → badge-CzId1Wlm.js.map} +1 -1
- package/dist/base/accordion.js +1 -1
- package/dist/base/action-menu.js +1 -1
- package/dist/base/attachment.js +1 -1
- package/dist/base/avatar.js +1 -1
- package/dist/base/badge.js +1 -1
- package/dist/base/buttons.js +3 -2
- package/dist/base/cards.js +3 -3
- package/dist/base/carousel.js +25 -27
- package/dist/base/carousel.js.map +1 -1
- package/dist/base/cascader.js +150 -148
- package/dist/base/cascader.js.map +1 -1
- package/dist/base/chart.js +1 -1
- package/dist/base/choice-inputs.js +3 -2
- package/dist/base/code-block.js +1 -1
- package/dist/base/combobox.js +1 -1
- package/dist/base/command.js +1 -1
- package/dist/base/copyable.js +1 -1
- package/dist/base/date-pickers.js +3 -3
- package/dist/base/display.js +7 -7
- package/dist/base/feedback.js +4 -3
- package/dist/base/forms-numeric.js +1 -1
- package/dist/base/forms.js +2 -2
- package/dist/base/inline-edit.js +233 -0
- package/dist/base/inline-edit.js.map +1 -0
- package/dist/base/item.js +1 -1
- package/dist/base/media-gallery.js +1 -1
- package/dist/base/navigation.js +6 -6
- package/dist/base/popover-menu.js +1 -1
- package/dist/base/popover.js +1 -1
- package/dist/base/qr-code.js +1 -1
- package/dist/base/repeaters.js +33 -33
- 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 +83 -81
- 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 +6 -6
- package/dist/base/toaster.js.map +1 -1
- package/dist/base/tree.js +1 -1
- package/dist/base/upload-queue.js +1 -1
- package/dist/base/upload.js +3 -3
- package/dist/base/value-inputs.js +1 -1
- package/dist/blocks/admin.js +134 -134
- package/dist/blocks/admin.js.map +1 -1
- package/dist/blocks/ai.js +120 -117
- package/dist/blocks/ai.js.map +1 -1
- package/dist/blocks/analytics/usage-card.js +3 -0
- package/dist/blocks/analytics.js +530 -491
- package/dist/blocks/analytics.js.map +1 -1
- package/dist/blocks/collaboration.js +2 -2
- package/dist/blocks/commerce/receipt.js +1 -1
- package/dist/blocks/commerce.js +395 -383
- package/dist/blocks/commerce.js.map +1 -1
- package/dist/blocks/data-display.js +1 -1
- package/dist/blocks/onboarding.js +6 -6
- package/dist/blocks/onboarding.js.map +1 -1
- package/dist/blocks/planning.js +311 -0
- package/dist/blocks/planning.js.map +1 -0
- package/dist/blocks/timelines.js +1 -1
- package/dist/{breadcrumbs-DdQ_I5ra.js → breadcrumbs-BuYz5SDU.js} +9 -8
- package/dist/breadcrumbs-BuYz5SDU.js.map +1 -0
- package/dist/button-BZDasD04.js +651 -0
- package/dist/button-BZDasD04.js.map +1 -0
- package/dist/{button-BS6l5JUw.js → button-BZyfTvwm.js} +3 -3
- package/dist/button-BZyfTvwm.js.map +1 -0
- package/dist/buttons-D_6KJvEE.js +99 -0
- package/dist/buttons-D_6KJvEE.js.map +1 -0
- package/dist/{cards-BMB0laLG.js → cards-qGSErLw_.js} +12 -12
- package/dist/{cards-BMB0laLG.js.map → cards-qGSErLw_.js.map} +1 -1
- package/dist/chart-Bsc5BICK.js +150 -0
- package/dist/chart-Bsc5BICK.js.map +1 -0
- package/dist/checkbox-BQNDjUCh.js +34 -0
- package/dist/checkbox-BQNDjUCh.js.map +1 -0
- package/dist/choice-inputs-Mk3iWbhr.js +725 -0
- package/dist/choice-inputs-Mk3iWbhr.js.map +1 -0
- package/dist/{code-block-DIlqzoiD.js → code-block-DzHKRybS.js} +23 -23
- package/dist/code-block-DzHKRybS.js.map +1 -0
- package/dist/{collapsible-DsnktFNv.js → collapsible-ClvC7Bj3.js} +3 -3
- package/dist/{collapsible-DsnktFNv.js.map → collapsible-ClvC7Bj3.js.map} +1 -1
- package/dist/{collection-content-C4fthJV_.js → collection-content-D6S8cv_n.js} +3 -3
- package/dist/{collection-content-C4fthJV_.js.map → collection-content-D6S8cv_n.js.map} +1 -1
- package/dist/{combobox-HDftpzxt.js → combobox-BFnbJJp3.js} +18 -18
- package/dist/combobox-BFnbJJp3.js.map +1 -0
- package/dist/{combobox-CHD750do.js → combobox-hozNwUcc.js} +313 -316
- package/dist/combobox-hozNwUcc.js.map +1 -0
- package/dist/{command-D0kWBZfd.js → command-BnmSchli.js} +9 -9
- package/dist/command-BnmSchli.js.map +1 -0
- package/dist/comments-u5L0OGip.js +1156 -0
- package/dist/comments-u5L0OGip.js.map +1 -0
- package/dist/components/base/buttons/button-group.recipes.d.ts +1 -1
- package/dist/components/base/buttons/button.recipes.d.ts +10 -19
- package/dist/components/base/buttons/use-pending-button-focus.d.ts +3 -0
- package/dist/components/base/cards/card.recipes.d.ts +13 -5
- package/dist/components/base/cards/partials/card-primitives.d.ts +9 -4
- package/dist/components/base/cards/smart-card.types.d.ts +3 -1
- package/dist/components/base/date-pickers/date-picker.recipes.d.ts +5 -18
- package/dist/components/base/date-pickers/datepicker.types.d.ts +3 -0
- package/dist/components/base/forms/form-field.d.ts +1 -0
- package/dist/components/base/forms/form-sizing.d.ts +3 -3
- package/dist/components/base/inline-edit/index.d.ts +2 -0
- package/dist/components/base/inline-edit/inline-edit.d.ts +81 -0
- package/dist/components/base/inline-edit/inline-edit.recipes.d.ts +6 -0
- package/dist/components/base/navigation/tabs.d.ts +3 -5
- package/dist/components/base/popover/popover.recipes.d.ts +3 -3
- package/dist/components/base/structure/structure.recipes.d.ts +6 -0
- package/dist/components/base/table/index.d.ts +1 -1
- package/dist/components/base/text-inputs/clear-native-field.d.ts +2 -0
- package/dist/components/base/text-inputs/input-trailing-action.d.ts +3 -0
- package/dist/components/blocks/analytics/index.d.ts +1 -0
- package/dist/components/blocks/analytics/types.d.ts +1 -1
- package/dist/components/blocks/analytics/usage-card/index.d.ts +3 -0
- package/dist/components/blocks/analytics/usage-card/types.d.ts +52 -0
- package/dist/components/blocks/analytics/usage-card/usage-card.d.ts +6 -0
- package/dist/components/blocks/analytics/usage-card/usage-card.data.d.ts +19 -0
- package/dist/components/blocks/analytics/usage-card/usage-card.strings.d.ts +22 -0
- package/dist/components/blocks/collaboration/message/message.recipes.d.ts +12 -0
- package/dist/components/blocks/data-display/empty-state/partials/illustrations/document-stack.d.ts +1 -4
- package/dist/components/blocks/data-display/empty-state/partials/illustrations/inbox-clean.d.ts +1 -4
- package/dist/components/blocks/data-display/empty-state/partials/illustrations/index.d.ts +3 -3
- package/dist/components/blocks/data-display/empty-state/partials/illustrations/stacked-cards.d.ts +1 -6
- package/dist/components/blocks/planning/index.d.ts +3 -0
- package/dist/components/blocks/planning/task-card.d.ts +3 -0
- package/dist/components/blocks/planning/task-card.strings.d.ts +15 -0
- package/dist/components/blocks/planning/task-card.types.d.ts +66 -0
- package/dist/components/features/combobox/components/error-message.d.ts +1 -1
- package/dist/components/features/comments/hooks/use-attachment-upload.d.ts +5 -0
- package/dist/components/features/filters/facets/search-facet.d.ts +0 -12
- package/dist/components/features/filters/facets/tags-facet.d.ts +1 -1
- package/dist/components/features/media-library/media-library.d.ts +1 -1
- package/dist/components/features/media-library/media-library.types.d.ts +9 -1
- package/dist/components/features/media-library/partials/media-library-partials.d.ts +1 -1
- package/dist/components/features/overlays/hooks/use-pending-overlay-focus.d.ts +2 -0
- package/dist/components/features/overlays/overlays.types.d.ts +5 -4
- package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +2 -1
- package/dist/components/features/table/data-table.d.ts +1 -1
- package/dist/components/features/table/table.types.d.ts +1 -1
- package/dist/components/features/theme-tweaker/theme-provider-settings.d.ts +3 -1
- package/dist/components/layout/auth/auth.types.d.ts +1 -0
- package/dist/components/layout/page/page.d.ts +0 -1
- package/dist/components/layout/page/page.types.d.ts +9 -3
- package/dist/components/layout/sidebar/sidebar.context.d.ts +1 -1
- package/dist/components/layout/sidebar/sidebar.types.d.ts +4 -0
- package/dist/components/layout/workspace/workspace.types.d.ts +3 -0
- package/dist/components/typography/heading.d.ts +5 -2
- package/dist/components/typography/index.d.ts +1 -1
- package/dist/components/typography/text.styles.d.ts +10 -0
- package/dist/components/ui/popover.d.ts +1 -1
- package/dist/components/ui/sidebar.d.ts +1 -1
- package/dist/components/ui/table.d.ts +2 -1
- package/dist/container.recipes-D9t8MHR3.js +27 -0
- package/dist/container.recipes-D9t8MHR3.js.map +1 -0
- package/dist/{containers-CPNyNo1_.js → containers-DqB-bSYE.js} +34 -56
- package/dist/containers-DqB-bSYE.js.map +1 -0
- package/dist/control-group-recipes-DBXmfh2E.js +21 -0
- package/dist/control-group-recipes-DBXmfh2E.js.map +1 -0
- package/dist/{copyable-B7SBXJMr.js → copyable-BTSByfmq.js} +6 -6
- package/dist/{copyable-B7SBXJMr.js.map → copyable-BTSByfmq.js.map} +1 -1
- package/dist/{data-display-b3d1TfL4.js → data-display-Bihs9Ven.js} +542 -329
- package/dist/data-display-Bihs9Ven.js.map +1 -0
- package/dist/{date-BFNMnrS5.js → date-DOKhJPu7.js} +4 -4
- package/dist/{date-BFNMnrS5.js.map → date-DOKhJPu7.js.map} +1 -1
- package/dist/{date-picker-DI6kPNof.js → date-picker-DzP5HQq7.js} +492 -472
- package/dist/date-picker-DzP5HQq7.js.map +1 -0
- package/dist/date-pickers-BpgGz7S-.js +196 -0
- package/dist/date-pickers-BpgGz7S-.js.map +1 -0
- package/dist/{display-ByI5tkqy.js → display-CS6Hbk18.js} +8 -8
- package/dist/{display-ByI5tkqy.js.map → display-CS6Hbk18.js.map} +1 -1
- package/dist/{dropdown-menu-BlnyHr-9.js → dropdown-menu-D-boNgGO.js} +7 -7
- package/dist/{dropdown-menu-BlnyHr-9.js.map → dropdown-menu-D-boNgGO.js.map} +1 -1
- package/dist/features/activities.js +152 -141
- package/dist/features/activities.js.map +1 -1
- package/dist/features/ai-chat.js +182 -179
- package/dist/features/ai-chat.js.map +1 -1
- package/dist/features/async-preview.js +9 -9
- 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 +25 -23
- package/dist/features/data-view.js.map +1 -1
- package/dist/features/email-composer/engine.js +1 -1
- package/dist/features/email-composer.js +103 -104
- package/dist/features/email-composer.js.map +1 -1
- package/dist/features/event-calendar.js +375 -373
- package/dist/features/event-calendar.js.map +1 -1
- package/dist/features/filters.js +1 -1
- package/dist/features/global-search.js +222 -224
- package/dist/features/global-search.js.map +1 -1
- package/dist/features/kanban.js +29 -29
- package/dist/features/kanban.js.map +1 -1
- package/dist/features/map.js +59 -58
- package/dist/features/map.js.map +1 -1
- package/dist/features/media-library.js +856 -855
- 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 +1210 -1209
- package/dist/features/products.js.map +1 -1
- package/dist/features/questionnaire.js +133 -132
- package/dist/features/questionnaire.js.map +1 -1
- package/dist/features/resource-assignment.js +29 -31
- package/dist/features/resource-assignment.js.map +1 -1
- package/dist/features/resource.js +13 -13
- package/dist/features/resource.js.map +1 -1
- package/dist/features/rich-text-editor.js +2 -2
- package/dist/features/schema-form.js +82 -82
- package/dist/features/schema-form.js.map +1 -1
- package/dist/features/suggestions.js +3 -3
- package/dist/features/sync.js +4 -4
- package/dist/features/sync.js.map +1 -1
- package/dist/features/table.js +1 -1
- package/dist/features/theme-tweaker.js +456 -450
- package/dist/features/theme-tweaker.js.map +1 -1
- package/dist/feedback-CJkUAapr.js +233 -0
- package/dist/feedback-CJkUAapr.js.map +1 -0
- package/dist/field-affordance-recipes-uKY4MsZ_.js +25 -0
- package/dist/field-affordance-recipes-uKY4MsZ_.js.map +1 -0
- package/dist/{field-state-recipes-CBTRt9Bt.js → field-state-recipes-DQQpiLWC.js} +3 -3
- package/dist/field-state-recipes-DQQpiLWC.js.map +1 -0
- package/dist/{filters-qtrcv1hf.js → filters-D6FF8L6s.js} +715 -720
- package/dist/filters-D6FF8L6s.js.map +1 -0
- package/dist/{form-field-C6W-y2hR.js → form-field-CZwrkP7m.js} +17 -9
- package/dist/form-field-CZwrkP7m.js.map +1 -0
- package/dist/{form-sizing-39NohSqn.js → form-sizing-QP8aIRaW.js} +10 -6
- package/dist/form-sizing-QP8aIRaW.js.map +1 -0
- package/dist/{forms-BF-HSbff.js → forms-B5NCbkSC.js} +35 -35
- package/dist/{forms-BF-HSbff.js.map → forms-B5NCbkSC.js.map} +1 -1
- package/dist/forms-numeric-Crrm80Lm.js +867 -0
- package/dist/forms-numeric-Crrm80Lm.js.map +1 -0
- package/dist/{header-B8ex54cY.js → header-kxruN3RM.js} +53 -49
- package/dist/header-kxruN3RM.js.map +1 -0
- package/dist/{hooks-D6UBVzf2.js → hooks-BrlnCwQd.js} +2 -2
- package/dist/{hooks-D6UBVzf2.js.map → hooks-BrlnCwQd.js.map} +1 -1
- package/dist/{http-CLTVJc5I.js → http-CdEIHyQf.js} +2 -2
- package/dist/http-CdEIHyQf.js.map +1 -0
- package/dist/{icon-badge-Dv0RYQwj.js → icon-badge-Btc6pQrp.js} +4 -4
- package/dist/{icon-badge-Dv0RYQwj.js.map → icon-badge-Btc6pQrp.js.map} +1 -1
- package/dist/index.js +2 -2
- package/dist/input-SX9V0AL3.js +255 -0
- package/dist/input-SX9V0AL3.js.map +1 -0
- package/dist/input-vxcaNCYC.js +20 -0
- package/dist/input-vxcaNCYC.js.map +1 -0
- package/dist/{item-pJ0GsOiJ.js → item-DE4YnuJx.js} +18 -17
- package/dist/item-DE4YnuJx.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 +44 -4
- package/dist/lib/control-group-recipes.d.ts +22 -0
- package/dist/lib/field-affordance-recipes.d.ts +35 -2
- package/dist/lib/field-state-recipes.d.ts +2 -2
- package/dist/lib/navigation-row-recipes.d.ts +3 -2
- package/dist/lib/overlay-anatomy-recipes.d.ts +1 -1
- package/dist/lib/surface-recipes.d.ts +5 -2
- package/dist/lib/token-merge.generated.d.ts +144 -2
- package/dist/lib/ui-provider/types.d.ts +4 -2
- package/dist/lib/use-prefers-reduced-motion.d.ts +2 -0
- package/dist/lib/utils.js +1 -1
- package/dist/{media-gallery-Ca4YmvBi.js → media-gallery-DLp3HAz0.js} +75 -74
- package/dist/media-gallery-DLp3HAz0.js.map +1 -0
- package/dist/{mentions-CRio8mTm.js → mentions-Cl0Kt_Pd.js} +52 -50
- package/dist/{mentions-CRio8mTm.js.map → mentions-Cl0Kt_Pd.js.map} +1 -1
- package/dist/message-SZUNB1eX.js +127 -0
- package/dist/message-SZUNB1eX.js.map +1 -0
- package/dist/{navigation-BTrEb5u4.js → navigation-DnQSNMT0.js} +64 -55
- package/dist/navigation-DnQSNMT0.js.map +1 -0
- package/dist/{navigation-DqEITuD2.js → navigation-DyytsLRB.js} +37 -37
- package/dist/navigation-DyytsLRB.js.map +1 -0
- package/dist/{navigation-row-recipes-BFpvGPGE.js → navigation-row-recipes-DQEXQcqY.js} +3 -3
- package/dist/navigation-row-recipes-DQEXQcqY.js.map +1 -0
- package/dist/{number-BNT_BIzJ.js → number-DasMFWEG.js} +4 -4
- package/dist/{number-BNT_BIzJ.js.map → number-DasMFWEG.js.map} +1 -1
- package/dist/overlays-DUbs1KEi.js +1011 -0
- package/dist/overlays-DUbs1KEi.js.map +1 -0
- package/dist/{page-BMBGjJY8.js → page-hGmT4nWK.js} +75 -64
- package/dist/page-hGmT4nWK.js.map +1 -0
- package/dist/{page-header-BH41wCyY.js → page-header-D8nERkn5.js} +9 -9
- package/dist/page-header-D8nERkn5.js.map +1 -0
- package/dist/{pagination-C29vvt3I.js → pagination-NLGqRirf.js} +20 -20
- package/dist/pagination-NLGqRirf.js.map +1 -0
- package/dist/{popover-TInGXsjg.js → popover-CghIYdQf.js} +23 -22
- package/dist/popover-CghIYdQf.js.map +1 -0
- package/dist/{popover-menu-BzqXqE72.js → popover-menu-B4PoWhRl.js} +6 -6
- package/dist/{popover-menu-BzqXqE72.js.map → popover-menu-B4PoWhRl.js.map} +1 -1
- package/dist/{popover.recipes-zgBhMlUu.js → popover.recipes-QlD4JenO.js} +5 -5
- package/dist/popover.recipes-QlD4JenO.js.map +1 -0
- package/dist/{primitives-DKPOGVpj.js → primitives-C7ff0QaI.js} +120 -113
- package/dist/primitives-C7ff0QaI.js.map +1 -0
- package/dist/primitives.js +3 -3
- package/dist/progress-BroqrAyV.js +169 -0
- package/dist/progress-BroqrAyV.js.map +1 -0
- package/dist/{receipt-DYWTQGEc.js → receipt-BuJynLgf.js} +8 -8
- package/dist/{receipt-DYWTQGEc.js.map → receipt-BuJynLgf.js.map} +1 -1
- package/dist/{rich-text-B7sBAdDG.js → rich-text-DlxDOtf4.js} +4 -4
- package/dist/{rich-text-B7sBAdDG.js.map → rich-text-DlxDOtf4.js.map} +1 -1
- package/dist/rich-text-editor-BKyG7rWz.js +574 -0
- package/dist/rich-text-editor-BKyG7rWz.js.map +1 -0
- package/dist/{rich-text-editor.recipes-DxvOE0Lp.js → rich-text-editor.recipes-B72Nfuze.js} +35 -26
- package/dist/rich-text-editor.recipes-B72Nfuze.js.map +1 -0
- package/dist/{scroll-area-BheMQ270.js → scroll-area-D-pIhEKl.js} +3 -3
- package/dist/scroll-area-D-pIhEKl.js.map +1 -0
- package/dist/{separator-Gk_WXH-l.js → separator-BNIgG3au.js} +3 -3
- package/dist/{separator-Gk_WXH-l.js.map → separator-BNIgG3au.js.map} +1 -1
- package/dist/{separator-DO0EbCEm.js → separator-BhtFyo4x.js} +2 -2
- package/dist/{separator-DO0EbCEm.js.map → separator-BhtFyo4x.js.map} +1 -1
- package/dist/services/actions.js +1 -1
- package/dist/{settings-D9f_wdIC.js → settings-DOTOzeZ2.js} +10 -9
- package/dist/{settings-D9f_wdIC.js.map → settings-DOTOzeZ2.js.map} +1 -1
- package/dist/{sheet-vOUloJ4O.js → sheet-BFhrNehm.js} +11 -11
- package/dist/sheet-BFhrNehm.js.map +1 -0
- package/dist/{sidebar-CNBKFDRW.js → sidebar-CyR4XKwR.js} +219 -200
- package/dist/sidebar-CyR4XKwR.js.map +1 -0
- package/dist/{sidebar-C3UKkbC5.js → sidebar-SvGJ0Zwi.js} +63 -58
- package/dist/sidebar-SvGJ0Zwi.js.map +1 -0
- package/dist/{skeleton-BvRhK8y-.js → skeleton-3F0uhYn3.js} +4 -4
- package/dist/{skeleton-BvRhK8y-.js.map → skeleton-3F0uhYn3.js.map} +1 -1
- package/dist/{smart-card-B5FcKODh.js → smart-card-DjGVV2xr.js} +206 -199
- package/dist/smart-card-DjGVV2xr.js.map +1 -0
- package/dist/{spinner-JtlFJ7Nc.js → spinner-Cpf7oRkF.js} +5 -5
- package/dist/{spinner-JtlFJ7Nc.js.map → spinner-Cpf7oRkF.js.map} +1 -1
- package/dist/{structure-BvW4vG4H.js → structure-CRdqVawd.js} +14 -14
- package/dist/{structure-BvW4vG4H.js.map → structure-CRdqVawd.js.map} +1 -1
- package/dist/{structure.recipes-DjqnBpwz.js → structure.recipes-Bqhf9oIh.js} +2 -2
- package/dist/structure.recipes-Bqhf9oIh.js.map +1 -0
- package/dist/style.css +1 -1
- package/dist/{surface-recipes-CQfRr-VL.js → surface-recipes-Dd__PD-w.js} +4 -3
- package/dist/surface-recipes-Dd__PD-w.js.map +1 -0
- package/dist/{table-DnlAJ-xR.js → table-CLtJTxoR.js} +17 -16
- package/dist/table-CLtJTxoR.js.map +1 -0
- package/dist/table-CcRDZiLP.js +1444 -0
- package/dist/table-CcRDZiLP.js.map +1 -0
- package/dist/tabs-BNgu7g0u.js +188 -0
- package/dist/tabs-BNgu7g0u.js.map +1 -0
- package/dist/text-inputs-DsR56TR-.js +330 -0
- package/dist/text-inputs-DsR56TR-.js.map +1 -0
- package/dist/{text.styles-BwB7vAF2.js → text.styles-Q4sGAIgA.js} +18 -10
- package/dist/text.styles-Q4sGAIgA.js.map +1 -0
- package/dist/theme.css +77 -115
- package/dist/{timelines-CnZ2S_Gr.js → timelines-D1pkt3se.js} +84 -78
- package/dist/timelines-D1pkt3se.js.map +1 -0
- package/dist/{tree-COD9BGdU.js → tree-BtmYyMZV.js} +8 -8
- package/dist/{tree-COD9BGdU.js.map → tree-BtmYyMZV.js.map} +1 -1
- package/dist/typography/rich-text.js +1 -1
- package/dist/typography-BxQgiZyw.js +96 -0
- package/dist/typography-BxQgiZyw.js.map +1 -0
- package/dist/typography.js +1 -1
- package/dist/{ui-provider-CftIB6TY.js → ui-provider-DRPn3qNl.js} +3 -2
- package/dist/ui-provider-DRPn3qNl.js.map +1 -0
- package/dist/ui-provider.js +1 -1
- package/dist/{upload-DIzw1dx1.js → upload-CDbYw1WN.js} +326 -323
- package/dist/upload-CDbYw1WN.js.map +1 -0
- package/dist/{upload-queue-xRJ3qDmd.js → upload-queue-CNd_hH_a.js} +25 -25
- package/dist/upload-queue-CNd_hH_a.js.map +1 -0
- package/dist/usage-card-VyJLUwRr.js +457 -0
- package/dist/usage-card-VyJLUwRr.js.map +1 -0
- package/dist/utils-BvH9PSmq.js +4275 -0
- package/dist/utils-BvH9PSmq.js.map +1 -0
- package/dist/value-inputs-D0KCrfVC.js +840 -0
- package/dist/value-inputs-D0KCrfVC.js.map +1 -0
- package/dist/{workspace-Cbqz4FzN.js → workspace-CcR8r-Nt.js} +115 -122
- package/dist/workspace-CcR8r-Nt.js.map +1 -0
- package/docs/consumer-skill/SKILL.md +112 -18
- package/docs/consumer-skill/examples/analytics.tsx +34 -0
- package/docs/consumer-skill/examples/app-layout.tsx +42 -12
- package/docs/consumer-skill/examples/detail.tsx +24 -9
- package/docs/consumer-skill/examples/manifest.json +27 -1
- package/docs/consumer-skill/examples/planning-usage-edit.tsx +29 -0
- package/docs/consumer-skill/examples/scoped-directory.tsx +77 -0
- package/docs/consumer-skill/examples/website.tsx +56 -0
- package/docs/consumer-skill/references/analytics.md +70 -0
- package/docs/consumer-skill/references/composition.md +219 -2
- package/docs/consumer-skill/references/design-contract.md +37 -10
- package/docs/consumer-skill/references/discovery.md +93 -5
- package/docs/consumer-skill/references/installation.md +20 -3
- package/docs/consumer-skill/references/integration.md +26 -0
- package/docs/consumer-skill/references/public-api.json +2416 -388
- package/docs/consumer-skill/references/review.md +126 -0
- package/docs/consumer-skill/references/theming.md +52 -7
- package/docs/consumer-skill/references/tokens.json +177 -9
- package/docs/consumer-skill/references/workflows.md +129 -1
- package/docs/consumer-skill/scripts/check-composition.mjs +31 -0
- package/docs/consumer-skill/scripts/composition-policy.mjs +317 -0
- package/docs/consumer-skill/scripts/discovery.mjs +65 -8
- package/docs/consumer-skill/scripts/surface-policy.mjs +66 -0
- package/package.json +30 -6
- package/dist/accordion-BRWh3BM1.js.map +0 -1
- package/dist/action-menu-Cx3SdfbN.js.map +0 -1
- package/dist/affordance-geometry.generated-DXl-Zb3Z.js +0 -23
- package/dist/affordance-geometry.generated-DXl-Zb3Z.js.map +0 -1
- package/dist/ai-artifact-DkOArd3-.js.map +0 -1
- package/dist/app-shell-BH_bGcE2.js.map +0 -1
- package/dist/auth-BDB1V_2q.js +0 -704
- package/dist/auth-BDB1V_2q.js.map +0 -1
- package/dist/avatar-CsnWaYmt.js.map +0 -1
- package/dist/breadcrumbs-DdQ_I5ra.js.map +0 -1
- package/dist/button-BS6l5JUw.js.map +0 -1
- package/dist/buttons-Co6GavvM.js +0 -674
- package/dist/buttons-Co6GavvM.js.map +0 -1
- package/dist/chart-DVfcwQu6.js +0 -149
- package/dist/chart-DVfcwQu6.js.map +0 -1
- package/dist/choice-inputs-CavA-SGV.js +0 -644
- package/dist/choice-inputs-CavA-SGV.js.map +0 -1
- package/dist/code-block-DIlqzoiD.js.map +0 -1
- package/dist/combobox-CHD750do.js.map +0 -1
- package/dist/combobox-HDftpzxt.js.map +0 -1
- package/dist/command-D0kWBZfd.js.map +0 -1
- package/dist/comments-CvYeglMS.js +0 -1132
- package/dist/comments-CvYeglMS.js.map +0 -1
- package/dist/containers-CPNyNo1_.js.map +0 -1
- package/dist/data-display-b3d1TfL4.js.map +0 -1
- package/dist/date-picker-DI6kPNof.js.map +0 -1
- package/dist/date-pickers-ByP6Cv2z.js +0 -224
- package/dist/date-pickers-ByP6Cv2z.js.map +0 -1
- package/dist/feedback-a9j9J-9A.js +0 -391
- package/dist/feedback-a9j9J-9A.js.map +0 -1
- package/dist/field-affordance-recipes-CHdUtn2Z.js +0 -17
- package/dist/field-affordance-recipes-CHdUtn2Z.js.map +0 -1
- package/dist/field-state-recipes-CBTRt9Bt.js.map +0 -1
- package/dist/filters-qtrcv1hf.js.map +0 -1
- package/dist/form-field-C6W-y2hR.js.map +0 -1
- package/dist/form-sizing-39NohSqn.js.map +0 -1
- package/dist/forms-numeric-Y15Bg5Nr.js +0 -867
- package/dist/forms-numeric-Y15Bg5Nr.js.map +0 -1
- package/dist/header-B8ex54cY.js.map +0 -1
- package/dist/http-CLTVJc5I.js.map +0 -1
- package/dist/input-DMorJiTI.js +0 -202
- package/dist/input-DMorJiTI.js.map +0 -1
- package/dist/input-ci9fIgFH.js +0 -20
- package/dist/input-ci9fIgFH.js.map +0 -1
- package/dist/item-pJ0GsOiJ.js.map +0 -1
- package/dist/media-gallery-Ca4YmvBi.js.map +0 -1
- package/dist/message-B5-6LeYl.js +0 -108
- package/dist/message-B5-6LeYl.js.map +0 -1
- package/dist/navigation-BTrEb5u4.js.map +0 -1
- package/dist/navigation-DqEITuD2.js.map +0 -1
- package/dist/navigation-row-recipes-BFpvGPGE.js.map +0 -1
- package/dist/overlays-DBqV0J_V.js +0 -982
- package/dist/overlays-DBqV0J_V.js.map +0 -1
- package/dist/page-BMBGjJY8.js.map +0 -1
- package/dist/page-header-BH41wCyY.js.map +0 -1
- package/dist/pagination-C29vvt3I.js.map +0 -1
- package/dist/popover-TInGXsjg.js.map +0 -1
- package/dist/popover.recipes-zgBhMlUu.js.map +0 -1
- package/dist/primitives-DKPOGVpj.js.map +0 -1
- package/dist/rich-text-editor-BZSJchAF.js +0 -575
- package/dist/rich-text-editor-BZSJchAF.js.map +0 -1
- package/dist/rich-text-editor.recipes-DxvOE0Lp.js.map +0 -1
- package/dist/scroll-area-BheMQ270.js.map +0 -1
- package/dist/select-B2mb-qN2.js +0 -108
- package/dist/select-B2mb-qN2.js.map +0 -1
- package/dist/sheet-vOUloJ4O.js.map +0 -1
- package/dist/sidebar-C3UKkbC5.js.map +0 -1
- package/dist/sidebar-CNBKFDRW.js.map +0 -1
- package/dist/smart-card-B5FcKODh.js.map +0 -1
- package/dist/structure.recipes-DjqnBpwz.js.map +0 -1
- package/dist/surface-recipes-CQfRr-VL.js.map +0 -1
- package/dist/table-DnlAJ-xR.js.map +0 -1
- package/dist/table-ghtAQ-JJ.js +0 -1424
- package/dist/table-ghtAQ-JJ.js.map +0 -1
- package/dist/tabs-DY09eoZg.js +0 -187
- package/dist/tabs-DY09eoZg.js.map +0 -1
- package/dist/text-inputs-BhOcedTo.js +0 -331
- package/dist/text-inputs-BhOcedTo.js.map +0 -1
- package/dist/text.styles-BwB7vAF2.js.map +0 -1
- package/dist/timelines-CnZ2S_Gr.js.map +0 -1
- package/dist/typography-Cv8MT-82.js +0 -96
- package/dist/typography-Cv8MT-82.js.map +0 -1
- package/dist/ui-provider-CftIB6TY.js.map +0 -1
- package/dist/upload-DIzw1dx1.js.map +0 -1
- package/dist/upload-queue-xRJ3qDmd.js.map +0 -1
- package/dist/utils-C2EKeIw3.js +0 -72
- package/dist/utils-C2EKeIw3.js.map +0 -1
- package/dist/value-inputs-Co1fu-xv.js +0 -824
- package/dist/value-inputs-Co1fu-xv.js.map +0 -1
- package/dist/workspace-Cbqz4FzN.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"comments-CvYeglMS.js","names":["ImageIcon","_Fragment","NumberValue","_Fragment","useCommentsUIDefaults","useCommentsConfig","useDatesConfig","cn","TooltipProvider","TooltipTrigger","Button","Tooltip","TooltipContent","Text","DisplayLabel","TextLink","Stack","useOverlayVisibility","ConfirmDialog","sanitizeHtml","contentTypographyClassName","RichText","SecondaryValue","FileSize","Percent","Number$1","RelativeTime","AvatarFallback","Avatar","AvatarImage","Badge","PopoverTrigger","Popover","EmptyState","RichTextEditor","useMentions","MentionInlineSuggestions","MentionContent","MentionPicker","parseMentionsFromHtml","Fragment$1","defaultCommentsStrings","useResolvedStrings","useStrings","propStrings","useResolvedAccessors","dates","useMemo","propAccessors","useComments","options","composerMode","setComposerMode","useState","isSubmitting","setIsSubmitting","isSubmittingRef","useRef","formErrors","setFormErrors","resetKey","setResetKey","setSubmitting","useCallback","submitting","resetComposer","k","helpers","reportError","error","onError","comment","onUpdate","payload","values","onAfterMutate","onSubmit","onDelete","id","pickIcon","att","Image","FileText","File","Paperclip","CommentAttachmentChip","stringsProp","strings","url","accessors","attachment","name","Icon","isUploading","isFailed","meta","surface","compact","className","iconNode","Loader2","labelRow","onRetry","editable","onRemove","X","useAttachmentUpload","attachments","setAttachmentsState","initialAttachments","inFlightRef","fileCacheRef","onValueChangeRef","onValueChange","updateAttachment","prev","a","patch","setAttachments","next","beginUpload","onUpload","controller","uploaded","message","err","addFiles","disabled","files","filesInput","file","maxFiles","maxSize","removeAttachment","entry","retryAttachment","reset","useEffect","inFlight","hasMeaningfulContent","html","CommentComposer","forwardRef","resourcesProp","onResourceSearchProp","attachmentsProp","maxAttachmentsProp","allowAttachmentsProp","resources","onResourceSearch","allowAttachments","maxAttachments","attachmentsConfig","editorRef","body","setBody","initialValues","editingComment","contentError","setContentError","mentions","attachmentUpload","useImperativeHandle","ref","context","list","errors","handleSubmit","event","replyingTo","fileInputRef","handleAttachmentClick","handleFiles","hasAttachments","isEditing","isReplying","submitLabel","eyebrow","ComposerEyebrow","onCancel","makeReplyEyebrow","extraToolbarItems","items","AtSign","canComment","submitButton","Send","cancelButton","attachmentChips","footerSlot","trailingSubmit","inlineSubmit","showFooterRow","kind","parsed","previous","m","byId","merged","p","placeholder","autoFocus","label","onClose","closeLabel","interpolateString","template","CommentEmpty","icon","MessageCircle","CommentContent","props","contentType","richContent","renderRichContent","renderReference","plainContent","decodeQuotedString","rawContent","Fragment","renderRichBlock","block","index","decoded","data","raw","text","stripHtml","level","createElement","sanitizedItems","item","caption","value","trimmed","FALLBACK_INITIAL","defaultGetMediaUrl","defaultGetMediaName","defaultGetStatusLabel","s","CommentItem","memo","allowReactionsProp","allowRepliesProp","allowReactions","allowReplies","resolvedGetMediaUrl","resolvedGetMediaName","resolvedGetStatusLabel","resolvedFormatRelativeTime","authorName","avatarUrl","fallbackInitial","tagList","tag","reactions","isPinned","isEdited","showStatus","statusLabel","canDeleteComment","canModerate","canEditComment","canReply","onReply","canReact","onReact","canPin","onPinToggle","canEdit","onEdit","canDelete","hasActions","attachmentConfirm","pendingAttachmentId","setPendingAttachmentId","requestAttachmentRemoval","attachmentId","Pin","renderAttachment","canRemoveAttachment","onAttachmentRemove","reaction","CornerDownRight","Smile","Pencil","Trash2","CommentTimeline","comments","defaultItem","renderItem","emptySlot","Comments","ui","composerPosition","title","confirmDelete","deleteConfirm","pendingDeleteId","setPendingDeleteId","commentsState","requestDelete","startReply","handleReply","commentId","composer","timeline","composerBlock","inner","ariaLabel"],"sources":["../src/components/features/comments/comments.strings.ts","../src/components/features/comments/comments-provider.tsx","../src/components/features/comments/hooks/use-comments.ts","../src/components/features/comments/partials/comment-attachment-chip.tsx","../src/components/features/comments/hooks/use-attachment-upload.ts","../src/components/features/comments/partials/comment-composer.tsx","../src/components/features/comments/partials/comment-empty.tsx","../src/components/features/comments/partials/comment-content.tsx","../src/components/features/comments/partials/comment-item.tsx","../src/components/features/comments/partials/comment-timeline.tsx","../src/components/features/comments/comments.tsx"],"sourcesContent":["/**\n * Strings for the Comments feature. Consumers override via the `strings`\n * prop on `<Comments>` / sub-components — values are\n * deep-merged over these defaults.\n */\nexport interface CommentsStrings {\n\t/** Card title — usually \"Comments\". Set to \"\" to hide. */\n\ttitle: string;\n\t/** Subtitle under the card title — optional. */\n\tsubtitle: string;\n\t/** Empty-state copy for the timeline. */\n\tempty: string;\n\t/** Empty-state secondary copy. */\n\temptyHint: string;\n\n\t// Composer ---------------------------------------------------------\n\t/** Composer rich-text placeholder. */\n\tcomposerPlaceholder: string;\n\t/** Submit label for new comments. */\n\tcomposerSubmit: string;\n\t/** Submit label while pending. */\n\tcomposerSubmitting: string;\n\t/** Submit label when editing. */\n\tcomposerSave: string;\n\t/** Required-content error. */\n\tinvalidContent: string;\n\t/** Cancel/dismiss draft. */\n\tcomposerCancel: string;\n\t/** \"Edit comment\" eyebrow shown above the composer in edit mode. */\n\tcomposerEditingEyebrow: string;\n\t/** \"Reply to {{name}}\" eyebrow shown above the composer in reply mode. */\n\tcomposerReplyingEyebrow: string;\n\n\t// Toolbar buttons --------------------------------------------------\n\tcomposerAttachmentLabel: string;\n\t/** Control that inserts a mention or link. */\n\tcomposerReferenceLabel: string;\n\t/** Heading of the insert-reference menu. */\n\tcomposerReferenceMenuTitle: string;\n\t/** Placeholder in the reference search field. */\n\tcomposerReferenceSearchPlaceholder: string;\n\t/** Shown when a reference search matches nothing. */\n\tcomposerReferenceEmpty: string;\n\t/** Shown while reference results are loading. */\n\tcomposerReferenceLoading: string;\n\n\t// Item -------------------------------------------------------------\n\tfallbackAuthor: string;\n\t/** Chip marking a pinned comment. */\n\tpinned: string;\n\t/** Suffix marking an edited comment. */\n\tedited: string;\n\t/** Trash button aria-label / tooltip. */\n\tdeleteLabel: string;\n\t/** Edit button label. */\n\teditLabel: string;\n\t/** Reply button label. */\n\treplyLabel: string;\n\t/** Pin/unpin button label. */\n\tpinLabel: string;\n\t/** Action that unpins a comment. */\n\tunpinLabel: string;\n\t/** \"More actions\" trigger aria-label. */\n\tmoreActionsLabel: string;\n\t/** Confirm-delete button label inside the action menu. */\n\tconfirmDeleteLabel: string;\n\t/** Title of the confirmation shown before a comment is deleted. */\n\tconfirmDeleteTitle: string;\n\t/** Title of the confirmation shown before an attachment is removed. */\n\tconfirmRemoveAttachmentTitle: string;\n\t/** Consequence of removing an attachment from a posted comment. */\n\tconfirmRemoveAttachmentDescription: string;\n\t/** Sentence explaining the consequence before the delete is committed. */\n\tconfirmDeleteDescription: string;\n\n\t// Attachments ------------------------------------------------------\n\tattachmentFallback: string;\n\t/** Removes an attachment — staged in the composer, or posted on a comment. */\n\tattachmentRemoveLabel: string;\n\t/** Shown while an attachment uploads. */\n\tattachmentUploadingLabel: string;\n\t/** Shown when an attachment upload fails. */\n\tattachmentFailedLabel: string;\n\t/** Shown when a file exceeds the size limit. */\n\tattachmentTooLargeError: string;\n\t/** Shown when too many files are attached. */\n\tattachmentTooManyError: string;\n\t/** Action that retries a failed upload. */\n\tattachmentRetryLabel: string;\n\t/** Action that downloads an attachment. */\n\tattachmentDownloadLabel: string;\n\n\t// Reactions --------------------------------------------------------\n\taddReactionLabel: string;\n\t/** Reaction button name; interpolates {{emoji}} and {{count}}. Optional for existing complete string objects. */\n\treactionLabel?: string;\n\n\t// Misc -------------------------------------------------------------\n\tshowRepliesLabel: string;\n\t/** Control that collapses a reply thread. */\n\thideRepliesLabel: string;\n}\n\nexport const defaultCommentsStrings: CommentsStrings = {\n\ttitle: 'Comments',\n\tsubtitle: '',\n\tempty: 'No comments yet.',\n\temptyHint: 'Start the conversation — your team will see it instantly.',\n\n\tcomposerPlaceholder: 'Write a comment…',\n\tcomposerSubmit: 'Post comment',\n\tcomposerSubmitting: 'Posting…',\n\tcomposerSave: 'Save changes',\n\tinvalidContent: 'Comment cannot be empty.',\n\tcomposerCancel: 'Cancel',\n\tcomposerEditingEyebrow: 'Editing comment',\n\tcomposerReplyingEyebrow: 'Replying to {{name}}',\n\n\tcomposerAttachmentLabel: 'Attach file',\n\tcomposerReferenceLabel: 'Mention or link',\n\tcomposerReferenceMenuTitle: 'Insert reference',\n\tcomposerReferenceSearchPlaceholder: 'Search…',\n\tcomposerReferenceEmpty: 'No matches.',\n\tcomposerReferenceLoading: 'Searching…',\n\n\tfallbackAuthor: 'Anonymous',\n\tpinned: 'Pinned',\n\tedited: 'edited',\n\tdeleteLabel: 'Delete',\n\teditLabel: 'Edit',\n\treplyLabel: 'Reply',\n\tpinLabel: 'Pin',\n\tunpinLabel: 'Unpin',\n\tmoreActionsLabel: 'More actions',\n\tconfirmDeleteLabel: 'Delete comment',\n\tconfirmDeleteTitle: 'Delete this comment?',\n\tconfirmRemoveAttachmentTitle: 'Remove this attachment?',\n\tconfirmRemoveAttachmentDescription: 'The file is detached from the comment for everyone. This cannot be undone.',\n\tconfirmDeleteDescription: 'The comment and its replies are removed for everyone. This cannot be undone.',\n\n\tattachmentFallback: 'Attachment',\n\tattachmentRemoveLabel: 'Remove attachment',\n\tattachmentUploadingLabel: 'Uploading…',\n\tattachmentFailedLabel: 'Upload failed',\n\tattachmentTooLargeError: 'File is too large.',\n\tattachmentTooManyError: 'Too many attachments.',\n\tattachmentRetryLabel: 'Retry',\n\tattachmentDownloadLabel: 'Download',\n\n\taddReactionLabel: 'Add reaction',\n\treactionLabel: 'Reaction {{emoji}}: {{count}}',\n\n\tshowRepliesLabel: 'Show replies',\n\thideRepliesLabel: 'Hide replies',\n};\n","/**\n * Comments — internal helper hooks for resolving strings and accessors.\n *\n * Rationale: the previous `<CommentsProvider>` is gone. Library-wide\n * Per-mount overrides flow as direct props on `<Comments>` and its partials.\n * Date formatting may still inherit the app-wide dates configuration.\n *\n * Resolution order everywhere:\n *\n * props.strings ← deep-merged over `defaultCommentsStrings`\n * props.accessor.X ← falls back to UIProvider's dates formatter, then\n * to a built-in default at the call site.\n */\nimport { useMemo } from 'react';\n\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { useDatesConfig } from '../../../lib/ui-provider';\n\nimport {\n\tdefaultCommentsStrings,\n\ttype CommentsStrings,\n} from './comments.strings';\nimport type { CommentsAccessors } from './comments.types';\n\n/**\n * Resolve final strings by merging defaults → component prop. Stable\n * identity when the prop reference is unchanged.\n */\nexport function useResolvedStrings(\n\tpropStrings?: StringsProp<CommentsStrings>,\n): CommentsStrings {\n\treturn useStrings(defaultCommentsStrings, propStrings);\n}\n\n/**\n * Resolve accessors. Order:\n * 1. explicit prop accessor\n * 2. the UIProvider date formatter for relative time\n * 3. caller's own fallback when neither is present (handled at call site)\n */\nexport function useResolvedAccessors(\n\tpropAccessors?: CommentsAccessors,\n): CommentsAccessors {\n\tconst dates = useDatesConfig();\n\treturn useMemo<CommentsAccessors>(\n\t\t() => ({\n\t\t\tgetMediaUrl: propAccessors?.getMediaUrl,\n\t\t\tgetMediaName: propAccessors?.getMediaName,\n\t\t\tgetStatusLabel: propAccessors?.getStatusLabel,\n\t\t\tformatRelativeTime:\n\t\t\t\tpropAccessors?.formatRelativeTime ?? dates.formatRelativeTime,\n\t\t}),\n\t\t[propAccessors, dates.formatRelativeTime],\n\t);\n}\n","/**\n * useComments — headless state machine for the Comments feature.\n *\n * Tracks composer mode (idle | replying | editing), submit/delete\n * helpers, error state, and resetKey bumping. The default `<Comments>`\n * component composes this hook; consumers building a fully custom UI\n * can use it directly.\n */\nimport { useCallback, useMemo, useRef, useState } from 'react';\n\nimport type {\n\tCommentData,\n\tCommentFormValues,\n\tCommentSubmitHelpers,\n\tCommentUser,\n\tCommentsConfig,\n} from '../comments.types';\n\nexport type ComposerMode<\n\tTResource extends string = string,\n\tTUser extends CommentUser = CommentUser,\n\tTMeta = unknown,\n> =\n\t| { kind: 'idle' }\n\t| { kind: 'editing'; comment: CommentData<TUser, TMeta, TResource> }\n\t| { kind: 'replying'; commentId: string; authorName?: string };\n\nexport interface UseCommentsOptions<\n\tTUser extends CommentUser = CommentUser,\n\tTMeta = unknown,\n\tTResource extends string = string,\n> {\n\tonSubmit?: CommentsConfig<TUser, TMeta, TResource>['onSubmit'];\n\tonUpdate?: CommentsConfig<TUser, TMeta, TResource>['onUpdate'];\n\tonDelete?: CommentsConfig<TUser, TMeta, TResource>['onDelete'];\n\tonAfterMutate?: CommentsConfig<TUser, TMeta, TResource>['onAfterMutate'];\n\tonError?: CommentsConfig<TUser, TMeta, TResource>['onError'];\n}\n\nexport interface UseCommentsReturn<\n\tTUser extends CommentUser = CommentUser,\n\tTMeta = unknown,\n\tTResource extends string = string,\n> {\n\tcomposerMode: ComposerMode<TResource, TUser, TMeta>;\n\tisSubmitting: boolean;\n\tformErrors: Record<string, string>;\n\tresetKey: number;\n\n\tstartReply: (comment: CommentData<TUser, TMeta, TResource>) => void;\n\tstartEdit: (comment: CommentData<TUser, TMeta, TResource>) => void;\n\tcancelComposerMode: () => void;\n\n\tsubmit: (values: CommentFormValues<TResource>) => Promise<void>;\n\tdeleteComment: (id: string) => Promise<void>;\n\n\t/** Imperative reset — bumps `resetKey` so the composer clears itself. */\n\tresetComposer: () => void;\n\t/** Helpers exposed to onSubmit/onUpdate. */\n\thelpers: CommentSubmitHelpers;\n}\n\nexport function useComments<\n\tTUser extends CommentUser = CommentUser,\n\tTMeta = unknown,\n\tTResource extends string = string,\n>(\n\toptions: UseCommentsOptions<TUser, TMeta, TResource> = {},\n): UseCommentsReturn<TUser, TMeta, TResource> {\n\tconst { onSubmit, onUpdate, onDelete, onAfterMutate, onError } = options;\n\n\tconst [composerMode, setComposerMode] = useState<\n\t\tComposerMode<TResource, TUser, TMeta>\n\t>({\n\t\tkind: 'idle',\n\t});\n\tconst [isSubmitting, setIsSubmitting] = useState(false);\n\tconst isSubmittingRef = useRef(false);\n\tconst [formErrors, setFormErrors] = useState<Record<string, string>>({});\n\tconst [resetKey, setResetKey] = useState(0);\n\n\tconst setSubmitting = useCallback((submitting: boolean) => {\n\t\tisSubmittingRef.current = submitting;\n\t\tsetIsSubmitting(submitting);\n\t}, []);\n\n\tconst resetComposer = useCallback(() => {\n\t\tsetResetKey((k) => k + 1);\n\t\tsetComposerMode({ kind: 'idle' });\n\t\tsetFormErrors({});\n\t\tsetSubmitting(false);\n\t}, [setSubmitting]);\n\n\tconst helpers = useMemo<CommentSubmitHelpers>(\n\t\t() => ({\n\t\t\tsetErrors: setFormErrors,\n\t\t\treset: resetComposer,\n\t\t\tsetSubmitting,\n\t\t}),\n\t\t[resetComposer, setSubmitting],\n\t);\n\n\tconst reportError = useCallback(\n\t\t(error: unknown) => {\n\t\t\ttry {\n\t\t\t\tonError?.(error);\n\t\t\t} catch (callbackError) {\n\t\t\t\tif (import.meta.env?.DEV) {\n\t\t\t\t\tconsole.warn('[Comments] onError callback failed.', callbackError);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[onError],\n\t);\n\n\tconst startReply = useCallback(\n\t\t(comment: CommentData<TUser, TMeta, TResource>) => {\n\t\t\tif (!comment.id) return;\n\t\t\tsetFormErrors({});\n\t\t\tsetComposerMode({\n\t\t\t\tkind: 'replying',\n\t\t\t\tcommentId: comment.id,\n\t\t\t\tauthorName: comment.user?.name,\n\t\t\t});\n\t\t},\n\t\t[],\n\t);\n\n\tconst startEdit = useCallback(\n\t\t(comment: CommentData<TUser, TMeta, TResource>) => {\n\t\t\tif (!comment.id) return;\n\t\t\tsetFormErrors({});\n\t\t\tsetComposerMode({ kind: 'editing', comment });\n\t\t},\n\t\t[],\n\t);\n\n\tconst cancelComposerMode = useCallback(() => {\n\t\tresetComposer();\n\t}, [resetComposer]);\n\n\tconst submit = useCallback(\n\t\tasync (values: CommentFormValues<TResource>) => {\n\t\t\tif (composerMode.kind === 'editing' && composerMode.comment.id) {\n\t\t\t\tif (!onUpdate) return;\n\t\t\t\tif (isSubmittingRef.current) return;\n\n\t\t\t\tconst payload = {\n\t\t\t\t\t...values,\n\t\t\t\t\teditingId: composerMode.comment.id,\n\t\t\t\t};\n\t\t\t\tsetSubmitting(true);\n\t\t\t\tsetFormErrors({});\n\t\t\t\ttry {\n\t\t\t\t\tawait onUpdate(composerMode.comment.id, payload, helpers);\n\t\t\t\t\tonAfterMutate?.('update', payload);\n\t\t\t\t} catch (error) {\n\t\t\t\t\treportError(error);\n\t\t\t\t} finally {\n\t\t\t\t\tsetSubmitting(false);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!onSubmit) return;\n\t\t\tif (isSubmittingRef.current) return;\n\n\t\t\tconst payload: CommentFormValues<TResource> =\n\t\t\t\tcomposerMode.kind === 'replying'\n\t\t\t\t\t? { ...values, replyToId: composerMode.commentId }\n\t\t\t\t\t: values;\n\n\t\t\tsetSubmitting(true);\n\t\t\tsetFormErrors({});\n\t\t\ttry {\n\t\t\t\tawait onSubmit(payload, helpers);\n\t\t\t\tonAfterMutate?.('create', payload);\n\t\t\t} catch (error) {\n\t\t\t\treportError(error);\n\t\t\t} finally {\n\t\t\t\tsetSubmitting(false);\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tcomposerMode,\n\t\t\thelpers,\n\t\t\tonAfterMutate,\n\t\t\tonSubmit,\n\t\t\tonUpdate,\n\t\t\treportError,\n\t\t\tsetSubmitting,\n\t\t],\n\t);\n\n\tconst deleteComment = useCallback(\n\t\tasync (id: string) => {\n\t\t\tif (!onDelete || !id) return;\n\t\t\ttry {\n\t\t\t\tawait onDelete(id);\n\t\t\t\tonAfterMutate?.('delete', { commentId: id });\n\t\t\t} catch (error) {\n\t\t\t\treportError(error);\n\t\t\t}\n\t\t},\n\t\t[onAfterMutate, onDelete, reportError],\n\t);\n\n\treturn {\n\t\tcomposerMode,\n\t\tisSubmitting,\n\t\tformErrors,\n\t\tresetKey,\n\t\tstartReply,\n\t\tstartEdit,\n\t\tcancelComposerMode,\n\t\tsubmit,\n\t\tdeleteComment,\n\t\tresetComposer,\n\t\thelpers,\n\t};\n}\n","/**\n * CommentAttachmentChip — small attachment pill used in the composer draft\n * and the timeline. Single inline row: icon + name · size, with progress /\n * error states overlaid on the same line. Editable mode reveals a remove\n * button; failed uploads expose a retry pill.\n */\nimport { File, FileText, Image as ImageIcon, Loader2, Paperclip, X } from 'lucide-react';\nimport type { FC, ReactNode } from 'react';\n\nimport { Button } from '../../../base/buttons';\nimport { FileSize, Percent, SecondaryValue } from '../../../primitives';\nimport { Text, TextLink } from '../../../typography';\nimport { useStrings, type StringsProp } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport type {\n\t\tCommentAttachment,\n\t\tCommentsAccessors,\n} from '../comments.types';\nimport {\n\t\tdefaultCommentsStrings,\n\t\ttype CommentsStrings,\n} from '../comments.strings';\n\nexport interface CommentAttachmentChipProps {\n\t\t/** The attachment this chip represents. */\n\t\tattachment: CommentAttachment;\n\t\t/** Editable mode shows a remove button. */\n\t\teditable?: boolean;\n\t\t/** Fired when an entry is removed. */\n\t\tonRemove?: (id: string) => void;\n\t\t/** Fired when the user retries after an entry failure. */\n\t\tonRetry?: (id: string) => void;\n\t\t/** Reads the fields this surface needs off your own shape. */\n\t\taccessors?: CommentsAccessors;\n\t\t/** Overrides this surface's own copy. */\n\t\tstrings?: StringsProp<CommentsStrings>;\n\t\t/** Compact chips have smaller text and tighter padding. */\n\t\tcompact?: boolean;\n\t\t/** Merged onto the outermost node. */\n\t\tclassName?: string;\n}\n\nfunction pickIcon(att: CommentAttachment) {\n\t\tif (att.mimeType?.startsWith('image/')) return ImageIcon;\n\t\tif (att.mimeType === 'application/pdf') return FileText;\n\t\tif (att.mimeType?.startsWith('text/')) return FileText;\n\t\tif (att.mimeType) return File;\n\t\treturn Paperclip;\n}\n\nexport const CommentAttachmentChip: FC<CommentAttachmentChipProps> = ({\n\t\tattachment,\n\t\teditable = false,\n\t\tonRemove,\n\t\tonRetry,\n\t\taccessors,\n\t\tstrings: stringsProp,\n\t\tcompact = false,\n\t\tclassName,\n}) => {\n\t\tconst strings = useStrings(defaultCommentsStrings, stringsProp);\n\n\t\tconst url = accessors?.getMediaUrl?.(attachment) ?? attachment.url;\n\t\tconst name =\n\t\t\t\taccessors?.getMediaName?.(attachment) ??\n\t\t\t\tattachment.name ??\n\t\t\t\tstrings.attachmentFallback;\n\t\tconst Icon = pickIcon(attachment);\n\n\t\tconst isUploading = attachment.status === 'uploading';\n\t\tconst isFailed = attachment.status === 'failed';\n\t\tconst meta: ReactNode = isUploading\n\t\t\t\t? (\n\t\t\t\t\t\t<SecondaryValue size=\"xs\" className=\"shrink-0\">\n\t\t\t\t\t\t\t\t{strings.attachmentUploadingLabel}\n\t\t\t\t\t\t\t\t{typeof attachment.progress === 'number' ? (\n\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\t\t<Percent\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={Math.round(attachment.progress)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tscaled\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\talign=\"left\"\n\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/>\n\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</SecondaryValue>\n\t\t\t\t)\n\t\t\t\t: isFailed\n\t\t\t\t\t? (\n\t\t\t\t\t\t\t<SecondaryValue size=\"xs\" className=\"shrink-0\">\n\t\t\t\t\t\t\t\t\t{attachment.error ?? strings.attachmentFailedLabel}\n\t\t\t\t\t\t\t</SecondaryValue>\n\t\t\t\t\t)\n\t\t\t\t\t: typeof attachment.size === 'number'\n\t\t\t\t\t\t? (\n\t\t\t\t\t\t\t<FileSize value={attachment.size} size=\"xs\" className=\"shrink-0\" />\n\t\t\t\t\t\t)\n\t\t\t\t\t\t: null;\n\n\t\tconst surface = cn(\n\t\t'comment-attachment-chip--component',\n\t\t\t\t'relative inline-flex min-w-0 max-w-[20rem] items-center gap-space-sm rounded-radius-md',\n\t\t\t\t'ring-1 ring-inset transition-colors',\n\t\t\t\tcompact ? 'px-2 py-1 text-xs' : 'px-2.5 py-1 text-xs',\n\t\t\t\tisFailed\n\t\t\t\t\t\t? 'bg-destructive/[0.04] ring-destructive/30 hover:bg-destructive/[0.08]'\n\t\t\t\t\t\t: 'bg-foreground/[0.03] ring-border/60 hover:bg-foreground/[0.06]',\n\t\t\t\tclassName,\n\t\t);\n\n\t\tconst iconNode = isUploading ? (\n\t\t\t\t<Loader2\n\t\t\t\t\t\tclassName={cn('shrink-0 animate-spin text-muted-foreground', 'size-icon-md')}\n\t\t\t\t\t\taria-hidden\n\t\t\t\t/>\n\t\t) : (\n\t\t\t\t<Icon\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'shrink-0',\n\t\t\t\t\t\t\t\t'size-icon-md',\n\t\t\t\t\t\t\t\tisFailed ? 'text-destructive' : 'text-muted-foreground',\n\t\t\t\t\t\t)}\n\t\t\t\t\t\taria-hidden\n\t\t\t\t/>\n\t\t);\n\n\t\tconst labelRow = (\n\t\t\t\t<span className=\"inline-flex min-w-0 items-baseline gap-space-sm\">\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\t\t\t\tclassName={cn('truncate', isFailed && 'text-destructive')}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t{meta}\n\t\t\t\t</span>\n\t\t);\n\n\t\tconst isInteractive = !!url && !isUploading && !isFailed;\n\n\t\treturn (\n\t\t\t\t<div className={surface}>\n\t\t\t\t\t\t{iconNode}\n\t\t\t\t\t\t{isInteractive ? (\n\t\t\t\t<TextLink\n\t\t\t\t\thref={url}\n\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\tunderline={false}\n\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t\trel=\"noreferrer noopener\"\n\t\t\t\t\tclassName=\"inline-flex min-w-0 flex-1 items-baseline gap-space-sm hover:underline\"\n\t\t\t\t\t\t\t\t\t\taria-label={strings.attachmentDownloadLabel}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{labelRow}\n\t\t\t\t</TextLink>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\tlabelRow\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{isUploading && typeof attachment.progress === 'number' && (\n\t\t\t\t\t\t\t\t<div className=\"bg-primary/15 absolute bottom-0 left-2 right-2 h-px overflow-hidden rounded-full\">\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"bg-primary h-full transition-[width]\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: `${Math.min(100, Math.max(0, attachment.progress))}%`,\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{isFailed && onRetry && (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\ttone=\"destructive\"\n\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => onRetry(attachment.id)}\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-auto shrink-0 rounded px-1.5 py-px ring-1 ring-inset ring-destructive/30 hover:ring-destructive/60\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" className=\"text-inherit\">{strings.attachmentRetryLabel}</Text>\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{editable && onRemove && (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\t\t\tonClick={() => onRemove(attachment.id)}\n\t\t\t\t\t\t\t\t\t\tclassName=\"-mr-0.5 size-icon shrink-0 rounded p-0 text-muted-foreground hover:bg-foreground/10 hover:text-foreground\"\n\t\t\t\t\t\t\t\t\t\taria-label={strings.attachmentRemoveLabel}\n\t\t\t\t\t\t\t\t\t\ttitle={strings.attachmentRemoveLabel}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<X className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t);\n};\n","/**\n * useAttachmentUpload — manages a list of in-flight + uploaded\n * `CommentAttachment`s for a comment composer.\n *\n * Pass the consumer-supplied `onUpload` callback directly via the\n * `attachments` prop on `<Comments>` (or `<CommentComposer>`). Aborts\n * in-flight uploads when an attachment is removed.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport type {\n\tCommentAttachment,\n\tCommentsAttachmentsConfig,\n} from '../comments.types';\n\ninterface InFlightEntry {\n\tcontroller: AbortController;\n}\n\nexport interface UseAttachmentUploadOptions extends CommentsAttachmentsConfig {\n\t/** Initial attachments — useful when editing an existing comment. */\n\tinitialAttachments?: ReadonlyArray<CommentAttachment>;\n\t/** Fires when the list of uploaded attachments changes. */\n\tonValueChange?: (attachments: ReadonlyArray<CommentAttachment>) => void;\n\t/** Fires when a validation or upload error happens. */\n\tonError?: (error: string) => void;\n}\n\nexport interface UseAttachmentUploadReturn {\n\t/** All attachments — uploading + uploaded + failed. */\n\tattachments: ReadonlyArray<CommentAttachment>;\n\t/** Subset of attachments that finished uploading. Use this in the form payload. */\n\tuploadedAttachments: ReadonlyArray<CommentAttachment>;\n\t/** True while at least one upload is in flight. */\n\tisUploading: boolean;\n\t/** Add files. Validates against `maxSize` / `maxFiles` first. */\n\taddFiles: (files: ReadonlyArray<File> | FileList) => void;\n\t/** Remove an attachment by id (aborts in-flight uploads). */\n\tremoveAttachment: (id: string) => void;\n\t/** Retry a failed upload. */\n\tretryAttachment: (id: string) => void;\n\t/** Replace the list (used when editing or after submit). */\n\tsetAttachments: (attachments: ReadonlyArray<CommentAttachment>) => void;\n\t/** Clear the list and abort everything in flight. */\n\treset: () => void;\n}\n\nexport function useAttachmentUpload(\n\toptions: UseAttachmentUploadOptions = {},\n): UseAttachmentUploadReturn {\n\tconst {\n\t\tonUpload,\n\t\tmaxSize,\n\t\tmaxFiles,\n\t\t// `accept` is consumed by the surrounding `<input type=\"file\"\n\t\t// accept>` element, not here — destructuring is intentional\n\t\t// even though we don't reference it inside the hook.\n\t\tdisabled,\n\t\tinitialAttachments,\n\t\tonValueChange,\n\t\tonError,\n\t} = options;\n\n\tconst [attachments, setAttachmentsState] = useState<CommentAttachment[]>(() =>\n\t\tinitialAttachments ? [...initialAttachments] : [],\n\t);\n\tconst inFlightRef = useRef<Map<string, InFlightEntry>>(new Map());\n\tconst fileCacheRef = useRef<Map<string, File>>(new Map());\n\tconst onValueChangeRef = useRef(onValueChange);\n\tonValueChangeRef.current = onValueChange;\n\n\tconst updateAttachment = useCallback(\n\t\t(id: string, patch: Partial<CommentAttachment>) => {\n\t\t\tsetAttachmentsState((prev) =>\n\t\t\t\tprev.map((a) => (a.id === id ? { ...a, ...patch } : a)),\n\t\t\t);\n\t\t},\n\t\t[],\n\t);\n\n\tconst setAttachments = useCallback(\n\t\t(next: ReadonlyArray<CommentAttachment>) => {\n\t\t\tsetAttachmentsState([...next]);\n\t\t},\n\t\t[],\n\t);\n\n\tconst beginUpload = useCallback(\n\t\t(id: string, file: File) => {\n\t\t\tif (!onUpload) return;\n\t\t\tconst controller = new AbortController();\n\t\t\tinFlightRef.current.set(id, { controller });\n\n\t\t\tupdateAttachment(id, {\n\t\t\t\tstatus: 'uploading',\n\t\t\t\tprogress: 0,\n\t\t\t\terror: undefined,\n\t\t\t});\n\n\t\t\tconst onProgress = (progress: number) => {\n\t\t\t\tupdateAttachment(id, { progress });\n\t\t\t};\n\n\t\t\tonUpload({ file, onProgress, signal: controller.signal })\n\t\t\t\t.then((uploaded) => {\n\t\t\t\t\tinFlightRef.current.delete(id);\n\t\t\t\t\tupdateAttachment(id, {\n\t\t\t\t\t\t...uploaded,\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tstatus: 'uploaded',\n\t\t\t\t\t\tprogress: 100,\n\t\t\t\t\t\terror: undefined,\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch((err: unknown) => {\n\t\t\t\t\tinFlightRef.current.delete(id);\n\t\t\t\t\tif (controller.signal.aborted) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst message =\n\t\t\t\t\t\terr instanceof Error ? err.message : 'Upload failed';\n\t\t\t\t\tupdateAttachment(id, {\n\t\t\t\t\t\tstatus: 'failed',\n\t\t\t\t\t\terror: message,\n\t\t\t\t\t});\n\t\t\t\t\tonError?.(message);\n\t\t\t\t});\n\t\t},\n\t\t[onError, onUpload, updateAttachment],\n\t);\n\n\tconst addFiles = useCallback(\n\t\t(filesInput: ReadonlyArray<File> | FileList) => {\n\t\t\tif (disabled || !onUpload) return;\n\t\t\tconst files = Array.from(filesInput);\n\t\t\tif (files.length === 0) return;\n\n\t\t\tsetAttachmentsState((prev) => {\n\t\t\t\tconst next = [...prev];\n\t\t\t\tfor (const file of files) {\n\t\t\t\t\tif (\n\t\t\t\t\t\ttypeof maxFiles === 'number' &&\n\t\t\t\t\t\tnext.length >= maxFiles\n\t\t\t\t\t) {\n\t\t\t\t\t\tonError?.('Too many attachments.');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\ttypeof maxSize === 'number' &&\n\t\t\t\t\t\tfile.size > maxSize\n\t\t\t\t\t) {\n\t\t\t\t\t\tonError?.('File is too large.');\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst id =\n\t\t\t\t\t\ttypeof crypto !== 'undefined' && 'randomUUID' in crypto\n\t\t\t\t\t\t\t? crypto.randomUUID()\n\t\t\t\t\t\t\t: `att-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n\t\t\t\t\tfileCacheRef.current.set(id, file);\n\n\t\t\t\t\tnext.push({\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tname: file.name,\n\t\t\t\t\t\tsize: file.size,\n\t\t\t\t\t\tmimeType: file.type,\n\t\t\t\t\t\tstatus: 'uploading',\n\t\t\t\t\t\tprogress: 0,\n\t\t\t\t\t});\n\n\t\t\t\t\tqueueMicrotask(() => beginUpload(id, file));\n\t\t\t\t}\n\t\t\t\treturn next;\n\t\t\t});\n\t\t},\n\t\t[beginUpload, disabled, maxFiles, maxSize, onError, onUpload],\n\t);\n\n\tconst removeAttachment = useCallback((id: string) => {\n\t\tconst entry = inFlightRef.current.get(id);\n\t\tif (entry) {\n\t\t\tentry.controller.abort();\n\t\t\tinFlightRef.current.delete(id);\n\t\t}\n\t\tfileCacheRef.current.delete(id);\n\t\tsetAttachmentsState((prev) => prev.filter((a) => a.id !== id));\n\t}, []);\n\n\tconst retryAttachment = useCallback(\n\t\t(id: string) => {\n\t\t\tconst file = fileCacheRef.current.get(id);\n\t\t\tif (!file) return;\n\t\t\tbeginUpload(id, file);\n\t\t},\n\t\t[beginUpload],\n\t);\n\n\tconst reset = useCallback(() => {\n\t\tfor (const entry of inFlightRef.current.values()) {\n\t\t\tentry.controller.abort();\n\t\t}\n\t\tinFlightRef.current.clear();\n\t\tfileCacheRef.current.clear();\n\t\tsetAttachmentsState([]);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tonValueChangeRef.current?.(attachments);\n\t}, [attachments]);\n\n\tuseEffect(() => {\n\t\tconst inFlight = inFlightRef.current;\n\t\treturn () => {\n\t\t\tfor (const entry of inFlight.values()) {\n\t\t\t\tentry.controller.abort();\n\t\t\t}\n\t\t};\n\t}, []);\n\n\tconst uploadedAttachments = useMemo(\n\t\t() => attachments.filter((a) => a.status === 'uploaded' || !a.status),\n\t\t[attachments],\n\t);\n\n\tconst isUploading = useMemo(\n\t\t() => attachments.some((a) => a.status === 'uploading'),\n\t\t[attachments],\n\t);\n\n\treturn {\n\t\tattachments,\n\t\tuploadedAttachments,\n\t\tisUploading,\n\t\taddFiles,\n\t\tremoveAttachment,\n\t\tretryAttachment,\n\t\tsetAttachments,\n\t\treset,\n\t};\n}\n","/**\n * CommentComposer — TipTap-backed rich text editor with inline reference\n * picker and attachment uploader. Default composer for `<Comments>`.\n *\n * Mention/reference handling is delegated to the shared\n * `features/mentions` module: `useMentions` drives picker state +\n * caret-trigger detection, `<MentionPicker>` renders the popover, and\n * `<MentionChip>` renders draft-list chips. The same primitives power\n * inline references in `features/activities`.\n */\nimport { AtSign, Loader2, Paperclip, Send, X } from 'lucide-react';\nimport {\n\t\tforwardRef,\n\t\tuseEffect,\n\t\tuseImperativeHandle,\n\t\tuseMemo,\n\t\tuseRef,\n\t\tuseState,\n} from 'react';\nimport type { ReactNode } from 'react';\nimport type { ReactElement, RefAttributes } from 'react';\n\nimport { Button } from '../../../base/buttons';\nimport { Popover, PopoverTrigger } from '../../../base/popover';\nimport { Stack } from '../../../base/structure';\nimport { DisplayLabel, Text } from '../../../typography';\nimport {\n\t\tRichTextEditor,\n\t\ttype RichTextEditorHandle,\n\t\ttype RichTextEditorToolbarItem,\n} from '../../rich-text-editor/rich-text-editor';\nimport {\n\t\tMentionInlineSuggestions,\n\t\tMentionPicker,\n\t\tparseMentionsFromHtml,\n\t\tuseMentions,\n} from '../../mentions';\nimport { useResolvedStrings } from '../comments-provider';\nimport { interpolateString } from '../../../../lib/strings';\nimport type {\n\t\tCommentComposerProps,\n\t\tCommentFormValues,\n} from '../comments.types';\nimport { CommentAttachmentChip } from './comment-attachment-chip';\nimport { useAttachmentUpload } from '../hooks/use-attachment-upload';\n\nexport interface CommentComposerHandle {\n\t\tfocus(): void;\n\t\tclear(): void;\n\t\t/** Imperatively set the draft body. */\n\t\tsetBody(html: string): void;\n}\n\nfunction hasMeaningfulContent(html: string): boolean {\n\t\tif (!html || typeof html !== 'string') return false;\n\t\tconst text = html.replace(/<[^>]*>/g, '').trim();\n\t\treturn text.length > 0;\n}\n\nconst CommentComposerBase = forwardRef<\n\t\tCommentComposerHandle,\n\t\tCommentComposerProps\n>(function CommentComposer(\n\t\t{\n\t\t\t\tcontext,\n\t\t\t\tcanComment = true,\n\t\t\t\tsubmitting = false,\n\t\t\t\terrors,\n\t\t\t\tresetKey = 0,\n\t\t\t\tonSubmit,\n\t\t\t\tonCancel,\n\t\t\t\teditingComment,\n\t\t\t\treplyingTo,\n\t\t\t\tstrings: stringsProp,\n\t\t\t\tresources: resourcesProp,\n\t\t\t\tonResourceSearch: onResourceSearchProp,\n\t\t\t\tattachments: attachmentsProp,\n\t\t\t\tmaxAttachments: maxAttachmentsProp,\n\t\t\t\tallowAttachments: allowAttachmentsProp,\n\t\t\t\tinitialValues,\n\t\t\t\tautoFocus = false,\n\t\t\t\tinlineSubmit = true,\n\t\t\t\tplaceholder,\n\t\t},\n\t\tref,\n) {\n\t\tconst strings = useResolvedStrings(stringsProp);\n\t\tconst resources = resourcesProp;\n\t\tconst onResourceSearch = onResourceSearchProp;\n\t\tconst allowAttachments = allowAttachmentsProp ?? true;\n\t\tconst maxAttachments =\n\t\t\t\tattachmentsProp?.maxFiles ??\n\t\t\t\tmaxAttachmentsProp ??\n\t\t\t\t5;\n\t\tconst attachmentsConfig = useMemo(\n\t\t\t\t() => ({\n\t\t\t\t\t\t...attachmentsProp,\n\t\t\t\t\t\tmaxFiles: maxAttachments,\n\t\t\t\t\t\tdisabled: attachmentsProp?.disabled === true || !allowAttachments,\n\t\t\t\t}),\n\t\t\t\t[allowAttachments, attachmentsProp, maxAttachments],\n\t\t);\n\n\t\tconst editorRef = useRef<RichTextEditorHandle>(null);\n\t\tconst [body, setBody] = useState<string>(\n\t\t\t\t() => initialValues?.content ?? editingComment?.content ?? '',\n\t\t);\n\t\tconst [contentError, setContentError] = useState<string | null>(null);\n\n\t\t/**\n\t\t * Mentions state — picker + caret-trigger detection. The hook reads\n\t\t * the editor handle via the ref we pass; on suggestion select it\n\t\t * inserts the chip and replaces the trigger range automatically.\n\t\t */\n\t\tconst mentions = useMentions({\n\t\t\t\tresources,\n\t\t\t\tonResourceSearch,\n\t\t\t\teditorRef,\n\t\t\t\tinitialMentions:\n\t\t\t\t\t\tinitialValues?.references ?? editingComment?.references,\n\t\t});\n\n\t\tconst attachmentUpload = useAttachmentUpload({\n\t\t\t\t...attachmentsConfig,\n\t\t\t\tinitialAttachments: initialValues?.attachments ?? undefined,\n\t\t});\n\n\t\tuseImperativeHandle(\n\t\t\t\tref,\n\t\t\t\t() => ({\n\t\t\t\t\t\tfocus: () => editorRef.current?.focus(),\n\t\t\t\t\t\tclear: () => {\n\t\t\t\t\t\t\t\teditorRef.current?.clear();\n\t\t\t\t\t\t\t\tmentions.reset();\n\t\t\t\t\t\t\t\tattachmentUpload.reset();\n\t\t\t\t\t\t\t\tsetContentError(null);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsetBody: (html) => {\n\t\t\t\t\t\t\t\teditorRef.current?.setHTML(html);\n\t\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\t[attachmentUpload, mentions],\n\t\t);\n\n\t\t// Reset on context change / resetKey bump\n\t\tuseEffect(() => {\n\t\t\t\teditorRef.current?.setHTML(initialValues?.content ?? '');\n\t\t\t\tmentions.setMentions(initialValues?.references ?? []);\n\t\t\t\tattachmentUpload.setAttachments(initialValues?.attachments ?? []);\n\t\t\t\tsetContentError(null);\n\t\t\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t}, [context.id, context.type, resetKey]);\n\n\t\t// Sync editing comment payload\n\t\tuseEffect(() => {\n\t\t\t\tif (!editingComment) return;\n\t\t\t\teditorRef.current?.setHTML(editingComment.content ?? '');\n\t\t\t\tmentions.setMentions(editingComment.references ?? []);\n\t\t\t\tconst list = (editingComment.attachments ?? []).filter(\n\t\t\t\t\t\t(a): a is NonNullable<typeof a> => !!a,\n\t\t\t\t);\n\t\t\t\tattachmentUpload.setAttachments(list);\n\t\t\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t}, [editingComment?.id]);\n\n\t\t// Surface server-side errors\n\t\tuseEffect(() => {\n\t\t\t\tif (errors?.content) {\n\t\t\t\t\t\tsetContentError(errors.content);\n\t\t\t\t}\n\t\t}, [errors]);\n\n\t\tconst handleSubmit = (event?: React.FormEvent) => {\n\t\t\t\tevent?.preventDefault();\n\t\t\t\tif (submitting || attachmentUpload.isUploading) return;\n\t\t\t\tconst html = editorRef.current?.getHTML() ?? body;\n\t\t\t\tif (!hasMeaningfulContent(html)) {\n\t\t\t\t\t\tsetContentError(strings.invalidContent);\n\t\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsetContentError(null);\n\n\t\t\t\tconst values: CommentFormValues = {\n\t\t\t\t\t\tcontent: html,\n\t\t\t\t\t\tcommentableId: context.id,\n\t\t\t\t\t\tcommentableType: context.type,\n\t\t\t\t\t\tmoduleKey: context.moduleKey,\n\t\t\t\t\t\tcontentType: 'html',\n\t\t\t\t\t\treferences: mentions.mentions,\n\t\t\t\t\t\tattachments: attachmentUpload.uploadedAttachments,\n\t\t\t\t\t\treplyToId: replyingTo?.commentId ?? initialValues?.replyToId,\n\t\t\t\t\t\teditingId: editingComment?.id,\n\t\t\t\t};\n\n\t\t\t\tonSubmit(values);\n\t\t};\n\n\t\tconst fileInputRef = useRef<HTMLInputElement>(null);\n\t\tconst handleAttachmentClick = () => fileInputRef.current?.click();\n\t\tconst handleFiles = (files: FileList | null) => {\n\t\t\t\tif (!files) return;\n\t\t\t\tattachmentUpload.addFiles(files);\n\t\t};\n\n\t\tconst hasAttachments = attachmentUpload.attachments.length > 0;\n\t\tconst isEditing = !!editingComment;\n\t\tconst isReplying = !isEditing && !!replyingTo;\n\n\t\tconst submitLabel = submitting\n\t\t\t\t? strings.composerSubmitting\n\t\t\t\t: isEditing\n\t\t\t\t\t? strings.composerSave\n\t\t\t\t\t: strings.composerSubmit;\n\n\t\tconst eyebrow: ReactNode = isEditing ? (\n\t\t\t\t<ComposerEyebrow\n\t\t\t\t\t\tlabel={strings.composerEditingEyebrow}\n\t\t\t\t\t\tcloseLabel={strings.composerCancel}\n\t\t\t\t\t\tonClose={onCancel}\n\t\t\t\t/>\n\t\t) : isReplying ? (\n\t\t\t\t<ComposerEyebrow\n\t\t\t\t\t\tlabel={makeReplyEyebrow(\n\t\t\t\t\t\t\t\tstrings.composerReplyingEyebrow,\n\t\t\t\t\t\t\t\treplyingTo.authorName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tcloseLabel={strings.composerCancel}\n\t\t\t\t\t\tonClose={onCancel}\n\t\t\t\t/>\n\t\t) : null;\n\n\t\tconst extraToolbarItems = useMemo<ReadonlyArray<RichTextEditorToolbarItem>>(() => {\n\t\t\t\tconst items: RichTextEditorToolbarItem[] = [];\n\t\t\t\tif (resources && Object.keys(resources).length > 0) {\n\t\t\t\t\t\titems.push({\n\t\t\t\t\t\t\t\tid: 'reference',\n\t\t\t\t\t\t\t\ticon: AtSign,\n\t\t\t\t\t\t\t\tlabel: strings.composerReferenceLabel,\n\t\t\t\t\t\t\t\tonClick: () => mentions.setPickerOpen(true),\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (attachmentsConfig?.onUpload && !attachmentsConfig.disabled) {\n\t\t\t\t\t\titems.push({\n\t\t\t\t\t\t\t\tid: 'attachment',\n\t\t\t\t\t\t\t\ticon: Paperclip,\n\t\t\t\t\t\t\t\tlabel: strings.composerAttachmentLabel,\n\t\t\t\t\t\t\t\tonClick: handleAttachmentClick,\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn items;\n\t\t\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t}, [\n\t\t\t\tresources,\n\t\t\t\tattachmentsConfig?.onUpload,\n\t\t\t\tattachmentsConfig?.disabled,\n\t\t\t\tstrings.composerReferenceLabel,\n\t\t\t\tstrings.composerAttachmentLabel,\n\t\t]);\n\n\t\tif (!canComment) return null;\n\n\t\tconst submitButton = (\n\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => handleSubmit()}\n\t\t\t\t\t\tdisabled={submitting || attachmentUpload.isUploading}\n\t\t\t\t\t\ticon={submitting ? Loader2 : Send}\n\t\t\t\t>\n\t\t\t\t\t\t{submitLabel}\n\t\t\t\t</Button>\n\t\t);\n\n\t\tconst cancelButton = (isEditing || isReplying || onCancel) ? (\n\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\tonClick={onCancel}\n\t\t\t\t\t\tdisabled={submitting}\n\t\t\t\t>\n\t\t\t\t\t\t{strings.composerCancel}\n\t\t\t\t</Button>\n\t\t) : null;\n\n\t\t// Mentions live as inline `<span class=\"rsc-mention\" contenteditable=\"false\">`\n\t\t// chips inside the editor body — they're visible, dismissible (single\n\t\t// backspace deletes the whole span), and the HTML→mentions sync keeps\n\t\t// `mentions.mentions` aligned automatically. Rendering them again as a\n\t\t// chip-list below the editor was redundant and confusing.\n\n\t\tconst attachmentChips = hasAttachments ? (\n\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\">\n\t\t\t\t\t\t{attachmentUpload.attachments.map((attachment) => (\n\t\t\t\t\t\t\t\t<CommentAttachmentChip\n\t\t\t\t\t\t\t\t\t\tkey={attachment.id}\n\t\t\t\t\t\t\t\t\t\tattachment={attachment}\n\t\t\t\t\t\t\t\t\t\teditable\n\t\t\t\t\t\t\t\t\t\tonRemove={attachmentUpload.removeAttachment}\n\t\t\t\t\t\t\t\t\t\tonRetry={attachmentUpload.retryAttachment}\n\t\t\t\t\t\t\t\t\t\tstrings={stringsProp}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t</Stack>\n\t\t) : null;\n\n\t\tconst footerSlot = hasAttachments ? attachmentChips : null;\n\n\t\tconst trailingSubmit =\n\t\t\t\tinlineSubmit !== false && !isEditing && !isReplying\n\t\t\t\t\t\t? submitButton\n\t\t\t\t\t\t: null;\n\t\tconst showFooterRow = inlineSubmit === false || isEditing || isReplying;\n\n\t\treturn (\n\t\t<Stack render={<form />} gap=\"md\" onSubmit={handleSubmit} className=\"comment-composer--component\">\n\t\t\t\t\t\t{eyebrow}\n\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tref={fileInputRef}\n\t\t\t\t\t\t\t\ttype=\"file\"\n\t\t\t\t\t\t\t\tmultiple\n\t\t\t\t\t\t\t\thidden\n\t\t\t\t\t\t\t\taccept={attachmentsConfig?.accept}\n\t\t\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\t\t\t\thandleFiles(e.target.files);\n\t\t\t\t\t\t\t\t\t\te.target.value = '';\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t{/* Manual button-click flow: regular popover anchored to the\n\t\t\t\t\t\t\t\thidden trigger. The inline-trigger flow uses the panel\n\t\t\t\t\t\t\t\trendered below — no focus stealing while the user types. */}\n\t\t\t\t\t\t{!mentions.triggerActive && (\n\t\t\t\t\t\t\t\t<Popover open={mentions.pickerOpen} onOpenChange={mentions.setPickerOpen}>\n\t\t\t\t\t\t\t\t\t\t<PopoverTrigger\n\t\t\t\t\t\t\t\t\t\t\t\trender={\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\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=\"sr-only\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttabIndex={-1}\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{strings.composerReferenceLabel}\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/>\n\t\t\t\t\t\t\t\t\t\t<MentionPicker\n\t\t\t\t\t\t\t\t\t\t\t\topen={mentions.pickerOpen}\n\t\t\t\t\t\t\t\t\t\t\t\tactiveKind={mentions.activeKind}\n\t\t\t\t\t\t\t\t\t\t\t\tsetActiveKind={(kind) => { mentions.setActiveKind(kind); mentions.setManualKindOverride(true); }}\n\t\t\t\t\t\t\t\t\t\t\t\tkinds={mentions.kinds}\n\t\t\t\t\t\t\t\t\t\t\t\tresources={resources}\n\t\t\t\t\t\t\t\t\t\t\t\tquery={mentions.query}\n\t\t\t\t\t\t\t\t\t\t\t\tsetQuery={mentions.setQuery}\n\t\t\t\t\t\t\t\t\t\t\t\tsuggestions={mentions.suggestions}\n\t\t\t\t\t\t\t\t\t\t\t\tloading={mentions.isLoading}\n\t\t\t\t\t\t\t\t\t\t\t\tonSelect={mentions.pickSuggestion}\n\t\t\t\t\t\t\t\t\t\t\t\tstrings={{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle: strings.composerReferenceMenuTitle,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsearchPlaceholder: strings.composerReferenceSearchPlaceholder,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tempty: strings.composerReferenceEmpty,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tloading: strings.composerReferenceLoading,\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</Popover>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t<div className=\"comment-composer--editor relative\">\n\t\t\t\t\t\t\t\t<RichTextEditor\n\t\t\t\t\t\t\t\t\t\tref={editorRef}\n\t\t\t\t\t\t\t\t\t\tvalue={body}\n\t\t\t\t\t\t\t\t\t\tonValueChange={(html) => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetBody(html);\n\t\t\t\t\t\t\t\t\t\t\t\t// Sync the draft's mentions list with what's\n\t\t\t\t\t\t\t\t\t\t\t\t// actually present in the HTML — when the user\n\t\t\t\t\t\t\t\t\t\t\t\t// backspaces a chip span out of the body, the\n\t\t\t\t\t\t\t\t\t\t\t\t// chip-list below shrinks too. We merge with\n\t\t\t\t\t\t\t\t\t\t\t\t// the previously-known list so consumer-supplied\n\t\t\t\t\t\t\t\t\t\t\t\t// `href` / `data` payloads survive parsing.\n\t\t\t\t\t\t\t\t\t\t\t\tconst parsed = parseMentionsFromHtml<string>(html);\n\t\t\t\t\t\t\t\t\t\t\t\tconst previous = mentions.mentions;\n\t\t\t\t\t\t\t\t\t\t\t\tconst previousIds = previous.map((m) => m.id).join('|');\n\t\t\t\t\t\t\t\t\t\t\t\tconst currentIds = parsed.map((m) => m.id).join('|');\n\t\t\t\t\t\t\t\t\t\t\t\tif (previousIds !== currentIds) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst byId = new Map(previous.map((m) => [m.id, m]));\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst merged = parsed.map(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(p) => byId.get(p.id) ?? p,\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\tmentions.setMentions(merged);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tplaceholder={placeholder ?? strings.composerPlaceholder}\n\t\t\t\t\t\t\t\t\t\tstrings={{\n\t\t\t\t\t\t\t\t\t\t\t\teditorLabel: placeholder ?? strings.composerPlaceholder,\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tminHeight=\"3rem\"\n\t\t\t\t\t\t\t\t\t\tautoFocus={autoFocus || isEditing || isReplying}\n\t\t\t\t\t\t\t\t\t\textraToolbarItems={extraToolbarItems}\n\t\t\t\t\t\t\t\t\t\ttoolbarTrailing={trailingSubmit}\n\t\t\t\t\t\t\t\t\t\tfooterSlot={footerSlot}\n\t\t\t\t\t\t\t\t\t\tonCaretChange={mentions.handleCaretChange}\n\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t<MentionInlineSuggestions\n\t\t\t\t\t\t\t\t\t\topen={mentions.triggerActive && mentions.pickerOpen}\n\t\t\t\t\t\t\t\t\t\tactiveKind={mentions.activeKind}\n\t\t\t\t\t\t\t\t\t\tsetActiveKind={(kind) => { mentions.setActiveKind(kind); mentions.setManualKindOverride(true); }}\n\t\t\t\t\t\t\t\t\t\tkinds={mentions.kinds}\n\t\t\t\t\t\t\t\t\t\tresources={resources}\n\t\t\t\t\t\t\t\t\t\tquery={mentions.query}\n\t\t\t\t\t\t\t\t\t\tsuggestions={mentions.suggestions}\n\t\t\t\t\t\t\t\t\t\tsuggestionsByKind={mentions.suggestionsByKind}\n\t\t\t\t\t\t\t\t\t\tloading={mentions.isLoading}\n\t\t\t\t\t\t\t\t\t\tonSelect={mentions.pickSuggestion}\n\t\t\t\t\t\t\t\t\t\tstrings={{\n\t\t\t\t\t\t\t\t\t\t\t\ttitle: strings.composerReferenceMenuTitle,\n\t\t\t\t\t\t\t\t\t\t\t\tempty: strings.composerReferenceEmpty,\n\t\t\t\t\t\t\t\t\t\t\t\tloading: strings.composerReferenceLoading,\n\t\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</div>\n\n\t\t\t\t\t\t{contentError && (\n\t\t\t\t\t\t\t\t<Text size=\"xs\" type=\"error\">\n\t\t\t\t\t\t\t\t\t\t{contentError}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{showFooterRow && (\n\t\t\t\t\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" justify=\"end\" gap=\"md\" className=\"comment-composer--footer-actions\">\n\t\t\t\t\t\t\t\t\t\t{cancelButton}\n\t\t\t\t\t\t\t\t\t\t{submitButton}\n\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t)}\n\t\t</Stack>\n\t\t);\n});\n\n/** Preserve the consumer's resource-kind union through the forwarded-ref boundary. */\nexport const CommentComposer = CommentComposerBase as <\n\t\tTResource extends string = string,\n>(\n\t\tprops: CommentComposerProps<TResource> & RefAttributes<CommentComposerHandle>,\n) => ReactElement | null;\n\n/* ------------------------------------------------------------------ */\n/* ComposerEyebrow */\n/* ------------------------------------------------------------------ */\n\nfunction ComposerEyebrow({\n\t\tlabel,\n\t\tcloseLabel,\n\t\tonClose,\n}: {\n\t\tlabel: string;\n\t\tcloseLabel: string;\n\t\tonClose?: () => void;\n}) {\n\t\treturn (\n\t\t\t\t<div className=\"bg-muted/40 ring-border/60 flex items-center justify-between rounded px-2.5 py-1.5 ring-1 ring-inset\">\n\t\t\t\t\t\t<DisplayLabel>\n\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t\t{onClose ? (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\t\t\t\tclassName=\"size-icon rounded p-0 text-muted-foreground hover:text-foreground\"\n\t\t\t\t\t\t\t\t\t\taria-label={closeLabel}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<X className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t);\n}\n\n/** Helper export for templated reply eyebrow. */\nexport function makeReplyEyebrow(template: string, name?: string): string {\n\t\treturn interpolateString(template, { name }, { missing: 'empty' });\n}\n","/**\n * CommentEmpty — default empty state for the timeline. Replaceable via\n * the `emptySlot` prop on `<Comments>` / `<CommentTimeline>`.\n */\nimport { MessageCircle } from 'lucide-react';\nimport type { FC, ReactNode } from 'react';\n\nimport { EmptyState } from '../../../blocks/data-display';\nimport type { StringsProp } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { useResolvedStrings } from '../comments-provider';\nimport type { CommentsStrings } from '../comments.strings';\n\nexport interface CommentEmptyProps {\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<CommentsStrings>;\n\t/** Leading glyph. */\n\ticon?: ReactNode;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nexport const CommentEmpty: FC<CommentEmptyProps> = ({\n\tstrings: stringsProp,\n\ticon,\n\tclassName,\n}) => {\n\tconst strings = useResolvedStrings(stringsProp);\n\n\treturn (\n\t\t<EmptyState\n\t\t\ttitle={strings.empty}\n\t\t\tdescription={strings.emptyHint || false}\n\t\t\tmedia={icon ?? <MessageCircle className=\"size-icon\" aria-hidden=\"true\" />}\n\t\t\tmediaVariant=\"icon-soft\"\n\t\t\tpadding=\"md\"\n\t\t\tclassName={cn('comment-empty--component', className)}\n\t\t/>\n\t);\n};\n","import type { ReactNode } from 'react';\nimport { Fragment, createElement } from 'react';\n\nimport { Text } from '../../../typography';\nimport { sanitizeHtml } from '../../../../lib/sanitize-html';\nimport { contentTypographyClassName } from '../../../typography/content-typography';\n\nimport { RichText } from '../../../typography/rich-text';\nimport { MentionContent } from '../../mentions';\n\nimport type {\n\tCommentData,\n\tCommentUser,\n\tCommentsConfig,\n\tCommentsSlots,\n} from '../comments.types';\n\nexport interface CommentContentProps<\n\tTUser extends CommentUser = CommentUser,\n\tTMeta = unknown,\n\tTResource extends string = string,\n> {\n\t/** The comment to render. */\n\tcomment: CommentData<TUser, TMeta, TResource>;\n\t/** Resource registry — passed through to `<MentionContent>`. */\n\tresources?: CommentsConfig<TUser, TMeta, TResource>['resources'];\n\t/** Replaces the default rendering of an inline reference. */\n\trenderReference?: CommentsSlots<\n\t\tTUser,\n\t\tTMeta,\n\t\tTResource\n\t>['renderReference'];\n\t/** Optional sanitizer override. The package safe allowlist is the default. */\n\tsanitizer?: (html: string) => string;\n}\n\nexport function CommentContent<\n\tTUser extends CommentUser = CommentUser,\n\tTMeta = unknown,\n\tTResource extends string = string,\n>(\n\tprops: CommentContentProps<TUser, TMeta, TResource>,\n): ReactNode {\n\tconst { comment, resources, renderReference, sanitizer } = props;\n\tconst contentType =\n\t\tcomment.contentType ??\n\t\t(comment as Record<string, unknown>).content_type ??\n\t\t'text';\n\n\tif (contentType === 'rich') {\n\t\tconst richContent = renderRichContent(comment.content);\n\t\treturn richContent ? (\n\t\t\t<div className=\"comment-content--component\">{richContent}</div>\n\t\t) : null;\n\t}\n\n\tif (contentType === 'html') {\n\t\treturn (\n\t\t\t<div className=\"comment-content--component\">\n\t\t\t\t<MentionContent<TResource>\n\t\t\t\t\thtml={comment.content ?? ''}\n\t\t\t\t\tmentions={comment.references}\n\t\t\t\t\tresources={resources}\n\t\t\t\t\trenderMention={renderReference}\n\t\t\t\t\tsanitizer={sanitizer}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst plainContent = decodeQuotedString(comment.content ?? '');\n\n\treturn (\n\t\t<Text className=\"comment-content--component whitespace-pre-line\">\n\t\t\t{plainContent}\n\t\t</Text>\n\t);\n}\n\n/* ------------------------------------------------------------------ */\n/* Rich-block renderer for Editor.js-style structured content */\n/* ------------------------------------------------------------------ */\n\nfunction renderRichContent(rawContent: string | null | undefined): ReactNode {\n\tif (!rawContent) return null;\n\n\ttry {\n\t\tconst parsed = JSON.parse(rawContent) as {\n\t\t\tblocks?: Array<{ id?: string; type: string; data?: Record<string, unknown> }>;\n\t\t};\n\n\t\tif (!parsed || !Array.isArray(parsed.blocks) || parsed.blocks.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn (\n\t\t\t<Text tag=\"div\" className={contentTypographyClassName}>\n\t\t\t\t{parsed.blocks.map((block, index) => (\n\t\t\t\t\t<Fragment key={block.id ?? `${block.type}-${index}`}>\n\t\t\t\t\t\t{renderRichBlock(block)}\n\t\t\t\t\t</Fragment>\n\t\t\t\t))}\n\t\t\t</Text>\n\t\t);\n\t} catch {\n\t\tconst decoded = decodeQuotedString(rawContent);\n\t\treturn (\n\t\t\t<Text className=\"whitespace-pre-line\">\n\t\t\t\t{decoded}\n\t\t\t</Text>\n\t\t);\n\t}\n}\n\nfunction renderRichBlock(block: { type: string; data?: Record<string, unknown> }): ReactNode {\n\tconst data = block.data ?? {};\n\n\tswitch (block.type) {\n\t\tcase 'paragraph': {\n\t\t\tconst raw = String(data.text ?? '').trim();\n\t\t\tif (!raw) return null;\n\t\t\tconst html = sanitizeHtml(raw);\n\t\t\treturn html ? <p dangerouslySetInnerHTML={{ __html: html }} /> : null;\n\t\t}\n\t\tcase 'header': {\n\t\t\tconst text = stripHtml(String(data.text ?? ''));\n\t\t\tconst level = Number(data.level ?? 3);\n\t\t\tif (!text) return null;\n\t\t\tconst safeLevel = Math.min(Math.max(level, 1), 6);\n\t\t\treturn createElement(\n\t\t\t\t`h${safeLevel}`,\n\t\t\t\tnull,\n\t\t\t\ttext,\n\t\t\t);\n\t\t}\n\t\tcase 'list': {\n\t\t\tconst items = Array.isArray(data.items) ? data.items : [];\n\t\t\tconst sanitizedItems = items\n\t\t\t\t.map((item) => stripHtml(String(item ?? '')))\n\t\t\t\t.filter((item) => item.length > 0);\n\n\t\t\tif (sanitizedItems.length === 0) return null;\n\n\t\t\tif (data.style === 'ordered') {\n\t\t\t\treturn (\n\t\t\t\t\t<ol>\n\t\t\t\t\t\t{sanitizedItems.map((item, index) => (\n\t\t\t\t\t\t\t<li key={`${item}-${index}`}>\n\t\t\t\t\t\t\t\t<Text tag=\"span\">{item}</Text>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ol>\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn (\n\t\t\t\t<ul>\n\t\t\t\t\t{sanitizedItems.map((item) => (\n\t\t\t\t\t\t<li key={item}>\n\t\t\t\t\t\t\t<Text tag=\"span\">{item}</Text>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t);\n\t\t}\n\t\tcase 'quote': {\n\t\t\tconst text = String(data.text ?? '').trim();\n\t\t\tif (!text) return null;\n\t\t\tconst caption = stripHtml(String(data.caption ?? ''));\n\t\t\treturn (\n\t\t\t\t<blockquote className=\"italic\">\n\t\t\t\t\t<RichText tag=\"div\" html={text} type=\"secondary\" />\n\t\t\t\t\t{caption.length > 0 && (\n\t\t\t\t\t\t<cite className=\"mt-1 block not-italic\">\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"opacity-80\">\n\t\t\t\t\t\t\t\t— {caption}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t</cite>\n\t\t\t\t\t)}\n\t\t\t\t</blockquote>\n\t\t\t);\n\t\t}\n\t\tcase 'delimiter':\n\t\t\treturn (\n\t\t\t\t<hr\n\t\t\t\t\tclassName=\"border-dashed\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t/>\n\t\t\t);\n\t\tdefault: {\n\t\t\tconst text = stripHtml(String(data.text ?? ''));\n\t\t\tif (!text) return null;\n\t\t\treturn <p className=\"whitespace-pre-line\">{text}</p>;\n\t\t}\n\t}\n}\n\nfunction stripHtml(value: string): string {\n\treturn value.replace(/<[^>]*>/g, '').trim();\n}\n\nfunction decodeQuotedString(value: string | null | undefined): string {\n\tif (typeof value !== 'string') return '';\n\tconst trimmed = value.trim();\n\tif (trimmed === '') return '';\n\tif (trimmed.startsWith('{') || trimmed.startsWith('[')) return trimmed;\n\ttry {\n\t\tconst parsed = JSON.parse(trimmed);\n\t\tif (typeof parsed === 'string') return parsed;\n\t} catch {\n\t\t// ignore\n\t}\n\tif (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n\t\treturn trimmed.slice(1, -1);\n\t}\n\treturn trimmed;\n}\n","import {\n\tCornerDownRight,\n\tPencil,\n\tPin,\n\tSmile,\n\tTrash2,\n} from 'lucide-react';\nimport type { FC } from 'react';\nimport { memo, useCallback, useMemo, useState } from 'react';\n\nimport {\n\tAvatar,\n\tAvatarFallback,\n\tAvatarImage,\n} from '../../../base/avatar';\nimport { Badge } from '../../../base/badge';\nimport { Button } from '../../../base/buttons';\nimport { ConfirmDialog, useOverlayVisibility } from '../../overlays';\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from '../../../base/display/tooltip';\nimport { Number as NumberValue, RelativeTime } from '../../../primitives';\nimport { Text } from '../../../typography';\nimport { Stack } from '../../../base/structure';\nimport { cn } from '../../../../lib/utils';\nimport { interpolateString } from '../../../../lib/strings';\nimport { defaultCommentsStrings } from '../comments.strings';\n\nimport {\n\tuseResolvedAccessors,\n\tuseResolvedStrings,\n} from '../comments-provider';\nimport type {\n\tCommentAttachment,\n\tCommentItemProps,\n\tCommentUser,\n} from '../comments.types';\nimport { CommentAttachmentChip } from './comment-attachment-chip';\nimport { CommentContent } from './comment-content';\n\nconst FALLBACK_INITIAL = '?';\n\nconst defaultGetMediaUrl = (m: CommentAttachment | null | undefined) => m?.url;\nconst defaultGetMediaName = (m: CommentAttachment | null | undefined) => m?.name;\nconst defaultGetStatusLabel = (s: string) =>\n\ts.charAt(0).toUpperCase() + s.slice(1).replace(/_/g, ' ');\n\nexport const CommentItem = memo(function CommentItem<\n\tTUser extends CommentUser = CommentUser,\n\tTMeta = unknown,\n\tTResource extends string = string,\n>({\n\tcomment,\n\tcanModerate,\n\tonDelete,\n\tonAttachmentRemove,\n\tonEdit,\n\tonPinToggle,\n\tonReact,\n\tonReply,\n\tallowReactions: allowReactionsProp,\n\tallowReplies: allowRepliesProp,\n\tsanitizer,\n\tstrings: stringsProp,\n\tgetMediaUrl,\n\tgetMediaName,\n\tgetStatusLabel,\n\tformatRelativeTime,\n\tresources,\n\trenderAttachment,\n\trenderReference,\n}: CommentItemProps<TUser, TMeta, TResource>) {\n\tconst strings = useResolvedStrings(stringsProp);\n\tconst allowReactions = allowReactionsProp ?? true;\n\tconst allowReplies = allowRepliesProp ?? true;\n\tconst accessors = useResolvedAccessors({\n\t\tgetMediaUrl,\n\t\tgetMediaName,\n\t\tgetStatusLabel,\n\t\tformatRelativeTime,\n\t});\n\n\tconst resolvedGetMediaUrl = accessors.getMediaUrl ?? defaultGetMediaUrl;\n\tconst resolvedGetMediaName = accessors.getMediaName ?? defaultGetMediaName;\n\tconst resolvedGetStatusLabel =\n\t\taccessors.getStatusLabel ?? defaultGetStatusLabel;\n\tconst resolvedFormatRelativeTime = accessors.formatRelativeTime;\n\n\tconst authorName = comment.user?.name ?? strings.fallbackAuthor;\n\tconst avatarUrl = comment.user?.avatar ?? undefined;\n\n\tconst fallbackInitial = useMemo(() => {\n\t\tif (!authorName) return FALLBACK_INITIAL;\n\t\tconst trimmed = authorName.trim();\n\t\treturn trimmed === ''\n\t\t\t? FALLBACK_INITIAL\n\t\t\t: trimmed.charAt(0).toUpperCase();\n\t}, [authorName]);\n\n\tconst tagList = useMemo(() => {\n\t\tif (Array.isArray(comment.tagsArray)) {\n\t\t\treturn comment.tagsArray.filter(\n\t\t\t\t(tag): tag is string => typeof tag === 'string',\n\t\t\t);\n\t\t}\n\t\tif (comment.tagsArray && typeof comment.tagsArray === 'object') {\n\t\t\treturn Object.values(comment.tagsArray).filter(\n\t\t\t\t(value): value is string => typeof value === 'string',\n\t\t\t);\n\t\t}\n\t\treturn [];\n\t}, [comment.tagsArray]);\n\n\tconst attachments = useMemo(() => {\n\t\tconst list = comment.attachments ?? [];\n\t\treturn list.filter(\n\t\t\t(a): a is CommentAttachment => !!a && typeof a === 'object',\n\t\t);\n\t}, [comment.attachments]);\n\n\tconst reactions = allowReactions ? (comment.reactions ?? []) : [];\n\n\tconst isPinned = comment.isPinned === true;\n\tconst isEdited = comment.isEdited === true;\n\tconst showStatus = comment.status && comment.status !== 'active';\n\tconst statusLabel =\n\t\tshowStatus && comment.status ? resolvedGetStatusLabel(comment.status) : null;\n\tconst canDeleteComment =\n\t\tcomment.canDelete === true || canModerate === true;\n\tconst canEditComment = comment.canEdit === true || canModerate === true;\n\tconst canReply = !!allowReplies && !!onReply && !!comment.id;\n\tconst canReact = !!allowReactions && !!onReact && !!comment.id;\n\tconst canPin = !!onPinToggle && !!canModerate;\n\tconst canEdit = !!canEditComment && !!onEdit && !!comment.id;\n\tconst canDelete = !!canDeleteComment && !!onDelete && !!comment.id;\n\tconst hasActions = canReply || canReact || canPin || canEdit || canDelete;\n\n\tconst attachmentConfirm = useOverlayVisibility();\n\tconst [pendingAttachmentId, setPendingAttachmentId] = useState<string | null>(null);\n\tconst requestAttachmentRemoval = useCallback(\n\t\t(attachmentId: string) => {\n\t\t\tsetPendingAttachmentId(attachmentId);\n\t\t\tattachmentConfirm.show();\n\t\t},\n\t\t[attachmentConfirm],\n\t);\n\n\tconst hasAttachments = attachments.length > 0;\n\n\treturn (\n\t\t<article\n\t\t\tclassName={cn(\n\t\t\t\t'comment-item--component group relative overflow-hidden rounded-radius border transition-colors',\n\t\t\t\t'border-border/60 bg-card hover:bg-muted/30 px-3 py-2.5',\n\t\t\t)}\n\t\t\tdata-comment-id={comment.id}\n\t\t>\n\t\t\t<Stack direction=\"horizontal\" align=\"start\" gap=\"lg\" className=\"min-w-0\">\n\t\t\t\t<Avatar className=\"mt-0.5 size-avatar shrink-0\">\n\t\t\t\t\t{!!avatarUrl && (\n\t\t\t\t\t\t<AvatarImage src={avatarUrl} alt={authorName} />\n\t\t\t\t\t)}\n\t\t\t\t\t<AvatarFallback className=\"bg-muted text-muted-foreground text-xs font-medium\">\n\t\t\t\t\t\t{fallbackInitial}\n\t\t\t\t\t</AvatarFallback>\n\t\t\t\t</Avatar>\n\n\t\t\t\t<div className=\"comment-item--body min-w-0 flex-1\">\n\t\t\t\t\t<Stack direction=\"horizontal\" align=\"baseline\" gap=\"md\" className=\"min-w-0\">\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\tweight=\"semibold\"\n\t\t\t\t\t\t\tclassName=\"truncate\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{authorName}\n\t\t\t\t\t\t</Text>\n\n\t\t\t\t\t\t{!!isPinned && (\n\t\t\t\t\t\t\t<TooltipProvider delayDuration={0}>\n\t\t\t\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t\t\t\t<TooltipTrigger render={<span className=\"inline-flex shrink-0 self-center\" />}>\n\t\t\t\t\t\t\t\t\t\t<Pin className=\"text-warning size-icon-sm\" aria-hidden />\n\t\t\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t\t\t<TooltipContent\n\t\t\t\t\t\t\t\t\t\tside=\"top\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"text-xs\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{strings.pinned}\n\t\t\t\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t</TooltipProvider>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t<RelativeTime\n\t\t\t\t\t\t\tvalue={comment.createdAt}\n\t\t\t\t\t\t\tformatRelativeTime={resolvedFormatRelativeTime}\n\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\tclassName=\"shrink-0 tabular-nums\"\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t{!!isEdited && (\n\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{strings.edited}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{!!showStatus && !!statusLabel && (\n\t\t\t\t\t\t\t<Badge size=\"sm\" tone=\"secondary\" className=\"self-center\">\n\t\t\t\t\t\t\t\t{statusLabel}\n\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\n\t\t\t\t\t<div className=\"mt-1 leading-relaxed\">\n\t\t\t\t\t\t<CommentContent\n\t\t\t\t\t\t\tcomment={comment}\n\t\t\t\t\t\t\tresources={resources}\n\t\t\t\t\t\t\trenderReference={renderReference}\n\t\t\t\t\t\t\tsanitizer={sanitizer}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{tagList.length > 0 && (\n\t\t\t\t\t\t<div className=\"mt-space-md flex flex-wrap gap-space-sm\">\n\t\t\t\t\t\t\t{tagList.map((tag) => (\n\t\t\t\t\t\t\t\t<Badge key={tag} size=\"sm\" tone=\"secondary\">\n\t\t\t\t\t\t\t\t\t{tag}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{hasAttachments && (\n\t\t\t\t\t\t<div className=\"mt-space-md flex flex-wrap gap-space-sm\">\n\t\t\t\t\t\t\t{attachments.map((attachment) => {\n\t\t\t\t\t\t\t\tif (renderAttachment) {\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<div key={attachment.id ?? attachment.name}>\n\t\t\t\t\t\t\t\t\t\t\t{renderAttachment(attachment)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\t * Posted attachments were read-only: no control, no\n\t\t\t\t\t\t\t\t * callback, nothing to remove. The control appears only\n\t\t\t\t\t\t\t\t * when the consumer supplies `onAttachmentRemove` and the\n\t\t\t\t\t\t\t\t * viewer may edit the comment, and detaching a published\n\t\t\t\t\t\t\t\t * file is irreversible, so it asks first.\n\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\tconst canRemoveAttachment =\n\t\t\t\t\t\t\t\t\t!!onAttachmentRemove && !!attachment.id && canDeleteComment;\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<CommentAttachmentChip\n\t\t\t\t\t\t\t\t\t\tkey={attachment.id ?? attachment.name}\n\t\t\t\t\t\t\t\t\t\tattachment={attachment}\n\t\t\t\t\t\t\t\t\t\teditable={canRemoveAttachment}\n\t\t\t\t\t\t\t\t\t\tonRemove={\n\t\t\t\t\t\t\t\t\t\t\tcanRemoveAttachment\n\t\t\t\t\t\t\t\t\t\t\t\t? () => requestAttachmentRemoval(attachment.id as string)\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\taccessors={{\n\t\t\t\t\t\t\t\t\t\t\tgetMediaUrl: resolvedGetMediaUrl,\n\t\t\t\t\t\t\t\t\t\t\tgetMediaName: resolvedGetMediaName,\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tstrings={stringsProp}\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})}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{reactions.length > 0 && (\n\t\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"xs\" className=\"mt-space-md\">\n\t\t\t\t\t\t\t{reactions.map((reaction) => (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tkey={reaction.emoji}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\taria-label={interpolateString(strings.reactionLabel ?? defaultCommentsStrings.reactionLabel!, { emoji: reaction.emoji, count: reaction.count })}\n\t\t\t\t\t\t\t\t\taria-pressed={reaction.mine ?? false}\n\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\tonReact && comment.id\n\t\t\t\t\t\t\t\t\t\t\t? onReact(comment.id, reaction.emoji)\n\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\ttitle={reaction.users?.join(', ')}\n\t\t\t\t\t\t\t\t\tclassName=\"h-auto rounded-full p-0\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\ttone={reaction.mine ? 'primary' : 'secondary'}\n\t\t\t\t\t\t\t\t\t\tclassName=\"cursor-pointer transition-colors hover:opacity-90\"\n\t\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\ttag=\"span\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\t\t\t\t\t\tlineHeight=\"none\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-inherit\"\n\t\t\t\t\t\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{reaction.emoji}\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t<NumberValue\n\t\t\t\t\t\t\t\t\t\t\tvalue={reaction.count}\n\t\t\t\t\t\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\t\t\t\t\t\talign=\"left\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"tabular-nums text-current\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t)}\n\n\t\t\t\t{/* Actions own a separate row so they never reserve message width. */}\n\t\t\t\t{hasActions && <div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'comment-item--actions relative mt-space-md ms-auto w-fit max-w-full flex-wrap opacity-100 transition-opacity',\n\t\t\t\t\t\t'group-hover:opacity-100 focus-within:opacity-100',\n\t\t\t\t\t\t'inline-flex items-center gap-space-2xs rounded-radius-md bg-card/95 shadow-sm ring-1 ring-border/70',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{canReply && (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\tcomment.id && onReply(comment.id)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttitle={strings.replyLabel}\n\t\t\t\t\t\t\taria-label={strings.replyLabel}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<CornerDownRight className=\"size-icon-md\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t\t{canReact && (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\tcomment.id && onReact(comment.id, '👍')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttitle={strings.addReactionLabel}\n\t\t\t\t\t\t\taria-label={strings.addReactionLabel}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Smile className=\"size-icon-md\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t\t{canPin && (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\tonClick={() => onPinToggle(comment)}\n\t\t\t\t\t\t\ttitle={isPinned ? strings.unpinLabel : strings.pinLabel}\n\t\t\t\t\t\t\taria-label={isPinned ? strings.unpinLabel : strings.pinLabel}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Pin\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'size-icon-md',\n\t\t\t\t\t\t\t\t\tisPinned && 'text-warning',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t\t{canEdit && (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\ttitle={strings.editLabel}\n\t\t\t\t\t\t\taria-label={strings.editLabel}\n\t\t\t\t\t\t\tonClick={() => onEdit(comment)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Pencil className=\"size-icon-md\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t\t{canDelete && (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\tclassName=\"hover:bg-destructive/10 hover:text-destructive\"\n\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\tonDelete(comment.id as string)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttitle={strings.deleteLabel}\n\t\t\t\t\t\t\t\taria-label={strings.deleteLabel}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Trash2 className=\"size-icon-md\" />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t)}\n\t\t\t\t</div>}\n\t\t\t\t</div>\n\t\t\t</Stack>\n\t\t\t{!!onAttachmentRemove && (\n\t\t\t\t<ConfirmDialog\n\t\t\t\t\t{...attachmentConfirm.overlayProps}\n\t\t\t\t\tdestructive\n\t\t\t\t\ttitle={strings.confirmRemoveAttachmentTitle}\n\t\t\t\t\tdescription={strings.confirmRemoveAttachmentDescription}\n\t\t\t\t\tstrings={{ confirm: strings.attachmentRemoveLabel }}\n\t\t\t\t\tonConfirm={() => {\n\t\t\t\t\t\tif (pendingAttachmentId && comment.id) {\n\t\t\t\t\t\t\tvoid onAttachmentRemove(comment.id as string, pendingAttachmentId);\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</article>\n\t);\n}) as <\n\tTUser extends CommentUser = CommentUser,\n\tTMeta = unknown,\n\tTResource extends string = string,\n>(\n\tprops: CommentItemProps<TUser, TMeta, TResource>,\n) => ReturnType<FC>;\n","import type { FC } from 'react';\n\nimport { Stack } from '../../../base/structure';\nimport type { CommentTimelineProps, CommentUser } from '../comments.types';\nimport { CommentEmpty } from './comment-empty';\nimport { CommentItem } from './comment-item';\n\nexport const CommentTimeline = function CommentTimeline<\n\tTUser extends CommentUser = CommentUser,\n\tTMeta = unknown,\n\tTResource extends string = string,\n>({\n\tcomments,\n\tcanModerate,\n\tonDelete,\n\tonAttachmentRemove,\n\tonEdit,\n\tonPinToggle,\n\tonReact,\n\tonReply,\n\tallowReactions,\n\tallowReplies,\n\tsanitizer,\n\tstrings: stringsProp,\n\tgetMediaUrl,\n\tgetMediaName,\n\tgetStatusLabel,\n\tformatRelativeTime,\n\tresources,\n\trenderItem,\n\trenderAttachment,\n\trenderReference,\n\temptySlot,\n}: CommentTimelineProps<TUser, TMeta, TResource>) {\n\tif (!comments.length) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{emptySlot ?? <CommentEmpty strings={stringsProp} />}\n\t\t\t</>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Stack gap=\"sm\" className=\"comment-timeline--component\">\n\t\t\t{comments.map((comment, index) => {\n\t\t\t\tconst defaultItem = (\n\t\t\t\t\t<CommentItem<TUser, TMeta, TResource>\n\t\t\t\t\t\tcomment={comment}\n\t\t\t\t\t\tcanModerate={canModerate}\n\t\t\t\t\t\tonDelete={onDelete}\n\t\t\t\t\t\tonAttachmentRemove={onAttachmentRemove}\n\t\t\t\t\t\tonEdit={onEdit}\n\t\t\t\t\t\tonPinToggle={onPinToggle}\n\t\t\t\t\t\tonReact={onReact}\n\t\t\t\t\t\tonReply={onReply}\n\t\t\t\t\t\tallowReactions={allowReactions}\n\t\t\t\t\t\tallowReplies={allowReplies}\n\t\t\t\t\t\tsanitizer={sanitizer}\n\t\t\t\t\t\tstrings={stringsProp}\n\t\t\t\t\t\tgetMediaUrl={getMediaUrl}\n\t\t\t\t\t\tgetMediaName={getMediaName}\n\t\t\t\t\t\tgetStatusLabel={getStatusLabel}\n\t\t\t\t\t\tformatRelativeTime={formatRelativeTime}\n\t\t\t\t\t\tresources={resources}\n\t\t\t\t\t\trenderAttachment={renderAttachment}\n\t\t\t\t\t\trenderReference={renderReference}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\t\tif (renderItem) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={comment.id ?? `comment-${index}`}>\n\t\t\t\t\t\t\t{renderItem({\n\t\t\t\t\t\t\t\tcomment,\n\t\t\t\t\t\t\t\tcanModerate: canModerate ?? false,\n\t\t\t\t\t\t\t\tonDelete,\n\t\t\t\t\t\t\t\tonAttachmentRemove,\n\t\t\t\t\t\t\t\tonEdit,\n\t\t\t\t\t\t\t\tdefaultItem,\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t<div key={comment.id ?? `comment-${index}`}>\n\t\t\t\t\t\t{defaultItem}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t</Stack>\n\t);\n} as <\n\tTUser extends CommentUser = CommentUser,\n\tTMeta = unknown,\n\tTResource extends string = string,\n>(\n\tprops: CommentTimelineProps<TUser, TMeta, TResource>,\n) => ReturnType<FC>;\n","/**\n * Comments — top-level entry for the Comments feature.\n *\n * Composes the composer + timeline + empty state behind a single API.\n * Generic in `<TUser, TMeta, TResource>` so consumers can type their\n * domain (user shape, custom meta payload, resource-kind union).\n *\n * Per-mount wiring (callbacks, resources, accessors) flows as direct\n * props. Library-wide display defaults (composer position, etc.) come\n * from `<UIProvider>` — see `@/lib/ui-provider`. Slots, render-props,\n * and the headless `useComments()` hook cover the composability\n * spectrum.\n *\n * Wrap the feature in `Card` at the call site when card chrome is desired.\n */\nimport { useCallback, useState } from 'react';\n\nimport { Stack } from '../../base/structure';\nimport { ConfirmDialog, useOverlayVisibility } from '../overlays';\nimport { Text } from '../../typography';\nimport { useCommentsConfig as useCommentsUIDefaults } from '../../../lib/ui-provider';\n\nimport { useResolvedStrings } from './comments-provider';\nimport type { CommentUser, CommentsProps } from './comments.types';\nimport { useComments } from './hooks/use-comments';\nimport { CommentComposer } from './partials/comment-composer';\nimport { CommentEmpty } from './partials/comment-empty';\nimport { CommentTimeline } from './partials/comment-timeline';\n\nimport { cn } from '../../../lib/utils';\nexport function Comments<\n\tTUser extends CommentUser = CommentUser,\n\tTMeta = unknown,\n\tTResource extends string = string,\n>(props: CommentsProps<TUser, TMeta, TResource>) {\n\tconst ui = useCommentsUIDefaults();\n\n\tconst composerPosition =\n\t\tprops.composerPosition ?? ui.composerPosition ?? 'top';\n\tconst maxAttachments = props.maxAttachments ?? 5;\n\tconst allowAttachments = props.allowAttachments ?? true;\n\tconst allowReactions = props.allowReactions ?? true;\n\tconst allowReplies = props.allowReplies ?? true;\n\n\tconst canComment = props.canComment ?? false;\n\tconst canModerate = props.canModerate ?? false;\n\n\tconst onPinToggle = props.onPinToggle;\n\n\tconst resources = props.resources;\n\tconst attachments = props.attachments;\n\n\tconst strings = useResolvedStrings(props.strings);\n\tconst title = props.title === undefined ? strings.title : props.title;\n\n\t/*\n\t * Deleting a comment is irreversible and the trigger is a bare icon button\n\t * next to Edit, so the confirmation is the component's job rather than every\n\t * consumer's. `confirmDelete={false}` opts out for apps that already confirm\n\t * upstream — otherwise they would ask twice.\n\t */\n\tconst confirmDelete = props.confirmDelete ?? true;\n\tconst deleteConfirm = useOverlayVisibility();\n\tconst [pendingDeleteId, setPendingDeleteId] = useState<string | null>(null);\n\n\tconst commentsState = useComments<TUser, TMeta, TResource>({\n\t\tonSubmit: props.onSubmit,\n\t\tonUpdate: props.onUpdate,\n\t\tonDelete: props.onDelete,\n\t\tonAfterMutate: props.onAfterMutate,\n\t\tonError: props.onError,\n\t});\n\n\tconst requestDelete = useCallback(\n\t\t(id: string) => {\n\t\t\tif (!confirmDelete) {\n\t\t\t\tvoid commentsState.deleteComment(id);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetPendingDeleteId(id);\n\t\t\tdeleteConfirm.show();\n\t\t},\n\t\t[confirmDelete, commentsState, deleteConfirm],\n\t);\n\tconst startReply = commentsState.startReply;\n\tconst comments = props.comments;\n\tconst onReply = props.onReply;\n\n\tconst handleReply = useCallback(\n\t\t(commentId: string) => {\n\t\t\tconst comment = comments.find((item) => item.id === commentId);\n\t\t\tif (comment) startReply(comment);\n\t\t\tonReply?.(commentId);\n\t\t},\n\t\t[comments, onReply, startReply],\n\t);\n\n\tconst editingComment =\n\t\tcommentsState.composerMode.kind === 'editing'\n\t\t\t? commentsState.composerMode.comment\n\t\t\t: undefined;\n\tconst replyingTo =\n\t\tcommentsState.composerMode.kind === 'replying'\n\t\t\t? {\n\t\t\t\t\tcommentId: commentsState.composerMode.commentId,\n\t\t\t\t\tauthorName: commentsState.composerMode.authorName,\n\t\t\t\t}\n\t\t\t: undefined;\n\n\tconst composer = props.composerSlot ?? (\n\t\tcanComment ? (\n\t\t\t<CommentComposer<TResource>\n\t\t\t\tcontext={props.context}\n\t\t\t\tcanComment={canComment}\n\t\t\t\tsubmitting={commentsState.isSubmitting}\n\t\t\t\terrors={commentsState.formErrors}\n\t\t\t\tresetKey={commentsState.resetKey}\n\t\t\t\teditingComment={editingComment}\n\t\t\t\treplyingTo={replyingTo}\n\t\t\t\tonCancel={\n\t\t\t\t\tcommentsState.composerMode.kind === 'idle'\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: commentsState.cancelComposerMode\n\t\t\t\t}\n\t\t\t\tonSubmit={commentsState.submit}\n\t\t\t\tstrings={props.strings}\n\t\t\t\tresources={resources}\n\t\t\t\tonResourceSearch={props.onResourceSearch}\n\t\t\t\tattachments={attachments}\n\t\t\t\tmaxAttachments={maxAttachments}\n\t\t\t\tallowAttachments={allowAttachments}\n\t\t\t/>\n\t\t) : null\n\t);\n\n\tconst timeline = (\n\t\t<CommentTimeline<TUser, TMeta, TResource>\n\t\t\tcomments={props.comments}\n\t\t\tcanModerate={canModerate}\n\t\t\tonDelete={props.onDelete ? requestDelete : undefined}\n\t\t\tonAttachmentRemove={props.onAttachmentRemove}\n\t\t\tonEdit={\n\t\t\t\tcanComment && props.onUpdate\n\t\t\t\t\t? commentsState.startEdit\n\t\t\t\t\t: undefined\n\t\t\t}\n\t\t\tonPinToggle={onPinToggle}\n\t\t\tonReact={props.onReact}\n\t\t\tonReply={canComment && allowReplies ? handleReply : undefined}\n\t\t\tallowReactions={allowReactions}\n\t\t\tallowReplies={allowReplies}\n\t\t\tsanitizer={props.sanitizer}\n\t\t\tstrings={props.strings}\n\t\t\tgetMediaUrl={props.getMediaUrl}\n\t\t\tgetMediaName={props.getMediaName}\n\t\t\tgetStatusLabel={props.getStatusLabel}\n\t\t\tformatRelativeTime={props.formatRelativeTime}\n\t\t\tresources={resources}\n\t\t\trenderItem={props.renderItem}\n\t\t\trenderAttachment={props.renderAttachment}\n\t\t\trenderReference={props.renderReference}\n\t\t\temptySlot={\n\t\t\t\tprops.emptySlot ?? <CommentEmpty strings={props.strings} />\n\t\t\t}\n\t\t/>\n\t);\n\n\tconst composerBlock = composer ? <div>{composer}</div> : null;\n\n\tconst inner = (\n\t\t<Stack gap=\"xl\" className=\"comments--body\">\n\t\t\t{props.headerSlot}\n\t\t\t{composerPosition === 'top' && composerBlock}\n\t\t\t{timeline}\n\t\t\t{composerPosition === 'bottom' && composerBlock}\n\t\t\t{props.footerSlot}\n\t\t</Stack>\n\t);\n\n\tif (props.bare) {\n\t\treturn inner;\n\t}\n\n\tconst ariaLabel = typeof title === 'string' ? title : undefined;\n\n\treturn (\n\t\t<Stack\n\t\t\trender={<section />}\n\t\t\tgap=\"lg\"\n\t\t\tdata-component=\"comments\"\n\t\t\tdata-slot=\"comments\"\n\t\t\tclassName={cn('comments--component', props.className)}\n\t\t\taria-label={ariaLabel}\n\t\t>\n\t\t\t{!!(title !== false && (title || strings.subtitle)) && (\n\t\t\t\t<Stack gap=\"normal\" className=\"comments--header\">\n\t\t\t\t\t{!!title && <Text weight=\"semibold\">{title}</Text>}\n\t\t\t\t\t{!!strings.subtitle && <Text type=\"secondary\">{strings.subtitle}</Text>}\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t\t{inner}\n\t\t\t{!!(confirmDelete && props.onDelete) && (\n\t\t\t\t<ConfirmDialog\n\t\t\t\t\t{...deleteConfirm.overlayProps}\n\t\t\t\t\tdestructive\n\t\t\t\t\ttitle={strings.confirmDeleteTitle}\n\t\t\t\t\tdescription={strings.confirmDeleteDescription}\n\t\t\t\t\tstrings={{ confirm: strings.confirmDeleteLabel }}\n\t\t\t\t\tonAsyncConfirm={async () => {\n\t\t\t\t\t\tif (pendingDeleteId) await commentsState.deleteComment(pendingDeleteId);\n\t\t\t\t\t}}\n\t\t\t\t\tonError={props.onError}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</Stack>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"containers-CPNyNo1_.js","names":["_Fragment","cn","stackRecipe","Fragment$1","maxWidthClasses","gutterClasses","containerRecipe","maxWidth","gutter","Container","forwardRef","props","useRender","className","PageViewport","Section","gap","TwoColumnLayout","headerClassName","headerProps","slotProps","mainClassName","mainProps","asideClassName","asideProps","footerClassName","footerProps","adaptTo","header","main","stickyAside","aside","footer"],"sources":["../src/components/layout/containers/container.recipes.ts","../src/components/layout/containers/content-container.tsx","../src/components/layout/containers/page-viewport.tsx","../src/components/layout/containers/section.tsx","../src/components/layout/containers/two-column-layout.tsx"],"sourcesContent":["import type { ContainerGutter, ContainerMaxWidth } from './containers.types';\n\nconst maxWidthClasses: Record<ContainerMaxWidth, string> = {\n\tsm: 'max-w-content-sm',\n\tmd: 'max-w-content-md',\n\tlg: 'max-w-content-lg',\n\txl: 'max-w-content-xl',\n\t'2xl': 'max-w-content-2xl',\n\tfull: 'max-w-none',\n};\n\nconst gutterClasses: Record<ContainerGutter, string> = {\n\tnone: 'px-0',\n\tsm: 'px-surface-xs',\n\tmd: 'px-surface',\n\tlg: 'px-surface-lg',\n};\n\nexport function containerRecipe({\n\tmaxWidth = 'xl',\n\tgutter = 'md',\n}: {\n\tmaxWidth?: ContainerMaxWidth;\n\tgutter?: ContainerGutter;\n}): string[] {\n\treturn ['mx-auto', 'w-full', maxWidthClasses[maxWidth], gutterClasses[gutter]];\n}\n","import { useRender } from '@base-ui/react/use-render';\nimport { forwardRef } from 'react';\n\nimport { cn } from '../../../lib/utils';\n\nimport { containerRecipe } from './container.recipes';\nimport type { ContainerProps } from './containers.types';\n\n/** Container — one centered content-width and inline-gutter owner. */\nexport const Container = forwardRef<HTMLDivElement, ContainerProps>(function Container(\n\t{ className, maxWidth, gutter, render, ...props },\n\tref,\n) {\n\treturn useRender({\n\t\tdefaultTagName: 'div',\n\t\tref,\n\t\trender,\n\t\tprops: {\n\t\t\t...props,\n\t\t\tclassName: cn('container--component @container/content', containerRecipe({ maxWidth, gutter }), className),\n\t\t},\n\t\tstate: {},\n\t});\n});\n\nContainer.displayName = 'Container';\n","import { useRender } from '@base-ui/react/use-render';\nimport { forwardRef } from 'react';\n\nimport { cn } from '../../../lib/utils';\n\nimport type { PageViewportProps } from './containers.types';\n\n/** PageViewport — the single page-scroll and page-container-query owner. */\nexport const PageViewport = forwardRef<HTMLDivElement, PageViewportProps>(function PageViewport(\n\t{ className, render, tabIndex = 0, ...props },\n\tref,\n) {\n\treturn useRender({\n\t\tdefaultTagName: 'div',\n\t\tref,\n\t\trender,\n\t\tprops: {\n\t\t\t...props,\n\t\t\ttabIndex,\n\t\t\tclassName: cn(\n\t\t\t\t'page-viewport--component min-h-0 min-w-0 flex-1 overflow-auto overscroll-contain [scrollbar-gutter:stable] @container/page focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/70 focus-visible:ring-inset',\n\t\t\t\tclassName,\n\t\t\t),\n\t\t},\n\t\tstate: {},\n\t});\n});\n\nPageViewport.displayName = 'PageViewport';\n","import { useRender } from '@base-ui/react/use-render';\nimport { forwardRef } from 'react';\n\nimport { stackRecipe } from '../../base/structure/structure.recipes';\nimport { cn } from '../../../lib/utils';\n\nimport type { SectionProps } from './containers.types';\n\n/** Section — a semantic vertical-rhythm owner for page content groups. */\nexport const Section = forwardRef<HTMLElement, SectionProps>(function Section(\n\t{ className, gap, render, ...props },\n\tref,\n) {\n\treturn useRender({\n\t\tdefaultTagName: 'section',\n\t\tref,\n\t\trender,\n\t\tprops: {\n\t\t\t...props,\n\t\t\tclassName: cn('section--component', stackRecipe({ gap: gap ?? 'xl' }), className),\n\t\t},\n\t\tstate: {},\n\t});\n});\n\nSection.displayName = 'Section';\n","import { useRender } from '@base-ui/react/use-render';\nimport { forwardRef } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { cn } from '../../../lib/utils';\nimport type { LayoutSlotAttributes } from '../layout.types';\n\nexport interface TwoColumnLayoutSlotProps {\n\theader?: LayoutSlotAttributes<HTMLDivElement>;\n\tmain?: LayoutSlotAttributes<HTMLDivElement>;\n\taside?: LayoutSlotAttributes<HTMLElement>;\n\tfooter?: LayoutSlotAttributes<HTMLDivElement>;\n}\n\nexport interface TwoColumnLayoutProps extends useRender.ComponentProps<'div'> {\n\t/** Optional content spanning both columns before the work regions. */\n\theader?: ReactNode;\n\t/** Primary detail, form, or index content. */\n\tmain: ReactNode;\n\t/** Secondary summary, support, or action rail. */\n\taside: ReactNode;\n\t/** Optional content spanning both columns after the work regions. */\n\tfooter?: ReactNode;\n\t/** Keep the aside visible while the nearest page viewport scrolls. */\n\tstickyAside?: boolean;\n\t/** Preserve viewport breakpoints by default, or adapt inside Container/PageViewport. */\n\tadaptTo?: 'viewport' | 'container';\n\t/** Native attributes for each stable region. */\n\tslotProps?: TwoColumnLayoutSlotProps;\n}\n\n/** TwoColumnLayout — one truthful, stable-order main/aside grid. */\nexport const TwoColumnLayout = forwardRef<HTMLDivElement, TwoColumnLayoutProps>(\n\tfunction TwoColumnLayout(\n\t\t{\n\t\t\theader,\n\t\t\tmain,\n\t\t\taside,\n\t\t\tfooter,\n\t\t\tstickyAside = false,\n\t\t\tadaptTo = 'viewport',\n\t\t\tslotProps,\n\t\t\tclassName,\n\t\t\trender,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) {\n\t\tconst { className: headerClassName, ...headerProps } = slotProps?.header ?? {};\n\t\tconst { className: mainClassName, ...mainProps } = slotProps?.main ?? {};\n\t\tconst { className: asideClassName, ...asideProps } = slotProps?.aside ?? {};\n\t\tconst { className: footerClassName, ...footerProps } = slotProps?.footer ?? {};\n\n\t\treturn useRender({\n\t\t\tdefaultTagName: 'div',\n\t\t\tref,\n\t\t\trender,\n\t\t\tprops: {\n\t\t\t\t...props,\n\t\t\t\t'data-slot': 'two-column-layout',\n\t\t\t\tclassName: cn(\n\t\t\t\t\t'two-column-layout--component grid min-w-0 grid-cols-1 gap-space-2xl',\n\t\t\t\t\tadaptTo === 'container' ? '@3xl:grid-cols-[minmax(0,2fr)_minmax(18rem,1fr)]' : 'lg:grid-cols-[minmax(0,2fr)_minmax(18rem,1fr)]',\n\t\t\t\t\tclassName,\n\t\t\t\t),\n\t\t\t\tchildren: (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{header !== undefined && header !== null ? (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t{...headerProps}\n\t\t\t\t\t\t\t\tdata-slot=\"two-column-layout-header\"\n\t\t\t\t\t\t\t\tclassName={cn('two-column-layout--header col-span-full min-w-0', headerClassName)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{header}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t{...mainProps}\n\t\t\t\t\t\t\tdata-slot=\"two-column-layout-main\"\n\t\t\t\t\t\t\tclassName={cn('two-column-layout--main min-h-0 min-w-0', mainClassName)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{main}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<aside\n\t\t\t\t\t\t\t{...asideProps}\n\t\t\t\t\t\t\tdata-slot=\"two-column-layout-aside\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'two-column-layout--aside min-h-0 min-w-0',\n\t\t\t\t\t\t\t\tstickyAside && (adaptTo === 'container' ? '@3xl:sticky @3xl:top-space-2xl @3xl:self-start' : 'lg:sticky lg:top-space-2xl lg:self-start'),\n\t\t\t\t\t\t\t\tasideClassName,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{aside}\n\t\t\t\t\t\t</aside>\n\t\t\t\t\t\t{footer !== undefined && footer !== null ? (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t{...footerProps}\n\t\t\t\t\t\t\t\tdata-slot=\"two-column-layout-footer\"\n\t\t\t\t\t\t\t\tclassName={cn('two-column-layout--footer col-span-full min-w-0', footerClassName)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{footer}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</>\n\t\t\t\t),\n\t\t\t},\n\t\t\tstate: {},\n\t\t});\n\t},\n);\n\nTwoColumnLayout.displayName = 'TwoColumnLayout';\n"],"mappings":";;;;;;;AAEA,IAAMI,IAAqD;CAC1D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,OAAO;CACP,MAAM;AACP,GAEMC,IAAiD;CACtD,MAAM;CACN,IAAI;CACJ,IAAI;CACJ,IAAI;AACL;AAEA,SAAgBC,EAAgB,EAC/B,cAAW,MACX,YAAS,QAIG;CACZ,OAAO;EAAC;EAAW;EAAUF,EAAgBG;EAAWF,EAAcG;CAAO;AAC9E;;;ACjBA,IAAaC,IAAYC,EAA2C,SACnE,EAAE,cAAW,aAAU,WAAQ,WAAQ,GAAGC,KAC1C,GACC;CACD,OAAOC,EAAU;EAChB,gBAAgB;EAChB;EACA;EACA,OAAO;GACN,GAAGD;GACH,WAAWV,EAAG,2CAA2CK,EAAgB;IAAE;IAAU;GAAO,CAAC,GAAGO,CAAS;EAC1G;EACA,OAAO,CAAC;CACT,CAAC;AACF,CAAC;AAED,EAAU,cAAc;;;ACjBxB,IAAaC,IAAeJ,EAA8C,SACzE,EAAE,cAAW,WAAQ,cAAW,GAAG,GAAGC,KACtC,GACC;CACD,OAAOC,EAAU;EAChB,gBAAgB;EAChB;EACA;EACA,OAAO;GACN,GAAGD;GACH;GACA,WAAWV,EACV,kOACAY,CACD;EACD;EACA,OAAO,CAAC;CACT,CAAC;AACF,CAAC;AAED,EAAa,cAAc;;;ACnB3B,IAAaE,IAAUL,EAAsC,SAC5D,EAAE,cAAW,QAAK,WAAQ,GAAGC,KAC7B,GACC;CACD,OAAOC,EAAU;EAChB,gBAAgB;EAChB;EACA;EACA,OAAO;GACN,GAAGD;GACH,WAAWV,EAAG,sBAAsBC,EAAY,EAAE,KAAKc,KAAO,KAAK,CAAC,GAAGH,CAAS;EACjF;EACA,OAAO,CAAC;CACT,CAAC;AACF,CAAC;AAED,EAAQ,cAAc;;;ACOtB,IAAaI,IAAkBP,EAC9B,SACC,EACC,WACA,SACA,UACA,WACA,iBAAc,IACd,aAAU,YACV,cACA,cACA,WACA,GAAGC,KAEJ,GACC;CACD,IAAM,EAAE,WAAWO,GAAiB,GAAGC,MAAgBC,GAAW,UAAU,CAAC,GACvE,EAAE,WAAWC,GAAe,GAAGC,MAAcF,GAAW,QAAQ,CAAC,GACjE,EAAE,WAAWG,GAAgB,GAAGC,MAAeJ,GAAW,SAAS,CAAC,GACpE,EAAE,WAAWK,GAAiB,GAAGC,MAAgBN,GAAW,UAAU,CAAC;CAE7E,OAAOR,EAAU;EAChB,gBAAgB;EAChB;EACA;EACA,OAAO;GACN,GAAGD;GACH,aAAa;GACb,WAAWV,EACV,uEACA0B,MAAY,cAAc,qDAAqD,kDAC/Ed,CACD;GACA,UACC,kBAAAb,GAAA,EAAA,UAAA;IACE4B,KAAmC,OAQhC,OAPH,kBAAC,OAAD;KACC,GAAIT;KACJ,aAAU;KACV,WAAWlB,EAAG,mDAAmDiB,CAAe;KAE/E,UAAAU;IACG,CAAA;IAEN,kBAAC,OAAD;KACC,GAAIN;KACJ,aAAU;KACV,WAAWrB,EAAG,2CAA2CoB,CAAa;KAErE,UAAAQ;IACG,CAAA;IACL,kBAAC,SAAD;KACC,GAAIL;KACJ,aAAU;KACV,WAAWvB,EACV,4CACA6B,MAAgBH,MAAY,cAAc,mDAAmD,6CAC7FJ,CACD;KAEC,UAAAQ;IACK,CAAA;IACNC,KAAmC,OAQhC,OAPH,kBAAC,OAAD;KACC,GAAIN;KACJ,aAAU;KACV,WAAWzB,EAAG,mDAAmDwB,CAAe;KAE/E,UAAAO;IACG,CAAA;GAEL,EAAA,CAAA;EAEJ;EACA,OAAO,CAAC;CACT,CAAC;AACF,CACD;AAEA,EAAgB,cAAc"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-display-b3d1TfL4.js","names":["_Fragment","_Fragment","_Fragment","Link","DateValue","useDensityConfig","cn","TooltipTrigger","Button","Tooltip","TooltipContent","Text","Heading","DisplayLabel","Grid","Stack","Empty","EmptyMedia","EmptyContent","Value","Phone","Url","MonoValue","Email","EmptyValue","Link$1","Money","Time","DateTime","DatePrimitive","Badge","Separator","ContentBlock","ItemMedia","ItemSeparator","ItemActions","ItemGroup","ItemContent","Item","ItemTitle","React","Fragment$1","ScaleBar","max","i","value","label","KVRow","badge","badgeTone","DenseInfoDashboard","className","statusBadges","b","rows","row","scale","secondaryRows","footerBadges","footerText","InlineStat","ValuePrimitive","mono","labelContent","jsx","labelClassName","layout","valueClassName","defaultDenseInfoStrings","DenseInfoClassification","stringsProp","strings","useStrings","stats","stat","items","item","totalValue","totalLabel","DenseInfoFinancial","headerBadges","lineItems","idx","totalAmount","DenseInfoProjectCard","percentage","totalTasks","completedTasks","circumference","dashOffset","FolderOpen","statusTone","statusLabel","title","description","metaPairs","pair","date","priority","Calendar","BarChart3","DenseInfoScoreCard","barColor","scoreLevel","score","scoreTotal","scoreFilled","defaultEmptyStateStrings","PADDING_CLASS","MEDIA_VARIANT_TO_PRIMITIVE","MEDIA_EXTRA_CLASS","EmptyState","forwardRef","resolvedPadding","padding","defaultScale","resolvedTitle","resolvedDescription","mediaNode","renderMedia","media","showMedia","ariaLabel","border","EmptyHeader","mediaVariant","actions","footer","DocumentStackIllustration","InboxCleanIllustration","SearchGlassIllustration","Search","StackedCardsIllustration","UsersCircleIllustration","defaultMetadataListStrings","isEmpty","renderEmptyValue","emptyLabel","assertNever","MetadataValue","props","metadataColumnRecipes","resolveMetadataColumns","columns","resolveKey","index","isPrimitiveMetadataValue","isMetadataValueDescriptor","renderMetadataValue","valueBase","isEmptyValue","MetadataInfoTrigger","triggerProps","Info","MetadataList","list","isCompact","density","labelBase","titleClassName","hasTitle","shouldShowSeparator","titleSeparator","itemSeparatorText","itemSeparator","key","effectiveEmptyLabel","Icon","hasTooltip","hasCustomRender","showItemSeparator","separator","rowPaddingY","renderTitleBadge","RelationshipCardFrame","hasBody","alertSlot","metadataSlot","primaryActionSlot","selectorSlot","detailsSlot","headerClassName","icon","titleBadge","overflowActionSlot","bodyClassName"],"sources":["../src/components/blocks/data-display/dense-info-card/helpers.tsx","../src/components/blocks/data-display/dense-info-card/partials/dense-info-dashboard.tsx","../src/components/blocks/data-display/inline-stat/inline-stat.tsx","../src/components/blocks/data-display/dense-info-card/dense-info.strings.ts","../src/components/blocks/data-display/dense-info-card/partials/dense-info-classification.tsx","../src/components/blocks/data-display/dense-info-card/partials/dense-info-financial.tsx","../src/components/blocks/data-display/dense-info-card/partials/dense-info-project.tsx","../src/components/blocks/data-display/dense-info-card/partials/dense-info-score.tsx","../src/components/blocks/data-display/empty-state/empty-state.strings.ts","../src/components/blocks/data-display/empty-state/empty-state.tsx","../src/components/blocks/data-display/empty-state/partials/illustrations/document-stack.tsx","../src/components/blocks/data-display/empty-state/partials/illustrations/inbox-clean.tsx","../src/components/blocks/data-display/empty-state/partials/illustrations/search-glass.tsx","../src/components/blocks/data-display/empty-state/partials/illustrations/stacked-cards.tsx","../src/components/blocks/data-display/empty-state/partials/illustrations/users-circle.tsx","../src/components/blocks/data-display/metadata/metadata-list.strings.ts","../src/components/blocks/data-display/metadata/metadata-value.tsx","../src/components/blocks/data-display/metadata/metadata-list.tsx","../src/components/blocks/data-display/relationship-card-frame.tsx"],"sourcesContent":["import { Badge } from '../../../base/badge';\nimport { Text } from '../../../typography/text';\nimport { Stack } from '../../../base/structure';\nimport { cn } from '../../../../lib/utils';\nimport { type DenseInfoBadgeTone } from './types';\n\n/* ─── Shared: Complexity / Scale Bar ─────────────────────────────────────── */\n\nexport function ScaleBar({\n\tvalue,\n\tmax = 5,\n\tlabel,\n}: {\n\t/** Current amount, used to fill the bar. */\n\tvalue: number;\n\t/** Value representing a full bar. Default: `5`. */\n\tmax?: number;\n\t/** Caption shown beside the bar. */\n\tlabel?: string;\n}) {\n\treturn (\n\t\t<div className={cn('helpers--component', 'flex items-center gap-space-xs')}>\n\t\t\t{Array.from({ length: max }, (_, i) => (\n\t\t\t\t<div\n\t\t\t\t\tkey={i}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'h-1.5 w-3 rounded-full',\n\t\t\t\t\t\ti < value ? 'bg-foreground/60' : 'bg-muted',\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t))}\n\t\t\t{!!label && (\n\t\t\t\t<Text\n\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\tclassName=\"ml-1\"\n\t\t\t\t>\n\t\t\t\t\t{label}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\n/* ─── Shared: Key-Value Row ──────────────────────────────────────────────── */\n\nexport function KVRow({\n\tlabel,\n\tvalue,\n\tbadge,\n\tbadgeTone,\n}: {\n\t/** Row label. */\n\tlabel: string;\n\t/** Row value. */\n\tvalue?: string;\n\t/** Chip shown after the value. */\n\tbadge?: string;\n\t/** Badge tone for the chip. */\n\tbadgeTone?: DenseInfoBadgeTone;\n}) {\n\treturn (\n\t\t<Stack direction=\"horizontal\" align=\"center\" justify=\"between\" gap=\"md\">\n\t\t\t<Text\n\t\t\t\tsize=\"xs\"\n\t\t\t\tclassName=\"shrink-0 text-muted-foreground\"\n\t\t\t>\n\t\t\t\t{label}\n\t\t\t</Text>\n\t\t\t{!!badge && (\n\t\t\t\t<Badge\n\t\t\t\t\ttone={badgeTone ?? 'secondary'}\n\t\t\t\t>\n\t\t\t\t\t{badge}\n\t\t\t\t</Badge>\n\t\t\t)}\n\t\t\t{!!value && !badge && (\n\t\t\t\t<Text\n\t\t\t\t\tweight=\"semibold\"\n\t\t\t\t\tclassName=\"text-right tabular-nums\"\n\t\t\t\t>\n\t\t\t\t\t{value}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t</Stack>\n\t);\n}\n","import { ContentBlock } from '../../../../base/display';\nimport { Badge } from '../../../../base/badge';\nimport { Text } from '../../../../typography/text';\nimport { Separator } from '../../../../base/display/separator';\nimport { Stack } from '../../../../base/structure';\nimport { type DenseInfoDashboardProps } from '../types';\nimport { KVRow, ScaleBar } from '../helpers';\nimport { cn } from '../../../../../lib/utils';\n\nexport function DenseInfoDashboard({\n\ttitle,\n\tdescription,\n\tstatusBadges,\n\trows,\n\tsecondaryRows,\n\tscale,\n\tfooterBadges,\n\tfooterText,\n\tactions,\n\tclassName,\n}: DenseInfoDashboardProps) {\n\treturn (\n\t\t<ContentBlock\n\t\t\ttitle={title}\n\t\t\tdescription={description}\n\t\t\tactions={actions}\n\t\t\tclassName={cn('dense-info-dashboard--component', className)}\n\t\t>\n\t\t\t<Stack gap=\"lg\">\n\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\">\n\t\t\t\t\t{statusBadges.map((b) => (\n\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\tkey={b.label}\n\t\t\t\t\t\t\ttone={b.tone}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{b.label}\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t))}\n\t\t\t\t</Stack>\n\n\t\t\t\t<Stack gap=\"md\">\n\t\t\t\t\t{rows.map((row) => (\n\t\t\t\t\t\t<KVRow\n\t\t\t\t\t\t\tkey={row.label}\n\t\t\t\t\t\t\t{...row}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</Stack>\n\n\t\t\t\t{!!scale && (\n\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\tclassName=\"text-muted-foreground\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{scale.label}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t<ScaleBar\n\t\t\t\t\t\t\tvalue={scale.value}\n\t\t\t\t\t\t\tmax={scale.max}\n\t\t\t\t\t\t\tlabel={`${String(scale.value)}/${String(scale.max ?? 5)}`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{!!secondaryRows && secondaryRows.length > 0 && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Separator />\n\t\t\t\t\t\t<Stack gap=\"md\">\n\t\t\t\t\t\t\t{secondaryRows.map((row) => (\n\t\t\t\t\t\t\t\t<KVRow\n\t\t\t\t\t\t\t\t\tkey={row.label}\n\t\t\t\t\t\t\t\t\t{...row}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\n\t\t\t\t{(!!footerBadges || !!footerText) && (\n\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"md\" className=\"border-border border-t pt-space-md\">\n\t\t\t\t\t\t{!!footerBadges &&\n\t\t\t\t\t\t\tfooterBadges.map((b) => (\n\t\t\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\t\t\tkey={b.label}\n\t\t\t\t\t\t\t\t\ttone={b.tone}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{b.label}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t{!!footerText && (\n\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{footerText}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</ContentBlock>\n\t);\n}\n\nDenseInfoDashboard.displayName = 'DenseInfoDashboard';\n","/**\n * InlineStat — label + value pair, the workhorse of detail panels and card\n * footers. Three layouts:\n *\n * - `between` (default): label and value pushed to opposite ends of the row.\n * - `inline`: label sits immediately before the value, separator-style.\n * - `stacked`: label above (xs secondary), value below (md).\n *\n * `mono` toggles `tabular-nums` on the value side for amounts and counters.\n * Use `valueClassName` for one-off colour/weight overrides; the surrounding\n * row is intentionally plain so consumers can stack many of these without\n * visual clutter.\n */\nimport type { ReactNode } from 'react';\n\nimport { Stack } from '../../../base/structure';\nimport { MonoValue, Value } from '../../../primitives';\nimport { DisplayLabel } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nexport type InlineStatLayout = 'between' | 'inline' | 'stacked';\n\nexport interface InlineStatProps {\n\t/** Display label. Scalar labels use DisplayLabel; rich content owns its typography. */\n\tlabel: ReactNode;\n\t/** The figure to show. */\n\tvalue: ReactNode;\n\t/** Whether the label sits above the value or beside it. */\n\tlayout?: InlineStatLayout;\n\t/** Renders the value in tabular monospace figures. */\n\tmono?: boolean;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Merged onto the label. */\n\tlabelClassName?: string;\n\t/** Merged onto the value. */\n\tvalueClassName?: string;\n}\n\nexport function InlineStat({\n\tlabel,\n\tvalue,\n\tlayout = 'between',\n\tmono = false,\n\tclassName,\n\tlabelClassName,\n\tvalueClassName,\n}: InlineStatProps) {\n\tconst ValuePrimitive = mono ? MonoValue : Value;\n\tconst labelContent = typeof label === 'string' || typeof label === 'number'\n\t\t? <DisplayLabel className={labelClassName}>{label}</DisplayLabel>\n\t\t: <span className={labelClassName}>{label}</span>;\n\n\tif (layout === 'stacked') {\n\t\treturn (\n\t\t\t<Stack gap=\"2xs\" className={cn('inline-stat--component', className)}>\n\t\t\t\t{labelContent}\n\t\t\t\t<ValuePrimitive\n\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\tclassName={cn('text-sm leading-snug', mono && 'tabular-nums', valueClassName)}\n\t\t\t\t>\n\t\t\t\t\t{value}\n\t\t\t\t</ValuePrimitive>\n\t\t\t</Stack>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Stack\n\t\t\tdirection=\"horizontal\"\n\t\t\tgap=\"md\"\n\t\t\tjustify={layout === 'between' ? 'between' : 'start'}\n\t\t\twrap={false}\n\t\t\tclassName={cn('inline-stat--component', className)}\n\t\t>\n\t\t\t{labelContent}\n\t\t\t<ValuePrimitive\n\t\t\t\tsize=\"inherit\"\n\t\t\t\tclassName={cn('text-sm leading-snug', mono && 'tabular-nums', valueClassName)}\n\t\t\t>\n\t\t\t\t{value}\n\t\t\t</ValuePrimitive>\n\t\t</Stack>\n\t);\n}\n\nInlineStat.displayName = 'InlineStat';\n","export interface DenseInfoStrings {\n\t/** Total number of records across all pages. */\n\ttotal: string;\n\ttasks: string;\n}\n\nexport const defaultDenseInfoStrings: DenseInfoStrings = {\n\ttotal: 'Total',\n\ttasks: 'Tasks',\n};\n","import { ContentBlock } from '../../../../base/display';\nimport { Badge } from '../../../../base/badge';\nimport { Grid, Stack } from '../../../../base/structure';\nimport { Value } from '../../../../primitives';\nimport { Text } from '../../../../typography/text';\nimport { Heading } from '../../../../typography/heading';\nimport { InlineStat } from '../../inline-stat/inline-stat';\nimport { Separator } from '../../../../base/display/separator';\nimport {\n\tItem,\n\tItemActions,\n\tItemContent,\n\tItemGroup,\n\tItemMedia,\n\tItemTitle,\n} from '../../../../base/item';\nimport { cn } from '../../../../../lib/utils';\nimport { useStrings } from '../../../../../lib/strings';\nimport { defaultDenseInfoStrings } from '../dense-info.strings';\nimport { type DenseInfoClassificationProps } from '../types';\n\nexport function DenseInfoClassification({\n\ttitle,\n\tdescription,\n\tstats,\n\titems,\n\ttotalLabel,\n\ttotalValue,\n\tfooterBadges,\n\tfooterText,\n\tactions,\n\tclassName,\n\tstrings: stringsProp,\n}: DenseInfoClassificationProps) {\n\tconst strings = useStrings(defaultDenseInfoStrings, stringsProp);\n\treturn (\n\t\t<ContentBlock\n\t\t\ttitle={title}\n\t\t\tdescription={description}\n\t\t\tactions={actions}\n\t\t\tclassName={cn('dense-info-classification--component', className)}\n\t\t>\n\t\t\t<Stack gap=\"lg\">\n\t\t\t\t<Grid columns={{ base: 2, sm: 3 }} gap=\"md\">\n\t\t\t\t\t{stats.map((stat) => (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={stat.label}\n\t\t\t\t\t\t\tclassName=\"rounded-radius border border-border/50 bg-muted/30 p-surface-xs text-center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Heading tag=\"h4\" className=\"border-none pb-0 text-base font-semibold tabular-nums\">\n\t\t\t\t\t\t\t\t{stat.value}\n\t\t\t\t\t\t\t</Heading>\n\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" weight=\"medium\" className=\"mt-0.5\">\n\t\t\t\t\t\t\t\t{stat.label}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t{!!stat.trendBadge && (\n\t\t\t\t\t\t\t\t<div className=\"mt-1 flex justify-center\">\n\t\t\t\t\t\t\t\t\t<Badge tone={stat.trendTone ?? 'secondary'}>\n\t\t\t\t\t\t\t\t\t\t{stat.trendBadge}\n\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</Grid>\n\n\t\t\t\t<Separator />\n\n\t\t\t\t<ItemGroup>\n\t\t\t\t\t{items.map((item) => (\n\t\t\t\t\t\t<Item key={item.label} size=\"sm\">\n\t\t\t\t\t\t\t<ItemMedia>\n\t\t\t\t\t\t\t\t<span className={cn('h-2 w-2 shrink-0 rounded-full', item.dotColor)} />\n\t\t\t\t\t\t\t</ItemMedia>\n\t\t\t\t\t\t\t<ItemContent>\n\t\t\t\t\t\t\t\t<ItemTitle bold={false} className=\"gap-space-md\">\n\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t\t{!!item.badge && (\n\t\t\t\t\t\t\t\t\t\t<Badge tone={item.badgeTone ?? 'secondary'}>\n\t\t\t\t\t\t\t\t\t\t\t{item.badge}\n\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</ItemTitle>\n\t\t\t\t\t\t\t</ItemContent>\n\t\t\t\t\t\t\t<ItemActions>\n\t\t\t\t\t\t\t\t<Value weight=\"semibold\" className=\"tabular-nums\">\n\t\t\t\t\t\t\t\t\t{item.value}\n\t\t\t\t\t\t\t\t</Value>\n\t\t\t\t\t\t\t</ItemActions>\n\t\t\t\t\t\t</Item>\n\t\t\t\t\t))}\n\t\t\t\t</ItemGroup>\n\n\t\t\t\t{!!totalValue && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Separator />\n\t\t\t\t\t\t<InlineStat\n\t\t\t\t\t\t\tlabel={<Text tag=\"span\" weight=\"bold\" lineHeight=\"tight\">{totalLabel ?? strings.total}</Text>}\n\t\t\t\t\t\t\tvalue={totalValue}\n\t\t\t\t\t\t\tmono\n\t\t\t\t\t\t\tvalueClassName=\"text-sm font-bold\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\n\t\t\t\t{(!!footerBadges || !!footerText) && (\n\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"md\" className=\"border-border border-t pt-space-md\">\n\t\t\t\t\t\t{!!footerBadges && footerBadges.map((b) => (\n\t\t\t\t\t\t\t<Badge key={b.label} tone={b.tone}>\n\t\t\t\t\t\t\t\t{b.label}\n\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t{!!footerText && (\n\t\t\t\t\t\t\t<Text size=\"xs\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t\t\t{footerText}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</ContentBlock>\n\t);\n}\n\nDenseInfoClassification.displayName = 'DenseInfoClassification';\n","import { ContentBlock } from '../../../../base/display';\nimport { Stack } from '../../../../base/structure';\nimport { Badge } from '../../../../base/badge';\nimport { Value } from '../../../../primitives';\nimport { Text } from '../../../../typography/text';\nimport { InlineStat } from '../../inline-stat/inline-stat';\nimport {\n\tItem,\n\tItemActions,\n\tItemContent,\n\tItemGroup,\n\tItemSeparator,\n\tItemTitle,\n} from '../../../../base/item';\nimport { type DenseInfoFinancialProps } from '../types';\nimport { cn } from '../../../../../lib/utils';\nimport { useStrings } from '../../../../../lib/strings';\nimport { defaultDenseInfoStrings } from '../dense-info.strings';\n\nexport function DenseInfoFinancial({\n\ttitle,\n\tdescription,\n\theaderBadges,\n\tlineItems,\n\ttotalLabel,\n\ttotalAmount,\n\tfooterBadges,\n\tfooterText,\n\tactions,\n\tclassName,\n\tstrings: stringsProp,\n}: DenseInfoFinancialProps) {\n\tconst strings = useStrings(defaultDenseInfoStrings, stringsProp);\n\treturn (\n\t\t<ContentBlock\n\t\t\ttitle={title}\n\t\t\tdescription={description}\n\t\t\tactions={actions}\n\t\t\tclassName={cn('dense-info-financial--component', className)}\n\t\t>\n\t\t\t<Stack gap=\"lg\">\n\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\">\n\t\t\t\t\t{headerBadges.map((b) => (\n\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\tkey={b.label}\n\t\t\t\t\t\t\ttone={b.tone}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{b.label}\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t))}\n\t\t\t\t</Stack>\n\n\t\t\t\t<ItemGroup>\n\t\t\t\t\t{lineItems.map((item, idx) => (\n\t\t\t\t\t\t<div key={item.label}>\n\t\t\t\t\t\t\t{idx > 0 && <ItemSeparator className=\"my-0\" />}\n\t\t\t\t\t\t\t<Item size=\"sm\">\n\t\t\t\t\t\t\t\t<ItemContent>\n\t\t\t\t\t\t\t\t\t<ItemTitle className=\"gap-space-md\">\n\t\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t\t\t{!!item.badge && (\n\t\t\t\t\t\t\t\t\t\t\t<Badge tone={item.badgeTone ?? 'secondary'}>\n\t\t\t\t\t\t\t\t\t\t\t\t{item.badge}\n\t\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</ItemTitle>\n\t\t\t\t\t\t\t\t</ItemContent>\n\t\t\t\t\t\t\t\t<ItemActions>\n\t\t\t\t\t\t\t\t\t<Value weight=\"semibold\" className=\"tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t{item.amount}\n\t\t\t\t\t\t\t\t\t</Value>\n\t\t\t\t\t\t\t\t</ItemActions>\n\t\t\t\t\t\t\t</Item>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</ItemGroup>\n\n\t\t\t\t{!!totalAmount && (\n\t\t\t\t\t<InlineStat\n\t\t\t\t\t\tclassName=\"rounded-radius bg-muted/50 p-surface-xs\"\n\t\t\t\t\t\tlabel={<Text tag=\"span\" weight=\"semibold\" lineHeight=\"tight\">{totalLabel ?? strings.total}</Text>}\n\t\t\t\t\t\tvalue={totalAmount}\n\t\t\t\t\t\tmono\n\t\t\t\t\t\tvalueClassName=\"text-sm font-semibold\"\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{(!!footerBadges || !!footerText) && (\n\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"md\" className=\"border-border border-t pt-space-md\">\n\t\t\t\t\t\t{!!footerBadges &&\n\t\t\t\t\t\t\tfooterBadges.map((b) => (\n\t\t\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\t\t\tkey={b.label}\n\t\t\t\t\t\t\t\t\ttone={b.tone}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{b.label}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t{!!footerText && (\n\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{footerText}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</ContentBlock>\n\t);\n}\n\nDenseInfoFinancial.displayName = 'DenseInfoFinancial';\n","import { ContentBlock } from '../../../../base/display';\nimport { Badge } from '../../../../base/badge';\nimport { Text } from '../../../../typography/text';\nimport { Heading } from '../../../../typography/heading';\nimport { Separator } from '../../../../base/display/separator';\nimport { Stack } from '../../../../base/structure';\nimport {\n\tFolderOpen,\n\tCalendar,\n\tBarChart3,\n} from 'lucide-react';\nimport { type DenseInfoProjectCardProps } from '../types';\nimport { cn } from '../../../../../lib/utils';\nimport { useStrings } from '../../../../../lib/strings';\nimport { defaultDenseInfoStrings } from '../dense-info.strings';\n\nexport function DenseInfoProjectCard({\n\ttitle,\n\tdescription,\n\tstatusLabel,\n\tstatusTone,\n\tmetaPairs,\n\tdate,\n\tpriority,\n\tcompletedTasks,\n\ttotalTasks,\n\tactions,\n\tclassName,\n\tstrings: stringsProp,\n}: DenseInfoProjectCardProps) {\n\tconst strings = useStrings(defaultDenseInfoStrings, stringsProp);\n\tconst percentage = totalTasks > 0 ? Math.round((completedTasks / totalTasks) * 100) : 0;\n\tconst circumference = 2 * Math.PI * 7;\n\tconst dashOffset = circumference - (percentage / 100) * circumference;\n\n\treturn (\n\t\t<ContentBlock\n\t\t\tpadding=\"md\"\n\t\t\tactions={actions}\n\t\t\tclassName={cn('dense-info-project-card--component', className)}\n\t\t>\n\t\t\t<Stack gap=\"lg\">\n\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t<FolderOpen className=\"h-4 w-4 text-muted-foreground\" />\n\t\t\t\t\t<Badge tone={statusTone} dot>\n\t\t\t\t\t\t{statusLabel}\n\t\t\t\t\t</Badge>\n\t\t\t\t</div>\n\n\t\t\t\t<Heading tag=\"h5\" className=\"font-bold border-none pb-0\">\n\t\t\t\t\t{title}\n\t\t\t\t</Heading>\n\n\t\t\t\t{!!description && (\n\t\t\t\t\t<Text type=\"secondary\" className=\"line-clamp-2\">\n\t\t\t\t\t\t{description}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\n\t\t\t\t{!!metaPairs && metaPairs.length > 0 && (\n\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\">\n\t\t\t\t\t\t{metaPairs.map((pair, idx) => (\n\t\t\t\t\t\t\t<span key={pair.label} className=\"flex items-center gap-space-xs\">\n\t\t\t\t\t\t\t\t{idx > 0 && (\n\t\t\t\t\t\t\t\t\t<Text tag=\"span\" type=\"discrete\" className=\"mx-0.5\">•</Text>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{!!pair.icon && (\n\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">{pair.icon}</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">{pair.label}</Text>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\n\t\t\t\t{(!!date || !!priority) && (\n\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t{!!date && (\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-space-sm\">\n\t\t\t\t\t\t\t\t<Calendar className=\"h-3 w-3 text-muted-foreground\" />\n\t\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">{date}</Text>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!!priority && (\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-space-sm\">\n\t\t\t\t\t\t\t\t<BarChart3 className=\"h-3 w-3 text-muted-foreground\" />\n\t\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">{priority}</Text>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<Separator />\n\n\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t<div className=\"flex items-center gap-space-md\">\n\t\t\t\t\t\t<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" className=\"shrink-0\">\n\t\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t\tcx=\"10\"\n\t\t\t\t\t\t\t\tcy=\"10\"\n\t\t\t\t\t\t\t\tr=\"7\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\t\tclassName=\"text-muted/50\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t\tcx=\"10\"\n\t\t\t\t\t\t\t\tcy=\"10\"\n\t\t\t\t\t\t\t\tr=\"7\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\t\tstrokeDasharray={circumference}\n\t\t\t\t\t\t\t\tstrokeDashoffset={dashOffset}\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\tclassName=\"text-primary-accent\"\n\t\t\t\t\t\t\t\ttransform=\"rotate(-90 10 10)\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t<Text size=\"xs\" weight=\"medium\">\n\t\t\t\t\t\t\t{completedTasks}/{totalTasks} {strings.tasks}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"h-6 w-6 rounded-full bg-muted\" />\n\t\t\t\t</div>\n\t\t\t</Stack>\n\t\t</ContentBlock>\n\t);\n}\n\nDenseInfoProjectCard.displayName = 'DenseInfoProjectCard';\n","import { ContentBlock } from '../../../../base/display';\nimport { Badge } from '../../../../base/badge';\nimport { Heading, Text } from '../../../../typography';\nimport { InlineStat } from '../../inline-stat/inline-stat';\nimport { Separator } from '../../../../base/display/separator';\nimport { Stack } from '../../../../base/structure';\nimport { cn } from '../../../../../lib/utils';\nimport { type DenseInfoScoreCardProps } from '../types';\n\nexport function DenseInfoScoreCard({\n\ttitle,\n\tdescription,\n\tstatusBadges,\n\tscore,\n\tscoreLevel,\n\tscoreFilled,\n\tscoreTotal = 10,\n\trows,\n\tfooterBadges,\n\tactions,\n\tclassName,\n}: DenseInfoScoreCardProps) {\n\tconst barColor =\n\t\tscoreLevel === 'good'\n\t\t\t? 'bg-success'\n\t\t\t: scoreLevel === 'medium'\n\t\t\t\t? 'bg-warning'\n\t\t\t\t: 'bg-destructive';\n\n\treturn (\n\t\t<ContentBlock\n\t\t\ttitle={title}\n\t\t\tdescription={description}\n\t\t\tactions={actions}\n\t\t\tclassName={cn('dense-info-score-card--component', className)}\n\t\t>\n\t\t\t<Stack gap=\"lg\">\n\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\">\n\t\t\t\t\t{statusBadges.map((b) => (\n\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\tkey={b.label}\n\t\t\t\t\t\t\ttone={b.tone}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{b.label}\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t))}\n\t\t\t\t</Stack>\n\n\t\t\t\t<div className=\"flex items-center justify-center py-space-md\">\n\t\t\t\t\t<Heading\n\t\t\t\t\t\ttag=\"h2\"\n\t\t\t\t\t\tclassName=\"text-base font-bold tabular-nums border-none pb-0\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{String(score)}\n\t\t\t\t\t</Heading>\n\t\t\t\t</div>\n\n\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" justify=\"center\" gap=\"xs\">\n\t\t\t\t\t{Array.from({ length: scoreTotal }, (_, i) => (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'h-5 w-2 rounded-radius-sm',\n\t\t\t\t\t\t\t\ti < scoreFilled ? barColor : 'bg-muted',\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</Stack>\n\n\t\t\t\t<Separator />\n\n\t\t\t\t<Stack gap=\"md\">\n\t\t\t\t\t{rows.map((row) => (\n\t\t\t\t\t\t<InlineStat\n\t\t\t\t\t\t\tkey={row.label}\n\t\t\t\t\t\t\tlabel={<Text tag=\"span\" size=\"xs\" type=\"secondary\" weight=\"medium\" lineHeight=\"tight\">{row.label}</Text>}\n\t\t\t\t\t\t\tvalue={row.value}\n\t\t\t\t\t\t\tmono\n\t\t\t\t\t\t\tvalueClassName=\"text-sm font-semibold text-right\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</Stack>\n\n\t\t\t\t{!!footerBadges && footerBadges.length > 0 && (\n\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"md\" className=\"border-border border-t pt-space-md\">\n\t\t\t\t\t\t{footerBadges.map((b) => (\n\t\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\t\tkey={b.label}\n\t\t\t\t\t\t\t\ttone={b.tone}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{b.label}\n\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</ContentBlock>\n\t);\n}\n\nDenseInfoScoreCard.displayName = 'DenseInfoScoreCard';\n","/**\n * Strings for `<EmptyState>`. English defaults — every piece of copy is\n * deep-merge-overridable per rule 8.\n *\n * `title`/`description` here are the *fallback* defaults the component\n * renders when neither the prop nor a per-illustration preset supplies\n * its own copy. In practice, the consumer usually passes an explicit\n * `title` / `description` per resource (\"No products\", \"No invoices yet\")\n * — these defaults exist so a bare `<EmptyState />` still renders\n * sensibly during scaffolding.\n */\nexport interface EmptyStateStrings {\n\t/** Surface title. */\n\ttitle: string;\n\t/** Supporting copy shown under the label. */\n\tdescription: string;\n\tariaLabel: string;\n}\n\nexport const defaultEmptyStateStrings: EmptyStateStrings = {\n\ttitle: 'Nothing here yet',\n\tdescription: 'Once data lands, it will show up in this view.',\n\tariaLabel: 'Empty state',\n};\n","/**\n * EmptyState — the canonical zero-data surface for any list, table, or\n * collection in the library. Wraps the shadcn `ui/empty` primitive\n * (rule 1, rule 12) and applies our typography, density, and tokens:\n *\n * - Headline through `<Heading tag=\"h3\">` (admin scale, no marketing inflation)\n * - Description through provider-sized secondary Typography so a whole-state\n * explanation remains readable; compact footer metadata stays `xs`\n * - Padding driven by the package scale and CSS variables, not arbitrary literals\n * - Optional dashed-border affordance for \"this slot is a drop zone\"\n *\n * Composability:\n * - Slots: `media`, `actions`, `footer`\n * - Render-prop: `renderMedia(ctx)` for fully custom illustrations\n * - Strings: every piece of copy is overridable via `strings`\n *\n * The library ships a small illustration set under\n * `./partials/illustrations/*` — import explicitly per resource:\n *\n * import { StackedCardsIllustration } from\n * './partials/illustrations';\n *\n * Adaptive shape per resource: pass a different `media` per surface.\n * Don't fork the component.\n */\nimport { forwardRef } from 'react';\n\nimport { Heading, Text } from '../../../typography';\nimport {\n\tEmpty,\n\tEmptyContent,\n\tEmptyHeader,\n\tEmptyMedia,\n} from '../../../base/feedback';\nimport { Stack } from '../../../base/structure';\nimport { useStrings } from '../../../../lib/strings';\nimport { useDensityConfig } from '../../../../lib/ui-provider';\nimport { cn } from '../../../../lib/utils';\n\nimport { defaultEmptyStateStrings } from './empty-state.strings';\nimport type {\n\tEmptyStateMediaVariant,\n\tEmptyStatePadding,\n\tEmptyStateProps,\n} from './empty-state.types';\n\nconst PADDING_CLASS: Record<EmptyStatePadding, string> = {\n\tsm: '!p-surface-xs',\n\tmd: '!p-surface',\n\tlg: '!p-surface-lg',\n};\n\nconst MEDIA_VARIANT_TO_PRIMITIVE: Record<EmptyStateMediaVariant, 'default' | 'icon'> = {\n\tnone: 'default',\n\ticon: 'icon',\n\t'icon-soft': 'icon',\n\tillustration: 'default',\n};\n\nconst MEDIA_EXTRA_CLASS: Record<EmptyStateMediaVariant, string | undefined> = {\n\tnone: undefined,\n\ticon: undefined,\n\t'icon-soft': 'bg-muted/40 text-muted-foreground',\n\tillustration: 'mb-space-xl',\n};\n\nexport const EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(function EmptyState({\n\ttitle,\n\tdescription,\n\tmedia,\n\tmediaVariant = 'none',\n\trenderMedia,\n\tactions,\n\tfooter,\n\tpadding,\n\tborder = false,\n\tclassName,\n\tstrings: stringsProp,\n\tariaLabel,\n}, ref) {\n\tconst strings = useStrings(defaultEmptyStateStrings, stringsProp);\n\tconst { defaultScale } = useDensityConfig();\n\tconst resolvedPadding = padding ?? defaultScale ?? 'md';\n\n\tconst resolvedTitle = title ?? strings.title;\n\tconst resolvedDescription =\n\t\tdescription === false ? null : description ?? strings.description;\n\tconst mediaNode = renderMedia ? renderMedia({ mediaVariant }) : media;\n\tconst showMedia = !!mediaNode;\n\n\treturn (\n\t\t<Empty\n\t\t\tref={ref}\n\t\t\trole=\"status\"\n\t\t\taria-label={ariaLabel ?? strings.ariaLabel}\n\t\t\tclassName={cn('empty-state--component', \n\t\t\t\tPADDING_CLASS[resolvedPadding],\n\t\t\t\tborder ? 'border-border border border-dashed' : 'border-border border-0',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<EmptyHeader className=\"empty-state--header\">\n\t\t\t\t{!!showMedia && (\n\t\t\t\t\t<EmptyMedia\n\t\t\t\t\t\tvariant={MEDIA_VARIANT_TO_PRIMITIVE[mediaVariant]}\n\t\t\t\t\t\tclassName={cn('empty-state--media', MEDIA_EXTRA_CLASS[mediaVariant])}\n\t\t\t\t\t>\n\t\t\t\t\t\t{mediaNode}\n\t\t\t\t\t</EmptyMedia>\n\t\t\t\t)}\n\t\t\t\t<Heading\n\t\t\t\t\ttag=\"h3\"\n\t\t\t\t\tclassName=\"empty-state--title border-0 pb-0\"\n\t\t\t\t\tdata-slot=\"empty-title\"\n\t\t\t\t>\n\t\t\t\t\t{resolvedTitle}\n\t\t\t\t</Heading>\n\t\t\t\t{!!resolvedDescription && (\n\t\t\t\t\t<Text\n\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\tclassName=\"empty-state--description leading-relaxed [&>a]:text-primary-accent [&>a]:underline [&>a]:underline-offset-4 hover:[&>a]:no-underline\"\n\t\t\t\t\t\tdata-slot=\"empty-description\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{resolvedDescription}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t</EmptyHeader>\n\t\t\t{(!!actions || !!footer) && (\n\t\t\t\t<EmptyContent className=\"empty-state--content\">\n\t\t\t\t\t{!!actions && (\n\t\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"md\" justify=\"center\" className=\"empty-state--actions\">\n\t\t\t\t\t\t\t{actions}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!footer && (\n\t\t\t\t\t\t<Text tag=\"div\" size=\"xs\" type=\"secondary\" className=\"empty-state--footer\">\n\t\t\t\t\t\t\t{footer}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t</EmptyContent>\n\t\t\t)}\n\t\t</Empty>\n\t);\n});\n\nEmptyState.displayName = 'EmptyState';\n","import { cn } from '../../../../../../lib/utils';\nimport type { EmptyStateIllustrationProps } from './types';\n\n/**\n * Two staggered document silhouettes — for \"no documents\", \"no\n * invoices\", \"no reports\" surfaces.\n */\nexport function DocumentStackIllustration({ className }: EmptyStateIllustrationProps) {\n\treturn (\n\t\t<div className={cn('document-stack-illustration--component relative h-24 w-32', className)} aria-hidden=\"true\">\n\t\t\t<div className=\"bg-muted/70 dark:bg-muted/40 border-border/50 absolute left-1 top-1 flex h-20 w-20 -rotate-6 flex-col gap-1.5 rounded-radius-md border p-2 shadow-sm\">\n\t\t\t\t<div className=\"bg-muted h-2 w-12 rounded\" />\n\t\t\t\t<div className=\"bg-muted/60 h-1.5 w-10 rounded\" />\n\t\t\t\t<div className=\"bg-muted/60 h-1.5 w-9 rounded\" />\n\t\t\t</div>\n\t\t\t<div className=\"bg-background border-border absolute right-1 top-2 flex h-20 w-20 rotate-3 flex-col gap-1.5 rounded-radius-md border p-2 shadow-sm\">\n\t\t\t\t<div className=\"bg-muted h-2 w-12 rounded\" />\n\t\t\t\t<div className=\"bg-muted/60 h-1.5 w-10 rounded\" />\n\t\t\t\t<div className=\"bg-muted/60 h-1.5 w-9 rounded\" />\n\t\t\t\t<div className=\"mt-auto flex items-center gap-1\">\n\t\t\t\t\t<div className=\"bg-success size-1.5 rounded-full\" />\n\t\t\t\t\t<div className=\"bg-muted/60 h-1.5 w-8 rounded\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nDocumentStackIllustration.displayName = 'DocumentStackIllustration';\n","import { cn } from '../../../../../../lib/utils';\nimport type { EmptyStateIllustrationProps } from './types';\n\n/**\n * Open inbox tray with a soft check above — for \"all caught up\",\n * \"no notifications\", \"inbox zero\" surfaces.\n */\nexport function InboxCleanIllustration({ className }: EmptyStateIllustrationProps) {\n\treturn (\n\t\t<div className={cn('inbox-clean-illustration--component relative h-24 w-32', className)} aria-hidden=\"true\">\n\t\t\t<div className=\"bg-success/12 border-success/30 absolute left-1/2 top-0 flex size-8 -translate-x-1/2 items-center justify-center rounded-full border\">\n\t\t\t\t<svg\n\t\t\t\t\tviewBox=\"0 0 16 16\"\n\t\t\t\t\tclassName=\"text-success size-icon-md\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t>\n\t\t\t\t\t<path d=\"M3 8l3 3 7-7\" />\n\t\t\t\t</svg>\n\t\t\t</div>\n\t\t\t<div className=\"bg-background border-border absolute inset-x-0 bottom-0 flex h-14 flex-col rounded-radius border shadow-sm\">\n\t\t\t\t<div className=\"bg-muted/30 h-3 rounded-t-radius\" />\n\t\t\t\t<div className=\"flex flex-1 items-center justify-between px-3\">\n\t\t\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t\t\t<div className=\"bg-muted/60 h-1.5 w-12 rounded\" />\n\t\t\t\t\t\t<div className=\"bg-muted/40 h-1.5 w-8 rounded\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"bg-muted/40 size-3 rounded-full\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nInboxCleanIllustration.displayName = 'InboxCleanIllustration';\n","import { Search } from 'lucide-react';\n\nimport { cn } from '../../../../../../lib/utils';\nimport type { EmptyStateIllustrationProps } from './types';\n\n/**\n * Magnifying-glass illustration centered on a soft tinted disk — for\n * \"no search results\", \"nothing matches your filters\" surfaces.\n */\nexport function SearchGlassIllustration({ className }: EmptyStateIllustrationProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'search-glass-illustration--component',\n\t\t\t\t'flex size-20 items-center justify-center rounded-full bg-muted/40 ring-8 ring-muted/20',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\t<Search className=\"size-8 text-muted-foreground\" />\n\t\t</div>\n\t);\n}\n\nSearchGlassIllustration.displayName = 'SearchGlassIllustration';\n","import { cn } from '../../../../../../lib/utils';\nimport type { EmptyStateIllustrationProps } from './types';\n\n/**\n * Three stacked card silhouettes with a fade-out at the bottom — the\n * generic \"no records\" illustration. Token-driven so it adapts to any\n * theme (uses `bg-muted`, `bg-background`, `border-border`, no raw\n * palette).\n */\nexport function StackedCardsIllustration({ className }: EmptyStateIllustrationProps) {\n\treturn (\n\t\t<div className={cn('stacked-cards-illustration--component relative h-24 w-52', className)} aria-hidden=\"true\">\n\t\t\t<div className=\"bg-muted/60 dark:bg-muted/30 border-border/50 absolute inset-x-6 top-0 h-6 rounded-t-radius border\" />\n\t\t\t<div className=\"bg-muted/80 dark:bg-muted/50 border-border/60 absolute inset-x-3 top-3 h-6 rounded-t-radius border\" />\n\t\t\t<div className=\"bg-background border-border absolute inset-x-0 top-6 flex h-16 items-center gap-3 rounded-radius border px-4 shadow-sm\">\n\t\t\t\t<div className=\"bg-muted size-8 shrink-0 rounded\" />\n\t\t\t\t<div className=\"flex flex-1 flex-col gap-1.5\">\n\t\t\t\t\t<div className=\"bg-muted h-2.5 w-3/4 rounded\" />\n\t\t\t\t\t<div className=\"bg-muted/60 h-2 w-1/2 rounded\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"from-background/0 via-background/60 to-background pointer-events-none absolute inset-x-0 bottom-0 h-8 bg-linear-to-b\" />\n\t\t</div>\n\t);\n}\n\nStackedCardsIllustration.displayName = 'StackedCardsIllustration';\n","import { cn } from '../../../../../../lib/utils';\nimport type { EmptyStateIllustrationProps } from './types';\n\n/**\n * Three overlapping avatar circles — for \"no team members\", \"no\n * customers\", \"no contributors\" surfaces.\n */\nexport function UsersCircleIllustration({ className }: EmptyStateIllustrationProps) {\n\treturn (\n\t\t<div className={cn('users-circle-illustration--component relative flex h-24 w-32 items-center justify-center', className)} aria-hidden=\"true\">\n\t\t\t<div className=\"bg-muted/70 border-border absolute left-2 size-12 rounded-full border-2\" />\n\t\t\t<div className=\"bg-muted border-border z-10 size-14 rounded-full border-2 shadow-sm\" />\n\t\t\t<div className=\"bg-muted/60 border-border absolute right-2 size-10 rounded-full border-2\" />\n\t\t</div>\n\t);\n}\n\nUsersCircleIllustration.displayName = 'UsersCircleIllustration';\n","/**\n * Default user-facing strings for `<MetadataList>`.\n *\n * Consumers wire backend i18n at the call site:\n *\n * <MetadataList strings={{ infoFallback: t('metadata.info') }} … />\n */\n\nexport interface MetadataListStrings {\n\t/**\n\t * Suffix appended to the label when generating the tooltip-trigger\n\t * `aria-label` (\"<label> info\"). Receives the label as the first arg\n\t * so consumers can localise the full template.\n\t */\n\tformatInfoAriaLabel: (label: string) => string;\n\t/** Fallback `aria-label` used when the field label is not a plain string. */\n\tinfoFallback: string;\n}\n\nexport const defaultMetadataListStrings: MetadataListStrings = {\n\tformatInfoAriaLabel: (label) => `${label} info`,\n\tinfoFallback: 'Info',\n};\n","/**\n * MetadataValue — primitive-backed adapter for typed label/value facts.\n *\n * Each descriptor kind exposes only the fields its primitive consumes. Custom\n * `node` values remain untouched so app-owned composition keeps its identity.\n */\nimport type { ReactNode } from 'react';\nimport type { Locale } from 'date-fns';\n\nimport { Badge, type BadgeProps } from '../../../base/badge';\nimport {\n\tDate as DateValue,\n\tDateTime,\n\tEmail,\n\tEmptyValue,\n\tLink,\n\tMoney,\n\tMonoValue,\n\tPhone,\n\tTime,\n\tUrl,\n\tValue,\n\ttype DateInput,\n\ttype DatePreset,\n\ttype MoneyProps,\n\ttype TimeProps,\n} from '../../../primitives';\nimport { EMPTY } from '../../../../lib/format';\nimport { cn } from '../../../../lib/utils';\n\nexport type MetadataValueKind =\n\t| 'text'\n\t| 'mono'\n\t| 'email'\n\t| 'phone'\n\t| 'url'\n\t| 'link'\n\t| 'date'\n\t| 'time'\n\t| 'datetime'\n\t| 'money'\n\t| 'badge'\n\t| 'node'\n\t| 'empty';\n\ntype MetadataDisplayValue = Exclude<ReactNode, null | undefined>;\ntype MetadataDateInput = Exclude<DateInput, null | undefined>;\n/** Styling hook shared by every descriptor. */\ntype MetadataDescriptorBase = {\n\t/** Merged onto the rendered value. */\n\tclassName?: string;\n};\n/** Empty handling shared by every descriptor that can receive a blank value. */\ntype MetadataValueFallback = {\n\t/** Copy shown when the value is empty. Defaults to an em dash. */\n\temptyLabel?: ReactNode;\n};\n/** Escape hatch for descriptors whose value can be rendered by the caller. */\ntype MetadataDisplayOverride = {\n\t/** Pre-rendered content used verbatim, bypassing this descriptor's formatting. */\n\tdisplay?: ReactNode;\n};\n\nexport type MetadataTextValueDescriptor = MetadataDescriptorBase & MetadataValueFallback & MetadataDisplayOverride & {\n\t/** Plain text. The default when `kind` is omitted. */\n\tkind?: 'text';\n\t/** The value to show. */\n\tvalue: MetadataDisplayValue;\n};\n\nexport type MetadataMonoValueDescriptor = MetadataDescriptorBase & MetadataValueFallback & MetadataDisplayOverride & {\n\t/** Monospace, for ids, hashes, and codes. */\n\tkind: 'mono';\n\t/** The value to show. */\n\tvalue: MetadataDisplayValue;\n};\n\nexport type MetadataContactValueDescriptor = MetadataDescriptorBase & MetadataValueFallback & MetadataDisplayOverride & {\n\t/** Contact value, rendered as the matching `mailto:`, `tel:`, or external link. */\n\tkind: 'email' | 'phone' | 'url';\n\t/** The address, number, or URL. */\n\tvalue: string;\n};\n\nexport type MetadataLinkValueDescriptor = MetadataDescriptorBase & MetadataValueFallback & MetadataDisplayOverride & {\n\t/** An arbitrary link, where text and destination differ. */\n\tkind: 'link';\n\t/** Destination for the entry, when it navigates. */\n\thref: string;\n\t/** Link text. Falls back to `href` when omitted. */\n\tvalue?: MetadataDisplayValue;\n};\n\nexport type MetadataDateValueDescriptor = MetadataDescriptorBase & MetadataValueFallback & {\n\t/** A calendar date. */\n\tkind: 'date';\n\t/** The date to format. */\n\tvalue: MetadataDateInput;\n\t/** date-fns `Locale` for formatting. */\n\tdateLocale?: Locale;\n\t/** date-fns pattern, overriding `datePreset`. */\n\tdateFormat?: string;\n\t/** Named date length. */\n\tdatePreset?: DatePreset;\n};\n\nexport type MetadataTimeValueDescriptor = MetadataDescriptorBase & MetadataValueFallback & {\n\t/** A time of day. */\n\tkind: 'time';\n\t/** The time to format. */\n\tvalue: MetadataDateInput;\n\t/** date-fns `Locale` for formatting. */\n\tdateLocale?: Locale;\n\t/** date-fns pattern, overriding `timePreset`. */\n\ttimeFormat?: string;\n\t/** Named time length. */\n\ttimePreset?: TimeProps['preset'];\n};\n\nexport type MetadataDateTimeValueDescriptor = MetadataDescriptorBase & MetadataValueFallback & {\n\tkind: 'datetime';\n\t/** The instant to format. */\n\tvalue: MetadataDateInput;\n\t/** date-fns `Locale` for formatting. */\n\tdateLocale?: Locale;\n\t/** date-fns pattern for the date portion. */\n\tdateFormat?: string;\n\t/** date-fns pattern for the time portion. */\n\ttimeFormat?: string;\n\t/** Named date length, used when `dateFormat` is omitted. */\n\tdatePreset?: DatePreset;\n};\n\nexport type MetadataMoneyValueDescriptor = MetadataDescriptorBase & MetadataValueFallback & {\n\t/** A monetary amount. */\n\tkind: 'money';\n\t/** The amount, in major units unless `minorUnitScale` says otherwise. */\n\tvalue: number | string;\n\t/** ISO currency code. */\n\tcurrency?: MoneyProps['currency'];\n\t/** Unit label shown after the amount. */\n\tunit?: MoneyProps['unit'];\n\t/** Divisor applied when the value arrives in minor units, e.g. `100` for cents. */\n\tminorUnitScale?: MoneyProps['minorUnitScale'];\n\t/** Explicit currency symbol, overriding the one derived from `currency`. */\n\tsymbol?: MoneyProps['symbol'];\n\t/** Whether the currency shows as a symbol, code, or name. */\n\tcurrencyDisplay?: MoneyProps['currencyDisplay'];\n\t/** Selects the compact or full presentation. */\n\tformatMode?: MoneyProps['formatMode'];\n\t/** Smallest number of decimals to show. */\n\tminimumFractionDigits?: MoneyProps['minimumFractionDigits'];\n\t/** Largest number of decimals to show. */\n\tmaximumFractionDigits?: MoneyProps['maximumFractionDigits'];\n\t/** BCP 47 locale for the amount. */\n\tlocale?: MoneyProps['locale'];\n};\n\nexport type MetadataBadgeValueDescriptor = MetadataDescriptorBase & MetadataValueFallback & MetadataDisplayOverride & {\n\t/** A status chip. */\n\tkind: 'badge';\n\t/** Badge text. */\n\tvalue: MetadataDisplayValue;\n\t/** Badge tone. */\n\tbadgeTone?: BadgeProps['tone'];\n\t/** Badge size. */\n\tbadgeSize?: BadgeProps['size'];\n};\n\nexport type MetadataNodeValueDescriptor = {\n\t/** Arbitrary content, bypassing every formatting path. */\n\tkind: 'node';\n\t/** The content to render. */\n\tnode: ReactNode;\n};\n\nexport type MetadataEmptyValueDescriptor = MetadataDescriptorBase & MetadataValueFallback & {\n\t/** A known-absent value, rendered as the empty label rather than omitted. */\n\tkind: 'empty';\n};\n\nexport type MetadataValueDescriptor =\n\t| MetadataTextValueDescriptor\n\t| MetadataMonoValueDescriptor\n\t| MetadataContactValueDescriptor\n\t| MetadataLinkValueDescriptor\n\t| MetadataDateValueDescriptor\n\t| MetadataTimeValueDescriptor\n\t| MetadataDateTimeValueDescriptor\n\t| MetadataMoneyValueDescriptor\n\t| MetadataBadgeValueDescriptor\n\t| MetadataNodeValueDescriptor\n\t| MetadataEmptyValueDescriptor;\n\nexport type MetadataValueProps = MetadataValueDescriptor;\n\nfunction isEmpty(value: unknown) {\n\treturn value === null || value === undefined || value === '';\n}\n\nfunction renderEmptyValue(className: string | undefined, emptyLabel: ReactNode = EMPTY) {\n\treturn (\n\t\t<EmptyValue size=\"inherit\" className={cn('metadata-value--component', className)}>\n\t\t\t{emptyLabel}\n\t\t</EmptyValue>\n\t);\n}\n\nfunction assertNever(_value: never): never {\n\tthrow new Error('Unsupported metadata value descriptor.');\n}\n\nexport function MetadataValue(props: MetadataValueProps) {\n\tif (props.kind === 'node') return <>{props.node}</>;\n\tif (props.kind === 'empty') return renderEmptyValue(props.className, props.emptyLabel);\n\n\tif (props.kind !== 'link' && isEmpty(props.value)) {\n\t\treturn renderEmptyValue(props.className, props.emptyLabel);\n\t}\n\n\tswitch (props.kind) {\n\t\tcase undefined:\n\t\tcase 'text':\n\t\t\treturn (\n\t\t\t\t<Value size=\"inherit\" className={cn('metadata-value--component', props.className)}>\n\t\t\t\t\t{props.display ?? props.value}\n\t\t\t\t</Value>\n\t\t\t);\n\t\tcase 'mono':\n\t\t\treturn (\n\t\t\t\t<MonoValue size=\"inherit\" className={cn('metadata-value--component', props.className)}>\n\t\t\t\t\t{props.display ?? props.value}\n\t\t\t\t</MonoValue>\n\t\t\t);\n\t\tcase 'email':\n\t\t\treturn <Email value={props.value} display={props.display} emptyLabel={props.emptyLabel} className={cn('metadata-value--component', props.className)} />;\n\t\tcase 'phone':\n\t\t\treturn <Phone value={props.value} display={props.display} emptyLabel={props.emptyLabel} className={cn('metadata-value--component', props.className)} />;\n\t\tcase 'url':\n\t\t\treturn <Url value={props.value} display={props.display} emptyLabel={props.emptyLabel} className={cn('metadata-value--component', props.className)} />;\n\t\tcase 'link':\n\t\t\treturn (\n\t\t\t\t<Link href={props.href} emptyLabel={props.emptyLabel} className={cn('metadata-value--component', props.className)}>\n\t\t\t\t\t{props.display ?? props.value ?? props.href}\n\t\t\t\t</Link>\n\t\t\t);\n\t\tcase 'date':\n\t\t\treturn <DateValue value={props.value} format={props.dateFormat} preset={props.datePreset} locale={props.dateLocale} emptyLabel={props.emptyLabel} size=\"inherit\" className={cn('metadata-value--component', props.className)} />;\n\t\tcase 'time':\n\t\t\treturn <Time value={props.value} format={props.timeFormat} preset={props.timePreset} locale={props.dateLocale} emptyLabel={props.emptyLabel} size=\"inherit\" className={cn('metadata-value--component', props.className)} />;\n\t\tcase 'datetime':\n\t\t\treturn <DateTime value={props.value} format={props.dateFormat} timeFormat={props.timeFormat} preset={props.datePreset} locale={props.dateLocale} emptyLabel={props.emptyLabel} size=\"inherit\" className={cn('metadata-value--component', props.className)} />;\n\t\tcase 'money':\n\t\t\treturn (\n\t\t\t\t<Money\n\t\t\t\t\tamount={props.value}\n\t\t\t\t\tcurrency={props.currency}\n\t\t\t\t\tunit={props.unit}\n\t\t\t\t\tminorUnitScale={props.minorUnitScale}\n\t\t\t\t\tsymbol={props.symbol}\n\t\t\t\t\tcurrencyDisplay={props.currencyDisplay}\n\t\t\t\t\tformatMode={props.formatMode}\n\t\t\t\t\tminimumFractionDigits={props.minimumFractionDigits}\n\t\t\t\t\tmaximumFractionDigits={props.maximumFractionDigits}\n\t\t\t\t\tlocale={props.locale}\n\t\t\t\t\temptyLabel={props.emptyLabel}\n\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\tclassName={cn('metadata-value--component', props.className)}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase 'badge':\n\t\t\treturn (\n\t\t\t\t<Badge\n\t\t\t\t\ttone={props.badgeTone ?? 'secondary'}\n\t\t\t\t\tsize={props.badgeSize}\n\t\t\t\t\tinline\n\t\t\t\t\tclassName={cn('metadata-value--component self-start justify-self-start', props.className)}\n\t\t\t\t>\n\t\t\t\t\t{props.display ?? props.value}\n\t\t\t\t</Badge>\n\t\t\t);\n\t\tdefault:\n\t\t\treturn assertNever(props);\n\t}\n}\n\nMetadataValue.displayName = 'MetadataValue';\n","/**\n * MetadataList — flexible label/value list for entity metadata.\n *\n * Three layouts:\n * - `grid` (default): label-on-top, value-below cells for entity details.\n * - `rows`: two-column definition rows with hairline separators.\n * - `inline`: label/separator/value pairs that wrap, suitable for\n * pill-style summaries (e.g. \"Created Jan 4 · By Alice · v3.2\").\n *\n * Each item supports an optional icon, tooltip, React-node value, custom\n * `render`, and per-item `emptyLabel`. Falls back to the shared `EMPTY` when\n * both are missing. Returns `null` when the list is empty so callers can render\n * unconditionally.\n */\nimport { Info, type LucideIcon } from 'lucide-react';\nimport React from 'react';\n\nimport { Button } from '../../../base/buttons';\nimport { Separator } from '../../../base/display/separator';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../../../base/display/tooltip';\nimport { Grid, Stack, type ResponsiveValue } from '../../../base/structure';\nimport { DisplayLabel } from '../../../typography/display-label';\nimport { Text } from '../../../typography/text';\nimport { EMPTY } from '../../../../lib/format';\nimport { useStrings, type StringsProp } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport {\n\tdefaultMetadataListStrings,\n\ttype MetadataListStrings,\n} from './metadata-list.strings';\nimport {\n\tMetadataValue,\n\ttype MetadataValueDescriptor,\n} from './metadata-value';\n\nexport type { MetadataListStrings };\nexport { defaultMetadataListStrings };\n\nexport type MetadataListItem = {\n\t/** Stable identity for this entry. */\n\tid?: string;\n\t/** Display label. */\n\tlabel: React.ReactNode;\n\tvalue?: React.ReactNode | MetadataValueDescriptor | null;\n\t/** Supporting copy shown under the label. */\n\tdescription?: React.ReactNode | null;\n\ttooltip?: React.ReactNode;\n\t/** Leading glyph. */\n\ticon?: LucideIcon;\n\temptyLabel?: React.ReactNode;\n\trender?: (item: MetadataListItem) => React.ReactNode;\n};\n\nexport type MetadataInlineListItem = Omit<MetadataListItem, 'description'> & {\n\tdescription?: never;\n};\n\nexport type MetadataLayout = 'grid' | 'rows' | 'inline';\nexport type MetadataDensity = 'default' | 'compact';\n\ntype MetadataListSharedProps = {\n\t/** How many columns the grid layout uses. Accepts a per-breakpoint value. */\n\tcolumns?: ResponsiveValue<1 | 2 | 3 | 4>;\n\t/** Row spacing. `compact` tightens the list for dense panels. */\n\tdensity?: MetadataDensity;\n\t/** Copy shown for an item whose value is empty. Defaults to an em dash. */\n\temptyLabel?: React.ReactNode;\n\t/** Surface title. */\n\ttitle?: React.ReactNode;\n\t/** Draws a rule between the title and the first item. */\n\ttitleSeparator?: boolean;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Character placed between a label and its value. Defaults to a colon. */\n\tseparator?: string;\n\t/** Divider between items — `true` for the default rule, or a character for inline layouts. */\n\titemSeparator?: boolean | string;\n\t/** Per-instance string overrides (deep-merged over `defaultMetadataListStrings`). */\n\tstrings?: StringsProp<MetadataListStrings>;\n};\n\ntype MetadataGridRowsProps = MetadataListSharedProps & {\n\t/** Label/value pairs to render. */\n\titems: MetadataListItem[];\n\t/** `grid` flows items into `columns`; `rows` stacks them one per line. Default: `grid`. */\n\tlayout?: 'grid' | 'rows';\n};\n\ntype MetadataInlineProps = MetadataListSharedProps & {\n\t/** Values to render, without labels. */\n\titems: MetadataInlineListItem[];\n\t/** Runs the values together on one line, separated by `itemSeparator`. */\n\tlayout: 'inline';\n};\n\nexport type MetadataListProps =\n\t| MetadataGridRowsProps\n\t| MetadataInlineProps;\n\nconst metadataColumnRecipes: Record<1 | 2 | 3 | 4, ResponsiveValue<1 | 2 | 3 | 4>> = {\n\t1: 1,\n\t2: { base: 1, md: 2 },\n\t3: { base: 1, sm: 2, lg: 3 },\n\t4: { base: 1, sm: 2, lg: 3, xl: 4 },\n};\n\nfunction resolveMetadataColumns(\n\tcolumns: ResponsiveValue<1 | 2 | 3 | 4>,\n): ResponsiveValue<1 | 2 | 3 | 4> {\n\treturn typeof columns === 'object' ? columns : metadataColumnRecipes[columns];\n}\n\nconst resolveKey = (item: MetadataListItem, index: number): string => {\n\tif (item.id) {\n\t\treturn item.id;\n\t}\n\n\tconst rawLabel = typeof item.label === 'string' ? item.label : `${index}`;\n\treturn `metadata-${rawLabel}-${index}`;\n};\n\nfunction isPrimitiveMetadataValue(value: React.ReactNode): value is string | number {\n\treturn typeof value === 'string' || typeof value === 'number';\n}\n\nfunction isMetadataValueDescriptor(value: unknown): value is MetadataValueDescriptor {\n\treturn (\n\t\ttypeof value === 'object' &&\n\t\tvalue !== null &&\n\t\t!React.isValidElement(value) &&\n\t\t!Array.isArray(value) &&\n\t\t('kind' in value || 'node' in value || 'value' in value)\n\t);\n}\n\nfunction renderMetadataValue({\n\tvalue,\n\tisEmptyValue,\n\temptyLabel,\n\tvalueBase,\n}: {\n\tvalue: React.ReactNode | MetadataValueDescriptor;\n\tisEmptyValue: boolean;\n\temptyLabel: React.ReactNode;\n\tvalueBase: string;\n}) {\n\tif (isMetadataValueDescriptor(value)) {\n\t\tif (value.kind === 'node') return <MetadataValue {...value} />;\n\t\treturn (\n\t\t\t<MetadataValue\n\t\t\t\t{...value}\n\t\t\t\temptyLabel={value.emptyLabel ?? emptyLabel}\n\t\t\t\tclassName={cn(valueBase, value.className)}\n\t\t\t/>\n\t\t);\n\t}\n\n\tif (isPrimitiveMetadataValue(value)) {\n\t\treturn (\n\t\t\t<MetadataValue\n\t\t\t\tvalue={value}\n\t\t\t\tkind={isEmptyValue ? 'empty' : 'text'}\n\t\t\t\temptyLabel={emptyLabel}\n\t\t\t\tclassName={valueBase}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn value;\n}\n\nfunction MetadataInfoTrigger({\n\ttriggerProps,\n\tariaLabel,\n}: {\n\ttriggerProps: React.ComponentProps<'button'>;\n\tariaLabel: string;\n}) {\n\tconst { className, ...props } = triggerProps;\n\treturn (\n\t\t<Button\n\t\t\t{...props}\n\t\t\ttype=\"button\"\n\t\t\ttone=\"secondary\"\n\t\t\tbuttonStyle=\"ghost\"\n\t\t\tsize=\"sm\" iconOnly\n\t\t\tclassName={cn(\n\t\t\t\t'metadata-list--info-trigger -mx-space-2xs inline-flex size-avatar-sm shrink-0 items-center justify-center rounded-radius-sm',\n\t\t\t\t'text-muted-foreground transition-colors hover:text-foreground',\n\t\t\t\t'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\taria-label={ariaLabel}\n\t\t>\n\t\t\t<Info className=\"size-icon-sm cursor-help\" />\n\t\t</Button>\n\t);\n}\n\nexport function MetadataList({\n\titems,\n\tcolumns = 2,\n\tdensity = 'default',\n\temptyLabel = EMPTY,\n\ttitle,\n\ttitleSeparator = false,\n\tclassName,\n\tlayout = 'grid',\n\tseparator = ': ',\n\titemSeparator = false,\n\tstrings: stringsProp,\n}: MetadataListProps) {\n\tconst strings = useStrings(defaultMetadataListStrings, stringsProp);\n\tconst list = React.useMemo(() => items.filter(Boolean), [items]);\n\n\tif (list.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst isCompact = density === 'compact';\n\tconst labelBase = 'metadata--field text-left';\n\tconst valueBase = cn('metadata-list--value', isCompact ? 'text-xs' : 'text-sm');\n\tconst titleClassName = 'mb-space-sm block';\n\tconst hasTitle = title !== null && title !== undefined;\n\tconst shouldShowSeparator = hasTitle && titleSeparator;\n\n\tif (layout === 'inline') {\n\t\tconst itemSeparatorText =\n\t\t\ttypeof itemSeparator === 'string'\n\t\t\t\t? itemSeparator\n\t\t\t\t: itemSeparator\n\t\t\t\t\t? ' | '\n\t\t\t\t\t: '';\n\n\t\treturn (\n\t\t\t<div className={cn('metadata-list--component', 'metadata-list-container @container/metadata-list', className)}>\n\t\t\t\t{!!hasTitle && (\n\t\t\t\t\t<DisplayLabel tag=\"div\" className={cn('metadata-list--title', titleClassName)}>\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</DisplayLabel>\n\t\t\t\t)}\n\n\t\t\t\t{!!shouldShowSeparator && <Separator className=\"metadata-list--title-separator mb-space-md\" />}\n\n\t\t\t\t<Stack\n\t\t\t\t\tdirection=\"horizontal\"\n\t\t\t\t\tgap={isCompact ? 'sm' : 'md'}\n\t\t\t\t\tclassName=\"metadata-list--inline\"\n\t\t\t\t>\n\t\t\t\t\t{list.map((item, index) => {\n\t\t\t\t\t\tconst key = resolveKey(item, index);\n\t\t\t\t\t\tconst effectiveEmptyLabel = item.emptyLabel ?? emptyLabel;\n\t\t\t\t\t\tconst isEmptyValue = item.value === null || item.value === undefined;\n\t\t\t\t\t\tconst value = item.value ?? effectiveEmptyLabel;\n\t\t\t\t\t\tconst Icon = item.icon;\n\t\t\t\t\t\tconst hasTooltip = item.tooltip !== null && item.tooltip !== undefined;\n\t\t\t\t\t\tconst hasCustomRender = typeof item.render === 'function';\n\t\t\t\t\t\tconst showItemSeparator = itemSeparatorText && index < list.length - 1;\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<React.Fragment key={key}>\n\t\t\t\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"md\" className=\"metadata-list--item min-w-0 items-start [&>*]:max-w-full [&>*]:min-w-0 [&>.badge--component]:self-start\">\n\t\t\t\t\t\t\t\t\t{!!Icon && (\n\t\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'flex-shrink-0',\n\t\t\t\t\t\t\t\t\t\t\t\tisCompact ? 'size-icon-sm' : 'size-icon',\n\t\t\t\t\t\t\t\t\t\t\t\t'text-muted-foreground',\n\t\t\t\t\t\t\t\t\t\t\t)}\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\t{/* Label, optional info trigger, and the separator are one\n\t\t\t\t\t\t\t\t\t unit: the item Stack's gap would otherwise fall\n\t\t\t\t\t\t\t\t\t between the label and the colon and render\n\t\t\t\t\t\t\t\t\t \"SKU : value\" — French spacing — instead of\n\t\t\t\t\t\t\t\t\t \"SKU: value\". The gap belongs after the colon only. */}\n\t\t\t\t\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"none\" align=\"baseline\" className=\"min-w-0\">\n\t\t\t\t\t\t\t\t\t<DisplayLabel className={cn('metadata-list--label whitespace-nowrap', labelBase)}>\n\t\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t\t</DisplayLabel>\n\n\t\t\t\t\t\t\t\t\t{!!hasTooltip && (\n\t\t\t\t\t\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t\t\t\t\t\t<TooltipTrigger\n\t\t\t\t\t\t\t\t\t\t\t\trender={(triggerProps) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<MetadataInfoTrigger\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttriggerProps={triggerProps}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tariaLabel={typeof item.label === 'string' ? strings.formatInfoAriaLabel(item.label) : strings.infoFallback}\n\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\t/>\n\t\t\t\t\t\t\t\t\t\t\t<TooltipContent\n\t\t\t\t\t\t\t\t\t\t\t\tside=\"top\"\n\t\t\t\t\t\t\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"max-w-xs\"\n\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 type=\"inverse\" size=\"xs\">{item.tooltip}</Text>\n\t\t\t\t\t\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{separator}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t</Stack>\n\n\t\t\t\t\t\t\t\t\t{hasCustomRender ? item.render?.(item) : renderMetadataValue({\n\t\t\t\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\t\t\t\tisEmptyValue,\n\t\t\t\t\t\t\t\t\t\temptyLabel: effectiveEmptyLabel,\n\t\t\t\t\t\t\t\t\t\tvalueBase: cn(valueBase, 'leading-tight'),\n\t\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{!!showItemSeparator && (\n\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"metadata-list--item-separator\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{itemSeparatorText}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</React.Fragment>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</Stack>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (layout === 'rows') {\n\t\tconst rowPaddingY = isCompact ? 'py-row-y-sm' : 'py-row-y';\n\t\treturn (\n\t\t\t<div className={cn('metadata-list--component', 'metadata-list-container @container/metadata-list', className)}>\n\t\t\t\t{!!hasTitle && (\n\t\t\t\t\t<DisplayLabel tag=\"div\" className={cn('metadata-list--title mb-space-md', titleClassName)}>\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</DisplayLabel>\n\t\t\t\t)}\n\t\t\t\t{!!shouldShowSeparator && <Separator className=\"metadata-list--title-separator mb-space-md\" />}\n\t\t\t\t<Stack render={<dl />} gap=\"none\" className=\"metadata-list--rows divide-y divide-border/50\">\n\t\t\t\t\t{list.map((item, index) => {\n\t\t\t\t\t\tconst key = resolveKey(item, index);\n\t\t\t\t\t\tconst effectiveEmptyLabel = item.emptyLabel ?? emptyLabel;\n\t\t\t\t\t\tconst isEmptyValue = item.value === null || item.value === undefined;\n\t\t\t\t\t\tconst value = item.value ?? effectiveEmptyLabel;\n\t\t\t\t\t\tconst Icon = item.icon;\n\t\t\t\t\t\tconst hasTooltip = item.tooltip !== null && item.tooltip !== undefined;\n\t\t\t\t\t\tconst hasCustomRender = typeof item.render === 'function';\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\tclassName={cn('metadata-list--item grid items-baseline gap-x-space-xl gap-y-space-sm grid-cols-[minmax(0,1fr)_minmax(0,2fr)]', rowPaddingY)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<dt className=\"flex items-center gap-space-sm min-w-0\">\n\t\t\t\t\t\t\t\t\t{!!Icon && (\n\t\t\t\t\t\t\t\t\t\t<Icon className={cn('flex-shrink-0 text-muted-foreground', isCompact ? 'size-icon-sm' : 'size-icon')} />\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t<DisplayLabel className={cn('metadata-list--label truncate', labelBase)}>\n\t\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t\t\t\t\t{!!hasTooltip && (\n\t\t\t\t\t\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t\t\t\t\t\t<TooltipTrigger\n\t\t\t\t\t\t\t\t\t\t\t\trender={(triggerProps) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<MetadataInfoTrigger\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttriggerProps={triggerProps}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tariaLabel={typeof item.label === 'string' ? strings.formatInfoAriaLabel(item.label) : strings.infoFallback}\n\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\t/>\n\t\t\t\t\t\t\t\t\t\t\t<TooltipContent side=\"top\" align=\"start\" className=\"max-w-xs\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Text type=\"inverse\" size=\"xs\">{item.tooltip}</Text>\n\t\t\t\t\t\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</dt>\n\t\t\t\t\t\t\t\t<dd className=\"min-w-0 break-words [overflow-wrap:anywhere] [&>*]:max-w-full [&>*]:min-w-0\">\n\t\t\t\t\t\t\t\t\t{hasCustomRender ? item.render?.(item) : renderMetadataValue({\n\t\t\t\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\t\t\t\tisEmptyValue,\n\t\t\t\t\t\t\t\t\t\temptyLabel: effectiveEmptyLabel,\n\t\t\t\t\t\t\t\t\t\tvalueBase: cn(valueBase, 'break-words leading-tight'),\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t{!!item.description && (\n\t\t\t\t\t\t\t\t\t\t<Text size=\"inherit\" type=\"secondary\" className=\"metadata-list--description mt-space-xs text-xs leading-snug\">\n\t\t\t\t\t\t\t\t\t\t\t{item.description}\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</dd>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</Stack>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={cn('metadata-list--component', 'metadata-list-container @container/metadata-list', className)}>\n\t\t\t{!!hasTitle && (\n\t\t\t\t<DisplayLabel tag=\"div\" className={cn('metadata-list--title', titleClassName)}>\n\t\t\t\t\t{title}\n\t\t\t\t</DisplayLabel>\n\t\t\t)}\n\n\t\t\t{!!shouldShowSeparator && <Separator className=\"metadata-list--title-separator mb-space-md\" />}\n\n\t\t\t<Grid\n\t\t\t\tcolumns={resolveMetadataColumns(columns)}\n\t\t\t\tgap={isCompact ? 'md' : 'xl'}\n\t\t\t\talign=\"start\"\n\t\t\t\tclassName=\"metadata-list--grid\"\n\t\t\t>\n\t\t\t\t{list.map((item, index) => {\n\t\t\t\t\tconst key = resolveKey(item, index);\n\t\t\t\t\tconst effectiveEmptyLabel = item.emptyLabel ?? emptyLabel;\n\t\t\t\t\tconst isEmptyValue = item.value === null || item.value === undefined;\n\t\t\t\t\tconst value = item.value ?? effectiveEmptyLabel;\n\t\t\t\t\tconst Icon = item.icon;\n\t\t\t\t\tconst hasTooltip = item.tooltip !== null && item.tooltip !== undefined;\n\t\t\t\t\tconst hasCustomRender = typeof item.render === 'function';\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Stack\n\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\tgap=\"sm\"\n\t\t\t\t\t\t\tclassName=\"metadata-list--item min-w-0 items-start [&>*]:max-w-full [&>*]:min-w-0 [&>.badge--component]:self-start\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-space-sm\">\n\t\t\t\t\t\t\t\t{!!Icon && (\n\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t'flex-shrink-0',\n\t\t\t\t\t\t\t\t\t\t\tisCompact ? 'size-icon-sm' : 'size-icon',\n\t\t\t\t\t\t\t\t\t\t\t'text-muted-foreground',\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\n\t\t\t\t\t\t\t\t<DisplayLabel className={cn('metadata-list--label', labelBase)}>\n\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t</DisplayLabel>\n\n\t\t\t\t\t\t\t\t{!!hasTooltip && (\n\t\t\t\t\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t\t\t\t\t<TooltipTrigger\n\t\t\t\t\t\t\t\t\t\t\trender={(triggerProps) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<MetadataInfoTrigger\n\t\t\t\t\t\t\t\t\t\t\t\t\ttriggerProps={triggerProps}\n\t\t\t\t\t\t\t\t\t\t\t\t\tariaLabel={typeof item.label === 'string' ? strings.formatInfoAriaLabel(item.label) : strings.infoFallback}\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)}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<TooltipContent\n\t\t\t\t\t\t\t\t\t\t\tside=\"top\"\n\t\t\t\t\t\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"max-w-xs\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<Text type=\"inverse\" size=\"xs\">{item.tooltip}</Text>\n\t\t\t\t\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t{hasCustomRender ? item.render?.(item) : renderMetadataValue({\n\t\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\t\tisEmptyValue,\n\t\t\t\t\t\t\t\temptyLabel: effectiveEmptyLabel,\n\t\t\t\t\t\t\t\tvalueBase: cn(valueBase, 'leading-tight'),\n\t\t\t\t\t\t\t})}\n\n\t\t\t\t\t\t\t{!!item.description && (\n\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\t\tclassName=\"metadata-list--description text-xs leading-snug\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{item.description}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</Grid>\n\t\t</div>\n\t);\n}\n\nMetadataList.displayName = 'MetadataList';\n","/**\n * RelationshipCardFrame — card-free scaffold for app-owned resource cards.\n *\n * The package owns the visual grammar; the app owns the domain data,\n * selectors, mutations, and routing. Frame it with Card at the page,\n * drawer, or preview call site when card chrome is needed.\n */\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { Badge, type BadgeProps } from '../../base/badge';\nimport { Stack } from '../../base/structure';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\n\nexport interface RelationshipCardFrameProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n\t/** Leading glyph. */\n\ticon?: ReactNode;\n\t/** Surface title. */\n\ttitle: ReactNode;\n\t/** Chip beside the title. Pass a node, or an object to use the built-in badge. */\n\ttitleBadge?: ReactNode | { label: ReactNode; tone?: BadgeProps['tone']; size?: BadgeProps['size'] };\n\t/** Notice between the header and the body. */\n\talertSlot?: ReactNode;\n\t/** Label/value facts under the title. */\n\tmetadataSlot?: ReactNode;\n\t/** Main control in the header. */\n\tprimaryActionSlot?: ReactNode;\n\t/** Overflow menu at the end of the header. */\n\toverflowActionSlot?: ReactNode;\n\t/** Control that changes which relationship is shown. */\n\tselectorSlot?: ReactNode;\n\t/** Expanded detail region below the body. */\n\tdetailsSlot?: ReactNode;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Merged onto the header. */\n\theaderClassName?: string;\n\t/** Merged onto the body. */\n\tbodyClassName?: string;\n}\n\nfunction renderTitleBadge(badge: RelationshipCardFrameProps['titleBadge']) {\n\tif (!badge) return null;\n\tif (typeof badge === 'object' && !Array.isArray(badge) && 'label' in badge) {\n\t\treturn (\n\t\t\t<Badge inline tone={badge.tone ?? 'secondary'} size={badge.size}>\n\t\t\t\t{badge.label}\n\t\t\t</Badge>\n\t\t);\n\t}\n\treturn badge;\n}\n\nexport const RelationshipCardFrame = forwardRef<HTMLDivElement, RelationshipCardFrameProps>(function RelationshipCardFrame({\n\ticon,\n\ttitle,\n\ttitleBadge,\n\talertSlot,\n\tmetadataSlot,\n\tprimaryActionSlot,\n\toverflowActionSlot,\n\tselectorSlot,\n\tdetailsSlot,\n\tclassName,\n\theaderClassName,\n\tbodyClassName,\n\t...props\n}, ref) {\n\tconst hasBody =\n\t\t!!alertSlot ||\n\t\t!!metadataSlot ||\n\t\t!!primaryActionSlot ||\n\t\t!!selectorSlot ||\n\t\t!!detailsSlot;\n\n\treturn (\n\t\t<Stack\n\t\t\tref={ref}\n\t\t\tclassName={cn('relationship-card-frame--component', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<Stack direction=\"horizontal\" gap=\"md\" align=\"start\" justify=\"between\" wrap={false} className={cn('relationship-card-frame--header', headerClassName)}>\n\t\t\t\t<Stack direction=\"horizontal\" gap=\"md\" align=\"start\" wrap={false} className=\"relationship-card-frame--header-start\">\n\t\t\t\t\t{!!icon && (\n\t\t\t\t\t\t<div className=\"relationship-card-frame--icon mt-space-2xs inline-flex shrink-0 items-center text-muted-foreground\">\n\t\t\t\t\t\t\t{icon}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className=\"min-w-0\">\n\t\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"sm\" className=\"relationship-card-frame--title-row\">\n\t\t\t\t\t\t\t<Text tag=\"div\" weight=\"medium\" className=\"relationship-card-frame--title truncate\">\n\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t{!!titleBadge && (\n\t\t\t\t\t\t\t\t<span className=\"relationship-card-frame--title-badge inline-flex\">\n\t\t\t\t\t\t\t\t\t{renderTitleBadge(titleBadge)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</div>\n\t\t\t\t</Stack>\n\t\t\t\t{!!overflowActionSlot && (\n\t\t\t\t\t<div className=\"relationship-card-frame--overflow shrink-0\">\n\t\t\t\t\t\t{overflowActionSlot}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</Stack>\n\n\t\t\t{!!hasBody && (\n\t\t\t\t<Stack className={cn('relationship-card-frame--body', bodyClassName)}>\n\t\t\t\t\t{!!alertSlot && <div className=\"relationship-card-frame--alert\">{alertSlot}</div>}\n\t\t\t\t\t{!!selectorSlot && <div className=\"relationship-card-frame--selector\">{selectorSlot}</div>}\n\t\t\t\t\t{!!metadataSlot && <div className=\"relationship-card-frame--metadata\">{metadataSlot}</div>}\n\t\t\t\t\t{!!primaryActionSlot && <div className=\"relationship-card-frame--primary-action\">{primaryActionSlot}</div>}\n\t\t\t\t\t{!!detailsSlot && <div className=\"relationship-card-frame--details\">{detailsSlot}</div>}\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t</Stack>\n\t);\n});\n\nRelationshipCardFrame.displayName = 'RelationshipCardFrame';\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAQA,SAAgB0C,GAAS,EACxB,UACA,SAAM,GACN,YAQE;CACF,OACC,kBAAC,OAAD;EAAK,WAAWpC,EAAG,sBAAsB,gCAAgC;EAAzE,UAAA,CACE,MAAM,KAAK,EAAE,QAAQqC,EAAI,IAAI,GAAG,MAChC,kBAAC,OAAD,EAEC,WAAWrC,EACV,0BACAsC,IAAIC,IAAQ,qBAAqB,UAClC,EACA,GALKD,CAKL,CACD,GACA,CAAC,CAACE,KACF,kBAACnC,GAAD;GACC,MAAK;GACL,MAAK;GACL,WAAU;GAET,UAAAmC;EACI,CAAA,CAEH;;AAEP;AAIA,SAAgBC,EAAM,EACrB,UACA,UACA,UACA,gBAUE;CACF,OACC,kBAAChC,GAAD;EAAO,WAAU;EAAa,OAAM;EAAS,SAAQ;EAAU,KAAI;EAAnE,UAAA;GACC,kBAACJ,GAAD;IACC,MAAK;IACL,WAAU;IAET,UAAAmC;GACI,CAAA;GACL,CAAC,CAACE,KACF,kBAAClB,GAAD;IACC,MAAMmB,KAAa;IAElB,UAAAD;GACK,CAAA;GAEP,CAAC,CAACH,KAAS,CAACG,KACZ,kBAACrC,GAAD;IACC,QAAO;IACP,WAAU;IAET,UAAAkC;GACI,CAAA;EAED;;AAET;;;AC7EA,SAAgBK,EAAmB,EAClC,UACA,gBACA,iBACA,SACA,kBACA,UACA,iBACA,eACA,YACA,gBAC2B;CAC3B,OACC,kBAAClB,GAAD;EACQ;EACM;EACJ;EACT,WAAW1B,EAAG,mCAAmC6C,CAAS;EAE1D,UAAA,kBAACpC,GAAD;GAAO,KAAI;GAAX,UAAA;IACC,kBAACA,GAAD;KAAO,WAAU;KAAa,MAAA;KAAK,OAAM;KAAS,KAAI;KACpD,UAAAqC,EAAa,KAAK,MAClB,kBAACtB,GAAD;MAEC,MAAMuB,EAAE;MAEP,UAAAA,EAAE;KACG,GAJDA,EAAE,KAID,CACP;IACK,CAAA;IAEP,kBAACtC,GAAD;KAAO,KAAI;KACT,UAAAuC,EAAK,KAAK,MACV,kBAACP,GAAD,EAEC,GAAIQ,EACJ,GAFKA,EAAI,KAET,CACD;IACK,CAAA;IAEN,CAAC,CAACC,KACF,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACC,kBAAC7C,GAAD;MACC,MAAK;MACL,WAAU;MAET,UAAA6C,EAAM;KACF,CAAA,GACN,kBAACd,IAAD;MACC,OAAOc,EAAM;MACb,KAAKA,EAAM;MACX,OAAO,GAAG,OAAOA,EAAM,KAAK,EAAE,GAAG,OAAOA,EAAM,OAAO,CAAC;KACtD,CAAA,CACG;;IAGL,CAAC,CAACC,KAAiBA,EAAc,SAAS,KAC1C,kBAAAzD,GAAA,EAAA,UAAA,CACC,kBAAC+B,GAAD,CAAY,CAAA,GACZ,kBAAChB,GAAD;KAAO,KAAI;KACT,UAAA0C,EAAc,KAAK,MACnB,kBAACV,GAAD,EAEC,GAAIQ,EACJ,GAFKA,EAAI,KAET,CACD;IACK,CAAA,CACN,EAAA,CAAA;KAGD,CAAC,CAACG,KAAgB,CAAC,CAACC,MACrB,kBAAC5C,GAAD;KAAO,WAAU;KAAa,MAAA;KAAK,OAAM;KAAS,KAAI;KAAK,WAAU;KAArE,UAAA,CACE,CAAC,CAAC2C,KACFA,EAAa,KAAK,MACjB,kBAAC5B,GAAD;MAEC,MAAMuB,EAAE;MAEP,UAAAA,EAAE;KACG,GAJDA,EAAE,KAID,CACP,GACD,CAAC,CAACM,KACF,kBAAChD,GAAD;MACC,MAAK;MACL,WAAU;MAET,UAAAgD;KACI,CAAA,CAED;;GAEF;;CACM,CAAA;AAEhB;AAEA,EAAmB,cAAc;;;AClEjC,SAAgBC,EAAW,EAC1B,UACA,UACA,YAAS,WACT,UAAO,IACP,cACA,mBACA,qBACmB;CACnB,IAAMC,IAAiBC,IAAOxC,IAAYH,GACpC4C,IACHC,EADkB,OAAOlB,KAAU,YAAY,OAAOA,KAAU,WAC/DjC,IACA,QADD;EAAc,WAAWoD;EAAiB,UAAAnB;CAAoB,CAChB;CAgBjD,OAdIoB,MAAW,YAEb,kBAACnD,GAAD;EAAO,KAAI;EAAM,WAAWT,EAAG,0BAA0B6C,CAAS;EAAlE,UAAA,CACEY,GACD,kBAACF,GAAD;GACC,MAAK;GACL,WAAWvD,EAAG,wBAAwBwD,KAAQ,gBAAgBK,CAAc;GAE3E,UAAAtB;EACc,CAAA,CACV;MAKR,kBAAC9B,GAAD;EACC,WAAU;EACV,KAAI;EACJ,SAASmD,MAAW,YAAY,YAAY;EAC5C,MAAM;EACN,WAAW5D,EAAG,0BAA0B6C,CAAS;EALlD,UAAA,CAOEY,GACD,kBAACF,GAAD;GACC,MAAK;GACL,WAAWvD,EAAG,wBAAwBwD,KAAQ,gBAAgBK,CAAc;GAE3E,UAAAtB;EACc,CAAA,CACV;;AAET;AAEA,EAAW,cAAc;;;AChFzB,IAAauB,IAA4C;CACxD,OAAO;CACP,OAAO;AACR;;;ACYA,SAAgBC,EAAwB,EACvC,UACA,gBACA,UACA,UACA,eACA,eACA,iBACA,eACA,YACA,cACA,SAASC,KACuB;CAChC,IAAMC,IAAUC,EAAWJ,GAAyBE,CAAW;CAC/D,OACC,kBAACtC,GAAD;EACQ;EACM;EACJ;EACT,WAAW1B,EAAG,wCAAwC6C,CAAS;EAE/D,UAAA,kBAACpC,GAAD;GAAO,KAAI;GAAX,UAAA;IACC,kBAACD,GAAD;KAAM,SAAS;MAAE,MAAM;MAAG,IAAI;KAAE;KAAG,KAAI;KACrC,UAAA2D,EAAM,KAAK,MACX,kBAAC,OAAD;MAEC,WAAU;MAFX,UAAA;OAIC,kBAAC7D,GAAD;QAAS,KAAI;QAAK,WAAU;QAC1B,UAAA8D,EAAK;OACE,CAAA;OACT,kBAAC/D,GAAD;QAAM,MAAK;QAAK,MAAK;QAAY,QAAO;QAAS,WAAU;QACzD,UAAA+D,EAAK;OACD,CAAA;OACL,CAAC,CAACA,EAAK,cACP,kBAAC,OAAD;QAAK,WAAU;QACd,UAAA,kBAAC5C,GAAD;SAAO,MAAM4C,EAAK,aAAa;SAC7B,UAAAA,EAAK;QACA,CAAA;OACH,CAAA;MAEF;KAhBC,GAAAA,EAAK,KAgBN,CACL;IACI,CAAA;IAEN,kBAAC3C,GAAD,CAAY,CAAA;IAEZ,kBAACK,GAAD,EAAA,UACEuC,EAAM,KAAK,MACX,kBAACrC,IAAD;KAAuB,MAAK;KAA5B,UAAA;MACC,kBAACL,IAAD,EAAA,UACC,kBAAC,QAAD,EAAM,WAAW3B,EAAG,iCAAiCsE,EAAK,QAAQ,EAAI,CAAA,EAC5D,CAAA;MACX,kBAACvC,IAAD,EAAA,UACC,kBAACE,GAAD;OAAW,MAAM;OAAO,WAAU;OAAlC,UAAA,CACEqC,EAAK,OACL,CAAC,CAACA,EAAK,SACP,kBAAC9C,GAAD;QAAO,MAAM8C,EAAK,aAAa;QAC7B,UAAAA,EAAK;OACA,CAAA,CAEE;MACC,CAAA,EAAA,CAAA;MACb,kBAACzC,GAAD,EAAA,UACC,kBAAChB,GAAD;OAAO,QAAO;OAAW,WAAU;OACjC,UAAAyD,EAAK;MACA,CAAA,EACK,CAAA;KACR;IAnBK,GAAAA,EAAK,KAmBV,CACN,EACS,CAAA;IAEV,CAAC,CAACC,KACF,kBAAA5E,GAAA,EAAA,UAAA,CACC,kBAAC8B,GAAD,CAAY,CAAA,GACZ,kBAAC6B,GAAD;KACC,OAAO,kBAACjD,GAAD;MAAM,KAAI;MAAO,QAAO;MAAO,YAAW;MAAS,UAAAmE,KAAcP,EAAQ;KAAY,CAAA;KAC5F,OAAOM;KACP,MAAA;KACA,gBAAe;IACf,CAAA,CACA,EAAA,CAAA;KAGD,CAAC,CAACnB,KAAgB,CAAC,CAACC,MACrB,kBAAC5C,GAAD;KAAO,WAAU;KAAa,MAAA;KAAK,OAAM;KAAS,KAAI;KAAK,WAAU;KAArE,UAAA,CACE,CAAC,CAAC2C,KAAgBA,EAAa,KAAK,MACpC,kBAAC5B,GAAD;MAAqB,MAAMuB,EAAE;MAC3B,UAAAA,EAAE;KACG,GAFKA,EAAE,KAEP,CACP,GACA,CAAC,CAACM,KACF,kBAAChD,GAAD;MAAM,MAAK;MAAK,WAAU;MACxB,UAAAgD;KACI,CAAA,CAED;;GAEF;;CACM,CAAA;AAEhB;AAEA,EAAwB,cAAc;;;ACzGtC,SAAgBoB,EAAmB,EAClC,UACA,gBACA,iBACA,cACA,eACA,gBACA,iBACA,eACA,YACA,cACA,SAAST,KACkB;CAC3B,IAAMC,IAAUC,EAAWJ,GAAyBE,CAAW;CAC/D,OACC,kBAACtC,GAAD;EACQ;EACM;EACJ;EACT,WAAW1B,EAAG,mCAAmC6C,CAAS;EAE1D,UAAA,kBAACpC,GAAD;GAAO,KAAI;GAAX,UAAA;IACC,kBAACA,GAAD;KAAO,WAAU;KAAa,MAAA;KAAK,OAAM;KAAS,KAAI;KACpD,UAAAiE,EAAa,KAAK,MAClB,kBAAClD,GAAD;MAEC,MAAMuB,EAAE;MAEP,UAAAA,EAAE;KACG,GAJDA,EAAE,KAID,CACP;IACK,CAAA;IAEP,kBAACjB,GAAD,EAAA,UACE6C,EAAU,KAAK,GAAM,MACrB,kBAAC,OAAD,EAAA,UAAA,CACEC,IAAM,KAAK,kBAAChD,IAAD,EAAe,WAAU,OAAQ,CAAA,GAC7C,kBAACI,IAAD;KAAM,MAAK;KAAX,UAAA,CACC,kBAACD,IAAD,EAAA,UACC,kBAACE,GAAD;MAAW,WAAU;MAArB,UAAA,CACEqC,EAAK,OACL,CAAC,CAACA,EAAK,SACP,kBAAC9C,GAAD;OAAO,MAAM8C,EAAK,aAAa;OAC7B,UAAAA,EAAK;MACA,CAAA,CAEE;KACC,CAAA,EAAA,CAAA,GACb,kBAACzC,GAAD,EAAA,UACC,kBAAChB,GAAD;MAAO,QAAO;MAAW,WAAU;MACjC,UAAAyD,EAAK;KACA,CAAA,EACK,CAAA,CACR;IACF,CAAA,CAAA,EAAA,GAnBKA,EAAK,KAmBV,CACL,EACS,CAAA;IAEV,CAAC,CAACO,KACF,kBAACvB,GAAD;KACC,WAAU;KACV,OAAO,kBAACjD,GAAD;MAAM,KAAI;MAAO,QAAO;MAAW,YAAW;MAAS,UAAAmE,KAAcP,EAAQ;KAAY,CAAA;KAChG,OAAOY;KACP,MAAA;KACA,gBAAe;IACf,CAAA;KAGA,CAAC,CAACzB,KAAgB,CAAC,CAACC,MACrB,kBAAC5C,GAAD;KAAO,WAAU;KAAa,MAAA;KAAK,OAAM;KAAS,KAAI;KAAK,WAAU;KAArE,UAAA,CACE,CAAC,CAAC2C,KACFA,EAAa,KAAK,MACjB,kBAAC5B,GAAD;MAEC,MAAMuB,EAAE;MAEP,UAAAA,EAAE;KACG,GAJDA,EAAE,KAID,CACP,GACD,CAAC,CAACM,KACF,kBAAChD,GAAD;MACC,MAAK;MACL,WAAU;MAET,UAAAgD;KACI,CAAA,CAED;;GAEF;;CACM,CAAA;AAEhB;AAEA,EAAmB,cAAc;;;ACjGjC,SAAgByB,EAAqB,EACpC,UACA,gBACA,gBACA,eACA,cACA,SACA,aACA,mBACA,eACA,YACA,cACA,SAASd,KACoB;CAC7B,IAAMC,IAAUC,EAAWJ,GAAyBE,CAAW,GACzDe,IAAaC,IAAa,IAAI,KAAK,MAAOC,IAAiBD,IAAc,GAAG,IAAI,GAChFE,IAAgB,IAAI,KAAK,KAAK,GAC9BC,IAAaD,IAAiBH,IAAa,MAAOG;CAExD,OACC,kBAACxD,GAAD;EACC,SAAQ;EACC;EACT,WAAW1B,EAAG,sCAAsC6C,CAAS;EAE7D,UAAA,kBAACpC,GAAD;GAAO,KAAI;GAAX,UAAA;IACC,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACC,kBAAC2E,IAAD,EAAY,WAAU,gCAAiC,CAAA,GACvD,kBAAC5D,GAAD;MAAO,MAAM6D;MAAY,KAAA;MACvB,UAAAC;KACK,CAAA,CACH;;IAEL,kBAAChF,GAAD;KAAS,KAAI;KAAK,WAAU;KAC1B,UAAAiF;IACO,CAAA;IAER,CAAC,CAACC,KACF,kBAACnF,GAAD;KAAM,MAAK;KAAY,WAAU;KAC/B,UAAAmF;IACI,CAAA;IAGN,CAAC,CAACC,KAAaA,EAAU,SAAS,KAClC,kBAAChF,GAAD;KAAO,WAAU;KAAa,MAAA;KAAK,OAAM;KAAS,KAAI;KACpD,UAAAgF,EAAU,KAAK,GAAM,MACrB,kBAAC,QAAD;MAAuB,WAAU;MAAjC,UAAA;OACEb,IAAM,KACN,kBAACvE,GAAD;QAAM,KAAI;QAAO,MAAK;QAAW,WAAU;QAAS,UAAA;OAAY,CAAA;OAEhE,CAAC,CAACqF,EAAK,QACP,kBAAC,QAAD;QAAM,WAAU;QAAyB,UAAAA,EAAK;OAAW,CAAA;OAE1D,kBAACrF,GAAD;QAAM,MAAK;QAAK,MAAK;QAAa,UAAAqF,EAAK;OAAY,CAAA;MAC9C;KARK,GAAAA,EAAK,KAQV,CACN;IACK,CAAA;KAGN,CAAC,CAACC,KAAQ,CAAC,CAACC,MACb,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,CAAC,CAACD,KACF,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACC,kBAACE,IAAD,EAAU,WAAU,gCAAiC,CAAA,GACrD,kBAACxF,GAAD;OAAM,MAAK;OAAK,MAAK;OAAa,UAAAsF;MAAW,CAAA,CACzC;KAEL,CAAA,GAAA,CAAC,CAACC,KACF,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACC,kBAACE,IAAD,EAAW,WAAU,gCAAiC,CAAA,GACtD,kBAACzF,GAAD;OAAM,MAAK;OAAK,MAAK;OAAa,UAAAuF;MAAe,CAAA,CAC7C;KAEF,CAAA,CAAA;;IAGN,kBAACnE,GAAD,CAAY,CAAA;IAEZ,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACC,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACC,kBAAC,OAAD;OAAK,OAAM;OAAK,QAAO;OAAK,SAAQ;OAAY,WAAU;OAA1D,UAAA,CACC,kBAAC,UAAD;QACC,IAAG;QACH,IAAG;QACH,GAAE;QACF,MAAK;QACL,QAAO;QACP,aAAY;QACZ,WAAU;OACV,CAAA,GACD,kBAAC,UAAD;QACC,IAAG;QACH,IAAG;QACH,GAAE;QACF,MAAK;QACL,QAAO;QACP,aAAY;QACZ,iBAAiByD;QACjB,kBAAkBC;QAClB,eAAc;QACd,WAAU;QACV,WAAU;OACV,CAAA,CACG;MACL,CAAA,GAAA,kBAAC9E,GAAD;OAAM,MAAK;OAAK,QAAO;OAAvB,UAAA;QACE4E;QAAe;QAAED;QAAW;QAAEf,EAAQ;OAClC;MACF,CAAA,CAAA;KACL,CAAA,GAAA,kBAAC,OAAD,EAAK,WAAU,gCAAiC,CAAA,CAC5C;;GACC;;CACM,CAAA;AAEhB;AAEA,EAAqB,cAAc;;;AC1HnC,SAAgB8B,EAAmB,EAClC,UACA,gBACA,iBACA,UACA,eACA,gBACA,gBAAa,IACb,SACA,iBACA,YACA,gBAC2B;CAC3B,IAAMC,IACLC,MAAe,SACZ,eACAA,MAAe,WACd,eACA;CAEL,OACC,kBAACvE,GAAD;EACQ;EACM;EACJ;EACT,WAAW1B,EAAG,oCAAoC6C,CAAS;EAE3D,UAAA,kBAACpC,GAAD;GAAO,KAAI;GAAX,UAAA;IACC,kBAACA,GAAD;KAAO,WAAU;KAAa,MAAA;KAAK,OAAM;KAAS,KAAI;KACpD,UAAAqC,EAAa,KAAK,MAClB,kBAACtB,GAAD;MAEC,MAAMuB,EAAE;MAEP,UAAAA,EAAE;KACG,GAJDA,EAAE,KAID,CACP;IACK,CAAA;IAEP,kBAAC,OAAD;KAAK,WAAU;KACd,UAAA,kBAACzC,GAAD;MACC,KAAI;MACJ,WAAU;MAET,UAAA,OAAO4F,CAAK;KACL,CAAA;IACL,CAAA;IAEL,kBAACzF,GAAD;KAAO,WAAU;KAAa,OAAM;KAAS,SAAQ;KAAS,KAAI;KAChE,UAAA,MAAM,KAAK,EAAE,QAAQ0F,EAAW,IAAI,GAAG,MACvC,kBAAC,OAAD,EAEC,WAAWnG,EACV,6BACAsC,IAAI8D,IAAcJ,IAAW,UAC9B,EACA,GALK1D,CAKL,CACD;IACK,CAAA;IAEP,kBAACb,GAAD,CAAY,CAAA;IAEZ,kBAAChB,GAAD;KAAO,KAAI;KACT,UAAAuC,EAAK,KAAK,MACV,kBAACM,GAAD;MAEC,OAAO,kBAACjD,GAAD;OAAM,KAAI;OAAO,MAAK;OAAK,MAAK;OAAY,QAAO;OAAS,YAAW;OAAS,UAAA4C,EAAI;MAAY,CAAA;MACvG,OAAOA,EAAI;MACX,MAAA;MACA,gBAAe;KACf,GALKA,EAAI,KAKT,CACD;IACK,CAAA;IAEN,CAAC,CAACG,KAAgBA,EAAa,SAAS,KACxC,kBAAC3C,GAAD;KAAO,WAAU;KAAa,MAAA;KAAK,OAAM;KAAS,KAAI;KAAK,WAAU;KACnE,UAAA2C,EAAa,KAAK,MAClB,kBAAC5B,GAAD;MAEC,MAAMuB,EAAE;MAEP,UAAAA,EAAE;KACG,GAJDA,EAAE,KAID,CACP;IACK,CAAA;GAEF;;CACM,CAAA;AAEhB;AAEA,EAAmB,cAAc;;;ACjFjC,IAAasD,IAA8C;CAC1D,OAAO;CACP,aAAa;CACb,WAAW;AACZ,GCuBMC,KAAmD;CACxD,IAAI;CACJ,IAAI;CACJ,IAAI;AACL,GAEMC,KAAiF;CACtF,MAAM;CACN,MAAM;CACN,aAAa;CACb,cAAc;AACf,GAEMC,KAAwE;CAC7E,MAAM,KAAA;CACN,MAAM,KAAA;CACN,aAAa;CACb,cAAc;AACf,GAEaC,IAAaC,GAA4C,SAAoB,EACzF,UACA,gBACA,UACA,kBAAe,QACf,gBACA,YACA,WACA,YACA,YAAS,IACT,cACA,SAAS1C,GACT,gBACE,GAAK;CACP,IAAMC,IAAUC,EAAWmC,GAA0BrC,CAAW,GAC1D,EAAE,oBAAiBjE,EAAiB,GACpC4G,IAAkBC,KAAWC,KAAgB,MAE7CC,IAAgBvB,KAAStB,EAAQ,OACjC8C,IACLvB,MAAgB,KAAQ,OAAOA,KAAevB,EAAQ,aACjD+C,IAAYC,IAAcA,EAAY,EAAE,gBAAa,CAAC,IAAIC,GAC1DC,IAAY,CAAC,CAACH;CAEpB,OACC,kBAACtG,GAAD;EACM;EACL,MAAK;EACL,cAAY0G,KAAanD,EAAQ;EACjC,WAAWjE,EAAG,0BACbsG,GAAcK,IACdU,IAAS,uCAAuC,0BAChDxE,CACD;EARD,UAAA,CAUC,kBAACyE,GAAD;GAAa,WAAU;GAAvB,UAAA;IACE,CAAC,CAACH,KACF,kBAACxG,GAAD;KACC,SAAS4F,GAA2BgB;KACpC,WAAWvH,EAAG,sBAAsBwG,GAAkBe,EAAa;KAElE,UAAAP;IACU,CAAA;IAEb,kBAAC1G,GAAD;KACC,KAAI;KACJ,WAAU;KACV,aAAU;KAET,UAAAwG;IACO,CAAA;IACR,CAAC,CAACC,KACF,kBAAC1G,GAAD;KACC,MAAK;KACL,WAAU;KACV,aAAU;KAET,UAAA0G;IACI,CAAA;GAEK;EACX,CAAA,IAAA,CAAC,CAACS,KAAW,CAAC,CAACC,MAChB,kBAAC7G,GAAD;GAAc,WAAU;GAAxB,UAAA,CACE,CAAC,CAAC4G,KACF,kBAAC/G,GAAD;IAAO,WAAU;IAAa,KAAI;IAAK,SAAQ;IAAS,WAAU;IAChE,UAAA+G;GACK,CAAA,GAEP,CAAC,CAACC,KACF,kBAACpH,GAAD;IAAM,KAAI;IAAM,MAAK;IAAK,MAAK;IAAY,WAAU;IACnD,UAAAoH;GACI,CAAA,CAEM;EAET,CAAA,CAAA;;AAET,CAAC;AAED,EAAW,cAAc;;;AC1IzB,SAAgBC,EAA0B,EAAE,gBAA0C;CACrF,OACC,kBAAC,OAAD;EAAK,WAAW1H,EAAG,6DAA6D6C,CAAS;EAAG,eAAY;EAAxG,UAAA,CACC,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACC,kBAAC,OAAD,EAAK,WAAU,4BAA6B,CAAA;IAC5C,kBAAC,OAAD,EAAK,WAAU,iCAAkC,CAAA;IACjD,kBAAC,OAAD,EAAK,WAAU,gCAAiC,CAAA;GAC5C;EACL,CAAA,GAAA,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACC,kBAAC,OAAD,EAAK,WAAU,4BAA6B,CAAA;IAC5C,kBAAC,OAAD,EAAK,WAAU,iCAAkC,CAAA;IACjD,kBAAC,OAAD,EAAK,WAAU,gCAAiC,CAAA;IAChD,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACC,kBAAC,OAAD,EAAK,WAAU,mCAAoC,CAAA,GACnD,kBAAC,OAAD,EAAK,WAAU,gCAAiC,CAAA,CAC5C;;GACD;EACD,CAAA,CAAA;;AAEP;AAEA,EAA0B,cAAc;;;ACrBxC,SAAgB8E,EAAuB,EAAE,gBAA0C;CAClF,OACC,kBAAC,OAAD;EAAK,WAAW3H,EAAG,0DAA0D6C,CAAS;EAAG,eAAY;EAArG,UAAA,CACC,kBAAC,OAAD;GAAK,WAAU;GACd,UAAA,kBAAC,OAAD;IACC,SAAQ;IACR,WAAU;IACV,MAAK;IACL,QAAO;IACP,aAAY;IACZ,eAAc;IACd,gBAAe;IAEf,UAAA,kBAAC,QAAD,EAAM,GAAE,eAAgB,CAAA;GACpB,CAAA;EACD,CAAA,GACL,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACC,kBAAC,OAAD,EAAK,WAAU,mCAAoC,CAAA,GACnD,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACC,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACC,kBAAC,OAAD,EAAK,WAAU,iCAAkC,CAAA,GACjD,kBAAC,OAAD,EAAK,WAAU,gCAAiC,CAAA,CAC5C;IACL,CAAA,GAAA,kBAAC,OAAD,EAAK,WAAU,kCAAmC,CAAA,CAC9C;GACD,CAAA,CAAA;EACD,CAAA,CAAA;;AAEP;AAEA,EAAuB,cAAc;;;AC5BrC,SAAgB+E,GAAwB,EAAE,gBAA0C;CACnF,OACC,kBAAC,OAAD;EACC,WAAW5H,EACV,wCACA,0FACA6C,CACD;EACA,eAAY;EAEZ,UAAA,kBAACgF,IAAD,EAAQ,WAAU,+BAAgC,CAAA;CAC9C,CAAA;AAEP;AAEA,GAAwB,cAAc;;;ACftC,SAAgBC,GAAyB,EAAE,gBAA0C;CACpF,OACC,kBAAC,OAAD;EAAK,WAAW9H,EAAG,4DAA4D6C,CAAS;EAAG,eAAY;EAAvG,UAAA;GACC,kBAAC,OAAD,EAAK,WAAU,qGAAsG,CAAA;GACrH,kBAAC,OAAD,EAAK,WAAU,qGAAsG,CAAA;GACrH,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACC,kBAAC,OAAD,EAAK,WAAU,mCAAoC,CAAA,GACnD,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACC,kBAAC,OAAD,EAAK,WAAU,+BAAgC,CAAA,GAC/C,kBAAC,OAAD,EAAK,WAAU,gCAAiC,CAAA,CAC5C;IACD,CAAA,CAAA;;GACL,kBAAC,OAAD,EAAK,WAAU,uHAAwH,CAAA;EACnI;;AAEP;AAEA,GAAyB,cAAc;;;ACnBvC,SAAgBkF,GAAwB,EAAE,gBAA0C;CACnF,OACC,kBAAC,OAAD;EAAK,WAAW/H,EAAG,4FAA4F6C,CAAS;EAAG,eAAY;EAAvI,UAAA;GACC,kBAAC,OAAD,EAAK,WAAU,0EAA2E,CAAA;GAC1F,kBAAC,OAAD,EAAK,WAAU,sEAAuE,CAAA;GACtF,kBAAC,OAAD,EAAK,WAAU,2EAA4E,CAAA;EACvF;;AAEP;AAEA,GAAwB,cAAc;;;ACEtC,IAAamF,KAAkD;CAC9D,sBAAsB,MAAU,GAAGxF,EAAM;CACzC,cAAc;AACf;;;AC8KA,SAASyF,GAAQ,GAAgB;CAChC,OAAO1F,KAAU,QAA+BA,MAAU;AAC3D;AAEA,SAAS2F,GAAiB,GAA+B,IAAA,KAA+B;CACvF,OACC,kBAAChH,GAAD;EAAY,MAAK;EAAU,WAAWlB,EAAG,6BAA6B6C,CAAS;EAC7E,UAAAsF;CACU,CAAA;AAEd;AAEA,SAASC,GAAY,GAAsB;CAC1C,MAAU,MAAM,wCAAwC;AACzD;AAEA,SAAgBC,EAAc,GAA2B;CACxD,IAAIC,EAAM,SAAS,QAAQ,OAAO,kBAAA1I,GAAA,EAAA,UAAG0I,EAAM,KAAO,CAAA;CAGlD,IAFIA,EAAM,SAAS,WAEfA,EAAM,SAAS,UAAUL,GAAQK,EAAM,KAAK,GAC/C,OAAOJ,GAAiBI,EAAM,WAAWA,EAAM,UAAU;CAG1D,QAAQA,EAAM,MAAd;EACC,KAAK,KAAA;EACL,KAAK,QACJ,OACC,kBAACzH,GAAD;GAAO,MAAK;GAAU,WAAWb,EAAG,6BAA6BsI,EAAM,SAAS;GAC9E,UAAAA,EAAM,WAAWA,EAAM;EAClB,CAAA;EAET,KAAK,QACJ,OACC,kBAACtH,GAAD;GAAW,MAAK;GAAU,WAAWhB,EAAG,6BAA6BsI,EAAM,SAAS;GAClF,UAAAA,EAAM,WAAWA,EAAM;EACd,CAAA;EAEb,KAAK,SACJ,OAAO,kBAACrH,GAAD;GAAO,OAAOqH,EAAM;GAAO,SAASA,EAAM;GAAS,YAAYA,EAAM;GAAY,WAAWtI,EAAG,6BAA6BsI,EAAM,SAAS;EAAI,CAAA;EACvJ,KAAK,SACJ,OAAO,kBAACxH,GAAD;GAAO,OAAOwH,EAAM;GAAO,SAASA,EAAM;GAAS,YAAYA,EAAM;GAAY,WAAWtI,EAAG,6BAA6BsI,EAAM,SAAS;EAAI,CAAA;EACvJ,KAAK,OACJ,OAAO,kBAACvH,GAAD;GAAK,OAAOuH,EAAM;GAAO,SAASA,EAAM;GAAS,YAAYA,EAAM;GAAY,WAAWtI,EAAG,6BAA6BsI,EAAM,SAAS;EAAI,CAAA;EACrJ,KAAK,QACJ,OACC,kBAACzI,GAAD;GAAM,MAAMyI,EAAM;GAAM,YAAYA,EAAM;GAAY,WAAWtI,EAAG,6BAA6BsI,EAAM,SAAS;GAC9G,UAAAA,EAAM,WAAWA,EAAM,SAASA,EAAM;EAClC,CAAA;EAER,KAAK,QACJ,OAAO,kBAACxI,GAAD;GAAW,OAAOwI,EAAM;GAAO,QAAQA,EAAM;GAAY,QAAQA,EAAM;GAAY,QAAQA,EAAM;GAAY,YAAYA,EAAM;GAAY,MAAK;GAAU,WAAWtI,EAAG,6BAA6BsI,EAAM,SAAS;EAAI,CAAA;EAChO,KAAK,QACJ,OAAO,kBAACjH,GAAD;GAAM,OAAOiH,EAAM;GAAO,QAAQA,EAAM;GAAY,QAAQA,EAAM;GAAY,QAAQA,EAAM;GAAY,YAAYA,EAAM;GAAY,MAAK;GAAU,WAAWtI,EAAG,6BAA6BsI,EAAM,SAAS;EAAI,CAAA;EAC3N,KAAK,YACJ,OAAO,kBAAChH,GAAD;GAAU,OAAOgH,EAAM;GAAO,QAAQA,EAAM;GAAY,YAAYA,EAAM;GAAY,QAAQA,EAAM;GAAY,QAAQA,EAAM;GAAY,YAAYA,EAAM;GAAY,MAAK;GAAU,WAAWtI,EAAG,6BAA6BsI,EAAM,SAAS;EAAI,CAAA;EAC7P,KAAK,SACJ,OACC,kBAAClH,GAAD;GACC,QAAQkH,EAAM;GACd,UAAUA,EAAM;GAChB,MAAMA,EAAM;GACZ,gBAAgBA,EAAM;GACtB,QAAQA,EAAM;GACd,iBAAiBA,EAAM;GACvB,YAAYA,EAAM;GAClB,uBAAuBA,EAAM;GAC7B,uBAAuBA,EAAM;GAC7B,QAAQA,EAAM;GACd,YAAYA,EAAM;GAClB,MAAK;GACL,WAAWtI,EAAG,6BAA6BsI,EAAM,SAAS;EAC1D,CAAA;EAEH,KAAK,SACJ,OACC,kBAAC9G,GAAD;GACC,MAAM8G,EAAM,aAAa;GACzB,MAAMA,EAAM;GACZ,QAAA;GACA,WAAWtI,EAAG,2DAA2DsI,EAAM,SAAS;GAEvF,UAAAA,EAAM,WAAWA,EAAM;EAClB,CAAA;EAET,SACC,OAAOF,GAAYE,CAAK;CAC1B;AACD;AAEA,EAAc,cAAc;;;AC1L5B,IAAMC,KAA+E;CACpF,GAAG;CACH,GAAG;EAAE,MAAM;EAAG,IAAI;CAAE;CACpB,GAAG;EAAE,MAAM;EAAG,IAAI;EAAG,IAAI;CAAE;CAC3B,GAAG;EAAE,MAAM;EAAG,IAAI;EAAG,IAAI;EAAG,IAAI;CAAE;AACnC;AAEA,SAASC,GACR,GACiC;CACjC,OAAO,OAAOC,KAAY,WAAWA,IAAUF,GAAsBE;AACtE;AAEA,IAAMC,KAAc,GAAwB,MACvCpE,EAAK,KACDA,EAAK,KAIN,YADU,OAAOA,EAAK,SAAU,WAAWA,EAAK,QAAQ,GAAGqE,IACtC,GAAGA;AAGhC,SAASC,GAAyB,GAAkD;CACnF,OAAO,OAAOrG,KAAU,YAAY,OAAOA,KAAU;AACtD;AAEA,SAASsG,GAA0B,GAAkD;CACpF,OACC,OAAOtG,KAAU,cACjBA,KACA,CAACL,EAAM,eAAeK,CAAK,KAC3B,CAAC,MAAM,QAAQA,CAAK,MACnB,UAAUA,KAAS,UAAUA,KAAS,WAAWA;AAEpD;AAEA,SAASuG,EAAoB,EAC5B,UACA,iBACA,eACA,gBAME;CAuBF,OAtBID,GAA0BtG,CAAK,IAC9BA,EAAM,SAAS,SAAe,kBAAC8F,GAAD,EAAe,GAAI9F,EAAQ,CAAA,IAE5D,kBAAC8F,GAAD;EACC,GAAI9F;EACJ,YAAYA,EAAM,cAAc4F;EAChC,WAAWnI,EAAG+I,GAAWxG,EAAM,SAAS;CACxC,CAAA,IAICqG,GAAyBrG,CAAK,IAEhC,kBAAC8F,GAAD;EACQ;EACP,MAAMW,IAAe,UAAU;EACnB;EACZ,WAAWD;CACX,CAAA,IAIIxG;AACR;AAEA,SAAS0G,EAAoB,EAC5B,iBACA,gBAIE;CACF,IAAM,EAAE,cAAW,GAAGX,MAAUY;CAChC,OACC,kBAAChJ,GAAD;EACC,GAAIoI;EACJ,MAAK;EACL,MAAK;EACL,aAAY;EACZ,MAAK;EAAK,UAAA;EACV,WAAWtI,EACV,+HACA,iEACA,8EACA6C,CACD;EACA,cAAYuE;EAEZ,UAAA,kBAAC+B,IAAD,EAAM,WAAU,2BAA4B,CAAA;CACrC,CAAA;AAEV;AAEA,SAAgBC,GAAa,EAC5B,UACA,aAAU,GACV,aAAU,WACV,gBAAA,KACA,UACA,oBAAiB,IACjB,cACA,YAAS,QACT,eAAY,MACZ,mBAAgB,IAChB,SAASpF,KACY;CACrB,IAAMC,IAAUC,EAAW8D,IAA4BhE,CAAW,GAC5DqF,IAAOnH,EAAM,cAAcmC,EAAM,OAAO,OAAO,GAAG,CAACA,CAAK,CAAC;CAE/D,IAAIgF,EAAK,WAAW,GACnB,OAAO;CAGR,IAAMC,IAAYC,MAAY,WACxBC,IAAY,6BACZT,IAAY/I,EAAG,wBAAwBsJ,IAAY,YAAY,SAAS,GACxEG,IAAiB,qBACjBC,IAAWnE,KAAU,MACrBoE,IAAsBD,KAAYE;CAExC,IAAIhG,MAAW,UAAU;EACxB,IAAMiG,IACL,OAAOC,KAAkB,WACtBA,IACAA,IACC,QACA;EAEL,OACC,kBAAC,OAAD;GAAK,WAAW9J,EAAG,4BAA4B,oDAAoD6C,CAAS;GAA5G,UAAA;IACE,CAAC,CAAC6G,KACF,kBAACnJ,GAAD;KAAc,KAAI;KAAM,WAAWP,EAAG,wBAAwByJ,CAAc;KAC1E,UAAAlE;IACY,CAAA;IAGd,CAAC,CAACoE,KAAuB,kBAAClI,GAAD,EAAW,WAAU,6CAA8C,CAAA;IAE7F,kBAAChB,GAAD;KACC,WAAU;KACV,KAAK6I,IAAY,OAAO;KACxB,WAAU;KAET,UAAAD,EAAK,KAAK,GAAM,MAAU;MAC1B,IAAMU,IAAMrB,EAAWpE,GAAMqE,CAAK,GAC5BqB,IAAsB1F,EAAK,cAAc6D,GACzCa,IAAe1E,EAAK,UAAU,QAAQA,EAAK,UAAU,KAAA,GACrD/B,IAAQ+B,EAAK,SAAS0F,GACtBC,IAAO3F,EAAK,MACZ4F,IAAa5F,EAAK,YAAY,QAAQA,EAAK,YAAY,KAAA,GACvD6F,IAAkB,OAAO7F,EAAK,UAAW,YACzC8F,IAAoBP,KAAqBlB,IAAQU,EAAK,SAAS;MAErE,OACC,kBAACnH,EAAM,UAAP,EAAA,UAAA,CACC,kBAACzB,GAAD;OAAO,WAAU;OAAa,KAAI;OAAK,WAAU;OAAjD,UAAA;QACE,CAAC,CAACwJ,KACF,kBAACA,GAAD,EACC,WAAWjK,EACV,iBACAsJ,IAAY,iBAAiB,aAC7B,uBACD,EACA,CAAA;QAQF,kBAAC7I,GAAD;SAAO,WAAU;SAAa,KAAI;SAAO,OAAM;SAAW,WAAU;SAApE,UAAA;UACA,kBAACF,GAAD;WAAc,WAAWP,EAAG,0CAA0CwJ,CAAS;WAC7E,UAAAlF,EAAK;UACO,CAAA;UAEb,CAAC,CAAC4F,KACF,kBAAC/J,GAAD,EAAA,UAAA,CACC,kBAACF,GAAD,EACC,SAAS,MACR,kBAACgJ,GAAD;WACe;WACd,WAAW,OAAO3E,EAAK,SAAU,WAAWL,EAAQ,oBAAoBK,EAAK,KAAK,IAAIL,EAAQ;UAC9F,CAAA,EAEF,CAAA,GACD,kBAAC7D,GAAD;WACC,MAAK;WACL,OAAM;WACN,WAAU;WAEV,UAAA,kBAACC,GAAD;YAAM,MAAK;YAAU,MAAK;YAAM,UAAAiE,EAAK;WAAc,CAAA;UACpC,CAAA,CACR,EAAA,CAAA;UAGV,kBAACjE,GAAD;WACC,MAAK;WACL,MAAK;WAEJ,UAAAgK;UACI,CAAA;SACC;;QAENF,IAAkB7F,EAAK,SAASA,CAAI,IAAIwE,EAAoB;SAC5D;SACA;SACA,YAAYkB;SACZ,WAAWhK,EAAG+I,GAAW,eAAe;QACzC,CAAC;OACK;MAEN,CAAA,GAAA,CAAC,CAACqB,KACF,kBAAC/J,GAAD;OACC,MAAK;OACL,MAAK;OACL,WAAU;OAET,UAAAwJ;MACI,CAAA,CAEQ,EAAA,GAnEKE,CAmEL;KAElB,CAAC;IACK,CAAA;GACH;;CAEP;CAEA,IAAInG,MAAW,QAAQ;EACtB,IAAM0G,IAAchB,IAAY,gBAAgB;EAChD,OACC,kBAAC,OAAD;GAAK,WAAWtJ,EAAG,4BAA4B,oDAAoD6C,CAAS;GAA5G,UAAA;IACE,CAAC,CAAC6G,KACF,kBAACnJ,GAAD;KAAc,KAAI;KAAM,WAAWP,EAAG,oCAAoCyJ,CAAc;KACtF,UAAAlE;IACY,CAAA;IAEd,CAAC,CAACoE,KAAuB,kBAAClI,GAAD,EAAW,WAAU,6CAA8C,CAAA;IAC7F,kBAAChB,GAAD;KAAO,QAAQ,kBAAC,MAAD,CAAK,CAAA;KAAG,KAAI;KAAO,WAAU;KAC1C,UAAA4I,EAAK,KAAK,GAAM,MAAU;MAC1B,IAAMU,IAAMrB,EAAWpE,GAAMqE,CAAK,GAC5BqB,IAAsB1F,EAAK,cAAc6D,GACzCa,IAAe1E,EAAK,UAAU,QAAQA,EAAK,UAAU,KAAA,GACrD/B,IAAQ+B,EAAK,SAAS0F,GACtBC,IAAO3F,EAAK,MACZ4F,IAAa5F,EAAK,YAAY,QAAQA,EAAK,YAAY,KAAA,GACvD6F,IAAkB,OAAO7F,EAAK,UAAW;MAE/C,OACC,kBAAC,OAAD;OAEC,WAAWtE,EAAG,iHAAiHsK,CAAW;OAF3I,UAAA,CAIC,kBAAC,MAAD;QAAI,WAAU;QAAd,UAAA;SACE,CAAC,CAACL,KACF,kBAACA,GAAD,EAAM,WAAWjK,EAAG,uCAAuCsJ,IAAY,iBAAiB,WAAW,EAAI,CAAA;SAExG,kBAAC/I,GAAD;UAAc,WAAWP,EAAG,iCAAiCwJ,CAAS;UACpE,UAAAlF,EAAK;SACO,CAAA;SACb,CAAC,CAAC4F,KACF,kBAAC/J,GAAD,EAAA,UAAA,CACC,kBAACF,GAAD,EACC,SAAS,MACR,kBAACgJ,GAAD;UACe;UACd,WAAW,OAAO3E,EAAK,SAAU,WAAWL,EAAQ,oBAAoBK,EAAK,KAAK,IAAIL,EAAQ;SAC9F,CAAA,EAEF,CAAA,GACD,kBAAC7D,GAAD;UAAgB,MAAK;UAAM,OAAM;UAAQ,WAAU;UAClD,UAAA,kBAACC,GAAD;WAAM,MAAK;WAAU,MAAK;WAAM,UAAAiE,EAAK;UAAc,CAAA;SACpC,CAAA,CACR,EAAA,CAAA;QAEP;OACJ,CAAA,GAAA,kBAAC,MAAD;QAAI,WAAU;QAAd,UAAA,CACE6F,IAAkB7F,EAAK,SAASA,CAAI,IAAIwE,EAAoB;SAC5D;SACA;SACA,YAAYkB;SACZ,WAAWhK,EAAG+I,GAAW,2BAA2B;QACrD,CAAC,GACA,CAAC,CAACzE,EAAK,eACP,kBAACjE,GAAD;SAAM,MAAK;SAAU,MAAK;SAAY,WAAU;SAC9C,UAAAiE,EAAK;QACD,CAAA,CAEJ;OACA,CAAA,CAAA;MAvCC,GAAAyF,CAuCD;KAEP,CAAC;IACK,CAAA;GACH;;CAEP;CAEA,OACC,kBAAC,OAAD;EAAK,WAAW/J,EAAG,4BAA4B,oDAAoD6C,CAAS;EAA5G,UAAA;GACE,CAAC,CAAC6G,KACF,kBAACnJ,GAAD;IAAc,KAAI;IAAM,WAAWP,EAAG,wBAAwByJ,CAAc;IAC1E,UAAAlE;GACY,CAAA;GAGd,CAAC,CAACoE,KAAuB,kBAAClI,GAAD,EAAW,WAAU,6CAA8C,CAAA;GAE7F,kBAACjB,GAAD;IACC,SAASgI,GAAuBC,CAAO;IACvC,KAAKa,IAAY,OAAO;IACxB,OAAM;IACN,WAAU;IAET,UAAAD,EAAK,KAAK,GAAM,MAAU;KAC1B,IAAMU,IAAMrB,EAAWpE,GAAMqE,CAAK,GAC5BqB,IAAsB1F,EAAK,cAAc6D,GACzCa,IAAe1E,EAAK,UAAU,QAAQA,EAAK,UAAU,KAAA,GACrD/B,IAAQ+B,EAAK,SAAS0F,GACtBC,IAAO3F,EAAK,MACZ4F,IAAa5F,EAAK,YAAY,QAAQA,EAAK,YAAY,KAAA,GACvD6F,IAAkB,OAAO7F,EAAK,UAAW;KAE/C,OACC,kBAAC7D,GAAD;MAEC,KAAI;MACJ,WAAU;MAHX,UAAA;OAKC,kBAAC,OAAD;QAAK,WAAU;QAAf,UAAA;SACE,CAAC,CAACwJ,KACF,kBAACA,GAAD,EACC,WAAWjK,EACV,iBACAsJ,IAAY,iBAAiB,aAC7B,uBACD,EACA,CAAA;SAGF,kBAAC/I,GAAD;UAAc,WAAWP,EAAG,wBAAwBwJ,CAAS;UAC3D,UAAAlF,EAAK;SACO,CAAA;SAEb,CAAC,CAAC4F,KACF,kBAAC/J,GAAD,EAAA,UAAA,CACC,kBAACF,GAAD,EACC,SAAS,MACR,kBAACgJ,GAAD;UACe;UACd,WAAW,OAAO3E,EAAK,SAAU,WAAWL,EAAQ,oBAAoBK,EAAK,KAAK,IAAIL,EAAQ;SAC9F,CAAA,EAEF,CAAA,GACD,kBAAC7D,GAAD;UACC,MAAK;UACL,OAAM;UACN,WAAU;UAEV,UAAA,kBAACC,GAAD;WAAM,MAAK;WAAU,MAAK;WAAM,UAAAiE,EAAK;UAAc,CAAA;SACpC,CAAA,CACR,EAAA,CAAA;QAEN;;OAEJ6F,IAAkB7F,EAAK,SAASA,CAAI,IAAIwE,EAAoB;QAC5D;QACA;QACA,YAAYkB;QACZ,WAAWhK,EAAG+I,GAAW,eAAe;OACzC,CAAC;OAEA,CAAC,CAACzE,EAAK,eACP,kBAACjE,GAAD;QACC,MAAK;QACL,MAAK;QACL,WAAU;QAET,UAAAiE,EAAK;OACD,CAAA;MAED;KAxDD,GAAAyF,CAwDC;IAET,CAAC;GACI,CAAA;EACF;;AAEP;AAEA,GAAa,cAAc;;;ACvc3B,SAASQ,GAAiB,GAAiD;CAS1E,OARK7H,IACD,OAAOA,KAAU,YAAY,CAAC,MAAM,QAAQA,CAAK,KAAK,WAAWA,IAEnE,kBAAClB,GAAD;EAAO,QAAA;EAAO,MAAMkB,EAAM,QAAQ;EAAa,MAAMA,EAAM;EACzD,UAAAA,EAAM;CACD,CAAA,IAGFA,IARY;AASpB;AAEA,IAAa8H,IAAwB9D,GAAuD,SAA+B,EAC1H,SACA,UACA,eACA,cACA,iBACA,sBACA,uBACA,iBACA,gBACA,cACA,oBACA,kBACA,GAAG4B,KACD,GAAK;CACP,IAAMmC,IACL,CAAC,CAACC,KACF,CAAC,CAACC,KACF,CAAC,CAACC,KACF,CAAC,CAACC,KACF,CAAC,CAACC;CAEH,OACC,kBAACrK,GAAD;EACM;EACL,WAAWT,EAAG,sCAAsC6C,CAAS;EAC7D,GAAIyF;EAHL,UAAA,CAKC,kBAAC7H,GAAD;GAAO,WAAU;GAAa,KAAI;GAAK,OAAM;GAAQ,SAAQ;GAAU,MAAM;GAAO,WAAWT,EAAG,mCAAmC+K,CAAe;GAApJ,UAAA,CACC,kBAACtK,GAAD;IAAO,WAAU;IAAa,KAAI;IAAK,OAAM;IAAQ,MAAM;IAAO,WAAU;IAA5E,UAAA,CACE,CAAC,CAACuK,KACF,kBAAC,OAAD;KAAK,WAAU;KACb,UAAAA;IACG,CAAA,GAEN,kBAAC,OAAD;KAAK,WAAU;KACd,UAAA,kBAACvK,GAAD;MAAO,WAAU;MAAa,KAAI;MAAK,WAAU;MAAjD,UAAA,CACC,kBAACJ,GAAD;OAAM,KAAI;OAAM,QAAO;OAAS,WAAU;OACxC,UAAAkF;MACI,CAAA,GACL,CAAC,CAAC0F,KACF,kBAAC,QAAD;OAAM,WAAU;OACd,UAAAV,GAAiBU,CAAU;MACvB,CAAA,CAED;;IACH,CAAA,CACC;GACN,CAAA,GAAA,CAAC,CAACC,KACF,kBAAC,OAAD;IAAK,WAAU;IACb,UAAAA;GACG,CAAA,CAEA;EAEN,CAAA,GAAA,CAAC,CAACT,KACF,kBAAChK,GAAD;GAAO,WAAWT,EAAG,iCAAiCmL,CAAa;GAAnE,UAAA;IACE,CAAC,CAACT,KAAa,kBAAC,OAAD;KAAK,WAAU;KAAkC,UAAAA;IAAe,CAAA;IAC/E,CAAC,CAACG,KAAgB,kBAAC,OAAD;KAAK,WAAU;KAAqC,UAAAA;IAAkB,CAAA;IACxF,CAAC,CAACF,KAAgB,kBAAC,OAAD;KAAK,WAAU;KAAqC,UAAAA;IAAkB,CAAA;IACxF,CAAC,CAACC,KAAqB,kBAAC,OAAD;KAAK,WAAU;KAA2C,UAAAA;IAAuB,CAAA;IACxG,CAAC,CAACE,KAAe,kBAAC,OAAD;KAAK,WAAU;KAAoC,UAAAA;IAAiB,CAAA;GAChF;EAEF,CAAA,CAAA;;AAET,CAAC;AAED,EAAsB,cAAc"}
|