themelia-react-ui 2.0.6 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (912) hide show
  1. package/CHANGELOG.md +250 -0
  2. package/MIGRATION.md +746 -7
  3. package/README.md +27 -23
  4. package/dist/{accordion-0tQUZ20r.js → accordion-DNVqwEIC.js} +36 -36
  5. package/dist/accordion-DNVqwEIC.js.map +1 -0
  6. package/dist/action-menu-D5343RwT.js +286 -0
  7. package/dist/action-menu-D5343RwT.js.map +1 -0
  8. package/dist/ai-artifact-otrz9ZwS.js +1214 -0
  9. package/dist/ai-artifact-otrz9ZwS.js.map +1 -0
  10. package/dist/anchored-positioning-1U_eBFNx.js +9 -0
  11. package/dist/anchored-positioning-1U_eBFNx.js.map +1 -0
  12. package/dist/app-shell-CPN30Nb1.js +372 -0
  13. package/dist/app-shell-CPN30Nb1.js.map +1 -0
  14. package/dist/{attachment-BCpA4e7i.js → attachment-D2-fpfmv.js} +15 -15
  15. package/dist/{attachment-BCpA4e7i.js.map → attachment-D2-fpfmv.js.map} +1 -1
  16. package/dist/{auth-B0girIk_.js → auth-g_oUTDDC.js} +234 -241
  17. package/dist/auth-g_oUTDDC.js.map +1 -0
  18. package/dist/{avatar-B9Jnp-T-.js → avatar-Ca3Ihrq4.js} +4 -4
  19. package/dist/{avatar-B9Jnp-T-.js.map → avatar-Ca3Ihrq4.js.map} +1 -1
  20. package/dist/{badge-wWauMgAt.js → badge-oGiXblW7.js} +8 -9
  21. package/dist/badge-oGiXblW7.js.map +1 -0
  22. package/dist/base/accordion.js +1 -1
  23. package/dist/base/action-menu.js +1 -1
  24. package/dist/base/attachment.js +1 -1
  25. package/dist/base/avatar.js +1 -1
  26. package/dist/base/badge.js +1 -1
  27. package/dist/base/batch-action-bar.js +1 -1
  28. package/dist/base/buttons.js +2 -2
  29. package/dist/base/cards.js +3 -3
  30. package/dist/base/carousel.js +11 -11
  31. package/dist/base/carousel.js.map +1 -1
  32. package/dist/base/cascader.js +1 -1
  33. package/dist/base/chart.js +1 -1
  34. package/dist/base/choice-inputs.js +2 -2
  35. package/dist/base/code-block.js +1 -1
  36. package/dist/base/combobox.js +1 -1
  37. package/dist/base/command.js +1 -1
  38. package/dist/base/copyable.js +1 -1
  39. package/dist/base/date-pickers.js +2 -2
  40. package/dist/base/display.js +7 -7
  41. package/dist/base/feedback.js +4 -4
  42. package/dist/base/forms-numeric.js +2 -2
  43. package/dist/base/forms.js +2 -2
  44. package/dist/base/inline-edit.js +13 -13
  45. package/dist/base/inline-edit.js.map +1 -1
  46. package/dist/base/item.js +1 -1
  47. package/dist/base/media-gallery.js +203 -2
  48. package/dist/base/media-gallery.js.map +1 -0
  49. package/dist/base/metadata-list.js +1 -1
  50. package/dist/base/navigation.js +7 -7
  51. package/dist/base/popover-menu.js +1 -1
  52. package/dist/base/popover.js +1 -1
  53. package/dist/base/qr-code.js +32 -22
  54. package/dist/base/qr-code.js.map +1 -1
  55. package/dist/base/repeaters.js +91 -88
  56. package/dist/base/repeaters.js.map +1 -1
  57. package/dist/base/sidebar.js +2 -2
  58. package/dist/base/signature-pad.js +14 -14
  59. package/dist/base/signature-pad.js.map +1 -1
  60. package/dist/base/skeleton.js +1 -1
  61. package/dist/base/spinner.js +6 -12
  62. package/dist/base/spinner.js.map +1 -1
  63. package/dist/base/structure.js +1 -1
  64. package/dist/base/table.js +1 -1
  65. package/dist/base/text-inputs.js +3 -3
  66. package/dist/base/toaster.js +2 -2
  67. package/dist/base/tree.js +2 -2
  68. package/dist/base/upload-queue.js +303 -2
  69. package/dist/base/upload-queue.js.map +1 -0
  70. package/dist/base/upload.js +3 -4
  71. package/dist/base/value-inputs.js +1 -1
  72. package/dist/{batch-action-bar-BoqWIIpV.js → batch-action-bar-D6MZQNnC.js} +10 -10
  73. package/dist/{batch-action-bar-BoqWIIpV.js.map → batch-action-bar-D6MZQNnC.js.map} +1 -1
  74. package/dist/blocks/admin.js +242 -228
  75. package/dist/blocks/admin.js.map +1 -1
  76. package/dist/blocks/ai.js +395 -357
  77. package/dist/blocks/ai.js.map +1 -1
  78. package/dist/blocks/analytics/charts.js +1022 -0
  79. package/dist/blocks/analytics/charts.js.map +1 -0
  80. package/dist/blocks/analytics/usage-card.js +1 -1
  81. package/dist/blocks/analytics.js +171 -1365
  82. package/dist/blocks/analytics.js.map +1 -1
  83. package/dist/blocks/collaboration.js +1 -1
  84. package/dist/blocks/commerce/receipt.js +1 -1
  85. package/dist/blocks/commerce.js +1487 -1358
  86. package/dist/blocks/commerce.js.map +1 -1
  87. package/dist/blocks/data-display.js +2 -3
  88. package/dist/blocks/onboarding.js +91 -82
  89. package/dist/blocks/onboarding.js.map +1 -1
  90. package/dist/blocks/planning.js +25 -25
  91. package/dist/blocks/planning.js.map +1 -1
  92. package/dist/blocks/timelines.js +2 -2
  93. package/dist/{breadcrumbs-Bp9Ke7kd.js → breadcrumbs-CQ9JSlez.js} +52 -45
  94. package/dist/breadcrumbs-CQ9JSlez.js.map +1 -0
  95. package/dist/{button-ChBovTx0.js → button-rd6FiHfQ.js} +12 -8
  96. package/dist/button-rd6FiHfQ.js.map +1 -0
  97. package/dist/{buttons-DeW0bQeK.js → buttons-pZVgPTZn.js} +230 -246
  98. package/dist/buttons-pZVgPTZn.js.map +1 -0
  99. package/dist/{cards-CNXnmvV5.js → cards-CgWyqvgZ.js} +25 -22
  100. package/dist/{cards-CNXnmvV5.js.map → cards-CgWyqvgZ.js.map} +1 -1
  101. package/dist/cascader-Cf05pwaq.js +444 -0
  102. package/dist/cascader-Cf05pwaq.js.map +1 -0
  103. package/dist/{chart-I7ROnsl8.js → chart-CygRCyIZ.js} +5 -5
  104. package/dist/{chart-I7ROnsl8.js.map → chart-CygRCyIZ.js.map} +1 -1
  105. package/dist/{checkbox-MoyHIAPs.js → checkbox-Dy5_XBMZ.js} +4 -4
  106. package/dist/{checkbox-MoyHIAPs.js.map → checkbox-Dy5_XBMZ.js.map} +1 -1
  107. package/dist/{choice-inputs-DHGtx0QV.js → choice-inputs-oJEsrb5Y.js} +113 -114
  108. package/dist/choice-inputs-oJEsrb5Y.js.map +1 -0
  109. package/dist/{code-block-BSJyq9e-.js → code-block-BrLD7mCi.js} +44 -60
  110. package/dist/code-block-BrLD7mCi.js.map +1 -0
  111. package/dist/collapsible-CRCCg_bO.js +80 -0
  112. package/dist/collapsible-CRCCg_bO.js.map +1 -0
  113. package/dist/{collection-content-CSnwtOTH.js → collection-content-D7SoDlYd.js} +3 -3
  114. package/dist/{collection-content-CSnwtOTH.js.map → collection-content-D7SoDlYd.js.map} +1 -1
  115. package/dist/combobox-Dl6f6kHz.js +362 -0
  116. package/dist/combobox-Dl6f6kHz.js.map +1 -0
  117. package/dist/combobox-DrDXtSSt.js +929 -0
  118. package/dist/combobox-DrDXtSSt.js.map +1 -0
  119. package/dist/command-CjZ2VzKC.js +432 -0
  120. package/dist/command-CjZ2VzKC.js.map +1 -0
  121. package/dist/comments-C2MZyRmh.js +1214 -0
  122. package/dist/comments-C2MZyRmh.js.map +1 -0
  123. package/dist/components/base/accordion/accordion.d.ts +11 -3
  124. package/dist/components/base/action-menu/action-menu.d.ts +11 -3
  125. package/dist/components/base/buttons/button.d.ts +2 -2
  126. package/dist/components/base/buttons/index.d.ts +1 -1
  127. package/dist/components/base/buttons/loader-button.d.ts +6 -15
  128. package/dist/components/base/cards/index.d.ts +1 -1
  129. package/dist/components/base/cards/partials/card-body-context.d.ts +6 -0
  130. package/dist/components/base/cards/smart-card.d.ts +0 -2
  131. package/dist/components/base/cards/smart-card.types.d.ts +12 -10
  132. package/dist/components/base/cascader/cascader.d.ts +8 -2
  133. package/dist/components/base/cascader/cascader.types.d.ts +24 -2
  134. package/dist/components/base/cascader/index.d.ts +1 -1
  135. package/dist/components/base/choice-inputs/switch.d.ts +1 -1
  136. package/dist/components/base/code-block/use-code-copy.d.ts +2 -6
  137. package/dist/components/base/command/command.d.ts +1 -1
  138. package/dist/components/base/date-pickers/datepicker.types.d.ts +1 -3
  139. package/dist/components/base/display/dialog.d.ts +3 -9
  140. package/dist/components/base/display/index.d.ts +2 -3
  141. package/dist/components/base/display/separator.d.ts +1 -1
  142. package/dist/components/base/feedback/alert.d.ts +2 -1
  143. package/dist/components/base/feedback/empty.d.ts +10 -2
  144. package/dist/components/base/forms/workflow.d.ts +2 -2
  145. package/dist/components/base/forms-numeric/dimensions-input.d.ts +9 -17
  146. package/dist/components/base/forms-numeric/index.d.ts +3 -3
  147. package/dist/components/base/item/item.types.d.ts +6 -2
  148. package/dist/components/base/metadata-list/index.d.ts +1 -3
  149. package/dist/components/base/metadata-list/metadata-list.d.ts +4 -1
  150. package/dist/components/base/navigation/index.d.ts +2 -2
  151. package/dist/components/base/navigation/language-switcher.d.ts +7 -6
  152. package/dist/components/base/navigation/navigation-tabs.d.ts +8 -1
  153. package/dist/components/base/navigation/page-header/index.d.ts +1 -1
  154. package/dist/components/base/navigation/page-header/page-header.d.ts +13 -17
  155. package/dist/components/base/navigation/pagination.d.ts +5 -5
  156. package/dist/components/base/popover/popover.recipes.d.ts +0 -1
  157. package/dist/components/base/qr-code/qr-code.d.ts +4 -0
  158. package/dist/components/base/repeaters/index.d.ts +1 -1
  159. package/dist/components/base/repeaters/key-value-editor.d.ts +4 -0
  160. package/dist/components/base/sheet/sheet.d.ts +6 -15
  161. package/dist/components/base/sidebar/index.d.ts +1 -6
  162. package/dist/components/base/sidebar/sidebar.d.ts +38 -10
  163. package/dist/components/base/skeleton/skeleton.d.ts +1 -1
  164. package/dist/components/base/structure/structure.types.d.ts +11 -2
  165. package/dist/components/base/text-inputs/index.d.ts +1 -1
  166. package/dist/components/base/tree/index.d.ts +1 -0
  167. package/dist/components/base/tree/tree.d.ts +2 -2
  168. package/dist/components/base/tree/tree.types.d.ts +7 -1
  169. package/dist/components/base/upload/file-upload.validation.d.ts +37 -1
  170. package/dist/components/base/upload/image-upload.d.ts +2 -0
  171. package/dist/components/base/upload/index.d.ts +3 -9
  172. package/dist/components/base/value-inputs/date-time-input.d.ts +4 -0
  173. package/dist/components/base/value-inputs/slider.d.ts +5 -2
  174. package/dist/components/blocks/admin/action-surfaces/index.d.ts +17 -4
  175. package/dist/components/blocks/admin/api-key-list/api-key-list.types.d.ts +9 -3
  176. package/dist/components/blocks/admin/index.d.ts +1 -1
  177. package/dist/components/blocks/ai/ai-artifact/ai-artifact.d.ts +1 -1
  178. package/dist/components/blocks/ai/ai-artifact/types.d.ts +9 -4
  179. package/dist/components/blocks/ai/ai-chain-of-thought/ai-chain-of-thought.d.ts +1 -1
  180. package/dist/components/blocks/ai/ai-chain-of-thought/types.d.ts +11 -1
  181. package/dist/components/blocks/ai/ai-citation/ai-citation.d.ts +1 -1
  182. package/dist/components/blocks/ai/ai-citation/types.d.ts +6 -0
  183. package/dist/components/blocks/ai/ai-confirmation/ai-confirmation.d.ts +1 -1
  184. package/dist/components/blocks/ai/ai-confirmation/types.d.ts +21 -5
  185. package/dist/components/blocks/ai/ai-feedback/types.d.ts +7 -2
  186. package/dist/components/blocks/ai/ai-inline-citation/types.d.ts +9 -3
  187. package/dist/components/blocks/ai/ai-package-info/ai-package-info.d.ts +1 -1
  188. package/dist/components/blocks/ai/ai-package-info/types.d.ts +6 -0
  189. package/dist/components/blocks/ai/ai-sources/ai-sources.d.ts +1 -1
  190. package/dist/components/blocks/ai/ai-sources/types.d.ts +8 -2
  191. package/dist/components/blocks/ai/ai-task/ai-task.d.ts +1 -1
  192. package/dist/components/blocks/ai/ai-task/types.d.ts +10 -1
  193. package/dist/components/blocks/ai/ai-tool-call/ai-tool-call.d.ts +1 -1
  194. package/dist/components/blocks/ai/ai-tool-call/types.d.ts +6 -0
  195. package/dist/components/blocks/ai/ai.strings.d.ts +2 -0
  196. package/dist/components/blocks/analytics/activity-heatmap/types.d.ts +1 -1
  197. package/dist/components/blocks/analytics/analytics.strings.d.ts +2 -0
  198. package/dist/components/blocks/analytics/atoms/metric-trend-chip.d.ts +11 -1
  199. package/dist/components/blocks/analytics/chart-card/chart-card.d.ts +7 -5
  200. package/dist/components/blocks/analytics/charts/index.d.ts +27 -0
  201. package/dist/components/blocks/analytics/index.d.ts +17 -24
  202. package/dist/components/blocks/analytics/metric/metric.d.ts +5 -5
  203. package/dist/components/blocks/analytics/metric-grid/metric-grid.d.ts +2 -2
  204. package/dist/components/blocks/analytics/types.d.ts +12 -3
  205. package/dist/components/blocks/analytics/usage-card/usage-card.strings.d.ts +2 -0
  206. package/dist/components/blocks/commerce/address-card/address-card.d.ts +1 -1
  207. package/dist/components/blocks/commerce/address-card/types.d.ts +5 -16
  208. package/dist/components/blocks/commerce/booking-calendar-event-card/booking-calendar-event-card.d.ts +2 -2
  209. package/dist/components/blocks/commerce/booking-calendar-event-card/booking-calendar-event-card.types.d.ts +6 -4
  210. package/dist/components/blocks/commerce/cart-summary/cart-summary.d.ts +0 -2
  211. package/dist/components/blocks/commerce/cart-summary/index.d.ts +2 -2
  212. package/dist/components/blocks/commerce/cart-summary/types.d.ts +9 -11
  213. package/dist/components/blocks/commerce/coupon-input/coupon-input.d.ts +1 -1
  214. package/dist/components/blocks/commerce/coupon-input/types.d.ts +7 -3
  215. package/dist/components/blocks/commerce/discount-stack/discount-stack.d.ts +0 -2
  216. package/dist/components/blocks/commerce/discount-stack/index.d.ts +2 -2
  217. package/dist/components/blocks/commerce/discount-stack/types.d.ts +4 -6
  218. package/dist/components/blocks/commerce/fulfillment-group/fulfillment-group.d.ts +1 -1
  219. package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +2 -0
  220. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-balance.d.ts +18 -0
  221. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-compact.d.ts +1 -1
  222. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-copy-button.d.ts +0 -1
  223. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-dark.d.ts +1 -1
  224. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-full.d.ts +1 -1
  225. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-illustrated.d.ts +1 -1
  226. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-minimal.d.ts +1 -1
  227. package/dist/components/blocks/commerce/giftcard-card/types.d.ts +16 -5
  228. package/dist/components/blocks/commerce/index.d.ts +8 -8
  229. package/dist/components/blocks/commerce/inventory-level/inventory-level.strings.d.ts +2 -0
  230. package/dist/components/blocks/commerce/inventory-level/types.d.ts +1 -1
  231. package/dist/components/blocks/commerce/inventory-section/types.d.ts +0 -5
  232. package/dist/components/blocks/commerce/invoice-line-items/types.d.ts +6 -3
  233. package/dist/components/blocks/commerce/loyalty-points/loyalty-points.d.ts +1 -1
  234. package/dist/components/blocks/commerce/loyalty-points/types.d.ts +11 -5
  235. package/dist/components/blocks/commerce/order-status/order-status.d.ts +1 -1
  236. package/dist/components/blocks/commerce/order-status/types.d.ts +8 -8
  237. package/dist/components/blocks/commerce/order-timeline/order-timeline.d.ts +1 -1
  238. package/dist/components/blocks/commerce/order-timeline/types.d.ts +3 -1
  239. package/dist/components/blocks/commerce/payment-method/index.d.ts +2 -2
  240. package/dist/components/blocks/commerce/payment-method/payment-method.d.ts +0 -8
  241. package/dist/components/blocks/commerce/payment-method/types.d.ts +0 -2
  242. package/dist/components/blocks/commerce/receipt/index.d.ts +1 -1
  243. package/dist/components/blocks/commerce/receipt/receipt-items.d.ts +1 -1
  244. package/dist/components/blocks/commerce/receipt/types.d.ts +10 -0
  245. package/dist/components/blocks/commerce/refund-status/index.d.ts +2 -2
  246. package/dist/components/blocks/commerce/refund-status/refund-status.d.ts +0 -2
  247. package/dist/components/blocks/commerce/refund-status/types.d.ts +0 -2
  248. package/dist/components/blocks/commerce/seo-listing/types.d.ts +7 -0
  249. package/dist/components/blocks/commerce/shared/code-entry.d.ts +39 -0
  250. package/dist/components/blocks/commerce/shared/order-status.d.ts +1 -1
  251. package/dist/components/blocks/commerce/subscription-summary/subscription-summary.d.ts +1 -1
  252. package/dist/components/blocks/commerce/subscription-summary/types.d.ts +10 -1
  253. package/dist/components/blocks/commerce/upcoming-booking/index.d.ts +2 -1
  254. package/dist/components/blocks/commerce/upcoming-booking/types.d.ts +8 -0
  255. package/dist/components/blocks/commerce/upcoming-booking/upcoming-booking.d.ts +2 -2
  256. package/dist/components/blocks/commerce/vendor-profile/types.d.ts +4 -5
  257. package/dist/components/blocks/commerce/voucher-entry/types.d.ts +6 -3
  258. package/dist/components/blocks/commerce/voucher-entry/voucher-entry.d.ts +1 -1
  259. package/dist/components/blocks/content-block-hooks.d.ts +22 -0
  260. package/dist/components/blocks/data-display/dense-info-card/dense-info.strings.d.ts +5 -1
  261. package/dist/components/blocks/data-display/dense-info-card/helpers.d.ts +3 -1
  262. package/dist/components/blocks/data-display/dense-info-card/index.d.ts +1 -1
  263. package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-classification.d.ts +1 -1
  264. package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-dashboard.d.ts +1 -1
  265. package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-financial.d.ts +1 -1
  266. package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-project.d.ts +1 -1
  267. package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-score.d.ts +1 -1
  268. package/dist/components/blocks/data-display/dense-info-card/types.d.ts +12 -5
  269. package/dist/components/blocks/data-display/empty-state/empty-state.types.d.ts +6 -0
  270. package/dist/components/blocks/data-display/index.d.ts +0 -1
  271. package/dist/components/blocks/data-display/relationship-card-frame.d.ts +1 -1
  272. package/dist/components/blocks/onboarding/checklist/checklist.types.d.ts +5 -3
  273. package/dist/components/blocks/planning/task-card.types.d.ts +7 -3
  274. package/dist/components/blocks/timelines/changelog/types.d.ts +2 -2
  275. package/dist/components/blocks/timelines/index.d.ts +2 -2
  276. package/dist/components/blocks/timelines/milestones/types.d.ts +2 -2
  277. package/dist/components/blocks/timelines/shared/timeline.d.ts +6 -0
  278. package/dist/components/blocks/timelines/steps-card/index.d.ts +2 -1
  279. package/dist/components/blocks/timelines/steps-card/steps-card.d.ts +2 -2
  280. package/dist/components/blocks/timelines/steps-card/types.d.ts +13 -1
  281. package/dist/components/features/activities/activities.strings.d.ts +5 -3
  282. package/dist/components/features/activities/activities.types.d.ts +28 -11
  283. package/dist/components/features/activities/hooks/use-activity-feed.d.ts +6 -0
  284. package/dist/components/features/activities/index.d.ts +1 -1
  285. package/dist/components/features/activities/partials/activity-headline.d.ts +5 -0
  286. package/dist/components/features/activities/partials/activity-row.d.ts +12 -13
  287. package/dist/components/features/activities/partials/row-layers.d.ts +7 -0
  288. package/dist/components/features/activities/relative-time.d.ts +18 -0
  289. package/dist/components/features/ai-chat/ai-chat.d.ts +6 -2
  290. package/dist/components/features/ai-chat/ai-chat.strings.d.ts +41 -2
  291. package/dist/components/features/ai-chat/ai-chat.types.d.ts +6 -0
  292. package/dist/components/features/ai-chat/partials/ai-chat-attachments-strip.d.ts +5 -1
  293. package/dist/components/features/ai-chat/partials/ai-chat-prompt-input.d.ts +2 -2
  294. package/dist/components/features/ai-chat/partials/ai-chat-queue.d.ts +3 -1
  295. package/dist/components/features/ai-chat/partials/ai-chat-suggestions-row.d.ts +6 -1
  296. package/dist/components/features/appointment-calendar/appointment-calendar.d.ts +1 -1
  297. package/dist/components/features/appointment-calendar/appointment-calendar.types.d.ts +19 -5
  298. package/dist/components/features/appointment-calendar/index.d.ts +1 -1
  299. package/dist/components/features/appointment-calendar/partials/appointment-agenda.d.ts +18 -10
  300. package/dist/components/features/async-preview/async-preview.d.ts +2 -2
  301. package/dist/components/features/async-preview/async-preview.types.d.ts +30 -1
  302. package/dist/components/features/async-preview/preview-trigger-cell.d.ts +7 -2
  303. package/dist/components/features/combobox/async-resource-combobox.d.ts +2 -2
  304. package/dist/components/features/combobox/combobox.d.ts +12 -3
  305. package/dist/components/features/combobox/components/error-message.d.ts +3 -1
  306. package/dist/components/features/combobox/hooks/use-combobox-core.d.ts +2 -2
  307. package/dist/components/features/combobox/index.d.ts +1 -1
  308. package/dist/components/features/combobox/types.d.ts +47 -45
  309. package/dist/components/features/comments/comments.strings.d.ts +6 -5
  310. package/dist/components/features/comments/comments.types.d.ts +40 -26
  311. package/dist/components/features/comments/hooks/use-attachment-upload.d.ts +5 -1
  312. package/dist/components/features/comments/hooks/use-comments.d.ts +8 -1
  313. package/dist/components/features/data-view/data-view.strings.d.ts +9 -2
  314. package/dist/components/features/data-view/data-view.types.d.ts +15 -2
  315. package/dist/components/features/email-composer/email-html.d.ts +5 -0
  316. package/dist/components/features/email-composer/http.d.ts +2 -0
  317. package/dist/components/features/email-composer/strings.d.ts +17 -2
  318. package/dist/components/features/email-composer/types.d.ts +17 -2
  319. package/dist/components/features/email-composer/use-composer.d.ts +2 -78
  320. package/dist/components/features/event-calendar/event-calendar-day-cell.d.ts +1 -1
  321. package/dist/components/features/event-calendar/event-calendar-event-badge.d.ts +1 -1
  322. package/dist/components/features/event-calendar/event-calendar-header.d.ts +1 -1
  323. package/dist/components/features/event-calendar/event-calendar-legend.d.ts +2 -2
  324. package/dist/components/features/event-calendar/event-calendar.d.ts +1 -1
  325. package/dist/components/features/event-calendar/event-calendar.types.d.ts +126 -21
  326. package/dist/components/features/filters/facets/range-facet.d.ts +13 -8
  327. package/dist/components/features/filters/filter-context.d.ts +9 -0
  328. package/dist/components/features/filters/filters.strings.d.ts +36 -3
  329. package/dist/components/features/filters/filters.types.d.ts +72 -5
  330. package/dist/components/features/filters/hooks/use-filter-draft.d.ts +1 -0
  331. package/dist/components/features/filters/index.d.ts +2 -2
  332. package/dist/components/features/filters/operator-options.d.ts +25 -2
  333. package/dist/components/features/filters/partials/active-filter-item.d.ts +0 -13
  334. package/dist/components/features/filters/partials/async-options-status.d.ts +32 -0
  335. package/dist/components/features/filters/partials/filter-draft-footer.d.ts +11 -0
  336. package/dist/components/features/filters/partials/filter-operator-select.d.ts +4 -2
  337. package/dist/components/features/filters/partials/filter-pill.d.ts +5 -1
  338. package/dist/components/features/filters/partials/filter-tabs.d.ts +2 -1
  339. package/dist/components/features/filters/partials/regular-filter-content.d.ts +1 -1
  340. package/dist/components/features/filters/utils/filter-utils.d.ts +29 -4
  341. package/dist/components/features/global-search/global-search-dialog.d.ts +7 -1
  342. package/dist/components/features/global-search/global-search.d.ts +7 -1
  343. package/dist/components/features/global-search/global-search.strings.d.ts +19 -3
  344. package/dist/components/features/global-search/global-search.types.d.ts +30 -6
  345. package/dist/components/features/global-search/index.d.ts +1 -1
  346. package/dist/components/features/global-search/partials/global-search-idle-state.d.ts +6 -1
  347. package/dist/components/features/global-search/partials/global-search-input.d.ts +2 -0
  348. package/dist/components/features/kanban/index.d.ts +2 -2
  349. package/dist/components/features/kanban/kanban-context.d.ts +4 -0
  350. package/dist/components/features/kanban/kanban-keyboard.d.ts +7 -2
  351. package/dist/components/features/kanban/kanban.d.ts +10 -1
  352. package/dist/components/features/kanban/kanban.strings.d.ts +11 -2
  353. package/dist/components/features/kanban/kanban.types.d.ts +26 -0
  354. package/dist/components/features/map/map.d.ts +4 -0
  355. package/dist/components/features/map/place-autocomplete.d.ts +10 -1
  356. package/dist/components/features/media-library/hooks/use-media-library.d.ts +3 -1
  357. package/dist/components/features/media-library/media-library.d.ts +1 -1
  358. package/dist/components/features/media-library/media-library.strings.d.ts +33 -3
  359. package/dist/components/features/media-library/media-library.types.d.ts +47 -2
  360. package/dist/components/features/media-library/partials/media-library-partials.d.ts +1 -1
  361. package/dist/components/features/mentions/hooks/use-mentions-search.d.ts +7 -0
  362. package/dist/components/features/mentions/index.d.ts +1 -1
  363. package/dist/components/features/mentions/mentions.strings.d.ts +10 -2
  364. package/dist/components/features/mentions/partials/mention-chip.d.ts +1 -0
  365. package/dist/components/features/mentions/partials/mention-inline-suggestions.d.ts +8 -1
  366. package/dist/components/features/mentions/partials/mention-picker.d.ts +8 -1
  367. package/dist/components/features/mentions/partials/mention-search-error.d.ts +6 -0
  368. package/dist/components/features/mentions/utils/index.d.ts +0 -1
  369. package/dist/components/features/overlays/alert-dialog.d.ts +1 -1
  370. package/dist/components/features/overlays/dialog.d.ts +1 -1
  371. package/dist/components/features/overlays/drawer.d.ts +1 -1
  372. package/dist/components/features/overlays/index.d.ts +2 -2
  373. package/dist/components/features/overlays/overlays.strings.d.ts +2 -1
  374. package/dist/components/features/overlays/overlays.types.d.ts +27 -10
  375. package/dist/components/features/products/components/index.d.ts +0 -10
  376. package/dist/components/features/products/components/product-contract-overview.d.ts +1 -1
  377. package/dist/components/features/products/components/product-details-card.d.ts +1 -1
  378. package/dist/components/features/products/components/product-operations-card.d.ts +1 -1
  379. package/dist/components/features/products/components/product-option-action-menu.d.ts +1 -1
  380. package/dist/components/features/products/components/product-options-summary.d.ts +1 -1
  381. package/dist/components/features/products/components/product-policies-card.d.ts +1 -1
  382. package/dist/components/features/products/components/product-quote-preview-card.d.ts +1 -1
  383. package/dist/components/features/products/components/product-readiness-card.d.ts +1 -1
  384. package/dist/components/features/products/components/product-structure-card.d.ts +1 -1
  385. package/dist/components/features/products/components/product-variant-action-menu.d.ts +1 -1
  386. package/dist/components/features/products/components/product-variants-manager.d.ts +1 -1
  387. package/dist/components/features/products/components/product-variants-table.d.ts +1 -1
  388. package/dist/components/features/products/partials/product-surface.d.ts +15 -0
  389. package/dist/components/features/products/products.strings.d.ts +8 -0
  390. package/dist/components/features/products/products.types.d.ts +25 -7
  391. package/dist/components/features/questionnaire/questionnaire.types.d.ts +6 -4
  392. package/dist/components/features/resource/index.d.ts +2 -3
  393. package/dist/components/features/resource/resource.d.ts +2 -10
  394. package/dist/components/features/resource/resource.types.d.ts +7 -149
  395. package/dist/components/features/resource-assignment/partials/assignment-surface.d.ts +15 -0
  396. package/dist/components/features/resource-assignment/resource-assignment.strings.d.ts +6 -1
  397. package/dist/components/features/resource-assignment/resource-assignment.types.d.ts +6 -0
  398. package/dist/components/features/rich-text-editor/partials/caret-helpers.d.ts +5 -7
  399. package/dist/components/features/rich-text-editor/partials/html-helpers.d.ts +2 -3
  400. package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +6 -2
  401. package/dist/components/features/rich-text-editor/partials/index.d.ts +2 -3
  402. package/dist/components/features/rich-text-editor/partials/rich-text-editor-tiptap.d.ts +0 -1
  403. package/dist/components/features/rich-text-editor/partials/rich-text-editor-toolbar.d.ts +2 -3
  404. package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +13 -1
  405. package/dist/components/features/schema-form/hooks/use-schema-form.d.ts +5 -0
  406. package/dist/components/features/schema-form/schema-form.d.ts +1 -1
  407. package/dist/components/features/schema-form/schema-form.types.d.ts +13 -5
  408. package/dist/components/features/suggestions/suggestions.strings.d.ts +14 -0
  409. package/dist/components/features/suggestions/suggestions.types.d.ts +12 -4
  410. package/dist/components/features/table/data-table.d.ts +1 -1
  411. package/dist/components/features/table/filter-bar.d.ts +1 -1
  412. package/dist/components/features/table/pagination.d.ts +1 -1
  413. package/dist/components/features/table/partials/cell-value.d.ts +1 -1
  414. package/dist/components/features/table/table-body.d.ts +1 -1
  415. package/dist/components/features/table/table-header.d.ts +1 -1
  416. package/dist/components/features/table/table-helpers.d.ts +31 -9
  417. package/dist/components/features/table/table-region.recipes.d.ts +11 -0
  418. package/dist/components/features/table/table-toolbar.d.ts +1 -1
  419. package/dist/components/features/table/table.strings.d.ts +1 -0
  420. package/dist/components/features/table/table.types.d.ts +74 -48
  421. package/dist/components/features/theme-tweaker/theme-provider-settings.d.ts +4 -0
  422. package/dist/components/features/theme-tweaker/theme-tweaker.strings.d.ts +10 -7
  423. package/dist/components/features/theme-tweaker/theme-tweaker.utils.d.ts +17 -0
  424. package/dist/components/layout/app-shell/app-shell.types.d.ts +46 -49
  425. package/dist/components/layout/app-shell/index.d.ts +2 -2
  426. package/dist/components/layout/app-shell/shell-regions.d.ts +9 -0
  427. package/dist/components/layout/app-shell/shell-skip-link.d.ts +9 -0
  428. package/dist/components/layout/app-shell/sidebar-inset-layout.d.ts +1 -1
  429. package/dist/components/layout/app-shell/stacked-layout.d.ts +1 -1
  430. package/dist/components/layout/app-shell/topbar-sidebar-layout.d.ts +1 -1
  431. package/dist/components/layout/auth/auth-shell.d.ts +1 -1
  432. package/dist/components/layout/auth/auth.types.d.ts +0 -5
  433. package/dist/components/layout/containers/inline-gutter-context.d.ts +7 -0
  434. package/dist/components/layout/containers/main-landmark-context.d.ts +6 -0
  435. package/dist/components/layout/header/header.types.d.ts +16 -6
  436. package/dist/components/layout/header/partials/header-global-search-trigger.d.ts +1 -1
  437. package/dist/components/layout/header/partials/header-notifications.d.ts +1 -1
  438. package/dist/components/layout/header/partials/header-search.d.ts +1 -1
  439. package/dist/components/layout/hooks/use-command-shortcut.d.ts +10 -1
  440. package/dist/components/layout/layout.types.d.ts +2 -2
  441. package/dist/components/layout/navigation/breadcrumb-progress/breadcrumb-progress.d.ts +1 -1
  442. package/dist/components/layout/navigation/breadcrumb-progress/types.d.ts +9 -0
  443. package/dist/components/layout/navigation/section-nav/section-nav.d.ts +8 -1
  444. package/dist/components/layout/page/index.d.ts +2 -3
  445. package/dist/components/layout/page/page.strings.d.ts +12 -0
  446. package/dist/components/layout/page/page.types.d.ts +7 -110
  447. package/dist/components/layout/page/partials/page-header.d.ts +1 -1
  448. package/dist/components/layout/settings/index.d.ts +1 -1
  449. package/dist/components/layout/settings/settings.d.ts +3 -5
  450. package/dist/components/layout/sidebar/app-sidebar.d.ts +1 -1
  451. package/dist/components/layout/sidebar/components/sidebar-grouped-navigation.d.ts +1 -1
  452. package/dist/components/layout/sidebar/components/sidebar-navigation-footer.d.ts +1 -1
  453. package/dist/components/layout/sidebar/components/sidebar-navigation.d.ts +1 -1
  454. package/dist/components/layout/sidebar/index.d.ts +1 -1
  455. package/dist/components/layout/sidebar/sidebar-navigation-rail.d.ts +15 -7
  456. package/dist/components/layout/sidebar/sidebar.types.d.ts +10 -12
  457. package/dist/components/layout/sidebar/sidebar.utils.d.ts +4 -0
  458. package/dist/components/layout/workspace/workspace.strings.d.ts +2 -2
  459. package/dist/components/layout/workspace/workspace.types.d.ts +13 -7
  460. package/dist/components/primitives/date.d.ts +22 -3
  461. package/dist/components/primitives/file-size.d.ts +8 -2
  462. package/dist/components/primitives/index.d.ts +1 -1
  463. package/dist/components/primitives/initials.d.ts +3 -1
  464. package/dist/components/primitives/link.d.ts +8 -1
  465. package/dist/components/primitives/money.d.ts +1 -1
  466. package/dist/components/primitives/number.d.ts +2 -1
  467. package/dist/components/typography/heading.d.ts +9 -3
  468. package/dist/components/typography/index.d.ts +1 -1
  469. package/dist/components/typography/text-link.d.ts +10 -3
  470. package/dist/components/ui/badge.d.ts +2 -4
  471. package/dist/components/ui/breadcrumb.d.ts +2 -3
  472. package/dist/components/ui/button.d.ts +8 -2
  473. package/dist/components/ui/collapsible.d.ts +1 -4
  474. package/dist/components/ui/command.d.ts +20 -18
  475. package/dist/components/ui/dialog.d.ts +3 -9
  476. package/dist/components/ui/empty.d.ts +2 -2
  477. package/dist/components/ui/input-group.d.ts +3 -3
  478. package/dist/components/ui/item.d.ts +3 -3
  479. package/dist/components/ui/popover.d.ts +3 -7
  480. package/dist/components/ui/sheet.d.ts +4 -12
  481. package/dist/components/ui/sidebar-state.d.ts +6 -1
  482. package/dist/components/ui/sidebar.d.ts +7 -4
  483. package/dist/components/ui/tabs.d.ts +2 -2
  484. package/dist/components/ui/toggle-group.d.ts +3 -3
  485. package/dist/components/ui/toggle.d.ts +2 -2
  486. package/dist/components/ui/tooltip.d.ts +1 -3
  487. package/dist/{containers-CSdc32h9.js → containers-BdfLTP4w.js} +37 -32
  488. package/dist/containers-BdfLTP4w.js.map +1 -0
  489. package/dist/content-block-hooks-Z3iKjqd1.js +17 -0
  490. package/dist/content-block-hooks-Z3iKjqd1.js.map +1 -0
  491. package/dist/{copyable-3fdHfMR3.js → copyable-Bmr14W0d.js} +6 -6
  492. package/dist/{copyable-3fdHfMR3.js.map → copyable-Bmr14W0d.js.map} +1 -1
  493. package/dist/{data-display-Cmj-xZYl.js → data-display-CWe9SOYh.js} +264 -251
  494. package/dist/data-display-CWe9SOYh.js.map +1 -0
  495. package/dist/date-3qsCE1ID.js +209 -0
  496. package/dist/date-3qsCE1ID.js.map +1 -0
  497. package/dist/{date-picker-CyQlFYsP.js → date-picker-D1keJQIG.js} +129 -129
  498. package/dist/date-picker-D1keJQIG.js.map +1 -0
  499. package/dist/date-pickers-D8aJoeHc.js +185 -0
  500. package/dist/date-pickers-D8aJoeHc.js.map +1 -0
  501. package/dist/disclosure-panel-B0HFNZ9x.js.map +1 -1
  502. package/dist/{display-CT_N2a3w.js → display-VlmP1I0i.js} +23 -46
  503. package/dist/display-VlmP1I0i.js.map +1 -0
  504. package/dist/{dropdown-menu-C08iIugv.js → dropdown-menu-B8hjvbkS.js} +9 -9
  505. package/dist/{dropdown-menu-C08iIugv.js.map → dropdown-menu-B8hjvbkS.js.map} +1 -1
  506. package/dist/dropzone-CHBNK3de.js +116 -0
  507. package/dist/dropzone-CHBNK3de.js.map +1 -0
  508. package/dist/features/activities.js +682 -628
  509. package/dist/features/activities.js.map +1 -1
  510. package/dist/features/ai-chat.js +258 -226
  511. package/dist/features/ai-chat.js.map +1 -1
  512. package/dist/features/appointment-calendar.js +436 -340
  513. package/dist/features/appointment-calendar.js.map +1 -1
  514. package/dist/features/async-preview.js +351 -265
  515. package/dist/features/async-preview.js.map +1 -1
  516. package/dist/features/combobox.js +2 -2
  517. package/dist/features/comments.js +1 -1
  518. package/dist/features/data-view.js +212 -151
  519. package/dist/features/data-view.js.map +1 -1
  520. package/dist/features/email-composer/engine.js +1 -1
  521. package/dist/features/email-composer.js +344 -315
  522. package/dist/features/email-composer.js.map +1 -1
  523. package/dist/features/event-calendar.js +504 -355
  524. package/dist/features/event-calendar.js.map +1 -1
  525. package/dist/features/filters.js +2 -2
  526. package/dist/features/global-search.js +250 -206
  527. package/dist/features/global-search.js.map +1 -1
  528. package/dist/features/kanban.js +269 -189
  529. package/dist/features/kanban.js.map +1 -1
  530. package/dist/features/map.js +385 -371
  531. package/dist/features/map.js.map +1 -1
  532. package/dist/features/media-library.js +1571 -1199
  533. package/dist/features/media-library.js.map +1 -1
  534. package/dist/features/mentions.js +2 -2
  535. package/dist/features/overlays.js +2 -2
  536. package/dist/features/products.js +1780 -1691
  537. package/dist/features/products.js.map +1 -1
  538. package/dist/features/questionnaire.js +165 -152
  539. package/dist/features/questionnaire.js.map +1 -1
  540. package/dist/features/resource-assignment.js +223 -191
  541. package/dist/features/resource-assignment.js.map +1 -1
  542. package/dist/features/resource.js +55 -220
  543. package/dist/features/resource.js.map +1 -1
  544. package/dist/features/rich-text-editor.js +3 -3
  545. package/dist/features/schema-form.js +280 -228
  546. package/dist/features/schema-form.js.map +1 -1
  547. package/dist/features/suggestions.js +48 -39
  548. package/dist/features/suggestions.js.map +1 -1
  549. package/dist/features/table.js +2 -2
  550. package/dist/features/theme-tweaker.js +723 -633
  551. package/dist/features/theme-tweaker.js.map +1 -1
  552. package/dist/feedback-DmqmXKLn.js +254 -0
  553. package/dist/feedback-DmqmXKLn.js.map +1 -0
  554. package/dist/{field-affordance-recipes-D6H7tVJi.js → field-affordance-recipes-DfbMadot.js} +13 -9
  555. package/dist/field-affordance-recipes-DfbMadot.js.map +1 -0
  556. package/dist/{field-state-recipes-7sza8QbC.js → field-state-recipes-EtCxpEy3.js} +6 -2
  557. package/dist/field-state-recipes-EtCxpEy3.js.map +1 -0
  558. package/dist/filters-BviMRMLS.js +2692 -0
  559. package/dist/filters-BviMRMLS.js.map +1 -0
  560. package/dist/{focus-recipes-B653VaLq.js → focus-recipes-DSkiUvUp.js} +3 -3
  561. package/dist/focus-recipes-DSkiUvUp.js.map +1 -0
  562. package/dist/{form-field-CAPdwdnZ.js → form-field-BdfCwSoQ.js} +5 -5
  563. package/dist/{form-field-CAPdwdnZ.js.map → form-field-BdfCwSoQ.js.map} +1 -1
  564. package/dist/{form-sizing-CgcrUbLU.js → form-sizing-DE_dZw32.js} +3 -3
  565. package/dist/{form-sizing-CgcrUbLU.js.map → form-sizing-DE_dZw32.js.map} +1 -1
  566. package/dist/{forms-B3W8CH7-.js → forms-B8DzJnBN.js} +35 -35
  567. package/dist/forms-B8DzJnBN.js.map +1 -0
  568. package/dist/forms-numeric-DOBswjKj.js +992 -0
  569. package/dist/forms-numeric-DOBswjKj.js.map +1 -0
  570. package/dist/{header-ZIIsRKxP.js → header-Cq3G0ZRP.js} +100 -95
  571. package/dist/header-Cq3G0ZRP.js.map +1 -0
  572. package/dist/{hooks-BitHSh-Y.js → hooks-DHfeSMAO.js} +34 -14
  573. package/dist/hooks-DHfeSMAO.js.map +1 -0
  574. package/dist/{http-D_6rOnzU.js → http-Cu-GPpss.js} +61 -35
  575. package/dist/http-Cu-GPpss.js.map +1 -0
  576. package/dist/{icon-badge-npxF1SLX.js → icon-badge-B0Kq7wom.js} +3 -3
  577. package/dist/{icon-badge-npxF1SLX.js.map → icon-badge-B0Kq7wom.js.map} +1 -1
  578. package/dist/index.js +6 -6
  579. package/dist/inline-gutter-context-CSqmrMFZ.js +11 -0
  580. package/dist/inline-gutter-context-CSqmrMFZ.js.map +1 -0
  581. package/dist/{input-DIREVYHs.js → input-2YrgTUrz.js} +3 -3
  582. package/dist/{input-DIREVYHs.js.map → input-2YrgTUrz.js.map} +1 -1
  583. package/dist/{input-7KAc7XQL.js → input-DfJyrjoR.js} +6 -6
  584. package/dist/{input-7KAc7XQL.js.map → input-DfJyrjoR.js.map} +1 -1
  585. package/dist/{interaction-recipes-4wZ2tvfb.js → interaction-recipes-DmuS1ase.js} +2 -2
  586. package/dist/{interaction-recipes-4wZ2tvfb.js.map → interaction-recipes-DmuS1ase.js.map} +1 -1
  587. package/dist/item-GJ9mvCcg.js +279 -0
  588. package/dist/item-GJ9mvCcg.js.map +1 -0
  589. package/dist/layout/app-shell.js +1 -1
  590. package/dist/layout/auth.js +1 -1
  591. package/dist/layout/containers.js +1 -1
  592. package/dist/layout/header.js +1 -1
  593. package/dist/layout/hooks.js +1 -1
  594. package/dist/layout/navigation.js +1 -1
  595. package/dist/layout/page.js +2 -2
  596. package/dist/layout/settings.js +2 -2
  597. package/dist/layout/sidebar.js +3 -3
  598. package/dist/layout/workspace.js +1 -1
  599. package/dist/layout.js +12 -12
  600. package/dist/{layout.types-E_GAApzO.js → layout.types-DbtnyAtd.js} +11 -8
  601. package/dist/layout.types-DbtnyAtd.js.map +1 -0
  602. package/dist/lib/anchored-positioning.d.ts +11 -0
  603. package/dist/lib/field-affordance-recipes.d.ts +10 -0
  604. package/dist/lib/field-state-recipes.d.ts +6 -0
  605. package/dist/lib/focus-recipes.d.ts +7 -0
  606. package/dist/lib/format.d.ts +25 -0
  607. package/dist/lib/money-format.d.ts +6 -0
  608. package/dist/lib/motion-recipes.d.ts +6 -0
  609. package/dist/lib/surface-recipes.d.ts +32 -2
  610. package/dist/lib/theme-scope.d.ts +17 -1
  611. package/dist/lib/token-merge.generated.d.ts +13 -19
  612. package/dist/lib/ui-provider/index.d.ts +1 -1
  613. package/dist/lib/ui-provider/types.d.ts +5 -0
  614. package/dist/lib/use-controllable-state.d.ts +16 -0
  615. package/dist/lib/use-copy-feedback.d.ts +15 -0
  616. package/dist/lib/utils.js +1 -1
  617. package/dist/lib/variant-props.d.ts +9 -0
  618. package/dist/main-landmark-context-BAsyqp2I.js +11 -0
  619. package/dist/main-landmark-context-BAsyqp2I.js.map +1 -0
  620. package/dist/mentions-zz0ewNIq.js +670 -0
  621. package/dist/mentions-zz0ewNIq.js.map +1 -0
  622. package/dist/{message-BJHnn43M.js → message-BiiVrRrm.js} +10 -7
  623. package/dist/{message-BJHnn43M.js.map → message-BiiVrRrm.js.map} +1 -1
  624. package/dist/{metadata-list-XkqZ_UXH.js → metadata-list-G85roWjS.js} +13 -12
  625. package/dist/metadata-list-G85roWjS.js.map +1 -0
  626. package/dist/{motion-recipes-DitYv6P2.js → motion-recipes-CUc_aHuG.js} +7 -4
  627. package/dist/motion-recipes-CUc_aHuG.js.map +1 -0
  628. package/dist/navigation-C0Be5C3i.js +304 -0
  629. package/dist/navigation-C0Be5C3i.js.map +1 -0
  630. package/dist/{navigation-Bt-v7rWP.js → navigation-CmqaQR_G.js} +99 -103
  631. package/dist/navigation-CmqaQR_G.js.map +1 -0
  632. package/dist/number-NFWKIoiK.js +340 -0
  633. package/dist/number-NFWKIoiK.js.map +1 -0
  634. package/dist/{overflow-tab-bar-BQCA2Zn2.js → overflow-tab-bar-DV7HE_3t.js} +8 -8
  635. package/dist/{overflow-tab-bar-BQCA2Zn2.js.map → overflow-tab-bar-DV7HE_3t.js.map} +1 -1
  636. package/dist/overlays-D-gAIfPF.js +1018 -0
  637. package/dist/overlays-D-gAIfPF.js.map +1 -0
  638. package/dist/page-D4pQhgSq.js +216 -0
  639. package/dist/page-D4pQhgSq.js.map +1 -0
  640. package/dist/{page-header-commands-DIKspJfx.js → page-header-commands-elelNOfd.js} +29 -29
  641. package/dist/{page-header-commands-DIKspJfx.js.map → page-header-commands-elelNOfd.js.map} +1 -1
  642. package/dist/{pagination-Br8TdV9A.js → pagination-BuSWw1US.js} +22 -23
  643. package/dist/pagination-BuSWw1US.js.map +1 -0
  644. package/dist/{popover-k8TdUcAt.js → popover-BpMxbqEK.js} +73 -69
  645. package/dist/popover-BpMxbqEK.js.map +1 -0
  646. package/dist/{popover-menu-yn-o0kyA.js → popover-menu-CO-_iiuz.js} +7 -7
  647. package/dist/{popover-menu-yn-o0kyA.js.map → popover-menu-CO-_iiuz.js.map} +1 -1
  648. package/dist/{popover.recipes-DJ0AkUan.js → popover.recipes-BqkdvlZn.js} +3 -4
  649. package/dist/{popover.recipes-DJ0AkUan.js.map → popover.recipes-BqkdvlZn.js.map} +1 -1
  650. package/dist/{portal-recipes-DyUXqUtD.js → portal-recipes-BPeS4rGB.js} +2 -2
  651. package/dist/{portal-recipes-DyUXqUtD.js.map → portal-recipes-BPeS4rGB.js.map} +1 -1
  652. package/dist/primitives-BlC1lXBr.js +447 -0
  653. package/dist/primitives-BlC1lXBr.js.map +1 -0
  654. package/dist/primitives.js +4 -4
  655. package/dist/{progress-DZFXXzPs.js → progress-RARK8AjB.js} +5 -5
  656. package/dist/{progress-DZFXXzPs.js.map → progress-RARK8AjB.js.map} +1 -1
  657. package/dist/receipt-CUf2Vegp.js +114 -0
  658. package/dist/receipt-CUf2Vegp.js.map +1 -0
  659. package/dist/{rich-text-BnTzZjIo.js → rich-text-Cypm9__d.js} +7 -8
  660. package/dist/{rich-text-BnTzZjIo.js.map → rich-text-Cypm9__d.js.map} +1 -1
  661. package/dist/rich-text-editor-Z6cQepsA.js +919 -0
  662. package/dist/rich-text-editor-Z6cQepsA.js.map +1 -0
  663. package/dist/rich-text-editor-toolbar-DYbRJARB.js +100 -0
  664. package/dist/rich-text-editor-toolbar-DYbRJARB.js.map +1 -0
  665. package/dist/rich-text-tree-DdKHIJx4.js +154 -0
  666. package/dist/rich-text-tree-DdKHIJx4.js.map +1 -0
  667. package/dist/safe-image-src-C6kQSMBZ.js +17 -0
  668. package/dist/safe-image-src-C6kQSMBZ.js.map +1 -0
  669. package/dist/{scroll-area-Bj6CRUif.js → scroll-area-B9HKbji0.js} +3 -3
  670. package/dist/{scroll-area-Bj6CRUif.js.map → scroll-area-B9HKbji0.js.map} +1 -1
  671. package/dist/{separator-DM6gs2vu.js → separator-DaDe26sf.js} +3 -3
  672. package/dist/separator-DaDe26sf.js.map +1 -0
  673. package/dist/{separator-B9ewiCGO.js → separator-KGsNXt2J.js} +2 -2
  674. package/dist/{separator-B9ewiCGO.js.map → separator-KGsNXt2J.js.map} +1 -1
  675. package/dist/services/actions/action-adapters.d.ts +5 -2
  676. package/dist/services/actions/index.d.ts +1 -1
  677. package/dist/services/actions.js +2 -2
  678. package/dist/services/actions.js.map +1 -1
  679. package/dist/settings-D5j_RJvT.js +160 -0
  680. package/dist/settings-D5j_RJvT.js.map +1 -0
  681. package/dist/sheet-B6j_BE9O.js +241 -0
  682. package/dist/sheet-B6j_BE9O.js.map +1 -0
  683. package/dist/{sidebar-CmD6a-HK.js → sidebar-C-iQ_TJP.js} +377 -351
  684. package/dist/sidebar-C-iQ_TJP.js.map +1 -0
  685. package/dist/sidebar-D5VO2W8S.js +715 -0
  686. package/dist/sidebar-D5VO2W8S.js.map +1 -0
  687. package/dist/{skeleton-DDgdhmu9.js → skeleton-Cab_KgVo.js} +12 -12
  688. package/dist/skeleton-Cab_KgVo.js.map +1 -0
  689. package/dist/{smart-card-B6vLxqa_.js → smart-card-C59z6KFO.js} +217 -210
  690. package/dist/smart-card-C59z6KFO.js.map +1 -0
  691. package/dist/{structure-DZJ2wbAU.js → structure-DElaQwwN.js} +2 -2
  692. package/dist/{structure-DZJ2wbAU.js.map → structure-DElaQwwN.js.map} +1 -1
  693. package/dist/style.css +1 -1
  694. package/dist/{surface-recipes-C8mNycaY.js → surface-recipes-DV6rrOFq.js} +10 -2
  695. package/dist/surface-recipes-DV6rrOFq.js.map +1 -0
  696. package/dist/{table-CXSPHH25.js → table-CSRUgpdK.js} +62 -61
  697. package/dist/table-CSRUgpdK.js.map +1 -0
  698. package/dist/table-DdXDBsR_.js +1657 -0
  699. package/dist/table-DdXDBsR_.js.map +1 -0
  700. package/dist/{tabs-C4Kr_hCr.js → tabs-WnHfV2pM.js} +27 -27
  701. package/dist/tabs-WnHfV2pM.js.map +1 -0
  702. package/dist/{text-inputs-jdkS3ReG.js → text-inputs-ljyBYaCd.js} +112 -112
  703. package/dist/text-inputs-ljyBYaCd.js.map +1 -0
  704. package/dist/theme.css +21 -5
  705. package/dist/timelines-mOmS9Eh3.js +479 -0
  706. package/dist/timelines-mOmS9Eh3.js.map +1 -0
  707. package/dist/tooltip-yjX-Uv-p.js +112 -0
  708. package/dist/tooltip-yjX-Uv-p.js.map +1 -0
  709. package/dist/{tree-CeYVzdFE.js → tree-YpkxUG2Z.js} +80 -72
  710. package/dist/tree-YpkxUG2Z.js.map +1 -0
  711. package/dist/typography/rich-text.js +1 -1
  712. package/dist/{typography-C7-YMW1S.js → typography-C0dELqYV.js} +46 -40
  713. package/dist/typography-C0dELqYV.js.map +1 -0
  714. package/dist/typography.js +1 -1
  715. package/dist/{ui-provider-C-74NVLc.js → ui-provider-Bu1S-o96.js} +4 -3
  716. package/dist/ui-provider-Bu1S-o96.js.map +1 -0
  717. package/dist/ui-provider.js +2 -2
  718. package/dist/{upload-Hdm5gObf.js → upload-DMuMYJFT.js} +276 -268
  719. package/dist/upload-DMuMYJFT.js.map +1 -0
  720. package/dist/{usage-card-9s8hLDfn.js → usage-card-DDPki5P1.js} +57 -54
  721. package/dist/usage-card-DDPki5P1.js.map +1 -0
  722. package/dist/use-controllable-state-BlP8SyBI.js +13 -0
  723. package/dist/use-controllable-state-BlP8SyBI.js.map +1 -0
  724. package/dist/use-copy-feedback-CzcaqlLf.js +28 -0
  725. package/dist/use-copy-feedback-CzcaqlLf.js.map +1 -0
  726. package/dist/use-metric-format-options-Dk4rC1NO.js +251 -0
  727. package/dist/use-metric-format-options-Dk4rC1NO.js.map +1 -0
  728. package/dist/{utils-DhuoqFy4.js → utils-BVbAG2J6.js} +98 -76
  729. package/dist/utils-BVbAG2J6.js.map +1 -0
  730. package/dist/value-inputs-h5MwjGCo.js +982 -0
  731. package/dist/value-inputs-h5MwjGCo.js.map +1 -0
  732. package/dist/value-typography-D15uwfj-.js +154 -0
  733. package/dist/value-typography-D15uwfj-.js.map +1 -0
  734. package/dist/workspace-DIryPqBt.js +400 -0
  735. package/dist/workspace-DIryPqBt.js.map +1 -0
  736. package/docs/consumer-skill/SKILL.md +7 -0
  737. package/docs/consumer-skill/agents/themelia-ui-designer.md +11 -2
  738. package/docs/consumer-skill/examples/analytics.tsx +1 -1
  739. package/docs/consumer-skill/examples/app-layout.tsx +3 -3
  740. package/docs/consumer-skill/examples/commerce-lines.tsx +7 -5
  741. package/docs/consumer-skill/examples/detail.tsx +3 -2
  742. package/docs/consumer-skill/examples/email-composer.tsx +1 -1
  743. package/docs/consumer-skill/examples/index-table.tsx +2 -2
  744. package/docs/consumer-skill/examples/scoped-directory.tsx +7 -6
  745. package/docs/consumer-skill/references/agents-md.md +20 -16
  746. package/docs/consumer-skill/references/analytics.md +20 -6
  747. package/docs/consumer-skill/references/building-views.md +213 -0
  748. package/docs/consumer-skill/references/catalogue.md +617 -0
  749. package/docs/consumer-skill/references/component-contracts.json +10202 -18084
  750. package/docs/consumer-skill/references/composition.md +21 -17
  751. package/docs/consumer-skill/references/discovery.md +8 -5
  752. package/docs/consumer-skill/references/installation.md +10 -4
  753. package/docs/consumer-skill/references/integration.md +5 -5
  754. package/docs/consumer-skill/references/product-composition.md +2 -2
  755. package/docs/consumer-skill/references/public-api.json +580 -633
  756. package/docs/consumer-skill/references/review.md +6 -4
  757. package/docs/consumer-skill/references/screen-archetypes.md +2 -2
  758. package/docs/consumer-skill/references/theming.md +1 -1
  759. package/docs/consumer-skill/references/tokens.json +4 -4
  760. package/docs/consumer-skill/references/workflows.md +7 -7
  761. package/docs/consumer-skill/scripts/composition-policy.mjs +40 -20
  762. package/docs/consumer-skill/scripts/composition.mjs +4 -1
  763. package/docs/consumer-skill/scripts/discovery.mjs +3 -1
  764. package/docs/consumer-skill/scripts/setup-skills.mjs +31 -4
  765. package/docs/consumer-skills/themelia-components/SKILL.md +8 -4
  766. package/docs/consumer-skills/themelia-composition/SKILL.md +7 -3
  767. package/docs/consumer-skills/themelia-design/SKILL.md +7 -1
  768. package/docs/consumer-skills/themelia-tokenization/SKILL.md +1 -1
  769. package/package.json +9 -12
  770. package/templates/README.md +3 -2
  771. package/templates/admin-shell-template.tsx +49 -9
  772. package/templates/analytics-operations-template.tsx +20 -24
  773. package/templates/customers-template.tsx +12 -9
  774. package/templates/index.ts +2 -8
  775. package/templates/orders-template.tsx +28 -24
  776. package/templates/products-template.tsx +14 -4
  777. package/templates/user-permissions-template.tsx +11 -14
  778. package/dist/accordion-0tQUZ20r.js.map +0 -1
  779. package/dist/action-menu-C0gjzLyE.js +0 -284
  780. package/dist/action-menu-C0gjzLyE.js.map +0 -1
  781. package/dist/ai-artifact-CGGpQryR.js +0 -1200
  782. package/dist/ai-artifact-CGGpQryR.js.map +0 -1
  783. package/dist/anchored-positioning-DPnKTvNs.js +0 -6
  784. package/dist/anchored-positioning-DPnKTvNs.js.map +0 -1
  785. package/dist/app-shell-EHuuRDGy.js +0 -321
  786. package/dist/app-shell-EHuuRDGy.js.map +0 -1
  787. package/dist/auth-B0girIk_.js.map +0 -1
  788. package/dist/badge-wWauMgAt.js.map +0 -1
  789. package/dist/base/sheet.js +0 -3
  790. package/dist/breadcrumbs-Bp9Ke7kd.js.map +0 -1
  791. package/dist/button-ChBovTx0.js.map +0 -1
  792. package/dist/buttons-DeW0bQeK.js.map +0 -1
  793. package/dist/cascader-CrAl9zD5.js +0 -439
  794. package/dist/cascader-CrAl9zD5.js.map +0 -1
  795. package/dist/choice-inputs-DHGtx0QV.js.map +0 -1
  796. package/dist/code-block-BSJyq9e-.js.map +0 -1
  797. package/dist/collapsible-BzJ91LUG.js +0 -81
  798. package/dist/collapsible-BzJ91LUG.js.map +0 -1
  799. package/dist/combobox-Bcvu5J8O.js +0 -363
  800. package/dist/combobox-Bcvu5J8O.js.map +0 -1
  801. package/dist/combobox-C2JiSQPc.js +0 -915
  802. package/dist/combobox-C2JiSQPc.js.map +0 -1
  803. package/dist/command-9e52NPgK.js +0 -425
  804. package/dist/command-9e52NPgK.js.map +0 -1
  805. package/dist/comments-BsgErEqd.js +0 -1174
  806. package/dist/comments-BsgErEqd.js.map +0 -1
  807. package/dist/components/base/buttons/tooltip-button.d.ts +0 -7
  808. package/dist/components/base/display/content-block.d.ts +0 -75
  809. package/dist/components/base/display/content-block.strings.d.ts +0 -5
  810. package/dist/components/base/sheet/index.d.ts +0 -29
  811. package/dist/components/blocks/ai/use-copy-feedback.d.ts +0 -6
  812. package/dist/components/blocks/data-display/metadata/index.d.ts +0 -30
  813. package/dist/components/features/mentions/utils/split-html-by-mentions.d.ts +0 -10
  814. package/dist/components/features/resource/resource.strings.d.ts +0 -12
  815. package/dist/components/features/rich-text-editor/partials/rich-text-editor-fallback.d.ts +0 -8
  816. package/dist/components/features/sync/index.d.ts +0 -26
  817. package/dist/components/features/sync/sync-range-dialog-form.d.ts +0 -5
  818. package/dist/components/features/sync/sync.strings.d.ts +0 -18
  819. package/dist/components/features/sync/sync.types.d.ts +0 -44
  820. package/dist/components/layout/page/partials/page-actions.d.ts +0 -3
  821. package/dist/components/ui/slot.d.ts +0 -6
  822. package/dist/containers-CSdc32h9.js.map +0 -1
  823. package/dist/data-display-Cmj-xZYl.js.map +0 -1
  824. package/dist/date-Br0FicVv.js +0 -144
  825. package/dist/date-Br0FicVv.js.map +0 -1
  826. package/dist/date-picker-CyQlFYsP.js.map +0 -1
  827. package/dist/date-pickers-tj2MXmXd.js +0 -185
  828. package/dist/date-pickers-tj2MXmXd.js.map +0 -1
  829. package/dist/display-CT_N2a3w.js.map +0 -1
  830. package/dist/features/sync.js +0 -142
  831. package/dist/features/sync.js.map +0 -1
  832. package/dist/feedback-Dzo1xtAU.js +0 -246
  833. package/dist/feedback-Dzo1xtAU.js.map +0 -1
  834. package/dist/field-affordance-recipes-D6H7tVJi.js.map +0 -1
  835. package/dist/field-state-recipes-7sza8QbC.js.map +0 -1
  836. package/dist/filters-Dl80yYtN.js +0 -2415
  837. package/dist/filters-Dl80yYtN.js.map +0 -1
  838. package/dist/focus-recipes-B653VaLq.js.map +0 -1
  839. package/dist/forms-B3W8CH7-.js.map +0 -1
  840. package/dist/forms-numeric-CwjQJe-O.js +0 -991
  841. package/dist/forms-numeric-CwjQJe-O.js.map +0 -1
  842. package/dist/header-ZIIsRKxP.js.map +0 -1
  843. package/dist/hooks-BitHSh-Y.js.map +0 -1
  844. package/dist/http-D_6rOnzU.js.map +0 -1
  845. package/dist/item-FfWnaYST.js +0 -278
  846. package/dist/item-FfWnaYST.js.map +0 -1
  847. package/dist/layout.types-E_GAApzO.js.map +0 -1
  848. package/dist/media-gallery-C81DAnKI.js +0 -203
  849. package/dist/media-gallery-C81DAnKI.js.map +0 -1
  850. package/dist/mentions-qOnedSt4.js +0 -639
  851. package/dist/mentions-qOnedSt4.js.map +0 -1
  852. package/dist/metadata-list-XkqZ_UXH.js.map +0 -1
  853. package/dist/motion-recipes-DitYv6P2.js.map +0 -1
  854. package/dist/navigation-BgtPJAhi.js +0 -288
  855. package/dist/navigation-BgtPJAhi.js.map +0 -1
  856. package/dist/navigation-Bt-v7rWP.js.map +0 -1
  857. package/dist/number-CYqBcrSj.js +0 -346
  858. package/dist/number-CYqBcrSj.js.map +0 -1
  859. package/dist/overlays-CC8zI3Du.js +0 -1017
  860. package/dist/overlays-CC8zI3Du.js.map +0 -1
  861. package/dist/page-BoQ1VaFJ.js +0 -331
  862. package/dist/page-BoQ1VaFJ.js.map +0 -1
  863. package/dist/pagination-Br8TdV9A.js.map +0 -1
  864. package/dist/popover-k8TdUcAt.js.map +0 -1
  865. package/dist/primitives-BkkQjYl7.js +0 -385
  866. package/dist/primitives-BkkQjYl7.js.map +0 -1
  867. package/dist/receipt-C7LhOg7Q.js +0 -116
  868. package/dist/receipt-C7LhOg7Q.js.map +0 -1
  869. package/dist/rich-text-editor-CAurDwT5.js +0 -1273
  870. package/dist/rich-text-editor-CAurDwT5.js.map +0 -1
  871. package/dist/rich-text-editor-toolbar-DbXig7Jk.js +0 -99
  872. package/dist/rich-text-editor-toolbar-DbXig7Jk.js.map +0 -1
  873. package/dist/rich-text-tree-BqyQ_7-R.js +0 -66
  874. package/dist/rich-text-tree-BqyQ_7-R.js.map +0 -1
  875. package/dist/sanitize-html-BWkH4dLM.js +0 -105
  876. package/dist/sanitize-html-BWkH4dLM.js.map +0 -1
  877. package/dist/separator-DM6gs2vu.js.map +0 -1
  878. package/dist/settings-DZPHgpx4.js +0 -155
  879. package/dist/settings-DZPHgpx4.js.map +0 -1
  880. package/dist/sheet-C4DHsgLk.js +0 -250
  881. package/dist/sheet-C4DHsgLk.js.map +0 -1
  882. package/dist/sidebar-C8BnDwTH.js +0 -709
  883. package/dist/sidebar-C8BnDwTH.js.map +0 -1
  884. package/dist/sidebar-CmD6a-HK.js.map +0 -1
  885. package/dist/skeleton-DDgdhmu9.js.map +0 -1
  886. package/dist/slot-CLF9kLrS.js +0 -16
  887. package/dist/slot-CLF9kLrS.js.map +0 -1
  888. package/dist/smart-card-B6vLxqa_.js.map +0 -1
  889. package/dist/surface-recipes-C8mNycaY.js.map +0 -1
  890. package/dist/table-CBonSdTp.js +0 -1584
  891. package/dist/table-CBonSdTp.js.map +0 -1
  892. package/dist/table-CXSPHH25.js.map +0 -1
  893. package/dist/tabs-C4Kr_hCr.js.map +0 -1
  894. package/dist/text-inputs-jdkS3ReG.js.map +0 -1
  895. package/dist/timelines-CoPwdJP0.js +0 -458
  896. package/dist/timelines-CoPwdJP0.js.map +0 -1
  897. package/dist/tooltip-31NwIpTo.js +0 -113
  898. package/dist/tooltip-31NwIpTo.js.map +0 -1
  899. package/dist/tree-CeYVzdFE.js.map +0 -1
  900. package/dist/typography-C7-YMW1S.js.map +0 -1
  901. package/dist/ui-provider-C-74NVLc.js.map +0 -1
  902. package/dist/upload-Hdm5gObf.js.map +0 -1
  903. package/dist/upload-queue-D0sYPuqo.js +0 -409
  904. package/dist/upload-queue-D0sYPuqo.js.map +0 -1
  905. package/dist/usage-card-9s8hLDfn.js.map +0 -1
  906. package/dist/utils-DhuoqFy4.js.map +0 -1
  907. package/dist/value-inputs-D3aPgq9H.js +0 -980
  908. package/dist/value-inputs-D3aPgq9H.js.map +0 -1
  909. package/dist/value-typography-uSzzG9Gf.js +0 -122
  910. package/dist/value-typography-uSzzG9Gf.js.map +0 -1
  911. package/dist/workspace-CC8Vchiu.js +0 -411
  912. package/dist/workspace-CC8Vchiu.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"media-library.js","names":["_Fragment","NumberValue","_Fragment","resolveComponentScale","useDensityConfig","cn","Button","Text","focusRecipes","Grid","Stack","AlertDescription","SurfaceTitle","Alert","LoadingState","ErrorState","Progress","compositionRhythm","compositionClasses","ActionDialog","ConfirmDialog","interactionRecipes","formatFileSize","FileSize","Dimensions","Percent","Number$1","Badge","BatchActionBar","Input","FormField","Switch","Select","segmentedControlRecipes","controlGroupHeightClasses","uploadDropTargetRecipes","MetadataList","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","selectingProp","isServer","fetcher","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","fetched","setFetched","loading","setLoading","error","setError","loadError","setLoadError","mutationError","setMutationError","uploadError","setUploadError","createdItems","setCreatedItems","serverUploads","setServerUploads","selectedRecords","setSelectedRecords","removedIds","setRemovedIds","itemPatches","setItemPatches","stagedFiles","setStagedFiles","stagedFilesRef","useRef","nextStagedId","uploading","setUploading","defaultResolvedUploadOptions","defaultUploadOptions","uploadOptions","setUploadOptions","onUploadOptionsChange","isSelectionControlled","selectedIds","selectedSet","objectUrlRef","uploadControllerRef","mutationVersionRef","fetchAttempt","setFetchAttempt","retry","attempt","fetchCallbacks","useEffect","onError","request","current","controller","nextError","refreshKey","returnedIds","remaining","objectUrls","serverItems","pendingServerItems","loadedIds","id","sourceItems","patchedItems","visibleItems","totalCount","filteredCount","knownById","resolveSelection","requested","ids","additions","additionsById","selectedItems","hasFilters","applySelection","nextIds","onValueChange","latestSelection","toggleSelection","selectionMode","clearSelection","selectionRequested","setSelectionRequested","defaultSelecting","onSelectingChange","selecting","setSelecting","clearFilters","updateStagedFiles","update","releaseStagedPreview","src","addFiles","files","added","removeStagedFile","clearStagedFiles","updateUploadOptions","setUploadFile","fileId","startUpload","batch","fileIds","batchIds","acceptsUpdate","helpers","progress","uploaded","onUpload","uploadedIds","selection","cancelUpload","updateItem","onItemUpdate","mutationKey","version","previousPatch","removeItem","onItemDelete","wasRemoved","selectedId","selectionTargetClassName","checkClassName","checkSelectedClassName","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","onClearFilters","summary","Grid2X2","LayoutList","toolbarEnd","MediaLibraryCard","name","alt","usageCount","isPrivate","duration","opens","onOpen","activate","onToggle","selected","density","Check","onDetails","Info","Play","Lock","showMeta","Layers3","MediaLibraryList","DisplayLabel","MediaLibraryTagsField","committed","tags","draft","setDraft","commit","readOnly","tag","index","MediaLibraryDetailPanel","isPublic","onUpdate","custom","renderDetail","allowDelete","onRemove","onReplace","onClose","ArrowLeft","checked","MediaLibraryUploadPanel","onFiles","hasUploadError","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","confirmOnSelect","resolvedCollections","activeTab","allowUpload","deleteRequest","setDeleteRequest","deleteRequestRef","deleteItemId","detailItem","deleteFailed","footerPortal","useContext","usesDefaultFooter","slots","dialogSelectionSummary","hasHeaderIdentity","title","titleSuffix","hasHeaderControls","hasHeader","confirm","cancel","confirmItem","sectionRef","resultsRef","detailOpenerRef","returnToResultsRef","requestDelete","finishDelete","removed","showDetail","openItem","onItemOpen","opener","hasLoadError","countLabel","usesBulkBar","bulkActions","bulkSelectedCount","footer","heightClassName","UploadCloud","candidate","ctx","rendered","onItemReplace","createPortal","open","MediaLibraryDialog","internalOpen","setInternalOpen","footerElement","setFooterElement","isOpenControlled","resolvedOpen","handleOpenChange","nextOpen","onOpenChange","closeMediaLibrary","dialogTitle","dialogDescription","dialogClassName","contentClassName","moveItem","from","to","MediaResourceGallery","total","resolvedPrimaryId","primaryId","canAdd","onAdd","maxItems","canSetPrimary","onPrimaryChange","canRemove","canReorder","onReorder","hasItemActions","defaultAction","layout","Plus","move","nextItems","shouldShowEmptyState","renderAddTile","ImagePlus","isPrimary","canMovePrevious","canMoveNext","renderItem","Star","ArrowRight","Trash2"],"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\t/** Retry action in the load error state. Defaults to \"Try again\". */\n\tretry?: string;\n\tcardDetails: string;\n\t/** Toolbar toggle that turns selection mode on or off. */\n\tselectMode: string;\n\t/** Check control that selects one asset while browsing; `{name}` is the asset. */\n\tselectItem: string;\n\t/** Accessible name of the selected-assets action region. Defaults to \"Batch actions\". */\n\tbatchActionsLabel?: 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\tmutationError?: string;\n\t\tconfirmDeleteTitle?: string;\n\t\tconfirmDeleteDescription?: string;\n\t\tconfirmDeleteLabel?: string;\n\t\tconfirmDeleteError?: 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\terror?: 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} {count, plural, one {item} other {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: 'Check your connection, then try again.',\n\tretry: 'Try again',\n\tcardDetails: 'Details for {name}',\n\tselectMode: 'Select',\n\tselectItem: 'Select {name}',\n\tbatchActionsLabel: 'Batch actions',\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\tmutationError: 'Could not change this asset. Try again.',\n\t\tconfirmDeleteTitle: 'Delete media?',\n\t\tconfirmDeleteDescription: '{name} will be removed from this library.',\n\t\tconfirmDeleteLabel: 'Delete asset',\n\t\tconfirmDeleteError: 'Could not delete this asset. Try again.',\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\terror: 'Could not upload these files. Try again.',\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\trefreshKey,\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\tselecting: selectingProp,\n\tdefaultSelecting = false,\n\tonSelectingChange,\n}: UseMediaLibraryOptions<TItem> = {}): MediaLibraryState<TItem> {\n\tconst isServer = Boolean(fetcher);\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 [fetched, setFetched] = useState<MediaLibraryFetchResult<TItem> | null>(null);\n\tconst [loading, setLoading] = useState(isServer);\n\tconst [error, setError] = useState<unknown>(null);\n\tconst [loadError, setLoadError] = useState<unknown>(null);\n\tconst [mutationError, setMutationError] = useState<MediaLibraryState<TItem>['mutationError']>(null);\n\tconst [uploadError, setUploadError] = useState<unknown>(null);\n\tconst [createdItems, setCreatedItems] = useState<TItem[]>([]);\n\tconst [serverUploads, setServerUploads] = useState<TItem[]>([]);\n\tconst [selectedRecords, setSelectedRecords] = useState(() => new Map<string, 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 stagedFilesRef = useRef(stagedFiles);\n\tconst nextStagedId = useRef(0);\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\t// Bumped by `retry` so the fetcher runs again for the same query.\n\tconst [fetchAttempt, setFetchAttempt] = useState(0);\n\tconst retry = useCallback(() => setFetchAttempt((attempt) => attempt + 1), []);\n\tconst fetchCallbacks = useRef({ fetcher, onError });\n\n\tuseEffect(() => {\n\t\tfetchCallbacks.current = { fetcher, onError };\n\t}, [fetcher, onError]);\n\n\tuseEffect(() => {\n\t\tconst request = fetchCallbacks.current.fetcher;\n\t\tif (!isServer || !request) {\n\t\t\tsetLoading(false);\n\t\t\tsetLoadError(null);\n\t\t\tsetFetched(null);\n\t\t\tsetServerUploads((current) => current.length ? [] : current);\n\t\t\treturn;\n\t\t}\n\t\tconst controller = new AbortController();\n\t\tsetLoading(true);\n\t\tsetError(null);\n\t\tsetLoadError(null);\n\t\tconst load = async () => {\n\t\t\ttry {\n\t\t\t\tconst result = await request({\n\t\t\t\t\tquery,\n\t\t\t\t\ttype,\n\t\t\t\t\tcollection: collection === 'all' ? undefined : collection,\n\t\t\t\t\tsort,\n\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t});\n\t\t\t\tif (!controller.signal.aborted) setFetched(normalizeFetchResult(result));\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\tsetLoadError(() => nextError ?? new Error('Media load failed'));\n\t\t\t\tfetchCallbacks.current.onError?.(nextError);\n\t\t\t} finally {\n\t\t\t\tif (!controller.signal.aborted) setLoading(false);\n\t\t\t}\n\t\t};\n\t\tvoid load();\n\t\treturn () => controller.abort();\n\t}, [collection, fetchAttempt, isServer, query, refreshKey, sort, type]);\n\n\tuseEffect(() => {\n\t\tif (!isServer || !fetched) return;\n\t\tconst returnedIds = new Set(fetched.items.map((item) => accessors.getId(item)));\n\t\tsetServerUploads((current) => {\n\t\t\tconst remaining = current.filter((item) => !returnedIds.has(accessors.getId(item)));\n\t\t\treturn remaining.length === current.length ? current : remaining;\n\t\t});\n\t}, [accessors, fetched, isServer]);\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 serverItems = fetched?.items ?? (EMPTY_ITEMS as readonly TItem[]);\n\tconst pendingServerItems = useMemo(() => {\n\t\tconst loadedIds = new Set(serverItems.map((item) => accessors.getId(item)));\n\t\tconst pending = serverUploads.filter((item) => {\n\t\t\tconst id = accessors.getId(item);\n\t\t\treturn !loadedIds.has(id) && !removedIds.has(id);\n\t\t});\n\t\treturn filterItems(pending, accessors, query, type, collection);\n\t}, [accessors, collection, query, removedIds, serverItems, serverUploads, type]);\n\tconst sourceItems = useMemo(\n\t\t() => (isServer ? [...pendingServerItems, ...serverItems] : [...createdItems, ...itemsProp]),\n\t\t[createdItems, isServer, itemsProp, pendingServerItems, serverItems],\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\tif (isServer) return patchedItems;\n\t\treturn sortItems(filterItems(patchedItems, accessors, query, type, collection), accessors, sort);\n\t}, [accessors, collection, isServer, patchedItems, query, sort, type]);\n\tconst totalCount = isServer && fetched?.total !== undefined\n\t\t? fetched.total + pendingServerItems.length\n\t\t: patchedItems.length;\n\tconst filteredCount = visibleItems.length;\n\tconst knownById = useMemo(\n\t\t() => new Map([...serverUploads, ...serverItems].map((item) => [accessors.getId(item), item] as const)),\n\t\t[accessors, serverItems, serverUploads],\n\t);\n\tuseEffect(() => {\n\t\tsetSelectedRecords((current) => {\n\t\t\tconst next = new Map<string, TItem>();\n\t\t\tif (isServer) {\n\t\t\t\tfor (const id of selectedIds) {\n\t\t\t\t\tconst item = knownById.get(id) ?? current.get(id);\n\t\t\t\t\tif (item !== undefined) next.set(id, item);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (next.size === current.size && [...next].every(([id, item]) => current.get(id) === item)) return current;\n\t\t\treturn next;\n\t\t});\n\t}, [isServer, knownById, selectedIds]);\n\n\tconst resolveSelection = useCallback(\n\t\t(ids: readonly string[], additions: readonly TItem[] = []) => {\n\t\t\tif (!isServer) {\n\t\t\t\tconst requested = new Set(ids);\n\t\t\t\treturn [...additions, ...patchedItems].filter((item) => requested.delete(accessors.getId(item)));\n\t\t\t}\n\t\t\tconst additionsById = new Map(additions.map((item) => [accessors.getId(item), item] as const));\n\t\t\treturn ids.flatMap((id) => {\n\t\t\t\tif (removedIds.has(id)) return [];\n\t\t\t\tconst item = additionsById.get(id) ?? knownById.get(id) ?? selectedRecords.get(id);\n\t\t\t\treturn item === undefined ? [] : [mergePatch(item, itemPatches[id])];\n\t\t\t});\n\t\t},\n\t\t[accessors, isServer, itemPatches, knownById, patchedItems, removedIds, selectedRecords],\n\t);\n\tconst selectedItems = useMemo(\n\t\t() => resolveSelection(selectedIds),\n\t\t[resolveSelection, selectedIds],\n\t);\n\tconst hasFilters = Boolean(query.trim()) || type !== 'all' || collection !== 'all';\n\n\tconst applySelection = useCallback(\n\t\t(nextIds: string[], additions?: readonly TItem[]) => {\n\t\t\tif (!isSelectionControlled) setInternalValue(nextIds);\n\t\t\tonValueChange?.(nextIds, resolveSelection(nextIds, additions));\n\t\t},\n\t\t[isSelectionControlled, onValueChange, resolveSelection],\n\t);\n\tconst latestSelection = useRef({ applySelection, selectedIds });\n\tuseEffect(() => {\n\t\tlatestSelection.current = { applySelection, selectedIds };\n\t}, [applySelection, selectedIds]);\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 [selectionRequested, setSelectionRequested] = useControllableState(\n\t\tselectingProp,\n\t\tdefaultSelecting,\n\t\tonSelectingChange,\n\t);\n\t// Selection mode is explicit (the Select toggle, a picker) or implied by any selection.\n\tconst selecting = selectionRequested || selectedIds.length > 0;\n\tconst setSelecting = useCallback((next: boolean) => {\n\t\tsetSelectionRequested(next);\n\t\t// Leaving selection mode returns to browsing, which shows no selection.\n\t\tif (!next && selectedIds.length > 0) applySelection([]);\n\t}, [applySelection, selectedIds.length, setSelectionRequested]);\n\tconst clearFilters = useCallback(() => {\n\t\tsetQuery('');\n\t\tsetType('all');\n\t\tsetCollection('all');\n\t}, [setCollection, setQuery, setType]);\n\n\tconst updateStagedFiles = useCallback((update: (files: readonly MediaLibraryStagedFile[]) => MediaLibraryStagedFile[]) => {\n\t\tconst next = update(stagedFilesRef.current);\n\t\tstagedFilesRef.current = next;\n\t\tsetStagedFiles(next);\n\t}, []);\n\n\tconst releaseStagedPreview = useCallback((src: string | undefined) => {\n\t\tif (!src) return;\n\t\trevokePreviewUrl(src);\n\t\tobjectUrlRef.current.delete(src);\n\t}, []);\n\n\tconst addFiles = useCallback((files: File[]) => {\n\t\tif (files.length === 0) return;\n\t\tsetUploadError(null);\n\t\tconst added = files.map((file): MediaLibraryStagedFile => {\n\t\t\tconst src = createPreviewUrl(file);\n\t\t\tif (src) objectUrlRef.current.add(src);\n\t\t\treturn {\n\t\t\t\tid: `staged-${nextStagedId.current++}`,\n\t\t\t\tfile,\n\t\t\t\tname: file.name,\n\t\t\t\tsize: file.size,\n\t\t\t\ttype: inferFileType(file),\n\t\t\t\tsrc,\n\t\t\t\tprogress: 0,\n\t\t\t\tstatus: 'staged',\n\t\t\t};\n\t\t});\n\t\tupdateStagedFiles((current) => [...current, ...added]);\n\t}, [updateStagedFiles]);\n\n\tconst removeStagedFile = useCallback((id: string) => {\n\t\tupdateStagedFiles((current) => {\n\t\t\treleaseStagedPreview(current.find((file) => file.id === id)?.src);\n\t\t\treturn current.filter((file) => file.id !== id);\n\t\t});\n\t}, [releaseStagedPreview, updateStagedFiles]);\n\n\tconst clearStagedFiles = useCallback(() => {\n\t\tsetUploadError(null);\n\t\tupdateStagedFiles((current) => {\n\t\t\tfor (const file of current) releaseStagedPreview(file.src);\n\t\t\treturn [];\n\t\t});\n\t}, [releaseStagedPreview, updateStagedFiles]);\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\tupdateStagedFiles((current) =>\n\t\t\t\tcurrent.map((file) => (file.id === fileId ? { ...file, ...patch } : file)),\n\t\t\t);\n\t\t},\n\t\t[updateStagedFiles],\n\t);\n\n\tconst startUpload = useCallback(async () => {\n\t\tconst batch = stagedFilesRef.current;\n\t\tif (uploadControllerRef.current || batch.length === 0) return;\n\t\tconst fileIds = batch.map((file) => file.id);\n\t\tconst batchIds = new Set(fileIds);\n\t\tconst controller = new AbortController();\n\t\tuploadControllerRef.current = controller;\n\t\tsetError(null);\n\t\tsetUploadError(null);\n\t\tsetUploading(true);\n\t\tupdateStagedFiles((current) =>\n\t\t\tcurrent.map((file) => batchIds.has(file.id)\n\t\t\t\t? { ...file, status: 'uploading', progress: 0, error: undefined }\n\t\t\t\t: file),\n\t\t);\n\t\tconst acceptsUpdate = (fileId: string) => !controller.signal.aborted\n\t\t\t&& uploadControllerRef.current === controller\n\t\t\t&& batchIds.has(fileId);\n\t\tconst helpers = {\n\t\t\tsignal: controller.signal,\n\t\t\tfileIds,\n\t\t\tsetProgress: (fileId: string, progress: number) => {\n\t\t\t\tif (!acceptsUpdate(fileId)) 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 (!acceptsUpdate(fileId)) 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 = batch.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\tupdateStagedFiles((current) =>\n\t\t\t\tcurrent.filter((file) => {\n\t\t\t\t\tif (!batchIds.has(file.id) || file.status === 'error') return true;\n\t\t\t\t\treleaseStagedPreview(file.src);\n\t\t\t\t\treturn false;\n\t\t\t\t}),\n\t\t\t);\n\t\t\tif (uploaded?.length) {\n\t\t\t\tconst uploadedIds = uploaded.map((item) => accessors.getId(item));\n\t\t\t\tif (isServer) {\n\t\t\t\t\tconst ids = new Set(uploadedIds);\n\t\t\t\t\tsetServerUploads((current) => [...uploaded, ...current.filter((item) => !ids.has(accessors.getId(item)))]);\n\t\t\t\t} else {\n\t\t\t\t\tsetCreatedItems((current) => [...uploaded, ...current]);\n\t\t\t\t}\n\t\t\t\tconst selection = latestSelection.current;\n\t\t\t\tselection.applySelection(\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, ...selection.selectedIds])),\n\t\t\t\t\tuploaded,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (isServer && onUpload) retry();\n\t\t\tif (stagedFilesRef.current.length === 0) setTab('library');\n\t\t} catch (nextError) {\n\t\t\tif (controller.signal.aborted) return;\n\t\t\tsetError(() => nextError);\n\t\t\tsetUploadError(() => nextError ?? new Error('Media upload failed'));\n\t\t\tupdateStagedFiles((current) =>\n\t\t\t\tcurrent.map((file) =>\n\t\t\t\t\tbatchIds.has(file.id) && file.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\tisServer,\n\t\tonError,\n\t\tonUpload,\n\t\treleaseStagedPreview,\n\t\tretry,\n\t\tselectionMode,\n\t\tsetTab,\n\t\tsetUploadFile,\n\t\tupdateStagedFiles,\n\t\tuploadOptions,\n\t]);\n\n\tconst cancelUpload = useCallback(() => {\n\t\tuploadControllerRef.current?.abort();\n\t\tuploadControllerRef.current = null;\n\t\tsetUploading(false);\n\t\tupdateStagedFiles((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}, [updateStagedFiles]);\n\n\tconst updateItem = useCallback(\n\t\tasync (item: TItem, patch: MediaLibraryItemPatch): Promise<boolean> => {\n\t\t\tif (!onItemUpdate) return false;\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\tsetMutationError((current) => current?.itemId === id ? null : current);\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\tsetMutationError({ itemId: id, operation: 'update', cause: nextError });\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\tif (!onItemDelete) return false;\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\tsetMutationError((current) => current?.itemId === id ? null : current);\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 (mutationVersionRef.current.get(mutationKey) === version) {\n\t\t\t\t\tsetMutationError({ itemId: id, operation: 'delete', cause: nextError });\n\t\t\t\t\tif (!wasRemoved) {\n\t\t\t\t\t\tsetRemovedIds((current) => {\n\t\t\t\t\t\t\tconst next = new Set(current);\n\t\t\t\t\t\t\tnext.delete(id);\n\t\t\t\t\t\t\treturn next;\n\t\t\t\t\t\t});\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\tselecting,\n\t\tsetSelecting,\n\t\tclearFilters,\n\t\tloading,\n\t\thasLoadedResults: isServer && (fetched !== null || pendingServerItems.length > 0),\n\t\terror,\n\t\tloadError,\n\t\tmutationError,\n\t\tuploadError,\n\t\tretry,\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 {compositionClasses} from '../../../base/structure/composition.recipes';\nimport {\n\tArrowLeft,\n\tCheck,\n\tFile,\n\tGrid2X2,\n\tImageIcon,\n\tInfo,\n\tLayoutList,\n\tLayers3,\n\tLock,\n\tPlay,\n\tSearch,\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 { Alert, AlertDescription, Progress } from '../../../base/feedback';\nimport { MetadataList } from '../../../base/metadata-list';\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';\nimport { focusRecipes } from '../../../../lib/focus-recipes';\nimport { interactionRecipes } from '../../../../lib/interaction-recipes';\n\nconst selectionTargetClassName = `${interactionRecipes.nativeButtonReset} absolute inset-0 z-10 block h-full w-full cursor-pointer outline-none ${focusRecipes.inset}`;\n/** The check on a card: a passive indicator in selection mode, a select control while browsing. */\nconst checkClassName = '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 p-0 text-transparent shadow-xs';\nconst checkSelectedClassName = 'border-primary bg-primary text-primary-foreground opacity-100';\n\nimport {\n\tdefaultMediaLibraryStrings,\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';\nimport { EMPTY } from '../../../../lib/format';\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/30', 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\tselecting = false,\n\tonSelectingChange,\n\tsummary,\n\tdisabled = false,\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// Two groups that wrap as wholes: the filters, and the view controls with\n\t\t// the result summary. In a narrow container the filters wrap among\n\t\t// themselves and the view group takes its own line; no control is left\n\t\t// alone on a row.\n\t\t<Stack direction=\"horizontal\" wrap align=\"start\" gap=\"md\" className=\"media-library-toolbar--component\">\n\t\t\t<Stack direction=\"horizontal\" wrap align=\"start\" gap=\"md\" className=\"media-library-toolbar--filters min-w-0 grow basis-80\">\n\t\t\t\t<Stack gap=\"xs\" className=\"media-library-toolbar--search min-w-52 flex-1\">\n\t\t\t\t\t<Input\n\t\t\t\t\t\tvalue={query}\n\t\t\t\t\t\tonChange={(event) => onQueryChange(event.target.value)}\n\t\t\t\t\t\tplaceholder={strings.searchPlaceholder}\n\t\t\t\t\t\tstartIcon={Search}\n\t\t\t\t\t\tclearable\n\t\t\t\t\t\tonClear={() => onQueryChange('')}\n\t\t\t\t\t\tstrings={{ clear: strings.clearSearch }}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName=\"bg-background\"\n\t\t\t\t\t/>\n\t\t\t\t\t{!!hasQuery && (\n\t\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\t<Badge tone=\"secondary\" className=\"max-w-full\">\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" className=\"text-current\">\n\t\t\t\t\t\t\t\t\t{strings.activeSearchLabel}\n\t\t\t\t\t\t\t\t</Text>\n\t\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\t{trimmedQuery}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t\t<div className={cn('media-library-toolbar--type-toggle shrink-0', segmentedControlRecipes.frame, controlGroupHeightClasses[size])} role=\"tablist\" aria-label={strings.typeFilterLabel}>\n\t\t\t\t\t{typeOptions.map((option) => {\n\t\t\t\t\t\tconst Icon = option.icon;\n\t\t\t\t\t\tconst active = type === option.value;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\t\taria-selected={active}\n\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\tsegmentedControlRecipes.item, 'shadow-none',\n\t\t\t\t\t\t\t\t\tactive\n\t\t\t\t\t\t\t\t\t\t? `${interactionRecipes.segmentActive} hover:bg-card`\n\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)}\n\t\t\t\t\t\t\t\tonClick={() => onTypeChange(option.value as typeof type)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{Icon && <Icon className=\"size-icon-md\" />}\n\t\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\t</Button>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t\t{/* Collection and sort move to a new row as one pair, so neither is left alone\n\t\t\t\t on a row; the pair only splits when it cannot fit a row by itself. */}\n\t\t\t\t<Stack direction=\"horizontal\" gap=\"md\" wrap className=\"media-library-toolbar--selects min-w-0\">\n\t\t\t\t\t<div className=\"min-w-40 grow\">\n\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\tvalue={collection}\n\t\t\t\t\t\t\toptions={collectionOptions}\n\t\t\t\t\t\t\tonValueChange={(value) => onCollectionChange(value ?? 'all')}\n\t\t\t\t\t\t\tplaceholder={strings.collectionFilterLabel}\n\t\t\t\t\t\t\taria-label={strings.collectionFilterLabel}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\tclassName=\"bg-background\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"min-w-32 grow\">\n\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\tvalue={sort}\n\t\t\t\t\t\t\toptions={sortOptions}\n\t\t\t\t\t\t\tonValueChange={(value) => onSortChange((value ?? 'newest') as typeof sort)}\n\t\t\t\t\t\t\tplaceholder={strings.sortLabel}\n\t\t\t\t\t\t\taria-label={strings.sortLabel}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\tclassName=\"bg-background\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</Stack>\n\t\t\t\t{!!hasActiveFilters && (\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\tdisabled={disabled}\n\t\t\t\t\t\tonClick={onClearFilters}\n\t\t\t\t\t>\n\t\t\t\t\t\t{strings.clearFilters}\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t\t<Stack direction=\"horizontal\" align=\"center\" gap=\"md\" wrap={false} className=\"media-library-toolbar--view ms-auto min-w-0 max-w-full\">\n\t\t\t\t{summary}\n\t\t\t\t<div className={cn('media-library-toolbar--view-toggle shrink-0', segmentedControlRecipes.frame, controlGroupHeightClasses[size])}>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\ttone={view === 'grid' ? 'neutral' : 'secondary'}\n\t\t\t\t\t\tbuttonStyle={view === 'grid' ? 'solid' : 'ghost'}\n\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={cn(segmentedControlRecipes.item, view === 'grid' && `${interactionRecipes.segmentActive} hover:bg-card`)}\n\t\t\t\t\t\taria-label={strings.gridView}\n\t\t\t\t\t\tonClick={() => onViewChange('grid')}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Grid2X2 className=\"size-icon-md\" />\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={view === 'table' ? 'neutral' : 'secondary'}\n\t\t\t\t\t\tbuttonStyle={view === 'table' ? 'solid' : 'ghost'}\n\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={cn(segmentedControlRecipes.item, view === 'table' && `${interactionRecipes.segmentActive} hover:bg-card`)}\n\t\t\t\t\t\taria-label={strings.tableView}\n\t\t\t\t\t\tonClick={() => onViewChange('table')}\n\t\t\t\t\t>\n\t\t\t\t\t\t<LayoutList className=\"size-icon-md\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t\t{!!onSelectingChange && (\n\t\t\t\t\t// Selection is an explicit mode: while it is off, activating an asset opens it.\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\taria-pressed={selecting}\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tbuttonStyle=\"outline\"\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={cn('media-library-toolbar--select shrink-0', selecting && interactionRecipes.togglePressed)}\n\t\t\t\t\t\tonClick={() => onSelectingChange(!selecting)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{strings.selectMode}\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t\t{toolbarEnd}\n\t\t\t</Stack>\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\tonOpen,\n\tselecting = false,\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\t// Browsing opens the asset and a separate check selects it; selection mode toggles.\n\tconst opens = !!onOpen && !selecting;\n\tconst activate = opens ? onOpen : onToggle;\n\n\treturn (\n\t\t<div\n\t\t\tdata-selected={selected || undefined}\n\t\t\tdata-selecting={selecting || 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 bg-card text-card-foreground text-left shadow-xs transition-all',\n\t\t\t\t`${interactionRecipes.tileHover} hover:shadow-sm`,\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={activate}\n\t\t>\n\t\t\t{!!activate && (\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={opens ? undefined : selected}\n\t\t\t\t\tclassName={cn('media-library-card--select rounded-radius', selectionTargetClassName)}\n\t\t\t\t\tonClick={(event) => { event.stopPropagation(); activate(); }}\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{opens && !!onToggle ? (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\taria-label={formatMediaLibraryString(strings.selectItem, { name })}\n\t\t\t\t\t\taria-pressed={selected}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\tcheckClassName,\n\t\t\t\t\t\t\t`z-10 cursor-pointer opacity-0 transition-opacity group-hover/card:opacity-100 group-focus-within/card:opacity-100 pointer-coarse:opacity-100 ${focusRecipes.frame}`,\n\t\t\t\t\t\t\tselected && checkSelectedClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tonClick={(event) => { event.stopPropagation(); onToggle(); }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Check className=\"size-icon-sm\" />\n\t\t\t\t\t</button>\n\t\t\t\t) : (\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\tcheckClassName,\n\t\t\t\t\t\t\t'transition-opacity',\n\t\t\t\t\t\t\tselecting ? 'opacity-100' : 'opacity-0 group-hover/card:opacity-100 group-focus-within/card:opacity-100',\n\t\t\t\t\t\t\tselected && checkSelectedClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Check className=\"size-icon-sm\" />\n\t\t\t\t\t</span>\n\t\t\t\t)}\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-10 right-2 top-2 opacity-0 shadow-sm transition-opacity group-hover/card:opacity-100 group-focus-within/card:opacity-100 pointer-coarse: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\" type=\"inherit\" 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\tonOpen,\n\tselecting = false,\n}: MediaLibraryListProps<TItem>) {\n\t// Browsing opens the row's asset and its check selects it; selection mode toggles.\n\tconst opens = !!onOpen && !selecting;\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 ${interactionRecipes.rowHover}`,\n\t\t\t\t\t\t\tselected && interactionRecipes.rowSelected,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tonClick={() => (opens && onOpen ? onOpen(id) : 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={opens ? undefined : selected}\n\t\t\t\t\t\t\tclassName={cn('media-library-list--select rounded-radius', selectionTargetClassName)}\n\t\t\t\t\t\t\tonClick={(event) => { event.stopPropagation(); if (opens && onOpen) onOpen(id); else onToggle(id); }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{opens ? (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\taria-label={formatMediaLibraryString(strings.selectItem, { name })}\n\t\t\t\t\t\t\t\taria-pressed={selected}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t`relative z-10 inline-flex size-icon-lg cursor-pointer items-center justify-center rounded-radius border border-input bg-background p-0 text-transparent ${focusRecipes.frame}`,\n\t\t\t\t\t\t\t\t\tselected && 'border-primary bg-primary text-primary-foreground',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tonClick={(event) => { event.stopPropagation(); onToggle(id); }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Check className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\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\t\tselected && 'border-primary bg-primary text-primary-foreground',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Check className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\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\"\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\" type=\"inherit\" 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) || EMPTY}\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) : EMPTY}\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-10\"\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\nfunction MediaLibraryTagsField({\n\tlabel,\n\ttags,\n\tplaceholder,\n\treadOnly = false,\n\tonValueChange,\n}: {\n\tlabel: string;\n\ttags: readonly string[];\n\tplaceholder: string;\n\treadOnly?: boolean;\n\tonValueChange: (tags: string[]) => void;\n}) {\n\tconst committed = tags.join(', ');\n\tconst [draft, setDraft] = useState({ source: committed, value: committed });\n\tif (draft.source !== committed) {\n\t\tsetDraft({ source: committed, value: committed });\n\t}\n\tconst commit = () => {\n\t\tif (readOnly || draft.value === committed) return;\n\t\tconst next = draft.value.split(',').map((tag) => tag.trim()).filter(Boolean);\n\t\tsetDraft({ source: committed, value: committed });\n\t\tif (next.length !== tags.length || next.some((tag, index) => tag !== tags[index])) {\n\t\t\tonValueChange(next);\n\t\t}\n\t};\n\n\treturn (\n\t\t<FormField label={label}>\n\t\t\t<Input\n\t\t\t\tvalue={draft.value}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\treadOnly={readOnly}\n\t\t\t\tonChange={(event) => setDraft({ source: committed, value: event.target.value })}\n\t\t\t\tonBlur={commit}\n\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\tif (readOnly || event.key !== 'Enter' || event.nativeEvent.isComposing) return;\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tcommit();\n\t\t\t\t}}\n\t\t\t/>\n\t\t</FormField>\n\t);\n}\n\nexport function MediaLibraryDetailPanel<TItem>({\n\titem,\n\tcollections = [],\n\taccessors,\n\tstrings,\n\tonClose,\n\tonUpdate,\n\treadOnly = false,\n\tmutationError,\n\tonRemove,\n\tallowDelete = true,\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 update = readOnly ? () => Promise.resolve(false) : onUpdate;\n\tconst custom = renderDetail?.(item, {\n\t\taccessors,\n\t\tupdate,\n\t\tmutationError,\n\t\tremove: allowDelete ? onRemove : () => Promise.resolve(false),\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 text-foreground @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\tdata-media-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 auto-rows-max 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{/* The shared definition list owns the label/value pairing and the figure column. */}\n\t\t\t\t<MetadataList\n\t\t\t\t\tlayout=\"rows\"\n\t\t\t\t\tvalueAlign=\"end\"\n\t\t\t\t\tdensity=\"compact\"\n\t\t\t\t\tclassName=\"media-library-detail-panel--facts\"\n\t\t\t\t\titems={[\n\t\t\t\t\t\t{ id: 'type', label: strings.detail.type, value: typeLabel(type, strings) },\n\t\t\t\t\t\t{ id: 'size', label: strings.detail.size, value: <FileSize value={accessors.getSize(item)} emptyLabel={strings.unknownSize} /> },\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'dimensions',\n\t\t\t\t\t\t\tlabel: strings.detail.dimensions,\n\t\t\t\t\t\t\tvalue: (\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\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},\n\t\t\t\t\t\t{ id: 'uploaded', label: strings.detail.uploaded, value: String(accessors.getUploadedAt(item) ?? EMPTY) },\n\t\t\t\t\t\t{ id: 'used-in', label: strings.detail.usedIn, value: usedInLabel(accessors.getUsageCount(item), strings) },\n\t\t\t\t\t]}\n\t\t\t\t/>\n\t\t\t\t{mutationError && (\n\t\t\t\t\t<Alert tone=\"destructive\">\n\t\t\t\t\t\t<AlertDescription>{strings.detail.mutationError ?? defaultMediaLibraryStrings.detail.mutationError}</AlertDescription>\n\t\t\t\t\t</Alert>\n\t\t\t\t)}\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\treadOnly={readOnly}\n\t\t\t\t\t\tonChange={(event) => update({ 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\treadOnly={readOnly}\n\t\t\t\t\t\tonValueChange={(value) => update({ collection: value })}\n\t\t\t\t\t/>\n\t\t\t\t</FormField>\n\t\t\t\t<MediaLibraryTagsField\n\t\t\t\t\tkey={accessors.getId(item)}\n\t\t\t\t\tlabel={strings.detail.tags}\n\t\t\t\t\ttags={tags}\n\t\t\t\t\tplaceholder={strings.detail.tagsPlaceholder}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\tonValueChange={(next) => update({ tags: next })}\n\t\t\t\t/>\n\t\t\t\t<div className=\"media-library-detail-panel--public\">\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\treadOnly={readOnly}\n\t\t\t\t\t\tonValueChange={(checked) => update({ 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{(onReplace || allowDelete) && (\n\t\t\t\t\t<div className={cn('media-library-detail-panel--actions flex flex-wrap', compositionClasses.commands)}>\n\t\t\t\t\t\t{onReplace && <Button type=\"button\" tone=\"secondary\" buttonStyle=\"outline\" onClick={onReplace}>\n\t\t\t\t\t\t\t{strings.detail.replace}\n\t\t\t\t\t\t</Button>}\n\t\t\t\t\t\t{allowDelete && <Button type=\"button\" tone=\"destructive\" buttonStyle=\"ghost\" onClick={onRemove}>\n\t\t\t\t\t\t\t{strings.detail.delete}\n\t\t\t\t\t\t</Button>}\n\t\t\t\t\t</div>\n\t\t\t\t)}\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\thasUploadError = 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{hasUploadError && (\n\t\t\t\t<Alert tone=\"destructive\">\n\t\t\t\t\t<AlertDescription>{strings.upload.error ?? defaultMediaLibraryStrings.upload.error}</AlertDescription>\n\t\t\t\t</Alert>\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 text-card-foreground 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\">\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<Stack gap=\"md\" 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 type=\"inherit\" 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<Progress value={file.progress} size=\"sm\" aria-label={file.name} />\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</Stack>\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 @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<MediaLibraryTagsField\n\t\t\t\t\tlabel={strings.upload.tags}\n\t\t\t\t\ttags={uploadOptions.tags}\n\t\t\t\t\tplaceholder={strings.upload.tagsPlaceholder}\n\t\t\t\t\tonValueChange={(next) => onOptionsChange({ tags: next })}\n\t\t\t\t/>\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\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 tone=\"primary\"\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 tone=\"primary\"\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: selectedCount === 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 text-foreground 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, useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { Badge } from '../../base/badge';\nimport { BatchActionBar } from '../../base/batch-action-bar';\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, ConfirmDialog } 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';\nimport { focusRecipes } from '../../../lib/focus-recipes';\nimport { interactionRecipes } from '../../../lib/interaction-recipes';\n\ninterface MediaLibraryFooterPortalTarget {\n\telement: HTMLElement | null;\n}\n\ninterface MediaLibraryDeleteRequest<TItem> {\n\titem: TItem;\n\tresolve: (removed: boolean) => void;\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\tbulkActions,\n\tstrings: stringsProp,\n\tslots,\n\theightClassName,\n\tclassName,\n\titems,\n\tfetcher,\n\trefreshKey,\n\taccessors,\n\tcollections,\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\tonItemUpdate,\n\tonItemDelete,\n\tonItemReplace,\n\tonItemOpen,\n\tonUpload,\n\tonError,\n\tselecting,\n\tdefaultSelecting,\n\tonSelectingChange,\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\trefreshKey,\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\tselecting,\n\t\t// A picker starts selecting; a library starts browsing, where activation opens.\n\t\tdefaultSelecting: defaultSelecting ?? confirmOnSelect,\n\t\tonSelectingChange,\n\t});\n\tconst resolvedCollections = useResolvedCollections(collections, state.items, state.accessors.getCollection);\n\tconst activeTab = allowUpload ? state.tab : 'library';\n\tconst [deleteRequest, setDeleteRequest] = useState<MediaLibraryDeleteRequest<TItem> | null>(null);\n\tconst deleteRequestRef = useRef<MediaLibraryDeleteRequest<TItem> | null>(null);\n\tconst deleteItemId = deleteRequest ? state.accessors.getId(deleteRequest.item) : null;\n\tconst detailItem = state.detailId\n\t\t? (state.items.find((item) => state.accessors.getId(item) === state.detailId)\n\t\t\t?? (deleteItemId === state.detailId ? deleteRequest?.item ?? null : null))\n\t\t: null;\n\tconst deleteFailed = state.mutationError?.operation === 'delete' && state.mutationError.itemId === deleteItemId;\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 sectionRef = useRef<HTMLElement>(null);\n\tconst resultsRef = useRef<HTMLDivElement>(null);\n\tconst detailOpenerRef = useRef<HTMLElement | null>(null);\n\tconst returnToResultsRef = useRef(false);\n\tconst requestDelete = (item: TItem): Promise<boolean> => {\n\t\tif (!onItemDelete || deleteRequestRef.current) return Promise.resolve(false);\n\t\treturn new Promise((resolve) => {\n\t\t\tconst request = { item, resolve };\n\t\t\tdeleteRequestRef.current = request;\n\t\t\tsetDeleteRequest(request);\n\t\t});\n\t};\n\tconst finishDelete = (removed: boolean) => {\n\t\tconst request = deleteRequestRef.current;\n\t\tdeleteRequestRef.current = null;\n\t\tsetDeleteRequest(null);\n\t\trequest?.resolve(removed);\n\t};\n\tuseEffect(() => () => {\n\t\tdeleteRequestRef.current?.resolve(false);\n\t\tdeleteRequestRef.current = null;\n\t}, []);\n\tconst showDetail = (id: string) => {\n\t\t// Narrow shells hide the grid behind the panel, so focus moves in and comes back.\n\t\tdetailOpenerRef.current = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n\t\tstate.setDetailId(id);\n\t};\n\tconst openItem = (item: TItem) => {\n\t\tif (onItemOpen) onItemOpen(item);\n\t\telse showDetail(state.accessors.getId(item));\n\t};\n\tuseEffect(() => {\n\t\tif (state.detailId !== null) {\n\t\t\tif (detailOpenerRef.current) sectionRef.current?.querySelector<HTMLElement>('[data-media-detail-close]')?.focus();\n\t\t\treturn;\n\t\t}\n\t\tconst opener = detailOpenerRef.current;\n\t\tdetailOpenerRef.current = null;\n\t\tif (returnToResultsRef.current) {\n\t\t\treturnToResultsRef.current = false;\n\t\t\tresultsRef.current?.focus();\n\t\t} else if (opener?.isConnected) {\n\t\t\topener.focus();\n\t\t}\n\t}, [state.detailId]);\n\tconst hasLoadError = Boolean(fetcher) && !state.loading && state.loadError != null;\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\t// A picker reports its selection in the footer, a browsing library in the\n\t// floating batch bar; never both.\n\tconst isPicker = Boolean(footerPortal) || (Boolean(onConfirm) && !confirmOnSelect);\n\tconst usesBulkBar = Boolean(bulkActions) && !isPicker;\n\tconst bulkSelectedCount = activeTab === 'library' ? state.selectedIds.length : 0;\n\tconst footer =\n\t\tslots?.footer ??\n\t\t(usesBulkBar && activeTab === 'library' ? null : 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\tref={sectionRef}\n\t\t\tclassName={cn(\n\t\t\t\t'media-library--component @container/media-library box-border flex min-h-0 flex-col overflow-hidden rounded-surface border border-border bg-background text-foreground',\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? `${interactionRecipes.segmentActive} hover:bg-card`\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? `${interactionRecipes.segmentActive} hover:bg-card`\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<Badge size=\"sm\" tone=\"secondary\" className=\"media-library--staged-count\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NumberValue value={state.stagedFiles.length} size=\"inherit\" weight=\"inherit\" type=\"inherit\" align=\"center\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\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\thasUploadError={state.uploadError != null && state.stagedFiles.length > 0}\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/60 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\tselecting={state.selecting}\n\t\t\t\t\t\t\t\tonSelectingChange={state.setSelecting}\n\t\t\t\t\t\t\t\t// A failed load has no result to count or filter; the live\n\t\t\t\t\t\t\t\t// region stays mounted so the next count is announced.\n\t\t\t\t\t\t\t\tdisabled={hasLoadError}\n\t\t\t\t\t\t\t\tsummary={\n\t\t\t\t\t\t\t\t\t<span aria-live=\"polite\" className=\"media-library--count min-w-0 truncate\">\n\t\t\t\t\t\t\t\t\t\t{hasLoadError || state.loading ? null : (\n\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\">{countLabel}</Text>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tref={resultsRef}\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\taria-busy={state.loading || undefined}\n\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\tclassName={`media-library--results flex min-h-0 flex-1 flex-col overflow-y-auto p-surface focus-visible:outline-none ${focusRecipes.inset}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{/* Loading, error and empty states centre in the body (auto\n\t\t\t\t\t\t\t\tblock margins), so a tall shell leaves no dead band below\n\t\t\t\t\t\t\t\tthem; content taller than the body still scrolls from its top. */}\n\t\t\t\t\t\t\t{state.loading && !state.hasLoadedResults ? (\n\t\t\t\t\t\t\t\t<div className=\"media-library--state my-auto\">\n\t\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\t</div>\n\t\t\t\t\t\t\t) : hasLoadError ? (\n\t\t\t\t\t\t\t\t<div className=\"media-library--state my-auto\">\n\t\t\t\t\t\t\t\t\t{slots?.error ?? (\n\t\t\t\t\t\t\t\t\t\t<ErrorState\n\t\t\t\t\t\t\t\t\t\t\ttitle={strings.errorTitle}\n\t\t\t\t\t\t\t\t\t\t\tdescription={strings.errorDescription}\n\t\t\t\t\t\t\t\t\t\t\tonRetry={fetcher ? state.retry : undefined}\n\t\t\t\t\t\t\t\t\t\t\tretryLabel={strings.retry ?? defaultMediaLibraryStrings.retry}\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) : state.visibleItems.length === 0 ? (\n\t\t\t\t\t\t\t\t<div className=\"media-library--state my-auto\">\n\t\t\t\t\t\t\t\t\t{slots?.empty ?? (\n\t\t\t\t\t\t\t\t\t\t<MediaLibraryEmptyState\n\t\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\t\tdescription={state.hasFilters ? strings.emptyFilteredDescription : strings.emptyLibraryDescription}\n\t\t\t\t\t\t\t\t\t\t\taction={\n\t\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\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\t{strings.clearFilters}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t) : allowUpload ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Button tone=\"primary\" type=\"button\" onClick={() => state.setTab('upload')}>\n\t\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\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t) : undefined\n\t\t\t\t\t\t\t\t\t\t\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) : 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={showDetail}\n\t\t\t\t\t\t\t\t\t\tselecting={state.selecting}\n\t\t\t\t\t\t\t\t\t\tonOpen={(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) openItem(item);\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\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\tselecting: state.selecting,\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: () => showDetail(id),\n\t\t\t\t\t\t\t\t\t\t\topen: () => openItem(item),\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\tonOpen={ctx.open}\n\t\t\t\t\t\t\t\t\t\t\t\tselecting={ctx.selecting}\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\treadOnly={!onItemUpdate}\n\t\t\t\t\t\tonUpdate={(patch) => detailItem ? state.updateItem(detailItem, patch) : Promise.resolve(false)}\n\t\t\t\t\t\tmutationError={state.mutationError?.itemId === state.detailId ? state.mutationError : null}\n\t\t\t\t\t\tonReplace={onItemReplace && detailItem ? () => onItemReplace(detailItem) : undefined}\n\t\t\t\t\t\tallowDelete={Boolean(onItemDelete)}\n\t\t\t\t\t\tonRemove={() => detailItem ? requestDelete(detailItem) : Promise.resolve(false)}\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\n\t\t\t{(onItemDelete || deleteRequest) && (\n\t\t\t\t<ConfirmDialog\n\t\t\t\t\topen={deleteRequest !== null}\n\t\t\t\t\tonOpenChange={(open) => { if (!open) finishDelete(false); }}\n\t\t\t\t\tdestructive\n\t\t\t\t\ttitle={strings.detail.confirmDeleteTitle ?? defaultMediaLibraryStrings.detail.confirmDeleteTitle}\n\t\t\t\t\tdescription={deleteRequest ? formatMediaLibraryString(\n\t\t\t\t\t\tstrings.detail.confirmDeleteDescription ?? defaultMediaLibraryStrings.detail.confirmDeleteDescription ?? '',\n\t\t\t\t\t\t{ name: state.accessors.getName(deleteRequest.item) },\n\t\t\t\t\t) : undefined}\n\t\t\t\t\tstrings={{ confirm: strings.detail.confirmDeleteLabel ?? defaultMediaLibraryStrings.detail.confirmDeleteLabel }}\n\t\t\t\t\talertMessage={deleteFailed ? strings.detail.confirmDeleteError ?? defaultMediaLibraryStrings.detail.confirmDeleteError : undefined}\n\t\t\t\t\tcloseOnAsyncComplete={false}\n\t\t\t\t\tonAsyncConfirm={async () => {\n\t\t\t\t\t\tif (!deleteRequest) return;\n\t\t\t\t\t\tconst removed = await state.removeItem(deleteRequest.item);\n\t\t\t\t\t\tif (!removed || deleteRequestRef.current !== deleteRequest) return;\n\t\t\t\t\t\treturnToResultsRef.current = true;\n\t\t\t\t\t\tstate.setDetailId(null);\n\t\t\t\t\t\tfinishDelete(true);\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{/*\n\t\t\t * Browsing only, and on the library tab. Docked to the viewport so the\n\t\t\t * selection stays reachable while the results scroll; focus returns to\n\t\t\t * the results when the bar goes away with focus in it.\n\t\t\t */}\n\t\t\t{usesBulkBar && (\n\t\t\t\t<BatchActionBar\n\t\t\t\t\tselectedCount={bulkSelectedCount}\n\t\t\t\t\ttotalCount={state.totalCount}\n\t\t\t\t\tonClear={state.clearSelection}\n\t\t\t\t\treturnFocusRef={resultsRef}\n\t\t\t\t\tclassName=\"media-library--bulk-actions\"\n\t\t\t\t\tstrings={{\n\t\t\t\t\t\tlabel: strings.batchActionsLabel,\n\t\t\t\t\t\tsummary: (count) => formatMediaLibraryString(strings.footer.selectedCount, { count }),\n\t\t\t\t\t\tclear: strings.footer.clear,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{bulkSelectedCount > 0 && bulkActions?.({\n\t\t\t\t\t\tselectedItems: state.items.filter((item) => state.selectedSet.has(state.accessors.getId(item))),\n\t\t\t\t\t\tselectedIds: state.selectedIds,\n\t\t\t\t\t\tselectedCount: state.selectedIds.length,\n\t\t\t\t\t\tvisibleCount: state.filteredCount,\n\t\t\t\t\t\ttotalCount: state.totalCount,\n\t\t\t\t\t\tclearSelection: state.clearSelection,\n\t\t\t\t\t})}\n\t\t\t\t</BatchActionBar>\n\t\t\t)}\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\t// The dialog is a picker, so it opens in selection mode.\n\t\t\t\t\tdefaultSelecting={props.defaultSelecting ?? true}\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 {compositionRhythm} from '../../base/structure/composition.recipes';\nimport { 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';\nimport { uploadDropTargetRecipes } from '../../base/upload/upload.recipes';\nimport { interactionRecipes } from '../../../lib/interaction-recipes';\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 canSetPrimary = !readOnly && Boolean(onPrimaryChange);\n\tconst canRemove = !readOnly && Boolean(onRemove);\n\tconst canReorder = !readOnly && Boolean(onReorder);\n\tconst hasItemActions = canSetPrimary || canRemove || canReorder;\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 (!canReorder || 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 ${uploadDropTargetRecipes.hover}`,\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-surface border border-border bg-card text-card-foreground 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\" type=\"inherit\" 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={compositionRhythm.commands} 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 tone=\"primary\" 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 = canReorder && index > 0;\n\t\t\t\t\t\tconst canMoveNext = canReorder && 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: () => { if (canSetPrimary) onPrimaryChange?.(id, item); },\n\t\t\t\t\t\t\tremove: () => { if (canRemove) 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 text-foreground shadow-xs',\n\t\t\t\t\t\t\t\t\t\t// Its controls draw the shared focus indicator; the tile adds no second focus colour.\n\t\t\t\t\t\t\t\t\t\t`transition-colors ${interactionRecipes.tileHover}`,\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 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 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{canRemove && (\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 text-foreground 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 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=\"secondary\">{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{/* A size the records do not carry is omitted, not announced as unknown. */}\n\t\t\t\t\t\t\t\t\t\t\t{accessors.getSize(item) !== undefined && <>\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<FileSize\n\t\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\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\t\t\t\talign=\"left\"\n\t\t\t\t\t\t\t\t\t\t\t\t\temptyLabel={strings.unknownSize}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</>}\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t{hasItemActions && (\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{canSetPrimary && <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{canReorder && <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{canReorder && <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{canRemove && <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 text-foreground shadow-xs transition-colors ${interactionRecipes.tileHover}`}\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{/* Whole images at their natural proportions, letterboxed in the tile. */}\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-contain\" />\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=\"secondary\" className=\"bg-card text-card-foreground\">{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{accessors.getSize(item) !== undefined && (\n\t\t\t\t\t\t\t\t\t\t\t\t<FileSize\n\t\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\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\t\t\t\talign=\"left\"\n\t\t\t\t\t\t\t\t\t\t\t\t\temptyLabel={strings.unknownSize}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t{hasItemActions && (\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{canSetPrimary && <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{canReorder && <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{canReorder && <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{canRemove && <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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A;EACrB,IAAMC,oBAAO,IAAI,IAAY;EAC7B,KAAK,IAAMzS,KAAQsB,GAAO;GACzB,IAAME,IAAakR,EAAc1S,CAAI;GACrC,AAAIwB,KAAYiR,EAAK,IAAIjR,CAAU;EACpC;EACA,OAAO,MAAM,KAAKiR,CAAI,CAAC,CAAC,KAAK,OAAW;GAAE;GAAO,OAAOhT;EAAM,EAAE;CACjE,GAAG;EAAC+S;EAAUE;EAAepR;CAAK,CAAC;AACpC;AAEA,SAAgBqR,GAAuE,EACtF,UACA,gBACA,gBACA,iBACA,gBACA,mBAAgB,YAChB,aAAU,eACV,cAAW,IACX,iBAAc,IACd,gBACA,qBAAkB,IAClB,eACA,aACA,YACA,gBACA,SAASC,IACT,UACA,qBACA,cACA,UACA,aACA,eACA,cACA,iBACA,WACA,iBACA,mBACA,iBACA,kBACA,mBACA,gBACA,cACA,aACA,eACA,qBACA,uBACA,SACA,gBACA,iBACA,UACA,iBACA,kBACA,WACA,kBACA,mBACA,UACA,iBACA,kBACA,gBACA,uBACA,wBACA,UACA,iBACA,kBACA,mBACA,0BACA,2BACA,GAAGC,MACyB;CAC5B,IAAM,EAAE,oBAAiBtW,EAAiB,GACpC2Q,KAAO5Q,EAAsB,KAAA,GAAW6Q,CAAY,GACpDd,IAAUyG,EAAWnU,GAA4BiU,EAAW,GAC5DG,IAAQjR,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;EACA;EACA;EAEA,kBAAkBuH,KAAoB2J;EACtC;CACD,CAAC,GACKC,KAAsBV,GAAuB/E,IAAauF,EAAM,OAAOA,EAAM,UAAU,aAAa,GACpGG,IAAYC,IAAcJ,EAAM,MAAM,WACtC,CAACK,GAAeC,MAAoB9T,EAAkD,IAAI,GAC1F+T,KAAmBzN,EAAgD,IAAI,GACvE0N,KAAeH,IAAgBL,EAAM,UAAU,MAAMK,EAAc,IAAI,IAAI,MAC3EI,IAAaT,EAAM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"}
