@alfakit/react 0.0.0-stage → 0.1.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 (1014) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +19 -2
  3. package/dist/app/components.d.ts +49 -0
  4. package/dist/app/components.d.ts.map +1 -0
  5. package/dist/app/components.js +99 -0
  6. package/dist/app/components.js.map +1 -0
  7. package/dist/app/hooks.d.ts +79 -0
  8. package/dist/app/hooks.d.ts.map +1 -0
  9. package/dist/app/hooks.js +239 -0
  10. package/dist/app/hooks.js.map +1 -0
  11. package/dist/components/actions/action-button.d.ts +17 -0
  12. package/dist/components/actions/action-button.d.ts.map +1 -0
  13. package/dist/components/actions/action-button.js +150 -0
  14. package/dist/components/actions/action-button.js.map +1 -0
  15. package/dist/components/actions/action-context.d.ts +11 -0
  16. package/dist/components/actions/action-context.d.ts.map +1 -0
  17. package/dist/components/actions/action-context.js +24 -0
  18. package/dist/components/actions/action-context.js.map +1 -0
  19. package/dist/components/actions/action-list.d.ts +20 -0
  20. package/dist/components/actions/action-list.d.ts.map +1 -0
  21. package/dist/components/actions/action-list.js +181 -0
  22. package/dist/components/actions/action-list.js.map +1 -0
  23. package/dist/components/actions/action-modals.d.ts +5 -0
  24. package/dist/components/actions/action-modals.d.ts.map +1 -0
  25. package/dist/components/actions/action-modals.js +362 -0
  26. package/dist/components/actions/action-modals.js.map +1 -0
  27. package/dist/components/actions/index.d.ts +5 -0
  28. package/dist/components/ai/copilot-panel.js +439 -0
  29. package/dist/components/ai/copilot-panel.js.map +1 -0
  30. package/dist/components/ai/copilot.d.ts +12 -0
  31. package/dist/components/ai/copilot.d.ts.map +1 -0
  32. package/dist/components/ai/copilot.js +66 -0
  33. package/dist/components/ai/copilot.js.map +1 -0
  34. package/dist/components/ai/index.d.ts +3 -0
  35. package/dist/components/ai/index.js +3 -0
  36. package/dist/components/ai/stream-lazy.d.ts +9 -0
  37. package/dist/components/ai/stream-lazy.d.ts.map +1 -0
  38. package/dist/components/ai/stream-lazy.js +13 -0
  39. package/dist/components/ai/stream-lazy.js.map +1 -0
  40. package/dist/components/ai/stream.js +85 -0
  41. package/dist/components/ai/stream.js.map +1 -0
  42. package/dist/components/analytics/alfakit-analytics.d.ts +14 -0
  43. package/dist/components/analytics/alfakit-analytics.d.ts.map +1 -0
  44. package/dist/components/analytics/alfakit-analytics.js +36 -0
  45. package/dist/components/analytics/alfakit-analytics.js.map +1 -0
  46. package/dist/components/analytics/breakdown.d.ts +11 -0
  47. package/dist/components/analytics/breakdown.d.ts.map +1 -0
  48. package/dist/components/analytics/breakdown.js +155 -0
  49. package/dist/components/analytics/breakdown.js.map +1 -0
  50. package/dist/components/analytics/index.d.ts +3 -0
  51. package/dist/components/cms/admin-bar.js +68 -0
  52. package/dist/components/cms/admin-bar.js.map +1 -0
  53. package/dist/components/cms/blocks.d.ts +41 -0
  54. package/dist/components/cms/blocks.d.ts.map +1 -0
  55. package/dist/components/cms/blocks.js +400 -0
  56. package/dist/components/cms/blocks.js.map +1 -0
  57. package/dist/components/cms/context.d.ts +24 -0
  58. package/dist/components/cms/context.d.ts.map +1 -0
  59. package/dist/components/cms/context.js +43 -0
  60. package/dist/components/cms/context.js.map +1 -0
  61. package/dist/components/cms/head.d.ts +11 -0
  62. package/dist/components/cms/head.d.ts.map +1 -0
  63. package/dist/components/cms/head.js +40 -0
  64. package/dist/components/cms/head.js.map +1 -0
  65. package/dist/components/cms/index.d.ts +8 -0
  66. package/dist/components/cms/index.js +8 -0
  67. package/dist/components/cms/live-preview-lazy.d.ts +9 -0
  68. package/dist/components/cms/live-preview-lazy.d.ts.map +1 -0
  69. package/dist/components/cms/live-preview-lazy.js +13 -0
  70. package/dist/components/cms/live-preview-lazy.js.map +1 -0
  71. package/dist/components/cms/live-preview.js +288 -0
  72. package/dist/components/cms/live-preview.js.map +1 -0
  73. package/dist/components/cms/menu.d.ts +24 -0
  74. package/dist/components/cms/menu.d.ts.map +1 -0
  75. package/dist/components/cms/menu.js +181 -0
  76. package/dist/components/cms/menu.js.map +1 -0
  77. package/dist/components/cms/page.d.ts +27 -0
  78. package/dist/components/cms/page.d.ts.map +1 -0
  79. package/dist/components/cms/page.js +180 -0
  80. package/dist/components/cms/page.js.map +1 -0
  81. package/dist/components/cms/parts.d.ts +24 -0
  82. package/dist/components/cms/parts.d.ts.map +1 -0
  83. package/dist/components/cms/parts.js +58 -0
  84. package/dist/components/cms/parts.js.map +1 -0
  85. package/dist/components/dev-tools/dev-tools-inspector.js +302 -0
  86. package/dist/components/dev-tools/dev-tools-inspector.js.map +1 -0
  87. package/dist/components/dev-tools/dev-tools-slot.js +24 -0
  88. package/dist/components/dev-tools/dev-tools-slot.js.map +1 -0
  89. package/dist/components/entries/code-entry.d.ts +8 -0
  90. package/dist/components/entries/code-entry.d.ts.map +1 -0
  91. package/dist/components/entries/code-entry.js +59 -0
  92. package/dist/components/entries/code-entry.js.map +1 -0
  93. package/dist/components/entries/entry-wrapper.d.ts +13 -0
  94. package/dist/components/entries/entry-wrapper.d.ts.map +1 -0
  95. package/dist/components/entries/entry-wrapper.js +175 -0
  96. package/dist/components/entries/entry-wrapper.js.map +1 -0
  97. package/dist/components/entries/index.d.ts +6 -0
  98. package/dist/components/entries/other-entries.d.ts +20 -0
  99. package/dist/components/entries/other-entries.d.ts.map +1 -0
  100. package/dist/components/entries/other-entries.js +169 -0
  101. package/dist/components/entries/other-entries.js.map +1 -0
  102. package/dist/components/entries/repeatable-entry-table.js +33 -0
  103. package/dist/components/entries/repeatable-entry-table.js.map +1 -0
  104. package/dist/components/entries/text-entry.d.ts +12 -0
  105. package/dist/components/entries/text-entry.d.ts.map +1 -0
  106. package/dist/components/entries/text-entry.js +181 -0
  107. package/dist/components/entries/text-entry.js.map +1 -0
  108. package/dist/components/entries/view-entry.d.ts +8 -0
  109. package/dist/components/entries/view-entry.d.ts.map +1 -0
  110. package/dist/components/entries/view-entry.js +26 -0
  111. package/dist/components/entries/view-entry.js.map +1 -0
  112. package/dist/components/fields/builder-picker.js +215 -0
  113. package/dist/components/fields/builder-picker.js.map +1 -0
  114. package/dist/components/fields/builder.d.ts +16 -0
  115. package/dist/components/fields/builder.d.ts.map +1 -0
  116. package/dist/components/fields/builder.js +351 -0
  117. package/dist/components/fields/builder.js.map +1 -0
  118. package/dist/components/fields/checkbox-list.d.ts +7 -0
  119. package/dist/components/fields/checkbox-list.d.ts.map +1 -0
  120. package/dist/components/fields/checkbox-list.js +133 -0
  121. package/dist/components/fields/checkbox-list.js.map +1 -0
  122. package/dist/components/fields/checkbox.d.ts +7 -0
  123. package/dist/components/fields/checkbox.d.ts.map +1 -0
  124. package/dist/components/fields/checkbox.js +29 -0
  125. package/dist/components/fields/checkbox.js.map +1 -0
  126. package/dist/components/fields/code-editor-lazy.d.ts +9 -0
  127. package/dist/components/fields/code-editor-lazy.d.ts.map +1 -0
  128. package/dist/components/fields/code-editor-lazy.js +31 -0
  129. package/dist/components/fields/code-editor-lazy.js.map +1 -0
  130. package/dist/components/fields/code-editor.js +107 -0
  131. package/dist/components/fields/code-editor.js.map +1 -0
  132. package/dist/components/fields/code-tokens.js +18 -0
  133. package/dist/components/fields/code-tokens.js.map +1 -0
  134. package/dist/components/fields/color-picker.d.ts +7 -0
  135. package/dist/components/fields/color-picker.d.ts.map +1 -0
  136. package/dist/components/fields/color-picker.js +70 -0
  137. package/dist/components/fields/color-picker.js.map +1 -0
  138. package/dist/components/fields/date-picker.d.ts +7 -0
  139. package/dist/components/fields/date-picker.d.ts.map +1 -0
  140. package/dist/components/fields/date-picker.js +230 -0
  141. package/dist/components/fields/date-picker.js.map +1 -0
  142. package/dist/components/fields/file-upload.d.ts +7 -0
  143. package/dist/components/fields/file-upload.d.ts.map +1 -0
  144. package/dist/components/fields/file-upload.js +397 -0
  145. package/dist/components/fields/file-upload.js.map +1 -0
  146. package/dist/components/fields/hidden.d.ts +7 -0
  147. package/dist/components/fields/hidden.d.ts.map +1 -0
  148. package/dist/components/fields/hidden.js +17 -0
  149. package/dist/components/fields/hidden.js.map +1 -0
  150. package/dist/components/fields/icon-picker-lazy.d.ts +9 -0
  151. package/dist/components/fields/icon-picker-lazy.d.ts.map +1 -0
  152. package/dist/components/fields/icon-picker-lazy.js +45 -0
  153. package/dist/components/fields/icon-picker-lazy.js.map +1 -0
  154. package/dist/components/fields/icon-picker-value.js +48 -0
  155. package/dist/components/fields/icon-picker-value.js.map +1 -0
  156. package/dist/components/fields/icon-picker.js +228 -0
  157. package/dist/components/fields/icon-picker.js.map +1 -0
  158. package/dist/components/fields/image-editor-dialog-lazy.js +18 -0
  159. package/dist/components/fields/image-editor-dialog-lazy.js.map +1 -0
  160. package/dist/components/fields/image-editor-dialog.js +328 -0
  161. package/dist/components/fields/image-editor-dialog.js.map +1 -0
  162. package/dist/components/fields/index.d.ts +24 -0
  163. package/dist/components/fields/item-actions.js +270 -0
  164. package/dist/components/fields/item-actions.js.map +1 -0
  165. package/dist/components/fields/key-value.d.ts +11 -0
  166. package/dist/components/fields/key-value.d.ts.map +1 -0
  167. package/dist/components/fields/key-value.js +194 -0
  168. package/dist/components/fields/key-value.js.map +1 -0
  169. package/dist/components/fields/lazy-fields.d.ts +13 -0
  170. package/dist/components/fields/lazy-fields.d.ts.map +1 -0
  171. package/dist/components/fields/lazy-fields.js +34 -0
  172. package/dist/components/fields/lazy-fields.js.map +1 -0
  173. package/dist/components/fields/modal-table-select.js +386 -0
  174. package/dist/components/fields/modal-table-select.js.map +1 -0
  175. package/dist/components/fields/money-input.d.ts +7 -0
  176. package/dist/components/fields/money-input.d.ts.map +1 -0
  177. package/dist/components/fields/money-input.js +91 -0
  178. package/dist/components/fields/money-input.js.map +1 -0
  179. package/dist/components/fields/one-time-code-input.d.ts +12 -0
  180. package/dist/components/fields/one-time-code-input.d.ts.map +1 -0
  181. package/dist/components/fields/one-time-code-input.js +53 -0
  182. package/dist/components/fields/one-time-code-input.js.map +1 -0
  183. package/dist/components/fields/query-builder-rules.js +295 -0
  184. package/dist/components/fields/query-builder-rules.js.map +1 -0
  185. package/dist/components/fields/radio.d.ts +7 -0
  186. package/dist/components/fields/radio.d.ts.map +1 -0
  187. package/dist/components/fields/radio.js +57 -0
  188. package/dist/components/fields/radio.js.map +1 -0
  189. package/dist/components/fields/repeater-table.js +111 -0
  190. package/dist/components/fields/repeater-table.js.map +1 -0
  191. package/dist/components/fields/repeater.d.ts +15 -0
  192. package/dist/components/fields/repeater.d.ts.map +1 -0
  193. package/dist/components/fields/repeater.js +209 -0
  194. package/dist/components/fields/repeater.js.map +1 -0
  195. package/dist/components/fields/rich-editor-extensions.js +295 -0
  196. package/dist/components/fields/rich-editor-extensions.js.map +1 -0
  197. package/dist/components/fields/rich-editor-lazy.d.ts +9 -0
  198. package/dist/components/fields/rich-editor-lazy.d.ts.map +1 -0
  199. package/dist/components/fields/rich-editor-lazy.js +24 -0
  200. package/dist/components/fields/rich-editor-lazy.js.map +1 -0
  201. package/dist/components/fields/rich-editor.js +517 -0
  202. package/dist/components/fields/rich-editor.js.map +1 -0
  203. package/dist/components/fields/select.d.ts +7 -0
  204. package/dist/components/fields/select.d.ts.map +1 -0
  205. package/dist/components/fields/select.js +455 -0
  206. package/dist/components/fields/select.js.map +1 -0
  207. package/dist/components/fields/slider.d.ts +12 -0
  208. package/dist/components/fields/slider.d.ts.map +1 -0
  209. package/dist/components/fields/slider.js +146 -0
  210. package/dist/components/fields/slider.js.map +1 -0
  211. package/dist/components/fields/tags-input.d.ts +7 -0
  212. package/dist/components/fields/tags-input.d.ts.map +1 -0
  213. package/dist/components/fields/tags-input.js +129 -0
  214. package/dist/components/fields/tags-input.js.map +1 -0
  215. package/dist/components/fields/text-input.d.ts +7 -0
  216. package/dist/components/fields/text-input.d.ts.map +1 -0
  217. package/dist/components/fields/text-input.js +135 -0
  218. package/dist/components/fields/text-input.js.map +1 -0
  219. package/dist/components/fields/textarea.d.ts +7 -0
  220. package/dist/components/fields/textarea.d.ts.map +1 -0
  221. package/dist/components/fields/textarea.js +37 -0
  222. package/dist/components/fields/textarea.js.map +1 -0
  223. package/dist/components/fields/toggle-buttons.d.ts +7 -0
  224. package/dist/components/fields/toggle-buttons.d.ts.map +1 -0
  225. package/dist/components/fields/toggle-buttons.js +84 -0
  226. package/dist/components/fields/toggle-buttons.js.map +1 -0
  227. package/dist/components/fields/toggle.d.ts +7 -0
  228. package/dist/components/fields/toggle.d.ts.map +1 -0
  229. package/dist/components/fields/toggle.js +39 -0
  230. package/dist/components/fields/toggle.js.map +1 -0
  231. package/dist/components/file-manager/file-manager-lazy.d.ts +10 -0
  232. package/dist/components/file-manager/file-manager-lazy.d.ts.map +1 -0
  233. package/dist/components/file-manager/file-manager-lazy.js +49 -0
  234. package/dist/components/file-manager/file-manager-lazy.js.map +1 -0
  235. package/dist/components/file-manager/file-manager.d.ts +1 -0
  236. package/dist/components/file-manager/file-manager.js +1387 -0
  237. package/dist/components/file-manager/file-manager.js.map +1 -0
  238. package/dist/components/file-manager/index.d.ts +3 -0
  239. package/dist/components/file-manager/picker-field.d.ts +12 -0
  240. package/dist/components/file-manager/picker-field.d.ts.map +1 -0
  241. package/dist/components/file-manager/picker-field.js +124 -0
  242. package/dist/components/file-manager/picker-field.js.map +1 -0
  243. package/dist/components/form/form-block.d.ts +12 -0
  244. package/dist/components/form/form-block.d.ts.map +1 -0
  245. package/dist/components/form/form-block.js +155 -0
  246. package/dist/components/form/form-block.js.map +1 -0
  247. package/dist/components/form/form-context.d.ts +27 -0
  248. package/dist/components/form/form-context.d.ts.map +1 -0
  249. package/dist/components/form/form-context.js +65 -0
  250. package/dist/components/form/form-context.js.map +1 -0
  251. package/dist/components/helpdesk/chat-panel.js +209 -0
  252. package/dist/components/helpdesk/chat-panel.js.map +1 -0
  253. package/dist/components/helpdesk/chat-widget.d.ts +23 -0
  254. package/dist/components/helpdesk/chat-widget.d.ts.map +1 -0
  255. package/dist/components/helpdesk/chat-widget.js +76 -0
  256. package/dist/components/helpdesk/chat-widget.js.map +1 -0
  257. package/dist/components/helpdesk/inbox-lazy.d.ts +9 -0
  258. package/dist/components/helpdesk/inbox-lazy.d.ts.map +1 -0
  259. package/dist/components/helpdesk/inbox-lazy.js +46 -0
  260. package/dist/components/helpdesk/inbox-lazy.js.map +1 -0
  261. package/dist/components/helpdesk/inbox.js +609 -0
  262. package/dist/components/helpdesk/inbox.js.map +1 -0
  263. package/dist/components/helpdesk/index.d.ts +3 -0
  264. package/dist/components/kanban/index.d.ts +2 -0
  265. package/dist/components/kanban/index.js +2 -0
  266. package/dist/components/kanban/kanban-lazy.d.ts +10 -0
  267. package/dist/components/kanban/kanban-lazy.d.ts.map +1 -0
  268. package/dist/components/kanban/kanban-lazy.js +31 -0
  269. package/dist/components/kanban/kanban-lazy.js.map +1 -0
  270. package/dist/components/kanban/kanban.js +591 -0
  271. package/dist/components/kanban/kanban.js.map +1 -0
  272. package/dist/components/layout/actions.js +40 -0
  273. package/dist/components/layout/actions.js.map +1 -0
  274. package/dist/components/layout/component-context.d.ts +13 -0
  275. package/dist/components/layout/component-context.d.ts.map +1 -0
  276. package/dist/components/layout/component-context.js +28 -0
  277. package/dist/components/layout/component-context.js.map +1 -0
  278. package/dist/components/layout/deferred.js +135 -0
  279. package/dist/components/layout/deferred.js.map +1 -0
  280. package/dist/components/layout/elements.d.ts +23 -0
  281. package/dist/components/layout/elements.d.ts.map +1 -0
  282. package/dist/components/layout/elements.js +183 -0
  283. package/dist/components/layout/elements.js.map +1 -0
  284. package/dist/components/layout/fieldset.d.ts +7 -0
  285. package/dist/components/layout/fieldset.d.ts.map +1 -0
  286. package/dist/components/layout/fieldset.js +29 -0
  287. package/dist/components/layout/fieldset.js.map +1 -0
  288. package/dist/components/layout/fused-group.d.ts +11 -0
  289. package/dist/components/layout/fused-group.d.ts.map +1 -0
  290. package/dist/components/layout/fused-group.js +64 -0
  291. package/dist/components/layout/fused-group.js.map +1 -0
  292. package/dist/components/layout/grid.d.ts +7 -0
  293. package/dist/components/layout/grid.d.ts.map +1 -0
  294. package/dist/components/layout/grid.js +20 -0
  295. package/dist/components/layout/grid.js.map +1 -0
  296. package/dist/components/layout/index.d.ts +12 -0
  297. package/dist/components/layout/mixed-content.d.ts +14 -0
  298. package/dist/components/layout/mixed-content.d.ts.map +1 -0
  299. package/dist/components/layout/mixed-content.js +44 -0
  300. package/dist/components/layout/mixed-content.js.map +1 -0
  301. package/dist/components/layout/prime.d.ts +17 -0
  302. package/dist/components/layout/prime.d.ts.map +1 -0
  303. package/dist/components/layout/prime.js +126 -0
  304. package/dist/components/layout/prime.js.map +1 -0
  305. package/dist/components/layout/schema-children.d.ts +18 -0
  306. package/dist/components/layout/schema-children.d.ts.map +1 -0
  307. package/dist/components/layout/schema-children.js +26 -0
  308. package/dist/components/layout/schema-children.js.map +1 -0
  309. package/dist/components/layout/section.d.ts +7 -0
  310. package/dist/components/layout/section.d.ts.map +1 -0
  311. package/dist/components/layout/section.js +133 -0
  312. package/dist/components/layout/section.js.map +1 -0
  313. package/dist/components/layout/tabs.d.ts +7 -0
  314. package/dist/components/layout/tabs.d.ts.map +1 -0
  315. package/dist/components/layout/tabs.js +83 -0
  316. package/dist/components/layout/tabs.js.map +1 -0
  317. package/dist/components/layout/wizard.d.ts +7 -0
  318. package/dist/components/layout/wizard.d.ts.map +1 -0
  319. package/dist/components/layout/wizard.js +172 -0
  320. package/dist/components/layout/wizard.js.map +1 -0
  321. package/dist/components/notifications/flash-toasts.d.ts +20 -0
  322. package/dist/components/notifications/flash-toasts.d.ts.map +1 -0
  323. package/dist/components/notifications/flash-toasts.js +121 -0
  324. package/dist/components/notifications/flash-toasts.js.map +1 -0
  325. package/dist/components/notifications/index.d.ts +5 -0
  326. package/dist/components/notifications/notifications-menu.d.ts +15 -0
  327. package/dist/components/notifications/notifications-menu.d.ts.map +1 -0
  328. package/dist/components/notifications/notifications-menu.js +201 -0
  329. package/dist/components/notifications/notifications-menu.js.map +1 -0
  330. package/dist/components/notifications/realtime-notifications.d.ts +9 -0
  331. package/dist/components/notifications/realtime-notifications.d.ts.map +1 -0
  332. package/dist/components/notifications/realtime-notifications.js +30 -0
  333. package/dist/components/notifications/realtime-notifications.js.map +1 -0
  334. package/dist/components/notifications/undo-button.d.ts +13 -0
  335. package/dist/components/notifications/undo-button.d.ts.map +1 -0
  336. package/dist/components/notifications/undo-button.js +54 -0
  337. package/dist/components/notifications/undo-button.js.map +1 -0
  338. package/dist/components/panel/app-sidebar.d.ts +7 -0
  339. package/dist/components/panel/app-sidebar.d.ts.map +1 -0
  340. package/dist/components/panel/app-sidebar.js +302 -0
  341. package/dist/components/panel/app-sidebar.js.map +1 -0
  342. package/dist/components/panel/bottom-nav.d.ts +9 -0
  343. package/dist/components/panel/bottom-nav.d.ts.map +1 -0
  344. package/dist/components/panel/bottom-nav.js +100 -0
  345. package/dist/components/panel/bottom-nav.js.map +1 -0
  346. package/dist/components/panel/debug-panel-slot.d.ts +8 -0
  347. package/dist/components/panel/debug-panel-slot.d.ts.map +1 -0
  348. package/dist/components/panel/debug-panel-slot.js +19 -0
  349. package/dist/components/panel/debug-panel-slot.js.map +1 -0
  350. package/dist/components/panel/debug-panel.d.ts +18 -0
  351. package/dist/components/panel/debug-panel.d.ts.map +1 -0
  352. package/dist/components/panel/debug-panel.js +423 -0
  353. package/dist/components/panel/debug-panel.js.map +1 -0
  354. package/dist/components/panel/global-search-palette.js +278 -0
  355. package/dist/components/panel/global-search-palette.js.map +1 -0
  356. package/dist/components/panel/global-search.d.ts +13 -0
  357. package/dist/components/panel/global-search.d.ts.map +1 -0
  358. package/dist/components/panel/global-search.js +114 -0
  359. package/dist/components/panel/global-search.js.map +1 -0
  360. package/dist/components/panel/impersonation-banner.d.ts +11 -0
  361. package/dist/components/panel/impersonation-banner.d.ts.map +1 -0
  362. package/dist/components/panel/impersonation-banner.js +52 -0
  363. package/dist/components/panel/impersonation-banner.js.map +1 -0
  364. package/dist/components/panel/index.d.ts +18 -0
  365. package/dist/components/panel/keyboard-shortcuts.d.ts +10 -0
  366. package/dist/components/panel/keyboard-shortcuts.d.ts.map +1 -0
  367. package/dist/components/panel/keyboard-shortcuts.js +107 -0
  368. package/dist/components/panel/keyboard-shortcuts.js.map +1 -0
  369. package/dist/components/panel/lazy-placeholder.d.ts +11 -0
  370. package/dist/components/panel/lazy-placeholder.d.ts.map +1 -0
  371. package/dist/components/panel/lazy-placeholder.js +35 -0
  372. package/dist/components/panel/lazy-placeholder.js.map +1 -0
  373. package/dist/components/panel/locale-switcher.d.ts +19 -0
  374. package/dist/components/panel/locale-switcher.d.ts.map +1 -0
  375. package/dist/components/panel/locale-switcher.js +113 -0
  376. package/dist/components/panel/locale-switcher.js.map +1 -0
  377. package/dist/components/panel/menu-item.js +65 -0
  378. package/dist/components/panel/menu-item.js.map +1 -0
  379. package/dist/components/panel/nav-label.js +29 -0
  380. package/dist/components/panel/nav-label.js.map +1 -0
  381. package/dist/components/panel/pwa.d.ts +13 -0
  382. package/dist/components/panel/pwa.d.ts.map +1 -0
  383. package/dist/components/panel/pwa.js +90 -0
  384. package/dist/components/panel/pwa.js.map +1 -0
  385. package/dist/components/panel/schema-contract-guard.js +44 -0
  386. package/dist/components/panel/schema-contract-guard.js.map +1 -0
  387. package/dist/components/panel/shortcut-keys.d.ts +11 -0
  388. package/dist/components/panel/shortcut-keys.d.ts.map +1 -0
  389. package/dist/components/panel/shortcut-keys.js +33 -0
  390. package/dist/components/panel/shortcut-keys.js.map +1 -0
  391. package/dist/components/panel/shortcuts-overlay.d.ts +13 -0
  392. package/dist/components/panel/shortcuts-overlay.d.ts.map +1 -0
  393. package/dist/components/panel/shortcuts-overlay.js +159 -0
  394. package/dist/components/panel/shortcuts-overlay.js.map +1 -0
  395. package/dist/components/panel/slot.d.ts +18 -0
  396. package/dist/components/panel/slot.d.ts.map +1 -0
  397. package/dist/components/panel/slot.js +31 -0
  398. package/dist/components/panel/slot.js.map +1 -0
  399. package/dist/components/panel/sub-navigation.js +125 -0
  400. package/dist/components/panel/sub-navigation.js.map +1 -0
  401. package/dist/components/panel/tenant-menu.d.ts +10 -0
  402. package/dist/components/panel/tenant-menu.d.ts.map +1 -0
  403. package/dist/components/panel/tenant-menu.js +196 -0
  404. package/dist/components/panel/tenant-menu.js.map +1 -0
  405. package/dist/components/panel/theme-toggle.d.ts +4 -0
  406. package/dist/components/panel/theme-toggle.d.ts.map +1 -0
  407. package/dist/components/panel/theme-toggle.js +84 -0
  408. package/dist/components/panel/theme-toggle.js.map +1 -0
  409. package/dist/components/panel/topbar.d.ts +10 -0
  410. package/dist/components/panel/topbar.d.ts.map +1 -0
  411. package/dist/components/panel/topbar.js +74 -0
  412. package/dist/components/panel/topbar.js.map +1 -0
  413. package/dist/components/panel/user-menu.d.ts +16 -0
  414. package/dist/components/panel/user-menu.d.ts.map +1 -0
  415. package/dist/components/panel/user-menu.js +151 -0
  416. package/dist/components/panel/user-menu.js.map +1 -0
  417. package/dist/components/realtime/conflict-banner.d.ts +13 -0
  418. package/dist/components/realtime/conflict-banner.d.ts.map +1 -0
  419. package/dist/components/realtime/conflict-banner.js +193 -0
  420. package/dist/components/realtime/conflict-banner.js.map +1 -0
  421. package/dist/components/realtime/index.d.ts +4 -0
  422. package/dist/components/realtime/index.js +4 -0
  423. package/dist/components/realtime/live-records-pill.d.ts +19 -0
  424. package/dist/components/realtime/live-records-pill.d.ts.map +1 -0
  425. package/dist/components/realtime/live-records-pill.js +57 -0
  426. package/dist/components/realtime/live-records-pill.js.map +1 -0
  427. package/dist/components/realtime/record-presence.d.ts +12 -0
  428. package/dist/components/realtime/record-presence.d.ts.map +1 -0
  429. package/dist/components/realtime/record-presence.js +79 -0
  430. package/dist/components/realtime/record-presence.js.map +1 -0
  431. package/dist/components/schema/content-slot.js +49 -0
  432. package/dist/components/schema/content-slot.js.map +1 -0
  433. package/dist/components/schema/field-actions.js +72 -0
  434. package/dist/components/schema/field-actions.js.map +1 -0
  435. package/dist/components/schema/field-wrapper.d.ts +20 -0
  436. package/dist/components/schema/field-wrapper.d.ts.map +1 -0
  437. package/dist/components/schema/field-wrapper.js +210 -0
  438. package/dist/components/schema/field-wrapper.js.map +1 -0
  439. package/dist/components/schema/fused-group-context.js +14 -0
  440. package/dist/components/schema/fused-group-context.js.map +1 -0
  441. package/dist/components/schema/schema-renderer.d.ts +23 -0
  442. package/dist/components/schema/schema-renderer.d.ts.map +1 -0
  443. package/dist/components/schema/schema-renderer.js +77 -0
  444. package/dist/components/schema/schema-renderer.js.map +1 -0
  445. package/dist/components/schema/translatable-field.js +76 -0
  446. package/dist/components/schema/translatable-field.js.map +1 -0
  447. package/dist/components/schema/virtual-spacer.js +23 -0
  448. package/dist/components/schema/virtual-spacer.js.map +1 -0
  449. package/dist/components/table/cells.d.ts +12 -0
  450. package/dist/components/table/cells.d.ts.map +1 -0
  451. package/dist/components/table/cells.js +472 -0
  452. package/dist/components/table/cells.js.map +1 -0
  453. package/dist/components/table/column-manager.d.ts +17 -0
  454. package/dist/components/table/column-manager.d.ts.map +1 -0
  455. package/dist/components/table/column-manager.js +338 -0
  456. package/dist/components/table/column-manager.js.map +1 -0
  457. package/dist/components/table/content-layout.d.ts +30 -0
  458. package/dist/components/table/content-layout.d.ts.map +1 -0
  459. package/dist/components/table/content-layout.js +224 -0
  460. package/dist/components/table/content-layout.js.map +1 -0
  461. package/dist/components/table/filters.d.ts +15 -0
  462. package/dist/components/table/filters.d.ts.map +1 -0
  463. package/dist/components/table/filters.js +300 -0
  464. package/dist/components/table/filters.js.map +1 -0
  465. package/dist/components/table/grouping.js +194 -0
  466. package/dist/components/table/grouping.js.map +1 -0
  467. package/dist/components/table/index.d.ts +10 -0
  468. package/dist/components/table/list-tabs.js +105 -0
  469. package/dist/components/table/list-tabs.js.map +1 -0
  470. package/dist/components/table/pagination.d.ts +7 -0
  471. package/dist/components/table/pagination.d.ts.map +1 -0
  472. package/dist/components/table/pagination.js +255 -0
  473. package/dist/components/table/pagination.js.map +1 -0
  474. package/dist/components/table/record-cell.d.ts +25 -0
  475. package/dist/components/table/record-cell.d.ts.map +1 -0
  476. package/dist/components/table/record-cell.js +86 -0
  477. package/dist/components/table/record-cell.js.map +1 -0
  478. package/dist/components/table/spreadsheet-lazy.d.ts +7 -0
  479. package/dist/components/table/spreadsheet-lazy.d.ts.map +1 -0
  480. package/dist/components/table/spreadsheet-lazy.js +15 -0
  481. package/dist/components/table/spreadsheet-lazy.js.map +1 -0
  482. package/dist/components/table/spreadsheet.d.ts +11 -0
  483. package/dist/components/table/spreadsheet.d.ts.map +1 -0
  484. package/dist/components/table/spreadsheet.js +420 -0
  485. package/dist/components/table/spreadsheet.js.map +1 -0
  486. package/dist/components/table/summary-rows.js +104 -0
  487. package/dist/components/table/summary-rows.js.map +1 -0
  488. package/dist/components/table/table-block.d.ts +12 -0
  489. package/dist/components/table/table-block.d.ts.map +1 -0
  490. package/dist/components/table/table-block.js +875 -0
  491. package/dist/components/table/table-block.js.map +1 -0
  492. package/dist/components/table/table-views.d.ts +15 -0
  493. package/dist/components/table/table-views.d.ts.map +1 -0
  494. package/dist/components/table/table-views.js +376 -0
  495. package/dist/components/table/table-views.js.map +1 -0
  496. package/dist/components/table/trigger-button.js +44 -0
  497. package/dist/components/table/trigger-button.js.map +1 -0
  498. package/dist/components/translation-manager/index.d.ts +2 -0
  499. package/dist/components/translation-manager/index.js +2 -0
  500. package/dist/components/translation-manager/translation-manager-lazy.d.ts +9 -0
  501. package/dist/components/translation-manager/translation-manager-lazy.d.ts.map +1 -0
  502. package/dist/components/translation-manager/translation-manager-lazy.js +24 -0
  503. package/dist/components/translation-manager/translation-manager-lazy.js.map +1 -0
  504. package/dist/components/translation-manager/translation-manager.js +719 -0
  505. package/dist/components/translation-manager/translation-manager.js.map +1 -0
  506. package/dist/components/tree/index.d.ts +2 -0
  507. package/dist/components/tree/index.js +2 -0
  508. package/dist/components/tree/tree-lazy.d.ts +10 -0
  509. package/dist/components/tree/tree-lazy.d.ts.map +1 -0
  510. package/dist/components/tree/tree-lazy.js +24 -0
  511. package/dist/components/tree/tree-lazy.js.map +1 -0
  512. package/dist/components/tree/tree.js +291 -0
  513. package/dist/components/tree/tree.js.map +1 -0
  514. package/dist/components/ui/alert.d.ts +12 -0
  515. package/dist/components/ui/alert.d.ts.map +1 -0
  516. package/dist/components/ui/alert.js +37 -0
  517. package/dist/components/ui/alert.js.map +1 -0
  518. package/dist/components/ui/avatar.d.ts +9 -0
  519. package/dist/components/ui/avatar.d.ts.map +1 -0
  520. package/dist/components/ui/avatar.js +29 -0
  521. package/dist/components/ui/avatar.js.map +1 -0
  522. package/dist/components/ui/badge.d.ts +12 -0
  523. package/dist/components/ui/badge.d.ts.map +1 -0
  524. package/dist/components/ui/badge.js +26 -0
  525. package/dist/components/ui/badge.js.map +1 -0
  526. package/dist/components/ui/breadcrumb.d.ts +14 -0
  527. package/dist/components/ui/breadcrumb.d.ts.map +1 -0
  528. package/dist/components/ui/breadcrumb.js +79 -0
  529. package/dist/components/ui/breadcrumb.js.map +1 -0
  530. package/dist/components/ui/button.d.ts +13 -0
  531. package/dist/components/ui/button.d.ts.map +1 -0
  532. package/dist/components/ui/button.js +47 -0
  533. package/dist/components/ui/button.js.map +1 -0
  534. package/dist/components/ui/calendar.d.ts +7 -0
  535. package/dist/components/ui/calendar.d.ts.map +1 -0
  536. package/dist/components/ui/calendar.js +48 -0
  537. package/dist/components/ui/calendar.js.map +1 -0
  538. package/dist/components/ui/card.d.ts +12 -0
  539. package/dist/components/ui/card.d.ts.map +1 -0
  540. package/dist/components/ui/card.js +56 -0
  541. package/dist/components/ui/card.js.map +1 -0
  542. package/dist/components/ui/checkbox.d.ts +7 -0
  543. package/dist/components/ui/checkbox.d.ts.map +1 -0
  544. package/dist/components/ui/checkbox.js +21 -0
  545. package/dist/components/ui/checkbox.js.map +1 -0
  546. package/dist/components/ui/collapsible.d.ts +9 -0
  547. package/dist/components/ui/collapsible.d.ts.map +1 -0
  548. package/dist/components/ui/collapsible.js +25 -0
  549. package/dist/components/ui/collapsible.js.map +1 -0
  550. package/dist/components/ui/command.d.ts +23 -0
  551. package/dist/components/ui/command.d.ts.map +1 -0
  552. package/dist/components/ui/command.js +89 -0
  553. package/dist/components/ui/command.js.map +1 -0
  554. package/dist/components/ui/dialog.d.ts +18 -0
  555. package/dist/components/ui/dialog.d.ts.map +1 -0
  556. package/dist/components/ui/dialog.js +92 -0
  557. package/dist/components/ui/dialog.js.map +1 -0
  558. package/dist/components/ui/dropdown-menu.d.ts +28 -0
  559. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  560. package/dist/components/ui/dropdown-menu.js +123 -0
  561. package/dist/components/ui/dropdown-menu.js.map +1 -0
  562. package/dist/components/ui/input.d.ts +6 -0
  563. package/dist/components/ui/input.d.ts.map +1 -0
  564. package/dist/components/ui/input.js +15 -0
  565. package/dist/components/ui/input.js.map +1 -0
  566. package/dist/components/ui/label.d.ts +7 -0
  567. package/dist/components/ui/label.d.ts.map +1 -0
  568. package/dist/components/ui/label.js +15 -0
  569. package/dist/components/ui/label.js.map +1 -0
  570. package/dist/components/ui/popover.d.ts +10 -0
  571. package/dist/components/ui/popover.d.ts.map +1 -0
  572. package/dist/components/ui/popover.js +35 -0
  573. package/dist/components/ui/popover.js.map +1 -0
  574. package/dist/components/ui/radio-group.d.ts +8 -0
  575. package/dist/components/ui/radio-group.d.ts.map +1 -0
  576. package/dist/components/ui/radio-group.js +28 -0
  577. package/dist/components/ui/radio-group.js.map +1 -0
  578. package/dist/components/ui/scroll-area.d.ts +8 -0
  579. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  580. package/dist/components/ui/scroll-area.js +36 -0
  581. package/dist/components/ui/scroll-area.js.map +1 -0
  582. package/dist/components/ui/select.d.ts +18 -0
  583. package/dist/components/ui/select.d.ts.map +1 -0
  584. package/dist/components/ui/select.js +96 -0
  585. package/dist/components/ui/select.js.map +1 -0
  586. package/dist/components/ui/separator.d.ts +7 -0
  587. package/dist/components/ui/separator.d.ts.map +1 -0
  588. package/dist/components/ui/separator.js +17 -0
  589. package/dist/components/ui/separator.js.map +1 -0
  590. package/dist/components/ui/sheet.d.ts +17 -0
  591. package/dist/components/ui/sheet.d.ts.map +1 -0
  592. package/dist/components/ui/sheet.js +89 -0
  593. package/dist/components/ui/sheet.js.map +1 -0
  594. package/dist/components/ui/sidebar.d.ts +72 -0
  595. package/dist/components/ui/sidebar.d.ts.map +1 -0
  596. package/dist/components/ui/sidebar.js +376 -0
  597. package/dist/components/ui/sidebar.js.map +1 -0
  598. package/dist/components/ui/skeleton.d.ts +6 -0
  599. package/dist/components/ui/skeleton.d.ts.map +1 -0
  600. package/dist/components/ui/skeleton.js +14 -0
  601. package/dist/components/ui/skeleton.js.map +1 -0
  602. package/dist/components/ui/sonner.d.ts +6 -0
  603. package/dist/components/ui/sonner.d.ts.map +1 -0
  604. package/dist/components/ui/sonner.js +34 -0
  605. package/dist/components/ui/sonner.js.map +1 -0
  606. package/dist/components/ui/spinner.d.ts +10 -0
  607. package/dist/components/ui/spinner.d.ts.map +1 -0
  608. package/dist/components/ui/spinner.js +30 -0
  609. package/dist/components/ui/spinner.js.map +1 -0
  610. package/dist/components/ui/switch.d.ts +7 -0
  611. package/dist/components/ui/switch.d.ts.map +1 -0
  612. package/dist/components/ui/switch.js +19 -0
  613. package/dist/components/ui/switch.js.map +1 -0
  614. package/dist/components/ui/table.d.ts +13 -0
  615. package/dist/components/ui/table.d.ts.map +1 -0
  616. package/dist/components/ui/table.js +67 -0
  617. package/dist/components/ui/table.js.map +1 -0
  618. package/dist/components/ui/tabs.d.ts +10 -0
  619. package/dist/components/ui/tabs.d.ts.map +1 -0
  620. package/dist/components/ui/tabs.js +36 -0
  621. package/dist/components/ui/tabs.js.map +1 -0
  622. package/dist/components/ui/textarea.d.ts +6 -0
  623. package/dist/components/ui/textarea.d.ts.map +1 -0
  624. package/dist/components/ui/textarea.js +14 -0
  625. package/dist/components/ui/textarea.js.map +1 -0
  626. package/dist/components/ui/tooltip.d.ts +10 -0
  627. package/dist/components/ui/tooltip.d.ts.map +1 -0
  628. package/dist/components/ui/tooltip.js +36 -0
  629. package/dist/components/ui/tooltip.js.map +1 -0
  630. package/dist/components/versions/record-versions.d.ts +12 -0
  631. package/dist/components/versions/record-versions.d.ts.map +1 -0
  632. package/dist/components/versions/record-versions.js +138 -0
  633. package/dist/components/versions/record-versions.js.map +1 -0
  634. package/dist/components/widgets/calendar-lazy.d.ts +9 -0
  635. package/dist/components/widgets/calendar-lazy.d.ts.map +1 -0
  636. package/dist/components/widgets/calendar-lazy.js +47 -0
  637. package/dist/components/widgets/calendar-lazy.js.map +1 -0
  638. package/dist/components/widgets/calendar.js +122 -0
  639. package/dist/components/widgets/calendar.js.map +1 -0
  640. package/dist/components/widgets/chart-filters.js +101 -0
  641. package/dist/components/widgets/chart-filters.js.map +1 -0
  642. package/dist/components/widgets/chart-lazy.d.ts +9 -0
  643. package/dist/components/widgets/chart-lazy.d.ts.map +1 -0
  644. package/dist/components/widgets/chart-lazy.js +27 -0
  645. package/dist/components/widgets/chart-lazy.js.map +1 -0
  646. package/dist/components/widgets/chart.js +216 -0
  647. package/dist/components/widgets/chart.js.map +1 -0
  648. package/dist/components/widgets/dashboard-customizer.d.ts +15 -0
  649. package/dist/components/widgets/dashboard-customizer.d.ts.map +1 -0
  650. package/dist/components/widgets/dashboard-customizer.js +219 -0
  651. package/dist/components/widgets/dashboard-customizer.js.map +1 -0
  652. package/dist/components/widgets/index.d.ts +6 -0
  653. package/dist/components/widgets/stats-overview.d.ts +7 -0
  654. package/dist/components/widgets/stats-overview.d.ts.map +1 -0
  655. package/dist/components/widgets/stats-overview.js +133 -0
  656. package/dist/components/widgets/stats-overview.js.map +1 -0
  657. package/dist/components/widgets/widgets-block.d.ts +10 -0
  658. package/dist/components/widgets/widgets-block.d.ts.map +1 -0
  659. package/dist/components/widgets/widgets-block.js +72 -0
  660. package/dist/components/widgets/widgets-block.js.map +1 -0
  661. package/dist/context.d.ts +55 -0
  662. package/dist/context.d.ts.map +1 -0
  663. package/dist/context.js +115 -0
  664. package/dist/context.js.map +1 -0
  665. package/dist/create-alfakit.d.ts +25 -0
  666. package/dist/create-alfakit.d.ts.map +1 -0
  667. package/dist/create-alfakit.js +182 -0
  668. package/dist/create-alfakit.js.map +1 -0
  669. package/dist/eject-manifest.json +1128 -0
  670. package/dist/hooks/use-hydrated.d.ts +9 -0
  671. package/dist/hooks/use-hydrated.d.ts.map +1 -0
  672. package/dist/hooks/use-hydrated.js +15 -0
  673. package/dist/hooks/use-hydrated.js.map +1 -0
  674. package/dist/hooks/use-mobile.d.ts +8 -0
  675. package/dist/hooks/use-mobile.d.ts.map +1 -0
  676. package/dist/hooks/use-mobile.js +21 -0
  677. package/dist/hooks/use-mobile.js.map +1 -0
  678. package/dist/hooks/use-store.d.ts +7 -0
  679. package/dist/hooks/use-store.d.ts.map +1 -0
  680. package/dist/hooks/use-store.js +13 -0
  681. package/dist/hooks/use-store.js.map +1 -0
  682. package/dist/hooks/use-virtual-list.d.ts +29 -0
  683. package/dist/hooks/use-virtual-list.d.ts.map +1 -0
  684. package/dist/hooks/use-virtual-list.js +73 -0
  685. package/dist/hooks/use-virtual-list.js.map +1 -0
  686. package/dist/index.d.ts +180 -0
  687. package/dist/index.js +161 -0
  688. package/dist/layouts/app-layout.d.ts +11 -0
  689. package/dist/layouts/app-layout.d.ts.map +1 -0
  690. package/dist/layouts/app-layout.js +104 -0
  691. package/dist/layouts/app-layout.js.map +1 -0
  692. package/dist/layouts/auth-layout.d.ts +11 -0
  693. package/dist/layouts/auth-layout.d.ts.map +1 -0
  694. package/dist/layouts/auth-layout.js +65 -0
  695. package/dist/layouts/auth-layout.js.map +1 -0
  696. package/dist/layouts/blank-layout.d.ts +7 -0
  697. package/dist/layouts/blank-layout.d.ts.map +1 -0
  698. package/dist/layouts/blank-layout.js +12 -0
  699. package/dist/layouts/blank-layout.js.map +1 -0
  700. package/dist/layouts/fullscreen-layout.d.ts +16 -0
  701. package/dist/layouts/fullscreen-layout.d.ts.map +1 -0
  702. package/dist/layouts/fullscreen-layout.js +107 -0
  703. package/dist/layouts/fullscreen-layout.js.map +1 -0
  704. package/dist/layouts/top-nav-layout.d.ts +15 -0
  705. package/dist/layouts/top-nav-layout.d.ts.map +1 -0
  706. package/dist/layouts/top-nav-layout.js +223 -0
  707. package/dist/layouts/top-nav-layout.js.map +1 -0
  708. package/dist/lib/attributes.d.ts +12 -0
  709. package/dist/lib/attributes.d.ts.map +1 -0
  710. package/dist/lib/attributes.js +55 -0
  711. package/dist/lib/attributes.js.map +1 -0
  712. package/dist/lib/colors.d.ts +23 -0
  713. package/dist/lib/colors.d.ts.map +1 -0
  714. package/dist/lib/colors.js +126 -0
  715. package/dist/lib/colors.js.map +1 -0
  716. package/dist/lib/discovery.d.ts +22 -0
  717. package/dist/lib/discovery.d.ts.map +1 -0
  718. package/dist/lib/discovery.js +45 -0
  719. package/dist/lib/discovery.js.map +1 -0
  720. package/dist/lib/icons.d.ts +24 -0
  721. package/dist/lib/icons.d.ts.map +1 -0
  722. package/dist/lib/icons.js +93 -0
  723. package/dist/lib/icons.js.map +1 -0
  724. package/dist/lib/lazy.d.ts +8 -0
  725. package/dist/lib/lazy.d.ts.map +1 -0
  726. package/dist/lib/lazy.js +47 -0
  727. package/dist/lib/lazy.js.map +1 -0
  728. package/dist/lib/new-tab-hint.js +15 -0
  729. package/dist/lib/new-tab-hint.js.map +1 -0
  730. package/dist/lib/utils.d.ts +5 -0
  731. package/dist/lib/utils.d.ts.map +1 -0
  732. package/dist/lib/utils.js +10 -0
  733. package/dist/lib/utils.js.map +1 -0
  734. package/dist/pages/page.d.ts +23 -0
  735. package/dist/pages/page.d.ts.map +1 -0
  736. package/dist/pages/page.js +328 -0
  737. package/dist/pages/page.js.map +1 -0
  738. package/dist/registry.d.ts +7 -0
  739. package/dist/registry.d.ts.map +1 -0
  740. package/dist/registry.js +113 -0
  741. package/dist/registry.js.map +1 -0
  742. package/dist/server.d.ts +28 -0
  743. package/dist/server.d.ts.map +1 -0
  744. package/dist/server.js +38 -0
  745. package/dist/server.js.map +1 -0
  746. package/dist/standalone/alfakit-component.d.ts +30 -0
  747. package/dist/standalone/alfakit-component.d.ts.map +1 -0
  748. package/dist/standalone/alfakit-component.js +156 -0
  749. package/dist/standalone/alfakit-component.js.map +1 -0
  750. package/dist/standalone/alfakit-toaster.d.ts +26 -0
  751. package/dist/standalone/alfakit-toaster.d.ts.map +1 -0
  752. package/dist/standalone/alfakit-toaster.js +38 -0
  753. package/dist/standalone/alfakit-toaster.js.map +1 -0
  754. package/dist/standalone/configure.d.ts +14 -0
  755. package/dist/standalone/configure.d.ts.map +1 -0
  756. package/dist/standalone/configure.js +27 -0
  757. package/dist/standalone/configure.js.map +1 -0
  758. package/dist/standalone/index.d.ts +4 -0
  759. package/dist/standalone/runtime.js +94 -0
  760. package/dist/standalone/runtime.js.map +1 -0
  761. package/dist/standalone.css +150 -0
  762. package/dist/starter-kit/index.d.ts +4 -0
  763. package/dist/starter-kit/index.js +4 -0
  764. package/dist/starter-kit/navigation.d.ts +20 -0
  765. package/dist/starter-kit/navigation.d.ts.map +1 -0
  766. package/dist/starter-kit/navigation.js +25 -0
  767. package/dist/starter-kit/navigation.js.map +1 -0
  768. package/dist/starter-kit/starter-kit.d.ts +56 -0
  769. package/dist/starter-kit/starter-kit.d.ts.map +1 -0
  770. package/dist/starter-kit/starter-kit.js +120 -0
  771. package/dist/starter-kit/starter-kit.js.map +1 -0
  772. package/dist/starter-kit/widgets-loaded.js +172 -0
  773. package/dist/starter-kit/widgets-loaded.js.map +1 -0
  774. package/dist/starter-kit/widgets-triggers.js +90 -0
  775. package/dist/starter-kit/widgets-triggers.js.map +1 -0
  776. package/dist/starter-kit/widgets.d.ts +38 -0
  777. package/dist/starter-kit/widgets.d.ts.map +1 -0
  778. package/dist/starter-kit/widgets.js +64 -0
  779. package/dist/starter-kit/widgets.js.map +1 -0
  780. package/dist/styles.css +305 -0
  781. package/dist/themes.css +1340 -0
  782. package/package.json +128 -3
  783. package/src/app/components.tsx +104 -0
  784. package/src/app/hooks.ts +365 -0
  785. package/src/components/actions/action-button.tsx +254 -0
  786. package/src/components/actions/action-context.tsx +23 -0
  787. package/src/components/actions/action-list.tsx +356 -0
  788. package/src/components/actions/action-modals.tsx +479 -0
  789. package/src/components/actions/index.ts +4 -0
  790. package/src/components/ai/copilot-panel.tsx +517 -0
  791. package/src/components/ai/copilot.tsx +82 -0
  792. package/src/components/ai/index.ts +2 -0
  793. package/src/components/ai/stream-lazy.tsx +8 -0
  794. package/src/components/ai/stream.tsx +100 -0
  795. package/src/components/analytics/alfakit-analytics.tsx +27 -0
  796. package/src/components/analytics/breakdown.tsx +150 -0
  797. package/src/components/analytics/index.ts +2 -0
  798. package/src/components/cms/admin-bar.tsx +66 -0
  799. package/src/components/cms/blocks.tsx +474 -0
  800. package/src/components/cms/context.tsx +57 -0
  801. package/src/components/cms/head.tsx +47 -0
  802. package/src/components/cms/index.ts +23 -0
  803. package/src/components/cms/live-preview-lazy.tsx +8 -0
  804. package/src/components/cms/live-preview.tsx +339 -0
  805. package/src/components/cms/menu.tsx +246 -0
  806. package/src/components/cms/page.tsx +219 -0
  807. package/src/components/cms/parts.tsx +84 -0
  808. package/src/components/dev-tools/dev-tools-inspector.tsx +374 -0
  809. package/src/components/dev-tools/dev-tools-slot.tsx +28 -0
  810. package/src/components/entries/code-entry.tsx +73 -0
  811. package/src/components/entries/entry-wrapper.tsx +171 -0
  812. package/src/components/entries/index.ts +11 -0
  813. package/src/components/entries/other-entries.tsx +235 -0
  814. package/src/components/entries/repeatable-entry-table.tsx +50 -0
  815. package/src/components/entries/text-entry.tsx +264 -0
  816. package/src/components/entries/view-entry.tsx +27 -0
  817. package/src/components/fields/builder-picker.tsx +323 -0
  818. package/src/components/fields/builder.tsx +537 -0
  819. package/src/components/fields/checkbox-list.tsx +181 -0
  820. package/src/components/fields/checkbox.tsx +26 -0
  821. package/src/components/fields/code-editor-lazy.tsx +33 -0
  822. package/src/components/fields/code-editor.tsx +157 -0
  823. package/src/components/fields/code-tokens.ts +15 -0
  824. package/src/components/fields/color-picker.tsx +72 -0
  825. package/src/components/fields/date-picker.tsx +336 -0
  826. package/src/components/fields/file-upload.tsx +643 -0
  827. package/src/components/fields/hidden.tsx +8 -0
  828. package/src/components/fields/icon-picker-lazy.tsx +44 -0
  829. package/src/components/fields/icon-picker-value.tsx +46 -0
  830. package/src/components/fields/icon-picker.tsx +293 -0
  831. package/src/components/fields/image-editor-dialog-lazy.tsx +22 -0
  832. package/src/components/fields/image-editor-dialog.tsx +431 -0
  833. package/src/components/fields/index.ts +23 -0
  834. package/src/components/fields/item-actions.tsx +381 -0
  835. package/src/components/fields/key-value.tsx +218 -0
  836. package/src/components/fields/lazy-fields.tsx +30 -0
  837. package/src/components/fields/modal-table-select.tsx +519 -0
  838. package/src/components/fields/money-input.tsx +132 -0
  839. package/src/components/fields/one-time-code-input.tsx +56 -0
  840. package/src/components/fields/query-builder-rules.tsx +444 -0
  841. package/src/components/fields/radio.tsx +67 -0
  842. package/src/components/fields/repeater-table.tsx +185 -0
  843. package/src/components/fields/repeater.tsx +317 -0
  844. package/src/components/fields/rich-editor-extensions.tsx +470 -0
  845. package/src/components/fields/rich-editor-lazy.tsx +21 -0
  846. package/src/components/fields/rich-editor.tsx +815 -0
  847. package/src/components/fields/select.tsx +667 -0
  848. package/src/components/fields/slider.tsx +262 -0
  849. package/src/components/fields/tags-input.tsx +176 -0
  850. package/src/components/fields/text-input.tsx +179 -0
  851. package/src/components/fields/textarea.tsx +37 -0
  852. package/src/components/fields/toggle-buttons.tsx +125 -0
  853. package/src/components/fields/toggle.tsx +50 -0
  854. package/src/components/file-manager/file-manager-lazy.tsx +52 -0
  855. package/src/components/file-manager/file-manager.tsx +1857 -0
  856. package/src/components/file-manager/index.ts +2 -0
  857. package/src/components/file-manager/picker-field.tsx +169 -0
  858. package/src/components/form/form-block.tsx +237 -0
  859. package/src/components/form/form-context.tsx +95 -0
  860. package/src/components/helpdesk/chat-panel.tsx +247 -0
  861. package/src/components/helpdesk/chat-widget.tsx +107 -0
  862. package/src/components/helpdesk/inbox-lazy.tsx +42 -0
  863. package/src/components/helpdesk/inbox.tsx +745 -0
  864. package/src/components/helpdesk/index.ts +2 -0
  865. package/src/components/kanban/index.ts +1 -0
  866. package/src/components/kanban/kanban-lazy.tsx +34 -0
  867. package/src/components/kanban/kanban.tsx +788 -0
  868. package/src/components/layout/actions.tsx +48 -0
  869. package/src/components/layout/component-context.ts +31 -0
  870. package/src/components/layout/deferred.tsx +156 -0
  871. package/src/components/layout/elements.tsx +259 -0
  872. package/src/components/layout/fieldset.tsx +35 -0
  873. package/src/components/layout/fused-group.tsx +96 -0
  874. package/src/components/layout/grid.tsx +19 -0
  875. package/src/components/layout/index.ts +18 -0
  876. package/src/components/layout/mixed-content.tsx +59 -0
  877. package/src/components/layout/prime.tsx +168 -0
  878. package/src/components/layout/schema-children.tsx +30 -0
  879. package/src/components/layout/section.tsx +173 -0
  880. package/src/components/layout/tabs.tsx +129 -0
  881. package/src/components/layout/wizard.tsx +244 -0
  882. package/src/components/notifications/flash-toasts.tsx +200 -0
  883. package/src/components/notifications/index.ts +4 -0
  884. package/src/components/notifications/notifications-menu.tsx +262 -0
  885. package/src/components/notifications/realtime-notifications.tsx +40 -0
  886. package/src/components/notifications/undo-button.tsx +50 -0
  887. package/src/components/panel/app-sidebar.tsx +439 -0
  888. package/src/components/panel/bottom-nav.tsx +130 -0
  889. package/src/components/panel/debug-panel-slot.tsx +25 -0
  890. package/src/components/panel/debug-panel.tsx +412 -0
  891. package/src/components/panel/global-search-palette.tsx +387 -0
  892. package/src/components/panel/global-search.tsx +147 -0
  893. package/src/components/panel/impersonation-banner.tsx +47 -0
  894. package/src/components/panel/index.ts +16 -0
  895. package/src/components/panel/keyboard-shortcuts.tsx +134 -0
  896. package/src/components/panel/lazy-placeholder.tsx +39 -0
  897. package/src/components/panel/locale-switcher.tsx +144 -0
  898. package/src/components/panel/menu-item.tsx +89 -0
  899. package/src/components/panel/nav-label.tsx +34 -0
  900. package/src/components/panel/pwa.tsx +118 -0
  901. package/src/components/panel/schema-contract-guard.tsx +50 -0
  902. package/src/components/panel/shortcut-keys.tsx +34 -0
  903. package/src/components/panel/shortcuts-overlay.tsx +238 -0
  904. package/src/components/panel/slot.tsx +43 -0
  905. package/src/components/panel/sub-navigation.tsx +161 -0
  906. package/src/components/panel/tenant-menu.tsx +175 -0
  907. package/src/components/panel/theme-toggle.tsx +69 -0
  908. package/src/components/panel/topbar.tsx +81 -0
  909. package/src/components/panel/user-menu.tsx +166 -0
  910. package/src/components/realtime/conflict-banner.tsx +208 -0
  911. package/src/components/realtime/index.ts +3 -0
  912. package/src/components/realtime/live-records-pill.tsx +66 -0
  913. package/src/components/realtime/record-presence.tsx +98 -0
  914. package/src/components/schema/content-slot.tsx +81 -0
  915. package/src/components/schema/field-actions.tsx +67 -0
  916. package/src/components/schema/field-wrapper.tsx +246 -0
  917. package/src/components/schema/fused-group-context.ts +11 -0
  918. package/src/components/schema/schema-renderer.tsx +127 -0
  919. package/src/components/schema/translatable-field.tsx +113 -0
  920. package/src/components/schema/virtual-spacer.tsx +14 -0
  921. package/src/components/table/cells.tsx +712 -0
  922. package/src/components/table/column-manager.tsx +480 -0
  923. package/src/components/table/content-layout.tsx +368 -0
  924. package/src/components/table/filters.tsx +378 -0
  925. package/src/components/table/grouping.tsx +275 -0
  926. package/src/components/table/index.ts +9 -0
  927. package/src/components/table/list-tabs.tsx +144 -0
  928. package/src/components/table/pagination.tsx +335 -0
  929. package/src/components/table/record-cell.tsx +147 -0
  930. package/src/components/table/spreadsheet-lazy.tsx +14 -0
  931. package/src/components/table/spreadsheet.tsx +602 -0
  932. package/src/components/table/summary-rows.tsx +160 -0
  933. package/src/components/table/table-block.tsx +1112 -0
  934. package/src/components/table/table-views.tsx +460 -0
  935. package/src/components/table/trigger-button.tsx +92 -0
  936. package/src/components/translation-manager/index.ts +1 -0
  937. package/src/components/translation-manager/translation-manager-lazy.tsx +25 -0
  938. package/src/components/translation-manager/translation-manager.tsx +827 -0
  939. package/src/components/tree/index.ts +1 -0
  940. package/src/components/tree/tree-lazy.tsx +30 -0
  941. package/src/components/tree/tree.tsx +385 -0
  942. package/src/components/ui/alert.tsx +57 -0
  943. package/src/components/ui/avatar.tsx +38 -0
  944. package/src/components/ui/badge.tsx +33 -0
  945. package/src/components/ui/breadcrumb.tsx +110 -0
  946. package/src/components/ui/button.tsx +54 -0
  947. package/src/components/ui/calendar.tsx +65 -0
  948. package/src/components/ui/card.tsx +74 -0
  949. package/src/components/ui/checkbox.tsx +30 -0
  950. package/src/components/ui/collapsible.tsx +20 -0
  951. package/src/components/ui/command.tsx +158 -0
  952. package/src/components/ui/dialog.tsx +124 -0
  953. package/src/components/ui/dropdown-menu.tsx +217 -0
  954. package/src/components/ui/input.tsx +20 -0
  955. package/src/components/ui/label.tsx +18 -0
  956. package/src/components/ui/popover.tsx +39 -0
  957. package/src/components/ui/radio-group.tsx +36 -0
  958. package/src/components/ui/scroll-area.tsx +53 -0
  959. package/src/components/ui/select.tsx +165 -0
  960. package/src/components/ui/separator.tsx +25 -0
  961. package/src/components/ui/sheet.tsx +131 -0
  962. package/src/components/ui/sidebar.tsx +660 -0
  963. package/src/components/ui/skeleton.tsx +14 -0
  964. package/src/components/ui/sonner.tsx +43 -0
  965. package/src/components/ui/spinner.tsx +31 -0
  966. package/src/components/ui/switch.tsx +25 -0
  967. package/src/components/ui/table.tsx +89 -0
  968. package/src/components/ui/tabs.tsx +51 -0
  969. package/src/components/ui/textarea.tsx +17 -0
  970. package/src/components/ui/tooltip.tsx +50 -0
  971. package/src/components/versions/record-versions.tsx +162 -0
  972. package/src/components/widgets/calendar-lazy.tsx +31 -0
  973. package/src/components/widgets/calendar.tsx +124 -0
  974. package/src/components/widgets/chart-filters.tsx +114 -0
  975. package/src/components/widgets/chart-lazy.tsx +21 -0
  976. package/src/components/widgets/chart.tsx +252 -0
  977. package/src/components/widgets/dashboard-customizer.tsx +309 -0
  978. package/src/components/widgets/index.ts +5 -0
  979. package/src/components/widgets/stats-overview.tsx +185 -0
  980. package/src/components/widgets/widgets-block.tsx +102 -0
  981. package/src/context.tsx +187 -0
  982. package/src/create-alfakit.tsx +300 -0
  983. package/src/hooks/use-hydrated.ts +16 -0
  984. package/src/hooks/use-mobile.ts +29 -0
  985. package/src/hooks/use-store.ts +18 -0
  986. package/src/hooks/use-virtual-list.ts +88 -0
  987. package/src/index.ts +135 -0
  988. package/src/layouts/app-layout.tsx +128 -0
  989. package/src/layouts/auth-layout.tsx +66 -0
  990. package/src/layouts/blank-layout.tsx +5 -0
  991. package/src/layouts/fullscreen-layout.tsx +86 -0
  992. package/src/layouts/top-nav-layout.tsx +293 -0
  993. package/src/lib/attributes.ts +79 -0
  994. package/src/lib/colors.ts +151 -0
  995. package/src/lib/discovery.tsx +68 -0
  996. package/src/lib/icons.tsx +145 -0
  997. package/src/lib/lazy.tsx +89 -0
  998. package/src/lib/new-tab-hint.tsx +8 -0
  999. package/src/lib/utils.ts +6 -0
  1000. package/src/pages/page.tsx +463 -0
  1001. package/src/registry.ts +132 -0
  1002. package/src/server.tsx +68 -0
  1003. package/src/standalone/alfakit-component.tsx +222 -0
  1004. package/src/standalone/alfakit-toaster.tsx +52 -0
  1005. package/src/standalone/configure.ts +24 -0
  1006. package/src/standalone/index.ts +3 -0
  1007. package/src/standalone/runtime.ts +153 -0
  1008. package/src/starter-kit/index.ts +14 -0
  1009. package/src/starter-kit/navigation.ts +34 -0
  1010. package/src/starter-kit/starter-kit.tsx +196 -0
  1011. package/src/starter-kit/widgets-loaded.tsx +217 -0
  1012. package/src/starter-kit/widgets-triggers.tsx +103 -0
  1013. package/src/starter-kit/widgets.tsx +103 -0
  1014. package/src/styles.css +305 -0
