@harryy/react-file-browser 1.4.0 → 1.5.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 (46) hide show
  1. package/README.md +85 -26
  2. package/dist/chunks/file-types-DZ2qAUnj.js +331 -0
  3. package/dist/chunks/file-types-DZ2qAUnj.js.map +1 -0
  4. package/dist/chunks/list-BwYAbqhl.js +31 -0
  5. package/dist/chunks/list-BwYAbqhl.js.map +1 -0
  6. package/dist/chunks/spreadsheet-GqF9DCoj.js +118 -0
  7. package/dist/chunks/spreadsheet-GqF9DCoj.js.map +1 -0
  8. package/dist/components/file-browser.d.ts +11 -3
  9. package/dist/components/file-browser.d.ts.map +1 -1
  10. package/dist/components/file-plugins.d.ts +64 -0
  11. package/dist/components/file-plugins.d.ts.map +1 -0
  12. package/dist/components/file-types.d.ts +12 -0
  13. package/dist/components/file-types.d.ts.map +1 -0
  14. package/dist/components/file-view.d.ts +25 -0
  15. package/dist/components/file-view.d.ts.map +1 -0
  16. package/dist/core/use-file-browser.d.ts +0 -28
  17. package/dist/core/use-file-browser.d.ts.map +1 -1
  18. package/dist/index.d.ts +3 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +2196 -2130
  21. package/dist/index.js.map +1 -1
  22. package/dist/plugins/code/index.d.ts +26 -0
  23. package/dist/plugins/code/index.d.ts.map +1 -0
  24. package/dist/plugins/code/index.js +215 -0
  25. package/dist/plugins/code/index.js.map +1 -0
  26. package/dist/plugins/csv/index.d.ts +6 -0
  27. package/dist/plugins/csv/index.d.ts.map +1 -0
  28. package/dist/plugins/csv/index.js +48 -0
  29. package/dist/plugins/csv/index.js.map +1 -0
  30. package/dist/plugins/docx/index.d.ts +4 -0
  31. package/dist/plugins/docx/index.d.ts.map +1 -0
  32. package/dist/plugins/docx/index.js +40 -0
  33. package/dist/plugins/docx/index.js.map +1 -0
  34. package/dist/plugins/markdown/index.d.ts +13 -0
  35. package/dist/plugins/markdown/index.d.ts.map +1 -0
  36. package/dist/plugins/markdown/index.js +292 -0
  37. package/dist/plugins/markdown/index.js.map +1 -0
  38. package/dist/plugins/rich-text.d.ts +10 -0
  39. package/dist/plugins/rich-text.d.ts.map +1 -0
  40. package/dist/plugins/spreadsheet.d.ts +20 -0
  41. package/dist/plugins/spreadsheet.d.ts.map +1 -0
  42. package/dist/plugins/xlsx/index.d.ts +6 -0
  43. package/dist/plugins/xlsx/index.d.ts.map +1 -0
  44. package/dist/plugins/xlsx/index.js +84 -0
  45. package/dist/plugins/xlsx/index.js.map +1 -0
  46. package/package.json +86 -3
package/README.md CHANGED
@@ -21,14 +21,19 @@ S3, Cloudflare R2, Supabase Storage, an in-memory store, or any backend you impl
21
21
  rename affordance disappears; no config flags to keep in sync.
22
22
  - **Resumable uploads** — session-scoped transfer manager with multipart support, a floating transfer
23
23
  widget, progress, and a resume prompt after a hard refresh.
24
- - **Grid and list views**, search, filter, sort, drag-and-drop move, cut/copy/paste, multi-select,
25
- keyboard shortcuts, file preview, and a details panel.
24
+ - **List and grid views** with row checkboxes, sortable columns, a per-item actions menu, file-type
25
+ icons, search, filter, sort, drag-and-drop move, cut/copy/paste, multi-select, and keyboard shortcuts.
26
+ - **Files open in place** — double-click or Enter opens a file inside the browser in Preview, with an
27
+ Edit switch when an editor matches, Save/Cancel, a size counter, and conflict and unsaved-changes guards.
28
+ - **Preview and edit plugins** — browser-native previews for images, video, audio, PDF, HTML, and
29
+ text, plus opt-in plugins for code, Markdown, CSV, XLSX, and DOCX. Configure them or bring your own.
30
+ - **Per-item read-only** — lock individual files or folders with `isItemReadOnly`.
26
31
  - **Bulk download** — uses the adapter's `bulkDownloadUrl` when present, otherwise builds a client-side
27
32
  zip from signed URLs.
28
33
  - **Upload policies** — reject files by MIME type, size, remaining quota, or a custom validator before
29
34
  they enqueue.
30
35
  - **Host extension points** — controlled path and search state, opaque item ids, typed metadata,
31
- custom item/details rendering, conflict policy, and custom empty states.
36
+ custom item metadata rendering, conflict policy, and custom empty states.
32
37
  - **Themeable** with CSS variables that inherit your Tailwind v4 / design-system tokens. No global CSS
33
38
  shipped.
34
39
  - **Read-only mode**, comfortable/compact density, ESM-only, fully typed.
@@ -41,9 +46,8 @@ multi-selection, or choose **Browser options → Select items**, then use the vi
41
46
  bottom action bar. Search stays visible; filter, sort, view, and folder creation live in Browser
42
47
  options. Upload remains available above the footer.
43
48
 
44
- Details use the sidebar at 64rem and above, and an on-demand sheet at smaller widths. On narrow
45
- layouts, select an item and choose **Details**. `showDetailsPanel={false}` hides both presentations.
46
- Custom item and details renderers should also use fluid widths.
49
+ Selection actions live in the toolbar above the list (and a bottom action bar on narrow layouts);
50
+ there is no details sidebar. Custom item renderers should use fluid widths.
47
51
 
48
52
  Dialogs fit the available viewport height. Narrow menus and conflicts use bottom sheets. The
49
53
  provider's transfer widget responds to the viewport, starts collapsed on phones, and expands into a
@@ -112,12 +116,6 @@ declare const adapter: FileBrowserAdapter<IndexingMetadata>;
112
116
  renderItemMeta={(item) =>
113
117
  item.metadata ? <IndexingStatus status={item.metadata.indexingStatus} /> : null
114
118
  }
