@burdenoff/microfe-files 2026.625.2 → 2026.625.3

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.
@@ -1,54 +1,51 @@
1
1
  import { tWithFallback as e } from "../utils/i18n.js";
2
- import { Clock as t, FolderOpen as n, Star as r, Trash2 as i } from "lucide-react";
3
- import { jsx as a } from "react/jsx-runtime";
4
- import { useI18n as o } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
5
- import { Button as s, EmptyState as c } from "@burdenoff/fe-libs/ui";
2
+ import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
+ import { useI18n as r } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
4
+ import { Button as i, IllustratedEmptyState as a } from "@burdenoff/fe-libs/ui";
6
5
  //#region src/files/components/EmptyState.tsx
7
- function l({ type: l, onUpload: u, onNewFolder: d }) {
8
- let { t: f } = o(), p = {
6
+ function o({ type: o, onUpload: s, onNewFolder: c }) {
7
+ let { t: l } = r(), u = {
9
8
  all: {
10
- icon: /* @__PURE__ */ a(n, { className: "size-12 text-text-tertiary" }),
11
- title: e(f, "files.empty.all.title", "No files or folders yet"),
12
- description: e(f, "files.empty.all.description", "Upload files or create folders to get started"),
9
+ title: e(l, "files.empty.all.title", "No files or folders yet"),
10
+ description: e(l, "files.empty.all.description", "Upload files or create folders to get started"),
13
11
  showActions: !0
14
12
  },
15
13
  recent: {
16
- icon: /* @__PURE__ */ a(t, { className: "size-12 text-text-tertiary" }),
17
- title: e(f, "files.empty.recent.title", "No recent files"),
18
- description: e(f, "files.empty.recent.description", "Files you recently opened will appear here"),
14
+ title: e(l, "files.empty.recent.title", "No recent files"),
15
+ description: e(l, "files.empty.recent.description", "Files you recently opened will appear here"),
19
16
  showActions: !1
20
17
  },
21
18
  starred: {
22
- icon: /* @__PURE__ */ a(r, { className: "size-12 text-text-tertiary" }),
23
- title: e(f, "files.empty.starred.title", "No starred items"),
24
- description: e(f, "files.empty.starred.description", "Star files and folders to find them easily"),
19
+ title: e(l, "files.empty.starred.title", "No starred items"),
20
+ description: e(l, "files.empty.starred.description", "Star files and folders to find them easily"),
25
21
  showActions: !1
26
22
  },
27
23
  bin: {
28
- icon: /* @__PURE__ */ a(i, { className: "size-12 text-text-tertiary" }),
29
- title: e(f, "files.empty.bin.title", "Bin is empty"),
30
- description: e(f, "files.empty.bin.description", "Deleted files and folders will appear here"),
24
+ title: e(l, "files.empty.bin.title", "Bin is empty"),
25
+ description: e(l, "files.empty.bin.description", "Deleted files and folders will appear here"),
31
26
  showActions: !1
32
27
  }
33
- }[l], m = p.showActions && u ? /* @__PURE__ */ a(s, {
34
- type: "button",
35
- onClick: u,
36
- children: e(f, "files.empty.uploadFiles", "Upload Files")
37
- }) : void 0, h = p.showActions && d ? /* @__PURE__ */ a(s, {
38
- type: "button",
39
- variant: "outline",
40
- onClick: d,
41
- children: e(f, "files.empty.newFolder", "New Folder")
28
+ }[o], d = u.showActions && s ? /* @__PURE__ */ n("div", {
29
+ className: "flex flex-wrap items-center justify-center gap-2",
30
+ children: [/* @__PURE__ */ t(i, {
31
+ type: "button",
32
+ onClick: s,
33
+ children: e(l, "files.empty.uploadFiles", "Upload Files")
34
+ }), c && /* @__PURE__ */ t(i, {
35
+ type: "button",
36
+ variant: "outline",
37
+ onClick: c,
38
+ children: e(l, "files.empty.newFolder", "New Folder")
39
+ })]
42
40
  }) : void 0;
43
- return /* @__PURE__ */ a(c, {
44
- icon: p.icon,
45
- title: p.title,
46
- description: p.description,
47
- action: m,
48
- secondaryAction: h
41
+ return /* @__PURE__ */ t(a, {
42
+ illustration: "empty-files",
43
+ title: u.title,
44
+ description: u.description,
45
+ action: d
49
46
  });
50
47
  }
51
48
  //#endregion
52
- export { l as EmptyState };
49
+ export { o as EmptyState };
53
50
 
54
51
  //# sourceMappingURL=EmptyState.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyState.js","names":[],"sources":["../../../src/files/components/EmptyState.tsx"],"sourcesContent":["import { FolderOpen, Star, Trash2, Clock } from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport {\n EmptyState as CanonicalEmptyState,\n Button,\n} from \"@burdenoff/fe-libs/ui\";\nimport { tWithFallback } from \"../utils/i18n\";\n\ninterface EmptyStateProps {\n type: \"all\" | \"recent\" | \"starred\" | \"bin\";\n onUpload?: () => void;\n onNewFolder?: () => void;\n}\n\n/**\n * Local wrapper that delegates to the canonical `<EmptyState>` from\n * `@burdenoff/fe-libs/ui`. Keeps the microfe-files-specific `type`-keyed\n * config (icon + i18n keys + per-type action visibility) at the call site.\n */\nexport function EmptyState({ type, onUpload, onNewFolder }: EmptyStateProps) {\n const { t } = useI18n();\n const configs = {\n all: {\n icon: <FolderOpen className=\"size-12 text-text-tertiary\" />,\n title: tWithFallback(\n t,\n \"files.empty.all.title\",\n \"No files or folders yet\",\n ),\n description: tWithFallback(\n t,\n \"files.empty.all.description\",\n \"Upload files or create folders to get started\",\n ),\n showActions: true,\n },\n recent: {\n icon: <Clock className=\"size-12 text-text-tertiary\" />,\n title: tWithFallback(t, \"files.empty.recent.title\", \"No recent files\"),\n description: tWithFallback(\n t,\n \"files.empty.recent.description\",\n \"Files you recently opened will appear here\",\n ),\n showActions: false,\n },\n starred: {\n icon: <Star className=\"size-12 text-text-tertiary\" />,\n title: tWithFallback(t, \"files.empty.starred.title\", \"No starred items\"),\n description: tWithFallback(\n t,\n \"files.empty.starred.description\",\n \"Star files and folders to find them easily\",\n ),\n showActions: false,\n },\n bin: {\n icon: <Trash2 className=\"size-12 text-text-tertiary\" />,\n title: tWithFallback(t, \"files.empty.bin.title\", \"Bin is empty\"),\n description: tWithFallback(\n t,\n \"files.empty.bin.description\",\n \"Deleted files and folders will appear here\",\n ),\n showActions: false,\n },\n };\n\n const config = configs[type];\n\n const action =\n config.showActions && onUpload ? (\n <Button type=\"button\" onClick={onUpload}>\n {tWithFallback(t, \"files.empty.uploadFiles\", \"Upload Files\")}\n </Button>\n ) : undefined;\n\n const secondaryAction =\n config.showActions && onNewFolder ? (\n <Button type=\"button\" variant=\"outline\" onClick={onNewFolder}>\n {tWithFallback(t, \"files.empty.newFolder\", \"New Folder\")}\n </Button>\n ) : undefined;\n\n return (\n <CanonicalEmptyState\n icon={config.icon}\n title={config.title}\n description={config.description}\n action={action}\n secondaryAction={secondaryAction}\n />\n );\n}\n"],"mappings":";;;;;;AAmBA,SAAgB,EAAW,EAAE,SAAM,aAAU,kBAAgC;CAC3E,IAAM,EAAE,SAAM,GAAS,EAgDjB,IA/CU;EACd,KAAK;GACH,MAAM,kBAAC,GAAD,EAAY,WAAU,8BAA+B,CAAA;GAC3D,OAAO,EACL,GACA,yBACA,0BACD;GACD,aAAa,EACX,GACA,+BACA,gDACD;GACD,aAAa;GACd;EACD,QAAQ;GACN,MAAM,kBAAC,GAAD,EAAO,WAAU,8BAA+B,CAAA;GACtD,OAAO,EAAc,GAAG,4BAA4B,kBAAkB;GACtE,aAAa,EACX,GACA,kCACA,6CACD;GACD,aAAa;GACd;EACD,SAAS;GACP,MAAM,kBAAC,GAAD,EAAM,WAAU,8BAA+B,CAAA;GACrD,OAAO,EAAc,GAAG,6BAA6B,mBAAmB;GACxE,aAAa,EACX,GACA,mCACA,6CACD;GACD,aAAa;GACd;EACD,KAAK;GACH,MAAM,kBAAC,GAAD,EAAQ,WAAU,8BAA+B,CAAA;GACvD,OAAO,EAAc,GAAG,yBAAyB,eAAe;GAChE,aAAa,EACX,GACA,+BACA,6CACD;GACD,aAAa;GACd;EACF,CAEsB,IAEjB,IACJ,EAAO,eAAe,IACpB,kBAAC,GAAD;EAAQ,MAAK;EAAS,SAAS;YAC5B,EAAc,GAAG,2BAA2B,eAAe;EACrD,CAAA,GACP,KAAA,GAEA,IACJ,EAAO,eAAe,IACpB,kBAAC,GAAD;EAAQ,MAAK;EAAS,SAAQ;EAAU,SAAS;YAC9C,EAAc,GAAG,yBAAyB,aAAa;EACjD,CAAA,GACP,KAAA;AAEN,QACE,kBAAC,GAAD;EACE,MAAM,EAAO;EACb,OAAO,EAAO;EACd,aAAa,EAAO;EACZ;EACS;EACjB,CAAA"}
1
+ {"version":3,"file":"EmptyState.js","names":[],"sources":["../../../src/files/components/EmptyState.tsx"],"sourcesContent":["import { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport { IllustratedEmptyState, Button } from \"@burdenoff/fe-libs/ui\";\nimport { tWithFallback } from \"../utils/i18n\";\n\ninterface EmptyStateProps {\n type: \"all\" | \"recent\" | \"starred\" | \"bin\";\n onUpload?: () => void;\n onNewFolder?: () => void;\n}\n\n/**\n * Local wrapper that delegates to the on-brand `<IllustratedEmptyState>` from\n * `@burdenoff/fe-libs/ui`. Keeps the microfe-files-specific `type`-keyed config\n * (illustration + i18n keys + per-type action visibility) at the call site. The\n * `empty-files` illustration is served by the host shell at\n * `/illustrations/empty-files.webp`.\n */\nexport function EmptyState({ type, onUpload, onNewFolder }: EmptyStateProps) {\n const { t } = useI18n();\n const configs = {\n all: {\n title: tWithFallback(\n t,\n \"files.empty.all.title\",\n \"No files or folders yet\",\n ),\n description: tWithFallback(\n t,\n \"files.empty.all.description\",\n \"Upload files or create folders to get started\",\n ),\n showActions: true,\n },\n recent: {\n title: tWithFallback(t, \"files.empty.recent.title\", \"No recent files\"),\n description: tWithFallback(\n t,\n \"files.empty.recent.description\",\n \"Files you recently opened will appear here\",\n ),\n showActions: false,\n },\n starred: {\n title: tWithFallback(t, \"files.empty.starred.title\", \"No starred items\"),\n description: tWithFallback(\n t,\n \"files.empty.starred.description\",\n \"Star files and folders to find them easily\",\n ),\n showActions: false,\n },\n bin: {\n title: tWithFallback(t, \"files.empty.bin.title\", \"Bin is empty\"),\n description: tWithFallback(\n t,\n \"files.empty.bin.description\",\n \"Deleted files and folders will appear here\",\n ),\n showActions: false,\n },\n };\n\n const config = configs[type];\n\n const action =\n config.showActions && onUpload ? (\n <div className=\"flex flex-wrap items-center justify-center gap-2\">\n <Button type=\"button\" onClick={onUpload}>\n {tWithFallback(t, \"files.empty.uploadFiles\", \"Upload Files\")}\n </Button>\n {onNewFolder && (\n <Button type=\"button\" variant=\"outline\" onClick={onNewFolder}>\n {tWithFallback(t, \"files.empty.newFolder\", \"New Folder\")}\n </Button>\n )}\n </div>\n ) : undefined;\n\n return (\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title={config.title}\n description={config.description}\n action={action}\n />\n );\n}\n"],"mappings":";;;;;AAiBA,SAAgB,EAAW,EAAE,SAAM,aAAU,kBAAgC;CAC3E,IAAM,EAAE,SAAM,GAAS,EA4CjB,IA3CU;EACd,KAAK;GACH,OAAO,EACL,GACA,yBACA,0BACD;GACD,aAAa,EACX,GACA,+BACA,gDACD;GACD,aAAa;GACd;EACD,QAAQ;GACN,OAAO,EAAc,GAAG,4BAA4B,kBAAkB;GACtE,aAAa,EACX,GACA,kCACA,6CACD;GACD,aAAa;GACd;EACD,SAAS;GACP,OAAO,EAAc,GAAG,6BAA6B,mBAAmB;GACxE,aAAa,EACX,GACA,mCACA,6CACD;GACD,aAAa;GACd;EACD,KAAK;GACH,OAAO,EAAc,GAAG,yBAAyB,eAAe;GAChE,aAAa,EACX,GACA,+BACA,6CACD;GACD,aAAa;GACd;EACF,CAEsB,IAEjB,IACJ,EAAO,eAAe,IACpB,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,GAAD;GAAQ,MAAK;GAAS,SAAS;aAC5B,EAAc,GAAG,2BAA2B,eAAe;GACrD,CAAA,EACR,KACC,kBAAC,GAAD;GAAQ,MAAK;GAAS,SAAQ;GAAU,SAAS;aAC9C,EAAc,GAAG,yBAAyB,aAAa;GACjD,CAAA,CAEP;MACJ,KAAA;AAEN,QACE,kBAAC,GAAD;EACE,cAAa;EACb,OAAO,EAAO;EACd,aAAa,EAAO;EACZ;EACR,CAAA"}
@@ -9,21 +9,21 @@ import { FolderCard as ie } from "./FolderCard.js";
9
9
  import { ContextMenu as r } from "./ContextMenu.js";
10
10
  import { createFileMenuItems as ae, createFolderMenuItems as i } from "./contextMenuItems.js";
11
11
  import { useState as a } from "react";
12
- import { Folder as oe, Loader2 as se, Star as ce } from "lucide-react";
13
- import { Fragment as le, jsx as o, jsxs as s } from "react/jsx-runtime";
14
- import { useI18n as ue } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
12
+ import { Folder as oe, Star as se } from "lucide-react";
13
+ import { Fragment as ce, jsx as o, jsxs as s } from "react/jsx-runtime";
14
+ import { useI18n as le } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
15
15
  //#region src/files/components/FileBrowser.tsx
16
- var c = ({ files: c, folders: l, loading: de = !1, error: u = null, preserveSortOrder: fe = !1, onFilePreview: pe, onFileShare: d, onFileDelete: f, onFileRestore: p, onFileFavorite: m, onFileRename: h, onFileDownload: g, onFileCopy: _, onFileMove: v, onFileInfo: y, onFileActivity: b, onFolderOpen: x, onFolderShare: S, onFolderDelete: C, onFolderRestore: w, onFolderRename: T, onFolderFavorite: E, onFolderCopy: me, onFolderMove: D, onFolderInfo: O, onFolderActivity: he, onMoveFile: ge, onCopyFile: _e, onMoveFolder: ve, onCopyFolder: ye }) => {
17
- let { t: k } = ue(), { viewMode: A, sortBy: j, sortDirection: be, selectedFiles: M, selectedFolders: N } = e(), [xe, Se] = a(null), [P, F] = a({
16
+ var c = ({ files: c, folders: l, loading: ue = !1, error: u = null, preserveSortOrder: de = !1, onFilePreview: fe, onFileShare: d, onFileDelete: f, onFileRestore: p, onFileFavorite: m, onFileRename: h, onFileDownload: g, onFileCopy: _, onFileMove: v, onFileInfo: y, onFileActivity: b, onFolderOpen: x, onFolderShare: S, onFolderDelete: C, onFolderRestore: w, onFolderRename: T, onFolderFavorite: E, onFolderCopy: pe, onFolderMove: D, onFolderInfo: O, onFolderActivity: me, onMoveFile: he, onCopyFile: ge, onMoveFolder: _e, onCopyFolder: ve }) => {
17
+ let { t: k } = le(), { viewMode: A, sortBy: j, sortDirection: ye, selectedFiles: M, selectedFolders: N } = e(), [be, xe] = a(null), [P, F] = a({
18
18
  draggedItem: null,
19
19
  dropTargetFolderId: null
20
- }), [I, L] = a(null), { draggedItem: R, startDrag: Ce, endDrag: we, handleDrop: Te } = te({
21
- onMoveFile: ge,
22
- onCopyFile: _e,
23
- onMoveFolder: ve,
24
- onCopyFolder: ye
25
- }), Ee = (e, t) => {
26
- Ce({
20
+ }), [I, L] = a(null), { draggedItem: R, startDrag: Se, endDrag: Ce, handleDrop: we } = te({
21
+ onMoveFile: he,
22
+ onCopyFile: ge,
23
+ onMoveFolder: _e,
24
+ onCopyFolder: ve
25
+ }), Te = (e, t) => {
26
+ Se({
27
27
  type: "file",
28
28
  item: e,
29
29
  operation: t
@@ -35,8 +35,8 @@ var c = ({ files: c, folders: l, loading: de = !1, error: u = null, preserveSort
35
35
  },
36
36
  dropTargetFolderId: null
37
37
  });
38
- }, De = (e, t) => {
39
- Ce({
38
+ }, Ee = (e, t) => {
39
+ Se({
40
40
  type: "folder",
41
41
  item: e,
42
42
  operation: t
@@ -49,21 +49,21 @@ var c = ({ files: c, folders: l, loading: de = !1, error: u = null, preserveSort
49
49
  dropTargetFolderId: null
50
50
  });
51
51
  }, z = () => {
52
- we(), F({
52
+ Ce(), F({
53
53
  draggedItem: null,
54
54
  dropTargetFolderId: null
55
55
  });
56
- }, Oe = async (e) => {
57
- R && (await Te(e.id), F({
56
+ }, De = async (e) => {
57
+ R && (await we(e.id), F({
58
58
  draggedItem: null,
59
59
  dropTargetFolderId: null
60
60
  }));
61
- }, ke = (e) => {
61
+ }, Oe = (e) => {
62
62
  F((t) => ({
63
63
  ...t,
64
64
  dropTargetFolderId: e
65
65
  }));
66
- }, Ae = () => {
66
+ }, ke = () => {
67
67
  F((e) => ({
68
68
  ...e,
69
69
  dropTargetFolderId: null
@@ -114,15 +114,21 @@ var c = ({ files: c, folders: l, loading: de = !1, error: u = null, preserveSort
114
114
  isStarred: e.starred
115
115
  }, k);
116
116
  }
117
- }, Q = fe ? c : t(c, j, be), $ = fe ? l : t(l, j, be);
118
- return de ? /* @__PURE__ */ o("div", {
119
- className: "flex items-center justify-center min-h-[500px]",
120
- children: /* @__PURE__ */ s("div", {
121
- className: "flex flex-col items-center gap-4",
122
- children: [/* @__PURE__ */ o(se, { className: "size-10 animate-spin text-action-primary-bg" }), /* @__PURE__ */ o("span", {
123
- className: "text-sm text-text-secondary",
124
- children: n(k, "files.browser.loading", "Loading files…")
125
- })]
117
+ }, Q = de ? c : t(c, j, ye), $ = de ? l : t(l, j, ye);
118
+ return ue ? /* @__PURE__ */ o("div", {
119
+ className: "@container p-page-padding",
120
+ role: "status",
121
+ "aria-busy": "true",
122
+ "aria-label": n(k, "files.browser.loading", "Loading files…"),
123
+ children: /* @__PURE__ */ o("div", {
124
+ className: "grid grid-cols-2 gap-4 @md:grid-cols-3 @lg:grid-cols-4 @xl:grid-cols-5",
125
+ children: Array.from({ length: 10 }).map((e, t) => /* @__PURE__ */ s("div", {
126
+ className: "overflow-hidden rounded-card border border-border-seam bg-bg-surface",
127
+ children: [/* @__PURE__ */ o("div", { className: "aspect-[4/3] w-full animate-vc-shimmer bg-bg-sunken" }), /* @__PURE__ */ s("div", {
128
+ className: "space-y-2 p-3",
129
+ children: [/* @__PURE__ */ o("div", { className: "h-3 w-3/4 animate-vc-shimmer rounded bg-bg-sunken" }), /* @__PURE__ */ o("div", { className: "h-3 w-1/2 animate-vc-shimmer rounded bg-bg-sunken" })]
130
+ })]
131
+ }, t))
126
132
  })
127
133
  }) : u ? /* @__PURE__ */ o("div", {
128
134
  className: "flex items-center justify-center min-h-[500px]",
@@ -145,7 +151,7 @@ var c = ({ files: c, folders: l, loading: de = !1, error: u = null, preserveSort
145
151
  })
146
152
  ]
147
153
  })
148
- }) : c.length === 0 && l.length === 0 ? /* @__PURE__ */ o(le, { children: I && /* @__PURE__ */ o(r, {
154
+ }) : c.length === 0 && l.length === 0 ? /* @__PURE__ */ o(ce, { children: I && /* @__PURE__ */ o(r, {
149
155
  x: I.x,
150
156
  y: I.y,
151
157
  onClose: H,
@@ -188,11 +194,11 @@ var c = ({ files: c, folders: l, loading: de = !1, error: u = null, preserveSort
188
194
  (e.key === "Enter" || e.key === " ") && (e.preventDefault(), q(t) && x?.(t));
189
195
  },
190
196
  onDragOver: (e) => {
191
- R && R.item.id !== t.id && J(t) && (e.preventDefault(), ke(t.id));
197
+ R && R.item.id !== t.id && J(t) && (e.preventDefault(), Oe(t.id));
192
198
  },
193
- onDragLeave: Ae,
199
+ onDragLeave: ke,
194
200
  onDrop: async (e) => {
195
- e.preventDefault(), R && R.item.id !== t.id && J(t) && await Oe(t);
201
+ e.preventDefault(), R && R.item.id !== t.id && J(t) && await De(t);
196
202
  },
197
203
  onContextMenu: (e) => {
198
204
  e.preventDefault(), V(t, e.clientX, e.clientY);
@@ -221,7 +227,7 @@ var c = ({ files: c, folders: l, loading: de = !1, error: u = null, preserveSort
221
227
  children: [/* @__PURE__ */ o("span", {
222
228
  className: "font-text-md font-weight-medium text-text-primary truncate",
223
229
  children: t.name
224
- }), t.starred && /* @__PURE__ */ o(ce, { className: "size-3 flex-shrink-0 fill-yellow-400 text-yellow-400" })]
230
+ }), t.starred && /* @__PURE__ */ o(se, { className: "size-3 flex-shrink-0 fill-yellow-400 text-yellow-400" })]
225
231
  })
226
232
  }),
227
233
  /* @__PURE__ */ o("div", {
@@ -335,8 +341,8 @@ var c = ({ files: c, folders: l, loading: de = !1, error: u = null, preserveSort
335
341
  onDelete: X(t) && C ? () => C(t) : void 0,
336
342
  isStarred: t.starred
337
343
  }, k),
338
- isOpen: xe === t.id,
339
- onToggle: (e) => Se(e ? t.id : null)
344
+ isOpen: be === t.id,
345
+ onToggle: (e) => xe(e ? t.id : null)
340
346
  })
341
347
  })
342
348
  ]
@@ -346,7 +352,7 @@ var c = ({ files: c, folders: l, loading: de = !1, error: u = null, preserveSort
346
352
  file: e,
347
353
  isSelected: M.has(e.id),
348
354
  isDragging: R?.item.id === e.id,
349
- onPreview: U(e) ? pe : void 0,
355
+ onPreview: U(e) ? fe : void 0,
350
356
  onShare: G(e) ? d : void 0,
351
357
  onDelete: K(e) ? f : void 0,
352
358
  onRestore: W(e) ? p : void 0,
@@ -357,7 +363,7 @@ var c = ({ files: c, folders: l, loading: de = !1, error: u = null, preserveSort
357
363
  onMove: W(e) ? v : void 0,
358
364
  onInfo: y,
359
365
  onActivity: b,
360
- onDragStart: W(e) ? Ee : void 0,
366
+ onDragStart: W(e) ? Te : void 0,
361
367
  onDragEnd: z,
362
368
  onContextMenu: B
363
369
  }, e.id))]
@@ -391,13 +397,13 @@ var c = ({ files: c, folders: l, loading: de = !1, error: u = null, preserveSort
391
397
  onRestore: J(e) ? w : void 0,
392
398
  onRename: J(e) ? T : void 0,
393
399
  onFavorite: J(e) ? E : void 0,
394
- onCopy: me,
400
+ onCopy: pe,
395
401
  onMove: J(e) ? D : void 0,
396
402
  onInfo: O,
397
- onActivity: he,
398
- onDragStart: J(e) ? De : void 0,
403
+ onActivity: me,
404
+ onDragStart: J(e) ? Ee : void 0,
399
405
  onDragEnd: z,
400
- onDrop: J(e) ? Oe : void 0,
406
+ onDrop: J(e) ? De : void 0,
401
407
  onContextMenu: V
402
408
  }, e.id))
403
409
  })]
@@ -411,7 +417,7 @@ var c = ({ files: c, folders: l, loading: de = !1, error: u = null, preserveSort
411
417
  file: e,
412
418
  isSelected: M.has(e.id),
413
419
  isDragging: R?.item.id === e.id,
414
- onPreview: U(e) ? pe : void 0,
420
+ onPreview: U(e) ? fe : void 0,
415
421
  onShare: G(e) ? d : void 0,
416
422
  onDelete: K(e) ? f : void 0,
417
423
  onRestore: W(e) ? p : void 0,
@@ -422,7 +428,7 @@ var c = ({ files: c, folders: l, loading: de = !1, error: u = null, preserveSort
422
428
  onMove: W(e) ? v : void 0,
423
429
  onInfo: y,
424
430
  onActivity: b,
425
- onDragStart: W(e) ? Ee : void 0,
431
+ onDragStart: W(e) ? Te : void 0,
426
432
  onDragEnd: z,
427
433
  onContextMenu: B
428
434
  }, e.id))
@@ -1 +1 @@
1
- {"version":3,"file":"FileBrowser.js","names":[],"sources":["../../../src/files/components/FileBrowser.tsx"],"sourcesContent":["import { type FC, useState } from \"react\";\nimport { Folder, Loader2, Star } from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport type { FileItem, FolderItem } from \"../types\";\nimport { useFilesStore } from \"../store/filesStore\";\nimport { FileCard } from \"./FileCard\";\nimport { FileListItem } from \"./FileListItem\";\nimport { FolderCard } from \"./FolderCard\";\nimport { ActionMenu } from \"./ActionMenu\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport { createFileMenuItems, createFolderMenuItems } from \"./contextMenuItems\";\nimport { sortFiles } from \"../utils\";\nimport { tWithFallback } from \"../utils/i18n\";\nimport {\n useDragDrop,\n type DragData,\n type DragOperation,\n} from \"../hooks/useDragDrop\";\n\ninterface FileBrowserProps {\n files: FileItem[];\n folders: FolderItem[];\n loading?: boolean;\n error?: Error | null;\n preserveSortOrder?: boolean;\n onFilePreview?: (file: FileItem) => void;\n onFileShare?: (file: FileItem) => void;\n onFileDelete?: (file: FileItem) => void;\n onFileRestore?: (file: FileItem) => void;\n onFileFavorite?: (file: FileItem) => void;\n onFileRename?: (file: FileItem) => void;\n onFileDownload?: (file: FileItem) => void;\n onFileCopy?: (file: FileItem) => void;\n onFileMove?: (file: FileItem) => void;\n onFileInfo?: (file: FileItem) => void;\n onFileActivity?: (file: FileItem) => void;\n onFolderOpen?: (folder: FolderItem) => void;\n onFolderShare?: (folder: FolderItem) => void;\n onFolderDelete?: (folder: FolderItem) => void;\n onFolderRestore?: (folder: FolderItem) => void;\n onFolderRename?: (folder: FolderItem) => void;\n onFolderFavorite?: (folder: FolderItem) => void;\n onFolderCopy?: (folder: FolderItem) => void;\n onFolderMove?: (folder: FolderItem) => void;\n onFolderInfo?: (folder: FolderItem) => void;\n onFolderActivity?: (folder: FolderItem) => void;\n onMoveFile?: (fileId: string, targetFolderId: string) => Promise<void>;\n onCopyFile?: (fileId: string, targetFolderId: string) => Promise<void>;\n onMoveFolder?: (folderId: string, targetFolderId: string) => Promise<void>;\n onCopyFolder?: (folderId: string, targetFolderId: string) => Promise<void>;\n}\n\nexport const FileBrowser: FC<FileBrowserProps> = ({\n files,\n folders,\n loading = false,\n error = null,\n preserveSortOrder = false,\n onFilePreview,\n onFileShare,\n onFileDelete,\n onFileRestore,\n onFileFavorite,\n onFileRename,\n onFileDownload,\n onFileCopy,\n onFileMove,\n onFileInfo,\n onFileActivity,\n onFolderOpen,\n onFolderShare,\n onFolderDelete,\n onFolderRestore,\n onFolderRename,\n onFolderFavorite,\n onFolderCopy,\n onFolderMove,\n onFolderInfo,\n onFolderActivity,\n onMoveFile,\n onCopyFile,\n onMoveFolder,\n onCopyFolder,\n}) => {\n const { t } = useI18n();\n const { viewMode, sortBy, sortDirection, selectedFiles, selectedFolders } =\n useFilesStore();\n\n const [openMenuId, setOpenMenuId] = useState<string | null>(null);\n const [dragState, setDragState] = useState<{\n draggedItem: DragData | null;\n dropTargetFolderId: string | null;\n }>({ draggedItem: null, dropTargetFolderId: null });\n const [contextMenu, setContextMenu] = useState<{\n item: FileItem | FolderItem;\n type: \"file\" | \"folder\";\n x: number;\n y: number;\n } | null>(null);\n\n const { draggedItem, startDrag, endDrag, handleDrop } = useDragDrop({\n onMoveFile,\n onCopyFile,\n onMoveFolder,\n onCopyFolder,\n });\n\n const handleFileDragStart = (file: FileItem, operation: DragOperation) => {\n startDrag({ type: \"file\", item: file, operation });\n setDragState({\n draggedItem: { type: \"file\", item: file, operation },\n dropTargetFolderId: null,\n });\n };\n\n const handleFolderDragStart = (\n folder: FolderItem,\n operation: DragOperation,\n ) => {\n startDrag({ type: \"folder\", item: folder, operation });\n setDragState({\n draggedItem: { type: \"folder\", item: folder, operation },\n dropTargetFolderId: null,\n });\n };\n\n const handleDragEnd = () => {\n endDrag();\n setDragState({ draggedItem: null, dropTargetFolderId: null });\n };\n\n const handleFolderDrop = async (folder: FolderItem) => {\n if (draggedItem) {\n await handleDrop(folder.id);\n setDragState({ draggedItem: null, dropTargetFolderId: null });\n }\n };\n\n const handleFolderDragOver = (folderId: string) => {\n setDragState((prev) => ({ ...prev, dropTargetFolderId: folderId }));\n };\n\n const handleFolderDragLeave = () => {\n setDragState((prev) => ({ ...prev, dropTargetFolderId: null }));\n };\n\n const handleFileContextMenu = (file: FileItem, x: number, y: number) => {\n setContextMenu({ item: file, type: \"file\", x, y });\n };\n\n const handleFolderContextMenu = (\n folder: FolderItem,\n x: number,\n y: number,\n ) => {\n setContextMenu({ item: folder, type: \"folder\", x, y });\n };\n\n const closeContextMenu = () => {\n setContextMenu(null);\n };\n\n const fileCanRead = (file: FileItem) =>\n file.canRead === true || file.canUpdate === true || file.canWrite === true;\n const fileCanUpdate = (file: FileItem) =>\n file.canUpdate === true || file.canWrite === true;\n const fileCanShare = (file: FileItem) =>\n file.canShare === true || fileCanUpdate(file);\n const fileCanDelete = (file: FileItem) => file.canDelete === true;\n\n const folderCanRead = (folder: FolderItem) =>\n folder.canRead === true || folder.permissions?.canRead === true;\n const folderCanUpdate = (folder: FolderItem) =>\n folder.canUpdate === true || folder.permissions?.canWrite === true;\n const folderCanShare = (folder: FolderItem) =>\n folder.permissions?.canShare === true || folderCanUpdate(folder);\n const folderCanDelete = (folder: FolderItem) =>\n folder.canDelete === true || folder.permissions?.canDelete === true;\n\n const getContextMenuItems = () => {\n if (!contextMenu) return [];\n if (contextMenu.type === \"file\") {\n const file = contextMenu.item as FileItem;\n return createFileMenuItems(\n {\n onShare:\n onFileShare && fileCanShare(file)\n ? () => onFileShare(file)\n : undefined,\n onDownload:\n onFileDownload && fileCanRead(file)\n ? () => onFileDownload(file)\n : undefined,\n onCopy:\n onFileCopy && fileCanRead(file)\n ? () => onFileCopy(file)\n : undefined,\n onRename:\n onFileRename && fileCanUpdate(file)\n ? () => onFileRename(file)\n : undefined,\n onStar:\n onFileFavorite && fileCanUpdate(file)\n ? () => onFileFavorite(file)\n : undefined,\n onMove:\n onFileMove && fileCanUpdate(file)\n ? () => onFileMove(file)\n : undefined,\n onInfo: onFileInfo ? () => onFileInfo(file) : undefined,\n onActivity: onFileActivity ? () => onFileActivity(file) : undefined,\n onDelete:\n onFileDelete && fileCanDelete(file)\n ? () => onFileDelete(file)\n : undefined,\n onRestore:\n onFileRestore && fileCanUpdate(file)\n ? () => onFileRestore(file)\n : undefined,\n isStarred: file.starred,\n },\n t,\n );\n } else {\n const folder = contextMenu.item as FolderItem;\n return createFolderMenuItems(\n {\n onShare:\n onFolderShare && folderCanShare(folder)\n ? () => onFolderShare(folder)\n : undefined,\n onRename:\n onFolderRename && folderCanUpdate(folder)\n ? () => onFolderRename(folder)\n : undefined,\n onStar:\n onFolderFavorite && folderCanUpdate(folder)\n ? () => onFolderFavorite(folder)\n : undefined,\n onMove:\n onFolderMove && folderCanUpdate(folder)\n ? () => onFolderMove(folder)\n : undefined,\n onInfo: onFolderInfo ? () => onFolderInfo(folder) : undefined,\n onDelete:\n onFolderDelete && folderCanDelete(folder)\n ? () => onFolderDelete(folder)\n : undefined,\n onRestore:\n onFolderRestore && folderCanUpdate(folder)\n ? () => onFolderRestore(folder)\n : undefined,\n isStarred: folder.starred,\n },\n t,\n );\n }\n };\n\n const sortedFiles = preserveSortOrder\n ? files\n : sortFiles(files, sortBy, sortDirection);\n const sortedFolders = preserveSortOrder\n ? folders\n : sortFiles(folders, sortBy, sortDirection);\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center min-h-[500px]\">\n <div className=\"flex flex-col items-center gap-4\">\n <Loader2 className=\"size-10 animate-spin text-action-primary-bg\" />\n <span className=\"text-sm text-text-secondary\">\n {tWithFallback(t, \"files.browser.loading\", \"Loading files…\")}\n </span>\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"flex items-center justify-center min-h-[500px]\">\n <div className=\"text-center max-w-md\">\n <div className=\"mb-3 text-xl font-semibold text-status-error-text\">\n {tWithFallback(\n t,\n \"files.browser.loadError\",\n \"Failed to load files\",\n )}\n </div>\n <p className=\"mb-6 text-sm text-text-secondary\">\n {error.message ||\n tWithFallback(\n t,\n \"files.browser.unexpectedError\",\n \"An unexpected error occurred\",\n )}\n </p>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"rounded-lg bg-action-primary-bg px-6 py-2.5 text-sm font-medium text-text-inverse transition-colors hover:bg-action-primary-bg-hover\"\n >\n {tWithFallback(t, \"files.browser.retry\", \"Retry\")}\n </button>\n </div>\n </div>\n );\n }\n\n if (files.length === 0 && folders.length === 0) {\n return (\n <>\n {contextMenu && (\n <ContextMenu\n x={contextMenu.x}\n y={contextMenu.y}\n onClose={closeContextMenu}\n items={getContextMenuItems()}\n />\n )}\n </>\n );\n }\n\n if (viewMode !== \"list\") {\n return (\n <div className=\"@container bg-bg-canvas p-page-padding\">\n {/* Folders section */}\n {sortedFolders.length > 0 && (\n <div className={sortedFiles.length > 0 ? \"mb-6\" : \"\"}>\n {sortedFiles.length > 0 && (\n <h2 className=\"text-xs font-semibold text-text-tertiary uppercase tracking-wider mb-3 px-1\">\n {tWithFallback(t, \"files.browser.section.folders\", \"Folders\")}\n </h2>\n )}\n <div className=\"grid grid-cols-1 @sm:grid-cols-2 @lg:grid-cols-3 @xl:grid-cols-4 gap-2\">\n {sortedFolders.map((folder) => (\n <FolderCard\n key={folder.id}\n folder={folder}\n isSelected={selectedFolders.has(folder.id)}\n isDragging={draggedItem?.item.id === folder.id}\n isDropTarget={dragState.dropTargetFolderId === folder.id}\n draggedItem={draggedItem}\n onOpen={folderCanRead(folder) ? onFolderOpen : undefined}\n onShare={folderCanShare(folder) ? onFolderShare : undefined}\n onDelete={\n folderCanDelete(folder) ? onFolderDelete : undefined\n }\n onRestore={\n folderCanUpdate(folder) ? onFolderRestore : undefined\n }\n onRename={\n folderCanUpdate(folder) ? onFolderRename : undefined\n }\n onFavorite={\n folderCanUpdate(folder) ? onFolderFavorite : undefined\n }\n onCopy={onFolderCopy}\n onMove={folderCanUpdate(folder) ? onFolderMove : undefined}\n onInfo={onFolderInfo}\n onActivity={onFolderActivity}\n onDragStart={\n folderCanUpdate(folder) ? handleFolderDragStart : undefined\n }\n onDragEnd={handleDragEnd}\n onDrop={\n folderCanUpdate(folder) ? handleFolderDrop : undefined\n }\n onContextMenu={handleFolderContextMenu}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Files section */}\n {sortedFiles.length > 0 && (\n <div>\n {sortedFolders.length > 0 && (\n <h2 className=\"text-xs font-semibold text-text-tertiary uppercase tracking-wider mb-3 px-1\">\n {tWithFallback(t, \"files.browser.section.files\", \"Files\")}\n </h2>\n )}\n <div className=\"grid grid-cols-2 @md:grid-cols-3 @lg:grid-cols-4 @xl:grid-cols-5 gap-4\">\n {sortedFiles.map((file) => (\n <FileCard\n key={file.id}\n file={file}\n isSelected={selectedFiles.has(file.id)}\n isDragging={draggedItem?.item.id === file.id}\n onPreview={fileCanRead(file) ? onFilePreview : undefined}\n onShare={fileCanShare(file) ? onFileShare : undefined}\n onDelete={fileCanDelete(file) ? onFileDelete : undefined}\n onRestore={fileCanUpdate(file) ? onFileRestore : undefined}\n onFavorite={fileCanUpdate(file) ? onFileFavorite : undefined}\n onRename={fileCanUpdate(file) ? onFileRename : undefined}\n onDownload={fileCanRead(file) ? onFileDownload : undefined}\n onCopy={fileCanRead(file) ? onFileCopy : undefined}\n onMove={fileCanUpdate(file) ? onFileMove : undefined}\n onInfo={onFileInfo}\n onActivity={onFileActivity}\n onDragStart={\n fileCanUpdate(file) ? handleFileDragStart : undefined\n }\n onDragEnd={handleDragEnd}\n onContextMenu={handleFileContextMenu}\n />\n ))}\n </div>\n </div>\n )}\n\n {contextMenu && (\n <ContextMenu\n x={contextMenu.x}\n y={contextMenu.y}\n onClose={closeContextMenu}\n items={getContextMenuItems()}\n />\n )}\n </div>\n );\n }\n\n if (viewMode === \"list\") {\n return (\n <div className=\"@container bg-bg-canvas\">\n <div className=\"hidden @md:flex items-center gap-3 px-3 py-2 bg-bg-surface border-b border-border-seam text-text-secondary font-text-sm font-weight-medium\">\n <div className=\"flex-shrink-0 w-4\" />\n <div className=\"flex-shrink-0 w-6\" />\n <div className=\"flex-1\">\n {tWithFallback(t, \"files.browser.name\", \"Name\")}\n </div>\n <div className=\"hidden @lg:block flex-shrink-0 w-40\">\n {tWithFallback(t, \"files.browser.owner\", \"Owner\")}\n </div>\n <div className=\"hidden @md:block flex-shrink-0 w-24 text-right\">\n {tWithFallback(t, \"files.browser.size\", \"Size\")}\n </div>\n <div className=\"hidden @lg:block flex-shrink-0 w-32 text-right\">\n {tWithFallback(t, \"files.browser.modified\", \"Modified\")}\n </div>\n <div className=\"flex-shrink-0 w-32\" />\n </div>\n\n <div className=\"divide-y divide-border-subtle\">\n {sortedFolders.map((folder) => (\n <div\n key={folder.id}\n className={`group flex items-center gap-3 border-b border-border-seam bg-bg-surface p-3 transition-colors hover:bg-bg-sunken focus-within:bg-bg-sunken ${dragState.dropTargetFolderId === folder.id && draggedItem?.item.id !== folder.id ? \"bg-action-primary-bg/10\" : \"\"} ${draggedItem?.item.id === folder.id ? \"opacity-50\" : \"\"}`}\n onClick={() => {\n if (folderCanRead(folder)) onFolderOpen?.(folder);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n if (folderCanRead(folder)) onFolderOpen?.(folder);\n }\n }}\n onDragOver={(e) => {\n if (\n draggedItem &&\n draggedItem.item.id !== folder.id &&\n folderCanUpdate(folder)\n ) {\n e.preventDefault();\n handleFolderDragOver(folder.id);\n }\n }}\n onDragLeave={handleFolderDragLeave}\n onDrop={async (e) => {\n e.preventDefault();\n if (\n draggedItem &&\n draggedItem.item.id !== folder.id &&\n folderCanUpdate(folder)\n ) {\n await handleFolderDrop(folder);\n }\n }}\n onContextMenu={(e) => {\n e.preventDefault();\n handleFolderContextMenu(folder, e.clientX, e.clientY);\n }}\n role=\"button\"\n tabIndex={0}\n aria-label={tWithFallback(\n t,\n \"files.browser.openFolder\",\n \"Open folder\",\n )}\n >\n <div className=\"flex-shrink-0\">\n <input\n type=\"checkbox\"\n checked={selectedFolders.has(folder.id)}\n onChange={(e) => {\n e.stopPropagation();\n useFilesStore.getState().toggleFolderSelection(folder.id);\n }}\n className=\"size-4 rounded border-border-default bg-bg-surface text-action-primary-bg focus:ring-2 focus:ring-action-primary-bg focus:ring-offset-2\"\n aria-label={`Select ${folder.name}`}\n />\n </div>\n <Folder className=\"size-6 text-action-primary-bg flex-shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-text-md font-weight-medium text-text-primary truncate\">\n {folder.name}\n </span>\n {folder.starred && (\n <Star className=\"size-3 flex-shrink-0 fill-yellow-400 text-yellow-400\" />\n )}\n </div>\n </div>\n <div className=\"hidden @lg:block flex-shrink-0 w-40\">\n {folder.createdBy && (\n <div className=\"flex items-center gap-2\">\n {folder.createdBy.avatar && (\n <img\n src={folder.createdBy.avatar}\n alt={folder.createdBy.name}\n className=\"size-6 rounded-full\"\n />\n )}\n <span className=\"font-text-sm text-text-secondary truncate\">\n {folder.createdBy.name}\n </span>\n </div>\n )}\n </div>\n <div className=\"hidden @md:block flex-shrink-0 w-24 text-right\">\n <span className=\"font-text-sm text-text-secondary\">\n {(folder.filesCount ?? 0) + (folder.subfoldersCount ?? 0)}{\" \"}\n {tWithFallback(t, \"files.browser.items\", \"items\")}\n </span>\n </div>\n <div className=\"hidden @lg:block flex-shrink-0 w-32 text-right\">\n <span className=\"font-text-sm text-text-secondary\">\n {new Date(folder.updatedAt).toLocaleDateString()}\n </span>\n </div>\n\n <div className=\"flex w-32 flex-shrink-0 items-center gap-1 opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100\">\n {folderCanShare(folder) && onFolderShare && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onFolderShare(folder);\n }}\n className=\"p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors\"\n aria-label={tWithFallback(\n t,\n \"files.browser.share\",\n \"Share\",\n )}\n title={tWithFallback(\n t,\n \"files.browser.shareFolder\",\n \"Share folder\",\n )}\n >\n <svg\n className=\"size-4 text-text-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8.684 13.342C8.886 12.938 9 12.482 9 12c0-.482-.114-.938-.316-1.342m0 2.684a3 3 0 110-2.684m0 2.684l6.632 3.316m-6.632-6l6.632-3.316m0 0a3 3 0 105.367-2.684 3 3 0 00-5.367 2.684zm0 9.316a3 3 0 105.368 2.684 3 3 0 00-5.368-2.684z\"\n />\n </svg>\n </button>\n )}\n\n {folderCanUpdate(folder) && onFolderRename && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onFolderRename(folder);\n }}\n className=\"hidden @md:block p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors\"\n aria-label={tWithFallback(\n t,\n \"files.browser.rename\",\n \"Rename\",\n )}\n title={tWithFallback(t, \"files.browser.rename\", \"Rename\")}\n >\n <svg\n className=\"size-4 text-text-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\"\n />\n </svg>\n </button>\n )}\n\n {folderCanDelete(folder) && onFolderDelete && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onFolderDelete(folder);\n }}\n className=\"p-1.5 hover:bg-action-danger-bg-hover rounded transition-colors\"\n aria-label={tWithFallback(\n t,\n \"files.browser.delete\",\n \"Delete\",\n )}\n title={tWithFallback(t, \"files.browser.delete\", \"Delete\")}\n >\n <svg\n className=\"size-4 text-status-error-text\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n </button>\n )}\n\n <div onClick={(e) => e.stopPropagation()}>\n <ActionMenu\n items={createFolderMenuItems(\n {\n onShare:\n folderCanShare(folder) && onFolderShare\n ? () => onFolderShare(folder)\n : undefined,\n onRename:\n folderCanUpdate(folder) && onFolderRename\n ? () => onFolderRename(folder)\n : undefined,\n onStar:\n folderCanUpdate(folder) && onFolderFavorite\n ? () => onFolderFavorite(folder)\n : undefined,\n onMove:\n folderCanUpdate(folder) && onFolderMove\n ? () => onFolderMove(folder)\n : undefined,\n onInfo: () => onFolderInfo?.(folder),\n onRestore:\n folderCanUpdate(folder) && onFolderRestore\n ? () => onFolderRestore(folder)\n : undefined,\n onDelete:\n folderCanDelete(folder) && onFolderDelete\n ? () => onFolderDelete(folder)\n : undefined,\n isStarred: folder.starred,\n },\n t,\n )}\n isOpen={openMenuId === folder.id}\n onToggle={(open) => setOpenMenuId(open ? folder.id : null)}\n />\n </div>\n </div>\n </div>\n ))}\n\n {sortedFiles.map((file) => (\n <FileListItem\n key={file.id}\n file={file}\n isSelected={selectedFiles.has(file.id)}\n isDragging={draggedItem?.item.id === file.id}\n onPreview={fileCanRead(file) ? onFilePreview : undefined}\n onShare={fileCanShare(file) ? onFileShare : undefined}\n onDelete={fileCanDelete(file) ? onFileDelete : undefined}\n onRestore={fileCanUpdate(file) ? onFileRestore : undefined}\n onFavorite={fileCanUpdate(file) ? onFileFavorite : undefined}\n onRename={fileCanUpdate(file) ? onFileRename : undefined}\n onDownload={fileCanRead(file) ? onFileDownload : undefined}\n onCopy={fileCanRead(file) ? onFileCopy : undefined}\n onMove={fileCanUpdate(file) ? onFileMove : undefined}\n onInfo={onFileInfo}\n onActivity={onFileActivity}\n onDragStart={\n fileCanUpdate(file) ? handleFileDragStart : undefined\n }\n onDragEnd={handleDragEnd}\n onContextMenu={handleFileContextMenu}\n />\n ))}\n </div>\n {contextMenu && (\n <ContextMenu\n x={contextMenu.x}\n y={contextMenu.y}\n onClose={closeContextMenu}\n items={getContextMenuItems()}\n />\n )}\n </div>\n );\n }\n\n return null;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"FileBrowser.js","names":[],"sources":["../../../src/files/components/FileBrowser.tsx"],"sourcesContent":["import { type FC, useState } from \"react\";\nimport { Folder, Star } from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport type { FileItem, FolderItem } from \"../types\";\nimport { useFilesStore } from \"../store/filesStore\";\nimport { FileCard } from \"./FileCard\";\nimport { FileListItem } from \"./FileListItem\";\nimport { FolderCard } from \"./FolderCard\";\nimport { ActionMenu } from \"./ActionMenu\";\nimport { ContextMenu } from \"./ContextMenu\";\nimport { createFileMenuItems, createFolderMenuItems } from \"./contextMenuItems\";\nimport { sortFiles } from \"../utils\";\nimport { tWithFallback } from \"../utils/i18n\";\nimport {\n useDragDrop,\n type DragData,\n type DragOperation,\n} from \"../hooks/useDragDrop\";\n\ninterface FileBrowserProps {\n files: FileItem[];\n folders: FolderItem[];\n loading?: boolean;\n error?: Error | null;\n preserveSortOrder?: boolean;\n onFilePreview?: (file: FileItem) => void;\n onFileShare?: (file: FileItem) => void;\n onFileDelete?: (file: FileItem) => void;\n onFileRestore?: (file: FileItem) => void;\n onFileFavorite?: (file: FileItem) => void;\n onFileRename?: (file: FileItem) => void;\n onFileDownload?: (file: FileItem) => void;\n onFileCopy?: (file: FileItem) => void;\n onFileMove?: (file: FileItem) => void;\n onFileInfo?: (file: FileItem) => void;\n onFileActivity?: (file: FileItem) => void;\n onFolderOpen?: (folder: FolderItem) => void;\n onFolderShare?: (folder: FolderItem) => void;\n onFolderDelete?: (folder: FolderItem) => void;\n onFolderRestore?: (folder: FolderItem) => void;\n onFolderRename?: (folder: FolderItem) => void;\n onFolderFavorite?: (folder: FolderItem) => void;\n onFolderCopy?: (folder: FolderItem) => void;\n onFolderMove?: (folder: FolderItem) => void;\n onFolderInfo?: (folder: FolderItem) => void;\n onFolderActivity?: (folder: FolderItem) => void;\n onMoveFile?: (fileId: string, targetFolderId: string) => Promise<void>;\n onCopyFile?: (fileId: string, targetFolderId: string) => Promise<void>;\n onMoveFolder?: (folderId: string, targetFolderId: string) => Promise<void>;\n onCopyFolder?: (folderId: string, targetFolderId: string) => Promise<void>;\n}\n\nexport const FileBrowser: FC<FileBrowserProps> = ({\n files,\n folders,\n loading = false,\n error = null,\n preserveSortOrder = false,\n onFilePreview,\n onFileShare,\n onFileDelete,\n onFileRestore,\n onFileFavorite,\n onFileRename,\n onFileDownload,\n onFileCopy,\n onFileMove,\n onFileInfo,\n onFileActivity,\n onFolderOpen,\n onFolderShare,\n onFolderDelete,\n onFolderRestore,\n onFolderRename,\n onFolderFavorite,\n onFolderCopy,\n onFolderMove,\n onFolderInfo,\n onFolderActivity,\n onMoveFile,\n onCopyFile,\n onMoveFolder,\n onCopyFolder,\n}) => {\n const { t } = useI18n();\n const { viewMode, sortBy, sortDirection, selectedFiles, selectedFolders } =\n useFilesStore();\n\n const [openMenuId, setOpenMenuId] = useState<string | null>(null);\n const [dragState, setDragState] = useState<{\n draggedItem: DragData | null;\n dropTargetFolderId: string | null;\n }>({ draggedItem: null, dropTargetFolderId: null });\n const [contextMenu, setContextMenu] = useState<{\n item: FileItem | FolderItem;\n type: \"file\" | \"folder\";\n x: number;\n y: number;\n } | null>(null);\n\n const { draggedItem, startDrag, endDrag, handleDrop } = useDragDrop({\n onMoveFile,\n onCopyFile,\n onMoveFolder,\n onCopyFolder,\n });\n\n const handleFileDragStart = (file: FileItem, operation: DragOperation) => {\n startDrag({ type: \"file\", item: file, operation });\n setDragState({\n draggedItem: { type: \"file\", item: file, operation },\n dropTargetFolderId: null,\n });\n };\n\n const handleFolderDragStart = (\n folder: FolderItem,\n operation: DragOperation,\n ) => {\n startDrag({ type: \"folder\", item: folder, operation });\n setDragState({\n draggedItem: { type: \"folder\", item: folder, operation },\n dropTargetFolderId: null,\n });\n };\n\n const handleDragEnd = () => {\n endDrag();\n setDragState({ draggedItem: null, dropTargetFolderId: null });\n };\n\n const handleFolderDrop = async (folder: FolderItem) => {\n if (draggedItem) {\n await handleDrop(folder.id);\n setDragState({ draggedItem: null, dropTargetFolderId: null });\n }\n };\n\n const handleFolderDragOver = (folderId: string) => {\n setDragState((prev) => ({ ...prev, dropTargetFolderId: folderId }));\n };\n\n const handleFolderDragLeave = () => {\n setDragState((prev) => ({ ...prev, dropTargetFolderId: null }));\n };\n\n const handleFileContextMenu = (file: FileItem, x: number, y: number) => {\n setContextMenu({ item: file, type: \"file\", x, y });\n };\n\n const handleFolderContextMenu = (\n folder: FolderItem,\n x: number,\n y: number,\n ) => {\n setContextMenu({ item: folder, type: \"folder\", x, y });\n };\n\n const closeContextMenu = () => {\n setContextMenu(null);\n };\n\n const fileCanRead = (file: FileItem) =>\n file.canRead === true || file.canUpdate === true || file.canWrite === true;\n const fileCanUpdate = (file: FileItem) =>\n file.canUpdate === true || file.canWrite === true;\n const fileCanShare = (file: FileItem) =>\n file.canShare === true || fileCanUpdate(file);\n const fileCanDelete = (file: FileItem) => file.canDelete === true;\n\n const folderCanRead = (folder: FolderItem) =>\n folder.canRead === true || folder.permissions?.canRead === true;\n const folderCanUpdate = (folder: FolderItem) =>\n folder.canUpdate === true || folder.permissions?.canWrite === true;\n const folderCanShare = (folder: FolderItem) =>\n folder.permissions?.canShare === true || folderCanUpdate(folder);\n const folderCanDelete = (folder: FolderItem) =>\n folder.canDelete === true || folder.permissions?.canDelete === true;\n\n const getContextMenuItems = () => {\n if (!contextMenu) return [];\n if (contextMenu.type === \"file\") {\n const file = contextMenu.item as FileItem;\n return createFileMenuItems(\n {\n onShare:\n onFileShare && fileCanShare(file)\n ? () => onFileShare(file)\n : undefined,\n onDownload:\n onFileDownload && fileCanRead(file)\n ? () => onFileDownload(file)\n : undefined,\n onCopy:\n onFileCopy && fileCanRead(file)\n ? () => onFileCopy(file)\n : undefined,\n onRename:\n onFileRename && fileCanUpdate(file)\n ? () => onFileRename(file)\n : undefined,\n onStar:\n onFileFavorite && fileCanUpdate(file)\n ? () => onFileFavorite(file)\n : undefined,\n onMove:\n onFileMove && fileCanUpdate(file)\n ? () => onFileMove(file)\n : undefined,\n onInfo: onFileInfo ? () => onFileInfo(file) : undefined,\n onActivity: onFileActivity ? () => onFileActivity(file) : undefined,\n onDelete:\n onFileDelete && fileCanDelete(file)\n ? () => onFileDelete(file)\n : undefined,\n onRestore:\n onFileRestore && fileCanUpdate(file)\n ? () => onFileRestore(file)\n : undefined,\n isStarred: file.starred,\n },\n t,\n );\n } else {\n const folder = contextMenu.item as FolderItem;\n return createFolderMenuItems(\n {\n onShare:\n onFolderShare && folderCanShare(folder)\n ? () => onFolderShare(folder)\n : undefined,\n onRename:\n onFolderRename && folderCanUpdate(folder)\n ? () => onFolderRename(folder)\n : undefined,\n onStar:\n onFolderFavorite && folderCanUpdate(folder)\n ? () => onFolderFavorite(folder)\n : undefined,\n onMove:\n onFolderMove && folderCanUpdate(folder)\n ? () => onFolderMove(folder)\n : undefined,\n onInfo: onFolderInfo ? () => onFolderInfo(folder) : undefined,\n onDelete:\n onFolderDelete && folderCanDelete(folder)\n ? () => onFolderDelete(folder)\n : undefined,\n onRestore:\n onFolderRestore && folderCanUpdate(folder)\n ? () => onFolderRestore(folder)\n : undefined,\n isStarred: folder.starred,\n },\n t,\n );\n }\n };\n\n const sortedFiles = preserveSortOrder\n ? files\n : sortFiles(files, sortBy, sortDirection);\n const sortedFolders = preserveSortOrder\n ? folders\n : sortFiles(folders, sortBy, sortDirection);\n\n if (loading) {\n return (\n <div\n className=\"@container p-page-padding\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label={tWithFallback(t, \"files.browser.loading\", \"Loading files…\")}\n >\n <div className=\"grid grid-cols-2 gap-4 @md:grid-cols-3 @lg:grid-cols-4 @xl:grid-cols-5\">\n {Array.from({ length: 10 }).map((_, index) => (\n <div\n key={index}\n className=\"overflow-hidden rounded-card border border-border-seam bg-bg-surface\"\n >\n <div className=\"aspect-[4/3] w-full animate-vc-shimmer bg-bg-sunken\" />\n <div className=\"space-y-2 p-3\">\n <div className=\"h-3 w-3/4 animate-vc-shimmer rounded bg-bg-sunken\" />\n <div className=\"h-3 w-1/2 animate-vc-shimmer rounded bg-bg-sunken\" />\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"flex items-center justify-center min-h-[500px]\">\n <div className=\"text-center max-w-md\">\n <div className=\"mb-3 text-xl font-semibold text-status-error-text\">\n {tWithFallback(\n t,\n \"files.browser.loadError\",\n \"Failed to load files\",\n )}\n </div>\n <p className=\"mb-6 text-sm text-text-secondary\">\n {error.message ||\n tWithFallback(\n t,\n \"files.browser.unexpectedError\",\n \"An unexpected error occurred\",\n )}\n </p>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"rounded-lg bg-action-primary-bg px-6 py-2.5 text-sm font-medium text-text-inverse transition-colors hover:bg-action-primary-bg-hover\"\n >\n {tWithFallback(t, \"files.browser.retry\", \"Retry\")}\n </button>\n </div>\n </div>\n );\n }\n\n if (files.length === 0 && folders.length === 0) {\n return (\n <>\n {contextMenu && (\n <ContextMenu\n x={contextMenu.x}\n y={contextMenu.y}\n onClose={closeContextMenu}\n items={getContextMenuItems()}\n />\n )}\n </>\n );\n }\n\n if (viewMode !== \"list\") {\n return (\n <div className=\"@container bg-bg-canvas p-page-padding\">\n {/* Folders section */}\n {sortedFolders.length > 0 && (\n <div className={sortedFiles.length > 0 ? \"mb-6\" : \"\"}>\n {sortedFiles.length > 0 && (\n <h2 className=\"text-xs font-semibold text-text-tertiary uppercase tracking-wider mb-3 px-1\">\n {tWithFallback(t, \"files.browser.section.folders\", \"Folders\")}\n </h2>\n )}\n <div className=\"grid grid-cols-1 @sm:grid-cols-2 @lg:grid-cols-3 @xl:grid-cols-4 gap-2\">\n {sortedFolders.map((folder) => (\n <FolderCard\n key={folder.id}\n folder={folder}\n isSelected={selectedFolders.has(folder.id)}\n isDragging={draggedItem?.item.id === folder.id}\n isDropTarget={dragState.dropTargetFolderId === folder.id}\n draggedItem={draggedItem}\n onOpen={folderCanRead(folder) ? onFolderOpen : undefined}\n onShare={folderCanShare(folder) ? onFolderShare : undefined}\n onDelete={\n folderCanDelete(folder) ? onFolderDelete : undefined\n }\n onRestore={\n folderCanUpdate(folder) ? onFolderRestore : undefined\n }\n onRename={\n folderCanUpdate(folder) ? onFolderRename : undefined\n }\n onFavorite={\n folderCanUpdate(folder) ? onFolderFavorite : undefined\n }\n onCopy={onFolderCopy}\n onMove={folderCanUpdate(folder) ? onFolderMove : undefined}\n onInfo={onFolderInfo}\n onActivity={onFolderActivity}\n onDragStart={\n folderCanUpdate(folder) ? handleFolderDragStart : undefined\n }\n onDragEnd={handleDragEnd}\n onDrop={\n folderCanUpdate(folder) ? handleFolderDrop : undefined\n }\n onContextMenu={handleFolderContextMenu}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Files section */}\n {sortedFiles.length > 0 && (\n <div>\n {sortedFolders.length > 0 && (\n <h2 className=\"text-xs font-semibold text-text-tertiary uppercase tracking-wider mb-3 px-1\">\n {tWithFallback(t, \"files.browser.section.files\", \"Files\")}\n </h2>\n )}\n <div className=\"grid grid-cols-2 @md:grid-cols-3 @lg:grid-cols-4 @xl:grid-cols-5 gap-4\">\n {sortedFiles.map((file) => (\n <FileCard\n key={file.id}\n file={file}\n isSelected={selectedFiles.has(file.id)}\n isDragging={draggedItem?.item.id === file.id}\n onPreview={fileCanRead(file) ? onFilePreview : undefined}\n onShare={fileCanShare(file) ? onFileShare : undefined}\n onDelete={fileCanDelete(file) ? onFileDelete : undefined}\n onRestore={fileCanUpdate(file) ? onFileRestore : undefined}\n onFavorite={fileCanUpdate(file) ? onFileFavorite : undefined}\n onRename={fileCanUpdate(file) ? onFileRename : undefined}\n onDownload={fileCanRead(file) ? onFileDownload : undefined}\n onCopy={fileCanRead(file) ? onFileCopy : undefined}\n onMove={fileCanUpdate(file) ? onFileMove : undefined}\n onInfo={onFileInfo}\n onActivity={onFileActivity}\n onDragStart={\n fileCanUpdate(file) ? handleFileDragStart : undefined\n }\n onDragEnd={handleDragEnd}\n onContextMenu={handleFileContextMenu}\n />\n ))}\n </div>\n </div>\n )}\n\n {contextMenu && (\n <ContextMenu\n x={contextMenu.x}\n y={contextMenu.y}\n onClose={closeContextMenu}\n items={getContextMenuItems()}\n />\n )}\n </div>\n );\n }\n\n if (viewMode === \"list\") {\n return (\n <div className=\"@container bg-bg-canvas\">\n <div className=\"hidden @md:flex items-center gap-3 px-3 py-2 bg-bg-surface border-b border-border-seam text-text-secondary font-text-sm font-weight-medium\">\n <div className=\"flex-shrink-0 w-4\" />\n <div className=\"flex-shrink-0 w-6\" />\n <div className=\"flex-1\">\n {tWithFallback(t, \"files.browser.name\", \"Name\")}\n </div>\n <div className=\"hidden @lg:block flex-shrink-0 w-40\">\n {tWithFallback(t, \"files.browser.owner\", \"Owner\")}\n </div>\n <div className=\"hidden @md:block flex-shrink-0 w-24 text-right\">\n {tWithFallback(t, \"files.browser.size\", \"Size\")}\n </div>\n <div className=\"hidden @lg:block flex-shrink-0 w-32 text-right\">\n {tWithFallback(t, \"files.browser.modified\", \"Modified\")}\n </div>\n <div className=\"flex-shrink-0 w-32\" />\n </div>\n\n <div className=\"divide-y divide-border-subtle\">\n {sortedFolders.map((folder) => (\n <div\n key={folder.id}\n className={`group flex items-center gap-3 border-b border-border-seam bg-bg-surface p-3 transition-colors hover:bg-bg-sunken focus-within:bg-bg-sunken ${dragState.dropTargetFolderId === folder.id && draggedItem?.item.id !== folder.id ? \"bg-action-primary-bg/10\" : \"\"} ${draggedItem?.item.id === folder.id ? \"opacity-50\" : \"\"}`}\n onClick={() => {\n if (folderCanRead(folder)) onFolderOpen?.(folder);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n if (folderCanRead(folder)) onFolderOpen?.(folder);\n }\n }}\n onDragOver={(e) => {\n if (\n draggedItem &&\n draggedItem.item.id !== folder.id &&\n folderCanUpdate(folder)\n ) {\n e.preventDefault();\n handleFolderDragOver(folder.id);\n }\n }}\n onDragLeave={handleFolderDragLeave}\n onDrop={async (e) => {\n e.preventDefault();\n if (\n draggedItem &&\n draggedItem.item.id !== folder.id &&\n folderCanUpdate(folder)\n ) {\n await handleFolderDrop(folder);\n }\n }}\n onContextMenu={(e) => {\n e.preventDefault();\n handleFolderContextMenu(folder, e.clientX, e.clientY);\n }}\n role=\"button\"\n tabIndex={0}\n aria-label={tWithFallback(\n t,\n \"files.browser.openFolder\",\n \"Open folder\",\n )}\n >\n <div className=\"flex-shrink-0\">\n <input\n type=\"checkbox\"\n checked={selectedFolders.has(folder.id)}\n onChange={(e) => {\n e.stopPropagation();\n useFilesStore.getState().toggleFolderSelection(folder.id);\n }}\n className=\"size-4 rounded border-border-default bg-bg-surface text-action-primary-bg focus:ring-2 focus:ring-action-primary-bg focus:ring-offset-2\"\n aria-label={`Select ${folder.name}`}\n />\n </div>\n <Folder className=\"size-6 text-action-primary-bg flex-shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-text-md font-weight-medium text-text-primary truncate\">\n {folder.name}\n </span>\n {folder.starred && (\n <Star className=\"size-3 flex-shrink-0 fill-yellow-400 text-yellow-400\" />\n )}\n </div>\n </div>\n <div className=\"hidden @lg:block flex-shrink-0 w-40\">\n {folder.createdBy && (\n <div className=\"flex items-center gap-2\">\n {folder.createdBy.avatar && (\n <img\n src={folder.createdBy.avatar}\n alt={folder.createdBy.name}\n className=\"size-6 rounded-full\"\n />\n )}\n <span className=\"font-text-sm text-text-secondary truncate\">\n {folder.createdBy.name}\n </span>\n </div>\n )}\n </div>\n <div className=\"hidden @md:block flex-shrink-0 w-24 text-right\">\n <span className=\"font-text-sm text-text-secondary\">\n {(folder.filesCount ?? 0) + (folder.subfoldersCount ?? 0)}{\" \"}\n {tWithFallback(t, \"files.browser.items\", \"items\")}\n </span>\n </div>\n <div className=\"hidden @lg:block flex-shrink-0 w-32 text-right\">\n <span className=\"font-text-sm text-text-secondary\">\n {new Date(folder.updatedAt).toLocaleDateString()}\n </span>\n </div>\n\n <div className=\"flex w-32 flex-shrink-0 items-center gap-1 opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100\">\n {folderCanShare(folder) && onFolderShare && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onFolderShare(folder);\n }}\n className=\"p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors\"\n aria-label={tWithFallback(\n t,\n \"files.browser.share\",\n \"Share\",\n )}\n title={tWithFallback(\n t,\n \"files.browser.shareFolder\",\n \"Share folder\",\n )}\n >\n <svg\n className=\"size-4 text-text-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8.684 13.342C8.886 12.938 9 12.482 9 12c0-.482-.114-.938-.316-1.342m0 2.684a3 3 0 110-2.684m0 2.684l6.632 3.316m-6.632-6l6.632-3.316m0 0a3 3 0 105.367-2.684 3 3 0 00-5.367 2.684zm0 9.316a3 3 0 105.368 2.684 3 3 0 00-5.368-2.684z\"\n />\n </svg>\n </button>\n )}\n\n {folderCanUpdate(folder) && onFolderRename && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onFolderRename(folder);\n }}\n className=\"hidden @md:block p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors\"\n aria-label={tWithFallback(\n t,\n \"files.browser.rename\",\n \"Rename\",\n )}\n title={tWithFallback(t, \"files.browser.rename\", \"Rename\")}\n >\n <svg\n className=\"size-4 text-text-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\"\n />\n </svg>\n </button>\n )}\n\n {folderCanDelete(folder) && onFolderDelete && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onFolderDelete(folder);\n }}\n className=\"p-1.5 hover:bg-action-danger-bg-hover rounded transition-colors\"\n aria-label={tWithFallback(\n t,\n \"files.browser.delete\",\n \"Delete\",\n )}\n title={tWithFallback(t, \"files.browser.delete\", \"Delete\")}\n >\n <svg\n className=\"size-4 text-status-error-text\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n </button>\n )}\n\n <div onClick={(e) => e.stopPropagation()}>\n <ActionMenu\n items={createFolderMenuItems(\n {\n onShare:\n folderCanShare(folder) && onFolderShare\n ? () => onFolderShare(folder)\n : undefined,\n onRename:\n folderCanUpdate(folder) && onFolderRename\n ? () => onFolderRename(folder)\n : undefined,\n onStar:\n folderCanUpdate(folder) && onFolderFavorite\n ? () => onFolderFavorite(folder)\n : undefined,\n onMove:\n folderCanUpdate(folder) && onFolderMove\n ? () => onFolderMove(folder)\n : undefined,\n onInfo: () => onFolderInfo?.(folder),\n onRestore:\n folderCanUpdate(folder) && onFolderRestore\n ? () => onFolderRestore(folder)\n : undefined,\n onDelete:\n folderCanDelete(folder) && onFolderDelete\n ? () => onFolderDelete(folder)\n : undefined,\n isStarred: folder.starred,\n },\n t,\n )}\n isOpen={openMenuId === folder.id}\n onToggle={(open) => setOpenMenuId(open ? folder.id : null)}\n />\n </div>\n </div>\n </div>\n ))}\n\n {sortedFiles.map((file) => (\n <FileListItem\n key={file.id}\n file={file}\n isSelected={selectedFiles.has(file.id)}\n isDragging={draggedItem?.item.id === file.id}\n onPreview={fileCanRead(file) ? onFilePreview : undefined}\n onShare={fileCanShare(file) ? onFileShare : undefined}\n onDelete={fileCanDelete(file) ? onFileDelete : undefined}\n onRestore={fileCanUpdate(file) ? onFileRestore : undefined}\n onFavorite={fileCanUpdate(file) ? onFileFavorite : undefined}\n onRename={fileCanUpdate(file) ? onFileRename : undefined}\n onDownload={fileCanRead(file) ? onFileDownload : undefined}\n onCopy={fileCanRead(file) ? onFileCopy : undefined}\n onMove={fileCanUpdate(file) ? onFileMove : undefined}\n onInfo={onFileInfo}\n onActivity={onFileActivity}\n onDragStart={\n fileCanUpdate(file) ? handleFileDragStart : undefined\n }\n onDragEnd={handleDragEnd}\n onContextMenu={handleFileContextMenu}\n />\n ))}\n </div>\n {contextMenu && (\n <ContextMenu\n x={contextMenu.x}\n y={contextMenu.y}\n onClose={closeContextMenu}\n items={getContextMenuItems()}\n />\n )}\n </div>\n );\n }\n\n return null;\n};\n"],"mappings":"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"}
@@ -5,8 +5,9 @@ import { useEffect as n, useRef as r } from "react";
5
5
  import { Image as i, Pause as a, Play as o, RotateCcw as s, X as c } from "lucide-react";
6
6
  import { jsx as l, jsxs as u } from "react/jsx-runtime";
7
7
  import { useI18n as d } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
+ import { GlassCard as f } from "@burdenoff/fe-libs/ui";
8
9
  //#region src/files/components/UploadQueue.tsx
9
- function f({ item: f, onPause: p, onResume: m, onRetry: h, onCancel: g }) {
10
+ function p({ item: f, onPause: p, onResume: m, onRetry: h, onCancel: g }) {
10
11
  let { t: _ } = d(), v = r(null), y = e(f.file.type);
11
12
  return n(() => {
12
13
  v.current && (v.current.style.width = `${f.progress}%`);
@@ -113,40 +114,46 @@ function f({ item: f, onPause: p, onResume: m, onRetry: h, onCancel: g }) {
113
114
  })
114
115
  });
115
116
  }
116
- function p({ items: e, isOpen: n, onClose: r, onPause: i, onResume: a, onRetry: o, onCancel: s }) {
117
- let { t: p } = d();
117
+ function m({ items: e, isOpen: n, onClose: r, onPause: i, onResume: a, onRetry: o, onCancel: s }) {
118
+ let { t: m } = d();
118
119
  if (!n) return null;
119
- let m = e.filter((e) => e.status === "completed").length, h = e.filter((e) => e.status === "failed").length, g = e.filter((e) => e.status === "uploading" || e.status === "pending").length;
120
- return /* @__PURE__ */ u("div", {
121
- className: "fixed bottom-4 right-4 w-80 md:w-96 max-w-[90vw] bg-bg-elevated border border-border-default rounded-lg shadow-xl z-50",
120
+ let h = e.filter((e) => e.status === "completed").length, g = e.filter((e) => e.status === "failed").length, _ = e.filter((e) => e.status === "uploading" || e.status === "pending").length;
121
+ return /* @__PURE__ */ u(f, {
122
+ treatment: "glass",
123
+ glow: !0,
124
+ className: "fixed bottom-4 right-4 z-50 w-80 max-w-[90vw] md:w-96",
122
125
  children: [/* @__PURE__ */ u("div", {
123
- className: "flex items-center justify-between p-3 border-b border-border-default",
126
+ className: "flex items-center justify-between p-3 border-b border-border-seam",
124
127
  children: [/* @__PURE__ */ u("div", { children: [
125
128
  /* @__PURE__ */ u("h3", {
126
- className: "text-sm font-semibold text-text-primary",
129
+ className: "flex items-center gap-2 text-sm font-semibold text-text-primary",
127
130
  children: [
128
- t(p, "files.upload.uploads", "Uploads"),
131
+ _ > 0 && /* @__PURE__ */ l("span", {
132
+ className: "size-2 shrink-0 rounded-full bg-action-primary-bg motion-safe:animate-vc-glow-pulse",
133
+ "aria-hidden": "true"
134
+ }),
135
+ t(m, "files.upload.uploads", "Uploads"),
129
136
  " (",
130
- g,
137
+ _,
131
138
  " ",
132
- t(p, "files.upload.active", "active"),
139
+ t(m, "files.upload.active", "active"),
133
140
  ")"
134
141
  ]
135
142
  }),
136
- m > 0 && /* @__PURE__ */ u("p", {
143
+ h > 0 && /* @__PURE__ */ u("p", {
137
144
  className: "text-xs text-status-success-text",
138
145
  children: [
139
- m,
146
+ h,
140
147
  " ",
141
- t(p, "files.upload.completed", "completed")
148
+ t(m, "files.upload.completed", "completed")
142
149
  ]
143
150
  }),
144
- h > 0 && /* @__PURE__ */ u("p", {
151
+ g > 0 && /* @__PURE__ */ u("p", {
145
152
  className: "text-xs text-status-error-text",
146
153
  children: [
147
- h,
154
+ g,
148
155
  " ",
149
- t(p, "files.upload.failed", "failed")
156
+ t(m, "files.upload.failed", "failed")
150
157
  ]
151
158
  })
152
159
  ] }), /* @__PURE__ */ l("button", {
@@ -159,8 +166,8 @@ function p({ items: e, isOpen: n, onClose: r, onPause: i, onResume: a, onRetry:
159
166
  className: "max-h-64 overflow-y-auto p-2 space-y-2",
160
167
  children: e.length === 0 ? /* @__PURE__ */ l("p", {
161
168
  className: "text-sm text-text-secondary text-center py-4",
162
- children: t(p, "files.upload.noUploads", "No uploads")
163
- }) : e.map((e) => /* @__PURE__ */ l(f, {
169
+ children: t(m, "files.upload.noUploads", "No uploads")
170
+ }) : e.map((e) => /* @__PURE__ */ l(p, {
164
171
  item: e,
165
172
  onPause: i,
166
173
  onResume: a,
@@ -171,6 +178,6 @@ function p({ items: e, isOpen: n, onClose: r, onPause: i, onResume: a, onRetry:
171
178
  });
172
179
  }
173
180
  //#endregion
174
- export { p as UploadQueue };
181
+ export { m as UploadQueue };
175
182
 
176
183
  //# sourceMappingURL=UploadQueue.js.map