1
+ {"version":3,"file":"media-library.js","names":["DateValue","_Fragment","_Fragment","NumberValue","_Fragment","resolveComponentScale","useDensityConfig","cn","Text","DisplayLabel","focusRecipes","Button","Grid","Stack","surfaceRecipes","regionRecipes","AlertDescription","SurfaceTitle","LoadingState","ErrorState","Progress","compositionRhythm","compositionClasses","ActionMenu","ActionDialog","ConfirmDialog","interactionRecipes","formatFileSize","FileSize","Dimensions","Percent","Number$1","DateTime","parseDateInput","DatePrimitive","Badge","BatchActionBar","Input","FormField","Switch","Select","segmentedControlRecipes","controlGroupHeightClasses","uploadDropTargetRecipes","MetadataList","TabsTrigger","TabsContent","TabsList","Tabs","Dropzone","validateFiles","EmptyState","Fragment$1","defaultMediaLibraryStrings","formatMediaLibraryString","template","values","key","one","other","DEFAULT_UPLOAD_OPTIONS","EMPTY_ITEMS","DEFAULT_MEDIA_UPLOAD_ACCEPT","DEFAULT_UPLOAD_FAILED_MESSAGE","DEFAULT_PAGE_SIZE","FIRST_PAGE","nextPaging","result","REJECTION_REASONS","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","mergePatch","patch","PATCH_FIELDS","readPatchFields","field","fields","samePatchValue","left","right","a","b","index","sameRecords","withItemPatches","patches","patchOf","filterItems","normalizedQuery","query","items","type","collection","sortItems","sorted","sort","useMediaLibrary","itemsProp","accessorsProp","tabProp","viewProp","queryProp","typeProp","collectionProp","sortProp","uploadOptionsProp","selectingProp","isServer","fetcher","baseAccessors","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","fetched","setFetched","loading","setLoading","loadError","setLoadError","paging","setPaging","loadingMore","setLoadingMore","loadMoreError","setLoadMoreError","loadMoreControllerRef","useRef","mutationError","setMutationError","uploadError","setUploadError","createdItems","setCreatedItems","serverUploads","setServerUploads","selectedRecords","setSelectedRecords","removedIds","setRemovedIds","itemPatches","setItemPatches","patchBaselinesRef","pendingUpdatesRef","pendingDeletesRef","settledRemovalsRef","settledMutations","setSettledMutations","stagedFiles","setStagedFiles","stagedFilesRef","uploadRejections","setUploadRejections","nextStagedId","uploading","setUploading","defaultResolvedUploadOptions","defaultUploadOptions","uploadOptions","setUploadOptions","onUploadOptionsChange","isSelectionControlled","selectedIds","selectedSet","objectUrlRef","uploadControllerRef","mutationVersionRef","fetchAttempt","setFetchAttempt","retry","attempt","fetchCallbacks","useEffect","onError","request","current","controller","pageSize","firstPage","nextError","refreshKey","loadMore","page","nextPage","loaded","loadedIds","returnedIds","remaining","objectUrls","serverItems","pendingServerItems","id","sourceItems","suppliedIds","suppliedItems","latestRecords","nextPatches","source","baseline","kept","keptBaseline","restored","recordsAtRemoval","patchedItems","visibleItems","totalCount","filteredCount","knownById","resolveSelection","requested","ids","additions","additionsById","selectedItems","hasFilters","applySelection","nextIds","onValueChange","latestSelection","toggleSelection","selectionMode","clearSelection","selectionRequested","setSelectionRequested","defaultSelecting","onSelectingChange","selecting","setSelecting","clearFilters","updateStagedFiles","update","releaseStagedPreview","src","addFiles","files","uploadAccept","rule","maxFileSize","maxFiles","accepted","rejections","reason","rejection","added","removeStagedFile","clearStagedFiles","updateUploadOptions","setUploadFile","fileId","startUpload","batch","fileIds","batchIds","acceptsUpdate","helpers","progress","uploaded","onUpload","uploadedIds","selection","uploadFailedMessage","cancelUpload","updateItem","onItemUpdate","mutationKey","version","previousPatch","previousBaseline","candidate","newFields","count","removeItem","onItemDelete","wasRemoved","isKept","selectedId","selectionTargetClassName","checkClassName","checkSelectedClassName","typeIcon","jsx","ImageIcon","Video","File","className","typeLabel","strings","usedInLabel","CALENDAR_DATE","UploadedAt","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","onClearFilters","summary","Grid2X2","LayoutList","toolbarEnd","MediaLibraryCard","name","alt","usageCount","isPrivate","duration","opens","onOpen","activate","onToggle","selected","density","Check","onDetails","Info","Play","Lock","showMeta","Layers3","MediaLibraryList","MediaLibraryDraftField","committed","draft","setDraft","dirty","readOnly","restore","commit","onCommit","unsaved","MediaLibraryTagsField","tags","text","tag","MediaLibraryDetailPanel","isPublic","onUpdate","custom","renderDetail","allowDelete","onRemove","onReplace","onClose","ArrowLeft","Alert","checked","MediaLibraryUploadPanel","sizeLimit","uploadString","dropHint","rejectionNotices","onFiles","notice","hasUploadError","onRemoveFile","X","empty","onOptionsChange","MediaLibraryFooterSummary","selectedCount","stagedSize","sum","stagedCount","summaryClassName","onClearSelection","MediaLibraryFooterActions","onCancelUpload","cancelLabel","onCancel","onConfirm","confirmLabel","MediaLibraryFooter","chrome","MediaLibraryFooterPortalContext","createContext","MediaLibraryBody","useResolvedCollections","explicit","seen","getCollection","MediaLibrary","stringsProp","props","useStrings","state","confirmOnSelect","resolvedCollections","activeTab","allowUpload","deleteRequest","setDeleteRequest","deleteRequestRef","deleteItemId","detailItem","deleteFailed","footerPortal","useContext","usesDefaultFooter","slots","dialogSelectionSummary","hasHeaderIdentity","title","titleSuffix","hasHeaderControls","hasHeader","confirm","cancel","confirmItem","sectionRef","resultsRef","detailOpenerRef","returnToResultsRef","requestDelete","finishDelete","removed","showDetail","openItem","onItemOpen","opener","hasLoadError","pagingRequested","showLoadMore","countLabel","usesBulkBar","bulkActions","bulkSelectedCount","footer","shellClassName","heightClassName","content","UploadCloud","ctx","rendered","onItemReplace","createPortal","open","MediaLibraryDialog","internalOpen","setInternalOpen","footerElement","setFooterElement","isOpenControlled","resolvedOpen","handleOpenChange","nextOpen","onOpenChange","closeMediaLibrary","dialogTitle","dialogDescription","dialogClassName","contentClassName","moveItem","from","to","MediaResourceGallery","total","resolvedPrimaryId","primaryId","canAdd","onAdd","maxItems","canSetPrimary","onPrimaryChange","canRemove","canReorder","onReorder","hasItemActions","defaultAction","layout","Plus","move","nextItems","shouldShowEmptyState","renderAddTile","ImagePlus","isPrimary","canMovePrevious","canMoveNext","commandName","renderItem","fieldActions","Star","ArrowRight","Trash2"],"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\t/** Retry action in the load error state and after a failed further page. Defaults to \"Try again\". */\n\tretry?: string;\n\t/** Command under the results that loads the next page of a remote library. Defaults to \"Load more\". */\n\tloadMore?: string;\n\t/** Pending label of the load-more command. Defaults to \"Loading more...\". */\n\tloadingMore?: string;\n\t/** Notice when a further page fails to load; the loaded assets stay. */\n\tloadMoreError?: string;\n\tcardDetails: string;\n\t/** Toolbar toggle that turns selection mode on or off. */\n\tselectMode: string;\n\t/** Check control that selects one asset while browsing; `{name}` is the asset. */\n\tselectItem: string;\n\t/** Accessible name of the selected-assets action region. Defaults to \"Batch actions\". */\n\tbatchActionsLabel?: 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\tmutationError?: string;\n\t\tconfirmDeleteTitle?: string;\n\t\tconfirmDeleteDescription?: string;\n\t\tconfirmDeleteLabel?: string;\n\t\tconfirmDeleteError?: string;\n\t\t/** Collection select placeholder for an asset that has no collection. Defaults to \"No collection\". */\n\t\tnoCollection?: 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\terror?: string;\n\t\t/** Collection select placeholder and clearing option; nothing is sent while it shows. Defaults to \"No collection\". */\n\t\tnoCollection?: string;\n\t\t/** Per-file text when its upload request fails. Defaults to \"Upload failed\". */\n\t\tfileFailed?: string;\n\t\t/** Notice for a chosen file outside the accepted types; `{name}` is the file. */\n\t\tunsupportedType?: string;\n\t\t/** Notice for a chosen file over `maxFileSize`; `{name}` is the file and `{size}` the limit. */\n\t\ttooLarge?: string;\n\t\t/** Notice when more files are chosen than `maxFiles` allows; `{count}` is the limit. */\n\t\ttooMany?: string;\n\t\t/** Added to the drop hint when `maxFileSize` is set; `{size}` is the limit. */\n\t\tsizeLimitHint?: 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\t/** Accessible name of the primary command; `{name}` is the asset. */\n\t\tsetPrimary: string;\n\t\t/** Accessible name of the remove command; `{name}` is the asset. */\n\t\tremove: string;\n\t\t/** Accessible name of the move-earlier command; `{name}` is the asset. */\n\t\tmovePrevious: string;\n\t\t/** Accessible name of the move-later command; `{name}` is the asset. */\n\t\tmoveNext: string;\n\t\titemPosition: string;\n\t\tmaxReached: string;\n\t\t/** Accessible name of a field tile's command menu; `{name}` is the asset. Defaults to \"Actions for {name}\". */\n\t\titemActions?: string;\n\t\t/** Field-tile menu command that makes the asset the cover. Defaults to \"Set as cover\". */\n\t\tsetCoverAction?: string;\n\t\t/** Field-tile menu command that moves the asset one place earlier. Defaults to \"Move earlier\". */\n\t\tmovePreviousAction?: string;\n\t\t/** Field-tile menu command that moves the asset one place later. Defaults to \"Move later\". */\n\t\tmoveNextAction?: 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} {count, plural, one {item} other {items}}',\n\tcountFiltered: '{count} of {total} {total, plural, one {item} other {items}}',\n\tcountSearch: '{count} of {total} {total, plural, one {item} other {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: 'Check your connection, then try again.',\n\tretry: 'Try again',\n\tloadMore: 'Load more',\n\tloadingMore: 'Loading more...',\n\tloadMoreError: 'Could not load more media.',\n\tcardDetails: 'Details for {name}',\n\tselectMode: 'Select',\n\tselectItem: 'Select {name}',\n\tbatchActionsLabel: 'Batch actions',\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\tmutationError: 'Could not change this asset. Try again.',\n\t\tconfirmDeleteTitle: 'Delete media?',\n\t\tconfirmDeleteDescription: '{name} will be removed from this library.',\n\t\tconfirmDeleteLabel: 'Delete asset',\n\t\tconfirmDeleteError: 'Could not delete this asset. Try again.',\n\t\tnoCollection: 'No collection',\n\t},\n\tupload: {\n\t\tdropTitle: 'Drag files here or click to browse',\n\t\tdropHint: 'JPG, PNG, WebP, SVG and MP4',\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\terror: 'Could not upload these files. Try again.',\n\t\tnoCollection: 'No collection',\n\t\tfileFailed: 'Upload failed',\n\t\tunsupportedType: '{name} is not an accepted file type.',\n\t\ttooLarge: '{name} is larger than {size}.',\n\t\ttooMany: 'Only {count} {count, plural, one {file} other {files}} can be staged at once.',\n\t\tsizeLimitHint: 'Up to {size} per file',\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 items',\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 {name} as primary',\n\t\tremove: 'Remove {name}',\n\t\tmovePrevious: 'Move {name} earlier',\n\t\tmoveNext: 'Move {name} later',\n\t\titemPosition: '{index} of {total}',\n\t\tmaxReached: 'Maximum reached',\n\t\titemActions: 'Actions for {name}',\n\t\tsetCoverAction: 'Set as cover',\n\t\tmovePreviousAction: 'Move earlier',\n\t\tmoveNextAction: 'Move later',\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 { validateFiles } from '../../../base/upload';\nimport { formatFileSize } from '../../../primitives';\n\nimport type {\n\tMediaLibraryAccessors,\n\tMediaLibraryFetchResult,\n\tMediaLibraryItem,\n\tMediaLibraryItemPatch,\n\tMediaLibraryItemType,\n\tMediaLibraryStagedFile,\n\tMediaLibraryUploadOptions,\n\tMediaLibraryUploadRejection,\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/** The upload tab's accepted types unless the consumer configures others. */\nexport const DEFAULT_MEDIA_UPLOAD_ACCEPT = 'image/*,video/*';\nconst DEFAULT_UPLOAD_FAILED_MESSAGE = 'Upload failed';\nconst DEFAULT_PAGE_SIZE = 48;\n\ninterface MediaLibraryPaging {\n\t/** The last page that was loaded, starting at 1. */\n\tpage: number;\n\tcursor?: string;\n\thasMore: boolean;\n}\nconst FIRST_PAGE: MediaLibraryPaging = { page: 1, hasMore: false };\n\nfunction nextPaging<TItem>(page: number, result: MediaLibraryFetchResult<TItem>): MediaLibraryPaging {\n\treturn { page, cursor: result.nextCursor, hasMore: result.hasMore ?? result.nextCursor != null };\n}\n\n/** The shared validator's stable codes, in this family's public vocabulary. */\nconst REJECTION_REASONS: Partial<Record<string, MediaLibraryUploadRejection['reason']>> = {\n\t'invalid-type': 'type',\n\t'too-large': 'size',\n\t'too-many': 'count',\n};\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\nconst PATCH_FIELDS = ['alt', 'collection', 'tags', 'public'] as const;\ntype MediaLibraryPatchField = (typeof PATCH_FIELDS)[number];\n\n/** Reads the editable fields the way the consumer's accessors see them. */\nfunction readPatchFields<TItem>(\n\titem: TItem,\n\taccessors: ResolvedMediaLibraryAccessors<TItem>,\n\tfields: readonly MediaLibraryPatchField[],\n): MediaLibraryItemPatch {\n\tconst values: MediaLibraryItemPatch = {};\n\tfor (const field of fields) {\n\t\tif (field === 'alt') values.alt = accessors.getAlt(item);\n\t\telse if (field === 'collection') values.collection = accessors.getCollection(item);\n\t\telse if (field === 'tags') values.tags = accessors.getTags(item);\n\t\telse values.public = accessors.getPublic(item);\n\t}\n\treturn values;\n}\n\nfunction samePatchValue(left: MediaLibraryItemPatch[MediaLibraryPatchField], right: MediaLibraryItemPatch[MediaLibraryPatchField]) {\n\tif (Array.isArray(left) || Array.isArray(right)) {\n\t\tconst a = Array.isArray(left) ? left : [];\n\t\tconst b = Array.isArray(right) ? right : [];\n\t\treturn a.length === b.length && a.every((value, index) => value === b[index]);\n\t}\n\treturn left === right;\n}\n\nfunction sameRecords<TItem>(left: readonly TItem[], right: readonly TItem[]) {\n\treturn left === right || (left.length === right.length && left.every((item, index) => item === right[index]));\n}\n\n/**\n * Lets an optimistic edit reach every reader. A patch merged onto the record's\n * root is invisible to accessors that read an app-owned shape, so the edited\n * fields are answered from the patch first.\n */\nfunction withItemPatches<TItem>(\n\taccessors: ResolvedMediaLibraryAccessors<TItem>,\n\tpatches: Record<string, MediaLibraryItemPatch>,\n): ResolvedMediaLibraryAccessors<TItem> {\n\tif (Object.keys(patches).length === 0) return accessors;\n\tconst patchOf = (item: TItem): MediaLibraryItemPatch | undefined => patches[accessors.getId(item)];\n\treturn {\n\t\t...accessors,\n\t\tgetAlt: (item) => {\n\t\t\tconst patch = patchOf(item);\n\t\t\treturn patch && 'alt' in patch ? patch.alt : accessors.getAlt(item);\n\t\t},\n\t\tgetCollection: (item) => {\n\t\t\tconst patch = patchOf(item);\n\t\t\treturn patch && 'collection' in patch ? patch.collection : accessors.getCollection(item);\n\t\t},\n\t\tgetTags: (item) => {\n\t\t\tconst patch = patchOf(item);\n\t\t\treturn patch && 'tags' in patch ? patch.tags ?? [] : accessors.getTags(item);\n\t\t},\n\t\tgetPublic: (item) => {\n\t\t\tconst patch = patchOf(item);\n\t\t\treturn patch && 'public' in patch ? patch.public : accessors.getPublic(item);\n\t\t},\n\t};\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\trefreshKey,\n\tpageSize = DEFAULT_PAGE_SIZE,\n\taccessors: accessorsProp,\n\tselectionMode = 'multiple',\n\tvalue,\n\tdefaultValue = [],\n\tonValueChange,\n\tonItemUpdate,\n\tonItemDelete,\n\tonUpload,\n\tuploadAccept = DEFAULT_MEDIA_UPLOAD_ACCEPT,\n\tmaxFileSize,\n\tmaxFiles,\n\tuploadFailedMessage = DEFAULT_UPLOAD_FAILED_MESSAGE,\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\tselecting: selectingProp,\n\tdefaultSelecting = false,\n\tonSelectingChange,\n}: UseMediaLibraryOptions<TItem> = {}): MediaLibraryState<TItem> {\n\tconst isServer = Boolean(fetcher);\n\tconst baseAccessors = 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 [fetched, setFetched] = useState<MediaLibraryFetchResult<TItem> | null>(null);\n\tconst [loading, setLoading] = useState(isServer);\n\tconst [loadError, setLoadError] = useState<unknown>(null);\n\tconst [paging, setPaging] = useState<MediaLibraryPaging>(FIRST_PAGE);\n\tconst [loadingMore, setLoadingMore] = useState(false);\n\tconst [loadMoreError, setLoadMoreError] = useState<unknown>(null);\n\tconst loadMoreControllerRef = useRef<AbortController | null>(null);\n\tconst [mutationError, setMutationError] = useState<MediaLibraryState<TItem>['mutationError']>(null);\n\tconst [uploadError, setUploadError] = useState<unknown>(null);\n\tconst [createdItems, setCreatedItems] = useState<TItem[]>([]);\n\tconst [serverUploads, setServerUploads] = useState<TItem[]>([]);\n\tconst [selectedRecords, setSelectedRecords] = useState(() => new Map<string, TItem>());\n\tconst [removedIds, setRemovedIds] = useState<Set<string>>(() => new Set());\n\tconst [itemPatches, setItemPatches] = useState<Record<string, MediaLibraryItemPatch>>({});\n\t// Optimistic edits are read through the accessors, whatever shape the records have.\n\tconst accessors = useMemo(() => withItemPatches(baseAccessors, itemPatches), [baseAccessors, itemPatches]);\n\t// What the supplied record held when an edit began, per edited field.\n\tconst patchBaselinesRef = useRef(new Map<string, MediaLibraryItemPatch>());\n\tconst pendingUpdatesRef = useRef(new Map<string, number>());\n\tconst pendingDeletesRef = useRef(new Map<string, number>());\n\t// The supplied records at the moment a removal was persisted.\n\tconst settledRemovalsRef = useRef(new Map<string, readonly TItem[]>());\n\t// Bumped when an edit or removal settles, so its optimistic state is reconciled.\n\tconst [settledMutations, setSettledMutations] = useState(0);\n\tconst [stagedFiles, setStagedFiles] = useState<MediaLibraryStagedFile[]>([]);\n\tconst stagedFilesRef = useRef(stagedFiles);\n\tconst [uploadRejections, setUploadRejections] = useState<MediaLibraryUploadRejection[]>([]);\n\tconst nextStagedId = useRef(0);\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\t// Bumped by `retry` so the fetcher runs again for the same query.\n\tconst [fetchAttempt, setFetchAttempt] = useState(0);\n\tconst retry = useCallback(() => setFetchAttempt((attempt) => attempt + 1), []);\n\tconst fetchCallbacks = useRef({ fetcher, onError });\n\n\tuseEffect(() => {\n\t\tfetchCallbacks.current = { fetcher, onError };\n\t}, [fetcher, onError]);\n\n\tuseEffect(() => {\n\t\tconst request = fetchCallbacks.current.fetcher;\n\t\tif (!isServer || !request) {\n\t\t\tsetLoading(false);\n\t\t\tsetLoadError(null);\n\t\t\tsetFetched(null);\n\t\t\tsetPaging(FIRST_PAGE);\n\t\t\tsetServerUploads((current) => current.length ? [] : current);\n\t\t\treturn;\n\t\t}\n\t\tconst controller = new AbortController();\n\t\t// A new query starts again from the first page; a further page still in flight belongs to the old one.\n\t\tloadMoreControllerRef.current?.abort();\n\t\tloadMoreControllerRef.current = null;\n\t\tsetLoadingMore(false);\n\t\tsetLoadMoreError(null);\n\t\tsetLoading(true);\n\t\tsetLoadError(null);\n\t\tconst load = async () => {\n\t\t\ttry {\n\t\t\t\tconst result = await request({\n\t\t\t\t\tquery,\n\t\t\t\t\ttype,\n\t\t\t\t\tcollection: collection === 'all' ? undefined : collection,\n\t\t\t\t\tsort,\n\t\t\t\t\tlimit: pageSize,\n\t\t\t\t\tpage: 1,\n\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t});\n\t\t\t\tif (controller.signal.aborted) return;\n\t\t\t\tconst firstPage = normalizeFetchResult(result);\n\t\t\t\tsetFetched(firstPage);\n\t\t\t\tsetPaging(nextPaging(1, firstPage));\n\t\t\t} catch (nextError) {\n\t\t\t\tif (controller.signal.aborted) return;\n\t\t\t\tsetLoadError(() => nextError ?? new Error('Media load failed'));\n\t\t\t\tfetchCallbacks.current.onError?.(nextError);\n\t\t\t} finally {\n\t\t\t\tif (!controller.signal.aborted) setLoading(false);\n\t\t\t}\n\t\t};\n\t\tvoid load();\n\t\treturn () => controller.abort();\n\t}, [collection, fetchAttempt, isServer, pageSize, query, refreshKey, sort, type]);\n\n\tconst loadMore = useCallback(async () => {\n\t\tconst request = fetchCallbacks.current.fetcher;\n\t\tif (!request || !paging.hasMore || loading || loadMoreControllerRef.current) return;\n\t\tconst controller = new AbortController();\n\t\tloadMoreControllerRef.current = controller;\n\t\tconst page = paging.page + 1;\n\t\tsetLoadingMore(true);\n\t\tsetLoadMoreError(null);\n\t\ttry {\n\t\t\tconst result = await request({\n\t\t\t\tquery,\n\t\t\t\ttype,\n\t\t\t\tcollection: collection === 'all' ? undefined : collection,\n\t\t\t\tsort,\n\t\t\t\tlimit: pageSize,\n\t\t\t\tpage,\n\t\t\t\tcursor: paging.cursor,\n\t\t\t\tsignal: controller.signal,\n\t\t\t});\n\t\t\tif (controller.signal.aborted) return;\n\t\t\tconst nextPage = normalizeFetchResult(result);\n\t\t\tsetFetched((current) => {\n\t\t\t\tconst loaded = current?.items ?? [];\n\t\t\t\tconst loadedIds = new Set(loaded.map((item) => baseAccessors.getId(item)));\n\t\t\t\tconst items = [...loaded, ...nextPage.items.filter((item) => !loadedIds.has(baseAccessors.getId(item)))];\n\t\t\t\t// A plain array carries no total of its own: the library is what has been loaded.\n\t\t\t\treturn { items, total: Array.isArray(result) ? items.length : nextPage.total ?? current?.total };\n\t\t\t});\n\t\t\tsetPaging(nextPaging(page, nextPage));\n\t\t} catch (nextError) {\n\t\t\tif (controller.signal.aborted) return;\n\t\t\t// The loaded pages stay; only the request for this one failed.\n\t\t\tsetLoadMoreError(() => nextError ?? new Error('Media load failed'));\n\t\t\tfetchCallbacks.current.onError?.(nextError);\n\t\t} finally {\n\t\t\tif (loadMoreControllerRef.current === controller) {\n\t\t\t\tloadMoreControllerRef.current = null;\n\t\t\t\tsetLoadingMore(false);\n\t\t\t}\n\t\t}\n\t}, [baseAccessors, collection, loading, pageSize, paging, query, sort, type]);\n\n\tuseEffect(() => {\n\t\tif (!isServer || !fetched) return;\n\t\tconst returnedIds = new Set(fetched.items.map((item) => accessors.getId(item)));\n\t\tsetServerUploads((current) => {\n\t\t\tconst remaining = current.filter((item) => !returnedIds.has(accessors.getId(item)));\n\t\t\treturn remaining.length === current.length ? current : remaining;\n\t\t});\n\t}, [accessors, fetched, isServer]);\n\n\tuseEffect(() => {\n\t\tconst objectUrls = objectUrlRef.current;\n\t\treturn () => {\n\t\t\tuploadControllerRef.current?.abort();\n\t\t\tloadMoreControllerRef.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 serverItems = fetched?.items ?? (EMPTY_ITEMS as readonly TItem[]);\n\tconst pendingServerItems = useMemo(() => {\n\t\tconst loadedIds = new Set(serverItems.map((item) => accessors.getId(item)));\n\t\tconst pending = serverUploads.filter((item) => {\n\t\t\tconst id = accessors.getId(item);\n\t\t\treturn !loadedIds.has(id) && !removedIds.has(id);\n\t\t});\n\t\treturn filterItems(pending, accessors, query, type, collection);\n\t}, [accessors, collection, query, removedIds, serverItems, serverUploads, type]);\n\tconst sourceItems = useMemo(() => {\n\t\tif (isServer) return [...pendingServerItems, ...serverItems];\n\t\tif (createdItems.length === 0) return [...itemsProp];\n\t\t// Once the consumer lists an uploaded asset itself, its record is the one shown.\n\t\tconst suppliedIds = new Set(itemsProp.map((item) => accessors.getId(item)));\n\t\treturn [...createdItems.filter((item) => !suppliedIds.has(accessors.getId(item))), ...itemsProp];\n\t}, [accessors, createdItems, isServer, itemsProp, pendingServerItems, serverItems]);\n\t// The records the consumer or the fetcher last supplied; optimistic state yields to them.\n\tconst suppliedItems = isServer ? serverItems : itemsProp;\n\tconst latestRecords = useRef({ sourceItems, suppliedItems });\n\tuseEffect(() => {\n\t\tlatestRecords.current = { sourceItems, suppliedItems };\n\t}, [sourceItems, suppliedItems]);\n\n\tuseEffect(() => {\n\t\t// A settled edit shows until the supplied record changes that field; from then on the record wins.\n\t\tlet nextPatches = itemPatches;\n\t\tfor (const [id, patch] of Object.entries(itemPatches)) {\n\t\t\tif (pendingUpdatesRef.current.has(id)) continue;\n\t\t\tconst source = sourceItems.find((item) => baseAccessors.getId(item) === id);\n\t\t\tif (source === undefined) continue;\n\t\t\tconst baseline = patchBaselinesRef.current.get(id) ?? {};\n\t\t\tconst current = readPatchFields(source, baseAccessors, PATCH_FIELDS);\n\t\t\tconst kept: MediaLibraryItemPatch = { ...patch };\n\t\t\tconst keptBaseline: MediaLibraryItemPatch = { ...baseline };\n\t\t\tfor (const field of PATCH_FIELDS) {\n\t\t\t\tif (!(field in patch)) continue;\n\t\t\t\tconst refreshed = field in baseline && !samePatchValue(current[field], baseline[field]);\n\t\t\t\tif (!refreshed && !samePatchValue(current[field], patch[field])) continue;\n\t\t\t\tdelete kept[field];\n\t\t\t\tdelete keptBaseline[field];\n\t\t\t}\n\t\t\tif (Object.keys(kept).length === Object.keys(patch).length) continue;\n\t\t\tif (nextPatches === itemPatches) nextPatches = { ...itemPatches };\n\t\t\tif (Object.keys(kept).length > 0) {\n\t\t\t\tnextPatches[id] = kept;\n\t\t\t\tpatchBaselinesRef.current.set(id, keptBaseline);\n\t\t\t} else {\n\t\t\t\tdelete nextPatches[id];\n\t\t\t\tpatchBaselinesRef.current.delete(id);\n\t\t\t}\n\t\t}\n\t\tif (nextPatches !== itemPatches) setItemPatches(nextPatches);\n\n\t\t// A persisted removal hides the asset until the supplied records change; a\n\t\t// refreshed list that still carries it, or carries it again, shows it.\n\t\tconst restored: string[] = [];\n\t\tfor (const [id, recordsAtRemoval] of settledRemovalsRef.current) {\n\t\t\tif (pendingDeletesRef.current.has(id)) continue;\n\t\t\tif (removedIds.has(id) && sameRecords(recordsAtRemoval, suppliedItems)) continue;\n\t\t\tsettledRemovalsRef.current.delete(id);\n\t\t\tif (removedIds.has(id)) restored.push(id);\n\t\t}\n\t\tif (restored.length > 0) {\n\t\t\tsetRemovedIds((current) => {\n\t\t\t\tconst next = new Set(current);\n\t\t\t\tfor (const id of restored) next.delete(id);\n\t\t\t\treturn next;\n\t\t\t});\n\t\t}\n\t}, [baseAccessors, itemPatches, removedIds, settledMutations, sourceItems, suppliedItems]);\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\tif (isServer) return patchedItems;\n\t\treturn sortItems(filterItems(patchedItems, accessors, query, type, collection), accessors, sort);\n\t}, [accessors, collection, isServer, patchedItems, query, sort, type]);\n\tconst totalCount = isServer && fetched?.total !== undefined\n\t\t? fetched.total + pendingServerItems.length\n\t\t: patchedItems.length;\n\tconst filteredCount = visibleItems.length;\n\tconst knownById = useMemo(\n\t\t() => new Map([...serverUploads, ...serverItems].map((item) => [accessors.getId(item), item] as const)),\n\t\t[accessors, serverItems, serverUploads],\n\t);\n\tuseEffect(() => {\n\t\tsetSelectedRecords((current) => {\n\t\t\tconst next = new Map<string, TItem>();\n\t\t\tif (isServer) {\n\t\t\t\tfor (const id of selectedIds) {\n\t\t\t\t\tconst item = knownById.get(id) ?? current.get(id);\n\t\t\t\t\tif (item !== undefined) next.set(id, item);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (next.size === current.size && [...next].every(([id, item]) => current.get(id) === item)) return current;\n\t\t\treturn next;\n\t\t});\n\t}, [isServer, knownById, selectedIds]);\n\n\tconst resolveSelection = useCallback(\n\t\t(ids: readonly string[], additions: readonly TItem[] = []) => {\n\t\t\tif (!isServer) {\n\t\t\t\tconst requested = new Set(ids);\n\t\t\t\treturn [...additions, ...patchedItems].filter((item) => requested.delete(accessors.getId(item)));\n\t\t\t}\n\t\t\tconst additionsById = new Map(additions.map((item) => [accessors.getId(item), item] as const));\n\t\t\treturn ids.flatMap((id) => {\n\t\t\t\tif (removedIds.has(id)) return [];\n\t\t\t\tconst item = additionsById.get(id) ?? knownById.get(id) ?? selectedRecords.get(id);\n\t\t\t\treturn item === undefined ? [] : [mergePatch(item, itemPatches[id])];\n\t\t\t});\n\t\t},\n\t\t[accessors, isServer, itemPatches, knownById, patchedItems, removedIds, selectedRecords],\n\t);\n\tconst selectedItems = useMemo(\n\t\t() => resolveSelection(selectedIds),\n\t\t[resolveSelection, selectedIds],\n\t);\n\tconst hasFilters = Boolean(query.trim()) || type !== 'all' || collection !== 'all';\n\n\tconst applySelection = useCallback(\n\t\t(nextIds: string[], additions?: readonly TItem[]) => {\n\t\t\tif (!isSelectionControlled) setInternalValue(nextIds);\n\t\t\tonValueChange?.(nextIds, resolveSelection(nextIds, additions));\n\t\t},\n\t\t[isSelectionControlled, onValueChange, resolveSelection],\n\t);\n\tconst latestSelection = useRef({ applySelection, selectedIds });\n\tuseEffect(() => {\n\t\tlatestSelection.current = { applySelection, selectedIds };\n\t}, [applySelection, selectedIds]);\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 [selectionRequested, setSelectionRequested] = useControllableState(\n\t\tselectingProp,\n\t\tdefaultSelecting,\n\t\tonSelectingChange,\n\t);\n\t// Selection mode is explicit (the Select toggle, a picker) or implied by any selection.\n\tconst selecting = selectionRequested || selectedIds.length > 0;\n\tconst setSelecting = useCallback((next: boolean) => {\n\t\tsetSelectionRequested(next);\n\t\t// Leaving selection mode returns to browsing, which shows no selection.\n\t\tif (!next && selectedIds.length > 0) applySelection([]);\n\t}, [applySelection, selectedIds.length, setSelectionRequested]);\n\tconst clearFilters = useCallback(() => {\n\t\tsetQuery('');\n\t\tsetType('all');\n\t\tsetCollection('all');\n\t}, [setCollection, setQuery, setType]);\n\n\tconst updateStagedFiles = useCallback((update: (files: readonly MediaLibraryStagedFile[]) => MediaLibraryStagedFile[]) => {\n\t\tconst next = update(stagedFilesRef.current);\n\t\tstagedFilesRef.current = next;\n\t\tsetStagedFiles(next);\n\t}, []);\n\n\tconst releaseStagedPreview = useCallback((src: string | undefined) => {\n\t\tif (!src) return;\n\t\trevokePreviewUrl(src);\n\t\tobjectUrlRef.current.delete(src);\n\t}, []);\n\n\tconst addFiles = useCallback((files: File[]) => {\n\t\tif (files.length === 0) return;\n\t\tsetUploadError(null);\n\t\t// The picker's `accept` does not apply to drops, so every path goes through\n\t\t// the shared upload validator: type, then size, then the room left.\n\t\tconst result = validateFiles(files, {\n\t\t\t// `*/*` is the native \"any file\"; the validator spells that as no rule.\n\t\t\taccept: uploadAccept.split(',').some((rule) => rule.trim() === '*/*') ? undefined : uploadAccept,\n\t\t\tmaxSizeBytes: maxFileSize,\n\t\t\tmaxFiles: maxFiles === undefined ? undefined : Math.max(0, maxFiles - stagedFilesRef.current.length),\n\t\t});\n\t\tconst accepted = result.accepted;\n\t\tconst rejections = result.rejections.flatMap((rejection): MediaLibraryUploadRejection[] => {\n\t\t\tconst reason = REJECTION_REASONS[rejection.code];\n\t\t\t// The same file twice in one selection is staged once, without a notice.\n\t\t\treturn reason ? [{ name: rejection.file.name, reason }] : [];\n\t\t});\n\t\tsetUploadRejections(rejections);\n\t\tif (accepted.length === 0) return;\n\t\tconst added = accepted.map((file): MediaLibraryStagedFile => {\n\t\t\tconst src = createPreviewUrl(file);\n\t\t\tif (src) objectUrlRef.current.add(src);\n\t\t\treturn {\n\t\t\t\tid: `staged-${nextStagedId.current++}`,\n\t\t\t\tfile,\n\t\t\t\tname: file.name,\n\t\t\t\tsize: file.size,\n\t\t\t\ttype: inferFileType(file),\n\t\t\t\tsrc,\n\t\t\t\tprogress: 0,\n\t\t\t\tstatus: 'staged',\n\t\t\t};\n\t\t});\n\t\tupdateStagedFiles((current) => [...current, ...added]);\n\t}, [maxFileSize, maxFiles, updateStagedFiles, uploadAccept]);\n\n\tconst removeStagedFile = useCallback((id: string) => {\n\t\tupdateStagedFiles((current) => {\n\t\t\treleaseStagedPreview(current.find((file) => file.id === id)?.src);\n\t\t\treturn current.filter((file) => file.id !== id);\n\t\t});\n\t}, [releaseStagedPreview, updateStagedFiles]);\n\n\tconst clearStagedFiles = useCallback(() => {\n\t\tsetUploadError(null);\n\t\tsetUploadRejections([]);\n\t\tupdateStagedFiles((current) => {\n\t\t\tfor (const file of current) releaseStagedPreview(file.src);\n\t\t\treturn [];\n\t\t});\n\t}, [releaseStagedPreview, updateStagedFiles]);\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\tupdateStagedFiles((current) =>\n\t\t\t\tcurrent.map((file) => (file.id === fileId ? { ...file, ...patch } : file)),\n\t\t\t);\n\t\t},\n\t\t[updateStagedFiles],\n\t);\n\n\tconst startUpload = useCallback(async () => {\n\t\tconst batch = stagedFilesRef.current;\n\t\tif (uploadControllerRef.current || batch.length === 0) return;\n\t\tconst fileIds = batch.map((file) => file.id);\n\t\tconst batchIds = new Set(fileIds);\n\t\tconst controller = new AbortController();\n\t\tuploadControllerRef.current = controller;\n\t\tsetUploadError(null);\n\t\tsetUploading(true);\n\t\tupdateStagedFiles((current) =>\n\t\t\tcurrent.map((file) => batchIds.has(file.id)\n\t\t\t\t? { ...file, status: 'uploading', progress: 0, error: undefined }\n\t\t\t\t: file),\n\t\t);\n\t\tconst acceptsUpdate = (fileId: string) => !controller.signal.aborted\n\t\t\t&& uploadControllerRef.current === controller\n\t\t\t&& batchIds.has(fileId);\n\t\tconst helpers = {\n\t\t\tsignal: controller.signal,\n\t\t\tfileIds,\n\t\t\tsetProgress: (fileId: string, progress: number) => {\n\t\t\t\tif (!acceptsUpdate(fileId)) 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 (!acceptsUpdate(fileId)) 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 = batch.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\tupdateStagedFiles((current) =>\n\t\t\t\tcurrent.filter((file) => {\n\t\t\t\t\tif (!batchIds.has(file.id) || file.status === 'error') return true;\n\t\t\t\t\treleaseStagedPreview(file.src);\n\t\t\t\t\treturn false;\n\t\t\t\t}),\n\t\t\t);\n\t\t\tif (uploaded?.length) {\n\t\t\t\tconst uploadedIds = uploaded.map((item) => accessors.getId(item));\n\t\t\t\tif (isServer) {\n\t\t\t\t\tconst ids = new Set(uploadedIds);\n\t\t\t\t\tsetServerUploads((current) => [...uploaded, ...current.filter((item) => !ids.has(accessors.getId(item)))]);\n\t\t\t\t} else {\n\t\t\t\t\tsetCreatedItems((current) => [...uploaded, ...current]);\n\t\t\t\t}\n\t\t\t\tconst selection = latestSelection.current;\n\t\t\t\tselection.applySelection(\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, ...selection.selectedIds])),\n\t\t\t\t\tuploaded,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (isServer && onUpload) retry();\n\t\t\tif (stagedFilesRef.current.length === 0) setTab('library');\n\t\t} catch (nextError) {\n\t\t\tif (controller.signal.aborted) return;\n\t\t\tsetUploadError(() => nextError ?? new Error('Media upload failed'));\n\t\t\tupdateStagedFiles((current) =>\n\t\t\t\tcurrent.map((file) =>\n\t\t\t\t\tbatchIds.has(file.id) && file.status === 'uploading'\n\t\t\t\t\t\t? { ...file, status: 'error', error: uploadFailedMessage }\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\tisServer,\n\t\tonError,\n\t\tonUpload,\n\t\treleaseStagedPreview,\n\t\tretry,\n\t\tselectionMode,\n\t\tsetTab,\n\t\tsetUploadFile,\n\t\tupdateStagedFiles,\n\t\tuploadFailedMessage,\n\t\tuploadOptions,\n\t]);\n\n\tconst cancelUpload = useCallback(() => {\n\t\tuploadControllerRef.current?.abort();\n\t\tuploadControllerRef.current = null;\n\t\tsetUploading(false);\n\t\tupdateStagedFiles((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}, [updateStagedFiles]);\n\n\tconst updateItem = useCallback(\n\t\tasync (item: TItem, patch: MediaLibraryItemPatch): Promise<boolean> => {\n\t\t\tif (!onItemUpdate) return false;\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\tconst previousBaseline = patchBaselinesRef.current.get(id);\n\t\t\t// The caller may hold a patched copy, so the baseline is read from the supplied record.\n\t\t\tconst source = latestRecords.current.sourceItems.find((candidate) => baseAccessors.getId(candidate) === id) ?? item;\n\t\t\tconst newFields = PATCH_FIELDS.filter((field) => field in patch && !(previousBaseline && field in previousBaseline));\n\t\t\tpatchBaselinesRef.current.set(id, { ...readPatchFields(source, baseAccessors, newFields), ...previousBaseline });\n\t\t\tpendingUpdatesRef.current.set(id, (pendingUpdatesRef.current.get(id) ?? 0) + 1);\n\t\t\tsetMutationError((current) => current?.itemId === id ? null : current);\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\tsetMutationError({ itemId: id, operation: 'update', cause: nextError });\n\t\t\t\t\tif (previousPatch && previousBaseline) patchBaselinesRef.current.set(id, previousBaseline);\n\t\t\t\t\telse patchBaselinesRef.current.delete(id);\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\tonError?.(nextError);\n\t\t\t\treturn false;\n\t\t\t} finally {\n\t\t\t\tconst remaining = (pendingUpdatesRef.current.get(id) ?? 1) - 1;\n\t\t\t\tif (remaining > 0) pendingUpdatesRef.current.set(id, remaining);\n\t\t\t\telse pendingUpdatesRef.current.delete(id);\n\t\t\t\tsetSettledMutations((count) => count + 1);\n\t\t\t}\n\t\t},\n\t\t[accessors, baseAccessors, itemPatches, onError, onItemUpdate],\n\t);\n\n\tconst removeItem = useCallback(\n\t\tasync (item: TItem): Promise<boolean> => {\n\t\t\tif (!onItemDelete) return false;\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\tpendingDeletesRef.current.set(id, (pendingDeletesRef.current.get(id) ?? 0) + 1);\n\t\t\tsetMutationError((current) => current?.itemId === id ? null : current);\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\tsettledRemovalsRef.current.set(id, latestRecords.current.suppliedItems);\n\t\t\t\t// An upload held only by this instance is gone for good once its removal persists.\n\t\t\t\tconst isKept = (candidate: TItem) => accessors.getId(candidate) !== id;\n\t\t\t\tsetCreatedItems((current) => current.every(isKept) ? current : current.filter(isKept));\n\t\t\t\tsetServerUploads((current) => current.every(isKept) ? current : current.filter(isKept));\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 (mutationVersionRef.current.get(mutationKey) === version) {\n\t\t\t\t\tsetMutationError({ itemId: id, operation: 'delete', cause: nextError });\n\t\t\t\t\tif (!wasRemoved) {\n\t\t\t\t\t\tsetRemovedIds((current) => {\n\t\t\t\t\t\t\tconst next = new Set(current);\n\t\t\t\t\t\t\tnext.delete(id);\n\t\t\t\t\t\t\treturn next;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tonError?.(nextError);\n\t\t\t\treturn false;\n\t\t\t} finally {\n\t\t\t\tconst remaining = (pendingDeletesRef.current.get(id) ?? 1) - 1;\n\t\t\t\tif (remaining > 0) pendingDeletesRef.current.set(id, remaining);\n\t\t\t\telse pendingDeletesRef.current.delete(id);\n\t\t\t\tsetSettledMutations((count) => count + 1);\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\tselecting,\n\t\tsetSelecting,\n\t\tclearFilters,\n\t\tloading,\n\t\thasLoadedResults: isServer && (fetched !== null || pendingServerItems.length > 0),\n\t\tloadError,\n\t\tmutationError,\n\t\tuploadError,\n\t\tretry,\n\t\thasMore: isServer && paging.hasMore,\n\t\tloadMore,\n\t\tloadingMore,\n\t\tloadMoreError,\n\t\thasFilters,\n\t\ttotalCount,\n\t\tfilteredCount,\n\t\tstagedFiles,\n\t\tuploadRejections,\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 {compositionClasses} from '../../../base/structure/composition.recipes';\nimport {\n\tArrowLeft,\n\tCheck,\n\tFile,\n\tGrid2X2,\n\tImageIcon,\n\tInfo,\n\tLayoutList,\n\tLayers3,\n\tLock,\n\tPlay,\n\tSearch,\n\tVideo,\n\tX,\n} from 'lucide-react';\nimport { useEffect, useRef, 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 { Alert, AlertDescription, Progress } from '../../../base/feedback';\nimport { MetadataList } from '../../../base/metadata-list';\nimport { Dropzone } from '../../../base/upload';\nimport { Grid, Stack } from '../../../base/structure';\nimport { Date as DateValue, DateTime, Dimensions, FileSize, Percent, formatFileSize, parseDateInput } 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';\nimport { focusRecipes } from '../../../../lib/focus-recipes';\nimport { interactionRecipes } from '../../../../lib/interaction-recipes';\n\nconst selectionTargetClassName = `${interactionRecipes.nativeButtonReset} absolute inset-0 z-10 block h-full w-full cursor-pointer outline-none ${focusRecipes.inset}`;\n/** The check on a card: a passive indicator in selection mode, a select control while browsing. */\nconst checkClassName = '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 p-0 text-transparent shadow-xs';\nconst checkSelectedClassName = 'border-primary bg-primary text-primary-foreground opacity-100';\n\nimport {\n\tdefaultMediaLibraryStrings,\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';\nimport { EMPTY } from '../../../../lib/format';\nimport { DEFAULT_MEDIA_UPLOAD_ACCEPT } from '../hooks/use-media-library';\nimport { regionRecipes } from '../../../../lib/surface-recipes';\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\nconst CALENDAR_DATE = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/**\n * A Date or timestamp shows its date and time, a calendar date has no time of\n * day, and text the consumer already formatted is shown as written.\n */\nfunction UploadedAt({ value }: { value: Date | string | undefined }) {\n\tif (typeof value === 'string' && value.trim() !== '') {\n\t\tif (CALENDAR_DATE.test(value.trim())) return <DateValue value={value.trim()} />;\n\t\tif (parseDateInput(value) === null) return <>{value}</>;\n\t}\n\treturn <DateTime value={value} />;\n}\n\nfunction MediaPreview({\n\tchildren,\n\ttint,\n\tclassName,\n\trole,\n}: {\n\tchildren: ReactNode;\n\ttint?: string;\n\tclassName?: string;\n\t/** Set when the preview is itself a table cell. */\n\trole?: 'cell';\n}) {\n\treturn (\n\t\t<div\n\t\t\trole={role}\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\t// The shared quiet well for a region with no data yet.\n\t\t\tsurface=\"wash\"\n\t\t\tclassName={cn('media-library-empty-state--component min-h-64', 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\tselecting = false,\n\tonSelectingChange,\n\tsummary,\n\tdisabled = false,\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// Two groups that wrap as wholes: the filters, and the view controls with\n\t\t// the result summary. In a narrow container the filters wrap among\n\t\t// themselves and the view group takes its own line; no control is left\n\t\t// alone on a row.\n\t\t<Stack direction=\"horizontal\" wrap align=\"start\" gap=\"md\" className=\"media-library-toolbar--component\">\n\t\t\t<Stack direction=\"horizontal\" wrap align=\"start\" gap=\"md\" className=\"media-library-toolbar--filters min-w-0 grow basis-80\">\n\t\t\t\t<Stack gap=\"xs\" className=\"media-library-toolbar--search min-w-52 flex-1\">\n\t\t\t\t\t<Input\n\t\t\t\t\t\tvalue={query}\n\t\t\t\t\t\tonChange={(event) => onQueryChange(event.target.value)}\n\t\t\t\t\t\tplaceholder={strings.searchPlaceholder}\n\t\t\t\t\t\tstartIcon={Search}\n\t\t\t\t\t\tclearable\n\t\t\t\t\t\tonClear={() => onQueryChange('')}\n\t\t\t\t\t\tstrings={{ clear: strings.clearSearch }}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName=\"bg-background\"\n\t\t\t\t\t/>\n\t\t\t\t\t{!!hasQuery && (\n\t\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\t<Badge tone=\"secondary\" className=\"max-w-full\">\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" className=\"text-current\">\n\t\t\t\t\t\t\t\t\t{strings.activeSearchLabel}\n\t\t\t\t\t\t\t\t</Text>\n\t\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\t{trimmedQuery}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t\t{/* A filter, not a tab set: pressed buttons in a named group. */}\n\t\t\t\t<div className={cn('media-library-toolbar--type-toggle shrink-0', segmentedControlRecipes.frame, controlGroupHeightClasses[size])} role=\"group\" aria-label={strings.typeFilterLabel}>\n\t\t\t\t\t{typeOptions.map((option) => {\n\t\t\t\t\t\tconst Icon = option.icon;\n\t\t\t\t\t\tconst active = type === option.value;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\taria-pressed={active}\n\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\tsegmentedControlRecipes.item, 'shadow-none',\n\t\t\t\t\t\t\t\t\tactive\n\t\t\t\t\t\t\t\t\t\t? `${interactionRecipes.segmentActive} hover:bg-card`\n\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)}\n\t\t\t\t\t\t\t\tonClick={() => onTypeChange(option.value as typeof type)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{Icon && <Icon className=\"size-icon-md\" />}\n\t\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\t</Button>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t\t{/* Collection and sort move to a new row as one pair, so neither is left alone\n\t\t\t\t on a row; the pair only splits when it cannot fit a row by itself. */}\n\t\t\t\t<Stack direction=\"horizontal\" gap=\"md\" wrap className=\"media-library-toolbar--selects min-w-0\">\n\t\t\t\t\t<div className=\"min-w-40 grow\">\n\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\tvalue={collection}\n\t\t\t\t\t\t\toptions={collectionOptions}\n\t\t\t\t\t\t\tonValueChange={(value) => onCollectionChange(value ?? 'all')}\n\t\t\t\t\t\t\tplaceholder={strings.collectionFilterLabel}\n\t\t\t\t\t\t\taria-label={strings.collectionFilterLabel}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\tclassName=\"bg-background\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"min-w-32 grow\">\n\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\tvalue={sort}\n\t\t\t\t\t\t\toptions={sortOptions}\n\t\t\t\t\t\t\tonValueChange={(value) => onSortChange((value ?? 'newest') as typeof sort)}\n\t\t\t\t\t\t\tplaceholder={strings.sortLabel}\n\t\t\t\t\t\t\taria-label={strings.sortLabel}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\tclassName=\"bg-background\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</Stack>\n\t\t\t\t{!!hasActiveFilters && (\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\tdisabled={disabled}\n\t\t\t\t\t\tonClick={onClearFilters}\n\t\t\t\t\t>\n\t\t\t\t\t\t{strings.clearFilters}\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t\t<Stack direction=\"horizontal\" align=\"center\" gap=\"md\" wrap={false} className=\"media-library-toolbar--view ms-auto min-w-0 max-w-full\">\n\t\t\t\t{summary}\n\t\t\t\t<div className={cn('media-library-toolbar--view-toggle shrink-0', segmentedControlRecipes.frame, controlGroupHeightClasses[size])} role=\"group\" aria-label={strings.viewLabel}>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\ttone={view === 'grid' ? 'neutral' : 'secondary'}\n\t\t\t\t\t\tbuttonStyle={view === 'grid' ? 'solid' : 'ghost'}\n\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={cn(segmentedControlRecipes.item, view === 'grid' && `${interactionRecipes.segmentActive} hover:bg-card`)}\n\t\t\t\t\t\taria-label={strings.gridView}\n\t\t\t\t\t\taria-pressed={view === 'grid'}\n\t\t\t\t\t\tonClick={() => onViewChange('grid')}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Grid2X2 className=\"size-icon-md\" />\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={view === 'table' ? 'neutral' : 'secondary'}\n\t\t\t\t\t\tbuttonStyle={view === 'table' ? 'solid' : 'ghost'}\n\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={cn(segmentedControlRecipes.item, view === 'table' && `${interactionRecipes.segmentActive} hover:bg-card`)}\n\t\t\t\t\t\taria-label={strings.tableView}\n\t\t\t\t\t\taria-pressed={view === 'table'}\n\t\t\t\t\t\tonClick={() => onViewChange('table')}\n\t\t\t\t\t>\n\t\t\t\t\t\t<LayoutList className=\"size-icon-md\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t\t{!!onSelectingChange && (\n\t\t\t\t\t// Selection is an explicit mode: while it is off, activating an asset opens it.\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\taria-pressed={selecting}\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tbuttonStyle=\"outline\"\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={cn('media-library-toolbar--select shrink-0', selecting && interactionRecipes.togglePressed)}\n\t\t\t\t\t\tonClick={() => onSelectingChange(!selecting)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{strings.selectMode}\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t\t{toolbarEnd}\n\t\t\t</Stack>\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\tonOpen,\n\tselecting = false,\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\t// Browsing opens the asset and a separate check selects it; selection mode toggles.\n\tconst opens = !!onOpen && !selecting;\n\tconst activate = opens ? onOpen : onToggle;\n\n\treturn (\n\t\t// oxlint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions -- The card widens the pointer target; the select button inside is the keyboard control.\n\t\t<div\n\t\t\tdata-selected={selected || undefined}\n\t\t\tdata-selecting={selecting || 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 bg-card text-card-foreground text-left shadow-xs transition-all',\n\t\t\t\t`${interactionRecipes.tileHover} hover:shadow-sm`,\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={activate}\n\t\t>\n\t\t\t{!!activate && (\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={opens ? undefined : selected}\n\t\t\t\t\tclassName={cn('media-library-card--select rounded-radius', selectionTargetClassName)}\n\t\t\t\t\tonClick={(event) => { event.stopPropagation(); activate(); }}\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{opens && !!onToggle ? (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\taria-label={formatMediaLibraryString(strings.selectItem, { name })}\n\t\t\t\t\t\taria-pressed={selected}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\tcheckClassName,\n\t\t\t\t\t\t\t`z-10 cursor-pointer opacity-0 transition-opacity group-hover/card:opacity-100 group-focus-within/card:opacity-100 pointer-coarse:opacity-100 ${focusRecipes.frame}`,\n\t\t\t\t\t\t\tselected && checkSelectedClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tonClick={(event) => { event.stopPropagation(); onToggle(); }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Check className=\"size-icon-sm\" />\n\t\t\t\t\t</button>\n\t\t\t\t) : (\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\tcheckClassName,\n\t\t\t\t\t\t\t'transition-opacity',\n\t\t\t\t\t\t\tselecting ? 'opacity-100' : 'opacity-0 group-hover/card:opacity-100 group-focus-within/card:opacity-100',\n\t\t\t\t\t\t\tselected && checkSelectedClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Check className=\"size-icon-sm\" />\n\t\t\t\t\t</span>\n\t\t\t\t)}\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-10 right-2 top-2 opacity-0 shadow-sm transition-opacity group-hover/card:opacity-100 group-focus-within/card:opacity-100 pointer-coarse: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\" type=\"inherit\" 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\tonOpen,\n\tselecting = false,\n}: MediaLibraryListProps<TItem>) {\n\t// Browsing opens the row's asset and its check selects it; selection mode toggles.\n\tconst opens = !!onOpen && !selecting;\n\treturn (\n\t\t/*\n\t\t * A table for assistive technology on the existing grid. Passive cells\n\t\t * carry their role on the element that was already there. Controls cannot\n\t\t * be cells themselves, so each sits in a `display: contents` cell that adds\n\t\t * no box: every grid item, and so the layout, is the one it was.\n\t\t */\n\t\t<div\n\t\t\trole=\"table\"\n\t\t\taria-label={strings.resultsLabel}\n\t\t\t// The results region owns the 24px surface inset, like a padded Card\n\t\t\t// body. Rows keep their own row inset for the hover fill, so the table\n\t\t\t// is pulled out by that inset: the first and last columns then start\n\t\t\t// and end on the same line as the header, toolbar and footer.\n\t\t\tclassName=\"media-library-list--component -mx-row-x min-w-180\"\n\t\t>\n\t\t\t<div role=\"rowgroup\" className=\"contents\">\n\t\t\t<div role=\"row\" 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 role=\"columnheader\">\n\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" className=\"sr-only\">{strings.selectMode}</Text>\n\t\t\t\t</span>\n\t\t\t\t<span role=\"cell\" />\n\t\t\t\t<DisplayLabel role=\"columnheader\">\n\t\t\t\t\t{strings.table.name}\n\t\t\t\t</DisplayLabel>\n\t\t\t\t<DisplayLabel role=\"columnheader\">\n\t\t\t\t\t{strings.table.type}\n\t\t\t\t</DisplayLabel>\n\t\t\t\t<DisplayLabel role=\"columnheader\">\n\t\t\t\t\t{strings.table.size}\n\t\t\t\t</DisplayLabel>\n\t\t\t\t<DisplayLabel role=\"columnheader\">\n\t\t\t\t\t{strings.table.collection}\n\t\t\t\t</DisplayLabel>\n\t\t\t\t<DisplayLabel role=\"columnheader\">\n\t\t\t\t\t{strings.table.used}\n\t\t\t\t</DisplayLabel>\n\t\t\t\t<span role=\"columnheader\">\n\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" className=\"sr-only\">{strings.detail.title}</Text>\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div role=\"rowgroup\" className=\"contents\">\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// oxlint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions, jsx-a11y/no-noninteractive-element-interactions -- The row widens the pointer target; the select button inside is the keyboard control.\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\trole=\"row\"\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 ${interactionRecipes.rowHover}`,\n\t\t\t\t\t\t\tselected && interactionRecipes.rowSelected,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tonClick={() => (opens && onOpen ? onOpen(id) : onToggle(id))}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div role=\"cell\" className=\"contents\">\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={opens ? undefined : selected}\n\t\t\t\t\t\t\tclassName={cn('media-library-list--select rounded-radius', selectionTargetClassName)}\n\t\t\t\t\t\t\tonClick={(event) => { event.stopPropagation(); if (opens && onOpen) onOpen(id); else onToggle(id); }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{opens ? (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\taria-label={formatMediaLibraryString(strings.selectItem, { name })}\n\t\t\t\t\t\t\t\taria-pressed={selected}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t`relative z-10 inline-flex size-icon-lg cursor-pointer items-center justify-center rounded-radius border border-input bg-background p-0 text-transparent ${focusRecipes.frame}`,\n\t\t\t\t\t\t\t\t\tselected && 'border-primary bg-primary text-primary-foreground',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tonClick={(event) => { event.stopPropagation(); onToggle(id); }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Check className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\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\t\tselected && 'border-primary bg-primary text-primary-foreground',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Check className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<MediaPreview\n\t\t\t\t\t\t\trole=\"cell\"\n\t\t\t\t\t\t\ttint={accessors.getTint(item)}\n\t\t\t\t\t\t\tclassName=\"size-9 rounded-radius\"\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\" role=\"rowheader\" type=\"inherit\" 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 role=\"cell\" tone=\"secondary\">{typeLabel(type, strings)}</Badge>\n\t\t\t\t\t\t<FileSize role=\"cell\" value={accessors.getSize(item)} size=\"xs\" emptyLabel={strings.unknownSize} />\n\t\t\t\t\t\t<Text role=\"cell\" size=\"xs\" type=\"secondary\" className=\"truncate\">\n\t\t\t\t\t\t\t{accessors.getCollection(item) || EMPTY}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t<Text role=\"cell\" size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t\t{accessors.getUsageCount(item) ? accessors.getUsageCount(item) : EMPTY}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t<div role=\"cell\" className=\"contents\">\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-10\"\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\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\n/**\n * A typed metadata field. It holds what is typed as a draft and reports one\n * committed edit: on blur or Enter, never for a value the field already had.\n * Escape restores the stored value. A draft that is still open when the field\n * goes away (another asset is opened, the panel closes) is committed, not dropped.\n */\nfunction MediaLibraryDraftField({\n\tlabel,\n\tvalue: committed,\n\tplaceholder,\n\treadOnly = false,\n\tonCommit,\n}: {\n\tlabel: string;\n\t/** The stored value; the draft follows it whenever it changes. */\n\tvalue: string;\n\tplaceholder: string;\n\treadOnly?: boolean;\n\tonCommit: (value: string) => void;\n}) {\n\tconst [draft, setDraft] = useState({ source: committed, value: committed });\n\tif (draft.source !== committed) {\n\t\tsetDraft({ source: committed, value: committed });\n\t}\n\tconst dirty = !readOnly && draft.value !== committed;\n\tconst restore = () => setDraft({ source: committed, value: committed });\n\tconst commit = () => {\n\t\tif (!dirty) return;\n\t\trestore();\n\t\tonCommit(draft.value);\n\t};\n\tconst unsaved = useRef<(() => void) | null>(null);\n\tuseEffect(() => {\n\t\tunsaved.current = dirty ? () => onCommit(draft.value) : null;\n\t});\n\tuseEffect(() => () => unsaved.current?.(), []);\n\n\treturn (\n\t\t<FormField label={label}>\n\t\t\t<Input\n\t\t\t\tvalue={draft.value}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\treadOnly={readOnly}\n\t\t\t\tonChange={(event) => setDraft({ source: committed, value: event.target.value })}\n\t\t\t\tonBlur={commit}\n\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\tif (readOnly || event.nativeEvent.isComposing) return;\n\t\t\t\t\tif (event.key === 'Enter') {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tcommit();\n\t\t\t\t\t} else if (event.key === 'Escape' && dirty) {\n\t\t\t\t\t\t// The key discards the draft here; it does not also dismiss a surrounding dialog.\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\trestore();\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t/>\n\t\t</FormField>\n\t);\n}\n\nfunction MediaLibraryTagsField({\n\tlabel,\n\ttags,\n\tplaceholder,\n\treadOnly = false,\n\tonValueChange,\n}: {\n\tlabel: string;\n\ttags: readonly string[];\n\tplaceholder: string;\n\treadOnly?: boolean;\n\tonValueChange: (tags: string[]) => void;\n}) {\n\treturn (\n\t\t<MediaLibraryDraftField\n\t\t\tlabel={label}\n\t\t\tvalue={tags.join(', ')}\n\t\t\tplaceholder={placeholder}\n\t\t\treadOnly={readOnly}\n\t\t\tonCommit={(text) => {\n\t\t\t\tconst next = text.split(',').map((tag) => tag.trim()).filter(Boolean);\n\t\t\t\tif (next.length !== tags.length || next.some((tag, index) => tag !== tags[index])) {\n\t\t\t\t\tonValueChange(next);\n\t\t\t\t}\n\t\t\t}}\n\t\t/>\n\t);\n}\n\nexport function MediaLibraryDetailPanel<TItem>({\n\titem,\n\tcollections = [],\n\taccessors,\n\tstrings,\n\tonClose,\n\tonUpdate,\n\treadOnly = false,\n\tmutationError,\n\tonRemove,\n\tallowDelete = true,\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\t// An asset without a collection shows the placeholder, never the first option.\n\tconst collection = accessors.getCollection(item);\n\tconst tags = accessors.getTags(item);\n\tconst isPublic = accessors.getPublic(item) ?? true;\n\tconst update = readOnly ? () => Promise.resolve(false) : onUpdate;\n\tconst custom = renderDetail?.(item, {\n\t\taccessors,\n\t\tupdate,\n\t\tmutationError,\n\t\tremove: allowDelete ? onRemove : () => Promise.resolve(false),\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 text-foreground @2xl/media-library:w-72\">\n\t\t\t<div className={cn('media-library-detail-panel--header p-surface', regionRecipes.header)}>\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\tdata-media-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 auto-rows-max 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{/* The shared definition list owns the label/value pairing and the figure column. */}\n\t\t\t\t<MetadataList\n\t\t\t\t\tlayout=\"rows\"\n\t\t\t\t\tvalueAlign=\"end\"\n\t\t\t\t\tdensity=\"compact\"\n\t\t\t\t\tclassName=\"media-library-detail-panel--facts\"\n\t\t\t\t\titems={[\n\t\t\t\t\t\t{ id: 'type', label: strings.detail.type, value: typeLabel(type, strings) },\n\t\t\t\t\t\t{ id: 'size', label: strings.detail.size, value: <FileSize value={accessors.getSize(item)} emptyLabel={strings.unknownSize} /> },\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'dimensions',\n\t\t\t\t\t\t\tlabel: strings.detail.dimensions,\n\t\t\t\t\t\t\tvalue: (\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\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},\n\t\t\t\t\t\t{ id: 'uploaded', label: strings.detail.uploaded, value: <UploadedAt value={accessors.getUploadedAt(item)} /> },\n\t\t\t\t\t\t{ id: 'used-in', label: strings.detail.usedIn, value: usedInLabel(accessors.getUsageCount(item), strings) },\n\t\t\t\t\t]}\n\t\t\t\t/>\n\t\t\t\t{mutationError && (\n\t\t\t\t\t<Alert tone=\"destructive\">\n\t\t\t\t\t\t<AlertDescription>{strings.detail.mutationError ?? defaultMediaLibraryStrings.detail.mutationError}</AlertDescription>\n\t\t\t\t\t</Alert>\n\t\t\t\t)}\n\t\t\t\t<MediaLibraryDraftField\n\t\t\t\t\tkey={`alt:${accessors.getId(item)}`}\n\t\t\t\t\tlabel={strings.detail.altText}\n\t\t\t\t\tvalue={accessors.getAlt(item) ?? ''}\n\t\t\t\t\tplaceholder={strings.detail.altPlaceholder}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\tonCommit={(alt) => update({ alt })}\n\t\t\t\t/>\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\tplaceholder={strings.detail.noCollection ?? defaultMediaLibraryStrings.detail.noCollection}\n\t\t\t\t\t\taria-label={strings.detail.collection}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\tonValueChange={(value) => update({ collection: value })}\n\t\t\t\t\t/>\n\t\t\t\t</FormField>\n\t\t\t\t<MediaLibraryTagsField\n\t\t\t\t\tkey={accessors.getId(item)}\n\t\t\t\t\tlabel={strings.detail.tags}\n\t\t\t\t\ttags={tags}\n\t\t\t\t\tplaceholder={strings.detail.tagsPlaceholder}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\tonValueChange={(next) => update({ tags: next })}\n\t\t\t\t/>\n\t\t\t\t<div className=\"media-library-detail-panel--public\">\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\treadOnly={readOnly}\n\t\t\t\t\t\tonValueChange={(checked) => update({ 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{(onReplace || allowDelete) && (\n\t\t\t\t\t<div className={cn('media-library-detail-panel--actions flex flex-wrap', compositionClasses.commands)}>\n\t\t\t\t\t\t{onReplace && <Button type=\"button\" tone=\"secondary\" buttonStyle=\"outline\" onClick={onReplace}>\n\t\t\t\t\t\t\t{strings.detail.replace}\n\t\t\t\t\t\t</Button>}\n\t\t\t\t\t\t{allowDelete && <Button type=\"button\" tone=\"destructive\" buttonStyle=\"ghost\" onClick={onRemove}>\n\t\t\t\t\t\t\t{strings.detail.delete}\n\t\t\t\t\t\t</Button>}\n\t\t\t\t\t</div>\n\t\t\t\t)}\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\thasUploadError = false,\n\taccept = DEFAULT_MEDIA_UPLOAD_ACCEPT,\n\tmaxFileSize,\n\tmaxFiles,\n\trejections = [],\n\tstrings,\n\tonFiles,\n\tonRemoveFile,\n\tonOptionsChange,\n\tempty,\n}: MediaLibraryUploadPanelProps) {\n\tconst sizeLimit = maxFileSize === undefined ? undefined : formatFileSize(maxFileSize) ?? undefined;\n\tconst uploadString = (key: 'unsupportedType' | 'tooLarge' | 'tooMany' | 'sizeLimitHint') =>\n\t\tstrings.upload[key] ?? defaultMediaLibraryStrings.upload[key] ?? '';\n\t// The hint states only the limits that are enforced.\n\tconst dropHint = sizeLimit\n\t\t? `${strings.upload.dropHint} · ${formatMediaLibraryString(uploadString('sizeLimitHint'), { size: sizeLimit })}`\n\t\t: strings.upload.dropHint;\n\t// One line per file for type and size; the count limit is stated once.\n\tconst rejectionNotices = [\n\t\t...rejections.filter((rejection) => rejection.reason !== 'count').map((rejection) => formatMediaLibraryString(\n\t\t\tuploadString(rejection.reason === 'type' ? 'unsupportedType' : 'tooLarge'),\n\t\t\t{ name: rejection.name, size: sizeLimit ?? '' },\n\t\t)),\n\t\t...(rejections.some((rejection) => rejection.reason === 'count')\n\t\t\t? [formatMediaLibraryString(uploadString('tooMany'), { count: maxFiles ?? 0 })]\n\t\t\t: []),\n\t];\n\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={accept}\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: dropHint,\n\t\t\t\t\tdragOver: strings.upload.dragOver,\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t{rejectionNotices.length > 0 && (\n\t\t\t\t<Alert tone=\"destructive\" className=\"media-library-upload-panel--rejections\">\n\t\t\t\t\t<AlertDescription>\n\t\t\t\t\t\t<Stack gap=\"xs\">\n\t\t\t\t\t\t\t{rejectionNotices.map((notice) => (\n\t\t\t\t\t\t\t\t<Text key={notice} tag=\"span\" size=\"inherit\" type=\"inherit\">{notice}</Text>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</AlertDescription>\n\t\t\t\t</Alert>\n\t\t\t)}\n\t\t\t{hasUploadError && (\n\t\t\t\t<Alert tone=\"destructive\">\n\t\t\t\t\t<AlertDescription>{strings.upload.error ?? defaultMediaLibraryStrings.upload.error}</AlertDescription>\n\t\t\t\t</Alert>\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 text-card-foreground 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\">\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<Stack gap=\"md\" 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 type=\"inherit\" 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<Progress value={file.progress} size=\"sm\" aria-label={file.name} />\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</Stack>\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 @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\t// The select shows exactly what the upload sends: nothing until a collection is chosen.\n\t\t\t\t\t\tvalue={uploadOptions.collection}\n\t\t\t\t\t\tplaceholder={strings.upload.noCollection ?? defaultMediaLibraryStrings.upload.noCollection}\n\t\t\t\t\t\tallowClear\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<MediaLibraryTagsField\n\t\t\t\t\tlabel={strings.upload.tags}\n\t\t\t\t\ttags={uploadOptions.tags}\n\t\t\t\t\tplaceholder={strings.upload.tagsPlaceholder}\n\t\t\t\t\tonValueChange={(next) => onOptionsChange({ tags: next })}\n\t\t\t\t/>\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\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{/* Stays enabled during an upload: it is the way to stop the request. */}\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={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{/* Keyed apart from the library tab's confirm command, so neither inherits the other's pending state. */}\n\t\t\t\t<Button tone=\"primary\"\n\t\t\t\t\tkey=\"upload\"\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 tone=\"primary\"\n\t\t\t\tkey=\"confirm\"\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: selectedCount === 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' && cn('bg-background text-foreground p-surface', regionRecipes.footer),\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, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { Badge } from '../../base/badge';\nimport { BatchActionBar } from '../../base/batch-action-bar';\nimport { Button } from '../../base/buttons';\nimport { SurfaceTitle } from '../../base/display/surface-title';\nimport { Alert, AlertDescription, ErrorState, LoadingState } from '../../base/feedback';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '../../base/navigation';\nimport { Stack } from '../../base/structure';\nimport { ActionDialog, ConfirmDialog } 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, MediaLibraryTab } 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';\nimport { focusRecipes } from '../../../lib/focus-recipes';\nimport { regionRecipes } from '../../../lib/surface-recipes';\n\ninterface MediaLibraryFooterPortalTarget {\n\telement: HTMLElement | null;\n}\n\ninterface MediaLibraryDeleteRequest<TItem> {\n\titem: TItem;\n\tresolve: (removed: boolean) => void;\n}\n\nconst MediaLibraryFooterPortalContext = createContext<MediaLibraryFooterPortalTarget | null>(null);\n\n/**\n * The region under the header. With the upload tab on offer it is the panel of\n * the active tab; without tabs it is a plain region. Both panels hold their\n * own focusable content, so the panel itself is not a tab stop.\n */\nfunction MediaLibraryBody({ tab, children }: { tab: MediaLibraryTab | null; children: ReactNode }) {\n\tconst className = 'media-library--body flex min-h-0 flex-1';\n\treturn tab\n\t\t? <TabsContent value={tab} tabIndex={-1} className={className}>{children}</TabsContent>\n\t\t: <div className={className}>{children}</div>;\n}\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\tbulkActions,\n\tstrings: stringsProp,\n\tslots,\n\theightClassName,\n\tclassName,\n\titems,\n\tfetcher,\n\trefreshKey,\n\tpageSize,\n\taccessors,\n\tcollections,\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\tonItemUpdate,\n\tonItemDelete,\n\tonItemReplace,\n\tonItemOpen,\n\tonUpload,\n\tuploadAccept,\n\tmaxFileSize,\n\tmaxFiles,\n\tuploadFailedMessage,\n\tonError,\n\tselecting,\n\tdefaultSelecting,\n\tonSelectingChange,\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\trefreshKey,\n\t\tpageSize,\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\tuploadAccept,\n\t\tmaxFileSize,\n\t\tmaxFiles,\n\t\tuploadFailedMessage: uploadFailedMessage ?? strings.upload.fileFailed ?? defaultMediaLibraryStrings.upload.fileFailed,\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\tselecting,\n\t\t// A picker starts selecting; a library starts browsing, where activation opens.\n\t\tdefaultSelecting: defaultSelecting ?? confirmOnSelect,\n\t\tonSelectingChange,\n\t});\n\tconst resolvedCollections = useResolvedCollections(collections, state.items, state.accessors.getCollection);\n\tconst activeTab = allowUpload ? state.tab : 'library';\n\tconst [deleteRequest, setDeleteRequest] = useState<MediaLibraryDeleteRequest<TItem> | null>(null);\n\tconst deleteRequestRef = useRef<MediaLibraryDeleteRequest<TItem> | null>(null);\n\tconst deleteItemId = deleteRequest ? state.accessors.getId(deleteRequest.item) : null;\n\tconst detailItem = state.detailId\n\t\t? (state.items.find((item) => state.accessors.getId(item) === state.detailId)\n\t\t\t?? (deleteItemId === state.detailId ? deleteRequest?.item ?? null : null))\n\t\t: null;\n\tconst deleteFailed = state.mutationError?.operation === 'delete' && state.mutationError.itemId === deleteItemId;\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\t// While a request is in flight Cancel stops it and keeps the files for a\n\t// retry; with nothing in flight it discards them and returns to the library.\n\tconst cancelUpload = () => {\n\t\tif (state.uploading) {\n\t\t\tstate.cancelUpload();\n\t\t\treturn;\n\t\t}\n\t\tstate.clearStagedFiles();\n\t\tstate.setTab('library');\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 sectionRef = useRef<HTMLElement>(null);\n\tconst resultsRef = useRef<HTMLDivElement>(null);\n\tconst detailOpenerRef = useRef<HTMLElement | null>(null);\n\tconst returnToResultsRef = useRef(false);\n\tconst requestDelete = (item: TItem): Promise<boolean> => {\n\t\tif (!onItemDelete || deleteRequestRef.current) return Promise.resolve(false);\n\t\treturn new Promise((resolve) => {\n\t\t\tconst request = { item, resolve };\n\t\t\tdeleteRequestRef.current = request;\n\t\t\tsetDeleteRequest(request);\n\t\t});\n\t};\n\tconst finishDelete = (removed: boolean) => {\n\t\tconst request = deleteRequestRef.current;\n\t\tdeleteRequestRef.current = null;\n\t\tsetDeleteRequest(null);\n\t\trequest?.resolve(removed);\n\t};\n\tuseEffect(() => () => {\n\t\tdeleteRequestRef.current?.resolve(false);\n\t\tdeleteRequestRef.current = null;\n\t}, []);\n\tconst showDetail = (id: string) => {\n\t\t// Narrow shells hide the grid behind the panel, so focus moves in and comes back.\n\t\tdetailOpenerRef.current = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n\t\tstate.setDetailId(id);\n\t};\n\tconst openItem = (item: TItem) => {\n\t\tif (onItemOpen) onItemOpen(item);\n\t\telse showDetail(state.accessors.getId(item));\n\t};\n\tuseEffect(() => {\n\t\tif (state.detailId !== null) {\n\t\t\tif (detailOpenerRef.current) sectionRef.current?.querySelector<HTMLElement>('[data-media-detail-close]')?.focus();\n\t\t\treturn;\n\t\t}\n\t\tconst opener = detailOpenerRef.current;\n\t\tdetailOpenerRef.current = null;\n\t\tif (returnToResultsRef.current) {\n\t\t\treturnToResultsRef.current = false;\n\t\t\tresultsRef.current?.focus();\n\t\t} else if (opener?.isConnected) {\n\t\t\topener.focus();\n\t\t}\n\t}, [state.detailId]);\n\tconst hasLoadError = Boolean(fetcher) && !state.loading && state.loadError != null;\n\t// The load-more command leaves with the last page. Focus that was on it goes\n\t// to the results instead of falling back to the page.\n\tconst pagingRequested = useRef(false);\n\tconst loadMore = () => {\n\t\tpagingRequested.current = true;\n\t\tvoid state.loadMore();\n\t};\n\tuseEffect(() => {\n\t\tif (state.loadingMore || !pagingRequested.current) return;\n\t\tpagingRequested.current = false;\n\t\tif (!state.hasMore && document.activeElement === document.body) resultsRef.current?.focus();\n\t}, [state.hasMore, state.loadingMore]);\n\tconst showLoadMore = Boolean(state.hasMore) && !hasLoadError && !(state.loading && !state.hasLoadedResults);\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\t// A picker reports its selection in the footer, a browsing library in the\n\t// floating batch bar; never both.\n\tconst isPicker = Boolean(footerPortal) || (Boolean(onConfirm) && !confirmOnSelect);\n\tconst usesBulkBar = Boolean(bulkActions) && !isPicker;\n\tconst bulkSelectedCount = activeTab === 'library' ? state.selectedIds.length : 0;\n\tconst footer =\n\t\tslots?.footer ??\n\t\t(usesBulkBar && activeTab === 'library' ? null : 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={cancelUpload}\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={cancelUpload}\n\t\t\t/>\n\t\t));\n\n\t/*\n\t * The shell is a named container, and its own chrome switches on the\n\t * container's width rather than the viewport's. A media picker is routinely\n\t * mounted in a drawer or a split pane on a wide screen; keyed to the\n\t * viewport, the header laid out for desktop inside a 400px shell and the\n\t * tab group was clipped by `overflow-hidden` below.\n\t */\n\tconst shellClassName = cn(\n\t\t'media-library--component @container/media-library box-border flex min-h-0 flex-col overflow-hidden rounded-surface border border-border bg-background text-foreground',\n\t\theightClassName ?? 'h-190 max-h-[calc(100vh-7rem)]',\n\t\tclassName,\n\t);\n\tconst content = (\n\t\t<>\n\t\t\t{hasHeader && (\n\t\t\t\t<header className={cn('media-library--header flex flex-col gap-space-lg p-surface', regionRecipes.header, '@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<TabsList className=\"media-library--tabs\">\n\t\t\t\t\t\t\t\t\t\t\t<TabsTrigger value=\"library\">\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</TabsTrigger>\n\t\t\t\t\t\t\t\t\t\t\t<TabsTrigger value=\"upload\">\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<Badge size=\"sm\" tone=\"secondary\" className=\"media-library--staged-count\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NumberValue value={state.stagedFiles.length} size=\"inherit\" weight=\"inherit\" type=\"inherit\" align=\"center\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</TabsTrigger>\n\t\t\t\t\t\t\t\t\t\t</TabsList>\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<MediaLibraryBody tab={allowUpload ? activeTab : null}>\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\thasUploadError={state.uploadError != null && state.stagedFiles.length > 0}\n\t\t\t\t\t\t\taccept={uploadAccept}\n\t\t\t\t\t\t\tmaxFileSize={maxFileSize}\n\t\t\t\t\t\t\tmaxFiles={maxFiles}\n\t\t\t\t\t\t\trejections={state.uploadRejections}\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={cn('media-library--toolbar p-surface', regionRecipes.header)}>\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\tselecting={state.selecting}\n\t\t\t\t\t\t\t\tonSelectingChange={state.setSelecting}\n\t\t\t\t\t\t\t\t// A failed load has no result to count or filter; the live\n\t\t\t\t\t\t\t\t// region stays mounted so the next count is announced.\n\t\t\t\t\t\t\t\tdisabled={hasLoadError}\n\t\t\t\t\t\t\t\tsummary={\n\t\t\t\t\t\t\t\t\t<span aria-live=\"polite\" className=\"media-library--count min-w-0 truncate\">\n\t\t\t\t\t\t\t\t\t\t{hasLoadError || state.loading ? null : (\n\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\">{countLabel}</Text>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tref={resultsRef}\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\taria-busy={state.loading || undefined}\n\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\tclassName={`media-library--results flex min-h-0 flex-1 flex-col gap-space-lg overflow-y-auto p-surface focus-visible:outline-none ${focusRecipes.inset}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{/* Loading, error and empty states centre in the body (auto\n\t\t\t\t\t\t\t\tblock margins), so a tall shell leaves no dead band below\n\t\t\t\t\t\t\t\tthem; content taller than the body still scrolls from its top. */}\n\t\t\t\t\t\t\t{state.loading && !state.hasLoadedResults ? (\n\t\t\t\t\t\t\t\t<div className=\"media-library--state my-auto\">\n\t\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\t</div>\n\t\t\t\t\t\t\t) : hasLoadError ? (\n\t\t\t\t\t\t\t\t<div className=\"media-library--state my-auto\">\n\t\t\t\t\t\t\t\t\t{slots?.error ?? (\n\t\t\t\t\t\t\t\t\t\t<ErrorState\n\t\t\t\t\t\t\t\t\t\t\ttitle={strings.errorTitle}\n\t\t\t\t\t\t\t\t\t\t\tdescription={strings.errorDescription}\n\t\t\t\t\t\t\t\t\t\t\tonRetry={fetcher ? state.retry : undefined}\n\t\t\t\t\t\t\t\t\t\t\tretryLabel={strings.retry ?? defaultMediaLibraryStrings.retry}\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) : state.visibleItems.length === 0 ? (\n\t\t\t\t\t\t\t\t<div className=\"media-library--state my-auto\">\n\t\t\t\t\t\t\t\t\t{slots?.empty ?? (\n\t\t\t\t\t\t\t\t\t\t<MediaLibraryEmptyState\n\t\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\t\tdescription={state.hasFilters ? strings.emptyFilteredDescription : strings.emptyLibraryDescription}\n\t\t\t\t\t\t\t\t\t\t\taction={\n\t\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\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\t{strings.clearFilters}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t) : allowUpload ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Button tone=\"primary\" type=\"button\" onClick={() => state.setTab('upload')}>\n\t\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\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t) : undefined\n\t\t\t\t\t\t\t\t\t\t\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) : 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={showDetail}\n\t\t\t\t\t\t\t\t\t\tselecting={state.selecting}\n\t\t\t\t\t\t\t\t\t\tonOpen={(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) openItem(item);\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\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\tselecting: state.selecting,\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: () => showDetail(id),\n\t\t\t\t\t\t\t\t\t\t\topen: () => openItem(item),\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\tonOpen={ctx.open}\n\t\t\t\t\t\t\t\t\t\t\t\tselecting={ctx.selecting}\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\t{showLoadMore && (\n\t\t\t\t\t\t\t\t<Stack align=\"center\" gap=\"md\" className=\"media-library--load-more\">\n\t\t\t\t\t\t\t\t\t{state.loadMoreError != null && (\n\t\t\t\t\t\t\t\t\t\t<Alert tone=\"destructive\">\n\t\t\t\t\t\t\t\t\t\t\t<AlertDescription>{strings.loadMoreError ?? defaultMediaLibraryStrings.loadMoreError}</AlertDescription>\n\t\t\t\t\t\t\t\t\t\t</Alert>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"outline\"\n\t\t\t\t\t\t\t\t\t\tdisabled={state.loading}\n\t\t\t\t\t\t\t\t\t\tloading={state.loadingMore}\n\t\t\t\t\t\t\t\t\t\tstrings={{ loading: strings.loadingMore ?? defaultMediaLibraryStrings.loadingMore }}\n\t\t\t\t\t\t\t\t\t\tonClick={loadMore}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{state.loadMoreError != null\n\t\t\t\t\t\t\t\t\t\t\t? strings.retry ?? defaultMediaLibraryStrings.retry\n\t\t\t\t\t\t\t\t\t\t\t: strings.loadMore ?? defaultMediaLibraryStrings.loadMore}\n\t\t\t\t\t\t\t\t\t</Button>\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</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\treadOnly={!onItemUpdate}\n\t\t\t\t\t\tonUpdate={(patch) => detailItem ? state.updateItem(detailItem, patch) : Promise.resolve(false)}\n\t\t\t\t\t\tmutationError={state.mutationError?.itemId === state.detailId ? state.mutationError : null}\n\t\t\t\t\t\tonReplace={onItemReplace && detailItem ? () => onItemReplace(detailItem) : undefined}\n\t\t\t\t\t\tallowDelete={Boolean(onItemDelete)}\n\t\t\t\t\t\tonRemove={() => detailItem ? requestDelete(detailItem) : Promise.resolve(false)}\n\t\t\t\t\t\trenderDetail={slots?.renderDetail}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</MediaLibraryBody>\n\n\t\t\t{footerPortal ? (footerPortal.element ? createPortal(footer, footerPortal.element) : null) : footer}\n\n\t\t\t{(onItemDelete || deleteRequest) && (\n\t\t\t\t<ConfirmDialog\n\t\t\t\t\topen={deleteRequest !== null}\n\t\t\t\t\tonOpenChange={(open) => { if (!open) finishDelete(false); }}\n\t\t\t\t\tdestructive\n\t\t\t\t\ttitle={strings.detail.confirmDeleteTitle ?? defaultMediaLibraryStrings.detail.confirmDeleteTitle}\n\t\t\t\t\tdescription={deleteRequest ? formatMediaLibraryString(\n\t\t\t\t\t\tstrings.detail.confirmDeleteDescription ?? defaultMediaLibraryStrings.detail.confirmDeleteDescription ?? '',\n\t\t\t\t\t\t{ name: state.accessors.getName(deleteRequest.item) },\n\t\t\t\t\t) : undefined}\n\t\t\t\t\tstrings={{ confirm: strings.detail.confirmDeleteLabel ?? defaultMediaLibraryStrings.detail.confirmDeleteLabel }}\n\t\t\t\t\talertMessage={deleteFailed ? strings.detail.confirmDeleteError ?? defaultMediaLibraryStrings.detail.confirmDeleteError : undefined}\n\t\t\t\t\tcloseOnAsyncComplete={false}\n\t\t\t\t\tonAsyncConfirm={async () => {\n\t\t\t\t\t\tif (!deleteRequest) return;\n\t\t\t\t\t\tconst removed = await state.removeItem(deleteRequest.item);\n\t\t\t\t\t\tif (!removed || deleteRequestRef.current !== deleteRequest) return;\n\t\t\t\t\t\treturnToResultsRef.current = true;\n\t\t\t\t\t\tstate.setDetailId(null);\n\t\t\t\t\t\tfinishDelete(true);\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{/*\n\t\t\t * Browsing only, and on the library tab. Docked to the viewport so the\n\t\t\t * selection stays reachable while the results scroll; focus returns to\n\t\t\t * the results when the bar goes away with focus in it.\n\t\t\t */}\n\t\t\t{usesBulkBar && (\n\t\t\t\t<BatchActionBar\n\t\t\t\t\tselectedCount={bulkSelectedCount}\n\t\t\t\t\ttotalCount={state.totalCount}\n\t\t\t\t\tonClear={state.clearSelection}\n\t\t\t\t\treturnFocusRef={resultsRef}\n\t\t\t\t\tclassName=\"media-library--bulk-actions\"\n\t\t\t\t\tstrings={{\n\t\t\t\t\t\tlabel: strings.batchActionsLabel,\n\t\t\t\t\t\tsummary: (count) => formatMediaLibraryString(strings.footer.selectedCount, { count }),\n\t\t\t\t\t\tclear: strings.footer.clear,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{bulkSelectedCount > 0 && bulkActions?.({\n\t\t\t\t\t\tselectedItems: state.items.filter((item) => state.selectedSet.has(state.accessors.getId(item))),\n\t\t\t\t\t\tselectedIds: state.selectedIds,\n\t\t\t\t\t\tselectedCount: state.selectedIds.length,\n\t\t\t\t\t\tvisibleCount: state.filteredCount,\n\t\t\t\t\t\ttotalCount: state.totalCount,\n\t\t\t\t\t\tclearSelection: state.clearSelection,\n\t\t\t\t\t})}\n\t\t\t\t</BatchActionBar>\n\t\t\t)}\n\t\t</>\n\t);\n\n\t// Library and Upload are one tab set: the shell is its root, so the tabs in\n\t// the header and the panel under it share one roving focus and one state.\n\treturn allowUpload ? (\n\t\t<Tabs\n\t\t\tvalue={activeTab}\n\t\t\tonValueChange={(next) => state.setTab(next as MediaLibraryTab)}\n\t\t\trender={<section ref={sectionRef} {...props} />}\n\t\t\tclassName={cn('gap-0', shellClassName)}\n\t\t>\n\t\t\t{content}\n\t\t</Tabs>\n\t) : (\n\t\t<section ref={sectionRef} className={shellClassName} {...props}>\n\t\t\t{content}\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\t// The dialog is a picker, so it opens in selection mode.\n\t\t\t\t\tdefaultSelecting={props.defaultSelecting ?? true}\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 {compositionRhythm} from '../../base/structure/composition.recipes';\nimport { ArrowLeft, ArrowRight, File, ImagePlus, Lock, Play, Plus, Star, Trash2, X } from 'lucide-react';\n\nimport { ActionMenu, type ActionMenuAction } from '../../base/action-menu';\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';\nimport { uploadDropTargetRecipes } from '../../base/upload/upload.recipes';\nimport { interactionRecipes } from '../../../lib/interaction-recipes';\nimport { surfaceRecipes } from '../../../lib/surface-recipes';\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 canSetPrimary = !readOnly && Boolean(onPrimaryChange);\n\tconst canRemove = !readOnly && Boolean(onRemove);\n\tconst canReorder = !readOnly && Boolean(onReorder);\n\tconst hasItemActions = canSetPrimary || canRemove || canReorder;\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 (!canReorder || 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 ${uploadDropTargetRecipes.hover}`,\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',\n\t\t\t\tsurfaceRecipes.frame,\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\" type=\"inherit\" 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={compositionRhythm.commands} 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 tone=\"primary\" 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 = canReorder && index > 0;\n\t\t\t\t\t\tconst canMoveNext = canReorder && index < total - 1;\n\t\t\t\t\t\t// Every command names its asset, so repeated commands stay distinguishable.\n\t\t\t\t\t\tconst commandName = (template: string) => formatMediaLibraryString(template, { name });\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: () => { if (canSetPrimary) onPrimaryChange?.(id, item); },\n\t\t\t\t\t\t\tremove: () => { if (canRemove) 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\t// A field tile is too small for a command row, so cover and order live in its menu.\n\t\t\t\t\t\t\tconst fieldActions: ActionMenuAction[] = [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: 'cover',\n\t\t\t\t\t\t\t\t\tlabel: strings.gallery.setCoverAction ?? defaultMediaLibraryStrings.gallery.setCoverAction,\n\t\t\t\t\t\t\t\t\tvisible: canSetPrimary,\n\t\t\t\t\t\t\t\t\tdisabled: isPrimary,\n\t\t\t\t\t\t\t\t\tonClick: ctx.setPrimary,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: 'previous',\n\t\t\t\t\t\t\t\t\tlabel: strings.gallery.movePreviousAction ?? defaultMediaLibraryStrings.gallery.movePreviousAction,\n\t\t\t\t\t\t\t\t\tvisible: canReorder,\n\t\t\t\t\t\t\t\t\tdisabled: !canMovePrevious,\n\t\t\t\t\t\t\t\t\tonClick: ctx.movePrevious,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: 'next',\n\t\t\t\t\t\t\t\t\tlabel: strings.gallery.moveNextAction ?? defaultMediaLibraryStrings.gallery.moveNextAction,\n\t\t\t\t\t\t\t\t\tvisible: canReorder,\n\t\t\t\t\t\t\t\t\tdisabled: !canMoveNext,\n\t\t\t\t\t\t\t\t\tonClick: ctx.moveNext,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t];\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 text-foreground shadow-xs',\n\t\t\t\t\t\t\t\t\t\t// Its controls draw the shared focus indicator; the tile adds no second focus colour.\n\t\t\t\t\t\t\t\t\t\t`transition-colors ${interactionRecipes.tileHover}`,\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 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 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{hasItemActions && (\n\t\t\t\t\t\t\t\t\t\t// Revealed on hover and focus, kept while the menu is open, and always shown on touch.\n\t\t\t\t\t\t\t\t\t\t<div className=\"media-resource-gallery--tile-actions absolute right-2 top-2 flex items-center gap-space-xs opacity-0 transition-opacity group-hover/gallery:opacity-100 group-focus-within/gallery:opacity-100 has-[[aria-expanded=true]]:opacity-100 pointer-coarse:opacity-100\">\n\t\t\t\t\t\t\t\t\t\t\t{(canSetPrimary || canReorder) && (\n\t\t\t\t\t\t\t\t\t\t\t\t<ActionMenu\n\t\t\t\t\t\t\t\t\t\t\t\t\tsrText={commandName(strings.gallery.itemActions ?? defaultMediaLibraryStrings.gallery.itemActions ?? '')}\n\t\t\t\t\t\t\t\t\t\t\t\t\tactions={fieldActions}\n\t\t\t\t\t\t\t\t\t\t\t\t\tcontext=\"commands\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tbuttonProps={{ size: 'sm' }}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t{canRemove && (\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=\"solid\"\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=\"shadow-sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={commandName(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<X 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)}\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</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 text-foreground 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 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=\"secondary\">{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{/* A size the records do not carry is omitted, not announced as unknown. */}\n\t\t\t\t\t\t\t\t\t\t\t{accessors.getSize(item) !== undefined && <>\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<FileSize\n\t\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\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\t\t\t\talign=\"left\"\n\t\t\t\t\t\t\t\t\t\t\t\t\temptyLabel={strings.unknownSize}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</>}\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t{hasItemActions && (\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{canSetPrimary && <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={commandName(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{canReorder && <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={commandName(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{canReorder && <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={commandName(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{canRemove && <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={commandName(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 text-foreground shadow-xs transition-colors ${interactionRecipes.tileHover}`}\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{/* Whole images at their natural proportions, letterboxed in the tile. */}\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-contain\" />\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=\"secondary\" className=\"bg-card text-card-foreground\">{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{accessors.getSize(item) !== undefined && (\n\t\t\t\t\t\t\t\t\t\t\t\t<FileSize\n\t\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\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\t\t\t\talign=\"left\"\n\t\t\t\t\t\t\t\t\t\t\t\t\temptyLabel={strings.unknownSize}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t{hasItemActions && (\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{canSetPrimary && <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={commandName(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{canReorder && <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={commandName(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{canReorder && <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={commandName(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{canRemove && <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={commandName(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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"}