themelia-react-ui 2.0.5 → 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 +326 -0
- package/MIGRATION.md +858 -0
- package/README.md +35 -24
- package/dist/{accordion-B9MHG0cT.js → accordion-DNVqwEIC.js} +37 -37
- 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-Dg_69lPS.js → attachment-D2-fpfmv.js} +15 -15
- package/dist/{attachment-Dg_69lPS.js.map → attachment-D2-fpfmv.js.map} +1 -1
- package/dist/{auth-DTkkshS8.js → auth-g_oUTDDC.js} +236 -243
- package/dist/auth-g_oUTDDC.js.map +1 -0
- package/dist/{avatar-CeZaFmNH.js → avatar-Ca3Ihrq4.js} +4 -4
- package/dist/{avatar-CeZaFmNH.js.map → avatar-Ca3Ihrq4.js.map} +1 -1
- package/dist/{badge-xIiV_E7f.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 +208 -198
- 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 +8 -14
- 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-Cb8cuvyy.js → batch-action-bar-D6MZQNnC.js} +10 -10
- package/dist/{batch-action-bar-Cb8cuvyy.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 +398 -354
- 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 +173 -1392
- 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 +1533 -1399
- 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-CQ9JSlez.js +136 -0
- package/dist/breadcrumbs-CQ9JSlez.js.map +1 -0
- package/dist/{button-S2Cubiiz.js → button-rd6FiHfQ.js} +12 -8
- package/dist/button-rd6FiHfQ.js.map +1 -0
- package/dist/{buttons-BedGfygC.js → buttons-pZVgPTZn.js} +230 -246
- package/dist/buttons-pZVgPTZn.js.map +1 -0
- package/dist/{cards-rNX1M4Xn.js → cards-CgWyqvgZ.js} +25 -22
- package/dist/{cards-rNX1M4Xn.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-Darg_0Kv.js → chart-CygRCyIZ.js} +5 -5
- package/dist/{chart-Darg_0Kv.js.map → chart-CygRCyIZ.js.map} +1 -1
- package/dist/{checkbox-fflqmODR.js → checkbox-Dy5_XBMZ.js} +4 -4
- package/dist/{checkbox-fflqmODR.js.map → checkbox-Dy5_XBMZ.js.map} +1 -1
- package/dist/{choice-inputs-zUgBZfE4.js → choice-inputs-oJEsrb5Y.js} +195 -184
- package/dist/choice-inputs-oJEsrb5Y.js.map +1 -0
- package/dist/{code-block-BzmM9Eig.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-gDh1v6O4.js → collection-content-D7SoDlYd.js} +3 -3
- package/dist/{collection-content-gDh1v6O4.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/choice-types.d.ts +4 -0
- package/dist/components/base/choice-inputs/pill-radio-group.d.ts +7 -6
- 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/combobox/combobox-field.d.ts +2 -2
- package/dist/components/base/command/command.d.ts +1 -1
- package/dist/components/base/date-pickers/date-picker-internals.d.ts +3 -1
- package/dist/components/base/date-pickers/datepicker.types.d.ts +11 -7
- package/dist/components/base/date-pickers/time-picker.d.ts +17 -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/feedback/state-display.d.ts +5 -1
- package/dist/components/base/feedback/state-display.strings.d.ts +9 -0
- package/dist/components/base/forms/form-field.d.ts +7 -2
- package/dist/components/base/forms/workflow.d.ts +2 -2
- package/dist/components/base/forms-numeric/coordinates-input.d.ts +4 -1
- package/dist/components/base/forms-numeric/decimal-input.d.ts +2 -2
- package/dist/components/base/forms-numeric/dimensions-input.d.ts +13 -18
- package/dist/components/base/forms-numeric/index.d.ts +3 -3
- package/dist/components/base/forms-numeric/numeric-composite-field.d.ts +12 -0
- package/dist/components/base/forms-numeric/weight-input.d.ts +6 -1
- package/dist/components/base/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 +17 -8
- 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 +6 -1
- 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 +40 -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/avatar-upload.d.ts +2 -1
- package/dist/components/base/upload/file-upload.validation.d.ts +37 -1
- package/dist/components/base/upload/image-upload.d.ts +4 -1
- 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 +8 -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-reasoning/types.d.ts +2 -0
- package/dist/components/blocks/ai/ai-sources/ai-sources.d.ts +1 -1
- package/dist/components/blocks/ai/ai-sources/types.d.ts +10 -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 +8 -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 +7 -3
- package/dist/components/blocks/analytics/metric-comparison/metric-comparison.d.ts +2 -0
- package/dist/components/blocks/analytics/metric-grid/metric-grid.d.ts +4 -5
- package/dist/components/blocks/analytics/types.d.ts +13 -4
- 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 +12 -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 +10 -3
- 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 +46 -22
- package/dist/components/features/activities/hooks/use-activity-feed.d.ts +6 -0
- package/dist/components/features/activities/hooks/use-activity-resources.d.ts +2 -1
- 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/hooks/use-ai-chat-scroll.d.ts +1 -1
- 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 +20 -4
- 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 +4 -3
- package/dist/components/features/combobox/hooks/use-combobox-state.d.ts +1 -0
- package/dist/components/features/combobox/hooks/use-load-more.d.ts +1 -0
- package/dist/components/features/combobox/index.d.ts +1 -1
- package/dist/components/features/combobox/types.d.ts +68 -37
- 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 +19 -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/date-facet.d.ts +4 -2
- package/dist/components/features/filters/facets/range-facet.d.ts +24 -7
- 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 +75 -8
- 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/date-filter-content.d.ts +3 -2
- 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-popover-content.d.ts +4 -2
- package/dist/components/features/filters/partials/filter-tabs.d.ts +2 -1
- package/dist/components/features/filters/partials/range-filter-content.d.ts +12 -0
- package/dist/components/features/filters/partials/regular-filter-content.d.ts +1 -1
- package/dist/components/features/filters/utils/filter-utils.d.ts +34 -5
- 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 +39 -3
- package/dist/components/features/media-library/media-library.types.d.ts +82 -9
- package/dist/components/features/media-library/partials/media-library-partials.d.ts +3 -3
- package/dist/components/features/mentions/hooks/use-mentions-search.d.ts +7 -0
- package/dist/components/features/mentions/hooks/use-mentions.d.ts +16 -1
- 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 +12 -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/hooks/use-overlay-visibility.d.ts +2 -2
- 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 +26 -8
- package/dist/components/features/questionnaire/questionnaire.types.d.ts +7 -2
- 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 -147
- 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/form-rich-text-editor.d.ts +1 -1
- package/dist/components/features/rich-text-editor/partials/caret-helpers.d.ts +5 -7
- package/dist/components/features/rich-text-editor/partials/editor-field-aria.d.ts +14 -0
- 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 +5 -4
- package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +1 -1
- package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +30 -4
- package/dist/components/features/schema-form/hooks/use-schema-form.d.ts +10 -1
- package/dist/components/features/schema-form/partials/schema-form-field.d.ts +3 -1
- 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/schema-form/schema-form.utils.d.ts +1 -1
- package/dist/components/features/suggestions/suggestions.strings.d.ts +14 -0
- package/dist/components/features/suggestions/suggestions.types.d.ts +13 -5
- 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/index.d.ts +1 -0
- 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 +37 -12
- 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 +4 -0
- package/dist/components/features/table/table.types.d.ts +91 -49
- 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 +19 -8
- 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 +6 -4
- 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/navigation/side-nav.d.ts +3 -2
- package/dist/components/layout/normalize-layout-path.d.ts +1 -0
- 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 +4 -6
- 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 +17 -7
- package/dist/components/layout/sidebar/sidebar.context.d.ts +1 -0
- package/dist/components/layout/sidebar/sidebar.types.d.ts +12 -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 +11 -3
- package/dist/components/primitives/money.d.ts +2 -2
- package/dist/components/primitives/number.d.ts +3 -2
- package/dist/components/typography/heading.d.ts +9 -3
- package/dist/components/typography/index.d.ts +1 -1
- package/dist/components/typography/rich-text/rich-text-tree.d.ts +7 -5
- 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-CIxwbZt5.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-DIznBqiT.js → copyable-Bmr14W0d.js} +6 -6
- package/dist/{copyable-DIznBqiT.js.map → copyable-Bmr14W0d.js.map} +1 -1
- package/dist/{data-display-BdgCAw8T.js → data-display-CWe9SOYh.js} +264 -250
- 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-D1keJQIG.js +1617 -0
- 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-KsZLw9Ov.js → display-VlmP1I0i.js} +23 -46
- package/dist/display-VlmP1I0i.js.map +1 -0
- package/dist/{dropdown-menu-CLs8Lihj.js → dropdown-menu-B8hjvbkS.js} +9 -9
- package/dist/{dropdown-menu-CLs8Lihj.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 +767 -700
- package/dist/features/activities.js.map +1 -1
- package/dist/features/ai-chat.js +280 -235
- package/dist/features/ai-chat.js.map +1 -1
- package/dist/features/appointment-calendar.js +430 -334
- 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 +347 -313
- package/dist/features/email-composer.js.map +1 -1
- package/dist/features/event-calendar.js +501 -348
- package/dist/features/event-calendar.js.map +1 -1
- package/dist/features/filters.js +2 -2
- package/dist/features/global-search.js +250 -210
- package/dist/features/global-search.js.map +1 -1
- package/dist/features/kanban.js +280 -210
- package/dist/features/kanban.js.map +1 -1
- package/dist/features/map/style.css +15 -0
- package/dist/features/map.js +435 -404
- package/dist/features/map.js.map +1 -1
- package/dist/features/media-library.js +1745 -1195
- 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 +1862 -1759
- package/dist/features/products.js.map +1 -1
- package/dist/features/questionnaire.js +188 -168
- 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 -217
- package/dist/features/resource.js.map +1 -1
- package/dist/features/rich-text-editor.js +28 -19
- package/dist/features/rich-text-editor.js.map +1 -1
- package/dist/features/schema-form.js +380 -287
- package/dist/features/schema-form.js.map +1 -1
- package/dist/features/suggestions.js +90 -74
- package/dist/features/suggestions.js.map +1 -1
- package/dist/features/table.js +2 -2
- package/dist/features/theme-tweaker.js +718 -627
- 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-DWcNcOjh.js → field-affordance-recipes-DfbMadot.js} +13 -9
- package/dist/field-affordance-recipes-DfbMadot.js.map +1 -0
- package/dist/field-control-attributes-B6i335wr.js +18 -0
- package/dist/field-control-attributes-B6i335wr.js.map +1 -0
- package/dist/field-state-recipes-EtCxpEy3.js +18 -0
- 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-BdfCwSoQ.js +74 -0
- package/dist/form-field-BdfCwSoQ.js.map +1 -0
- package/dist/{form-sizing-Bs2qFUeE.js → form-sizing-DE_dZw32.js} +3 -3
- package/dist/{form-sizing-Bs2qFUeE.js.map → form-sizing-DE_dZw32.js.map} +1 -1
- package/dist/{forms-C0RGnJTe.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-DMMxG__r.js → header-Cq3G0ZRP.js} +163 -158
- package/dist/header-Cq3G0ZRP.js.map +1 -0
- package/dist/hooks/use-files.d.ts +2 -0
- package/dist/{hooks-DB6CJ4MR.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-DZF-YjQp.js → icon-badge-B0Kq7wom.js} +3 -3
- package/dist/{icon-badge-DZF-YjQp.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-DMBwAZmr.js → input-2YrgTUrz.js} +3 -3
- package/dist/{input-DMBwAZmr.js.map → input-2YrgTUrz.js.map} +1 -1
- package/dist/{input-CvyDQlY7.js → input-DfJyrjoR.js} +7 -7
- package/dist/{input-CvyDQlY7.js.map → input-DfJyrjoR.js.map} +1 -1
- package/dist/{interaction-recipes-XR9ZpVYL.js → interaction-recipes-DmuS1ase.js} +2 -2
- package/dist/{interaction-recipes-XR9ZpVYL.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-DbtnyAtd.js +33 -0
- 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-control-attributes.d.ts +11 -0
- package/dist/lib/field-state-recipes.d.ts +8 -0
- package/dist/lib/focus-recipes.d.ts +7 -0
- package/dist/lib/format.d.ts +26 -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 +33 -3
- package/dist/lib/theme-scope.d.ts +17 -1
- package/dist/lib/token-merge.generated.d.ts +19 -25
- 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-BiiVrRrm.js +138 -0
- package/dist/message-BiiVrRrm.js.map +1 -0
- package/dist/{metadata-list-C3MkU-Om.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-CmqaQR_G.js +257 -0
- package/dist/navigation-CmqaQR_G.js.map +1 -0
- package/dist/normalize-layout-path-BmEgg6fu.js +14 -0
- package/dist/normalize-layout-path-BmEgg6fu.js.map +1 -0
- package/dist/number-NFWKIoiK.js +340 -0
- package/dist/number-NFWKIoiK.js.map +1 -0
- package/dist/{overflow-tab-bar-IVFVQFV6.js → overflow-tab-bar-DV7HE_3t.js} +8 -8
- package/dist/{overflow-tab-bar-IVFVQFV6.js.map → overflow-tab-bar-DV7HE_3t.js.map} +1 -1
- package/dist/{overlays-BSgCtM2v.js → overlays-D-gAIfPF.js} +369 -364
- 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-7P3sfE9u.js → page-header-commands-elelNOfd.js} +29 -29
- package/dist/{page-header-commands-7P3sfE9u.js.map → page-header-commands-elelNOfd.js.map} +1 -1
- package/dist/{pagination-CgCjElfu.js → pagination-BuSWw1US.js} +22 -23
- package/dist/pagination-BuSWw1US.js.map +1 -0
- package/dist/popover-BpMxbqEK.js +205 -0
- package/dist/popover-BpMxbqEK.js.map +1 -0
- package/dist/{popover-menu-DlnQ2zlR.js → popover-menu-CO-_iiuz.js} +7 -7
- package/dist/{popover-menu-DlnQ2zlR.js.map → popover-menu-CO-_iiuz.js.map} +1 -1
- package/dist/{popover.recipes-DdiEp0rd.js → popover.recipes-BqkdvlZn.js} +3 -4
- package/dist/{popover.recipes-DdiEp0rd.js.map → popover.recipes-BqkdvlZn.js.map} +1 -1
- package/dist/{portal-recipes-BpsV_iRw.js → portal-recipes-BPeS4rGB.js} +2 -2
- package/dist/{portal-recipes-BpsV_iRw.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-BJhQP9WX.js → progress-RARK8AjB.js} +5 -5
- package/dist/{progress-BJhQP9WX.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-Cypm9__d.js +44 -0
- package/dist/rich-text-Cypm9__d.js.map +1 -0
- 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/{scroll-area-B0dB2cBi.js → scroll-area-B9HKbji0.js} +3 -3
- package/dist/{scroll-area-B0dB2cBi.js.map → scroll-area-B9HKbji0.js.map} +1 -1
- package/dist/{separator-Ct_WSWTJ.js → separator-DaDe26sf.js} +3 -3
- package/dist/separator-DaDe26sf.js.map +1 -0
- package/dist/{separator-Bb17I4pu.js → separator-KGsNXt2J.js} +2 -2
- package/dist/{separator-Bb17I4pu.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-f9gRWXIR.js → sidebar-C-iQ_TJP.js} +379 -350
- 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-BapcJd9C.js → skeleton-Cab_KgVo.js} +13 -13
- package/dist/skeleton-Cab_KgVo.js.map +1 -0
- package/dist/{smart-card-CW0hjetE.js → smart-card-C59z6KFO.js} +217 -210
- package/dist/smart-card-C59z6KFO.js.map +1 -0
- package/dist/{structure-DuxKl954.js → structure-DElaQwwN.js} +2 -2
- package/dist/{structure-DuxKl954.js.map → structure-DElaQwwN.js.map} +1 -1
- package/dist/style.css +1 -1
- package/dist/{surface-recipes-BKRVW8Os.js → surface-recipes-DV6rrOFq.js} +11 -3
- package/dist/surface-recipes-DV6rrOFq.js.map +1 -0
- package/dist/table-CSRUgpdK.js +180 -0
- 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-WnHfV2pM.js +192 -0
- package/dist/tabs-WnHfV2pM.js.map +1 -0
- package/dist/{text-inputs-B1culiSK.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-CzUJHnFs.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-BQnine1k.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-DMuMYJFT.js +875 -0
- package/dist/upload-DMuMYJFT.js.map +1 -0
- package/dist/{usage-card-BeSLY0i0.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-B6kKb8jB.js → utils-BVbAG2J6.js} +128 -112
- 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/edit.tsx +3 -3
- 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 +27 -23
- package/docs/consumer-skill/references/analytics.md +33 -4
- 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 +25852 -32067
- package/docs/consumer-skill/references/composition.md +42 -21
- package/docs/consumer-skill/references/design-contract.md +1 -0
- package/docs/consumer-skill/references/discovery.md +8 -5
- package/docs/consumer-skill/references/installation.md +59 -10
- package/docs/consumer-skill/references/integration.md +28 -5
- package/docs/consumer-skill/references/product-composition.md +2 -2
- package/docs/consumer-skill/references/public-api.json +726 -641
- package/docs/consumer-skill/references/review.md +57 -15
- package/docs/consumer-skill/references/rhf-workflows.md +72 -0
- package/docs/consumer-skill/references/screen-archetypes.md +2 -2
- package/docs/consumer-skill/references/theming.md +8 -3
- 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 +178 -44
- 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 +74 -10
- 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 +12 -13
- package/templates/README.md +3 -2
- package/templates/admin-shell-template.tsx +50 -11
- package/templates/analytics-operations-template.tsx +20 -24
- package/templates/customers-template.tsx +30 -25
- 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-B9MHG0cT.js.map +0 -1
- package/dist/action-menu-Dr8K-ghE.js +0 -284
- package/dist/action-menu-Dr8K-ghE.js.map +0 -1
- package/dist/ai-artifact-C58tQcBy.js +0 -1185
- package/dist/ai-artifact-C58tQcBy.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-B_IuNWOo.js +0 -321
- package/dist/app-shell-B_IuNWOo.js.map +0 -1
- package/dist/auth-DTkkshS8.js.map +0 -1
- package/dist/badge-xIiV_E7f.js.map +0 -1
- package/dist/base/sheet.js +0 -3
- package/dist/breadcrumbs-J-K2kl4c.js +0 -129
- package/dist/breadcrumbs-J-K2kl4c.js.map +0 -1
- package/dist/button-S2Cubiiz.js.map +0 -1
- package/dist/buttons-BedGfygC.js.map +0 -1
- package/dist/cascader-B1MiqkBq.js +0 -439
- package/dist/cascader-B1MiqkBq.js.map +0 -1
- package/dist/choice-inputs-zUgBZfE4.js.map +0 -1
- package/dist/code-block-BzmM9Eig.js.map +0 -1
- package/dist/collapsible-BkAI_XD4.js +0 -81
- package/dist/collapsible-BkAI_XD4.js.map +0 -1
- package/dist/combobox-BEx0vJgF.js +0 -362
- package/dist/combobox-BEx0vJgF.js.map +0 -1
- package/dist/combobox-BwzoXFSG.js +0 -884
- package/dist/combobox-BwzoXFSG.js.map +0 -1
- package/dist/command-CrlPIL6m.js +0 -425
- package/dist/command-CrlPIL6m.js.map +0 -1
- package/dist/comments-Dmpp0YIc.js +0 -1169
- package/dist/comments-Dmpp0YIc.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 -16
- 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-CIxwbZt5.js.map +0 -1
- package/dist/data-display-BdgCAw8T.js.map +0 -1
- package/dist/date-Cq8ioE4o.js +0 -144
- package/dist/date-Cq8ioE4o.js.map +0 -1
- package/dist/date-picker-RlIzKom_.js +0 -1551
- package/dist/date-picker-RlIzKom_.js.map +0 -1
- package/dist/date-pickers-DY-CpXS1.js +0 -179
- package/dist/date-pickers-DY-CpXS1.js.map +0 -1
- package/dist/display-KsZLw9Ov.js.map +0 -1
- package/dist/features/sync.js +0 -142
- package/dist/features/sync.js.map +0 -1
- package/dist/feedback-Dm4izqFn.js +0 -240
- package/dist/feedback-Dm4izqFn.js.map +0 -1
- package/dist/field-affordance-recipes-DWcNcOjh.js.map +0 -1
- package/dist/field-state-recipes-BVA2CWHo.js +0 -12
- package/dist/field-state-recipes-BVA2CWHo.js.map +0 -1
- package/dist/filters-DzgSJpMK.js +0 -2257
- package/dist/filters-DzgSJpMK.js.map +0 -1
- package/dist/focus-recipes-B653VaLq.js.map +0 -1
- package/dist/form-field-BriWAXyg.js +0 -63
- package/dist/form-field-BriWAXyg.js.map +0 -1
- package/dist/forms-C0RGnJTe.js.map +0 -1
- package/dist/forms-numeric-DIhghX1Q.js +0 -910
- package/dist/forms-numeric-DIhghX1Q.js.map +0 -1
- package/dist/header-DMMxG__r.js.map +0 -1
- package/dist/hooks-DB6CJ4MR.js.map +0 -1
- package/dist/http-D_6rOnzU.js.map +0 -1
- package/dist/item-DjCcM18E.js +0 -277
- package/dist/item-DjCcM18E.js.map +0 -1
- package/dist/layout.types-Cn7aUzJp.js +0 -20
- package/dist/layout.types-Cn7aUzJp.js.map +0 -1
- package/dist/media-gallery-C-vChPmE.js +0 -203
- package/dist/media-gallery-C-vChPmE.js.map +0 -1
- package/dist/mentions-0_4nWuI-.js +0 -570
- package/dist/mentions-0_4nWuI-.js.map +0 -1
- package/dist/message-g8p7eVtN.js +0 -128
- package/dist/message-g8p7eVtN.js.map +0 -1
- package/dist/metadata-list-C3MkU-Om.js.map +0 -1
- package/dist/motion-recipes-DitYv6P2.js.map +0 -1
- package/dist/navigation-C90-oQFq.js +0 -255
- package/dist/navigation-C90-oQFq.js.map +0 -1
- package/dist/navigation-DaRjthVk.js +0 -288
- package/dist/navigation-DaRjthVk.js.map +0 -1
- package/dist/number-CRU3kGuk.js +0 -354
- package/dist/number-CRU3kGuk.js.map +0 -1
- package/dist/overlays-BSgCtM2v.js.map +0 -1
- package/dist/page-DUUKDAjo.js +0 -331
- package/dist/page-DUUKDAjo.js.map +0 -1
- package/dist/pagination-CgCjElfu.js.map +0 -1
- package/dist/popover-B85RenIl.js +0 -201
- package/dist/popover-B85RenIl.js.map +0 -1
- package/dist/primitives-ByWgGUgt.js +0 -380
- package/dist/primitives-ByWgGUgt.js.map +0 -1
- package/dist/receipt-tOc7B3hw.js +0 -116
- package/dist/receipt-tOc7B3hw.js.map +0 -1
- package/dist/rich-text-Dth5E882.js +0 -78
- package/dist/rich-text-Dth5E882.js.map +0 -1
- package/dist/rich-text-editor-C1fOjBTd.js +0 -1195
- package/dist/rich-text-editor-C1fOjBTd.js.map +0 -1
- package/dist/rich-text-editor-toolbar-laT3tpBT.js +0 -98
- package/dist/rich-text-editor-toolbar-laT3tpBT.js.map +0 -1
- package/dist/sanitize-html-DsQmI48u.js +0 -92
- package/dist/sanitize-html-DsQmI48u.js.map +0 -1
- package/dist/separator-Ct_WSWTJ.js.map +0 -1
- package/dist/settings-Bar5wiSo.js +0 -167
- package/dist/settings-Bar5wiSo.js.map +0 -1
- package/dist/sheet-BGPERY55.js +0 -250
- package/dist/sheet-BGPERY55.js.map +0 -1
- package/dist/sidebar-D-JYMMbY.js +0 -686
- package/dist/sidebar-D-JYMMbY.js.map +0 -1
- package/dist/sidebar-f9gRWXIR.js.map +0 -1
- package/dist/skeleton-BapcJd9C.js.map +0 -1
- package/dist/slot-CLF9kLrS.js +0 -16
- package/dist/slot-CLF9kLrS.js.map +0 -1
- package/dist/smart-card-CW0hjetE.js.map +0 -1
- package/dist/surface-recipes-BKRVW8Os.js.map +0 -1
- package/dist/table-B4TE7iOV.js +0 -175
- package/dist/table-B4TE7iOV.js.map +0 -1
- package/dist/table-CFOWY9pQ.js +0 -1536
- package/dist/table-CFOWY9pQ.js.map +0 -1
- package/dist/tabs-e7ko9S2o.js +0 -191
- package/dist/tabs-e7ko9S2o.js.map +0 -1
- package/dist/text-inputs-B1culiSK.js.map +0 -1
- package/dist/timelines-D3Sl9ueq.js +0 -458
- package/dist/timelines-D3Sl9ueq.js.map +0 -1
- package/dist/tooltip-8wz5S_Zr.js +0 -113
- package/dist/tooltip-8wz5S_Zr.js.map +0 -1
- package/dist/tree-CzUJHnFs.js.map +0 -1
- package/dist/typography-BQnine1k.js.map +0 -1
- package/dist/ui-provider-C-74NVLc.js.map +0 -1
- package/dist/upload-BOW6U2tI.js +0 -855
- package/dist/upload-BOW6U2tI.js.map +0 -1
- package/dist/upload-queue-qUXn1ykN.js +0 -409
- package/dist/upload-queue-qUXn1ykN.js.map +0 -1
- package/dist/usage-card-BeSLY0i0.js.map +0 -1
- package/dist/utils-B6kKb8jB.js.map +0 -1
- package/dist/value-inputs-skdVB2zh.js +0 -980
- package/dist/value-inputs-skdVB2zh.js.map +0 -1
- package/dist/value-typography-uAmWUAL1.js +0 -116
- package/dist/value-typography-uAmWUAL1.js.map +0 -1
- package/dist/workspace-DHeHv0qw.js +0 -411
- package/dist/workspace-DHeHv0qw.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-Cq3G0ZRP.js","names":["React","_Fragment","React","_Fragment","Text","DisplayLabel","Button","Stack","dotRecipes","popoverWidthRecipes","DropdownMenuItem","DropdownMenuSeparator","DropdownMenuTrigger","DropdownMenuGroup","DropdownMenuLabel","DropdownMenuContent","DropdownMenuLinkItem","DropdownMenu","ActionMenu","formatInitials","AvatarFallback","Avatar","AvatarImage","Separator","PopoverTrigger","Popover","PopoverContent","Breadcrumbs","useHasSidebarProvider","SidebarTrigger","useLayoutLinkRenderer","useCommandShortcut","headerInlineDividerAlignment","React$1","Fragment$1","HeaderBreadcrumbs","resolvedRenderLink","hasSidebarProvider","items","out","homeBreadcrumb","breadcrumbs","showCrumbs","trigger","triggerSlot","showTrigger","showSidebarTrigger","cn","className","Header","forwardRef","props","contentClassName","slots","showBreadcrumbs","breadcrumbsClassName","leftClassName","centerClassName","rightClassName","defaultHeaderNotificationsStrings","label","count","defaultHeaderSearchStrings","defaultHeaderUserMenuStrings","detectMac","ua","HeaderSearch","stringsProp","ariaExpanded","ariaHasPopup","ariaControls","strings","useStrings","detectedMac","setDetectedMac","useState","shortcutModifier","isMetaShortcut","enableShortcut","onOpen","shortcutTitle","shortcut","shortcutSlot","Search","iconClassName","HeaderGlobalSearchTrigger","controlled","open","onOpenChange","HeaderToolButton","Icon","active","badge","HeaderToolPopover","triggerClassName","HeaderUserMenu","initials","user","twoLineIdentity","showEmail","actions","onProfile","User","onSettings","Settings","onLogout","LogOut","renderTrigger","ChevronsUpDown","contentClasses","customContent","NOTIFICATION_TONE_CLASSNAMES","HeaderNotifications","unreadCountProp","unreadCount","notifications","notification","badgeText","triggerLabel","Bell","onMarkAllRead","NotificationRow","onNotificationClick","onViewAll","viewAllHref","renderNotification","content","onClick","renderLink"],"sources":["../src/components/layout/header/partials/header-breadcrumbs.tsx","../src/components/layout/header/header.tsx","../src/components/layout/header/header.types.ts","../src/components/layout/header/partials/header-search.tsx","../src/components/layout/header/partials/header-global-search-trigger.tsx","../src/components/layout/header/partials/header-tool-button.tsx","../src/components/layout/header/partials/header-tool-popover.tsx","../src/components/layout/header/partials/header-user-menu.tsx","../src/components/layout/header/partials/header-notifications.tsx"],"sourcesContent":["/** HeaderBreadcrumbs — breadcrumbs trail with optional sidebar trigger. */\nimport * as React from 'react';\n\nimport { Separator } from '../../../base/display/separator';\nimport { Breadcrumbs } from '../../../base/navigation/breadcrumbs';\nimport { SidebarTrigger } from '../../../base/sidebar';\nimport { useHasSidebarProvider } from '../../../base/sidebar/sidebar';\nimport { cn } from '../../../../lib/utils';\n\nimport { useLayoutLinkRenderer } from '../../hooks';\nimport type { BreadcrumbItem } from '../../layout.types';\nimport type { HeaderBreadcrumbsProps } from '../header.types';\n\nexport function HeaderBreadcrumbs({\n\tbreadcrumbs = [],\n\thomeBreadcrumb = null,\n\tshowSidebarTrigger = true,\n\ttriggerSlot,\n\trenderLink,\n\tclassName,\n}: HeaderBreadcrumbsProps) {\n\tconst resolvedRenderLink = useLayoutLinkRenderer({ renderLink });\n\tconst hasSidebarProvider = useHasSidebarProvider();\n\tconst items = React.useMemo<BreadcrumbItem[]>(() => {\n\t\tconst out: BreadcrumbItem[] = [];\n\t\tif (homeBreadcrumb) out.push(homeBreadcrumb);\n\t\tout.push(...breadcrumbs);\n\t\treturn out;\n\t}, [homeBreadcrumb, breadcrumbs]);\n\n\tconst showCrumbs = items.length > 0;\n\tconst trigger = triggerSlot ?? (hasSidebarProvider && <SidebarTrigger />);\n\tconst showTrigger = showSidebarTrigger && trigger != null && typeof trigger !== 'boolean';\n\n\treturn (\n\t\t<div className={cn('relative flex min-h-action min-w-0 items-center gap-space-lg', className)}>\n\t\t\t{showTrigger && (\n\t\t\t\t<div className=\"relative flex min-h-action shrink-0 items-center justify-center\">\n\t\t\t\t\t{trigger}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{!!showCrumbs && (\n\t\t\t\t<>\n\t\t\t\t\t{showTrigger && <Separator orientation=\"vertical\" className=\"h-icon shrink-0 data-[orientation=vertical]:self-center\" />}\n\t\t\t\t\t<div className=\"flex min-w-0 flex-1 items-center overflow-hidden\">\n\t\t\t\t\t\t<Breadcrumbs\n\t\t\t\t\t\t\tbreadcrumbs={items}\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\trenderLink={resolvedRenderLink}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'min-w-0 overflow-hidden',\n\t\t\t\t\t\t\t\t'[&_[data-slot=breadcrumb-list]]:flex-nowrap [&_[data-slot=breadcrumb-list]]:overflow-hidden [&_[data-slot=breadcrumb-list]]:break-normal',\n\t\t\t\t\t\t\t\t// The current page claims its width first and truncates last. Ancestors\n\t\t\t\t\t\t\t\t// share what remains, up to their own width, and give way first.\n\t\t\t\t\t\t\t\t'[&_[data-slot=breadcrumb-item]]:min-w-0',\n\t\t\t\t\t\t\t\t'[&_[data-slot=breadcrumb-item]:not(:last-child)]:max-w-max [&_[data-slot=breadcrumb-item]:not(:last-child)]:grow [&_[data-slot=breadcrumb-item]:not(:last-child)]:basis-0',\n\t\t\t\t\t\t\t\t'[&_[data-slot=breadcrumb-link]]:truncate [&_[data-slot=breadcrumb-page]]:truncate',\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/** Header — sticky top bar with breadcrumbs and slot-driven content regions. */\nimport { forwardRef } from 'react';\n\nimport { Stack } from '../../base/structure';\nimport { cn } from '../../../lib/utils';\n\nimport { useLayoutLinkRenderer } from '../hooks';\nimport { HeaderBreadcrumbs } from './partials/header-breadcrumbs';\nimport type { HeaderProps } from './header.types';\nimport { headerInlineDividerAlignment } from './header.recipes';\n\nexport const Header = forwardRef<HTMLElement, HeaderProps>(function Header({\n\tshowBreadcrumbs = true,\n\tbreadcrumbs = [],\n\thomeBreadcrumb = null,\n\tshowSidebarTrigger = true,\n\tslots,\n\trenderLink,\n\tclassName,\n\tcontentClassName,\n\tleftClassName,\n\tcenterClassName,\n\trightClassName,\n\tbreadcrumbsClassName,\n\t...props\n}, ref) {\n\tconst resolvedRenderLink = useLayoutLinkRenderer({ renderLink });\n\n\treturn (\n\t\t<header\n\t\t\t{...props}\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t'header--component @container/app-header box-border sticky top-0 z-40 flex min-w-0 min-h-shell-header items-center border-b border-border bg-background px-surface-lg py-space-sm',\n\t\t\t\theaderInlineDividerAlignment,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Stack direction=\"horizontal\" gap=\"xl\" align=\"center\" wrap className={cn('min-w-0 min-h-action flex-1', contentClassName)}>\n\t\t\t\t{!!slots?.brand && (\n\t\t\t\t\t<div className=\"hidden min-w-0 shrink-0 items-center @2xl/app-header:flex\">\n\t\t\t\t\t\t{slots.brand}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{!!showBreadcrumbs && (\n\t\t\t\t\t<div className=\"min-w-0 flex-1 basis-32\">\n\t\t\t\t\t\t{slots?.breadcrumbs ?? (\n\t\t\t\t\t\t<HeaderBreadcrumbs\n\t\t\t\t\t\t\tbreadcrumbs={breadcrumbs}\n\t\t\t\t\t\t\thomeBreadcrumb={homeBreadcrumb}\n\t\t\t\t\t\t\tshowSidebarTrigger={showSidebarTrigger}\n\t\t\t\t\t\t\trenderLink={resolvedRenderLink}\n\t\t\t\t\t\t\tclassName={breadcrumbsClassName}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{!!slots?.left && (\n\t\t\t\t\t<div className={cn('flex min-w-0 items-center', leftClassName)}>\n\t\t\t\t\t\t{slots.left}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{!!slots?.center && (\n\t\t\t\t\t/* Search narrows within its region before navigation or account controls lose space. */\n\t\t\t\t\t<div className={cn('hidden min-w-0 flex-1 basis-64 items-center justify-center @3xl/app-header:flex [&>*]:min-w-0 [&>*]:max-w-full', centerClassName)}>\n\t\t\t\t\t\t{slots.center}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{!!slots?.right && (\n\t\t\t\t\t<div className={cn('ms-auto flex min-w-0 max-w-full flex-wrap items-center justify-end gap-space-md [&>*]:max-w-full', rightClassName)}>\n\t\t\t\t\t\t{slots.right}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</header>\n\t);\n});\n\nHeader.displayName = 'Header';\n","/**\n * Header layout and partial types.\n *\n * This layer is intentionally framework-neutral: links and route state enter\n * through `renderLink`, and app-specific content enters through slots.\n */\nimport type { AriaAttributes, ComponentType, HTMLAttributes, ReactNode } from 'react';\n\nimport type { StringsProp } from '../../../lib/strings';\nimport type { SemanticTone } from '../../../lib/component-vocabulary';\n\nimport type {\n\tBreadcrumbItem,\n\tLayoutNavigationAdapter,\n\tLayoutUser,\n} from '../layout.types';\n\nexport interface HeaderBreadcrumbsProps extends LayoutNavigationAdapter {\n\t/** Trail entries, root first. */\n\tbreadcrumbs?: BreadcrumbItem[];\n\t/** Root entry prepended to the trail. */\n\thomeBreadcrumb?: BreadcrumbItem | null;\n\t/** Renders the sidebar control when a provider or a trigger slot is present. @default true */\n\tshowSidebarTrigger?: boolean;\n\t/** Custom trigger content. Can be used without a sidebar provider. */\n\ttriggerSlot?: ReactNode;\n\tclassName?: string;\n}\n\nexport type NotificationTone = Extract<\n\tSemanticTone,\n\t'info' | 'success' | 'warning' | 'destructive'\n>;\n\nexport interface HeaderNotification {\n\tid: string | number;\n\t/** Surface title. */\n\ttitle: ReactNode;\n\t/** Supporting copy under the title. */\n\tdescription?: ReactNode;\n\ttime?: ReactNode;\n\tread?: boolean;\n\ttone?: NotificationTone;\n\t/** Destination for the entry, when it navigates. */\n\thref?: string;\n}\n\nexport interface HeaderNotificationsStrings {\n\ttriggerLabel: string;\n\t/**\n\t * Names the trigger while notifications are unread; receives the count and\n\t * `triggerLabel`. The default reads \"Notifications, 2 unread\", or\n\t * \"{triggerLabel} (2)\" for a `triggerLabel` the consumer replaced.\n\t */\n\ttriggerLabelUnread: (count: number, label: string) => string;\n\theading: string;\n\tmarkAllRead: string;\n\tempty: string;\n\tviewAll: string;\n}\n\nexport const defaultHeaderNotificationsStrings: HeaderNotificationsStrings = {\n\ttriggerLabel: 'Notifications',\n\t// A translated trigger label takes a language-neutral count, so no English reaches it.\n\ttriggerLabelUnread: (count, label) => (label === 'Notifications' ? `${label}, ${count} unread` : `${label} (${count})`),\n\theading: 'Notifications',\n\tmarkAllRead: 'Mark all as read',\n\tempty: 'No new notifications',\n\tviewAll: 'View all notifications',\n};\n\nexport interface HeaderNotificationsProps extends LayoutNavigationAdapter {\n\t/** Notifications to list, newest first. */\n\tnotifications?: HeaderNotification[];\n\t/** Unread total shown on the trigger and in its accessible name. Defaults to the notifications not marked `read`. */\n\tunreadCount?: number;\n\tonNotificationClick?: (notification: HeaderNotification) => void;\n\tonMarkAllRead?: () => void;\n\tonViewAll?: () => void;\n\t/** Destination for the view-all link. */\n\tviewAllHref?: string;\n\t/** Alignment of the shell's content. */\n\talign?: 'start' | 'center' | 'end';\n\t/** Which side of the trigger the surface opens on. */\n\tside?: 'top' | 'right' | 'bottom' | 'left';\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<HeaderNotificationsStrings>;\n\tclassName?: string;\n\t/** Merged onto the content region. */\n\tcontentClassName?: string;\n\t/** Replaces the default notification row. */\n\trenderNotification?: (notification: HeaderNotification) => ReactNode;\n}\n\nexport interface HeaderSearchStrings {\n\tplaceholder: string;\n\tshortcutMac: string;\n\tshortcutPc: string;\n}\n\nexport const defaultHeaderSearchStrings: HeaderSearchStrings = {\n\tplaceholder: 'Search...',\n\tshortcutMac: '⌘K',\n\tshortcutPc: 'Ctrl+K',\n};\n\nexport interface HeaderSearchProps extends Pick<AriaAttributes, 'aria-expanded' | 'aria-haspopup' | 'aria-controls'> {\n\tonOpen?: () => void;\n\t/**\n\t * Modifier shown in the hint. Omitted, the hint follows the platform (⌘ on\n\t * Apple platforms, Ctrl elsewhere) and either modifier opens search. Set, it\n\t * is the only modifier the shortcut listens for.\n\t */\n\tshortcutModifier?: 'meta' | 'control';\n\t/** Binds the keyboard shortcut that opens search. It does not fire while focus is in a field, an editor or an open menu or dialog. */\n\tenableShortcut?: boolean;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<HeaderSearchStrings>;\n\tclassName?: string;\n\t/** Merged onto the icon. */\n\ticonClassName?: string;\n\t/** Replaces the shortcut hint shown in the trigger. */\n\tshortcutSlot?: ReactNode;\n}\n\nexport interface HeaderGlobalSearchTriggerProps extends HeaderSearchProps {\n\t/** Whether the search surface is showing. Reported on the trigger as `aria-expanded` with `aria-haspopup=\"dialog\"`; the consumer owns the surface. */\n\topen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n}\n\nexport interface HeaderToolButtonProps {\n\t/** Display label. */\n\tlabel: string;\n\t/** Leading glyph. */\n\ticon: ComponentType<{ className?: string }>;\n\t/** Marks the control as currently engaged. */\n\tactive?: boolean;\n\t/** Disables the control. */\n\tdisabled?: boolean;\n\t/** Chip rendered beside the label. */\n\tbadge?: ReactNode;\n\tonClick?: () => void;\n\tclassName?: string;\n\t/** Merged onto the icon. */\n\ticonClassName?: string;\n}\n\nexport interface HeaderToolPopoverProps {\n\t/** Display label. */\n\tlabel: string;\n\t/** Leading glyph. */\n\ticon: ComponentType<{ className?: string }>;\n\t/** Whether the surface is showing. Controlled. */\n\topen?: boolean;\n\t/** Whether the surface starts open, for uncontrolled use. */\n\tdefaultOpen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n\t/** Marks the control as currently engaged. */\n\tactive?: boolean;\n\t/** Disables the control. */\n\tdisabled?: boolean;\n\t/** Chip rendered beside the label. */\n\tbadge?: ReactNode;\n\t/** Alignment of the shell's content. */\n\talign?: 'start' | 'center' | 'end';\n\t/** Which side of the trigger the surface opens on. */\n\tside?: 'top' | 'right' | 'bottom' | 'left';\n\tsideOffset?: number;\n\tclassName?: string;\n\t/** Merged onto the trigger. */\n\ttriggerClassName?: string;\n\t/** Merged onto the content region. */\n\tcontentClassName?: string;\n\tchildren?: ReactNode;\n}\n\nexport interface HeaderUserMenuProps {\n\t/** The signed-in user shown in the menu. */\n\tuser: LayoutUser;\n\t/** Shows the signed-in email under the name. */\n\tshowEmail?: boolean;\n\t/** Extra content appended inside the menu. */\n\tcustomContent?: ReactNode;\n\tonProfile?: () => void;\n\tonSettings?: () => void;\n\tonLogout?: () => void;\n\t/** Alignment of the shell's content. */\n\talign?: 'start' | 'center' | 'end';\n\t/** Which side of the trigger the surface opens on. */\n\tside?: 'top' | 'right' | 'bottom' | 'left';\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<HeaderUserMenuStrings>;\n\t/** Merged onto the trigger. */\n\ttriggerClassName?: string;\n\t/** Merged onto the content region. */\n\tcontentClassName?: string;\n\t/** Replaces the default trigger element. */\n\trenderTrigger?: (user: LayoutUser) => ReactNode;\n}\n\nexport interface HeaderUserMenuStrings {\n\tprofile: string;\n\tsettings: string;\n\tlogout: string;\n}\n\nexport const defaultHeaderUserMenuStrings: HeaderUserMenuStrings = {\n\tprofile: 'Profile',\n\tsettings: 'Settings',\n\tlogout: 'Log out',\n};\n\nexport interface HeaderSlots {\n\t/** Leading brand/logo before breadcrumbs, visible from the 2xl/app-header container width (42rem by default). Use left for identity that must remain visible at narrow widths. */\n\tbrand?: ReactNode;\n\t/** Replaces the breadcrumb/sidebar-trigger region, rendered only while showBreadcrumbs is true. */\n\tbreadcrumbs?: ReactNode;\n\t/** Leading content after breadcrumbs; always rendered when supplied, including narrow container widths. The app owns compact content and overflow. */\n\tleft?: ReactNode;\n\t/** Optional center content, usually search, visible from the 3xl/app-header container width (48rem by default). Essential navigation needs a narrow-width alternative in left or right. */\n\tcenter?: ReactNode;\n\t/** Trailing content, usually tools/account actions; always rendered when supplied and wraps at narrow widths. Its children own their responsive behavior. */\n\tright?: ReactNode;\n}\n\nexport interface HeaderProps extends LayoutNavigationAdapter, HTMLAttributes<HTMLElement> {\n\t/** Renders the breadcrumb trail. */\n\tshowBreadcrumbs?: boolean;\n\t/** Trail entries, root first. */\n\tbreadcrumbs?: BreadcrumbItem[];\n\t/** Root entry prepended to the trail. */\n\thomeBreadcrumb?: BreadcrumbItem | null;\n\t/** Renders the sidebar control when a sidebar provider is present. @default true */\n\tshowSidebarTrigger?: boolean;\n\t/** Composes shell regions by container width: brand appears from 2xl/app-header (42rem default), center from 3xl/app-header (48rem default); left and right are always rendered when supplied. Keep essential narrow-width identity/navigation in left or right and supply compact/overflow behavior. */\n\tslots?: HeaderSlots;\n\tclassName?: string;\n\t/** Merged onto the content region. */\n\tcontentClassName?: string;\n\t/** Merged onto the leading region. */\n\tleftClassName?: string;\n\t/** Merged onto the centre region. */\n\tcenterClassName?: string;\n\trightClassName?: string;\n\tbreadcrumbsClassName?: string;\n}\n","/** HeaderSearch — framework-neutral search trigger with optional Cmd/Ctrl+K. */\nimport { useEffect, useState } from 'react';\nimport { Search } from 'lucide-react';\n\nimport { Button } from '../../../base/buttons';\nimport { Text } from '../../../typography';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\nimport { kbdRecipe } from '../../../../lib/surface-recipes';\n\nimport { useCommandShortcut } from '../../hooks';\nimport {\n\tdefaultHeaderSearchStrings,\n\ttype HeaderSearchProps,\n} from '../header.types';\n\nfunction detectMac(): boolean {\n\tif (typeof navigator === 'undefined') return false;\n\tconst ua = (navigator as Navigator & { userAgentData?: { platform?: string } }).userAgentData;\n\tif (ua?.platform) return ua.platform === 'macOS';\n\treturn /Mac|iPhone|iPad/.test(navigator.platform);\n}\n\nexport function HeaderSearch({\n\tonOpen,\n\tshortcutModifier,\n\tenableShortcut = true,\n\tstrings: stringsProp,\n\tclassName,\n\ticonClassName,\n\tshortcutSlot,\n\t'aria-expanded': ariaExpanded,\n\t'aria-haspopup': ariaHasPopup,\n\t'aria-controls': ariaControls,\n}: HeaderSearchProps) {\n\tconst strings = useStrings(defaultHeaderSearchStrings, stringsProp);\n\tconst [detectedMac, setDetectedMac] = useState(false);\n\tuseEffect(() => {\n\t\tif (shortcutModifier === undefined) setDetectedMac(detectMac());\n\t}, [shortcutModifier]);\n\tconst resolvedModifier = shortcutModifier ?? (detectedMac ? 'meta' : 'control');\n\tconst isMetaShortcut = resolvedModifier === 'meta';\n\t// A detected platform decides only the hint: either modifier opens search, so\n\t// Ctrl+K keeps working on Apple platforms. A modifier the consumer chose is the only key.\n\tuseCommandShortcut({ key: 'k', enabled: enableShortcut, onTrigger: onOpen, modifier: shortcutModifier ?? 'mod' });\n\n\tconst shortcutTitle = isMetaShortcut ? strings.shortcutMac : strings.shortcutPc;\n\tconst shortcut = shortcutSlot ?? (\n\t\t// The shared key cap; it appears once the trigger's own label region has room\n\t\t// for it beside the placeholder, wherever the trigger is placed.\n\t\t<kbd className={cn('header-search--shortcut', kbdRecipe, 'hidden @min-[10rem]/header-search:inline-flex')}>\n\t\t\t{isMetaShortcut ? strings.shortcutMac : strings.shortcutPc}\n\t\t</kbd>\n\t);\n\n\treturn (\n\t\t<Button\n\t\t\tdata-component=\"header-search\"\n\t\t\tdata-slot=\"header-search-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-label={strings.placeholder}\n\t\t\taria-expanded={ariaExpanded}\n\t\t\taria-haspopup={ariaHasPopup}\n\t\t\taria-controls={ariaControls}\n\t\t\ttone=\"secondary\"\n\t\t\tbuttonStyle=\"outline\"\n\t\t\tsize=\"md\"\n\t\t\tonClick={onOpen}\n\t\t\tclassName={cn(\n\t\t\t\t'header-search--component header-search--trigger h-action w-full min-w-0 justify-start gap-space-md rounded-radius px-control-sm text-foreground shadow-none transition-[background-color,border-color,color,box-shadow]',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\ttitle={shortcutTitle}\n\t\t>\n\t\t\t<Search data-slot=\"header-search-icon\" className={cn('header-search--icon size-icon shrink-0 text-muted-foreground', iconClassName)} aria-hidden=\"true\" />\n\t\t\t{/* The label region is the key cap's container. A container has no intrinsic\n\t\t\t width, so a floor keeps the placeholder readable in a content-sized slot. */}\n\t\t\t<span className=\"header-search--label @container/header-search flex min-w-20 flex-1 items-center gap-space-md\">\n\t\t\t\t<Text tag=\"span\" size=\"inherit\" type=\"secondary\" data-slot=\"header-search-placeholder\" className=\"header-search--placeholder min-w-0 flex-1 truncate text-left\">\n\t\t\t\t\t{strings.placeholder}\n\t\t\t\t</Text>\n\t\t\t\t{shortcut}\n\t\t\t</span>\n\t\t</Button>\n\t);\n}\n","/** HeaderGlobalSearchTrigger — header search trigger with controlled open callback. */\nimport { HeaderSearch } from './header-search';\nimport type { HeaderGlobalSearchTriggerProps } from '../header.types';\n\nexport function HeaderGlobalSearchTrigger({\n\tonOpen,\n\topen,\n\tonOpenChange,\n\t...props\n}: HeaderGlobalSearchTriggerProps) {\n\t// A controlled trigger reports the surface it owns; without `open` it stays a plain command.\n\tconst controlled = open !== undefined;\n\treturn (\n\t\t<HeaderSearch\n\t\t\taria-haspopup={controlled ? 'dialog' : undefined}\n\t\t\taria-expanded={controlled ? open : undefined}\n\t\t\t{...props}\n\t\t\tonOpen={() => {\n\t\t\t\tonOpen?.();\n\t\t\t\tonOpenChange?.(true);\n\t\t\t}}\n\t\t/>\n\t);\n}\n","/** HeaderToolButton — icon control for dense app headers. */\nimport * as React from 'react';\n\nimport { Button } from '../../../base/buttons';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport { headerCountBadge } from '../header.recipes';\nimport type { HeaderToolButtonProps } from '../header.types';\n\nexport const HeaderToolButton = React.forwardRef<\n\tHTMLButtonElement,\n\tHeaderToolButtonProps\n>((\n\t{\n\t\tlabel,\n\t\ticon: Icon,\n\t\tactive = false,\n\t\tdisabled = false,\n\t\tbadge,\n\t\tonClick,\n\t\tclassName,\n\t\ticonClassName,\n\t},\n\tref,\n) => (\n\t<Button\n\t\tref={ref}\n\t\tdata-component=\"header-tool-button\"\n\t\tdata-slot=\"header-tool-button\"\n\t\ttype=\"button\"\n\t\ttone=\"secondary\"\n\t\tbuttonStyle=\"ghost\"\n\t\tsize=\"md\" iconOnly\n\t\taria-label={label}\n\t\taria-pressed={active || undefined}\n\t\ttitle={label}\n\t\tdisabled={disabled}\n\t\tonClick={onClick}\n\t\tclassName={cn(\n\t\t\t'header-tool-button--component header-tool-button--trigger relative rounded-radius text-foreground transition-[background-color,color,box-shadow] hover:bg-accent hover:text-accent-foreground',\n\t\t\tactive && 'bg-accent text-accent-foreground',\n\t\t\tclassName,\n\t\t)}\n\t>\n\t\t<Icon\n\t\t\tdata-slot=\"header-tool-icon\"\n\t\t\tclassName={cn('header-tool-button--icon size-icon', iconClassName)}\n\t\t\taria-hidden=\"true\"\n\t\t/>\n\t\t{!!badge && (\n\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" lineHeight=\"none\" data-slot=\"header-tool-badge\" className={cn('header-tool-button--badge', headerCountBadge)}>\n\t\t\t\t{badge}\n\t\t\t</Text>\n\t\t)}\n\t\t<Text tag=\"span\" size=\"inherit\" className=\"sr-only\">{label}</Text>\n\t</Button>\n));\n\nHeaderToolButton.displayName = 'HeaderToolButton';\n","/** HeaderToolPopover — controlled header icon trigger plus popover content. */\nimport {\n\tPopover,\n\tPopoverContent,\n\tPopoverTrigger,\n} from '../../../base/popover';\nimport { cn } from '../../../../lib/utils';\n\nimport type { HeaderToolPopoverProps } from '../header.types';\nimport { HeaderToolButton } from './header-tool-button';\nimport { popoverWidthRecipes } from '../../../base/popover/popover.recipes';\n\nexport function HeaderToolPopover({\n\tlabel,\n\ticon,\n\topen,\n\tdefaultOpen,\n\tonOpenChange,\n\tactive,\n\tdisabled,\n\tbadge,\n\talign = 'end',\n\tside = 'bottom',\n\tsideOffset = 8,\n\tclassName,\n\ttriggerClassName,\n\tcontentClassName,\n\tchildren,\n}: HeaderToolPopoverProps) {\n\treturn (\n\t\t<Popover\n\t\t\topen={open}\n\t\t\tdefaultOpen={defaultOpen}\n\t\t\tonOpenChange={onOpenChange}\n\t\t>\n\t\t\t<PopoverTrigger\n\t\t\t\trender={(\n\t\t\t\t\t<HeaderToolButton\n\t\t\t\t\t\tlabel={label}\n\t\t\t\t\t\ticon={icon}\n\t\t\t\t\t\tactive={active ?? open}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tbadge={badge}\n\t\t\t\t\t\tclassName={triggerClassName}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<PopoverContent\n\t\t\t\tdata-component=\"header-tool-popover\"\n\t\t\t\tdata-slot=\"header-tool-popover-content\"\n\t\t\t\talign={align}\n\t\t\t\tside={side}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'header-tool-popover--component',\n\t\t\t\t\tpopoverWidthRecipes.lg,\n\t\t\t\t\tclassName,\n\t\t\t\t\tcontentClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n","/** HeaderUserMenu — avatar/name trigger with consumer-wired menu callbacks. */\nimport type { ReactElement } from 'react';\n\nimport { ChevronsUpDown, LogOut, Settings, User } from 'lucide-react';\n\nimport { ActionMenu, type ActionMenuAction } from '../../../base/action-menu';\nimport { Avatar, AvatarFallback, AvatarImage } from '../../../base/avatar';\nimport { Button } from '../../../base/buttons';\nimport { formatInitials } from '../../../primitives/initials-format';\nimport { Text } from '../../../typography';\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuTrigger,\n} from '../../../base/navigation/dropdown-menu';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport {\n\tdefaultHeaderUserMenuStrings,\n\ttype HeaderUserMenuProps,\n} from '../header.types';\n\nexport function HeaderUserMenu({\n\tuser,\n\tshowEmail = true,\n\tcustomContent,\n\tonProfile,\n\tonSettings,\n\tonLogout,\n\talign = 'end',\n\tside = 'bottom',\n\tstrings: stringsProp,\n\ttriggerClassName,\n\tcontentClassName,\n\trenderTrigger,\n}: HeaderUserMenuProps) {\n\tconst strings = useStrings(defaultHeaderUserMenuStrings, stringsProp);\n\tconst initials = formatInitials(user.name, { strategy: 'first-words' });\n\tconst twoLineIdentity = showEmail && !!user.email;\n\n\t// Profile and settings sit together; sign-out is held apart by a rule with\n\t// no caption, which is what `group: true` is for.\n\tconst actions: ActionMenuAction[] = [\n\t\t...(onProfile ? [{ id: 'profile', label: strings.profile, icon: User, onClick: onProfile }] : []),\n\t\t...(onSettings ? [{ id: 'settings', label: strings.settings, icon: Settings, onClick: onSettings }] : []),\n\t\t...(onLogout\n\t\t\t? [{\n\t\t\t\tid: 'logout',\n\t\t\t\tlabel: strings.logout,\n\t\t\t\ticon: LogOut,\n\t\t\t\tonClick: onLogout,\n\t\t\t\t...(onProfile || onSettings ? { group: true as const } : null),\n\t\t\t}]\n\t\t\t: []),\n\t];\n\n\tconst trigger = renderTrigger?.(user) ?? (\n\t\t<Button\n\t\t\tdata-component=\"header-user-menu\"\n\t\t\tdata-slot=\"header-user-menu-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-label={user.name}\n\t\t\ttone=\"secondary\"\n\t\t\tbuttonStyle=\"ghost\"\n\t\t\t// A one-line identity shares the header control height; name plus email needs the taller action.\n\t\t\tsize={twoLineIdentity ? 'lg' : 'md'}\n\t\t\tclassName={cn(\n\t\t\t\t'header-user-menu--component header-user-menu--trigger group min-w-0 max-w-56 justify-start gap-space-md text-foreground shadow-none hover:bg-accent hover:text-accent-foreground data-[state=open]:bg-accent',\n\t\t\t\t!twoLineIdentity && 'h-action',\n\t\t\t\t// The identity follows the space its header row offers (the nearest container's\n\t\t\t\t// content box, with the viewport as the fallback): narrow rows keep the avatar control.\n\t\t\t\t'max-sm:size-action max-sm:justify-center max-sm:p-0 max-sm:[&_.header-user-menu--identity]:hidden max-sm:[&_.header-user-menu--chevron]:hidden',\n\t\t\t\t'@max-md:size-action @max-md:justify-center @max-md:p-0 @max-md:[&_.header-user-menu--identity]:hidden @max-md:[&_.header-user-menu--chevron]:hidden',\n\t\t\t\ttriggerClassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Avatar size=\"sm\" data-slot=\"header-user-avatar\" className=\"header-user-menu--avatar overflow-hidden rounded-full ring-1 ring-border\">\n\t\t\t\t{!!user.avatar && <AvatarImage src={user.avatar} alt={user.name} />}\n\t\t\t\t<AvatarFallback className=\"rounded-full bg-muted text-muted-foreground\">\n\t\t\t\t\t{initials}\n\t\t\t\t</AvatarFallback>\n\t\t\t</Avatar>\n\t\t\t<div data-slot=\"header-user-identity\" className=\"header-user-menu--identity grid min-w-0 flex-1 gap-dense text-start leading-none\">\n\t\t\t\t<Text type=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"truncate\">{user.name}</Text>\n\t\t\t\t{twoLineIdentity && (\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" lineHeight=\"tight\" className=\"truncate\">{user.email}</Text>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<ChevronsUpDown className=\"header-user-menu--chevron size-icon-sm shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n\t\t</Button>\n\t);\n\n\tconst contentClasses = cn(\n\t\t'header-user-menu--content w-(--anchor-width) min-w-56 rounded-surface',\n\t\tcontentClassName,\n\t);\n\n\t// `customContent` replaces the menu body wholesale, which is a plain\n\t// dropdown rather than a list of commands — ActionMenu is deliberately not\n\t// that, so this path stays on the primitive it actually needs.\n\tif (customContent) {\n\t\treturn (\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger render={trigger as ReactElement} />\n\t\t\t\t<DropdownMenuContent\n\t\t\t\t\tdata-component=\"header-user-menu-content\"\n\t\t\t\t\tdata-slot=\"header-user-menu-content\"\n\t\t\t\t\tclassName={contentClasses}\n\t\t\t\t\talign={align}\n\t\t\t\t\tside={side}\n\t\t\t\t>\n\t\t\t\t\t{customContent}\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t);\n\t}\n\n\treturn (\n\t\t<ActionMenu\n\t\t\tactions={actions}\n\t\t\talign={align}\n\t\t\tside={side}\n\t\t\tcontentClassName={contentClasses}\n\t\t\twidth=\"w-auto\"\n\t\t\tcloseOnSelect\n\t\t\trenderTrigger={trigger as ReactElement}\n\t\t/>\n\t);\n}\n","/** HeaderNotifications — bell dropdown for consumer-supplied notifications. */\nimport type { ReactElement } from 'react';\n\nimport { Bell } from 'lucide-react';\n\nimport { Button } from '../../../base/buttons';\nimport { Stack } from '../../../base/structure';\nimport { DisplayLabel, Text } from '../../../typography';\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuGroup,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuLinkItem,\n\tDropdownMenuSeparator,\n\tDropdownMenuTrigger,\n} from '../../../base/navigation/dropdown-menu';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { useLayoutLinkRenderer } from '../../hooks';\nimport {\n\tdefaultHeaderNotificationsStrings,\n\ttype HeaderNotification,\n\ttype HeaderNotificationsProps,\n\ttype NotificationTone,\n} from '../header.types';\nimport { popoverWidthRecipes } from '../../../base/popover/popover.recipes';\nimport { headerCountBadge } from '../header.recipes';\nimport { dotRecipes } from '../../../../lib/tone-recipes';\n\nconst NOTIFICATION_TONE_CLASSNAMES: Record<NotificationTone, string> = {\n\tinfo: 'bg-info',\n\tsuccess: 'bg-success',\n\twarning: 'bg-warning',\n\tdestructive: 'bg-destructive',\n};\n\nexport function HeaderNotifications({\n\tnotifications = [],\n\tunreadCount: unreadCountProp,\n\tonNotificationClick,\n\tonMarkAllRead,\n\tonViewAll,\n\tviewAllHref,\n\trenderLink,\n\talign = 'end',\n\tside = 'bottom',\n\tstrings: stringsProp,\n\tclassName,\n\tcontentClassName,\n\trenderNotification,\n}: HeaderNotificationsProps) {\n\tconst strings = useStrings(defaultHeaderNotificationsStrings, stringsProp);\n\tconst resolvedRenderLink = useLayoutLinkRenderer({ renderLink });\n\t// An explicit count wins, including zero; otherwise every notification not marked read counts.\n\tconst unreadCount = unreadCountProp ?? notifications.filter((notification) => !notification.read).length;\n\tconst badgeText = unreadCount > 99 ? '99+' : String(unreadCount);\n\tconst triggerLabel = unreadCount > 0 ? strings.triggerLabelUnread(unreadCount, strings.triggerLabel) : strings.triggerLabel;\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger\n\t\t\t\trender={\n\t\t\t\t\t<Button\n\t\t\t\t\t\tdata-component=\"header-notifications\"\n\t\t\t\t\t\tdata-slot=\"header-notifications-trigger\"\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\tsize=\"md\" iconOnly\n\t\t\t\t\t\taria-label={triggerLabel}\n\t\t\t\t\t\tclassName={cn('header-notifications--component header-notifications--trigger relative', className)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Bell className=\"size-icon\" aria-hidden=\"true\" />\n\t\t\t\t\t\t{unreadCount > 0 && (\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" lineHeight=\"none\" data-slot=\"header-notifications-badge\" className={cn('header-notifications--badge', headerCountBadge)}>\n\t\t\t\t\t\t\t\t{badgeText}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Button>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<DropdownMenuContent\n\t\t\t\tdata-component=\"header-notifications-content\"\n\t\t\t\tdata-slot=\"header-notifications-content\"\n\t\t\t\tclassName={cn('header-notifications--content', popoverWidthRecipes.lg, contentClassName)}\n\t\t\t\talign={align}\n\t\t\t\tside={side}\n\t\t\t>\n\t\t\t\t<DropdownMenuGroup>\n\t\t\t\t\t{/* The command is a menu item so arrow keys reach it; it keeps the menu open to show the result. */}\n\t\t\t\t\t<div className=\"header-notifications--header flex items-center justify-between gap-space-lg\">\n\t\t\t\t\t\t<DropdownMenuLabel aria-hidden={false} className=\"header-notifications--label min-w-0 flex-1 text-inherit\">\n\t\t\t\t\t\t\t<DisplayLabel className=\"text-inherit\">{strings.heading}</DisplayLabel>\n\t\t\t\t\t\t</DropdownMenuLabel>\n\t\t\t\t\t\t{unreadCount > 0 && !!onMarkAllRead && (\n\t\t\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\t\t\tcloseOnClick={false}\n\t\t\t\t\t\t\t\tonClick={onMarkAllRead}\n\t\t\t\t\t\t\t\tclassName=\"header-notifications--mark-all-read w-auto shrink-0\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{strings.markAllRead}\n\t\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t<DropdownMenuSeparator />\n\n\t\t\t\t\t{notifications.length === 0 ? (\n\t\t\t\t\t\t<div className=\"header-notifications--empty p-surface text-center\">\n\t\t\t\t\t\t\t<Text type=\"secondary\">{strings.empty}</Text>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Stack gap=\"xs\" className=\"header-notifications--list\">\n\t\t\t\t\t\t\t{notifications.map((notification) => (\n\t\t\t\t\t\t\t\t<NotificationRow\n\t\t\t\t\t\t\t\t\tkey={notification.id}\n\t\t\t\t\t\t\t\t\tnotification={notification}\n\t\t\t\t\t\t\t\t\tonClick={onNotificationClick}\n\t\t\t\t\t\t\t\t\trenderLink={resolvedRenderLink}\n\t\t\t\t\t\t\t\t\trenderNotification={renderNotification}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t)}\n\t\t\t\t</DropdownMenuGroup>\n\n\t\t\t\t{!!(onViewAll || viewAllHref) && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<DropdownMenuSeparator />\n\t\t\t\t\t\t{viewAllHref ? (\n\t\t\t\t\t\t\t<DropdownMenuLinkItem\n\t\t\t\t\t\t\t\thref={viewAllHref}\n\t\t\t\t\t\t\t\trender={(props) =>\n\t\t\t\t\t\t\t\t\tresolvedRenderLink({\n\t\t\t\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\t\t\t\thref: viewAllHref,\n\t\t\t\t\t\t\t\t\t\tchildren: props.children,\n\t\t\t\t\t\t\t\t\t}) as ReactElement\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{strings.viewAll}\n\t\t\t\t\t\t\t</DropdownMenuLinkItem>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<DropdownMenuItem onClick={onViewAll}>{strings.viewAll}</DropdownMenuItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n\nfunction NotificationRow({\n\tnotification,\n\tonClick,\n\trenderLink,\n\trenderNotification,\n}: {\n\tnotification: HeaderNotification;\n\tonClick?: (n: HeaderNotification) => void;\n\trenderLink: NonNullable<HeaderNotificationsProps['renderLink']>;\n\t/** Replaces the default notification row. */\n\trenderNotification?: HeaderNotificationsProps['renderNotification'];\n}) {\n\tif (renderNotification) return renderNotification(notification);\n\n\tconst content = (\n\t\t<Stack direction=\"horizontal\" align=\"start\" wrap={false} gap=\"sm\" className=\"header-notifications--item-content\">\n\t\t\t{!!notification.tone && (\n\t\t\t\t<span\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tdata-tone={notification.tone}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'header-notifications--tone mt-space-sm',\n\t\t\t\t\t\t\t\t\tdotRecipes.marker,\n\t\t\t\t\t\tNOTIFICATION_TONE_CLASSNAMES[notification.tone],\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<Stack gap=\"dense\" className=\"min-w-0\">\n\t\t\t\t<Text type=\"inherit\" weight=\"medium\">{notification.title}</Text>\n\t\t\t\t{!!notification.description && <Text size=\"xs\" type=\"secondary\">{notification.description}</Text>}\n\t\t\t\t{!!notification.time && <Text size=\"xs\" type=\"secondary\">{notification.time}</Text>}\n\t\t\t</Stack>\n\t\t</Stack>\n\t);\n\n\tconst className = cn(\n\t\t'header-notifications--item items-start',\n\t\t!notification.read && 'bg-muted text-muted-foreground',\n\t);\n\n\tif (notification.href) {\n\t\treturn (\n\t\t\t<DropdownMenuLinkItem\n\t\t\t\thref={notification.href}\n\t\t\t\tclassName={className}\n\t\t\t\tonClick={() => onClick?.(notification)}\n\t\t\t\trender={(props) =>\n\t\t\t\t\trenderLink({\n\t\t\t\t\t\t...props,\n\t\t\t\t\t\thref: notification.href,\n\t\t\t\t\t\tchildren: props.children,\n\t\t\t\t\t}) as ReactElement\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t{content}\n\t\t\t</DropdownMenuLinkItem>\n\t\t);\n\t}\n\n\treturn (\n\t\t<DropdownMenuItem onClick={() => onClick?.(notification)} className={className}>\n\t\t\t{content}\n\t\t</DropdownMenuItem>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -16,6 +16,8 @@ export interface FileValidationRules {
|
|
|
16
16
|
maxSize?: number;
|
|
17
17
|
minSize?: number;
|
|
18
18
|
allowedExtensions?: string[];
|
|
19
|
+
/** Native file accept specifiers, including extensions, MIME types and wildcards. */
|
|
20
|
+
accept?: string;
|
|
19
21
|
maxFiles?: number;
|
|
20
22
|
customValidator?: (file: File) => boolean | string;
|
|
21
23
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { p as e } from "./sidebar-
|
|
3
|
-
import { n as t } from "./layout.types-
|
|
2
|
+
import { p as e } from "./sidebar-C-iQ_TJP.js";
|
|
3
|
+
import { n as t } from "./layout.types-DbtnyAtd.js";
|
|
4
4
|
import { useCallback as n, useEffect as r, useMemo as i } from "react";
|
|
5
5
|
import { jsx as a } from "react/jsx-runtime";
|
|
6
6
|
//#region src/components/layout/hooks/use-layout-link.tsx
|
|
@@ -33,24 +33,40 @@ function l(e, t) {
|
|
|
33
33
|
};
|
|
34
34
|
return i(t), n;
|
|
35
35
|
}
|
|
36
|
-
function u(e) {
|
|
37
|
-
return e.label;
|
|
36
|
+
function u(e, t) {
|
|
37
|
+
return `${typeof e.label == "string" || typeof e.label == "number" ? String(e.label) : e.handle ?? ""} ${e.handle ?? ""}`.toLocaleLowerCase().includes(t);
|
|
38
38
|
}
|
|
39
39
|
function d(e, t) {
|
|
40
|
-
|
|
40
|
+
return t ? e.flatMap((e) => {
|
|
41
|
+
if (u(e, t)) return [e];
|
|
42
|
+
let n = d(e.children ?? [], t);
|
|
43
|
+
return n.length ? [{
|
|
44
|
+
...e,
|
|
45
|
+
children: n
|
|
46
|
+
}] : [];
|
|
47
|
+
}) : e;
|
|
48
|
+
}
|
|
49
|
+
function f(e, t) {
|
|
50
|
+
return t ? e.reduce((e, n) => e + +!!u(n, t) + f(n.children ?? [], t), 0) : 0;
|
|
51
|
+
}
|
|
52
|
+
function p(e) {
|
|
53
|
+
return e.label;
|
|
54
|
+
}
|
|
55
|
+
function m(e, t) {
|
|
56
|
+
let n = p(e);
|
|
41
57
|
return e.id ?? e.handle ?? e.href ?? (typeof n == "string" || typeof n == "number" ? n : `nav-${t ?? 0}`);
|
|
42
58
|
}
|
|
43
|
-
function
|
|
59
|
+
function h({ value: t, size: n = "md" }) {
|
|
44
60
|
return /* @__PURE__ */ a(e, {
|
|
45
61
|
inline: !0,
|
|
46
62
|
size: n,
|
|
47
63
|
children: t
|
|
48
64
|
});
|
|
49
65
|
}
|
|
50
|
-
function
|
|
66
|
+
function g(e, t, n, r) {
|
|
51
67
|
return r && n?.[r] != null ? n[r] : e && n && n[e] != null ? n[e] : t;
|
|
52
68
|
}
|
|
53
|
-
function
|
|
69
|
+
function _({ icon: e, iconMap: t = {}, size: n = 20, className: r = "size-icon", ...i }) {
|
|
54
70
|
if (!e) return null;
|
|
55
71
|
if (typeof e == "string") {
|
|
56
72
|
let n = t[e];
|
|
@@ -63,38 +79,42 @@ function m({ icon: e, iconMap: t = {}, size: n = 20, className: r = "size-icon",
|
|
|
63
79
|
...i
|
|
64
80
|
}) : null;
|
|
65
81
|
}
|
|
66
|
-
function
|
|
82
|
+
function v(e, t, n, r, i) {
|
|
67
83
|
return e({
|
|
68
84
|
href: t.href,
|
|
69
85
|
children: n,
|
|
70
86
|
className: r,
|
|
71
87
|
active: i,
|
|
88
|
+
"aria-current": i ? "page" : void 0,
|
|
72
89
|
disabled: t.disabled || !t.href,
|
|
73
90
|
external: t.external
|
|
74
91
|
});
|
|
75
92
|
}
|
|
76
93
|
//#endregion
|
|
77
94
|
//#region src/components/layout/hooks/use-active-path.ts
|
|
78
|
-
function
|
|
95
|
+
function y(e = "/") {
|
|
79
96
|
return n((t) => !!t && c(e, s(t)), [e]);
|
|
80
97
|
}
|
|
81
98
|
//#endregion
|
|
82
99
|
//#region src/components/layout/hooks/use-command-shortcut.ts
|
|
83
|
-
|
|
100
|
+
var b = "input,textarea,select,[contenteditable]:not([contenteditable=\"false\"]),[role=\"textbox\"],[role=\"dialog\"],[role=\"alertdialog\"],[role=\"menu\"],[role=\"listbox\"]";
|
|
101
|
+
function x({ key: e, enabled: t = !0, onTrigger: n, preventDefault: i = !0, modifier: a = "mod", allowInEditable: o = !1 }) {
|
|
84
102
|
r(() => {
|
|
85
103
|
if (!t || !n || typeof document > "u") return;
|
|
86
104
|
let r = (t) => {
|
|
87
|
-
(t.metaKey || t.ctrlKey) && t.key.toLowerCase() === e.toLowerCase() && (i && t.preventDefault(), n());
|
|
105
|
+
t.defaultPrevented || t.repeat || t.altKey || t.shiftKey || (a === "meta" ? t.metaKey && !t.ctrlKey : a === "control" ? t.ctrlKey && !t.metaKey : t.metaKey || t.ctrlKey) && t.key.toLowerCase() === e.toLowerCase() && (o || !(t.target instanceof Element ? t.target : document.activeElement)?.closest(b)) && (i && t.preventDefault(), n());
|
|
88
106
|
};
|
|
89
107
|
return document.addEventListener("keydown", r), () => document.removeEventListener("keydown", r);
|
|
90
108
|
}, [
|
|
109
|
+
o,
|
|
91
110
|
t,
|
|
92
111
|
e,
|
|
112
|
+
a,
|
|
93
113
|
n,
|
|
94
114
|
i
|
|
95
115
|
]);
|
|
96
116
|
}
|
|
97
117
|
//#endregion
|
|
98
|
-
export {
|
|
118
|
+
export { f as a, m as c, v as d, g as f, h as i, p as l, o as m, y as n, d as o, s as p, _ as r, l as s, x as t, c as u };
|
|
99
119
|
|
|
100
|
-
//# sourceMappingURL=hooks-
|
|
120
|
+
//# sourceMappingURL=hooks-DHfeSMAO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks-DHfeSMAO.js","names":["IconComponent","SidebarMenuBadge","resolveLayoutLinkRenderer","useLayoutLinkRenderer","useMemo","renderLink","toPath","href","isPathMatch","currentPath","currentUrl","path","getCurrentNavigationHref","currentHref","currentPathLength","visit","item","nodes","items","matchesNavigationQuery","query","filterNavigation","children","countNavigationMatches","count","getNavLabel","getNavKey","label","fallbackIndex","NavBadge","value","resolveNavBadge","id","liveBadges","handle","itemBadge","DynamicIcon","props","icon","IconComponent","iconMap","size","renderSidebarLink","active","useActivePath","useCallback","EDITABLE_TARGET","useCommandShortcut","enabled","onTrigger","handler","event","modifier","key","allowInEditable","preventDefault"],"sources":["../src/components/layout/hooks/use-layout-link.tsx","../src/components/layout/sidebar/sidebar.utils.tsx","../src/components/layout/hooks/use-active-path.ts","../src/components/layout/hooks/use-command-shortcut.ts"],"sourcesContent":["import { useMemo } from 'react';\n\nimport {\n\tresolveLayoutLinkRenderer,\n\ttype LayoutLinkRenderer,\n\ttype LayoutNavigationAdapter,\n} from '../layout.types';\n\nexport function useLayoutLinkRenderer({\n\trenderLink,\n}: LayoutNavigationAdapter = {}): LayoutLinkRenderer {\n\treturn useMemo(\n\t\t() => resolveLayoutLinkRenderer({ renderLink }),\n\t\t[renderLink],\n\t);\n}\n"," \n/** Sidebar utilities — pure path helpers, labels, icon rendering, badge pill. */\nimport * as React from 'react';\n\nimport { SidebarMenuBadge } from '../../base/sidebar';\n\nimport type { LayoutIconSource, LayoutLinkRenderer } from '../layout.types';\nimport type { SidebarNavItem } from './sidebar.types';\nimport type { ComponentScale } from '../../../lib/component-vocabulary';\n\nexport function toPath(href: string): string {\n\tif (href.startsWith('#/')) {\n\t\treturn href.slice(1).split('?')[0]?.split('#')[0] || '/';\n\t}\n\n\ttry {\n\t\treturn new URL(href, 'http://local.invalid').pathname;\n\t} catch {\n\t\treturn href;\n\t}\n}\n\nexport function isPathMatch(currentUrl: string, path: string): boolean {\n\tconst currentPath = toPath(currentUrl);\n\treturn currentPath === path || currentPath.startsWith(path + '/') || currentPath.startsWith(path + '?');\n}\n\n/** Choose one destination across the whole navigation tree. Prefix matches\n * still open ancestors, but a shorter sibling route is not also current. */\ninterface NavigationPathItem {\n\thref?: string;\n\tchildren?: readonly NavigationPathItem[];\n}\n\nexport function getCurrentNavigationHref(\n\tcurrentUrl: string,\n\titems: readonly NavigationPathItem[],\n): string | undefined {\n\tlet currentHref: string | undefined;\n\tlet currentPathLength = -1;\n\tconst visit = (nodes: readonly NavigationPathItem[]) => {\n\t\tfor (const item of nodes) {\n\t\t\tif (item.href) {\n\t\t\t\tconst path = toPath(item.href);\n\t\t\t\tif (path.length > currentPathLength && isPathMatch(currentUrl, path)) {\n\t\t\t\t\tcurrentHref = item.href;\n\t\t\t\t\tcurrentPathLength = path.length;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (item.children?.length) visit(item.children);\n\t\t}\n\t};\n\tvisit(items);\n\treturn currentHref;\n}\n\nfunction matchesNavigationQuery(item: SidebarNavItem, query: string): boolean {\n\tconst label = typeof item.label === 'string' || typeof item.label === 'number' ? String(item.label) : item.handle ?? '';\n\treturn `${label} ${item.handle ?? ''}`.toLocaleLowerCase().includes(query);\n}\n\n/** Keeps entries whose label or handle matches, and the ancestors that lead to them. `query` is trimmed and lower-cased by the caller. */\nexport function filterNavigation(items: SidebarNavItem[], query: string): SidebarNavItem[] {\n\tif (!query) return items;\n\treturn items.flatMap(item => {\n\t\tif (matchesNavigationQuery(item, query)) return [item];\n\t\tconst children = filterNavigation(item.children ?? [], query);\n\t\treturn children.length ? [{ ...item, children }] : [];\n\t});\n}\n\n/** How many entries match the query themselves, at any depth. */\nexport function countNavigationMatches(items: readonly SidebarNavItem[], query: string): number {\n\tif (!query) return 0;\n\treturn items.reduce((count, item) => count + (matchesNavigationQuery(item, query) ? 1 : 0) + countNavigationMatches(item.children ?? [], query), 0);\n}\n\nexport function getNavLabel(item: Pick<SidebarNavItem, 'label'>): React.ReactNode {\n\treturn item.label;\n}\n\nexport function getNavKey(item: SidebarNavItem, fallbackIndex?: number): React.Key {\n\tconst label = getNavLabel(item);\n\treturn item.id ?? item.handle ?? item.href ?? (typeof label === 'string' || typeof label === 'number' ? label : `nav-${fallbackIndex ?? 0}`);\n}\n\nexport function NavBadge({\n\tvalue,\n\tsize = 'md',\n}: {\n\t/** Current value. Controlled. */\n\tvalue: string | number;\n\t/** Size preset. */\n\tsize?: ComponentScale;\n}) {\n\treturn (\n\t\t<SidebarMenuBadge inline size={size}>\n\t\t\t{value}\n\t\t</SidebarMenuBadge>\n\t);\n}\n\nexport function resolveNavBadge(\n\thandle: string | undefined,\n\titemBadge: string | number | undefined,\n\tliveBadges: Record<string, string | number> | undefined,\n\tid?: string,\n): string | number | undefined {\n\tif (id && liveBadges?.[id] != null) return liveBadges[id];\n\tif (handle && liveBadges && liveBadges[handle] != null) {\n\t\treturn liveBadges[handle];\n\t}\n\treturn itemBadge;\n}\n\nexport interface DynamicIconProps extends React.SVGProps<SVGSVGElement> {\n\t/** Leading glyph. */\n\ticon: LayoutIconSource;\n\t/** Resolves an item's icon name to a component, keeping navigation data serialisable. */\n\ticonMap?: Record<string, React.ComponentType<{ className?: string }>>;\n\t/** Size preset. */\n\tsize?: number;\n\tclassName?: string;\n}\n\nexport function DynamicIcon({\n\ticon,\n\ticonMap = {},\n\tsize = 20,\n\tclassName = 'size-icon',\n\t...props\n}: DynamicIconProps) {\n\tif (!icon) return null;\n\n\tif (typeof icon === 'string') {\n\t\tconst IconComponent = iconMap[icon];\n\t\treturn IconComponent ? <IconComponent className={className} /> : null;\n\t}\n\n\tif (\n\t\ttypeof icon === 'function'\n\t\t|| (typeof icon === 'object' && icon !== null && '$$typeof' in icon)\n\t) {\n\t\tconst IconComponent = icon as React.ElementType<React.SVGProps<SVGSVGElement>>;\n\t\treturn <IconComponent className={className} width={size} height={size} {...props} />;\n\t}\n\n\treturn null;\n}\n\nexport function renderSidebarLink(\n\trenderLink: LayoutLinkRenderer,\n\titem: SidebarNavItem,\n\tchildren: React.ReactNode,\n\tclassName?: string,\n\tactive?: boolean,\n) {\n\treturn renderLink({\n\t\thref: item.href,\n\t\tchildren,\n\t\tclassName,\n\t\tactive,\n\t\t'aria-current': active ? 'page' : undefined,\n\t\tdisabled: item.disabled || !item.href,\n\t\texternal: item.external,\n\t});\n}\n","import { useCallback } from 'react';\n\nimport { isPathMatch, toPath } from '../sidebar/sidebar.utils';\n\nexport function useActivePath(currentUrl = '/') {\n\treturn useCallback(\n\t\t(href?: string) => !!href && isPathMatch(currentUrl, toPath(href)),\n\t\t[currentUrl],\n\t);\n}\n","import { useEffect } from 'react';\n\nexport interface UseCommandShortcutOptions {\n\tkey: string;\n\tenabled?: boolean;\n\tonTrigger?: () => void;\n\tpreventDefault?: boolean;\n\t/** Modifier that must be held: `mod` accepts Meta or Control. @default 'mod' */\n\tmodifier?: 'mod' | 'meta' | 'control';\n\t/** Also fires while focus is in a field, an editor or an open menu, listbox or dialog. @default false */\n\tallowInEditable?: boolean;\n}\n\n/** Targets that own their keyboard input: typing surfaces and open composite widgets. */\nconst EDITABLE_TARGET = 'input,textarea,select,[contenteditable]:not([contenteditable=\"false\"]),[role=\"textbox\"],[role=\"dialog\"],[role=\"alertdialog\"],[role=\"menu\"],[role=\"listbox\"]';\n\n/**\n * Binds one Meta/Control shortcut on the document. It stays out of the way of\n * typing: fields, editors and open menus keep the key, and so do key repeats,\n * Shift/Alt chords and events another handler already took.\n */\nexport function useCommandShortcut({\n\tkey,\n\tenabled = true,\n\tonTrigger,\n\tpreventDefault = true,\n\tmodifier = 'mod',\n\tallowInEditable = false,\n}: UseCommandShortcutOptions) {\n\tuseEffect(() => {\n\t\tif (!enabled || !onTrigger || typeof document === 'undefined') return;\n\n\t\tconst handler = (event: KeyboardEvent) => {\n\t\t\tif (event.defaultPrevented || event.repeat || event.altKey || event.shiftKey) return;\n\t\t\tconst held = modifier === 'meta'\n\t\t\t\t? event.metaKey && !event.ctrlKey\n\t\t\t\t: modifier === 'control'\n\t\t\t\t\t? event.ctrlKey && !event.metaKey\n\t\t\t\t\t: event.metaKey || event.ctrlKey;\n\t\t\tif (!held) return;\n\t\t\tif (event.key.toLowerCase() !== key.toLowerCase()) return;\n\t\t\tif (!allowInEditable) {\n\t\t\t\tconst target = event.target instanceof Element ? event.target : document.activeElement;\n\t\t\t\tif (target?.closest(EDITABLE_TARGET)) return;\n\t\t\t}\n\t\t\tif (preventDefault) event.preventDefault();\n\t\t\tonTrigger();\n\t\t};\n\n\t\tdocument.addEventListener('keydown', handler);\n\t\treturn () => document.removeEventListener('keydown', handler);\n\t}, [allowInEditable, enabled, key, modifier, onTrigger, preventDefault]);\n}\n"],"mappings":"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"}
|
|
@@ -76,11 +76,33 @@ function l(e) {
|
|
|
76
76
|
return r(c(s(e)));
|
|
77
77
|
}
|
|
78
78
|
function u(e) {
|
|
79
|
-
|
|
79
|
+
if (e.type === "text") return e.value;
|
|
80
|
+
if (e.type !== "root" && e.type !== "element") return "";
|
|
81
|
+
let t = () => e.children.map(u).join("");
|
|
82
|
+
if (e.type === "root") return t();
|
|
83
|
+
let { tagName: n, properties: r } = e;
|
|
84
|
+
if (n === "br") return "\n";
|
|
85
|
+
if (n === "img") return typeof r.alt == "string" ? r.alt : "";
|
|
86
|
+
if (n === "ul" || n === "ol") {
|
|
87
|
+
let t = Math.trunc(Number(r.start) || 1);
|
|
88
|
+
return e.children.map((e) => {
|
|
89
|
+
if (e.type !== "element" || e.tagName !== "li") return e.type === "text" && !e.value.trim() ? "" : u(e);
|
|
90
|
+
let r = n === "ol" ? `${t++}. ` : "- ";
|
|
91
|
+
return `${r}${e.children.map(u).join("").replace(/^\n+|\n+$/g, "").replace(/\n/g, `\n${" ".repeat(r.length)}`)}\n`;
|
|
92
|
+
}).join("");
|
|
93
|
+
}
|
|
94
|
+
let i = t();
|
|
95
|
+
if (n === "a") {
|
|
96
|
+
let e = typeof r.href == "string" ? r.href : "", t = e.replace(/^mailto:/i, ""), n = i.trim();
|
|
97
|
+
return !t || n === e || n === t ? i : n ? `${i} (${t})` : t;
|
|
98
|
+
}
|
|
99
|
+
return i + (/^(p|div|li|h[1-6]|tr|blockquote|pre)$/.test(n) ? "\n" : "");
|
|
80
100
|
}
|
|
81
|
-
//#endregion
|
|
82
|
-
//#region src/components/features/email-composer/strings.ts
|
|
83
101
|
var d = {
|
|
102
|
+
confirmCloseTitle: "Discard this draft?",
|
|
103
|
+
confirmCloseDescription: "Your unsent changes will be lost.",
|
|
104
|
+
confirmCloseConfirm: "Discard draft",
|
|
105
|
+
confirmCloseCancel: "Keep editing",
|
|
84
106
|
toolbar: e.toolbar,
|
|
85
107
|
title: "New message",
|
|
86
108
|
to: "To",
|
|
@@ -147,20 +169,20 @@ var d = {
|
|
|
147
169
|
unsupportedNode: (e) => `Unsupported document node: ${e}`,
|
|
148
170
|
renderError: "Unable to render the message.",
|
|
149
171
|
errorTitle: "Message could not be completed"
|
|
150
|
-
}, f = {
|
|
172
|
+
}, f = (e) => `Email request failed (${e}).`, p = {
|
|
151
173
|
type: "doc",
|
|
152
174
|
content: [{ type: "paragraph" }]
|
|
153
|
-
},
|
|
175
|
+
}, m = (e) => e.replace(/[&<>"']/g, (e) => ({
|
|
154
176
|
"&": "&",
|
|
155
177
|
"<": "<",
|
|
156
178
|
">": ">",
|
|
157
179
|
"\"": """,
|
|
158
180
|
"'": "'"
|
|
159
181
|
})[e]);
|
|
160
|
-
function
|
|
161
|
-
let n = () => (e.content ?? []).map((e) =>
|
|
182
|
+
function h(e, t = d) {
|
|
183
|
+
let n = () => (e.content ?? []).map((e) => h(e, t)).join("");
|
|
162
184
|
if (e.type === "text" || e.type === "placeholderToken") {
|
|
163
|
-
let n =
|
|
185
|
+
let n = m(String(e.attrs?.key ?? "")), r = e.type === "text" ? m(e.text ?? "") : `<span data-placeholder="${n}">{{${n}}}</span>`;
|
|
164
186
|
for (let n of e.marks ?? []) {
|
|
165
187
|
let e = {
|
|
166
188
|
bold: "strong",
|
|
@@ -170,7 +192,7 @@ function m(e, t = d) {
|
|
|
170
192
|
code: "code"
|
|
171
193
|
};
|
|
172
194
|
if (e[n.type]) r = `<${e[n.type]}>${r}</${e[n.type]}>`;
|
|
173
|
-
else if (n.type === "link") r = `<a href="${
|
|
195
|
+
else if (n.type === "link") r = `<a href="${m(String(n.attrs?.href ?? ""))}">${r}</a>`;
|
|
174
196
|
else throw Error(t.unsupportedNode(n.type));
|
|
175
197
|
}
|
|
176
198
|
return r;
|
|
@@ -194,28 +216,32 @@ function m(e, t = d) {
|
|
|
194
216
|
if (!e.type || !r[e.type]) throw Error(t.unsupportedNode(e.type ?? "unknown"));
|
|
195
217
|
return `<${r[e.type]}>${n()}</${r[e.type]}>`;
|
|
196
218
|
}
|
|
197
|
-
function
|
|
198
|
-
return l(
|
|
219
|
+
function g(e, t = d) {
|
|
220
|
+
return l(_(e, t));
|
|
199
221
|
}
|
|
200
|
-
function
|
|
201
|
-
return e.kind === "html" ? e.html : e.kind === "text" ? `<p>${
|
|
222
|
+
function _(e, t) {
|
|
223
|
+
return e.kind === "html" ? e.html : e.kind === "text" ? `<p>${m(e.text).replace(/\n/g, "<br>")}</p>` : h(e.document, t);
|
|
202
224
|
}
|
|
203
225
|
//#endregion
|
|
204
226
|
//#region src/components/features/email-composer/engine.ts
|
|
205
|
-
var
|
|
206
|
-
function
|
|
227
|
+
var v = /\{\{([a-zA-Z0-9_.-]+)\}\}/g;
|
|
228
|
+
function y(e, t, n, r) {
|
|
207
229
|
let i = Object.create(null);
|
|
208
230
|
for (let a of Object.keys(n)) {
|
|
209
|
-
let o = Object.hasOwn(e.placeholderOverrides, a) ? e.placeholderOverrides[a] : void 0
|
|
210
|
-
|
|
231
|
+
let o = Object.hasOwn(e.placeholderOverrides, a) ? e.placeholderOverrides[a] : void 0, s = [
|
|
232
|
+
n[a].resolve(t),
|
|
233
|
+
r?.defaults?.[a],
|
|
234
|
+
n[a].fallback
|
|
235
|
+
];
|
|
236
|
+
i[a] = o === void 0 ? s.find((e) => e != null && e !== "") ?? s.find((e) => e != null) ?? null : o;
|
|
211
237
|
}
|
|
212
238
|
return i;
|
|
213
239
|
}
|
|
214
|
-
function
|
|
215
|
-
let o =
|
|
240
|
+
function b(e, t, n, i, a = d) {
|
|
241
|
+
let o = y(e, t, n, i), l = /* @__PURE__ */ new Set(), f = (e) => {
|
|
216
242
|
let t = Object.hasOwn(o, e) ? o[e] : null;
|
|
217
243
|
return t == null || t === "" ? (l.add(e), `{{${e}}}`) : String(t);
|
|
218
|
-
}, p = e.subject.replace(
|
|
244
|
+
}, p = e.subject.replace(v, (e, t) => f(t)), m = s(_(e.body, a));
|
|
219
245
|
function h(e) {
|
|
220
246
|
if (e.type === "element") {
|
|
221
247
|
for (let [t, n] of Object.entries(e.properties)) if (t !== "dataPlaceholder" && typeof n == "string" && n.includes("{{")) throw Error(a.attributeVariables);
|
|
@@ -225,28 +251,28 @@ function y(e, t, n, i, a = d) {
|
|
|
225
251
|
value: f(String(e.properties.dataPlaceholder))
|
|
226
252
|
} : e.type === "text" ? {
|
|
227
253
|
...e,
|
|
228
|
-
value: e.value.replace(
|
|
254
|
+
value: e.value.replace(v, (e, t) => f(t))
|
|
229
255
|
} : (h(e), e)));
|
|
230
256
|
}
|
|
231
257
|
h(m);
|
|
232
258
|
for (let e of Object.keys(n)) n[e]?.required && (o[e] == null || o[e] === "") && l.add(e);
|
|
233
259
|
for (let e of i?.requiredPlaceholders ?? []) (o[e] == null || o[e] === "") && l.add(e);
|
|
234
|
-
let
|
|
260
|
+
let g = c(m);
|
|
235
261
|
return {
|
|
236
262
|
email: {
|
|
237
263
|
to: structuredClone(e.to),
|
|
238
264
|
cc: structuredClone(e.cc),
|
|
239
265
|
bcc: structuredClone(e.bcc),
|
|
240
266
|
subject: p,
|
|
241
|
-
html: r(
|
|
242
|
-
text: u(
|
|
267
|
+
html: r(g),
|
|
268
|
+
text: u(g).trim(),
|
|
243
269
|
templateId: e.templateId,
|
|
244
270
|
resolvedPlaceholders: o
|
|
245
271
|
},
|
|
246
272
|
unresolved: [...l]
|
|
247
273
|
};
|
|
248
274
|
}
|
|
249
|
-
function
|
|
275
|
+
function x(e, t, n, r, i = d) {
|
|
250
276
|
let a = [], o, s = "";
|
|
251
277
|
e.to.length || a.push({
|
|
252
278
|
field: "to",
|
|
@@ -265,13 +291,13 @@ function b(e, t, n, r, i = d) {
|
|
|
265
291
|
message: i.invalidSubject
|
|
266
292
|
});
|
|
267
293
|
try {
|
|
268
|
-
let s =
|
|
294
|
+
let s = b(e, t, n, r, i);
|
|
269
295
|
o = s, s.email.text.trim() || a.push({
|
|
270
296
|
field: "body",
|
|
271
297
|
message: i.emptyBody
|
|
272
298
|
}), s.unresolved.length && a.push({
|
|
273
299
|
field: "placeholders",
|
|
274
|
-
message: i.missingVariables(s.unresolved)
|
|
300
|
+
message: i.missingVariables(s.unresolved.map((e) => (Object.hasOwn(n, e) ? n[e]?.label : void 0) ?? e))
|
|
275
301
|
}), (!s.email.subject.trim() || /[\r\n]/.test(s.email.subject)) && !a.some((e) => e.field === "subject") && a.push({
|
|
276
302
|
field: "subject",
|
|
277
303
|
message: i.invalidResolvedSubject
|
|
@@ -288,13 +314,13 @@ function b(e, t, n, r, i = d) {
|
|
|
288
314
|
issues: a
|
|
289
315
|
};
|
|
290
316
|
}
|
|
291
|
-
function
|
|
292
|
-
return
|
|
317
|
+
function S(e, t, n, r, i = d) {
|
|
318
|
+
return x(e, t, n, r, i).issues;
|
|
293
319
|
}
|
|
294
|
-
function
|
|
320
|
+
function C(e) {
|
|
295
321
|
return e.name ? `${e.name} <${e.email}>` : e.email;
|
|
296
322
|
}
|
|
297
|
-
function
|
|
323
|
+
function w(e) {
|
|
298
324
|
let t = e.trim().match(/^(.*?)\s*<([^<>]+)>$/);
|
|
299
325
|
return t ? {
|
|
300
326
|
name: t[1].trim(),
|
|
@@ -303,7 +329,7 @@ function C(e) {
|
|
|
303
329
|
}
|
|
304
330
|
//#endregion
|
|
305
331
|
//#region src/components/features/email-composer/http.ts
|
|
306
|
-
function
|
|
332
|
+
function T(e, t = {}) {
|
|
307
333
|
return async (n) => {
|
|
308
334
|
let r = await fetch(e, {
|
|
309
335
|
method: "POST",
|
|
@@ -316,7 +342,7 @@ function w(e, t = {}) {
|
|
|
316
342
|
signal: AbortSignal.timeout(t.timeoutMs ?? 3e4)
|
|
317
343
|
});
|
|
318
344
|
if (!r.ok) {
|
|
319
|
-
let e =
|
|
345
|
+
let e = (t.formatError ?? f)(r.status);
|
|
320
346
|
try {
|
|
321
347
|
let t = await r.json();
|
|
322
348
|
t && typeof t == "object" && "message" in t && typeof t.message == "string" && (e = t.message);
|
|
@@ -326,6 +352,6 @@ function w(e, t = {}) {
|
|
|
326
352
|
};
|
|
327
353
|
}
|
|
328
354
|
//#endregion
|
|
329
|
-
export {
|
|
355
|
+
export { b as a, g as c, C as i, p as l, x as n, y as o, w as r, S as s, T as t, d as u };
|
|
330
356
|
|
|
331
|
-
//# sourceMappingURL=http-
|
|
357
|
+
//# sourceMappingURL=http-Cu-GPpss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-Cu-GPpss.js","names":["defaultRichTextEditorStrings","schema","styleProperties","cleanProperties","node","key","value","style","split","declaration","name","parseEmailHtml","fromHtml","html","sanitizeEmailTree","cleaned","sanitize","tree","sanitizeEmailHtml","toHtml","emailHtmlText","children","tagName","properties","number","child","marker","text","href","destination","label","defaultEmailComposerStrings","field","index","email","names","id","defaultEmailRequestFailed","status","emptyDocument","escapeEmailHtml","char","documentHtml","content","strings","mark","tags","level","bodyHtml","bodyMarkup","body","tokens","resolveValues","values","definitions","override","draft","sources","context","template","renderEmail","unresolved","get","subject","visit","clean","inspectDraft","issues","rendered","renderError","r","result","issue","error","validate","recipientLabel","recipient","parseRecipient","match","createHttpSender","response","endpoint","options","message"],"sources":["../src/components/features/email-composer/email-html.ts","../src/components/features/email-composer/strings.ts","../src/components/features/email-composer/document.ts","../src/components/features/email-composer/engine.ts","../src/components/features/email-composer/http.ts"],"sourcesContent":["import { fromHtml } from 'hast-util-from-html';\nimport { sanitize, type Schema } from 'hast-util-sanitize';\nimport { toHtml } from 'hast-util-to-html';\nimport type { Root, RootContent } from 'hast';\nconst tags = ['a', 'b', 'blockquote', 'br', 'code', 'del', 'div', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'li', 'mark', 'ol', 'p', 'pre', 's', 'span', 'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'th', 'thead', 'tfoot', 'tr', 'u', 'ul'];\nconst schema: Schema = {\n\ttagNames: tags, attributes: { '*': ['style', 'align', 'width', 'height'], a: ['href', 'title'], img: ['src', 'alt', 'title'], span: ['dataPlaceholder'], ol: ['start'], td: ['colSpan', 'rowSpan'], th: ['colSpan', 'rowSpan'], table: ['cellPadding', 'cellSpacing', 'border'] },\n\tprotocols: { href: ['https', 'http', 'mailto'], src: ['https'] },\n\tstrip: ['script', 'style', 'iframe', 'object', 'embed', 'svg', 'math', 'template', 'form', 'input', 'button'],\n};\n// Email content has its own small allowlist; admin UI theme styles never enter it.\nconst styleProperties = new Set(['color', 'background', 'background-color', 'border', 'border-top', 'border-right', 'border-bottom', 'border-left', 'border-color', 'border-width', 'border-style', 'border-collapse', 'border-spacing', 'border-radius', 'padding', 'padding-top', 'padding-right', 'padding-bottom', 'padding-left', 'margin', 'margin-top', 'margin-right', 'margin-bottom', 'margin-left', 'width', 'max-width', 'min-width', 'height', 'font-family', 'font-size', 'font-weight', 'font-style', 'line-height', 'text-align', 'text-decoration', 'vertical-align', 'white-space']);\nfunction cleanProperties(node: Root | RootContent): void {\n\tif (node.type === 'element') {\n\t\tfor (const key of ['href', 'src']) {\n\t\t\tconst value = node.properties[key];\n\t\t\tif (typeof value === 'string' && (value.trimStart().startsWith('//') || (key === 'src' && !/^https:\\/\\//i.test(value))))\n\t\t\t\tdelete node.properties[key];\n\t\t}\n\t\tconst style = node.properties.style;\n\t\tif (typeof style === 'string') {\n\t\t\tnode.properties.style = style.split(';').flatMap(declaration => {\n\t\t\t\tconst split = declaration.indexOf(':');\n\t\t\t\tconst name = declaration.slice(0, split).trim().toLowerCase();\n\t\t\t\tconst value = declaration.slice(split + 1).trim();\n\t\t\t\treturn split > 0 && styleProperties.has(name) && value && /^[\\w\\s#%.,()'\"+/-]+$/.test(value) && !/url\\s*\\(|expression|@|javascript|var\\s*\\(/i.test(value) ? [`${name}:${value}`] : [];\n\t\t\t}).join(';');\n\t\t\tif (!node.properties.style)\n\t\t\t\tdelete node.properties.style;\n\t\t}\n\t}\n\tif (node.type === 'root' || node.type === 'element')\n\t\tnode.children.forEach(cleanProperties);\n}\nexport function parseEmailHtml(html: string): Root { return fromHtml(html, { fragment: true }); }\nexport function sanitizeEmailTree(tree: Root): Root {\n\tconst cleaned = sanitize(tree, schema);\n\tif (cleaned.type !== 'root')\n\t\tthrow new Error('Expected an HTML document fragment.');\n\tcleanProperties(cleaned);\n\treturn cleaned;\n}\nexport function sanitizeEmailHtml(html: string): string { return toHtml(sanitizeEmailTree(parseEmailHtml(html))); }\n/**\n * Plain-text part of a prepared email. A link keeps its destination after the\n * label, list items keep their bullet or number, and an image contributes its\n * description, so a text-only reader can still follow the message.\n */\nexport function emailHtmlText(tree: Root | RootContent): string {\n\tif (tree.type === 'text')\n\t\treturn tree.value;\n\tif (tree.type !== 'root' && tree.type !== 'element')\n\t\treturn '';\n\tconst children = () => tree.children.map(emailHtmlText).join('');\n\tif (tree.type === 'root')\n\t\treturn children();\n\tconst { tagName, properties } = tree;\n\tif (tagName === 'br')\n\t\treturn '\\n';\n\tif (tagName === 'img')\n\t\treturn typeof properties.alt === 'string' ? properties.alt : '';\n\tif (tagName === 'ul' || tagName === 'ol') {\n\t\tlet number = Math.trunc(Number(properties.start) || 1);\n\t\treturn tree.children.map(child => {\n\t\t\tif (child.type !== 'element' || child.tagName !== 'li')\n\t\t\t\treturn child.type === 'text' && !child.value.trim() ? '' : emailHtmlText(child);\n\t\t\tconst marker = tagName === 'ol' ? `${number++}. ` : '- ';\n\t\t\tconst item = child.children.map(emailHtmlText).join('').replace(/^\\n+|\\n+$/g, '');\n\t\t\treturn `${marker}${item.replace(/\\n/g, `\\n${' '.repeat(marker.length)}`)}\\n`;\n\t\t}).join('');\n\t}\n\tconst text = children();\n\tif (tagName === 'a') {\n\t\tconst href = typeof properties.href === 'string' ? properties.href : '';\n\t\tconst destination = href.replace(/^mailto:/i, '');\n\t\tconst label = text.trim();\n\t\tif (!destination || label === href || label === destination)\n\t\t\treturn text;\n\t\treturn label ? `${text} (${destination})` : destination;\n\t}\n\treturn text + (/^(p|div|li|h[1-6]|tr|blockquote|pre)$/.test(tagName) ? '\\n' : '');\n}\n","import { defaultRichTextEditorStrings } from '../rich-text-editor/rich-text-editor.strings';\n/** Copy for the `confirmClose` confirmation. Optional in `EmailComposerStrings`, so existing complete dictionaries stay valid. */\nconst confirmCloseStrings = {\n\tconfirmCloseTitle: 'Discard this draft?', confirmCloseDescription: 'Your unsent changes will be lost.',\n\tconfirmCloseConfirm: 'Discard draft', confirmCloseCancel: 'Keep editing',\n};\nexport const defaultEmailComposerStrings = {\n\t...confirmCloseStrings,\n\ttoolbar: defaultRichTextEditorStrings.toolbar,\n\ttitle: 'New message', to: 'To', cc: 'Cc', bcc: 'Bcc', subject: 'Subject', body: 'Message body',\n\trecipientPlaceholder: 'Name <email@example.com>', addRecipient: (field: string) => `Add ${field} recipient`,\n\trecipientLabel: (field: string, index: number) => `${field} recipient ${index + 1}`,\n\tremoveRecipient: (email: string) => `Remove ${email}`, newRecipient: (field: string) => `New ${field} recipient`,\n\ttemplates: 'Templates', searchTemplates: 'Search templates…', noTemplates: 'No templates found.', importTemplate: 'Import template',\n\ttemplatesUnavailable: 'Templates are unavailable. Wait for loading to finish or retry.', loadingTemplates: 'Loading templates…', loadingVariables: 'Loading variables…', loadingRecipients: (field: string) => `Loading ${field} recipients…`, retry: 'Retry', dataUnavailable: 'Wait for required recipient and variable data to finish loading, or retry the failed request.',\n\tvariables: 'Variables', variablesDescription: 'Insert a variable into the message, or override its live value for this draft.', insertVariable: (label: string) => `Insert ${label}`, reset: 'Reset', dynamic: 'Dynamic value', overridden: 'Manual override',\n\tchoose: 'Choose…', editor: 'Editor', preview: 'Preview', previewLabel: 'Email body preview',\n\tsend: 'Send email', discard: 'Discard', working: 'Working…', sent: 'Email sent successfully.', discarded: 'Draft discarded.', close: 'Close composer', more: 'More actions',\n\tlink: 'Add or edit link', linkTitle: 'Message link', linkUrl: 'Link URL', closeLink: 'Close link editor', closeConversion: 'Close conversion confirmation', apply: 'Apply', cancel: 'Cancel',\n\tinvalidLink: 'Use an https://, http://, or mailto: URL.', convert: 'Convert to editable rich text',\n\tconvertTitle: 'Convert HTML layout?', convertDescription: 'Unsupported layout elements and styling may be lost when converting to rich text.',\n\tmissingRecipient: 'Add at least one recipient.', invalidRecipients: (field: string) => `Check ${field} addresses.`,\n\tinvalidSubject: 'Enter a single-line subject.', invalidResolvedSubject: 'Resolved subject must be a nonempty single line.', emptyBody: 'Enter a message.',\n\t/** Receives each missing variable's label, or its key when the token has no definition. */\n\tmissingVariables: (names: readonly string[]) => `Set values for: ${names.join(', ')}.`,\n\tattributeVariables: 'Placeholders in HTML attributes are unsupported. Put placeholders in visible text.',\n\tunknownVariable: (key: string) => `Unknown placeholder: ${key}`, duplicateVariable: (key: string) => `Duplicate placeholder: ${key}`,\n\tunknownTemplate: (id: string) => `Unknown template: ${id}`, duplicateTemplate: 'Template IDs must be unique.',\n\teditableRequired: 'Use editable rich text for this operation.', editorNotReady: 'Editor is not ready.',\n\tunsupportedNode: (node: string) => `Unsupported document node: ${node}`, renderError: 'Unable to render the message.',\n\terrorTitle: 'Message could not be completed',\n};\nexport type EmailComposerStrings = Omit<typeof defaultEmailComposerStrings, keyof typeof confirmCloseStrings> & Partial<typeof confirmCloseStrings>;\n/** Default `createHttpSender` failure message, used when a failed response carries no message of its own. */\nexport const defaultEmailRequestFailed = (status: number): string => `Email request failed (${status}).`;\n","import type { JSONContent } from '@tiptap/react';\nimport type { EmailBody } from './types';\nimport { sanitizeEmailHtml } from './email-html';\nimport { defaultEmailComposerStrings, type EmailComposerStrings } from './strings';\nexport const emptyDocument: JSONContent = { type: 'doc', content: [{ type: 'paragraph' }] };\nexport const escapeEmailHtml = (value: string): string => value.replace(/[&<>\"']/g, char => ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' })[char]!);\nexport function documentHtml(node: JSONContent, strings: EmailComposerStrings = defaultEmailComposerStrings): string {\n\tconst content = () => (node.content ?? []).map(child => documentHtml(child, strings)).join('');\n\tif (node.type === 'text' || node.type === 'placeholderToken') {\n\t\tconst key = escapeEmailHtml(String(node.attrs?.key ?? ''));\n\t\tlet text = node.type === 'text' ? escapeEmailHtml(node.text ?? '') : `<span data-placeholder=\"${key}\">{{${key}}}</span>`;\n\t\tfor (const mark of node.marks ?? []) {\n\t\t\tconst tags: Record<string, string> = { bold: 'strong', italic: 'em', strike: 's', underline: 'u', code: 'code' };\n\t\t\tif (tags[mark.type])\n\t\t\t\ttext = `<${tags[mark.type]}>${text}</${tags[mark.type]}>`;\n\t\t\telse if (mark.type === 'link')\n\t\t\t\ttext = `<a href=\"${escapeEmailHtml(String(mark.attrs?.href ?? ''))}\">${text}</a>`;\n\t\t\telse\n\t\t\t\tthrow new Error(strings.unsupportedNode(mark.type));\n\t\t}\n\t\treturn text;\n\t}\n\tif (node.type === 'doc')\n\t\treturn content();\n\tif (node.type === 'hardBreak')\n\t\treturn '<br>';\n\tif (node.type === 'horizontalRule')\n\t\treturn '<hr>';\n\tif (node.type === 'heading') {\n\t\tconst level = Math.min(6, Math.max(1, Number(node.attrs?.level) || 2));\n\t\treturn `<h${level}>${content()}</h${level}>`;\n\t}\n\tif (node.type === 'codeBlock')\n\t\treturn `<pre><code>${content()}</code></pre>`;\n\tif (node.type === 'orderedList')\n\t\treturn `<ol start=\"${Math.max(1, Math.trunc(Number(node.attrs?.start) || 1))}\">${content()}</ol>`;\n\tconst tags: Record<string, string> = { paragraph: 'p', blockquote: 'blockquote', bulletList: 'ul', orderedList: 'ol', listItem: 'li' };\n\tif (!node.type || !tags[node.type])\n\t\tthrow new Error(strings.unsupportedNode(node.type ?? 'unknown'));\n\treturn `<${tags[node.type]}>${content()}</${tags[node.type]}>`;\n}\nexport function bodyHtml(body: EmailBody, strings: EmailComposerStrings = defaultEmailComposerStrings): string {\n\treturn sanitizeEmailHtml(bodyMarkup(body, strings));\n}\nexport function bodyMarkup(body: EmailBody, strings: EmailComposerStrings): string {\n\treturn body.kind === 'html' ? body.html : body.kind === 'text' ? `<p>${escapeEmailHtml(body.text).replace(/\\n/g, '<br>')}</p>` : documentHtml(body.document, strings);\n}\n","import { toHtml } from 'hast-util-to-html';\nimport type { Root, RootContent } from 'hast';\nimport { bodyMarkup } from './document';\nimport { parseEmailHtml, sanitizeEmailTree, emailHtmlText } from './email-html';\nimport { defaultEmailComposerStrings, type EmailComposerStrings } from './strings';\nimport type { ComposerDraft, ComposerIssue, EmailTemplate, PlaceholderDefinition, PlaceholderValue, PreparedEmail, Recipient } from './types';\nconst tokens = /\\{\\{([a-zA-Z0-9_.-]+)\\}\\}/g;\nexport function resolveValues<C, K extends string>(draft: ComposerDraft<K>, context: C, definitions: Partial<Record<K, PlaceholderDefinition<C>>>, template?: EmailTemplate<K>): Partial<Record<K, PlaceholderValue>> {\n\tconst values: Partial<Record<K, PlaceholderValue>> = Object.create(null);\n\tfor (const key of Object.keys(definitions) as K[]) {\n\t\tconst override = Object.hasOwn(draft.placeholderOverrides, key) ? draft.placeholderOverrides[key] : undefined;\n\t\t// An explicit override is final. Otherwise the first source that has a value wins;\n\t\t// null and an empty string mean \"no value here\", so the next source is tried.\n\t\tconst sources = [definitions[key]!.resolve(context), template?.defaults?.[key], definitions[key]!.fallback];\n\t\tvalues[key] = override !== undefined ? override : sources.find(value => value != null && value !== '') ?? sources.find(value => value != null) ?? null;\n\t}\n\treturn values;\n}\nexport function renderEmail<C, K extends string>(draft: ComposerDraft<K>, context: C, definitions: Partial<Record<K, PlaceholderDefinition<C>>>, template?: EmailTemplate<K>, strings: EmailComposerStrings = defaultEmailComposerStrings): {\n\temail: PreparedEmail<K>;\n\tunresolved: string[];\n} {\n\tconst values = resolveValues(draft, context, definitions, template);\n\tconst unresolved = new Set<string>();\n\tconst get = (key: string) => {\n\t\tconst value = Object.hasOwn(values, key) ? values[key as K] : null;\n\t\tif (value == null || value === '') {\n\t\t\tunresolved.add(key);\n\t\t\treturn `{{${key}}}`;\n\t\t}\n\t\treturn String(value);\n\t};\n\tconst subject = draft.subject.replace(tokens, (_, key: string) => get(key));\n\tconst tree = parseEmailHtml(bodyMarkup(draft.body, strings));\n\tfunction visit(node: Root | RootContent): void {\n\t\tif (node.type === 'element') {\n\t\t\tfor (const [key, value] of Object.entries(node.properties))\n\t\t\t\tif (key !== 'dataPlaceholder' && typeof value === 'string' && value.includes('{{'))\n\t\t\t\t\tthrow new Error(strings.attributeVariables);\n\t\t}\n\t\tif (node.type === 'root' || node.type === 'element')\n\t\t\tnode.children = node.children.map(child => {\n\t\t\t\tif (child.type === 'element' && child.properties.dataPlaceholder !== undefined)\n\t\t\t\t\treturn { type: 'text', value: get(String(child.properties.dataPlaceholder)) };\n\t\t\t\tif (child.type === 'text')\n\t\t\t\t\treturn { ...child, value: child.value.replace(tokens, (_, key: string) => get(key)) };\n\t\t\t\tvisit(child);\n\t\t\t\treturn child;\n\t\t\t});\n\t}\n\tvisit(tree);\n\tfor (const key of Object.keys(definitions) as K[])\n\t\tif (definitions[key]?.required && (values[key] == null || values[key] === ''))\n\t\t\tunresolved.add(key);\n\tfor (const key of template?.requiredPlaceholders ?? [])\n\t\tif (values[key] == null || values[key] === '')\n\t\t\tunresolved.add(key);\n\tconst clean = sanitizeEmailTree(tree);\n\treturn { email: { to: structuredClone(draft.to), cc: structuredClone(draft.cc), bcc: structuredClone(draft.bcc), subject, html: toHtml(clean), text: emailHtmlText(clean).trim(), templateId: draft.templateId, resolvedPlaceholders: values }, unresolved: [...unresolved] };\n}\nexport function inspectDraft<C, K extends string>(draft: ComposerDraft<K>, context: C, definitions: Partial<Record<K, PlaceholderDefinition<C>>>, template?: EmailTemplate<K>, strings: EmailComposerStrings = defaultEmailComposerStrings) {\n\tconst issues: ComposerIssue[] = [];\n\tlet rendered: ReturnType<typeof renderEmail<C, K>> | undefined;\n\tlet renderError = '';\n\tif (!draft.to.length)\n\t\tissues.push({ field: 'to', message: strings.missingRecipient });\n\tfor (const field of ['to', 'cc', 'bcc'] as const)\n\t\tif (draft[field].some(r => !/^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$/.test(r.email) || /[\\r\\n]/.test(r.name ?? '')))\n\t\t\tissues.push({ field, message: strings.invalidRecipients(strings[field]) });\n\tif (!draft.subject.trim() || /[\\r\\n]/.test(draft.subject))\n\t\tissues.push({ field: 'subject', message: strings.invalidSubject });\n\ttry {\n\t\tconst result = renderEmail(draft, context, definitions, template, strings);\n\t\trendered = result;\n\t\tif (!result.email.text.trim())\n\t\t\tissues.push({ field: 'body', message: strings.emptyBody });\n\t\tif (result.unresolved.length)\n\t\t\t// People read labels; a token with no definition has only its key.\n\t\t\tissues.push({ field: 'placeholders', message: strings.missingVariables(result.unresolved.map(key => (Object.hasOwn(definitions, key) ? definitions[key as K]?.label : undefined) ?? key)) });\n\t\tif ((!result.email.subject.trim() || /[\\r\\n]/.test(result.email.subject)) && !issues.some(issue => issue.field === 'subject'))\n\t\t\tissues.push({ field: 'subject', message: strings.invalidResolvedSubject });\n\t}\n\tcatch (error) {\n\t\trenderError = error instanceof Error ? error.message : strings.renderError;\n\t\tissues.push({ field: 'body', message: renderError });\n\t}\n\treturn { rendered, renderError, issues };\n}\nexport function validate<C, K extends string>(draft: ComposerDraft<K>, context: C, definitions: Partial<Record<K, PlaceholderDefinition<C>>>, template?: EmailTemplate<K>, strings: EmailComposerStrings = defaultEmailComposerStrings): ComposerIssue[] {\n\treturn inspectDraft(draft, context, definitions, template, strings).issues;\n}\nexport function recipientLabel(recipient: Recipient): string { return recipient.name ? `${recipient.name} <${recipient.email}>` : recipient.email; }\nexport function parseRecipient(value: string): Recipient {\n\tconst match = value.trim().match(/^(.*?)\\s*<([^<>]+)>$/);\n\treturn match ? { name: match[1].trim(), email: match[2].trim() } : { email: value.trim() };\n}\n","import { defaultEmailRequestFailed } from './strings';\nimport type { PreparedEmail } from './types';\n/** Optional sender adapter. The consuming application owns the endpoint and delivery. */\nexport function createHttpSender(endpoint: string, options: {\n\theaders?: Record<string, string>;\n\ttimeoutMs?: number;\n\t/** Message for a failed response that carries no `message` of its own. Receives the HTTP status; the composer shows the result in its error alert. */\n\tformatError?: (status: number) => string;\n} = {}) {\n\treturn async <K extends string>(email: PreparedEmail<K>): Promise<void> => {\n\t\tconst response = await fetch(endpoint, { method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/json', ...options.headers }, body: JSON.stringify(email), signal: AbortSignal.timeout(options.timeoutMs ?? 30000) });\n\t\tif (!response.ok) {\n\t\t\tlet message = (options.formatError ?? defaultEmailRequestFailed)(response.status);\n\t\t\ttry {\n\t\t\t\tconst result: unknown = await response.json();\n\t\t\t\tif (result && typeof result === 'object' && 'message' in result && typeof result.message === 'string')\n\t\t\t\t\tmessage = result.message;\n\t\t\t}\n\t\t\tcatch { /* Response bodies are optional. */ }\n\t\t\tthrow new Error(message);\n\t\t}\n\t};\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import { t as n } from "./utils-
|
|
2
|
+
import { C as e, f as t } from "./ui-provider-Bu1S-o96.js";
|
|
3
|
+
import { t as n } from "./utils-BVbAG2J6.js";
|
|
4
4
|
import { n as r } from "./icon-size-B6PVwjbC.js";
|
|
5
5
|
import { i } from "./tone-recipes-BPsRAvhu.js";
|
|
6
6
|
import { createElement as a } from "react";
|
|
@@ -52,4 +52,4 @@ u.displayName = "IconBadge";
|
|
|
52
52
|
//#endregion
|
|
53
53
|
export { u as t };
|
|
54
54
|
|
|
55
|
-
//# sourceMappingURL=icon-badge-
|
|
55
|
+
//# sourceMappingURL=icon-badge-B0Kq7wom.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon-badge-
|
|
1
|
+
{"version":3,"file":"icon-badge-B0Kq7wom.js","names":["resolveComponentScale","useDensityConfig","cn","ICON_DESCENDANT_SIZE_CLASSNAMES","SIZE_MAP","TONE_TINT","toneRecipes","TONE_SOLID","IconBadge","Icon","sizeProp","ariaHidden","ariaLabel","ariaLabelledBy","props","size","defaultScale","sizes","tones","solid","tone","hasAccessibleName","role","shape","bordered","className","createElement","children"],"sources":["../src/components/base/display/icon-badge/icon-badge.tsx"],"sourcesContent":["/**\n * IconBadge — circular or square icon container with a tinted background.\n * Workhorse for \"row leading icon\" and \"feature illustration\" patterns —\n * coupon checks, conversation initials, search-result tones, AI-bot avatars.\n *\n * Tones reuse the shadcn semantic tokens, with the foreground colour picked\n * to read against its tone's shared tint (`toneRecipes`, contrast-tested).\n * For a fully-saturated mark (primary fill, inverse foreground), use\n * `tone=\"primary\"` and pass `solid`.\n *\n * Warning takes `--warning-accent` rather than `--warning-foreground`: the\n * latter is the colour for text on a SOLID warning fill and stays near-black\n * in both themes, so on a 20% tint it vanished in dark (1.87 contrast). Amber\n * is intrinsically light, so — as with `--primary-accent` — the tone needs a\n * separate foreground token that darkens in light and brightens in dark.\n */\nimport type { ComponentProps, ElementType, ReactNode } from 'react';\nimport { createElement } from 'react';\n\nimport { useDensityConfig, type ComponentScale } from '../../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../../lib/ui-provider/scale';\nimport { cn } from '../../../../lib/utils';\nimport type { SemanticTone } from '../../../../lib/component-vocabulary';\nimport { toneRecipes } from '../../../../lib/tone-recipes';\nimport { ICON_DESCENDANT_SIZE_CLASSNAMES } from '../icon-size';\n\nexport type IconBadgeSize = ComponentScale;\nexport type IconBadgeShape = 'circle' | 'square';\nexport type IconBadgeTone = SemanticTone;\n\nexport interface IconBadgeProps extends Omit<ComponentProps<'span'>, 'children'> {\n\t/** Leading glyph. */\n\ticon?: ElementType;\n\tchildren?: ReactNode;\n\t/** Size preset. */\n\tsize?: IconBadgeSize;\n\tshape?: IconBadgeShape;\n\t/** Semantic tone driving the entry's colour. */\n\ttone?: IconBadgeTone;\n\t/** When true, fills the badge with the tone color and inverts the icon. */\n\tsolid?: boolean;\n\t/**\n\t * When true, renders a hairline `border-border/60` around the badge.\n\t * Useful for compact \"secret list\" / \"key list\" rows where the icon\n\t * needs a subtle outline against the surrounding card surface\n\t * (see `blocks/admin/api-key-list`).\n\t */\n\tbordered?: boolean;\n}\n\nconst SIZE_MAP: Record<IconBadgeSize, { box: string; icon: string }> = {\n\tsm: { box: 'size-avatar-sm', icon: 'size-icon-sm' },\n\tmd: { box: 'size-avatar', icon: 'size-icon' },\n\tlg: { box: 'size-avatar-lg', icon: 'size-icon-lg' },\n};\n\nconst TONE_TINT: Record<IconBadgeTone, string> = {\n\tneutral: 'bg-muted text-muted-foreground',\n\tprimary: `${toneRecipes.primary.tint} ${toneRecipes.primary.ink}`,\n\tsecondary: 'bg-foreground/8 text-muted-foreground',\n\tsuccess: `${toneRecipes.success.tint} ${toneRecipes.success.ink}`,\n\twarning: `${toneRecipes.warning.tint} ${toneRecipes.warning.ink}`,\n\tdestructive: `${toneRecipes.destructive.tint} ${toneRecipes.destructive.ink}`,\n\tinfo: `${toneRecipes.info.tint} ${toneRecipes.info.ink}`,\n};\n\nconst TONE_SOLID: Record<IconBadgeTone, string> = {\n\tneutral: 'bg-foreground text-background',\n\tprimary: 'bg-primary text-primary-foreground',\n\tsecondary: 'bg-secondary text-secondary-foreground',\n\tsuccess: 'bg-success text-success-foreground',\n\twarning: 'bg-warning text-warning-foreground',\n\tdestructive: 'bg-destructive text-destructive-foreground',\n\tinfo: 'bg-info text-info-foreground',\n};\n\nexport function IconBadge({\n\ticon: Icon,\n\tchildren,\n\tsize: sizeProp,\n\tshape = 'circle',\n\ttone = 'primary',\n\tsolid = false,\n\tbordered = false,\n\tclassName,\n\trole,\n\t'aria-hidden': ariaHidden,\n\t'aria-label': ariaLabel,\n\t'aria-labelledby': ariaLabelledBy,\n\t...props\n}: IconBadgeProps) {\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveComponentScale(sizeProp, defaultScale);\n\tconst sizes = SIZE_MAP[size];\n\tconst tones = solid ? TONE_SOLID[tone] : TONE_TINT[tone];\n\tconst hasAccessibleName = Boolean(ariaLabel || ariaLabelledBy);\n\n\treturn (\n\t\t<span\n\t\t\trole={role ?? (hasAccessibleName ? 'img' : undefined)}\n\t\t\taria-hidden={ariaHidden ?? (hasAccessibleName ? undefined : true)}\n\t\t\taria-label={ariaLabel}\n\t\t\taria-labelledby={ariaLabelledBy}\n\t\t\tclassName={cn('icon-badge--component', \n\t\t\t\t'box-border inline-flex shrink-0 items-center justify-center',\n\t\t\t\tshape === 'circle' ? 'rounded-full' : 'rounded-radius',\n\t\t\t\tsizes.box,\n\t\t\t\t// A glyph passed as children takes the size's icon role, like `icon`,\n\t\t\t\t// unless it brings its own size class.\n\t\t\t\tICON_DESCENDANT_SIZE_CLASSNAMES[size],\n\t\t\t\ttones,\n\t\t\t\tbordered && 'border border-border/60',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{Icon ? createElement(Icon, { className: sizes.icon }) : children}\n\t\t</span>\n\t);\n}\n\nIconBadge.displayName = 'IconBadge';\n"],"mappings":";;;;;;;;AAkDA,IAAMI,IAAiE;CACtE,IAAI;EAAE,KAAK;EAAkB,MAAM;CAAe;CAClD,IAAI;EAAE,KAAK;EAAe,MAAM;CAAY;CAC5C,IAAI;EAAE,KAAK;EAAkB,MAAM;CAAe;AACnD,GAEMC,IAA2C;CAChD,SAAS;CACT,SAAS,GAAGC,EAAY,QAAQ,KAAK,GAAGA,EAAY,QAAQ;CAC5D,WAAW;CACX,SAAS,GAAGA,EAAY,QAAQ,KAAK,GAAGA,EAAY,QAAQ;CAC5D,SAAS,GAAGA,EAAY,QAAQ,KAAK,GAAGA,EAAY,QAAQ;CAC5D,aAAa,GAAGA,EAAY,YAAY,KAAK,GAAGA,EAAY,YAAY;CACxE,MAAM,GAAGA,EAAY,KAAK,KAAK,GAAGA,EAAY,KAAK;AACpD,GAEMC,IAA4C;CACjD,SAAS;CACT,SAAS;CACT,WAAW;CACX,SAAS;CACT,SAAS;CACT,aAAa;CACb,MAAM;AACP;AAEA,SAAgBC,EAAU,EACzB,MAAMC,GACN,aACA,MAAMC,GACN,WAAQ,UACR,UAAO,WACP,WAAQ,IACR,cAAW,IACX,cACA,SACA,eAAeC,GACf,cAAcC,GACd,mBAAmBC,GACnB,GAAGC,KACe;CAClB,IAAM,EAAE,oBAAiBb,EAAiB,GACpCc,IAAOf,EAAsBU,GAAUM,CAAY,GACnDC,IAAQb,EAASW,IACjBG,IAAQC,IAAQZ,EAAWa,KAAQf,EAAUe,IAC7CC,IAAoB,GAAQT,KAAaC;CAE/C,OACC,kBAAC,QAAD;EACC,MAAMS,MAASD,IAAoB,QAAQ,KAAA;EAC3C,eAAaV,MAAe,MAAoB,KAAA;EAChD,cAAYC;EACZ,mBAAiBC;EACjB,WAAWX,EAAG,yBACb,+DACAqB,MAAU,WAAW,iBAAiB,kBACtCN,EAAM,KAGNd,EAAgCY,IAChCG,GACAM,KAAY,2BACZC,CACD;EACA,GAAIX;EAEH,UAAAL,IAAOiB,EAAcjB,GAAM,EAAE,WAAWQ,EAAM,KAAK,CAAC,IAAIU;CACpD,CAAA;AAER;AAEA,EAAU,cAAc"}
|