115
- renderDetailsContent={(item, defaultContent) => (
116
- <>
117
- {defaultContent}
118
- {item.metadata ? <IndexingDetails metadata={item.metadata} /> : null}
119
- </>
120
- )}
121
119
  uploadConflictResolutions={["keep-both", "skip"]}
122
120
  allowClientZipFallback={false}
123
121
  />;
@@ -228,7 +226,6 @@ or `bulkDownloadUrl`, those controls are hidden. Recursive folder drops are reje
228
226
  | `onSearchQueryChange` | `(query) => void` | None | Receives user-driven search changes. |
229
227
  | `density` | `"comfortable" \| "compact"` | `"comfortable"` | Row/tile density. |
230
228
  | `readOnly` | `boolean` | `false` | Hides all mutating affordances. |
231
- | `showDetailsPanel` | `boolean` | `true` | Toggles details, shown as a sidebar or responsive sheet. |
232
229
  | `uploadPolicy` | `FileBrowserUploadPolicy` | None | Reject files before they enqueue. |
233
230
  | `uploadConflictResolutions` | `FileBrowserUploadConflictResolution[]` | all | Allowed conflict-dialog actions. |
234
231
  | `allowClientZipFallback` | `boolean` | `true` | Allows browser-built ZIPs when no server ZIP exists. |
@@ -236,7 +233,9 @@ or `bulkDownloadUrl`, those controls are hidden. Recursive folder drops are reje
236
233
  | `rootLabel` | `string` | `"Files"` | Root breadcrumb and navigation label. |
237
234
  | `emptyState` | `{ title: ReactNode; description?: ReactNode }` | built in | Empty-folder content. |
238
235
  | `renderItemMeta` | `(item, { view }) => ReactNode` | None | Host metadata below grid/list item names. |
239
- | `renderDetailsContent` | `(item, defaultContent) => ReactNode` | None | Extends single-item details. |
236
+ | `isItemReadOnly` | `(item) => boolean` | None | Locks items: no rename, move, cut, delete, edit, or drops into a locked folder. |
237
+ | `previewers` | `FileBrowserPreviewer[]` | `defaultFileBrowserPreviewers` | Inline preview renderers; first match wins. `[]` disables. |
238
+ | `editors` | `FileBrowserEditor[]` | `defaultFileBrowserEditors` | In-place editors; first match wins. `[]` disables editing. |
240
239
  | `className` | `string` | None | Class name merged onto the root browser surface. |
241
240
 
242
241
  ### `<FileBrowserProvider>` props
@@ -268,11 +267,6 @@ own UI. The `FileBrowser` component is a consumer of this hook.
268
267
  It also accepts controlled `path`, `searchQuery`, and their change callbacks. `navigate(path)` emits a
269
268
  `programmatic` path-change source, while `open(folder)` emits the complete target item.
270
269
 
271
- For tree-style list views, `listRows` flattens expanded folders into `{ type: 'item', item, depth,
272
- expanded }` and `{ type: 'status', parentPath, depth, status }` rows. Drive expansion with
273
- `expandFolder`, `collapseFolder`, `toggleFolder`, and `loadMoreFolder`. `visibleItems` lists items in
274
- on-screen order for the active view and backs range selection and keyboard movement.
275
-
276
270
  ### Entry points
277
271
 
278
272
  | Import | Contents |
@@ -282,8 +276,69 @@ on-screen order for the active view and backs range selection and keyboard movem
282
276
  | `@harryy/react-file-browser/adapters/s3` | `S3FileBrowserAdapter`. |
283
277
  | `@harryy/react-file-browser/adapters/r2` | `R2FileBrowserAdapter`. |
284
278
  | `@harryy/react-file-browser/adapters/supabase` | `SupabaseFileBrowserAdapter`. |
279
+ | `@harryy/react-file-browser/plugins/code` | `codeEditor`, `codePreviewer`, `jsonEditor`, `markupEditor`, `getCodeLanguage`. |
280
+ | `@harryy/react-file-browser/plugins/markdown` | `markdownEditor`, `markdownPreviewer`, `markdownToHtml`, `htmlToMarkdown`. |
281
+ | `@harryy/react-file-browser/plugins/csv` | `csvEditor`, `csvPreviewer`. |
282
+ | `@harryy/react-file-browser/plugins/xlsx` | `xlsxEditor`, `xlsxPreviewer`. |
283
+ | `@harryy/react-file-browser/plugins/docx` | `docxPreviewer`. |
285
284
  | `@harryy/react-file-browser/theme` | `FILE_BROWSER_THEME_CONTRACT`, `getFileBrowserDensityAttributes`. |
286
285
 
