@fde-desktop/fde-core 0.3.7 → 0.4.1

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 (163) hide show
  1. package/README.md +419 -68
  2. package/dist/CalendarApp-CHLUCAI7.css +744 -0
  3. package/dist/CalendarApp-K7ZOUZ6C.js +2 -0
  4. package/dist/CalendarApp-OTGEERSS.cjs +8 -0
  5. package/dist/CodeServerApp-5KZGO7HL.css +75 -0
  6. package/dist/CodeServerApp-LUZFCQBI.js +3 -0
  7. package/dist/CodeServerApp-P3TMJPLY.cjs +9 -0
  8. package/dist/CreateItemApp-NAZMXOPK.cjs +14 -0
  9. package/dist/CreateItemApp-PQB5GTFG.css +107 -0
  10. package/dist/CreateItemApp-ZHCTSPQE.js +8 -0
  11. package/dist/DeviceInfoApp-R6YNVIGX.cjs +11 -0
  12. package/dist/DeviceInfoApp-YHCYAO6N.js +5 -0
  13. package/dist/DeviceInfoApp-ZSMRSITP.css +7 -0
  14. package/dist/FilesApp-AKCVRTXR.js +8 -0
  15. package/dist/FilesApp-E6L5W3T2.css +1817 -0
  16. package/dist/FilesApp-RW3Y6ILO.cjs +14 -0
  17. package/dist/ImageViewerApp-5UXNSW2O.js +11 -0
  18. package/dist/ImageViewerApp-N2Q7E7WZ.css +215 -0
  19. package/dist/ImageViewerApp-RRRRKSFN.cjs +17 -0
  20. package/dist/ImageViewerMenuBar-I3TFKQPS.cjs +14 -0
  21. package/dist/ImageViewerMenuBar-TV5C6TM2.js +5 -0
  22. package/dist/ImageViewerMenuBar-XLK4LIHW.css +56 -0
  23. package/dist/MenuEditApp-HUZRFEHE.js +9 -0
  24. package/dist/MenuEditApp-MCUHGTKQ.cjs +15 -0
  25. package/dist/MenuEditApp-YA6HSAMJ.css +94 -0
  26. package/dist/MenuEditMenuBar-7VHMZNRM.css +56 -0
  27. package/dist/MenuEditMenuBar-GF6L4PGZ.cjs +15 -0
  28. package/dist/MenuEditMenuBar-IUXFPZE5.js +6 -0
  29. package/dist/NotesApp-37BV33C6.js +10 -0
  30. package/dist/NotesApp-4EVUQEFZ.cjs +16 -0
  31. package/dist/NotesApp-TQ6IHDNX.css +302 -0
  32. package/dist/NotesMenuBar-25LKN3SE.cjs +15 -0
  33. package/dist/NotesMenuBar-MXLOX7OT.css +56 -0
  34. package/dist/NotesMenuBar-SRV3AIAL.js +6 -0
  35. package/dist/PdfApp-5VBDNRMC.cjs +16 -0
  36. package/dist/PdfApp-BUIC5U5H.css +206 -0
  37. package/dist/PdfApp-RH6MZZX5.js +10 -0
  38. package/dist/PdfMenuBar-NLZC6JHS.js +4 -0
  39. package/dist/PdfMenuBar-QUM72EE4.css +56 -0
  40. package/dist/PdfMenuBar-WBRTKMLN.cjs +13 -0
  41. package/dist/SettingsApp-5LDHEHYV.cjs +20 -0
  42. package/dist/SettingsApp-JVOSEFH3.css +283 -0
  43. package/dist/SettingsApp-X6764D7T.js +14 -0
  44. package/dist/SettingsMenuBar-5CBSSMVM.css +56 -0
  45. package/dist/SettingsMenuBar-VLT6TTCM.js +6 -0
  46. package/dist/SettingsMenuBar-Y5QEXDEO.cjs +15 -0
  47. package/dist/StorybookApp-NQ244BER.css +7 -0
  48. package/dist/StorybookApp-NZDV4X3Y.js +1 -0
  49. package/dist/StorybookApp-VF3KIMU3.cjs +7 -0
  50. package/dist/TerminalApp-CDGWRBFJ.cjs +10 -0
  51. package/dist/TerminalApp-EAATMIMX.css +77 -0
  52. package/dist/TerminalApp-GCKJCM55.js +4 -0
  53. package/dist/TerminalMenuBar-3J26O26Q.css +56 -0
  54. package/dist/TerminalMenuBar-7BH7MGNJ.cjs +14 -0
  55. package/dist/TerminalMenuBar-7JAEQUZ4.js +5 -0
  56. package/dist/UploaderApp-2WYRCUQV.js +10 -0
  57. package/dist/UploaderApp-6KV3TGCT.css +1817 -0
  58. package/dist/UploaderApp-EYFC36PM.cjs +16 -0
  59. package/dist/chunk-2FO445RM.cjs +449 -0
  60. package/dist/chunk-2PSTHGTD.cjs +42 -0
  61. package/dist/chunk-2RQX7QBP.cjs +148 -0
  62. package/dist/chunk-3IICBLEA.js +442 -0
  63. package/dist/chunk-43W6UDUZ.cjs +19 -0
  64. package/dist/chunk-4E45FBAH.js +223 -0
  65. package/dist/chunk-4MCFQPKY.js +444 -0
  66. package/dist/chunk-4OH5RPSQ.cjs +38 -0
  67. package/dist/chunk-4XURSNM4.js +43 -0
  68. package/dist/chunk-4ZCRYHL6.js +407 -0
  69. package/dist/chunk-54PYEQLK.js +283 -0
  70. package/dist/chunk-5C6IQE42.cjs +35 -0
  71. package/dist/chunk-5NOHYJNH.js +84 -0
  72. package/dist/chunk-5PYK5ASL.js +162 -0
  73. package/dist/chunk-5YH6AKEO.js +146 -0
  74. package/dist/chunk-657BJOY5.cjs +324 -0
  75. package/dist/chunk-6QOUYSEE.cjs +2303 -0
  76. package/dist/chunk-7SAFECOJ.js +215 -0
  77. package/dist/chunk-7Y7HB7FB.cjs +53 -0
  78. package/dist/chunk-ABIAPZ6S.cjs +45 -0
  79. package/dist/chunk-AQL372JF.cjs +219 -0
  80. package/dist/chunk-AXDUVZVP.cjs +88 -0
  81. package/dist/chunk-AYFNYHMP.js +541 -0
  82. package/dist/chunk-BDO6B7MZ.cjs +451 -0
  83. package/dist/chunk-BKXEA2BK.cjs +286 -0
  84. package/dist/chunk-BLV47DX2.js +47 -0
  85. package/dist/chunk-BQCD5RAF.cjs +48 -0
  86. package/dist/chunk-BQL3YXMV.js +17429 -0
  87. package/dist/chunk-C6BEZNAM.cjs +45 -0
  88. package/dist/chunk-CFWV2JMR.js +234 -0
  89. package/dist/chunk-CV5PUHAE.cjs +86 -0
  90. package/dist/chunk-D5MVFFID.js +42 -0
  91. package/dist/chunk-D7R55WWT.js +1601 -0
  92. package/dist/chunk-DMNF4CNN.cjs +49 -0
  93. package/dist/chunk-DWP2SYF7.js +55 -0
  94. package/dist/chunk-E55VXNLK.cjs +17498 -0
  95. package/dist/chunk-EAELL43F.js +42 -0
  96. package/dist/chunk-EUQLZW6P.js +48 -0
  97. package/dist/chunk-EX5V2ZTU.js +40 -0
  98. package/dist/chunk-FH4ILMKF.js +38 -0
  99. package/dist/chunk-FRHBM2U7.js +33 -0
  100. package/dist/chunk-FX2TPX3L.cjs +45 -0
  101. package/dist/chunk-GCYD6T52.js +32 -0
  102. package/dist/chunk-GRYCUBJZ.js +9 -0
  103. package/dist/chunk-HWHBSAUC.js +40 -0
  104. package/dist/chunk-ICUE6T7J.cjs +50 -0
  105. package/dist/chunk-IDHP3R4I.js +31 -0
  106. package/dist/chunk-IUOQPOEN.js +2293 -0
  107. package/dist/chunk-J7L2S2GT.cjs +34 -0
  108. package/dist/chunk-JEBKLIMU.cjs +123 -0
  109. package/dist/chunk-KQHICFX3.js +121 -0
  110. package/dist/chunk-LMJE6V4N.cjs +42 -0
  111. package/dist/chunk-MVDGM5Y4.js +68 -0
  112. package/dist/chunk-NVEGEK3N.js +31 -0
  113. package/dist/chunk-NWMSWRUD.js +2236 -0
  114. package/dist/chunk-ODXL6BR3.js +77 -0
  115. package/dist/chunk-OJIDKDKF.js +68 -0
  116. package/dist/chunk-PKPQA5NR.js +15 -0
  117. package/dist/chunk-PNDBLFJW.cjs +50 -0
  118. package/dist/chunk-PYTKNRGM.js +280 -0
  119. package/dist/chunk-Q3WA72BF.cjs +70 -0
  120. package/dist/chunk-QB72BLCJ.cjs +237 -0
  121. package/dist/chunk-QHBBLML3.js +86 -0
  122. package/dist/chunk-RDIDAZ3S.cjs +9 -0
  123. package/dist/chunk-RGJPRXYY.js +48 -0
  124. package/dist/chunk-RQ6OZRUW.cjs +41 -0
  125. package/dist/chunk-SBE4SZAN.cjs +226 -0
  126. package/dist/chunk-SYGUWGWK.cjs +2329 -0
  127. package/dist/chunk-TDZ43MUX.cjs +165 -0
  128. package/dist/chunk-TGWMOHAO.js +17 -0
  129. package/dist/chunk-U4RYIS6Z.cjs +548 -0
  130. package/dist/chunk-UIQCTAVM.cjs +59 -0
  131. package/dist/chunk-XVASHRCE.cjs +70 -0
  132. package/dist/chunk-XYSMVQQD.cjs +1608 -0
  133. package/dist/chunk-YAIWI4Z5.js +7 -0
  134. package/dist/chunk-YP2PLNOF.cjs +34 -0
  135. package/dist/chunk-YSOLW4FS.cjs +11 -0
  136. package/dist/chunk-YY6OUR2U.js +44 -0
  137. package/dist/chunk-YZWS7FDT.cjs +409 -0
  138. package/dist/chunk-Z5YGWL65.cjs +39 -0
  139. package/dist/chunk-ZBGWYTCU.cjs +83 -0
  140. package/dist/chunk-ZHB5Q2M6.js +36 -0
  141. package/dist/chunk-ZHNDXNL4.js +45 -0
  142. package/dist/chunk-ZX3EDZ5C.cjs +17 -0
  143. package/dist/index.cjs +5641 -0
  144. package/dist/index.css +9192 -0
  145. package/dist/index.d.cts +2019 -0
  146. package/dist/index.d.ts +2019 -11
  147. package/dist/index.js +4794 -6598
  148. package/package.json +26 -14
  149. package/dist/apps/index.d.ts +0 -2
  150. package/dist/components/index.d.ts +0 -1
  151. package/dist/constants/index.d.ts +0 -12
  152. package/dist/domain/index.d.ts +0 -5
  153. package/dist/fc-D_a-n3yF.js +0 -20204
  154. package/dist/fi-DwZ_MW7F.js +0 -9993
  155. package/dist/hooks/index.d.ts +0 -28
  156. package/dist/i18n/index.d.ts +0 -2
  157. package/dist/iconBase-B764UN-4.js +0 -108
  158. package/dist/infrastructure/index.d.ts +0 -6
  159. package/dist/interfaces/index.d.ts +0 -11
  160. package/dist/stores/index.d.ts +0 -8
  161. package/dist/types/index.d.ts +0 -4
  162. package/dist/utils/index.d.ts +0 -14
  163. package/dist/vsc-CeA30gcb.js +0 -9574
