themelia-react-ui 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +137 -0
- package/README.md +59 -13
- package/dist/{accordion-B-5Focs8.js → accordion-BRTcsp8J.js} +8 -8
- package/dist/accordion-BRTcsp8J.js.map +1 -0
- package/dist/{action-menu-Cx3SdfbN.js → action-menu-Drxw_vJk.js} +36 -36
- package/dist/action-menu-Drxw_vJk.js.map +1 -0
- package/dist/affordance-geometry.generated-CL84ZN9A.js +63 -0
- package/dist/affordance-geometry.generated-CL84ZN9A.js.map +1 -0
- package/dist/{ai-artifact-B5tPpXnS.js → ai-artifact-DLVdK0Py.js} +151 -155
- package/dist/ai-artifact-DLVdK0Py.js.map +1 -0
- package/dist/{app-shell-at8Kt4l_.js → app-shell-C_fKpljx.js} +11 -10
- package/dist/app-shell-C_fKpljx.js.map +1 -0
- package/dist/{attachment-BO2R47wn.js → attachment-DbjUWsP0.js} +12 -12
- package/dist/{attachment-BO2R47wn.js.map → attachment-DbjUWsP0.js.map} +1 -1
- package/dist/auth-CAQcasMV.js +723 -0
- package/dist/auth-CAQcasMV.js.map +1 -0
- package/dist/{avatar-Bpzty83c.js → avatar-Bu2HhitA.js} +6 -6
- package/dist/{avatar-Bpzty83c.js.map → avatar-Bu2HhitA.js.map} +1 -1
- package/dist/{badge-BZXZT9wd.js → badge-CzId1Wlm.js} +4 -4
- package/dist/{badge-BZXZT9wd.js.map → badge-CzId1Wlm.js.map} +1 -1
- package/dist/base/accordion.js +1 -1
- package/dist/base/action-menu.js +1 -1
- package/dist/base/attachment.js +1 -1
- package/dist/base/avatar.js +1 -1
- package/dist/base/badge.js +1 -1
- package/dist/base/buttons.js +3 -2
- package/dist/base/cards.js +3 -3
- package/dist/base/carousel.js +25 -27
- package/dist/base/carousel.js.map +1 -1
- package/dist/base/cascader.js +150 -148
- package/dist/base/cascader.js.map +1 -1
- package/dist/base/chart.js +1 -1
- package/dist/base/choice-inputs.js +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 +3 -3
- package/dist/base/display.js +7 -7
- package/dist/base/feedback.js +4 -4
- package/dist/base/forms-numeric.js +1 -1
- package/dist/base/forms.js +2 -2
- package/dist/base/inline-edit.js +40 -43
- package/dist/base/inline-edit.js.map +1 -1
- package/dist/base/item.js +1 -1
- package/dist/base/media-gallery.js +1 -1
- package/dist/base/navigation.js +6 -6
- package/dist/base/popover-menu.js +1 -1
- package/dist/base/popover.js +1 -1
- package/dist/base/qr-code.js +1 -1
- package/dist/base/repeaters.js +33 -33
- package/dist/base/repeaters.js.map +1 -1
- package/dist/base/sheet.js +1 -1
- package/dist/base/sidebar.js +1 -1
- package/dist/base/signature-pad.js +83 -81
- package/dist/base/signature-pad.js.map +1 -1
- package/dist/base/skeleton.js +1 -1
- package/dist/base/spinner.js +1 -1
- package/dist/base/structure.js +1 -1
- package/dist/base/table.js +1 -1
- package/dist/base/text-inputs.js +2 -2
- package/dist/base/toaster.js +6 -6
- package/dist/base/toaster.js.map +1 -1
- package/dist/base/tree.js +1 -1
- package/dist/base/upload-queue.js +1 -1
- package/dist/base/upload.js +3 -3
- package/dist/base/value-inputs.js +1 -1
- package/dist/blocks/admin.js +134 -134
- package/dist/blocks/admin.js.map +1 -1
- package/dist/blocks/ai.js +120 -117
- package/dist/blocks/ai.js.map +1 -1
- package/dist/blocks/analytics/usage-card.js +1 -1
- package/dist/blocks/analytics.js +510 -472
- package/dist/blocks/analytics.js.map +1 -1
- package/dist/blocks/collaboration.js +2 -2
- package/dist/blocks/commerce/receipt.js +1 -1
- package/dist/blocks/commerce.js +395 -383
- package/dist/blocks/commerce.js.map +1 -1
- package/dist/blocks/data-display.js +1 -1
- package/dist/blocks/onboarding.js +6 -6
- package/dist/blocks/onboarding.js.map +1 -1
- package/dist/blocks/planning.js +36 -36
- package/dist/blocks/planning.js.map +1 -1
- package/dist/blocks/timelines.js +1 -1
- package/dist/{breadcrumbs-DdQ_I5ra.js → breadcrumbs-BuYz5SDU.js} +9 -8
- package/dist/breadcrumbs-BuYz5SDU.js.map +1 -0
- package/dist/button-BZDasD04.js +651 -0
- package/dist/button-BZDasD04.js.map +1 -0
- package/dist/{button-BS6l5JUw.js → button-BZyfTvwm.js} +3 -3
- package/dist/button-BZyfTvwm.js.map +1 -0
- package/dist/buttons-D_6KJvEE.js +99 -0
- package/dist/buttons-D_6KJvEE.js.map +1 -0
- package/dist/{cards-Cum56XOF.js → cards-qGSErLw_.js} +12 -12
- package/dist/{cards-Cum56XOF.js.map → cards-qGSErLw_.js.map} +1 -1
- package/dist/chart-Bsc5BICK.js +150 -0
- package/dist/chart-Bsc5BICK.js.map +1 -0
- package/dist/{checkbox-BavDRjF7.js → checkbox-BQNDjUCh.js} +3 -3
- package/dist/checkbox-BQNDjUCh.js.map +1 -0
- package/dist/choice-inputs-Mk3iWbhr.js +725 -0
- package/dist/choice-inputs-Mk3iWbhr.js.map +1 -0
- package/dist/{code-block-xHKbAJDj.js → code-block-DzHKRybS.js} +23 -23
- package/dist/code-block-DzHKRybS.js.map +1 -0
- package/dist/{collapsible-DsnktFNv.js → collapsible-ClvC7Bj3.js} +3 -3
- package/dist/{collapsible-DsnktFNv.js.map → collapsible-ClvC7Bj3.js.map} +1 -1
- package/dist/{collection-content-C4fthJV_.js → collection-content-D6S8cv_n.js} +3 -3
- package/dist/{collection-content-C4fthJV_.js.map → collection-content-D6S8cv_n.js.map} +1 -1
- package/dist/{combobox-DEbdr-3u.js → combobox-BFnbJJp3.js} +18 -18
- package/dist/combobox-BFnbJJp3.js.map +1 -0
- package/dist/{combobox-xv3yJbzl.js → combobox-hozNwUcc.js} +313 -316
- package/dist/combobox-hozNwUcc.js.map +1 -0
- package/dist/{command-C0xe7u9B.js → command-BnmSchli.js} +9 -9
- package/dist/command-BnmSchli.js.map +1 -0
- package/dist/comments-u5L0OGip.js +1156 -0
- package/dist/comments-u5L0OGip.js.map +1 -0
- package/dist/components/base/buttons/button-group.recipes.d.ts +1 -1
- package/dist/components/base/buttons/button.recipes.d.ts +10 -19
- package/dist/components/base/buttons/use-pending-button-focus.d.ts +3 -0
- package/dist/components/base/cards/card.recipes.d.ts +13 -5
- package/dist/components/base/cards/partials/card-primitives.d.ts +9 -4
- package/dist/components/base/cards/smart-card.types.d.ts +1 -1
- package/dist/components/base/date-pickers/date-picker.recipes.d.ts +5 -18
- package/dist/components/base/date-pickers/datepicker.types.d.ts +3 -0
- package/dist/components/base/forms/form-field.d.ts +1 -0
- package/dist/components/base/forms/form-sizing.d.ts +3 -3
- package/dist/components/base/navigation/tabs.d.ts +3 -5
- package/dist/components/base/popover/popover.recipes.d.ts +3 -3
- package/dist/components/base/table/index.d.ts +1 -1
- package/dist/components/base/text-inputs/clear-native-field.d.ts +2 -0
- package/dist/components/base/text-inputs/input-trailing-action.d.ts +3 -0
- package/dist/components/blocks/analytics/types.d.ts +1 -1
- package/dist/components/blocks/collaboration/message/message.recipes.d.ts +12 -0
- package/dist/components/blocks/data-display/empty-state/partials/illustrations/document-stack.d.ts +1 -4
- package/dist/components/blocks/data-display/empty-state/partials/illustrations/inbox-clean.d.ts +1 -4
- package/dist/components/blocks/data-display/empty-state/partials/illustrations/index.d.ts +3 -3
- package/dist/components/blocks/data-display/empty-state/partials/illustrations/stacked-cards.d.ts +1 -6
- package/dist/components/features/combobox/components/error-message.d.ts +1 -1
- package/dist/components/features/comments/hooks/use-attachment-upload.d.ts +5 -0
- package/dist/components/features/filters/facets/search-facet.d.ts +0 -12
- package/dist/components/features/filters/facets/tags-facet.d.ts +1 -1
- package/dist/components/features/media-library/media-library.d.ts +1 -1
- package/dist/components/features/media-library/media-library.types.d.ts +9 -1
- package/dist/components/features/media-library/partials/media-library-partials.d.ts +1 -1
- package/dist/components/features/overlays/hooks/use-pending-overlay-focus.d.ts +2 -0
- package/dist/components/features/overlays/overlays.types.d.ts +5 -4
- package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +2 -1
- package/dist/components/features/table/data-table.d.ts +1 -1
- package/dist/components/features/table/table.types.d.ts +1 -1
- package/dist/components/features/theme-tweaker/theme-provider-settings.d.ts +3 -1
- package/dist/components/layout/auth/auth.types.d.ts +1 -0
- package/dist/components/layout/page/page.d.ts +0 -1
- package/dist/components/layout/page/page.types.d.ts +9 -3
- package/dist/components/layout/sidebar/sidebar.context.d.ts +1 -1
- package/dist/components/layout/sidebar/sidebar.types.d.ts +4 -0
- package/dist/components/layout/workspace/workspace.types.d.ts +3 -0
- package/dist/components/typography/heading.d.ts +5 -2
- package/dist/components/typography/index.d.ts +1 -1
- package/dist/components/typography/text.styles.d.ts +10 -0
- package/dist/components/ui/popover.d.ts +1 -1
- package/dist/components/ui/sidebar.d.ts +1 -1
- package/dist/components/ui/table.d.ts +2 -1
- package/dist/container.recipes-D9t8MHR3.js +27 -0
- package/dist/container.recipes-D9t8MHR3.js.map +1 -0
- package/dist/{containers-6s-ucRQQ.js → containers-DqB-bSYE.js} +33 -56
- package/dist/containers-DqB-bSYE.js.map +1 -0
- package/dist/control-group-recipes-DBXmfh2E.js +21 -0
- package/dist/control-group-recipes-DBXmfh2E.js.map +1 -0
- package/dist/{copyable-B7SBXJMr.js → copyable-BTSByfmq.js} +6 -6
- package/dist/{copyable-B7SBXJMr.js.map → copyable-BTSByfmq.js.map} +1 -1
- package/dist/{data-display-cWIRdeaf.js → data-display-Bihs9Ven.js} +545 -332
- package/dist/data-display-Bihs9Ven.js.map +1 -0
- package/dist/{date-BFNMnrS5.js → date-DOKhJPu7.js} +4 -4
- package/dist/{date-BFNMnrS5.js.map → date-DOKhJPu7.js.map} +1 -1
- package/dist/{date-picker-CA6ogMQB.js → date-picker-DzP5HQq7.js} +492 -472
- package/dist/date-picker-DzP5HQq7.js.map +1 -0
- package/dist/date-pickers-BpgGz7S-.js +196 -0
- package/dist/date-pickers-BpgGz7S-.js.map +1 -0
- package/dist/{display-CFM5myut.js → display-CS6Hbk18.js} +8 -8
- package/dist/{display-CFM5myut.js.map → display-CS6Hbk18.js.map} +1 -1
- package/dist/{dropdown-menu-BlnyHr-9.js → dropdown-menu-D-boNgGO.js} +7 -7
- package/dist/{dropdown-menu-BlnyHr-9.js.map → dropdown-menu-D-boNgGO.js.map} +1 -1
- package/dist/features/activities.js +152 -141
- package/dist/features/activities.js.map +1 -1
- package/dist/features/ai-chat.js +182 -179
- package/dist/features/ai-chat.js.map +1 -1
- package/dist/features/async-preview.js +9 -9
- package/dist/features/async-preview.js.map +1 -1
- package/dist/features/combobox.js +1 -1
- package/dist/features/comments.js +1 -1
- package/dist/features/data-view.js +25 -23
- package/dist/features/data-view.js.map +1 -1
- package/dist/features/email-composer/engine.js +1 -1
- package/dist/features/email-composer.js +103 -104
- package/dist/features/email-composer.js.map +1 -1
- package/dist/features/event-calendar.js +375 -373
- package/dist/features/event-calendar.js.map +1 -1
- package/dist/features/filters.js +1 -1
- package/dist/features/global-search.js +222 -224
- package/dist/features/global-search.js.map +1 -1
- package/dist/features/kanban.js +29 -29
- package/dist/features/kanban.js.map +1 -1
- package/dist/features/map.js +59 -58
- package/dist/features/map.js.map +1 -1
- package/dist/features/media-library.js +856 -855
- package/dist/features/media-library.js.map +1 -1
- package/dist/features/mentions.js +1 -1
- package/dist/features/overlays.js +1 -1
- package/dist/features/products.js +1209 -1209
- package/dist/features/products.js.map +1 -1
- package/dist/features/questionnaire.js +52 -52
- package/dist/features/questionnaire.js.map +1 -1
- package/dist/features/resource-assignment.js +29 -31
- package/dist/features/resource-assignment.js.map +1 -1
- package/dist/features/resource.js +13 -13
- package/dist/features/resource.js.map +1 -1
- package/dist/features/rich-text-editor.js +2 -2
- package/dist/features/schema-form.js +82 -82
- package/dist/features/schema-form.js.map +1 -1
- package/dist/features/suggestions.js +3 -3
- package/dist/features/sync.js +4 -4
- package/dist/features/sync.js.map +1 -1
- package/dist/features/table.js +1 -1
- package/dist/features/theme-tweaker.js +456 -450
- package/dist/features/theme-tweaker.js.map +1 -1
- package/dist/{feedback-DWUkgEjR.js → feedback-CJkUAapr.js} +29 -29
- package/dist/feedback-CJkUAapr.js.map +1 -0
- package/dist/field-affordance-recipes-uKY4MsZ_.js +25 -0
- package/dist/field-affordance-recipes-uKY4MsZ_.js.map +1 -0
- package/dist/{field-state-recipes-CBTRt9Bt.js → field-state-recipes-DQQpiLWC.js} +3 -3
- package/dist/field-state-recipes-DQQpiLWC.js.map +1 -0
- package/dist/{filters-BhsUtsxW.js → filters-D6FF8L6s.js} +715 -720
- package/dist/filters-D6FF8L6s.js.map +1 -0
- package/dist/{form-field-Bn7ZH1rA.js → form-field-CZwrkP7m.js} +17 -9
- package/dist/form-field-CZwrkP7m.js.map +1 -0
- package/dist/{form-sizing-BWs70_a2.js → form-sizing-QP8aIRaW.js} +8 -5
- package/dist/form-sizing-QP8aIRaW.js.map +1 -0
- package/dist/{forms-B7pzS25o.js → forms-B5NCbkSC.js} +35 -35
- package/dist/{forms-B7pzS25o.js.map → forms-B5NCbkSC.js.map} +1 -1
- package/dist/forms-numeric-Crrm80Lm.js +867 -0
- package/dist/forms-numeric-Crrm80Lm.js.map +1 -0
- package/dist/{header-C59QZyxV.js → header-kxruN3RM.js} +53 -49
- package/dist/header-kxruN3RM.js.map +1 -0
- package/dist/{hooks-CM1Vp9Pe.js → hooks-BrlnCwQd.js} +2 -2
- package/dist/{hooks-CM1Vp9Pe.js.map → hooks-BrlnCwQd.js.map} +1 -1
- package/dist/{http-CLTVJc5I.js → http-CdEIHyQf.js} +2 -2
- package/dist/http-CdEIHyQf.js.map +1 -0
- package/dist/{icon-badge-Dv0RYQwj.js → icon-badge-Btc6pQrp.js} +4 -4
- package/dist/{icon-badge-Dv0RYQwj.js.map → icon-badge-Btc6pQrp.js.map} +1 -1
- package/dist/index.js +2 -2
- package/dist/input-SX9V0AL3.js +255 -0
- package/dist/input-SX9V0AL3.js.map +1 -0
- package/dist/input-vxcaNCYC.js +20 -0
- package/dist/input-vxcaNCYC.js.map +1 -0
- package/dist/{item-pJ0GsOiJ.js → item-DE4YnuJx.js} +18 -17
- package/dist/item-DE4YnuJx.js.map +1 -0
- package/dist/layout/app-shell.js +1 -1
- package/dist/layout/auth.js +1 -1
- package/dist/layout/containers.js +1 -1
- package/dist/layout/header.js +1 -1
- package/dist/layout/hooks.js +1 -1
- package/dist/layout/navigation.js +1 -1
- package/dist/layout/page.js +1 -1
- package/dist/layout/settings.js +1 -1
- package/dist/layout/sidebar.js +2 -2
- package/dist/layout/workspace.js +1 -1
- package/dist/layout.js +10 -10
- package/dist/lib/affordance-geometry.generated.d.ts +40 -9
- package/dist/lib/control-group-recipes.d.ts +22 -0
- package/dist/lib/field-affordance-recipes.d.ts +35 -2
- package/dist/lib/field-state-recipes.d.ts +2 -2
- package/dist/lib/navigation-row-recipes.d.ts +3 -2
- package/dist/lib/overlay-anatomy-recipes.d.ts +1 -1
- package/dist/lib/surface-recipes.d.ts +5 -2
- package/dist/lib/token-merge.generated.d.ts +144 -2
- package/dist/lib/ui-provider/types.d.ts +4 -2
- package/dist/lib/use-prefers-reduced-motion.d.ts +2 -0
- package/dist/lib/utils.js +1 -1
- package/dist/{media-gallery-DhDRgnVZ.js → media-gallery-DLp3HAz0.js} +75 -74
- package/dist/media-gallery-DLp3HAz0.js.map +1 -0
- package/dist/{mentions-B8Ko-fhS.js → mentions-Cl0Kt_Pd.js} +52 -50
- package/dist/{mentions-B8Ko-fhS.js.map → mentions-Cl0Kt_Pd.js.map} +1 -1
- package/dist/message-SZUNB1eX.js +127 -0
- package/dist/message-SZUNB1eX.js.map +1 -0
- package/dist/{navigation-DBEu4POU.js → navigation-DnQSNMT0.js} +64 -55
- package/dist/navigation-DnQSNMT0.js.map +1 -0
- package/dist/{navigation-BUIn2Qxx.js → navigation-DyytsLRB.js} +37 -37
- package/dist/navigation-DyytsLRB.js.map +1 -0
- package/dist/{navigation-row-recipes-GVh11KiT.js → navigation-row-recipes-DQEXQcqY.js} +3 -3
- package/dist/navigation-row-recipes-DQEXQcqY.js.map +1 -0
- package/dist/{number-BNT_BIzJ.js → number-DasMFWEG.js} +4 -4
- package/dist/{number-BNT_BIzJ.js.map → number-DasMFWEG.js.map} +1 -1
- package/dist/overlays-DUbs1KEi.js +1011 -0
- package/dist/overlays-DUbs1KEi.js.map +1 -0
- package/dist/{page-BV6ioQg3.js → page-hGmT4nWK.js} +75 -64
- package/dist/page-hGmT4nWK.js.map +1 -0
- package/dist/{page-header-DQRa0jug.js → page-header-D8nERkn5.js} +9 -9
- package/dist/page-header-D8nERkn5.js.map +1 -0
- package/dist/{pagination-C29vvt3I.js → pagination-NLGqRirf.js} +20 -20
- package/dist/pagination-NLGqRirf.js.map +1 -0
- package/dist/{popover-CoLDEg19.js → popover-CghIYdQf.js} +23 -22
- package/dist/popover-CghIYdQf.js.map +1 -0
- package/dist/{popover-menu-GLIQTJTx.js → popover-menu-B4PoWhRl.js} +6 -6
- package/dist/{popover-menu-GLIQTJTx.js.map → popover-menu-B4PoWhRl.js.map} +1 -1
- package/dist/{popover.recipes-zgBhMlUu.js → popover.recipes-QlD4JenO.js} +5 -5
- package/dist/popover.recipes-QlD4JenO.js.map +1 -0
- package/dist/{primitives-DKPOGVpj.js → primitives-C7ff0QaI.js} +120 -113
- package/dist/primitives-C7ff0QaI.js.map +1 -0
- package/dist/primitives.js +3 -3
- package/dist/{progress-BOe8l_FZ.js → progress-BroqrAyV.js} +10 -9
- package/dist/progress-BroqrAyV.js.map +1 -0
- package/dist/{receipt-BM8xsGFy.js → receipt-BuJynLgf.js} +8 -8
- package/dist/{receipt-BM8xsGFy.js.map → receipt-BuJynLgf.js.map} +1 -1
- package/dist/{rich-text-B7sBAdDG.js → rich-text-DlxDOtf4.js} +4 -4
- package/dist/{rich-text-B7sBAdDG.js.map → rich-text-DlxDOtf4.js.map} +1 -1
- package/dist/rich-text-editor-BKyG7rWz.js +574 -0
- package/dist/rich-text-editor-BKyG7rWz.js.map +1 -0
- package/dist/{rich-text-editor.recipes-DxvOE0Lp.js → rich-text-editor.recipes-B72Nfuze.js} +35 -26
- package/dist/rich-text-editor.recipes-B72Nfuze.js.map +1 -0
- package/dist/{scroll-area-BheMQ270.js → scroll-area-D-pIhEKl.js} +3 -3
- package/dist/scroll-area-D-pIhEKl.js.map +1 -0
- package/dist/{separator-Gk_WXH-l.js → separator-BNIgG3au.js} +3 -3
- package/dist/{separator-Gk_WXH-l.js.map → separator-BNIgG3au.js.map} +1 -1
- package/dist/{separator-DO0EbCEm.js → separator-BhtFyo4x.js} +2 -2
- package/dist/{separator-DO0EbCEm.js.map → separator-BhtFyo4x.js.map} +1 -1
- package/dist/services/actions.js +1 -1
- package/dist/{settings-BnCyyPOJ.js → settings-DOTOzeZ2.js} +10 -9
- package/dist/{settings-BnCyyPOJ.js.map → settings-DOTOzeZ2.js.map} +1 -1
- package/dist/{sheet-B-q914Ad.js → sheet-BFhrNehm.js} +11 -11
- package/dist/sheet-BFhrNehm.js.map +1 -0
- package/dist/{sidebar-DPR7fmqN.js → sidebar-CyR4XKwR.js} +219 -200
- package/dist/sidebar-CyR4XKwR.js.map +1 -0
- package/dist/{sidebar-C_2p3Tfj.js → sidebar-SvGJ0Zwi.js} +63 -58
- package/dist/sidebar-SvGJ0Zwi.js.map +1 -0
- package/dist/{skeleton-CmT1ppqb.js → skeleton-3F0uhYn3.js} +4 -4
- package/dist/{skeleton-CmT1ppqb.js.map → skeleton-3F0uhYn3.js.map} +1 -1
- package/dist/{smart-card-CYLn46e6.js → smart-card-DjGVV2xr.js} +171 -165
- package/dist/smart-card-DjGVV2xr.js.map +1 -0
- package/dist/{spinner-BY9HbUEh.js → spinner-Cpf7oRkF.js} +5 -5
- package/dist/{spinner-BY9HbUEh.js.map → spinner-Cpf7oRkF.js.map} +1 -1
- package/dist/{structure-MvKVq-oL.js → structure-CRdqVawd.js} +2 -2
- package/dist/{structure-MvKVq-oL.js.map → structure-CRdqVawd.js.map} +1 -1
- package/dist/style.css +1 -1
- package/dist/{surface-recipes-CQfRr-VL.js → surface-recipes-Dd__PD-w.js} +4 -3
- package/dist/surface-recipes-Dd__PD-w.js.map +1 -0
- package/dist/{table-DnlAJ-xR.js → table-CLtJTxoR.js} +17 -16
- package/dist/table-CLtJTxoR.js.map +1 -0
- package/dist/table-CcRDZiLP.js +1444 -0
- package/dist/table-CcRDZiLP.js.map +1 -0
- package/dist/tabs-BNgu7g0u.js +188 -0
- package/dist/tabs-BNgu7g0u.js.map +1 -0
- package/dist/text-inputs-DsR56TR-.js +330 -0
- package/dist/text-inputs-DsR56TR-.js.map +1 -0
- package/dist/{text.styles-BwB7vAF2.js → text.styles-Q4sGAIgA.js} +18 -10
- package/dist/text.styles-Q4sGAIgA.js.map +1 -0
- package/dist/theme.css +77 -115
- package/dist/{timelines-B9ICkQcV.js → timelines-D1pkt3se.js} +84 -78
- package/dist/timelines-D1pkt3se.js.map +1 -0
- package/dist/{tree-BdWSaoFT.js → tree-BtmYyMZV.js} +8 -8
- package/dist/{tree-BdWSaoFT.js.map → tree-BtmYyMZV.js.map} +1 -1
- package/dist/typography/rich-text.js +1 -1
- package/dist/typography-BxQgiZyw.js +96 -0
- package/dist/typography-BxQgiZyw.js.map +1 -0
- package/dist/typography.js +1 -1
- package/dist/{ui-provider-CftIB6TY.js → ui-provider-DRPn3qNl.js} +3 -2
- package/dist/ui-provider-DRPn3qNl.js.map +1 -0
- package/dist/ui-provider.js +1 -1
- package/dist/{upload-D8Za5x_c.js → upload-CDbYw1WN.js} +326 -323
- package/dist/upload-CDbYw1WN.js.map +1 -0
- package/dist/{upload-queue-hIIYBLS7.js → upload-queue-CNd_hH_a.js} +25 -25
- package/dist/upload-queue-CNd_hH_a.js.map +1 -0
- package/dist/{usage-card-DnmnJ58D.js → usage-card-VyJLUwRr.js} +53 -54
- package/dist/usage-card-VyJLUwRr.js.map +1 -0
- package/dist/utils-BvH9PSmq.js +4275 -0
- package/dist/utils-BvH9PSmq.js.map +1 -0
- package/dist/value-inputs-D0KCrfVC.js +840 -0
- package/dist/value-inputs-D0KCrfVC.js.map +1 -0
- package/dist/{workspace-C1PZmk8L.js → workspace-CcR8r-Nt.js} +115 -122
- package/dist/workspace-CcR8r-Nt.js.map +1 -0
- package/docs/consumer-skill/SKILL.md +110 -119
- package/docs/consumer-skill/examples/analytics.tsx +34 -0
- package/docs/consumer-skill/examples/app-layout.tsx +42 -12
- package/docs/consumer-skill/examples/detail.tsx +20 -4
- package/docs/consumer-skill/examples/manifest.json +13 -1
- package/docs/consumer-skill/examples/website.tsx +56 -0
- package/docs/consumer-skill/references/analytics.md +70 -0
- package/docs/consumer-skill/references/composition.md +116 -2
- package/docs/consumer-skill/references/design-contract.md +33 -7
- package/docs/consumer-skill/references/discovery.md +76 -5
- package/docs/consumer-skill/references/integration.md +14 -0
- package/docs/consumer-skill/references/public-api.json +2023 -218
- package/docs/consumer-skill/references/review.md +55 -3
- package/docs/consumer-skill/references/theming.md +52 -7
- package/docs/consumer-skill/references/tokens.json +177 -9
- package/docs/consumer-skill/references/workflows.md +32 -0
- package/docs/consumer-skill/scripts/check-composition.mjs +1 -1
- package/docs/consumer-skill/scripts/composition-policy.mjs +179 -17
- package/docs/consumer-skill/scripts/discovery.mjs +61 -9
- package/docs/consumer-skill/scripts/surface-policy.mjs +44 -0
- package/package.json +7 -4
- package/dist/accordion-B-5Focs8.js.map +0 -1
- package/dist/action-menu-Cx3SdfbN.js.map +0 -1
- package/dist/affordance-geometry.generated-D8Jcfb0G.js +0 -32
- package/dist/affordance-geometry.generated-D8Jcfb0G.js.map +0 -1
- package/dist/ai-artifact-B5tPpXnS.js.map +0 -1
- package/dist/app-shell-at8Kt4l_.js.map +0 -1
- package/dist/auth-OFwWSAap.js +0 -704
- package/dist/auth-OFwWSAap.js.map +0 -1
- package/dist/breadcrumbs-DdQ_I5ra.js.map +0 -1
- package/dist/button-BS6l5JUw.js.map +0 -1
- package/dist/buttons-Co6GavvM.js +0 -674
- package/dist/buttons-Co6GavvM.js.map +0 -1
- package/dist/chart-DVfcwQu6.js +0 -149
- package/dist/chart-DVfcwQu6.js.map +0 -1
- package/dist/checkbox-BavDRjF7.js.map +0 -1
- package/dist/choice-inputs-CC7XqPQO.js +0 -619
- package/dist/choice-inputs-CC7XqPQO.js.map +0 -1
- package/dist/code-block-xHKbAJDj.js.map +0 -1
- package/dist/combobox-DEbdr-3u.js.map +0 -1
- package/dist/combobox-xv3yJbzl.js.map +0 -1
- package/dist/command-C0xe7u9B.js.map +0 -1
- package/dist/comments-DviPLnwy.js +0 -1132
- package/dist/comments-DviPLnwy.js.map +0 -1
- package/dist/containers-6s-ucRQQ.js.map +0 -1
- package/dist/data-display-cWIRdeaf.js.map +0 -1
- package/dist/date-picker-CA6ogMQB.js.map +0 -1
- package/dist/date-pickers-BPIKLdsD.js +0 -224
- package/dist/date-pickers-BPIKLdsD.js.map +0 -1
- package/dist/feedback-DWUkgEjR.js.map +0 -1
- package/dist/field-affordance-recipes-IjzPrCTw.js +0 -17
- package/dist/field-affordance-recipes-IjzPrCTw.js.map +0 -1
- package/dist/field-state-recipes-CBTRt9Bt.js.map +0 -1
- package/dist/filters-BhsUtsxW.js.map +0 -1
- package/dist/form-field-Bn7ZH1rA.js.map +0 -1
- package/dist/form-sizing-BWs70_a2.js.map +0 -1
- package/dist/forms-numeric-BUBxELBv.js +0 -867
- package/dist/forms-numeric-BUBxELBv.js.map +0 -1
- package/dist/header-C59QZyxV.js.map +0 -1
- package/dist/http-CLTVJc5I.js.map +0 -1
- package/dist/input-WwYQZJzG.js +0 -202
- package/dist/input-WwYQZJzG.js.map +0 -1
- package/dist/input-ci9fIgFH.js +0 -20
- package/dist/input-ci9fIgFH.js.map +0 -1
- package/dist/item-pJ0GsOiJ.js.map +0 -1
- package/dist/media-gallery-DhDRgnVZ.js.map +0 -1
- package/dist/message-COsdEvXT.js +0 -108
- package/dist/message-COsdEvXT.js.map +0 -1
- package/dist/navigation-BUIn2Qxx.js.map +0 -1
- package/dist/navigation-DBEu4POU.js.map +0 -1
- package/dist/navigation-row-recipes-GVh11KiT.js.map +0 -1
- package/dist/overlays-B11wZka6.js +0 -982
- package/dist/overlays-B11wZka6.js.map +0 -1
- package/dist/page-BV6ioQg3.js.map +0 -1
- package/dist/page-header-DQRa0jug.js.map +0 -1
- package/dist/pagination-C29vvt3I.js.map +0 -1
- package/dist/popover-CoLDEg19.js.map +0 -1
- package/dist/popover.recipes-zgBhMlUu.js.map +0 -1
- package/dist/primitives-DKPOGVpj.js.map +0 -1
- package/dist/progress-BOe8l_FZ.js.map +0 -1
- package/dist/rich-text-editor-CoVrTiSv.js +0 -575
- package/dist/rich-text-editor-CoVrTiSv.js.map +0 -1
- package/dist/rich-text-editor.recipes-DxvOE0Lp.js.map +0 -1
- package/dist/scroll-area-BheMQ270.js.map +0 -1
- package/dist/select-B2mb-qN2.js +0 -108
- package/dist/select-B2mb-qN2.js.map +0 -1
- package/dist/sheet-B-q914Ad.js.map +0 -1
- package/dist/sidebar-C_2p3Tfj.js.map +0 -1
- package/dist/sidebar-DPR7fmqN.js.map +0 -1
- package/dist/smart-card-CYLn46e6.js.map +0 -1
- package/dist/surface-recipes-CQfRr-VL.js.map +0 -1
- package/dist/table-BS39xnlq.js +0 -1424
- package/dist/table-BS39xnlq.js.map +0 -1
- package/dist/table-DnlAJ-xR.js.map +0 -1
- package/dist/tabs-B5cNMWiP.js +0 -187
- package/dist/tabs-B5cNMWiP.js.map +0 -1
- package/dist/text-inputs-Dh9XGyiS.js +0 -331
- package/dist/text-inputs-Dh9XGyiS.js.map +0 -1
- package/dist/text.styles-BwB7vAF2.js.map +0 -1
- package/dist/timelines-B9ICkQcV.js.map +0 -1
- package/dist/typography-Cv8MT-82.js +0 -96
- package/dist/typography-Cv8MT-82.js.map +0 -1
- package/dist/ui-provider-CftIB6TY.js.map +0 -1
- package/dist/upload-D8Za5x_c.js.map +0 -1
- package/dist/upload-queue-hIIYBLS7.js.map +0 -1
- package/dist/usage-card-DnmnJ58D.js.map +0 -1
- package/dist/utils-C2EKeIw3.js +0 -72
- package/dist/utils-C2EKeIw3.js.map +0 -1
- package/dist/value-inputs-DX2dbxjj.js +0 -824
- package/dist/value-inputs-DX2dbxjj.js.map +0 -1
- package/dist/workspace-C1PZmk8L.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-library.js","names":["_Fragment","NumberValue","Text","DisplayLabel","Grid","Stack","LoadingState","ErrorState","ActionDialog","formatFileSize","FileSize","Dimensions","Percent","Number$1","Badge","Input","FormField","Select","Switch","Dropzone","EmptyState","Fragment$1","defaultMediaLibraryStrings","formatMediaLibraryString","template","values","key","one","other","DEFAULT_UPLOAD_OPTIONS","EMPTY_ITEMS","useControllableState","internal","setInternal","useState","defaultValue","value","controlled","useCallback","resolved","next","onChange","defaultAccessors","item","resolveMediaLibraryAccessors","accessors","formatMediaLibrarySize","bytes","getMediaLibraryDimensions","width","height","getUploadedTime","time","inferFileType","file","createPreviewUrl","revokePreviewUrl","url","normalizeFetchResult","result","mergePatch","patch","filterItems","normalizedQuery","query","items","type","collection","sortItems","sorted","sort","a","b","useMediaLibrary","itemsProp","accessorsProp","tabProp","viewProp","queryProp","typeProp","collectionProp","sortProp","uploadOptionsProp","useMemo","tab","setTab","defaultTab","onTabChange","view","setView","defaultView","onViewChange","setQuery","defaultQuery","onQueryChange","setType","defaultType","onTypeChange","setCollection","defaultCollection","onCollectionChange","setSort","defaultSort","onSortChange","detailId","setDetailId","internalValue","setInternalValue","fetchedItems","setFetchedItems","fetchedTotal","setFetchedTotal","loading","setLoading","error","setError","createdItems","setCreatedItems","removedIds","setRemovedIds","itemPatches","setItemPatches","stagedFiles","setStagedFiles","uploading","setUploading","defaultResolvedUploadOptions","defaultUploadOptions","uploadOptions","setUploadOptions","onUploadOptionsChange","isSelectionControlled","selectedIds","selectedSet","objectUrlRef","useRef","uploadControllerRef","mutationVersionRef","useEffect","fetcher","controller","normalized","nextError","onError","objectUrls","sourceItems","patchedItems","visibleItems","filtered","totalCount","filteredCount","selectedItems","hasFilters","applySelection","nextIds","nextSet","nextItems","onValueChange","toggleSelection","selectionMode","id","clearSelection","clearFilters","addFiles","current","files","src","index","removeStagedFile","target","clearStagedFiles","updateUploadOptions","setUploadFile","fileId","helpers","progress","uploaded","onUpload","uploadedIds","mutationKey","version","previousPatch","onItemUpdate","wasRemoved","onItemDelete","selectedId","typeIcon","jsx","ImageIcon","Video","File","className","typeLabel","strings","usedInLabel","count","MediaPreview","cn","tint","MediaPreviewImage","failed","setFailed","MediaLibraryEmptyState","description","action","icon","MediaLibraryToolbar","typeOptions","typeFilters","option","collectionOptions","collections","sortOptions","trimmedQuery","hasQuery","hasActiveFilters","event","Search","Icon","active","Button","Grid2X2","LayoutList","onClearFilters","toolbarEnd","MediaLibraryCard","name","alt","size","usageCount","isPrivate","duration","selected","density","onToggle","Check","onDetails","Info","Play","Lock","showMeta","Layers3","MediaLibraryList","MediaLibraryDetailPanel","tags","isPublic","custom","renderDetail","onUpdate","onRemove","onClose","ArrowLeft","label","tag","checked","UploadCloud","Trash2","MediaLibraryUploadPanel","onFiles","onRemoveFile","X","empty","onOptionsChange","MediaLibraryFooterSummary","selectedCount","stagedSize","sum","stagedCount","summaryClassName","onClearSelection","MediaLibraryFooterActions","onCancelUpload","cancelLabel","onCancel","onConfirm","confirmLabel","MediaLibraryFooter","chrome","MediaLibraryFooterPortalContext","createContext","useResolvedCollections","explicit","seen","getCollection","MediaLibrary","stringsProp","props","useStrings","state","resolvedCollections","activeTab","allowUpload","detailItem","footerPortal","useContext","usesDefaultFooter","slots","dialogSelectionSummary","hasHeaderIdentity","title","hasHeaderControls","hasHeader","confirm","cancel","confirmItem","confirmOnSelect","countLabel","footer","heightClassName","candidate","ctx","rendered","removed","createPortal","MediaLibraryDialog","internalOpen","setInternalOpen","footerElement","setFooterElement","isOpenControlled","open","resolvedOpen","handleOpenChange","nextOpen","onOpenChange","closeMediaLibrary","dialogTitle","dialogDescription","dialogClassName","contentClassName","moveItem","from","to","MediaResourceGallery","total","resolvedPrimaryId","primaryId","canAdd","readOnly","onAdd","maxItems","defaultAction","layout","Plus","move","shouldShowEmptyState","renderAddTile","ImagePlus","isPrimary","canMovePrevious","canMoveNext","renderItem","onPrimaryChange","Star","ArrowRight"],"sources":["../../src/components/features/media-library/media-library.strings.ts","../../src/components/features/media-library/hooks/use-media-library.ts","../../src/components/features/media-library/partials/media-library-partials.tsx","../../src/components/features/media-library/media-library.tsx","../../src/components/features/media-library/media-resource-gallery.tsx"],"sourcesContent":["export interface MediaLibraryStrings {\n\t/** Surface title. */\n\ttitle: string;\n\t/** Supporting copy shown under the label. */\n\tdescription: string;\n\tclose: string;\n\ttabs: {\n\t\tlibrary: string;\n\t\tupload: string;\n\t};\n\tsearchPlaceholder: string;\n\tclearSearch: string;\n\ttypeFilterLabel: string;\n\tcollectionFilterLabel: string;\n\tsortLabel: string;\n\tviewLabel: string;\n\tallTypes: string;\n\timages: string;\n\tvideos: string;\n\tfiles: string;\n\tallCollections: string;\n\tsortNewest: string;\n\tsortName: string;\n\tsortSize: string;\n\tsortUsage: string;\n\tgridView: string;\n\ttableView: string;\n\tcountAll: string;\n\tcountFiltered: string;\n\tcountSearch: string;\n\tactiveSearchLabel: string;\n\tresultsLabel: string;\n\temptyLibraryTitle: string;\n\temptyLibraryDescription: string;\n\temptyFilteredTitle: string;\n\temptyFilteredDescription: string;\n\tclearFilters: string;\n\tuploadMedia: string;\n\tloading: string;\n\terrorTitle: string;\n\terrorDescription: string;\n\tcardDetails: string;\n\tprivateLabel: string;\n\tpublicLabel: string;\n\ttypeImage: string;\n\ttypeVideo: string;\n\ttypeFile: string;\n\tunknownSize: string;\n\tnotUsed: string;\n\tusedIn: string;\n\ttable: {\n\t\tname: string;\n\t\ttype: string;\n\t\tsize: string;\n\t\tcollection: string;\n\t\tused: string;\n\t};\n\tdetail: {\n\t\ttitle: string;\n\t\taltText: string;\n\t\taltPlaceholder: string;\n\t\tcollection: string;\n\t\ttags: string;\n\t\ttagsPlaceholder: string;\n\t\tpublic: string;\n\t\tpublicHint: string;\n\t\tprivateHint: string;\n\t\ttype: string;\n\t\tsize: string;\n\t\tdimensions: string;\n\t\tuploaded: string;\n\t\tusedIn: string;\n\t\treplace: string;\n\t\tdelete: string;\n\t\tclose: string;\n\t};\n\tupload: {\n\t\tdropTitle: string;\n\t\tdropHint: string;\n\t\tdragOver: string;\n\t\tcollection: string;\n\t\ttags: string;\n\t\ttagsPlaceholder: string;\n\t\tpublic: string;\n\t\tpublicHint: string;\n\t\tnoFiles: string;\n\t\tstagedCount: string;\n\t\tremoveFile: string;\n\t\tuploading: string;\n\t\tdone: string;\n\t};\n\tfooter: {\n\t\tpickOne: string;\n\t\tpickMany: string;\n\t\tselectedCount: string;\n\t\tclear: string;\n\t\tcancel: string;\n\t\tconfirmEmpty: string;\n\t\tconfirmOne: string;\n\t\tconfirmMany: string;\n\t\tnoFiles: string;\n\t\tstagedSummary: string;\n\t\tupload: string;\n\t\tuploadMany: string;\n\t\tuploading: string;\n\t};\n\tgallery: {\n\t\temptyTitle: string;\n\t\temptyDescription: string;\n\t\tadd: string;\n\t\taddMore: string;\n\t\taddTile: string;\n\t\tcover: string;\n\t\tprimary: string;\n\t\tsetPrimary: string;\n\t\tremove: string;\n\t\tmovePrevious: string;\n\t\tmoveNext: string;\n\t\titemPosition: string;\n\t\tmaxReached: string;\n\t};\n}\n\nexport const defaultMediaLibraryStrings: MediaLibraryStrings = {\n\ttitle: 'Add media',\n\tdescription: 'Pick from the library, or upload new files.',\n\tclose: 'Close media library',\n\ttabs: {\n\t\tlibrary: 'Library',\n\t\tupload: 'Upload',\n\t},\n\tsearchPlaceholder: 'Search by name or tag...',\n\tclearSearch: 'Clear search',\n\ttypeFilterLabel: 'Type',\n\tcollectionFilterLabel: 'Collection',\n\tsortLabel: 'Sort',\n\tviewLabel: 'View',\n\tallTypes: 'All',\n\timages: 'Images',\n\tvideos: 'Videos',\n\tfiles: 'Files',\n\tallCollections: 'All collections',\n\tsortNewest: 'Newest',\n\tsortName: 'Name',\n\tsortSize: 'Size',\n\tsortUsage: 'Most used',\n\tgridView: 'Grid view',\n\ttableView: 'Table view',\n\tcountAll: '{count} items',\n\tcountFiltered: '{count} of {total} items',\n\tcountSearch: '{count} of {total} items for \"{query}\"',\n\tactiveSearchLabel: 'Search',\n\tresultsLabel: 'Media results',\n\temptyLibraryTitle: 'Library is empty',\n\temptyLibraryDescription: 'Upload images or videos to start building the library.',\n\temptyFilteredTitle: 'No media matches',\n\temptyFilteredDescription: 'Try a different search term, or clear the filters.',\n\tclearFilters: 'Clear filters',\n\tuploadMedia: 'Upload media',\n\tloading: 'Loading media...',\n\terrorTitle: 'Media could not load',\n\terrorDescription: 'Try again or adjust your filters.',\n\tcardDetails: 'Details for {name}',\n\tprivateLabel: 'Private',\n\tpublicLabel: 'Public',\n\ttypeImage: 'Image',\n\ttypeVideo: 'Video',\n\ttypeFile: 'File',\n\tunknownSize: 'Unknown',\n\tnotUsed: 'Not used yet',\n\tusedIn: '{count} {count, plural, one {place} other {places}}',\n\ttable: {\n\t\tname: 'Name',\n\t\ttype: 'Type',\n\t\tsize: 'Size',\n\t\tcollection: 'Collection',\n\t\tused: 'Used',\n\t},\n\tdetail: {\n\t\ttitle: 'Details',\n\t\taltText: 'Alt text',\n\t\taltPlaceholder: 'Describe this media for screen readers',\n\t\tcollection: 'Collection',\n\t\ttags: 'Tags',\n\t\ttagsPlaceholder: 'Comma-separated',\n\t\tpublic: 'Public',\n\t\tpublicHint: 'Served from the public CDN',\n\t\tprivateHint: 'Only visible in the admin',\n\t\ttype: 'Type',\n\t\tsize: 'Size',\n\t\tdimensions: 'Dimensions',\n\t\tuploaded: 'Uploaded',\n\t\tusedIn: 'Used in',\n\t\treplace: 'Replace file',\n\t\tdelete: 'Delete',\n\t\tclose: 'Close details',\n\t},\n\tupload: {\n\t\tdropTitle: 'Drag files here or click to browse',\n\t\tdropHint: 'JPG, PNG, WebP, SVG and MP4 up to 50 MB per file',\n\t\tdragOver: 'Release to stage files',\n\t\tcollection: 'Collection',\n\t\ttags: 'Tags',\n\t\ttagsPlaceholder: 'Comma-separated',\n\t\tpublic: 'Public',\n\t\tpublicHint: 'Serve from the public CDN',\n\t\tnoFiles: 'No files staged',\n\t\tstagedCount: '{count} {count, plural, one {file} other {files}}',\n\t\tremoveFile: 'Remove {name}',\n\t\tuploading: 'Uploading',\n\t\tdone: 'Done',\n\t},\n\tfooter: {\n\t\tpickOne: 'Pick one item',\n\t\tpickMany: 'Pick one or more items',\n\t\tselectedCount: '{count} selected',\n\t\tclear: 'Clear',\n\t\tcancel: 'Cancel',\n\t\tconfirmEmpty: 'Add to product',\n\t\tconfirmOne: 'Add 1 item',\n\t\tconfirmMany: 'Add {count} items',\n\t\tnoFiles: 'No files staged',\n\t\tstagedSummary: '{count} {count, plural, one {file} other {files}} · {size}',\n\t\tupload: 'Upload',\n\t\tuploadMany: 'Upload {count} files',\n\t\tuploading: 'Uploading...',\n\t},\n\tgallery: {\n\t\temptyTitle: 'No media attached',\n\t\temptyDescription: 'Add images, video, or files to this resource.',\n\t\tadd: 'Add media',\n\t\taddMore: 'Add more',\n\t\taddTile: 'Add another media item',\n\t\tcover: 'Cover',\n\t\tprimary: 'Primary',\n\t\tsetPrimary: 'Set primary',\n\t\tremove: 'Remove',\n\t\tmovePrevious: 'Move previous',\n\t\tmoveNext: 'Move next',\n\t\titemPosition: '{index} of {total}',\n\t\tmaxReached: 'Maximum reached',\n\t},\n};\n\nexport function formatMediaLibraryString(\n\ttemplate: string,\n\tvalues: Record<string, string | number>,\n): string {\n\treturn template\n\t\t.replace(\n\t\t\t/\\{(\\w+), plural, one \\{([^}]*)\\} other \\{([^}]*)\\}\\}/g,\n\t\t\t(_, key: string, one: string, other: string) =>\n\t\t\t\tNumber(values[key]) === 1 ? one : other,\n\t\t)\n\t\t.replace(/\\{(\\w+)\\}/g, (_, key: string) => String(values[key] ?? ''));\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { formatFileSize } from '../../../primitives';\n\nimport type {\n\tMediaLibraryAccessors,\n\tMediaLibraryFetchResult,\n\tMediaLibraryItem,\n\tMediaLibraryItemPatch,\n\tMediaLibraryItemType,\n\tMediaLibraryStagedFile,\n\tMediaLibraryUploadOptions,\n\tMediaLibraryUploadStatus,\n\tResolvedMediaLibraryAccessors,\n\tUseMediaLibraryOptions,\n\tMediaLibraryState,\n} from '../media-library.types';\n\nconst DEFAULT_UPLOAD_OPTIONS: MediaLibraryUploadOptions = {\n\tcollection: undefined,\n\ttags: [],\n\tpublic: true,\n};\nconst EMPTY_ITEMS: readonly unknown[] = [];\n\nfunction useControllableState<T>(\n\tcontrolled: T | undefined,\n\tdefaultValue: T,\n\tonChange: ((value: T) => void) | undefined,\n) {\n\tconst [internal, setInternal] = useState(defaultValue);\n\tconst value = controlled ?? internal;\n\tconst setValue = useCallback((next: T | ((current: T) => T)) => {\n\t\tconst resolved = typeof next === 'function'\n\t\t\t? (next as (current: T) => T)(value)\n\t\t\t: next;\n\t\tif (controlled === undefined) setInternal(resolved);\n\t\tonChange?.(resolved);\n\t}, [controlled, onChange, value]);\n\treturn [value, setValue] as const;\n}\n\nconst defaultAccessors: ResolvedMediaLibraryAccessors<MediaLibraryItem> = {\n\tgetId: (item) => item.id,\n\tgetName: (item) => item.name,\n\tgetType: (item) => item.type,\n\tgetSrc: (item) => item.src,\n\tgetAlt: (item) => item.alt,\n\tgetSize: (item) => item.size,\n\tgetWidth: (item) => item.width,\n\tgetHeight: (item) => item.height,\n\tgetDuration: (item) => item.duration,\n\tgetCollection: (item) => item.collection,\n\tgetTags: (item) => item.tags ?? [],\n\tgetPublic: (item) => item.public,\n\tgetUploadedAt: (item) => item.uploadedAt,\n\tgetUsageCount: (item) => item.usageCount,\n\tgetTint: (item) => item.tint,\n\tgetMimeType: (item) => item.mimeType,\n};\n\nexport function resolveMediaLibraryAccessors<TItem = MediaLibraryItem>(\n\taccessors?: MediaLibraryAccessors<TItem>,\n): ResolvedMediaLibraryAccessors<TItem> {\n\treturn {\n\t\t...(defaultAccessors as unknown as ResolvedMediaLibraryAccessors<TItem>),\n\t\t...(accessors ?? {}),\n\t};\n}\n\nexport function formatMediaLibrarySize(bytes?: number): string {\n\treturn formatFileSize(bytes) ?? '';\n}\n\nexport function getMediaLibraryDimensions<TItem>(\n\titem: TItem,\n\taccessors: ResolvedMediaLibraryAccessors<TItem>,\n): string {\n\tconst width = accessors.getWidth(item);\n\tconst height = accessors.getHeight(item);\n\tif (!width || !height) return '';\n\treturn `${width} x ${height}`;\n}\n\nfunction getUploadedTime<TItem>(\n\titem: TItem,\n\taccessors: ResolvedMediaLibraryAccessors<TItem>,\n) {\n\tconst value = accessors.getUploadedAt(item);\n\tif (!value) return 0;\n\tconst date = value instanceof Date ? value : new Date(value);\n\tconst time = date.getTime();\n\treturn Number.isFinite(time) ? time : 0;\n}\n\nfunction inferFileType(file: File): MediaLibraryItemType {\n\tif (file.type.startsWith('image/')) return 'image';\n\tif (file.type.startsWith('video/')) return 'video';\n\treturn 'file';\n}\n\nfunction createPreviewUrl(file: File): string | undefined {\n\tif (!file.type.startsWith('image/')) return undefined;\n\tif (typeof URL === 'undefined' || typeof URL.createObjectURL !== 'function') {\n\t\treturn undefined;\n\t}\n\treturn URL.createObjectURL(file);\n}\n\nfunction revokePreviewUrl(url: string | undefined) {\n\tif (!url || typeof URL === 'undefined' || typeof URL.revokeObjectURL !== 'function') {\n\t\treturn;\n\t}\n\tURL.revokeObjectURL(url);\n}\n\nfunction normalizeFetchResult<TItem>(\n\tresult: MediaLibraryFetchResult<TItem> | TItem[],\n): MediaLibraryFetchResult<TItem> {\n\tif (Array.isArray(result)) return { items: result, total: result.length };\n\treturn result;\n}\n\nfunction mergePatch<TItem>(item: TItem, patch?: MediaLibraryItemPatch): TItem {\n\tif (!patch) return item;\n\tif (typeof item === 'object' && item !== null) {\n\t\treturn { ...(item as object), ...patch } as TItem;\n\t}\n\treturn item;\n}\n\nfunction filterItems<TItem>(\n\titems: TItem[],\n\taccessors: ResolvedMediaLibraryAccessors<TItem>,\n\tquery: string,\n\ttype: string,\n\tcollection: string,\n) {\n\tconst normalizedQuery = query.trim().toLowerCase();\n\treturn items.filter((item) => {\n\t\tif (type !== 'all' && accessors.getType(item) !== type) return false;\n\t\tif (collection !== 'all' && accessors.getCollection(item) !== collection) return false;\n\t\tif (!normalizedQuery) return true;\n\n\t\tconst haystack = [\n\t\t\taccessors.getName(item),\n\t\t\taccessors.getAlt(item),\n\t\t\taccessors.getCollection(item),\n\t\t\t...accessors.getTags(item),\n\t\t]\n\t\t\t.filter(Boolean)\n\t\t\t.join(' ')\n\t\t\t.toLowerCase();\n\t\treturn haystack.includes(normalizedQuery);\n\t});\n}\n\nfunction sortItems<TItem>(\n\titems: TItem[],\n\taccessors: ResolvedMediaLibraryAccessors<TItem>,\n\tsort: string,\n) {\n\tconst sorted = items.slice();\n\tif (sort === 'name') {\n\t\tsorted.sort((a, b) => accessors.getName(a).localeCompare(accessors.getName(b)));\n\t} else if (sort === 'size') {\n\t\tsorted.sort((a, b) => (accessors.getSize(b) ?? 0) - (accessors.getSize(a) ?? 0));\n\t} else if (sort === 'usage') {\n\t\tsorted.sort(\n\t\t\t(a, b) => (accessors.getUsageCount(b) ?? 0) - (accessors.getUsageCount(a) ?? 0),\n\t\t);\n\t} else {\n\t\tsorted.sort((a, b) => getUploadedTime(b, accessors) - getUploadedTime(a, accessors));\n\t}\n\treturn sorted;\n}\n\nexport function useMediaLibrary<TItem = MediaLibraryItem>({\n\titems: itemsProp = EMPTY_ITEMS as readonly TItem[],\n\tfetcher,\n\taccessors: accessorsProp,\n\tselectionMode = 'multiple',\n\tvalue,\n\tdefaultValue = [],\n\tonValueChange,\n\tonItemUpdate,\n\tonItemDelete,\n\tonUpload,\n\tonError,\n\ttab: tabProp,\n\tdefaultTab = 'library',\n\tonTabChange,\n\tview: viewProp,\n\tdefaultView = 'grid',\n\tonViewChange,\n\tquery: queryProp,\n\tdefaultQuery = '',\n\tonQueryChange,\n\ttype: typeProp,\n\tdefaultType = 'all',\n\tonTypeChange,\n\tcollection: collectionProp,\n\tdefaultCollection = 'all',\n\tonCollectionChange,\n\tsort: sortProp,\n\tdefaultSort = 'newest',\n\tonSortChange,\n\tuploadOptions: uploadOptionsProp,\n\tdefaultUploadOptions,\n\tonUploadOptionsChange,\n}: UseMediaLibraryOptions<TItem> = {}): MediaLibraryState<TItem> {\n\tconst accessors = useMemo(\n\t\t() => resolveMediaLibraryAccessors(accessorsProp),\n\t\t[accessorsProp],\n\t);\n\tconst [tab, setTab] = useControllableState(tabProp, defaultTab, onTabChange);\n\tconst [view, setView] = useControllableState(viewProp, defaultView, onViewChange);\n\tconst [query, setQuery] = useControllableState(queryProp, defaultQuery, onQueryChange);\n\tconst [type, setType] = useControllableState(typeProp, defaultType, onTypeChange);\n\tconst [collection, setCollection] = useControllableState(\n\t\tcollectionProp,\n\t\tdefaultCollection,\n\t\tonCollectionChange,\n\t);\n\tconst [sort, setSort] = useControllableState(sortProp, defaultSort, onSortChange);\n\tconst [detailId, setDetailId] = useState<string | null>(null);\n\tconst [internalValue, setInternalValue] = useState<string[]>(() => [...defaultValue]);\n\tconst [fetchedItems, setFetchedItems] = useState<TItem[]>([]);\n\tconst [fetchedTotal, setFetchedTotal] = useState<number | undefined>();\n\tconst [loading, setLoading] = useState(false);\n\tconst [error, setError] = useState<unknown>(null);\n\tconst [createdItems, setCreatedItems] = useState<TItem[]>([]);\n\tconst [removedIds, setRemovedIds] = useState<Set<string>>(() => new Set());\n\tconst [itemPatches, setItemPatches] = useState<Record<string, MediaLibraryItemPatch>>({});\n\tconst [stagedFiles, setStagedFiles] = useState<MediaLibraryStagedFile[]>([]);\n\tconst [uploading, setUploading] = useState(false);\n\tconst defaultResolvedUploadOptions = useMemo<MediaLibraryUploadOptions>(() => ({\n\t\t...DEFAULT_UPLOAD_OPTIONS,\n\t\t...defaultUploadOptions,\n\t\ttags: defaultUploadOptions?.tags ?? DEFAULT_UPLOAD_OPTIONS.tags,\n\t}), [defaultUploadOptions]);\n\tconst controlledUploadOptions = useMemo<MediaLibraryUploadOptions | undefined>(\n\t\t() => uploadOptionsProp ? {\n\t\t\t...DEFAULT_UPLOAD_OPTIONS,\n\t\t\t...uploadOptionsProp,\n\t\t\ttags: uploadOptionsProp.tags ?? DEFAULT_UPLOAD_OPTIONS.tags,\n\t\t} : undefined,\n\t\t[uploadOptionsProp],\n\t);\n\tconst [uploadOptions, setUploadOptions] = useControllableState(\n\t\tcontrolledUploadOptions,\n\t\tdefaultResolvedUploadOptions,\n\t\tonUploadOptionsChange,\n\t);\n\tconst isSelectionControlled = value !== undefined;\n\tconst selectedIds = useMemo(\n\t\t() => (isSelectionControlled ? [...(value ?? [])] : internalValue),\n\t\t[internalValue, isSelectionControlled, value],\n\t);\n\tconst selectedSet = useMemo(() => new Set(selectedIds), [selectedIds]);\n\tconst objectUrlRef = useRef<Set<string>>(new Set());\n\tconst uploadControllerRef = useRef<AbortController | null>(null);\n\tconst mutationVersionRef = useRef<Map<string, number>>(new Map());\n\n\tuseEffect(() => {\n\t\tif (!fetcher) return;\n\t\tconst controller = new AbortController();\n\t\tsetLoading(true);\n\t\tsetError(null);\n\t\tfetcher({\n\t\t\tquery,\n\t\t\ttype,\n\t\t\tcollection: collection === 'all' ? undefined : collection,\n\t\t\tsort,\n\t\t\tsignal: controller.signal,\n\t\t})\n\t\t\t.then((result) => {\n\t\t\t\tif (controller.signal.aborted) return;\n\t\t\t\tconst normalized = normalizeFetchResult(result);\n\t\t\t\tsetFetchedItems(normalized.items);\n\t\t\t\tsetFetchedTotal(normalized.total);\n\t\t\t})\n\t\t\t.catch((nextError) => {\n\t\t\t\tif (controller.signal.aborted) return;\n\t\t\t\tsetError(nextError);\n\t\t\t\tonError?.(nextError);\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tif (!controller.signal.aborted) setLoading(false);\n\t\t\t});\n\t\treturn () => controller.abort();\n\t}, [collection, fetcher, onError, query, sort, type]);\n\n\tuseEffect(() => {\n\t\tconst objectUrls = objectUrlRef.current;\n\t\treturn () => {\n\t\t\tuploadControllerRef.current?.abort();\n\t\t\tfor (const url of objectUrls) revokePreviewUrl(url);\n\t\t\tobjectUrls.clear();\n\t\t};\n\t}, []);\n\n\tconst sourceItems = useMemo(\n\t\t() => (fetcher ? fetchedItems : [...createdItems, ...itemsProp]),\n\t\t[createdItems, fetchedItems, fetcher, itemsProp],\n\t);\n\tconst patchedItems = useMemo(\n\t\t() =>\n\t\t\tsourceItems\n\t\t\t\t.filter((item) => !removedIds.has(accessors.getId(item)))\n\t\t\t\t.map((item) => mergePatch(item, itemPatches[accessors.getId(item)])),\n\t\t[accessors, itemPatches, removedIds, sourceItems],\n\t);\n\tconst visibleItems = useMemo(() => {\n\t\tconst filtered = fetcher\n\t\t\t? patchedItems\n\t\t\t: filterItems(patchedItems, accessors, query, type, collection);\n\t\treturn fetcher ? filtered : sortItems(filtered, accessors, sort);\n\t}, [accessors, collection, fetcher, patchedItems, query, sort, type]);\n\tconst totalCount = fetchedTotal ?? patchedItems.length;\n\tconst filteredCount = visibleItems.length;\n\tconst selectedItems = useMemo(\n\t\t() => patchedItems.filter((item) => selectedSet.has(accessors.getId(item))),\n\t\t[accessors, patchedItems, selectedSet],\n\t);\n\tconst hasFilters = Boolean(query.trim()) || type !== 'all' || collection !== 'all';\n\n\tconst applySelection = useCallback(\n\t\t(nextIds: string[]) => {\n\t\t\tif (!isSelectionControlled) setInternalValue(nextIds);\n\t\t\tconst nextSet = new Set(nextIds);\n\t\t\tconst nextItems = patchedItems.filter((item) => nextSet.has(accessors.getId(item)));\n\t\t\tonValueChange?.(nextIds, nextItems);\n\t\t},\n\t\t[accessors, isSelectionControlled, onValueChange, patchedItems],\n\t);\n\n\tconst toggleSelection = useCallback(\n\t\t(id: string) => {\n\t\t\tconst next = new Set(selectionMode === 'single' ? [] : selectedSet);\n\t\t\tif (selectedSet.has(id) && selectionMode !== 'single') {\n\t\t\t\tnext.delete(id);\n\t\t\t} else {\n\t\t\t\tnext.add(id);\n\t\t\t}\n\t\t\tapplySelection(Array.from(next));\n\t\t},\n\t\t[applySelection, selectedSet, selectionMode],\n\t);\n\n\tconst clearSelection = useCallback(() => applySelection([]), [applySelection]);\n\tconst clearFilters = useCallback(() => {\n\t\tsetQuery('');\n\t\tsetType('all');\n\t\tsetCollection('all');\n\t}, [setCollection, setQuery, setType]);\n\n\tconst addFiles = useCallback((files: File[]) => {\n\t\tsetStagedFiles((current) => [\n\t\t\t...current,\n\t\t\t...files.map((file, index) => {\n\t\t\t\tconst src = createPreviewUrl(file);\n\t\t\t\tif (src) objectUrlRef.current.add(src);\n\t\t\t\treturn {\n\t\t\t\t\tid: `staged-${Date.now()}-${index}`,\n\t\t\t\t\tfile,\n\t\t\t\t\tname: file.name,\n\t\t\t\t\tsize: file.size,\n\t\t\t\t\ttype: inferFileType(file),\n\t\t\t\t\tsrc,\n\t\t\t\t\tprogress: 0,\n\t\t\t\t\tstatus: 'staged' as const,\n\t\t\t\t};\n\t\t\t}),\n\t\t]);\n\t}, []);\n\n\tconst removeStagedFile = useCallback((id: string) => {\n\t\tsetStagedFiles((current) => {\n\t\t\tconst target = current.find((file) => file.id === id);\n\t\t\tif (target?.src) {\n\t\t\t\trevokePreviewUrl(target.src);\n\t\t\t\tobjectUrlRef.current.delete(target.src);\n\t\t\t}\n\t\t\treturn current.filter((file) => file.id !== id);\n\t\t});\n\t}, []);\n\n\tconst clearStagedFiles = useCallback(() => {\n\t\tsetStagedFiles((current) => {\n\t\t\tfor (const file of current) {\n\t\t\t\tif (file.src) {\n\t\t\t\t\trevokePreviewUrl(file.src);\n\t\t\t\t\tobjectUrlRef.current.delete(file.src);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [];\n\t\t});\n\t}, []);\n\n\tconst updateUploadOptions = useCallback((patch: Partial<MediaLibraryUploadOptions>) => {\n\t\tsetUploadOptions((current) => ({ ...current, ...patch }));\n\t}, [setUploadOptions]);\n\n\tconst setUploadFile = useCallback(\n\t\t(fileId: string, patch: Partial<Pick<MediaLibraryStagedFile, 'progress' | 'status' | 'error'>>) => {\n\t\t\tsetStagedFiles((current) =>\n\t\t\t\tcurrent.map((file) => (file.id === fileId ? { ...file, ...patch } : file)),\n\t\t\t);\n\t\t},\n\t\t[],\n\t);\n\n\tconst startUpload = useCallback(async () => {\n\t\tif (uploading || stagedFiles.length === 0) return;\n\t\tconst controller = new AbortController();\n\t\tuploadControllerRef.current?.abort();\n\t\tuploadControllerRef.current = controller;\n\t\tsetError(null);\n\t\tsetUploading(true);\n\t\tsetStagedFiles((current) =>\n\t\t\tcurrent.map((file) => ({ ...file, status: 'uploading', progress: 0 })),\n\t\t);\n\t\tconst helpers = {\n\t\t\tsignal: controller.signal,\n\t\t\tsetProgress: (fileId: string, progress: number) => {\n\t\t\t\tif (controller.signal.aborted) return;\n\t\t\t\tsetUploadFile(fileId, { progress: Math.max(0, Math.min(100, progress)) });\n\t\t\t},\n\t\t\tsetFileStatus: (\n\t\t\t\tfileId: string,\n\t\t\t\tstatus: MediaLibraryUploadStatus,\n\t\t\t\tnextError?: string,\n\t\t\t) => {\n\t\t\t\tif (controller.signal.aborted) return;\n\t\t\t\tsetUploadFile(fileId, { status, error: nextError });\n\t\t\t},\n\t\t};\n\n\t\ttry {\n\t\t\tconst files = stagedFiles.map((file) => file.file);\n\t\t\tconst uploaded = await onUpload?.(files, uploadOptions, helpers);\n\t\t\tif (controller.signal.aborted) return;\n\t\t\tsetStagedFiles((current) =>\n\t\t\t\tcurrent.map((file) => ({ ...file, status: 'done', progress: 100 })),\n\t\t\t);\n\t\t\tif (uploaded?.length) {\n\t\t\t\tsetCreatedItems((current) => [...uploaded, ...current]);\n\t\t\t\tconst uploadedIds = uploaded.map((item) => accessors.getId(item));\n\t\t\t\tapplySelection(\n\t\t\t\t\tselectionMode === 'single'\n\t\t\t\t\t\t? uploadedIds.slice(0, 1)\n\t\t\t\t\t\t: Array.from(new Set([...uploadedIds, ...selectedIds])),\n\t\t\t\t);\n\t\t\t}\n\t\t\tclearStagedFiles();\n\t\t\tsetTab('library');\n\t\t} catch (nextError) {\n\t\t\tif (controller.signal.aborted) return;\n\t\t\tsetError(nextError);\n\t\t\tsetStagedFiles((current) =>\n\t\t\t\tcurrent.map((file) =>\n\t\t\t\t\tfile.status === 'uploading'\n\t\t\t\t\t\t? { ...file, status: 'error', error: 'Upload failed' }\n\t\t\t\t\t\t: file,\n\t\t\t\t),\n\t\t\t);\n\t\t\tonError?.(nextError);\n\t\t} finally {\n\t\t\tif (uploadControllerRef.current === controller) {\n\t\t\t\tuploadControllerRef.current = null;\n\t\t\t\tsetUploading(false);\n\t\t\t}\n\t\t}\n\t}, [\n\t\taccessors,\n\t\tapplySelection,\n\t\tclearStagedFiles,\n\t\tonError,\n\t\tonUpload,\n\t\tselectedIds,\n\t\tselectionMode,\n\t\tsetTab,\n\t\tsetUploadFile,\n\t\tstagedFiles,\n\t\tuploadOptions,\n\t\tuploading,\n\t]);\n\n\tconst cancelUpload = useCallback(() => {\n\t\tuploadControllerRef.current?.abort();\n\t\tuploadControllerRef.current = null;\n\t\tsetUploading(false);\n\t\tsetStagedFiles((current) =>\n\t\t\tcurrent.map((file) =>\n\t\t\t\tfile.status === 'uploading'\n\t\t\t\t\t? { ...file, status: 'staged', progress: 0, error: undefined }\n\t\t\t\t\t: file,\n\t\t\t),\n\t\t);\n\t}, []);\n\n\tconst updateItem = useCallback(\n\t\tasync (item: TItem, patch: MediaLibraryItemPatch): Promise<boolean> => {\n\t\t\tconst id = accessors.getId(item);\n\t\t\tconst mutationKey = `update:${id}`;\n\t\t\tconst version = (mutationVersionRef.current.get(mutationKey) ?? 0) + 1;\n\t\t\tmutationVersionRef.current.set(mutationKey, version);\n\t\t\tconst previousPatch = itemPatches[id];\n\t\t\tsetError(null);\n\t\t\tsetItemPatches((current) => ({ ...current, [id]: { ...current[id], ...patch } }));\n\t\t\ttry {\n\t\t\t\tawait onItemUpdate?.(item, patch);\n\t\t\t\treturn true;\n\t\t\t} catch (nextError) {\n\t\t\t\tif (mutationVersionRef.current.get(mutationKey) === version) {\n\t\t\t\t\tsetItemPatches((current) => {\n\t\t\t\t\t\tconst next = { ...current };\n\t\t\t\t\t\tif (previousPatch) next[id] = previousPatch;\n\t\t\t\t\t\telse delete next[id];\n\t\t\t\t\t\treturn next;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tsetError(nextError);\n\t\t\t\tonError?.(nextError);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\t[accessors, itemPatches, onError, onItemUpdate],\n\t);\n\n\tconst removeItem = useCallback(\n\t\tasync (item: TItem): Promise<boolean> => {\n\t\t\tconst id = accessors.getId(item);\n\t\t\tconst mutationKey = `delete:${id}`;\n\t\t\tconst version = (mutationVersionRef.current.get(mutationKey) ?? 0) + 1;\n\t\t\tmutationVersionRef.current.set(mutationKey, version);\n\t\t\tconst wasRemoved = removedIds.has(id);\n\t\t\tsetError(null);\n\t\t\tsetRemovedIds((current) => new Set(current).add(id));\n\t\t\ttry {\n\t\t\t\tawait onItemDelete?.(item);\n\t\t\t\tif (selectedSet.has(id)) {\n\t\t\t\t\tapplySelection(selectedIds.filter((selectedId) => selectedId !== id));\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t} catch (nextError) {\n\t\t\t\tif (\n\t\t\t\t\t!wasRemoved &&\n\t\t\t\t\tmutationVersionRef.current.get(mutationKey) === version\n\t\t\t\t) {\n\t\t\t\t\tsetRemovedIds((current) => {\n\t\t\t\t\t\tconst next = new Set(current);\n\t\t\t\t\t\tnext.delete(id);\n\t\t\t\t\t\treturn next;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tsetError(nextError);\n\t\t\t\tonError?.(nextError);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\taccessors,\n\t\t\tapplySelection,\n\t\t\tonError,\n\t\t\tonItemDelete,\n\t\t\tremovedIds,\n\t\t\tselectedIds,\n\t\t\tselectedSet,\n\t\t],\n\t);\n\n\treturn {\n\t\ttab,\n\t\tsetTab,\n\t\tview,\n\t\tsetView,\n\t\tquery,\n\t\tsetQuery,\n\t\ttype,\n\t\tsetType,\n\t\tcollection,\n\t\tsetCollection,\n\t\tsort,\n\t\tsetSort,\n\t\tdetailId,\n\t\tsetDetailId,\n\t\titems: patchedItems,\n\t\tvisibleItems,\n\t\tselectedIds,\n\t\tselectedItems,\n\t\tselectedSet,\n\t\ttoggleSelection,\n\t\tclearSelection,\n\t\tclearFilters,\n\t\tloading,\n\t\terror,\n\t\thasFilters,\n\t\ttotalCount,\n\t\tfilteredCount,\n\t\tstagedFiles,\n\t\taddFiles,\n\t\tremoveStagedFile,\n\t\tclearStagedFiles,\n\t\tupdateUploadOptions,\n\t\tuploadOptions,\n\t\tuploading,\n\t\tstartUpload,\n\t\tcancelUpload,\n\t\tupdateItem,\n\t\tremoveItem,\n\t\taccessors,\n\t};\n}\n","import {\n\tArrowLeft,\n\tCheck,\n\tFile,\n\tGrid2X2,\n\tImageIcon,\n\tInfo,\n\tLayoutList,\n\tLayers3,\n\tLock,\n\tPlay,\n\tSearch,\n\tTrash2,\n\tUploadCloud,\n\tVideo,\n\tX,\n} from 'lucide-react';\nimport { useEffect, useState, type ReactNode } from 'react';\n\nimport { Badge } from '../../../base/badge';\nimport { Button } from '../../../base/buttons';\nimport { EmptyState } from '../../../blocks/data-display';\nimport { FormField } from '../../../base/forms';\nimport { Input } from '../../../base/text-inputs';\nimport { Select, Switch } from '../../../base/choice-inputs';\nimport { Dropzone } from '../../../base/upload';\nimport { Grid, Stack } from '../../../base/structure';\nimport { Dimensions, FileSize, Percent, formatFileSize } from '../../../primitives';\nimport { DisplayLabel, Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport {\n\tformatMediaLibraryString,\n\ttype MediaLibraryStrings,\n} from '../media-library.strings';\nimport type {\n\tMediaLibraryCardProps,\n\tMediaLibraryDetailPanelProps,\n\tMediaLibraryEmptyStateProps,\n\tMediaLibraryFooterActionsProps,\n\tMediaLibraryFooterProps,\n\tMediaLibraryFooterSummaryProps,\n\tMediaLibraryListProps,\n\tMediaLibraryToolbarProps,\n\tMediaLibraryUploadPanelProps,\n\tMediaLibraryItemType,\n} from '../media-library.types';\n\nfunction typeIcon(type: MediaLibraryItemType, className?: string) {\n\tif (type === 'image') return <ImageIcon className={className ?? 'size-icon'} />;\n\tif (type === 'video') return <Video className={className ?? 'size-icon'} />;\n\treturn <File className={className ?? 'size-icon'} />;\n}\n\nfunction typeLabel(type: MediaLibraryItemType, strings: MediaLibraryStrings) {\n\tif (type === 'image') return strings.typeImage;\n\tif (type === 'video') return strings.typeVideo;\n\treturn strings.typeFile;\n}\n\nfunction usedInLabel(count: number | undefined, strings: MediaLibraryStrings) {\n\tif (!count) return strings.notUsed;\n\treturn formatMediaLibraryString(strings.usedIn, { count });\n}\n\nfunction MediaPreview({\n\tchildren,\n\ttint,\n\tclassName,\n}: {\n\tchildren: ReactNode;\n\ttint?: string;\n\tclassName?: string;\n}) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'media-library-preview relative overflow-hidden bg-muted',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={tint ? { background: tint } : undefined}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nfunction MediaPreviewImage({\n\tsrc,\n\talt,\n\ttype,\n\tclassName,\n\tloading = 'lazy',\n}: {\n\tsrc?: string;\n\talt: string;\n\ttype: MediaLibraryItemType;\n\tclassName?: string;\n\tloading?: 'eager' | 'lazy';\n}) {\n\tconst [failed, setFailed] = useState(false);\n\n\tuseEffect(() => {\n\t\tsetFailed(false);\n\t}, [src]);\n\n\tif (!src || failed) {\n\t\treturn (\n\t\t\t<div className=\"media-library-preview--fallback flex size-full items-center justify-center text-muted-foreground\">\n\t\t\t\t{typeIcon(type, 'size-6')}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<img\n\t\t\tsrc={src}\n\t\t\talt={alt}\n\t\t\tloading={loading}\n\t\t\tclassName={className}\n\t\t\tonError={() => setFailed(true)}\n\t\t/>\n\t);\n}\n\nexport function MediaLibraryEmptyState({\n\ticon,\n\ttitle,\n\tdescription,\n\taction,\n\tclassName,\n}: MediaLibraryEmptyStateProps) {\n\treturn (\n\t\t<EmptyState\n\t\t\ttitle={title}\n\t\t\tdescription={description ?? false}\n\t\t\tactions={action}\n\t\t\tmedia={icon ?? <ImageIcon className=\"size-icon\" aria-hidden=\"true\" />}\n\t\t\tmediaVariant=\"icon-soft\"\n\t\t\tpadding=\"md\"\n\t\t\tborder\n\t\t\tclassName={cn('media-library-empty-state--component min-h-64 bg-muted/20', className)}\n\t\t/>\n\t);\n}\n\nexport function MediaLibraryToolbar({\n\tquery,\n\ttype,\n\ttypeFilters,\n\tcollection,\n\tsort,\n\tview,\n\tcollections = [],\n\tstrings,\n\tonQueryChange,\n\tonTypeChange,\n\tonCollectionChange,\n\tonSortChange,\n\tonViewChange,\n\tonClearFilters,\n\ttoolbarEnd,\n}: MediaLibraryToolbarProps) {\n\tconst typeOptions = [\n\t\t{ value: 'all', label: strings.allTypes, icon: null },\n\t\t{ value: 'image', label: strings.images, icon: ImageIcon },\n\t\t{ value: 'video', label: strings.videos, icon: Video },\n\t\t{ value: 'file', label: strings.files, icon: File },\n\t].filter((option) => (typeFilters ?? ['all', 'image', 'video']).includes(option.value as typeof type));\n\tconst collectionOptions = [\n\t\t{ value: 'all', label: strings.allCollections },\n\t\t...collections.map((option) => ({\n\t\t\tvalue: option.value,\n\t\t\tlabel: String(option.label),\n\t\t})),\n\t];\n\tconst sortOptions = [\n\t\t{ value: 'newest', label: strings.sortNewest },\n\t\t{ value: 'name', label: strings.sortName },\n\t\t{ value: 'size', label: strings.sortSize },\n\t\t{ value: 'usage', label: strings.sortUsage },\n\t];\n\tconst trimmedQuery = query.trim();\n\tconst hasQuery = trimmedQuery.length > 0;\n\tconst hasActiveFilters = hasQuery || type !== 'all' || collection !== 'all';\n\n\treturn (\n\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"md\" className=\"media-library-toolbar--component\">\n\t\t\t<Stack gap=\"xs\" className=\"media-library-toolbar--search min-w-52 flex-1\">\n\t\t\t\t<Input\n\t\t\t\t\tvalue={query}\n\t\t\t\t\tonChange={(event) => onQueryChange(event.target.value)}\n\t\t\t\t\tplaceholder={strings.searchPlaceholder}\n\t\t\t\t\tstartIcon={Search}\n\t\t\t\t\tclearable\n\t\t\t\t\tonClear={() => onQueryChange('')}\n\t\t\t\t\tstrings={{ clear: strings.clearSearch }}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'rounded-radius bg-background',\n\t\t\t\t\t\thasQuery && 'border-info/60 bg-info/5 text-foreground shadow-xs ring-1 ring-info/15',\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t\t{!!hasQuery && (\n\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"xs\" wrap={false} className=\"media-library-toolbar--search-value px-space-xs\">\n\t\t\t\t\t\t<Badge tone=\"info\" className=\"max-w-full\">\n\t\t\t\t\t\t\t<Search className=\"size-icon-sm\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" className=\"text-current\">\n\t\t\t\t\t\t\t\t{strings.activeSearchLabel}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"normal\" className=\"min-w-0 truncate text-current\">\n\t\t\t\t\t\t\t\t{trimmedQuery}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t\t<div className=\"media-library-toolbar--type-toggle flex h-action items-center rounded-radius-md bg-muted p-space-2xs\" role=\"tablist\" aria-label={strings.typeFilterLabel}>\n\t\t\t\t{typeOptions.map((option) => {\n\t\t\t\t\tconst Icon = option.icon;\n\t\t\t\t\tconst active = type === option.value;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\taria-selected={active}\n\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'rounded-radius-sm shadow-none',\n\t\t\t\t\t\t\t\tactive\n\t\t\t\t\t\t\t\t\t? 'bg-background text-foreground shadow-xs hover:bg-background'\n\t\t\t\t\t\t\t\t\t: 'text-muted-foreground hover:bg-transparent hover:text-foreground',\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tonClick={() => onTypeChange(option.value as typeof type)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{Icon && <Icon className=\"size-icon-md\" />}\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" className=\"text-inherit\">{option.label}</Text>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t\t<div className=\"min-w-40\">\n\t\t\t\t<Select\n\t\t\t\t\tvalue={collection}\n\t\t\t\t\toptions={collectionOptions}\n\t\t\t\t\tonValueChange={(value) => onCollectionChange(value ?? 'all')}\n\t\t\t\t\tplaceholder={strings.collectionFilterLabel}\n\t\t\t\t\taria-label={strings.collectionFilterLabel}\n\t\t\t\t\tclassName=\"bg-background\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className=\"min-w-32\">\n\t\t\t\t<Select\n\t\t\t\t\tvalue={sort}\n\t\t\t\t\toptions={sortOptions}\n\t\t\t\t\tonValueChange={(value) => onSortChange((value ?? 'newest') as typeof sort)}\n\t\t\t\t\tplaceholder={strings.sortLabel}\n\t\t\t\t\taria-label={strings.sortLabel}\n\t\t\t\t\tclassName=\"bg-background\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className=\"media-library-toolbar--view-toggle ml-auto flex h-action items-center rounded-radius-md bg-muted p-space-2xs\">\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttone={view === 'grid' ? 'neutral' : 'secondary'}\n\t\t\t\t\tbuttonStyle={view === 'grid' ? 'solid' : 'ghost'}\n\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\tclassName={cn(view === 'grid' && 'bg-background text-foreground shadow-xs hover:bg-background')}\n\t\t\t\t\taria-label={strings.gridView}\n\t\t\t\t\tonClick={() => onViewChange('grid')}\n\t\t\t\t>\n\t\t\t\t\t<Grid2X2 className=\"size-icon-md\" />\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttone={view === 'table' ? 'neutral' : 'secondary'}\n\t\t\t\t\tbuttonStyle={view === 'table' ? 'solid' : 'ghost'}\n\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\tclassName={cn(view === 'table' && 'bg-background text-foreground shadow-xs hover:bg-background')}\n\t\t\t\t\taria-label={strings.tableView}\n\t\t\t\t\tonClick={() => onViewChange('table')}\n\t\t\t\t>\n\t\t\t\t\t<LayoutList className=\"size-icon-md\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t\t{!!hasActiveFilters && (\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tonClick={onClearFilters}\n\t\t\t\t>\n\t\t\t\t\t{strings.clearFilters}\n\t\t\t\t</Button>\n\t\t\t)}\n\t\t\t{toolbarEnd}\n\t\t</Stack>\n\t);\n}\n\nexport function MediaLibraryCard<TItem>({\n\titem,\n\tselected = false,\n\tdensity = 'comfortable',\n\tshowMeta = true,\n\taccessors,\n\tstrings,\n\tonToggle,\n\tonDetails,\n\tclassName,\n}: MediaLibraryCardProps<TItem>) {\n\tconst type = accessors.getType(item);\n\tconst name = accessors.getName(item);\n\tconst src = accessors.getSrc(item);\n\tconst alt = accessors.getAlt(item) || name;\n\tconst size = accessors.getSize(item);\n\tconst usageCount = accessors.getUsageCount(item);\n\tconst isPrivate = accessors.getPublic(item) === false;\n\tconst duration = accessors.getDuration(item);\n\n\treturn (\n\t\t<div\n\t\t\tdata-selected={selected || undefined}\n\t\t\tdata-density={density}\n\t\t\tclassName={cn(\n\t\t\t\t'media-library-card--component relative group/card overflow-hidden rounded-radius-lg border border-border/70 bg-card text-left shadow-xs transition-all',\n\t\t\t\t'hover:border-primary/30 hover:shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n\t\t\t\tselected && 'media-library-card--selected border-primary ring-1 ring-primary',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tonClick={onToggle}\n\t\t>\n\t\t\t{!!onToggle && (\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\taria-label={name}\n\t\t\t\t\taria-pressed={selected}\n\t\t\t\t\tclassName=\"media-library-card--select absolute inset-0 z-10 h-full w-full rounded-radius-lg [&:not([aria-disabled=true]):not(:disabled)]:hover:bg-transparent focus-visible:ring-inset\"\n\t\t\t\t\tonClick={(event) => { event.stopPropagation(); onToggle(); }}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<MediaPreview\n\t\t\t\ttint={accessors.getTint(item)}\n\t\t\t\tclassName={cn(density === 'compact' ? 'aspect-square' : 'aspect-[4/3]')}\n\t\t\t>\n\t\t\t\t<MediaPreviewImage src={src} alt={alt} type={type} className=\"size-full object-cover\" />\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'media-library-card--check absolute left-2 top-2 inline-flex size-icon-lg items-center justify-center rounded-radius-md border border-border bg-background/95 text-transparent opacity-0 shadow-xs backdrop-blur transition-opacity group-hover/card:opacity-100 group-focus-within/card:opacity-100',\n\t\t\t\t\t\tselected && 'bg-primary text-primary-foreground opacity-100',\n\t\t\t\t\t)}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<Check className=\"size-icon-sm\" />\n\t\t\t\t</span>\n\t\t\t\t{!!onDetails && (\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tbuttonStyle=\"solid\"\n\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\tclassName=\"media-library-card--details absolute z-20 right-2 top-2 opacity-0 shadow-sm transition-opacity group-hover/card:opacity-100 group-focus-within/card:opacity-100\"\n\t\t\t\t\t\taria-label={formatMediaLibraryString(strings.cardDetails, { name })}\n\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\tonDetails();\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Info className=\"size-icon-md\" />\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t\t{type === 'video' && !!duration && (\n\t\t\t\t\t<Badge\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tclassName=\"media-library-card--duration absolute bottom-2 left-2 bg-inverse-background text-inverse-foreground\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Play className=\"size-icon-sm fill-current\" />\n\t\t\t\t\t\t{duration}\n\t\t\t\t\t</Badge>\n\t\t\t\t)}\n\t\t\t\t{isPrivate && (\n\t\t\t\t\t<Badge\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tclassName=\"media-library-card--private absolute bottom-2 right-2 bg-card text-card-foreground\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Lock className=\"size-icon-sm\" />\n\t\t\t\t\t</Badge>\n\t\t\t\t)}\n\t\t\t</MediaPreview>\n\t\t\t<div className={cn(\n\t\t\t\t'media-library-card--body',\n\t\t\t\tdensity === 'compact' ? 'p-surface-xs' : 'p-surface',\n\t\t\t)}>\n\t\t\t<Grid columns={1} gap=\"xs\">\n\t\t\t\t<Text tag=\"div\" weight=\"semibold\" className=\"truncate\">\n\t\t\t\t\t{name}\n\t\t\t\t</Text>\n\t\t\t\t{showMeta && (\n\t\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" gap=\"md\" className=\"min-w-0\">\n\t\t\t\t\t\t<FileSize value={size} size=\"xs\" className=\"truncate\" emptyLabel={strings.unknownSize} />\n\t\t\t\t\t\t{!!usageCount && (\n\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\tclassName=\"ml-auto inline-flex items-center gap-space-xs\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Layers3 className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t\t{usageCount}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\t\t\t</Grid>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nexport function MediaLibraryList<TItem>({\n\titems,\n\tselectedSet,\n\taccessors,\n\tstrings,\n\tonToggle,\n\tonDetails,\n}: MediaLibraryListProps<TItem>) {\n\treturn (\n\t\t<div\n\t\t\tclassName=\"media-library-list--component min-w-180\"\n\t\t>\n\t\t\t<div className=\"sticky top-0 z-10 grid grid-cols-[32px_42px_minmax(0,1fr)_86px_88px_120px_72px_34px] items-center gap-space-lg border-b border-border bg-background px-row-x py-row-y\">\n\t\t\t\t<span />\n\t\t\t\t<span />\n\t\t\t\t<DisplayLabel>\n\t\t\t\t\t{strings.table.name}\n\t\t\t\t</DisplayLabel>\n\t\t\t\t<DisplayLabel>\n\t\t\t\t\t{strings.table.type}\n\t\t\t\t</DisplayLabel>\n\t\t\t\t<DisplayLabel>\n\t\t\t\t\t{strings.table.size}\n\t\t\t\t</DisplayLabel>\n\t\t\t\t<DisplayLabel>\n\t\t\t\t\t{strings.table.collection}\n\t\t\t\t</DisplayLabel>\n\t\t\t\t<DisplayLabel>\n\t\t\t\t\t{strings.table.used}\n\t\t\t\t</DisplayLabel>\n\t\t\t\t<span />\n\t\t\t</div>\n\t\t\t{items.map((item) => {\n\t\t\t\tconst id = accessors.getId(item);\n\t\t\t\tconst selected = selectedSet.has(id);\n\t\t\t\tconst type = accessors.getType(item);\n\t\t\t\tconst name = accessors.getName(item);\n\t\t\t\tconst src = accessors.getSrc(item);\n\t\t\t\tconst isPrivate = accessors.getPublic(item) === false;\n\t\t\t\treturn (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\tdata-selected={selected || undefined}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'media-library-list--row relative grid grid-cols-[32px_42px_minmax(0,1fr)_86px_88px_120px_72px_34px] items-center gap-space-lg border-b border-border/60 px-row-x py-row-y last:border-b-0',\n\t\t\t\t\t\t\t'cursor-pointer rounded-radius transition-colors hover:bg-muted/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset',\n\t\t\t\t\t\t\tselected && 'bg-primary/10',\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tonClick={() => onToggle(id)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\taria-label={name}\n\t\t\t\t\t\t\taria-pressed={selected}\n\t\t\t\t\t\t\tclassName=\"media-library-list--select absolute inset-0 z-10 h-full w-full [&:not([aria-disabled=true]):not(:disabled)]:hover:bg-transparent focus-visible:ring-inset\"\n\t\t\t\t\t\t\tonClick={(event) => { event.stopPropagation(); onToggle(id); }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'inline-flex size-icon-lg items-center justify-center rounded-radius-md border border-border text-transparent',\n\t\t\t\t\t\t\t\tselected && 'border-primary bg-primary text-primary-foreground',\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Check className=\"size-icon-sm\" />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<MediaPreview\n\t\t\t\t\t\t\ttint={accessors.getTint(item)}\n\t\t\t\t\t\t\tclassName=\"size-9 rounded-radius-md\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{src ? (\n\t\t\t\t\t\t\t\t<img src={src} alt=\"\" loading=\"lazy\" className=\"size-full object-cover\" />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<div className=\"flex size-full items-center justify-center text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t{typeIcon(type, 'size-icon')}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</MediaPreview>\n\t\t\t\t\t\t<Text tag=\"div\" weight=\"semibold\" className=\"flex min-w-0 items-center gap-space-xs truncate\">\n\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t\t{isPrivate && <Lock className=\"size-icon-sm shrink-0 text-muted-foreground\" />}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t<Badge tone=\"secondary\">{typeLabel(type, strings)}</Badge>\n\t\t\t\t\t\t<FileSize value={accessors.getSize(item)} size=\"xs\" emptyLabel={strings.unknownSize} />\n\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"truncate\">\n\t\t\t\t\t\t\t{accessors.getCollection(item) || '-'}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t\t{accessors.getUsageCount(item) ? accessors.getUsageCount(item) : '-'}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\tclassName=\"relative z-20\"\n\t\t\t\t\t\t\taria-label={formatMediaLibraryString(strings.cardDetails, { name })}\n\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\tonDetails(id);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Info className=\"size-icon-md\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n\nexport function MediaLibraryDetailPanel<TItem>({\n\titem,\n\tcollections = [],\n\taccessors,\n\tstrings,\n\tonClose,\n\tonUpdate,\n\tonRemove,\n\trenderDetail,\n}: MediaLibraryDetailPanelProps<TItem>) {\n\tif (!item) return null;\n\tconst name = accessors.getName(item);\n\tconst type = accessors.getType(item);\n\tconst src = accessors.getSrc(item);\n\tconst collection = accessors.getCollection(item) ?? collections[0]?.value ?? '';\n\tconst tags = accessors.getTags(item);\n\tconst isPublic = accessors.getPublic(item) ?? true;\n\tconst custom = renderDetail?.(item, {\n\t\taccessors,\n\t\tupdate: onUpdate,\n\t\tremove: onRemove,\n\t\tclose: onClose,\n\t});\n\tif (custom) return <>{custom}</>;\n\n\treturn (\n\t\t<aside className=\"media-library-detail-panel--component flex min-h-0 w-full flex-col border-l border-border bg-background @2xl/media-library:w-72\">\n\t\t\t<div className=\"media-library-detail-panel--header border-b border-border p-surface\">\n\t\t\t<Stack direction=\"horizontal\" align=\"center\" gap=\"md\">\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\taria-label={strings.detail.close}\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t>\n\t\t\t\t\t<ArrowLeft className=\"size-icon-md\" />\n\t\t\t\t</Button>\n\t\t\t\t<Text weight=\"semibold\">{strings.detail.title}</Text>\n\t\t\t</Stack>\n\t\t\t</div>\n\t\t\t<div className=\"media-library-detail-panel--body grid min-h-0 gap-space-xl overflow-y-auto p-surface\">\n\t\t\t\t<MediaPreview\n\t\t\t\t\ttint={accessors.getTint(item)}\n\t\t\t\t\tclassName=\"aspect-[4/3] rounded-radius border border-border\"\n\t\t\t\t>\n\t\t\t\t\t<MediaPreviewImage src={src} alt={accessors.getAlt(item) || name} type={type} className=\"size-full object-cover\" />\n\t\t\t\t\t{type === 'video' && !!accessors.getDuration(item) && (\n\t\t\t\t\t\t<Badge className=\"absolute bottom-2 right-2 bg-inverse-background text-inverse-foreground\">\n\t\t\t\t\t\t\t<Play className=\"size-icon-sm fill-current\" />\n\t\t\t\t\t\t\t{accessors.getDuration(item)}\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t)}\n\t\t\t\t</MediaPreview>\n\t\t\t\t<Text tag=\"div\" weight=\"semibold\" className=\"break-words\">\n\t\t\t\t\t{name}\n\t\t\t\t</Text>\n\t\t\t\t\t<Grid render={<dl />} columns={1} gap=\"md\" className=\"media-library-detail-panel--facts\">\n\t\t\t\t\t\t{([\n\t\t\t\t\t\t\t[strings.detail.type, typeLabel(type, strings)],\n\t\t\t\t\t\t\t[strings.detail.size, <FileSize value={accessors.getSize(item)} weight=\"medium\" emptyLabel={strings.unknownSize} />],\n\t\t\t\t\t\t\t[strings.detail.dimensions, (\n\t\t\t\t\t\t\t\t<Dimensions\n\t\t\t\t\t\t\t\t\twidth={accessors.getWidth(item)}\n\t\t\t\t\t\t\t\t\theight={accessors.getHeight(item)}\n\t\t\t\t\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\t\t\t\t\temptyLabel={strings.unknownSize}\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[strings.detail.uploaded, String(accessors.getUploadedAt(item) ?? '-')],\n\t\t\t\t\t\t\t[strings.detail.usedIn, usedInLabel(accessors.getUsageCount(item), strings)],\n\t\t\t\t\t\t] satisfies Array<[string, ReactNode]>).map(([label, value]) => (\n\t\t\t\t\t\t<Stack direction=\"horizontal\" justify=\"between\" gap=\"xl\" key={label}>\n\t\t\t\t\t\t\t<dt>\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t</dt>\n\t\t\t\t\t\t\t<dd className=\"m-0 text-right\">\n\t\t\t\t\t\t\t\t{typeof value === 'string' ? (\n\t\t\t\t\t\t\t\t\t<Text tag=\"span\" weight=\"medium\">\n\t\t\t\t\t\t\t\t\t\t{value}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\tvalue\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</dd>\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t))}\n\t\t\t\t\t</Grid>\n\t\t\t\t<FormField label={strings.detail.altText}>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tvalue={accessors.getAlt(item) ?? ''}\n\t\t\t\t\t\tplaceholder={strings.detail.altPlaceholder}\n\t\t\t\t\t\tonChange={(event) => onUpdate({ alt: event.target.value })}\n\t\t\t\t\t/>\n\t\t\t\t</FormField>\n\t\t\t\t<FormField label={strings.detail.collection}>\n\t\t\t\t\t<Select\n\t\t\t\t\t\tvalue={collection}\n\t\t\t\t\t\toptions={collections.map((option) => ({\n\t\t\t\t\t\t\tvalue: option.value,\n\t\t\t\t\t\t\tlabel: String(option.label),\n\t\t\t\t\t\t}))}\n\t\t\t\t\t\taria-label={strings.detail.collection}\n\t\t\t\t\t\tonValueChange={(value) => onUpdate({ collection: value })}\n\t\t\t\t\t/>\n\t\t\t\t</FormField>\n\t\t\t\t<FormField label={strings.detail.tags}>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tvalue={tags.join(', ')}\n\t\t\t\t\t\tplaceholder={strings.detail.tagsPlaceholder}\n\t\t\t\t\t\tonChange={(event) =>\n\t\t\t\t\t\t\tonUpdate({\n\t\t\t\t\t\t\t\ttags: event.target.value\n\t\t\t\t\t\t\t\t\t.split(',')\n\t\t\t\t\t\t\t\t\t.map((tag) => tag.trim())\n\t\t\t\t\t\t\t\t\t.filter(Boolean),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t</FormField>\n\t\t\t\t<div className=\"media-library-detail-panel--public rounded-radius border border-border bg-muted/20 p-surface\">\n\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" justify=\"between\" gap=\"xl\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<Text weight=\"semibold\">\n\t\t\t\t\t\t\t{strings.detail.public}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t\t{isPublic ? strings.detail.publicHint : strings.detail.privateHint}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<Switch\n\t\t\t\t\t\taria-label={strings.detail.public}\n\t\t\t\t\t\tchecked={isPublic}\n\t\t\t\t\t\tonValueChange={(checked) => onUpdate({ public: checked })}\n\t\t\t\t\t/>\n\t\t\t\t</Stack>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"media-library-detail-panel--actions flex flex-wrap gap-space-md\">\n\t\t\t\t\t<Button type=\"button\" tone=\"secondary\" buttonStyle=\"outline\">\n\t\t\t\t\t\t<UploadCloud className=\"size-icon-md\" />\n\t\t\t\t\t\t{strings.detail.replace}\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\ttone=\"destructive\"\n\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\tonClick={onRemove}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Trash2 className=\"size-icon-md\" />\n\t\t\t\t\t\t{strings.detail.delete}\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</aside>\n\t);\n}\n\nexport function MediaLibraryUploadPanel({\n\tstagedFiles,\n\tuploadOptions,\n\tcollections = [],\n\tuploading = false,\n\tstrings,\n\tonFiles,\n\tonRemoveFile,\n\tonOptionsChange,\n\tempty,\n}: MediaLibraryUploadPanelProps) {\n\treturn (\n\t\t<div className=\"media-library-upload-panel--component p-surface\">\n\t\t<Stack gap=\"xl\">\n\t\t\t<Dropzone\n\t\t\t\tonDrop={onFiles}\n\t\t\t\taccept=\"image/*,video/*\"\n\t\t\t\tmultiple\n\t\t\t\tsize=\"md\"\n\t\t\t\tstrings={{\n\t\t\t\t\tinstruction: strings.upload.dropTitle,\n\t\t\t\t\thelper: strings.upload.dropHint,\n\t\t\t\t\tdragOver: strings.upload.dragOver,\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t{stagedFiles.length > 0 ? (\n\t\t\t\t<Stack gap=\"md\" className=\"media-library-upload-panel--staged\">\n\t\t\t\t\t{stagedFiles.map((file) => (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={file.id}\n\t\t\t\t\t\t\tclassName=\"media-library-upload-panel--staged-file flex items-center gap-space-lg rounded-radius border border-border bg-card px-row-x py-row-y\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<MediaPreview className=\"size-10 rounded-radius-md\">\n\t\t\t\t\t\t\t\t{file.src ? (\n\t\t\t\t\t\t\t\t\t<img src={file.src} alt={file.name} className=\"size-full object-cover\" />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<div className=\"flex size-full items-center justify-center text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t{typeIcon(file.type, 'size-icon')}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</MediaPreview>\n\t\t\t\t\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t\t<div className=\"flex items-baseline gap-space-lg\">\n\t\t\t\t\t\t\t\t\t<Text weight=\"semibold\" className=\"truncate\">\n\t\t\t\t\t\t\t\t\t\t{file.name}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t<FileSize value={file.size} size=\"xs\" className=\"ml-auto shrink-0\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{(file.status === 'uploading' || file.status === 'done') && (\n\t\t\t\t\t\t\t\t\t<div className=\"mt-space-md h-1 overflow-hidden rounded-full bg-muted\">\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-full rounded-full bg-primary transition-[width]\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: `${file.progress}%` }}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{file.status === 'error' && (\n\t\t\t\t\t\t\t\t\t<Text type=\"error\">\n\t\t\t\t\t\t\t\t\t\t{file.error}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{file.status === 'done' ? (\n\t\t\t\t\t\t\t\t<Badge tone=\"success\">{strings.upload.done}</Badge>\n\t\t\t\t\t\t\t) : file.status === 'uploading' ? (\n\t\t\t\t\t\t\t\t<Percent value={Math.round(file.progress)} scaled size=\"xs\" type=\"secondary\" />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\t\tdisabled={uploading}\n\t\t\t\t\t\t\t\t\taria-label={formatMediaLibraryString(strings.upload.removeFile, {\n\t\t\t\t\t\t\t\t\t\tname: file.name,\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\tonClick={() => onRemoveFile(file.id)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<X className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</Stack>\n\t\t\t) : (\n\t\t\t\tempty\n\t\t\t)}\n\t\t\t<div className=\"media-library-upload-panel--options grid gap-space-lg rounded-radius border border-border bg-muted/20 p-surface @2xl/media-library:grid-cols-[minmax(0,1fr)_minmax(0,1fr)_auto]\">\n\t\t\t\t<FormField label={strings.upload.collection}>\n\t\t\t\t\t<Select\n\t\t\t\t\t\tvalue={uploadOptions.collection ?? collections[0]?.value}\n\t\t\t\t\t\toptions={collections.map((option) => ({\n\t\t\t\t\t\t\tvalue: option.value,\n\t\t\t\t\t\t\tlabel: String(option.label),\n\t\t\t\t\t\t}))}\n\t\t\t\t\t\taria-label={strings.upload.collection}\n\t\t\t\t\t\tonValueChange={(value) => onOptionsChange({ collection: value })}\n\t\t\t\t\t/>\n\t\t\t\t</FormField>\n\t\t\t\t<FormField label={strings.upload.tags}>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tvalue={uploadOptions.tags.join(', ')}\n\t\t\t\t\t\tplaceholder={strings.upload.tagsPlaceholder}\n\t\t\t\t\t\tonChange={(event) =>\n\t\t\t\t\t\t\tonOptionsChange({\n\t\t\t\t\t\t\t\ttags: event.target.value\n\t\t\t\t\t\t\t\t\t.split(',')\n\t\t\t\t\t\t\t\t\t.map((tag) => tag.trim())\n\t\t\t\t\t\t\t\t\t.filter(Boolean),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t</FormField>\n\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" justify=\"between\" gap=\"xl\" className=\"@2xl/media-library:self-end\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<Text weight=\"semibold\">\n\t\t\t\t\t\t\t{strings.upload.public}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t\t{strings.upload.publicHint}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<Switch\n\t\t\t\t\t\taria-label={strings.upload.public}\n\t\t\t\t\t\tchecked={uploadOptions.public}\n\t\t\t\t\t\tonValueChange={(checked) => onOptionsChange({ public: checked })}\n\t\t\t\t\t/>\n\t\t\t\t</Stack>\n\t\t\t</div>\n\t\t</Stack>\n\t\t</div>\n\t);\n}\n\nexport function MediaLibraryFooterSummary({\n\ttab,\n\tselectedIds,\n\tselectionMode,\n\tstagedFiles,\n\tstrings,\n\tonClearSelection,\n\tclassName,\n}: MediaLibraryFooterSummaryProps) {\n\tconst selectedCount = selectedIds.length;\n\tconst stagedSize = stagedFiles.reduce((sum, file) => sum + file.size, 0);\n\tconst stagedCount = stagedFiles.length;\n\tconst summaryClassName = cn(\n\t\t'media-library-footer-summary--component flex min-w-0 items-center gap-space-lg',\n\t\tclassName,\n\t);\n\n\tif (tab === 'upload') {\n\t\treturn (\n\t\t\t<div className={summaryClassName} aria-live=\"polite\">\n\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"truncate\">\n\t\t\t\t\t{stagedCount === 0\n\t\t\t\t\t\t? strings.footer.noFiles\n\t\t\t\t\t\t: formatMediaLibraryString(strings.footer.stagedSummary, {\n\t\t\t\t\t\t\tcount: stagedCount,\n\t\t\t\t\t\t\tsize: formatFileSize(stagedSize) ?? strings.unknownSize,\n\t\t\t\t\t\t})}\n\t\t\t\t</Text>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={summaryClassName} aria-live=\"polite\">\n\t\t\t{selectedCount > 0 ? (\n\t\t\t\t<>\n\t\t\t\t\t<Text weight=\"semibold\" className=\"whitespace-nowrap\">\n\t\t\t\t\t\t{formatMediaLibraryString(strings.footer.selectedCount, {\n\t\t\t\t\t\t\tcount: selectedCount,\n\t\t\t\t\t\t})}\n\t\t\t\t\t</Text>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tonClick={onClearSelection}\n\t\t\t\t\t>\n\t\t\t\t\t\t{strings.footer.clear}\n\t\t\t\t\t</Button>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"truncate\">\n\t\t\t\t\t{selectionMode === 'single' ? strings.footer.pickOne : strings.footer.pickMany}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nexport function MediaLibraryFooterActions<TItem>({\n\ttab,\n\tselectedItems,\n\tselectedIds,\n\tstagedFiles,\n\tuploading = false,\n\tstrings,\n\tconfirmLabel,\n\tcancelLabel,\n\tonCancel,\n\tonConfirm,\n\tonUpload,\n\tonCancelUpload,\n\tclassName,\n}: MediaLibraryFooterActionsProps<TItem>) {\n\tconst selectedCount = selectedIds.length;\n\tconst stagedCount = stagedFiles.length;\n\n\tif (tab === 'upload') {\n\t\treturn (\n\t\t\t<div className={cn('media-library-footer-actions--component flex min-w-0 flex-col-reverse gap-space-md @md/media-library:flex-row @md/media-library:justify-end', className)}>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\tdisabled={uploading}\n\t\t\t\t\tonClick={onCancelUpload}\n\t\t\t\t>\n\t\t\t\t\t{cancelLabel ?? strings.footer.cancel}\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tdisabled={stagedCount === 0 || uploading}\n\t\t\t\t\tonClick={onUpload}\n\t\t\t\t\tloading={uploading}\n\t\t\t\t\tstrings={{ loading: strings.footer.uploading }}\n\t\t\t\t>\n\t\t\t\t\t{stagedCount <= 1\n\t\t\t\t\t\t? strings.footer.upload\n\t\t\t\t\t\t: formatMediaLibraryString(strings.footer.uploadMany, { count: stagedCount })}\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={cn('media-library-footer-actions--component flex min-w-0 flex-col-reverse gap-space-md @md/media-library:flex-row @md/media-library:justify-end', className)}>\n\t\t\t<Button\n\t\t\t\ttype=\"button\"\n\t\t\t\ttone=\"secondary\"\n\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\tonClick={onCancel}\n\t\t\t>\n\t\t\t\t{cancelLabel ?? strings.footer.cancel}\n\t\t\t</Button>\n\t\t\t<Button\n\t\t\t\ttype=\"button\"\n\t\t\t\tdisabled={selectedCount === 0}\n\t\t\t\tonClick={onConfirm}\n\t\t\t>\n\t\t\t\t{confirmLabel ??\n\t\t\t\t\t(selectedCount === 0\n\t\t\t\t\t\t? strings.footer.confirmEmpty\n\t\t\t\t\t\t: selectedItems.length === 1\n\t\t\t\t\t\t\t? strings.footer.confirmOne\n\t\t\t\t\t\t\t: formatMediaLibraryString(strings.footer.confirmMany, {\n\t\t\t\t\t\t\t\tcount: selectedCount,\n\t\t\t\t\t\t\t}))}\n\t\t\t</Button>\n\t\t</div>\n\t);\n}\n\nexport function MediaLibraryFooter<TItem>({\n\ttab,\n\tselectedItems,\n\tselectedIds,\n\tselectionMode,\n\tstagedFiles,\n\tuploading = false,\n\tstrings,\n\tconfirmLabel,\n\tcancelLabel,\n\tonCancel,\n\tonConfirm,\n\tonClearSelection,\n\tonUpload,\n\tonCancelUpload,\n\tchrome = 'section',\n\tclassName,\n}: MediaLibraryFooterProps<TItem>) {\n\treturn (\n\t\t<footer\n\t\t\tclassName={cn(\n\t\t\t\t'media-library-footer--component',\n\t\t\t\tchrome === 'section' && 'border-t border-border bg-background p-surface',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<div className=\"flex min-w-0 flex-col gap-space-lg @md/media-library:flex-row @md/media-library:justify-between\">\n\t\t\t<MediaLibraryFooterSummary\n\t\t\t\ttab={tab}\n\t\t\t\tselectedIds={selectedIds}\n\t\t\t\tselectionMode={selectionMode}\n\t\t\t\tstagedFiles={stagedFiles}\n\t\t\t\tstrings={strings}\n\t\t\t\tonClearSelection={onClearSelection}\n\t\t\t/>\n\t\t\t<MediaLibraryFooterActions\n\t\t\t\ttab={tab}\n\t\t\t\tselectedItems={selectedItems}\n\t\t\t\tselectedIds={selectedIds}\n\t\t\t\tstagedFiles={stagedFiles}\n\t\t\t\tuploading={uploading}\n\t\t\t\tstrings={strings}\n\t\t\t\tconfirmLabel={confirmLabel}\n\t\t\t\tcancelLabel={cancelLabel}\n\t\t\t\tonCancel={onCancel}\n\t\t\t\tonConfirm={onConfirm}\n\t\t\t\tonUpload={onUpload}\n\t\t\t\tonCancelUpload={onCancelUpload}\n\t\t\t/>\n\t\t\t</div>\n\t\t</footer>\n\t);\n}\n","import { ImageIcon, UploadCloud } from 'lucide-react';\nimport { createContext, useContext, useMemo, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { Button } from '../../base/buttons';\nimport { ErrorState, LoadingState } from '../../base/feedback';\nimport { Stack } from '../../base/structure';\nimport { ActionDialog } from '../overlays';\nimport { Number as NumberValue } from '../../primitives';\nimport { Text } from '../../typography';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { defaultMediaLibraryStrings, formatMediaLibraryString } from './media-library.strings';\nimport type { MediaLibraryCollectionOption, MediaLibraryDialogProps, MediaLibraryProps } from './media-library.types';\nimport { useMediaLibrary } from './hooks';\nimport {\n\tMediaLibraryCard,\n\tMediaLibraryDetailPanel,\n\tMediaLibraryEmptyState,\n\tMediaLibraryFooter,\n\tMediaLibraryFooterActions,\n\tMediaLibraryFooterSummary,\n\tMediaLibraryList,\n\tMediaLibraryToolbar,\n\tMediaLibraryUploadPanel,\n} from './partials/media-library-partials';\n\ninterface MediaLibraryFooterPortalTarget {\n\telement: HTMLElement | null;\n}\n\nconst MediaLibraryFooterPortalContext = createContext<MediaLibraryFooterPortalTarget | null>(null);\n\nfunction useResolvedCollections<TItem>(\n\texplicit: readonly MediaLibraryCollectionOption[] | undefined,\n\titems: readonly TItem[],\n\tgetCollection: (item: TItem) => string | undefined,\n) {\n\treturn useMemo(() => {\n\t\tif (explicit) return explicit;\n\t\tconst seen = new Set<string>();\n\t\tfor (const item of items) {\n\t\t\tconst collection = getCollection(item);\n\t\t\tif (collection) seen.add(collection);\n\t\t}\n\t\treturn Array.from(seen).map((value) => ({ value, label: value }));\n\t}, [explicit, getCollection, items]);\n}\n\nexport function MediaLibrary<TItem = import('./media-library.types').MediaLibraryItem>({\n\ttitle,\n\tdescription,\n\tconfirmLabel,\n\tcancelLabel,\n\tselectionMode = 'multiple',\n\tdensity = 'comfortable',\n\tshowMeta = true,\n\tallowUpload = true,\n\ttypeFilters,\n\tconfirmOnSelect = false,\n\tonConfirm,\n\tonCancel,\n\tonClose,\n\tstrings: stringsProp,\n\tslots,\n\theightClassName,\n\tclassName,\n\titems,\n\tfetcher,\n\taccessors,\n\tcollections,\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\tonItemUpdate,\n\tonItemDelete,\n\tonUpload,\n\tonError,\n\ttab,\n\tdefaultTab,\n\tonTabChange,\n\tview,\n\tdefaultView,\n\tonViewChange,\n\tquery,\n\tdefaultQuery,\n\tonQueryChange,\n\ttype,\n\tdefaultType,\n\tonTypeChange,\n\tcollection,\n\tdefaultCollection,\n\tonCollectionChange,\n\tsort,\n\tdefaultSort,\n\tonSortChange,\n\tuploadOptions,\n\tdefaultUploadOptions,\n\tonUploadOptionsChange,\n\t...props\n}: MediaLibraryProps<TItem>) {\n\tconst strings = useStrings(defaultMediaLibraryStrings, stringsProp);\n\tconst state = useMediaLibrary<TItem>({\n\t\titems,\n\t\tfetcher,\n\t\taccessors,\n\t\tcollections,\n\t\tselectionMode,\n\t\tvalue,\n\t\tdefaultValue,\n\t\tonValueChange,\n\t\tonItemUpdate,\n\t\tonItemDelete,\n\t\tonUpload,\n\t\tonError,\n\t\ttab,\n\t\tdefaultTab,\n\t\tonTabChange,\n\t\tview,\n\t\tdefaultView,\n\t\tonViewChange,\n\t\tquery,\n\t\tdefaultQuery,\n\t\tonQueryChange,\n\t\ttype,\n\t\tdefaultType,\n\t\tonTypeChange,\n\t\tcollection,\n\t\tdefaultCollection,\n\t\tonCollectionChange,\n\t\tsort,\n\t\tdefaultSort,\n\t\tonSortChange,\n\t\tuploadOptions,\n\t\tdefaultUploadOptions,\n\t\tonUploadOptionsChange,\n\t});\n\tconst resolvedCollections = useResolvedCollections(collections, state.items, state.accessors.getCollection);\n\tconst activeTab = allowUpload ? state.tab : 'library';\n\tconst detailItem = state.detailId\n\t\t? (state.items.find((item) => state.accessors.getId(item) === state.detailId) ?? null)\n\t\t: null;\n\tconst footerPortal = useContext(MediaLibraryFooterPortalContext);\n\tconst usesDefaultFooter = !slots?.footer;\n\tconst dialogSelectionSummary =\n\t\tfooterPortal && usesDefaultFooter ? (\n\t\t\t<MediaLibraryFooterSummary\n\t\t\t\ttab={activeTab}\n\t\t\t\tselectedIds={state.selectedIds}\n\t\t\t\tselectionMode={selectionMode}\n\t\t\t\tstagedFiles={state.stagedFiles}\n\t\t\t\tstrings={strings}\n\t\t\t\tonClearSelection={state.clearSelection}\n\t\t\t\tclassName=\"media-library-dialog--selection-summary shrink-0 justify-end\"\n\t\t\t/>\n\t\t) : null;\n\tconst hasHeaderIdentity = Boolean(title || description || slots?.headerStart);\n\tconst hasHeaderControls = Boolean(allowUpload || slots?.headerEnd || dialogSelectionSummary);\n\tconst hasHeader = hasHeaderIdentity || hasHeaderControls;\n\n\tconst confirm = () => {\n\t\tonConfirm?.(state.selectedItems, state.selectedIds);\n\t\tonClose?.();\n\t};\n\tconst cancel = () => {\n\t\tonCancel?.();\n\t\tonClose?.();\n\t};\n\tconst confirmItem = (item: TItem) => {\n\t\tconst id = state.accessors.getId(item);\n\t\tstate.toggleSelection(id);\n\t\tif (confirmOnSelect) {\n\t\t\tonConfirm?.([item], [id]);\n\t\t\tonClose?.();\n\t\t}\n\t};\n\tconst trimmedQuery = state.query.trim();\n\tconst countLabel =\n\t\ttrimmedQuery.length > 0\n\t\t\t? formatMediaLibraryString(strings.countSearch, {\n\t\t\t\t\tcount: state.filteredCount,\n\t\t\t\t\ttotal: state.totalCount,\n\t\t\t\t\tquery: trimmedQuery,\n\t\t\t\t})\n\t\t\t: state.filteredCount === state.totalCount\n\t\t\t\t? formatMediaLibraryString(strings.countAll, {\n\t\t\t\t\t\tcount: state.totalCount,\n\t\t\t\t\t})\n\t\t\t\t: formatMediaLibraryString(strings.countFiltered, {\n\t\t\t\t\t\tcount: state.filteredCount,\n\t\t\t\t\t\ttotal: state.totalCount,\n\t\t\t\t\t});\n\tconst footer =\n\t\tslots?.footer ??\n\t\t(footerPortal ? (\n\t\t\t<MediaLibraryFooterActions\n\t\t\t\ttab={activeTab}\n\t\t\t\tselectedItems={state.selectedItems}\n\t\t\t\tselectedIds={state.selectedIds}\n\t\t\t\tstagedFiles={state.stagedFiles}\n\t\t\t\tuploading={state.uploading}\n\t\t\t\tstrings={strings}\n\t\t\t\tconfirmLabel={confirmLabel}\n\t\t\t\tcancelLabel={cancelLabel}\n\t\t\t\tonCancel={cancel}\n\t\t\t\tonConfirm={confirm}\n\t\t\t\tonUpload={state.startUpload}\n\t\t\t\tonCancelUpload={() => {\n\t\t\t\t\tstate.cancelUpload();\n\t\t\t\t\tstate.clearStagedFiles();\n\t\t\t\t\tstate.setTab('library');\n\t\t\t\t}}\n\t\t\t\tclassName=\"ml-auto\"\n\t\t\t/>\n\t\t) : (\n\t\t\t<MediaLibraryFooter\n\t\t\t\ttab={activeTab}\n\t\t\t\tselectedItems={state.selectedItems}\n\t\t\t\tselectedIds={state.selectedIds}\n\t\t\t\tselectionMode={selectionMode}\n\t\t\t\tstagedFiles={state.stagedFiles}\n\t\t\t\tuploading={state.uploading}\n\t\t\t\tstrings={strings}\n\t\t\t\tconfirmLabel={confirmLabel}\n\t\t\t\tcancelLabel={cancelLabel}\n\t\t\t\tonCancel={cancel}\n\t\t\t\tonConfirm={confirm}\n\t\t\t\tonClearSelection={state.clearSelection}\n\t\t\t\tonUpload={state.startUpload}\n\t\t\t\tonCancelUpload={() => {\n\t\t\t\t\tstate.cancelUpload();\n\t\t\t\t\tstate.clearStagedFiles();\n\t\t\t\t\tstate.setTab('library');\n\t\t\t\t}}\n\t\t\t/>\n\t\t));\n\n\treturn (\n\t\t/*\n\t\t * The shell is a named container, and its own chrome switches on the\n\t\t * container's width rather than the viewport's. A media picker is routinely\n\t\t * mounted in a drawer or a split pane on a wide screen; keyed to the\n\t\t * viewport, the header laid out for desktop inside a 400px shell and the\n\t\t * tab group was clipped by `overflow-hidden` below.\n\t\t */\n\t\t<section\n\t\t\tclassName={cn(\n\t\t\t\t'media-library--component @container/media-library flex min-h-0 flex-col overflow-hidden rounded-radius border border-border bg-background',\n\t\t\t\theightClassName ?? 'h-190 max-h-[calc(100vh-7rem)]',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{hasHeader && (\n\t\t\t\t<header className=\"media-library--header flex flex-col gap-space-lg border-b border-border p-surface @2xl/media-library:flex-row @2xl/media-library:items-center @2xl/media-library:justify-between\">\n\t\t\t\t\t\t{hasHeaderIdentity && (\n\t\t\t\t\t\t\t<Stack direction=\"horizontal\" align=\"start\" gap=\"lg\" className=\"min-w-0\">\n\t\t\t\t\t\t\t\t{slots?.headerStart}\n\t\t\t\t\t\t\t\t{(title || description) && (\n\t\t\t\t\t\t\t\t\t<div className=\"min-w-0\">\n\t\t\t\t\t\t\t\t\t\t{!!title && (\n\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"div\" weight=\"semibold\">\n\t\t\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{!!description && (\n\t\t\t\t\t\t\t\t\t\t\t<Text type=\"secondary\" className=\"mt-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{hasHeaderControls && (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'media-library--header-controls flex min-w-0 flex-wrap items-center gap-space-md',\n\t\t\t\t\t\t\t\t\tdialogSelectionSummary ? 'flex-1 justify-between' : '@2xl/media-library:justify-end',\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<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"md\" className=\"min-w-0\">\n\t\t\t\t\t\t\t\t\t{allowUpload && (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"media-library--tabs flex items-center rounded-radius-md bg-muted p-space-2xs\"\n\t\t\t\t\t\t\t\t\t\t\trole=\"tablist\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-selected={activeTab === 'library'}\n\t\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'rounded-radius-sm shadow-none',\n\t\t\t\t\t\t\t\t\t\t\t\t\tactiveTab === 'library'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'bg-background text-foreground shadow-xs hover:bg-background'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'text-muted-foreground hover:bg-transparent hover:text-foreground',\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => state.setTab('library')}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<ImageIcon className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t\t{strings.tabs.library}\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-selected={activeTab === 'upload'}\n\t\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'rounded-radius-sm shadow-none',\n\t\t\t\t\t\t\t\t\t\t\t\t\tactiveTab === 'upload'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'bg-background text-foreground shadow-xs hover:bg-background'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'text-muted-foreground hover:bg-transparent hover:text-foreground',\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => state.setTab('upload')}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<UploadCloud className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t\t{strings.tabs.upload}\n\t\t\t\t\t\t\t\t\t\t\t\t{state.stagedFiles.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NumberValue\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={state.stagedFiles.length}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\talign=\"center\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"rounded-full bg-background/20 px-1.5\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{slots?.headerEnd}\n\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t{dialogSelectionSummary}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t</header>\n\t\t\t)}\n\n\t\t\t<div className=\"media-library--body flex min-h-0 flex-1\">\n\t\t\t\t{activeTab === 'upload' ? (\n\t\t\t\t\t<div className=\"min-w-0 flex-1 overflow-y-auto\">\n\t\t\t\t\t\t<MediaLibraryUploadPanel\n\t\t\t\t\t\t\tstagedFiles={state.stagedFiles}\n\t\t\t\t\t\t\tuploadOptions={state.uploadOptions}\n\t\t\t\t\t\t\tcollections={resolvedCollections}\n\t\t\t\t\t\t\tuploading={state.uploading}\n\t\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t\t\tonFiles={state.addFiles}\n\t\t\t\t\t\t\tonRemoveFile={state.removeStagedFile}\n\t\t\t\t\t\t\tonOptionsChange={state.updateUploadOptions}\n\t\t\t\t\t\t\tempty={slots?.uploadEmpty}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'media-library--library min-w-0 flex-1 flex-col',\n\t\t\t\t\t\t\tdetailItem ? 'hidden @2xl/media-library:flex' : 'flex',\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"media-library--toolbar border-b border-border/70 p-surface\">\n\t\t\t\t\t\t\t<MediaLibraryToolbar\n\t\t\t\t\t\t\t\tquery={state.query}\n\t\t\t\t\t\t\t\ttype={state.type}\n\t\t\t\t\t\t\t\ttypeFilters={typeFilters}\n\t\t\t\t\t\t\t\tcollection={state.collection}\n\t\t\t\t\t\t\t\tsort={state.sort}\n\t\t\t\t\t\t\t\tview={state.view}\n\t\t\t\t\t\t\t\tcollections={resolvedCollections}\n\t\t\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t\t\t\tonQueryChange={state.setQuery}\n\t\t\t\t\t\t\t\tonTypeChange={state.setType}\n\t\t\t\t\t\t\t\tonCollectionChange={state.setCollection}\n\t\t\t\t\t\t\t\tonSortChange={state.setSort}\n\t\t\t\t\t\t\t\tonViewChange={state.setView}\n\t\t\t\t\t\t\t\tonClearFilters={state.clearFilters}\n\t\t\t\t\t\t\t\ttoolbarEnd={slots?.toolbarEnd}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"mt-space-md\" aria-live=\"polite\">\n\t\t\t\t\t\t\t\t{countLabel}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\trole=\"region\"\n\t\t\t\t\t\t\taria-label={strings.resultsLabel}\n\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\tclassName=\"media-library--results min-h-0 flex-1 overflow-y-auto p-surface focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{state.loading ? (\n\t\t\t\t\t\t\t\t(slots?.loading ?? <LoadingState className=\"min-h-64\" label={strings.loading} />)\n\t\t\t\t\t\t\t) : state.error ? (\n\t\t\t\t\t\t\t\t(slots?.error ?? <ErrorState title={strings.errorTitle} description={strings.errorDescription} />)\n\t\t\t\t\t\t\t) : state.visibleItems.length === 0 ? (\n\t\t\t\t\t\t\t\t(slots?.empty ?? (\n\t\t\t\t\t\t\t\t\t<MediaLibraryEmptyState\n\t\t\t\t\t\t\t\t\t\ttitle={state.hasFilters ? strings.emptyFilteredTitle : strings.emptyLibraryTitle}\n\t\t\t\t\t\t\t\t\t\tdescription={state.hasFilters ? strings.emptyFilteredDescription : strings.emptyLibraryDescription}\n\t\t\t\t\t\t\t\t\t\taction={\n\t\t\t\t\t\t\t\t\t\t\tstate.hasFilters ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<Button type=\"button\" tone=\"secondary\" buttonStyle=\"outline\" onClick={state.clearFilters}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{strings.clearFilters}\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t) : allowUpload ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<Button type=\"button\" onClick={() => state.setTab('upload')}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<UploadCloud className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t{strings.uploadMedia}\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t) : undefined\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t) : state.view === 'table' ? (\n\t\t\t\t\t\t\t\t<div className=\"overflow-x-auto\">\n\t\t\t\t\t\t\t\t\t<MediaLibraryList\n\t\t\t\t\t\t\t\t\t\titems={state.visibleItems}\n\t\t\t\t\t\t\t\t\t\tselectedSet={state.selectedSet}\n\t\t\t\t\t\t\t\t\t\tselectionMode={selectionMode}\n\t\t\t\t\t\t\t\t\t\taccessors={state.accessors}\n\t\t\t\t\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t\t\t\t\t\tonToggle={(id) => {\n\t\t\t\t\t\t\t\t\t\t\tconst item = state.items.find((candidate) => state.accessors.getId(candidate) === id);\n\t\t\t\t\t\t\t\t\t\t\tif (item) confirmItem(item);\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tonDetails={state.setDetailId}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'media-library--grid grid min-w-0 gap-space-lg',\n\t\t\t\t\t\t\t\t\t\tdensity === 'compact'\n\t\t\t\t\t\t\t\t\t\t\t? 'grid-cols-[repeat(auto-fill,minmax(136px,1fr))]'\n\t\t\t\t\t\t\t\t\t\t\t: 'grid-cols-[repeat(auto-fill,minmax(168px,1fr))]',\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{state.visibleItems.map((item) => {\n\t\t\t\t\t\t\t\t\t\tconst id = state.accessors.getId(item);\n\t\t\t\t\t\t\t\t\t\tconst ctx = {\n\t\t\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\t\tselected: state.selectedSet.has(id),\n\t\t\t\t\t\t\t\t\t\t\tselectionMode,\n\t\t\t\t\t\t\t\t\t\t\taccessors: state.accessors,\n\t\t\t\t\t\t\t\t\t\t\ttoggle: () => confirmItem(item),\n\t\t\t\t\t\t\t\t\t\t\topenDetails: () => state.setDetailId(id),\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\tconst rendered = slots?.renderItem?.(item, ctx);\n\t\t\t\t\t\t\t\t\t\treturn rendered ? (\n\t\t\t\t\t\t\t\t\t\t\t<div key={id}>{rendered}</div>\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<MediaLibraryCard\n\t\t\t\t\t\t\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\t\t\t\t\t\t\titem={item}\n\t\t\t\t\t\t\t\t\t\t\t\tselected={ctx.selected}\n\t\t\t\t\t\t\t\t\t\t\t\tdensity={density}\n\t\t\t\t\t\t\t\t\t\t\t\tshowMeta={showMeta}\n\t\t\t\t\t\t\t\t\t\t\t\tselectionMode={selectionMode}\n\t\t\t\t\t\t\t\t\t\t\t\taccessors={state.accessors}\n\t\t\t\t\t\t\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t\t\t\t\t\t\t\tonToggle={ctx.toggle}\n\t\t\t\t\t\t\t\t\t\t\t\tonDetails={ctx.openDetails}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{activeTab === 'library' && (\n\t\t\t\t\t<MediaLibraryDetailPanel\n\t\t\t\t\t\titem={detailItem}\n\t\t\t\t\t\tcollections={resolvedCollections}\n\t\t\t\t\t\taccessors={state.accessors}\n\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t\tonClose={() => state.setDetailId(null)}\n\t\t\t\t\t\tonUpdate={(patch) => (detailItem ? state.updateItem(detailItem, patch) : Promise.resolve(false))}\n\t\t\t\t\t\tonRemove={async () => {\n\t\t\t\t\t\t\tif (!detailItem) return false;\n\t\t\t\t\t\t\tconst removed = await state.removeItem(detailItem);\n\t\t\t\t\t\t\tif (removed) state.setDetailId(null);\n\t\t\t\t\t\t\treturn removed;\n\t\t\t\t\t\t}}\n\t\t\t\t\t\trenderDetail={slots?.renderDetail}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{footerPortal ? (footerPortal.element ? createPortal(footer, footerPortal.element) : null) : footer}\n\t\t</section>\n\t);\n}\n\nexport function MediaLibraryDialog<TItem = import('./media-library.types').MediaLibraryItem>({\n\topen,\n\tonOpenChange,\n\ttrigger,\n\tdialogTitle,\n\tdialogDescription,\n\tonClose,\n\tclassName,\n\tdialogClassName,\n\tcontentClassName,\n\tcloseOnEscape = true,\n\tcloseOnBackdropClick = true,\n\t...props\n}: MediaLibraryDialogProps<TItem>) {\n\tconst strings = useStrings(defaultMediaLibraryStrings, props.strings);\n\tconst [internalOpen, setInternalOpen] = useState(false);\n\tconst [footerElement, setFooterElement] = useState<HTMLDivElement | null>(null);\n\tconst isOpenControlled = open !== undefined;\n\tconst resolvedOpen = isOpenControlled ? open : internalOpen;\n\tconst handleOpenChange = (nextOpen: boolean) => {\n\t\tif (!isOpenControlled) setInternalOpen(nextOpen);\n\t\tonOpenChange?.(nextOpen);\n\t};\n\tconst closeMediaLibrary = () => {\n\t\thandleOpenChange(false);\n\t\tonClose?.();\n\t};\n\n\treturn (\n\t\t<MediaLibraryFooterPortalContext.Provider value={{ element: footerElement }}>\n\t\t\t<ActionDialog\n\t\t\t\topen={resolvedOpen}\n\t\t\t\tonOpenChange={handleOpenChange}\n\t\t\t\tonClose={onClose}\n\t\t\t\ttrigger={trigger}\n\t\t\t\ttitle={dialogTitle ?? strings.title}\n\t\t\t\tdescription={dialogDescription ?? strings.description}\n\t\t\t\tsize=\"full\"\n\t\t\t\tshowCancel={false}\n\t\t\t\tshowConfirm={false}\n\t\t\t\tfooter={<div ref={setFooterElement} className=\"media-library-dialog--footer @container/media-library w-full\" />}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'media-library-dialog--component max-h-[calc(100vh-2rem)] max-w-[min(1060px,calc(100vw-2rem))] sm:max-w-[min(1060px,calc(100vw-2rem))]',\n\t\t\t\t\tdialogClassName,\n\t\t\t\t)}\n\t\t\t\tcontentClassName={cn('media-library-dialog--body flex min-h-0 flex-col overflow-hidden p-0', contentClassName)}\n\t\t\t\tcloseOnBackdropClick={closeOnBackdropClick}\n\t\t\t\tcloseOnEscape={closeOnEscape}\n\t\t\t>\n\t\t\t\t<MediaLibrary\n\t\t\t\t\t{...(props as MediaLibraryProps<TItem>)}\n\t\t\t\t\tonClose={closeMediaLibrary}\n\t\t\t\t\tclassName={cn('media-library-dialog--library rounded-none border-0', className)}\n\t\t\t\t\theightClassName={props.heightClassName ?? 'min-h-0 flex-1'}\n\t\t\t\t\tstrings={props.strings}\n\t\t\t\t/>\n\t\t\t</ActionDialog>\n\t\t</MediaLibraryFooterPortalContext.Provider>\n\t);\n}\n","import { ArrowLeft, ArrowRight, File, ImagePlus, Lock, Play, Plus, Star, Trash2, X } from 'lucide-react';\n\nimport { Badge } from '../../base/badge';\nimport { Button } from '../../base/buttons';\nimport { Stack } from '../../base/structure';\nimport { FileSize } from '../../primitives';\nimport { Text } from '../../typography';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { defaultMediaLibraryStrings, formatMediaLibraryString } from './media-library.strings';\nimport type { MediaResourceGalleryItemRenderContext, MediaResourceGalleryProps } from './media-library.types';\nimport { resolveMediaLibraryAccessors } from './hooks';\nimport { MediaLibraryEmptyState } from './partials';\n\nfunction moveItem<TItem>(items: readonly TItem[], from: number, to: number) {\n\tconst next = items.slice();\n\tconst [item] = next.splice(from, 1);\n\tif (item === undefined) return next;\n\tnext.splice(to, 0, item);\n\treturn next;\n}\n\nexport function MediaResourceGallery<TItem = import('./media-library.types').MediaLibraryItem>({\n\titems,\n\taccessors: accessorsProp,\n\ttitle,\n\tdescription,\n\tprimaryId,\n\tonPrimaryChange,\n\tonRemove,\n\tonReorder,\n\tonAdd,\n\tmaxItems,\n\tlayout = 'field',\n\tdensity = 'comfortable',\n\treadOnly = false,\n\tempty,\n\taction,\n\trenderItem,\n\tstrings: stringsProp,\n\tclassName,\n\t...props\n}: MediaResourceGalleryProps<TItem>) {\n\tconst strings = useStrings(defaultMediaLibraryStrings, stringsProp);\n\tconst accessors = resolveMediaLibraryAccessors(accessorsProp);\n\tconst total = items.length;\n\tconst resolvedPrimaryId = primaryId ?? (total > 0 ? accessors.getId(items[0] as TItem) : undefined);\n\tconst canAdd = !readOnly && Boolean(onAdd) && (maxItems === undefined || total < maxItems);\n\tconst defaultAction =\n\t\tcanAdd && (layout === 'field' || total > 0) ? (\n\t\t\t<Button type=\"button\" tone=\"secondary\" buttonStyle=\"outline\" icon={Plus} onClick={onAdd}>\n\t\t\t\t{strings.gallery.add}\n\t\t\t</Button>\n\t\t) : maxItems !== undefined && total >= maxItems ? (\n\t\t\t<Badge tone=\"secondary\">{strings.gallery.maxReached}</Badge>\n\t\t) : null;\n\n\tconst move = (from: number, to: number) => {\n\t\tif (to < 0 || to >= total || from === to) return;\n\t\tconst nextItems = moveItem(items, from, to);\n\t\tonReorder?.(\n\t\t\tnextItems.map((item) => accessors.getId(item)),\n\t\t\tnextItems,\n\t\t);\n\t};\n\n\tconst hasHeader = Boolean(title || description || action || defaultAction);\n\tconst shouldShowEmptyState = total === 0 && layout !== 'field';\n\n\tconst renderAddTile = () => {\n\t\tif (!canAdd || layout !== 'field') return null;\n\t\treturn (\n\t\t\t<Button\n\t\t\t\ttype=\"button\"\n\t\t\t\ttone=\"secondary\"\n\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'media-resource-gallery--add-tile h-auto min-h-24 w-full flex-col rounded-radius border border-dashed border-border bg-background text-muted-foreground shadow-none',\n\t\t\t\t\t'aspect-square hover:border-primary-accent/50 hover:bg-primary/5 hover:text-primary-accent focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n\t\t\t\t)}\n\t\t\t\taria-label={strings.gallery.addTile}\n\t\t\t\tonClick={onAdd}\n\t\t\t>\n\t\t\t\t<Plus className=\"size-icon\" />\n\t\t\t\t<Text tag=\"span\" size=\"inherit\" className=\"sr-only\">\n\t\t\t\t\t{strings.gallery.addTile}\n\t\t\t\t</Text>\n\t\t\t</Button>\n\t\t);\n\t};\n\n\treturn (\n\t\t<section\n\t\t\tclassName={cn(\n\t\t\t\t'media-resource-gallery--component @container/media-resource-gallery rounded-radius border border-border bg-card shadow-xs',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tdata-layout={layout}\n\t\t\tdata-density={density}\n\t\t\t{...props}\n\t\t>\n\t\t\t{hasHeader && (\n\t\t\t\t<header className=\"media-resource-gallery--header p-surface\">\n\t\t\t\t\t<Stack\n\t\t\t\t\t\tdirection={{ base: 'vertical', md: 'horizontal' }}\n\t\t\t\t\t\tgap=\"lg\"\n\t\t\t\t\t\talign={{ md: 'start' }}\n\t\t\t\t\t\tjustify={{ md: 'between' }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"min-w-0\">\n\t\t\t\t\t\t\t{!!title && (\n\t\t\t\t\t\t\t\t<Text tag=\"div\" weight=\"semibold\">\n\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!!description && (\n\t\t\t\t\t\t\t\t<Text type=\"secondary\" className=\"mt-0.5\">\n\t\t\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"md\" className=\"media-resource-gallery--actions\">\n\t\t\t\t\t\t\t{action ?? defaultAction}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</Stack>\n\t\t\t\t</header>\n\t\t\t)}\n\n\t\t\t{shouldShowEmptyState ? (\n\t\t\t\t<div className=\"media-resource-gallery--empty px-surface pb-surface\">\n\t\t\t\t\t{empty ?? (\n\t\t\t\t\t\t<MediaLibraryEmptyState\n\t\t\t\t\t\t\ttitle={strings.gallery.emptyTitle}\n\t\t\t\t\t\t\tdescription={strings.gallery.emptyDescription}\n\t\t\t\t\t\t\taction={\n\t\t\t\t\t\t\t\tcanAdd ? (\n\t\t\t\t\t\t\t\t\t<Button type=\"button\" icon={ImagePlus} onClick={onAdd}>\n\t\t\t\t\t\t\t\t\t\t{strings.gallery.add}\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t) : undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'grid min-w-0 grid-cols-1',\n\t\t\t\t\t\tlayout === 'list' ? 'gap-space-md' : 'gap-space-lg',\n\t\t\t\t\t\t'media-resource-gallery--items p-surface',\n\t\t\t\t\t\thasHeader && 'pt-0',\n\t\t\t\t\t\tlayout === 'list'\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: layout === 'field'\n\t\t\t\t\t\t\t\t? 'grid-cols-[repeat(auto-fill,minmax(96px,1fr))] @md/media-resource-gallery:grid-cols-[repeat(auto-fill,minmax(108px,1fr))]'\n\t\t\t\t\t\t\t\t: density === 'compact'\n\t\t\t\t\t\t\t\t\t? 'grid-cols-[repeat(auto-fill,minmax(132px,1fr))]'\n\t\t\t\t\t\t\t\t\t: 'grid-cols-[repeat(auto-fill,minmax(164px,1fr))]',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{items.map((item, index) => {\n\t\t\t\t\t\tconst id = accessors.getId(item);\n\t\t\t\t\t\tconst name = accessors.getName(item);\n\t\t\t\t\t\tconst type = accessors.getType(item);\n\t\t\t\t\t\tconst src = accessors.getSrc(item);\n\t\t\t\t\t\tconst alt = accessors.getAlt(item) || name;\n\t\t\t\t\t\tconst isPrimary = id === resolvedPrimaryId;\n\t\t\t\t\t\tconst isPrivate = accessors.getPublic(item) === false;\n\t\t\t\t\t\tconst duration = accessors.getDuration(item);\n\t\t\t\t\t\tconst canMovePrevious = index > 0;\n\t\t\t\t\t\tconst canMoveNext = index < total - 1;\n\t\t\t\t\t\tconst ctx: MediaResourceGalleryItemRenderContext<TItem> = {\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\ttotal,\n\t\t\t\t\t\t\tprimary: isPrimary,\n\t\t\t\t\t\t\taccessors,\n\t\t\t\t\t\t\tcanMovePrevious,\n\t\t\t\t\t\t\tcanMoveNext,\n\t\t\t\t\t\t\tsetPrimary: () => onPrimaryChange?.(id, item),\n\t\t\t\t\t\t\tremove: () => onRemove?.(id, item),\n\t\t\t\t\t\t\tmovePrevious: () => move(index, index - 1),\n\t\t\t\t\t\t\tmoveNext: () => move(index, index + 1),\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst rendered = renderItem?.(item, ctx);\n\t\t\t\t\t\tif (rendered) {\n\t\t\t\t\t\t\treturn <div key={id}>{rendered}</div>;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (layout === 'field') {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'media-resource-gallery--item group/gallery relative aspect-square overflow-hidden rounded-radius border border-border bg-background shadow-xs',\n\t\t\t\t\t\t\t\t\t\t'transition-colors hover:border-primary/40 focus-within:border-primary/50',\n\t\t\t\t\t\t\t\t\t\tisPrimary && 'col-span-2 row-span-2 min-h-52',\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tdata-primary={isPrimary || undefined}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{src ? (\n\t\t\t\t\t\t\t\t\t\t<img src={src} alt={alt} loading=\"lazy\" className=\"size-full object-cover\" />\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex size-full items-center justify-center bg-muted text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t<File className={isPrimary ? 'size-7' : 'size-icon-lg'} />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{isPrimary && (\n\t\t\t\t\t\t\t\t\t\t<Badge tone=\"secondary\" className=\"absolute left-2 top-2 bg-background/90 shadow-xs\">\n\t\t\t\t\t\t\t\t\t\t\t{strings.gallery.cover}\n\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{type === 'video' && !!duration && (\n\t\t\t\t\t\t\t\t\t\t<Badge tone=\"secondary\" className=\"absolute bottom-2 left-2 bg-foreground text-background\">\n\t\t\t\t\t\t\t\t\t\t\t<Play className=\"size-icon-sm fill-current\" />\n\t\t\t\t\t\t\t\t\t\t\t{duration}\n\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{isPrivate && (\n\t\t\t\t\t\t\t\t\t\t<span className=\"absolute bottom-2 right-2 inline-flex size-6 items-center justify-center rounded-full border border-border bg-background/90 text-muted-foreground shadow-xs\">\n\t\t\t\t\t\t\t\t\t\t\t<Lock className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{!readOnly && (\n\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"solid\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"absolute right-2 top-2 opacity-0 shadow-sm transition-opacity group-hover/gallery:opacity-100 group-focus-within/gallery:opacity-100\"\n\t\t\t\t\t\t\t\t\t\t\taria-label={strings.gallery.remove}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => onRemove?.(id, item)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<X className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (layout === 'list') {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Stack\n\t\t\t\t\t\t\t\t\tdirection=\"horizontal\"\n\t\t\t\t\t\t\t\t\twrap\n\t\t\t\t\t\t\t\t\talign=\"center\"\n\t\t\t\t\t\t\t\t\tgap=\"lg\"\n\t\t\t\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'media-resource-gallery--item min-w-0 rounded-radius border border-border bg-background px-row-x',\n\t\t\t\t\t\t\t\t\t\tdensity === 'compact' ? 'py-row-y-sm' : 'py-row-y',\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tdata-primary={isPrimary || undefined}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div className=\"relative size-12 shrink-0 overflow-hidden rounded-radius-md bg-muted\">\n\t\t\t\t\t\t\t\t\t\t{src ? (\n\t\t\t\t\t\t\t\t\t\t\t<img src={src} alt={alt} loading=\"lazy\" className=\"size-full object-cover\" />\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex size-full items-center justify-center text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t<File className=\"size-icon\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"md\" className=\"min-w-0\">\n\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"div\" weight=\"semibold\" className=\"min-w-0 break-all\">\n\t\t\t\t\t\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t{isPrimary && <Badge tone=\"info\">{strings.gallery.primary}</Badge>}\n\t\t\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t\t\t\t\t\t{formatMediaLibraryString(strings.gallery.itemPosition, {\n\t\t\t\t\t\t\t\t\t\t\t\tindex: index + 1,\n\t\t\t\t\t\t\t\t\t\t\t\ttotal,\n\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t{' · '}\n\t\t\t\t\t\t\t\t\t\t\t<FileSize\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={accessors.getSize(item)}\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\t\t\talign=\"left\"\n\t\t\t\t\t\t\t\t\t\t\t\temptyLabel={strings.unknownSize}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t{!readOnly && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"media-resource-gallery--item-actions flex basis-full flex-wrap items-center justify-end gap-space-xs @sm/media-resource-gallery:basis-auto\">\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={isPrimary}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.gallery.setPrimary}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => onPrimaryChange?.(id, item)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<Star className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={!canMovePrevious}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.gallery.movePrevious}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => move(index, index - 1)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<ArrowLeft className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={!canMoveNext}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.gallery.moveNext}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => move(index, index + 1)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<ArrowRight className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\ttone=\"destructive\"\n\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.gallery.remove}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => onRemove?.(id, item)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<Trash2 className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\t\t\tclassName=\"media-resource-gallery--item group/gallery overflow-hidden rounded-radius border border-border bg-background shadow-xs transition-colors hover:border-primary/40\"\n\t\t\t\t\t\t\t\tdata-primary={isPrimary || undefined}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div className=\"relative aspect-[4/3] bg-muted\">\n\t\t\t\t\t\t\t\t\t{src ? (\n\t\t\t\t\t\t\t\t\t\t<img src={src} alt={alt} loading=\"lazy\" className=\"size-full object-cover\" />\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex size-full items-center justify-center text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t<File className=\"size-6\" />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t<div className=\"absolute left-2 top-2 flex flex-wrap gap-space-xs\">\n\t\t\t\t\t\t\t\t\t\t{isPrimary && <Badge tone=\"info\" className=\"bg-card\">{strings.gallery.primary}</Badge>}\n\t\t\t\t\t\t\t\t\t\t<Badge tone=\"secondary\" className=\"bg-card text-card-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t{formatMediaLibraryString(strings.gallery.itemPosition, {\n\t\t\t\t\t\t\t\t\t\t\t\tindex: index + 1,\n\t\t\t\t\t\t\t\t\t\t\t\ttotal,\n\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'media-resource-gallery--item-body',\n\t\t\t\t\t\t\t\t\t\tdensity === 'compact' ? 'p-surface-xs' : 'p-surface',\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Stack gap=\"md\">\n\t\t\t\t\t\t\t\t\t\t<div className=\"min-w-0\">\n\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"div\" weight=\"semibold\" className=\"truncate\">\n\t\t\t\t\t\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t<FileSize\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={accessors.getSize(item)}\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\t\t\talign=\"left\"\n\t\t\t\t\t\t\t\t\t\t\t\temptyLabel={strings.unknownSize}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t{!readOnly && (\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-space-xs\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={isPrimary}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.gallery.setPrimary}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => onPrimaryChange?.(id, item)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Star className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={!canMovePrevious}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.gallery.movePrevious}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => move(index, index - 1)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ArrowLeft className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={!canMoveNext}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.gallery.moveNext}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => move(index, index + 1)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ArrowRight className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\ttone=\"destructive\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"ml-auto\"\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.gallery.remove}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => onRemove?.(id, item)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Trash2 className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t\t{renderAddTile()}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</section>\n\t);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"media-library.js","names":["_Fragment","NumberValue","resolveComponentScale","useDensityConfig","cn","Text","DisplayLabel","Button","Grid","Stack","SurfaceTitle","LoadingState","ErrorState","ActionDialog","formatFileSize","FileSize","Dimensions","Percent","Number$1","Badge","Input","Select","Switch","FormField","Dropzone","EmptyState","segmentedControlRecipes","controlGroupHeightClasses","Fragment$1","defaultMediaLibraryStrings","formatMediaLibraryString","template","values","key","one","other","DEFAULT_UPLOAD_OPTIONS","EMPTY_ITEMS","useControllableState","internal","setInternal","useState","defaultValue","value","controlled","useCallback","resolved","next","onChange","defaultAccessors","item","resolveMediaLibraryAccessors","accessors","formatMediaLibrarySize","bytes","getMediaLibraryDimensions","width","height","getUploadedTime","time","inferFileType","file","createPreviewUrl","revokePreviewUrl","url","normalizeFetchResult","result","mergePatch","patch","filterItems","normalizedQuery","query","items","type","collection","sortItems","sorted","sort","a","b","useMediaLibrary","itemsProp","accessorsProp","tabProp","viewProp","queryProp","typeProp","collectionProp","sortProp","uploadOptionsProp","useMemo","tab","setTab","defaultTab","onTabChange","view","setView","defaultView","onViewChange","setQuery","defaultQuery","onQueryChange","setType","defaultType","onTypeChange","setCollection","defaultCollection","onCollectionChange","setSort","defaultSort","onSortChange","detailId","setDetailId","internalValue","setInternalValue","fetchedItems","setFetchedItems","fetchedTotal","setFetchedTotal","loading","setLoading","error","setError","createdItems","setCreatedItems","removedIds","setRemovedIds","itemPatches","setItemPatches","stagedFiles","setStagedFiles","uploading","setUploading","defaultResolvedUploadOptions","defaultUploadOptions","uploadOptions","setUploadOptions","onUploadOptionsChange","isSelectionControlled","selectedIds","selectedSet","objectUrlRef","useRef","uploadControllerRef","mutationVersionRef","useEffect","fetcher","controller","normalized","nextError","onError","objectUrls","sourceItems","patchedItems","visibleItems","filtered","totalCount","filteredCount","selectedItems","hasFilters","applySelection","nextIds","nextSet","nextItems","onValueChange","toggleSelection","selectionMode","id","clearSelection","clearFilters","addFiles","current","files","src","index","removeStagedFile","target","clearStagedFiles","updateUploadOptions","setUploadFile","fileId","helpers","progress","uploaded","onUpload","uploadedIds","mutationKey","version","previousPatch","onItemUpdate","wasRemoved","onItemDelete","selectedId","selectionTargetClassName","typeIcon","jsx","ImageIcon","Video","File","className","typeLabel","strings","usedInLabel","count","MediaPreview","tint","MediaPreviewImage","failed","setFailed","MediaLibraryEmptyState","description","action","icon","MediaLibraryToolbar","size","defaultScale","typeOptions","typeFilters","option","collectionOptions","collections","sortOptions","trimmedQuery","hasQuery","hasActiveFilters","event","Search","Icon","active","Grid2X2","LayoutList","onClearFilters","toolbarEnd","MediaLibraryCard","name","alt","usageCount","isPrivate","duration","selected","density","onToggle","Check","onDetails","Info","Play","Lock","showMeta","Layers3","MediaLibraryList","MediaLibraryDetailPanel","tags","isPublic","custom","renderDetail","onUpdate","onRemove","onReplace","onClose","ArrowLeft","label","tag","checked","UploadCloud","Trash2","MediaLibraryUploadPanel","onFiles","onRemoveFile","X","empty","onOptionsChange","MediaLibraryFooterSummary","selectedCount","stagedSize","sum","stagedCount","summaryClassName","onClearSelection","MediaLibraryFooterActions","onCancelUpload","cancelLabel","onCancel","onConfirm","confirmLabel","MediaLibraryFooter","chrome","MediaLibraryFooterPortalContext","createContext","useResolvedCollections","explicit","seen","getCollection","MediaLibrary","stringsProp","props","useStrings","state","resolvedCollections","activeTab","allowUpload","detailItem","footerPortal","useContext","usesDefaultFooter","slots","dialogSelectionSummary","hasHeaderIdentity","title","titleSuffix","hasHeaderControls","hasHeader","confirm","cancel","confirmItem","confirmOnSelect","countLabel","footer","heightClassName","candidate","ctx","rendered","onItemReplace","removed","createPortal","MediaLibraryDialog","internalOpen","setInternalOpen","footerElement","setFooterElement","isOpenControlled","open","resolvedOpen","handleOpenChange","nextOpen","onOpenChange","closeMediaLibrary","dialogTitle","dialogDescription","dialogClassName","contentClassName","moveItem","from","to","MediaResourceGallery","total","resolvedPrimaryId","primaryId","canAdd","readOnly","onAdd","maxItems","defaultAction","layout","Plus","move","shouldShowEmptyState","renderAddTile","ImagePlus","isPrimary","canMovePrevious","canMoveNext","renderItem","onPrimaryChange","Star","ArrowRight"],"sources":["../../src/components/features/media-library/media-library.strings.ts","../../src/components/features/media-library/hooks/use-media-library.ts","../../src/components/features/media-library/partials/media-library-partials.tsx","../../src/components/features/media-library/media-library.tsx","../../src/components/features/media-library/media-resource-gallery.tsx"],"sourcesContent":["export interface MediaLibraryStrings {\n\t/** Surface title. */\n\ttitle: string;\n\t/** Supporting copy shown under the label. */\n\tdescription: string;\n\tclose: string;\n\ttabs: {\n\t\tlibrary: string;\n\t\tupload: string;\n\t};\n\tsearchPlaceholder: string;\n\tclearSearch: string;\n\ttypeFilterLabel: string;\n\tcollectionFilterLabel: string;\n\tsortLabel: string;\n\tviewLabel: string;\n\tallTypes: string;\n\timages: string;\n\tvideos: string;\n\tfiles: string;\n\tallCollections: string;\n\tsortNewest: string;\n\tsortName: string;\n\tsortSize: string;\n\tsortUsage: string;\n\tgridView: string;\n\ttableView: string;\n\tcountAll: string;\n\tcountFiltered: string;\n\tcountSearch: string;\n\tactiveSearchLabel: string;\n\tresultsLabel: string;\n\temptyLibraryTitle: string;\n\temptyLibraryDescription: string;\n\temptyFilteredTitle: string;\n\temptyFilteredDescription: string;\n\tclearFilters: string;\n\tuploadMedia: string;\n\tloading: string;\n\terrorTitle: string;\n\terrorDescription: string;\n\tcardDetails: string;\n\tprivateLabel: string;\n\tpublicLabel: string;\n\ttypeImage: string;\n\ttypeVideo: string;\n\ttypeFile: string;\n\tunknownSize: string;\n\tnotUsed: string;\n\tusedIn: string;\n\ttable: {\n\t\tname: string;\n\t\ttype: string;\n\t\tsize: string;\n\t\tcollection: string;\n\t\tused: string;\n\t};\n\tdetail: {\n\t\ttitle: string;\n\t\taltText: string;\n\t\taltPlaceholder: string;\n\t\tcollection: string;\n\t\ttags: string;\n\t\ttagsPlaceholder: string;\n\t\tpublic: string;\n\t\tpublicHint: string;\n\t\tprivateHint: string;\n\t\ttype: string;\n\t\tsize: string;\n\t\tdimensions: string;\n\t\tuploaded: string;\n\t\tusedIn: string;\n\t\treplace: string;\n\t\tdelete: string;\n\t\tclose: string;\n\t};\n\tupload: {\n\t\tdropTitle: string;\n\t\tdropHint: string;\n\t\tdragOver: string;\n\t\tcollection: string;\n\t\ttags: string;\n\t\ttagsPlaceholder: string;\n\t\tpublic: string;\n\t\tpublicHint: string;\n\t\tnoFiles: string;\n\t\tstagedCount: string;\n\t\tremoveFile: string;\n\t\tuploading: string;\n\t\tdone: string;\n\t};\n\tfooter: {\n\t\tpickOne: string;\n\t\tpickMany: string;\n\t\tselectedCount: string;\n\t\tclear: string;\n\t\tcancel: string;\n\t\tconfirmEmpty: string;\n\t\tconfirmOne: string;\n\t\tconfirmMany: string;\n\t\tnoFiles: string;\n\t\tstagedSummary: string;\n\t\tupload: string;\n\t\tuploadMany: string;\n\t\tuploading: string;\n\t};\n\tgallery: {\n\t\temptyTitle: string;\n\t\temptyDescription: string;\n\t\tadd: string;\n\t\taddMore: string;\n\t\taddTile: string;\n\t\tcover: string;\n\t\tprimary: string;\n\t\tsetPrimary: string;\n\t\tremove: string;\n\t\tmovePrevious: string;\n\t\tmoveNext: string;\n\t\titemPosition: string;\n\t\tmaxReached: string;\n\t};\n}\n\nexport const defaultMediaLibraryStrings: MediaLibraryStrings = {\n\ttitle: 'Add media',\n\tdescription: 'Pick from the library, or upload new files.',\n\tclose: 'Close media library',\n\ttabs: {\n\t\tlibrary: 'Library',\n\t\tupload: 'Upload',\n\t},\n\tsearchPlaceholder: 'Search by name or tag...',\n\tclearSearch: 'Clear search',\n\ttypeFilterLabel: 'Type',\n\tcollectionFilterLabel: 'Collection',\n\tsortLabel: 'Sort',\n\tviewLabel: 'View',\n\tallTypes: 'All',\n\timages: 'Images',\n\tvideos: 'Videos',\n\tfiles: 'Files',\n\tallCollections: 'All collections',\n\tsortNewest: 'Newest',\n\tsortName: 'Name',\n\tsortSize: 'Size',\n\tsortUsage: 'Most used',\n\tgridView: 'Grid view',\n\ttableView: 'Table view',\n\tcountAll: '{count} items',\n\tcountFiltered: '{count} of {total} items',\n\tcountSearch: '{count} of {total} items for \"{query}\"',\n\tactiveSearchLabel: 'Search',\n\tresultsLabel: 'Media results',\n\temptyLibraryTitle: 'Library is empty',\n\temptyLibraryDescription: 'Upload images or videos to start building the library.',\n\temptyFilteredTitle: 'No media matches',\n\temptyFilteredDescription: 'Try a different search term, or clear the filters.',\n\tclearFilters: 'Clear filters',\n\tuploadMedia: 'Upload media',\n\tloading: 'Loading media...',\n\terrorTitle: 'Media could not load',\n\terrorDescription: 'Try again or adjust your filters.',\n\tcardDetails: 'Details for {name}',\n\tprivateLabel: 'Private',\n\tpublicLabel: 'Public',\n\ttypeImage: 'Image',\n\ttypeVideo: 'Video',\n\ttypeFile: 'File',\n\tunknownSize: 'Unknown',\n\tnotUsed: 'Not used yet',\n\tusedIn: '{count} {count, plural, one {place} other {places}}',\n\ttable: {\n\t\tname: 'Name',\n\t\ttype: 'Type',\n\t\tsize: 'Size',\n\t\tcollection: 'Collection',\n\t\tused: 'Used',\n\t},\n\tdetail: {\n\t\ttitle: 'Details',\n\t\taltText: 'Alt text',\n\t\taltPlaceholder: 'Describe this media for screen readers',\n\t\tcollection: 'Collection',\n\t\ttags: 'Tags',\n\t\ttagsPlaceholder: 'Comma-separated',\n\t\tpublic: 'Public',\n\t\tpublicHint: 'Served from the public CDN',\n\t\tprivateHint: 'Only visible in the admin',\n\t\ttype: 'Type',\n\t\tsize: 'Size',\n\t\tdimensions: 'Dimensions',\n\t\tuploaded: 'Uploaded',\n\t\tusedIn: 'Used in',\n\t\treplace: 'Replace file',\n\t\tdelete: 'Delete',\n\t\tclose: 'Close details',\n\t},\n\tupload: {\n\t\tdropTitle: 'Drag files here or click to browse',\n\t\tdropHint: 'JPG, PNG, WebP, SVG and MP4 up to 50 MB per file',\n\t\tdragOver: 'Release to stage files',\n\t\tcollection: 'Collection',\n\t\ttags: 'Tags',\n\t\ttagsPlaceholder: 'Comma-separated',\n\t\tpublic: 'Public',\n\t\tpublicHint: 'Serve from the public CDN',\n\t\tnoFiles: 'No files staged',\n\t\tstagedCount: '{count} {count, plural, one {file} other {files}}',\n\t\tremoveFile: 'Remove {name}',\n\t\tuploading: 'Uploading',\n\t\tdone: 'Done',\n\t},\n\tfooter: {\n\t\tpickOne: 'Pick one item',\n\t\tpickMany: 'Pick one or more items',\n\t\tselectedCount: '{count} selected',\n\t\tclear: 'Clear',\n\t\tcancel: 'Cancel',\n\t\tconfirmEmpty: 'Add to product',\n\t\tconfirmOne: 'Add 1 item',\n\t\tconfirmMany: 'Add {count} items',\n\t\tnoFiles: 'No files staged',\n\t\tstagedSummary: '{count} {count, plural, one {file} other {files}} · {size}',\n\t\tupload: 'Upload',\n\t\tuploadMany: 'Upload {count} files',\n\t\tuploading: 'Uploading...',\n\t},\n\tgallery: {\n\t\temptyTitle: 'No media attached',\n\t\temptyDescription: 'Add images, video, or files to this resource.',\n\t\tadd: 'Add media',\n\t\taddMore: 'Add more',\n\t\taddTile: 'Add another media item',\n\t\tcover: 'Cover',\n\t\tprimary: 'Primary',\n\t\tsetPrimary: 'Set primary',\n\t\tremove: 'Remove',\n\t\tmovePrevious: 'Move previous',\n\t\tmoveNext: 'Move next',\n\t\titemPosition: '{index} of {total}',\n\t\tmaxReached: 'Maximum reached',\n\t},\n};\n\nexport function formatMediaLibraryString(\n\ttemplate: string,\n\tvalues: Record<string, string | number>,\n): string {\n\treturn template\n\t\t.replace(\n\t\t\t/\\{(\\w+), plural, one \\{([^}]*)\\} other \\{([^}]*)\\}\\}/g,\n\t\t\t(_, key: string, one: string, other: string) =>\n\t\t\t\tNumber(values[key]) === 1 ? one : other,\n\t\t)\n\t\t.replace(/\\{(\\w+)\\}/g, (_, key: string) => String(values[key] ?? ''));\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { formatFileSize } from '../../../primitives';\n\nimport type {\n\tMediaLibraryAccessors,\n\tMediaLibraryFetchResult,\n\tMediaLibraryItem,\n\tMediaLibraryItemPatch,\n\tMediaLibraryItemType,\n\tMediaLibraryStagedFile,\n\tMediaLibraryUploadOptions,\n\tMediaLibraryUploadStatus,\n\tResolvedMediaLibraryAccessors,\n\tUseMediaLibraryOptions,\n\tMediaLibraryState,\n} from '../media-library.types';\n\nconst DEFAULT_UPLOAD_OPTIONS: MediaLibraryUploadOptions = {\n\tcollection: undefined,\n\ttags: [],\n\tpublic: true,\n};\nconst EMPTY_ITEMS: readonly unknown[] = [];\n\nfunction useControllableState<T>(\n\tcontrolled: T | undefined,\n\tdefaultValue: T,\n\tonChange: ((value: T) => void) | undefined,\n) {\n\tconst [internal, setInternal] = useState(defaultValue);\n\tconst value = controlled ?? internal;\n\tconst setValue = useCallback((next: T | ((current: T) => T)) => {\n\t\tconst resolved = typeof next === 'function'\n\t\t\t? (next as (current: T) => T)(value)\n\t\t\t: next;\n\t\tif (controlled === undefined) setInternal(resolved);\n\t\tonChange?.(resolved);\n\t}, [controlled, onChange, value]);\n\treturn [value, setValue] as const;\n}\n\nconst defaultAccessors: ResolvedMediaLibraryAccessors<MediaLibraryItem> = {\n\tgetId: (item) => item.id,\n\tgetName: (item) => item.name,\n\tgetType: (item) => item.type,\n\tgetSrc: (item) => item.src,\n\tgetAlt: (item) => item.alt,\n\tgetSize: (item) => item.size,\n\tgetWidth: (item) => item.width,\n\tgetHeight: (item) => item.height,\n\tgetDuration: (item) => item.duration,\n\tgetCollection: (item) => item.collection,\n\tgetTags: (item) => item.tags ?? [],\n\tgetPublic: (item) => item.public,\n\tgetUploadedAt: (item) => item.uploadedAt,\n\tgetUsageCount: (item) => item.usageCount,\n\tgetTint: (item) => item.tint,\n\tgetMimeType: (item) => item.mimeType,\n};\n\nexport function resolveMediaLibraryAccessors<TItem = MediaLibraryItem>(\n\taccessors?: MediaLibraryAccessors<TItem>,\n): ResolvedMediaLibraryAccessors<TItem> {\n\treturn {\n\t\t...(defaultAccessors as unknown as ResolvedMediaLibraryAccessors<TItem>),\n\t\t...accessors,\n\t};\n}\n\nexport function formatMediaLibrarySize(bytes?: number): string {\n\treturn formatFileSize(bytes) ?? '';\n}\n\nexport function getMediaLibraryDimensions<TItem>(\n\titem: TItem,\n\taccessors: ResolvedMediaLibraryAccessors<TItem>,\n): string {\n\tconst width = accessors.getWidth(item);\n\tconst height = accessors.getHeight(item);\n\tif (!width || !height) return '';\n\treturn `${width} x ${height}`;\n}\n\nfunction getUploadedTime<TItem>(\n\titem: TItem,\n\taccessors: ResolvedMediaLibraryAccessors<TItem>,\n) {\n\tconst value = accessors.getUploadedAt(item);\n\tif (!value) return 0;\n\tconst date = value instanceof Date ? value : new Date(value);\n\tconst time = date.getTime();\n\treturn Number.isFinite(time) ? time : 0;\n}\n\nfunction inferFileType(file: File): MediaLibraryItemType {\n\tif (file.type.startsWith('image/')) return 'image';\n\tif (file.type.startsWith('video/')) return 'video';\n\treturn 'file';\n}\n\nfunction createPreviewUrl(file: File): string | undefined {\n\tif (!file.type.startsWith('image/')) return undefined;\n\tif (typeof URL === 'undefined' || typeof URL.createObjectURL !== 'function') {\n\t\treturn undefined;\n\t}\n\treturn URL.createObjectURL(file);\n}\n\nfunction revokePreviewUrl(url: string | undefined) {\n\tif (!url || typeof URL === 'undefined' || typeof URL.revokeObjectURL !== 'function') {\n\t\treturn;\n\t}\n\tURL.revokeObjectURL(url);\n}\n\nfunction normalizeFetchResult<TItem>(\n\tresult: MediaLibraryFetchResult<TItem> | TItem[],\n): MediaLibraryFetchResult<TItem> {\n\tif (Array.isArray(result)) return { items: result, total: result.length };\n\treturn result;\n}\n\nfunction mergePatch<TItem>(item: TItem, patch?: MediaLibraryItemPatch): TItem {\n\tif (!patch) return item;\n\tif (typeof item === 'object' && item !== null) {\n\t\treturn { ...(item as object), ...patch } as TItem;\n\t}\n\treturn item;\n}\n\nfunction filterItems<TItem>(\n\titems: TItem[],\n\taccessors: ResolvedMediaLibraryAccessors<TItem>,\n\tquery: string,\n\ttype: string,\n\tcollection: string,\n) {\n\tconst normalizedQuery = query.trim().toLowerCase();\n\treturn items.filter((item) => {\n\t\tif (type !== 'all' && accessors.getType(item) !== type) return false;\n\t\tif (collection !== 'all' && accessors.getCollection(item) !== collection) return false;\n\t\tif (!normalizedQuery) return true;\n\n\t\tconst haystack = [\n\t\t\taccessors.getName(item),\n\t\t\taccessors.getAlt(item),\n\t\t\taccessors.getCollection(item),\n\t\t\t...accessors.getTags(item),\n\t\t]\n\t\t\t.filter(Boolean)\n\t\t\t.join(' ')\n\t\t\t.toLowerCase();\n\t\treturn haystack.includes(normalizedQuery);\n\t});\n}\n\nfunction sortItems<TItem>(\n\titems: TItem[],\n\taccessors: ResolvedMediaLibraryAccessors<TItem>,\n\tsort: string,\n) {\n\tconst sorted = items.slice();\n\tif (sort === 'name') {\n\t\tsorted.sort((a, b) => accessors.getName(a).localeCompare(accessors.getName(b)));\n\t} else if (sort === 'size') {\n\t\tsorted.sort((a, b) => (accessors.getSize(b) ?? 0) - (accessors.getSize(a) ?? 0));\n\t} else if (sort === 'usage') {\n\t\tsorted.sort(\n\t\t\t(a, b) => (accessors.getUsageCount(b) ?? 0) - (accessors.getUsageCount(a) ?? 0),\n\t\t);\n\t} else {\n\t\tsorted.sort((a, b) => getUploadedTime(b, accessors) - getUploadedTime(a, accessors));\n\t}\n\treturn sorted;\n}\n\nexport function useMediaLibrary<TItem = MediaLibraryItem>({\n\titems: itemsProp = EMPTY_ITEMS as readonly TItem[],\n\tfetcher,\n\taccessors: accessorsProp,\n\tselectionMode = 'multiple',\n\tvalue,\n\tdefaultValue = [],\n\tonValueChange,\n\tonItemUpdate,\n\tonItemDelete,\n\tonUpload,\n\tonError,\n\ttab: tabProp,\n\tdefaultTab = 'library',\n\tonTabChange,\n\tview: viewProp,\n\tdefaultView = 'grid',\n\tonViewChange,\n\tquery: queryProp,\n\tdefaultQuery = '',\n\tonQueryChange,\n\ttype: typeProp,\n\tdefaultType = 'all',\n\tonTypeChange,\n\tcollection: collectionProp,\n\tdefaultCollection = 'all',\n\tonCollectionChange,\n\tsort: sortProp,\n\tdefaultSort = 'newest',\n\tonSortChange,\n\tuploadOptions: uploadOptionsProp,\n\tdefaultUploadOptions,\n\tonUploadOptionsChange,\n}: UseMediaLibraryOptions<TItem> = {}): MediaLibraryState<TItem> {\n\tconst accessors = useMemo(\n\t\t() => resolveMediaLibraryAccessors(accessorsProp),\n\t\t[accessorsProp],\n\t);\n\tconst [tab, setTab] = useControllableState(tabProp, defaultTab, onTabChange);\n\tconst [view, setView] = useControllableState(viewProp, defaultView, onViewChange);\n\tconst [query, setQuery] = useControllableState(queryProp, defaultQuery, onQueryChange);\n\tconst [type, setType] = useControllableState(typeProp, defaultType, onTypeChange);\n\tconst [collection, setCollection] = useControllableState(\n\t\tcollectionProp,\n\t\tdefaultCollection,\n\t\tonCollectionChange,\n\t);\n\tconst [sort, setSort] = useControllableState(sortProp, defaultSort, onSortChange);\n\tconst [detailId, setDetailId] = useState<string | null>(null);\n\tconst [internalValue, setInternalValue] = useState<string[]>(() => [...defaultValue]);\n\tconst [fetchedItems, setFetchedItems] = useState<TItem[]>([]);\n\tconst [fetchedTotal, setFetchedTotal] = useState<number | undefined>();\n\tconst [loading, setLoading] = useState(false);\n\tconst [error, setError] = useState<unknown>(null);\n\tconst [createdItems, setCreatedItems] = useState<TItem[]>([]);\n\tconst [removedIds, setRemovedIds] = useState<Set<string>>(() => new Set());\n\tconst [itemPatches, setItemPatches] = useState<Record<string, MediaLibraryItemPatch>>({});\n\tconst [stagedFiles, setStagedFiles] = useState<MediaLibraryStagedFile[]>([]);\n\tconst [uploading, setUploading] = useState(false);\n\tconst defaultResolvedUploadOptions = useMemo<MediaLibraryUploadOptions>(() => ({\n\t\t...DEFAULT_UPLOAD_OPTIONS,\n\t\t...defaultUploadOptions,\n\t\ttags: defaultUploadOptions?.tags ?? DEFAULT_UPLOAD_OPTIONS.tags,\n\t}), [defaultUploadOptions]);\n\tconst controlledUploadOptions = useMemo<MediaLibraryUploadOptions | undefined>(\n\t\t() => uploadOptionsProp ? {\n\t\t\t...DEFAULT_UPLOAD_OPTIONS,\n\t\t\t...uploadOptionsProp,\n\t\t\ttags: uploadOptionsProp.tags ?? DEFAULT_UPLOAD_OPTIONS.tags,\n\t\t} : undefined,\n\t\t[uploadOptionsProp],\n\t);\n\tconst [uploadOptions, setUploadOptions] = useControllableState(\n\t\tcontrolledUploadOptions,\n\t\tdefaultResolvedUploadOptions,\n\t\tonUploadOptionsChange,\n\t);\n\tconst isSelectionControlled = value !== undefined;\n\tconst selectedIds = useMemo(\n\t\t() => (isSelectionControlled ? [...(value ?? [])] : internalValue),\n\t\t[internalValue, isSelectionControlled, value],\n\t);\n\tconst selectedSet = useMemo(() => new Set(selectedIds), [selectedIds]);\n\tconst objectUrlRef = useRef<Set<string>>(new Set());\n\tconst uploadControllerRef = useRef<AbortController | null>(null);\n\tconst mutationVersionRef = useRef<Map<string, number>>(new Map());\n\n\tuseEffect(() => {\n\t\tif (!fetcher) return;\n\t\tconst controller = new AbortController();\n\t\tsetLoading(true);\n\t\tsetError(null);\n\t\tfetcher({\n\t\t\tquery,\n\t\t\ttype,\n\t\t\tcollection: collection === 'all' ? undefined : collection,\n\t\t\tsort,\n\t\t\tsignal: controller.signal,\n\t\t})\n\t\t\t.then((result) => {\n\t\t\t\tif (controller.signal.aborted) return;\n\t\t\t\tconst normalized = normalizeFetchResult(result);\n\t\t\t\tsetFetchedItems(normalized.items);\n\t\t\t\tsetFetchedTotal(normalized.total);\n\t\t\t})\n\t\t\t.catch((nextError) => {\n\t\t\t\tif (controller.signal.aborted) return;\n\t\t\t\tsetError(nextError);\n\t\t\t\tonError?.(nextError);\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tif (!controller.signal.aborted) setLoading(false);\n\t\t\t});\n\t\treturn () => controller.abort();\n\t}, [collection, fetcher, onError, query, sort, type]);\n\n\tuseEffect(() => {\n\t\tconst objectUrls = objectUrlRef.current;\n\t\treturn () => {\n\t\t\tuploadControllerRef.current?.abort();\n\t\t\tfor (const url of objectUrls) revokePreviewUrl(url);\n\t\t\tobjectUrls.clear();\n\t\t};\n\t}, []);\n\n\tconst sourceItems = useMemo(\n\t\t() => (fetcher ? fetchedItems : [...createdItems, ...itemsProp]),\n\t\t[createdItems, fetchedItems, fetcher, itemsProp],\n\t);\n\tconst patchedItems = useMemo(\n\t\t() =>\n\t\t\tsourceItems\n\t\t\t\t.filter((item) => !removedIds.has(accessors.getId(item)))\n\t\t\t\t.map((item) => mergePatch(item, itemPatches[accessors.getId(item)])),\n\t\t[accessors, itemPatches, removedIds, sourceItems],\n\t);\n\tconst visibleItems = useMemo(() => {\n\t\tconst filtered = fetcher\n\t\t\t? patchedItems\n\t\t\t: filterItems(patchedItems, accessors, query, type, collection);\n\t\treturn fetcher ? filtered : sortItems(filtered, accessors, sort);\n\t}, [accessors, collection, fetcher, patchedItems, query, sort, type]);\n\tconst totalCount = fetchedTotal ?? patchedItems.length;\n\tconst filteredCount = visibleItems.length;\n\tconst selectedItems = useMemo(\n\t\t() => patchedItems.filter((item) => selectedSet.has(accessors.getId(item))),\n\t\t[accessors, patchedItems, selectedSet],\n\t);\n\tconst hasFilters = Boolean(query.trim()) || type !== 'all' || collection !== 'all';\n\n\tconst applySelection = useCallback(\n\t\t(nextIds: string[]) => {\n\t\t\tif (!isSelectionControlled) setInternalValue(nextIds);\n\t\t\tconst nextSet = new Set(nextIds);\n\t\t\tconst nextItems = patchedItems.filter((item) => nextSet.has(accessors.getId(item)));\n\t\t\tonValueChange?.(nextIds, nextItems);\n\t\t},\n\t\t[accessors, isSelectionControlled, onValueChange, patchedItems],\n\t);\n\n\tconst toggleSelection = useCallback(\n\t\t(id: string) => {\n\t\t\tconst next = new Set(selectionMode === 'single' ? [] : selectedSet);\n\t\t\tif (selectedSet.has(id) && selectionMode !== 'single') {\n\t\t\t\tnext.delete(id);\n\t\t\t} else {\n\t\t\t\tnext.add(id);\n\t\t\t}\n\t\t\tapplySelection(Array.from(next));\n\t\t},\n\t\t[applySelection, selectedSet, selectionMode],\n\t);\n\n\tconst clearSelection = useCallback(() => applySelection([]), [applySelection]);\n\tconst clearFilters = useCallback(() => {\n\t\tsetQuery('');\n\t\tsetType('all');\n\t\tsetCollection('all');\n\t}, [setCollection, setQuery, setType]);\n\n\tconst addFiles = useCallback((files: File[]) => {\n\t\tsetStagedFiles((current) => [\n\t\t\t...current,\n\t\t\t...files.map((file, index) => {\n\t\t\t\tconst src = createPreviewUrl(file);\n\t\t\t\tif (src) objectUrlRef.current.add(src);\n\t\t\t\treturn {\n\t\t\t\t\tid: `staged-${Date.now()}-${index}`,\n\t\t\t\t\tfile,\n\t\t\t\t\tname: file.name,\n\t\t\t\t\tsize: file.size,\n\t\t\t\t\ttype: inferFileType(file),\n\t\t\t\t\tsrc,\n\t\t\t\t\tprogress: 0,\n\t\t\t\t\tstatus: 'staged' as const,\n\t\t\t\t};\n\t\t\t}),\n\t\t]);\n\t}, []);\n\n\tconst removeStagedFile = useCallback((id: string) => {\n\t\tsetStagedFiles((current) => {\n\t\t\tconst target = current.find((file) => file.id === id);\n\t\t\tif (target?.src) {\n\t\t\t\trevokePreviewUrl(target.src);\n\t\t\t\tobjectUrlRef.current.delete(target.src);\n\t\t\t}\n\t\t\treturn current.filter((file) => file.id !== id);\n\t\t});\n\t}, []);\n\n\tconst clearStagedFiles = useCallback(() => {\n\t\tsetStagedFiles((current) => {\n\t\t\tfor (const file of current) {\n\t\t\t\tif (file.src) {\n\t\t\t\t\trevokePreviewUrl(file.src);\n\t\t\t\t\tobjectUrlRef.current.delete(file.src);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [];\n\t\t});\n\t}, []);\n\n\tconst updateUploadOptions = useCallback((patch: Partial<MediaLibraryUploadOptions>) => {\n\t\tsetUploadOptions((current) => ({ ...current, ...patch }));\n\t}, [setUploadOptions]);\n\n\tconst setUploadFile = useCallback(\n\t\t(fileId: string, patch: Partial<Pick<MediaLibraryStagedFile, 'progress' | 'status' | 'error'>>) => {\n\t\t\tsetStagedFiles((current) =>\n\t\t\t\tcurrent.map((file) => (file.id === fileId ? { ...file, ...patch } : file)),\n\t\t\t);\n\t\t},\n\t\t[],\n\t);\n\n\tconst startUpload = useCallback(async () => {\n\t\tif (uploading || stagedFiles.length === 0) return;\n\t\tconst controller = new AbortController();\n\t\tuploadControllerRef.current?.abort();\n\t\tuploadControllerRef.current = controller;\n\t\tsetError(null);\n\t\tsetUploading(true);\n\t\tsetStagedFiles((current) =>\n\t\t\tcurrent.map((file) => ({ ...file, status: 'uploading', progress: 0 })),\n\t\t);\n\t\tconst helpers = {\n\t\t\tsignal: controller.signal,\n\t\t\tsetProgress: (fileId: string, progress: number) => {\n\t\t\t\tif (controller.signal.aborted) return;\n\t\t\t\tsetUploadFile(fileId, { progress: Math.max(0, Math.min(100, progress)) });\n\t\t\t},\n\t\t\tsetFileStatus: (\n\t\t\t\tfileId: string,\n\t\t\t\tstatus: MediaLibraryUploadStatus,\n\t\t\t\tnextError?: string,\n\t\t\t) => {\n\t\t\t\tif (controller.signal.aborted) return;\n\t\t\t\tsetUploadFile(fileId, { status, error: nextError });\n\t\t\t},\n\t\t};\n\n\t\ttry {\n\t\t\tconst files = stagedFiles.map((file) => file.file);\n\t\t\tconst uploaded = await onUpload?.(files, uploadOptions, helpers);\n\t\t\tif (controller.signal.aborted) return;\n\t\t\tsetStagedFiles((current) =>\n\t\t\t\tcurrent.map((file) => ({ ...file, status: 'done', progress: 100 })),\n\t\t\t);\n\t\t\tif (uploaded?.length) {\n\t\t\t\tsetCreatedItems((current) => [...uploaded, ...current]);\n\t\t\t\tconst uploadedIds = uploaded.map((item) => accessors.getId(item));\n\t\t\t\tapplySelection(\n\t\t\t\t\tselectionMode === 'single'\n\t\t\t\t\t\t? uploadedIds.slice(0, 1)\n\t\t\t\t\t\t: Array.from(new Set([...uploadedIds, ...selectedIds])),\n\t\t\t\t);\n\t\t\t}\n\t\t\tclearStagedFiles();\n\t\t\tsetTab('library');\n\t\t} catch (nextError) {\n\t\t\tif (controller.signal.aborted) return;\n\t\t\tsetError(nextError);\n\t\t\tsetStagedFiles((current) =>\n\t\t\t\tcurrent.map((file) =>\n\t\t\t\t\tfile.status === 'uploading'\n\t\t\t\t\t\t? { ...file, status: 'error', error: 'Upload failed' }\n\t\t\t\t\t\t: file,\n\t\t\t\t),\n\t\t\t);\n\t\t\tonError?.(nextError);\n\t\t} finally {\n\t\t\tif (uploadControllerRef.current === controller) {\n\t\t\t\tuploadControllerRef.current = null;\n\t\t\t\tsetUploading(false);\n\t\t\t}\n\t\t}\n\t}, [\n\t\taccessors,\n\t\tapplySelection,\n\t\tclearStagedFiles,\n\t\tonError,\n\t\tonUpload,\n\t\tselectedIds,\n\t\tselectionMode,\n\t\tsetTab,\n\t\tsetUploadFile,\n\t\tstagedFiles,\n\t\tuploadOptions,\n\t\tuploading,\n\t]);\n\n\tconst cancelUpload = useCallback(() => {\n\t\tuploadControllerRef.current?.abort();\n\t\tuploadControllerRef.current = null;\n\t\tsetUploading(false);\n\t\tsetStagedFiles((current) =>\n\t\t\tcurrent.map((file) =>\n\t\t\t\tfile.status === 'uploading'\n\t\t\t\t\t? { ...file, status: 'staged', progress: 0, error: undefined }\n\t\t\t\t\t: file,\n\t\t\t),\n\t\t);\n\t}, []);\n\n\tconst updateItem = useCallback(\n\t\tasync (item: TItem, patch: MediaLibraryItemPatch): Promise<boolean> => {\n\t\t\tconst id = accessors.getId(item);\n\t\t\tconst mutationKey = `update:${id}`;\n\t\t\tconst version = (mutationVersionRef.current.get(mutationKey) ?? 0) + 1;\n\t\t\tmutationVersionRef.current.set(mutationKey, version);\n\t\t\tconst previousPatch = itemPatches[id];\n\t\t\tsetError(null);\n\t\t\tsetItemPatches((current) => ({ ...current, [id]: { ...current[id], ...patch } }));\n\t\t\ttry {\n\t\t\t\tawait onItemUpdate?.(item, patch);\n\t\t\t\treturn true;\n\t\t\t} catch (nextError) {\n\t\t\t\tif (mutationVersionRef.current.get(mutationKey) === version) {\n\t\t\t\t\tsetItemPatches((current) => {\n\t\t\t\t\t\tconst next = { ...current };\n\t\t\t\t\t\tif (previousPatch) next[id] = previousPatch;\n\t\t\t\t\t\telse delete next[id];\n\t\t\t\t\t\treturn next;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tsetError(nextError);\n\t\t\t\tonError?.(nextError);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\t[accessors, itemPatches, onError, onItemUpdate],\n\t);\n\n\tconst removeItem = useCallback(\n\t\tasync (item: TItem): Promise<boolean> => {\n\t\t\tconst id = accessors.getId(item);\n\t\t\tconst mutationKey = `delete:${id}`;\n\t\t\tconst version = (mutationVersionRef.current.get(mutationKey) ?? 0) + 1;\n\t\t\tmutationVersionRef.current.set(mutationKey, version);\n\t\t\tconst wasRemoved = removedIds.has(id);\n\t\t\tsetError(null);\n\t\t\tsetRemovedIds((current) => new Set(current).add(id));\n\t\t\ttry {\n\t\t\t\tawait onItemDelete?.(item);\n\t\t\t\tif (selectedSet.has(id)) {\n\t\t\t\t\tapplySelection(selectedIds.filter((selectedId) => selectedId !== id));\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t} catch (nextError) {\n\t\t\t\tif (\n\t\t\t\t\t!wasRemoved &&\n\t\t\t\t\tmutationVersionRef.current.get(mutationKey) === version\n\t\t\t\t) {\n\t\t\t\t\tsetRemovedIds((current) => {\n\t\t\t\t\t\tconst next = new Set(current);\n\t\t\t\t\t\tnext.delete(id);\n\t\t\t\t\t\treturn next;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tsetError(nextError);\n\t\t\t\tonError?.(nextError);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\taccessors,\n\t\t\tapplySelection,\n\t\t\tonError,\n\t\t\tonItemDelete,\n\t\t\tremovedIds,\n\t\t\tselectedIds,\n\t\t\tselectedSet,\n\t\t],\n\t);\n\n\treturn {\n\t\ttab,\n\t\tsetTab,\n\t\tview,\n\t\tsetView,\n\t\tquery,\n\t\tsetQuery,\n\t\ttype,\n\t\tsetType,\n\t\tcollection,\n\t\tsetCollection,\n\t\tsort,\n\t\tsetSort,\n\t\tdetailId,\n\t\tsetDetailId,\n\t\titems: patchedItems,\n\t\tvisibleItems,\n\t\tselectedIds,\n\t\tselectedItems,\n\t\tselectedSet,\n\t\ttoggleSelection,\n\t\tclearSelection,\n\t\tclearFilters,\n\t\tloading,\n\t\terror,\n\t\thasFilters,\n\t\ttotalCount,\n\t\tfilteredCount,\n\t\tstagedFiles,\n\t\taddFiles,\n\t\tremoveStagedFile,\n\t\tclearStagedFiles,\n\t\tupdateUploadOptions,\n\t\tuploadOptions,\n\t\tuploading,\n\t\tstartUpload,\n\t\tcancelUpload,\n\t\tupdateItem,\n\t\tremoveItem,\n\t\taccessors,\n\t};\n}\n","import {\n\tArrowLeft,\n\tCheck,\n\tFile,\n\tGrid2X2,\n\tImageIcon,\n\tInfo,\n\tLayoutList,\n\tLayers3,\n\tLock,\n\tPlay,\n\tSearch,\n\tTrash2,\n\tUploadCloud,\n\tVideo,\n\tX,\n} from 'lucide-react';\nimport { useEffect, useState, type ReactNode } from 'react';\n\nimport { Badge } from '../../../base/badge';\nimport { Button } from '../../../base/buttons';\nimport { EmptyState } from '../../../blocks/data-display';\nimport { FormField } from '../../../base/forms';\nimport { Input } from '../../../base/text-inputs';\nimport { Select, Switch } from '../../../base/choice-inputs';\nimport { Dropzone } from '../../../base/upload';\nimport { Grid, Stack } from '../../../base/structure';\nimport { Dimensions, FileSize, Percent, formatFileSize } from '../../../primitives';\nimport { DisplayLabel, Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\nimport { controlGroupHeightClasses, segmentedControlRecipes } from '../../../../lib/control-group-recipes';\nimport { useDensityConfig } from '../../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../../lib/ui-provider/scale';\n\nconst selectionTargetClassName = 'absolute inset-0 z-10 box-border block h-full w-full cursor-pointer border-0 bg-transparent p-0 font-sans outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset';\n\nimport {\n\tformatMediaLibraryString,\n\ttype MediaLibraryStrings,\n} from '../media-library.strings';\nimport type {\n\tMediaLibraryCardProps,\n\tMediaLibraryDetailPanelProps,\n\tMediaLibraryEmptyStateProps,\n\tMediaLibraryFooterActionsProps,\n\tMediaLibraryFooterProps,\n\tMediaLibraryFooterSummaryProps,\n\tMediaLibraryListProps,\n\tMediaLibraryToolbarProps,\n\tMediaLibraryUploadPanelProps,\n\tMediaLibraryItemType,\n} from '../media-library.types';\n\nfunction typeIcon(type: MediaLibraryItemType, className?: string) {\n\tif (type === 'image') return <ImageIcon className={className ?? 'size-icon'} />;\n\tif (type === 'video') return <Video className={className ?? 'size-icon'} />;\n\treturn <File className={className ?? 'size-icon'} />;\n}\n\nfunction typeLabel(type: MediaLibraryItemType, strings: MediaLibraryStrings) {\n\tif (type === 'image') return strings.typeImage;\n\tif (type === 'video') return strings.typeVideo;\n\treturn strings.typeFile;\n}\n\nfunction usedInLabel(count: number | undefined, strings: MediaLibraryStrings) {\n\tif (!count) return strings.notUsed;\n\treturn formatMediaLibraryString(strings.usedIn, { count });\n}\n\nfunction MediaPreview({\n\tchildren,\n\ttint,\n\tclassName,\n}: {\n\tchildren: ReactNode;\n\ttint?: string;\n\tclassName?: string;\n}) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'media-library-preview relative overflow-hidden bg-muted',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={tint ? { background: tint } : undefined}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nfunction MediaPreviewImage({\n\tsrc,\n\talt,\n\ttype,\n\tclassName,\n\tloading = 'lazy',\n}: {\n\tsrc?: string;\n\talt: string;\n\ttype: MediaLibraryItemType;\n\tclassName?: string;\n\tloading?: 'eager' | 'lazy';\n}) {\n\tconst [failed, setFailed] = useState(false);\n\n\tuseEffect(() => {\n\t\tsetFailed(false);\n\t}, [src]);\n\n\tif (!src || failed) {\n\t\treturn (\n\t\t\t<div className=\"media-library-preview--fallback flex size-full items-center justify-center text-muted-foreground\">\n\t\t\t\t{typeIcon(type, 'size-6')}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<img\n\t\t\tsrc={src}\n\t\t\talt={alt}\n\t\t\tloading={loading}\n\t\t\tclassName={className}\n\t\t\tonError={() => setFailed(true)}\n\t\t/>\n\t);\n}\n\nexport function MediaLibraryEmptyState({\n\ticon,\n\ttitle,\n\tdescription,\n\taction,\n\tclassName,\n}: MediaLibraryEmptyStateProps) {\n\treturn (\n\t\t<EmptyState\n\t\t\ttitle={title}\n\t\t\tdescription={description ?? false}\n\t\t\tactions={action}\n\t\t\tmedia={icon ?? <ImageIcon className=\"size-icon\" aria-hidden=\"true\" />}\n\t\t\tmediaVariant=\"icon-soft\"\n\t\t\tpadding=\"md\"\n\t\t\tborder\n\t\t\tclassName={cn('media-library-empty-state--component min-h-64 bg-muted/20', className)}\n\t\t/>\n\t);\n}\n\nexport function MediaLibraryToolbar({\n\tquery,\n\ttype,\n\ttypeFilters,\n\tcollection,\n\tsort,\n\tview,\n\tcollections = [],\n\tstrings,\n\tonQueryChange,\n\tonTypeChange,\n\tonCollectionChange,\n\tonSortChange,\n\tonViewChange,\n\tonClearFilters,\n\ttoolbarEnd,\n}: MediaLibraryToolbarProps) {\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveComponentScale(undefined, defaultScale);\n\tconst typeOptions = [\n\t\t{ value: 'all', label: strings.allTypes, icon: null },\n\t\t{ value: 'image', label: strings.images, icon: ImageIcon },\n\t\t{ value: 'video', label: strings.videos, icon: Video },\n\t\t{ value: 'file', label: strings.files, icon: File },\n\t].filter((option) => (typeFilters ?? ['all', 'image', 'video']).includes(option.value as typeof type));\n\tconst collectionOptions = [\n\t\t{ value: 'all', label: strings.allCollections },\n\t\t...collections.map((option) => ({\n\t\t\tvalue: option.value,\n\t\t\tlabel: String(option.label),\n\t\t})),\n\t];\n\tconst sortOptions = [\n\t\t{ value: 'newest', label: strings.sortNewest },\n\t\t{ value: 'name', label: strings.sortName },\n\t\t{ value: 'size', label: strings.sortSize },\n\t\t{ value: 'usage', label: strings.sortUsage },\n\t];\n\tconst trimmedQuery = query.trim();\n\tconst hasQuery = trimmedQuery.length > 0;\n\tconst hasActiveFilters = hasQuery || type !== 'all' || collection !== 'all';\n\n\treturn (\n\t\t<Stack direction=\"horizontal\" wrap align=\"start\" gap=\"md\" className=\"media-library-toolbar--component\">\n\t\t\t<Stack gap=\"xs\" className=\"media-library-toolbar--search min-w-52 flex-1\">\n\t\t\t\t<Input\n\t\t\t\t\tvalue={query}\n\t\t\t\t\tonChange={(event) => onQueryChange(event.target.value)}\n\t\t\t\t\tplaceholder={strings.searchPlaceholder}\n\t\t\t\t\tstartIcon={Search}\n\t\t\t\t\tclearable\n\t\t\t\t\tonClear={() => onQueryChange('')}\n\t\t\t\t\tstrings={{ clear: strings.clearSearch }}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'bg-background',\n\t\t\t\t\t\thasQuery && 'border-info/60 bg-info/5 text-foreground shadow-xs ring-1 ring-info/15',\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t\t{!!hasQuery && (\n\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"xs\" wrap={false} className=\"media-library-toolbar--search-value px-space-xs\">\n\t\t\t\t\t\t<Badge tone=\"info\" className=\"max-w-full\">\n\t\t\t\t\t\t\t<Search className=\"size-icon-sm\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" className=\"text-current\">\n\t\t\t\t\t\t\t\t{strings.activeSearchLabel}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"normal\" className=\"min-w-0 truncate text-current\">\n\t\t\t\t\t\t\t\t{trimmedQuery}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t\t<div className={cn('media-library-toolbar--type-toggle', segmentedControlRecipes.frame, controlGroupHeightClasses[size])} role=\"tablist\" aria-label={strings.typeFilterLabel}>\n\t\t\t\t{typeOptions.map((option) => {\n\t\t\t\t\tconst Icon = option.icon;\n\t\t\t\t\tconst active = type === option.value;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\taria-selected={active}\n\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\tsegmentedControlRecipes.item, 'shadow-none',\n\t\t\t\t\t\t\t\tactive\n\t\t\t\t\t\t\t\t\t? 'bg-background text-foreground shadow-xs hover:bg-background'\n\t\t\t\t\t\t\t\t\t: 'text-muted-foreground hover:bg-transparent hover:text-foreground',\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tonClick={() => onTypeChange(option.value as typeof type)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{Icon && <Icon className=\"size-icon-md\" />}\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" className=\"text-inherit\">{option.label}</Text>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t\t<div className=\"min-w-40\">\n\t\t\t\t<Select\n\t\t\t\t\tvalue={collection}\n\t\t\t\t\toptions={collectionOptions}\n\t\t\t\t\tonValueChange={(value) => onCollectionChange(value ?? 'all')}\n\t\t\t\t\tplaceholder={strings.collectionFilterLabel}\n\t\t\t\t\taria-label={strings.collectionFilterLabel}\n\t\t\t\t\tclassName=\"bg-background\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className=\"min-w-32\">\n\t\t\t\t<Select\n\t\t\t\t\tvalue={sort}\n\t\t\t\t\toptions={sortOptions}\n\t\t\t\t\tonValueChange={(value) => onSortChange((value ?? 'newest') as typeof sort)}\n\t\t\t\t\tplaceholder={strings.sortLabel}\n\t\t\t\t\taria-label={strings.sortLabel}\n\t\t\t\t\tclassName=\"bg-background\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className={cn('media-library-toolbar--view-toggle ml-auto', segmentedControlRecipes.frame, controlGroupHeightClasses[size])}>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttone={view === 'grid' ? 'neutral' : 'secondary'}\n\t\t\t\t\tbuttonStyle={view === 'grid' ? 'solid' : 'ghost'}\n\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\tclassName={cn(segmentedControlRecipes.item, view === 'grid' && 'bg-background text-foreground shadow-xs hover:bg-background')}\n\t\t\t\t\taria-label={strings.gridView}\n\t\t\t\t\tonClick={() => onViewChange('grid')}\n\t\t\t\t>\n\t\t\t\t\t<Grid2X2 className=\"size-icon-md\" />\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttone={view === 'table' ? 'neutral' : 'secondary'}\n\t\t\t\t\tbuttonStyle={view === 'table' ? 'solid' : 'ghost'}\n\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\tclassName={cn(segmentedControlRecipes.item, view === 'table' && 'bg-background text-foreground shadow-xs hover:bg-background')}\n\t\t\t\t\taria-label={strings.tableView}\n\t\t\t\t\tonClick={() => onViewChange('table')}\n\t\t\t\t>\n\t\t\t\t\t<LayoutList className=\"size-icon-md\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t\t{!!hasActiveFilters && (\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\tonClick={onClearFilters}\n\t\t\t\t>\n\t\t\t\t\t{strings.clearFilters}\n\t\t\t\t</Button>\n\t\t\t)}\n\t\t\t{toolbarEnd}\n\t\t</Stack>\n\t);\n}\n\nexport function MediaLibraryCard<TItem>({\n\titem,\n\tselected = false,\n\tdensity = 'comfortable',\n\tshowMeta = true,\n\taccessors,\n\tstrings,\n\tonToggle,\n\tonDetails,\n\tclassName,\n}: MediaLibraryCardProps<TItem>) {\n\tconst type = accessors.getType(item);\n\tconst name = accessors.getName(item);\n\tconst src = accessors.getSrc(item);\n\tconst alt = accessors.getAlt(item) || name;\n\tconst size = accessors.getSize(item);\n\tconst usageCount = accessors.getUsageCount(item);\n\tconst isPrivate = accessors.getPublic(item) === false;\n\tconst duration = accessors.getDuration(item);\n\n\treturn (\n\t\t<div\n\t\t\tdata-selected={selected || undefined}\n\t\t\tdata-gallery-density={density}\n\t\t\tclassName={cn(\n\t\t\t\t'media-library-card--component relative group/card overflow-hidden rounded-radius border border-border/70 bg-card text-left shadow-xs transition-all',\n\t\t\t\t'hover:border-primary/30 hover:shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n\t\t\t\tselected && 'media-library-card--selected border-primary ring-1 ring-primary',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tonClick={onToggle}\n\t\t>\n\t\t\t{!!onToggle && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-label={name}\n\t\t\t\t\taria-pressed={selected}\n\t\t\t\t\tclassName={cn('media-library-card--select rounded-radius', selectionTargetClassName)}\n\t\t\t\t\tonClick={(event) => { event.stopPropagation(); onToggle(); }}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<MediaPreview\n\t\t\t\ttint={accessors.getTint(item)}\n\t\t\t\tclassName={cn(density === 'compact' ? 'aspect-square' : 'aspect-[4/3]')}\n\t\t\t>\n\t\t\t\t<MediaPreviewImage src={src} alt={alt} type={type} className=\"size-full object-cover\" />\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'media-library-card--check absolute left-2 top-2 inline-flex size-icon-lg items-center justify-center rounded-radius border border-border bg-background/95 text-transparent opacity-0 shadow-xs backdrop-blur transition-opacity group-hover/card:opacity-100 group-focus-within/card:opacity-100',\n\t\t\t\t\t\tselected && 'bg-primary text-primary-foreground opacity-100',\n\t\t\t\t\t)}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<Check className=\"size-icon-sm\" />\n\t\t\t\t</span>\n\t\t\t\t{!!onDetails && (\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tbuttonStyle=\"solid\"\n\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\tclassName=\"media-library-card--details absolute z-20 right-2 top-2 opacity-0 shadow-sm transition-opacity group-hover/card:opacity-100 group-focus-within/card:opacity-100\"\n\t\t\t\t\t\taria-label={formatMediaLibraryString(strings.cardDetails, { name })}\n\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\tonDetails();\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Info className=\"size-icon-md\" />\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t\t{type === 'video' && !!duration && (\n\t\t\t\t\t<Badge\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tclassName=\"media-library-card--duration absolute bottom-2 left-2 bg-inverse-background text-inverse-foreground\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Play className=\"size-icon-sm fill-current\" />\n\t\t\t\t\t\t{duration}\n\t\t\t\t\t</Badge>\n\t\t\t\t)}\n\t\t\t\t{isPrivate && (\n\t\t\t\t\t<Badge\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tclassName=\"media-library-card--private absolute bottom-2 right-2 bg-card text-card-foreground\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Lock className=\"size-icon-sm\" />\n\t\t\t\t\t</Badge>\n\t\t\t\t)}\n\t\t\t</MediaPreview>\n\t\t\t<div className={cn(\n\t\t\t\t'media-library-card--body',\n\t\t\t\tdensity === 'compact' ? 'p-surface-xs' : 'p-surface',\n\t\t\t)}>\n\t\t\t<Grid columns={1} gap=\"xs\">\n\t\t\t\t<Text tag=\"div\" weight=\"semibold\" className=\"truncate\">\n\t\t\t\t\t{name}\n\t\t\t\t</Text>\n\t\t\t\t{showMeta && (\n\t\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" justify=\"between\" gap=\"md\" className=\"min-w-0\">\n\t\t\t\t\t\t<FileSize value={size} size=\"xs\" className=\"truncate\" emptyLabel={strings.unknownSize} />\n\t\t\t\t\t\t{!!usageCount && (\n\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex items-center gap-space-xs\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Layers3 className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t\t{usageCount}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\t\t\t</Grid>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nexport function MediaLibraryList<TItem>({\n\titems,\n\tselectedSet,\n\taccessors,\n\tstrings,\n\tonToggle,\n\tonDetails,\n}: MediaLibraryListProps<TItem>) {\n\treturn (\n\t\t<div\n\t\t\tclassName=\"media-library-list--component min-w-180\"\n\t\t>\n\t\t\t<div className=\"sticky top-0 z-10 grid grid-cols-[32px_42px_minmax(0,1fr)_86px_88px_120px_72px_34px] items-center gap-space-lg border-b border-border bg-background px-row-x py-row-y\">\n\t\t\t\t<span />\n\t\t\t\t<span />\n\t\t\t\t<DisplayLabel>\n\t\t\t\t\t{strings.table.name}\n\t\t\t\t</DisplayLabel>\n\t\t\t\t<DisplayLabel>\n\t\t\t\t\t{strings.table.type}\n\t\t\t\t</DisplayLabel>\n\t\t\t\t<DisplayLabel>\n\t\t\t\t\t{strings.table.size}\n\t\t\t\t</DisplayLabel>\n\t\t\t\t<DisplayLabel>\n\t\t\t\t\t{strings.table.collection}\n\t\t\t\t</DisplayLabel>\n\t\t\t\t<DisplayLabel>\n\t\t\t\t\t{strings.table.used}\n\t\t\t\t</DisplayLabel>\n\t\t\t\t<span />\n\t\t\t</div>\n\t\t\t{items.map((item) => {\n\t\t\t\tconst id = accessors.getId(item);\n\t\t\t\tconst selected = selectedSet.has(id);\n\t\t\t\tconst type = accessors.getType(item);\n\t\t\t\tconst name = accessors.getName(item);\n\t\t\t\tconst src = accessors.getSrc(item);\n\t\t\t\tconst isPrivate = accessors.getPublic(item) === false;\n\t\t\t\treturn (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\tdata-selected={selected || undefined}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'media-library-list--row relative grid grid-cols-[32px_42px_minmax(0,1fr)_86px_88px_120px_72px_34px] items-center gap-space-lg border-b border-border/60 px-row-x py-row-y last:border-b-0',\n\t\t\t\t\t\t\t'cursor-pointer rounded-inner transition-colors hover:bg-muted/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset',\n\t\t\t\t\t\t\tselected && 'bg-primary/10',\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tonClick={() => onToggle(id)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\taria-label={name}\n\t\t\t\t\t\t\taria-pressed={selected}\n\t\t\t\t\t\t\tclassName={cn('media-library-list--select rounded-inner', selectionTargetClassName)}\n\t\t\t\t\t\t\tonClick={(event) => { event.stopPropagation(); onToggle(id); }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'inline-flex size-icon-lg items-center justify-center rounded-radius border border-border text-transparent',\n\t\t\t\t\t\t\t\tselected && 'border-primary bg-primary text-primary-foreground',\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Check className=\"size-icon-sm\" />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<MediaPreview\n\t\t\t\t\t\t\ttint={accessors.getTint(item)}\n\t\t\t\t\t\t\tclassName=\"size-9 rounded-inner\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{src ? (\n\t\t\t\t\t\t\t\t<img src={src} alt=\"\" loading=\"lazy\" className=\"size-full object-cover\" />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<div className=\"flex size-full items-center justify-center text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t{typeIcon(type, 'size-icon')}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</MediaPreview>\n\t\t\t\t\t\t<Text tag=\"div\" weight=\"semibold\" className=\"flex min-w-0 items-center gap-space-xs truncate\">\n\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t\t{isPrivate && <Lock className=\"size-icon-sm shrink-0 text-muted-foreground\" />}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t<Badge tone=\"secondary\">{typeLabel(type, strings)}</Badge>\n\t\t\t\t\t\t<FileSize value={accessors.getSize(item)} size=\"xs\" emptyLabel={strings.unknownSize} />\n\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"truncate\">\n\t\t\t\t\t\t\t{accessors.getCollection(item) || '-'}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t\t{accessors.getUsageCount(item) ? accessors.getUsageCount(item) : '-'}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\tclassName=\"relative z-20\"\n\t\t\t\t\t\t\taria-label={formatMediaLibraryString(strings.cardDetails, { name })}\n\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\tonDetails(id);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Info className=\"size-icon-md\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n\nexport function MediaLibraryDetailPanel<TItem>({\n\titem,\n\tcollections = [],\n\taccessors,\n\tstrings,\n\tonClose,\n\tonUpdate,\n\tonRemove,\n\tonReplace,\n\trenderDetail,\n}: MediaLibraryDetailPanelProps<TItem>) {\n\tif (!item) return null;\n\tconst name = accessors.getName(item);\n\tconst type = accessors.getType(item);\n\tconst src = accessors.getSrc(item);\n\tconst collection = accessors.getCollection(item) ?? collections[0]?.value ?? '';\n\tconst tags = accessors.getTags(item);\n\tconst isPublic = accessors.getPublic(item) ?? true;\n\tconst custom = renderDetail?.(item, {\n\t\taccessors,\n\t\tupdate: onUpdate,\n\t\tremove: onRemove,\n\t\treplace: onReplace,\n\t\tclose: onClose,\n\t});\n\tif (custom) return <>{custom}</>;\n\n\treturn (\n\t\t<aside className=\"media-library-detail-panel--component flex min-h-0 w-full flex-col border-l border-border bg-background @2xl/media-library:w-72\">\n\t\t\t<div className=\"media-library-detail-panel--header border-b border-border p-surface\">\n\t\t\t<Stack direction=\"horizontal\" align=\"center\" gap=\"md\">\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\taria-label={strings.detail.close}\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t>\n\t\t\t\t\t<ArrowLeft className=\"size-icon-md\" />\n\t\t\t\t</Button>\n\t\t\t\t<Text weight=\"semibold\">{strings.detail.title}</Text>\n\t\t\t</Stack>\n\t\t\t</div>\n\t\t\t<div className=\"media-library-detail-panel--body grid min-h-0 gap-space-xl overflow-y-auto p-surface\">\n\t\t\t\t<MediaPreview\n\t\t\t\t\ttint={accessors.getTint(item)}\n\t\t\t\t\tclassName=\"aspect-[4/3] rounded-radius border border-border\"\n\t\t\t\t>\n\t\t\t\t\t<MediaPreviewImage src={src} alt={accessors.getAlt(item) || name} type={type} className=\"size-full object-cover\" />\n\t\t\t\t\t{type === 'video' && !!accessors.getDuration(item) && (\n\t\t\t\t\t\t<Badge className=\"absolute bottom-2 right-2 bg-inverse-background text-inverse-foreground\">\n\t\t\t\t\t\t\t<Play className=\"size-icon-sm fill-current\" />\n\t\t\t\t\t\t\t{accessors.getDuration(item)}\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t)}\n\t\t\t\t</MediaPreview>\n\t\t\t\t<Text tag=\"div\" weight=\"semibold\" className=\"break-words\">\n\t\t\t\t\t{name}\n\t\t\t\t</Text>\n\t\t\t\t\t<Grid render={<dl />} columns={1} gap=\"md\" className=\"media-library-detail-panel--facts\">\n\t\t\t\t\t\t{([\n\t\t\t\t\t\t\t[strings.detail.type, typeLabel(type, strings)],\n\t\t\t\t\t\t\t[strings.detail.size, <FileSize value={accessors.getSize(item)} weight=\"medium\" emptyLabel={strings.unknownSize} />],\n\t\t\t\t\t\t\t[strings.detail.dimensions, (\n\t\t\t\t\t\t\t\t<Dimensions\n\t\t\t\t\t\t\t\t\twidth={accessors.getWidth(item)}\n\t\t\t\t\t\t\t\t\theight={accessors.getHeight(item)}\n\t\t\t\t\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\t\t\t\t\temptyLabel={strings.unknownSize}\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[strings.detail.uploaded, String(accessors.getUploadedAt(item) ?? '-')],\n\t\t\t\t\t\t\t[strings.detail.usedIn, usedInLabel(accessors.getUsageCount(item), strings)],\n\t\t\t\t\t\t] satisfies Array<[string, ReactNode]>).map(([label, value]) => (\n\t\t\t\t\t\t<Stack direction=\"horizontal\" justify=\"between\" gap=\"xl\" key={label}>\n\t\t\t\t\t\t\t<dt>\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t</dt>\n\t\t\t\t\t\t\t<dd className=\"m-0 text-right\">\n\t\t\t\t\t\t\t\t{typeof value === 'string' ? (\n\t\t\t\t\t\t\t\t\t<Text tag=\"span\" weight=\"medium\">\n\t\t\t\t\t\t\t\t\t\t{value}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\tvalue\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</dd>\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t))}\n\t\t\t\t\t</Grid>\n\t\t\t\t<FormField label={strings.detail.altText}>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tvalue={accessors.getAlt(item) ?? ''}\n\t\t\t\t\t\tplaceholder={strings.detail.altPlaceholder}\n\t\t\t\t\t\tonChange={(event) => onUpdate({ alt: event.target.value })}\n\t\t\t\t\t/>\n\t\t\t\t</FormField>\n\t\t\t\t<FormField label={strings.detail.collection}>\n\t\t\t\t\t<Select\n\t\t\t\t\t\tvalue={collection}\n\t\t\t\t\t\toptions={collections.map((option) => ({\n\t\t\t\t\t\t\tvalue: option.value,\n\t\t\t\t\t\t\tlabel: String(option.label),\n\t\t\t\t\t\t}))}\n\t\t\t\t\t\taria-label={strings.detail.collection}\n\t\t\t\t\t\tonValueChange={(value) => onUpdate({ collection: value })}\n\t\t\t\t\t/>\n\t\t\t\t</FormField>\n\t\t\t\t<FormField label={strings.detail.tags}>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tvalue={tags.join(', ')}\n\t\t\t\t\t\tplaceholder={strings.detail.tagsPlaceholder}\n\t\t\t\t\t\tonChange={(event) =>\n\t\t\t\t\t\t\tonUpdate({\n\t\t\t\t\t\t\t\ttags: event.target.value\n\t\t\t\t\t\t\t\t\t.split(',')\n\t\t\t\t\t\t\t\t\t.map((tag) => tag.trim())\n\t\t\t\t\t\t\t\t\t.filter(Boolean),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t</FormField>\n\t\t\t\t<div className=\"media-library-detail-panel--public rounded-radius border border-border bg-muted/20 p-surface\">\n\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" justify=\"between\" gap=\"xl\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<Text weight=\"semibold\">\n\t\t\t\t\t\t\t{strings.detail.public}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t\t{isPublic ? strings.detail.publicHint : strings.detail.privateHint}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<Switch\n\t\t\t\t\t\taria-label={strings.detail.public}\n\t\t\t\t\t\tchecked={isPublic}\n\t\t\t\t\t\tonValueChange={(checked) => onUpdate({ public: checked })}\n\t\t\t\t\t/>\n\t\t\t\t</Stack>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"media-library-detail-panel--actions flex flex-wrap gap-space-md\">\n\t\t\t\t\t{onReplace && <Button type=\"button\" tone=\"secondary\" buttonStyle=\"outline\" onClick={onReplace}>\n\t\t\t\t\t\t<UploadCloud className=\"size-icon-md\" />\n\t\t\t\t\t\t{strings.detail.replace}\n\t\t\t\t\t</Button>}\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\ttone=\"destructive\"\n\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\tonClick={onRemove}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Trash2 className=\"size-icon-md\" />\n\t\t\t\t\t\t{strings.detail.delete}\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</aside>\n\t);\n}\n\nexport function MediaLibraryUploadPanel({\n\tstagedFiles,\n\tuploadOptions,\n\tcollections = [],\n\tuploading = false,\n\tstrings,\n\tonFiles,\n\tonRemoveFile,\n\tonOptionsChange,\n\tempty,\n}: MediaLibraryUploadPanelProps) {\n\treturn (\n\t\t<div className=\"media-library-upload-panel--component p-surface\">\n\t\t<Stack gap=\"xl\">\n\t\t\t<Dropzone\n\t\t\t\tonDrop={onFiles}\n\t\t\t\taccept=\"image/*,video/*\"\n\t\t\t\tmultiple\n\t\t\t\tsize=\"md\"\n\t\t\t\tstrings={{\n\t\t\t\t\tinstruction: strings.upload.dropTitle,\n\t\t\t\t\thelper: strings.upload.dropHint,\n\t\t\t\t\tdragOver: strings.upload.dragOver,\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t{stagedFiles.length > 0 ? (\n\t\t\t\t<Stack gap=\"md\" className=\"media-library-upload-panel--staged\">\n\t\t\t\t\t{stagedFiles.map((file) => (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={file.id}\n\t\t\t\t\t\t\tclassName=\"media-library-upload-panel--staged-file flex items-center gap-space-lg rounded-radius border border-border bg-card px-row-x py-row-y\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<MediaPreview className=\"size-10 rounded-inner\">\n\t\t\t\t\t\t\t\t{file.src ? (\n\t\t\t\t\t\t\t\t\t<img src={file.src} alt={file.name} className=\"size-full object-cover\" />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<div className=\"flex size-full items-center justify-center text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t{typeIcon(file.type, 'size-icon')}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</MediaPreview>\n\t\t\t\t\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t\t<div className=\"flex items-baseline gap-space-lg\">\n\t\t\t\t\t\t\t\t\t<Text weight=\"semibold\" className=\"truncate\">\n\t\t\t\t\t\t\t\t\t\t{file.name}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t<FileSize value={file.size} size=\"xs\" className=\"ml-auto shrink-0\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{(file.status === 'uploading' || file.status === 'done') && (\n\t\t\t\t\t\t\t\t\t<div className=\"mt-space-md h-1 overflow-hidden rounded-full bg-muted\">\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-full rounded-full bg-primary transition-[width]\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: `${file.progress}%` }}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{file.status === 'error' && (\n\t\t\t\t\t\t\t\t\t<Text type=\"error\">\n\t\t\t\t\t\t\t\t\t\t{file.error}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{file.status === 'done' ? (\n\t\t\t\t\t\t\t\t<Badge tone=\"success\">{strings.upload.done}</Badge>\n\t\t\t\t\t\t\t) : file.status === 'uploading' ? (\n\t\t\t\t\t\t\t\t<Percent value={Math.round(file.progress)} scaled size=\"xs\" type=\"secondary\" />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\t\tdisabled={uploading}\n\t\t\t\t\t\t\t\t\taria-label={formatMediaLibraryString(strings.upload.removeFile, {\n\t\t\t\t\t\t\t\t\t\tname: file.name,\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\tonClick={() => onRemoveFile(file.id)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<X className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</Stack>\n\t\t\t) : (\n\t\t\t\tempty\n\t\t\t)}\n\t\t\t<div className=\"media-library-upload-panel--options grid gap-space-lg rounded-radius border border-border bg-muted/20 p-surface @2xl/media-library:grid-cols-[minmax(0,1fr)_minmax(0,1fr)_auto]\">\n\t\t\t\t<FormField label={strings.upload.collection}>\n\t\t\t\t\t<Select\n\t\t\t\t\t\tvalue={uploadOptions.collection ?? collections[0]?.value}\n\t\t\t\t\t\toptions={collections.map((option) => ({\n\t\t\t\t\t\t\tvalue: option.value,\n\t\t\t\t\t\t\tlabel: String(option.label),\n\t\t\t\t\t\t}))}\n\t\t\t\t\t\taria-label={strings.upload.collection}\n\t\t\t\t\t\tonValueChange={(value) => onOptionsChange({ collection: value })}\n\t\t\t\t\t/>\n\t\t\t\t</FormField>\n\t\t\t\t<FormField label={strings.upload.tags}>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tvalue={uploadOptions.tags.join(', ')}\n\t\t\t\t\t\tplaceholder={strings.upload.tagsPlaceholder}\n\t\t\t\t\t\tonChange={(event) =>\n\t\t\t\t\t\t\tonOptionsChange({\n\t\t\t\t\t\t\t\ttags: event.target.value\n\t\t\t\t\t\t\t\t\t.split(',')\n\t\t\t\t\t\t\t\t\t.map((tag) => tag.trim())\n\t\t\t\t\t\t\t\t\t.filter(Boolean),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t</FormField>\n\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" justify=\"between\" gap=\"xl\" className=\"@2xl/media-library:self-end\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<Text weight=\"semibold\">\n\t\t\t\t\t\t\t{strings.upload.public}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t\t{strings.upload.publicHint}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<Switch\n\t\t\t\t\t\taria-label={strings.upload.public}\n\t\t\t\t\t\tchecked={uploadOptions.public}\n\t\t\t\t\t\tonValueChange={(checked) => onOptionsChange({ public: checked })}\n\t\t\t\t\t/>\n\t\t\t\t</Stack>\n\t\t\t</div>\n\t\t</Stack>\n\t\t</div>\n\t);\n}\n\nexport function MediaLibraryFooterSummary({\n\ttab,\n\tselectedIds,\n\tselectionMode,\n\tstagedFiles,\n\tstrings,\n\tonClearSelection,\n\tclassName,\n}: MediaLibraryFooterSummaryProps) {\n\tconst selectedCount = selectedIds.length;\n\tconst stagedSize = stagedFiles.reduce((sum, file) => sum + file.size, 0);\n\tconst stagedCount = stagedFiles.length;\n\tconst summaryClassName = cn(\n\t\t'media-library-footer-summary--component flex min-w-0 items-center gap-space-lg',\n\t\tclassName,\n\t);\n\n\tif (tab === 'upload') {\n\t\treturn (\n\t\t\t<div className={summaryClassName} aria-live=\"polite\">\n\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"truncate\">\n\t\t\t\t\t{stagedCount === 0\n\t\t\t\t\t\t? strings.footer.noFiles\n\t\t\t\t\t\t: formatMediaLibraryString(strings.footer.stagedSummary, {\n\t\t\t\t\t\t\tcount: stagedCount,\n\t\t\t\t\t\t\tsize: formatFileSize(stagedSize) ?? strings.unknownSize,\n\t\t\t\t\t\t})}\n\t\t\t\t</Text>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={summaryClassName} aria-live=\"polite\">\n\t\t\t{selectedCount > 0 ? (\n\t\t\t\t<>\n\t\t\t\t\t<Text weight=\"semibold\" className=\"whitespace-nowrap\">\n\t\t\t\t\t\t{formatMediaLibraryString(strings.footer.selectedCount, {\n\t\t\t\t\t\t\tcount: selectedCount,\n\t\t\t\t\t\t})}\n\t\t\t\t\t</Text>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tonClick={onClearSelection}\n\t\t\t\t\t>\n\t\t\t\t\t\t{strings.footer.clear}\n\t\t\t\t\t</Button>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<Text size=\"xs\" type=\"secondary\" className=\"truncate\">\n\t\t\t\t\t{selectionMode === 'single' ? strings.footer.pickOne : strings.footer.pickMany}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nexport function MediaLibraryFooterActions<TItem>({\n\ttab,\n\tselectedItems,\n\tselectedIds,\n\tstagedFiles,\n\tuploading = false,\n\tstrings,\n\tconfirmLabel,\n\tcancelLabel,\n\tonCancel,\n\tonConfirm,\n\tonUpload,\n\tonCancelUpload,\n\tclassName,\n}: MediaLibraryFooterActionsProps<TItem>) {\n\tconst selectedCount = selectedIds.length;\n\tconst stagedCount = stagedFiles.length;\n\n\tif (tab === 'upload') {\n\t\treturn (\n\t\t\t<div className={cn('media-library-footer-actions--component flex min-w-0 flex-col-reverse gap-space-md @md/media-library:flex-row @md/media-library:justify-end', className)}>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\tdisabled={uploading}\n\t\t\t\t\tonClick={onCancelUpload}\n\t\t\t\t>\n\t\t\t\t\t{cancelLabel ?? strings.footer.cancel}\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tdisabled={stagedCount === 0 || uploading}\n\t\t\t\t\tonClick={onUpload}\n\t\t\t\t\tloading={uploading}\n\t\t\t\t\tstrings={{ loading: strings.footer.uploading }}\n\t\t\t\t>\n\t\t\t\t\t{stagedCount <= 1\n\t\t\t\t\t\t? strings.footer.upload\n\t\t\t\t\t\t: formatMediaLibraryString(strings.footer.uploadMany, { count: stagedCount })}\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={cn('media-library-footer-actions--component flex min-w-0 flex-col-reverse gap-space-md @md/media-library:flex-row @md/media-library:justify-end', className)}>\n\t\t\t<Button\n\t\t\t\ttype=\"button\"\n\t\t\t\ttone=\"secondary\"\n\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\tonClick={onCancel}\n\t\t\t>\n\t\t\t\t{cancelLabel ?? strings.footer.cancel}\n\t\t\t</Button>\n\t\t\t<Button\n\t\t\t\ttype=\"button\"\n\t\t\t\tdisabled={selectedCount === 0}\n\t\t\t\tonClick={onConfirm}\n\t\t\t>\n\t\t\t\t{confirmLabel ??\n\t\t\t\t\t(selectedCount === 0\n\t\t\t\t\t\t? strings.footer.confirmEmpty\n\t\t\t\t\t\t: selectedItems.length === 1\n\t\t\t\t\t\t\t? strings.footer.confirmOne\n\t\t\t\t\t\t\t: formatMediaLibraryString(strings.footer.confirmMany, {\n\t\t\t\t\t\t\t\tcount: selectedCount,\n\t\t\t\t\t\t\t}))}\n\t\t\t</Button>\n\t\t</div>\n\t);\n}\n\nexport function MediaLibraryFooter<TItem>({\n\ttab,\n\tselectedItems,\n\tselectedIds,\n\tselectionMode,\n\tstagedFiles,\n\tuploading = false,\n\tstrings,\n\tconfirmLabel,\n\tcancelLabel,\n\tonCancel,\n\tonConfirm,\n\tonClearSelection,\n\tonUpload,\n\tonCancelUpload,\n\tchrome = 'section',\n\tclassName,\n}: MediaLibraryFooterProps<TItem>) {\n\treturn (\n\t\t<footer\n\t\t\tclassName={cn(\n\t\t\t\t'media-library-footer--component',\n\t\t\t\tchrome === 'section' && 'border-t border-border bg-background p-surface',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<div className=\"flex min-w-0 flex-col gap-space-lg @md/media-library:flex-row @md/media-library:justify-between\">\n\t\t\t<MediaLibraryFooterSummary\n\t\t\t\ttab={tab}\n\t\t\t\tselectedIds={selectedIds}\n\t\t\t\tselectionMode={selectionMode}\n\t\t\t\tstagedFiles={stagedFiles}\n\t\t\t\tstrings={strings}\n\t\t\t\tonClearSelection={onClearSelection}\n\t\t\t/>\n\t\t\t<MediaLibraryFooterActions\n\t\t\t\ttab={tab}\n\t\t\t\tselectedItems={selectedItems}\n\t\t\t\tselectedIds={selectedIds}\n\t\t\t\tstagedFiles={stagedFiles}\n\t\t\t\tuploading={uploading}\n\t\t\t\tstrings={strings}\n\t\t\t\tconfirmLabel={confirmLabel}\n\t\t\t\tcancelLabel={cancelLabel}\n\t\t\t\tonCancel={onCancel}\n\t\t\t\tonConfirm={onConfirm}\n\t\t\t\tonUpload={onUpload}\n\t\t\t\tonCancelUpload={onCancelUpload}\n\t\t\t/>\n\t\t\t</div>\n\t\t</footer>\n\t);\n}\n","import { ImageIcon, UploadCloud } from 'lucide-react';\nimport { createContext, useContext, useMemo, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { Button } from '../../base/buttons';\nimport { SurfaceTitle } from '../../base/display/surface-title';\nimport { ErrorState, LoadingState } from '../../base/feedback';\nimport { Stack } from '../../base/structure';\nimport { ActionDialog } from '../overlays';\nimport { Number as NumberValue } from '../../primitives';\nimport { Text } from '../../typography';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\nimport { controlGroupHeightClasses, segmentedControlRecipes } from '../../../lib/control-group-recipes';\nimport { useDensityConfig } from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\n\nimport { defaultMediaLibraryStrings, formatMediaLibraryString } from './media-library.strings';\nimport type { MediaLibraryCollectionOption, MediaLibraryDialogProps, MediaLibraryProps } from './media-library.types';\nimport { useMediaLibrary } from './hooks';\nimport {\n\tMediaLibraryCard,\n\tMediaLibraryDetailPanel,\n\tMediaLibraryEmptyState,\n\tMediaLibraryFooter,\n\tMediaLibraryFooterActions,\n\tMediaLibraryFooterSummary,\n\tMediaLibraryList,\n\tMediaLibraryToolbar,\n\tMediaLibraryUploadPanel,\n} from './partials/media-library-partials';\n\ninterface MediaLibraryFooterPortalTarget {\n\telement: HTMLElement | null;\n}\n\nconst MediaLibraryFooterPortalContext = createContext<MediaLibraryFooterPortalTarget | null>(null);\n\nfunction useResolvedCollections<TItem>(\n\texplicit: readonly MediaLibraryCollectionOption[] | undefined,\n\titems: readonly TItem[],\n\tgetCollection: (item: TItem) => string | undefined,\n) {\n\treturn useMemo(() => {\n\t\tif (explicit) return explicit;\n\t\tconst seen = new Set<string>();\n\t\tfor (const item of items) {\n\t\t\tconst collection = getCollection(item);\n\t\t\tif (collection) seen.add(collection);\n\t\t}\n\t\treturn Array.from(seen).map((value) => ({ value, label: value }));\n\t}, [explicit, getCollection, items]);\n}\n\nexport function MediaLibrary<TItem = import('./media-library.types').MediaLibraryItem>({\n\ttitle,\n\ttitleSuffix,\n\tdescription,\n\tconfirmLabel,\n\tcancelLabel,\n\tselectionMode = 'multiple',\n\tdensity = 'comfortable',\n\tshowMeta = true,\n\tallowUpload = true,\n\ttypeFilters,\n\tconfirmOnSelect = false,\n\tonConfirm,\n\tonCancel,\n\tonClose,\n\tstrings: stringsProp,\n\tslots,\n\theightClassName,\n\tclassName,\n\titems,\n\tfetcher,\n\taccessors,\n\tcollections,\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\tonItemUpdate,\n\tonItemDelete,\n\tonItemReplace,\n\tonUpload,\n\tonError,\n\ttab,\n\tdefaultTab,\n\tonTabChange,\n\tview,\n\tdefaultView,\n\tonViewChange,\n\tquery,\n\tdefaultQuery,\n\tonQueryChange,\n\ttype,\n\tdefaultType,\n\tonTypeChange,\n\tcollection,\n\tdefaultCollection,\n\tonCollectionChange,\n\tsort,\n\tdefaultSort,\n\tonSortChange,\n\tuploadOptions,\n\tdefaultUploadOptions,\n\tonUploadOptionsChange,\n\t...props\n}: MediaLibraryProps<TItem>) {\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveComponentScale(undefined, defaultScale);\n\tconst strings = useStrings(defaultMediaLibraryStrings, stringsProp);\n\tconst state = useMediaLibrary<TItem>({\n\t\titems,\n\t\tfetcher,\n\t\taccessors,\n\t\tcollections,\n\t\tselectionMode,\n\t\tvalue,\n\t\tdefaultValue,\n\t\tonValueChange,\n\t\tonItemUpdate,\n\t\tonItemDelete,\n\t\tonUpload,\n\t\tonError,\n\t\ttab,\n\t\tdefaultTab,\n\t\tonTabChange,\n\t\tview,\n\t\tdefaultView,\n\t\tonViewChange,\n\t\tquery,\n\t\tdefaultQuery,\n\t\tonQueryChange,\n\t\ttype,\n\t\tdefaultType,\n\t\tonTypeChange,\n\t\tcollection,\n\t\tdefaultCollection,\n\t\tonCollectionChange,\n\t\tsort,\n\t\tdefaultSort,\n\t\tonSortChange,\n\t\tuploadOptions,\n\t\tdefaultUploadOptions,\n\t\tonUploadOptionsChange,\n\t});\n\tconst resolvedCollections = useResolvedCollections(collections, state.items, state.accessors.getCollection);\n\tconst activeTab = allowUpload ? state.tab : 'library';\n\tconst detailItem = state.detailId\n\t\t? (state.items.find((item) => state.accessors.getId(item) === state.detailId) ?? null)\n\t\t: null;\n\tconst footerPortal = useContext(MediaLibraryFooterPortalContext);\n\tconst usesDefaultFooter = !slots?.footer;\n\tconst dialogSelectionSummary =\n\t\tfooterPortal && usesDefaultFooter ? (\n\t\t\t<MediaLibraryFooterSummary\n\t\t\t\ttab={activeTab}\n\t\t\t\tselectedIds={state.selectedIds}\n\t\t\t\tselectionMode={selectionMode}\n\t\t\t\tstagedFiles={state.stagedFiles}\n\t\t\t\tstrings={strings}\n\t\t\t\tonClearSelection={state.clearSelection}\n\t\t\t\tclassName=\"media-library-dialog--selection-summary shrink-0 justify-end\"\n\t\t\t/>\n\t\t) : null;\n\tconst hasHeaderIdentity = Boolean(title || titleSuffix || description || slots?.headerStart);\n\tconst hasHeaderControls = Boolean(allowUpload || slots?.headerEnd || dialogSelectionSummary);\n\tconst hasHeader = hasHeaderIdentity || hasHeaderControls;\n\n\tconst confirm = () => {\n\t\tonConfirm?.(state.selectedItems, state.selectedIds);\n\t\tonClose?.();\n\t};\n\tconst cancel = () => {\n\t\tonCancel?.();\n\t\tonClose?.();\n\t};\n\tconst confirmItem = (item: TItem) => {\n\t\tconst id = state.accessors.getId(item);\n\t\tstate.toggleSelection(id);\n\t\tif (confirmOnSelect) {\n\t\t\tonConfirm?.([item], [id]);\n\t\t\tonClose?.();\n\t\t}\n\t};\n\tconst trimmedQuery = state.query.trim();\n\tconst countLabel =\n\t\ttrimmedQuery.length > 0\n\t\t\t? formatMediaLibraryString(strings.countSearch, {\n\t\t\t\t\tcount: state.filteredCount,\n\t\t\t\t\ttotal: state.totalCount,\n\t\t\t\t\tquery: trimmedQuery,\n\t\t\t\t})\n\t\t\t: state.filteredCount === state.totalCount\n\t\t\t\t? formatMediaLibraryString(strings.countAll, {\n\t\t\t\t\t\tcount: state.totalCount,\n\t\t\t\t\t})\n\t\t\t\t: formatMediaLibraryString(strings.countFiltered, {\n\t\t\t\t\t\tcount: state.filteredCount,\n\t\t\t\t\t\ttotal: state.totalCount,\n\t\t\t\t\t});\n\tconst footer =\n\t\tslots?.footer ??\n\t\t(footerPortal ? (\n\t\t\t<MediaLibraryFooterActions\n\t\t\t\ttab={activeTab}\n\t\t\t\tselectedItems={state.selectedItems}\n\t\t\t\tselectedIds={state.selectedIds}\n\t\t\t\tstagedFiles={state.stagedFiles}\n\t\t\t\tuploading={state.uploading}\n\t\t\t\tstrings={strings}\n\t\t\t\tconfirmLabel={confirmLabel}\n\t\t\t\tcancelLabel={cancelLabel}\n\t\t\t\tonCancel={cancel}\n\t\t\t\tonConfirm={confirm}\n\t\t\t\tonUpload={state.startUpload}\n\t\t\t\tonCancelUpload={() => {\n\t\t\t\t\tstate.cancelUpload();\n\t\t\t\t\tstate.clearStagedFiles();\n\t\t\t\t\tstate.setTab('library');\n\t\t\t\t}}\n\t\t\t\tclassName=\"ml-auto\"\n\t\t\t/>\n\t\t) : (\n\t\t\t<MediaLibraryFooter\n\t\t\t\ttab={activeTab}\n\t\t\t\tselectedItems={state.selectedItems}\n\t\t\t\tselectedIds={state.selectedIds}\n\t\t\t\tselectionMode={selectionMode}\n\t\t\t\tstagedFiles={state.stagedFiles}\n\t\t\t\tuploading={state.uploading}\n\t\t\t\tstrings={strings}\n\t\t\t\tconfirmLabel={confirmLabel}\n\t\t\t\tcancelLabel={cancelLabel}\n\t\t\t\tonCancel={cancel}\n\t\t\t\tonConfirm={confirm}\n\t\t\t\tonClearSelection={state.clearSelection}\n\t\t\t\tonUpload={state.startUpload}\n\t\t\t\tonCancelUpload={() => {\n\t\t\t\t\tstate.cancelUpload();\n\t\t\t\t\tstate.clearStagedFiles();\n\t\t\t\t\tstate.setTab('library');\n\t\t\t\t}}\n\t\t\t/>\n\t\t));\n\n\treturn (\n\t\t/*\n\t\t * The shell is a named container, and its own chrome switches on the\n\t\t * container's width rather than the viewport's. A media picker is routinely\n\t\t * mounted in a drawer or a split pane on a wide screen; keyed to the\n\t\t * viewport, the header laid out for desktop inside a 400px shell and the\n\t\t * tab group was clipped by `overflow-hidden` below.\n\t\t */\n\t\t<section\n\t\t\tclassName={cn(\n\t\t\t\t'media-library--component @container/media-library flex min-h-0 flex-col overflow-hidden rounded-radius border border-border bg-background',\n\t\t\t\theightClassName ?? 'h-190 max-h-[calc(100vh-7rem)]',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{hasHeader && (\n\t\t\t\t<header className=\"media-library--header flex flex-col gap-space-lg border-b border-border p-surface @2xl/media-library:flex-row @2xl/media-library:items-center @2xl/media-library:justify-between\">\n\t\t\t\t\t\t{hasHeaderIdentity && (\n\t\t\t\t\t\t\t<Stack direction=\"horizontal\" align=\"start\" gap=\"lg\" className=\"min-w-0\">\n\t\t\t\t\t\t\t\t{slots?.headerStart}\n\t\t\t\t\t\t\t\t{(title || titleSuffix || description) && (\n\t\t\t\t\t\t\t\t\t<Stack gap=\"normal\" className=\"min-w-0\">\n\t\t\t\t\t\t\t\t\t\t{!!(title || titleSuffix) && (\n\t\t\t\t\t\t\t\t\t\t\t<SurfaceTitle title={title} suffix={titleSuffix} className=\"media-library--title\" />\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{!!description && (\n\t\t\t\t\t\t\t\t\t\t\t<Text type=\"secondary\">\n\t\t\t\t\t\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{hasHeaderControls && (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'media-library--header-controls flex min-w-0 flex-wrap items-center gap-space-md',\n\t\t\t\t\t\t\t\t\tdialogSelectionSummary ? 'flex-1 justify-between' : '@2xl/media-library:justify-end',\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<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"md\" className=\"min-w-0\">\n\t\t\t\t\t\t\t\t\t{allowUpload && (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn('media-library--tabs', segmentedControlRecipes.frame, controlGroupHeightClasses[size])}\n\t\t\t\t\t\t\t\t\t\t\trole=\"tablist\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-selected={activeTab === 'library'}\n\t\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\tsegmentedControlRecipes.item, 'shadow-none',\n\t\t\t\t\t\t\t\t\t\t\t\t\tactiveTab === 'library'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'bg-background text-foreground shadow-xs hover:bg-background'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'text-muted-foreground hover:bg-transparent hover:text-foreground',\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => state.setTab('library')}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<ImageIcon className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t\t{strings.tabs.library}\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-selected={activeTab === 'upload'}\n\t\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\tsegmentedControlRecipes.item, 'shadow-none',\n\t\t\t\t\t\t\t\t\t\t\t\t\tactiveTab === 'upload'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'bg-background text-foreground shadow-xs hover:bg-background'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'text-muted-foreground hover:bg-transparent hover:text-foreground',\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => state.setTab('upload')}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<UploadCloud className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t\t{strings.tabs.upload}\n\t\t\t\t\t\t\t\t\t\t\t\t{state.stagedFiles.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NumberValue\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={state.stagedFiles.length}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\talign=\"center\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"rounded-full bg-background/20 px-1.5\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{slots?.headerEnd}\n\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t{dialogSelectionSummary}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t</header>\n\t\t\t)}\n\n\t\t\t<div className=\"media-library--body flex min-h-0 flex-1\">\n\t\t\t\t{activeTab === 'upload' ? (\n\t\t\t\t\t<div className=\"min-w-0 flex-1 overflow-y-auto\">\n\t\t\t\t\t\t<MediaLibraryUploadPanel\n\t\t\t\t\t\t\tstagedFiles={state.stagedFiles}\n\t\t\t\t\t\t\tuploadOptions={state.uploadOptions}\n\t\t\t\t\t\t\tcollections={resolvedCollections}\n\t\t\t\t\t\t\tuploading={state.uploading}\n\t\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t\t\tonFiles={state.addFiles}\n\t\t\t\t\t\t\tonRemoveFile={state.removeStagedFile}\n\t\t\t\t\t\t\tonOptionsChange={state.updateUploadOptions}\n\t\t\t\t\t\t\tempty={slots?.uploadEmpty}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'media-library--library min-w-0 flex-1 flex-col',\n\t\t\t\t\t\t\tdetailItem ? 'hidden @2xl/media-library:flex' : 'flex',\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Stack gap=\"md\" className=\"media-library--toolbar border-b border-border/70 p-surface\">\n\t\t\t\t\t\t\t<MediaLibraryToolbar\n\t\t\t\t\t\t\t\tquery={state.query}\n\t\t\t\t\t\t\t\ttype={state.type}\n\t\t\t\t\t\t\t\ttypeFilters={typeFilters}\n\t\t\t\t\t\t\t\tcollection={state.collection}\n\t\t\t\t\t\t\t\tsort={state.sort}\n\t\t\t\t\t\t\t\tview={state.view}\n\t\t\t\t\t\t\t\tcollections={resolvedCollections}\n\t\t\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t\t\t\tonQueryChange={state.setQuery}\n\t\t\t\t\t\t\t\tonTypeChange={state.setType}\n\t\t\t\t\t\t\t\tonCollectionChange={state.setCollection}\n\t\t\t\t\t\t\t\tonSortChange={state.setSort}\n\t\t\t\t\t\t\t\tonViewChange={state.setView}\n\t\t\t\t\t\t\t\tonClearFilters={state.clearFilters}\n\t\t\t\t\t\t\t\ttoolbarEnd={slots?.toolbarEnd}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" aria-live=\"polite\">\n\t\t\t\t\t\t\t\t{countLabel}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\trole=\"region\"\n\t\t\t\t\t\t\taria-label={strings.resultsLabel}\n\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\tclassName=\"media-library--results min-h-0 flex-1 overflow-y-auto p-surface focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{state.loading ? (\n\t\t\t\t\t\t\t\t(slots?.loading ?? <LoadingState className=\"min-h-64\" label={strings.loading} />)\n\t\t\t\t\t\t\t) : state.error ? (\n\t\t\t\t\t\t\t\t(slots?.error ?? <ErrorState title={strings.errorTitle} description={strings.errorDescription} />)\n\t\t\t\t\t\t\t) : state.visibleItems.length === 0 ? (\n\t\t\t\t\t\t\t\t(slots?.empty ?? (\n\t\t\t\t\t\t\t\t\t<MediaLibraryEmptyState\n\t\t\t\t\t\t\t\t\t\ttitle={state.hasFilters ? strings.emptyFilteredTitle : strings.emptyLibraryTitle}\n\t\t\t\t\t\t\t\t\t\tdescription={state.hasFilters ? strings.emptyFilteredDescription : strings.emptyLibraryDescription}\n\t\t\t\t\t\t\t\t\t\taction={\n\t\t\t\t\t\t\t\t\t\t\tstate.hasFilters ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<Button type=\"button\" tone=\"secondary\" buttonStyle=\"outline\" onClick={state.clearFilters}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{strings.clearFilters}\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t) : allowUpload ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<Button type=\"button\" onClick={() => state.setTab('upload')}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<UploadCloud className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t{strings.uploadMedia}\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t) : undefined\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t) : state.view === 'table' ? (\n\t\t\t\t\t\t\t\t<div className=\"overflow-x-auto\">\n\t\t\t\t\t\t\t\t\t<MediaLibraryList\n\t\t\t\t\t\t\t\t\t\titems={state.visibleItems}\n\t\t\t\t\t\t\t\t\t\tselectedSet={state.selectedSet}\n\t\t\t\t\t\t\t\t\t\tselectionMode={selectionMode}\n\t\t\t\t\t\t\t\t\t\taccessors={state.accessors}\n\t\t\t\t\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t\t\t\t\t\tonToggle={(id) => {\n\t\t\t\t\t\t\t\t\t\t\tconst item = state.items.find((candidate) => state.accessors.getId(candidate) === id);\n\t\t\t\t\t\t\t\t\t\t\tif (item) confirmItem(item);\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tonDetails={state.setDetailId}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'media-library--grid grid min-w-0 gap-space-lg',\n\t\t\t\t\t\t\t\t\t\tdensity === 'compact'\n\t\t\t\t\t\t\t\t\t\t\t? 'grid-cols-[repeat(auto-fill,minmax(136px,1fr))]'\n\t\t\t\t\t\t\t\t\t\t\t: 'grid-cols-[repeat(auto-fill,minmax(168px,1fr))]',\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{state.visibleItems.map((item) => {\n\t\t\t\t\t\t\t\t\t\tconst id = state.accessors.getId(item);\n\t\t\t\t\t\t\t\t\t\tconst ctx = {\n\t\t\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\t\tselected: state.selectedSet.has(id),\n\t\t\t\t\t\t\t\t\t\t\tselectionMode,\n\t\t\t\t\t\t\t\t\t\t\taccessors: state.accessors,\n\t\t\t\t\t\t\t\t\t\t\ttoggle: () => confirmItem(item),\n\t\t\t\t\t\t\t\t\t\t\topenDetails: () => state.setDetailId(id),\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\tconst rendered = slots?.renderItem?.(item, ctx);\n\t\t\t\t\t\t\t\t\t\treturn rendered ? (\n\t\t\t\t\t\t\t\t\t\t\t<div key={id}>{rendered}</div>\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<MediaLibraryCard\n\t\t\t\t\t\t\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\t\t\t\t\t\t\titem={item}\n\t\t\t\t\t\t\t\t\t\t\t\tselected={ctx.selected}\n\t\t\t\t\t\t\t\t\t\t\t\tdensity={density}\n\t\t\t\t\t\t\t\t\t\t\t\tshowMeta={showMeta}\n\t\t\t\t\t\t\t\t\t\t\t\tselectionMode={selectionMode}\n\t\t\t\t\t\t\t\t\t\t\t\taccessors={state.accessors}\n\t\t\t\t\t\t\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t\t\t\t\t\t\t\tonToggle={ctx.toggle}\n\t\t\t\t\t\t\t\t\t\t\t\tonDetails={ctx.openDetails}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{activeTab === 'library' && (\n\t\t\t\t\t<MediaLibraryDetailPanel\n\t\t\t\t\t\titem={detailItem}\n\t\t\t\t\t\tcollections={resolvedCollections}\n\t\t\t\t\t\taccessors={state.accessors}\n\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t\tonClose={() => state.setDetailId(null)}\n\t\t\t\t\t\tonUpdate={(patch) => (detailItem ? state.updateItem(detailItem, patch) : Promise.resolve(false))}\n\t\t\t\t\t\tonReplace={onItemReplace && detailItem ? () => onItemReplace(detailItem) : undefined}\n\t\t\t\t\t\tonRemove={async () => {\n\t\t\t\t\t\t\tif (!detailItem) return false;\n\t\t\t\t\t\t\tconst removed = await state.removeItem(detailItem);\n\t\t\t\t\t\t\tif (removed) state.setDetailId(null);\n\t\t\t\t\t\t\treturn removed;\n\t\t\t\t\t\t}}\n\t\t\t\t\t\trenderDetail={slots?.renderDetail}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{footerPortal ? (footerPortal.element ? createPortal(footer, footerPortal.element) : null) : footer}\n\t\t</section>\n\t);\n}\n\nexport function MediaLibraryDialog<TItem = import('./media-library.types').MediaLibraryItem>({\n\topen,\n\tonOpenChange,\n\ttrigger,\n\tdialogTitle,\n\tdialogDescription,\n\tonClose,\n\tclassName,\n\tdialogClassName,\n\tcontentClassName,\n\tcloseOnEscape = true,\n\tcloseOnBackdropClick = true,\n\t...props\n}: MediaLibraryDialogProps<TItem>) {\n\tconst strings = useStrings(defaultMediaLibraryStrings, props.strings);\n\tconst [internalOpen, setInternalOpen] = useState(false);\n\tconst [footerElement, setFooterElement] = useState<HTMLDivElement | null>(null);\n\tconst isOpenControlled = open !== undefined;\n\tconst resolvedOpen = isOpenControlled ? open : internalOpen;\n\tconst handleOpenChange = (nextOpen: boolean) => {\n\t\tif (!isOpenControlled) setInternalOpen(nextOpen);\n\t\tonOpenChange?.(nextOpen);\n\t};\n\tconst closeMediaLibrary = () => {\n\t\thandleOpenChange(false);\n\t\tonClose?.();\n\t};\n\n\treturn (\n\t\t<MediaLibraryFooterPortalContext.Provider value={{ element: footerElement }}>\n\t\t\t<ActionDialog\n\t\t\t\topen={resolvedOpen}\n\t\t\t\tonOpenChange={handleOpenChange}\n\t\t\t\tonClose={onClose}\n\t\t\t\ttrigger={trigger}\n\t\t\t\ttitle={dialogTitle ?? strings.title}\n\t\t\t\tdescription={dialogDescription ?? strings.description}\n\t\t\t\tsize=\"full\"\n\t\t\t\tshowCancel={false}\n\t\t\t\tshowConfirm={false}\n\t\t\t\tfooter={<div ref={setFooterElement} className=\"media-library-dialog--footer @container/media-library w-full\" />}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'media-library-dialog--component max-h-[calc(100vh-2rem)] max-w-[min(1060px,calc(100vw-2rem))] sm:max-w-[min(1060px,calc(100vw-2rem))]',\n\t\t\t\t\tdialogClassName,\n\t\t\t\t)}\n\t\t\t\tcontentClassName={cn('media-library-dialog--body flex min-h-0 flex-col overflow-hidden p-0', contentClassName)}\n\t\t\t\tcloseOnBackdropClick={closeOnBackdropClick}\n\t\t\t\tcloseOnEscape={closeOnEscape}\n\t\t\t>\n\t\t\t\t<MediaLibrary\n\t\t\t\t\t{...(props as MediaLibraryProps<TItem>)}\n\t\t\t\t\tonClose={closeMediaLibrary}\n\t\t\t\t\tclassName={cn('media-library-dialog--library rounded-none border-0', className)}\n\t\t\t\t\theightClassName={props.heightClassName ?? 'min-h-0 flex-1'}\n\t\t\t\t\tstrings={props.strings}\n\t\t\t\t/>\n\t\t\t</ActionDialog>\n\t\t</MediaLibraryFooterPortalContext.Provider>\n\t);\n}\n","import { ArrowLeft, ArrowRight, File, ImagePlus, Lock, Play, Plus, Star, Trash2, X } from 'lucide-react';\n\nimport { Badge } from '../../base/badge';\nimport { Button } from '../../base/buttons';\nimport { Stack } from '../../base/structure';\nimport { FileSize } from '../../primitives';\nimport { Text } from '../../typography';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { defaultMediaLibraryStrings, formatMediaLibraryString } from './media-library.strings';\nimport type { MediaResourceGalleryItemRenderContext, MediaResourceGalleryProps } from './media-library.types';\nimport { resolveMediaLibraryAccessors } from './hooks';\nimport { MediaLibraryEmptyState } from './partials';\n\nfunction moveItem<TItem>(items: readonly TItem[], from: number, to: number) {\n\tconst next = items.slice();\n\tconst [item] = next.splice(from, 1);\n\tif (item === undefined) return next;\n\tnext.splice(to, 0, item);\n\treturn next;\n}\n\nexport function MediaResourceGallery<TItem = import('./media-library.types').MediaLibraryItem>({\n\titems,\n\taccessors: accessorsProp,\n\ttitle,\n\tdescription,\n\tprimaryId,\n\tonPrimaryChange,\n\tonRemove,\n\tonReorder,\n\tonAdd,\n\tmaxItems,\n\tlayout = 'field',\n\tdensity = 'comfortable',\n\treadOnly = false,\n\tempty,\n\taction,\n\trenderItem,\n\tstrings: stringsProp,\n\tclassName,\n\t...props\n}: MediaResourceGalleryProps<TItem>) {\n\tconst strings = useStrings(defaultMediaLibraryStrings, stringsProp);\n\tconst accessors = resolveMediaLibraryAccessors(accessorsProp);\n\tconst total = items.length;\n\tconst resolvedPrimaryId = primaryId ?? (total > 0 ? accessors.getId(items[0] as TItem) : undefined);\n\tconst canAdd = !readOnly && Boolean(onAdd) && (maxItems === undefined || total < maxItems);\n\tconst defaultAction =\n\t\tcanAdd && (layout === 'field' || total > 0) ? (\n\t\t\t<Button type=\"button\" tone=\"secondary\" buttonStyle=\"outline\" icon={Plus} onClick={onAdd}>\n\t\t\t\t{strings.gallery.add}\n\t\t\t</Button>\n\t\t) : maxItems !== undefined && total >= maxItems ? (\n\t\t\t<Badge tone=\"secondary\">{strings.gallery.maxReached}</Badge>\n\t\t) : null;\n\n\tconst move = (from: number, to: number) => {\n\t\tif (to < 0 || to >= total || from === to) return;\n\t\tconst nextItems = moveItem(items, from, to);\n\t\tonReorder?.(\n\t\t\tnextItems.map((item) => accessors.getId(item)),\n\t\t\tnextItems,\n\t\t);\n\t};\n\n\tconst hasHeader = Boolean(title || description || action || defaultAction);\n\tconst shouldShowEmptyState = total === 0 && layout !== 'field';\n\n\tconst renderAddTile = () => {\n\t\tif (!canAdd || layout !== 'field') return null;\n\t\treturn (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'media-resource-gallery--add-tile box-border m-0 inline-flex w-full cursor-pointer items-center justify-center p-space-md font-sans rounded-radius border border-dashed border-border bg-background text-muted-foreground shadow-none',\n\t\t\t\t\t'aspect-square hover:border-primary-accent/50 hover:bg-primary/5 hover:text-primary-accent focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n\t\t\t\t)}\n\t\t\t\taria-label={strings.gallery.addTile}\n\t\t\t\tonClick={onAdd}\n\t\t\t>\n\t\t\t\t<Plus className=\"size-icon\" />\n\t\t\t\t<Text tag=\"span\" size=\"inherit\" className=\"sr-only\">\n\t\t\t\t\t{strings.gallery.addTile}\n\t\t\t\t</Text>\n\t\t\t</button>\n\t\t);\n\t};\n\n\treturn (\n\t\t<section\n\t\t\tclassName={cn(\n\t\t\t\t'media-resource-gallery--component @container/media-resource-gallery rounded-radius border border-border bg-card shadow-xs',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tdata-layout={layout}\n\t\t\tdata-gallery-density={density}\n\t\t\t{...props}\n\t\t>\n\t\t\t{hasHeader && (\n\t\t\t\t<header className=\"media-resource-gallery--header p-surface\">\n\t\t\t\t\t<Stack\n\t\t\t\t\t\tdirection={{ base: 'vertical', md: 'horizontal' }}\n\t\t\t\t\t\tgap=\"lg\"\n\t\t\t\t\t\talign={{ md: 'start' }}\n\t\t\t\t\t\tjustify={{ md: 'between' }}\n\t\t\t\t\t>\n\t\t\t\t\t\t\t<Stack gap=\"normal\" className=\"min-w-0\">\n\t\t\t\t\t\t\t{!!title && (\n\t\t\t\t\t\t\t\t<Text tag=\"div\" weight=\"semibold\">\n\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!!description && (\n\t\t\t\t\t\t\t\t\t<Text type=\"secondary\">\n\t\t\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"md\" className=\"media-resource-gallery--actions\">\n\t\t\t\t\t\t\t{action ?? defaultAction}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</Stack>\n\t\t\t\t</header>\n\t\t\t)}\n\n\t\t\t{shouldShowEmptyState ? (\n\t\t\t\t<div className=\"media-resource-gallery--empty px-surface pb-surface\">\n\t\t\t\t\t{empty ?? (\n\t\t\t\t\t\t<MediaLibraryEmptyState\n\t\t\t\t\t\t\ttitle={strings.gallery.emptyTitle}\n\t\t\t\t\t\t\tdescription={strings.gallery.emptyDescription}\n\t\t\t\t\t\t\taction={\n\t\t\t\t\t\t\t\tcanAdd ? (\n\t\t\t\t\t\t\t\t\t<Button type=\"button\" icon={ImagePlus} onClick={onAdd}>\n\t\t\t\t\t\t\t\t\t\t{strings.gallery.add}\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t) : undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'grid min-w-0 grid-cols-1',\n\t\t\t\t\t\tlayout === 'list' ? 'gap-space-md' : 'gap-space-lg',\n\t\t\t\t\t\t'media-resource-gallery--items p-surface',\n\t\t\t\t\t\thasHeader && 'pt-0',\n\t\t\t\t\t\tlayout === 'list'\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: layout === 'field'\n\t\t\t\t\t\t\t\t? 'grid-cols-[repeat(auto-fill,minmax(96px,1fr))] @md/media-resource-gallery:grid-cols-[repeat(auto-fill,minmax(108px,1fr))]'\n\t\t\t\t\t\t\t\t: density === 'compact'\n\t\t\t\t\t\t\t\t\t? 'grid-cols-[repeat(auto-fill,minmax(132px,1fr))]'\n\t\t\t\t\t\t\t\t\t: 'grid-cols-[repeat(auto-fill,minmax(164px,1fr))]',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{items.map((item, index) => {\n\t\t\t\t\t\tconst id = accessors.getId(item);\n\t\t\t\t\t\tconst name = accessors.getName(item);\n\t\t\t\t\t\tconst type = accessors.getType(item);\n\t\t\t\t\t\tconst src = accessors.getSrc(item);\n\t\t\t\t\t\tconst alt = accessors.getAlt(item) || name;\n\t\t\t\t\t\tconst isPrimary = id === resolvedPrimaryId;\n\t\t\t\t\t\tconst isPrivate = accessors.getPublic(item) === false;\n\t\t\t\t\t\tconst duration = accessors.getDuration(item);\n\t\t\t\t\t\tconst canMovePrevious = index > 0;\n\t\t\t\t\t\tconst canMoveNext = index < total - 1;\n\t\t\t\t\t\tconst ctx: MediaResourceGalleryItemRenderContext<TItem> = {\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\ttotal,\n\t\t\t\t\t\t\tprimary: isPrimary,\n\t\t\t\t\t\t\taccessors,\n\t\t\t\t\t\t\tcanMovePrevious,\n\t\t\t\t\t\t\tcanMoveNext,\n\t\t\t\t\t\t\tsetPrimary: () => onPrimaryChange?.(id, item),\n\t\t\t\t\t\t\tremove: () => onRemove?.(id, item),\n\t\t\t\t\t\t\tmovePrevious: () => move(index, index - 1),\n\t\t\t\t\t\t\tmoveNext: () => move(index, index + 1),\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst rendered = renderItem?.(item, ctx);\n\t\t\t\t\t\tif (rendered) {\n\t\t\t\t\t\t\treturn <div key={id}>{rendered}</div>;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (layout === 'field') {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'media-resource-gallery--item group/gallery relative aspect-square overflow-hidden rounded-radius border border-border bg-background shadow-xs',\n\t\t\t\t\t\t\t\t\t\t'transition-colors hover:border-primary/40 focus-within:border-primary/50',\n\t\t\t\t\t\t\t\t\t\tisPrimary && 'col-span-2 row-span-2 min-h-52',\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tdata-primary={isPrimary || undefined}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{src ? (\n\t\t\t\t\t\t\t\t\t\t<img src={src} alt={alt} loading=\"lazy\" className=\"size-full object-cover\" />\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex size-full items-center justify-center bg-muted text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t<File className={isPrimary ? 'size-7' : 'size-icon-lg'} />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{isPrimary && (\n\t\t\t\t\t\t\t\t\t\t<Badge tone=\"secondary\" className=\"absolute left-2 top-2 bg-background/90 shadow-xs\">\n\t\t\t\t\t\t\t\t\t\t\t{strings.gallery.cover}\n\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{type === 'video' && !!duration && (\n\t\t\t\t\t\t\t\t\t\t<Badge tone=\"secondary\" className=\"absolute bottom-2 left-2 bg-foreground text-background\">\n\t\t\t\t\t\t\t\t\t\t\t<Play className=\"size-icon-sm fill-current\" />\n\t\t\t\t\t\t\t\t\t\t\t{duration}\n\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{isPrivate && (\n\t\t\t\t\t\t\t\t\t\t<span className=\"absolute bottom-2 right-2 inline-flex size-6 items-center justify-center rounded-full border border-border bg-background/90 text-muted-foreground shadow-xs\">\n\t\t\t\t\t\t\t\t\t\t\t<Lock className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{!readOnly && (\n\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"solid\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"absolute right-2 top-2 opacity-0 shadow-sm transition-opacity group-hover/gallery:opacity-100 group-focus-within/gallery:opacity-100\"\n\t\t\t\t\t\t\t\t\t\t\taria-label={strings.gallery.remove}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => onRemove?.(id, item)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<X className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (layout === 'list') {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Stack\n\t\t\t\t\t\t\t\t\tdirection=\"horizontal\"\n\t\t\t\t\t\t\t\t\twrap\n\t\t\t\t\t\t\t\t\talign=\"center\"\n\t\t\t\t\t\t\t\t\tgap=\"lg\"\n\t\t\t\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'media-resource-gallery--item min-w-0 rounded-radius border border-border bg-background px-row-x',\n\t\t\t\t\t\t\t\t\t\tdensity === 'compact' ? 'py-row-y-sm' : 'py-row-y',\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tdata-primary={isPrimary || undefined}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div className=\"relative size-12 shrink-0 overflow-hidden rounded-inner bg-muted\">\n\t\t\t\t\t\t\t\t\t\t{src ? (\n\t\t\t\t\t\t\t\t\t\t\t<img src={src} alt={alt} loading=\"lazy\" className=\"size-full object-cover\" />\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex size-full items-center justify-center text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t<File className=\"size-icon\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"md\" className=\"min-w-0\">\n\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"div\" weight=\"semibold\" className=\"min-w-0 break-all\">\n\t\t\t\t\t\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t{isPrimary && <Badge tone=\"info\">{strings.gallery.primary}</Badge>}\n\t\t\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t\t\t\t\t\t{formatMediaLibraryString(strings.gallery.itemPosition, {\n\t\t\t\t\t\t\t\t\t\t\t\tindex: index + 1,\n\t\t\t\t\t\t\t\t\t\t\t\ttotal,\n\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t{' · '}\n\t\t\t\t\t\t\t\t\t\t\t<FileSize\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={accessors.getSize(item)}\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\t\t\talign=\"left\"\n\t\t\t\t\t\t\t\t\t\t\t\temptyLabel={strings.unknownSize}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t{!readOnly && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"media-resource-gallery--item-actions flex basis-full flex-wrap items-center justify-end gap-space-xs @sm/media-resource-gallery:basis-auto\">\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={isPrimary}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.gallery.setPrimary}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => onPrimaryChange?.(id, item)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<Star className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={!canMovePrevious}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.gallery.movePrevious}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => move(index, index - 1)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<ArrowLeft className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={!canMoveNext}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.gallery.moveNext}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => move(index, index + 1)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<ArrowRight className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\ttone=\"destructive\"\n\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.gallery.remove}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => onRemove?.(id, item)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<Trash2 className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\t\t\tclassName=\"media-resource-gallery--item group/gallery overflow-hidden rounded-radius border border-border bg-background shadow-xs transition-colors hover:border-primary/40\"\n\t\t\t\t\t\t\t\tdata-primary={isPrimary || undefined}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div className=\"relative aspect-[4/3] bg-muted\">\n\t\t\t\t\t\t\t\t\t{src ? (\n\t\t\t\t\t\t\t\t\t\t<img src={src} alt={alt} loading=\"lazy\" className=\"size-full object-cover\" />\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex size-full items-center justify-center text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t<File className=\"size-6\" />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t<div className=\"absolute left-2 top-2 flex flex-wrap gap-space-xs\">\n\t\t\t\t\t\t\t\t\t\t{isPrimary && <Badge tone=\"info\" className=\"bg-card\">{strings.gallery.primary}</Badge>}\n\t\t\t\t\t\t\t\t\t\t<Badge tone=\"secondary\" className=\"bg-card text-card-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t{formatMediaLibraryString(strings.gallery.itemPosition, {\n\t\t\t\t\t\t\t\t\t\t\t\tindex: index + 1,\n\t\t\t\t\t\t\t\t\t\t\t\ttotal,\n\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'media-resource-gallery--item-body',\n\t\t\t\t\t\t\t\t\t\tdensity === 'compact' ? 'p-surface-xs' : 'p-surface',\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Stack gap=\"md\">\n\t\t\t\t\t\t\t\t\t\t<div className=\"min-w-0\">\n\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"div\" weight=\"semibold\" className=\"truncate\">\n\t\t\t\t\t\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t<FileSize\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={accessors.getSize(item)}\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\t\t\talign=\"left\"\n\t\t\t\t\t\t\t\t\t\t\t\temptyLabel={strings.unknownSize}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t{!readOnly && (\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-space-xs\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={isPrimary}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.gallery.setPrimary}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => onPrimaryChange?.(id, item)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Star className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={!canMovePrevious}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.gallery.movePrevious}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => move(index, index - 1)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ArrowLeft className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={!canMoveNext}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.gallery.moveNext}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => move(index, index + 1)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ArrowRight className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\ttone=\"destructive\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"ml-auto\"\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.gallery.remove}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => onRemove?.(id, item)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Trash2 className=\"size-icon-md\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t\t{renderAddTile()}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</section>\n\t);\n}\n"],"mappings":"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AcjP,CAAI;GACrC,AAAIwB,KAAYwN,EAAK,IAAIxN,CAAU;EACpC;EACA,OAAO,MAAM,KAAKwN,CAAI,CAAC,CAAC,KAAK,OAAW;GAAE;GAAO,OAAOvP;EAAM,EAAE;CACjE,GAAG;EAACsP;EAAUE;EAAe3N;CAAK,CAAC;AACpC;AAEA,SAAgB4N,EAAuE,EACtF,UACA,gBACA,gBACA,iBACA,gBACA,mBAAgB,YAChB,aAAU,eACV,cAAW,IACX,iBAAc,IACd,gBACA,qBAAkB,IAClB,cACA,aACA,YACA,SAASC,GACT,UACA,oBACA,cACA,UACA,YACA,cACA,gBACA,WACA,kBACA,mBACA,kBACA,kBACA,kBACA,cACA,YACA,SACA,eACA,iBACA,UACA,iBACA,kBACA,WACA,kBACA,mBACA,UACA,gBACA,kBACA,gBACA,uBACA,uBACA,UACA,iBACA,kBACA,mBACA,0BACA,2BACA,GAAGC,MACyB;CAC5B,IAAM,EAAE,qBAAiBnS,EAAiB,GACpCmN,KAAOpN,EAAsB,KAAA,GAAWqN,EAAY,GACpDd,IAAU8F,EAAW1Q,IAA4BwQ,CAAW,GAC5DG,IAAQxN,GAAuB;EACpC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD,CAAC,GACKyN,KAAsBT,GAAuBpE,GAAa4E,EAAM,OAAOA,EAAM,UAAU,aAAa,GACpGE,IAAYC,IAAcH,EAAM,MAAM,WACtCI,IAAaJ,EAAM,WACrBA,EAAM,MAAM,MAAM,MAASA,EAAM,UAAU,MAAMtP,CAAI,MAAMsP,EAAM,QAAQ,KAAK,OAC/E,MACGK,IAAeC,GAAWhB,CAA+B,GACzDiB,IAAoB,CAACC,GAAO,QAC5BC,KACLJ,KAAgBE,IACf,kBAAChC,GAAD;EACC,KAAK2B;EACL,aAAaF,EAAM;EACJ;EACf,aAAaA,EAAM;EACV;EACT,kBAAkBA,EAAM;EACxB,WAAU;CACV,CAAA,IACE,MACC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"}
|