286
+ ## Previews and editing
287
+
288
+ Out of the box the browser previews images, video, audio, PDF (the browser's own viewer), HTML (in a
289
+ sandboxed iframe that cannot run scripts), and plain text, and edits text files in a plain text area.
290
+ Everything else is opt-in: each plugin is its own import, and its npm package is an optional peer
291
+ dependency you install only if you use it.
292
+
293
+ | Plugin | Install | Does | Approx. gzip |
294
+ | --- | --- | --- | --- |
295
+ | `plugins/code` | `codejar prismjs` | Syntax-highlighted code editing and preview; HTML and SVG editing with a live preview beside the source (`markupEditor`); JSON editing with Format and an invalid-JSON save guard (`jsonEditor`) | 21 KB |
296
+ | `plugins/markdown` | `react-markdown squire-rte marked turndown dompurify` | Rendered Markdown preview (raw HTML ignored) and a WYSIWYG Markdown editor with a small toolbar (`markdownEditor`) | 92 KB |
297
+ | `plugins/csv` | `papaparse jspreadsheet-ce` | Spreadsheet-style CSV/TSV editing and preview | 136 KB |
298
+ | `plugins/xlsx` | `read-excel-file write-excel-file jspreadsheet-ce` | Spreadsheet-style XLSX editing and preview, one tab per sheet | 162 KB |
299
+ | `plugins/docx` | `docx-preview` | Word document preview | 50 KB |
300
+
301
+ Pass plugins ahead of the defaults; the first match wins:
302
+
303
+ ```tsx
304
+ import { FileBrowser, defaultFileBrowserEditors, defaultFileBrowserPreviewers } from '@harryy/react-file-browser'
305
+ import { codeEditor, codePreviewer, jsonEditor, markupEditor } from '@harryy/react-file-browser/plugins/code'
306
+ import { csvEditor, csvPreviewer } from '@harryy/react-file-browser/plugins/csv'
307
+ import { markdownEditor, markdownPreviewer } from '@harryy/react-file-browser/plugins/markdown'
308
+ // Once, if you use the csv or xlsx plugin:
309
+ import 'jspreadsheet-ce/dist/jspreadsheet.css'
310
+ import 'jspreadsheet-ce/dist/jspreadsheet.themes.css'
311
+ import 'jsuites/dist/jsuites.css'
312
+
313
+ <FileBrowser
314
+ adapter={adapter}
315
+ previewers={[markdownPreviewer, csvPreviewer, codePreviewer, ...defaultFileBrowserPreviewers]}
316
+ editors={[csvEditor, markdownEditor, markupEditor, jsonEditor, codeEditor, ...defaultFileBrowserEditors]}
317
+ />
318
+ ```
319
+
320
+ Notes:
321
+
322
+ - The csv and xlsx plugins use jspreadsheet-ce. Editing supports typing, Ctrl/Cmd+C, X, V and Z, and a
323
+ right-click menu that inserts or deletes rows and columns in place. Comments, sorting, column
324
+ renaming, and export are turned off. Previews are read-only with no menu. The plugin restyles the
325
+ sheet, tabs, and menu with scoped `--fb-*` rules, so it follows your light and dark themes; the host
326
+ still imports jspreadsheet's layout CSS (above).
327
+ - CSV saves keep typed formulas as text (`=A1*2`); XLSX saves write their computed values.
328
+ - Saving an XLSX writes cell values only. Formatting, formulas, charts, and images are lost, and the
329
+ editor says so beside Save.
330
+ - Previewers and editors that read file contents `fetch` the adapter's signed URL, so that URL must
331
+ allow cross-origin reads from your app.
332
+ - The editor checks `adapter.stat` before saving. If the file's `etag` (or `modifiedAt`) changed since
333
+ it was opened, it offers Reload or Keep my version instead of overwriting. Saves go through
334
+ `adapter.upload` with `onConflict: 'replace'`.
335
+ - The Markdown editor is visual: it converts Markdown to HTML (marked) to edit and back (turndown) to
336
+ save, so saving may normalize formatting such as list markers and spacing.
337
+ It cleans loaded and pasted markup with DOMPurify.
338
+ - Editors may set `validate(text)`; a returned message shows above the editor and disables Save.
339
+ - Write your own with the `FileBrowserPreviewer` and `FileBrowserEditor` types: `match(item)`,
340
+ optional `read: 'text' | 'binary'`, `maxBytes`, and a `component`.
341
+
287
342
  ## Styling
288
343
 
289
344
  The package does not ship global CSS. Components use utility classes and `--fb-*` CSS variables that
@@ -304,7 +359,7 @@ documents every token and its default.
304
359
  ## UI behavior
305
360
 
306
361
  - `readOnly` hides upload, create, rename, move, copy, and delete affordances while keeping browsing,
307
- preview, details, and download available.
362
+ preview and download available.
308
363
  - `uploadPolicy` can reject files before enqueueing transfers by MIME type, extension, max file size,
309
364
  remaining quota, maximum files per batch, or a custom validator. A batch over `maxFilesPerBatch` is
310
365
  rejected before folders are created or transfers enqueue. Other rejections render as an alert and
@@ -318,12 +373,16 @@ documents every token and its default.
318
373
  - Move-capable adapters enable the destination tree picker, Cut/Paste, and drag onto folders.
319
374
  - Keyboard shortcuts include Enter preview/open, F2 rename, Delete confirm, Cmd/Ctrl+A selection, and
320
375
  Cmd/Ctrl+C/X/V for adapter-gated copy, cut, and paste.
321
- - List view doubles as a tree, like an OS outline view: the chevron (or Right arrow) expands a folder
322
- inline, Left arrow collapses it or jumps to the parent, and double-click or Enter still opens the
323
- folder. Children load lazily through `adapter.list` with per-folder "Load more" pagination. Nested
324
- items support selection, preview, rename, delete, move, and paste like top-level items. Collapsing a
325
- folder, switching to grid view, or navigating clears selections that would become hidden. Search
326
- narrows the current folder only; the kind filter and sort apply at every level.
376
+ - The list view has row checkboxes with a select-all header, sortable Name/Size/Modified columns, and a
377
+ three-dot actions menu per row (also on grid tiles).
378
+ - Opening a file (double-click, Enter, or Preview in the menu) replaces the list with the file: the
379
+ breadcrumb extends to the file name, Previous/Next step through the folder's files, and Back or Escape
380
+ returns to the list. It opens in Preview; Edit (or Edit in the menu) switches to the matching editor.
381
+ Leaving with unsaved edits asks to discard them first.
382
+ - `isItemReadOnly(item)` locks individual items. Locked items show a lock icon;
383
+ rename, move, cut, delete, and edit are hidden for them (and for any selection that includes one),
384
+ F2 and Delete do nothing, they cannot be dragged, and a locked folder refuses dropped items. Download,
385
+ copy path, and preview stay available. Items inside a locked folder are judged on their own.
327
386
 
328
387
  ### Transfer persistence and concurrency
329
388
 