@@ -0,0 +1,451 @@
1
+ 'use strict';
2
+
3
+ var chunkABIAPZ6S_cjs = require('./chunk-ABIAPZ6S.cjs');
4
+ var chunk6QOUYSEE_cjs = require('./chunk-6QOUYSEE.cjs');
5
+ var chunkE55VXNLK_cjs = require('./chunk-E55VXNLK.cjs');
6
+ var react = require('react');
7
+ var reactI18next = require('react-i18next');
8
+ var jsxRuntime = require('react/jsx-runtime');
9
+
10
+ // src/utils/buildBreadcrumbs.ts
11
+ var buildBreadcrumbs = (currentFolderId, fsNodes) => {
12
+ const crumbs = [{ id: null, name: "Home" }];
13
+ let id = currentFolderId;
14
+ const trail = [];
15
+ while (id !== null) {
16
+ const node = fsNodes.find((n) => n.id === id);
17
+ if (!node) break;
18
+ trail.unshift({ id: node.id, name: node.name });
19
+ id = node.parentId;
20
+ }
21
+ return [...crumbs, ...trail];
22
+ };
23
+
24
+ // src/components/Shared/FilePickerApp/FilePickerApp.module.css
25
+ var FilePickerApp_default = {};
26
+ var PickerModalComponent = ({
27
+ opened,
28
+ children,
29
+ ariaLabelKey,
30
+ ariaLabelNs = "window"
31
+ }) => {
32
+ const { t } = reactI18next.useTranslation(ariaLabelNs);
33
+ if (!opened) return null;
34
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: FilePickerApp_default.overlay, role: "dialog", "aria-label": t(ariaLabelKey), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: FilePickerApp_default.panel, children }) });
35
+ };
36
+ var PickerModal = react.memo(PickerModalComponent);
37
+ var FolderBreadcrumbsComponent = ({
38
+ currentFolderId,
39
+ fsNodes,
40
+ onNavigate
41
+ }) => {
42
+ const crumbs = buildBreadcrumbs(currentFolderId, fsNodes);
43
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: FilePickerApp_default.breadcrumbBar, children: /* @__PURE__ */ jsxRuntime.jsx(chunkE55VXNLK_cjs.Breadcrumbs, { separator: "\u203A", classNames: { separator: FilePickerApp_default.breadcrumbSep }, children: crumbs.map((crumb, i) => {
44
+ const isLast = i === crumbs.length - 1;
45
+ return isLast ? /* @__PURE__ */ jsxRuntime.jsx(chunkE55VXNLK_cjs.Text, { size: "xs", fw: 500, children: crumb.name }, crumb.id ?? "root") : /* @__PURE__ */ jsxRuntime.jsx(chunkE55VXNLK_cjs.Anchor, { size: "xs", onClick: () => onNavigate(crumb.id), children: crumb.name }, crumb.id ?? "root");
46
+ }) }) });
47
+ };
48
+ var FolderBreadcrumbs = react.memo(FolderBreadcrumbsComponent);
49
+ var FolderTreeItemComponent = ({
50
+ node,
51
+ allNodes,
52
+ currentFolderId,
53
+ depth,
54
+ onNavigate
55
+ }) => {
56
+ const children = allNodes.filter(
57
+ (n) => n.parentId === node.id && n.type === "folder"
58
+ );
59
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
60
+ /* @__PURE__ */ jsxRuntime.jsxs(
61
+ chunkE55VXNLK_cjs.UnstyledButton,
62
+ {
63
+ className: FilePickerApp_default.treeItem,
64
+ "data-active": currentFolderId === node.id || void 0,
65
+ style: { paddingLeft: 8 + depth * 14 },
66
+ onClick: () => onNavigate(node.id),
67
+ "aria-label": node.name,
68
+ "aria-current": currentFolderId === node.id ? "page" : void 0,
69
+ children: [
70
+ /* @__PURE__ */ jsxRuntime.jsx(chunkABIAPZ6S_cjs.FileIcon_default, { type: "folder", folderNode: node, size: 14 }),
71
+ /* @__PURE__ */ jsxRuntime.jsx(chunkE55VXNLK_cjs.Text, { size: "xs", ml: 6, truncate: true, children: node.name })
72
+ ]
73
+ }
74
+ ),
75
+ children.map((child) => /* @__PURE__ */ jsxRuntime.jsx(
76
+ FolderTreeItem,
77
+ {
78
+ node: child,
79
+ allNodes,
80
+ currentFolderId,
81
+ depth: depth + 1,
82
+ onNavigate
83
+ },
84
+ child.id
85
+ ))
86
+ ] });
87
+ };
88
+ var FolderTreeItem = react.memo(FolderTreeItemComponent);
89
+ var FolderSidebarComponent = ({
90
+ currentFolderId,
91
+ fsNodes,
92
+ onNavigate
93
+ }) => {
94
+ const { t } = reactI18next.useTranslation("window");
95
+ const rootFolders = fsNodes.filter(
96
+ (n) => n.parentId === null && n.type === "folder"
97
+ );
98
+ return /* @__PURE__ */ jsxRuntime.jsx("aside", { className: FilePickerApp_default.sidebar, children: /* @__PURE__ */ jsxRuntime.jsxs(
99
+ "nav",
100
+ {
101
+ className: FilePickerApp_default.folderTree,
102
+ "aria-label": t("fileDialog.folderTreeAria", { ns: "common" }),
103
+ children: [
104
+ /* @__PURE__ */ jsxRuntime.jsxs(
105
+ chunkE55VXNLK_cjs.UnstyledButton,
106
+ {
107
+ className: FilePickerApp_default.treeItem,
108
+ "data-active": currentFolderId === null || void 0,
109
+ style: { paddingLeft: 8 },
110
+ onClick: () => onNavigate(null),
111
+ "aria-label": t("common:labels.home"),
112
+ "aria-current": currentFolderId === null ? "page" : void 0,
113
+ children: [
114
+ /* @__PURE__ */ jsxRuntime.jsx(chunkABIAPZ6S_cjs.FileIcon_default, { type: "folder", size: 14 }),
115
+ /* @__PURE__ */ jsxRuntime.jsx(chunkE55VXNLK_cjs.Text, { size: "xs", ml: 6, fw: 500, children: t("common:labels.home") })
116
+ ]
117
+ }
118
+ ),
119
+ rootFolders.map((folder) => /* @__PURE__ */ jsxRuntime.jsx(
120
+ FolderTreeItem,
121
+ {
122
+ node: folder,
123
+ allNodes: fsNodes,
124
+ currentFolderId,
125
+ depth: 1,
126
+ onNavigate
127
+ },
128
+ folder.id
129
+ ))
130
+ ]
131
+ }
132
+ ) });
133
+ };
134
+ var FolderSidebar = react.memo(FolderSidebarComponent);
135
+ var FolderGridComponent = ({
136
+ currentFolderId,
137
+ fsNodes,
138
+ onNavigate,
139
+ onItemDoubleClick
140
+ }) => {
141
+ const { t } = reactI18next.useTranslation("window");
142
+ const currentFolderNodes = fsNodes.filter(
143
+ (n) => n.parentId === currentFolderId && n.type === "folder"
144
+ );
145
+ if (currentFolderNodes.length === 0) {
146
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: FilePickerApp_default.empty, children: /* @__PURE__ */ jsxRuntime.jsx(chunkE55VXNLK_cjs.Text, { size: "sm", c: "dimmed", children: t("common:messages.noSubfolders") }) });
147
+ }
148
+ const sortedNodes = chunk6QOUYSEE_cjs.sortNodes(currentFolderNodes);
149
+ return /* @__PURE__ */ jsxRuntime.jsx(
150
+ "div",
151
+ {
152
+ className: FilePickerApp_default.grid,
153
+ role: "listbox",
154
+ "aria-label": t("fileDialog.foldersAria", { ns: "common" }),
155
+ children: sortedNodes.map((node) => /* @__PURE__ */ jsxRuntime.jsxs(
156
+ chunkE55VXNLK_cjs.UnstyledButton,
157
+ {
158
+ className: FilePickerApp_default.item,
159
+ onDoubleClick: () => {
160
+ onNavigate(node.id);
161
+ onItemDoubleClick?.(node);
162
+ },
163
+ "aria-label": t("fileDialog.openFolder", { name: node.name }),
164
+ role: "option",
165
+ children: [
166
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: FilePickerApp_default.icon, children: /* @__PURE__ */ jsxRuntime.jsx(chunkABIAPZ6S_cjs.FileIcon_default, { type: "folder", name: node.name, folderNode: node, size: 32 }) }),
167
+ /* @__PURE__ */ jsxRuntime.jsx(chunkE55VXNLK_cjs.Text, { size: "xs", className: FilePickerApp_default.name, truncate: true, children: node.name })
168
+ ]
169
+ },
170
+ node.id
171
+ ))
172
+ }
173
+ );
174
+ };
175
+ var FolderGrid = react.memo(FolderGridComponent);
176
+ var FilePickerApp = ({ acceptedMimeTypes, onConfirm, onCancel }) => {
177
+ const { t } = reactI18next.useTranslation("window");
178
+ const fsNodes = chunk6QOUYSEE_cjs.useDesktopStore((state) => state.fsNodes);
179
+ const [currentFolderId, setCurrentFolderId] = react.useState(null);
180
+ const [selectedNode, setSelectedNode] = react.useState(null);
181
+ const currentNodes = currentFolderId === null ? fsNodes.filter((n) => n.parentId === null) : fsNodes.filter((n) => n.parentId === currentFolderId);
182
+ const visibleNodes = currentNodes.filter((n) => {
183
+ if (n.type === "folder") return true;
184
+ const file = n;
185
+ if (!acceptedMimeTypes || acceptedMimeTypes.length === 0) return true;
186
+ return acceptedMimeTypes.some(
187
+ (accepted) => file.mimeType === accepted || accepted.endsWith("/*") && file.mimeType?.startsWith(accepted.slice(0, -1))
188
+ );
189
+ });
190
+ const handleNavigate = react.useCallback((id) => {
191
+ setCurrentFolderId(id);
192
+ setSelectedNode(null);
193
+ }, []);
194
+ const handleItemClick = react.useCallback((node) => {
195
+ if (node.type === "file") {
196
+ setSelectedNode(node);
197
+ }
198
+ }, []);
199
+ const handleItemDoubleClick = react.useCallback(
200
+ (node) => {
201
+ if (node.type === "folder") {
202
+ handleNavigate(node.id);
203
+ } else {
204
+ onConfirm(node);
205
+ }
206
+ },
207
+ [handleNavigate, onConfirm]
208
+ );
209
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: FilePickerApp_default.root, children: [
210
+ /* @__PURE__ */ jsxRuntime.jsx(
211
+ FolderBreadcrumbs,
212
+ {
213
+ currentFolderId,
214
+ fsNodes,
215
+ onNavigate: handleNavigate
216
+ }
217
+ ),
218
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: FilePickerApp_default.body, children: [
219
+ /* @__PURE__ */ jsxRuntime.jsx(
220
+ FolderSidebar,
221
+ {
222
+ currentFolderId,
223
+ fsNodes,
224
+ onNavigate: handleNavigate
225
+ }
226
+ ),
227
+ /* @__PURE__ */ jsxRuntime.jsx("main", { className: FilePickerApp_default.content, children: visibleNodes.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: FilePickerApp_default.empty, children: /* @__PURE__ */ jsxRuntime.jsx(chunkE55VXNLK_cjs.Text, { size: "sm", c: "dimmed", children: currentNodes.length === 0 ? t("common:messages.folderEmpty") : t("common:messages.noMatchingFiles") }) }) : /* @__PURE__ */ jsxRuntime.jsx(
228
+ "div",
229
+ {
230
+ className: FilePickerApp_default.grid,
231
+ role: "listbox",
232
+ "aria-label": t("fileDialog.filesAria", { ns: "common" }),
233
+ children: chunk6QOUYSEE_cjs.sortNodes(visibleNodes).map((node) => {
234
+ const isSelected = selectedNode?.id === node.id;
235
+ return /* @__PURE__ */ jsxRuntime.jsxs(
236
+ chunkE55VXNLK_cjs.UnstyledButton,
237
+ {
238
+ className: FilePickerApp_default.item,
239
+ "data-selected": isSelected || void 0,
240
+ "data-type": node.type,
241
+ onClick: () => handleItemClick(node),
242
+ onDoubleClick: () => handleItemDoubleClick(node),
243
+ "aria-label": node.type === "folder" ? t("fileDialog.openFolder", { name: node.name, ns: "window" }) : t("fileDialog.selectFile", { name: node.name, ns: "window" }),
244
+ "aria-selected": node.type === "file" ? isSelected : void 0,
245
+ role: "option",
246
+ children: [
247
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: FilePickerApp_default.icon, children: /* @__PURE__ */ jsxRuntime.jsx(
248
+ chunkABIAPZ6S_cjs.FileIcon_default,
249
+ {
250
+ type: node.type,
251
+ name: node.name,
252
+ folderNode: node.type === "folder" ? node : void 0,
253
+ size: 32
254
+ }
255
+ ) }),
256
+ /* @__PURE__ */ jsxRuntime.jsx(chunkE55VXNLK_cjs.Text, { size: "xs", className: FilePickerApp_default.name, truncate: true, children: node.name })
257
+ ]
258
+ },
259
+ node.id
260
+ );
261
+ })
262
+ }
263
+ ) })
264
+ ] }),
265
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: FilePickerApp_default.actionBar, children: [
266
+ /* @__PURE__ */ jsxRuntime.jsx(chunkE55VXNLK_cjs.Text, { size: "xs", c: "dimmed", truncate: true, className: FilePickerApp_default.selectedLabel, children: selectedNode ? selectedNode.name : t("common:messages.noFileSelected") }),
267
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkE55VXNLK_cjs.Group, { gap: "xs", children: [
268
+ /* @__PURE__ */ jsxRuntime.jsx(
269
+ chunkE55VXNLK_cjs.Button,
270
+ {
271
+ variant: "default",
272
+ size: "xs",
273
+ onClick: onCancel,
274
+ "aria-label": t("filePicker.cancelAria", { ns: "common" }),
275
+ children: t("common:actions.cancel")
276
+ }
277
+ ),
278
+ /* @__PURE__ */ jsxRuntime.jsx(
279
+ chunkE55VXNLK_cjs.Button,
280
+ {
281
+ size: "xs",
282
+ disabled: !selectedNode,
283
+ onClick: () => selectedNode && onConfirm(selectedNode),
284
+ "aria-label": t("filePicker.openSelectedAria", { ns: "common" }),
285
+ children: t("common:actions.open")
286
+ }
287
+ )
288
+ ] })
289
+ ] })
290
+ ] });
291
+ };
292
+ var FilePickerModal = ({ opened, ...pickerProps }) => {
293
+ if (!opened) return null;
294
+ return /* @__PURE__ */ jsxRuntime.jsx(PickerModal, { opened, ariaLabelKey: "fileDialog.openFile", children: /* @__PURE__ */ jsxRuntime.jsx(FilePickerApp, { ...pickerProps }) });
295
+ };
296
+ var FileSaveApp = ({
297
+ initialName = "untitled.md",
298
+ onConfirm,
299
+ onCancel
300
+ }) => {
301
+ const { t } = reactI18next.useTranslation("window");
302
+ const fsNodes = chunk6QOUYSEE_cjs.useDesktopStore((state) => state.fsNodes);
303
+ const [currentFolderId, setCurrentFolderId] = react.useState(null);
304
+ const [fileName, setFileName] = react.useState(initialName);
305
+ const handleNavigate = react.useCallback((id) => {
306
+ setCurrentFolderId(id);
307
+ }, []);
308
+ const handleSave = react.useCallback(() => {
309
+ const trimmed = fileName.trim();
310
+ if (!trimmed) return;
311
+ onConfirm({
312
+ parentId: currentFolderId,
313
+ name: trimmed.endsWith(".md") ? trimmed : `${trimmed}.md`
314
+ });
315
+ }, [fileName, currentFolderId, onConfirm]);
316
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: FilePickerApp_default.root, children: [
317
+ /* @__PURE__ */ jsxRuntime.jsx(
318
+ FolderBreadcrumbs,
319
+ {
320
+ currentFolderId,
321
+ fsNodes,
322
+ onNavigate: handleNavigate
323
+ }
324
+ ),
325
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: FilePickerApp_default.body, children: [
326
+ /* @__PURE__ */ jsxRuntime.jsx(
327
+ FolderSidebar,
328
+ {
329
+ currentFolderId,
330
+ fsNodes,
331
+ onNavigate: handleNavigate
332
+ }
333
+ ),
334
+ /* @__PURE__ */ jsxRuntime.jsx("main", { className: FilePickerApp_default.content, children: /* @__PURE__ */ jsxRuntime.jsx(
335
+ FolderGrid,
336
+ {
337
+ currentFolderId,
338
+ fsNodes,
339
+ onNavigate: handleNavigate
340
+ }
341
+ ) })
342
+ ] }),
343
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: FilePickerApp_default.saveActionBar, children: [
344
+ /* @__PURE__ */ jsxRuntime.jsx(
345
+ chunkE55VXNLK_cjs.TextInput,
346
+ {
347
+ size: "xs",
348
+ placeholder: t("fileDialog.filename"),
349
+ value: fileName,
350
+ onChange: (e) => setFileName(e.currentTarget.value),
351
+ onKeyDown: (e) => e.key === "Enter" && handleSave(),
352
+ "aria-label": t("filePicker.fileNameAria", { ns: "common" }),
353
+ className: FilePickerApp_default.fileNameInput
354
+ }
355
+ ),
356
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkE55VXNLK_cjs.Group, { gap: "xs", style: { flexShrink: 0 }, children: [
357
+ /* @__PURE__ */ jsxRuntime.jsx(
358
+ chunkE55VXNLK_cjs.Button,
359
+ {
360
+ variant: "default",
361
+ size: "xs",
362
+ onClick: onCancel,
363
+ "aria-label": t("filePicker.cancelAria", { ns: "common" }),
364
+ children: t("common:actions.cancel")
365
+ }
366
+ ),
367
+ /* @__PURE__ */ jsxRuntime.jsx(
368
+ chunkE55VXNLK_cjs.Button,
369
+ {
370
+ size: "xs",
371
+ disabled: !fileName.trim(),
372
+ onClick: handleSave,
373
+ "aria-label": t("fileDialog.saveFile"),
374
+ children: t("common:actions.save")
375
+ }
376
+ )
377
+ ] })
378
+ ] })
379
+ ] });
380
+ };
381
+ var FileSaveModal = ({ opened, ...saveProps }) => {
382
+ if (!opened) return null;
383
+ return /* @__PURE__ */ jsxRuntime.jsx(PickerModal, { opened, ariaLabelKey: "fileDialog.saveFile", children: /* @__PURE__ */ jsxRuntime.jsx(FileSaveApp, { ...saveProps }) });
384
+ };
385
+ var FolderPickerApp = ({ onConfirm, onCancel }) => {
386
+ const { t } = reactI18next.useTranslation("window");
387
+ const fsNodes = chunk6QOUYSEE_cjs.useDesktopStore((state) => state.fsNodes);
388
+ const [currentFolderId, setCurrentFolderId] = react.useState(null);
389
+ const handleNavigate = react.useCallback((id) => {
390
+ setCurrentFolderId(id);
391
+ }, []);
392
+ const handleConfirm = react.useCallback(() => {
393
+ onConfirm(currentFolderId);
394
+ }, [currentFolderId, onConfirm]);
395
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: FilePickerApp_default.root, children: [
396
+ /* @__PURE__ */ jsxRuntime.jsx(
397
+ FolderBreadcrumbs,
398
+ {
399
+ currentFolderId,
400
+ fsNodes,
401
+ onNavigate: handleNavigate
402
+ }
403
+ ),
404
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: FilePickerApp_default.body, children: [
405
+ /* @__PURE__ */ jsxRuntime.jsx(
406
+ FolderSidebar,
407
+ {
408
+ currentFolderId,
409
+ fsNodes,
410
+ onNavigate: handleNavigate
411
+ }
412
+ ),
413
+ /* @__PURE__ */ jsxRuntime.jsx("main", { className: FilePickerApp_default.content, children: /* @__PURE__ */ jsxRuntime.jsx(
414
+ FolderGrid,
415
+ {
416
+ currentFolderId,
417
+ fsNodes,
418
+ onNavigate: handleNavigate
419
+ }
420
+ ) })
421
+ ] }),
422
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: FilePickerApp_default.actionBar, children: [
423
+ /* @__PURE__ */ jsxRuntime.jsx(chunkE55VXNLK_cjs.Text, { size: "xs", c: "dimmed", truncate: true, className: FilePickerApp_default.selectedLabel, children: currentFolderId === null ? t("common:labels.home") : fsNodes.find((n) => n.id === currentFolderId)?.name ?? "" }),
424
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkE55VXNLK_cjs.Group, { gap: "xs", children: [
425
+ /* @__PURE__ */ jsxRuntime.jsx(
426
+ chunkE55VXNLK_cjs.Button,
427
+ {
428
+ variant: "default",
429
+ size: "xs",
430
+ onClick: onCancel,
431
+ "aria-label": t("filePicker.cancelAria", { ns: "common" }),
432
+ children: t("common:actions.cancel")
433
+ }
434
+ ),
435
+ /* @__PURE__ */ jsxRuntime.jsx(chunkE55VXNLK_cjs.Button, { size: "xs", onClick: handleConfirm, "aria-label": t("fileDialog.selectFolder"), children: t("common:actions.select") })
436
+ ] })
437
+ ] })
438
+ ] });
439
+ };
440
+ var FolderPickerModal = ({ opened, ...pickerProps }) => {
441
+ if (!opened) return null;
442
+ return /* @__PURE__ */ jsxRuntime.jsx(PickerModal, { opened, ariaLabelKey: "fileDialog.selectFolder", children: /* @__PURE__ */ jsxRuntime.jsx(FolderPickerApp, { ...pickerProps }) });
443
+ };
444
+ var FilePickerApp_default2 = FilePickerApp;
445
+
446
+ exports.FilePickerApp_default = FilePickerApp_default2;
447
+ exports.FilePickerModal = FilePickerModal;
448
+ exports.FileSaveModal = FileSaveModal;
449
+ exports.FolderPickerModal = FolderPickerModal;
450
+ exports.PickerModal = PickerModal;
451
+ exports.buildBreadcrumbs = buildBreadcrumbs;