@@ -0,0 +1,1387 @@
1
+ import { useActionRunner, useChoice, useDirection, useFormatter, usePanel, useT } from "../../context.js";
2
+ import { usePageActionContext } from "../actions/action-context.js";
3
+ import { cn } from "../../lib/utils.js";
4
+ import { Button } from "../ui/button.js";
5
+ import { useStore } from "../../hooks/use-store.js";
6
+ import { Spinner } from "../ui/spinner.js";
7
+ import { Card } from "../ui/card.js";
8
+ import { Input } from "../ui/input.js";
9
+ import { Checkbox } from "../ui/checkbox.js";
10
+ import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "../ui/dialog.js";
11
+ import { showToast } from "../notifications/flash-toasts.js";
12
+ import { useIsMobile } from "../../hooks/use-mobile.js";
13
+ import { Sheet, SheetContent, SheetHeader, SheetTitle } from "../ui/sheet.js";
14
+ import { ImageEditorDialog } from "../fields/image-editor-dialog.js";
15
+ import { FileManagerController, clientErrorNotification, fetchEditableImage, fileManagerAcceptAttribute, fileManagerExpiry, fileManagerSize } from "@alfakit/core";
16
+ import { useEffect, useId, useRef, useState } from "react";
17
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
18
+ import { ArrowDownIcon, ArrowUpIcon, CheckIcon, ChevronLeftIcon, ChevronRightIcon, CopyIcon, DownloadIcon, FileArchiveIcon, FileIcon, FileImageIcon, FileMusicIcon, FilePlayIcon, FileSpreadsheetIcon, FileTextIcon, FolderIcon, FolderInputIcon, FolderOpenIcon, FolderPlusIcon, FolderTreeIcon, InfoIcon, LayoutGridIcon, LinkIcon, ListIcon, PencilIcon, PresentationIcon, RefreshCwIcon, RotateCcwIcon, SearchIcon, Share2Icon, SquarePenIcon, Trash2Icon, UploadIcon, XIcon } from "lucide-react";
19
+ //#region src/components/file-manager/file-manager.tsx
20
+ const SELECT = "border-input focus-visible:border-ring focus-visible:ring-ring/50 h-9 min-w-0 rounded-md border bg-transparent px-2 text-sm shadow-xs outline-none focus-visible:ring-[3px]";
21
+ const KIND_ICONS = {
22
+ folder: FolderIcon,
23
+ image: FileImageIcon,
24
+ video: FilePlayIcon,
25
+ audio: FileMusicIcon,
26
+ pdf: FileTextIcon,
27
+ text: FileTextIcon,
28
+ archive: FileArchiveIcon,
29
+ document: FileTextIcon,
30
+ spreadsheet: FileSpreadsheetIcon,
31
+ presentation: PresentationIcon,
32
+ other: FileIcon
33
+ };
34
+ const SORT_FIELDS = [
35
+ "name",
36
+ "size",
37
+ "modified",
38
+ "type"
39
+ ];
40
+ const IMAGE_EDITOR = {
41
+ aspectRatios: [null],
42
+ circle: false
43
+ };
44
+ /**
45
+ * The file manager of alfasix/alfakit-file-manager (schema component `file-manager`): a
46
+ * folder tree, breadcrumbs, grid and list views, sorting, search, multi-selection with
47
+ * mouse and keyboard, drag and drop (uploads and moves), uploads with progress, previews,
48
+ * details, sharing and the trash. Everything is listed, checked and changed by the server.
49
+ */
50
+ function FileManager({ component }) {
51
+ return component ? /* @__PURE__ */ jsx(FileManagerView, { schema: component }, `${component.disk}:${component.mode}`) : null;
52
+ }
53
+ function FileManagerView({ schema, onChoose, onCancel }) {
54
+ const runner = useActionRunner();
55
+ const page = usePageActionContext();
56
+ const panel = usePanel();
57
+ const t = useT();
58
+ const choice = useChoice();
59
+ const direction = useDirection();
60
+ const formatter = useFormatter();
61
+ const labelId = useId();
62
+ const hintId = useId();
63
+ const tt = (key, replacements, fallback) => t(`file-manager.${key}`, replacements, fallback);
64
+ const environment = () => ({
65
+ runner,
66
+ token: page.token,
67
+ uploadEndpoint: panel.endpoints.upload,
68
+ uploadChunkEndpoint: panel.endpoints.uploadChunks,
69
+ uploadChunkSize: panel.uploadChunkSize,
70
+ t,
71
+ choice,
72
+ formatter,
73
+ notify: (notifications) => notifications.forEach((notification) => showToast(notification)),
74
+ error: (message) => showToast(clientErrorNotification("file-manager", message))
75
+ });
76
+ const [controller] = useState(() => new FileManagerController(schema, environment(), formatter.locale));
77
+ useEffect(() => {
78
+ controller.setEnvironment(environment());
79
+ });
80
+ const first = useRef(true);
81
+ useEffect(() => {
82
+ if (first.current) {
83
+ first.current = false;
84
+ return;
85
+ }
86
+ controller.setSchema(schema);
87
+ }, [controller, schema]);
88
+ useEffect(() => {
89
+ if (schema.mode === "picker") controller.ensureLoaded();
90
+ return () => controller.dispose();
91
+ }, [controller, schema.mode]);
92
+ const state = useStore(controller.store);
93
+ const entries = controller.visibleEntries();
94
+ const selected = controller.selectedEntries();
95
+ const picker = schema.mode === "picker";
96
+ const listRef = useRef(null);
97
+ const items = useRef(/* @__PURE__ */ new Map());
98
+ const uploadInput = useRef(null);
99
+ const [foldersOpen, setFoldersOpen] = useState(false);
100
+ const mobile = useIsMobile();
101
+ const focusPath = state.focus ?? entries[0]?.path ?? null;
102
+ const focusItem = (path) => {
103
+ if (path) requestAnimationFrame(() => items.current.get(path)?.focus());
104
+ };
105
+ const columns = () => {
106
+ const element = listRef.current;
107
+ if (!element || state.view !== "grid" || typeof getComputedStyle === "undefined") return 1;
108
+ return Math.max(1, getComputedStyle(element).gridTemplateColumns.split(" ").filter(Boolean).length);
109
+ };
110
+ const onItemKeyDown = (event) => {
111
+ const result = controller.handleKey(event, columns(), direction);
112
+ if (result.handled) {
113
+ event.preventDefault();
114
+ focusItem(result.focus);
115
+ }
116
+ };
117
+ const pointer = useRef("mouse");
118
+ const onItemClick = (entry, event) => {
119
+ controller.click(entry.path, {
120
+ shift: event.shiftKey,
121
+ toggle: event.metaKey || event.ctrlKey,
122
+ touch: pointer.current === "touch"
123
+ });
124
+ };
125
+ const onItemDoubleClick = (entry) => {
126
+ if (picker && entry.type === "file") {
127
+ if (entry.selectable !== false && entry.value) onChoose?.([entry]);
128
+ return;
129
+ }
130
+ controller.openEntry(entry);
131
+ };
132
+ const copying = (event) => event.ctrlKey || event.altKey || event.metaKey;
133
+ const dropHandlers = (target) => ({
134
+ onDragOver: (event) => {
135
+ if (controller.dragOver(target, event.dataTransfer, copying(event))) {
136
+ event.preventDefault();
137
+ event.stopPropagation();
138
+ }
139
+ },
140
+ onDragLeave: (event) => {
141
+ if (!event.currentTarget.contains(event.relatedTarget)) controller.dragLeave(target);
142
+ },
143
+ onDrop: (event) => {
144
+ event.preventDefault();
145
+ event.stopPropagation();
146
+ controller.drop(target, event.dataTransfer, copying(event));
147
+ }
148
+ });
149
+ const canWrite = !picker && !state.trash;
150
+ const single = selected.length === 1 ? selected[0] : void 0;
151
+ const folderLabel = state.trash ? tt("trash", {}, "Trash") : state.breadcrumbs[state.breadcrumbs.length - 1]?.name ?? tt("root", {}, "Files");
152
+ const tree = /* @__PURE__ */ jsx(FolderTree, {
153
+ controller,
154
+ onOpen: (path) => {
155
+ setFoldersOpen(false);
156
+ controller.open(path);
157
+ },
158
+ active: state.trash ? null : state.path,
159
+ dropHandlers: canWrite ? dropHandlers : void 0,
160
+ dropTarget: state.dropTarget
161
+ });
162
+ return /* @__PURE__ */ jsxs(Card, {
163
+ className: "relative gap-0 overflow-hidden py-0",
164
+ "data-slot": "file-manager",
165
+ "data-view": state.view,
166
+ "data-mode": schema.mode,
167
+ "aria-labelledby": labelId,
168
+ children: [
169
+ /* @__PURE__ */ jsx("span", {
170
+ id: labelId,
171
+ className: "sr-only",
172
+ children: tt("label", {}, "File manager")
173
+ }),
174
+ /* @__PURE__ */ jsx("div", {
175
+ className: "sr-only",
176
+ role: "status",
177
+ "aria-live": "polite",
178
+ children: state.announcement
179
+ }),
180
+ /* @__PURE__ */ jsxs("div", {
181
+ className: "flex flex-wrap items-center gap-2 border-b p-3",
182
+ "data-slot": "file-manager-toolbar",
183
+ children: [
184
+ /* @__PURE__ */ jsx(Button, {
185
+ type: "button",
186
+ variant: "outline",
187
+ size: "icon-sm",
188
+ className: "md:hidden",
189
+ onClick: () => setFoldersOpen(true),
190
+ "aria-label": tt("toggle_folders", {}, "Show folders"),
191
+ children: /* @__PURE__ */ jsx(FolderTreeIcon, { "aria-hidden": "true" })
192
+ }),
193
+ schema.disks.length > 1 && /* @__PURE__ */ jsxs("label", {
194
+ className: "flex items-center",
195
+ children: [/* @__PURE__ */ jsx("span", {
196
+ className: "sr-only",
197
+ children: tt("disk", {}, "Storage")
198
+ }), /* @__PURE__ */ jsx("select", {
199
+ className: SELECT,
200
+ value: state.disk,
201
+ onChange: (event) => controller.setDisk(event.target.value),
202
+ children: schema.disks.map((disk) => /* @__PURE__ */ jsx("option", {
203
+ value: disk.name,
204
+ children: disk.label
205
+ }, disk.name))
206
+ })]
207
+ }),
208
+ /* @__PURE__ */ jsx("nav", {
209
+ "aria-label": tt("breadcrumb", {}, "Folder path"),
210
+ className: "min-w-0 flex-1",
211
+ "data-slot": "file-manager-breadcrumb",
212
+ children: /* @__PURE__ */ jsxs("ol", {
213
+ className: "flex min-w-0 flex-wrap items-center gap-1 text-sm",
214
+ children: [/* @__PURE__ */ jsx("li", {
215
+ className: "flex items-center",
216
+ children: /* @__PURE__ */ jsx("button", {
217
+ type: "button",
218
+ className: "hover:bg-accent rounded px-1.5 py-1 font-medium",
219
+ "aria-current": !state.trash && state.path === "" ? "page" : void 0,
220
+ onClick: () => state.trash ? void controller.showTrash(false) : void controller.open(""),
221
+ children: tt("root", {}, "Files")
222
+ })
223
+ }), state.trash ? /* @__PURE__ */ jsx(Crumb, {
224
+ current: true,
225
+ children: tt("trash", {}, "Trash")
226
+ }) : state.breadcrumbs.map((crumb, index) => /* @__PURE__ */ jsx(Crumb, {
227
+ current: index === state.breadcrumbs.length - 1,
228
+ onClick: () => void controller.open(crumb.path),
229
+ children: crumb.name
230
+ }, crumb.path))]
231
+ })
232
+ }),
233
+ /* @__PURE__ */ jsxs("div", {
234
+ className: "flex w-full flex-wrap items-center gap-2 sm:w-auto",
235
+ children: [
236
+ /* @__PURE__ */ jsxs("div", {
237
+ className: "relative min-w-40 flex-1 sm:flex-none",
238
+ children: [/* @__PURE__ */ jsx(SearchIcon, {
239
+ className: "text-muted-foreground pointer-events-none absolute start-2.5 top-1/2 size-4 -translate-y-1/2",
240
+ "aria-hidden": "true"
241
+ }), /* @__PURE__ */ jsx(Input, {
242
+ type: "search",
243
+ value: state.query,
244
+ onChange: (event) => controller.setQuery(event.target.value),
245
+ placeholder: tt("search_placeholder", {}, "Search…"),
246
+ "aria-label": tt("search", {}, "Search in this folder"),
247
+ className: "h-9 ps-8 sm:w-52",
248
+ disabled: state.trash
249
+ })]
250
+ }),
251
+ schema.search.recursive && !state.trash && /* @__PURE__ */ jsxs("label", {
252
+ className: "flex items-center gap-2 text-sm",
253
+ children: [/* @__PURE__ */ jsx(Checkbox, {
254
+ checked: state.recursive,
255
+ onCheckedChange: (checked) => controller.setRecursive(checked === true)
256
+ }), tt("search_everywhere", {}, "Include subfolders")]
257
+ }),
258
+ /* @__PURE__ */ jsxs("label", {
259
+ className: "flex items-center gap-1",
260
+ children: [/* @__PURE__ */ jsx("span", {
261
+ className: "sr-only",
262
+ children: tt("sort", {}, "Sort by")
263
+ }), /* @__PURE__ */ jsx("select", {
264
+ className: SELECT,
265
+ value: state.sort.field,
266
+ onChange: (event) => controller.setSort(event.target.value, state.sort.direction),
267
+ children: SORT_FIELDS.map((field) => /* @__PURE__ */ jsx("option", {
268
+ value: field,
269
+ children: tt(`sort_${field}`, {}, field)
270
+ }, field))
271
+ })]
272
+ }),
273
+ /* @__PURE__ */ jsx(Button, {
274
+ type: "button",
275
+ variant: "outline",
276
+ size: "icon-sm",
277
+ onClick: () => controller.setSort(state.sort.field, state.sort.direction === "asc" ? "desc" : "asc"),
278
+ "aria-label": state.sort.direction === "asc" ? tt("ascending", {}, "Ascending") : tt("descending", {}, "Descending"),
279
+ children: state.sort.direction === "asc" ? /* @__PURE__ */ jsx(ArrowUpIcon, { "aria-hidden": "true" }) : /* @__PURE__ */ jsx(ArrowDownIcon, { "aria-hidden": "true" })
280
+ }),
281
+ /* @__PURE__ */ jsxs("div", {
282
+ className: "flex rounded-md border",
283
+ role: "group",
284
+ "aria-label": tt("view", {}, "View"),
285
+ children: [/* @__PURE__ */ jsx(Button, {
286
+ type: "button",
287
+ variant: state.view === "grid" ? "secondary" : "ghost",
288
+ size: "icon-sm",
289
+ "aria-pressed": state.view === "grid",
290
+ "aria-label": tt("view_grid", {}, "Grid"),
291
+ onClick: () => controller.setView("grid"),
292
+ children: /* @__PURE__ */ jsx(LayoutGridIcon, { "aria-hidden": "true" })
293
+ }), /* @__PURE__ */ jsx(Button, {
294
+ type: "button",
295
+ variant: state.view === "list" ? "secondary" : "ghost",
296
+ size: "icon-sm",
297
+ "aria-pressed": state.view === "list",
298
+ "aria-label": tt("view_list", {}, "List"),
299
+ onClick: () => controller.setView("list"),
300
+ children: /* @__PURE__ */ jsx(ListIcon, { "aria-hidden": "true" })
301
+ })]
302
+ }),
303
+ /* @__PURE__ */ jsx(Button, {
304
+ type: "button",
305
+ variant: "ghost",
306
+ size: "icon-sm",
307
+ onClick: () => void controller.refresh(),
308
+ "aria-label": tt("refresh", {}, "Refresh"),
309
+ children: /* @__PURE__ */ jsx(RefreshCwIcon, {
310
+ "aria-hidden": "true",
311
+ className: cn(state.loading && "animate-spin")
312
+ })
313
+ }),
314
+ !state.trash && controller.can("createFolder") && /* @__PURE__ */ jsxs(Button, {
315
+ type: "button",
316
+ variant: "outline",
317
+ size: "sm",
318
+ onClick: () => controller.openDialog({ type: "createFolder" }),
319
+ children: [/* @__PURE__ */ jsx(FolderPlusIcon, { "aria-hidden": "true" }), /* @__PURE__ */ jsx("span", {
320
+ className: "max-sm:sr-only",
321
+ children: tt("new_folder", {}, "New folder")
322
+ })]
323
+ }),
324
+ !state.trash && controller.can("upload") && schema.upload && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs(Button, {
325
+ type: "button",
326
+ size: "sm",
327
+ onClick: () => uploadInput.current?.click(),
328
+ children: [/* @__PURE__ */ jsx(UploadIcon, { "aria-hidden": "true" }), /* @__PURE__ */ jsx("span", {
329
+ className: "max-sm:sr-only",
330
+ children: tt("upload", {}, "Upload")
331
+ })]
332
+ }), /* @__PURE__ */ jsx("input", {
333
+ ref: uploadInput,
334
+ type: "file",
335
+ multiple: true,
336
+ hidden: true,
337
+ accept: fileManagerAcceptAttribute(schema.upload.accept),
338
+ "data-slot": "file-manager-upload-input",
339
+ onChange: (event) => {
340
+ if (event.target.files) controller.upload(Array.from(event.target.files));
341
+ event.target.value = "";
342
+ }
343
+ })] }),
344
+ schema.trash && !picker && /* @__PURE__ */ jsxs(Button, {
345
+ type: "button",
346
+ variant: state.trash ? "secondary" : "ghost",
347
+ size: "sm",
348
+ "aria-pressed": state.trash,
349
+ onClick: () => void controller.showTrash(!state.trash),
350
+ children: [/* @__PURE__ */ jsx(Trash2Icon, { "aria-hidden": "true" }), /* @__PURE__ */ jsx("span", {
351
+ className: "max-sm:sr-only",
352
+ children: state.trash ? tt("back_to_files", {}, "Back to files") : tt("trash", {}, "Trash")
353
+ })]
354
+ })
355
+ ]
356
+ })
357
+ ]
358
+ }),
359
+ selected.length > 0 && !picker && /* @__PURE__ */ jsxs("div", {
360
+ className: "bg-muted/50 flex flex-wrap items-center gap-1 border-b px-3 py-2 text-sm",
361
+ "data-slot": "file-manager-selection",
362
+ children: [
363
+ /* @__PURE__ */ jsx("span", {
364
+ className: "me-2 font-medium",
365
+ children: tt("selected", { count: selected.length }, ":count selected")
366
+ }),
367
+ state.trash ? /* @__PURE__ */ jsxs(Fragment$1, { children: [controller.can("restore") && /* @__PURE__ */ jsx(ToolButton, {
368
+ icon: RotateCcwIcon,
369
+ onClick: () => void controller.restore(),
370
+ children: tt("restore", {}, "Restore")
371
+ }), controller.can("delete") && /* @__PURE__ */ jsx(ToolButton, {
372
+ icon: Trash2Icon,
373
+ onClick: () => controller.confirmDelete(),
374
+ destructive: true,
375
+ children: tt("delete_permanently", {}, "Delete permanently")
376
+ })] }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
377
+ single && /* @__PURE__ */ jsx(ToolButton, {
378
+ icon: single.type === "folder" ? FolderOpenIcon : SearchIcon,
379
+ onClick: () => controller.openEntry(single),
380
+ children: single.type === "folder" ? tt("open", {}, "Open") : tt("preview", {}, "Preview")
381
+ }),
382
+ controller.can("download") && (single?.type === "file" || controller.can("zip")) && /* @__PURE__ */ jsx(ToolButton, {
383
+ icon: DownloadIcon,
384
+ onClick: () => void controller.download(),
385
+ children: single?.type === "file" ? tt("download", {}, "Download") : tt("download_zip", {}, "Download as zip")
386
+ }),
387
+ single && controller.can("rename") && /* @__PURE__ */ jsx(ToolButton, {
388
+ icon: PencilIcon,
389
+ onClick: () => controller.openDialog({
390
+ type: "rename",
391
+ entry: single
392
+ }),
393
+ children: tt("rename", {}, "Rename")
394
+ }),
395
+ controller.can("move") && /* @__PURE__ */ jsx(ToolButton, {
396
+ icon: FolderInputIcon,
397
+ onClick: () => controller.openDialog({
398
+ type: "move",
399
+ paths: state.selection,
400
+ destination: state.path
401
+ }),
402
+ children: tt("move", {}, "Move")
403
+ }),
404
+ controller.can("copy") && /* @__PURE__ */ jsx(ToolButton, {
405
+ icon: CopyIcon,
406
+ onClick: () => controller.openDialog({
407
+ type: "copy",
408
+ paths: state.selection,
409
+ destination: state.path
410
+ }),
411
+ children: tt("copy", {}, "Copy")
412
+ }),
413
+ single?.type === "file" && controller.can("share") && schema.share && /* @__PURE__ */ jsx(ToolButton, {
414
+ icon: Share2Icon,
415
+ onClick: () => void controller.openShare(single),
416
+ children: tt("share", {}, "Share")
417
+ }),
418
+ /* @__PURE__ */ jsx(ToolButton, {
419
+ icon: InfoIcon,
420
+ onClick: () => void controller.showDetails(single),
421
+ children: tt("details", {}, "Details")
422
+ }),
423
+ controller.can("delete") && /* @__PURE__ */ jsx(ToolButton, {
424
+ icon: Trash2Icon,
425
+ onClick: () => controller.confirmDelete(),
426
+ destructive: true,
427
+ children: tt("delete", {}, "Delete")
428
+ })
429
+ ] }),
430
+ /* @__PURE__ */ jsx(Button, {
431
+ type: "button",
432
+ variant: "ghost",
433
+ size: "icon-sm",
434
+ className: "ms-auto",
435
+ onClick: () => controller.clearSelection(),
436
+ "aria-label": tt("clear_selection", {}, "Clear selection"),
437
+ children: /* @__PURE__ */ jsx(XIcon, { "aria-hidden": "true" })
438
+ })
439
+ ]
440
+ }),
441
+ /* @__PURE__ */ jsxs("div", {
442
+ className: cn("flex", picker ? "h-[60vh]" : "min-h-[28rem]"),
443
+ children: [
444
+ /* @__PURE__ */ jsx("aside", {
445
+ className: "hidden w-60 shrink-0 overflow-y-auto border-e p-2 md:block",
446
+ "data-slot": "file-manager-sidebar",
447
+ children: tree
448
+ }),
449
+ /* @__PURE__ */ jsxs("div", {
450
+ className: "relative min-w-0 flex-1 overflow-y-auto",
451
+ "data-slot": "file-manager-content",
452
+ "data-drop-target": state.dropTarget === "" ? "" : void 0,
453
+ ...canWrite ? dropHandlers("") : {},
454
+ children: [
455
+ state.trash && state.retentionDays && /* @__PURE__ */ jsx("p", {
456
+ className: "text-muted-foreground border-b px-4 py-2 text-xs",
457
+ children: tt("trash_hint", { days: state.retentionDays }, "Items in the trash are deleted for good after :days days.")
458
+ }),
459
+ (state.truncated || state.resultsTruncated) && /* @__PURE__ */ jsx("p", {
460
+ className: "text-muted-foreground border-b px-4 py-2 text-xs",
461
+ role: "note",
462
+ children: state.resultsTruncated ? tt("search_truncated", {}, "Only the first results are shown. Refine your search.") : tt("truncated", {}, "This folder has more items than can be shown here.")
463
+ }),
464
+ /* @__PURE__ */ jsx("p", {
465
+ id: hintId,
466
+ className: "sr-only",
467
+ children: tt("keyboard", {}, "Arrow keys move between items, Shift selects a range, Enter opens.")
468
+ }),
469
+ (state.loading || state.searching) && entries.length === 0 ? /* @__PURE__ */ jsxs("div", {
470
+ className: "flex justify-center py-16",
471
+ children: [/* @__PURE__ */ jsx(Spinner, {}), /* @__PURE__ */ jsx("span", {
472
+ className: "sr-only",
473
+ children: tt("loading", {}, "Loading files")
474
+ })]
475
+ }) : entries.length === 0 ? /* @__PURE__ */ jsxs("div", {
476
+ className: "text-muted-foreground flex flex-col items-center gap-2 px-6 py-16 text-center text-sm",
477
+ "data-slot": "file-manager-empty",
478
+ children: [
479
+ /* @__PURE__ */ jsx(FolderOpenIcon, {
480
+ className: "size-10 opacity-40",
481
+ "aria-hidden": "true"
482
+ }),
483
+ /* @__PURE__ */ jsx("p", {
484
+ className: "text-foreground font-medium",
485
+ children: state.query ? tt("no_results", {}, "Nothing matches your search") : state.trash ? tt("empty_trash_state", {}, "The trash is empty") : tt("empty", {}, "This folder is empty")
486
+ }),
487
+ !state.query && canWrite && controller.can("upload") && /* @__PURE__ */ jsx("p", { children: tt("empty_hint", {}, "Drop files here or choose Upload.") })
488
+ ]
489
+ }) : /* @__PURE__ */ jsxs("div", {
490
+ ref: listRef,
491
+ role: "listbox",
492
+ "aria-multiselectable": !picker || schema.multiple === true,
493
+ "aria-labelledby": labelId,
494
+ "aria-describedby": hintId,
495
+ "aria-busy": state.loading || void 0,
496
+ "data-slot": "file-manager-items",
497
+ className: cn(state.view === "grid" ? "grid grid-cols-2 gap-3 p-3 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6" : "flex flex-col p-1", state.loading && "opacity-60"),
498
+ children: [state.view === "list" && /* @__PURE__ */ jsxs("div", {
499
+ className: "text-muted-foreground hidden grid-cols-[1fr_7rem_10rem] gap-3 px-3 py-1.5 text-xs font-medium sm:grid",
500
+ "aria-hidden": "true",
501
+ children: [
502
+ /* @__PURE__ */ jsx("span", { children: tt("name", {}, "Name") }),
503
+ /* @__PURE__ */ jsx("span", {
504
+ className: "text-end",
505
+ children: tt("size", {}, "Size")
506
+ }),
507
+ /* @__PURE__ */ jsx("span", { children: tt("modified", {}, "Modified") })
508
+ ]
509
+ }), entries.map((entry) => /* @__PURE__ */ jsx(EntryItem, {
510
+ entry,
511
+ view: state.view,
512
+ selected: state.selection.includes(entry.path),
513
+ focusable: entry.path === focusPath,
514
+ dropTarget: state.dropTarget === entry.path,
515
+ disabled: picker && entry.type === "file" && entry.selectable === false,
516
+ draggable: canWrite && (controller.can("move") || controller.can("copy")),
517
+ showLocation: state.results !== null,
518
+ formatter,
519
+ tt,
520
+ ref: (element) => {
521
+ if (element) items.current.set(entry.path, element);
522
+ else items.current.delete(entry.path);
523
+ },
524
+ onPointerDown: (event) => pointer.current = event.pointerType,
525
+ onClick: (event) => onItemClick(entry, event),
526
+ onDoubleClick: () => onItemDoubleClick(entry),
527
+ onKeyDown: onItemKeyDown,
528
+ onFocus: () => controller.focus(entry.path),
529
+ onDragStart: (event) => controller.dragStart(entry.path, event.dataTransfer),
530
+ onDragEnd: () => controller.dragEnd(),
531
+ dropHandlers: entry.type === "folder" && canWrite ? dropHandlers(entry.path) : void 0
532
+ }, entry.path))]
533
+ }),
534
+ state.dropTarget === "" && /* @__PURE__ */ jsx("div", {
535
+ className: "border-primary bg-primary/5 text-primary pointer-events-none absolute inset-2 flex items-center justify-center rounded-lg border-2 border-dashed text-sm font-medium",
536
+ "data-slot": "file-manager-drop",
537
+ children: tt("drop_here", { folder: folderLabel }, "Drop files to upload them to :folder")
538
+ })
539
+ ]
540
+ }),
541
+ state.detailsOpen && /* @__PURE__ */ jsx("aside", {
542
+ className: "hidden w-72 shrink-0 overflow-y-auto border-s md:block",
543
+ "data-slot": "file-manager-details",
544
+ children: /* @__PURE__ */ jsx(Details, {
545
+ controller,
546
+ tt,
547
+ formatter
548
+ })
549
+ })
550
+ ]
551
+ }),
552
+ state.trash && entries.length > 0 && controller.can("delete") && /* @__PURE__ */ jsx("div", {
553
+ className: "flex justify-end border-t p-3",
554
+ children: /* @__PURE__ */ jsxs(Button, {
555
+ type: "button",
556
+ variant: "outline",
557
+ size: "sm",
558
+ onClick: () => controller.openDialog({ type: "emptyTrash" }),
559
+ children: [/* @__PURE__ */ jsx(Trash2Icon, { "aria-hidden": "true" }), tt("empty_trash", {}, "Empty trash")]
560
+ })
561
+ }),
562
+ picker && /* @__PURE__ */ jsxs("div", {
563
+ className: "flex flex-wrap items-center justify-end gap-2 border-t p-3",
564
+ "data-slot": "file-manager-picker-footer",
565
+ children: [
566
+ /* @__PURE__ */ jsx("span", {
567
+ className: "text-muted-foreground me-auto text-sm",
568
+ children: selected.length > 0 ? tt("selected", { count: controller.chosen().length }, ":count selected") : ""
569
+ }),
570
+ /* @__PURE__ */ jsx(Button, {
571
+ type: "button",
572
+ variant: "outline",
573
+ onClick: onCancel,
574
+ children: tt("cancel", {}, "Cancel")
575
+ }),
576
+ /* @__PURE__ */ jsxs(Button, {
577
+ type: "button",
578
+ disabled: controller.chosen().length === 0,
579
+ onClick: () => onChoose?.(controller.chosen()),
580
+ children: [/* @__PURE__ */ jsx(CheckIcon, { "aria-hidden": "true" }), tt("picker_choose", {}, "Choose")]
581
+ })
582
+ ]
583
+ }),
584
+ /* @__PURE__ */ jsx(Sheet, {
585
+ open: foldersOpen,
586
+ onOpenChange: setFoldersOpen,
587
+ children: /* @__PURE__ */ jsxs(SheetContent, {
588
+ side: direction === "rtl" ? "right" : "left",
589
+ className: "p-4",
590
+ children: [/* @__PURE__ */ jsx(SheetHeader, {
591
+ className: "p-0",
592
+ children: /* @__PURE__ */ jsx(SheetTitle, { children: tt("folders", {}, "Folders") })
593
+ }), tree]
594
+ })
595
+ }),
596
+ /* @__PURE__ */ jsx(Sheet, {
597
+ open: state.detailsOpen && mobile,
598
+ onOpenChange: (open) => !open && controller.closeDetails(),
599
+ children: /* @__PURE__ */ jsxs(SheetContent, {
600
+ side: direction === "rtl" ? "left" : "right",
601
+ className: "p-0",
602
+ children: [/* @__PURE__ */ jsx(SheetHeader, { children: /* @__PURE__ */ jsx(SheetTitle, { children: tt("details", {}, "Details") }) }), /* @__PURE__ */ jsx(Details, {
603
+ controller,
604
+ tt,
605
+ formatter,
606
+ hideHeading: true
607
+ })]
608
+ })
609
+ }),
610
+ /* @__PURE__ */ jsx(Uploads, {
611
+ controller,
612
+ tt
613
+ }),
614
+ /* @__PURE__ */ jsx(Dialogs, {
615
+ controller,
616
+ tt,
617
+ choice,
618
+ formatter
619
+ }),
620
+ /* @__PURE__ */ jsx(Preview, {
621
+ controller,
622
+ tt,
623
+ direction
624
+ })
625
+ ]
626
+ });
627
+ }
628
+ function Crumb({ children, current, onClick }) {
629
+ return /* @__PURE__ */ jsxs("li", {
630
+ className: "flex min-w-0 items-center gap-1",
631
+ children: [/* @__PURE__ */ jsx(ChevronRightIcon, {
632
+ className: "text-muted-foreground size-3.5 shrink-0 rtl:rotate-180",
633
+ "aria-hidden": "true"
634
+ }), current || !onClick ? /* @__PURE__ */ jsx("span", {
635
+ className: "truncate px-1.5 py-1 font-medium",
636
+ "aria-current": "page",
637
+ children
638
+ }) : /* @__PURE__ */ jsx("button", {
639
+ type: "button",
640
+ className: "hover:bg-accent truncate rounded px-1.5 py-1",
641
+ onClick,
642
+ children
643
+ })]
644
+ });
645
+ }
646
+ function ToolButton({ icon: IconComponent, children, onClick, destructive }) {
647
+ return /* @__PURE__ */ jsxs(Button, {
648
+ type: "button",
649
+ variant: "ghost",
650
+ size: "sm",
651
+ onClick,
652
+ className: cn(destructive && "text-destructive hover:text-destructive"),
653
+ children: [/* @__PURE__ */ jsx(IconComponent, { "aria-hidden": "true" }), /* @__PURE__ */ jsx("span", {
654
+ className: "max-md:sr-only",
655
+ children
656
+ })]
657
+ });
658
+ }
659
+ function EntryIcon({ entry, className }) {
660
+ const IconComponent = KIND_ICONS[entry.kind] ?? FileIcon;
661
+ return /* @__PURE__ */ jsx(IconComponent, {
662
+ className: cn(entry.type === "folder" && "text-primary", className),
663
+ "aria-hidden": "true"
664
+ });
665
+ }
666
+ function EntryItem({ entry, view, selected, focusable, dropTarget, disabled, draggable, showLocation, formatter, tt, ref, dropHandlers, ...handlers }) {
667
+ const [broken, setBroken] = useState(false);
668
+ const size = entry.type === "file" ? fileManagerSize(entry.size, formatter) : "";
669
+ const modified = entry.modified ? formatter.dateTime(entry.modified) : "";
670
+ const location = showLocation && entry.path.includes("/") ? entry.path.slice(0, entry.path.lastIndexOf("/")) : null;
671
+ const thumbnail = entry.thumbnail && !broken ? entry.thumbnail : null;
672
+ return /* @__PURE__ */ jsxs("div", {
673
+ ref,
674
+ role: "option",
675
+ "aria-label": entry.name,
676
+ "aria-selected": selected,
677
+ "aria-disabled": disabled || void 0,
678
+ tabIndex: focusable ? 0 : -1,
679
+ draggable,
680
+ "data-slot": "file-manager-item",
681
+ "data-type": entry.type,
682
+ "data-kind": entry.kind,
683
+ "data-selected": selected ? "" : void 0,
684
+ "data-drop-target": dropTarget ? "" : void 0,
685
+ title: entry.name,
686
+ className: cn("group focus-visible:ring-ring/50 relative cursor-default rounded-lg outline-none select-none focus-visible:ring-[3px]", view === "grid" ? "hover:bg-accent/50 flex flex-col gap-2 border p-2" : "hover:bg-accent/50 grid grid-cols-[auto_1fr] items-center gap-3 px-3 py-2 sm:grid-cols-[auto_1fr_7rem_10rem]", selected && "bg-primary/10 border-primary/40 hover:bg-primary/15", dropTarget && "ring-primary ring-2", disabled && "opacity-50"),
687
+ ...handlers,
688
+ ...dropHandlers,
689
+ children: [view === "grid" ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
690
+ className: "bg-muted/60 flex aspect-[4/3] items-center justify-center overflow-hidden rounded-md",
691
+ children: thumbnail ? /* @__PURE__ */ jsx("img", {
692
+ src: thumbnail,
693
+ alt: "",
694
+ loading: "lazy",
695
+ draggable: false,
696
+ className: "size-full object-cover",
697
+ onError: () => setBroken(true)
698
+ }) : /* @__PURE__ */ jsx(EntryIcon, {
699
+ entry,
700
+ className: "size-10"
701
+ })
702
+ }), /* @__PURE__ */ jsxs("div", {
703
+ className: "min-w-0 px-0.5",
704
+ children: [/* @__PURE__ */ jsx("p", {
705
+ className: "truncate text-sm font-medium",
706
+ children: entry.name
707
+ }), /* @__PURE__ */ jsx("p", {
708
+ className: "text-muted-foreground truncate text-xs",
709
+ children: location ?? (entry.type === "folder" ? tt(`kinds.folder`, {}, "Folder") : size)
710
+ })]
711
+ })] }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
712
+ thumbnail ? /* @__PURE__ */ jsx("img", {
713
+ src: thumbnail,
714
+ alt: "",
715
+ loading: "lazy",
716
+ draggable: false,
717
+ className: "size-8 rounded object-cover",
718
+ onError: () => setBroken(true)
719
+ }) : /* @__PURE__ */ jsx(EntryIcon, {
720
+ entry,
721
+ className: "size-5"
722
+ }),
723
+ /* @__PURE__ */ jsxs("div", {
724
+ className: "min-w-0",
725
+ children: [/* @__PURE__ */ jsx("p", {
726
+ className: "truncate text-sm font-medium",
727
+ children: entry.name
728
+ }), location && /* @__PURE__ */ jsx("p", {
729
+ className: "text-muted-foreground truncate text-xs",
730
+ children: location
731
+ })]
732
+ }),
733
+ /* @__PURE__ */ jsx("span", {
734
+ className: "text-muted-foreground hidden text-end text-sm tabular-nums sm:block",
735
+ children: size
736
+ }),
737
+ /* @__PURE__ */ jsx("span", {
738
+ className: "text-muted-foreground hidden truncate text-sm sm:block",
739
+ children: modified
740
+ })
741
+ ] }), selected && /* @__PURE__ */ jsx(CheckIcon, {
742
+ className: "bg-primary text-primary-foreground absolute end-1.5 top-1.5 size-4 rounded-full p-0.5",
743
+ "aria-hidden": "true"
744
+ })]
745
+ });
746
+ }
747
+ function FolderTree({ controller, onOpen, active, dropHandlers, dropTarget }) {
748
+ const t = useT();
749
+ useStore(controller.store);
750
+ const renderLevel = (parent, level) => {
751
+ const folders = controller.children(parent);
752
+ if (!folders || folders.length === 0) return null;
753
+ return /* @__PURE__ */ jsx("ul", {
754
+ className: "flex flex-col",
755
+ role: level === 1 ? void 0 : "group",
756
+ children: folders.map((folder) => {
757
+ const expanded = controller.isExpanded(folder.path);
758
+ return /* @__PURE__ */ jsxs("li", {
759
+ "data-slot": "file-manager-tree-item",
760
+ children: [/* @__PURE__ */ jsxs("div", {
761
+ className: cn("hover:bg-accent flex items-center gap-1 rounded-md pe-2 text-sm", active === folder.path && "bg-accent font-medium", dropTarget === folder.path && "ring-primary ring-2"),
762
+ style: { paddingInlineStart: `${(level - 1) * .75}rem` },
763
+ ...dropHandlers ? dropHandlers(folder.path) : {},
764
+ children: [folder.hasChildren ? /* @__PURE__ */ jsx("button", {
765
+ type: "button",
766
+ className: "text-muted-foreground hover:text-foreground rounded p-1",
767
+ "aria-expanded": expanded,
768
+ "aria-label": t(expanded ? "file-manager.collapse" : "file-manager.expand", { name: folder.name }, expanded ? "Collapse :name" : "Expand :name"),
769
+ onClick: () => void controller.toggleFolder(folder.path),
770
+ children: /* @__PURE__ */ jsx(ChevronRightIcon, {
771
+ className: cn("size-3.5 transition-transform", expanded ? "rotate-90" : "rtl:rotate-180"),
772
+ "aria-hidden": "true"
773
+ })
774
+ }) : /* @__PURE__ */ jsx("span", {
775
+ className: "w-5.5 shrink-0",
776
+ "aria-hidden": "true"
777
+ }), /* @__PURE__ */ jsxs("button", {
778
+ type: "button",
779
+ className: "flex min-w-0 flex-1 items-center gap-2 py-1.5 text-start",
780
+ "aria-current": active === folder.path ? "page" : void 0,
781
+ onClick: () => onOpen(folder.path),
782
+ children: [/* @__PURE__ */ jsx(FolderIcon, {
783
+ className: "text-primary size-4 shrink-0",
784
+ "aria-hidden": "true"
785
+ }), /* @__PURE__ */ jsx("span", {
786
+ className: "truncate",
787
+ children: folder.name
788
+ })]
789
+ })]
790
+ }), expanded && renderLevel(folder.path, level + 1)]
791
+ }, folder.path);
792
+ })
793
+ });
794
+ };
795
+ return /* @__PURE__ */ jsxs("nav", {
796
+ "aria-label": t("file-manager.folders", {}, "Folders"),
797
+ "data-slot": "file-manager-tree",
798
+ children: [/* @__PURE__ */ jsxs("button", {
799
+ type: "button",
800
+ className: cn("hover:bg-accent flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-start text-sm", active === "" && "bg-accent font-medium", dropTarget === "" && active !== "" && "ring-primary ring-2"),
801
+ "aria-current": active === "" ? "page" : void 0,
802
+ onClick: () => onOpen(""),
803
+ children: [/* @__PURE__ */ jsx(FolderOpenIcon, {
804
+ className: "text-primary size-4",
805
+ "aria-hidden": "true"
806
+ }), t("file-manager.root", {}, "Files")]
807
+ }), renderLevel("", 1)]
808
+ });
809
+ }
810
+ function Details({ controller, tt, formatter, hideHeading }) {
811
+ const state = useStore(controller.store);
812
+ const details = state.details;
813
+ return /* @__PURE__ */ jsxs("div", {
814
+ className: "flex flex-col gap-4 p-4",
815
+ children: [!hideHeading && /* @__PURE__ */ jsxs("div", {
816
+ className: "flex items-center justify-between gap-2",
817
+ children: [/* @__PURE__ */ jsx("h3", {
818
+ className: "text-sm font-semibold",
819
+ children: tt("details", {}, "Details")
820
+ }), /* @__PURE__ */ jsx(Button, {
821
+ type: "button",
822
+ variant: "ghost",
823
+ size: "icon-xs",
824
+ onClick: () => controller.closeDetails(),
825
+ "aria-label": tt("close", {}, "Close"),
826
+ children: /* @__PURE__ */ jsx(XIcon, { "aria-hidden": "true" })
827
+ })]
828
+ }), !details ? /* @__PURE__ */ jsx("p", {
829
+ className: "text-muted-foreground text-sm",
830
+ children: tt("picker_empty", {}, "No file chosen")
831
+ }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
832
+ /* @__PURE__ */ jsx("div", {
833
+ className: "bg-muted/60 flex aspect-video items-center justify-center overflow-hidden rounded-md",
834
+ children: details.thumbnail ? /* @__PURE__ */ jsx("img", {
835
+ src: details.thumbnail,
836
+ alt: "",
837
+ className: "size-full object-contain"
838
+ }) : /* @__PURE__ */ jsx(EntryIcon, {
839
+ entry: details,
840
+ className: "size-12"
841
+ })
842
+ }),
843
+ /* @__PURE__ */ jsx("p", {
844
+ className: "font-medium break-all",
845
+ children: details.name
846
+ }),
847
+ state.detailsLoading && /* @__PURE__ */ jsx(Spinner, {}),
848
+ /* @__PURE__ */ jsxs("dl", {
849
+ className: "grid grid-cols-[auto_1fr] gap-x-4 gap-y-2 text-sm",
850
+ children: [
851
+ /* @__PURE__ */ jsx(DetailRow, {
852
+ label: tt("type", {}, "Type"),
853
+ value: details.mime ?? tt(`kinds.${details.kind}`, {}, details.kind)
854
+ }),
855
+ details.type === "file" && /* @__PURE__ */ jsx(DetailRow, {
856
+ label: tt("size", {}, "Size"),
857
+ value: fileManagerSize(details.size, formatter)
858
+ }),
859
+ details.items !== void 0 && /* @__PURE__ */ jsx(DetailRow, {
860
+ label: tt("items", {}, "Items"),
861
+ value: `${formatter.number(details.items)}${details.itemsTruncated ? "+" : ""}`
862
+ }),
863
+ details.width && details.height && /* @__PURE__ */ jsx(DetailRow, {
864
+ label: tt("dimensions", {}, "Dimensions"),
865
+ value: tt("dimensions_value", {
866
+ width: formatter.number(details.width),
867
+ height: formatter.number(details.height)
868
+ }, ":width × :height px")
869
+ }),
870
+ details.trashed ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(DetailRow, {
871
+ label: tt("original_location", {}, "Original location"),
872
+ value: details.trashed.originalPath
873
+ }), details.trashed.deletedAt && /* @__PURE__ */ jsx(DetailRow, {
874
+ label: tt("deleted_at", {}, "Deleted"),
875
+ value: formatter.dateTime(details.trashed.deletedAt)
876
+ })] }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
877
+ details.modified && /* @__PURE__ */ jsx(DetailRow, {
878
+ label: tt("modified", {}, "Modified"),
879
+ value: formatter.dateTime(details.modified)
880
+ }),
881
+ details.location !== void 0 && /* @__PURE__ */ jsx(DetailRow, {
882
+ label: tt("location", {}, "Location"),
883
+ value: details.location === "" ? tt("root", {}, "Files") : details.location
884
+ }),
885
+ details.links !== void 0 && /* @__PURE__ */ jsx(DetailRow, {
886
+ label: tt("links", {}, "Links"),
887
+ value: formatter.number(details.links)
888
+ })
889
+ ] })
890
+ ]
891
+ })
892
+ ] })]
893
+ });
894
+ }
895
+ function DetailRow({ label, value }) {
896
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("dt", {
897
+ className: "text-muted-foreground",
898
+ children: label
899
+ }), /* @__PURE__ */ jsx("dd", {
900
+ className: "min-w-0 break-all",
901
+ children: value
902
+ })] });
903
+ }
904
+ function Uploads({ controller, tt }) {
905
+ const state = useStore(controller.store);
906
+ const formatter = useFormatter();
907
+ if (state.uploads.length === 0) return null;
908
+ const done = state.uploads.filter((upload) => upload.status === "done").length;
909
+ const finished = state.uploads.every((upload) => upload.status === "done" || upload.status === "error");
910
+ return /* @__PURE__ */ jsxs("section", {
911
+ className: "bg-popover fixed end-4 bottom-4 z-40 flex max-h-80 w-[min(22rem,calc(100vw-2rem))] flex-col overflow-hidden rounded-lg border shadow-lg",
912
+ "aria-label": tt("uploads", {}, "Uploads"),
913
+ "data-slot": "file-manager-uploads",
914
+ children: [/* @__PURE__ */ jsxs("header", {
915
+ className: "flex items-center gap-2 border-b px-3 py-2 text-sm font-medium",
916
+ children: [
917
+ /* @__PURE__ */ jsx(UploadIcon, {
918
+ className: "size-4",
919
+ "aria-hidden": "true"
920
+ }),
921
+ /* @__PURE__ */ jsx("span", {
922
+ className: "flex-1",
923
+ role: "status",
924
+ children: tt("uploads_summary", {
925
+ done,
926
+ total: state.uploads.length
927
+ }, ":done of :total uploaded")
928
+ }),
929
+ finished && /* @__PURE__ */ jsx(Button, {
930
+ type: "button",
931
+ variant: "ghost",
932
+ size: "icon-xs",
933
+ onClick: () => controller.clearUploads(),
934
+ "aria-label": tt("dismiss", {}, "Dismiss"),
935
+ children: /* @__PURE__ */ jsx(XIcon, { "aria-hidden": "true" })
936
+ })
937
+ ]
938
+ }), /* @__PURE__ */ jsx("ul", {
939
+ className: "flex flex-col gap-2 overflow-y-auto p-3",
940
+ children: state.uploads.map((upload) => /* @__PURE__ */ jsxs("li", {
941
+ className: "flex flex-col gap-1 text-sm",
942
+ "data-status": upload.status,
943
+ children: [/* @__PURE__ */ jsxs("div", {
944
+ className: "flex items-center gap-2",
945
+ children: [/* @__PURE__ */ jsx("span", {
946
+ className: "min-w-0 flex-1 truncate",
947
+ children: upload.name
948
+ }), upload.status === "done" ? /* @__PURE__ */ jsx(CheckIcon, {
949
+ className: "size-4 text-emerald-600",
950
+ "aria-label": tt("upload_done", {}, "Uploaded")
951
+ }) : upload.status === "error" ? /* @__PURE__ */ jsx(Button, {
952
+ type: "button",
953
+ variant: "ghost",
954
+ size: "icon-xs",
955
+ onClick: () => controller.dismissUpload(upload.id),
956
+ "aria-label": tt("dismiss", {}, "Dismiss"),
957
+ children: /* @__PURE__ */ jsx(XIcon, { "aria-hidden": "true" })
958
+ }) : /* @__PURE__ */ jsx("span", {
959
+ className: "text-muted-foreground text-xs tabular-nums",
960
+ children: formatter.percent(upload.progress)
961
+ })]
962
+ }), upload.status === "error" ? /* @__PURE__ */ jsx("p", {
963
+ className: "text-destructive text-xs",
964
+ role: "alert",
965
+ children: upload.error ?? tt("upload_failed", {}, "Failed")
966
+ }) : upload.status !== "done" && /* @__PURE__ */ jsx("div", {
967
+ role: "progressbar",
968
+ "aria-valuemin": 0,
969
+ "aria-valuemax": 100,
970
+ "aria-valuenow": Math.round(upload.progress * 100),
971
+ "aria-label": tt("upload_progress", {
972
+ name: upload.name,
973
+ percent: formatter.percent(upload.progress)
974
+ }, ":name, :percent uploaded"),
975
+ className: "bg-muted h-1.5 overflow-hidden rounded-full",
976
+ children: /* @__PURE__ */ jsx("div", {
977
+ className: "bg-primary h-full rounded-full transition-[width]",
978
+ style: { width: `${upload.progress * 100}%` }
979
+ })
980
+ })]
981
+ }, upload.id))
982
+ })]
983
+ });
984
+ }
985
+ function Dialogs({ controller, tt, choice, formatter }) {
986
+ const state = useStore(controller.store);
987
+ const dialog = state.dialog;
988
+ const [name, setName] = useState("");
989
+ const [expiry, setExpiry] = useState("");
990
+ const [copied, setCopied] = useState(false);
991
+ const nameId = useId();
992
+ const errorId = useId();
993
+ const close = () => controller.closeDialog();
994
+ const share = controller.component.share;
995
+ const dialogKey = dialog ? `${dialog.type}:${"entry" in dialog ? dialog.entry.path : ""}` : "";
996
+ const [openedDialog, setOpenedDialog] = useState("");
997
+ if (dialogKey !== openedDialog) {
998
+ setOpenedDialog(dialogKey);
999
+ if (dialog?.type === "rename") setName(dialog.entry.name);
1000
+ if (dialog?.type === "createFolder") setName("");
1001
+ if (dialog?.type === "share") {
1002
+ setExpiry(String(share?.expiries[0] ?? ""));
1003
+ setCopied(false);
1004
+ }
1005
+ }
1006
+ const error = state.error ? /* @__PURE__ */ jsx("p", {
1007
+ id: errorId,
1008
+ className: "text-destructive text-sm",
1009
+ role: "alert",
1010
+ children: state.error
1011
+ }) : null;
1012
+ const copy = async (url) => {
1013
+ try {
1014
+ await navigator.clipboard.writeText(url);
1015
+ setCopied(true);
1016
+ } catch {
1017
+ setCopied(false);
1018
+ }
1019
+ };
1020
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
1021
+ /* @__PURE__ */ jsx(Dialog, {
1022
+ open: dialog?.type === "createFolder" || dialog?.type === "rename",
1023
+ onOpenChange: (open) => !open && close(),
1024
+ children: /* @__PURE__ */ jsx(DialogContent, {
1025
+ "data-slot": "file-manager-dialog",
1026
+ children: /* @__PURE__ */ jsxs("form", {
1027
+ className: "flex flex-col gap-4",
1028
+ onSubmit: (event) => {
1029
+ event.preventDefault();
1030
+ if (dialog?.type === "rename") controller.rename(dialog.entry.path, name);
1031
+ else controller.createFolder(name);
1032
+ },
1033
+ children: [
1034
+ /* @__PURE__ */ jsx(DialogHeader, { children: /* @__PURE__ */ jsx(DialogTitle, { children: dialog?.type === "rename" ? tt("rename_heading", { name: dialog.entry.name }, "Rename “:name”") : tt("new_folder", {}, "New folder") }) }),
1035
+ /* @__PURE__ */ jsxs("div", {
1036
+ className: "flex flex-col gap-2",
1037
+ children: [
1038
+ /* @__PURE__ */ jsx("label", {
1039
+ htmlFor: nameId,
1040
+ className: "text-sm font-medium",
1041
+ children: dialog?.type === "rename" ? tt("name", {}, "Name") : tt("folder_name", {}, "Folder name")
1042
+ }),
1043
+ /* @__PURE__ */ jsx(Input, {
1044
+ id: nameId,
1045
+ value: name,
1046
+ autoFocus: true,
1047
+ onChange: (event) => setName(event.target.value),
1048
+ "aria-invalid": state.error ? true : void 0,
1049
+ "aria-describedby": state.error ? errorId : void 0
1050
+ }),
1051
+ error
1052
+ ]
1053
+ }),
1054
+ /* @__PURE__ */ jsxs(DialogFooter, { children: [/* @__PURE__ */ jsx(Button, {
1055
+ type: "button",
1056
+ variant: "outline",
1057
+ onClick: close,
1058
+ children: tt("cancel", {}, "Cancel")
1059
+ }), /* @__PURE__ */ jsxs(Button, {
1060
+ type: "submit",
1061
+ disabled: state.busy || name.trim() === "",
1062
+ children: [state.busy && /* @__PURE__ */ jsx(Spinner, {}), dialog?.type === "rename" ? tt("save", {}, "Save") : tt("create", {}, "Create")]
1063
+ })] })
1064
+ ]
1065
+ })
1066
+ })
1067
+ }),
1068
+ /* @__PURE__ */ jsx(Dialog, {
1069
+ open: dialog?.type === "move" || dialog?.type === "copy",
1070
+ onOpenChange: (open) => !open && close(),
1071
+ children: /* @__PURE__ */ jsxs(DialogContent, {
1072
+ "data-slot": "file-manager-dialog",
1073
+ children: [
1074
+ /* @__PURE__ */ jsxs(DialogHeader, { children: [/* @__PURE__ */ jsx(DialogTitle, { children: dialog?.type === "move" || dialog?.type === "copy" ? choice(`file-manager.${dialog.type}_heading`, dialog.paths.length, {}, dialog.type === "move" ? "Move :count items" : "Copy :count items") : "" }), /* @__PURE__ */ jsx(DialogDescription, { children: tt("destination", {}, "Destination folder") })] }),
1075
+ /* @__PURE__ */ jsx("div", {
1076
+ className: "max-h-72 overflow-y-auto rounded-md border p-2",
1077
+ children: (dialog?.type === "move" || dialog?.type === "copy") && /* @__PURE__ */ jsx(FolderTree, {
1078
+ controller,
1079
+ active: dialog.destination,
1080
+ onOpen: (path) => controller.openDialog({
1081
+ ...dialog,
1082
+ destination: path
1083
+ })
1084
+ })
1085
+ }),
1086
+ error,
1087
+ /* @__PURE__ */ jsxs(DialogFooter, { children: [/* @__PURE__ */ jsx(Button, {
1088
+ type: "button",
1089
+ variant: "outline",
1090
+ onClick: close,
1091
+ children: tt("cancel", {}, "Cancel")
1092
+ }), /* @__PURE__ */ jsxs(Button, {
1093
+ type: "button",
1094
+ disabled: state.busy,
1095
+ onClick: () => {
1096
+ if (dialog?.type === "move" || dialog?.type === "copy") controller.transfer(dialog.type, dialog.paths, dialog.destination);
1097
+ },
1098
+ children: [state.busy && /* @__PURE__ */ jsx(Spinner, {}), dialog?.type === "copy" ? tt("copy_here", {}, "Copy here") : tt("move_here", {}, "Move here")]
1099
+ })] })
1100
+ ]
1101
+ })
1102
+ }),
1103
+ /* @__PURE__ */ jsx(Dialog, {
1104
+ open: dialog?.type === "delete" || dialog?.type === "emptyTrash",
1105
+ onOpenChange: (open) => !open && close(),
1106
+ children: /* @__PURE__ */ jsxs(DialogContent, {
1107
+ "data-slot": "file-manager-dialog",
1108
+ children: [
1109
+ /* @__PURE__ */ jsxs(DialogHeader, { children: [/* @__PURE__ */ jsx(DialogTitle, { children: dialog?.type === "delete" ? choice("file-manager.delete_heading", dialog.paths.length, {}, "Delete :count items?") : tt("empty_trash_heading", {}, "Empty the trash?") }), /* @__PURE__ */ jsx(DialogDescription, { children: dialog?.type === "delete" && !dialog.permanent ? tt("delete_description_trash", {}, "They go to the trash, where you can restore them.") : dialog?.type === "emptyTrash" ? tt("empty_trash_description", {}, "Everything in the trash is deleted for good.") : tt("delete_description", {}, "They are deleted for good. This cannot be undone.") })] }),
1110
+ error,
1111
+ /* @__PURE__ */ jsxs(DialogFooter, { children: [/* @__PURE__ */ jsx(Button, {
1112
+ type: "button",
1113
+ variant: "outline",
1114
+ onClick: close,
1115
+ children: tt("cancel", {}, "Cancel")
1116
+ }), /* @__PURE__ */ jsxs(Button, {
1117
+ type: "button",
1118
+ variant: "destructive",
1119
+ disabled: state.busy,
1120
+ onClick: () => {
1121
+ if (dialog?.type === "delete") controller.remove(dialog.paths);
1122
+ else controller.emptyTrash();
1123
+ },
1124
+ children: [state.busy && /* @__PURE__ */ jsx(Spinner, {}), dialog?.type === "emptyTrash" ? tt("empty_trash", {}, "Empty trash") : dialog?.type === "delete" && dialog.permanent ? tt("delete_permanently", {}, "Delete permanently") : tt("delete", {}, "Delete")]
1125
+ })] })
1126
+ ]
1127
+ })
1128
+ }),
1129
+ /* @__PURE__ */ jsx(Dialog, {
1130
+ open: dialog?.type === "share",
1131
+ onOpenChange: (open) => !open && close(),
1132
+ children: /* @__PURE__ */ jsx(DialogContent, {
1133
+ "data-slot": "file-manager-dialog",
1134
+ children: dialog?.type === "share" && /* @__PURE__ */ jsxs(Fragment$1, { children: [
1135
+ /* @__PURE__ */ jsxs(DialogHeader, { children: [/* @__PURE__ */ jsx(DialogTitle, { children: tt("share_heading", { name: dialog.entry.name }, "Share “:name”") }), /* @__PURE__ */ jsx(DialogDescription, { children: tt("share_hint", {}, "Anyone with the link can open this file, without signing in.") })] }),
1136
+ /* @__PURE__ */ jsxs("div", {
1137
+ className: "flex flex-wrap items-end gap-2",
1138
+ children: [/* @__PURE__ */ jsxs("label", {
1139
+ className: "flex min-w-40 flex-1 flex-col gap-1 text-sm",
1140
+ children: [/* @__PURE__ */ jsx("span", {
1141
+ className: "font-medium",
1142
+ children: tt("share_expiry", {}, "Link expires after")
1143
+ }), /* @__PURE__ */ jsxs("select", {
1144
+ className: SELECT,
1145
+ value: expiry,
1146
+ onChange: (event) => setExpiry(event.target.value),
1147
+ children: [(share?.expiries ?? []).map((minutes) => {
1148
+ const label = fileManagerExpiry(minutes);
1149
+ return /* @__PURE__ */ jsx("option", {
1150
+ value: minutes,
1151
+ children: choice(`file-manager.${label.key}`, label.count, {}, `:count`)
1152
+ }, minutes);
1153
+ }), share?.publicLinks && /* @__PURE__ */ jsx("option", {
1154
+ value: "never",
1155
+ children: tt("expiry_never", {}, "Never")
1156
+ })]
1157
+ })]
1158
+ }), /* @__PURE__ */ jsxs(Button, {
1159
+ type: "button",
1160
+ disabled: state.busy,
1161
+ onClick: () => void controller.createLink(expiry === "never" ? null : Number(expiry)),
1162
+ children: [state.busy ? /* @__PURE__ */ jsx(Spinner, {}) : /* @__PURE__ */ jsx(LinkIcon, { "aria-hidden": "true" }), tt("create_link", {}, "Create link")]
1163
+ })]
1164
+ }),
1165
+ error,
1166
+ dialog.url && /* @__PURE__ */ jsxs("div", {
1167
+ className: "flex flex-col gap-1",
1168
+ children: [
1169
+ /* @__PURE__ */ jsx("span", {
1170
+ className: "text-sm font-medium",
1171
+ children: tt("link", {}, "Shareable link")
1172
+ }),
1173
+ /* @__PURE__ */ jsxs("div", {
1174
+ className: "flex gap-2",
1175
+ children: [/* @__PURE__ */ jsx(Input, {
1176
+ readOnly: true,
1177
+ value: dialog.url,
1178
+ dir: "ltr",
1179
+ onFocus: (event) => event.target.select(),
1180
+ "aria-label": tt("link", {}, "Shareable link")
1181
+ }), /* @__PURE__ */ jsxs(Button, {
1182
+ type: "button",
1183
+ variant: "outline",
1184
+ onClick: () => void copy(dialog.url ?? ""),
1185
+ children: [copied ? /* @__PURE__ */ jsx(CheckIcon, { "aria-hidden": "true" }) : /* @__PURE__ */ jsx(CopyIcon, { "aria-hidden": "true" }), copied ? tt("link_copied", {}, "Link copied") : tt("copy_link", {}, "Copy link")]
1186
+ })]
1187
+ }),
1188
+ /* @__PURE__ */ jsx("span", {
1189
+ className: "text-muted-foreground text-xs",
1190
+ children: dialog.expiresAt ? tt("link_expires", { date: formatter.dateTime(dialog.expiresAt) }, "Expires :date") : tt("link_never_expires", {}, "Never expires")
1191
+ })
1192
+ ]
1193
+ }),
1194
+ share?.publicLinks && /* @__PURE__ */ jsxs("div", {
1195
+ className: "flex flex-col gap-2",
1196
+ "data-slot": "file-manager-links",
1197
+ children: [/* @__PURE__ */ jsx("h4", {
1198
+ className: "text-sm font-medium",
1199
+ children: tt("links", {}, "Links")
1200
+ }), dialog.links === null ? /* @__PURE__ */ jsx(Spinner, {}) : dialog.links.length === 0 ? /* @__PURE__ */ jsx("p", {
1201
+ className: "text-muted-foreground text-sm",
1202
+ children: tt("no_links", {}, "No links yet")
1203
+ }) : /* @__PURE__ */ jsx("ul", {
1204
+ className: "flex max-h-48 flex-col divide-y overflow-y-auto rounded-md border",
1205
+ children: dialog.links.map((link) => /* @__PURE__ */ jsxs("li", {
1206
+ className: "flex items-center gap-2 px-3 py-2 text-sm",
1207
+ children: [
1208
+ /* @__PURE__ */ jsxs("div", {
1209
+ className: "min-w-0 flex-1",
1210
+ children: [/* @__PURE__ */ jsx("p", {
1211
+ className: cn("truncate", link.expired && "text-muted-foreground line-through"),
1212
+ dir: "ltr",
1213
+ children: link.url
1214
+ }), /* @__PURE__ */ jsxs("p", {
1215
+ className: "text-muted-foreground text-xs",
1216
+ children: [
1217
+ link.expired ? tt("link_expired", {}, "Expired") : link.expiresAt ? tt("link_expires", { date: formatter.dateTime(link.expiresAt) }, "Expires :date") : tt("link_never_expires", {}, "Never expires"),
1218
+ " · ",
1219
+ choice("file-manager.link_downloads", link.downloads, {}, ":count downloads")
1220
+ ]
1221
+ })]
1222
+ }),
1223
+ link.url && !link.expired && /* @__PURE__ */ jsx(Button, {
1224
+ type: "button",
1225
+ variant: "ghost",
1226
+ size: "icon-xs",
1227
+ onClick: () => void copy(link.url ?? ""),
1228
+ "aria-label": tt("copy_link", {}, "Copy link"),
1229
+ children: /* @__PURE__ */ jsx(CopyIcon, { "aria-hidden": "true" })
1230
+ }),
1231
+ /* @__PURE__ */ jsx(Button, {
1232
+ type: "button",
1233
+ variant: "ghost",
1234
+ size: "sm",
1235
+ className: "text-destructive",
1236
+ onClick: () => void controller.revokeLink(link.id),
1237
+ children: tt("revoke", {}, "Revoke")
1238
+ })
1239
+ ]
1240
+ }, link.id))
1241
+ })]
1242
+ }),
1243
+ /* @__PURE__ */ jsx(DialogFooter, { children: /* @__PURE__ */ jsx(Button, {
1244
+ type: "button",
1245
+ variant: "outline",
1246
+ onClick: close,
1247
+ children: tt("close", {}, "Close")
1248
+ }) })
1249
+ ] })
1250
+ })
1251
+ })
1252
+ ] });
1253
+ }
1254
+ function Preview({ controller, tt, direction }) {
1255
+ const preview = useStore(controller.store).preview;
1256
+ const data = preview?.data;
1257
+ const [editing, setEditing] = useState(null);
1258
+ const previous = controller.previewSibling(-1);
1259
+ const next = controller.previewSibling(1);
1260
+ const edit = async () => {
1261
+ if (!data?.url || !preview) return;
1262
+ const source = await fetchEditableImage(data.url, preview.entry.name);
1263
+ if (!source) return;
1264
+ setEditing({
1265
+ file: source,
1266
+ resolve: (edited) => {
1267
+ setEditing(null);
1268
+ if (edited && edited !== source) controller.saveEditedImage(edited);
1269
+ }
1270
+ });
1271
+ };
1272
+ const onKeyDown = (event) => {
1273
+ const back = direction === "rtl" ? "ArrowRight" : "ArrowLeft";
1274
+ const forward = direction === "rtl" ? "ArrowLeft" : "ArrowRight";
1275
+ if (event.target instanceof HTMLElement && [
1276
+ "VIDEO",
1277
+ "AUDIO",
1278
+ "INPUT"
1279
+ ].includes(event.target.tagName)) return;
1280
+ if (event.key === back && previous) controller.openPreview(previous);
1281
+ if (event.key === forward && next) controller.openPreview(next);
1282
+ };
1283
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Dialog, {
1284
+ open: preview !== null,
1285
+ onOpenChange: (open) => !open && controller.closePreview(),
1286
+ children: /* @__PURE__ */ jsxs(DialogContent, {
1287
+ className: "flex max-h-[90vh] flex-col sm:max-w-4xl",
1288
+ "data-slot": "file-manager-preview",
1289
+ onKeyDown,
1290
+ children: [
1291
+ /* @__PURE__ */ jsx(DialogHeader, { children: /* @__PURE__ */ jsx(DialogTitle, {
1292
+ className: "truncate pe-8",
1293
+ children: preview?.entry.name
1294
+ }) }),
1295
+ /* @__PURE__ */ jsx("div", {
1296
+ className: "bg-muted/40 flex min-h-64 flex-1 items-center justify-center overflow-auto rounded-md",
1297
+ children: !data ? /* @__PURE__ */ jsx(Spinner, {}) : !data.previewable ? /* @__PURE__ */ jsxs("div", {
1298
+ className: "text-muted-foreground flex flex-col items-center gap-2 p-8 text-center text-sm",
1299
+ children: [preview && /* @__PURE__ */ jsx(EntryIcon, {
1300
+ entry: preview.entry,
1301
+ className: "size-12"
1302
+ }), /* @__PURE__ */ jsx("p", { children: tt("preview_unavailable", {}, "There is no preview for this type of file.") })]
1303
+ }) : data.kind === "image" ? /* @__PURE__ */ jsx("img", {
1304
+ src: data.url,
1305
+ alt: preview?.entry.name ?? "",
1306
+ className: "max-h-[70vh] max-w-full object-contain"
1307
+ }) : data.kind === "pdf" ? /* @__PURE__ */ jsx("iframe", {
1308
+ src: data.url,
1309
+ title: preview?.entry.name ?? "",
1310
+ className: "h-[70vh] w-full rounded-md bg-white"
1311
+ }) : data.kind === "video" ? /* @__PURE__ */ jsx("video", {
1312
+ src: data.url,
1313
+ controls: true,
1314
+ className: "max-h-[70vh] max-w-full",
1315
+ children: /* @__PURE__ */ jsx("track", { kind: "captions" })
1316
+ }) : data.kind === "audio" ? /* @__PURE__ */ jsx("audio", {
1317
+ src: data.url,
1318
+ controls: true,
1319
+ className: "w-full max-w-md"
1320
+ }) : /* @__PURE__ */ jsx("pre", {
1321
+ className: "h-full max-h-[70vh] w-full overflow-auto p-4 font-mono text-xs whitespace-pre-wrap",
1322
+ dir: "auto",
1323
+ tabIndex: 0,
1324
+ children: data.text
1325
+ })
1326
+ }),
1327
+ data?.truncated && /* @__PURE__ */ jsx("p", {
1328
+ className: "text-muted-foreground text-xs",
1329
+ children: tt("preview_truncated", {}, "Only the beginning of this file is shown.")
1330
+ }),
1331
+ /* @__PURE__ */ jsxs(DialogFooter, {
1332
+ className: "flex-row flex-wrap items-center sm:justify-between",
1333
+ children: [/* @__PURE__ */ jsxs("div", {
1334
+ className: "flex gap-1",
1335
+ children: [/* @__PURE__ */ jsx(Button, {
1336
+ type: "button",
1337
+ variant: "outline",
1338
+ size: "icon-sm",
1339
+ disabled: !previous,
1340
+ onClick: () => previous && void controller.openPreview(previous),
1341
+ "aria-label": tt("previous", {}, "Previous file"),
1342
+ children: /* @__PURE__ */ jsx(ChevronLeftIcon, {
1343
+ className: "rtl:rotate-180",
1344
+ "aria-hidden": "true"
1345
+ })
1346
+ }), /* @__PURE__ */ jsx(Button, {
1347
+ type: "button",
1348
+ variant: "outline",
1349
+ size: "icon-sm",
1350
+ disabled: !next,
1351
+ onClick: () => next && void controller.openPreview(next),
1352
+ "aria-label": tt("next", {}, "Next file"),
1353
+ children: /* @__PURE__ */ jsx(ChevronRightIcon, {
1354
+ className: "rtl:rotate-180",
1355
+ "aria-hidden": "true"
1356
+ })
1357
+ })]
1358
+ }), /* @__PURE__ */ jsxs("div", {
1359
+ className: "flex gap-2",
1360
+ children: [data?.editable && data.url && /* @__PURE__ */ jsxs(Button, {
1361
+ type: "button",
1362
+ variant: "outline",
1363
+ size: "sm",
1364
+ onClick: () => void edit(),
1365
+ children: [/* @__PURE__ */ jsx(SquarePenIcon, { "aria-hidden": "true" }), tt("edit_image", {}, "Edit image")]
1366
+ }), data?.downloadUrl && /* @__PURE__ */ jsx(Button, {
1367
+ type: "button",
1368
+ size: "sm",
1369
+ asChild: true,
1370
+ children: /* @__PURE__ */ jsxs("a", {
1371
+ href: data.downloadUrl,
1372
+ children: [/* @__PURE__ */ jsx(DownloadIcon, { "aria-hidden": "true" }), tt("download", {}, "Download")]
1373
+ })
1374
+ })]
1375
+ })]
1376
+ })
1377
+ ]
1378
+ })
1379
+ }), /* @__PURE__ */ jsx(ImageEditorDialog, {
1380
+ request: editing,
1381
+ options: IMAGE_EDITOR
1382
+ })] });
1383
+ }
1384
+ //#endregion
1385
+ export { FileManager, FileManagerView };
1386
+
1387
+ //# sourceMappingURL=file-manager.js.map