@@ -0,0 +1,331 @@
1
+ import { createContext as e, createElement as t, forwardRef as n, useContext as r } from "react";
2
+ //#region node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.mjs
3
+ var i = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), a = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), o = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), s = (e) => {
4
+ let t = o(e);
5
+ return t.charAt(0).toUpperCase() + t.slice(1);
6
+ }, c = {
7
+ xmlns: "http://www.w3.org/2000/svg",
8
+ width: 24,
9
+ height: 24,
10
+ viewBox: "0 0 24 24",
11
+ fill: "none",
12
+ stroke: "currentColor",
13
+ strokeWidth: 2,
14
+ strokeLinecap: "round",
15
+ strokeLinejoin: "round"
16
+ }, l = (e) => {
17
+ for (let t in e) if (t.startsWith("aria-") || t === "role" || t === "title") return !0;
18
+ return !1;
19
+ }, u = e({}), d = () => r(u), f = n(({ color: e, size: n, strokeWidth: r, absoluteStrokeWidth: a, className: o = "", children: s, iconNode: u, ...f }, p) => {
20
+ let { size: m = 24, strokeWidth: h = 2, absoluteStrokeWidth: g = !1, color: _ = "currentColor", className: v = "" } = d() ?? {}, y = a ?? g ? Number(r ?? h) * 24 / Number(n ?? m) : r ?? h;
21
+ return t("svg", {
22
+ ref: p,
23
+ ...c,
24
+ width: n ?? m ?? c.width,
25
+ height: n ?? m ?? c.height,
26
+ stroke: e ?? _,
27
+ strokeWidth: y,
28
+ className: i("lucide", v, o),
29
+ ...!s && !l(f) && { "aria-hidden": "true" },
30
+ ...f
31
+ }, [...u.map(([e, n]) => t(e, n)), ...Array.isArray(s) ? s : [s]]);
32
+ }), p = (e, r) => {
33
+ let o = n(({ className: n, ...o }, c) => t(f, {
34
+ ref: c,
35
+ iconNode: r,
36
+ className: i(`lucide-${a(s(e))}`, `lucide-${e}`, n),
37
+ ...o
38
+ }));
39
+ return o.displayName = s(e), o;
40
+ }, m = p("file-archive", [
41
+ ["path", {
42
+ d: "M13.659 22H18a2 2 0 0 0 2-2V8a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v11.5",
43
+ key: "4pqfef"
44
+ }],
45
+ ["path", {
46
+ d: "M14 2v5a1 1 0 0 0 1 1h5",
47
+ key: "wfsgrz"
48
+ }],
49
+ ["path", {
50
+ d: "M8 12v-1",
51
+ key: "1ej8lb"
52
+ }],
53
+ ["path", {
54
+ d: "M8 18v-2",
55
+ key: "qcmpov"
56
+ }],
57
+ ["path", {
58
+ d: "M8 7V6",
59
+ key: "1nbb54"
60
+ }],
61
+ ["circle", {
62
+ cx: "8",
63
+ cy: "20",
64
+ r: "2",
65
+ key: "ckkr5m"
66
+ }]
67
+ ]), h = p("file-code", [
68
+ ["path", {
69
+ d: "M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",
70
+ key: "1oefj6"
71
+ }],
72
+ ["path", {
73
+ d: "M14 2v5a1 1 0 0 0 1 1h5",
74
+ key: "wfsgrz"
75
+ }],
76
+ ["path", {
77
+ d: "M10 12.5 8 15l2 2.5",
78
+ key: "1tg20x"
79
+ }],
80
+ ["path", {
81
+ d: "m14 12.5 2 2.5-2 2.5",
82
+ key: "yinavb"
83
+ }]
84
+ ]), g = p("file-headphone", [
85
+ ["path", {
86
+ d: "M4 6.835V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2h-.343",
87
+ key: "1vfytu"
88
+ }],
89
+ ["path", {
90
+ d: "M14 2v5a1 1 0 0 0 1 1h5",
91
+ key: "wfsgrz"
92
+ }],
93
+ ["path", {
94
+ d: "M2 19a2 2 0 0 1 4 0v1a2 2 0 0 1-4 0v-4a6 6 0 0 1 12 0v4a2 2 0 0 1-4 0v-1a2 2 0 0 1 4 0",
95
+ key: "1etmh7"
96
+ }]
97
+ ]), _ = p("file-image", [
98
+ ["path", {
99
+ d: "M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",
100
+ key: "1oefj6"
101
+ }],
102
+ ["path", {
103
+ d: "M14 2v5a1 1 0 0 0 1 1h5",
104
+ key: "wfsgrz"
105
+ }],
106
+ ["circle", {
107
+ cx: "10",
108
+ cy: "12",
109
+ r: "2",
110
+ key: "737tya"
111
+ }],
112
+ ["path", {
113
+ d: "m20 17-1.296-1.296a2.41 2.41 0 0 0-3.408 0L9 22",
114
+ key: "wt3hpn"
115
+ }]
116
+ ]), v = p("file-play", [
117
+ ["path", {
118
+ d: "M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",
119
+ key: "1oefj6"
120
+ }],
121
+ ["path", {
122
+ d: "M14 2v5a1 1 0 0 0 1 1h5",
123
+ key: "wfsgrz"
124
+ }],
125
+ ["path", {
126
+ d: "M15.033 13.44a.647.647 0 0 1 0 1.12l-4.065 2.352a.645.645 0 0 1-.968-.56v-4.704a.645.645 0 0 1 .967-.56z",
127
+ key: "1tzo1f"
128
+ }]
129
+ ]), y = p("file-spreadsheet", [
130
+ ["path", {
131
+ d: "M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",
132
+ key: "1oefj6"
133
+ }],
134
+ ["path", {
135
+ d: "M14 2v5a1 1 0 0 0 1 1h5",
136
+ key: "wfsgrz"
137
+ }],
138
+ ["path", {
139
+ d: "M8 13h2",
140
+ key: "yr2amv"
141
+ }],
142
+ ["path", {
143
+ d: "M14 13h2",
144
+ key: "un5t4a"
145
+ }],
146
+ ["path", {
147
+ d: "M8 17h2",
148
+ key: "2yhykz"
149
+ }],
150
+ ["path", {
151
+ d: "M14 17h2",
152
+ key: "10kma7"
153
+ }]
154
+ ]), b = p("file-text", [
155
+ ["path", {
156
+ d: "M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",
157
+ key: "1oefj6"
158
+ }],
159
+ ["path", {
160
+ d: "M14 2v5a1 1 0 0 0 1 1h5",
161
+ key: "wfsgrz"
162
+ }],
163
+ ["path", {
164
+ d: "M10 9H8",
165
+ key: "b1mrlr"
166
+ }],
167
+ ["path", {
168
+ d: "M16 13H8",
169
+ key: "t4e002"
170
+ }],
171
+ ["path", {
172
+ d: "M16 17H8",
173
+ key: "z1uh3a"
174
+ }]
175
+ ]), x = p("file", [["path", {
176
+ d: "M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",
177
+ key: "1oefj6"
178
+ }], ["path", {
179
+ d: "M14 2v5a1 1 0 0 0 1 1h5",
180
+ key: "wfsgrz"
181
+ }]]), S = p("folder", [["path", {
182
+ d: "M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",
183
+ key: "1kt360"
184
+ }]]), C = p("presentation", [
185
+ ["path", {
186
+ d: "M2 3h20",
187
+ key: "91anmk"
188
+ }],
189
+ ["path", {
190
+ d: "M21 3v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V3",
191
+ key: "2k9sn8"
192
+ }],
193
+ ["path", {
194
+ d: "m7 21 5-5 5 5",
195
+ key: "bip4we"
196
+ }]
197
+ ]), w = /* @__PURE__ */ "txt.text.md.markdown.mdx.csv.tsv.json.jsonl.html.htm.xml.svg.yaml.yml.toml.ini.cfg.conf.log.css.scss.js.mjs.cjs.jsx.ts.tsx.py.rb.go.rs.java.kt.swift.php.sh.sql.graphql.rtf".split("."), T = /* @__PURE__ */ new Set(/* @__PURE__ */ "json.jsonl.html.htm.xml.yaml.yml.toml.ini.css.scss.js.mjs.cjs.jsx.ts.tsx.py.rb.go.rs.java.kt.swift.php.sh.sql.graphql".split(".")), E = /* @__PURE__ */ new Set([
198
+ "png",
199
+ "jpg",
200
+ "jpeg",
201
+ "gif",
202
+ "webp",
203
+ "avif",
204
+ "bmp",
205
+ "ico",
206
+ "svg"
207
+ ]), D = /* @__PURE__ */ new Set([
208
+ "mp4",
209
+ "webm",
210
+ "mov",
211
+ "m4v",
212
+ "ogv"
213
+ ]), O = /* @__PURE__ */ new Set([
214
+ "mp3",
215
+ "wav",
216
+ "ogg",
217
+ "oga",
218
+ "m4a",
219
+ "aac",
220
+ "flac"
221
+ ]), k = /* @__PURE__ */ new Set([
222
+ "zip",
223
+ "rar",
224
+ "7z",
225
+ "tar",
226
+ "gz",
227
+ "tgz",
228
+ "bz2",
229
+ "xz"
230
+ ]), A = /* @__PURE__ */ new Set([
231
+ "xls",
232
+ "xlsx",
233
+ "ods",
234
+ "numbers",
235
+ "csv",
236
+ "tsv"
237
+ ]), j = /* @__PURE__ */ new Set([
238
+ "ppt",
239
+ "pptx",
240
+ "key",
241
+ "odp"
242
+ ]), M = /* @__PURE__ */ new Set([
243
+ "doc",
244
+ "docx",
245
+ "odt",
246
+ "pages",
247
+ "rtf"
248
+ ]), N = /* @__PURE__ */ new Set([
249
+ "application/json",
250
+ "application/xml",
251
+ "application/javascript",
252
+ "application/x-yaml",
253
+ "application/yaml",
254
+ "application/sql",
255
+ "image/svg+xml"
256
+ ]), P = {
257
+ pdf: "PDF document",
258
+ doc: "Word document",
259
+ docx: "Word document",
260
+ xls: "Excel spreadsheet",
261
+ xlsx: "Excel spreadsheet",
262
+ ppt: "PowerPoint deck",
263
+ pptx: "PowerPoint deck",
264
+ csv: "CSV spreadsheet",
265
+ tsv: "TSV spreadsheet",
266
+ md: "Markdown",
267
+ markdown: "Markdown",
268
+ txt: "Plain text",
269
+ json: "JSON",
270
+ html: "HTML page",
271
+ htm: "HTML page",
272
+ svg: "SVG image",
273
+ zip: "ZIP archive"
274
+ }, F = {
275
+ folder: "Folder",
276
+ pdf: "PDF document",
277
+ image: "Image",
278
+ video: "Video",
279
+ audio: "Audio",
280
+ archive: "Archive",
281
+ spreadsheet: "Spreadsheet",
282
+ presentation: "Presentation",
283
+ document: "Document",
284
+ code: "Code",
285
+ text: "Text",
286
+ other: "File"
287
+ }, I = {
288
+ folder: S,
289
+ pdf: b,
290
+ image: _,
291
+ video: v,
292
+ audio: g,
293
+ archive: m,
294
+ spreadsheet: y,
295
+ presentation: C,
296
+ document: b,
297
+ code: h,
298
+ text: b,
299
+ other: x
300
+ };
301
+ function L(e) {
302
+ let t = e.lastIndexOf(".");
303
+ return t > 0 ? e.slice(t + 1).toLowerCase() : "";
304
+ }
305
+ function R(e) {
306
+ if (e.kind !== "file") return !1;
307
+ let t = L(e.name);
308
+ if (t !== "svg" && (E.has(t) || D.has(t) || O.has(t))) return !1;
309
+ let n = e.mimeType ?? "";
310
+ return n.startsWith("text/") || N.has(n) || w.includes(t);
311
+ }
312
+ function z(e) {
313
+ if (e.kind === "folder") return "folder";
314
+ let t = e.mimeType ?? "", n = L(e.name);
315
+ return t === "application/pdf" || n === "pdf" ? "pdf" : t.startsWith("image/") || E.has(n) ? "image" : t.startsWith("video/") || D.has(n) ? "video" : t.startsWith("audio/") || O.has(n) ? "audio" : k.has(n) || /zip|compressed|x-tar/.test(t) ? "archive" : A.has(n) || /spreadsheet|excel|csv/.test(t) ? "spreadsheet" : j.has(n) || /presentation|powerpoint/.test(t) ? "presentation" : M.has(n) || /msword|wordprocessing/.test(t) ? "document" : T.has(n) ? "code" : R(e) ? "text" : "other";
316
+ }
317
+ function B(e) {
318
+ return e.kind === "folder" ? "Folder" : P[L(e.name)] ?? F[z(e)];
319
+ }
320
+ function V(e) {
321
+ return I[z(e)];
322
+ }
323
+ function H(e) {
324
+ if (e < 1024) return `${e} B`;
325
+ let t = e / 1024;
326
+ return t < 1024 ? `${t.toFixed(1)} KB` : `${(t / 1024).toFixed(1)} MB`;
327
+ }
328
+ //#endregion
329
+ export { V as a, S as c, L as i, p as l, H as n, B as o, z as r, R as s, w as t };
330
+
331
+ //# sourceMappingURL=file-types-DZ2qAUnj.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-types-DZ2qAUnj.js","names":["__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode"],"sources":["../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.mjs","../../node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.mjs","../../node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.mjs","../../node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.mjs","../../node_modules/lucide-react/dist/esm/defaultAttributes.mjs","../../node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.mjs","../../node_modules/lucide-react/dist/esm/context.mjs","../../node_modules/lucide-react/dist/esm/Icon.mjs","../../node_modules/lucide-react/dist/esm/createLucideIcon.mjs","../../node_modules/lucide-react/dist/esm/icons/file-archive.mjs","../../node_modules/lucide-react/dist/esm/icons/file-code.mjs","../../node_modules/lucide-react/dist/esm/icons/file-headphone.mjs","../../node_modules/lucide-react/dist/esm/icons/file-image.mjs","../../node_modules/lucide-react/dist/esm/icons/file-play.mjs","../../node_modules/lucide-react/dist/esm/icons/file-spreadsheet.mjs","../../node_modules/lucide-react/dist/esm/icons/file-text.mjs","../../node_modules/lucide-react/dist/esm/icons/file.mjs","../../node_modules/lucide-react/dist/esm/icons/folder.mjs","../../node_modules/lucide-react/dist/esm/icons/presentation.mjs","../../src/components/file-types.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.mjs';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { createContext, useContext, useMemo, createElement } from 'react';\n\nconst LucideContext = createContext({});\nfunction LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n}) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, className]\n );\n return createElement(LucideContext.Provider, { value }, children);\n}\nconst useLucideContext = () => useContext(LucideContext);\n\nexport { LucideProvider, useLucideContext };\n//# sourceMappingURL=context.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.mjs';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.mjs';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport { useLucideContext } from './context.mjs';\n\nconst Icon = forwardRef(\n ({ color, size, strokeWidth, absoluteStrokeWidth, className = \"\", children, iconNode, ...rest }, ref) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n color: contextColor = \"currentColor\",\n className: contextClass = \"\"\n } = useLucideContext() ?? {};\n const calculatedStrokeWidth = absoluteStrokeWidth ?? contextAbsoluteStrokeWidth ? Number(strokeWidth ?? contextStrokeWidth) * 24 / Number(size ?? contextSize) : strokeWidth ?? contextStrokeWidth;\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size ?? contextSize ?? defaultAttributes.width,\n height: size ?? contextSize ?? defaultAttributes.height,\n stroke: color ?? contextColor,\n strokeWidth: calculatedStrokeWidth,\n className: mergeClasses(\"lucide\", contextClass, className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport { toKebabCase } from './shared/src/utils/toKebabCase.mjs';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.mjs';\nimport Icon from './Icon.mjs';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M13.659 22H18a2 2 0 0 0 2-2V8a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v11.5\",\n key: \"4pqfef\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"path\", { d: \"M8 12v-1\", key: \"1ej8lb\" }],\n [\"path\", { d: \"M8 18v-2\", key: \"qcmpov\" }],\n [\"path\", { d: \"M8 7V6\", key: \"1nbb54\" }],\n [\"circle\", { cx: \"8\", cy: \"20\", r: \"2\", key: \"ckkr5m\" }]\n];\nconst FileArchive = createLucideIcon(\"file-archive\", __iconNode);\n\nexport { __iconNode, FileArchive as default };\n//# sourceMappingURL=file-archive.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"path\", { d: \"M10 12.5 8 15l2 2.5\", key: \"1tg20x\" }],\n [\"path\", { d: \"m14 12.5 2 2.5-2 2.5\", key: \"yinavb\" }]\n];\nconst FileCode = createLucideIcon(\"file-code\", __iconNode);\n\nexport { __iconNode, FileCode as default };\n//# sourceMappingURL=file-code.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M4 6.835V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2h-.343\",\n key: \"1vfytu\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\n \"path\",\n {\n d: \"M2 19a2 2 0 0 1 4 0v1a2 2 0 0 1-4 0v-4a6 6 0 0 1 12 0v4a2 2 0 0 1-4 0v-1a2 2 0 0 1 4 0\",\n key: \"1etmh7\"\n }\n ]\n];\nconst FileHeadphone = createLucideIcon(\"file-headphone\", __iconNode);\n\nexport { __iconNode, FileHeadphone as default };\n//# sourceMappingURL=file-headphone.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"circle\", { cx: \"10\", cy: \"12\", r: \"2\", key: \"737tya\" }],\n [\"path\", { d: \"m20 17-1.296-1.296a2.41 2.41 0 0 0-3.408 0L9 22\", key: \"wt3hpn\" }]\n];\nconst FileImage = createLucideIcon(\"file-image\", __iconNode);\n\nexport { __iconNode, FileImage as default };\n//# sourceMappingURL=file-image.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\n \"path\",\n {\n d: \"M15.033 13.44a.647.647 0 0 1 0 1.12l-4.065 2.352a.645.645 0 0 1-.968-.56v-4.704a.645.645 0 0 1 .967-.56z\",\n key: \"1tzo1f\"\n }\n ]\n];\nconst FilePlay = createLucideIcon(\"file-play\", __iconNode);\n\nexport { __iconNode, FilePlay as default };\n//# sourceMappingURL=file-play.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"path\", { d: \"M8 13h2\", key: \"yr2amv\" }],\n [\"path\", { d: \"M14 13h2\", key: \"un5t4a\" }],\n [\"path\", { d: \"M8 17h2\", key: \"2yhykz\" }],\n [\"path\", { d: \"M14 17h2\", key: \"10kma7\" }]\n];\nconst FileSpreadsheet = createLucideIcon(\"file-spreadsheet\", __iconNode);\n\nexport { __iconNode, FileSpreadsheet as default };\n//# sourceMappingURL=file-spreadsheet.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"path\", { d: \"M10 9H8\", key: \"b1mrlr\" }],\n [\"path\", { d: \"M16 13H8\", key: \"t4e002\" }],\n [\"path\", { d: \"M16 17H8\", key: \"z1uh3a\" }]\n];\nconst FileText = createLucideIcon(\"file-text\", __iconNode);\n\nexport { __iconNode, FileText as default };\n//# sourceMappingURL=file-text.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }]\n];\nconst File = createLucideIcon(\"file\", __iconNode);\n\nexport { __iconNode, File as default };\n//# sourceMappingURL=file.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\",\n key: \"1kt360\"\n }\n ]\n];\nconst Folder = createLucideIcon(\"folder\", __iconNode);\n\nexport { __iconNode, Folder as default };\n//# sourceMappingURL=folder.mjs.map\n","/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M2 3h20\", key: \"91anmk\" }],\n [\"path\", { d: \"M21 3v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V3\", key: \"2k9sn8\" }],\n [\"path\", { d: \"m7 21 5-5 5 5\", key: \"bip4we\" }]\n];\nconst Presentation = createLucideIcon(\"presentation\", __iconNode);\n\nexport { __iconNode, Presentation as default };\n//# sourceMappingURL=presentation.mjs.map\n","import {\n\tFile,\n\tFileArchive,\n\tFileAudio,\n\tFileCode,\n\tFileImage,\n\tFileSpreadsheet,\n\tFileText,\n\tFileVideo,\n\tFolder,\n\tPresentation\n} from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\nimport type { FileNode } from '../core/types'\n\nexport type FileBrowserFileCategory =\n\t| 'folder'\n\t| 'pdf'\n\t| 'image'\n\t| 'video'\n\t| 'audio'\n\t| 'archive'\n\t| 'spreadsheet'\n\t| 'presentation'\n\t| 'document'\n\t| 'code'\n\t| 'text'\n\t| 'other'\n\n/** Extensions treated as plain text for previews and the built-in editor. */\nexport const FILE_BROWSER_TEXT_EXTENSIONS: readonly string[] = [\n\t'txt',\n\t'text',\n\t'md',\n\t'markdown',\n\t'mdx',\n\t'csv',\n\t'tsv',\n\t'json',\n\t'jsonl',\n\t'html',\n\t'htm',\n\t'xml',\n\t'svg',\n\t'yaml',\n\t'yml',\n\t'toml',\n\t'ini',\n\t'cfg',\n\t'conf',\n\t'log',\n\t'css',\n\t'scss',\n\t'js',\n\t'mjs',\n\t'cjs',\n\t'jsx',\n\t'ts',\n\t'tsx',\n\t'py',\n\t'rb',\n\t'go',\n\t'rs',\n\t'java',\n\t'kt',\n\t'swift',\n\t'php',\n\t'sh',\n\t'sql',\n\t'graphql',\n\t'rtf'\n]\n\nconst CODE_EXTENSIONS = new Set([\n\t'json',\n\t'jsonl',\n\t'html',\n\t'htm',\n\t'xml',\n\t'yaml',\n\t'yml',\n\t'toml',\n\t'ini',\n\t'css',\n\t'scss',\n\t'js',\n\t'mjs',\n\t'cjs',\n\t'jsx',\n\t'ts',\n\t'tsx',\n\t'py',\n\t'rb',\n\t'go',\n\t'rs',\n\t'java',\n\t'kt',\n\t'swift',\n\t'php',\n\t'sh',\n\t'sql',\n\t'graphql'\n])\nconst IMAGE_EXTENSIONS = new Set(['png', 'jpg', 'jpeg', 'gif', 'webp', 'avif', 'bmp', 'ico', 'svg'])\nconst VIDEO_EXTENSIONS = new Set(['mp4', 'webm', 'mov', 'm4v', 'ogv'])\nconst AUDIO_EXTENSIONS = new Set(['mp3', 'wav', 'ogg', 'oga', 'm4a', 'aac', 'flac'])\nconst ARCHIVE_EXTENSIONS = new Set(['zip', 'rar', '7z', 'tar', 'gz', 'tgz', 'bz2', 'xz'])\nconst SPREADSHEET_EXTENSIONS = new Set(['xls', 'xlsx', 'ods', 'numbers', 'csv', 'tsv'])\nconst PRESENTATION_EXTENSIONS = new Set(['ppt', 'pptx', 'key', 'odp'])\nconst DOCUMENT_EXTENSIONS = new Set(['doc', 'docx', 'odt', 'pages', 'rtf'])\nconst TEXT_MIME_TYPES = new Set([\n\t'application/json',\n\t'application/xml',\n\t'application/javascript',\n\t'application/x-yaml',\n\t'application/yaml',\n\t'application/sql',\n\t'image/svg+xml'\n])\n\nconst TYPE_LABELS: Record<string, string> = {\n\tpdf: 'PDF document',\n\tdoc: 'Word document',\n\tdocx: 'Word document',\n\txls: 'Excel spreadsheet',\n\txlsx: 'Excel spreadsheet',\n\tppt: 'PowerPoint deck',\n\tpptx: 'PowerPoint deck',\n\tcsv: 'CSV spreadsheet',\n\ttsv: 'TSV spreadsheet',\n\tmd: 'Markdown',\n\tmarkdown: 'Markdown',\n\ttxt: 'Plain text',\n\tjson: 'JSON',\n\thtml: 'HTML page',\n\thtm: 'HTML page',\n\tsvg: 'SVG image',\n\tzip: 'ZIP archive'\n}\n\nconst CATEGORY_LABELS: Record<FileBrowserFileCategory, string> = {\n\tfolder: 'Folder',\n\tpdf: 'PDF document',\n\timage: 'Image',\n\tvideo: 'Video',\n\taudio: 'Audio',\n\tarchive: 'Archive',\n\tspreadsheet: 'Spreadsheet',\n\tpresentation: 'Presentation',\n\tdocument: 'Document',\n\tcode: 'Code',\n\ttext: 'Text',\n\tother: 'File'\n}\n\nconst CATEGORY_ICONS: Record<FileBrowserFileCategory, LucideIcon> = {\n\tfolder: Folder,\n\tpdf: FileText,\n\timage: FileImage,\n\tvideo: FileVideo,\n\taudio: FileAudio,\n\tarchive: FileArchive,\n\tspreadsheet: FileSpreadsheet,\n\tpresentation: Presentation,\n\tdocument: FileText,\n\tcode: FileCode,\n\ttext: FileText,\n\tother: File\n}\n\nexport function getFileExtension(name: string): string {\n\tconst dot = name.lastIndexOf('.')\n\treturn dot > 0 ? name.slice(dot + 1).toLowerCase() : ''\n}\n\nexport function isTextFile<TMetadata>(item: FileNode<TMetadata>): boolean {\n\tif (item.kind !== 'file') return false\n\tconst extension = getFileExtension(item.name)\n\tif (\n\t\textension !== 'svg' &&\n\t\t(IMAGE_EXTENSIONS.has(extension) || VIDEO_EXTENSIONS.has(extension) || AUDIO_EXTENSIONS.has(extension))\n\t)\n\t\treturn false\n\tconst mime = item.mimeType ?? ''\n\treturn mime.startsWith('text/') || TEXT_MIME_TYPES.has(mime) || FILE_BROWSER_TEXT_EXTENSIONS.includes(extension)\n}\n\nexport function getFileCategory<TMetadata>(item: FileNode<TMetadata>): FileBrowserFileCategory {\n\tif (item.kind === 'folder') return 'folder'\n\tconst mime = item.mimeType ?? ''\n\tconst extension = getFileExtension(item.name)\n\tif (mime === 'application/pdf' || extension === 'pdf') return 'pdf'\n\tif (mime.startsWith('image/') || IMAGE_EXTENSIONS.has(extension)) return 'image'\n\tif (mime.startsWith('video/') || VIDEO_EXTENSIONS.has(extension)) return 'video'\n\tif (mime.startsWith('audio/') || AUDIO_EXTENSIONS.has(extension)) return 'audio'\n\tif (ARCHIVE_EXTENSIONS.has(extension) || /zip|compressed|x-tar/.test(mime)) return 'archive'\n\tif (SPREADSHEET_EXTENSIONS.has(extension) || /spreadsheet|excel|csv/.test(mime)) return 'spreadsheet'\n\tif (PRESENTATION_EXTENSIONS.has(extension) || /presentation|powerpoint/.test(mime)) return 'presentation'\n\tif (DOCUMENT_EXTENSIONS.has(extension) || /msword|wordprocessing/.test(mime)) return 'document'\n\tif (CODE_EXTENSIONS.has(extension)) return 'code'\n\tif (isTextFile(item)) return 'text'\n\treturn 'other'\n}\n\nexport function getFileTypeLabel<TMetadata>(item: FileNode<TMetadata>): string {\n\tif (item.kind === 'folder') return 'Folder'\n\treturn TYPE_LABELS[getFileExtension(item.name)] ?? CATEGORY_LABELS[getFileCategory(item)]\n}\n\nexport function getFileIcon<TMetadata>(item: FileNode<TMetadata>): LucideIcon {\n\treturn CATEGORY_ICONS[getFileCategory(item)]\n}\n\nexport function formatBytes(bytes: number): string {\n\tif (bytes < 1024) {\n\t\treturn `${bytes} B`\n\t}\n\tconst kib = bytes / 1024\n\tif (kib < 1024) {\n\t\treturn `${kib.toFixed(1)} KB`\n\t}\n\treturn `${(kib / 1024).toFixed(1)} MB`\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { l as e } from "./file-types-DZ2qAUnj.js";
2
+ var t = e("list", [
3
+ ["path", {
4
+ d: "M3 5h.01",
5
+ key: "18ugdj"
6
+ }],
7
+ ["path", {
8
+ d: "M3 12h.01",
9
+ key: "nlz23k"
10
+ }],
11
+ ["path", {
12
+ d: "M3 19h.01",
13
+ key: "noohij"
14
+ }],
15
+ ["path", {
16
+ d: "M8 5h13",
17
+ key: "1pao27"
18
+ }],
19
+ ["path", {
20
+ d: "M8 12h13",
21
+ key: "1za7za"
22
+ }],
23
+ ["path", {
24
+ d: "M8 19h13",
25
+ key: "m83p4d"
26
+ }]
27
+ ]);
28
+ //#endregion
29
+ export { t };
30
+
31
+ //# sourceMappingURL=list-BwYAbqhl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-BwYAbqhl.js","names":[],"sources":["../../node_modules/lucide-react/dist/esm/icons/list.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.23.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 5h.01\", key: \"18ugdj\" }],\n [\"path\", { d: \"M3 12h.01\", key: \"nlz23k\" }],\n [\"path\", { d: \"M3 19h.01\", key: \"noohij\" }],\n [\"path\", { d: \"M8 5h13\", key: \"1pao27\" }],\n [\"path\", { d: \"M8 12h13\", key: \"1za7za\" }],\n [\"path\", { d: \"M8 19h13\", key: \"m83p4d\" }]\n];\nconst List = createLucideIcon(\"list\", __iconNode);\n\nexport { __iconNode, List as default };\n//# sourceMappingURL=list.mjs.map\n"],"x_google_ignoreList":[0],"mappings":";AAiBA,IAAM,IAAO,EAAiB,QAAQ;CAPpC,CAAC,QAAQ;EAAE,GAAG;EAAY,KAAK;CAAS,CAAC;CACzC,CAAC,QAAQ;EAAE,GAAG;EAAa,KAAK;CAAS,CAAC;CAC1C,CAAC,QAAQ;EAAE,GAAG;EAAa,KAAK;CAAS,CAAC;CAC1C,CAAC,QAAQ;EAAE,GAAG;EAAW,KAAK;CAAS,CAAC;CACxC,CAAC,QAAQ;EAAE,GAAG;EAAY,KAAK;CAAS,CAAC;CACzC,CAAC,QAAQ;EAAE,GAAG;EAAY,KAAK;CAAS,CAAC;AAEL,CAAU"}