themelia-react-ui 2.0.6 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +250 -0
- package/MIGRATION.md +746 -7
- package/README.md +27 -23
- package/dist/{accordion-0tQUZ20r.js → accordion-DNVqwEIC.js} +36 -36
- package/dist/accordion-DNVqwEIC.js.map +1 -0
- package/dist/action-menu-D5343RwT.js +286 -0
- package/dist/action-menu-D5343RwT.js.map +1 -0
- package/dist/ai-artifact-otrz9ZwS.js +1214 -0
- package/dist/ai-artifact-otrz9ZwS.js.map +1 -0
- package/dist/anchored-positioning-1U_eBFNx.js +9 -0
- package/dist/anchored-positioning-1U_eBFNx.js.map +1 -0
- package/dist/app-shell-CPN30Nb1.js +372 -0
- package/dist/app-shell-CPN30Nb1.js.map +1 -0
- package/dist/{attachment-BCpA4e7i.js → attachment-D2-fpfmv.js} +15 -15
- package/dist/{attachment-BCpA4e7i.js.map → attachment-D2-fpfmv.js.map} +1 -1
- package/dist/{auth-B0girIk_.js → auth-g_oUTDDC.js} +234 -241
- package/dist/auth-g_oUTDDC.js.map +1 -0
- package/dist/{avatar-B9Jnp-T-.js → avatar-Ca3Ihrq4.js} +4 -4
- package/dist/{avatar-B9Jnp-T-.js.map → avatar-Ca3Ihrq4.js.map} +1 -1
- package/dist/{badge-wWauMgAt.js → badge-oGiXblW7.js} +8 -9
- package/dist/badge-oGiXblW7.js.map +1 -0
- package/dist/base/accordion.js +1 -1
- package/dist/base/action-menu.js +1 -1
- package/dist/base/attachment.js +1 -1
- package/dist/base/avatar.js +1 -1
- package/dist/base/badge.js +1 -1
- package/dist/base/batch-action-bar.js +1 -1
- package/dist/base/buttons.js +2 -2
- package/dist/base/cards.js +3 -3
- package/dist/base/carousel.js +11 -11
- package/dist/base/carousel.js.map +1 -1
- package/dist/base/cascader.js +1 -1
- package/dist/base/chart.js +1 -1
- package/dist/base/choice-inputs.js +2 -2
- package/dist/base/code-block.js +1 -1
- package/dist/base/combobox.js +1 -1
- package/dist/base/command.js +1 -1
- package/dist/base/copyable.js +1 -1
- package/dist/base/date-pickers.js +2 -2
- package/dist/base/display.js +7 -7
- package/dist/base/feedback.js +4 -4
- package/dist/base/forms-numeric.js +2 -2
- package/dist/base/forms.js +2 -2
- package/dist/base/inline-edit.js +13 -13
- package/dist/base/inline-edit.js.map +1 -1
- package/dist/base/item.js +1 -1
- package/dist/base/media-gallery.js +203 -2
- package/dist/base/media-gallery.js.map +1 -0
- package/dist/base/metadata-list.js +1 -1
- package/dist/base/navigation.js +7 -7
- package/dist/base/popover-menu.js +1 -1
- package/dist/base/popover.js +1 -1
- package/dist/base/qr-code.js +32 -22
- package/dist/base/qr-code.js.map +1 -1
- package/dist/base/repeaters.js +91 -88
- package/dist/base/repeaters.js.map +1 -1
- package/dist/base/sidebar.js +2 -2
- package/dist/base/signature-pad.js +14 -14
- package/dist/base/signature-pad.js.map +1 -1
- package/dist/base/skeleton.js +1 -1
- package/dist/base/spinner.js +6 -12
- package/dist/base/spinner.js.map +1 -1
- package/dist/base/structure.js +1 -1
- package/dist/base/table.js +1 -1
- package/dist/base/text-inputs.js +3 -3
- package/dist/base/toaster.js +2 -2
- package/dist/base/tree.js +2 -2
- package/dist/base/upload-queue.js +303 -2
- package/dist/base/upload-queue.js.map +1 -0
- package/dist/base/upload.js +3 -4
- package/dist/base/value-inputs.js +1 -1
- package/dist/{batch-action-bar-BoqWIIpV.js → batch-action-bar-D6MZQNnC.js} +10 -10
- package/dist/{batch-action-bar-BoqWIIpV.js.map → batch-action-bar-D6MZQNnC.js.map} +1 -1
- package/dist/blocks/admin.js +242 -228
- package/dist/blocks/admin.js.map +1 -1
- package/dist/blocks/ai.js +395 -357
- package/dist/blocks/ai.js.map +1 -1
- package/dist/blocks/analytics/charts.js +1022 -0
- package/dist/blocks/analytics/charts.js.map +1 -0
- package/dist/blocks/analytics/usage-card.js +1 -1
- package/dist/blocks/analytics.js +171 -1365
- package/dist/blocks/analytics.js.map +1 -1
- package/dist/blocks/collaboration.js +1 -1
- package/dist/blocks/commerce/receipt.js +1 -1
- package/dist/blocks/commerce.js +1487 -1358
- package/dist/blocks/commerce.js.map +1 -1
- package/dist/blocks/data-display.js +2 -3
- package/dist/blocks/onboarding.js +91 -82
- package/dist/blocks/onboarding.js.map +1 -1
- package/dist/blocks/planning.js +25 -25
- package/dist/blocks/planning.js.map +1 -1
- package/dist/blocks/timelines.js +2 -2
- package/dist/{breadcrumbs-Bp9Ke7kd.js → breadcrumbs-CQ9JSlez.js} +52 -45
- package/dist/breadcrumbs-CQ9JSlez.js.map +1 -0
- package/dist/{button-ChBovTx0.js → button-rd6FiHfQ.js} +12 -8
- package/dist/button-rd6FiHfQ.js.map +1 -0
- package/dist/{buttons-DeW0bQeK.js → buttons-pZVgPTZn.js} +230 -246
- package/dist/buttons-pZVgPTZn.js.map +1 -0
- package/dist/{cards-CNXnmvV5.js → cards-CgWyqvgZ.js} +25 -22
- package/dist/{cards-CNXnmvV5.js.map → cards-CgWyqvgZ.js.map} +1 -1
- package/dist/cascader-Cf05pwaq.js +444 -0
- package/dist/cascader-Cf05pwaq.js.map +1 -0
- package/dist/{chart-I7ROnsl8.js → chart-CygRCyIZ.js} +5 -5
- package/dist/{chart-I7ROnsl8.js.map → chart-CygRCyIZ.js.map} +1 -1
- package/dist/{checkbox-MoyHIAPs.js → checkbox-Dy5_XBMZ.js} +4 -4
- package/dist/{checkbox-MoyHIAPs.js.map → checkbox-Dy5_XBMZ.js.map} +1 -1
- package/dist/{choice-inputs-DHGtx0QV.js → choice-inputs-oJEsrb5Y.js} +113 -114
- package/dist/choice-inputs-oJEsrb5Y.js.map +1 -0
- package/dist/{code-block-BSJyq9e-.js → code-block-BrLD7mCi.js} +44 -60
- package/dist/code-block-BrLD7mCi.js.map +1 -0
- package/dist/collapsible-CRCCg_bO.js +80 -0
- package/dist/collapsible-CRCCg_bO.js.map +1 -0
- package/dist/{collection-content-CSnwtOTH.js → collection-content-D7SoDlYd.js} +3 -3
- package/dist/{collection-content-CSnwtOTH.js.map → collection-content-D7SoDlYd.js.map} +1 -1
- package/dist/combobox-Dl6f6kHz.js +362 -0
- package/dist/combobox-Dl6f6kHz.js.map +1 -0
- package/dist/combobox-DrDXtSSt.js +929 -0
- package/dist/combobox-DrDXtSSt.js.map +1 -0
- package/dist/command-CjZ2VzKC.js +432 -0
- package/dist/command-CjZ2VzKC.js.map +1 -0
- package/dist/comments-C2MZyRmh.js +1214 -0
- package/dist/comments-C2MZyRmh.js.map +1 -0
- package/dist/components/base/accordion/accordion.d.ts +11 -3
- package/dist/components/base/action-menu/action-menu.d.ts +11 -3
- package/dist/components/base/buttons/button.d.ts +2 -2
- package/dist/components/base/buttons/index.d.ts +1 -1
- package/dist/components/base/buttons/loader-button.d.ts +6 -15
- package/dist/components/base/cards/index.d.ts +1 -1
- package/dist/components/base/cards/partials/card-body-context.d.ts +6 -0
- package/dist/components/base/cards/smart-card.d.ts +0 -2
- package/dist/components/base/cards/smart-card.types.d.ts +12 -10
- package/dist/components/base/cascader/cascader.d.ts +8 -2
- package/dist/components/base/cascader/cascader.types.d.ts +24 -2
- package/dist/components/base/cascader/index.d.ts +1 -1
- package/dist/components/base/choice-inputs/switch.d.ts +1 -1
- package/dist/components/base/code-block/use-code-copy.d.ts +2 -6
- package/dist/components/base/command/command.d.ts +1 -1
- package/dist/components/base/date-pickers/datepicker.types.d.ts +1 -3
- package/dist/components/base/display/dialog.d.ts +3 -9
- package/dist/components/base/display/index.d.ts +2 -3
- package/dist/components/base/display/separator.d.ts +1 -1
- package/dist/components/base/feedback/alert.d.ts +2 -1
- package/dist/components/base/feedback/empty.d.ts +10 -2
- package/dist/components/base/forms/workflow.d.ts +2 -2
- package/dist/components/base/forms-numeric/dimensions-input.d.ts +9 -17
- package/dist/components/base/forms-numeric/index.d.ts +3 -3
- package/dist/components/base/item/item.types.d.ts +6 -2
- package/dist/components/base/metadata-list/index.d.ts +1 -3
- package/dist/components/base/metadata-list/metadata-list.d.ts +4 -1
- package/dist/components/base/navigation/index.d.ts +2 -2
- package/dist/components/base/navigation/language-switcher.d.ts +7 -6
- package/dist/components/base/navigation/navigation-tabs.d.ts +8 -1
- package/dist/components/base/navigation/page-header/index.d.ts +1 -1
- package/dist/components/base/navigation/page-header/page-header.d.ts +13 -17
- package/dist/components/base/navigation/pagination.d.ts +5 -5
- package/dist/components/base/popover/popover.recipes.d.ts +0 -1
- package/dist/components/base/qr-code/qr-code.d.ts +4 -0
- package/dist/components/base/repeaters/index.d.ts +1 -1
- package/dist/components/base/repeaters/key-value-editor.d.ts +4 -0
- package/dist/components/base/sheet/sheet.d.ts +6 -15
- package/dist/components/base/sidebar/index.d.ts +1 -6
- package/dist/components/base/sidebar/sidebar.d.ts +38 -10
- package/dist/components/base/skeleton/skeleton.d.ts +1 -1
- package/dist/components/base/structure/structure.types.d.ts +11 -2
- package/dist/components/base/text-inputs/index.d.ts +1 -1
- package/dist/components/base/tree/index.d.ts +1 -0
- package/dist/components/base/tree/tree.d.ts +2 -2
- package/dist/components/base/tree/tree.types.d.ts +7 -1
- package/dist/components/base/upload/file-upload.validation.d.ts +37 -1
- package/dist/components/base/upload/image-upload.d.ts +2 -0
- package/dist/components/base/upload/index.d.ts +3 -9
- package/dist/components/base/value-inputs/date-time-input.d.ts +4 -0
- package/dist/components/base/value-inputs/slider.d.ts +5 -2
- package/dist/components/blocks/admin/action-surfaces/index.d.ts +17 -4
- package/dist/components/blocks/admin/api-key-list/api-key-list.types.d.ts +9 -3
- package/dist/components/blocks/admin/index.d.ts +1 -1
- package/dist/components/blocks/ai/ai-artifact/ai-artifact.d.ts +1 -1
- package/dist/components/blocks/ai/ai-artifact/types.d.ts +9 -4
- package/dist/components/blocks/ai/ai-chain-of-thought/ai-chain-of-thought.d.ts +1 -1
- package/dist/components/blocks/ai/ai-chain-of-thought/types.d.ts +11 -1
- package/dist/components/blocks/ai/ai-citation/ai-citation.d.ts +1 -1
- package/dist/components/blocks/ai/ai-citation/types.d.ts +6 -0
- package/dist/components/blocks/ai/ai-confirmation/ai-confirmation.d.ts +1 -1
- package/dist/components/blocks/ai/ai-confirmation/types.d.ts +21 -5
- package/dist/components/blocks/ai/ai-feedback/types.d.ts +7 -2
- package/dist/components/blocks/ai/ai-inline-citation/types.d.ts +9 -3
- package/dist/components/blocks/ai/ai-package-info/ai-package-info.d.ts +1 -1
- package/dist/components/blocks/ai/ai-package-info/types.d.ts +6 -0
- package/dist/components/blocks/ai/ai-sources/ai-sources.d.ts +1 -1
- package/dist/components/blocks/ai/ai-sources/types.d.ts +8 -2
- package/dist/components/blocks/ai/ai-task/ai-task.d.ts +1 -1
- package/dist/components/blocks/ai/ai-task/types.d.ts +10 -1
- package/dist/components/blocks/ai/ai-tool-call/ai-tool-call.d.ts +1 -1
- package/dist/components/blocks/ai/ai-tool-call/types.d.ts +6 -0
- package/dist/components/blocks/ai/ai.strings.d.ts +2 -0
- package/dist/components/blocks/analytics/activity-heatmap/types.d.ts +1 -1
- package/dist/components/blocks/analytics/analytics.strings.d.ts +2 -0
- package/dist/components/blocks/analytics/atoms/metric-trend-chip.d.ts +11 -1
- package/dist/components/blocks/analytics/chart-card/chart-card.d.ts +7 -5
- package/dist/components/blocks/analytics/charts/index.d.ts +27 -0
- package/dist/components/blocks/analytics/index.d.ts +17 -24
- package/dist/components/blocks/analytics/metric/metric.d.ts +5 -5
- package/dist/components/blocks/analytics/metric-grid/metric-grid.d.ts +2 -2
- package/dist/components/blocks/analytics/types.d.ts +12 -3
- package/dist/components/blocks/analytics/usage-card/usage-card.strings.d.ts +2 -0
- package/dist/components/blocks/commerce/address-card/address-card.d.ts +1 -1
- package/dist/components/blocks/commerce/address-card/types.d.ts +5 -16
- package/dist/components/blocks/commerce/booking-calendar-event-card/booking-calendar-event-card.d.ts +2 -2
- package/dist/components/blocks/commerce/booking-calendar-event-card/booking-calendar-event-card.types.d.ts +6 -4
- package/dist/components/blocks/commerce/cart-summary/cart-summary.d.ts +0 -2
- package/dist/components/blocks/commerce/cart-summary/index.d.ts +2 -2
- package/dist/components/blocks/commerce/cart-summary/types.d.ts +9 -11
- package/dist/components/blocks/commerce/coupon-input/coupon-input.d.ts +1 -1
- package/dist/components/blocks/commerce/coupon-input/types.d.ts +7 -3
- package/dist/components/blocks/commerce/discount-stack/discount-stack.d.ts +0 -2
- package/dist/components/blocks/commerce/discount-stack/index.d.ts +2 -2
- package/dist/components/blocks/commerce/discount-stack/types.d.ts +4 -6
- package/dist/components/blocks/commerce/fulfillment-group/fulfillment-group.d.ts +1 -1
- package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +2 -0
- package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-balance.d.ts +18 -0
- package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-compact.d.ts +1 -1
- package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-copy-button.d.ts +0 -1
- package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-dark.d.ts +1 -1
- package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-full.d.ts +1 -1
- package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-illustrated.d.ts +1 -1
- package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-minimal.d.ts +1 -1
- package/dist/components/blocks/commerce/giftcard-card/types.d.ts +16 -5
- package/dist/components/blocks/commerce/index.d.ts +8 -8
- package/dist/components/blocks/commerce/inventory-level/inventory-level.strings.d.ts +2 -0
- package/dist/components/blocks/commerce/inventory-level/types.d.ts +1 -1
- package/dist/components/blocks/commerce/inventory-section/types.d.ts +0 -5
- package/dist/components/blocks/commerce/invoice-line-items/types.d.ts +6 -3
- package/dist/components/blocks/commerce/loyalty-points/loyalty-points.d.ts +1 -1
- package/dist/components/blocks/commerce/loyalty-points/types.d.ts +11 -5
- package/dist/components/blocks/commerce/order-status/order-status.d.ts +1 -1
- package/dist/components/blocks/commerce/order-status/types.d.ts +8 -8
- package/dist/components/blocks/commerce/order-timeline/order-timeline.d.ts +1 -1
- package/dist/components/blocks/commerce/order-timeline/types.d.ts +3 -1
- package/dist/components/blocks/commerce/payment-method/index.d.ts +2 -2
- package/dist/components/blocks/commerce/payment-method/payment-method.d.ts +0 -8
- package/dist/components/blocks/commerce/payment-method/types.d.ts +0 -2
- package/dist/components/blocks/commerce/receipt/index.d.ts +1 -1
- package/dist/components/blocks/commerce/receipt/receipt-items.d.ts +1 -1
- package/dist/components/blocks/commerce/receipt/types.d.ts +10 -0
- package/dist/components/blocks/commerce/refund-status/index.d.ts +2 -2
- package/dist/components/blocks/commerce/refund-status/refund-status.d.ts +0 -2
- package/dist/components/blocks/commerce/refund-status/types.d.ts +0 -2
- package/dist/components/blocks/commerce/seo-listing/types.d.ts +7 -0
- package/dist/components/blocks/commerce/shared/code-entry.d.ts +39 -0
- package/dist/components/blocks/commerce/shared/order-status.d.ts +1 -1
- package/dist/components/blocks/commerce/subscription-summary/subscription-summary.d.ts +1 -1
- package/dist/components/blocks/commerce/subscription-summary/types.d.ts +10 -1
- package/dist/components/blocks/commerce/upcoming-booking/index.d.ts +2 -1
- package/dist/components/blocks/commerce/upcoming-booking/types.d.ts +8 -0
- package/dist/components/blocks/commerce/upcoming-booking/upcoming-booking.d.ts +2 -2
- package/dist/components/blocks/commerce/vendor-profile/types.d.ts +4 -5
- package/dist/components/blocks/commerce/voucher-entry/types.d.ts +6 -3
- package/dist/components/blocks/commerce/voucher-entry/voucher-entry.d.ts +1 -1
- package/dist/components/blocks/content-block-hooks.d.ts +22 -0
- package/dist/components/blocks/data-display/dense-info-card/dense-info.strings.d.ts +5 -1
- package/dist/components/blocks/data-display/dense-info-card/helpers.d.ts +3 -1
- package/dist/components/blocks/data-display/dense-info-card/index.d.ts +1 -1
- package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-classification.d.ts +1 -1
- package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-dashboard.d.ts +1 -1
- package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-financial.d.ts +1 -1
- package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-project.d.ts +1 -1
- package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-score.d.ts +1 -1
- package/dist/components/blocks/data-display/dense-info-card/types.d.ts +12 -5
- package/dist/components/blocks/data-display/empty-state/empty-state.types.d.ts +6 -0
- package/dist/components/blocks/data-display/index.d.ts +0 -1
- package/dist/components/blocks/data-display/relationship-card-frame.d.ts +1 -1
- package/dist/components/blocks/onboarding/checklist/checklist.types.d.ts +5 -3
- package/dist/components/blocks/planning/task-card.types.d.ts +7 -3
- package/dist/components/blocks/timelines/changelog/types.d.ts +2 -2
- package/dist/components/blocks/timelines/index.d.ts +2 -2
- package/dist/components/blocks/timelines/milestones/types.d.ts +2 -2
- package/dist/components/blocks/timelines/shared/timeline.d.ts +6 -0
- package/dist/components/blocks/timelines/steps-card/index.d.ts +2 -1
- package/dist/components/blocks/timelines/steps-card/steps-card.d.ts +2 -2
- package/dist/components/blocks/timelines/steps-card/types.d.ts +13 -1
- package/dist/components/features/activities/activities.strings.d.ts +5 -3
- package/dist/components/features/activities/activities.types.d.ts +28 -11
- package/dist/components/features/activities/hooks/use-activity-feed.d.ts +6 -0
- package/dist/components/features/activities/index.d.ts +1 -1
- package/dist/components/features/activities/partials/activity-headline.d.ts +5 -0
- package/dist/components/features/activities/partials/activity-row.d.ts +12 -13
- package/dist/components/features/activities/partials/row-layers.d.ts +7 -0
- package/dist/components/features/activities/relative-time.d.ts +18 -0
- package/dist/components/features/ai-chat/ai-chat.d.ts +6 -2
- package/dist/components/features/ai-chat/ai-chat.strings.d.ts +41 -2
- package/dist/components/features/ai-chat/ai-chat.types.d.ts +6 -0
- package/dist/components/features/ai-chat/partials/ai-chat-attachments-strip.d.ts +5 -1
- package/dist/components/features/ai-chat/partials/ai-chat-prompt-input.d.ts +2 -2
- package/dist/components/features/ai-chat/partials/ai-chat-queue.d.ts +3 -1
- package/dist/components/features/ai-chat/partials/ai-chat-suggestions-row.d.ts +6 -1
- package/dist/components/features/appointment-calendar/appointment-calendar.d.ts +1 -1
- package/dist/components/features/appointment-calendar/appointment-calendar.types.d.ts +19 -5
- package/dist/components/features/appointment-calendar/index.d.ts +1 -1
- package/dist/components/features/appointment-calendar/partials/appointment-agenda.d.ts +18 -10
- package/dist/components/features/async-preview/async-preview.d.ts +2 -2
- package/dist/components/features/async-preview/async-preview.types.d.ts +30 -1
- package/dist/components/features/async-preview/preview-trigger-cell.d.ts +7 -2
- package/dist/components/features/combobox/async-resource-combobox.d.ts +2 -2
- package/dist/components/features/combobox/combobox.d.ts +12 -3
- package/dist/components/features/combobox/components/error-message.d.ts +3 -1
- package/dist/components/features/combobox/hooks/use-combobox-core.d.ts +2 -2
- package/dist/components/features/combobox/index.d.ts +1 -1
- package/dist/components/features/combobox/types.d.ts +47 -45
- package/dist/components/features/comments/comments.strings.d.ts +6 -5
- package/dist/components/features/comments/comments.types.d.ts +40 -26
- package/dist/components/features/comments/hooks/use-attachment-upload.d.ts +5 -1
- package/dist/components/features/comments/hooks/use-comments.d.ts +8 -1
- package/dist/components/features/data-view/data-view.strings.d.ts +9 -2
- package/dist/components/features/data-view/data-view.types.d.ts +15 -2
- package/dist/components/features/email-composer/email-html.d.ts +5 -0
- package/dist/components/features/email-composer/http.d.ts +2 -0
- package/dist/components/features/email-composer/strings.d.ts +17 -2
- package/dist/components/features/email-composer/types.d.ts +17 -2
- package/dist/components/features/email-composer/use-composer.d.ts +2 -78
- package/dist/components/features/event-calendar/event-calendar-day-cell.d.ts +1 -1
- package/dist/components/features/event-calendar/event-calendar-event-badge.d.ts +1 -1
- package/dist/components/features/event-calendar/event-calendar-header.d.ts +1 -1
- package/dist/components/features/event-calendar/event-calendar-legend.d.ts +2 -2
- package/dist/components/features/event-calendar/event-calendar.d.ts +1 -1
- package/dist/components/features/event-calendar/event-calendar.types.d.ts +126 -21
- package/dist/components/features/filters/facets/range-facet.d.ts +13 -8
- package/dist/components/features/filters/filter-context.d.ts +9 -0
- package/dist/components/features/filters/filters.strings.d.ts +36 -3
- package/dist/components/features/filters/filters.types.d.ts +72 -5
- package/dist/components/features/filters/hooks/use-filter-draft.d.ts +1 -0
- package/dist/components/features/filters/index.d.ts +2 -2
- package/dist/components/features/filters/operator-options.d.ts +25 -2
- package/dist/components/features/filters/partials/active-filter-item.d.ts +0 -13
- package/dist/components/features/filters/partials/async-options-status.d.ts +32 -0
- package/dist/components/features/filters/partials/filter-draft-footer.d.ts +11 -0
- package/dist/components/features/filters/partials/filter-operator-select.d.ts +4 -2
- package/dist/components/features/filters/partials/filter-pill.d.ts +5 -1
- package/dist/components/features/filters/partials/filter-tabs.d.ts +2 -1
- package/dist/components/features/filters/partials/regular-filter-content.d.ts +1 -1
- package/dist/components/features/filters/utils/filter-utils.d.ts +29 -4
- package/dist/components/features/global-search/global-search-dialog.d.ts +7 -1
- package/dist/components/features/global-search/global-search.d.ts +7 -1
- package/dist/components/features/global-search/global-search.strings.d.ts +19 -3
- package/dist/components/features/global-search/global-search.types.d.ts +30 -6
- package/dist/components/features/global-search/index.d.ts +1 -1
- package/dist/components/features/global-search/partials/global-search-idle-state.d.ts +6 -1
- package/dist/components/features/global-search/partials/global-search-input.d.ts +2 -0
- package/dist/components/features/kanban/index.d.ts +2 -2
- package/dist/components/features/kanban/kanban-context.d.ts +4 -0
- package/dist/components/features/kanban/kanban-keyboard.d.ts +7 -2
- package/dist/components/features/kanban/kanban.d.ts +10 -1
- package/dist/components/features/kanban/kanban.strings.d.ts +11 -2
- package/dist/components/features/kanban/kanban.types.d.ts +26 -0
- package/dist/components/features/map/map.d.ts +4 -0
- package/dist/components/features/map/place-autocomplete.d.ts +10 -1
- package/dist/components/features/media-library/hooks/use-media-library.d.ts +3 -1
- package/dist/components/features/media-library/media-library.d.ts +1 -1
- package/dist/components/features/media-library/media-library.strings.d.ts +33 -3
- package/dist/components/features/media-library/media-library.types.d.ts +47 -2
- package/dist/components/features/media-library/partials/media-library-partials.d.ts +1 -1
- package/dist/components/features/mentions/hooks/use-mentions-search.d.ts +7 -0
- package/dist/components/features/mentions/index.d.ts +1 -1
- package/dist/components/features/mentions/mentions.strings.d.ts +10 -2
- package/dist/components/features/mentions/partials/mention-chip.d.ts +1 -0
- package/dist/components/features/mentions/partials/mention-inline-suggestions.d.ts +8 -1
- package/dist/components/features/mentions/partials/mention-picker.d.ts +8 -1
- package/dist/components/features/mentions/partials/mention-search-error.d.ts +6 -0
- package/dist/components/features/mentions/utils/index.d.ts +0 -1
- package/dist/components/features/overlays/alert-dialog.d.ts +1 -1
- package/dist/components/features/overlays/dialog.d.ts +1 -1
- package/dist/components/features/overlays/drawer.d.ts +1 -1
- package/dist/components/features/overlays/index.d.ts +2 -2
- package/dist/components/features/overlays/overlays.strings.d.ts +2 -1
- package/dist/components/features/overlays/overlays.types.d.ts +27 -10
- package/dist/components/features/products/components/index.d.ts +0 -10
- package/dist/components/features/products/components/product-contract-overview.d.ts +1 -1
- package/dist/components/features/products/components/product-details-card.d.ts +1 -1
- package/dist/components/features/products/components/product-operations-card.d.ts +1 -1
- package/dist/components/features/products/components/product-option-action-menu.d.ts +1 -1
- package/dist/components/features/products/components/product-options-summary.d.ts +1 -1
- package/dist/components/features/products/components/product-policies-card.d.ts +1 -1
- package/dist/components/features/products/components/product-quote-preview-card.d.ts +1 -1
- package/dist/components/features/products/components/product-readiness-card.d.ts +1 -1
- package/dist/components/features/products/components/product-structure-card.d.ts +1 -1
- package/dist/components/features/products/components/product-variant-action-menu.d.ts +1 -1
- package/dist/components/features/products/components/product-variants-manager.d.ts +1 -1
- package/dist/components/features/products/components/product-variants-table.d.ts +1 -1
- package/dist/components/features/products/partials/product-surface.d.ts +15 -0
- package/dist/components/features/products/products.strings.d.ts +8 -0
- package/dist/components/features/products/products.types.d.ts +25 -7
- package/dist/components/features/questionnaire/questionnaire.types.d.ts +6 -4
- package/dist/components/features/resource/index.d.ts +2 -3
- package/dist/components/features/resource/resource.d.ts +2 -10
- package/dist/components/features/resource/resource.types.d.ts +7 -149
- package/dist/components/features/resource-assignment/partials/assignment-surface.d.ts +15 -0
- package/dist/components/features/resource-assignment/resource-assignment.strings.d.ts +6 -1
- package/dist/components/features/resource-assignment/resource-assignment.types.d.ts +6 -0
- package/dist/components/features/rich-text-editor/partials/caret-helpers.d.ts +5 -7
- package/dist/components/features/rich-text-editor/partials/html-helpers.d.ts +2 -3
- package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +6 -2
- package/dist/components/features/rich-text-editor/partials/index.d.ts +2 -3
- package/dist/components/features/rich-text-editor/partials/rich-text-editor-tiptap.d.ts +0 -1
- package/dist/components/features/rich-text-editor/partials/rich-text-editor-toolbar.d.ts +2 -3
- package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +13 -1
- package/dist/components/features/schema-form/hooks/use-schema-form.d.ts +5 -0
- package/dist/components/features/schema-form/schema-form.d.ts +1 -1
- package/dist/components/features/schema-form/schema-form.types.d.ts +13 -5
- package/dist/components/features/suggestions/suggestions.strings.d.ts +14 -0
- package/dist/components/features/suggestions/suggestions.types.d.ts +12 -4
- package/dist/components/features/table/data-table.d.ts +1 -1
- package/dist/components/features/table/filter-bar.d.ts +1 -1
- package/dist/components/features/table/pagination.d.ts +1 -1
- package/dist/components/features/table/partials/cell-value.d.ts +1 -1
- package/dist/components/features/table/table-body.d.ts +1 -1
- package/dist/components/features/table/table-header.d.ts +1 -1
- package/dist/components/features/table/table-helpers.d.ts +31 -9
- package/dist/components/features/table/table-region.recipes.d.ts +11 -0
- package/dist/components/features/table/table-toolbar.d.ts +1 -1
- package/dist/components/features/table/table.strings.d.ts +1 -0
- package/dist/components/features/table/table.types.d.ts +74 -48
- package/dist/components/features/theme-tweaker/theme-provider-settings.d.ts +4 -0
- package/dist/components/features/theme-tweaker/theme-tweaker.strings.d.ts +10 -7
- package/dist/components/features/theme-tweaker/theme-tweaker.utils.d.ts +17 -0
- package/dist/components/layout/app-shell/app-shell.types.d.ts +46 -49
- package/dist/components/layout/app-shell/index.d.ts +2 -2
- package/dist/components/layout/app-shell/shell-regions.d.ts +9 -0
- package/dist/components/layout/app-shell/shell-skip-link.d.ts +9 -0
- package/dist/components/layout/app-shell/sidebar-inset-layout.d.ts +1 -1
- package/dist/components/layout/app-shell/stacked-layout.d.ts +1 -1
- package/dist/components/layout/app-shell/topbar-sidebar-layout.d.ts +1 -1
- package/dist/components/layout/auth/auth-shell.d.ts +1 -1
- package/dist/components/layout/auth/auth.types.d.ts +0 -5
- package/dist/components/layout/containers/inline-gutter-context.d.ts +7 -0
- package/dist/components/layout/containers/main-landmark-context.d.ts +6 -0
- package/dist/components/layout/header/header.types.d.ts +16 -6
- package/dist/components/layout/header/partials/header-global-search-trigger.d.ts +1 -1
- package/dist/components/layout/header/partials/header-notifications.d.ts +1 -1
- package/dist/components/layout/header/partials/header-search.d.ts +1 -1
- package/dist/components/layout/hooks/use-command-shortcut.d.ts +10 -1
- package/dist/components/layout/layout.types.d.ts +2 -2
- package/dist/components/layout/navigation/breadcrumb-progress/breadcrumb-progress.d.ts +1 -1
- package/dist/components/layout/navigation/breadcrumb-progress/types.d.ts +9 -0
- package/dist/components/layout/navigation/section-nav/section-nav.d.ts +8 -1
- package/dist/components/layout/page/index.d.ts +2 -3
- package/dist/components/layout/page/page.strings.d.ts +12 -0
- package/dist/components/layout/page/page.types.d.ts +7 -110
- package/dist/components/layout/page/partials/page-header.d.ts +1 -1
- package/dist/components/layout/settings/index.d.ts +1 -1
- package/dist/components/layout/settings/settings.d.ts +3 -5
- package/dist/components/layout/sidebar/app-sidebar.d.ts +1 -1
- package/dist/components/layout/sidebar/components/sidebar-grouped-navigation.d.ts +1 -1
- package/dist/components/layout/sidebar/components/sidebar-navigation-footer.d.ts +1 -1
- package/dist/components/layout/sidebar/components/sidebar-navigation.d.ts +1 -1
- package/dist/components/layout/sidebar/index.d.ts +1 -1
- package/dist/components/layout/sidebar/sidebar-navigation-rail.d.ts +15 -7
- package/dist/components/layout/sidebar/sidebar.types.d.ts +10 -12
- package/dist/components/layout/sidebar/sidebar.utils.d.ts +4 -0
- package/dist/components/layout/workspace/workspace.strings.d.ts +2 -2
- package/dist/components/layout/workspace/workspace.types.d.ts +13 -7
- package/dist/components/primitives/date.d.ts +22 -3
- package/dist/components/primitives/file-size.d.ts +8 -2
- package/dist/components/primitives/index.d.ts +1 -1
- package/dist/components/primitives/initials.d.ts +3 -1
- package/dist/components/primitives/link.d.ts +8 -1
- package/dist/components/primitives/money.d.ts +1 -1
- package/dist/components/primitives/number.d.ts +2 -1
- package/dist/components/typography/heading.d.ts +9 -3
- package/dist/components/typography/index.d.ts +1 -1
- package/dist/components/typography/text-link.d.ts +10 -3
- package/dist/components/ui/badge.d.ts +2 -4
- package/dist/components/ui/breadcrumb.d.ts +2 -3
- package/dist/components/ui/button.d.ts +8 -2
- package/dist/components/ui/collapsible.d.ts +1 -4
- package/dist/components/ui/command.d.ts +20 -18
- package/dist/components/ui/dialog.d.ts +3 -9
- package/dist/components/ui/empty.d.ts +2 -2
- package/dist/components/ui/input-group.d.ts +3 -3
- package/dist/components/ui/item.d.ts +3 -3
- package/dist/components/ui/popover.d.ts +3 -7
- package/dist/components/ui/sheet.d.ts +4 -12
- package/dist/components/ui/sidebar-state.d.ts +6 -1
- package/dist/components/ui/sidebar.d.ts +7 -4
- package/dist/components/ui/tabs.d.ts +2 -2
- package/dist/components/ui/toggle-group.d.ts +3 -3
- package/dist/components/ui/toggle.d.ts +2 -2
- package/dist/components/ui/tooltip.d.ts +1 -3
- package/dist/{containers-CSdc32h9.js → containers-BdfLTP4w.js} +37 -32
- package/dist/containers-BdfLTP4w.js.map +1 -0
- package/dist/content-block-hooks-Z3iKjqd1.js +17 -0
- package/dist/content-block-hooks-Z3iKjqd1.js.map +1 -0
- package/dist/{copyable-3fdHfMR3.js → copyable-Bmr14W0d.js} +6 -6
- package/dist/{copyable-3fdHfMR3.js.map → copyable-Bmr14W0d.js.map} +1 -1
- package/dist/{data-display-Cmj-xZYl.js → data-display-CWe9SOYh.js} +264 -251
- package/dist/data-display-CWe9SOYh.js.map +1 -0
- package/dist/date-3qsCE1ID.js +209 -0
- package/dist/date-3qsCE1ID.js.map +1 -0
- package/dist/{date-picker-CyQlFYsP.js → date-picker-D1keJQIG.js} +129 -129
- package/dist/date-picker-D1keJQIG.js.map +1 -0
- package/dist/date-pickers-D8aJoeHc.js +185 -0
- package/dist/date-pickers-D8aJoeHc.js.map +1 -0
- package/dist/disclosure-panel-B0HFNZ9x.js.map +1 -1
- package/dist/{display-CT_N2a3w.js → display-VlmP1I0i.js} +23 -46
- package/dist/display-VlmP1I0i.js.map +1 -0
- package/dist/{dropdown-menu-C08iIugv.js → dropdown-menu-B8hjvbkS.js} +9 -9
- package/dist/{dropdown-menu-C08iIugv.js.map → dropdown-menu-B8hjvbkS.js.map} +1 -1
- package/dist/dropzone-CHBNK3de.js +116 -0
- package/dist/dropzone-CHBNK3de.js.map +1 -0
- package/dist/features/activities.js +682 -628
- package/dist/features/activities.js.map +1 -1
- package/dist/features/ai-chat.js +258 -226
- package/dist/features/ai-chat.js.map +1 -1
- package/dist/features/appointment-calendar.js +436 -340
- package/dist/features/appointment-calendar.js.map +1 -1
- package/dist/features/async-preview.js +351 -265
- package/dist/features/async-preview.js.map +1 -1
- package/dist/features/combobox.js +2 -2
- package/dist/features/comments.js +1 -1
- package/dist/features/data-view.js +212 -151
- package/dist/features/data-view.js.map +1 -1
- package/dist/features/email-composer/engine.js +1 -1
- package/dist/features/email-composer.js +344 -315
- package/dist/features/email-composer.js.map +1 -1
- package/dist/features/event-calendar.js +504 -355
- package/dist/features/event-calendar.js.map +1 -1
- package/dist/features/filters.js +2 -2
- package/dist/features/global-search.js +250 -206
- package/dist/features/global-search.js.map +1 -1
- package/dist/features/kanban.js +269 -189
- package/dist/features/kanban.js.map +1 -1
- package/dist/features/map.js +385 -371
- package/dist/features/map.js.map +1 -1
- package/dist/features/media-library.js +1571 -1199
- package/dist/features/media-library.js.map +1 -1
- package/dist/features/mentions.js +2 -2
- package/dist/features/overlays.js +2 -2
- package/dist/features/products.js +1780 -1691
- package/dist/features/products.js.map +1 -1
- package/dist/features/questionnaire.js +165 -152
- package/dist/features/questionnaire.js.map +1 -1
- package/dist/features/resource-assignment.js +223 -191
- package/dist/features/resource-assignment.js.map +1 -1
- package/dist/features/resource.js +55 -220
- package/dist/features/resource.js.map +1 -1
- package/dist/features/rich-text-editor.js +3 -3
- package/dist/features/schema-form.js +280 -228
- package/dist/features/schema-form.js.map +1 -1
- package/dist/features/suggestions.js +48 -39
- package/dist/features/suggestions.js.map +1 -1
- package/dist/features/table.js +2 -2
- package/dist/features/theme-tweaker.js +723 -633
- package/dist/features/theme-tweaker.js.map +1 -1
- package/dist/feedback-DmqmXKLn.js +254 -0
- package/dist/feedback-DmqmXKLn.js.map +1 -0
- package/dist/{field-affordance-recipes-D6H7tVJi.js → field-affordance-recipes-DfbMadot.js} +13 -9
- package/dist/field-affordance-recipes-DfbMadot.js.map +1 -0
- package/dist/{field-state-recipes-7sza8QbC.js → field-state-recipes-EtCxpEy3.js} +6 -2
- package/dist/field-state-recipes-EtCxpEy3.js.map +1 -0
- package/dist/filters-BviMRMLS.js +2692 -0
- package/dist/filters-BviMRMLS.js.map +1 -0
- package/dist/{focus-recipes-B653VaLq.js → focus-recipes-DSkiUvUp.js} +3 -3
- package/dist/focus-recipes-DSkiUvUp.js.map +1 -0
- package/dist/{form-field-CAPdwdnZ.js → form-field-BdfCwSoQ.js} +5 -5
- package/dist/{form-field-CAPdwdnZ.js.map → form-field-BdfCwSoQ.js.map} +1 -1
- package/dist/{form-sizing-CgcrUbLU.js → form-sizing-DE_dZw32.js} +3 -3
- package/dist/{form-sizing-CgcrUbLU.js.map → form-sizing-DE_dZw32.js.map} +1 -1
- package/dist/{forms-B3W8CH7-.js → forms-B8DzJnBN.js} +35 -35
- package/dist/forms-B8DzJnBN.js.map +1 -0
- package/dist/forms-numeric-DOBswjKj.js +992 -0
- package/dist/forms-numeric-DOBswjKj.js.map +1 -0
- package/dist/{header-ZIIsRKxP.js → header-Cq3G0ZRP.js} +100 -95
- package/dist/header-Cq3G0ZRP.js.map +1 -0
- package/dist/{hooks-BitHSh-Y.js → hooks-DHfeSMAO.js} +34 -14
- package/dist/hooks-DHfeSMAO.js.map +1 -0
- package/dist/{http-D_6rOnzU.js → http-Cu-GPpss.js} +61 -35
- package/dist/http-Cu-GPpss.js.map +1 -0
- package/dist/{icon-badge-npxF1SLX.js → icon-badge-B0Kq7wom.js} +3 -3
- package/dist/{icon-badge-npxF1SLX.js.map → icon-badge-B0Kq7wom.js.map} +1 -1
- package/dist/index.js +6 -6
- package/dist/inline-gutter-context-CSqmrMFZ.js +11 -0
- package/dist/inline-gutter-context-CSqmrMFZ.js.map +1 -0
- package/dist/{input-DIREVYHs.js → input-2YrgTUrz.js} +3 -3
- package/dist/{input-DIREVYHs.js.map → input-2YrgTUrz.js.map} +1 -1
- package/dist/{input-7KAc7XQL.js → input-DfJyrjoR.js} +6 -6
- package/dist/{input-7KAc7XQL.js.map → input-DfJyrjoR.js.map} +1 -1
- package/dist/{interaction-recipes-4wZ2tvfb.js → interaction-recipes-DmuS1ase.js} +2 -2
- package/dist/{interaction-recipes-4wZ2tvfb.js.map → interaction-recipes-DmuS1ase.js.map} +1 -1
- package/dist/item-GJ9mvCcg.js +279 -0
- package/dist/item-GJ9mvCcg.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 +2 -2
- package/dist/layout/settings.js +2 -2
- package/dist/layout/sidebar.js +3 -3
- package/dist/layout/workspace.js +1 -1
- package/dist/layout.js +12 -12
- package/dist/{layout.types-E_GAApzO.js → layout.types-DbtnyAtd.js} +11 -8
- package/dist/layout.types-DbtnyAtd.js.map +1 -0
- package/dist/lib/anchored-positioning.d.ts +11 -0
- package/dist/lib/field-affordance-recipes.d.ts +10 -0
- package/dist/lib/field-state-recipes.d.ts +6 -0
- package/dist/lib/focus-recipes.d.ts +7 -0
- package/dist/lib/format.d.ts +25 -0
- package/dist/lib/money-format.d.ts +6 -0
- package/dist/lib/motion-recipes.d.ts +6 -0
- package/dist/lib/surface-recipes.d.ts +32 -2
- package/dist/lib/theme-scope.d.ts +17 -1
- package/dist/lib/token-merge.generated.d.ts +13 -19
- package/dist/lib/ui-provider/index.d.ts +1 -1
- package/dist/lib/ui-provider/types.d.ts +5 -0
- package/dist/lib/use-controllable-state.d.ts +16 -0
- package/dist/lib/use-copy-feedback.d.ts +15 -0
- package/dist/lib/utils.js +1 -1
- package/dist/lib/variant-props.d.ts +9 -0
- package/dist/main-landmark-context-BAsyqp2I.js +11 -0
- package/dist/main-landmark-context-BAsyqp2I.js.map +1 -0
- package/dist/mentions-zz0ewNIq.js +670 -0
- package/dist/mentions-zz0ewNIq.js.map +1 -0
- package/dist/{message-BJHnn43M.js → message-BiiVrRrm.js} +10 -7
- package/dist/{message-BJHnn43M.js.map → message-BiiVrRrm.js.map} +1 -1
- package/dist/{metadata-list-XkqZ_UXH.js → metadata-list-G85roWjS.js} +13 -12
- package/dist/metadata-list-G85roWjS.js.map +1 -0
- package/dist/{motion-recipes-DitYv6P2.js → motion-recipes-CUc_aHuG.js} +7 -4
- package/dist/motion-recipes-CUc_aHuG.js.map +1 -0
- package/dist/navigation-C0Be5C3i.js +304 -0
- package/dist/navigation-C0Be5C3i.js.map +1 -0
- package/dist/{navigation-Bt-v7rWP.js → navigation-CmqaQR_G.js} +99 -103
- package/dist/navigation-CmqaQR_G.js.map +1 -0
- package/dist/number-NFWKIoiK.js +340 -0
- package/dist/number-NFWKIoiK.js.map +1 -0
- package/dist/{overflow-tab-bar-BQCA2Zn2.js → overflow-tab-bar-DV7HE_3t.js} +8 -8
- package/dist/{overflow-tab-bar-BQCA2Zn2.js.map → overflow-tab-bar-DV7HE_3t.js.map} +1 -1
- package/dist/overlays-D-gAIfPF.js +1018 -0
- package/dist/overlays-D-gAIfPF.js.map +1 -0
- package/dist/page-D4pQhgSq.js +216 -0
- package/dist/page-D4pQhgSq.js.map +1 -0
- package/dist/{page-header-commands-DIKspJfx.js → page-header-commands-elelNOfd.js} +29 -29
- package/dist/{page-header-commands-DIKspJfx.js.map → page-header-commands-elelNOfd.js.map} +1 -1
- package/dist/{pagination-Br8TdV9A.js → pagination-BuSWw1US.js} +22 -23
- package/dist/pagination-BuSWw1US.js.map +1 -0
- package/dist/{popover-k8TdUcAt.js → popover-BpMxbqEK.js} +73 -69
- package/dist/popover-BpMxbqEK.js.map +1 -0
- package/dist/{popover-menu-yn-o0kyA.js → popover-menu-CO-_iiuz.js} +7 -7
- package/dist/{popover-menu-yn-o0kyA.js.map → popover-menu-CO-_iiuz.js.map} +1 -1
- package/dist/{popover.recipes-DJ0AkUan.js → popover.recipes-BqkdvlZn.js} +3 -4
- package/dist/{popover.recipes-DJ0AkUan.js.map → popover.recipes-BqkdvlZn.js.map} +1 -1
- package/dist/{portal-recipes-DyUXqUtD.js → portal-recipes-BPeS4rGB.js} +2 -2
- package/dist/{portal-recipes-DyUXqUtD.js.map → portal-recipes-BPeS4rGB.js.map} +1 -1
- package/dist/primitives-BlC1lXBr.js +447 -0
- package/dist/primitives-BlC1lXBr.js.map +1 -0
- package/dist/primitives.js +4 -4
- package/dist/{progress-DZFXXzPs.js → progress-RARK8AjB.js} +5 -5
- package/dist/{progress-DZFXXzPs.js.map → progress-RARK8AjB.js.map} +1 -1
- package/dist/receipt-CUf2Vegp.js +114 -0
- package/dist/receipt-CUf2Vegp.js.map +1 -0
- package/dist/{rich-text-BnTzZjIo.js → rich-text-Cypm9__d.js} +7 -8
- package/dist/{rich-text-BnTzZjIo.js.map → rich-text-Cypm9__d.js.map} +1 -1
- package/dist/rich-text-editor-Z6cQepsA.js +919 -0
- package/dist/rich-text-editor-Z6cQepsA.js.map +1 -0
- package/dist/rich-text-editor-toolbar-DYbRJARB.js +100 -0
- package/dist/rich-text-editor-toolbar-DYbRJARB.js.map +1 -0
- package/dist/rich-text-tree-DdKHIJx4.js +154 -0
- package/dist/rich-text-tree-DdKHIJx4.js.map +1 -0
- package/dist/safe-image-src-C6kQSMBZ.js +17 -0
- package/dist/safe-image-src-C6kQSMBZ.js.map +1 -0
- package/dist/{scroll-area-Bj6CRUif.js → scroll-area-B9HKbji0.js} +3 -3
- package/dist/{scroll-area-Bj6CRUif.js.map → scroll-area-B9HKbji0.js.map} +1 -1
- package/dist/{separator-DM6gs2vu.js → separator-DaDe26sf.js} +3 -3
- package/dist/separator-DaDe26sf.js.map +1 -0
- package/dist/{separator-B9ewiCGO.js → separator-KGsNXt2J.js} +2 -2
- package/dist/{separator-B9ewiCGO.js.map → separator-KGsNXt2J.js.map} +1 -1
- package/dist/services/actions/action-adapters.d.ts +5 -2
- package/dist/services/actions/index.d.ts +1 -1
- package/dist/services/actions.js +2 -2
- package/dist/services/actions.js.map +1 -1
- package/dist/settings-D5j_RJvT.js +160 -0
- package/dist/settings-D5j_RJvT.js.map +1 -0
- package/dist/sheet-B6j_BE9O.js +241 -0
- package/dist/sheet-B6j_BE9O.js.map +1 -0
- package/dist/{sidebar-CmD6a-HK.js → sidebar-C-iQ_TJP.js} +377 -351
- package/dist/sidebar-C-iQ_TJP.js.map +1 -0
- package/dist/sidebar-D5VO2W8S.js +715 -0
- package/dist/sidebar-D5VO2W8S.js.map +1 -0
- package/dist/{skeleton-DDgdhmu9.js → skeleton-Cab_KgVo.js} +12 -12
- package/dist/skeleton-Cab_KgVo.js.map +1 -0
- package/dist/{smart-card-B6vLxqa_.js → smart-card-C59z6KFO.js} +217 -210
- package/dist/smart-card-C59z6KFO.js.map +1 -0
- package/dist/{structure-DZJ2wbAU.js → structure-DElaQwwN.js} +2 -2
- package/dist/{structure-DZJ2wbAU.js.map → structure-DElaQwwN.js.map} +1 -1
- package/dist/style.css +1 -1
- package/dist/{surface-recipes-C8mNycaY.js → surface-recipes-DV6rrOFq.js} +10 -2
- package/dist/surface-recipes-DV6rrOFq.js.map +1 -0
- package/dist/{table-CXSPHH25.js → table-CSRUgpdK.js} +62 -61
- package/dist/table-CSRUgpdK.js.map +1 -0
- package/dist/table-DdXDBsR_.js +1657 -0
- package/dist/table-DdXDBsR_.js.map +1 -0
- package/dist/{tabs-C4Kr_hCr.js → tabs-WnHfV2pM.js} +27 -27
- package/dist/tabs-WnHfV2pM.js.map +1 -0
- package/dist/{text-inputs-jdkS3ReG.js → text-inputs-ljyBYaCd.js} +112 -112
- package/dist/text-inputs-ljyBYaCd.js.map +1 -0
- package/dist/theme.css +21 -5
- package/dist/timelines-mOmS9Eh3.js +479 -0
- package/dist/timelines-mOmS9Eh3.js.map +1 -0
- package/dist/tooltip-yjX-Uv-p.js +112 -0
- package/dist/tooltip-yjX-Uv-p.js.map +1 -0
- package/dist/{tree-CeYVzdFE.js → tree-YpkxUG2Z.js} +80 -72
- package/dist/tree-YpkxUG2Z.js.map +1 -0
- package/dist/typography/rich-text.js +1 -1
- package/dist/{typography-C7-YMW1S.js → typography-C0dELqYV.js} +46 -40
- package/dist/typography-C0dELqYV.js.map +1 -0
- package/dist/typography.js +1 -1
- package/dist/{ui-provider-C-74NVLc.js → ui-provider-Bu1S-o96.js} +4 -3
- package/dist/ui-provider-Bu1S-o96.js.map +1 -0
- package/dist/ui-provider.js +2 -2
- package/dist/{upload-Hdm5gObf.js → upload-DMuMYJFT.js} +276 -268
- package/dist/upload-DMuMYJFT.js.map +1 -0
- package/dist/{usage-card-9s8hLDfn.js → usage-card-DDPki5P1.js} +57 -54
- package/dist/usage-card-DDPki5P1.js.map +1 -0
- package/dist/use-controllable-state-BlP8SyBI.js +13 -0
- package/dist/use-controllable-state-BlP8SyBI.js.map +1 -0
- package/dist/use-copy-feedback-CzcaqlLf.js +28 -0
- package/dist/use-copy-feedback-CzcaqlLf.js.map +1 -0
- package/dist/use-metric-format-options-Dk4rC1NO.js +251 -0
- package/dist/use-metric-format-options-Dk4rC1NO.js.map +1 -0
- package/dist/{utils-DhuoqFy4.js → utils-BVbAG2J6.js} +98 -76
- package/dist/utils-BVbAG2J6.js.map +1 -0
- package/dist/value-inputs-h5MwjGCo.js +982 -0
- package/dist/value-inputs-h5MwjGCo.js.map +1 -0
- package/dist/value-typography-D15uwfj-.js +154 -0
- package/dist/value-typography-D15uwfj-.js.map +1 -0
- package/dist/workspace-DIryPqBt.js +400 -0
- package/dist/workspace-DIryPqBt.js.map +1 -0
- package/docs/consumer-skill/SKILL.md +7 -0
- package/docs/consumer-skill/agents/themelia-ui-designer.md +11 -2
- package/docs/consumer-skill/examples/analytics.tsx +1 -1
- package/docs/consumer-skill/examples/app-layout.tsx +3 -3
- package/docs/consumer-skill/examples/commerce-lines.tsx +7 -5
- package/docs/consumer-skill/examples/detail.tsx +3 -2
- package/docs/consumer-skill/examples/email-composer.tsx +1 -1
- package/docs/consumer-skill/examples/index-table.tsx +2 -2
- package/docs/consumer-skill/examples/scoped-directory.tsx +7 -6
- package/docs/consumer-skill/references/agents-md.md +20 -16
- package/docs/consumer-skill/references/analytics.md +20 -6
- package/docs/consumer-skill/references/building-views.md +213 -0
- package/docs/consumer-skill/references/catalogue.md +617 -0
- package/docs/consumer-skill/references/component-contracts.json +10202 -18084
- package/docs/consumer-skill/references/composition.md +21 -17
- package/docs/consumer-skill/references/discovery.md +8 -5
- package/docs/consumer-skill/references/installation.md +10 -4
- package/docs/consumer-skill/references/integration.md +5 -5
- package/docs/consumer-skill/references/product-composition.md +2 -2
- package/docs/consumer-skill/references/public-api.json +580 -633
- package/docs/consumer-skill/references/review.md +6 -4
- package/docs/consumer-skill/references/screen-archetypes.md +2 -2
- package/docs/consumer-skill/references/theming.md +1 -1
- package/docs/consumer-skill/references/tokens.json +4 -4
- package/docs/consumer-skill/references/workflows.md +7 -7
- package/docs/consumer-skill/scripts/composition-policy.mjs +40 -20
- package/docs/consumer-skill/scripts/composition.mjs +4 -1
- package/docs/consumer-skill/scripts/discovery.mjs +3 -1
- package/docs/consumer-skill/scripts/setup-skills.mjs +31 -4
- package/docs/consumer-skills/themelia-components/SKILL.md +8 -4
- package/docs/consumer-skills/themelia-composition/SKILL.md +7 -3
- package/docs/consumer-skills/themelia-design/SKILL.md +7 -1
- package/docs/consumer-skills/themelia-tokenization/SKILL.md +1 -1
- package/package.json +9 -12
- package/templates/README.md +3 -2
- package/templates/admin-shell-template.tsx +49 -9
- package/templates/analytics-operations-template.tsx +20 -24
- package/templates/customers-template.tsx +12 -9
- package/templates/index.ts +2 -8
- package/templates/orders-template.tsx +28 -24
- package/templates/products-template.tsx +14 -4
- package/templates/user-permissions-template.tsx +11 -14
- package/dist/accordion-0tQUZ20r.js.map +0 -1
- package/dist/action-menu-C0gjzLyE.js +0 -284
- package/dist/action-menu-C0gjzLyE.js.map +0 -1
- package/dist/ai-artifact-CGGpQryR.js +0 -1200
- package/dist/ai-artifact-CGGpQryR.js.map +0 -1
- package/dist/anchored-positioning-DPnKTvNs.js +0 -6
- package/dist/anchored-positioning-DPnKTvNs.js.map +0 -1
- package/dist/app-shell-EHuuRDGy.js +0 -321
- package/dist/app-shell-EHuuRDGy.js.map +0 -1
- package/dist/auth-B0girIk_.js.map +0 -1
- package/dist/badge-wWauMgAt.js.map +0 -1
- package/dist/base/sheet.js +0 -3
- package/dist/breadcrumbs-Bp9Ke7kd.js.map +0 -1
- package/dist/button-ChBovTx0.js.map +0 -1
- package/dist/buttons-DeW0bQeK.js.map +0 -1
- package/dist/cascader-CrAl9zD5.js +0 -439
- package/dist/cascader-CrAl9zD5.js.map +0 -1
- package/dist/choice-inputs-DHGtx0QV.js.map +0 -1
- package/dist/code-block-BSJyq9e-.js.map +0 -1
- package/dist/collapsible-BzJ91LUG.js +0 -81
- package/dist/collapsible-BzJ91LUG.js.map +0 -1
- package/dist/combobox-Bcvu5J8O.js +0 -363
- package/dist/combobox-Bcvu5J8O.js.map +0 -1
- package/dist/combobox-C2JiSQPc.js +0 -915
- package/dist/combobox-C2JiSQPc.js.map +0 -1
- package/dist/command-9e52NPgK.js +0 -425
- package/dist/command-9e52NPgK.js.map +0 -1
- package/dist/comments-BsgErEqd.js +0 -1174
- package/dist/comments-BsgErEqd.js.map +0 -1
- package/dist/components/base/buttons/tooltip-button.d.ts +0 -7
- package/dist/components/base/display/content-block.d.ts +0 -75
- package/dist/components/base/display/content-block.strings.d.ts +0 -5
- package/dist/components/base/sheet/index.d.ts +0 -29
- package/dist/components/blocks/ai/use-copy-feedback.d.ts +0 -6
- package/dist/components/blocks/data-display/metadata/index.d.ts +0 -30
- package/dist/components/features/mentions/utils/split-html-by-mentions.d.ts +0 -10
- package/dist/components/features/resource/resource.strings.d.ts +0 -12
- package/dist/components/features/rich-text-editor/partials/rich-text-editor-fallback.d.ts +0 -8
- package/dist/components/features/sync/index.d.ts +0 -26
- package/dist/components/features/sync/sync-range-dialog-form.d.ts +0 -5
- package/dist/components/features/sync/sync.strings.d.ts +0 -18
- package/dist/components/features/sync/sync.types.d.ts +0 -44
- package/dist/components/layout/page/partials/page-actions.d.ts +0 -3
- package/dist/components/ui/slot.d.ts +0 -6
- package/dist/containers-CSdc32h9.js.map +0 -1
- package/dist/data-display-Cmj-xZYl.js.map +0 -1
- package/dist/date-Br0FicVv.js +0 -144
- package/dist/date-Br0FicVv.js.map +0 -1
- package/dist/date-picker-CyQlFYsP.js.map +0 -1
- package/dist/date-pickers-tj2MXmXd.js +0 -185
- package/dist/date-pickers-tj2MXmXd.js.map +0 -1
- package/dist/display-CT_N2a3w.js.map +0 -1
- package/dist/features/sync.js +0 -142
- package/dist/features/sync.js.map +0 -1
- package/dist/feedback-Dzo1xtAU.js +0 -246
- package/dist/feedback-Dzo1xtAU.js.map +0 -1
- package/dist/field-affordance-recipes-D6H7tVJi.js.map +0 -1
- package/dist/field-state-recipes-7sza8QbC.js.map +0 -1
- package/dist/filters-Dl80yYtN.js +0 -2415
- package/dist/filters-Dl80yYtN.js.map +0 -1
- package/dist/focus-recipes-B653VaLq.js.map +0 -1
- package/dist/forms-B3W8CH7-.js.map +0 -1
- package/dist/forms-numeric-CwjQJe-O.js +0 -991
- package/dist/forms-numeric-CwjQJe-O.js.map +0 -1
- package/dist/header-ZIIsRKxP.js.map +0 -1
- package/dist/hooks-BitHSh-Y.js.map +0 -1
- package/dist/http-D_6rOnzU.js.map +0 -1
- package/dist/item-FfWnaYST.js +0 -278
- package/dist/item-FfWnaYST.js.map +0 -1
- package/dist/layout.types-E_GAApzO.js.map +0 -1
- package/dist/media-gallery-C81DAnKI.js +0 -203
- package/dist/media-gallery-C81DAnKI.js.map +0 -1
- package/dist/mentions-qOnedSt4.js +0 -639
- package/dist/mentions-qOnedSt4.js.map +0 -1
- package/dist/metadata-list-XkqZ_UXH.js.map +0 -1
- package/dist/motion-recipes-DitYv6P2.js.map +0 -1
- package/dist/navigation-BgtPJAhi.js +0 -288
- package/dist/navigation-BgtPJAhi.js.map +0 -1
- package/dist/navigation-Bt-v7rWP.js.map +0 -1
- package/dist/number-CYqBcrSj.js +0 -346
- package/dist/number-CYqBcrSj.js.map +0 -1
- package/dist/overlays-CC8zI3Du.js +0 -1017
- package/dist/overlays-CC8zI3Du.js.map +0 -1
- package/dist/page-BoQ1VaFJ.js +0 -331
- package/dist/page-BoQ1VaFJ.js.map +0 -1
- package/dist/pagination-Br8TdV9A.js.map +0 -1
- package/dist/popover-k8TdUcAt.js.map +0 -1
- package/dist/primitives-BkkQjYl7.js +0 -385
- package/dist/primitives-BkkQjYl7.js.map +0 -1
- package/dist/receipt-C7LhOg7Q.js +0 -116
- package/dist/receipt-C7LhOg7Q.js.map +0 -1
- package/dist/rich-text-editor-CAurDwT5.js +0 -1273
- package/dist/rich-text-editor-CAurDwT5.js.map +0 -1
- package/dist/rich-text-editor-toolbar-DbXig7Jk.js +0 -99
- package/dist/rich-text-editor-toolbar-DbXig7Jk.js.map +0 -1
- package/dist/rich-text-tree-BqyQ_7-R.js +0 -66
- package/dist/rich-text-tree-BqyQ_7-R.js.map +0 -1
- package/dist/sanitize-html-BWkH4dLM.js +0 -105
- package/dist/sanitize-html-BWkH4dLM.js.map +0 -1
- package/dist/separator-DM6gs2vu.js.map +0 -1
- package/dist/settings-DZPHgpx4.js +0 -155
- package/dist/settings-DZPHgpx4.js.map +0 -1
- package/dist/sheet-C4DHsgLk.js +0 -250
- package/dist/sheet-C4DHsgLk.js.map +0 -1
- package/dist/sidebar-C8BnDwTH.js +0 -709
- package/dist/sidebar-C8BnDwTH.js.map +0 -1
- package/dist/sidebar-CmD6a-HK.js.map +0 -1
- package/dist/skeleton-DDgdhmu9.js.map +0 -1
- package/dist/slot-CLF9kLrS.js +0 -16
- package/dist/slot-CLF9kLrS.js.map +0 -1
- package/dist/smart-card-B6vLxqa_.js.map +0 -1
- package/dist/surface-recipes-C8mNycaY.js.map +0 -1
- package/dist/table-CBonSdTp.js +0 -1584
- package/dist/table-CBonSdTp.js.map +0 -1
- package/dist/table-CXSPHH25.js.map +0 -1
- package/dist/tabs-C4Kr_hCr.js.map +0 -1
- package/dist/text-inputs-jdkS3ReG.js.map +0 -1
- package/dist/timelines-CoPwdJP0.js +0 -458
- package/dist/timelines-CoPwdJP0.js.map +0 -1
- package/dist/tooltip-31NwIpTo.js +0 -113
- package/dist/tooltip-31NwIpTo.js.map +0 -1
- package/dist/tree-CeYVzdFE.js.map +0 -1
- package/dist/typography-C7-YMW1S.js.map +0 -1
- package/dist/ui-provider-C-74NVLc.js.map +0 -1
- package/dist/upload-Hdm5gObf.js.map +0 -1
- package/dist/upload-queue-D0sYPuqo.js +0 -409
- package/dist/upload-queue-D0sYPuqo.js.map +0 -1
- package/dist/usage-card-9s8hLDfn.js.map +0 -1
- package/dist/utils-DhuoqFy4.js.map +0 -1
- package/dist/value-inputs-D3aPgq9H.js +0 -980
- package/dist/value-inputs-D3aPgq9H.js.map +0 -1
- package/dist/value-typography-uSzzG9Gf.js +0 -122
- package/dist/value-typography-uSzzG9Gf.js.map +0 -1
- package/dist/workspace-CC8Vchiu.js +0 -411
- package/dist/workspace-CC8Vchiu.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments-C2MZyRmh.js","names":["ImageIcon","_Fragment","NumberValue","_Fragment","useCommentsUIDefaults","useDatesConfig","useCommentsConfig","cn","Text","TextLink","Button","TextButton","TooltipTrigger","TooltipContent","TooltipProvider","Tooltip","Stack","toneRecipes","rowBlockPaddingClasses","compositionRhythm","useOverlayVisibility","ConfirmDialog","interactionRecipes","sanitizeHtml","contentTypographyClassName","RichText","SecondaryValue","FileSize","Percent","Number$1","RelativeTime","AvatarFallback","Avatar","AvatarImage","Badge","fieldAffordanceRecipes","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","pendingDeleteIds","setPendingDeleteIds","pendingDeleteRef","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","defaultAttachmentUploadStrings","useAttachmentUpload","attachments","setAttachmentsState","initialAttachments","inFlightRef","fileCacheRef","uploadedIdsRef","attachmentsRef","commitAttachments","list","next","onValueChangeRef","onValueChange","updateAttachment","a","patch","setAttachments","beginUpload","onUpload","controller","uploaded","message","err","addFiles","disabled","files","filesInput","pending","file","maxFiles","maxSize","removeAttachment","entry","retryAttachment","reset","useEffect","inFlight","cache","uploadedId","hasMeaningfulContent","html","editableHtml","content","line","CommentComposer","forwardRef","resourcesProp","onResourceSearchProp","attachmentsProp","resources","onResourceSearch","attachmentsConfig","editorRef","body","setBody","initialValues","editingComment","contentError","setContentError","contentErrorId","useId","eyebrowId","attachmentError","setAttachmentError","mentions","attachmentUpload","handleCancel","onCancel","useImperativeHandle","ref","context","replyingToId","replyingTo","errors","handleSubmit","event","fileInputRef","handleAttachmentClick","handleFiles","hasAttachments","isEditing","isReplying","submitLabel","eyebrow","ComposerEyebrow","makeReplyEyebrow","extraToolbarItems","items","AtSign","canComment","referenceError","describedBy","submitButton","cancelButton","attachmentChips","footerSlot","trailingSubmit","inlineSubmit","showFooterRow","kind","parsed","previous","m","byId","merged","p","placeholder","autoFocus","DisplayLabel","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","deleting","Trash2","CommentTimeline","comments","defaultItem","renderItem","emptySlot","DELETE_FAILED","ignoreReportedFailure","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\t/** Shown when a reference search fails. Optional for existing complete string objects. */\n\tcomposerReferenceError?: string;\n\t/** Repeats a failed reference search. Optional for existing complete string objects. */\n\tcomposerReferenceRetry?: 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/** 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/** Shown when a draft is posted while a file failed to upload. Optional for existing complete string objects. */\n\tattachmentFailedSubmitError?: 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\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\tcomposerReferenceError: 'Suggestions could not be loaded.',\n\tcomposerReferenceRetry: 'Try again',\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\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\tattachmentFailedSubmitError: 'Remove or retry the failed attachment before posting.',\n\tattachmentRetryLabel: 'Retry',\n\tattachmentDownloadLabel: 'Download',\n\n\taddReactionLabel: 'Add reaction',\n\treactionLabel: 'Reaction {{emoji}}: {{count}}',\n\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\t/**\n\t * Runs `onDelete`. Never rejects: a failure is reported through `onError`\n\t * and resolves `false`, success resolves `true`. A repeat for an id whose\n\t * delete is still pending is ignored and resolves `false`.\n\t */\n\tdeleteComment: (id: string) => Promise<boolean>;\n\t/** Ids whose delete is in flight; disable their delete control. */\n\tpendingDeleteIds: ReadonlySet<string>;\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\tconst [pendingDeleteIds, setPendingDeleteIds] = useState<ReadonlySet<string>>(() => new Set());\n\tconst pendingDeleteRef = useRef(new Set<string>());\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 || pendingDeleteRef.current.has(id)) return false;\n\t\t\tpendingDeleteRef.current.add(id);\n\t\t\tsetPendingDeleteIds(new Set(pendingDeleteRef.current));\n\t\t\ttry {\n\t\t\t\tawait onDelete(id);\n\t\t\t\tonAfterMutate?.('delete', { commentId: id });\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\treportError(error);\n\t\t\t\treturn false;\n\t\t\t} finally {\n\t\t\t\tpendingDeleteRef.current.delete(id);\n\t\t\t\tsetPendingDeleteIds(new Set(pendingDeleteRef.current));\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\tpendingDeleteIds,\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 { TextButton } 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';\nimport { rowBlockPaddingClasses } from '../../../../lib/row-recipes';\nimport { fieldAffordanceRecipes } from '../../../../lib/field-affordance-recipes';\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';\nimport { interactionRecipes } from '../../../../lib/interaction-recipes';\nimport { toneRecipes } from '../../../../lib/tone-recipes';\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',\n\t\t\t\t'ring-1 ring-inset transition-colors',\n\t\t\t\tcompact ? 'px-control-xs' : 'px-control-sm',\n\t\t\t\trowBlockPaddingClasses.compact,\n\t\t\t\tisFailed\n\t\t\t\t\t\t? `${toneRecipes.destructive.tint} ${toneRecipes.destructive.halo}`\n\t\t\t\t\t\t: `bg-muted ring-border/60 ${interactionRecipes.rowHover}`,\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// oxlint-disable-next-line react/static-components -- pickIcon returns one of the static Lucide icons.\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={cn(toneRecipes.primary.line, '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<TextButton\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\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=\"shrink-0 text-destructive decoration-destructive/30 hover:decoration-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</TextButton>\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\tonClick={() => onRemove(attachment.id)}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(fieldAffordanceRecipes.target, fieldAffordanceRecipes.focus, fieldAffordanceRecipes.toggle)}\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={fieldAffordanceRecipes.icon} aria-hidden=\"true\" />\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';\nimport { useStrings, type StringsProp } from '../../../../lib/strings';\nimport { defaultCommentsStrings, type CommentsStrings } from '../comments.strings';\n\nimport type {\n\tCommentAttachment,\n\tCommentsAttachmentsConfig,\n} from '../comments.types';\n\ninterface InFlightEntry {\n\tcontroller: AbortController;\n}\n\nconst defaultAttachmentUploadStrings = {\n\tattachmentTooLargeError: defaultCommentsStrings.attachmentTooLargeError,\n\tattachmentTooManyError: defaultCommentsStrings.attachmentTooManyError,\n\tattachmentFailedLabel: defaultCommentsStrings.attachmentFailedLabel,\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\t/** Validation and non-Error upload fallback copy; omitted keys use Comments defaults.\n\t * Error objects retain their caller-supplied message. */\n\tstrings?: StringsProp<Pick<CommentsStrings, 'attachmentTooLargeError' | 'attachmentTooManyError' | 'attachmentFailedLabel'>>;\n}\n\nexport interface UseAttachmentUploadReturn {\n\t/** All attachments — uploading + uploaded + failed. */\n\tattachments: ReadonlyArray<CommentAttachment>;\n\t/**\n\t * Subset of attachments that finished uploading, each under the `id` its\n\t * uploader returned (the local chip key when it returned none). Use this in\n\t * the form payload; address chips through `attachments`.\n\t */\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\tstrings: stringsProp,\n\t} = options;\n\tconst strings = useStrings(defaultAttachmentUploadStrings, stringsProp);\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\t// Chips keep their local key for retry and removal; the id the uploader\n\t// returned is what the submitted value carries.\n\tconst uploadedIdsRef = useRef<Map<string, string>>(new Map());\n\tconst attachmentsRef = useRef(attachments);\n\t// Keep sequential picks and async updates current without calling consumers\n\t// from a React state updater (which StrictMode may evaluate more than once).\n\tconst commitAttachments = useCallback((next: ReadonlyArray<CommentAttachment>) => {\n\t\tconst list = [...next];\n\t\tattachmentsRef.current = list;\n\t\tsetAttachmentsState(list);\n\t}, []);\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\tcommitAttachments(attachmentsRef.current.map((a) => (a.id === id ? { ...a, ...patch } : a)));\n\t\t},\n\t\t[commitAttachments],\n\t);\n\n\tconst setAttachments = useCallback(\n\t\t(next: ReadonlyArray<CommentAttachment>) => {\n\t\t\tcommitAttachments(next);\n\t\t},\n\t\t[commitAttachments],\n\t);\n\n\tconst beginUpload = useCallback(\n\t\t(id: string, file: File) => {\n\t\t\tif (!onUpload || !fileCacheRef.current.has(id)) 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\tif (controller.signal.aborted) return;\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\tif (controller.signal.aborted) return;\n\t\t\t\t\tinFlightRef.current.delete(id);\n\t\t\t\t\tif (uploaded.id) uploadedIdsRef.current.set(id, uploaded.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 : strings.attachmentFailedLabel;\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, strings.attachmentFailedLabel, 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\tconst next = [...attachmentsRef.current];\n\t\t\tconst pending: Array<{id: string; file: File}> = [];\n\t\t\tfor (const file of files) {\n\t\t\t\tif (\n\t\t\t\t\ttypeof maxFiles === 'number' &&\n\t\t\t\t\tnext.length >= maxFiles\n\t\t\t\t) {\n\t\t\t\t\tonError?.(strings.attachmentTooManyError);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\ttypeof maxSize === 'number' &&\n\t\t\t\t\tfile.size > maxSize\n\t\t\t\t) {\n\t\t\t\t\tonError?.(strings.attachmentTooLargeError);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst id =\n\t\t\t\t\ttypeof crypto !== 'undefined' && 'randomUUID' in crypto\n\t\t\t\t\t\t? crypto.randomUUID()\n\t\t\t\t\t\t: `att-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n\t\t\t\tfileCacheRef.current.set(id, file);\n\n\t\t\t\tnext.push({\n\t\t\t\t\tid,\n\t\t\t\t\tname: file.name,\n\t\t\t\t\tsize: file.size,\n\t\t\t\t\tmimeType: file.type,\n\t\t\t\t\tstatus: 'uploading',\n\t\t\t\t\tprogress: 0,\n\t\t\t\t});\n\n\t\t\t\tpending.push({id, file});\n\t\t\t}\n\t\t\tcommitAttachments(next);\n\t\t\tfor (const {id, file} of pending) queueMicrotask(() => beginUpload(id, file));\n\t\t},\n\t\t[beginUpload, commitAttachments, disabled, maxFiles, maxSize, onError, onUpload, strings.attachmentTooLargeError, strings.attachmentTooManyError],\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\tuploadedIdsRef.current.delete(id);\n\t\tcommitAttachments(attachmentsRef.current.filter((a) => a.id !== id));\n\t}, [commitAttachments]);\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\tuploadedIdsRef.current.clear();\n\t\tcommitAttachments([]);\n\t}, [commitAttachments]);\n\n\tuseEffect(() => {\n\t\tonValueChangeRef.current?.(attachments);\n\t}, [attachments]);\n\n\tuseEffect(() => {\n\t\tconst inFlight = inFlightRef.current;\n\t\tconst cache = fileCacheRef.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\tcache.clear();\n\t\t};\n\t}, []);\n\n\tconst uploadedAttachments = useMemo(\n\t\t() => attachments\n\t\t\t.filter((a) => a.status === 'uploaded' || !a.status)\n\t\t\t.map((a) => {\n\t\t\t\tconst uploadedId = a.id ? uploadedIdsRef.current.get(a.id) : undefined;\n\t\t\t\treturn uploadedId && uploadedId !== a.id ? { ...a, id: uploadedId } : a;\n\t\t\t}),\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","import {compositionRhythm} from '../../../base/structure/composition.recipes';\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, X } from 'lucide-react';\nimport {\n\t\tforwardRef,\n\t\tuseEffect,\n\t\tuseId,\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 { defaultCommentsStrings } from '../comments.strings';\nimport { interpolateString } from '../../../../lib/strings';\nimport { rowBlockPaddingClasses } from '../../../../lib/row-recipes';\nimport { cn } from '../../../../lib/utils';\nimport { fieldAffordanceRecipes } from '../../../../lib/field-affordance-recipes';\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\n/**\n * The composer edits HTML. An HTML body loads as written; a plain-text body is\n * escaped into one paragraph per line so characters such as `<` stay text.\n */\nfunction editableHtml(comment: { content?: string; contentType?: string }): string {\n\t\tconst content = comment.content ?? '';\n\t\tif (comment.contentType === 'html') return content;\n\t\treturn content\n\t\t\t\t.split(/\\r?\\n/)\n\t\t\t\t.map((line) => `<p>${line.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')}</p>`)\n\t\t\t\t.join('');\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\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\t// A draft holds five files unless `attachments.maxFiles` says otherwise.\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: attachmentsProp?.maxFiles ?? 5,\n\t\t\t\t\t\tdisabled: attachmentsProp?.disabled === true,\n\t\t\t\t}),\n\t\t\t\t[attachmentsProp],\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\t\tconst contentErrorId = useId();\n\t\tconst eyebrowId = useId();\n\t\tconst [attachmentError, setAttachmentError] = 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\t\tstrings,\n\t\t\t\tonError: setAttachmentError,\n\t\t});\n\t\tconst handleCancel = () => {\n\t\t\t\tattachmentUpload.reset();\n\t\t\t\tsetAttachmentError(null);\n\t\t\t\tonCancel?.();\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\t\tsetAttachmentError(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.reset();\n\t\t\t\tattachmentUpload.setAttachments(initialValues?.attachments ?? []);\n\t\t\t\tsetContentError(null);\n\t\t\t\tsetAttachmentError(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(editableHtml(editingComment));\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.reset();\n\t\t\t\tattachmentUpload.setAttachments(list);\n\t\t\t\tsetAttachmentError(null);\n\t\t\t\t// The composer may sit far from the comment whose Edit was pressed.\n\t\t\t\teditorRef.current?.focus();\n\t\t\t\t// oxlint-disable-next-line react-hooks/exhaustive-deps -- runs once per comment taken into editing, not per payload identity\n\t\t}, [editingComment?.id]);\n\n\t\t// Starting a reply moves the caret into the composer too.\n\t\tconst replyingToId = editingComment ? undefined : replyingTo?.commentId;\n\t\tuseEffect(() => {\n\t\t\t\tif (replyingToId) editorRef.current?.focus();\n\t\t}, [replyingToId]);\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\t\t\t\t// A failed file would be dropped from the payload without a word.\n\t\t\t\tif (attachmentUpload.attachments.some((attachment) => attachment.status === 'failed')) {\n\t\t\t\t\t\tsetAttachmentError(\n\t\t\t\t\t\t\t\tstrings.attachmentFailedSubmitError ?? defaultCommentsStrings.attachmentFailedSubmitError!,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t}\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?.length) return;\n\t\t\t\tsetAttachmentError(null);\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\tid={eyebrowId}\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 ? handleCancel : undefined}\n\t\t\t\t/>\n\t\t) : isReplying ? (\n\t\t\t\t<ComposerEyebrow\n\t\t\t\t\t\tid={eyebrowId}\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 ? handleCancel : undefined}\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\t// The failure of the kind being browsed; other kinds keep their results.\n\t\tconst referenceError = mentions.activeKind\n\t\t\t\t? mentions.errorsByKind[mentions.activeKind]\n\t\t\t\t: mentions.error;\n\t\t// Focus moves into the editor when a mode starts, so the eyebrow describes\n\t\t// it: the mode is read out with the field, and so is a validation error.\n\t\tconst describedBy = [\n\t\t\t\tisEditing || isReplying ? eyebrowId : null,\n\t\t\t\tcontentError ? contentErrorId : null,\n\t\t].filter(Boolean).join(' ') || undefined;\n\n\t\tconst submitButton = (\n\t\t\t\t<Button tone=\"primary\"\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 : undefined}\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={handleCancel}\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={(id) => { setAttachmentError(null); attachmentUpload.removeAttachment(id); }}\n\t\t\t\t\t\t\t\t\t\tonRetry={(id) => { setAttachmentError(null); attachmentUpload.retryAttachment(id); }}\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\terror={referenceError}\n\t\t\t\t\t\t\t\t\t\t\t\tonRetry={mentions.retry}\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\t\terror: strings.composerReferenceError,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tretry: strings.composerReferenceRetry,\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\" onBlur={mentions.handleBlur}>\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\tif (contentError && hasMeaningfulContent(html)) setContentError(null);\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\tbodyHeight=\"field\"\n\t\t\t\t\t\t\t\t\t\tinvalid={!!contentError}\n\t\t\t\t\t\t\t\t\t\taria-describedby={describedBy}\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\t\tonEditorKeyDown={mentions.handleKeyDown}\n\t\t\t\t\t\t\t\t\t\tsuggestionPopup={mentions.suggestionPopup}\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.inlineOpen}\n\t\t\t\t\t\t\t\t\t\tlistboxId={mentions.listboxId}\n\t\t\t\t\t\t\t\t\t\tactiveIndex={mentions.activeIndex}\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\terror={referenceError}\n\t\t\t\t\t\t\t\t\t\tonRetry={mentions.retry}\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\t\terror: strings.composerReferenceError,\n\t\t\t\t\t\t\t\t\t\t\t\tretry: strings.composerReferenceRetry,\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{attachmentError && (\n\t\t\t\t\t\t\t\t<Text role=\"alert\" size=\"xs\" type=\"error\" className=\"comment-composer--attachment-error\">\n\t\t\t\t\t\t\t\t\t\t{attachmentError}\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{contentError && (\n\t\t\t\t\t\t\t\t<Text id={contentErrorId} role=\"alert\" size=\"xs\" type=\"error\" className=\"comment-composer--content-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={compositionRhythm.commands} 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\tid,\n\t\tlabel,\n\t\tcloseLabel,\n\t\tonClose,\n}: {\n\t\t/** Lets the editor take the label as its description. */\n\t\tid?: string;\n\t\tlabel: string;\n\t\tcloseLabel: string;\n\t\tonClose?: () => void;\n}) {\n\t\treturn (\n\t\t\t\t<div className={cn('comment-composer--eyebrow bg-muted/30 ring-border/60 flex min-w-0 items-center justify-between gap-space-sm rounded-radius px-row-x ring-1 ring-inset', rowBlockPaddingClasses.compact)}>\n\t\t\t\t\t\t<DisplayLabel id={id}>\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\tonClick={onClose}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(fieldAffordanceRecipes.target, fieldAffordanceRecipes.focus, fieldAffordanceRecipes.toggle)}\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={fieldAffordanceRecipes.icon} aria-hidden=\"true\" />\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 = comment.contentType ?? '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\tclassName=\"text-inherit\"\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 type=\"inherit\" 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\" type=\"inherit\" 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 type=\"inherit\" 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\" type=\"inherit\">{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\" type=\"inherit\">{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\">\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 { fieldAffordanceRecipes } from '../../../../lib/field-affordance-recipes';\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\tdeleting = false,\n\tonAttachmentRemove,\n\tonError,\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\t// The composer edits HTML and plain text; a structured `rich` body would\n\t// load as raw JSON and be saved back as HTML, so it is not offered for edit.\n\tconst canEdit = !!canEditComment && !!onEdit && !!comment.id && comment.contentType !== 'rich';\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-surface border transition-colors',\n\t\t\t\t'border-border/60 bg-card text-card-foreground px-surface pt-surface',\n\t\t\t\t// A trailing row of ghost icon buttons already carries its own inset\n\t\t\t\t// around each glyph, so it supplies the rest of the bottom edge and the\n\t\t\t\t// card stays optically even instead of gaining an empty band.\n\t\t\t\thasActions ? 'pb-surface-xs' : 'pb-surface',\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=\"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{/* The byline and its message are one copy unit: the Stack owns their gap. */}\n\t\t\t\t\t<Stack gap=\"xs\" className=\"comment-item--message min-w-0\">\n\t\t\t\t\t\t<Stack direction=\"horizontal\" align=\"baseline\" gap=\"md\" className=\"min-w-0\">\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\ttype=\"inherit\"\n\t\t\t\t\t\t\t\tweight=\"semibold\"\n\t\t\t\t\t\t\t\tclassName=\"truncate\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{authorName}\n\t\t\t\t\t\t\t</Text>\n\n\t\t\t\t\t\t\t{!!isPinned && (\n\t\t\t\t\t\t\t\t<TooltipProvider delayDuration={0}>\n\t\t\t\t\t\t\t\t\t<Tooltip>\n\t\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\t<Pin className=\"text-muted-foreground size-icon-sm\" aria-hidden />\n\t\t\t\t\t\t\t\t\t\t\t{/* The glyph and its hover tooltip are invisible to a screen reader. */}\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">{strings.pinned}</span>\n\t\t\t\t\t\t\t\t\t\t</TooltipTrigger>\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\tclassName=\"text-xs\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{strings.pinned}\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</TooltipProvider>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t<RelativeTime\n\t\t\t\t\t\t\t\tvalue={comment.createdAt}\n\t\t\t\t\t\t\t\tformatRelativeTime={resolvedFormatRelativeTime}\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\tclassName=\"shrink-0 tabular-nums\"\n\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t{!!isEdited && (\n\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{strings.edited}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{!!showStatus && !!statusLabel && (\n\t\t\t\t\t\t\t\t<Badge size=\"sm\" tone=\"secondary\" className=\"self-center\">\n\t\t\t\t\t\t\t\t\t{statusLabel}\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</Stack>\n\n\t\t\t\t\t\t<div className=\"leading-relaxed\">\n\t\t\t\t\t\t\t<CommentContent\n\t\t\t\t\t\t\t\tcomment={comment}\n\t\t\t\t\t\t\t\tresources={resources}\n\t\t\t\t\t\t\t\trenderReference={renderReference}\n\t\t\t\t\t\t\t\tsanitizer={sanitizer}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</Stack>\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\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={cn(fieldAffordanceRecipes.inline, fieldAffordanceRecipes.focus)}\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 ? 'info' : 'secondary'}\n\t\t\t\t\t\t\t\t\t\tclassName=\"cursor-pointer transition-colors\"\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-xs 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',\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-foreground',\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:text-destructive\"\n\t\t\t\t\t\t\t\tdisabled={deleting}\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\tonAsyncConfirm={async () => {\n\t\t\t\t\t\tif (pendingAttachmentId && comment.id) {\n\t\t\t\t\t\t\tawait onAttachmentRemove(comment.id as string, pendingAttachmentId);\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t\t// A rejection keeps the confirmation open for a retry and is\n\t\t\t\t\t// reported here instead of surfacing as an unhandled rejection.\n\t\t\t\t\tonError={onError}\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\tpendingDeleteIds,\n\tonAttachmentRemove,\n\tonError,\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\tdeleting={!!comment.id && pendingDeleteIds?.has(comment.id)}\n\t\t\t\t\t\tonAttachmentRemove={onAttachmentRemove}\n\t\t\t\t\t\tonError={onError}\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';\n\n/** Signals the confirmation to stay open; the failure itself is already reported. */\nconst DELETE_FAILED = new Error('Comment delete failed.');\nconst ignoreReportedFailure = () => {};\n\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 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/>\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\tpendingDeleteIds={commentsState.pendingDeleteIds}\n\t\t\tonAttachmentRemove={props.onAttachmentRemove}\n\t\t\tonError={props.onError}\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\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) return;\n\t\t\t\t\t\t// `deleteComment` has already reported the failure through\n\t\t\t\t\t\t// `onError`; rejecting here only keeps the confirmation open\n\t\t\t\t\t\t// so the user can retry or cancel.\n\t\t\t\t\t\tif (!(await commentsState.deleteComment(pendingDeleteId))) throw DELETE_FAILED;\n\t\t\t\t\t}}\n\t\t\t\t\tonError={ignoreReportedFailure}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</Stack>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -8,12 +8,20 @@
|
|
|
8
8
|
* API and can override any treatment with `className`.
|
|
9
9
|
*/
|
|
10
10
|
import * as React from 'react';
|
|
11
|
-
import { Accordion as
|
|
12
|
-
|
|
11
|
+
import type { Accordion as AccordionPrimitive } from '@base-ui/react/accordion';
|
|
12
|
+
import { AccordionContent as PrimitiveAccordionContent, AccordionItem as PrimitiveAccordionItem, AccordionTrigger as PrimitiveAccordionTrigger } from '../../ui/accordion';
|
|
13
|
+
/**
|
|
14
|
+
* `Value` is the type of the items' values. It is inferred from `value`,
|
|
15
|
+
* `defaultValue` or a typed `onValueChange`, and is `string` otherwise.
|
|
16
|
+
*/
|
|
17
|
+
export type AccordionProps<Value = string> = Omit<AccordionPrimitive.Root.Props<Value>, 'ref'>;
|
|
13
18
|
export type AccordionItemProps = React.ComponentPropsWithoutRef<typeof PrimitiveAccordionItem>;
|
|
14
19
|
export type AccordionTriggerProps = React.ComponentPropsWithoutRef<typeof PrimitiveAccordionTrigger>;
|
|
15
20
|
export type AccordionContentProps = React.ComponentPropsWithoutRef<typeof PrimitiveAccordionContent>;
|
|
16
|
-
|
|
21
|
+
/** forwardRef erases type parameters; this signature keeps the items' value type. */
|
|
22
|
+
declare const Accordion: (<Value = string>(props: AccordionProps<Value> & React.RefAttributes<HTMLDivElement>) => React.ReactElement | null) & {
|
|
23
|
+
displayName?: string;
|
|
24
|
+
};
|
|
17
25
|
declare const AccordionItem: React.ForwardRefExoticComponent<Omit<import("@base-ui/react").AccordionItemProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
18
26
|
declare const AccordionTrigger: React.ForwardRefExoticComponent<Omit<import("@base-ui/react").AccordionTriggerProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
19
27
|
declare const AccordionContent: React.ForwardRefExoticComponent<Omit<import("@base-ui/react").AccordionPanelProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -27,7 +27,7 @@ type ActionMenuButtonProps = Partial<React.ComponentPropsWithoutRef<typeof Butto
|
|
|
27
27
|
'aria-label'?: string;
|
|
28
28
|
onPointerDown?: React.PointerEventHandler<HTMLButtonElement>;
|
|
29
29
|
};
|
|
30
|
-
export type ActionMenuDensity = CollectionDensity
|
|
30
|
+
export type ActionMenuDensity = CollectionDensity;
|
|
31
31
|
export type ActionMenuLabelVisibility = 'visible' | 'responsive' | 'hidden';
|
|
32
32
|
export interface ActionMenuLinkRenderProps extends React.ComponentPropsWithoutRef<'a'> {
|
|
33
33
|
href: string;
|
|
@@ -87,7 +87,15 @@ export interface ActionMenuAction extends ActionPresentation {
|
|
|
87
87
|
export interface ActionMenuProps {
|
|
88
88
|
/** Controlled menu visibility. Omit to let the menu manage its own state. */
|
|
89
89
|
open?: boolean;
|
|
90
|
-
/**
|
|
90
|
+
/** Initial visibility while uncontrolled. Defaults to `false`. */
|
|
91
|
+
defaultOpen?: boolean;
|
|
92
|
+
/** Disables the trigger and keeps the menu closed. `buttonProps.disabled` does the same. */
|
|
93
|
+
disabled?: boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Reports open and close requests. The second argument is Base UI's event
|
|
96
|
+
* details (reason, native event, `cancel()`), which PopoverMenu and Select do
|
|
97
|
+
* not pass; most handlers need only the boolean.
|
|
98
|
+
*/
|
|
91
99
|
onOpenChange?: React.ComponentProps<typeof DropdownMenu>['onOpenChange'];
|
|
92
100
|
/** Native focus destination when the menu closes; defaults to its trigger. */
|
|
93
101
|
finalFocus?: React.ComponentProps<typeof DropdownMenuContent>['finalFocus'];
|
|
@@ -125,7 +133,7 @@ export interface ActionMenuProps {
|
|
|
125
133
|
width?: string;
|
|
126
134
|
/** Closes the menu after an action runs. Defaults to `true`. */
|
|
127
135
|
closeOnSelect?: boolean;
|
|
128
|
-
/** Vertical row rhythm
|
|
136
|
+
/** Vertical row rhythm. Inline room stays stable. */
|
|
129
137
|
density?: ActionMenuDensity;
|
|
130
138
|
/** Whether the trigger's `label` is visible, hidden, or responsive. */
|
|
131
139
|
labelVisibility?: ActionMenuLabelVisibility;
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import * as React from 'react';
|
|
11
11
|
import { type BaseButtonLinkProps, type BaseButtonProps } from './base-button';
|
|
12
|
-
import { type
|
|
13
|
-
type ButtonEnhancementProps =
|
|
12
|
+
import { type ButtonLoadingProps } from './loader-button';
|
|
13
|
+
type ButtonEnhancementProps = ButtonLoadingProps & {
|
|
14
14
|
/** Tooltip copy shown on hover and focus. Supply it for icon-only buttons. */
|
|
15
15
|
withTooltip?: string;
|
|
16
16
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export type { ButtonTone, ButtonStyle, ButtonSize, IconPosition } from './base-button';
|
|
2
|
-
export type
|
|
2
|
+
export { defaultButtonLoadingStrings, type ButtonLoadingStrings } from './loader-button';
|
|
3
3
|
export { ButtonGroup, ButtonGroupSeparator, ButtonGroupText, buttonGroupVariants, type ButtonGroupProps, type ButtonGroupSeparatorProps, type ButtonGroupTextProps, } from './button-group';
|
|
4
4
|
export { Button, type ButtonActionProps, type ButtonLinkProps, type ButtonProps } from './button';
|
|
5
5
|
export { TextButton, type TextButtonProps } from './text-button';
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { type StringsProp } from '../../../lib/strings';
|
|
3
|
-
import {
|
|
3
|
+
import type { BaseButtonProps } from './base-button';
|
|
4
4
|
export interface ButtonLoadingStrings {
|
|
5
5
|
/** Shows the spinner and blocks activation. */
|
|
6
6
|
loading: string;
|
|
7
7
|
completed: string;
|
|
8
8
|
}
|
|
9
9
|
export declare const defaultButtonLoadingStrings: ButtonLoadingStrings;
|
|
10
|
-
|
|
10
|
+
/** The loading props every Button accepts. */
|
|
11
|
+
export interface ButtonLoadingProps {
|
|
11
12
|
/** Shows the spinner and blocks activation. */
|
|
12
13
|
loading?: boolean;
|
|
13
14
|
/** Opts into the loading-capable button even before `loading` is true, so the first press does not swap component identity. */
|
|
@@ -15,15 +16,7 @@ export interface LoaderButtonProps extends BaseButtonProps {
|
|
|
15
16
|
/** Overrides the loading announcement copy. */
|
|
16
17
|
strings?: StringsProp<ButtonLoadingStrings>;
|
|
17
18
|
}
|
|
18
|
-
|
|
19
|
-
/** Shows the spinner and blocks activation. */
|
|
20
|
-
loading?: boolean;
|
|
21
|
-
/** Opts into the loading-capable button even before `loading` is true, so the first press does not swap component identity. */
|
|
22
|
-
handlesLoading?: boolean;
|
|
23
|
-
/** Overrides the loading announcement copy. */
|
|
24
|
-
strings?: StringsProp<ButtonLoadingStrings>;
|
|
25
|
-
}
|
|
26
|
-
export declare function useLoaderButtonState({ loading, handlesLoading, strings: stringsProp, }: UseLoaderButtonStateOptions): {
|
|
19
|
+
export declare function useLoaderButtonState({ loading, handlesLoading, strings: stringsProp, }: ButtonLoadingProps): {
|
|
27
20
|
isLoading: boolean;
|
|
28
21
|
strings: ButtonLoadingStrings;
|
|
29
22
|
};
|
|
@@ -33,11 +26,9 @@ interface LoaderButtonContentProps {
|
|
|
33
26
|
icon?: BaseButtonProps['icon'];
|
|
34
27
|
iconPosition?: BaseButtonProps['iconPosition'];
|
|
35
28
|
iconOnly?: boolean;
|
|
36
|
-
size?: ButtonSize;
|
|
37
29
|
/** Ends the label with an ellipsis instead of wrapping it. */
|
|
38
30
|
truncate?: boolean;
|
|
39
31
|
children: React.ReactNode;
|
|
40
32
|
}
|
|
41
|
-
export declare function LoaderButtonContent({ isLoading, loadingText, icon: Icon, iconPosition, iconOnly,
|
|
42
|
-
|
|
43
|
-
export { LoaderButton };
|
|
33
|
+
export declare function LoaderButtonContent({ isLoading, loadingText, icon: Icon, iconPosition, iconOnly, truncate, children, }: LoaderButtonContentProps): React.JSX.Element;
|
|
34
|
+
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { Card,
|
|
1
|
+
export { Card, CardShell, CardHeader, CardTitle, CardDescription, CardContent, CardFooter, hasRenderableContent, } from './smart-card';
|
|
2
2
|
export { CardActionStrip, CardPrimaryAction, type CardActionStripProps, type CardPrimaryActionProps, } from './card-actions';
|
|
3
3
|
export type { SmartCardProps as CardProps, SmartCardAction as CardAction, SmartCardSurface as CardSurface, SmartCardSkeletonProps as CardSkeletonProps } from './smart-card.types';
|
|
4
4
|
export { SmartCardSkeleton as CardSkeleton } from './smart-card';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* True inside a padded Card body. A flat Card rendered there is a subject
|
|
3
|
+
* inside an existing inset, so it takes none of its own unless one is asked
|
|
4
|
+
* for. An unpadded body leaves the ordinary inset to the flat Card.
|
|
5
|
+
*/
|
|
6
|
+
export declare const CardBodyContext: import("react").Context<boolean>;
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import type { SmartCardProps } from './smart-card.types';
|
|
2
2
|
export declare const Card: import("react").ForwardRefExoticComponent<SmartCardProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
3
|
-
/** @deprecated Use Card. */
|
|
4
|
-
export declare const SmartCard: import("react").ForwardRefExoticComponent<SmartCardProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
5
3
|
export { defaultSmartCardStrings, type SmartCardStrings, } from './smart-card.strings';
|
|
6
4
|
export type { CardAlertTone, SmartCardAction, SmartCardProps, SmartCardSkeletonProps, SmartCardSurface, } from './smart-card.types';
|
|
7
5
|
export { CardContent, CardDescription, CardFooter, CardHeader, CardShell, CardTitle, } from './partials/card-primitives';
|
|
@@ -37,7 +37,7 @@ export type SmartCardSurface = CardSurface;
|
|
|
37
37
|
* children
|
|
38
38
|
* contentBottom
|
|
39
39
|
* ┌──────────────────────────────────────── (footerDivider) ────┐
|
|
40
|
-
* │
|
|
40
|
+
* │ footerSlot │
|
|
41
41
|
* └─────────────────────────────────────────────────────────────┘
|
|
42
42
|
* ```
|
|
43
43
|
*/
|
|
@@ -54,10 +54,6 @@ export interface SmartCardProps extends Omit<ComponentPropsWithoutRef<'div'>, 'c
|
|
|
54
54
|
textGap?: TextGap;
|
|
55
55
|
/** Explanatory copy behind an info affordance on the title line. */
|
|
56
56
|
tooltip?: ReactNode;
|
|
57
|
-
/** Accessible name for the tooltip trigger. Defaults to the `tooltipLabel` string. */
|
|
58
|
-
tooltipAriaLabel?: string;
|
|
59
|
-
/** Muted text in the footer band. Renders alongside `footerSlot`. */
|
|
60
|
-
footerText?: ReactNode;
|
|
61
57
|
/** Banner between the header and the content. A plain string is wrapped for you. */
|
|
62
58
|
alert?: ReactNode | string;
|
|
63
59
|
/** Tone of the `alert` banner. Default: `'neutral'`. */
|
|
@@ -69,6 +65,13 @@ export interface SmartCardProps extends Omit<ComponentPropsWithoutRef<'div'>, 'c
|
|
|
69
65
|
surface?: SmartCardSurface;
|
|
70
66
|
/** Surface insets. `none` composes unframed content inside an existing surface. */
|
|
71
67
|
padding?: 'none' | 'sm' | 'md' | 'lg';
|
|
68
|
+
/**
|
|
69
|
+
* Inline inset of the body alone. Defaults to `padding`. `none` runs the body
|
|
70
|
+
* edge to edge while the header and footer keep the card inset, for a titled
|
|
71
|
+
* card around a table or list that owns its own edge; without a footer the
|
|
72
|
+
* body also reaches the card's bottom edge.
|
|
73
|
+
*/
|
|
74
|
+
contentPadding?: 'none' | 'sm' | 'md' | 'lg';
|
|
72
75
|
/** `frame` places header/actions above an inset body surface. */
|
|
73
76
|
headerPlacement?: 'inside' | 'frame';
|
|
74
77
|
/** Semantic gap between header, body and footer regions. Defaults to the selected surface block inset; explicit gaps use the spacing scale. */
|
|
@@ -83,8 +86,6 @@ export interface SmartCardProps extends Omit<ComponentPropsWithoutRef<'div'>, 'c
|
|
|
83
86
|
titleSize?: CardTitleSize;
|
|
84
87
|
/** Overflow actions at the far end of the header, collapsed into a single menu trigger. */
|
|
85
88
|
actions?: readonly SmartCardAction[];
|
|
86
|
-
/** Accessible name for the overflow trigger. Defaults to the `actionsLabel` string. */
|
|
87
|
-
actionsLabel?: string;
|
|
88
89
|
/**
|
|
89
90
|
* Single control at the end of the header, before the overflow menu — a
|
|
90
91
|
* toggle or link. Use `actions` instead for a list of commands.
|
|
@@ -102,9 +103,10 @@ export interface SmartCardProps extends Omit<ComponentPropsWithoutRef<'div'>, 'c
|
|
|
102
103
|
/** Content after `children`, inside the content inset. */
|
|
103
104
|
contentBottom?: ReactNode;
|
|
104
105
|
/**
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
*
|
|
106
|
+
* Footer band under the content. A node fills the band's width, ideal for
|
|
107
|
+
* a single primary action ("Open", "Connect") or a row of commands; a plain
|
|
108
|
+
* string or number is a footnote, set small and muted at the band's end.
|
|
109
|
+
* Pairs with `footerDivider` to add a `border-t` rule above it.
|
|
108
110
|
*/
|
|
109
111
|
footerSlot?: ReactNode;
|
|
110
112
|
/**
|
|
@@ -1,2 +1,8 @@
|
|
|
1
|
-
import type
|
|
2
|
-
|
|
1
|
+
import type * as React from 'react';
|
|
2
|
+
import type { CascaderMultipleProps, CascaderProps, CascaderSingleProps } from './cascader.types';
|
|
3
|
+
/** Single selection (the default): `onValueChange` receives one key or null. */
|
|
4
|
+
export declare function Cascader<T = unknown>(props: CascaderSingleProps<T>): React.JSX.Element;
|
|
5
|
+
/** `multiple`: `onValueChange` receives the list of keys. */
|
|
6
|
+
export declare function Cascader<T = unknown>(props: CascaderMultipleProps<T>): React.JSX.Element;
|
|
7
|
+
/** A mode decided at runtime keeps the wide value. */
|
|
8
|
+
export declare function Cascader<T = unknown>(props: CascaderProps<T>): React.JSX.Element;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { StringsProp } from '../../../lib/strings';
|
|
1
2
|
import type { ReactNode } from 'react';
|
|
2
3
|
import type { TreeNode } from '../tree';
|
|
3
4
|
import type { RowDensity } from '../../../lib/row-recipes';
|
|
@@ -22,7 +23,12 @@ export interface CascaderChangeDetails<T = unknown> {
|
|
|
22
23
|
path: CascaderNode<T>[];
|
|
23
24
|
reason: 'select' | 'deselect' | 'clear';
|
|
24
25
|
}
|
|
25
|
-
/**
|
|
26
|
+
/**
|
|
27
|
+
* Framework-neutral nested picker. Values identify nodes, independently of labels.
|
|
28
|
+
* This is the mode-agnostic form, for a `multiple` decided at runtime: the value
|
|
29
|
+
* is one key, a list or null. A fixed mode takes `CascaderSingleProps` or
|
|
30
|
+
* `CascaderMultipleProps`, which `Cascader` selects from the `multiple` literal.
|
|
31
|
+
*/
|
|
26
32
|
export interface CascaderProps<T = unknown> {
|
|
27
33
|
items: readonly CascaderNode<T>[];
|
|
28
34
|
value?: string | readonly string[] | null;
|
|
@@ -47,7 +53,7 @@ export interface CascaderProps<T = unknown> {
|
|
|
47
53
|
'aria-labelledby'?: string;
|
|
48
54
|
'aria-describedby'?: string;
|
|
49
55
|
className?: string;
|
|
50
|
-
strings?:
|
|
56
|
+
strings?: StringsProp<CascaderStrings>;
|
|
51
57
|
/** Loads initial branch children. Backing out of drill/columns, closing, unmounting or replacing items aborts pending work. */
|
|
52
58
|
loadChildren?: (node: CascaderNode<T>, context: {
|
|
53
59
|
signal: AbortSignal;
|
|
@@ -55,3 +61,19 @@ export interface CascaderProps<T = unknown> {
|
|
|
55
61
|
/** Optional trigger presentation; receives resolved paths without changing selection semantics. */
|
|
56
62
|
renderValue?: (paths: CascaderNode<T>[][]) => ReactNode;
|
|
57
63
|
}
|
|
64
|
+
type CascaderValueProps = 'value' | 'defaultValue' | 'onValueChange' | 'multiple';
|
|
65
|
+
/** Single selection: one node key, or null when cleared. */
|
|
66
|
+
export interface CascaderSingleProps<T = unknown> extends Omit<CascaderProps<T>, CascaderValueProps> {
|
|
67
|
+
multiple?: false;
|
|
68
|
+
value?: string | null;
|
|
69
|
+
defaultValue?: string | null;
|
|
70
|
+
onValueChange?: (value: string | null, details: CascaderChangeDetails<T>) => void;
|
|
71
|
+
}
|
|
72
|
+
/** Multiple selection: the list of node keys, empty when cleared. */
|
|
73
|
+
export interface CascaderMultipleProps<T = unknown> extends Omit<CascaderProps<T>, CascaderValueProps> {
|
|
74
|
+
multiple: true;
|
|
75
|
+
value?: readonly string[];
|
|
76
|
+
defaultValue?: readonly string[];
|
|
77
|
+
onValueChange?: (value: string[], details: CascaderChangeDetails<T>) => void;
|
|
78
|
+
}
|
|
79
|
+
export {};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { Cascader } from './cascader';
|
|
2
|
-
export type { CascaderProps, CascaderNode, CascaderMode, CascaderStrings, CascaderChangeDetails } from './cascader.types';
|
|
2
|
+
export type { CascaderProps, CascaderSingleProps, CascaderMultipleProps, CascaderNode, CascaderMode, CascaderStrings, CascaderChangeDetails } from './cascader.types';
|